]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext4/inode.c
Merge tag 'libnvdimm-for-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[karo-tx-linux.git] / fs / ext4 / inode.c
index 2cb2634daa99689c2208a169813bd03c256e7b1c..f0729b0705c710747eefb1e25360c5144eeef933 100644 (file)
@@ -4509,31 +4509,6 @@ void ext4_set_inode_flags(struct inode *inode)
                        S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX);
 }
 
-/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
-void ext4_get_inode_flags(struct ext4_inode_info *ei)
-{
-       unsigned int vfs_fl;
-       unsigned long old_fl, new_fl;
-
-       do {
-               vfs_fl = ei->vfs_inode.i_flags;
-               old_fl = ei->i_flags;
-               new_fl = old_fl & ~(EXT4_SYNC_FL|EXT4_APPEND_FL|
-                               EXT4_IMMUTABLE_FL|EXT4_NOATIME_FL|
-                               EXT4_DIRSYNC_FL);
-               if (vfs_fl & S_SYNC)
-                       new_fl |= EXT4_SYNC_FL;
-               if (vfs_fl & S_APPEND)
-                       new_fl |= EXT4_APPEND_FL;
-               if (vfs_fl & S_IMMUTABLE)
-                       new_fl |= EXT4_IMMUTABLE_FL;
-               if (vfs_fl & S_NOATIME)
-                       new_fl |= EXT4_NOATIME_FL;
-               if (vfs_fl & S_DIRSYNC)
-                       new_fl |= EXT4_DIRSYNC_FL;
-       } while (cmpxchg(&ei->i_flags, old_fl, new_fl) != old_fl);
-}
-
 static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode,
                                  struct ext4_inode_info *ei)
 {
@@ -4970,7 +4945,6 @@ static int ext4_do_update_inode(handle_t *handle,
        if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
                memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
 
-       ext4_get_inode_flags(ei);
        raw_inode->i_mode = cpu_to_le16(inode->i_mode);
        i_uid = i_uid_read(inode);
        i_gid = i_gid_read(inode);
@@ -5397,11 +5371,46 @@ err_out:
 int ext4_getattr(const struct path *path, struct kstat *stat,
                 u32 request_mask, unsigned int query_flags)
 {
-       struct inode *inode;
-       unsigned long long delalloc_blocks;
+       struct inode *inode = d_inode(path->dentry);
+       struct ext4_inode *raw_inode;
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       unsigned int flags;
+
+       if (EXT4_FITS_IN_INODE(raw_inode, ei, i_crtime)) {
+               stat->result_mask |= STATX_BTIME;
+               stat->btime.tv_sec = ei->i_crtime.tv_sec;
+               stat->btime.tv_nsec = ei->i_crtime.tv_nsec;
+       }
+
+       flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
+       if (flags & EXT4_APPEND_FL)
+               stat->attributes |= STATX_ATTR_APPEND;
+       if (flags & EXT4_COMPR_FL)
+               stat->attributes |= STATX_ATTR_COMPRESSED;
+       if (flags & EXT4_ENCRYPT_FL)
+               stat->attributes |= STATX_ATTR_ENCRYPTED;
+       if (flags & EXT4_IMMUTABLE_FL)
+               stat->attributes |= STATX_ATTR_IMMUTABLE;
+       if (flags & EXT4_NODUMP_FL)
+               stat->attributes |= STATX_ATTR_NODUMP;
+
+       stat->attributes_mask |= (STATX_ATTR_APPEND |
+                                 STATX_ATTR_COMPRESSED |
+                                 STATX_ATTR_ENCRYPTED |
+                                 STATX_ATTR_IMMUTABLE |
+                                 STATX_ATTR_NODUMP);
 
-       inode = d_inode(path->dentry);
        generic_fillattr(inode, stat);
+       return 0;
+}
+
+int ext4_file_getattr(const struct path *path, struct kstat *stat,
+                     u32 request_mask, unsigned int query_flags)
+{
+       struct inode *inode = d_inode(path->dentry);
+       u64 delalloc_blocks;
+
+       ext4_getattr(path, stat, request_mask, query_flags);
 
        /*
         * If there is inline data in the inode, the inode will normally not