Skip to content

Commit ff9fb72

Browse files
committed
debugfs: return error values, not NULL
When an error happens, debugfs should return an error pointer value, not NULL. This will prevent the totally theoretical error where a debugfs call fails due to lack of memory, returning NULL, and that dentry value is then passed to another debugfs call, which would end up succeeding, creating a file at the root of the debugfs tree, but would then be impossible to remove (because you can not remove the directory NULL). So, to make everyone happy, always return errors, this makes the users of debugfs much simpler (they do not have to ever check the return value), and everyone can rest easy. Reported-by: Gary R Hook <ghook@amd.com> Reported-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reported-by: Masami Hiramatsu <mhiramat@kernel.org> Reported-by: Michal Hocko <mhocko@kernel.org> Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Reported-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent d88c93f commit ff9fb72

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

fs/debugfs/inode.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ MODULE_ALIAS_FS("debugfs");
254254
* @parent: a pointer to the parent dentry of the file.
255255
*
256256
* This function will return a pointer to a dentry if it succeeds. If the file
257-
* doesn't exist or an error occurs, %NULL will be returned. The returned
258-
* dentry must be passed to dput() when it is no longer needed.
257+
* doesn't exist or an error occurs, %ERR_PTR(-ERROR) will be returned. The
258+
* returned dentry must be passed to dput() when it is no longer needed.
259259
*
260260
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
261261
* returned.
@@ -265,17 +265,17 @@ struct dentry *debugfs_lookup(const char *name, struct dentry *parent)
265265
struct dentry *dentry;
266266

267267
if (IS_ERR(parent))
268-
return NULL;
268+
return parent;
269269

270270
if (!parent)
271271
parent = debugfs_mount->mnt_root;
272272

273273
dentry = lookup_one_len_unlocked(name, parent, strlen(name));
274274
if (IS_ERR(dentry))
275-
return NULL;
275+
return dentry;
276276
if (!d_really_is_positive(dentry)) {
277277
dput(dentry);
278-
return NULL;
278+
return ERR_PTR(-EINVAL);
279279
}
280280
return dentry;
281281
}
@@ -324,7 +324,7 @@ static struct dentry *failed_creating(struct dentry *dentry)
324324
inode_unlock(d_inode(dentry->d_parent));
325325
dput(dentry);
326326
simple_release_fs(&debugfs_mount, &debugfs_mount_count);
327-
return NULL;
327+
return ERR_PTR(-ENOMEM);
328328
}
329329

330330
static struct dentry *end_creating(struct dentry *dentry)
@@ -347,7 +347,7 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
347347
dentry = start_creating(name, parent);
348348

349349
if (IS_ERR(dentry))
350-
return NULL;
350+
return dentry;
351351

352352
inode = debugfs_get_inode(dentry->d_sb);
353353
if (unlikely(!inode))
@@ -386,7 +386,8 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
386386
* This function will return a pointer to a dentry if it succeeds. This
387387
* pointer must be passed to the debugfs_remove() function when the file is
388388
* to be removed (no automatic cleanup happens if your module is unloaded,
389-
* you are responsible here.) If an error occurs, %NULL will be returned.
389+
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
390+
* returned.
390391
*
391392
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
392393
* returned.
@@ -464,7 +465,8 @@ EXPORT_SYMBOL_GPL(debugfs_create_file_unsafe);
464465
* This function will return a pointer to a dentry if it succeeds. This
465466
* pointer must be passed to the debugfs_remove() function when the file is
466467
* to be removed (no automatic cleanup happens if your module is unloaded,
467-
* you are responsible here.) If an error occurs, %NULL will be returned.
468+
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
469+
* returned.
468470
*
469471
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
470472
* returned.
@@ -495,7 +497,8 @@ EXPORT_SYMBOL_GPL(debugfs_create_file_size);
495497
* This function will return a pointer to a dentry if it succeeds. This
496498
* pointer must be passed to the debugfs_remove() function when the file is
497499
* to be removed (no automatic cleanup happens if your module is unloaded,
498-
* you are responsible here.) If an error occurs, %NULL will be returned.
500+
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
501+
* returned.
499502
*
500503
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
501504
* returned.
@@ -506,7 +509,7 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
506509
struct inode *inode;
507510

508511
if (IS_ERR(dentry))
509-
return NULL;
512+
return dentry;
510513

511514
inode = debugfs_get_inode(dentry->d_sb);
512515
if (unlikely(!inode))
@@ -545,7 +548,7 @@ struct dentry *debugfs_create_automount(const char *name,
545548
struct inode *inode;
546549

547550
if (IS_ERR(dentry))
548-
return NULL;
551+
return dentry;
549552

550553
inode = debugfs_get_inode(dentry->d_sb);
551554
if (unlikely(!inode))
@@ -581,8 +584,8 @@ EXPORT_SYMBOL(debugfs_create_automount);
581584
* This function will return a pointer to a dentry if it succeeds. This
582585
* pointer must be passed to the debugfs_remove() function when the symbolic
583586
* link is to be removed (no automatic cleanup happens if your module is
584-
* unloaded, you are responsible here.) If an error occurs, %NULL will be
585-
* returned.
587+
* unloaded, you are responsible here.) If an error occurs, %ERR_PTR(-ERROR)
588+
* will be returned.
586589
*
587590
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
588591
* returned.
@@ -594,12 +597,12 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
594597
struct inode *inode;
595598
char *link = kstrdup(target, GFP_KERNEL);
596599
if (!link)
597-
return NULL;
600+
return ERR_PTR(-ENOMEM);
598601

599602
dentry = start_creating(name, parent);
600603
if (IS_ERR(dentry)) {
601604
kfree(link);
602-
return NULL;
605+
return dentry;
603606
}
604607

605608
inode = debugfs_get_inode(dentry->d_sb);
@@ -827,7 +830,9 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
827830
if (dentry && !IS_ERR(dentry))
828831
dput(dentry);
829832
unlock_rename(new_dir, old_dir);
830-
return NULL;
833+
if (IS_ERR(dentry))
834+
return dentry;
835+
return ERR_PTR(-EINVAL);
831836
}
832837
EXPORT_SYMBOL_GPL(debugfs_rename);
833838

0 commit comments

Comments
 (0)