summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorsirlucjan2017-03-20 16:53:29 +0100
committersirlucjan2017-03-20 16:53:29 +0100
commit9616eee69667bc054a917453737027a04ca240b3 (patch)
treec51c2fc876fdc70f8e441e617718c7f7c1680fc6
parent0a30b581a4d7f9c71cd2d170356be69294bc93ec (diff)
downloadaur-9616eee69667bc054a917453737027a04ca240b3.tar.gz
Add BFQ bugfix && sync with -ARCH
-rw-r--r--.SRCINFO8
-rw-r--r--0006-BFQ-bugfix.patch341
-rw-r--r--90-linux.hook (renamed from 99-linux.hook)0
-rw-r--r--PKGBUILD14
4 files changed, 354 insertions, 9 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 885b34b70fb4..9cf450514366 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = linux-rt-bfq
pkgver = 4.9.13.12
- pkgrel = 2
+ pkgrel = 3
url = http://algo.ing.unimo.it
arch = i686
arch = x86_64
@@ -24,9 +24,10 @@ pkgbase = linux-rt-bfq
source = fix-race-in-PRT-wait-for-completion-simple-wait-code_Nvidia-RT-160319.patch
source = config
source = config.x86_64
- source = 99-linux.hook
+ source = 90-linux.hook
source = linux.preset
source = 0005-BFQ-update-to-v8r8.patch
+ source = 0006-BFQ-bugfix.patch
source = 0001-tty-n_hdlc-get-rid-of-racy-n_hdlc_tbuf.patch
validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886
validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E
@@ -43,7 +44,7 @@ pkgbase = linux-rt-bfq
sha512sums = 953566f2b74415cd5113882352c8518234c399e0e0a6cc118ddfa259c65d6fc30de00f25b605489d53e0b1f948bc7b3ebf8f20b970538f5bf7de5a7f33a0f641
sha512sums = 8fed8499a52d685e81a1cffac7e6764a3720a923c3a3e4ccec33a4b0145dc84c24172363ff5574608d80c10462a4e824ef1b5ad3e5e5187f816e16adab774700
sha512sums = 93338e0ae23d2832e4dc75b1b4dc6d2ba34d621a71c7951f1e70ddd483d091211b2aa429683b21a7f9cf2152e2d974b6a1a8cc7b0d6549a7f639870b07f5295e
- sha512sums = ab781ca0315316043d2074ad925288616ff4935e0c91b09090cd2a2cc392845eddf1c93b5dadda0eb434050459b51a4e2587e5099e6a9204d0d13b7f427d399c
+ sha512sums = 77d80d50d8c4323ed36fd2097ba9f6b49bb8d7cae59d32ffa76b309758a7e9f972d26fedd77046d88ce2691bb01a07909f8bdc34ba214414be3bc030ee31994d
sha512sums = d9d28e02e964704ea96645a5107f8b65cae5f4fb4f537e224e5e3d087fd296cb770c29ac76e0ce95d173bc420ea87fb8f187d616672a60a0cae618b0ef15b8c8
sha512sums = 86f717f596c613db3bc40624fd956ed379b8a2a20d1d99e076ae9061251fe9afba39cf536623eccd970258e124b8c2c05643e3d539f37bd910e02dc5dd498749
sha512sums = e7c8fd3dd50272518323ac5f27e7e911e8138dbe1268865b5cc343e1c84d531e91d3581cd11df9513952d02e213e916d0c28ecd19acf2660519fc040dfaabb94
@@ -51,6 +52,7 @@ pkgbase = linux-rt-bfq
sha512sums = d6faa67f3ef40052152254ae43fee031365d0b1524aa0718b659eb75afc21a3f79ea8d62d66ea311a800109bed545bc8f79e8752319cd378eef2cbd3a09aba22
sha512sums = 2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf
sha512sums = dab3dba300e276dd552cb86c903af5cac9f7c7954b938ac9c300745a175198c553d84cd3a5e58c350d83160f33b07f6dd20a570da4afdce178464c402ac7829b
+ sha512sums = 2fbe9ddf40a64f9b80ab3b4868e358ea678b4122742884b7c484041a913757627d1c6b0ee6e2ef46fe90d82e7e29e6332d3b6155d56355d274fdf551f8a8ef70
sha512sums = 397fc751697cc4e2ceb7e6d854f5e7fc115ed8511df406ffe5d8f80afeec385ba64cd28c4666bb206612fdcd7a578b60ca6ff125c2138c615aee6135d86b0197
pkgname = linux-rt-bfq
diff --git a/0006-BFQ-bugfix.patch b/0006-BFQ-bugfix.patch
new file mode 100644
index 000000000000..68be7f5fe705
--- /dev/null
+++ b/0006-BFQ-bugfix.patch
@@ -0,0 +1,341 @@
+From 2da7edbb8f54b447c0b7dfa029ee4df580a6030e Mon Sep 17 00:00:00 2001
+From: Paolo Valente <paolo.valente@linaro.org>
+Date: Thu, 16 Mar 2017 14:36:41 +0100
+Subject: [PATCH] BUGIFX: remove use of bfq queues after free
+
+bfq queues occasionally happened to be used after being freed, because
+they were accessed after some invocations of bfq_put_queue that could
+cause them to be freed. This commit refactors code, when needed, to
+avoid any occurrence of such a use-after-free of a bfq queue. This
+commit also adds comments to make references to bfq queues easier to
+follow.
+
+Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
+---
+ block/bfq-cgroup.c | 1 -
+ block/bfq-iosched.c | 36 ++++++++++++++++++---------
+ block/bfq-sched.c | 71 ++++++++++++++++++++++++++++++++++++-----------------
+ 3 files changed, 73 insertions(+), 35 deletions(-)
+
+diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c
+index de045cf..a66a723 100644
+--- a/block/bfq-cgroup.c
++++ b/block/bfq-cgroup.c
+@@ -771,7 +771,6 @@ static void bfq_pd_offline(struct blkg_policy_data *pd)
+
+ __bfq_deactivate_entity(entity, false);
+ bfq_put_async_queues(bfqd, bfqg);
+- BUG_ON(entity->tree);
+
+ /*
+ * @blkg is going offline and will be ignored by
+diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
+index 21197f6..f00761b 100644
+--- a/block/bfq-iosched.c
++++ b/block/bfq-iosched.c
+@@ -1391,7 +1391,6 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
+
+ bfq_bfqq_expire(bfqd, bfqd->in_service_queue,
+ false, BFQ_BFQQ_PREEMPTED);
+- BUG_ON(in_serv->entity.budget < 0);
+ }
+ }
+
+@@ -1560,8 +1559,10 @@ static void bfq_remove_request(struct request *rq)
+ BUG_ON(bfqq->entity.budget < 0);
+
+ if (bfq_bfqq_busy(bfqq) && bfqq != bfqd->in_service_queue) {
++ BUG_ON(bfqq->ref < 2); /* referred by rq and on tree */
+ bfq_del_bfqq_busy(bfqd, bfqq, false);
+- /* bfqq emptied. In normal operation, when
++ /*
++ * bfqq emptied. In normal operation, when
+ * bfqq is empty, bfqq->entity.service and
+ * bfqq->entity.budget must contain,
+ * respectively, the service received and the
+@@ -1570,7 +1571,8 @@ static void bfq_remove_request(struct request *rq)
+ * this last removal occurred while bfqq is
+ * not in service. To avoid inconsistencies,
+ * reset both bfqq->entity.service and
+- * bfqq->entity.budget.
++ * bfqq->entity.budget, if bfqq has still a
++ * process that may issue I/O requests to it.
+ */
+ bfqq->entity.budget = bfqq->entity.service = 0;
+ }
+@@ -2062,7 +2064,8 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic,
+ new_bfqq->wr_coeff = bfqq->wr_coeff;
+ new_bfqq->wr_cur_max_time = bfqq->wr_cur_max_time;
+ new_bfqq->last_wr_start_finish = bfqq->last_wr_start_finish;
+- new_bfqq->wr_start_at_switch_to_srt = bfqq->wr_start_at_switch_to_srt;
++ new_bfqq->wr_start_at_switch_to_srt =
++ bfqq->wr_start_at_switch_to_srt;
+ if (bfq_bfqq_busy(new_bfqq))
+ bfqd->wr_busy_queues++;
+ new_bfqq->entity.prio_changed = 1;
+@@ -2105,6 +2108,7 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic,
+ */
+ new_bfqq->bic = NULL;
+ bfqq->bic = NULL;
++ /* release process reference to bfqq */
+ bfq_put_queue(bfqq);
+ }
+
+@@ -3077,6 +3081,7 @@ static void bfq_bfqq_expire(struct bfq_data *bfqd,
+ bool slow;
+ unsigned long delta = 0;
+ struct bfq_entity *entity = &bfqq->entity;
++ int ref;
+
+ BUG_ON(bfqq != bfqd->in_service_queue);
+
+@@ -3184,12 +3189,15 @@ static void bfq_bfqq_expire(struct bfq_data *bfqd,
+ __bfq_bfqq_recalc_budget(bfqd, bfqq, reason);
+ BUG_ON(bfqq->next_rq == NULL &&
+ bfqq->entity.budget < bfqq->entity.service);
++ ref = bfqq->ref;
+ __bfq_bfqq_expire(bfqd, bfqq);
+
+- BUG_ON(!bfq_bfqq_busy(bfqq) && reason == BFQ_BFQQ_BUDGET_EXHAUSTED &&
++ BUG_ON(ref > 1 &&
++ !bfq_bfqq_busy(bfqq) && reason == BFQ_BFQQ_BUDGET_EXHAUSTED &&
+ !bfq_class_idle(bfqq));
+
+- if (!bfq_bfqq_busy(bfqq) &&
++ /* mark bfqq as waiting a request only if a bic still points to it */
++ if (ref > 1 && !bfq_bfqq_busy(bfqq) &&
+ reason != BFQ_BFQQ_BUDGET_TIMEOUT &&
+ reason != BFQ_BFQQ_BUDGET_EXHAUSTED)
+ bfq_mark_bfqq_non_blocking_wait_rq(bfqq);
+@@ -3809,7 +3817,8 @@ static int bfq_dispatch_requests(struct request_queue *q, int force)
+ * Task holds one reference to the queue, dropped when task exits. Each rq
+ * in-flight on this queue also holds a reference, dropped when rq is freed.
+ *
+- * Queue lock must be held here.
++ * Queue lock must be held here. Recall not to use bfqq after calling
++ * this function on it.
+ */
+ static void bfq_put_queue(struct bfq_queue *bfqq)
+ {
+@@ -3878,7 +3887,7 @@ static void bfq_exit_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq)
+
+ bfq_put_cooperator(bfqq);
+
+- bfq_put_queue(bfqq);
++ bfq_put_queue(bfqq); /* release process reference */
+ }
+
+ static void bfq_init_icq(struct io_cq *icq)
+@@ -3977,6 +3986,7 @@ static void bfq_check_ioprio_change(struct bfq_io_cq *bic, struct bio *bio)
+
+ bfqq = bic_to_bfqq(bic, false);
+ if (bfqq) {
++ /* release process reference on this queue */
+ bfq_put_queue(bfqq);
+ bfqq = bfq_get_queue(bfqd, bio, BLK_RW_ASYNC, bic);
+ bic_set_bfqq(bic, bfqq, false);
+@@ -4110,7 +4120,7 @@ static struct bfq_queue *bfq_get_queue(struct bfq_data *bfqd,
+ }
+
+ out:
+- bfqq->ref++;
++ bfqq->ref++; /* get a process reference to this queue */
+ bfq_log_bfqq(bfqd, bfqq, "get_queue, at end: %p, %d", bfqq, bfqq->ref);
+ rcu_read_unlock();
+ return bfqq;
+@@ -4284,10 +4294,14 @@ static void bfq_insert_request(struct request_queue *q, struct request *rq)
+ bfqq->allocated[rq_data_dir(rq)]--;
+ new_bfqq->ref++;
+ bfq_clear_bfqq_just_created(bfqq);
+- bfq_put_queue(bfqq);
+ if (bic_to_bfqq(RQ_BIC(rq), 1) == bfqq)
+ bfq_merge_bfqqs(bfqd, RQ_BIC(rq),
+ bfqq, new_bfqq);
++ /*
++ * rq is about to be enqueued into new_bfqq,
++ * release rq reference on bfqq
++ */
++ bfq_put_queue(bfqq);
+ rq->elv.priv[1] = new_bfqq;
+ bfqq = new_bfqq;
+ }
+@@ -4708,7 +4722,7 @@ static void bfq_shutdown_timer_wq(struct bfq_data *bfqd)
+ }
+
+ static void __bfq_put_async_bfqq(struct bfq_data *bfqd,
+- struct bfq_queue **bfqq_ptr)
++ struct bfq_queue **bfqq_ptr)
+ {
+ struct bfq_group *root_group = bfqd->root_group;
+ struct bfq_queue *bfqq = *bfqq_ptr;
+diff --git a/block/bfq-sched.c b/block/bfq-sched.c
+index 2e9dc59..70aac56 100644
+--- a/block/bfq-sched.c
++++ b/block/bfq-sched.c
+@@ -154,7 +154,13 @@ static bool bfq_update_next_in_service(struct bfq_sched_data *sd,
+ #define for_each_entity(entity) \
+ for (; entity ; entity = entity->parent)
+
+-#define for_each_entity_safe(entity, parent) \
++/*
++ * For each iteration, compute parent in advance, so as to be safe if
++ * entity is deallocated during the iteration. Such a deallocation may
++ * happen as a consequence of a bfq_put_queue that frees the bfq_queue
++ * containing entity.
++ */
++#define for_each_entity_safe(entity, parent) \
+ for (; entity && ({ parent = entity->parent; 1; }); entity = parent)
+
+ /*
+@@ -691,27 +697,31 @@ static void bfq_idle_insert(struct bfq_service_tree *st,
+ }
+
+ /**
+- * bfq_forget_entity - remove an entity from the wfq trees.
++ * bfq_forget_entity - do not consider entity any longer for scheduling
+ * @st: the service tree.
+ * @entity: the entity being removed.
++ * @is_in_service: true if entity is currently the in-service entity.
+ *
+- * Update the device status and forget everything about @entity, putting
+- * the device reference to it, if it is a queue. Entities belonging to
+- * groups are not refcounted.
++ * Forget everything about @entity. In addition, if entity represents
++ * a queue, and the latter is not in service, then release the service
++ * reference to the queue (the one taken through bfq_get_entity). In
++ * fact, in this case, there is really no more service reference to
++ * the queue, as the latter is also outside any service tree. If,
++ * instead, the queue is in service, then __bfq_bfqd_reset_in_service
++ * will take care of putting the reference when the queue finally
++ * stops being served.
+ */
+ static void bfq_forget_entity(struct bfq_service_tree *st,
+- struct bfq_entity *entity)
++ struct bfq_entity *entity,
++ bool is_in_service)
+ {
+ struct bfq_queue *bfqq = bfq_entity_to_bfqq(entity);
+- struct bfq_sched_data *sd;
+-
+ BUG_ON(!entity->on_st);
+
+ entity->on_st = false;
+ st->wsum -= entity->weight;
+- if (bfqq) {
+- sd = entity->sched_data;
+- bfq_log_bfqq(bfqq->bfqd, bfqq, "forget_entity: %p %d",
++ if (bfqq && !is_in_service) {
++ bfq_log_bfqq(bfqq->bfqd, bfqq, "forget_entity (before): %p %d",
+ bfqq, bfqq->ref);
+ bfq_put_queue(bfqq);
+ }
+@@ -726,7 +736,8 @@ static void bfq_put_idle_entity(struct bfq_service_tree *st,
+ struct bfq_entity *entity)
+ {
+ bfq_idle_extract(st, entity);
+- bfq_forget_entity(st, entity);
++ bfq_forget_entity(st, entity,
++ entity == entity->sched_data->in_service_entity);
+ }
+
+ /**
+@@ -1082,6 +1093,12 @@ static void __bfq_activate_entity(struct bfq_entity *entity,
+ */
+ entity->start = min_vstart;
+ st->wsum += entity->weight;
++ /*
++ * entity is about to be inserted into a service tree,
++ * and then set in service: get a reference to make
++ * sure entity does not disappear until it is no
++ * longer in service or scheduled for service.
++ */
+ bfq_get_entity(entity);
+
+ BUG_ON(entity->on_st && bfqq);
+@@ -1264,27 +1281,27 @@ static bool __bfq_deactivate_entity(struct bfq_entity *entity,
+ {
+ struct bfq_sched_data *sd = entity->sched_data;
+ struct bfq_service_tree *st = bfq_entity_service_tree(entity);
+- bool was_in_service = entity == sd->in_service_entity;
++ bool is_in_service = entity == sd->in_service_entity;
+
+ if (!entity->on_st) { /* entity never activated, or already inactive */
+ BUG_ON(entity == entity->sched_data->in_service_entity);
+ return false;
+ }
+
+- BUG_ON(was_in_service && entity->tree && entity->tree != &st->active);
++ BUG_ON(is_in_service && entity->tree && entity->tree != &st->active);
+
+- if (was_in_service)
++ if (is_in_service)
+ bfq_calc_finish(entity, entity->service);
+
+ if (entity->tree == &st->active)
+ bfq_active_extract(st, entity);
+- else if (!was_in_service && entity->tree == &st->idle)
++ else if (!is_in_service && entity->tree == &st->idle)
+ bfq_idle_extract(st, entity);
+ else if (entity->tree)
+ BUG();
+
+ if (!ins_into_idle_tree || !bfq_gt(entity->finish, st->vtime))
+- bfq_forget_entity(st, entity);
++ bfq_forget_entity(st, entity, is_in_service);
+ else
+ bfq_idle_insert(st, entity);
+
+@@ -1320,8 +1337,8 @@ static void bfq_deactivate_entity(struct bfq_entity *entity,
+
+ if (!__bfq_deactivate_entity(entity, ins_into_idle_tree)) {
+ /*
+- * Entity is not any tree any more, so, this
+- * deactivation is a no-op, and there is
++ * entity is not in any tree any more, so
++ * this deactivation is a no-op, and there is
+ * nothing to change for upper-level entities
+ * (in case of expiration, this can never
+ * happen).
+@@ -1821,14 +1838,16 @@ static struct bfq_queue *bfq_get_next_queue(struct bfq_data *bfqd)
+
+ static void __bfq_bfqd_reset_in_service(struct bfq_data *bfqd)
+ {
+- struct bfq_entity *entity = &bfqd->in_service_queue->entity;
++ struct bfq_queue *in_serv_bfqq = bfqd->in_service_queue;
++ struct bfq_entity *in_serv_entity = &in_serv_bfqq->entity;
++ struct bfq_entity *entity = in_serv_entity;
+
+ if (bfqd->in_service_bic) {
+ put_io_context(bfqd->in_service_bic->icq.ioc);
+ bfqd->in_service_bic = NULL;
+ }
+
+- bfq_clear_bfqq_wait_request(bfqd->in_service_queue);
++ bfq_clear_bfqq_wait_request(in_serv_bfqq);
+ hrtimer_try_to_cancel(&bfqd->idle_slice_timer);
+ bfqd->in_service_queue = NULL;
+
+@@ -1840,6 +1859,14 @@ static void __bfq_bfqd_reset_in_service(struct bfq_data *bfqd)
+ */
+ for_each_entity(entity)
+ entity->sched_data->in_service_entity = NULL;
++
++ /*
++ * in_serv_entity is no longer in service, so, if it is in no
++ * service tree either, then release the service reference to
++ * the queue it represents (taken with bfq_get_entity).
++ */
++ if (!in_serv_entity->on_st)
++ bfq_put_queue(in_serv_bfqq);
+ }
+
+ static void bfq_deactivate_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq,
+@@ -1904,8 +1931,6 @@ static void bfq_del_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq,
+ BUG_ON(bfqq->entity.budget < 0);
+
+ bfq_deactivate_bfqq(bfqd, bfqq, true, expiration);
+-
+- BUG_ON(bfqq->entity.budget < 0);
+ }
+
+ /*
diff --git a/99-linux.hook b/90-linux.hook
index 9851151995bc..9851151995bc 100644
--- a/99-linux.hook
+++ b/90-linux.hook
diff --git a/PKGBUILD b/PKGBUILD
index 5c0e631ede06..4e32d3134c21 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -55,7 +55,7 @@ _pkgver=4.9.13
_rtver=12
_rtpatchver=rt${_rtver}
pkgver=${_pkgver}.${_rtver}
-pkgrel=2
+pkgrel=3
arch=('i686' 'x86_64')
url="http://algo.ing.unimo.it"
license=('GPL2')
@@ -83,11 +83,12 @@ source=("http://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.xz"
# the main kernel config files
'config' 'config.x86_64'
# pacman hook for initramfs regeneration
- '99-linux.hook'
+ '90-linux.hook'
# standard config files for mkinitcpio ramdisk
'linux.preset'
# patches from https://github.com/linusw/linux-bfq/commits/bfq-v8
'0005-BFQ-update-to-v8r8.patch'
+ '0006-BFQ-bugfix.patch'
'0001-tty-n_hdlc-get-rid-of-racy-n_hdlc_tbuf.patch')
_kernelname=${pkgbase#linux}
@@ -120,7 +121,7 @@ prepare() {
### Patch source with BFQ
msg "Patching source with BFQ patches"
- for p in "${srcdir}"/000{1,2,3,4,5}-*BFQ*.patch; do
+ for p in "${srcdir}"/000{1,2,3,4,5,6}-*BFQ*.patch; do
msg " $p"
patch -Np1 -i "$p"
done
@@ -277,8 +278,8 @@ _package() {
install -D -m644 /dev/stdin "${pkgdir}/etc/mkinitcpio.d/${pkgbase}.preset"
# install pacman hook for initramfs regeneration
- sed "s|%PKGBASE%|${pkgbase}|g" "${srcdir}/99-linux.hook" |
- install -D -m644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/99-${pkgbase}.hook"
+ sed "s|%PKGBASE%|${pkgbase}|g" "${srcdir}/90-linux.hook" |
+ install -D -m644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook"
# remove build and source links
rm -f "${pkgdir}"/lib/modules/${_kernver}/{source,build}
@@ -472,7 +473,7 @@ sha512sums=('bf67ff812cc3cb7e5059e82cc5db0d9a7c5637f7ed9a42e4730c715bf7047c81ed3
'953566f2b74415cd5113882352c8518234c399e0e0a6cc118ddfa259c65d6fc30de00f25b605489d53e0b1f948bc7b3ebf8f20b970538f5bf7de5a7f33a0f641'
'8fed8499a52d685e81a1cffac7e6764a3720a923c3a3e4ccec33a4b0145dc84c24172363ff5574608d80c10462a4e824ef1b5ad3e5e5187f816e16adab774700'
'93338e0ae23d2832e4dc75b1b4dc6d2ba34d621a71c7951f1e70ddd483d091211b2aa429683b21a7f9cf2152e2d974b6a1a8cc7b0d6549a7f639870b07f5295e'
- 'ab781ca0315316043d2074ad925288616ff4935e0c91b09090cd2a2cc392845eddf1c93b5dadda0eb434050459b51a4e2587e5099e6a9204d0d13b7f427d399c'
+ '77d80d50d8c4323ed36fd2097ba9f6b49bb8d7cae59d32ffa76b309758a7e9f972d26fedd77046d88ce2691bb01a07909f8bdc34ba214414be3bc030ee31994d'
'd9d28e02e964704ea96645a5107f8b65cae5f4fb4f537e224e5e3d087fd296cb770c29ac76e0ce95d173bc420ea87fb8f187d616672a60a0cae618b0ef15b8c8'
'86f717f596c613db3bc40624fd956ed379b8a2a20d1d99e076ae9061251fe9afba39cf536623eccd970258e124b8c2c05643e3d539f37bd910e02dc5dd498749'
'e7c8fd3dd50272518323ac5f27e7e911e8138dbe1268865b5cc343e1c84d531e91d3581cd11df9513952d02e213e916d0c28ecd19acf2660519fc040dfaabb94'
@@ -480,6 +481,7 @@ sha512sums=('bf67ff812cc3cb7e5059e82cc5db0d9a7c5637f7ed9a42e4730c715bf7047c81ed3
'd6faa67f3ef40052152254ae43fee031365d0b1524aa0718b659eb75afc21a3f79ea8d62d66ea311a800109bed545bc8f79e8752319cd378eef2cbd3a09aba22'
'2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf'
'dab3dba300e276dd552cb86c903af5cac9f7c7954b938ac9c300745a175198c553d84cd3a5e58c350d83160f33b07f6dd20a570da4afdce178464c402ac7829b'
+ '2fbe9ddf40a64f9b80ab3b4868e358ea678b4122742884b7c484041a913757627d1c6b0ee6e2ef46fe90d82e7e29e6332d3b6155d56355d274fdf551f8a8ef70'
'397fc751697cc4e2ceb7e6d854f5e7fc115ed8511df406ffe5d8f80afeec385ba64cd28c4666bb206612fdcd7a578b60ca6ff125c2138c615aee6135d86b0197')
validpgpkeys=(