OSDN Git Service

ocfs2: Handle kuids and kgids in acl/xattr conversions.
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 31 Jan 2013 12:49:40 +0000 (04:49 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 13 Feb 2013 14:00:56 +0000 (06:00 -0800)
Explicitly deal with the different kinds of acls because they need
different conversions.

Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/ocfs2/acl.c

index 260b162..8a40457 100644 (file)
@@ -65,7 +65,20 @@ static struct posix_acl *ocfs2_acl_from_xattr(const void *value, size_t size)
 
                acl->a_entries[n].e_tag  = le16_to_cpu(entry->e_tag);
                acl->a_entries[n].e_perm = le16_to_cpu(entry->e_perm);
-               acl->a_entries[n].e_id   = le32_to_cpu(entry->e_id);
+               switch(acl->a_entries[n].e_tag) {
+               case ACL_USER:
+                       acl->a_entries[n].e_uid =
+                               make_kuid(&init_user_ns,
+                                         le32_to_cpu(entry->e_id));
+                       break;
+               case ACL_GROUP:
+                       acl->a_entries[n].e_gid =
+                               make_kgid(&init_user_ns,
+                                         le32_to_cpu(entry->e_id));
+                       break;
+               default:
+                       break;
+               }
                value += sizeof(struct posix_acl_entry);
 
        }
@@ -91,7 +104,21 @@ static void *ocfs2_acl_to_xattr(const struct posix_acl *acl, size_t *size)
        for (n = 0; n < acl->a_count; n++, entry++) {
                entry->e_tag  = cpu_to_le16(acl->a_entries[n].e_tag);
                entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm);
-               entry->e_id   = cpu_to_le32(acl->a_entries[n].e_id);
+               switch(acl->a_entries[n].e_tag) {
+               case ACL_USER:
+                       entry->e_id = cpu_to_le32(
+                               from_kuid(&init_user_ns,
+                                         acl->a_entries[n].e_uid));
+                       break;
+               case ACL_GROUP:
+                       entry->e_id = cpu_to_le32(
+                               from_kgid(&init_user_ns,
+                                         acl->a_entries[n].e_gid));
+                       break;
+               default:
+                       entry->e_id = cpu_to_le32(ACL_UNDEFINED_ID);
+                       break;
+               }
        }
        return ocfs2_acl;
 }