On 09/07/2012 07:50 AM, Alex Elder wrote:
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.
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. To do this,
change rbd_snap_by_name() to take an rbd_dev rather than
rbd_image_header structure pointer as its first argument.
This argument change was an earlier commit now.
No caller ever passes a null pointer to snap_by_name() for the
snapshot id or the size, so just assign using those pointers
unconditionally.
No caller passes id or size now either.
With the commit message fixed:
Reviewed-by: Josh Durgin <josh.dur...@inktank.com>
Signed-off-by: Alex Elder <el...@inktank.com>
---
drivers/block/rbd.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index e922989..4dff92f 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;
}
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html