In mdt_add_dirty_flag(), bump up the capability so that
mdt_hsm_attr_set() will succeed even if the writer (or truncater) is
not the owner of the file.
Signed-off-by: John L. Hammond <jhammond@whamcloud.com>
Change-Id: Ibd7e9e039c3a984642b4a01c63cd11d2029e93f1
Reviewed-on: https://review.whamcloud.com/33158
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Quentin Bouget <quentin.bouget@cea.fr>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
int mdt_add_dirty_flag(struct mdt_thread_info *info, struct mdt_object *mo,
struct md_attr *ma)
{
int mdt_add_dirty_flag(struct mdt_thread_info *info, struct mdt_object *mo,
struct md_attr *ma)
{
+ struct lu_ucred *uc = mdt_ucred(info);
+ cfs_cap_t cap_saved;
&& !(ma->ma_hsm.mh_flags & (HS_DIRTY|HS_RELEASED))) {
ma->ma_hsm.mh_flags |= HS_DIRTY;
&& !(ma->ma_hsm.mh_flags & (HS_DIRTY|HS_RELEASED))) {
ma->ma_hsm.mh_flags |= HS_DIRTY;
+ /* Bump cap so that closes from non-owner writers can
+ * set the HSM state to dirty. */
+ cap_saved = uc->uc_cap;
+ uc->uc_cap |= MD_CAP_TO_MASK(CFS_CAP_FOWNER);
rc = mdt_hsm_attr_set(info, mo, &ma->ma_hsm);
rc = mdt_hsm_attr_set(info, mo, &ma->ma_hsm);
+ uc->uc_cap = cap_saved;
if (rc)
CERROR("file attribute change error for "DFID": %d\n",
PFID(mdt_object_fid(mo)), rc);
if (rc)
CERROR("file attribute change error for "DFID": %d\n",
PFID(mdt_object_fid(mo)), rc);
}
run_test 24f "root can archive, release, and restore tar files"
}
run_test 24f "root can archive, release, and restore tar files"
+test_24g() {
+ local file=$DIR/$tdir/$tfile
+ local fid
+
+ echo "RUNAS = '$RUNAS'"
+
+ copytool setup
+
+ mkdir -p $DIR/$tdir
+ chmod ugo+rwx $DIR/$tdir
+
+ echo "Please listen carefully as our options have changed." | tee $file
+ fid=$(path2fid $file)
+ chmod ugo+rw $file
+
+ $LFS hsm_archive $file
+ wait_request_state $fid ARCHIVE SUCCEED
+ check_hsm_flags $file 0x00000009 # exists archived
+
+ echo "To be electrocuted by your telephone, press #." | $RUNAS tee $file
+ check_hsm_flags $file 0x0000000b # exists dirty archived
+}
+run_test 24g "write by non-owner still sets dirty" # LU-11369
+
test_25a() {
# test needs a running copytool
copytool setup
test_25a() {
# test needs a running copytool
copytool setup