提交 0d6d1e9c 编写于 作者: M Mike Christie 提交者: Ilya Dryomov

rbd: add 'config_info' sysfs rbd device attribute

Export the info used to setup the rbd image, so it can be used to remap
the image.
Signed-off-by: NMike Christie <mchristi@redhat.com>
[idryomov@gmail.com: do_rbd_add() EH]
Signed-off-by: NIlya Dryomov <idryomov@gmail.com>
上级 92a58671
...@@ -57,6 +57,11 @@ cluster_fsid ...@@ -57,6 +57,11 @@ cluster_fsid
The ceph cluster UUID. (August 2016, since 4.9.) The ceph cluster UUID. (August 2016, since 4.9.)
config_info
The string written into /sys/bus/rbd/add{,_single_major}. (August
2016, since 4.9.)
features features
A hexadecimal encoding of the feature bits for this image. A hexadecimal encoding of the feature bits for this image.
......
...@@ -370,6 +370,7 @@ struct rbd_device { ...@@ -370,6 +370,7 @@ struct rbd_device {
unsigned long flags; /* possibly lock protected */ unsigned long flags; /* possibly lock protected */
struct rbd_spec *spec; struct rbd_spec *spec;
struct rbd_options *opts; struct rbd_options *opts;
char *config_info; /* add{,_single_major} string */
struct ceph_object_id header_oid; struct ceph_object_id header_oid;
struct ceph_object_locator header_oloc; struct ceph_object_locator header_oloc;
...@@ -4620,6 +4621,14 @@ static ssize_t rbd_cluster_fsid_show(struct device *dev, ...@@ -4620,6 +4621,14 @@ static ssize_t rbd_cluster_fsid_show(struct device *dev,
return sprintf(buf, "%pU\n", &rbd_dev->rbd_client->client->fsid); return sprintf(buf, "%pU\n", &rbd_dev->rbd_client->client->fsid);
} }
static ssize_t rbd_config_info_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%s\n", rbd_dev->config_info);
}
static ssize_t rbd_pool_show(struct device *dev, static ssize_t rbd_pool_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
...@@ -4732,6 +4741,7 @@ static DEVICE_ATTR(minor, S_IRUGO, rbd_minor_show, NULL); ...@@ -4732,6 +4741,7 @@ static DEVICE_ATTR(minor, S_IRUGO, rbd_minor_show, NULL);
static DEVICE_ATTR(client_addr, S_IRUGO, rbd_client_addr_show, NULL); static DEVICE_ATTR(client_addr, S_IRUGO, rbd_client_addr_show, NULL);
static DEVICE_ATTR(client_id, S_IRUGO, rbd_client_id_show, NULL); static DEVICE_ATTR(client_id, S_IRUGO, rbd_client_id_show, NULL);
static DEVICE_ATTR(cluster_fsid, S_IRUGO, rbd_cluster_fsid_show, NULL); static DEVICE_ATTR(cluster_fsid, S_IRUGO, rbd_cluster_fsid_show, NULL);
static DEVICE_ATTR(config_info, S_IRUSR, rbd_config_info_show, NULL);
static DEVICE_ATTR(pool, S_IRUGO, rbd_pool_show, NULL); static DEVICE_ATTR(pool, S_IRUGO, rbd_pool_show, NULL);
static DEVICE_ATTR(pool_id, S_IRUGO, rbd_pool_id_show, NULL); static DEVICE_ATTR(pool_id, S_IRUGO, rbd_pool_id_show, NULL);
static DEVICE_ATTR(name, S_IRUGO, rbd_name_show, NULL); static DEVICE_ATTR(name, S_IRUGO, rbd_name_show, NULL);
...@@ -4749,6 +4759,7 @@ static struct attribute *rbd_attrs[] = { ...@@ -4749,6 +4759,7 @@ static struct attribute *rbd_attrs[] = {
&dev_attr_client_addr.attr, &dev_attr_client_addr.attr,
&dev_attr_client_id.attr, &dev_attr_client_id.attr,
&dev_attr_cluster_fsid.attr, &dev_attr_cluster_fsid.attr,
&dev_attr_config_info.attr,
&dev_attr_pool.attr, &dev_attr_pool.attr,
&dev_attr_pool_id.attr, &dev_attr_pool_id.attr,
&dev_attr_name.attr, &dev_attr_name.attr,
...@@ -4824,6 +4835,7 @@ static void rbd_dev_free(struct rbd_device *rbd_dev) ...@@ -4824,6 +4835,7 @@ static void rbd_dev_free(struct rbd_device *rbd_dev)
ceph_oid_destroy(&rbd_dev->header_oid); ceph_oid_destroy(&rbd_dev->header_oid);
ceph_oloc_destroy(&rbd_dev->header_oloc); ceph_oloc_destroy(&rbd_dev->header_oloc);
kfree(rbd_dev->config_info);
rbd_put_client(rbd_dev->rbd_client); rbd_put_client(rbd_dev->rbd_client);
rbd_spec_put(rbd_dev->spec); rbd_spec_put(rbd_dev->spec);
...@@ -6223,10 +6235,18 @@ static ssize_t do_rbd_add(struct bus_type *bus, ...@@ -6223,10 +6235,18 @@ static ssize_t do_rbd_add(struct bus_type *bus,
spec = NULL; /* rbd_dev now owns this */ spec = NULL; /* rbd_dev now owns this */
rbd_opts = NULL; /* rbd_dev now owns this */ rbd_opts = NULL; /* rbd_dev now owns this */
rbd_dev->config_info = kstrdup(buf, GFP_KERNEL);
if (!rbd_dev->config_info) {
rc = -ENOMEM;
goto err_out_rbd_dev;
}
down_write(&rbd_dev->header_rwsem); down_write(&rbd_dev->header_rwsem);
rc = rbd_dev_image_probe(rbd_dev, 0); rc = rbd_dev_image_probe(rbd_dev, 0);
if (rc < 0) if (rc < 0) {
up_write(&rbd_dev->header_rwsem);
goto err_out_rbd_dev; goto err_out_rbd_dev;
}
/* If we are mapping a snapshot it must be marked read-only */ /* If we are mapping a snapshot it must be marked read-only */
...@@ -6253,7 +6273,6 @@ static ssize_t do_rbd_add(struct bus_type *bus, ...@@ -6253,7 +6273,6 @@ static ssize_t do_rbd_add(struct bus_type *bus,
return rc; return rc;
err_out_rbd_dev: err_out_rbd_dev:
up_write(&rbd_dev->header_rwsem);
rbd_dev_destroy(rbd_dev); rbd_dev_destroy(rbd_dev);
err_out_client: err_out_client:
rbd_put_client(rbdc); rbd_put_client(rbdc);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册