diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-02-07 19:28:39 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2012-09-21 06:13:33 -0400 |
commit | 0cfe53d3c3875e1dd565b30737cd5c6691c00188 (patch) | |
tree | 51079bb57feab17c32aa0477c6b67e85f023ae12 /fs/jffs2 | |
parent | 0e1a43c71612cd0b6b50da03040c85fbf3d24211 (diff) |
userns: Convert jffs2 to use kuid and kgid where appropriate
- General routine uid/gid conversion work
- When storing posix acls treat ACL_USER and ACL_GROUP separately
so I can call from_kuid or from_kgid as appropriate.
- When reading posix acls treat ACL_USER and ACL_GROUP separately
so I can call make_kuid or make_kgid as appropriate.
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'fs/jffs2')
-rw-r--r-- | fs/jffs2/acl.c | 26 | ||||
-rw-r--r-- | fs/jffs2/file.c | 8 | ||||
-rw-r--r-- | fs/jffs2/fs.c | 24 | ||||
-rw-r--r-- | fs/jffs2/os-linux.h | 4 |
4 files changed, 39 insertions, 23 deletions
diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 42e4edc17a90..223283c30111 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c | |||
@@ -94,15 +94,23 @@ static struct posix_acl *jffs2_acl_from_medium(void *value, size_t size) | |||
94 | case ACL_MASK: | 94 | case ACL_MASK: |
95 | case ACL_OTHER: | 95 | case ACL_OTHER: |
96 | value += sizeof(struct jffs2_acl_entry_short); | 96 | value += sizeof(struct jffs2_acl_entry_short); |
97 | acl->a_entries[i].e_id = ACL_UNDEFINED_ID; | ||
98 | break; | 97 | break; |
99 | 98 | ||
100 | case ACL_USER: | 99 | case ACL_USER: |
100 | value += sizeof(struct jffs2_acl_entry); | ||
101 | if (value > end) | ||
102 | goto fail; | ||
103 | acl->a_entries[i].e_uid = | ||
104 | make_kuid(&init_user_ns, | ||
105 | je32_to_cpu(entry->e_id)); | ||
106 | break; | ||
101 | case ACL_GROUP: | 107 | case ACL_GROUP: |
102 | value += sizeof(struct jffs2_acl_entry); | 108 | value += sizeof(struct jffs2_acl_entry); |
103 | if (value > end) | 109 | if (value > end) |
104 | goto fail; | 110 | goto fail; |
105 | acl->a_entries[i].e_id = je32_to_cpu(entry->e_id); | 111 | acl->a_entries[i].e_gid = |
112 | make_kgid(&init_user_ns, | ||
113 | je32_to_cpu(entry->e_id)); | ||
106 | break; | 114 | break; |
107 | 115 | ||
108 | default: | 116 | default: |
@@ -131,13 +139,19 @@ static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size) | |||
131 | header->a_version = cpu_to_je32(JFFS2_ACL_VERSION); | 139 | header->a_version = cpu_to_je32(JFFS2_ACL_VERSION); |
132 | e = header + 1; | 140 | e = header + 1; |
133 | for (i=0; i < acl->a_count; i++) { | 141 | for (i=0; i < acl->a_count; i++) { |
142 | const struct posix_acl_entry *acl_e = &acl->a_entries[i]; | ||
134 | entry = e; | 143 | entry = e; |
135 | entry->e_tag = cpu_to_je16(acl->a_entries[i].e_tag); | 144 | entry->e_tag = cpu_to_je16(acl_e->e_tag); |
136 | entry->e_perm = cpu_to_je16(acl->a_entries[i].e_perm); | 145 | entry->e_perm = cpu_to_je16(acl_e->e_perm); |
137 | switch(acl->a_entries[i].e_tag) { | 146 | switch(acl_e->e_tag) { |
138 | case ACL_USER: | 147 | case ACL_USER: |
148 | entry->e_id = cpu_to_je32( | ||
149 | from_kuid(&init_user_ns, acl_e->e_uid)); | ||
150 | e += sizeof(struct jffs2_acl_entry); | ||
151 | break; | ||
139 | case ACL_GROUP: | 152 | case ACL_GROUP: |
140 | entry->e_id = cpu_to_je32(acl->a_entries[i].e_id); | 153 | entry->e_id = cpu_to_je32( |
154 | from_kgid(&init_user_ns, acl_e->e_gid)); | ||
141 | e += sizeof(struct jffs2_acl_entry); | 155 | e += sizeof(struct jffs2_acl_entry); |
142 | break; | 156 | break; |
143 | 157 | ||
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index db3889ba8818..60ef3fb707ff 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c | |||
@@ -175,8 +175,8 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping, | |||
175 | ri.ino = cpu_to_je32(f->inocache->ino); | 175 | ri.ino = cpu_to_je32(f->inocache->ino); |
176 | ri.version = cpu_to_je32(++f->highest_version); | 176 | ri.version = cpu_to_je32(++f->highest_version); |
177 | ri.mode = cpu_to_jemode(inode->i_mode); | 177 | ri.mode = cpu_to_jemode(inode->i_mode); |
178 | ri.uid = cpu_to_je16(inode->i_uid); | 178 | ri.uid = cpu_to_je16(i_uid_read(inode)); |
179 | ri.gid = cpu_to_je16(inode->i_gid); | 179 | ri.gid = cpu_to_je16(i_gid_read(inode)); |
180 | ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs)); | 180 | ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs)); |
181 | ri.atime = ri.ctime = ri.mtime = cpu_to_je32(get_seconds()); | 181 | ri.atime = ri.ctime = ri.mtime = cpu_to_je32(get_seconds()); |
182 | ri.offset = cpu_to_je32(inode->i_size); | 182 | ri.offset = cpu_to_je32(inode->i_size); |
@@ -283,8 +283,8 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping, | |||
283 | /* Set the fields that the generic jffs2_write_inode_range() code can't find */ | 283 | /* Set the fields that the generic jffs2_write_inode_range() code can't find */ |
284 | ri->ino = cpu_to_je32(inode->i_ino); | 284 | ri->ino = cpu_to_je32(inode->i_ino); |
285 | ri->mode = cpu_to_jemode(inode->i_mode); | 285 | ri->mode = cpu_to_jemode(inode->i_mode); |
286 | ri->uid = cpu_to_je16(inode->i_uid); | 286 | ri->uid = cpu_to_je16(i_uid_read(inode)); |
287 | ri->gid = cpu_to_je16(inode->i_gid); | 287 | ri->gid = cpu_to_je16(i_gid_read(inode)); |
288 | ri->isize = cpu_to_je32((uint32_t)inode->i_size); | 288 | ri->isize = cpu_to_je32((uint32_t)inode->i_size); |
289 | ri->atime = ri->ctime = ri->mtime = cpu_to_je32(get_seconds()); | 289 | ri->atime = ri->ctime = ri->mtime = cpu_to_je32(get_seconds()); |
290 | 290 | ||
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 3d3092eda811..fe3c0527545f 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
@@ -99,8 +99,10 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) | |||
99 | ri->ino = cpu_to_je32(inode->i_ino); | 99 | ri->ino = cpu_to_je32(inode->i_ino); |
100 | ri->version = cpu_to_je32(++f->highest_version); | 100 | ri->version = cpu_to_je32(++f->highest_version); |
101 | 101 | ||
102 | ri->uid = cpu_to_je16((ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid); | 102 | ri->uid = cpu_to_je16((ivalid & ATTR_UID)? |
103 | ri->gid = cpu_to_je16((ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid); | 103 | from_kuid(&init_user_ns, iattr->ia_uid):i_uid_read(inode)); |
104 | ri->gid = cpu_to_je16((ivalid & ATTR_GID)? | ||
105 | from_kgid(&init_user_ns, iattr->ia_gid):i_gid_read(inode)); | ||
104 | 106 | ||
105 | if (ivalid & ATTR_MODE) | 107 | if (ivalid & ATTR_MODE) |
106 | ri->mode = cpu_to_jemode(iattr->ia_mode); | 108 | ri->mode = cpu_to_jemode(iattr->ia_mode); |
@@ -147,8 +149,8 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) | |||
147 | inode->i_ctime = ITIME(je32_to_cpu(ri->ctime)); | 149 | inode->i_ctime = ITIME(je32_to_cpu(ri->ctime)); |
148 | inode->i_mtime = ITIME(je32_to_cpu(ri->mtime)); | 150 | inode->i_mtime = ITIME(je32_to_cpu(ri->mtime)); |
149 | inode->i_mode = jemode_to_cpu(ri->mode); | 151 | inode->i_mode = jemode_to_cpu(ri->mode); |
150 | inode->i_uid = je16_to_cpu(ri->uid); | 152 | i_uid_write(inode, je16_to_cpu(ri->uid)); |
151 | inode->i_gid = je16_to_cpu(ri->gid); | 153 | i_gid_write(inode, je16_to_cpu(ri->gid)); |
152 | 154 | ||
153 | 155 | ||
154 | old_metadata = f->metadata; | 156 | old_metadata = f->metadata; |
@@ -276,8 +278,8 @@ struct inode *jffs2_iget(struct super_block *sb, unsigned long ino) | |||
276 | return ERR_PTR(ret); | 278 | return ERR_PTR(ret); |
277 | } | 279 | } |
278 | inode->i_mode = jemode_to_cpu(latest_node.mode); | 280 | inode->i_mode = jemode_to_cpu(latest_node.mode); |
279 | inode->i_uid = je16_to_cpu(latest_node.uid); | 281 | i_uid_write(inode, je16_to_cpu(latest_node.uid)); |
280 | inode->i_gid = je16_to_cpu(latest_node.gid); | 282 | i_gid_write(inode, je16_to_cpu(latest_node.gid)); |
281 | inode->i_size = je32_to_cpu(latest_node.isize); | 283 | inode->i_size = je32_to_cpu(latest_node.isize); |
282 | inode->i_atime = ITIME(je32_to_cpu(latest_node.atime)); | 284 | inode->i_atime = ITIME(je32_to_cpu(latest_node.atime)); |
283 | inode->i_mtime = ITIME(je32_to_cpu(latest_node.mtime)); | 285 | inode->i_mtime = ITIME(je32_to_cpu(latest_node.mtime)); |
@@ -440,14 +442,14 @@ struct inode *jffs2_new_inode (struct inode *dir_i, umode_t mode, struct jffs2_r | |||
440 | 442 | ||
441 | memset(ri, 0, sizeof(*ri)); | 443 | memset(ri, 0, sizeof(*ri)); |
442 | /* Set OS-specific defaults for new inodes */ | 444 | /* Set OS-specific defaults for new inodes */ |
443 | ri->uid = cpu_to_je16(current_fsuid()); | 445 | ri->uid = cpu_to_je16(from_kuid(&init_user_ns, current_fsuid())); |
444 | 446 | ||
445 | if (dir_i->i_mode & S_ISGID) { | 447 | if (dir_i->i_mode & S_ISGID) { |
446 | ri->gid = cpu_to_je16(dir_i->i_gid); | 448 | ri->gid = cpu_to_je16(i_gid_read(dir_i)); |
447 | if (S_ISDIR(mode)) | 449 | if (S_ISDIR(mode)) |
448 | mode |= S_ISGID; | 450 | mode |= S_ISGID; |
449 | } else { | 451 | } else { |
450 | ri->gid = cpu_to_je16(current_fsgid()); | 452 | ri->gid = cpu_to_je16(from_kgid(&init_user_ns, current_fsgid())); |
451 | } | 453 | } |
452 | 454 | ||
453 | /* POSIX ACLs have to be processed now, at least partly. | 455 | /* POSIX ACLs have to be processed now, at least partly. |
@@ -467,8 +469,8 @@ struct inode *jffs2_new_inode (struct inode *dir_i, umode_t mode, struct jffs2_r | |||
467 | set_nlink(inode, 1); | 469 | set_nlink(inode, 1); |
468 | inode->i_ino = je32_to_cpu(ri->ino); | 470 | inode->i_ino = je32_to_cpu(ri->ino); |
469 | inode->i_mode = jemode_to_cpu(ri->mode); | 471 | inode->i_mode = jemode_to_cpu(ri->mode); |
470 | inode->i_gid = je16_to_cpu(ri->gid); | 472 | i_gid_write(inode, je16_to_cpu(ri->gid)); |
471 | inode->i_uid = je16_to_cpu(ri->uid); | 473 | i_uid_write(inode, je16_to_cpu(ri->uid)); |
472 | inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; | 474 | inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; |
473 | ri->atime = ri->mtime = ri->ctime = cpu_to_je32(I_SEC(inode->i_mtime)); | 475 | ri->atime = ri->mtime = ri->ctime = cpu_to_je32(I_SEC(inode->i_mtime)); |
474 | 476 | ||
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h index bcd983d7e7f9..d200a9b8fd5e 100644 --- a/fs/jffs2/os-linux.h +++ b/fs/jffs2/os-linux.h | |||
@@ -27,8 +27,8 @@ struct kvec; | |||
27 | 27 | ||
28 | #define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size) | 28 | #define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size) |
29 | #define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) | 29 | #define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) |
30 | #define JFFS2_F_I_UID(f) (OFNI_EDONI_2SFFJ(f)->i_uid) | 30 | #define JFFS2_F_I_UID(f) (i_uid_read(OFNI_EDONI_2SFFJ(f))) |
31 | #define JFFS2_F_I_GID(f) (OFNI_EDONI_2SFFJ(f)->i_gid) | 31 | #define JFFS2_F_I_GID(f) (i_gid_read(OFNI_EDONI_2SFFJ(f))) |
32 | #define JFFS2_F_I_RDEV(f) (OFNI_EDONI_2SFFJ(f)->i_rdev) | 32 | #define JFFS2_F_I_RDEV(f) (OFNI_EDONI_2SFFJ(f)->i_rdev) |
33 | 33 | ||
34 | #define ITIME(sec) ((struct timespec){sec, 0}) | 34 | #define ITIME(sec) ((struct timespec){sec, 0}) |