WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 12/16] blkfront: Fix blkfront backend switch race (bd

To: Jens Axboe <axboe@xxxxxxxxx>
Subject: [Xen-devel] [PATCH 12/16] blkfront: Fix blkfront backend switch race (bdev open)
From: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Date: Tue, 20 Jul 2010 13:42:20 -0700
Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Linux Kernel Mailing List <linux-kernel@xxxxxxxxxxxxxxx>, Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>, Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Delivery-date: Tue, 20 Jul 2010 13:53:57 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <cover.1279658231.git.jeremy.fitzhardinge@xxxxxxxxxx>
In-reply-to: <355e718c3f164de385d165eb8a0594895f034ebd.1279658433.git.jeremy.fitzhardinge@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <cover.1279658231.git.jeremy.fitzhardinge@xxxxxxxxxx>
References: <355e718c3f164de385d165eb8a0594895f034ebd.1279658433.git.jeremy.fitzhardinge@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
From: Daniel Stodden <daniel.stodden@xxxxxxxxxx>

We need not mind if users grab a late handle on a closing disk. We
probably even should not. But we have to make sure it's not a dead
one already

Let the bdev deal with a gendisk deleted under its feet. Takes the
info mutex to decide a race against backend closing.

Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
---
 drivers/block/xen-blkfront.c |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 1046a58..974d59a 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1118,12 +1118,27 @@ static int blkfront_is_ready(struct xenbus_device *dev)
 
 static int blkif_open(struct block_device *bdev, fmode_t mode)
 {
-       struct blkfront_info *info = bdev->bd_disk->private_data;
+       struct gendisk *disk = bdev->bd_disk;
+       struct blkfront_info *info;
+       int err = 0;
 
-       if (!info->xbdev)
-               return -ENODEV;
-       info->users++;
-       return 0;
+       info = disk->private_data;
+       if (!info)
+               /* xbdev gone */
+               return -ERESTARTSYS;
+
+       mutex_lock(&info->mutex);
+
+       if (!info->gd)
+               /* xbdev is closed */
+               err = -ERESTARTSYS;
+
+       mutex_unlock(&info->mutex);
+
+       if (!err)
+               ++info->users;
+
+       return err;
 }
 
 static int blkif_release(struct gendisk *disk, fmode_t mode)
-- 
1.7.1.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>