aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/ext4.h17
-rw-r--r--fs/ext4/ialloc.c14
-rw-r--r--fs/ext4/ioctl.c3
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. */
256static 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);