rbd: don't revalidate so much
Whenever a header object event causes a mapped rbd image to refresh its header information, revalidate_disk() is being called. This was done in rbd_dev_refresh() outside the control mutex in order to avoid a lock inversion. Although a an event like this *might* indicate the image has changed size, most of the time it does not. Record the image size before and after the refresh, and only call revalidate_disk() if it changes. This resolves: http://tracker.ceph.com/issues/4867 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
parent
96882f55c4
commit
a3fbe5d447
|
@ -3065,19 +3065,22 @@ static int rbd_dev_v1_refresh(struct rbd_device *rbd_dev, u64 *hver)
|
||||||
|
|
||||||
static int rbd_dev_refresh(struct rbd_device *rbd_dev, u64 *hver)
|
static int rbd_dev_refresh(struct rbd_device *rbd_dev, u64 *hver)
|
||||||
{
|
{
|
||||||
|
u64 image_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
rbd_assert(rbd_image_format_valid(rbd_dev->image_format));
|
rbd_assert(rbd_image_format_valid(rbd_dev->image_format));
|
||||||
|
image_size = rbd_dev->header.image_size;
|
||||||
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
||||||
if (rbd_dev->image_format == 1)
|
if (rbd_dev->image_format == 1)
|
||||||
ret = rbd_dev_v1_refresh(rbd_dev, hver);
|
ret = rbd_dev_v1_refresh(rbd_dev, hver);
|
||||||
else
|
else
|
||||||
ret = rbd_dev_v2_refresh(rbd_dev, hver);
|
ret = rbd_dev_v2_refresh(rbd_dev, hver);
|
||||||
mutex_unlock(&ctl_mutex);
|
mutex_unlock(&ctl_mutex);
|
||||||
revalidate_disk(rbd_dev->disk);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
rbd_warn(rbd_dev, "got notification but failed to "
|
rbd_warn(rbd_dev, "got notification but failed to "
|
||||||
" update snaps: %d\n", ret);
|
" update snaps: %d\n", ret);
|
||||||
|
if (image_size != rbd_dev->header.image_size)
|
||||||
|
revalidate_disk(rbd_dev->disk);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue