Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

proc: add a proc_create_reg helper

Common code for creating a regular file. Factor out of proc_create_data, to
be reused by other functions soon.

Signed-off-by: Christoph Hellwig <hch@lst.de>

+27 -19
+25 -19
fs/proc/generic.c
··· 511 511 } 512 512 EXPORT_SYMBOL(proc_create_mount_point); 513 513 514 - struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, 515 - struct proc_dir_entry *parent, 516 - const struct file_operations *proc_fops, 517 - void *data) 514 + struct proc_dir_entry *proc_create_reg(const char *name, umode_t mode, 515 + struct proc_dir_entry **parent, void *data) 518 516 { 519 - struct proc_dir_entry *pde; 517 + struct proc_dir_entry *p; 518 + 520 519 if ((mode & S_IFMT) == 0) 521 520 mode |= S_IFREG; 522 - 523 - if (!S_ISREG(mode)) { 524 - WARN_ON(1); /* use proc_mkdir() */ 521 + if ((mode & S_IALLUGO) == 0) 522 + mode |= S_IRUGO; 523 + if (WARN_ON_ONCE(!S_ISREG(mode))) 525 524 return NULL; 525 + 526 + p = __proc_create(parent, name, mode, 1); 527 + if (p) { 528 + p->proc_iops = &proc_file_inode_operations; 529 + p->data = data; 526 530 } 531 + return p; 532 + } 533 + 534 + struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, 535 + struct proc_dir_entry *parent, 536 + const struct file_operations *proc_fops, void *data) 537 + { 538 + struct proc_dir_entry *p; 527 539 528 540 BUG_ON(proc_fops == NULL); 529 541 530 - if ((mode & S_IALLUGO) == 0) 531 - mode |= S_IRUGO; 532 - pde = __proc_create(&parent, name, mode, 1); 533 - if (!pde) 534 - goto out; 535 - pde->proc_fops = proc_fops; 536 - pde->data = data; 537 - pde->proc_iops = &proc_file_inode_operations; 538 - return proc_register(parent, pde); 539 - out: 540 - return NULL; 542 + p = proc_create_reg(name, mode, &parent, data); 543 + if (!p) 544 + return NULL; 545 + p->proc_fops = proc_fops; 546 + return proc_register(parent, p); 541 547 } 542 548 EXPORT_SYMBOL(proc_create_data); 543 549
+2
fs/proc/internal.h
··· 162 162 /* 163 163 * generic.c 164 164 */ 165 + struct proc_dir_entry *proc_create_reg(const char *name, umode_t mode, 166 + struct proc_dir_entry **parent, void *data); 165 167 struct proc_dir_entry *proc_register(struct proc_dir_entry *dir, 166 168 struct proc_dir_entry *dp); 167 169 extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);