Skip to content

Commit fdfff85

Browse files
dhowellsgregkh
authored andcommitted
afs: Fix uninitialised spinlock afs_volume::cb_break_lock
[ Upstream commit 90fa9b6 ] Fix the cb_break_lock spinlock in afs_volume struct by initialising it when the volume record is allocated. Also rename the lock to cb_v_break_lock to distinguish it from the lock of the same name in the afs_server struct. Without this, the following trace may be observed when a volume-break callback is received: INFO: trying to register non-static key. the code is fine but needs lockdep annotation. turning off the locking correctness validator. CPU: 2 PID: 50 Comm: kworker/2:1 Not tainted 5.2.0-rc1-fscache+ #3045 Hardware name: ASUS All Series/H97-PLUS, BIOS 2306 10/09/2014 Workqueue: afs SRXAFSCB_CallBack Call Trace: dump_stack+0x67/0x8e register_lock_class+0x23b/0x421 ? check_usage_forwards+0x13c/0x13c __lock_acquire+0x89/0xf73 lock_acquire+0x13b/0x166 ? afs_break_callbacks+0x1b2/0x3dd _raw_write_lock+0x2c/0x36 ? afs_break_callbacks+0x1b2/0x3dd afs_break_callbacks+0x1b2/0x3dd ? trace_event_raw_event_afs_server+0x61/0xac SRXAFSCB_CallBack+0x11f/0x16c process_one_work+0x2c5/0x4ee ? worker_thread+0x234/0x2ac worker_thread+0x1d8/0x2ac ? cancel_delayed_work_sync+0xf/0xf kthread+0x11f/0x127 ? kthread_park+0x76/0x76 ret_from_fork+0x24/0x30 Fixes: 68251f0 ("afs: Fix whole-volume callback handling") Signed-off-by: David Howells <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent d47f06a commit fdfff85

File tree

3 files changed

+4
-3
lines changed

3 files changed

+4
-3
lines changed

fs/afs/callback.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,9 @@ static void afs_break_one_callback(struct afs_server *server,
276276
struct afs_super_info *as = AFS_FS_S(cbi->sb);
277277
struct afs_volume *volume = as->volume;
278278

279-
write_lock(&volume->cb_break_lock);
279+
write_lock(&volume->cb_v_break_lock);
280280
volume->cb_v_break++;
281-
write_unlock(&volume->cb_break_lock);
281+
write_unlock(&volume->cb_v_break_lock);
282282
} else {
283283
data.volume = NULL;
284284
data.fid = *fid;

fs/afs/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ struct afs_volume {
477477
unsigned int servers_seq; /* Incremented each time ->servers changes */
478478

479479
unsigned cb_v_break; /* Break-everything counter. */
480-
rwlock_t cb_break_lock;
480+
rwlock_t cb_v_break_lock;
481481

482482
afs_voltype_t type; /* type of volume */
483483
short error;

fs/afs/volume.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_mount_params *params,
4747
atomic_set(&volume->usage, 1);
4848
INIT_LIST_HEAD(&volume->proc_link);
4949
rwlock_init(&volume->servers_lock);
50+
rwlock_init(&volume->cb_v_break_lock);
5051
memcpy(volume->name, vldb->name, vldb->name_len + 1);
5152

5253
slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask);

0 commit comments

Comments
 (0)