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

Reply via email to