|
@@ -6925,6 +6925,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
void __user *argp = (void __user *)arg;
|
|
|
struct mddev *mddev = NULL;
|
|
|
int ro;
|
|
|
+ bool did_set_md_closing = false;
|
|
|
|
|
|
if (!md_ioctl_valid(cmd))
|
|
|
return -ENOTTY;
|
|
@@ -7014,7 +7015,9 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
err = -EBUSY;
|
|
|
goto out;
|
|
|
}
|
|
|
+ WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags));
|
|
|
set_bit(MD_CLOSING, &mddev->flags);
|
|
|
+ did_set_md_closing = true;
|
|
|
mutex_unlock(&mddev->open_mutex);
|
|
|
sync_blockdev(bdev);
|
|
|
}
|
|
@@ -7207,6 +7210,8 @@ unlock:
|
|
|
mddev->hold_active = 0;
|
|
|
mddev_unlock(mddev);
|
|
|
out:
|
|
|
+ if(did_set_md_closing)
|
|
|
+ clear_bit(MD_CLOSING, &mddev->flags);
|
|
|
return err;
|
|
|
}
|
|
|
#ifdef CONFIG_COMPAT
|