On Mon, 12 Mar 2012, Alex Elder wrote:
> The helper macros for accessing file layout fields of an on-disk
> ceph file layout structure cast their results to type (__s32). This
> is a bit strange, since (with one exception--fl_pg_preferred):
> - there is no need for negative values; and
> - all users of these macros are assigning their result to
> 64-bit variables.
> So just make these macros return a 64-bit unsigned type.
>
> The exception is the preferred placement group, which remains a
> signed 32-bit value. A placement group id encodes the preferred
> primary OSD in a 16-bit value, and there's no sense at this point
> getting too far away from that.
>
> Signed-off-by: Alex Elder <[email protected]>
> ---
> fs/ceph/inode.c | 6 +++++-
> fs/ceph/ioctl.c | 22 +++++++++++-----------
> fs/ceph/xattr.c | 16 ++++++++--------
> include/linux/ceph/ceph_fs.h | 26 ++++++++++++--------------
> net/ceph/ceph_fs.c | 6 +++---
> net/ceph/osdmap.c | 25 +++++++++++++------------
> 6 files changed, 52 insertions(+), 49 deletions(-)
>
> diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
> index d291928..1828fb9 100644
> --- a/fs/ceph/inode.c
> +++ b/fs/ceph/inode.c
> @@ -568,6 +568,7 @@ static int fill_inode(struct inode *inode,
> struct ceph_buffer *xattr_blob = NULL;
> int err = 0;
> int queue_trunc = 0;
> + __u64 stripe_unit;
>
> dout("fill_inode %p ino %llx.%llx v %llu had %llu\n",
> inode, ceph_vinop(inode), le64_to_cpu(info->version),
> @@ -643,7 +644,10 @@ static int fill_inode(struct inode *inode,
> }
>
> ci->i_layout = info->layout;
> - inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
> +
> + stripe_unit = ceph_file_layout_stripe_unit(&info->layout);
> + BUG_ON(stripe_unit > (__u64) INT_MAX);
> + inode->i_blkbits = fls((int) stripe_unit) - 1;
>
> /* xattrs */
> /* note that if i_xattrs.len <= 4, i_xattrs.data will still be NULL.
> */
> diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c
> index 75cff03..2fde342 100644
> --- a/fs/ceph/ioctl.c
> +++ b/fs/ceph/ioctl.c
> @@ -22,10 +22,10 @@ static long ceph_ioctl_get_layout(struct file *file, void
> __user *arg)
>
> err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
> if (!err) {
> - l.stripe_unit = (__u64)
> ceph_file_layout_stripe_unit(&ci->i_layout);
> - l.stripe_count = (__u64)
> ceph_file_layout_stripe_count(&ci->i_layout);
> - l.object_size = (__u64)
> ceph_file_layout_object_size(&ci->i_layout);
> - l.data_pool = (__u64) ceph_file_layout_pg_pool(&ci->i_layout);
> + l.stripe_unit = ceph_file_layout_stripe_unit(&ci->i_layout);
> + l.stripe_count = ceph_file_layout_stripe_count(&ci->i_layout);
> + l.object_size = ceph_file_layout_object_size(&ci->i_layout);
> + l.data_pool = ceph_file_layout_pg_pool(&ci->i_layout);
> l.preferred_osd =
> (__s64) ceph_file_layout_pg_preferred(&ci->i_layout);
> if (copy_to_user(arg, &l, sizeof(l)))
> @@ -52,12 +52,12 @@ static long ceph_ioctl_set_layout(struct file *file, void
> __user *arg)
> /* validate changed params against current layout */
> err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
> if (!err) {
> - nl.stripe_unit = (__u64)
> ceph_file_layout_stripe_unit(&ci->i_layout);
> - nl.stripe_count = (__u64)
> ceph_file_layout_stripe_count(&ci->i_layout);
> - nl.object_size = (__u64)
> ceph_file_layout_object_size(&ci->i_layout);
> - nl.data_pool = (__u64)
> ceph_file_layout_pg_pool(&ci->i_layout);
> + nl.stripe_unit = ceph_file_layout_stripe_unit(&ci->i_layout);
> + nl.stripe_count =
> ceph_file_layout_stripe_count(&ci->i_layout);
> + nl.object_size = ceph_file_layout_object_size(&ci->i_layout);
> + nl.data_pool = ceph_file_layout_pg_pool(&ci->i_layout);
> nl.preferred_osd =
> - (__s64)
> ceph_file_layout_pg_preferred(&ci->i_layout);
> + (__s64) ceph_file_layout_pg_preferred(&ci->i_layout);
> } else
> return err;
>
> @@ -203,8 +203,8 @@ static long ceph_ioctl_get_dataloc(struct file *file, void
> __user *arg)
> ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, &len,
> &dl.object_no, &dl.object_offset,
> &olen);
> dl.file_offset -= dl.object_offset;
> - dl.object_size = (__u64) ceph_file_layout_object_size(&ci->i_layout);
> - dl.block_size = (__u64) ceph_file_layout_stripe_unit(&ci->i_layout);
> + dl.object_size = ceph_file_layout_object_size(&ci->i_layout);
> + dl.block_size = ceph_file_layout_stripe_unit(&ci->i_layout);
>
> /* block_offset = object_offset % block_size */
> tmp = dl.object_offset;
> diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
> index bfd5b93..0652aa4 100644
> --- a/fs/ceph/xattr.c
> +++ b/fs/ceph/xattr.c
> @@ -112,20 +112,20 @@ static size_t ceph_vxattrcb_file_layout(struct
> ceph_inode_info *ci, char *val,
> size_t size)
> {
> int ret;
> + __s32 preferred;
>
> ret = snprintf(val, size,
> "chunk_bytes=%lld\nstripe_count=%lld\nobject_size=%lld\n",
> - (unsigned long
> long)ceph_file_layout_stripe_unit(&ci->i_layout),
> - (unsigned long
> long)ceph_file_layout_stripe_count(&ci->i_layout),
> - (unsigned long
> long)ceph_file_layout_object_size(&ci->i_layout));
> + ceph_file_layout_stripe_unit(&ci->i_layout),
> + ceph_file_layout_stripe_count(&ci->i_layout),
> + ceph_file_layout_object_size(&ci->i_layout));
>
> - if (ceph_file_layout_pg_preferred(&ci->i_layout) !=
> - CEPH_FILE_LAYOUT_PG_PREFERRED_NONE) {
> + preferred = ceph_file_layout_pg_preferred(&ci->i_layout);
> + if (preferred != CEPH_FILE_LAYOUT_PG_PREFERRED_NONE) {
> val += ret;
> size -= ret;
> - ret += snprintf(val, size, "preferred_osd=%lld\n",
> - (unsigned long long)ceph_file_layout_pg_preferred(
> - &ci->i_layout));
> + ret += snprintf(val, size, "preferred_osd=%d\n",
> + (int) preferred);
> }
>
> return ret;
> diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
> index cf86032..698d395 100644
> --- a/include/linux/ceph/ceph_fs.h
> +++ b/include/linux/ceph/ceph_fs.h
> @@ -75,32 +75,30 @@ struct ceph_file_layout {
>
> #define CEPH_MIN_STRIPE_UNIT 65536
> #define CEPH_FILE_LAYOUT_PG_PREFERRED_NONE ((__s32) cpu_to_le32(-1))
> +
> #define ceph_file_layout_stripe_unit(l) \
> - ((__s32) le32_to_cpu((l)->fl_stripe_unit))
> + ((__u64) le32_to_cpu((l)->fl_stripe_unit))
> #define ceph_file_layout_stripe_count(l) \
> - ((__s32) le32_to_cpu((l)->fl_stripe_count))
> + ((__u64) le32_to_cpu((l)->fl_stripe_count))
> #define ceph_file_layout_object_size(l) \
> - ((__s32) le32_to_cpu((l)->fl_object_size))
> -#define ceph_file_layout_cas_hash(l) \
> - ((__s32) le32_to_cpu((l)->fl_cas_hash))
> -#define ceph_file_layout_object_stripe_unit(l) \
> - ((__s32) le32_to_cpu((l)->fl_object_stripe_unit))
> + ((__u64) le32_to_cpu((l)->fl_object_size))
> +#define ceph_file_layout_cas_hash(l) le32_to_cpu((l)->fl_cas_hash)
> +#define ceph_file_layout_object_stripe_unit(l)
> le32_to_cpu((l)->fl_object_stripe_unit)
> #define ceph_file_layout_pg_preferred(l) \
> ((__s32) le32_to_cpu((l)->fl_pg_preferred))
> #define ceph_file_layout_pg_pool(l) \
> - ((__s32) le32_to_cpu((l)->fl_pg_pool))
> + ((__u64) le32_to_cpu((l)->fl_pg_pool))
>
> -static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout
> *l)
> +static inline __u64 ceph_file_layout_stripe_width(struct ceph_file_layout *l)
> {
> - return (unsigned) (ceph_file_layout_stripe_unit(l) *
> - ceph_file_layout_stripe_count(l));
> + return ceph_file_layout_stripe_unit(l) *
> ceph_file_layout_stripe_count(l);
> }
>
> /* "period" == bytes before i start on a new set of objects */
> -static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l)
> +static inline __u64 ceph_file_layout_period(struct ceph_file_layout *l)
> {
> - return (unsigned) (ceph_file_layout_object_size(l) *
> - ceph_file_layout_stripe_count(l));
> + return ceph_file_layout_object_size(l) *
> + ceph_file_layout_stripe_count(l);
> }
>
> int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
> diff --git a/net/ceph/ceph_fs.c b/net/ceph/ceph_fs.c
> index c3197b9..97f7c50 100644
> --- a/net/ceph/ceph_fs.c
> +++ b/net/ceph/ceph_fs.c
> @@ -9,9 +9,9 @@
> */
> int ceph_file_layout_is_valid(const struct ceph_file_layout *layout)
> {
> - __u32 su = (__u32) ceph_file_layout_stripe_unit(layout);
> - __u32 sc = (__u32) ceph_file_layout_stripe_count(layout);
> - __u32 os = (__u32) ceph_file_layout_object_size(layout);
> + __u64 su = ceph_file_layout_stripe_unit(layout);
> + __u64 sc = ceph_file_layout_stripe_count(layout);
> + __u64 os = ceph_file_layout_object_size(layout);
>
> /* stripe unit, object size must be non-zero, 64k increment */
> if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1)))
> diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
> index 26c30e7..bc2d807 100644
> --- a/net/ceph/osdmap.c
> +++ b/net/ceph/osdmap.c
> @@ -946,9 +946,9 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout
> *layout,
> u64 *object_ext_off,
> u64 *object_ext_len)
> {
> - u64 object_size = (u64) ceph_file_layout_object_size(layout);
> - u64 stripe_unit = (u64) ceph_file_layout_stripe_unit(layout);
> - u64 stripe_count = (u64) ceph_file_layout_stripe_count(layout);
> + u64 object_size = ceph_file_layout_object_size(layout);
> + u64 stripe_unit = ceph_file_layout_stripe_unit(layout);
> + u64 stripe_count = ceph_file_layout_stripe_count(layout);
> u64 stripe_unit_per_object;
> u64 stripe_unit_num;
> u64 stripe_unit_offset;
> @@ -1028,29 +1028,30 @@ int ceph_calc_object_layout(struct ceph_object_layout
> *ol,
> {
> unsigned num, num_mask;
> struct ceph_pg pgid;
> - s32 preferred = (s32) ceph_file_layout_pg_preferred(fl);
> + s32 preferred = ceph_file_layout_pg_preferred(fl);
> int poolid = (int) ceph_file_layout_pg_pool(fl);
> struct ceph_pg_pool_info *pool;
> unsigned ps;
>
> BUG_ON(!osdmap);
> + BUG_ON(preferred > (s32) SHRT_MAX);
> + BUG_ON(preferred < (s32) SHRT_MIN);
>
> pool = __lookup_pg_pool(&osdmap->pg_pools, poolid);
> if (!pool)
> return -EIO;
> - ps = ceph_str_hash(pool->v.object_hash, oid, strlen(oid));
>
> - if (preferred == CEPH_FILE_LAYOUT_PG_PREFERRED_NONE) {
> - num = le32_to_cpu(pool->v.pg_num);
> - num_mask = pool->pg_num_mask;
> - } else {
> + ps = ceph_str_hash(pool->v.object_hash, oid, strlen(oid));
> + if (preferred != CEPH_FILE_LAYOUT_PG_PREFERRED_NONE) {
> + BUG_ON(preferred < 0);
> ps += preferred;
> - num = le32_to_cpu(pool->v.lpg_num);
> - num_mask = pool->lpg_num_mask;
> }
>
> + num = le32_to_cpu(pool->v.lpg_num);
> + num_mask = pool->lpg_num_mask;
Unless i'm misreading this diff, you're switching to always using lpg_num
and lpg_num_mask instead of pg_num and pg_num_mask. That "l" prefix means
"localized," for a different set of localized PGs used when htere is a
preferred OSD. We need to keep these assignments in the if and else
blocks...
> +
> pgid.ps = cpu_to_le16(ps);
> - pgid.preferred = cpu_to_le16(preferred);
> + pgid.preferred = cpu_to_le16((s16) preferred);
> pgid.pool = fl->fl_pg_pool;
> if (preferred == CEPH_FILE_LAYOUT_PG_PREFERRED_NONE)
> dout("calc_object_layout '%s' pgid %d.%x\n", oid, poolid, ps);
> --
> 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