aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-30 01:44:32 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:20:11 -0400
commita3fbe5d447bf1f63efa7f4d8c222002ef136cf4b (patch)
tree1348d05858c4319f9b8fe9b5d73e983c13dcf52f
parent96882f55c40dcb4cd80b81a4374fdd297109ec98 (diff)
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>
-rw-r--r--drivers/block/rbd.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 71e2de2cff22..ab2c788a22ad 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3065,19 +3065,22 @@ static int rbd_dev_v1_refresh(struct rbd_device *rbd_dev, u64 *hver)
3065 3065
3066static int rbd_dev_refresh(struct rbd_device *rbd_dev, u64 *hver) 3066static int rbd_dev_refresh(struct rbd_device *rbd_dev, u64 *hver)
3067{ 3067{
3068 u64 image_size;
3068 int ret; 3069 int ret;
3069 3070
3070 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); 3071 rbd_assert(rbd_image_format_valid(rbd_dev->image_format));
3072 image_size = rbd_dev->header.image_size;
3071 mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); 3073 mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
3072 if (rbd_dev->image_format == 1) 3074 if (rbd_dev->image_format == 1)
3073 ret = rbd_dev_v1_refresh(rbd_dev, hver); 3075 ret = rbd_dev_v1_refresh(rbd_dev, hver);
3074 else 3076 else
3075 ret = rbd_dev_v2_refresh(rbd_dev, hver); 3077 ret = rbd_dev_v2_refresh(rbd_dev, hver);
3076 mutex_unlock(&ctl_mutex); 3078 mutex_unlock(&ctl_mutex);
3077 revalidate_disk(rbd_dev->disk);
3078 if (ret) 3079 if (ret)
3079 rbd_warn(rbd_dev, "got notification but failed to " 3080 rbd_warn(rbd_dev, "got notification but failed to "
3080 " update snaps: %d\n", ret); 3081 " update snaps: %d\n", ret);
3082 if (image_size != rbd_dev->header.image_size)
3083 revalidate_disk(rbd_dev->disk);
3081 3084
3082 return ret; 3085 return ret;
3083} 3086}