aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-05-28 21:32:44 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-06-04 17:16:27 -0400
commit971b2e8a3f5dc0cbef19ec1a77b6d20237aa751e (patch)
tree83d7129b09c08d74ff2f6e494b71a83243db3925 /drivers/infiniband
parent0abbb609ac511fc226b8b1082613193c8ecf8324 (diff)
fix the deadlock in qib_fs
get_sb_single() calls fill_super with superblock locked; calling deactivate_super() will deadlock immedately. Moreover, if fill_super callback returns an error, get_sb_single() will release the reference to superblock itself just fine. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/qib/qib_fs.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c
index edef8527eb34..844954bf417b 100644
--- a/drivers/infiniband/hw/qib/qib_fs.c
+++ b/drivers/infiniband/hw/qib/qib_fs.c
@@ -542,10 +542,8 @@ static int qibfs_fill_super(struct super_block *sb, void *data, int silent)
542 list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) { 542 list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) {
543 spin_unlock_irqrestore(&qib_devs_lock, flags); 543 spin_unlock_irqrestore(&qib_devs_lock, flags);
544 ret = add_cntr_files(sb, dd); 544 ret = add_cntr_files(sb, dd);
545 if (ret) { 545 if (ret)
546 deactivate_super(sb);
547 goto bail; 546 goto bail;
548 }
549 spin_lock_irqsave(&qib_devs_lock, flags); 547 spin_lock_irqsave(&qib_devs_lock, flags);
550 } 548 }
551 549