diff options
author | Alex Elder <elder@inktank.com> | 2013-04-25 16:09:41 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:19:28 -0400 |
commit | acb1b6caf179d405ebd1dddefe916ccbb9b90298 (patch) | |
tree | 3262411979f2d9d283ee6b8efbf0d0a6a44d4685 | |
parent | c86f86e9e75e77e4d51ded9edbad30834ff606f7 (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.c | 24 |
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; |
3966 | out_err: | ||
3967 | return ERR_PTR(ret); | ||
3954 | } | 3968 | } |
3955 | 3969 | ||
3956 | static char *rbd_dev_snap_info(struct rbd_device *rbd_dev, u32 which, | 3970 | static char *rbd_dev_snap_info(struct rbd_device *rbd_dev, u32 which, |