aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2014-07-23 09:11:20 -0400
committerIlya Dryomov <ilya.dryomov@inktank.com>2014-07-25 05:15:44 -0400
commit52bb1f9bed796127e8b446b12e5b834026241cdd (patch)
tree82dd5d22f374c7039ca1485b7eeffc97bebbf271
parent0407759971cdbd302e0efcb03ff9435a0d3db3ab (diff)
rbd: harden rbd_dev_refresh() and callers a bit
Recently discovered watch/notify problems showed that we really can't ignore errors in anything refresh related. Alas, currently there is not much we can do in response to those errors, except print warnings. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Alex Elder <elder@linaro.org>
-rw-r--r--drivers/block/rbd.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 23df1773ef77..c4064c53b9c9 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2963,11 +2963,20 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data)
2963 dout("%s: \"%s\" notify_id %llu opcode %u\n", __func__, 2963 dout("%s: \"%s\" notify_id %llu opcode %u\n", __func__,
2964 rbd_dev->header_name, (unsigned long long)notify_id, 2964 rbd_dev->header_name, (unsigned long long)notify_id,
2965 (unsigned int)opcode); 2965 (unsigned int)opcode);
2966
2967 /*
2968 * Until adequate refresh error handling is in place, there is
2969 * not much we can do here, except warn.
2970 *
2971 * See http://tracker.ceph.com/issues/5040
2972 */
2966 ret = rbd_dev_refresh(rbd_dev); 2973 ret = rbd_dev_refresh(rbd_dev);
2967 if (ret) 2974 if (ret)
2968 rbd_warn(rbd_dev, "header refresh error (%d)\n", ret); 2975 rbd_warn(rbd_dev, "refresh failed: %d\n", ret);
2969 2976
2970 rbd_obj_notify_ack_sync(rbd_dev, notify_id); 2977 ret = rbd_obj_notify_ack_sync(rbd_dev, notify_id);
2978 if (ret)
2979 rbd_warn(rbd_dev, "notify_ack ret %d\n", ret);
2971} 2980}
2972 2981
2973/* 2982/*
@@ -3510,6 +3519,8 @@ static int rbd_dev_refresh(struct rbd_device *rbd_dev)
3510 mapping_size = rbd_dev->mapping.size; 3519 mapping_size = rbd_dev->mapping.size;
3511 3520
3512 ret = rbd_dev_header_info(rbd_dev); 3521 ret = rbd_dev_header_info(rbd_dev);
3522 if (ret)
3523 return ret;
3513 3524
3514 /* If it's a mapped snapshot, validate its EXISTS flag */ 3525 /* If it's a mapped snapshot, validate its EXISTS flag */
3515 3526
@@ -3520,7 +3531,7 @@ static int rbd_dev_refresh(struct rbd_device *rbd_dev)
3520 rbd_dev_update_size(rbd_dev); 3531 rbd_dev_update_size(rbd_dev);
3521 } 3532 }
3522 3533
3523 return ret; 3534 return 0;
3524} 3535}
3525 3536
3526static int rbd_init_disk(struct rbd_device *rbd_dev) 3537static int rbd_init_disk(struct rbd_device *rbd_dev)
@@ -3724,9 +3735,9 @@ static ssize_t rbd_image_refresh(struct device *dev,
3724 3735
3725 ret = rbd_dev_refresh(rbd_dev); 3736 ret = rbd_dev_refresh(rbd_dev);
3726 if (ret) 3737 if (ret)
3727 rbd_warn(rbd_dev, ": manual header refresh error (%d)\n", ret); 3738 return ret;
3728 3739
3729 return ret < 0 ? ret : size; 3740 return size;
3730} 3741}
3731 3742
3732static DEVICE_ATTR(size, S_IRUGO, rbd_size_show, NULL); 3743static DEVICE_ATTR(size, S_IRUGO, rbd_size_show, NULL);