From: Alex Elder <elder@inktank.com>
To: Josh Durgin <josh.durgin@inktank.com>
Cc: ceph-devel@vger.kernel.org
Subject: Re: [PATCH] rbd: do not allow remove of mounted-on image
Date: Fri, 16 Nov 2012 23:22:39 -0600 [thread overview]
Message-ID: <50A71F1F.3050708@inktank.com> (raw)
In-Reply-To: <50A6BDB7.8080001@inktank.com>
On 11/16/2012 04:27 PM, Josh Durgin wrote:
> On 11/16/2012 07:43 AM, Alex Elder wrote:
>> There is no check in rbd_remove() to see if anybody holds ope the
>> image being removed. That's not cool.
>>
>> Add a simple open count that goes up and down with opens and closes
>> (releases) of the device, and don't allow an rbd image to be removed
>> if the count is non-zero. Both functions are protected by the
>> bd_mutex so there's no need for any other concurrency protection.
>>
>> Signed-off-by: Alex Elder <elder@inktank.com>
>> ---
>> drivers/block/rbd.c | 9 +++++++++
>> 1 file changed, 9 insertions(+)
>>
>> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
>> index fba0822..9d9a2f3 100644
>> --- a/drivers/block/rbd.c
>> +++ b/drivers/block/rbd.c
>> @@ -255,6 +255,7 @@ struct rbd_device {
>>
>> /* sysfs related */
>> struct device dev;
>> + unsigned long open_count;
>> };
>>
>> static DEFINE_MUTEX(ctl_mutex); /* Serialize
>> open/close/setup/teardown */
>> @@ -358,6 +359,7 @@ static int rbd_open(struct block_device *bdev,
>> fmode_t mode)
>>
>> rbd_get_dev(rbd_dev);
>> set_device_ro(bdev, rbd_dev->mapping.read_only);
>> + rbd_dev->open_count++;
>>
>> return 0;
>> }
>> @@ -366,6 +368,8 @@ static int rbd_release(struct gendisk *disk, fmode_t
>> mode)
>> {
>> struct rbd_device *rbd_dev = disk->private_data;
>>
>> + rbd_assert(rbd_dev->open_count > 0);
>> + rbd_dev->open_count--;
>> rbd_put_dev(rbd_dev);
>>
>> return 0;
>> @@ -3764,6 +3768,11 @@ static ssize_t rbd_remove(struct bus_type *bus,
>> goto done;
>> }
>>
>> + if (rbd_dev->open_count) {
>> + ret = -EBUSY;
>> + goto done;
>> + }
>> +
>
> Is this protected by bd_mutex?
No it's not, and that's a very good point.
I'll have to look at that over the weekend.
Thanks.
-Alex
>> rbd_remove_all_snaps(rbd_dev);
>> rbd_bus_del_dev(rbd_dev);
>>
>
next prev parent reply other threads:[~2012-11-17 5:22 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-16 15:43 [PATCH] rbd: do not allow remove of mounted-on image Alex Elder
2012-11-16 22:27 ` Josh Durgin
2012-11-17 5:22 ` Alex Elder [this message]
2012-11-19 23:42 ` [PATCH, v2] " Alex Elder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50A71F1F.3050708@inktank.com \
--to=elder@inktank.com \
--cc=ceph-devel@vger.kernel.org \
--cc=josh.durgin@inktank.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.