]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: add f_pipe
authorChristian Brauner <brauner@kernel.org>
Fri, 30 Aug 2024 13:04:59 +0000 (15:04 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 12 Sep 2024 09:58:45 +0000 (11:58 +0200)
Only regular files with FMODE_ATOMIC_POS and directories need
f_pos_lock. Place a new f_pipe member in a union with f_pos_lock
that they can use and make them stop abusing f_version in follow-up
patches.

Link: https://lore.kernel.org/r/20240830-vfs-file-f_version-v1-18-6d3e4816aa7b@kernel.org
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/file_table.c
include/linux/fs.h

index 3ef558f27a1cd3ae35250860e9128d198f5c4d4f..7ce4d5dac080ab002b539867984a331129ee9df9 100644 (file)
@@ -156,6 +156,13 @@ static int init_file(struct file *f, int flags, const struct cred *cred)
        }
 
        spin_lock_init(&f->f_lock);
+       /*
+        * Note that f_pos_lock is only used for files raising
+        * FMODE_ATOMIC_POS and directories. Other files such as pipes
+        * don't need it and since f_pos_lock is in a union may reuse
+        * the space for other purposes. They are expected to initialize
+        * the respective member when opening the file.
+        */
        mutex_init(&f->f_pos_lock);
        f->f_flags = flags;
        f->f_mode = OPEN_FMODE(flags);
index 3e6b3c1afb3142e473ed366ab567232f2b5d512c..ca49250082445c740ce2c94ba6841f143c25488f 100644 (file)
@@ -1001,6 +1001,7 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
  * @f_cred: stashed credentials of creator/opener
  * @f_path: path of the file
  * @f_pos_lock: lock protecting file position
+ * @f_pipe: specific to pipes
  * @f_pos: file position
  * @f_version: file version
  * @f_security: LSM security context of this file
@@ -1026,7 +1027,12 @@ struct file {
        const struct cred               *f_cred;
        /* --- cacheline 1 boundary (64 bytes) --- */
        struct path                     f_path;
-       struct mutex                    f_pos_lock;
+       union {
+               /* regular files (with FMODE_ATOMIC_POS) and directories */
+               struct mutex            f_pos_lock;
+               /* pipes */
+               u64                     f_pipe;
+       };
        loff_t                          f_pos;
        u64                             f_version;
        /* --- cacheline 2 boundary (128 bytes) --- */