fs: add generic helper for filling statx attribute flags
authorAmir Goldstein <amir73il@gmail.com>
Sat, 19 Jun 2021 09:26:16 +0000 (12:26 +0300)
committerMiklos Szeredi <mszeredi@redhat.com>
Tue, 17 Aug 2021 09:47:43 +0000 (11:47 +0200)
The immutable and append-only properties on an inode are published on
the inode's i_flags and enforced by the VFS.

Create a helper to fill the corresponding STATX_ATTR_ flags in the kstat
structure from the inode's i_flags.

Only orange was converted to use this helper.
Other filesystems could use it in the future.

Suggested-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/orangefs/inode.c
fs/stat.c
include/linux/fs.h
include/linux/stat.h

index 16ac617..c1bb4c4 100644 (file)
@@ -882,12 +882,7 @@ int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path,
                if (!(request_mask & STATX_SIZE))
                        stat->result_mask &= ~STATX_SIZE;
 
-               stat->attributes_mask = STATX_ATTR_IMMUTABLE |
-                   STATX_ATTR_APPEND;
-               if (inode->i_flags & S_IMMUTABLE)
-                       stat->attributes |= STATX_ATTR_IMMUTABLE;
-               if (inode->i_flags & S_APPEND)
-                       stat->attributes |= STATX_ATTR_APPEND;
+               generic_fill_statx_attr(inode, stat);
        }
        return ret;
 }
index 1fa38bd..28d2020 100644 (file)
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -59,6 +59,24 @@ void generic_fillattr(struct user_namespace *mnt_userns, struct inode *inode,
 }
 EXPORT_SYMBOL(generic_fillattr);
 
+/**
+ * generic_fill_statx_attr - Fill in the statx attributes from the inode flags
+ * @inode:     Inode to use as the source
+ * @stat:      Where to fill in the attribute flags
+ *
+ * Fill in the STATX_ATTR_* flags in the kstat structure for properties of the
+ * inode that are published on i_flags and enforced by the VFS.
+ */
+void generic_fill_statx_attr(struct inode *inode, struct kstat *stat)
+{
+       if (inode->i_flags & S_IMMUTABLE)
+               stat->attributes |= STATX_ATTR_IMMUTABLE;
+       if (inode->i_flags & S_APPEND)
+               stat->attributes |= STATX_ATTR_APPEND;
+       stat->attributes_mask |= KSTAT_ATTR_VFS_FLAGS;
+}
+EXPORT_SYMBOL(generic_fill_statx_attr);
+
 /**
  * vfs_getattr_nosec - getattr without security checks
  * @path: file to get attributes from
index 6405742..ae6c6c3 100644 (file)
@@ -3355,6 +3355,7 @@ extern int page_symlink(struct inode *inode, const char *symname, int len);
 extern const struct inode_operations page_symlink_inode_operations;
 extern void kfree_link(void *);
 void generic_fillattr(struct user_namespace *, struct inode *, struct kstat *);
+void generic_fill_statx_attr(struct inode *inode, struct kstat *stat);
 extern int vfs_getattr_nosec(const struct path *, struct kstat *, u32, unsigned int);
 extern int vfs_getattr(const struct path *, struct kstat *, u32, unsigned int);
 void __inode_add_bytes(struct inode *inode, loff_t bytes);
index fff27e6..7df0693 100644 (file)
@@ -34,6 +34,10 @@ struct kstat {
         STATX_ATTR_ENCRYPTED |                         \
         STATX_ATTR_VERITY                              \
         )/* Attrs corresponding to FS_*_FL flags */
+#define KSTAT_ATTR_VFS_FLAGS                           \
+       (STATX_ATTR_IMMUTABLE |                         \
+        STATX_ATTR_APPEND                              \
+        ) /* Attrs corresponding to S_* flags that are enforced by the VFS */
        u64             ino;
        dev_t           dev;
        dev_t           rdev;