diff options
author | Alex Elder <elder@inktank.com> | 2013-04-30 01:44:32 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:20:11 -0400 |
commit | a3fbe5d447bf1f63efa7f4d8c222002ef136cf4b (patch) | |
tree | 1348d05858c4319f9b8fe9b5d73e983c13dcf52f | |
parent | 96882f55c40dcb4cd80b81a4374fdd297109ec98 (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.c | 5 |
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 | ||
3066 | static int rbd_dev_refresh(struct rbd_device *rbd_dev, u64 *hver) | 3066 | static 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 | } |