diff options
author | Herbert Poetzl <herbert@13thfloor.at> | 2006-02-09 10:09:16 -0500 |
---|---|---|
committer | Dave Kleikamp <shaggy@austin.ibm.com> | 2006-02-09 10:09:16 -0500 |
commit | fa3241d24cf1182b0ffb6e4d412c3bc2a2ab7bf6 (patch) | |
tree | b39000f89c6699612d64d98fd5739ca7feba8d8f /fs/jfs/jfs_inode.c | |
parent | 1de87444f8f91009b726108c9a56600645ee8751 (diff) |
JFS: ext2 inode attributes for jfs
ext2 inode attributes with relevance for jfs:
'a' EXT2_APPEND_FL -> append only
'i' EXT2_IMMUTABLE_FL -> immutable file
's' EXT2_SECRM_FL -> zero file
'u' EXT2_UNRM_FL -> allow for unrm
'A' EXT2_NOATIME_FL -> no access time
'D' EXT2_DIRSYNC_FL -> dirsync
'S' EXT2_SYNC_FL -> sync
overview of jfs flags (partially for OS/2)
value (OS/2) Linux ext2 attrs
------------------------------------------------
0x00010000 IFJOURNAL -
0x00020000 ISPARSE used
0x00040000 INLINEEA used
0x00080000 - - JFS_NOATIME_FL
0x00100000 - - JFS_DIRSYNC_FL
0x00200000 - - JFS_SYNC_FL
0x00400000 - - JFS_SECRM_FL
0x00800000 ISWAPFILE - JFS_UNRM_FL
0x01000000 - - JFS_APPEND_FL
0x02000000 IREADONLY - JFS_IMMUTABLE_FL
0x04000000 IHIDDEN - -
0x08000000 ISYSTEM - -
0x10000000 - -
0x20000000 IDIRECTORY used
0x40000000 IARCHIVE -
0x80000000 INEWNAME -
the implementation is straight forward, except
for the fact that the attributes have to be mapped
to match with the ext2 ones to avoid a separate
tool for manipulating them (this could be avoided
when using a separate flag field in the on-disk
representation, but the overhead is minimal)
a special jfs_ioctl is added to allow for the new
JFS_IOC_GETFLAGS and JFS_IOC_SETFLAGS calls.
a helper function jfs_set_inode_flags() to transfer
the flags from the on-disk version to the inode
minor changes to allow flag inheritance on inode
creation, as well as a cleanup of the on-disk
flags (including the new ones)
beforementioned helper to map between ext2 and jfs
versions of the new flags ...
the JFS_SECRM_FL and JFS_UNRM_FL are not done yet
and I'm not 100% sure they are worth the effort,
the rest seems to work out of the box ...
Signed-off-by: Herbert Poetzl <herbert@13thfloor.at>
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Diffstat (limited to 'fs/jfs/jfs_inode.c')
-rw-r--r-- | fs/jfs/jfs_inode.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/fs/jfs/jfs_inode.c b/fs/jfs/jfs_inode.c index 2af5efbfd06f..ae2772cba2d1 100644 --- a/fs/jfs/jfs_inode.c +++ b/fs/jfs/jfs_inode.c | |||
@@ -25,6 +25,26 @@ | |||
25 | #include "jfs_dinode.h" | 25 | #include "jfs_dinode.h" |
26 | #include "jfs_debug.h" | 26 | #include "jfs_debug.h" |
27 | 27 | ||
28 | |||
29 | void jfs_set_inode_flags(struct inode *inode) | ||
30 | { | ||
31 | unsigned int flags = JFS_IP(inode)->mode2; | ||
32 | |||
33 | inode->i_flags &= ~(S_IMMUTABLE | S_APPEND | | ||
34 | S_NOATIME | S_DIRSYNC | S_SYNC); | ||
35 | |||
36 | if (flags & JFS_IMMUTABLE_FL) | ||
37 | inode->i_flags |= S_IMMUTABLE; | ||
38 | if (flags & JFS_APPEND_FL) | ||
39 | inode->i_flags |= S_APPEND; | ||
40 | if (flags & JFS_NOATIME_FL) | ||
41 | inode->i_flags |= S_NOATIME; | ||
42 | if (flags & JFS_DIRSYNC_FL) | ||
43 | inode->i_flags |= S_DIRSYNC; | ||
44 | if (flags & JFS_SYNC_FL) | ||
45 | inode->i_flags |= S_SYNC; | ||
46 | } | ||
47 | |||
28 | /* | 48 | /* |
29 | * NAME: ialloc() | 49 | * NAME: ialloc() |
30 | * | 50 | * |
@@ -74,10 +94,20 @@ struct inode *ialloc(struct inode *parent, umode_t mode) | |||
74 | } | 94 | } |
75 | 95 | ||
76 | inode->i_mode = mode; | 96 | inode->i_mode = mode; |
77 | if (S_ISDIR(mode)) | 97 | /* inherit flags from parent */ |
78 | jfs_inode->mode2 = IDIRECTORY | mode; | 98 | jfs_inode->mode2 = JFS_IP(parent)->mode2 & JFS_FL_INHERIT; |
99 | |||
100 | if (S_ISDIR(mode)) { | ||
101 | jfs_inode->mode2 |= IDIRECTORY; | ||
102 | jfs_inode->mode2 &= ~JFS_DIRSYNC_FL; | ||
103 | } | ||
104 | else if (S_ISLNK(mode)) | ||
105 | jfs_inode->mode2 &= | ||
106 | ~(JFS_IMMUTABLE_FL|JFS_APPEND_FL); | ||
79 | else | 107 | else |
80 | jfs_inode->mode2 = INLINEEA | ISPARSE | mode; | 108 | jfs_inode->mode2 |= INLINEEA | ISPARSE; |
109 | jfs_inode->mode2 |= mode; | ||
110 | |||
81 | inode->i_blksize = sb->s_blocksize; | 111 | inode->i_blksize = sb->s_blocksize; |
82 | inode->i_blocks = 0; | 112 | inode->i_blocks = 0; |
83 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 113 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
@@ -98,6 +128,7 @@ struct inode *ialloc(struct inode *parent, umode_t mode) | |||
98 | jfs_inode->atlhead = 0; | 128 | jfs_inode->atlhead = 0; |
99 | jfs_inode->atltail = 0; | 129 | jfs_inode->atltail = 0; |
100 | jfs_inode->xtlid = 0; | 130 | jfs_inode->xtlid = 0; |
131 | jfs_set_inode_flags(inode); | ||
101 | 132 | ||
102 | jfs_info("ialloc returns inode = 0x%p\n", inode); | 133 | jfs_info("ialloc returns inode = 0x%p\n", inode); |
103 | 134 | ||