Subject: [PATCH] Fix process lockup on a loop device
From: Ryota Ozaki <ozaki.ryota@gmail.com>
Date: Sat, 17 Dec 2011 22:30:58 +0900

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