[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <155793756678.31671.3057069610724058972.stgit@warthog.procyon.org.uk>
Date: Wed, 15 May 2019 17:26:06 +0100
From: David Howells <dhowells@...hat.com>
To: linux-afs@...ts.infradead.org
Cc: dhowells@...hat.com, linux-kernel@...r.kernel.org
Subject: [PATCH 04/15] afs: Fix missing lock when replacing VL server list
When afs_update_cell() replaces the cell->vl_servers list, it uses RCU
protocol so that proc is protected, but doesn't take ->vl_servers_lock to
protect afs_start_vl_iteration() (which does actually take a shared lock).
Fix this by making afs_update_cell() take an exclusive lock when replacing
->vl_servers.
Fixes: 0a5143f2f89c ("afs: Implement VL server rotation")
Signed-off-by: David Howells <dhowells@...hat.com>
---
fs/afs/cell.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/fs/afs/cell.c b/fs/afs/cell.c
index 9de46116c749..9ca075e11239 100644
--- a/fs/afs/cell.c
+++ b/fs/afs/cell.c
@@ -404,12 +404,11 @@ static void afs_update_cell(struct afs_cell *cell)
clear_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags);
clear_bit(AFS_CELL_FL_NOT_FOUND, &cell->flags);
- /* Exclusion on changing vl_addrs is achieved by a
- * non-reentrant work item.
- */
+ write_lock(&cell->vl_servers_lock);
old = rcu_dereference_protected(cell->vl_servers, true);
rcu_assign_pointer(cell->vl_servers, vllist);
cell->dns_expiry = expiry;
+ write_unlock(&cell->vl_servers_lock);
if (old)
afs_put_vlserverlist(cell->net, old);
Powered by blists - more mailing lists