diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-05-28 21:32:44 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-06-04 17:16:27 -0400 |
commit | 971b2e8a3f5dc0cbef19ec1a77b6d20237aa751e (patch) | |
tree | 83d7129b09c08d74ff2f6e494b71a83243db3925 /drivers/infiniband | |
parent | 0abbb609ac511fc226b8b1082613193c8ecf8324 (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.c | 4 |
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 | ||