rbd: do not duplicate ceph_client pointer in rbd_device
The rbd_device structure maintains a duplicate copy of the ceph_client pointer maintained in its rbd_client structure. There appears to be no good reason for this, and its presence presents a risk of them getting out of synch or otherwise misused. So kill it off, and use the rbd_client copy only. Signed-off-by: Alex Elder <elder@dreamhost.com> Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
ee57741c52
commit
1dbb439913
1 changed files with 22 additions and 22 deletions
|
@ -140,7 +140,6 @@ struct rbd_device {
|
||||||
struct gendisk *disk; /* blkdev's gendisk and rq */
|
struct gendisk *disk; /* blkdev's gendisk and rq */
|
||||||
struct request_queue *q;
|
struct request_queue *q;
|
||||||
|
|
||||||
struct ceph_client *client;
|
|
||||||
struct rbd_client *rbd_client;
|
struct rbd_client *rbd_client;
|
||||||
|
|
||||||
char name[DEV_NAME_LEN]; /* blkdev name, e.g. rbd3 */
|
char name[DEV_NAME_LEN]; /* blkdev name, e.g. rbd3 */
|
||||||
|
@ -388,7 +387,6 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
|
||||||
/* using an existing client */
|
/* using an existing client */
|
||||||
kref_get(&rbdc->kref);
|
kref_get(&rbdc->kref);
|
||||||
rbd_dev->rbd_client = rbdc;
|
rbd_dev->rbd_client = rbdc;
|
||||||
rbd_dev->client = rbdc->client;
|
|
||||||
spin_unlock(&node_lock);
|
spin_unlock(&node_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -401,7 +399,6 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
rbd_dev->rbd_client = rbdc;
|
rbd_dev->rbd_client = rbdc;
|
||||||
rbd_dev->client = rbdc->client;
|
|
||||||
return 0;
|
return 0;
|
||||||
done_err:
|
done_err:
|
||||||
kfree(rbd_opts);
|
kfree(rbd_opts);
|
||||||
|
@ -435,7 +432,6 @@ static void rbd_put_client(struct rbd_device *rbd_dev)
|
||||||
kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
|
kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
|
||||||
spin_unlock(&node_lock);
|
spin_unlock(&node_lock);
|
||||||
rbd_dev->rbd_client = NULL;
|
rbd_dev->rbd_client = NULL;
|
||||||
rbd_dev->client = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -858,6 +854,7 @@ static int rbd_do_request(struct request *rq,
|
||||||
struct rbd_request *req_data;
|
struct rbd_request *req_data;
|
||||||
struct ceph_osd_request_head *reqhead;
|
struct ceph_osd_request_head *reqhead;
|
||||||
struct rbd_image_header *header = &dev->header;
|
struct rbd_image_header *header = &dev->header;
|
||||||
|
struct ceph_osd_client *osdc;
|
||||||
|
|
||||||
req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
|
req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
|
||||||
if (!req_data) {
|
if (!req_data) {
|
||||||
|
@ -876,11 +873,9 @@ static int rbd_do_request(struct request *rq,
|
||||||
|
|
||||||
down_read(&header->snap_rwsem);
|
down_read(&header->snap_rwsem);
|
||||||
|
|
||||||
req = ceph_osdc_alloc_request(&dev->client->osdc, flags,
|
osdc = &dev->rbd_client->client->osdc;
|
||||||
snapc,
|
req = ceph_osdc_alloc_request(osdc, flags, snapc, ops,
|
||||||
ops,
|
false, GFP_NOIO, pages, bio);
|
||||||
false,
|
|
||||||
GFP_NOIO, pages, bio);
|
|
||||||
if (!req) {
|
if (!req) {
|
||||||
up_read(&header->snap_rwsem);
|
up_read(&header->snap_rwsem);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -909,8 +904,8 @@ static int rbd_do_request(struct request *rq,
|
||||||
layout->fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER);
|
layout->fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER);
|
||||||
layout->fl_pg_preferred = cpu_to_le32(-1);
|
layout->fl_pg_preferred = cpu_to_le32(-1);
|
||||||
layout->fl_pg_pool = cpu_to_le32(dev->poolid);
|
layout->fl_pg_pool = cpu_to_le32(dev->poolid);
|
||||||
ceph_calc_raw_layout(&dev->client->osdc, layout, snapid,
|
ceph_calc_raw_layout(osdc, layout, snapid, ofs, &len, &bno,
|
||||||
ofs, &len, &bno, req, ops);
|
req, ops);
|
||||||
|
|
||||||
ceph_osdc_build_request(req, ofs, &len,
|
ceph_osdc_build_request(req, ofs, &len,
|
||||||
ops,
|
ops,
|
||||||
|
@ -920,16 +915,16 @@ static int rbd_do_request(struct request *rq,
|
||||||
up_read(&header->snap_rwsem);
|
up_read(&header->snap_rwsem);
|
||||||
|
|
||||||
if (linger_req) {
|
if (linger_req) {
|
||||||
ceph_osdc_set_request_linger(&dev->client->osdc, req);
|
ceph_osdc_set_request_linger(osdc, req);
|
||||||
*linger_req = req;
|
*linger_req = req;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ceph_osdc_start_request(&dev->client->osdc, req, false);
|
ret = ceph_osdc_start_request(osdc, req, false);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto done_err;
|
goto done_err;
|
||||||
|
|
||||||
if (!rbd_cb) {
|
if (!rbd_cb) {
|
||||||
ret = ceph_osdc_wait_request(&dev->client->osdc, req);
|
ret = ceph_osdc_wait_request(osdc, req);
|
||||||
if (ver)
|
if (ver)
|
||||||
*ver = le64_to_cpu(req->r_reassert_version.version);
|
*ver = le64_to_cpu(req->r_reassert_version.version);
|
||||||
dout("reassert_ver=%lld\n",
|
dout("reassert_ver=%lld\n",
|
||||||
|
@ -1227,7 +1222,7 @@ static int rbd_req_sync_watch(struct rbd_device *dev,
|
||||||
u64 ver)
|
u64 ver)
|
||||||
{
|
{
|
||||||
struct ceph_osd_req_op *ops;
|
struct ceph_osd_req_op *ops;
|
||||||
struct ceph_osd_client *osdc = &dev->client->osdc;
|
struct ceph_osd_client *osdc = &dev->rbd_client->client->osdc;
|
||||||
|
|
||||||
int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_WATCH, 0);
|
int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_WATCH, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -1314,7 +1309,7 @@ static int rbd_req_sync_notify(struct rbd_device *dev,
|
||||||
const char *obj)
|
const char *obj)
|
||||||
{
|
{
|
||||||
struct ceph_osd_req_op *ops;
|
struct ceph_osd_req_op *ops;
|
||||||
struct ceph_osd_client *osdc = &dev->client->osdc;
|
struct ceph_osd_client *osdc = &dev->rbd_client->client->osdc;
|
||||||
struct ceph_osd_event *event;
|
struct ceph_osd_event *event;
|
||||||
struct rbd_notify_info info;
|
struct rbd_notify_info info;
|
||||||
int payload_len = sizeof(u32) + sizeof(u32);
|
int payload_len = sizeof(u32) + sizeof(u32);
|
||||||
|
@ -1623,13 +1618,14 @@ static int rbd_header_add_snap(struct rbd_device *dev,
|
||||||
int ret;
|
int ret;
|
||||||
void *data, *p, *e;
|
void *data, *p, *e;
|
||||||
u64 ver;
|
u64 ver;
|
||||||
|
struct ceph_mon_client *monc;
|
||||||
|
|
||||||
/* we should create a snapshot only if we're pointing at the head */
|
/* we should create a snapshot only if we're pointing at the head */
|
||||||
if (dev->cur_snap)
|
if (dev->cur_snap)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ret = ceph_monc_create_snapid(&dev->client->monc, dev->poolid,
|
monc = &dev->rbd_client->client->monc;
|
||||||
&new_snapid);
|
ret = ceph_monc_create_snapid(monc, dev->poolid, &new_snapid);
|
||||||
dout("created snapid=%lld\n", new_snapid);
|
dout("created snapid=%lld\n", new_snapid);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1809,7 +1805,8 @@ static ssize_t rbd_client_id_show(struct device *dev,
|
||||||
{
|
{
|
||||||
struct rbd_device *rbd_dev = dev_to_rbd(dev);
|
struct rbd_device *rbd_dev = dev_to_rbd(dev);
|
||||||
|
|
||||||
return sprintf(buf, "client%lld\n", ceph_client_id(rbd_dev->client));
|
return sprintf(buf, "client%lld\n",
|
||||||
|
ceph_client_id(rbd_dev->rbd_client->client));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t rbd_pool_show(struct device *dev,
|
static ssize_t rbd_pool_show(struct device *dev,
|
||||||
|
@ -2233,7 +2230,7 @@ static ssize_t rbd_add(struct bus_type *bus,
|
||||||
mutex_unlock(&ctl_mutex);
|
mutex_unlock(&ctl_mutex);
|
||||||
|
|
||||||
/* pick the pool */
|
/* pick the pool */
|
||||||
osdc = &rbd_dev->client->osdc;
|
osdc = &rbd_dev->rbd_client->client->osdc;
|
||||||
rc = ceph_pg_poolid_by_name(osdc->osdmap, rbd_dev->pool_name);
|
rc = ceph_pg_poolid_by_name(osdc->osdmap, rbd_dev->pool_name);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto err_out_client;
|
goto err_out_client;
|
||||||
|
@ -2312,9 +2309,12 @@ static void rbd_dev_release(struct device *dev)
|
||||||
struct rbd_device *rbd_dev =
|
struct rbd_device *rbd_dev =
|
||||||
container_of(dev, struct rbd_device, dev);
|
container_of(dev, struct rbd_device, dev);
|
||||||
|
|
||||||
if (rbd_dev->watch_request)
|
if (rbd_dev->watch_request) {
|
||||||
ceph_osdc_unregister_linger_request(&rbd_dev->client->osdc,
|
struct ceph_client *client = rbd_dev->rbd_client->client;
|
||||||
|
|
||||||
|
ceph_osdc_unregister_linger_request(&client->osdc,
|
||||||
rbd_dev->watch_request);
|
rbd_dev->watch_request);
|
||||||
|
}
|
||||||
if (rbd_dev->watch_event)
|
if (rbd_dev->watch_event)
|
||||||
rbd_req_sync_unwatch(rbd_dev, rbd_dev->obj_md_name);
|
rbd_req_sync_unwatch(rbd_dev, rbd_dev->obj_md_name);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue