On Tue, 28 Feb 2012, Alex Elder wrote:
> 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: Alex Elder <[email protected]>
> ---
> drivers/block/rbd.c | 85 +++++++++++++++++++++++++++-----------------
> drivers/block/rbd_types.h | 4 --
> 2 files changed, 52 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index a04322c..229f974 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -41,6 +41,15 @@
>
> #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)
> +
I would expect the block layer already has #defines for these?
> #define RBD_DRV_NAME "rbd"
> #define RBD_DRV_NAME_LONG "rbd (rados block device)"
>
> @@ -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)
> {
> return get_device(&rbd_dev->dev);
> @@ -742,7 +746,7 @@ static struct bio *bio_chain_clone(struct bio **old,
> struct bio **next,
>
> /* split the bio. We'll release it either in the next
> 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)
> goto err_out;
>
> @@ -1470,7 +1474,7 @@ static void rbd_rq_fn(struct request_queue *q)
> do_write = (rq_data_dir(rq) == WRITE);
>
> size = blk_rq_bytes(rq);
> - ofs = blk_rq_pos(rq) * 512ULL;
> + ofs = blk_rq_pos(rq) * SECTOR_SIZE;
> rq_bio = rq->bio;
> if (do_write && rbd_dev->read_only) {
> __blk_end_request_all(rq, -EROFS);
> @@ -1481,7 +1485,7 @@ static void rbd_rq_fn(struct request_queue *q)
>
> dout("%s 0x%x bytes at 0x%llx\n",
> 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);
> coll = rbd_alloc_coll(num_segs);
> @@ -1546,13 +1550,17 @@ static int rbd_merge_bvec(struct request_queue *q,
> struct bvec_merge_data *bmd,
> struct bio_vec *bvec)
> {
> struct rbd_device *rbd_dev = q->queuedata;
> - unsigned int chunk_sectors = 1 << (rbd_dev->header.obj_order - 9);
> - sector_t sector = bmd->bi_sector + get_start_sect(bmd->bi_bdev);
> - unsigned int bio_sectors = bmd->bi_size >> 9;
> + unsigned int chunk_sectors;
> + sector_t sector;
> + unsigned int bio_sectors;
> 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))
> - + bio_sectors)) << 9;
> + + bio_sectors)) << SECTOR_SHIFT;
> if (max < 0)
> max = 0; /* bio_add cannot handle a negative return */
> if (max <= bvec->bv_len && bio_sectors == 0)
> @@ -1707,7 +1715,7 @@ static int __rbd_update_snaps(struct rbd_device
> *rbd_dev)
> return ret;
>
> /* 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);
>
> @@ -1744,6 +1752,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
> struct gendisk *disk;
> struct request_queue *q;
> int rc;
> + u64 segment_size;
> u64 total_size = 0;
>
> /* contact OSD, request size info about the object being mapped */
> @@ -1779,11 +1788,15 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
> if (!q)
> 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 */
> - blk_queue_max_hw_sectors(q, rbd_obj_bytes(&rbd_dev->header) / 512ULL);
> - blk_queue_max_segment_size(q, rbd_obj_bytes(&rbd_dev->header));
> - blk_queue_io_min(q, rbd_obj_bytes(&rbd_dev->header));
> - blk_queue_io_opt(q, rbd_obj_bytes(&rbd_dev->header));
> + segment_size = rbd_obj_bytes(&rbd_dev->header);
> + blk_queue_max_hw_sectors(q, segment_size / SECTOR_SIZE);
> + blk_queue_max_segment_size(q, segment_size);
> + blk_queue_io_min(q, segment_size);
> + blk_queue_io_opt(q, segment_size);
>
> blk_queue_merge_bvec(q, rbd_merge_bvec);
> disk->queue = q;
> @@ -1794,7 +1807,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
> rbd_dev->q = q;
>
> /* finally, announce the disk to the world */
> - set_capacity(disk, total_size / 512ULL);
> + set_capacity(disk, total_size / SECTOR_SIZE);
> add_disk(disk);
>
> pr_info("%s: added with size 0x%llx\n",
> @@ -1811,10 +1824,15 @@ out:
> 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,
> 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);
> }
> @@ -1822,7 +1840,7 @@ static ssize_t rbd_size_show(struct device *dev,
> static ssize_t rbd_major_show(struct device *dev,
> 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);
> }
> @@ -1830,7 +1848,7 @@ static ssize_t rbd_major_show(struct device *dev,
> static ssize_t rbd_client_id_show(struct device *dev,
> 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",
> ceph_client_id(rbd_dev->rbd_client->client));
> @@ -1839,7 +1857,7 @@ static ssize_t rbd_client_id_show(struct device *dev,
> static ssize_t rbd_pool_show(struct device *dev,
> 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);
> }
> @@ -1847,7 +1865,7 @@ static ssize_t rbd_pool_show(struct device *dev,
> static ssize_t rbd_name_show(struct device *dev,
> 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);
> }
> @@ -1856,7 +1874,7 @@ static ssize_t rbd_snap_show(struct device *dev,
> 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->snap_name);
> }
> @@ -1866,7 +1884,7 @@ static ssize_t rbd_image_refresh(struct device *dev,
> const char *buf,
> 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 ret = size;
>
> @@ -1931,7 +1949,7 @@ static ssize_t rbd_snap_size_show(struct device *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,
> @@ -1940,7 +1958,7 @@ static ssize_t rbd_snap_id_show(struct device *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);
> @@ -2231,7 +2249,8 @@ static void rbd_id_put(struct rbd_device *rbd_dev)
> /*
> * Skips over white space at *buf, and updates *buf to point to the
> * 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)
> {
> @@ -2249,13 +2268,14 @@ static inline size_t next_token(const char **buf)
> /*
> * Finds the next token in *buf, and if the provided token buffer is
> * 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').
> * Return value will be 0 if no token is found, and it will be >=
> * 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
> * too small to hold it.
> */
> @@ -2452,8 +2472,7 @@ static struct rbd_device *__rbd_get_dev(unsigned long
> id)
>
> static void rbd_dev_release(struct device *dev)
> {
> - struct rbd_device *rbd_dev =
> - container_of(dev, struct rbd_device, dev);
> + struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
>
> if (rbd_dev->watch_request) {
> struct ceph_client *client = rbd_dev->rbd_client->client;
> @@ -2516,7 +2535,7 @@ static ssize_t rbd_snap_add(struct device *dev,
> const char *buf,
> size_t count)
> {
> - struct rbd_device *rbd_dev = dev_to_rbd(dev);
> + struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
> int ret;
> char *name = kmalloc(count + 1, GFP_KERNEL);
> if (!name)
> diff --git a/drivers/block/rbd_types.h b/drivers/block/rbd_types.h
> index fc6c678..9507086 100644
> --- a/drivers/block/rbd_types.h
> +++ b/drivers/block/rbd_types.h
> @@ -41,10 +41,6 @@
> #define RBD_HEADER_SIGNATURE "RBD"
> #define RBD_HEADER_VERSION "001.005"
>
> -struct rbd_info {
> - __le64 max_id;
> -} __attribute__ ((packed));
> -
> struct rbd_image_snap_ondisk {
> __le64 id;
> __le64 image_size;
> --
> 1.7.5.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html