summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2008-12-17 17:53:10 +1100
committerStephen Rothwell <sfr@canb.auug.org.au>2008-12-17 17:53:10 +1100
commit9fe0b6407e428fc3e363609dd097256e5bd1a857 (patch)
tree07ba88b7558a4d69c01577383718c1cb9412942b /fs
parent8d7de7e395d1d2e632482024f61f69867c5668c6 (diff)
parent729b7967a1ea4724361f39a6681e1bfc70397f10 (diff)
Merge commit 'md/for-next'
Diffstat (limited to 'fs')
-rw-r--r--fs/block_dev.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 99e0ae1a4c78..136532ad847f 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1004,6 +1004,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
}
lock_kernel();
+ restart:
ret = -ENXIO;
disk = get_gendisk(bdev->bd_dev, &partno);
@@ -1024,6 +1025,19 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
if (disk->fops->open) {
ret = disk->fops->open(bdev, mode);
+ if (ret == -ERESTARTSYS) {
+ /* Lost a race with 'disk' being
+ * deleted, try again.
+ * See md.c
+ */
+ disk_put_part(bdev->bd_part);
+ bdev->bd_part = NULL;
+ module_put(disk->fops->owner);
+ put_disk(disk);
+ bdev->bd_disk = NULL;
+ mutex_unlock(&bdev->bd_mutex);
+ goto restart;
+ }
if (ret)
goto out_clear;
}