X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_object.c;h=b415f4bc861fd030f7566747124a1e22128e4a08;hp=a6f92977f1181db73eea94808934a868218d8372;hb=c7e86172425f203ce122ff18bc6434f843374b4b;hpb=ba7c99a5b18535305d3ae3b1687116c1fff5b4a8 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);