Whamcloud - gitweb
LU-5150 acl: 'cp -rp' set empty default ACL 58/11158/2
authorLai Siyao <lai.siyao@intel.com>
Mon, 30 Jun 2014 13:33:25 +0000 (21:33 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 1 Aug 2014 06:44:48 +0000 (06:44 +0000)
'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 <lai.siyao@intel.com>
Change-Id: I2b6947e241675c291a43999e6324bbb295d3c88d
Reviewed-on: http://review.whamcloud.com/11158
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Li Wei <wei.g.li@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdd/mdd_object.c
lustre/osd-zfs/osd_xattr.c
lustre/tests/sanity.sh

index a6f9297..b415f4b 100644 (file)
@@ -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);
index bc45582..f66f986 100644 (file)
@@ -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;
                }
index d2c7a48..deec912 100644 (file)
@@ -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