Skip to content

Commit 6118510

Browse files
mjguzikbrauner
authored andcommitted
fs: dedup handling of struct filename init and refcounts bumps
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>
1 parent f381640 commit 6118510

3 files changed

Lines changed: 20 additions & 15 deletions

File tree

fs/namei.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@
125125

126126
#define EMBEDDED_NAME_MAX (PATH_MAX - offsetof(struct filename, iname))
127127

128+
static inline void initname(struct filename *name)
129+
{
130+
name->uptr = NULL;
131+
name->aname = NULL;
132+
atomic_set(&name->refcnt, 1);
133+
}
134+
128135
struct filename *
129136
getname_flags(const char __user *filename, int flags)
130137
{
@@ -203,10 +210,7 @@ getname_flags(const char __user *filename, int flags)
203210
return ERR_PTR(-ENAMETOOLONG);
204211
}
205212
}
206-
207-
atomic_set(&result->refcnt, 1);
208-
result->uptr = filename;
209-
result->aname = NULL;
213+
initname(result);
210214
audit_getname(result);
211215
return result;
212216
}
@@ -264,11 +268,8 @@ struct filename *getname_kernel(const char * filename)
264268
return ERR_PTR(-ENAMETOOLONG);
265269
}
266270
memcpy((char *)result->name, filename, len);
267-
result->uptr = NULL;
268-
result->aname = NULL;
269-
atomic_set(&result->refcnt, 1);
271+
initname(result);
270272
audit_getname(result);
271-
272273
return result;
273274
}
274275
EXPORT_SYMBOL(getname_kernel);

include/linux/fs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,6 +2859,12 @@ static inline struct filename *getname_maybe_null(const char __user *name, int f
28592859
}
28602860
extern void putname(struct filename *name);
28612861

2862+
static inline struct filename *refname(struct filename *name)
2863+
{
2864+
atomic_inc(&name->refcnt);
2865+
return name;
2866+
}
2867+
28622868
extern int finish_open(struct file *file, struct dentry *dentry,
28632869
int (*open)(struct inode *, struct file *));
28642870
extern int finish_no_open(struct file *file, struct dentry *dentry);

kernel/auditsc.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,10 +2207,8 @@ __audit_reusename(const __user char *uptr)
22072207
list_for_each_entry(n, &context->names_list, list) {
22082208
if (!n->name)
22092209
continue;
2210-
if (n->name->uptr == uptr) {
2211-
atomic_inc(&n->name->refcnt);
2212-
return n->name;
2213-
}
2210+
if (n->name->uptr == uptr)
2211+
return refname(n->name);
22142212
}
22152213
return NULL;
22162214
}
@@ -2237,7 +2235,7 @@ void __audit_getname(struct filename *name)
22372235
n->name = name;
22382236
n->name_len = AUDIT_NAME_FULL;
22392237
name->aname = n;
2240-
atomic_inc(&name->refcnt);
2238+
refname(name);
22412239
}
22422240

22432241
static inline int audit_copy_fcaps(struct audit_names *name,
@@ -2369,7 +2367,7 @@ void __audit_inode(struct filename *name, const struct dentry *dentry,
23692367
return;
23702368
if (name) {
23712369
n->name = name;
2372-
atomic_inc(&name->refcnt);
2370+
refname(name);
23732371
}
23742372

23752373
out:
@@ -2496,7 +2494,7 @@ void __audit_inode_child(struct inode *parent,
24962494
if (found_parent) {
24972495
found_child->name = found_parent->name;
24982496
found_child->name_len = AUDIT_NAME_FULL;
2499-
atomic_inc(&found_child->name->refcnt);
2497+
refname(found_child->name);
25002498
}
25012499
}
25022500

0 commit comments

Comments
 (0)