rbd: move snap_rwsem to the device, rename to header_rwsem
A new temporary header is allocated each time the header changes, but only the changed properties are copied over. We don't need a new semaphore for each header update. This addresses http://tracker.newdream.net/issues/2174 Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Reviewed-by: Alex Elder <elder@dreamhost.com>
This commit is contained in:
parent
3489b42a72
commit
c666601a93
@ -82,7 +82,6 @@ struct rbd_image_header {
|
|||||||
__u8 obj_order;
|
__u8 obj_order;
|
||||||
__u8 crypt_type;
|
__u8 crypt_type;
|
||||||
__u8 comp_type;
|
__u8 comp_type;
|
||||||
struct rw_semaphore snap_rwsem;
|
|
||||||
struct ceph_snap_context *snapc;
|
struct ceph_snap_context *snapc;
|
||||||
size_t snap_names_len;
|
size_t snap_names_len;
|
||||||
u64 snap_seq;
|
u64 snap_seq;
|
||||||
@ -173,6 +172,8 @@ struct rbd_device {
|
|||||||
struct ceph_osd_event *watch_event;
|
struct ceph_osd_event *watch_event;
|
||||||
struct ceph_osd_request *watch_request;
|
struct ceph_osd_request *watch_request;
|
||||||
|
|
||||||
|
/* protects updating the header */
|
||||||
|
struct rw_semaphore header_rwsem;
|
||||||
char snap_name[RBD_MAX_SNAP_NAME_LEN];
|
char snap_name[RBD_MAX_SNAP_NAME_LEN];
|
||||||
u32 cur_snap; /* index+1 of current snapshot within snap context
|
u32 cur_snap; /* index+1 of current snapshot within snap context
|
||||||
0 - for the head */
|
0 - for the head */
|
||||||
@ -502,7 +503,6 @@ static int rbd_header_from_disk(struct rbd_image_header *header,
|
|||||||
if (!header->snapc)
|
if (!header->snapc)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
init_rwsem(&header->snap_rwsem);
|
|
||||||
header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
|
header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
|
||||||
if (snap_count) {
|
if (snap_count) {
|
||||||
header->snap_names = kmalloc(header->snap_names_len,
|
header->snap_names = kmalloc(header->snap_names_len,
|
||||||
@ -597,7 +597,7 @@ static int rbd_header_set_snap(struct rbd_device *dev, u64 *size)
|
|||||||
|
|
||||||
BUILD_BUG_ON(sizeof (dev->snap_name) < sizeof (RBD_SNAP_HEAD_NAME));
|
BUILD_BUG_ON(sizeof (dev->snap_name) < sizeof (RBD_SNAP_HEAD_NAME));
|
||||||
|
|
||||||
down_write(&header->snap_rwsem);
|
down_write(&dev->header_rwsem);
|
||||||
|
|
||||||
if (!memcmp(dev->snap_name, RBD_SNAP_HEAD_NAME,
|
if (!memcmp(dev->snap_name, RBD_SNAP_HEAD_NAME,
|
||||||
sizeof (RBD_SNAP_HEAD_NAME))) {
|
sizeof (RBD_SNAP_HEAD_NAME))) {
|
||||||
@ -620,7 +620,7 @@ static int rbd_header_set_snap(struct rbd_device *dev, u64 *size)
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
done:
|
done:
|
||||||
up_write(&header->snap_rwsem);
|
up_write(&dev->header_rwsem);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -887,7 +887,6 @@ static int rbd_do_request(struct request *rq,
|
|||||||
struct timespec mtime = CURRENT_TIME;
|
struct timespec mtime = CURRENT_TIME;
|
||||||
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 ceph_osd_client *osdc;
|
struct ceph_osd_client *osdc;
|
||||||
|
|
||||||
req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
|
req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
|
||||||
@ -905,13 +904,13 @@ static int rbd_do_request(struct request *rq,
|
|||||||
|
|
||||||
dout("rbd_do_request obj=%s ofs=%lld len=%lld\n", obj, len, ofs);
|
dout("rbd_do_request obj=%s ofs=%lld len=%lld\n", obj, len, ofs);
|
||||||
|
|
||||||
down_read(&header->snap_rwsem);
|
down_read(&dev->header_rwsem);
|
||||||
|
|
||||||
osdc = &dev->rbd_client->client->osdc;
|
osdc = &dev->rbd_client->client->osdc;
|
||||||
req = ceph_osdc_alloc_request(osdc, flags, snapc, ops,
|
req = ceph_osdc_alloc_request(osdc, flags, snapc, ops,
|
||||||
false, GFP_NOIO, pages, bio);
|
false, GFP_NOIO, pages, bio);
|
||||||
if (!req) {
|
if (!req) {
|
||||||
up_read(&header->snap_rwsem);
|
up_read(&dev->header_rwsem);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto done_pages;
|
goto done_pages;
|
||||||
}
|
}
|
||||||
@ -946,7 +945,7 @@ static int rbd_do_request(struct request *rq,
|
|||||||
snapc,
|
snapc,
|
||||||
&mtime,
|
&mtime,
|
||||||
req->r_oid, req->r_oid_len);
|
req->r_oid, req->r_oid_len);
|
||||||
up_read(&header->snap_rwsem);
|
up_read(&dev->header_rwsem);
|
||||||
|
|
||||||
if (linger_req) {
|
if (linger_req) {
|
||||||
ceph_osdc_set_request_linger(osdc, req);
|
ceph_osdc_set_request_linger(osdc, req);
|
||||||
@ -1718,7 +1717,7 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev)
|
|||||||
/* resized? */
|
/* resized? */
|
||||||
set_capacity(rbd_dev->disk, h.image_size / SECTOR_SIZE);
|
set_capacity(rbd_dev->disk, h.image_size / SECTOR_SIZE);
|
||||||
|
|
||||||
down_write(&rbd_dev->header.snap_rwsem);
|
down_write(&rbd_dev->header_rwsem);
|
||||||
|
|
||||||
snap_seq = rbd_dev->header.snapc->seq;
|
snap_seq = rbd_dev->header.snapc->seq;
|
||||||
if (rbd_dev->header.total_snaps &&
|
if (rbd_dev->header.total_snaps &&
|
||||||
@ -1743,7 +1742,7 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev)
|
|||||||
|
|
||||||
ret = __rbd_init_snaps_header(rbd_dev);
|
ret = __rbd_init_snaps_header(rbd_dev);
|
||||||
|
|
||||||
up_write(&rbd_dev->header.snap_rwsem);
|
up_write(&rbd_dev->header_rwsem);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2380,8 +2379,9 @@ static ssize_t rbd_add(struct bus_type *bus,
|
|||||||
spin_lock_init(&rbd_dev->lock);
|
spin_lock_init(&rbd_dev->lock);
|
||||||
INIT_LIST_HEAD(&rbd_dev->node);
|
INIT_LIST_HEAD(&rbd_dev->node);
|
||||||
INIT_LIST_HEAD(&rbd_dev->snaps);
|
INIT_LIST_HEAD(&rbd_dev->snaps);
|
||||||
|
init_rwsem(&rbd_dev->header_rwsem);
|
||||||
|
|
||||||
init_rwsem(&rbd_dev->header.snap_rwsem);
|
init_rwsem(&rbd_dev->header_rwsem);
|
||||||
|
|
||||||
/* generate unique id: find highest unique id, add one */
|
/* generate unique id: find highest unique id, add one */
|
||||||
rbd_id_get(rbd_dev);
|
rbd_id_get(rbd_dev);
|
||||||
|
Loading…
Reference in New Issue
Block a user