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),
}
ci->i_layout = info->layout;
- inode->i_blkbits = fls(ceph_file_layout_stripe_unit(&info->layout)) - 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. */
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)))
/* 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;
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;
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;
#define CEPH_MIN_STRIPE_UNIT 65536
#define CEPH_FILE_LAYOUT_PG_PREFERRED_NONE ((__s32) -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))
+ ((__u64) le32_to_cpu((l)->fl_object_size))
#define ceph_file_layout_cas_hash(l) \
- ((__s32) le32_to_cpu((l)->fl_cas_hash))
+ ((__u32) le32_to_cpu((l)->fl_cas_hash))
#define ceph_file_layout_object_stripe_unit(l) \
- ((__s32) le32_to_cpu((l)->fl_object_stripe_unit))
+ ((__u32) 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);
*/
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)))
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;
struct ceph_osdmap *osdmap)
{
unsigned num, num_mask;
- 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 {
+ BUG_ON(preferred < 0);
ps += preferred;
num = le32_to_cpu(pool->v.lpg_num);
num_mask = pool->lpg_num_mask;
/* ceph_object_layout is not in CPU byte order... */
ol->ol_pgid.ps = cpu_to_le16(ps);
- ol->ol_pgid.preferred = cpu_to_le16(preferred);
+ ol->ol_pgid.preferred = cpu_to_le16((s16) preferred);
/* ...so don't byte-swap the file layout fields */
ol->ol_pgid.pool = fl->fl_pg_pool;
ol->ol_stripe_unit = fl->fl_object_stripe_unit;