diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-09-24 19:13:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-09-24 19:13:49 -0400 |
commit | bee2d97b2c4583c2471aa65ab9c189a0011f62b3 (patch) | |
tree | 74bcd6a17f3db312268b4ad25aa05a1912ff174f | |
parent | 979570e02981d4a8fc20b3cc8fd651856c98ee9d (diff) | |
parent | 5ce765a540f34d1e2005e1210f49f67fdf11e997 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
Pull two ceph fixes from Sage Weil:
"The first fixes a leak in the rbd setup error path, and the second
fixes a more serious problem with mismatched kmap/kunmap that surfaced
after the recent refactoring work."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
libceph: only kunmap kmapped pages
rbd: drop dev reference on error in rbd_open()
-rw-r--r-- | drivers/block/rbd.c | 7 | ||||
-rw-r--r-- | net/ceph/messenger.c | 5 |
2 files changed, 4 insertions, 8 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 9917943a3572..54a55f03115d 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -246,13 +246,12 @@ static int rbd_open(struct block_device *bdev, fmode_t mode) | |||
246 | { | 246 | { |
247 | struct rbd_device *rbd_dev = bdev->bd_disk->private_data; | 247 | struct rbd_device *rbd_dev = bdev->bd_disk->private_data; |
248 | 248 | ||
249 | rbd_get_dev(rbd_dev); | ||
250 | |||
251 | set_device_ro(bdev, rbd_dev->read_only); | ||
252 | |||
253 | if ((mode & FMODE_WRITE) && rbd_dev->read_only) | 249 | if ((mode & FMODE_WRITE) && rbd_dev->read_only) |
254 | return -EROFS; | 250 | return -EROFS; |
255 | 251 | ||
252 | rbd_get_dev(rbd_dev); | ||
253 | set_device_ro(bdev, rbd_dev->read_only); | ||
254 | |||
256 | return 0; | 255 | return 0; |
257 | } | 256 | } |
258 | 257 | ||
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 24c5eea8c45b..159aa8bef9e7 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -1073,16 +1073,13 @@ static int write_partial_msg_pages(struct ceph_connection *con) | |||
1073 | BUG_ON(kaddr == NULL); | 1073 | BUG_ON(kaddr == NULL); |
1074 | base = kaddr + con->out_msg_pos.page_pos + bio_offset; | 1074 | base = kaddr + con->out_msg_pos.page_pos + bio_offset; |
1075 | crc = crc32c(crc, base, len); | 1075 | crc = crc32c(crc, base, len); |
1076 | kunmap(page); | ||
1076 | msg->footer.data_crc = cpu_to_le32(crc); | 1077 | msg->footer.data_crc = cpu_to_le32(crc); |
1077 | con->out_msg_pos.did_page_crc = true; | 1078 | con->out_msg_pos.did_page_crc = true; |
1078 | } | 1079 | } |
1079 | ret = ceph_tcp_sendpage(con->sock, page, | 1080 | ret = ceph_tcp_sendpage(con->sock, page, |
1080 | con->out_msg_pos.page_pos + bio_offset, | 1081 | con->out_msg_pos.page_pos + bio_offset, |
1081 | len, 1); | 1082 | len, 1); |
1082 | |||
1083 | if (do_datacrc) | ||
1084 | kunmap(page); | ||
1085 | |||
1086 | if (ret <= 0) | 1083 | if (ret <= 0) |
1087 | goto out; | 1084 | goto out; |
1088 | 1085 | ||