if (!dt_try_as_dir(env, dto))
GOTO(out_put, rc = -EINVAL);
+ rc = dt_declare_ref_add(env, dto, th);
+ if (rc != 0)
+ GOTO(out_put, rc);
+
rec->rec_fid = lu_object_fid(&dto->do_lu);
rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
(const struct dt_key *)dot, th);
dto = lo->ldo_stripe[i];
dt_write_lock(env, dto, MOR_TGT_CHILD);
rc = dt_create(env, dto, attr, NULL, dof, th);
+ if (rc != 0) {
+ dt_write_unlock(env, dto);
+ RETURN(rc);
+ }
+
+ rc = dt_ref_add(env, dto, th);
dt_write_unlock(env, dto);
if (rc != 0)
RETURN(rc);
/* declare destroy all striped objects */
for (i = 0; i < lo->ldo_stripenr; i++) {
if (likely(lo->ldo_stripe[i] != NULL)) {
+ if (S_ISDIR(dt->do_lu.lo_header->loh_attr)) {
+ rc = dt_declare_ref_del(env, lo->ldo_stripe[i],
+ th);
+ if (rc != 0)
+ RETURN(rc);
+ }
+
rc = dt_declare_destroy(env, lo->ldo_stripe[i], th);
if (rc != 0)
break;
if (likely(lo->ldo_stripe[i] != NULL) &&
(!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LOST_SPEOBJ) ||
i == cfs_fail_val)) {
+ if (S_ISDIR(dt->do_lu.lo_header->loh_attr)) {
+ dt_write_lock(env, lo->ldo_stripe[i],
+ MOR_TGT_CHILD);
+ rc = dt_ref_del(env, lo->ldo_stripe[i], th);
+ dt_write_unlock(env, lo->ldo_stripe[i]);
+ if (rc != 0)
+ break;
+ }
+
rc = dt_destroy(env, lo->ldo_stripe[i], th);
if (rc != 0)
break;
RETURN(rc);
}
- if (declare)
- rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata,
- MLAO_IGNORE);
- else
- rc = mdd_links_write(env, mdd_tobj, ldata, handle);
-
- if (rc != 0)
- RETURN(rc);
-
/* If it is mulitple links file, we need update the name entry for
* all parent */
LASSERT(ldata->ld_leh != NULL);
struct md_op_spec *spec,
struct lu_attr *la,
union lmv_mds_md *mgr_ea,
+ struct linkea_data *ldata,
struct thandle *handle)
{
struct lu_attr *la_flag = MDD_ENV_VAR(env, la_for_fix);
buf, 0, handle);
if (rc != 0)
return rc;
+ } else if (S_ISDIR(la->la_mode)) {
+ rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata,
+ MLAO_IGNORE);
+ if (rc != 0)
+ return rc;
}
if (spec->u.sp_ea.eadata != NULL && spec->u.sp_ea.eadatalen != 0) {
struct mdd_object *mdd_pobj,
struct mdd_object *mdd_sobj,
struct mdd_object *mdd_tobj,
+ const struct lu_name *lname,
struct lu_attr *la)
{
struct mdd_thread_info *info = mdd_env_info(env);
struct lu_attr *la_flag = MDD_ENV_VAR(env, la_for_fix);
struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
int mgr_easize;
+ struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data;
int rc;
ENTRY;
la->la_size + 1);
link_buf = *buf;
link_buf.lb_len = la->la_size + 1;
+ memset(link_buf.lb_buf, 0, link_buf.lb_len);
rc = mdd_readlink(env, &mdd_sobj->mod_obj, &link_buf);
if (rc <= 0) {
rc = rc != 0 ? rc : -EFAULT;
spec->u.sp_ea.eadatalen = lmm_buf.lb_len;
spec->sp_cr_flags |= MDS_OPEN_HAS_EA;
}
+ } else if (S_ISDIR(la->la_mode)) {
+ rc = mdd_links_read(env, mdd_sobj, ldata);
+ if (rc < 0 && rc != -ENODATA)
+ RETURN(rc);
}
mgr_ea = (struct lmv_mds_md_v1 *)info->mti_xattr_buf;
rc = mdd_declare_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
spec, la,
(union lmv_mds_md *)info->mti_xattr_buf,
- handle);
+ ldata, handle);
if (rc != 0)
GOTO(stop_trans, rc);
if (rc != 0)
GOTO(stop_trans, rc);
+ if (S_ISDIR(la->la_mode)) {
+ rc = mdd_links_write(env, mdd_tobj, ldata, handle);
+ if (rc != 0)
+ GOTO(stop_trans, rc);
+ }
+
/* Set MIGRATE EA on the source inode, so once the migration needs
* to be re-done during failover, the re-do process can locate the
* target object which is already being created. */
mdd_tobj = md2mdd_obj(tobj);
if (!mdd_object_exists(mdd_tobj)) {
rc = mdd_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
- so_attr);
+ lname, so_attr);
if (rc != 0)
GOTO(put, rc);
}
.lct_exit = osd_key_exit
};
+static void osd_fid_fini(const struct lu_env *env, struct osd_device *osd)
+{
+ if (osd->od_cl_seq == NULL)
+ return;
+
+ seq_client_fini(osd->od_cl_seq);
+ OBD_FREE_PTR(osd->od_cl_seq);
+ osd->od_cl_seq = NULL;
+}
+
static int osd_shutdown(const struct lu_env *env, struct osd_device *o)
{
ENTRY;
o->od_quota_slave = NULL;
}
+ osd_fid_fini(env, o);
+
RETURN(0);
}
RETURN(rc);
}
+static int osd_fid_init(const struct lu_env *env, struct osd_device *osd)
+{
+ struct seq_server_site *ss = osd_seq_site(osd);
+ int rc;
+ ENTRY;
+
+ if (osd->od_is_ost || osd->od_cl_seq != NULL)
+ RETURN(0);
+
+ if (unlikely(ss == NULL))
+ RETURN(-ENODEV);
+
+ OBD_ALLOC_PTR(osd->od_cl_seq);
+ if (osd->od_cl_seq == NULL)
+ RETURN(-ENOMEM);
+
+ rc = seq_client_init(osd->od_cl_seq, NULL, LUSTRE_SEQ_METADATA,
+ osd->od_svname, ss->ss_server_seq);
+
+ if (rc != 0) {
+ OBD_FREE_PTR(osd->od_cl_seq);
+ osd->od_cl_seq = NULL;
+ }
+
+ RETURN(rc);
+}
+
static int osd_prepare(const struct lu_env *env, struct lu_device *pdev,
struct lu_device *dev)
{
int rc = 0;
ENTRY;
- if (osd->od_quota_slave != NULL)
+ if (osd->od_quota_slave != NULL) {
/* set up quota slave objects */
rc = qsd_prepare(env, osd->od_quota_slave);
+ if (rc != 0)
+ RETURN(rc);
+ }
+
+ rc = osd_fid_init(env, osd);
RETURN(rc);
}
rc = osd_fld_lookup(env, osd, seq, range);
if (rc != 0) {
- CERROR("%s: Can not lookup fld for "LPX64"\n",
- osd_name(osd), seq);
+ if (rc != -ENOENT)
+ CERROR("%s: Can not lookup fld for "LPX64"\n",
+ osd_name(osd), seq);
RETURN(0);
}
{
LASSERT(ah);
- memset(ah, 0, sizeof(*ah));
ah->dah_parent = parent;
ah->dah_mode = child_mode;
}