Commit 593a9e7b authored by Alex Elder's avatar Alex Elder

rbd: small changes

Here is another set of small code tidy-ups:
    - Define SECTOR_SHIFT and SECTOR_SIZE, and use these symbolic
      names throughout.  Tell the blk_queue system our physical
      block size, in the (unlikely) event we want to use something
      other than the default.
    - Delete the definition of struct rbd_info, which is never used.
    - Move the definition of dev_to_rbd() down in its source file,
      just above where it gets first used, and change its name to
      dev_to_rbd_dev().
    - Replace an open-coded operation in rbd_dev_release() to use
      dev_to_rbd_dev() instead.
    - Calculate the segment size for a given rbd_device just once in
      rbd_init_disk().
    - Use the '%zd' conversion specifier in rbd_snap_size_show(),
      since the value formatted is a size_t.
    - Switch to the '%llu' conversion specifier in rbd_snap_id_show().
      since the value formatted is unsigned.
Signed-off-by: default avatarAlex Elder <elder@dreamhost.com>
parent 00f1f36f
...@@ -41,6 +41,15 @@ ...@@ -41,6 +41,15 @@
#include "rbd_types.h" #include "rbd_types.h"
/*
* The basic unit of block I/O is a sector. It is interpreted in a
* number of contexts in Linux (blk, bio, genhd), but the default is
* universally 512 bytes. These symbols are just slightly more
* meaningful than the bare numbers they represent.
*/
#define SECTOR_SHIFT 9
#define SECTOR_SIZE (1ULL << SECTOR_SHIFT)
#define RBD_DRV_NAME "rbd" #define RBD_DRV_NAME "rbd"
#define RBD_DRV_NAME_LONG "rbd (rados block device)" #define RBD_DRV_NAME_LONG "rbd (rados block device)"
...@@ -221,11 +230,6 @@ static struct device rbd_root_dev = { ...@@ -221,11 +230,6 @@ static struct device rbd_root_dev = {
}; };
static struct rbd_device *dev_to_rbd(struct device *dev)
{
return container_of(dev, struct rbd_device, dev);
}
static struct device *rbd_get_dev(struct rbd_device *rbd_dev) static struct device *rbd_get_dev(struct rbd_device *rbd_dev)
{ {
return get_device(&rbd_dev->dev); return get_device(&rbd_dev->dev);
...@@ -743,7 +747,7 @@ static struct bio *bio_chain_clone(struct bio **old, struct bio **next, ...@@ -743,7 +747,7 @@ static struct bio *bio_chain_clone(struct bio **old, struct bio **next,
/* split the bio. We'll release it either in the next /* split the bio. We'll release it either in the next
call, or it will have to be released outside */ call, or it will have to be released outside */
bp = bio_split(old_chain, (len - total) / 512ULL); bp = bio_split(old_chain, (len - total) / SECTOR_SIZE);
if (!bp) if (!bp)
goto err_out; goto err_out;
...@@ -1471,7 +1475,7 @@ static void rbd_rq_fn(struct request_queue *q) ...@@ -1471,7 +1475,7 @@ static void rbd_rq_fn(struct request_queue *q)
do_write = (rq_data_dir(rq) == WRITE); do_write = (rq_data_dir(rq) == WRITE);
size = blk_rq_bytes(rq); size = blk_rq_bytes(rq);
ofs = blk_rq_pos(rq) * 512ULL; ofs = blk_rq_pos(rq) * SECTOR_SIZE;
rq_bio = rq->bio; rq_bio = rq->bio;
if (do_write && rbd_dev->read_only) { if (do_write && rbd_dev->read_only) {
__blk_end_request_all(rq, -EROFS); __blk_end_request_all(rq, -EROFS);
...@@ -1482,7 +1486,7 @@ static void rbd_rq_fn(struct request_queue *q) ...@@ -1482,7 +1486,7 @@ static void rbd_rq_fn(struct request_queue *q)
dout("%s 0x%x bytes at 0x%llx\n", dout("%s 0x%x bytes at 0x%llx\n",
do_write ? "write" : "read", do_write ? "write" : "read",
size, blk_rq_pos(rq) * 512ULL); size, blk_rq_pos(rq) * SECTOR_SIZE);
num_segs = rbd_get_num_segments(&rbd_dev->header, ofs, size); num_segs = rbd_get_num_segments(&rbd_dev->header, ofs, size);
coll = rbd_alloc_coll(num_segs); coll = rbd_alloc_coll(num_segs);
...@@ -1547,13 +1551,17 @@ static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd, ...@@ -1547,13 +1551,17 @@ static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
struct bio_vec *bvec) struct bio_vec *bvec)
{ {
struct rbd_device *rbd_dev = q->queuedata; struct rbd_device *rbd_dev = q->queuedata;
unsigned int chunk_sectors = 1 << (rbd_dev->header.obj_order - 9); unsigned int chunk_sectors;
sector_t sector = bmd->bi_sector + get_start_sect(bmd->bi_bdev); sector_t sector;
unsigned int bio_sectors = bmd->bi_size >> 9; unsigned int bio_sectors;
int max; int max;
chunk_sectors = 1 << (rbd_dev->header.obj_order - SECTOR_SHIFT);
sector = bmd->bi_sector + get_start_sect(bmd->bi_bdev);
bio_sectors = bmd->bi_size >> SECTOR_SHIFT;
max = (chunk_sectors - ((sector & (chunk_sectors - 1)) max = (chunk_sectors - ((sector & (chunk_sectors - 1))
+ bio_sectors)) << 9; + bio_sectors)) << SECTOR_SHIFT;
if (max < 0) if (max < 0)
max = 0; /* bio_add cannot handle a negative return */ max = 0; /* bio_add cannot handle a negative return */
if (max <= bvec->bv_len && bio_sectors == 0) if (max <= bvec->bv_len && bio_sectors == 0)
...@@ -1708,7 +1716,7 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev) ...@@ -1708,7 +1716,7 @@ static int __rbd_update_snaps(struct rbd_device *rbd_dev)
return ret; return ret;
/* resized? */ /* resized? */
set_capacity(rbd_dev->disk, h.image_size / 512ULL); set_capacity(rbd_dev->disk, h.image_size / SECTOR_SIZE);
down_write(&rbd_dev->header.snap_rwsem); down_write(&rbd_dev->header.snap_rwsem);
...@@ -1745,6 +1753,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) ...@@ -1745,6 +1753,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
struct gendisk *disk; struct gendisk *disk;
struct request_queue *q; struct request_queue *q;
int rc; int rc;
u64 segment_size;
u64 total_size = 0; u64 total_size = 0;
/* contact OSD, request size info about the object being mapped */ /* contact OSD, request size info about the object being mapped */
...@@ -1780,11 +1789,15 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) ...@@ -1780,11 +1789,15 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
if (!q) if (!q)
goto out_disk; goto out_disk;
/* We use the default size, but let's be explicit about it. */
blk_queue_physical_block_size(q, SECTOR_SIZE);
/* set io sizes to object size */ /* set io sizes to object size */
blk_queue_max_hw_sectors(q, rbd_obj_bytes(&rbd_dev->header) / 512ULL); segment_size = rbd_obj_bytes(&rbd_dev->header);
blk_queue_max_segment_size(q, rbd_obj_bytes(&rbd_dev->header)); blk_queue_max_hw_sectors(q, segment_size / SECTOR_SIZE);
blk_queue_io_min(q, rbd_obj_bytes(&rbd_dev->header)); blk_queue_max_segment_size(q, segment_size);
blk_queue_io_opt(q, rbd_obj_bytes(&rbd_dev->header)); blk_queue_io_min(q, segment_size);
blk_queue_io_opt(q, segment_size);
blk_queue_merge_bvec(q, rbd_merge_bvec); blk_queue_merge_bvec(q, rbd_merge_bvec);
disk->queue = q; disk->queue = q;
...@@ -1795,7 +1808,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) ...@@ -1795,7 +1808,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
rbd_dev->q = q; rbd_dev->q = q;
/* finally, announce the disk to the world */ /* finally, announce the disk to the world */
set_capacity(disk, total_size / 512ULL); set_capacity(disk, total_size / SECTOR_SIZE);
add_disk(disk); add_disk(disk);
pr_info("%s: added with size 0x%llx\n", pr_info("%s: added with size 0x%llx\n",
...@@ -1812,10 +1825,15 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) ...@@ -1812,10 +1825,15 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
sysfs sysfs
*/ */
static struct rbd_device *dev_to_rbd_dev(struct device *dev)
{
return container_of(dev, struct rbd_device, dev);
}
static ssize_t rbd_size_show(struct device *dev, static ssize_t rbd_size_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%llu\n", (unsigned long long)rbd_dev->header.image_size); return sprintf(buf, "%llu\n", (unsigned long long)rbd_dev->header.image_size);
} }
...@@ -1823,7 +1841,7 @@ static ssize_t rbd_size_show(struct device *dev, ...@@ -1823,7 +1841,7 @@ static ssize_t rbd_size_show(struct device *dev,
static ssize_t rbd_major_show(struct device *dev, static ssize_t rbd_major_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%d\n", rbd_dev->major); return sprintf(buf, "%d\n", rbd_dev->major);
} }
...@@ -1831,7 +1849,7 @@ static ssize_t rbd_major_show(struct device *dev, ...@@ -1831,7 +1849,7 @@ static ssize_t rbd_major_show(struct device *dev,
static ssize_t rbd_client_id_show(struct device *dev, static ssize_t rbd_client_id_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "client%lld\n", return sprintf(buf, "client%lld\n",
ceph_client_id(rbd_dev->rbd_client->client)); ceph_client_id(rbd_dev->rbd_client->client));
...@@ -1840,7 +1858,7 @@ static ssize_t rbd_client_id_show(struct device *dev, ...@@ -1840,7 +1858,7 @@ static ssize_t rbd_client_id_show(struct device *dev,
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)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%s\n", rbd_dev->pool_name); return sprintf(buf, "%s\n", rbd_dev->pool_name);
} }
...@@ -1848,7 +1866,7 @@ static ssize_t rbd_pool_show(struct device *dev, ...@@ -1848,7 +1866,7 @@ static ssize_t rbd_pool_show(struct device *dev,
static ssize_t rbd_name_show(struct device *dev, static ssize_t rbd_name_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%s\n", rbd_dev->obj); return sprintf(buf, "%s\n", rbd_dev->obj);
} }
...@@ -1857,7 +1875,7 @@ static ssize_t rbd_snap_show(struct device *dev, ...@@ -1857,7 +1875,7 @@ static ssize_t rbd_snap_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
return sprintf(buf, "%s\n", rbd_dev->snap_name); return sprintf(buf, "%s\n", rbd_dev->snap_name);
} }
...@@ -1867,7 +1885,7 @@ static ssize_t rbd_image_refresh(struct device *dev, ...@@ -1867,7 +1885,7 @@ static ssize_t rbd_image_refresh(struct device *dev,
const char *buf, const char *buf,
size_t size) size_t size)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
int rc; int rc;
int ret = size; int ret = size;
...@@ -1932,7 +1950,7 @@ static ssize_t rbd_snap_size_show(struct device *dev, ...@@ -1932,7 +1950,7 @@ static ssize_t rbd_snap_size_show(struct device *dev,
{ {
struct rbd_snap *snap = container_of(dev, struct rbd_snap, dev); struct rbd_snap *snap = container_of(dev, struct rbd_snap, dev);
return sprintf(buf, "%lld\n", (long long)snap->size); return sprintf(buf, "%zd\n", snap->size);
} }
static ssize_t rbd_snap_id_show(struct device *dev, static ssize_t rbd_snap_id_show(struct device *dev,
...@@ -1941,7 +1959,7 @@ static ssize_t rbd_snap_id_show(struct device *dev, ...@@ -1941,7 +1959,7 @@ static ssize_t rbd_snap_id_show(struct device *dev,
{ {
struct rbd_snap *snap = container_of(dev, struct rbd_snap, dev); struct rbd_snap *snap = container_of(dev, struct rbd_snap, dev);
return sprintf(buf, "%lld\n", (long long)snap->id); return sprintf(buf, "%llu\n", (unsigned long long) snap->id);
} }
static DEVICE_ATTR(snap_size, S_IRUGO, rbd_snap_size_show, NULL); static DEVICE_ATTR(snap_size, S_IRUGO, rbd_snap_size_show, NULL);
...@@ -2232,7 +2250,8 @@ static void rbd_id_put(struct rbd_device *rbd_dev) ...@@ -2232,7 +2250,8 @@ static void rbd_id_put(struct rbd_device *rbd_dev)
/* /*
* Skips over white space at *buf, and updates *buf to point to the * Skips over white space at *buf, and updates *buf to point to the
* first found non-space character (if any). Returns the length of * first found non-space character (if any). Returns the length of
* the token (string of non-white space characters) found. * the token (string of non-white space characters) found. Note
* that *buf must be terminated with '\0'.
*/ */
static inline size_t next_token(const char **buf) static inline size_t next_token(const char **buf)
{ {
...@@ -2250,13 +2269,14 @@ static inline size_t next_token(const char **buf) ...@@ -2250,13 +2269,14 @@ static inline size_t next_token(const char **buf)
/* /*
* Finds the next token in *buf, and if the provided token buffer is * Finds the next token in *buf, and if the provided token buffer is
* big enough, copies the found token into it. The result, if * big enough, copies the found token into it. The result, if
* copied, is guaranteed to be terminated with '\0'. * copied, is guaranteed to be terminated with '\0'. Note that *buf
* must be terminated with '\0' on entry.
* *
* Returns the length of the token found (not including the '\0'). * Returns the length of the token found (not including the '\0').
* Return value will be 0 if no token is found, and it will be >= * Return value will be 0 if no token is found, and it will be >=
* token_size if the token would not fit. * token_size if the token would not fit.
* *
* The *buf pointer will be updated point beyond the end of the * The *buf pointer will be updated to point beyond the end of the
* found token. Note that this occurs even if the token buffer is * found token. Note that this occurs even if the token buffer is
* too small to hold it. * too small to hold it.
*/ */
...@@ -2456,8 +2476,7 @@ static struct rbd_device *__rbd_get_dev(unsigned long id) ...@@ -2456,8 +2476,7 @@ static struct rbd_device *__rbd_get_dev(unsigned long id)
static void rbd_dev_release(struct device *dev) static void rbd_dev_release(struct device *dev)
{ {
struct rbd_device *rbd_dev = struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
container_of(dev, struct rbd_device, dev);
if (rbd_dev->watch_request) { if (rbd_dev->watch_request) {
struct ceph_client *client = rbd_dev->rbd_client->client; struct ceph_client *client = rbd_dev->rbd_client->client;
...@@ -2520,7 +2539,7 @@ static ssize_t rbd_snap_add(struct device *dev, ...@@ -2520,7 +2539,7 @@ static ssize_t rbd_snap_add(struct device *dev,
const char *buf, const char *buf,
size_t count) size_t count)
{ {
struct rbd_device *rbd_dev = dev_to_rbd(dev); struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
int ret; int ret;
char *name = kmalloc(count + 1, GFP_KERNEL); char *name = kmalloc(count + 1, GFP_KERNEL);
if (!name) if (!name)
......
...@@ -41,10 +41,6 @@ ...@@ -41,10 +41,6 @@
#define RBD_HEADER_SIGNATURE "RBD" #define RBD_HEADER_SIGNATURE "RBD"
#define RBD_HEADER_VERSION "001.005" #define RBD_HEADER_VERSION "001.005"
struct rbd_info {
__le64 max_id;
} __attribute__ ((packed));
struct rbd_image_snap_ondisk { struct rbd_image_snap_ondisk {
__le64 id; __le64 id;
__le64 image_size; __le64 image_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment