Преглед на файлове

orangefs: react properly to posix_acl_update_mode's aftermath.

posix_acl_update_mode checks to see if the permissions
described by the ACL can be encoded into the
object's mode. If so, it sets "acl" to NULL
and "mode" to the new desired value. Prior to this patch
we failed to actually propagate the new mode back to the
server.

Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Mike Marshall преди 8 години
родител
ревизия
4bef69000d
променени са 1 файла, в които са добавени 21 реда и са изтрити 8 реда
  1. 21 8
      fs/orangefs/acl.c

+ 21 - 8
fs/orangefs/acl.c

@@ -119,11 +119,18 @@ out:
 int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
 {
 	int error;
 	int error;
+	struct iattr iattr;
+	int rc;
 
 
 	if (type == ACL_TYPE_ACCESS && acl) {
 	if (type == ACL_TYPE_ACCESS && acl) {
-		umode_t mode;
-
-		error = posix_acl_update_mode(inode, &mode, &acl);
+		/*
+		 * posix_acl_update_mode checks to see if the permissions
+		 * described by the ACL can be encoded into the
+		 * object's mode. If so, it sets "acl" to NULL
+		 * and "mode" to the new desired value. It is up to
+		 * us to propagate the new mode back to the server...
+		 */
+		error = posix_acl_update_mode(inode, &iattr.ia_mode, &acl);
 		if (error) {
 		if (error) {
 			gossip_err("%s: posix_acl_update_mode err: %d\n",
 			gossip_err("%s: posix_acl_update_mode err: %d\n",
 				   __func__,
 				   __func__,
@@ -131,12 +138,18 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 			return error;
 			return error;
 		}
 		}
 
 
-		if (inode->i_mode != mode)
-			SetModeFlag(ORANGEFS_I(inode));
-		inode->i_mode = mode;
-		mark_inode_dirty_sync(inode);
+		if (acl) {
+			rc = __orangefs_set_acl(inode, acl, type);
+		} else {
+			iattr.ia_valid = ATTR_MODE;
+			rc = orangefs_inode_setattr(inode, &iattr);
+		}
+
+		return rc;
+
+	} else {
+		return -EINVAL;
 	}
 	}
-	return __orangefs_set_acl(inode, acl, type);
 }
 }
 
 
 int orangefs_init_acl(struct inode *inode, struct inode *dir)
 int orangefs_init_acl(struct inode *inode, struct inode *dir)