void __user *uarg)
{
struct lmv_obd *lmv = &obd->u.lmv;
- struct file *filp;
- __u32 i, j;
- int err;
- bool any_set = false;
- struct kkuc_ct_data kcd = {
- .kcd_magic = KKUC_CT_DATA_MAGIC,
- .kcd_archive = lk->lk_data,
- };
- int rc = 0;
+ struct file *filp;
+ __u32 i, j;
+ int err;
+ bool any_set = false;
+ struct kkuc_ct_data *kcd;
+ size_t kcd_size;
+ int rc = 0;
ENTRY;
filp = fget(lk->lk_wfd);
if (!filp)
RETURN(-EBADF);
+ if (lk->lk_flags & LK_FLG_DATANR)
+ kcd_size = offsetof(struct kkuc_ct_data,
+ kcd_archives[lk->lk_data_count]);
+ else
+ kcd_size = sizeof(*kcd);
+
+ OBD_ALLOC(kcd, kcd_size);
+ if (kcd == NULL)
+ GOTO(err_fput, rc = -ENOMEM);
+
+ kcd->kcd_nr_archives = lk->lk_data_count;
+ if (lk->lk_flags & LK_FLG_DATANR) {
+ kcd->kcd_magic = KKUC_CT_DATA_ARRAY_MAGIC;
+ if (lk->lk_data_count > 0)
+ memcpy(kcd->kcd_archives, lk->lk_data,
+ sizeof(*kcd->kcd_archives) * lk->lk_data_count);
+ } else {
+ kcd->kcd_magic = KKUC_CT_DATA_BITMAP_MAGIC;
+ }
+
rc = libcfs_kkuc_group_add(filp, &obd->obd_uuid, lk->lk_uid,
- lk->lk_group, &kcd, sizeof(kcd));
+ lk->lk_group, kcd, kcd_size);
+ OBD_FREE(kcd, kcd_size);
if (rc)
GOTO(err_fput, rc);
if (IS_ERR(child_tgt))
RETURN(PTR_ERR(child_tgt));
- rc = lmv_fid_alloc(NULL, exp, &target_fid, op_data);
+ if (!S_ISDIR(op_data->op_mode) && tp_tgt)
+ rc = __lmv_fid_alloc(lmv, &target_fid, tp_tgt->ltd_idx);
+ else
+ rc = lmv_fid_alloc(NULL, exp, &target_fid, op_data);
if (rc)
RETURN(rc);
for (i = 0; i < lsm->lsm_md_stripe_count; i++) {
struct inode *inode = lsm->lsm_md_oinfo[i].lmo_root;
- CDEBUG(D_INFO, ""DFID" size %llu, blocks %llu nlink %u,"
- " atime %lu ctime %lu, mtime %lu.\n",
+ CDEBUG(D_INFO,
+ "" DFID " size %llu, blocks %llu nlink %u, atime %lld ctime %lld, mtime %lld.\n",
PFID(&lsm->lsm_md_oinfo[i].lmo_fid),
i_size_read(inode), (unsigned long long)inode->i_blocks,
- inode->i_nlink, LTIME_S(inode->i_atime),
- LTIME_S(inode->i_ctime), LTIME_S(inode->i_mtime));
+ inode->i_nlink, (s64)inode->i_atime.tv_sec,
+ (s64)inode->i_ctime.tv_sec, (s64)inode->i_mtime.tv_sec);
/* for slave stripe, it needs to subtract nlink for . and .. */
if (i != 0)
attr->cat_size += i_size_read(inode);
attr->cat_blocks += inode->i_blocks;
- if (attr->cat_atime < LTIME_S(inode->i_atime))
- attr->cat_atime = LTIME_S(inode->i_atime);
+ if (attr->cat_atime < inode->i_atime.tv_sec)
+ attr->cat_atime = inode->i_atime.tv_sec;
- if (attr->cat_ctime < LTIME_S(inode->i_ctime))
- attr->cat_ctime = LTIME_S(inode->i_ctime);
+ if (attr->cat_ctime < inode->i_ctime.tv_sec)
+ attr->cat_ctime = inode->i_ctime.tv_sec;
- if (attr->cat_mtime < LTIME_S(inode->i_mtime))
- attr->cat_mtime = LTIME_S(inode->i_mtime);
+ if (attr->cat_mtime < inode->i_mtime.tv_sec)
+ attr->cat_mtime = inode->i_mtime.tv_sec;
}
return 0;
}