Commit 45150c43b1b0c16e665fd0a5cdcca128b8192db1

Authored by Olof Johansson
Committed by Linus Torvalds
1 parent ef9a61bef9

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

... ... @@ -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 }