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 | |
| 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>
| -rw-r--r-- | fs/jfs/Makefile | 3 | ||||
| -rw-r--r-- | fs/jfs/file.c | 1 | ||||
| -rw-r--r-- | fs/jfs/inode.c | 1 | ||||
| -rw-r--r-- | fs/jfs/jfs_dinode.h | 31 | ||||
| -rw-r--r-- | fs/jfs/jfs_inode.c | 37 | ||||
| -rw-r--r-- | fs/jfs/jfs_inode.h | 3 | ||||
| -rw-r--r-- | fs/jfs/namei.c | 1 |
7 files changed, 69 insertions, 8 deletions
diff --git a/fs/jfs/Makefile b/fs/jfs/Makefile index 6f1e0e95587a..3adb6395e42d 100644 --- a/fs/jfs/Makefile +++ b/fs/jfs/Makefile | |||
| @@ -8,7 +8,8 @@ jfs-y := super.o file.o inode.o namei.o jfs_mount.o jfs_umount.o \ | |||
| 8 | jfs_xtree.o jfs_imap.o jfs_debug.o jfs_dmap.o \ | 8 | jfs_xtree.o jfs_imap.o jfs_debug.o jfs_dmap.o \ |
| 9 | jfs_unicode.o jfs_dtree.o jfs_inode.o \ | 9 | jfs_unicode.o jfs_dtree.o jfs_inode.o \ |
| 10 | jfs_extent.o symlink.o jfs_metapage.o \ | 10 | jfs_extent.o symlink.o jfs_metapage.o \ |
| 11 | jfs_logmgr.o jfs_txnmgr.o jfs_uniupr.o resize.o xattr.o | 11 | jfs_logmgr.o jfs_txnmgr.o jfs_uniupr.o \ |
| 12 | resize.o xattr.o ioctl.o | ||
| 12 | 13 | ||
| 13 | jfs-$(CONFIG_JFS_POSIX_ACL) += acl.o | 14 | jfs-$(CONFIG_JFS_POSIX_ACL) += acl.o |
| 14 | 15 | ||
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index c2c19c9ed9a4..e1ac6e497e2b 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c | |||
| @@ -113,4 +113,5 @@ struct file_operations jfs_file_operations = { | |||
| 113 | .sendfile = generic_file_sendfile, | 113 | .sendfile = generic_file_sendfile, |
| 114 | .fsync = jfs_fsync, | 114 | .fsync = jfs_fsync, |
| 115 | .release = jfs_release, | 115 | .release = jfs_release, |
| 116 | .ioctl = jfs_ioctl, | ||
| 116 | }; | 117 | }; |
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index d7834a9117ce..51a5fed90cca 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
| @@ -55,6 +55,7 @@ void jfs_read_inode(struct inode *inode) | |||
| 55 | inode->i_op = &jfs_file_inode_operations; | 55 | inode->i_op = &jfs_file_inode_operations; |
| 56 | init_special_inode(inode, inode->i_mode, inode->i_rdev); | 56 | init_special_inode(inode, inode->i_mode, inode->i_rdev); |
| 57 | } | 57 | } |
| 58 | jfs_set_inode_flags(inode); | ||
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | /* | 61 | /* |
diff --git a/fs/jfs/jfs_dinode.h b/fs/jfs/jfs_dinode.h index 580a3258449b..9f2572aea561 100644 --- a/fs/jfs/jfs_dinode.h +++ b/fs/jfs/jfs_dinode.h | |||
| @@ -139,13 +139,36 @@ struct dinode { | |||
| 139 | 139 | ||
| 140 | /* more extended mode bits: attributes for OS/2 */ | 140 | /* more extended mode bits: attributes for OS/2 */ |
| 141 | #define IREADONLY 0x02000000 /* no write access to file */ | 141 | #define IREADONLY 0x02000000 /* no write access to file */ |
| 142 | #define IARCHIVE 0x40000000 /* file archive bit */ | ||
| 143 | #define ISYSTEM 0x08000000 /* system file */ | ||
| 144 | #define IHIDDEN 0x04000000 /* hidden file */ | 142 | #define IHIDDEN 0x04000000 /* hidden file */ |
| 145 | #define IRASH 0x4E000000 /* mask for changeable attributes */ | 143 | #define ISYSTEM 0x08000000 /* system file */ |
| 146 | #define INEWNAME 0x80000000 /* non-8.3 filename format */ | 144 | |
| 147 | #define IDIRECTORY 0x20000000 /* directory (shadow of real bit) */ | 145 | #define IDIRECTORY 0x20000000 /* directory (shadow of real bit) */ |
| 146 | #define IARCHIVE 0x40000000 /* file archive bit */ | ||
| 147 | #define INEWNAME 0x80000000 /* non-8.3 filename format */ | ||
| 148 | |||
| 149 | #define IRASH 0x4E000000 /* mask for changeable attributes */ | ||
| 148 | #define ATTRSHIFT 25 /* bits to shift to move attribute | 150 | #define ATTRSHIFT 25 /* bits to shift to move attribute |
| 149 | specification to mode position */ | 151 | specification to mode position */ |
| 150 | 152 | ||
| 153 | /* extended attributes for Linux */ | ||
| 154 | |||
| 155 | #define JFS_NOATIME_FL 0x00080000 /* do not update atime */ | ||
| 156 | |||
| 157 | #define JFS_DIRSYNC_FL 0x00100000 /* dirsync behaviour */ | ||
| 158 | #define JFS_SYNC_FL 0x00200000 /* Synchronous updates */ | ||
| 159 | #define JFS_SECRM_FL 0x00400000 /* Secure deletion */ | ||
| 160 | #define JFS_UNRM_FL 0x00800000 /* allow for undelete */ | ||
| 161 | |||
| 162 | #define JFS_APPEND_FL 0x01000000 /* writes to file may only append */ | ||
| 163 | #define JFS_IMMUTABLE_FL 0x02000000 /* Immutable file */ | ||
| 164 | |||
| 165 | #define JFS_FL_USER_VISIBLE 0x03F80000 | ||
| 166 | #define JFS_FL_USER_MODIFIABLE 0x03F80000 | ||
| 167 | #define JFS_FL_INHERIT 0x03C80000 | ||
| 168 | |||
| 169 | /* These are identical to EXT[23]_IOC_GETFLAGS/SETFLAGS */ | ||
| 170 | #define JFS_IOC_GETFLAGS _IOR('f', 1, long) | ||
| 171 | #define JFS_IOC_SETFLAGS _IOW('f', 2, long) | ||
| 172 | |||
| 173 | |||
| 151 | #endif /*_H_JFS_DINODE */ | 174 | #endif /*_H_JFS_DINODE */ |
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 | ||
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h index b54bac576cb3..095d471b9f9a 100644 --- a/fs/jfs/jfs_inode.h +++ b/fs/jfs/jfs_inode.h | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | 20 | ||
| 21 | extern struct inode *ialloc(struct inode *, umode_t); | 21 | extern struct inode *ialloc(struct inode *, umode_t); |
| 22 | extern int jfs_fsync(struct file *, struct dentry *, int); | 22 | extern int jfs_fsync(struct file *, struct dentry *, int); |
| 23 | extern int jfs_ioctl(struct inode *, struct file *, | ||
| 24 | unsigned int, unsigned long); | ||
| 23 | extern void jfs_read_inode(struct inode *); | 25 | extern void jfs_read_inode(struct inode *); |
| 24 | extern int jfs_commit_inode(struct inode *, int); | 26 | extern int jfs_commit_inode(struct inode *, int); |
| 25 | extern int jfs_write_inode(struct inode*, int); | 27 | extern int jfs_write_inode(struct inode*, int); |
| @@ -29,6 +31,7 @@ extern void jfs_truncate(struct inode *); | |||
| 29 | extern void jfs_truncate_nolock(struct inode *, loff_t); | 31 | extern void jfs_truncate_nolock(struct inode *, loff_t); |
| 30 | extern void jfs_free_zero_link(struct inode *); | 32 | extern void jfs_free_zero_link(struct inode *); |
| 31 | extern struct dentry *jfs_get_parent(struct dentry *dentry); | 33 | extern struct dentry *jfs_get_parent(struct dentry *dentry); |
| 34 | extern void jfs_set_inode_flags(struct inode *); | ||
| 32 | 35 | ||
| 33 | extern struct address_space_operations jfs_aops; | 36 | extern struct address_space_operations jfs_aops; |
| 34 | extern struct inode_operations jfs_dir_inode_operations; | 37 | extern struct inode_operations jfs_dir_inode_operations; |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index ed4d170c212d..309cee575f7d 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
| @@ -1523,6 +1523,7 @@ struct file_operations jfs_dir_operations = { | |||
| 1523 | .read = generic_read_dir, | 1523 | .read = generic_read_dir, |
| 1524 | .readdir = jfs_readdir, | 1524 | .readdir = jfs_readdir, |
| 1525 | .fsync = jfs_fsync, | 1525 | .fsync = jfs_fsync, |
| 1526 | .ioctl = jfs_ioctl, | ||
| 1526 | }; | 1527 | }; |
| 1527 | 1528 | ||
| 1528 | static int jfs_ci_hash(struct dentry *dir, struct qstr *this) | 1529 | static int jfs_ci_hash(struct dentry *dir, struct qstr *this) |
