|
@@ -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 @@ fail:
|
|
|
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 @@ err_unlock:
|
|
|
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),
|