Skip to content

Commit

Permalink
proc: simplify proc_register calling conventions
Browse files Browse the repository at this point in the history
Return registered entry on success, return NULL on failure and free the
passed in entry.  Also expose it in internal.h as we'll start using it
in proc_net.c soon.

Signed-off-by: Christoph Hellwig <[email protected]>
  • Loading branch information
Christoph Hellwig committed May 16, 2018
1 parent 04015e3 commit 61172ea
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 26 deletions.
44 changes: 18 additions & 26 deletions fs/proc/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,26 +346,29 @@ static const struct inode_operations proc_dir_inode_operations = {
.setattr = proc_notify_change,
};

static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp)
/* returns the registered entry, or frees dp and returns NULL on failure */
struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
struct proc_dir_entry *dp)
{
int ret;

ret = proc_alloc_inum(&dp->low_ino);
if (ret)
return ret;
if (proc_alloc_inum(&dp->low_ino))
goto out_free_entry;

write_lock(&proc_subdir_lock);
dp->parent = dir;
if (pde_subdir_insert(dir, dp) == false) {
WARN(1, "proc_dir_entry '%s/%s' already registered\n",
dir->name, dp->name);
write_unlock(&proc_subdir_lock);
proc_free_inum(dp->low_ino);
return -EEXIST;
goto out_free_inum;
}
write_unlock(&proc_subdir_lock);

return 0;
return dp;
out_free_inum:
proc_free_inum(dp->low_ino);
out_free_entry:
pde_free(dp);
return NULL;
}

static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent,
Expand Down Expand Up @@ -443,10 +446,7 @@ struct proc_dir_entry *proc_symlink(const char *name,
if (ent->data) {
strcpy((char*)ent->data,dest);
ent->proc_iops = &proc_link_inode_operations;
if (proc_register(parent, ent) < 0) {
pde_free(ent);
ent = NULL;
}
ent = proc_register(parent, ent);
} else {
pde_free(ent);
ent = NULL;
Expand All @@ -470,11 +470,9 @@ struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode,
ent->proc_fops = &proc_dir_operations;
ent->proc_iops = &proc_dir_inode_operations;
parent->nlink++;
if (proc_register(parent, ent) < 0) {
pde_free(ent);
ent = proc_register(parent, ent);
if (!ent)
parent->nlink--;
ent = NULL;
}
}
return ent;
}
Expand Down Expand Up @@ -505,11 +503,9 @@ struct proc_dir_entry *proc_create_mount_point(const char *name)
ent->proc_fops = NULL;
ent->proc_iops = NULL;
parent->nlink++;
if (proc_register(parent, ent) < 0) {
pde_free(ent);
ent = proc_register(parent, ent);
if (!ent)
parent->nlink--;
ent = NULL;
}
}
return ent;
}
Expand Down Expand Up @@ -539,11 +535,7 @@ struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
pde->proc_fops = proc_fops;
pde->data = data;
pde->proc_iops = &proc_file_inode_operations;
if (proc_register(parent, pde) < 0)
goto out_free;
return pde;
out_free:
pde_free(pde);
return proc_register(parent, pde);
out:
return NULL;
}
Expand Down
2 changes: 2 additions & 0 deletions fs/proc/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ extern bool proc_fill_cache(struct file *, struct dir_context *, const char *, i
/*
* generic.c
*/
struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
struct proc_dir_entry *dp);
extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
struct dentry *proc_lookup_de(struct inode *, struct dentry *, struct proc_dir_entry *);
extern int proc_readdir(struct file *, struct dir_context *);
Expand Down

0 comments on commit 61172ea

Please sign in to comment.