diff options
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/ext4.h | 17 | ||||
-rw-r--r-- | fs/ext4/ialloc.c | 14 | ||||
-rw-r--r-- | fs/ext4/ioctl.c | 3 |
3 files changed, 23 insertions, 11 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index d4700d101ea7..2cbfc0b04d37 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -246,6 +246,23 @@ struct flex_groups { | |||
246 | EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\ | 246 | EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\ |
247 | EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL) | 247 | EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL) |
248 | 248 | ||
249 | /* Flags that are appropriate for regular files (all but dir-specific ones). */ | ||
250 | #define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL)) | ||
251 | |||
252 | /* Flags that are appropriate for non-directories/regular files. */ | ||
253 | #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL) | ||
254 | |||
255 | /* Mask out flags that are inappropriate for the given type of inode. */ | ||
256 | static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | ||
257 | { | ||
258 | if (S_ISDIR(mode)) | ||
259 | return flags; | ||
260 | else if (S_ISREG(mode)) | ||
261 | return flags & EXT4_REG_FLMASK; | ||
262 | else | ||
263 | return flags & EXT4_OTHER_FLMASK; | ||
264 | } | ||
265 | |||
249 | /* | 266 | /* |
250 | * Inode dynamic state flags | 267 | * Inode dynamic state flags |
251 | */ | 268 | */ |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 1ff3df086e58..ae3eb57dccdd 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -885,16 +885,12 @@ got: | |||
885 | ei->i_disksize = 0; | 885 | ei->i_disksize = 0; |
886 | 886 | ||
887 | /* | 887 | /* |
888 | * Don't inherit extent flag from directory. We set extent flag on | 888 | * Don't inherit extent flag from directory, amongst others. We set |
889 | * newly created directory and file only if -o extent mount option is | 889 | * extent flag on newly created directory and file only if -o extent |
890 | * specified | 890 | * mount option is specified |
891 | */ | 891 | */ |
892 | ei->i_flags = EXT4_I(dir)->i_flags & EXT4_FL_INHERITED; | 892 | ei->i_flags = |
893 | if (S_ISLNK(mode)) | 893 | ext4_mask_flags(mode, EXT4_I(dir)->i_flags & EXT4_FL_INHERITED); |
894 | ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL); | ||
895 | /* dirsync only applies to directories */ | ||
896 | if (!S_ISDIR(mode)) | ||
897 | ei->i_flags &= ~EXT4_DIRSYNC_FL; | ||
898 | ei->i_file_acl = 0; | 894 | ei->i_file_acl = 0; |
899 | ei->i_dtime = 0; | 895 | ei->i_dtime = 0; |
900 | ei->i_block_group = group; | 896 | ei->i_block_group = group; |
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 42dc83fb247a..22dd29f3ebc9 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
@@ -48,8 +48,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
48 | if (err) | 48 | if (err) |
49 | return err; | 49 | return err; |
50 | 50 | ||
51 | if (!S_ISDIR(inode->i_mode)) | 51 | flags = ext4_mask_flags(inode->i_mode, flags); |
52 | flags &= ~EXT4_DIRSYNC_FL; | ||
53 | 52 | ||
54 | err = -EPERM; | 53 | err = -EPERM; |
55 | mutex_lock(&inode->i_mutex); | 54 | mutex_lock(&inode->i_mutex); |