diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2008-12-17 17:53:10 +1100 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2008-12-17 17:53:10 +1100 |
commit | 9fe0b6407e428fc3e363609dd097256e5bd1a857 (patch) | |
tree | 07ba88b7558a4d69c01577383718c1cb9412942b /fs | |
parent | 8d7de7e395d1d2e632482024f61f69867c5668c6 (diff) | |
parent | 729b7967a1ea4724361f39a6681e1bfc70397f10 (diff) |
Merge commit 'md/for-next'
Diffstat (limited to 'fs')
-rw-r--r-- | fs/block_dev.c | 14 |
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; } |