]> Pileus Git - ~andy/linux/blobdiff - fs/reiserfs/xattr_acl.c
Btrfs: fix possible infinite loop in slow caching
[~andy/linux] / fs / reiserfs / xattr_acl.c
index 44474f9b990db532124d29460983858465186e33..d7c01ef64edab42ed59d022a2cf36f917e1935c0 100644 (file)
@@ -30,7 +30,7 @@ posix_acl_set(struct dentry *dentry, const char *name, const void *value,
                return -EPERM;
 
        if (value) {
-               acl = posix_acl_from_xattr(value, size);
+               acl = posix_acl_from_xattr(&init_user_ns, value, size);
                if (IS_ERR(acl)) {
                        return PTR_ERR(acl);
                } else if (acl) {
@@ -77,7 +77,7 @@ posix_acl_get(struct dentry *dentry, const char *name, void *buffer,
                return PTR_ERR(acl);
        if (acl == NULL)
                return -ENODATA;
-       error = posix_acl_to_xattr(acl, buffer, size);
+       error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size);
        posix_acl_release(acl);
 
        return error;
@@ -121,15 +121,23 @@ static struct posix_acl *posix_acl_from_disk(const void *value, size_t size)
                case ACL_OTHER:
                        value = (char *)value +
                            sizeof(reiserfs_acl_entry_short);
-                       acl->a_entries[n].e_id = ACL_UNDEFINED_ID;
                        break;
 
                case ACL_USER:
+                       value = (char *)value + sizeof(reiserfs_acl_entry);
+                       if ((char *)value > end)
+                               goto fail;
+                       acl->a_entries[n].e_uid = 
+                               make_kuid(&init_user_ns,
+                                         le32_to_cpu(entry->e_id));
+                       break;
                case ACL_GROUP:
                        value = (char *)value + sizeof(reiserfs_acl_entry);
                        if ((char *)value > end)
                                goto fail;
-                       acl->a_entries[n].e_id = le32_to_cpu(entry->e_id);
+                       acl->a_entries[n].e_gid =
+                               make_kgid(&init_user_ns,
+                                         le32_to_cpu(entry->e_id));
                        break;
 
                default:
@@ -164,13 +172,19 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size)
        ext_acl->a_version = cpu_to_le32(REISERFS_ACL_VERSION);
        e = (char *)ext_acl + sizeof(reiserfs_acl_header);
        for (n = 0; n < acl->a_count; n++) {
+               const struct posix_acl_entry *acl_e = &acl->a_entries[n];
                reiserfs_acl_entry *entry = (reiserfs_acl_entry *) e;
                entry->e_tag = cpu_to_le16(acl->a_entries[n].e_tag);
                entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm);
                switch (acl->a_entries[n].e_tag) {
                case ACL_USER:
+                       entry->e_id = cpu_to_le32(
+                               from_kuid(&init_user_ns, acl_e->e_uid));
+                       e += sizeof(reiserfs_acl_entry);
+                       break;
                case ACL_GROUP:
-                       entry->e_id = cpu_to_le32(acl->a_entries[n].e_id);
+                       entry->e_id = cpu_to_le32(
+                               from_kgid(&init_user_ns, acl_e->e_gid));
                        e += sizeof(reiserfs_acl_entry);
                        break;