Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9682fc6d authored by Alex Elder's avatar Alex Elder Committed by Sage Weil
Browse files

rbd: look up snapshot name in names buffer



Rather than scanning the list of snapshot structures for it, scan
the snapshot context buffer containing snapshot names in order to
determine for a format 1 image the name associated with a given
snapshot id.

Pull out the part of rbd_dev_v1_snap_info() that does this scan into
a new function, _rbd_dev_v1_snap_name().  Have that function return
a dynamically-allocated copy of the name, and don't duplicate it in
rbd_dev_v1_snap_info().

Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent dedc81ea
Loading
Loading
Loading
Loading
+30 −10
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@

#define RBD_SNAP_HEAD_NAME	"-"

#define	BAD_SNAP_INDEX	U32_MAX		/* invalid index into snap array */

/* This allows a single page to hold an image name sent by OSD */
#define RBD_IMAGE_NAME_LEN_MAX	(PAGE_SIZE - sizeof (__le32) - 1)
#define RBD_IMAGE_ID_LEN_MAX	64
@@ -809,6 +811,33 @@ out_err:
	return -ENOMEM;
}

static const char *_rbd_dev_v1_snap_name(struct rbd_device *rbd_dev, u32 which)
{
	const char *snap_name;

	rbd_assert(which < rbd_dev->header.snapc->num_snaps);

	/* Skip over names until we find the one we are looking for */

	snap_name = rbd_dev->header.snap_names;
	while (which--)
		snap_name += strlen(snap_name) + 1;

	return kstrdup(snap_name, GFP_KERNEL);
}

static u32 rbd_dev_snap_index(struct rbd_device *rbd_dev, u64 snap_id)
{
	struct ceph_snap_context *snapc = rbd_dev->header.snapc;
	u32 which;

	for (which = 0; which < snapc->num_snaps; which++)
		if (snapc->snaps[which] == snap_id)
			return which;

	return BAD_SNAP_INDEX;
}

static const char *rbd_snap_name(struct rbd_device *rbd_dev, u64 snap_id)
{
	struct rbd_snap *snap;
@@ -3421,17 +3450,8 @@ static const char *rbd_dev_v1_snap_info(struct rbd_device *rbd_dev, u32 which,
		u64 *snap_size, u64 *snap_features)
{
	const char *snap_name;
	int i;

	rbd_assert(which < rbd_dev->header.snapc->num_snaps);

	/* Skip over names until we find the one we are looking for */

	snap_name = rbd_dev->header.snap_names;
	for (i = 0; i < which; i++)
		snap_name += strlen(snap_name) + 1;

	snap_name = kstrdup(snap_name, GFP_KERNEL);
	snap_name = _rbd_dev_v1_snap_name(rbd_dev, which);
	if (!snap_name)
		return ERR_PTR(-ENOMEM);