lo_open returns with holding loop_index_mutex when
vx_check failed, resulting in a process lockup on
a loop device.
Signed-off-by: Ryota Ozaki <ozaki.ryota@gmail.com>
---
drivers/block/loop.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index b01b03c..c34ad3b 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1494,8 +1494,10 @@ static int lo_open(struct block_device *bdev, fmode_t mode)
goto out;
}
- if (!vx_check(lo->lo_xid, VS_IDENT|VS_HOSTID|VS_ADMIN_P))
- return -EACCES;
+ if (!vx_check(lo->lo_xid, VS_IDENT|VS_HOSTID|VS_ADMIN_P)) {
+ err = -EACCES;
+ goto out;
+ }
mutex_lock(&lo->lo_ctl_mutex);
lo->lo_refcnt++;
--
1.7.5.4