aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-25 16:09:41 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:19:28 -0400
commitacb1b6caf179d405ebd1dddefe916ccbb9b90298 (patch)
tree3262411979f2d9d283ee6b8efbf0d0a6a44d4685
parentc86f86e9e75e77e4d51ded9edbad30834ff606f7 (diff)
rbd: only update values on snap_info success
Change rbd_dev_v2_snap_info() so it only ever sets values of the size and features parameters if looking up the snapshot name was successful. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 1e01f0d8312a..e7d10d384f07 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3908,6 +3908,7 @@ static char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev, u32 which)
3908 if (!reply_buf) 3908 if (!reply_buf)
3909 return ERR_PTR(-ENOMEM); 3909 return ERR_PTR(-ENOMEM);
3910 3910
3911 rbd_assert(which < rbd_dev->header.snapc->num_snaps);
3911 snap_id = cpu_to_le64(rbd_dev->header.snapc->snaps[which]); 3912 snap_id = cpu_to_le64(rbd_dev->header.snapc->snaps[which]);
3912 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, 3913 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name,
3913 "rbd", "get_snapshot_name", 3914 "rbd", "get_snapshot_name",
@@ -3940,17 +3941,30 @@ static char *rbd_dev_v2_snap_info(struct rbd_device *rbd_dev, u32 which,
3940 u64 *snap_size, u64 *snap_features) 3941 u64 *snap_size, u64 *snap_features)
3941{ 3942{
3942 u64 snap_id; 3943 u64 snap_id;
3944 u64 size;
3945 u64 features;
3946 char *snap_name;
3943 int ret; 3947 int ret;
3944 3948
3949 rbd_assert(which < rbd_dev->header.snapc->num_snaps);
3945 snap_id = rbd_dev->header.snapc->snaps[which]; 3950 snap_id = rbd_dev->header.snapc->snaps[which];
3946 ret = _rbd_dev_v2_snap_size(rbd_dev, snap_id, NULL, snap_size); 3951 ret = _rbd_dev_v2_snap_size(rbd_dev, snap_id, NULL, &size);
3947 if (ret) 3952 if (ret)
3948 return ERR_PTR(ret); 3953 goto out_err;
3949 ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, snap_features); 3954
3955 ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, &features);
3950 if (ret) 3956 if (ret)
3951 return ERR_PTR(ret); 3957 goto out_err;
3958
3959 snap_name = rbd_dev_v2_snap_name(rbd_dev, which);
3960 if (!IS_ERR(snap_name)) {
3961 *snap_size = size;
3962 *snap_features = features;
3963 }
3952 3964
3953 return rbd_dev_v2_snap_name(rbd_dev, which); 3965 return snap_name;
3966out_err:
3967 return ERR_PTR(ret);
3954} 3968}
3955 3969
3956static char *rbd_dev_snap_info(struct rbd_device *rbd_dev, u32 which, 3970static char *rbd_dev_snap_info(struct rbd_device *rbd_dev, u32 which,