diff options
author | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-05-13 02:09:47 -0400 |
---|---|---|
committer | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-05-13 02:09:47 -0400 |
commit | aa98d7cf59b5b0764d3502662053489585faf2fe (patch) | |
tree | e98e83f3e69ebe3a1112394a19d440419e899749 /fs/jffs2/fs.c | |
parent | 4992a9e88886b0c5ebc3d27eb74d0344c873eeea (diff) |
[JFFS2][XATTR] XATTR support on JFFS2 (version. 5)
This attached patches provide xattr support including POSIX-ACL and
SELinux support on JFFS2 (version.5).
There are some significant differences from previous version posted
at last December.
The biggest change is addition of EBS(Erase Block Summary) support.
Currently, both kernel and usermode utility (sumtool) can recognize
xattr nodes which have JFFS2_NODETYPE_XATTR/_XREF nodetype.
In addition, some bugs are fixed.
- A potential race condition was fixed.
- Unexpected fail when updating a xattr by same name/value pair was fixed.
- A bug when removing xattr name/value pair was fixed.
The fundamental structures (such as using two new nodetypes and exclusion
mechanism by rwsem) are unchanged. But most of implementation were reviewed
and updated if necessary.
Espacially, we had to change several internal implementations related to
load_xattr_datum() to avoid a potential race condition.
[1/2] xattr_on_jffs2.kernel.version-5.patch
[2/2] xattr_on_jffs2.utils.version-5.patch
Signed-off-by: KaiGai Kohei <kaigai@ak.jp.nec.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'fs/jffs2/fs.c')
-rw-r--r-- | fs/jffs2/fs.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index ea1f37d4fc58..4607cdc4c46d 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
@@ -185,7 +185,12 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) | |||
185 | 185 | ||
186 | int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) | 186 | int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) |
187 | { | 187 | { |
188 | return jffs2_do_setattr(dentry->d_inode, iattr); | 188 | int rc; |
189 | |||
190 | rc = jffs2_do_setattr(dentry->d_inode, iattr); | ||
191 | if (!rc && (iattr->ia_valid & ATTR_MODE)) | ||
192 | rc = jffs2_acl_chmod(dentry->d_inode); | ||
193 | return rc; | ||
189 | } | 194 | } |
190 | 195 | ||
191 | int jffs2_statfs(struct super_block *sb, struct kstatfs *buf) | 196 | int jffs2_statfs(struct super_block *sb, struct kstatfs *buf) |
@@ -224,6 +229,7 @@ void jffs2_clear_inode (struct inode *inode) | |||
224 | 229 | ||
225 | D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); | 230 | D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); |
226 | 231 | ||
232 | jffs2_xattr_delete_inode(c, f->inocache); | ||
227 | jffs2_do_clear_inode(c, f); | 233 | jffs2_do_clear_inode(c, f); |
228 | } | 234 | } |
229 | 235 | ||
@@ -497,6 +503,8 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) | |||
497 | } | 503 | } |
498 | memset(c->inocache_list, 0, INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *)); | 504 | memset(c->inocache_list, 0, INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *)); |
499 | 505 | ||
506 | jffs2_init_xattr_subsystem(c); | ||
507 | |||
500 | if ((ret = jffs2_do_mount_fs(c))) | 508 | if ((ret = jffs2_do_mount_fs(c))) |
501 | goto out_inohash; | 509 | goto out_inohash; |
502 | 510 | ||
@@ -531,6 +539,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) | |||
531 | else | 539 | else |
532 | kfree(c->blocks); | 540 | kfree(c->blocks); |
533 | out_inohash: | 541 | out_inohash: |
542 | jffs2_clear_xattr_subsystem(c); | ||
534 | kfree(c->inocache_list); | 543 | kfree(c->inocache_list); |
535 | out_wbuf: | 544 | out_wbuf: |
536 | jffs2_flash_cleanup(c); | 545 | jffs2_flash_cleanup(c); |