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

Commit 51703306 authored by Josh Durgin's avatar Josh Durgin Committed by Sage Weil
Browse files

rbd: remove buggy rollback functionality



This doesn't interact with resizing well, since it doesn't set the
size of the device to the size at the snapshot. It's also an expensive
operation to be synchronous. Rollback can still be done with the
userspace rbd tool.

Signed-off-by: default avatarJosh Durgin <josh.durgin@dreamhost.com>
parent 81e759fb
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -57,13 +57,6 @@ create_snap

	 $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create

rollback_snap

	Rolls back data to the specified snapshot. This goes over the entire
	list of rados blocks and sends a rollback command to each.

	 $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_rollback

snap_*

	A directory per each snapshot
+0 −90
Original line number Diff line number Diff line
@@ -183,10 +183,6 @@ static LIST_HEAD(rbd_client_list); /* clients */

static int __rbd_init_snaps_header(struct rbd_device *rbd_dev);
static void rbd_dev_release(struct device *dev);
static ssize_t rbd_snap_rollback(struct device *dev,
				 struct device_attribute *attr,
				 const char *buf,
				 size_t size);
static ssize_t rbd_snap_add(struct device *dev,
			    struct device_attribute *attr,
			    const char *buf,
@@ -1359,32 +1355,6 @@ static int rbd_req_sync_notify(struct rbd_device *dev,
	return ret;
}

/*
 * Request sync osd rollback
 */
static int rbd_req_sync_rollback_obj(struct rbd_device *dev,
				     u64 snapid,
				     const char *obj)
{
	struct ceph_osd_req_op *ops;
	int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_ROLLBACK, 0);
	if (ret < 0)
		return ret;

	ops[0].snap.snapid = snapid;

	ret = rbd_req_sync_op(dev, NULL,
			       CEPH_NOSNAP,
			       0,
			       CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
			       ops,
			       1, obj, 0, 0, NULL, NULL, NULL);

	rbd_destroy_ops(ops);

	return ret;
}

/*
 * Request sync osd read
 */
@@ -1891,7 +1861,6 @@ static DEVICE_ATTR(name, S_IRUGO, rbd_name_show, NULL);
static DEVICE_ATTR(refresh, S_IWUSR, NULL, rbd_image_refresh);
static DEVICE_ATTR(current_snap, S_IRUGO, rbd_snap_show, NULL);
static DEVICE_ATTR(create_snap, S_IWUSR, NULL, rbd_snap_add);
static DEVICE_ATTR(rollback_snap, S_IWUSR, NULL, rbd_snap_rollback);

static struct attribute *rbd_attrs[] = {
	&dev_attr_size.attr,
@@ -1902,7 +1871,6 @@ static struct attribute *rbd_attrs[] = {
	&dev_attr_current_snap.attr,
	&dev_attr_refresh.attr,
	&dev_attr_create_snap.attr,
	&dev_attr_rollback_snap.attr,
	NULL
};

@@ -2433,64 +2401,6 @@ static ssize_t rbd_snap_add(struct device *dev,
	return ret;
}

static ssize_t rbd_snap_rollback(struct device *dev,
				 struct device_attribute *attr,
				 const char *buf,
				 size_t count)
{
	struct rbd_device *rbd_dev = dev_to_rbd(dev);
	int ret;
	u64 snapid;
	u64 cur_ofs;
	char *seg_name = NULL;
	char *snap_name = kmalloc(count + 1, GFP_KERNEL);
	ret = -ENOMEM;
	if (!snap_name)
		return ret;

	/* parse snaps add command */
	snprintf(snap_name, count, "%s", buf);
	seg_name = kmalloc(RBD_MAX_SEG_NAME_LEN + 1, GFP_NOIO);
	if (!seg_name)
		goto done;

	mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);

	ret = snap_by_name(&rbd_dev->header, snap_name, &snapid, NULL);
	if (ret < 0)
		goto done_unlock;

	dout("snapid=%lld\n", snapid);

	cur_ofs = 0;
	while (cur_ofs < rbd_dev->header.image_size) {
		cur_ofs += rbd_get_segment(&rbd_dev->header,
					   rbd_dev->obj,
					   cur_ofs, (u64)-1,
					   seg_name, NULL);
		dout("seg_name=%s\n", seg_name);

		ret = rbd_req_sync_rollback_obj(rbd_dev, snapid, seg_name);
		if (ret < 0)
			pr_warning("could not roll back obj %s err=%d\n",
				   seg_name, ret);
	}

	ret = __rbd_update_snaps(rbd_dev);
	if (ret < 0)
		goto done_unlock;

	ret = count;

done_unlock:
	mutex_unlock(&ctl_mutex);
done:
	kfree(seg_name);
	kfree(snap_name);

	return ret;
}

static struct bus_attribute rbd_bus_attrs[] = {
	__ATTR(add, S_IWUSR, NULL, rbd_add),
	__ATTR(remove, S_IWUSR, NULL, rbd_remove),