lh2 = &info->mti_lh[MDT_LH_OLD];
mdt_lock_reg_init(lh2, LCK_EX);
- rc = mdt_object_lock(info, o1, lh1, MDS_INODELOCK_LAYOUT,
- MDT_LOCAL_LOCK);
+ rc = mdt_object_lock(info, o1, lh1, MDS_INODELOCK_LAYOUT |
+ MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
if (rc < 0)
GOTO(put, rc);
- rc = mdt_object_lock(info, o2, lh2, MDS_INODELOCK_LAYOUT,
- MDT_LOCAL_LOCK);
+ rc = mdt_object_lock(info, o2, lh2, MDS_INODELOCK_LAYOUT |
+ MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
if (rc < 0)
GOTO(unlock1, rc);
lh = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lh, LCK_PW);
- rc = mdt_object_lock(info, obj, lh, MDS_INODELOCK_LOOKUP,
- MDT_LOCAL_LOCK);
+ rc = mdt_object_lock(info, obj, lh, MDS_INODELOCK_LOOKUP |
+ MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
if (rc)
RETURN(rc);
ma->ma_hsm.mh_flags |= HS_RELEASED;
lustre_hsm2buf(buf->lb_buf, &ma->ma_hsm);
ma->ma_hsm.mh_flags &= ~HS_RELEASED;
+
+ mdt_lock_reg_init(lh, LCK_EX);
+ rc = mdt_object_lock(info, o, lh, MDS_INODELOCK_LAYOUT |
+ MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
+ if (rc != 0)
+ GOTO(out_close, rc);
+
rc = mo_xattr_set(info->mti_env, mdt_object_child(orphan), buf,
XATTR_NAME_HSM, 0);
- if (rc < 0)
- GOTO(out_close, rc);
- mdt_lock_reg_init(lh, LCK_EX);
- rc = mdt_object_lock(info, o, lh, MDS_INODELOCK_LAYOUT, MDT_LOCAL_LOCK);
- if (rc == 0) {
+ if (rc == 0)
/* Swap layout with orphan object */
rc = mo_swap_layouts(info->mti_env, mdt_object_child(o),
mdt_object_child(orphan),
SWAP_LAYOUTS_MDS_HSM);
- /* Release exclusive LL */
- mdt_object_unlock(info, o, lh, 1);
- }
+ /* Release exclusive LL */
+ mdt_object_unlock(info, o, lh, 1);
+
EXIT;
out_close:
/* If an up2date copy exists in the backend, add dirty flag */
if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_EXISTS)
&& !(ma->ma_hsm.mh_flags & (HS_DIRTY|HS_RELEASED))) {
+ struct mdt_lock_handle *lh = &info->mti_lh[MDT_LH_CHILD];
ma->ma_hsm.mh_flags |= HS_DIRTY;
+
+ mdt_lock_reg_init(lh, LCK_PW);
+ rc = mdt_object_lock(info, mo, lh, MDS_INODELOCK_XATTR,
+ MDT_LOCAL_LOCK);
+ if (rc != 0)
+ RETURN(rc);
+
rc = mdt_hsm_attr_set(info, mo, &ma->ma_hsm);
- if (rc) {
+ if (rc)
CERROR("file attribute change error for "DFID": %d\n",
PFID(mdt_object_fid(mo)), rc);
- RETURN(rc);
- }
+ mdt_object_unlock(info, mo, lh, rc);
}
RETURN(rc);
GOTO(out_unlock_parent, rc = -EXDEV);
}
- rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE,
- MDT_CROSS_LOCK);
+ rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE |
+ MDS_INODELOCK_XATTR, MDT_CROSS_LOCK);
if (rc != 0) {
mdt_object_put(info->mti_env, ms);
GOTO(out_unlock_parent, rc);
lh_oldp = &info->mti_lh[MDT_LH_OLD];
mdt_lock_reg_init(lh_oldp, LCK_EX);
- rc = mdt_object_lock(info, mold, lh_oldp, MDS_INODELOCK_LOOKUP,
- MDT_CROSS_LOCK);
+ rc = mdt_object_lock(info, mold, lh_oldp, MDS_INODELOCK_LOOKUP |
+ MDS_INODELOCK_XATTR, MDT_CROSS_LOCK);
if (rc != 0) {
mdt_object_put(info->mti_env, mold);
GOTO(out_unlock_target, rc);
test_72() {
local p="$TMP/sanityN-$TESTNAME.parameters"
+ local tlink1
+ local tlink2
save_lustre_params client "llite.*.xattr_cache" > $p
lctl set_param llite.*.xattr_cache 1 ||
{ skip "xattr cache is not supported"; return 0; }
error "setfattr2 failed"
getfattr -n user.attr1 $DIR1/$tfile | grep value2 ||
error "getfattr2 failed"
+
+ # check that trusted.link is consistent
+ tlink1=$(getfattr -n trusted.link $DIR1/$tfile | md5sum)
+ ln $DIR2/$tfile $DIR2/$tfile-2 || error "failed to link"
+ tlink2=$(getfattr -n trusted.link $DIR1/$tfile | md5sum)
+ echo "$tlink1 $tlink2"
+ [ "$tlink1" = "$tlink2" ] && error "trusted.link should have changed!"
+
rm -f $DIR2/$tfile
restore_lustre_params < $p