From: Anmol Sarma <m...@anmolsarma.in>

Return inode creation time and stx_attributes flags

Signed-off-by: Anmol Sarma <m...@anmolsarma.in>
---
 fs/jfs/file.c      | 24 ++++++++++++++++++++++++
 fs/jfs/jfs_inode.h |  2 ++
 fs/jfs/namei.c     |  1 +
 fs/jfs/symlink.c   |  2 ++
 4 files changed, 29 insertions(+)

diff --git a/fs/jfs/file.c b/fs/jfs/file.c
index 36665fd37095..dedd27591836 100644
--- a/fs/jfs/file.c
+++ b/fs/jfs/file.c
@@ -23,6 +23,7 @@
 #include <linux/quotaops.h>
 #include "jfs_incore.h"
 #include "jfs_inode.h"
+#include "jfs_dinode.h"
 #include "jfs_dmap.h"
 #include "jfs_txnmgr.h"
 #include "jfs_xattr.h"
@@ -139,8 +140,31 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr)
        return rc;
 }
 
+int jfs_getattr(const struct path *path, struct kstat *stat, u32 request_mask,
+               unsigned int query_flags)
+{
+       struct inode *inode = d_inode(path->dentry);
+       struct jfs_inode_info *j_inode = JFS_IP(inode);
+       uint ji_flags = j_inode->mode2;
+
+       stat->result_mask |= STATX_BTIME;
+       stat->btime.tv_sec = j_inode->otime;
+       stat->btime.tv_nsec = 0;
+
+       if (ji_flags & JFS_APPEND_FL)
+               stat->attributes |= STATX_ATTR_APPEND;
+       if (ji_flags & JFS_IMMUTABLE_FL)
+               stat->attributes |= STATX_ATTR_IMMUTABLE;
+
+       stat->attributes_mask |= STATX_ATTR_APPEND | STATX_ATTR_IMMUTABLE;
+
+       generic_fillattr(inode, stat);
+       return 0;
+}
+
 const struct inode_operations jfs_file_inode_operations = {
        .listxattr      = jfs_listxattr,
+       .getattr        = jfs_getattr,
        .setattr        = jfs_setattr,
 #ifdef CONFIG_JFS_POSIX_ACL
        .get_acl        = jfs_get_acl,
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h
index 7b0b3a40788f..e8279a4cb7f7 100644
--- a/fs/jfs/jfs_inode.h
+++ b/fs/jfs/jfs_inode.h
@@ -39,6 +39,8 @@ extern struct dentry *jfs_fh_to_parent(struct super_block 
*sb, struct fid *fid,
        int fh_len, int fh_type);
 extern void jfs_set_inode_flags(struct inode *);
 extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
+extern int jfs_getattr(const struct path *path, struct kstat *stat,
+                      u32 request_mask, unsigned int query_flags);
 extern int jfs_setattr(struct dentry *, struct iattr *);
 
 extern const struct address_space_operations jfs_aops;
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index fa719a1553b6..8070c25f7551 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c
@@ -1533,6 +1533,7 @@ const struct inode_operations jfs_dir_inode_operations = {
        .mknod          = jfs_mknod,
        .rename         = jfs_rename,
        .listxattr      = jfs_listxattr,
+       .getattr        = jfs_getattr,
        .setattr        = jfs_setattr,
 #ifdef CONFIG_JFS_POSIX_ACL
        .get_acl        = jfs_get_acl,
diff --git a/fs/jfs/symlink.c b/fs/jfs/symlink.c
index 38320607993e..858e9de8ff74 100644
--- a/fs/jfs/symlink.c
+++ b/fs/jfs/symlink.c
@@ -23,12 +23,14 @@
 
 const struct inode_operations jfs_fast_symlink_inode_operations = {
        .get_link       = simple_get_link,
+       .getattr        = jfs_getattr,
        .setattr        = jfs_setattr,
        .listxattr      = jfs_listxattr,
 };
 
 const struct inode_operations jfs_symlink_inode_operations = {
        .get_link       = page_get_link,
+       .getattr        = jfs_getattr,
        .setattr        = jfs_setattr,
        .listxattr      = jfs_listxattr,
 };
-- 
2.17.1

Reply via email to