X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_object.c;h=a67cedc8ad8f5e6fcfaf92900845d64e59b819a7;hb=3cce65712d94cffe8f1626545845b95b88aef672;hp=4b819883805adf30e0c425d15361c8868234804b;hpb=ebf742028b57a88817b26d6fb7748110ec15d31c;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 4b81988..a67cedc 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -235,8 +235,7 @@ int mdd_la_get(const struct lu_env *env, struct mdd_object *obj, 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; @@ -422,14 +421,14 @@ static int mdd_xattr_get(const struct lu_env *env, 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) || @@ -488,7 +487,7 @@ int mdd_readlink(const struct lu_env *env, struct md_object *obj, 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); @@ -505,7 +504,7 @@ static int mdd_xattr_list(const struct lu_env *env, struct md_object *obj, 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); @@ -1072,7 +1071,7 @@ static int mdd_declare_attr_set(const struct lu_env *env, #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); @@ -1099,6 +1098,7 @@ static int mdd_declare_attr_set(const struct lu_env *env, /* * LU-3671 + * LU-7239 * * permission changes may require sync operation, to mitigate performance * impact, only do this for dir and when permission is reduced. @@ -1113,17 +1113,24 @@ static inline bool permission_needs_sync(const struct lu_attr *old, 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; } @@ -1163,6 +1170,7 @@ int mdd_attr_set(const struct lu_env *env, struct md_object *obj, 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; @@ -1194,15 +1202,23 @@ int mdd_attr_set(const struct lu_env *env, struct md_object *obj, 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); @@ -1221,14 +1237,15 @@ int mdd_attr_set(const struct lu_env *env, struct md_object *obj, 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 @@ -1396,7 +1413,8 @@ static int mdd_hsm_update_locked(const struct lu_env *env, /* 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) @@ -1491,11 +1509,11 @@ static int mdd_xattr_merge(const struct lu_env *env, struct md_object *md_obj, 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 */ @@ -1717,11 +1735,11 @@ static int mdd_xattr_split(const struct lu_env *env, struct md_object *md_obj, 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 */ @@ -1900,7 +1918,7 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj, 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); @@ -1981,7 +1999,7 @@ static int mdd_xattr_del(const struct lu_env *env, struct md_object *obj, 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) @@ -2294,8 +2312,8 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1, 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) @@ -2613,7 +2631,7 @@ mdd_layout_instantiate_component(const struct lu_env *env, 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) @@ -2690,7 +2708,7 @@ mdd_layout_update_rdonly(const struct lu_env *env, struct mdd_object *obj, /* 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 */ @@ -2757,7 +2775,7 @@ mdd_layout_update_write_pending(const struct lu_env *env, /* 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) @@ -3035,7 +3053,7 @@ static int mdd_open(const struct lu_env *env, struct md_object *obj, 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) @@ -3134,7 +3152,7 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj, 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); @@ -3189,7 +3207,7 @@ again: } 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", @@ -3429,7 +3447,7 @@ int mdd_readpage(const struct lu_env *env, struct md_object *obj, 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);