diff options
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 | ||
