]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: dedup handling of struct filename init and refcounts bumps
authorMateusz Guzik <mjguzik@gmail.com>
Thu, 13 Mar 2025 14:27:44 +0000 (15:27 +0100)
committerChristian Brauner <brauner@kernel.org>
Tue, 18 Mar 2025 14:34:27 +0000 (15:34 +0100)
No functional changes.

Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://lore.kernel.org/r/20250313142744.1323281-1-mjguzik@gmail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/namei.c
include/linux/fs.h
kernel/auditsc.c

index 3209d65b5fc0c07d039af21e586d35977f02ed02..345e20143b5d20381f02fcb921a67eca1ab3d1c7 100644 (file)
 
 #define EMBEDDED_NAME_MAX      (PATH_MAX - offsetof(struct filename, iname))
 
+static inline void initname(struct filename *name)
+{
+       name->uptr = NULL;
+       name->aname = NULL;
+       atomic_set(&name->refcnt, 1);
+}
+
 struct filename *
 getname_flags(const char __user *filename, int flags)
 {
@@ -203,10 +210,7 @@ getname_flags(const char __user *filename, int flags)
                        return ERR_PTR(-ENAMETOOLONG);
                }
        }
-
-       atomic_set(&result->refcnt, 1);
-       result->uptr = filename;
-       result->aname = NULL;
+       initname(result);
        audit_getname(result);
        return result;
 }
@@ -264,11 +268,8 @@ struct filename *getname_kernel(const char * filename)
                return ERR_PTR(-ENAMETOOLONG);
        }
        memcpy((char *)result->name, filename, len);
-       result->uptr = NULL;
-       result->aname = NULL;
-       atomic_set(&result->refcnt, 1);
+       initname(result);
        audit_getname(result);
-
        return result;
 }
 EXPORT_SYMBOL(getname_kernel);
index 9ab789cd1531be25db8a0eea80058ba18c3492cf..ae1fce54eb608a5419f52976d4809c6c4e26de5e 100644 (file)
@@ -2859,6 +2859,12 @@ static inline struct filename *getname_maybe_null(const char __user *name, int f
 }
 extern void putname(struct filename *name);
 
+static inline struct filename *refname(struct filename *name)
+{
+       atomic_inc(&name->refcnt);
+       return name;
+}
+
 extern int finish_open(struct file *file, struct dentry *dentry,
                        int (*open)(struct inode *, struct file *));
 extern int finish_no_open(struct file *file, struct dentry *dentry);
index 9c853cde9abe4b26c1747f7ebbea0c6db0a2a410..78fd876a5473fb6d0a5c5cb535aa84e1bb05c670 100644 (file)
@@ -2207,10 +2207,8 @@ __audit_reusename(const __user char *uptr)
        list_for_each_entry(n, &context->names_list, list) {
                if (!n->name)
                        continue;
-               if (n->name->uptr == uptr) {
-                       atomic_inc(&n->name->refcnt);
-                       return n->name;
-               }
+               if (n->name->uptr == uptr)
+                       return refname(n->name);
        }
        return NULL;
 }
@@ -2237,7 +2235,7 @@ void __audit_getname(struct filename *name)
        n->name = name;
        n->name_len = AUDIT_NAME_FULL;
        name->aname = n;
-       atomic_inc(&name->refcnt);
+       refname(name);
 }
 
 static inline int audit_copy_fcaps(struct audit_names *name,
@@ -2369,7 +2367,7 @@ out_alloc:
                return;
        if (name) {
                n->name = name;
-               atomic_inc(&name->refcnt);
+               refname(name);
        }
 
 out:
@@ -2496,7 +2494,7 @@ void __audit_inode_child(struct inode *parent,
                if (found_parent) {
                        found_child->name = found_parent->name;
                        found_child->name_len = AUDIT_NAME_FULL;
-                       atomic_inc(&found_child->name->refcnt);
+                       refname(found_child->name);
                }
        }