X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fmdd%2Fmdd_dir.c;h=8417a75040dc60ee4d65f2e7916fced127c8c9bd;hb=e1ace3751f9add26b3f01aad9c278b6bfca8f739;hp=22c3f2b27815b3074e1e63d035444b9fcdc1e2fc;hpb=1fd624857218bd5f7ae1529d3fee8933c9cb8a75;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 22c3f2b..8417a75 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1254,9 +1254,13 @@ static int mdd_declare_link(const struct lu_env *env, struct lu_attr *la, struct linkea_data *data) { + struct lu_fid tfid = *mdo2fid(c); int rc; - rc = mdo_declare_index_insert(env, p, mdo2fid(c), mdd_object_type(c), + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3)) + tfid.f_oid = cfs_fail_val; + + rc = mdo_declare_index_insert(env, p, &tfid, mdd_object_type(c), name->ln_name, handle); if (rc != 0) return rc; @@ -1301,8 +1305,9 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, struct mdd_object *mdd_sobj = md2mdd_obj(src_obj); struct lu_attr *cattr = MDD_ENV_VAR(env, cattr); struct lu_attr *tattr = MDD_ENV_VAR(env, tattr); - struct mdd_device *mdd = mdo2mdd(src_obj); - struct thandle *handle; + struct mdd_device *mdd = mdo2mdd(src_obj); + struct thandle *handle; + struct lu_fid *tfid = &mdd_env_info(env)->mti_fid2; struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data; int rc; ENTRY; @@ -1351,19 +1356,12 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, GOTO(out_unlock, rc); } - if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3)) { - struct lu_fid tfid = *mdo2fid(mdd_sobj); - - tfid.f_oid++; - rc = __mdd_index_insert_only(env, mdd_tobj, &tfid, - mdd_object_type(mdd_sobj), - name, handle); - } else { - rc = __mdd_index_insert_only(env, mdd_tobj, mdo2fid(mdd_sobj), - mdd_object_type(mdd_sobj), - name, handle); - } + *tfid = *mdo2fid(mdd_sobj); + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3)) + tfid->f_oid = cfs_fail_val; + rc = __mdd_index_insert_only(env, mdd_tobj, tfid, + mdd_object_type(mdd_sobj), name, handle); if (rc != 0) { mdo_ref_del(env, mdd_sobj, handle); GOTO(out_unlock, rc); @@ -1387,21 +1385,20 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, * failure, reset rc here */ rc = 0; } - EXIT; + EXIT; out_unlock: - mdd_write_unlock(env, mdd_sobj); - if (rc == 0) + mdd_write_unlock(env, mdd_sobj); + if (rc == 0) rc = mdd_changelog_ns_store(env, mdd, CL_HARDLINK, 0, mdd_sobj, mdo2fid(mdd_tobj), NULL, NULL, lname, NULL, handle); stop: - mdd_trans_stop(env, mdd, rc, handle); - + rc = mdd_trans_stop(env, mdd, rc, handle); if (is_vmalloc_addr(ldata->ld_buf)) /* if we vmalloced a large buffer drop it */ lu_buf_free(ldata->ld_buf); out_pending: - return rc; + return rc; } static int mdd_mark_orphan_object(const struct lu_env *env, @@ -1593,7 +1590,7 @@ static bool mdd_hsm_archive_exists(const struct lu_env *env, if (rc < 0) RETURN(false); - ma->ma_valid = MA_HSM; + ma->ma_valid |= MA_HSM; } if (ma->ma_hsm.mh_flags & HS_EXISTS) RETURN(true); @@ -1621,7 +1618,7 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, struct mdd_object *mdd_cobj = NULL; struct mdd_device *mdd = mdo2mdd(pobj); struct thandle *handle; - int rc, is_dir = 0; + int rc, is_dir = 0, cl_flags = 0; ENTRY; /* cobj == NULL means only delete name entry */ @@ -1642,6 +1639,11 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, RETURN(rc); is_dir = S_ISDIR(cattr->la_mode); + /* search for an existing archive. + * we should check ahead as the object + * can be destroyed in this transaction */ + if (mdd_hsm_archive_exists(env, mdd_cobj, ma)) + cl_flags |= CLF_UNLINK_HSM_EXISTS; } rc = mdd_unlink_sanity_check(env, mdd_pobj, pattr, mdd_cobj, cattr); @@ -1719,11 +1721,10 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, ma->ma_attr = *cattr; ma->ma_valid |= MA_INODE; rc = mdd_finish_unlink(env, mdd_cobj, ma, mdd_pobj, lname, handle); - - /* fetch updated nlink */ if (rc != 0) GOTO(cleanup, rc); + /* fetch updated nlink */ rc = mdd_la_get(env, mdd_cobj, cattr); /* if object is removed then we can't get its attrs, * use last get */ @@ -1743,14 +1744,10 @@ cleanup: mdd_write_unlock(env, mdd_cobj); if (rc == 0) { - int cl_flags = 0; - - if (cattr->la_nlink == 0) { + if (cattr->la_nlink == 0) cl_flags |= CLF_UNLINK_LAST; - /* search for an existing archive */ - if (mdd_hsm_archive_exists(env, mdd_cobj, ma)) - cl_flags |= CLF_UNLINK_HSM_EXISTS; - } + else + cl_flags &= ~CLF_UNLINK_HSM_EXISTS; rc = mdd_changelog_ns_store(env, mdd, is_dir ? CL_RMDIR : CL_UNLINK, cl_flags, @@ -1759,7 +1756,7 @@ cleanup: } stop: - mdd_trans_stop(env, mdd, rc, handle); + rc = mdd_trans_stop(env, mdd, rc, handle); return rc; } @@ -1779,9 +1776,11 @@ static int mdd_cd_sanity_check(const struct lu_env *env, RETURN(0); } -static int mdd_create_data(const struct lu_env *env, struct md_object *pobj, - struct md_object *cobj, const struct md_op_spec *spec, - struct md_attr *ma) +static int mdd_create_data(const struct lu_env *env, + struct md_object *pobj, + struct md_object *cobj, + const struct md_op_spec *spec, + struct md_attr *ma) { struct mdd_device *mdd = mdo2mdd(cobj); struct mdd_object *mdd_pobj = md2mdd_obj(pobj); @@ -1813,14 +1812,14 @@ static int mdd_create_data(const struct lu_env *env, struct md_object *pobj, /* calling ->ah_make_hint() is used to transfer information from parent */ mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint); - handle = mdd_trans_create(env, mdd); - if (IS_ERR(handle)) - GOTO(out_free, rc = PTR_ERR(handle)); + handle = mdd_trans_create(env, mdd); + if (IS_ERR(handle)) + GOTO(out_free, rc = PTR_ERR(handle)); - /* - * XXX: Setting the lov ea is not locked but setting the attr is locked? - * Should this be fixed? - */ + /* + * XXX: Setting the lov ea is not locked but setting the attr is locked? + * Should this be fixed? + */ CDEBUG(D_OTHER, "ea %p/%u, cr_flags "LPO64", no_create %u\n", spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen, spec->sp_cr_flags, spec->no_create); @@ -1854,7 +1853,8 @@ static int mdd_create_data(const struct lu_env *env, struct md_object *pobj, rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, son, handle); stop: - mdd_trans_stop(env, mdd, rc, handle); + rc = mdd_trans_stop(env, mdd, rc, handle); + out_free: RETURN(rc); } @@ -1862,24 +1862,15 @@ out_free: static int mdd_declare_object_initialize(const struct lu_env *env, struct mdd_object *parent, struct mdd_object *child, - struct lu_attr *attr, + const struct lu_attr *attr, struct thandle *handle) { int rc; ENTRY; - /* - * inode mode has been set in creation time, and it's based on umask, - * la_mode and acl, don't set here again! (which will go wrong - * because below function doesn't consider umask). - * I'd suggest set all object attributes in creation time, see above. - */ LASSERT(attr->la_valid & (LA_MODE | LA_TYPE)); - attr->la_valid &= ~(LA_MODE | LA_TYPE); - rc = mdo_declare_attr_set(env, child, attr, handle); - attr->la_valid |= LA_MODE | LA_TYPE; - if (rc != 0 || !S_ISDIR(attr->la_mode)) - RETURN(rc); + if (!S_ISDIR(attr->la_mode)) + RETURN(0); rc = mdo_declare_index_insert(env, child, mdo2fid(child), S_IFDIR, dot, handle); @@ -1994,14 +1985,14 @@ static int mdd_create_sanity_check(const struct lu_env *env, RETURN(rc); switch (cattr->la_mode & S_IFMT) { - case S_IFLNK: { - unsigned int symlen = strlen(spec->u.sp_symname) + 1; + case S_IFLNK: { + unsigned int symlen = strlen(spec->u.sp_symname) + 1; - if (symlen > (1 << m->mdd_dt_conf.ddp_block_shift)) - RETURN(-ENAMETOOLONG); - else - RETURN(0); - } + if (symlen > m->mdd_dt_conf.ddp_symlink_max) + RETURN(-ENAMETOOLONG); + else + RETURN(0); + } case S_IFDIR: case S_IFREG: case S_IFCHR: @@ -2027,6 +2018,7 @@ static int mdd_declare_object_create(const struct lu_env *env, struct lu_buf *acl_buf, struct dt_allocation_hint *hint) { + const struct lu_buf *buf; int rc; rc = mdd_declare_object_create_internal(env, p, c, attr, handle, spec, @@ -2062,8 +2054,6 @@ static int mdd_declare_object_create(const struct lu_env *env, /* replay case, create LOV EA from client data */ if (spec->no_create || (spec->sp_cr_flags & MDS_OPEN_HAS_EA && S_ISREG(attr->la_mode))) { - const struct lu_buf *buf; - buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen); rc = mdo_declare_xattr_set(env, c, buf, XATTR_NAME_LOV, 0, @@ -2083,6 +2073,16 @@ static int mdd_declare_object_create(const struct lu_env *env, if (rc) GOTO(out, rc); } + + if (spec->sp_cr_file_secctx_name != NULL) { + buf = mdd_buf_get_const(env, spec->sp_cr_file_secctx, + spec->sp_cr_file_secctx_size); + rc = mdo_declare_xattr_set(env, c, buf, + spec->sp_cr_file_secctx_name, 0, + handle); + if (rc < 0) + GOTO(out, rc); + } out: return rc; } @@ -2193,6 +2193,7 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj, struct dt_allocation_hint *hint, struct thandle *handle) { + const struct lu_buf *buf; int rc; mdd_write_lock(env, son, MOR_TGT_CHILD); @@ -2228,8 +2229,6 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj, if (spec->no_create || (S_ISREG(attr->la_mode) && spec->sp_cr_flags & MDS_OPEN_HAS_EA) || S_ISDIR(attr->la_mode)) { - const struct lu_buf *buf; - buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen); rc = mdo_xattr_set(env, son, buf, @@ -2279,6 +2278,15 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj, GOTO(err_initlized, rc = -EFAULT); } + if (spec->sp_cr_file_secctx_name != NULL) { + buf = mdd_buf_get_const(env, spec->sp_cr_file_secctx, + spec->sp_cr_file_secctx_size); + rc = mdo_xattr_set(env, son, buf, spec->sp_cr_file_secctx_name, + 0, handle); + if (rc < 0) + GOTO(err_initlized, rc); + } + err_initlized: if (unlikely(rc != 0)) { int rc2; @@ -2337,7 +2345,8 @@ static int mdd_index_delete(const struct lu_env *env, if (rc) GOTO(stop, rc); stop: - mdd_trans_stop(env, mdd, rc, handle); + rc = mdd_trans_stop(env, mdd, rc, handle); + RETURN(rc); } @@ -2479,8 +2488,6 @@ static int mdd_create(const struct lu_env *env, struct md_object *pobj, EXIT; err_insert: if (rc != 0) { - int rc2; - if (spec->sp_cr_flags & MDS_OPEN_VOLATILE) rc2 = __mdd_orphan_del(env, son, handle); else @@ -2640,8 +2647,8 @@ static int mdd_declare_rename(const struct lu_env *env, struct mdd_object *mdd_tpobj, struct mdd_object *mdd_sobj, struct mdd_object *mdd_tobj, - const struct lu_name *tname, const struct lu_name *sname, + const struct lu_name *tname, struct md_attr *ma, struct linkea_data *ldata, struct thandle *handle) @@ -2804,6 +2811,11 @@ static int mdd_rename(const struct lu_env *env, rc = mdd_la_get(env, mdd_tobj, tattr); if (rc) GOTO(out_pending, rc); + /* search for an existing archive. + * we should check ahead as the object + * can be destroyed in this transaction */ + if (mdd_hsm_archive_exists(env, mdd_tobj, ma)) + cl_flags |= CLF_RENAME_LAST_EXISTS; } rc = mdd_la_get(env, mdd_tpobj, tpattr); @@ -2967,11 +2979,10 @@ static int mdd_rename(const struct lu_env *env, ma->ma_attr = *tattr; ma->ma_valid |= MA_INODE; - if (tattr->la_nlink == 0) { + if (tattr->la_nlink == 0) cl_flags |= CLF_RENAME_LAST; - if (mdd_hsm_archive_exists(env, mdd_tobj, ma)) - cl_flags |= CLF_RENAME_LAST_EXISTS; - } + else + cl_flags &= ~CLF_RENAME_LAST_EXISTS; } la->la_valid = LA_CTIME | LA_MTIME; @@ -3045,7 +3056,7 @@ cleanup: ltname, lsname, handle); stop: - mdd_trans_stop(env, mdd, rc, handle); + rc = mdd_trans_stop(env, mdd, rc, handle); out_pending: mdd_object_put(env, mdd_sobj); @@ -3307,7 +3318,6 @@ static int mdd_migrate_xattrs(const struct lu_env *env, int list_xsize; struct lu_buf list_xbuf; int rc; - int rc1; /* retrieve xattr list from the old object */ list_xsize = mdo_xattr_list(env, mdd_sobj, &LU_BUF_NULL); @@ -3382,9 +3392,7 @@ static int mdd_migrate_xattrs(const struct lu_env *env, if (rc != 0) GOTO(stop_trans, rc); stop_trans: - rc1 = mdd_trans_stop(env, mdd, rc, handle); - if (rc == 0) - rc = rc1; + rc = mdd_trans_stop(env, mdd, rc, handle); if (rc != 0) GOTO(out, rc); next: @@ -3586,13 +3594,8 @@ static int mdd_migrate_create(const struct lu_env *env, la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL; rc = mdo_attr_set(env, mdd_sobj, la_flag, handle); stop_trans: - if (handle != NULL) { - int rc1; - - rc1 = mdd_trans_stop(env, mdd, rc, handle); - if (rc == 0) - rc = rc1; - } + if (handle != NULL) + rc = mdd_trans_stop(env, mdd, rc, handle); out_free: if (lmm_buf.lb_buf != NULL) OBD_FREE(lmm_buf.lb_buf, lmm_buf.lb_len); @@ -3609,9 +3612,9 @@ static int mdd_migrate_entries(const struct lu_env *env, struct thandle *handle; struct dt_it *it; const struct dt_it_ops *iops; - int rc; int result; struct lu_dirent *ent; + int rc; ENTRY; OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1); @@ -3647,7 +3650,6 @@ static int mdd_migrate_entries(const struct lu_env *env, int recsize; int is_dir; bool target_exist = false; - int rc1; len = iops->key_size(env, it); if (len == 0) @@ -3781,10 +3783,7 @@ static int mdd_migrate_entries(const struct lu_env *env, out_put: mdd_write_unlock(env, child); mdd_object_put(env, child); - rc1 = mdd_trans_stop(env, mdd, rc, handle); - if (rc == 0) - rc = rc1; - + rc = mdd_trans_stop(env, mdd, rc, handle); if (rc != 0) GOTO(out, rc); next: @@ -4079,7 +4078,7 @@ out_unlock: mdd_write_unlock(env, mdd_sobj); stop_trans: - mdd_trans_stop(env, mdd, rc, handle); + rc = mdd_trans_stop(env, mdd, rc, handle); RETURN(rc); } @@ -4216,6 +4215,7 @@ static int mdd_migrate(const struct lu_env *env, struct md_object *pobj, struct mdd_object *mdd_tobj = md2mdd_obj(tobj); struct lu_attr *so_attr = MDD_ENV_VAR(env, cattr); struct lu_attr *pattr = MDD_ENV_VAR(env, pattr); + bool created = false; int rc; ENTRY; @@ -4223,7 +4223,8 @@ static int mdd_migrate(const struct lu_env *env, struct md_object *pobj, * the file is being opened by someone else right now */ mdd_read_lock(env, mdd_sobj, MOR_SRC_CHILD); if (mdd_sobj->mod_count > 0) { - CERROR("%s: "DFID"%s is already opened count %d: rc = %d\n", + CDEBUG(D_OTHER, + "%s: "DFID"%s is already opened count %d: rc = %d\n", mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(mdd_sobj)), lname->ln_name, mdd_sobj->mod_count, -EBUSY); @@ -4274,6 +4275,7 @@ static int mdd_migrate(const struct lu_env *env, struct md_object *pobj, lname, so_attr); if (rc != 0) GOTO(put, rc); + created = true; } LASSERT(mdd_object_exists(mdd_tobj)); @@ -4300,6 +4302,10 @@ static int mdd_migrate(const struct lu_env *env, struct md_object *pobj, ma); if (rc != 0) GOTO(put, rc); + + /* newly created target was not locked, don't cache its attributes */ + if (created) + mdd_invalidate(env, tobj); put: RETURN(rc); }