|
@@ -5390,11 +5390,40 @@ 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;
|
|
|
|
|
|
- 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
|