return rc;
}
- if (la->la_valid & LA_FLAGS &&
- la->la_flags & LUSTRE_ORPHAN_FL)
+ if (la->la_valid & LA_FLAGS && la->la_flags & LUSTRE_ORPHAN_FL)
obj->mod_flags |= ORPHAN_OBJ | DEAD_OBJ;
return 0;
strcmp(name, XATTR_NAME_LINK) == 0))
RETURN(-ENOENT);
- mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_read_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdo_xattr_get(env, mdd_obj, buf, name);
mdd_read_unlock(env, mdd_obj);
mdd = mdo2mdd(obj);
/* record only getting user xattrs and acls */
- if (rc >= 0 &&
+ if (rc >= 0 && buf->lb_buf &&
mdd_changelog_enabled(env, mdd, CL_GETXATTR) &&
(has_prefix(name, XATTR_USER_PREFIX) ||
has_prefix(name, XATTR_NAME_POSIX_ACL_ACCESS) ||
LASSERT(next != NULL);
LASSERT(next->do_body_ops != NULL);
LASSERT(next->do_body_ops->dbo_read != NULL);
- mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_read_lock(env, mdd_obj, DT_TGT_CHILD);
rc = dt_read(env, next, buf, &pos);
mdd_read_unlock(env, mdd_obj);
RETURN(rc);
ENTRY;
- mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_read_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdo_xattr_list(env, mdd_obj, buf);
mdd_read_unlock(env, mdd_obj);
#ifdef CONFIG_FS_POSIX_ACL
if (attr->la_valid & LA_MODE) {
- mdd_read_lock(env, obj, MOR_TGT_CHILD);
+ mdd_read_lock(env, obj, DT_TGT_CHILD);
rc = mdo_xattr_get(env, obj, &LU_BUF_NULL,
XATTR_NAME_ACL_ACCESS);
mdd_read_unlock(env, obj);
/*
* LU-3671
+ * LU-7239
*
* permission changes may require sync operation, to mitigate performance
* impact, only do this for dir and when permission is reduced.
if (!S_ISDIR(old->la_mode))
return false;
- if (new->la_valid & (LA_UID | LA_GID))
+ if (new->la_valid & LA_UID && old->la_uid != new->la_uid)
return true;
- if (new->la_valid & LA_MODE &&
- new->la_mode & (S_ISUID | S_ISGID | S_ISVTX))
+ if (new->la_valid & LA_GID && old->la_gid != new->la_gid)
return true;
- if ((new->la_valid & LA_MODE) &&
- ((new->la_mode & old->la_mode) & S_IRWXUGO) !=
- (old->la_mode & S_IRWXUGO))
- return true;
+ if (new->la_valid & LA_MODE) {
+ /* turned on sticky bit */
+ if (!(old->la_mode & S_ISVTX) && (new->la_mode & S_ISVTX))
+ return true;
+
+ /* set-GID has no impact on what is allowed, not checked */
+
+ /* turned off setuid bit, or one of rwx for someone */
+ if (((new->la_mode & old->la_mode) & (0777 | S_ISUID)) !=
+ (old->la_mode & (0777 | S_ISUID)))
+ return true;
+ }
return false;
}
struct lu_attr *attr = MDD_ENV_VAR(env, cattr);
const struct lu_attr *la = &ma->ma_attr;
struct lu_ucred *uc;
+ bool chrgrp_by_unprivileged_user = false;
int rc;
ENTRY;
uc = lu_ucred_check(env);
if (S_ISREG(attr->la_mode) && la->la_valid & LA_GID &&
la->la_gid != attr->la_gid && uc != NULL && uc->uc_fsuid != 0) {
+ /* LU-10048: disable synchronous chgrp operation for it will
+ * cause deadlock between MDT and OST.
la_copy->la_valid |= LA_FLAGS;
la_copy->la_flags |= LUSTRE_SET_SYNC_FL;
+ */
+ chrgrp_by_unprivileged_user = true;
- /* Flush the possible existing sync requests to OSTs to
- * keep the order of sync for the current setattr operation
+ /* Flush the possible existing client setattr requests to OSTs
+ * to keep the order with the current setattr operation that
* will be sent directly to OSTs. see LU-5152 */
+ /* LU-11303 disable sync as this is too heavyweight.
+ * This should be replaced with a sync only for the object
+ * being modified here, not the whole filesystem.
rc = dt_sync(env, mdd->mdd_child);
if (rc)
GOTO(out, rc);
+ */
}
handle = mdd_trans_create(env, mdd);
if (rc)
GOTO(out, rc);
- if (mdd->mdd_sync_permission && permission_needs_sync(attr, la))
+ if (!chrgrp_by_unprivileged_user && mdd->mdd_sync_permission &&
+ permission_needs_sync(attr, la))
handle->th_sync = 1;
if (la->la_valid & (LA_MTIME | LA_CTIME))
CDEBUG(D_INODE, "setting mtime %llu, ctime %llu\n",
la->la_mtime, la->la_ctime);
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
/* LU-10509: setattr of LA_SIZE should be skipped case of DOM,
* otherwise following truncate will do nothing and truncated
/* Read HSM attrs from disk */
current_buf = lu_buf_check_and_alloc(&info->mti_xattr_buf,
- mdo2mdd(obj)->mdd_dt_conf.ddp_max_ea_size);
+ MIN(mdd_obj2mdd_dev(mdd_obj)->mdd_dt_conf.ddp_max_ea_size,
+ XATTR_SIZE_MAX));
rc = mdo_xattr_get(env, mdd_obj, current_buf, XATTR_NAME_HSM);
rc = lustre_buf2hsm(current_buf->lb_buf, rc, current_mh);
if (rc < 0 && rc != -ENODATA)
RETURN(PTR_ERR(handle));
if (rc > 0) {
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
- mdd_write_lock(env, vic, MOR_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
+ mdd_write_lock(env, vic, DT_TGT_CHILD);
} else {
- mdd_write_lock(env, vic, MOR_TGT_CHILD);
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, vic, DT_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
}
/* get EA of victim file */
RETURN(PTR_ERR(handle));
if (rc > 0) {
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
- mdd_write_lock(env, vic, MOR_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
+ mdd_write_lock(env, vic, DT_TGT_CHILD);
} else {
- mdd_write_lock(env, vic, MOR_TGT_CHILD);
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, vic, DT_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
}
/* get EA of mirrored file */
if (rc)
GOTO(stop, rc);
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
if (strcmp(XATTR_NAME_HSM, name) == 0) {
rc = mdd_hsm_update_locked(env, obj, buf, handle, &clf_flags);
if (rc)
GOTO(stop, rc);
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdo_xattr_del(env, mdd_obj, name, handle);
mdd_write_unlock(env, mdd_obj);
if (rc)
RETURN(PTR_ERR(handle));
/* objects are already sorted */
- mdd_write_lock(env, fst_o, MOR_TGT_CHILD);
- mdd_write_lock(env, snd_o, MOR_TGT_CHILD);
+ mdd_write_lock(env, fst_o, DT_TGT_CHILD);
+ mdd_write_lock(env, snd_o, DT_TGT_CHILD);
rc = mdd_stripe_get(env, fst_o, fst_buf, XATTR_NAME_LOV);
if (rc < 0 && rc != -ENODATA)
if (rc)
RETURN(rc);
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
rc = mdo_layout_change(env, obj, mlc, handle);
mdd_write_unlock(env, obj);
if (rc)
/* it needs a sync tx to make FLR to work properly */
handle->th_sync = 1;
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
rc = mdo_layout_change(env, obj, mlc, handle);
if (!rc && fl) {
/* SOM state transition from STRICT to STALE */
/* it needs a sync tx to make FLR to work properly */
handle->th_sync = 1;
- mdd_write_lock(env, obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
rc = mdo_layout_change(env, obj, mlc, handle);
mdd_write_unlock(env, obj);
if (rc)
enum changelog_rec_type type = CL_OPEN;
int rc = 0;
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdd_la_get(env, mdd_obj, attr);
if (rc != 0)
int is_orphan = 0;
int rc;
bool blocked = false;
- int last_close_by_uid = 0;
+ bool last_close_by_uid = false;
const struct lu_ucred *uc = lu_ucred(env);
ENTRY;
if (ma->ma_valid & MA_FLAGS && ma->ma_attr_flags & MDS_KEEP_ORPHAN) {
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
mdd_obj->mod_count--;
mdd_write_unlock(env, mdd_obj);
}
cont:
- mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_write_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdd_la_get(env, mdd_obj, &ma->ma_attr);
if (rc != 0) {
CERROR("%s: failed to get lu_attr of "DFID": rc = %d\n",
mdd_obj->mod_count--; /*release open count */
/* under mdd write lock */
- /* If recording, see if we need to remove UID from list */
- if (mdd_changelog_enabled(env, mdd, CL_OPEN)) {
+ /* If recording, see if we need to remove UID from list. uc is not
+ * initialized if the client has been evicted. */
+ if (mdd_changelog_enabled(env, mdd, CL_OPEN) && uc) {
struct mdd_object_user *mou;
/* look for UID in list */
mou->mou_opencount--;
if (mou->mou_opencount == 0) {
mdd_obj_user_remove(mdd_obj, mou);
- last_close_by_uid = 1;
+ last_close_by_uid = true;
}
}
}
return -ENOENT;
}
- mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
+ mdd_read_lock(env, mdd_obj, DT_TGT_CHILD);
rc = mdd_readpage_sanity_check(env, mdd_obj);
if (rc)
GOTO(out_unlock, rc);