aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2013-09-09 13:34:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-09 13:47:42 -0400
commit45150c43b1b0c16e665fd0a5cdcca128b8192db1 (patch)
treee1faec166f3edb5974829d9f7ec4c25e02fd1572 /fs/direct-io.c
parentef9a61bef917e38f8e096f6df303329aed6cf467 (diff)
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>
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 1782023bd68a..0e04142d5962 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -544,6 +544,7 @@ static inline int dio_bio_reap(struct dio *dio, struct dio_submit *sdio)
544 */ 544 */
545static int sb_init_dio_done_wq(struct super_block *sb) 545static int sb_init_dio_done_wq(struct super_block *sb)
546{ 546{
547 struct workqueue_struct *old;
547 struct workqueue_struct *wq = alloc_workqueue("dio/%s", 548 struct workqueue_struct *wq = alloc_workqueue("dio/%s",
548 WQ_MEM_RECLAIM, 0, 549 WQ_MEM_RECLAIM, 0,
549 sb->s_id); 550 sb->s_id);
@@ -552,9 +553,9 @@ static int sb_init_dio_done_wq(struct super_block *sb)
552 /* 553 /*
553 * This has to be atomic as more DIOs can race to create the workqueue 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 /* Someone created workqueue before us? Free ours... */ 557 /* Someone created workqueue before us? Free ours... */
557 if (wq != sb->s_dio_done_wq) 558 if (old)
558 destroy_workqueue(wq); 559 destroy_workqueue(wq);
559 return 0; 560 return 0;
560} 561}