From: Al Viro Date: Sat, 29 May 2010 01:32:44 +0000 (-0400) Subject: fix the deadlock in qib_fs X-Git-Tag: Ubuntu-5.0.0-8.9~22644^2~5 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=971b2e8a3f5dc0cbef19ec1a77b6d20237aa751e;p=mirror_ubuntu-disco-kernel.git 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 --- 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) list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) { spin_unlock_irqrestore(&qib_devs_lock, flags); ret = add_cntr_files(sb, dd); - if (ret) { - deactivate_super(sb); + if (ret) goto bail; - } spin_lock_irqsave(&qib_devs_lock, flags); }