summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder2012-07-11 03:30:11 +0200
committerAlex Elder2012-10-01 21:30:52 +0200
commite86924a8092fda66b859f12a4d7d37a4a458d74a (patch)
treef6b012ea7de1127798d08969e4f9b09cf9989175 /drivers/block/rbd.c
parentrbd: don't register snapshots in bus_add_dev() (diff)
downloadkernel-qcow2-linux-e86924a8092fda66b859f12a4d7d37a4a458d74a.tar.gz
kernel-qcow2-linux-e86924a8092fda66b859f12a4d7d37a4a458d74a.tar.xz
kernel-qcow2-linux-e86924a8092fda66b859f12a4d7d37a4a458d74a.zip
rbd: use snaps list in rbd_snap_by_name()
An rbd_dev structure maintains a list of current snapshots that have already been fully initialized. The entries on the list have type struct rbd_snap, and each entry contains a copy of information that's found in the rbd_dev's snapshot context and header. The only caller of snap_by_name() is rbd_header_set_snap(). In that call site any positive return value (the index in the snapshot array) is ignored, so there's no need to return the index in the snapshot context's id array when it's found. rbd_header_set_snap() also has only one caller--rbd_add()--and that call is made after a call to rbd_dev_snap_devs_update(). Because the rbd_snap structures are initialized in that function, the current snapshot list can be used instead of the snapshot context to look up a snapshot's information by name. Change snap_by_name() so it uses the snapshot list rather than the rbd_dev's snapshot context in looking up snapshot information. Return 0 if it's found rather than the snapshot id. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 144694ee03a5..1ecdeb15b618 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -623,23 +623,18 @@ out_err:
static int snap_by_name(struct rbd_device *rbd_dev, const char *snap_name)
{
- int i;
- struct rbd_image_header *header = &rbd_dev->header;
- char *p = header->snap_names;
-
- rbd_assert(header->snapc != NULL);
- for (i = 0; i < header->snapc->num_snaps; i++) {
- if (!strcmp(snap_name, p)) {
- /* Found it. Pass back its id and/or size */
+ struct rbd_snap *snap;
- rbd_dev->mapping.snap_id = header->snapc->snaps[i];
- rbd_dev->mapping.size = header->snap_sizes[i];
+ list_for_each_entry(snap, &rbd_dev->snaps, node) {
+ if (!strcmp(snap_name, snap->name)) {
+ rbd_dev->mapping.snap_id = snap->id;
+ rbd_dev->mapping.size = snap->size;
- return i;
+ return 0;
}
- p += strlen(p) + 1; /* Skip ahead to the next name */
}
+
return -ENOENT;
}
@@ -653,6 +648,7 @@ static int rbd_header_set_snap(struct rbd_device *rbd_dev, char *snap_name)
rbd_dev->mapping.size = rbd_dev->header.image_size;
rbd_dev->mapping.snap_exists = false;
rbd_dev->mapping.read_only = rbd_dev->rbd_opts.read_only;
+ ret = 0;
} else {
ret = snap_by_name(rbd_dev, snap_name);
if (ret < 0)
@@ -661,8 +657,6 @@ static int rbd_header_set_snap(struct rbd_device *rbd_dev, char *snap_name)
rbd_dev->mapping.read_only = true;
}
rbd_dev->mapping.snap_name = snap_name;
-
- ret = 0;
done:
return ret;
}