lmv->connected = 0;
lmv->conn_data = *data;
+ lmv->lmv_cache = localdata;
lmv->lmv_tgts_kobj = kobject_create_and_add("target_obds",
&obd->obd_kset.kobj);
}
rc = obd_connect(NULL, &mdc_exp, mdc_obd, &obd->obd_uuid,
- &lmv->conn_data, NULL);
+ &lmv->conn_data, lmv->lmv_cache);
if (rc) {
CERROR("target %s connect error %d\n", tgt->ltd_uuid.uuid, rc);
RETURN(rc);
if (remote_gf != NULL) {
struct getinfo_fid2path *ori_gf;
char *ptr;
+ int len;
ori_gf = (struct getinfo_fid2path *)karg;
if (strlen(ori_gf->gf_u.gf_path) + 1 +
ptr = ori_gf->gf_u.gf_path;
- memmove(ptr + strlen(gf->gf_u.gf_path) + 1, ptr,
- strlen(ori_gf->gf_u.gf_path));
-
- strncpy(ptr, gf->gf_u.gf_path,
- strlen(gf->gf_u.gf_path));
- ptr += strlen(gf->gf_u.gf_path);
- *ptr = '/';
+ len = strlen(gf->gf_u.gf_path);
+ /* move the current path to the right to release space
+ * for closer-to-root part */
+ memmove(ptr + len + 1, ptr, strlen(ori_gf->gf_u.gf_path));
+ memcpy(ptr, gf->gf_u.gf_path, len);
+ ptr[len] = '/';
}
CDEBUG(D_INFO, "%s: get path %s "DFID" rec: %llu ln: %u\n",
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);
break;
if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) {
+ /* We dont need a full 64-bit modulus, just enough
+ * to distribute the requests across MDTs evenly.
+ */
lmv->lmv_statfs_start =
- lnet_id.nid % lmv->desc.ld_tgt_count;
+ (u32)lnet_id.nid % lmv->desc.ld_tgt_count;
break;
}
}
rc = obd_statfs(env, lmv->tgts[idx]->ltd_exp, temp,
max_age, flags);
if (rc) {
- CERROR("can't stat MDS #%d (%s), error %d\n", i,
- lmv->tgts[idx]->ltd_exp->exp_obd->obd_name,
+ CERROR("%s: can't stat MDS #%d: rc = %d\n",
+ lmv->tgts[idx]->ltd_exp->exp_obd->obd_name, i,
rc);
GOTO(out_free_temp, 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;
}