diff options
| -rw-r--r-- | fs/ext2/ialloc.c | 8 | ||||
| -rw-r--r-- | fs/ext2/ioctl.c | 3 | ||||
| -rw-r--r-- | include/linux/ext2_fs.h | 17 |
3 files changed, 20 insertions, 8 deletions
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index b5598e1393d9..66321a877e74 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c | |||
| @@ -565,12 +565,8 @@ got: | |||
| 565 | inode->i_blocks = 0; | 565 | inode->i_blocks = 0; |
| 566 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; | 566 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; |
| 567 | memset(ei->i_data, 0, sizeof(ei->i_data)); | 567 | memset(ei->i_data, 0, sizeof(ei->i_data)); |
| 568 | ei->i_flags = EXT2_I(dir)->i_flags & EXT2_FL_INHERITED; | 568 | ei->i_flags = |
| 569 | if (S_ISLNK(mode)) | 569 | ext2_mask_flags(mode, EXT2_I(dir)->i_flags & EXT2_FL_INHERITED); |
| 570 | ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); | ||
| 571 | /* dirsync is only applied to directories */ | ||
| 572 | if (!S_ISDIR(mode)) | ||
| 573 | ei->i_flags &= ~EXT2_DIRSYNC_FL; | ||
| 574 | ei->i_faddr = 0; | 570 | ei->i_faddr = 0; |
| 575 | ei->i_frag_no = 0; | 571 | ei->i_frag_no = 0; |
| 576 | ei->i_frag_size = 0; | 572 | ei->i_frag_size = 0; |
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index de876fa793e1..7cb4badef927 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c | |||
| @@ -50,8 +50,7 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 50 | goto setflags_out; | 50 | goto setflags_out; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | if (!S_ISDIR(inode->i_mode)) | 53 | flags = ext2_mask_flags(inode->i_mode, flags); |
| 54 | flags &= ~EXT2_DIRSYNC_FL; | ||
| 55 | 54 | ||
| 56 | mutex_lock(&inode->i_mutex); | 55 | mutex_lock(&inode->i_mutex); |
| 57 | /* Is it quota file? Do not allow user to mess with it */ | 56 | /* Is it quota file? Do not allow user to mess with it */ |
diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h index c3a051819363..121720d74e15 100644 --- a/include/linux/ext2_fs.h +++ b/include/linux/ext2_fs.h | |||
| @@ -201,6 +201,23 @@ struct ext2_group_desc | |||
| 201 | EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ | 201 | EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ |
| 202 | EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) | 202 | EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) |
| 203 | 203 | ||
| 204 | /* Flags that are appropriate for regular files (all but dir-specific ones). */ | ||
| 205 | #define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL)) | ||
| 206 | |||
| 207 | /* Flags that are appropriate for non-directories/regular files. */ | ||
| 208 | #define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL) | ||
| 209 | |||
| 210 | /* Mask out flags that are inappropriate for the given type of inode. */ | ||
| 211 | static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags) | ||
| 212 | { | ||
| 213 | if (S_ISDIR(mode)) | ||
| 214 | return flags; | ||
| 215 | else if (S_ISREG(mode)) | ||
| 216 | return flags & EXT2_REG_FLMASK; | ||
| 217 | else | ||
| 218 | return flags & EXT2_OTHER_FLMASK; | ||
| 219 | } | ||
| 220 | |||
| 204 | /* | 221 | /* |
| 205 | * ioctl commands | 222 | * ioctl commands |
| 206 | */ | 223 | */ |
