Commit 45150c43b1b0c16e665fd0a5cdcca128b8192db1
Committed by
Linus Torvalds
1 parent
ef9a61bef9
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
direct-io: Use return from cmpxchg to decide of assignment happened
Not using the return value can in the generic case be racy, so it's in general good practice to check the return value instead. This also resolved the warning caused on ARM and other architectures: fs/direct-io.c: In function 'sb_init_dio_done_wq': fs/direct-io.c:557:2: warning: value computed is not used [-Wunused-value] Signed-off-by: Olof Johansson <olof@lixom.net> Reviewed-by: Jan Kara <jack@suse.cz> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@infradead.org> Cc: Russell King <linux@arm.linux.org.uk> Cc: H Peter Anvin <hpa@zytor.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 3 additions and 2 deletions Side-by-side Diff
fs/direct-io.c
... | ... | @@ -544,6 +544,7 @@ |
544 | 544 | */ |
545 | 545 | static int sb_init_dio_done_wq(struct super_block *sb) |
546 | 546 | { |
547 | + struct workqueue_struct *old; | |
547 | 548 | struct workqueue_struct *wq = alloc_workqueue("dio/%s", |
548 | 549 | WQ_MEM_RECLAIM, 0, |
549 | 550 | sb->s_id); |
550 | 551 | |
... | ... | @@ -552,9 +553,9 @@ |
552 | 553 | /* |
553 | 554 | * This has to be atomic as more DIOs can race to create the workqueue |
554 | 555 | */ |
555 | - cmpxchg(&sb->s_dio_done_wq, NULL, wq); | |
556 | + old = cmpxchg(&sb->s_dio_done_wq, NULL, wq); | |
556 | 557 | /* Someone created workqueue before us? Free ours... */ |
557 | - if (wq != sb->s_dio_done_wq) | |
558 | + if (old) | |
558 | 559 | destroy_workqueue(wq); |
559 | 560 | return 0; |
560 | 561 | } |