Skip to content

Commit 22f9400

Browse files
Zizhi Wobrauner
authored andcommitted
netfs/fscache: Add a memory barrier for FSCACHE_VOLUME_CREATING
In fscache_create_volume(), there is a missing memory barrier between the bit-clearing operation and the wake-up operation. This may cause a situation where, after a wake-up, the bit-clearing operation hasn't been detected yet, leading to an indefinite wait. The triggering process is as follows: [cookie1] [cookie2] [volume_work] fscache_perform_lookup fscache_create_volume fscache_perform_lookup fscache_create_volume fscache_create_volume_work cachefiles_acquire_volume clear_and_wake_up_bit test_and_set_bit test_and_set_bit goto maybe_wait goto no_wait In the above process, cookie1 and cookie2 has the same volume. When cookie1 enters the -no_wait- process, it will clear the bit and wake up the waiting process. If a barrier is missing, it may cause cookie2 to remain in the -wait- process indefinitely. In commit 3288666 ("fscache: Use clear_and_wake_up_bit() in fscache_create_volume_work()"), barriers were added to similar operations in fscache_create_volume_work(), but fscache_create_volume() was missed. By combining the clear and wake operations into clear_and_wake_up_bit() to fix this issue. Fixes: bfa22da ("fscache: Provide and use cache methods to lookup/create/free a volume") Signed-off-by: Zizhi Wo <[email protected]> Link: https://lore.kernel.org/r/[email protected] Acked-by: David Howells <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent 31ad74b commit 22f9400

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

fs/netfs/fscache_volume.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,7 @@ void fscache_create_volume(struct fscache_volume *volume, bool wait)
322322
}
323323
return;
324324
no_wait:
325-
clear_bit_unlock(FSCACHE_VOLUME_CREATING, &volume->flags);
326-
wake_up_bit(&volume->flags, FSCACHE_VOLUME_CREATING);
325+
clear_and_wake_up_bit(FSCACHE_VOLUME_CREATING, &volume->flags);
327326
}
328327

329328
/*

0 commit comments

Comments
 (0)