From: Lai Siyao Date: Mon, 30 Jun 2014 13:33:25 +0000 (+0800) Subject: LU-5150 acl: 'cp -rp' set empty default ACL X-Git-Tag: 2.6.51~44 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=c7e86172425f203ce122ff18bc6434f843374b4b LU-5150 acl: 'cp -rp' set empty default ACL 'cp -rp' will set an empty default ACL on target, MDD should treat this as removing specified ACL. add sanity 103c to verify this. Signed-off-by: Lai Siayo Change-Id: I2b6947e241675c291a43999e6324bbb295d3c88d Reviewed-on: http://review.whamcloud.com/11158 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Li Wei Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index a6f9297..b415f4b 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -998,6 +998,9 @@ free: return(rc); } +static int mdd_xattr_del(const struct lu_env *env, struct md_object *obj, + const char *name); + /** * The caller should guarantee to update the object ctime * after xattr_set if needed. @@ -1021,6 +1024,21 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj, if (rc) RETURN(rc); + if (strcmp(name, XATTR_NAME_ACL_ACCESS) == 0 || + strcmp(name, XATTR_NAME_ACL_DEFAULT) == 0) { + struct posix_acl *acl; + + /* user may set empty ACL, which should be treated as removing + * ACL. */ + acl = posix_acl_from_xattr(&init_user_ns, buf->lb_buf, + buf->lb_len); + if (acl == NULL) { + rc = mdd_xattr_del(env, obj, name); + RETURN(rc); + } + posix_acl_release(acl); + } + if (!strcmp(name, XATTR_NAME_ACL_ACCESS)) { rc = mdd_acl_set(env, mdd_obj, attr, buf, fl); RETURN(rc); diff --git a/lustre/osd-zfs/osd_xattr.c b/lustre/osd-zfs/osd_xattr.c index bc45582..f66f986 100644 --- a/lustre/osd-zfs/osd_xattr.c +++ b/lustre/osd-zfs/osd_xattr.c @@ -247,8 +247,8 @@ int osd_xattr_get(const struct lu_env *env, struct dt_object *dt, LASSERT(dt_object_exists(dt)); if (!osd_obj2dev(obj)->od_posix_acl && - (!strcmp(name, POSIX_ACL_XATTR_ACCESS) || - !strcmp(name, POSIX_ACL_XATTR_DEFAULT))) + (strcmp(name, POSIX_ACL_XATTR_ACCESS) == 0 || + strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0)) RETURN(-EOPNOTSUPP); down(&obj->oo_guard); @@ -596,8 +596,8 @@ int osd_xattr_set(const struct lu_env *env, struct dt_object *dt, LASSERT(obj->oo_db); if (!osd_obj2dev(obj)->od_posix_acl && - (!strcmp(name, POSIX_ACL_XATTR_ACCESS) || - !strcmp(name, POSIX_ACL_XATTR_DEFAULT))) + (strcmp(name, POSIX_ACL_XATTR_ACCESS) == 0 || + strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0)) RETURN(-EOPNOTSUPP); oh = container_of0(handle, struct osd_thandle, ot_super); @@ -739,8 +739,8 @@ int osd_xattr_del(const struct lu_env *env, struct dt_object *dt, LASSERT(oh->ot_tx != NULL); if (!osd_obj2dev(obj)->od_posix_acl && - (!strcmp(name, POSIX_ACL_XATTR_ACCESS) || - !strcmp(name, POSIX_ACL_XATTR_DEFAULT))) + (strcmp(name, POSIX_ACL_XATTR_ACCESS) == 0 || + strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0)) RETURN(-EOPNOTSUPP); down(&obj->oo_guard); @@ -770,8 +770,8 @@ osd_sa_xattr_list(const struct lu_env *env, struct osd_object *obj, const char *name = nvpair_name(nvp); if (!osd_obj2dev(obj)->od_posix_acl && - (!strcmp(name, POSIX_ACL_XATTR_ACCESS) || - !strcmp(name, POSIX_ACL_XATTR_DEFAULT))) + (strcmp(name, POSIX_ACL_XATTR_ACCESS) == 0 || + strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0)) continue; len = strlen(nvpair_name(nvp)); @@ -824,8 +824,8 @@ int osd_xattr_list(const struct lu_env *env, struct dt_object *dt, while ((rc = -udmu_zap_cursor_retrieve_key(env, zc, oti->oti_key, MAXNAMELEN)) == 0) { if (!osd_obj2dev(obj)->od_posix_acl && - (!strcmp(oti->oti_key, POSIX_ACL_XATTR_ACCESS) || - !strcmp(oti->oti_key, POSIX_ACL_XATTR_DEFAULT))) { + (strcmp(oti->oti_key, POSIX_ACL_XATTR_ACCESS) == 0 || + strcmp(oti->oti_key, POSIX_ACL_XATTR_DEFAULT) == 0)) { zap_cursor_advance(zc); continue; } diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index d2c7a48..deec912 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -6935,9 +6935,21 @@ test_103b() { error "failed to start MDT." fi - rm -f $DIR/$tfile + true +} +run_test 103b "MDS mount option 'noacl'" + +test_103c() { + mkdir -p $DIR/$tdir + cp -rp $DIR/$tdir $DIR/$tdir.bak + + [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] && + error "$DIR/$tdir shouldn't contain default ACL" + [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] && + error "$DIR/$tdir.bak shouldn't contain default ACL" + true } -run_test 103b "MDS mount option \"noacl\" =======================" +run_test 103c "'cp -rp' won't set empty acl" test_104a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return