pseudofs: return errors from pfs_create_*()

In D52038, we kind of guess at the reason that pfs_create_dir() failed,
which isn't great: it could be EEXISTS, or it could even be ENOMEM.

Change the pfs_create_*() interfaces to return an error and use a double
pointer to return the new node as requested.  Outside of the changes
in sys/fs/pseudofs, this diff is the result of running the added
coccinelle script against in-tree pseudofs and fixing all of the
style(9) violations that spatch added.

We set *opn to NULL in the failure cases to avoid breaking callers that
did actually error-check their results, since the cocci patch does not
attempt to handle that in any way.

Reviewed by:	des (previous version), kib
Differential Revision:	https://reviews.freebsd.org/D52157
This commit is contained in:
Kyle Evans
2025-09-03 21:08:52 -05:00
parent 65059dd2b6
commit a2f08d0ddc
8 changed files with 325 additions and 266 deletions
+5 -3
View File
@@ -206,7 +206,7 @@ debugfs_create_file(const char *name, umode_t mode,
pnode = debugfs_root;
flags = fops->write ? PFS_RDWR : PFS_RD;
dnode->d_pfs_node = pfs_create_file(pnode, name, debugfs_fill,
pfs_create_file(pnode, &dnode->d_pfs_node, name, debugfs_fill,
debugfs_attr, NULL, debugfs_destroy, flags | PFS_NOWAIT);
if (dnode->d_pfs_node == NULL) {
free(dm, M_DFSINT);
@@ -283,7 +283,8 @@ debugfs_create_dir(const char *name, struct dentry *parent)
else
pnode = debugfs_root;
dnode->d_pfs_node = pfs_create_dir(pnode, name, debugfs_attr, NULL, debugfs_destroy, PFS_RD | PFS_NOWAIT);
pfs_create_dir(pnode, &dnode->d_pfs_node, name, debugfs_attr, NULL,
debugfs_destroy, PFS_RD | PFS_NOWAIT);
if (dnode->d_pfs_node == NULL) {
free(dm, M_DFSINT);
return (NULL);
@@ -316,7 +317,8 @@ debugfs_create_symlink(const char *name, struct dentry *parent,
else
pnode = debugfs_root;
dnode->d_pfs_node = pfs_create_link(pnode, name, &debugfs_fill_data, NULL, NULL, NULL, PFS_NOWAIT);
pfs_create_link(pnode, &dnode->d_pfs_node, name, &debugfs_fill_data,
NULL, NULL, NULL, PFS_NOWAIT);
if (dnode->d_pfs_node == NULL)
goto fail;
dnode->d_pfs_node->pn_data = dm;
+128 -128
View File
@@ -2320,165 +2320,165 @@ linprocfs_init(PFS_INIT_ARGS)
root = pi->pi_root;
/* /proc/... */
pfs_create_file(root, "cmdline", &linprocfs_docmdline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "cpuinfo", &linprocfs_docpuinfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "devices", &linprocfs_dodevices,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "filesystems", &linprocfs_dofilesystems,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "loadavg", &linprocfs_doloadavg,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "meminfo", &linprocfs_domeminfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "modules", &linprocfs_domodules,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "mounts", &linprocfs_domtab,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "mtab", &linprocfs_domtab,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "partitions", &linprocfs_dopartitions,
NULL, NULL, NULL, PFS_RD);
pfs_create_link(root, "self", &procfs_docurproc,
NULL, NULL, NULL, 0);
pfs_create_file(root, "stat", &linprocfs_dostat,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "swaps", &linprocfs_doswaps,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "uptime", &linprocfs_douptime,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "version", &linprocfs_doversion,
pfs_create_file(root, NULL, "cmdline", &linprocfs_docmdline, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "cpuinfo", &linprocfs_docpuinfo, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "devices", &linprocfs_dodevices, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "filesystems", &linprocfs_dofilesystems,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, NULL, "loadavg", &linprocfs_doloadavg, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "meminfo", &linprocfs_domeminfo, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "modules", &linprocfs_domodules, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "mounts", &linprocfs_domtab, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "mtab", &linprocfs_domtab, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(root, NULL, "partitions", &linprocfs_dopartitions, NULL,
NULL, NULL, PFS_RD);
pfs_create_link(root, NULL, "self", &procfs_docurproc, NULL, NULL, NULL,
0);
pfs_create_file(root, NULL, "stat", &linprocfs_dostat, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(root, NULL, "swaps", &linprocfs_doswaps, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "uptime", &linprocfs_douptime, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(root, NULL, "version", &linprocfs_doversion, NULL, NULL,
NULL, PFS_RD);
/* /proc/bus/... */
dir = pfs_create_dir(root, "bus", NULL, NULL, NULL, 0);
dir = pfs_create_dir(dir, "pci", NULL, NULL, NULL, 0);
dir = pfs_create_dir(dir, "devices", NULL, NULL, NULL, 0);
pfs_create_dir(root, &dir, "bus", NULL, NULL, NULL, 0);
pfs_create_dir(dir, &dir, "pci", NULL, NULL, NULL, 0);
pfs_create_dir(dir, &dir, "devices", NULL, NULL, NULL, 0);
/* /proc/net/... */
dir = pfs_create_dir(root, "net", NULL, NULL, NULL, 0);
pfs_create_file(dir, "dev", &linprocfs_donetdev,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "route", &linprocfs_donetroute,
NULL, NULL, NULL, PFS_RD);
pfs_create_dir(root, &dir, "net", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "dev", &linprocfs_donetdev, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(dir, NULL, "route", &linprocfs_donetroute, NULL, NULL,
NULL, PFS_RD);
/* /proc/<pid>/... */
dir = pfs_create_dir(root, "pid", NULL, NULL, NULL, PFS_PROCDEP);
pfs_create_file(dir, "cmdline", &linprocfs_doproccmdline,
pfs_create_dir(root, &dir, "pid", NULL, NULL, NULL, PFS_PROCDEP);
pfs_create_file(dir, NULL, "cmdline", &linprocfs_doproccmdline, NULL,
NULL, NULL, PFS_RD);
pfs_create_link(dir, NULL, "cwd", &linprocfs_doproccwd, NULL, NULL,
NULL, 0);
pfs_create_file(dir, NULL, "environ", &linprocfs_doprocenviron, NULL,
&procfs_candebug, NULL, PFS_RD);
pfs_create_link(dir, NULL, "exe", &procfs_doprocfile, NULL,
&procfs_notsystem, NULL, 0);
pfs_create_file(dir, NULL, "maps", &linprocfs_doprocmaps, NULL, NULL,
NULL, PFS_RD | PFS_AUTODRAIN);
pfs_create_file(dir, NULL, "mem", &linprocfs_doprocmem, procfs_attr_rw,
&procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, NULL, "mountinfo", &linprocfs_doprocmountinfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_link(dir, "cwd", &linprocfs_doproccwd,
NULL, NULL, NULL, 0);
pfs_create_file(dir, "environ", &linprocfs_doprocenviron,
NULL, &procfs_candebug, NULL, PFS_RD);
pfs_create_link(dir, "exe", &procfs_doprocfile,
NULL, &procfs_notsystem, NULL, 0);
pfs_create_file(dir, "maps", &linprocfs_doprocmaps,
NULL, NULL, NULL, PFS_RD | PFS_AUTODRAIN);
pfs_create_file(dir, "mem", &linprocfs_doprocmem,
procfs_attr_rw, &procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "mountinfo", &linprocfs_doprocmountinfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "mounts", &linprocfs_domtab,
NULL, NULL, NULL, PFS_RD);
pfs_create_link(dir, "root", &linprocfs_doprocroot,
NULL, NULL, NULL, 0);
pfs_create_file(dir, "stat", &linprocfs_doprocstat,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "statm", &linprocfs_doprocstatm,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "status", &linprocfs_doprocstatus,
NULL, NULL, NULL, PFS_RD);
pfs_create_link(dir, "fd", &linprocfs_dofdescfs,
NULL, NULL, NULL, 0);
pfs_create_file(dir, "auxv", &linprocfs_doauxv,
NULL, &procfs_candebug, NULL, PFS_RD|PFS_RAWRD);
pfs_create_file(dir, "limits", &linprocfs_doproclimits,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "oom_score_adj", &linprocfs_do_oom_score_adj,
pfs_create_file(dir, NULL, "mounts", &linprocfs_domtab, NULL, NULL,
NULL, PFS_RD);
pfs_create_link(dir, NULL, "root", &linprocfs_doprocroot, NULL, NULL,
NULL, 0);
pfs_create_file(dir, NULL, "stat", &linprocfs_doprocstat, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "statm", &linprocfs_doprocstatm, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "status", &linprocfs_doprocstatus, NULL,
NULL, NULL, PFS_RD);
pfs_create_link(dir, NULL, "fd", &linprocfs_dofdescfs, NULL, NULL, NULL,
0);
pfs_create_file(dir, NULL, "auxv", &linprocfs_doauxv, NULL,
&procfs_candebug, NULL, PFS_RD | PFS_RAWRD);
pfs_create_file(dir, NULL, "limits", &linprocfs_doproclimits, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "oom_score_adj", &linprocfs_do_oom_score_adj,
procfs_attr_rw, &procfs_candebug, NULL, PFS_RDWR);
/* /proc/<pid>/task/... */
dir = pfs_create_dir(dir, "task", linprocfs_dotaskattr, NULL, NULL, 0);
pfs_create_file(dir, ".dummy", &linprocfs_dotaskdummy,
NULL, NULL, NULL, PFS_RD);
pfs_create_dir(dir, &dir, "task", linprocfs_dotaskattr, NULL, NULL, 0);
pfs_create_file(dir, NULL, ".dummy", &linprocfs_dotaskdummy, NULL, NULL,
NULL, PFS_RD);
/* /proc/scsi/... */
dir = pfs_create_dir(root, "scsi", NULL, NULL, NULL, 0);
pfs_create_file(dir, "device_info", &linprocfs_doscsidevinfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "scsi", &linprocfs_doscsiscsi,
pfs_create_dir(root, &dir, "scsi", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "device_info", &linprocfs_doscsidevinfo,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "scsi", &linprocfs_doscsiscsi, NULL, NULL,
NULL, PFS_RD);
/* /proc/sys/... */
sys = pfs_create_dir(root, "sys", NULL, NULL, NULL, 0);
pfs_create_dir(root, &sys, "sys", NULL, NULL, NULL, 0);
/* /proc/sys/kernel/... */
dir = pfs_create_dir(sys, "kernel", NULL, NULL, NULL, 0);
pfs_create_file(dir, "osrelease", &linprocfs_doosrelease,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "ostype", &linprocfs_doostype,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "version", &linprocfs_doosbuild,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msgmax", &linprocfs_domsgmax,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msgmni", &linprocfs_domsgmni,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msgmnb", &linprocfs_domsgmnb,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "ngroups_max", &linprocfs_dongroups_max,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "pid_max", &linprocfs_dopid_max,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "sem", &linprocfs_dosem,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "shmall", &linprocfs_doshmall,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "shmmax", &linprocfs_doshmmax,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "shmmni", &linprocfs_doshmmni,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "tainted", &linprocfs_dotainted,
pfs_create_dir(sys, &dir, "kernel", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "osrelease", &linprocfs_doosrelease, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "ostype", &linprocfs_doostype, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "version", &linprocfs_doosbuild, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "msgmax", &linprocfs_domsgmax, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "msgmni", &linprocfs_domsgmni, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "msgmnb", &linprocfs_domsgmnb, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "ngroups_max", &linprocfs_dongroups_max,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "pid_max", &linprocfs_dopid_max, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "sem", &linprocfs_dosem, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(dir, NULL, "shmall", &linprocfs_doshmall, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "shmmax", &linprocfs_doshmmax, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "shmmni", &linprocfs_doshmmni, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "tainted", &linprocfs_dotainted, NULL, NULL,
NULL, PFS_RD);
/* /proc/sys/kernel/random/... */
dir = pfs_create_dir(dir, "random", NULL, NULL, NULL, 0);
pfs_create_file(dir, "uuid", &linprocfs_douuid,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "boot_id", &linprocfs_doboot_id,
NULL, NULL, NULL, PFS_RD);
pfs_create_dir(dir, &dir, "random", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "uuid", &linprocfs_douuid, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(dir, NULL, "boot_id", &linprocfs_doboot_id, NULL, NULL,
NULL, PFS_RD);
/* /proc/sys/vm/.... */
dir = pfs_create_dir(sys, "vm", NULL, NULL, NULL, 0);
pfs_create_file(dir, "min_free_kbytes", &linprocfs_dominfree,
pfs_create_dir(sys, &dir, "vm", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "min_free_kbytes", &linprocfs_dominfree,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "max_map_count", &linprocfs_domax_map_cnt,
pfs_create_file(dir, NULL, "max_map_count", &linprocfs_domax_map_cnt,
NULL, NULL, NULL, PFS_RD);
/* /proc/sysvipc/... */
dir = pfs_create_dir(root, "sysvipc", NULL, NULL, NULL, 0);
pfs_create_file(dir, "msg", &linprocfs_dosysvipc_msg,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "sem", &linprocfs_dosysvipc_sem,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "shm", &linprocfs_dosysvipc_shm,
NULL, NULL, NULL, PFS_RD);
pfs_create_dir(root, &dir, "sysvipc", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "msg", &linprocfs_dosysvipc_msg, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "sem", &linprocfs_dosysvipc_sem, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "shm", &linprocfs_dosysvipc_shm, NULL, NULL,
NULL, PFS_RD);
/* /proc/sys/fs/... */
dir = pfs_create_dir(sys, "fs", NULL, NULL, NULL, 0);
pfs_create_dir(sys, &dir, "fs", NULL, NULL, NULL, 0);
/* /proc/sys/fs/mqueue/... */
dir = pfs_create_dir(dir, "mqueue", NULL, NULL, NULL, 0);
pfs_create_file(dir, "msg_default", &linprocfs_domqueue_msg_default,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msgsize_default", &linprocfs_domqueue_msgsize_default,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msg_max", &linprocfs_domqueue_msg_max,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "msgsize_max", &linprocfs_domqueue_msgsize_max,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "queues_max", &linprocfs_domqueue_queues_max,
pfs_create_dir(dir, &dir, "mqueue", NULL, NULL, NULL, 0);
pfs_create_file(dir, NULL, "msg_default",
&linprocfs_domqueue_msg_default, NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "msgsize_default",
&linprocfs_domqueue_msgsize_default, NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "msg_max", &linprocfs_domqueue_msg_max, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "msgsize_max",
&linprocfs_domqueue_msgsize_max, NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, NULL, "queues_max", &linprocfs_domqueue_queues_max,
NULL, NULL, NULL, PFS_RD);
return (0);
+60 -59
View File
@@ -294,43 +294,43 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, struct pfs_node *scsi,
dinfo->cfg.func);
strcat(new_path, "/");
strcat(new_path, device);
dir = pfs_create_dir(dir, device,
error = pfs_create_dir(dir, &dir, device,
NULL, NULL, NULL, 0);
if (dir == NULL) {
error = EEXIST;
if (error != 0)
goto out;
}
cur_file = pfs_create_file(dir, "vendor",
pfs_create_dir(dir, &dir, device, NULL, NULL,
NULL, 0);
pfs_create_file(dir, &cur_file, "vendor",
&linsysfs_fill_vendor, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir, "device",
pfs_create_file(dir, &cur_file, "device",
&linsysfs_fill_device, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir,
pfs_create_file(dir, &cur_file,
"subsystem_vendor",
&linsysfs_fill_subvendor, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir,
pfs_create_file(dir, &cur_file,
"subsystem_device",
&linsysfs_fill_subdevice, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir, "revision",
pfs_create_file(dir, &cur_file, "revision",
&linsysfs_fill_revid, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir, "config",
pfs_create_file(dir, &cur_file, "config",
&linsysfs_fill_config, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_file(dir, "uevent",
&linsysfs_fill_uevent_pci, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, &cur_file, "uevent",
&linsysfs_fill_uevent_pci, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
cur_file = pfs_create_link(dir, "subsystem",
pfs_create_link(dir, &cur_file, "subsystem",
&linsysfs_fill_data, NULL, NULL, NULL, 0);
/* libdrm just checks that the link ends in "/pci" */
cur_file->pn_data = "/sys/bus/pci";
@@ -340,8 +340,8 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, struct pfs_node *scsi,
sprintf(host, "host%d", host_number++);
strcat(new_path, "/");
strcat(new_path, host);
pfs_create_dir(dir, host,
NULL, NULL, NULL, 0);
pfs_create_dir(dir, NULL, host, NULL,
NULL, NULL, 0);
scsi_host = malloc(sizeof(
struct scsi_host_queue),
M_DEVBUF, M_WAITOK);
@@ -353,13 +353,13 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, struct pfs_node *scsi,
strlen(new_path) + 1);
scsi_host->name = "unknown";
sub_dir = pfs_create_dir(scsi, host,
pfs_create_dir(scsi, &sub_dir, host,
NULL, NULL, NULL, 0);
pfs_create_link(sub_dir, "device",
&linsysfs_link_scsi_host,
NULL, NULL, NULL, 0);
pfs_create_file(sub_dir, "proc_name",
&linsysfs_scsiname,
pfs_create_link(sub_dir, NULL, "device",
&linsysfs_link_scsi_host, NULL,
NULL, NULL, 0);
pfs_create_file(sub_dir, NULL,
"proc_name", &linsysfs_scsiname,
NULL, NULL, NULL, PFS_RD);
scsi_host->name
= linux_driver_get_name_dev(dev);
@@ -378,26 +378,27 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, struct pfs_node *scsi,
device_get_unit(dev) >= 0) {
dinfo = device_get_ivars(parent);
if (dinfo != NULL && dinfo->cfg.baseclass == PCIC_DISPLAY) {
pfs_create_dir(dir, "drm", NULL, NULL, NULL, 0);
pfs_create_dir(dir, NULL, "drm", NULL, NULL,
NULL, 0);
sprintf(devname, "226:%d",
device_get_unit(dev));
sub_dir = pfs_create_dir(chardev,
devname, NULL, NULL, NULL, 0);
cur_file = pfs_create_link(sub_dir,
"device", &linsysfs_fill_vgapci, NULL,
NULL, NULL, PFS_RD);
pfs_create_dir(chardev, &sub_dir, devname, NULL,
NULL, NULL, 0);
pfs_create_link(sub_dir, &cur_file, "device",
&linsysfs_fill_vgapci, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dir;
cur_file = pfs_create_file(sub_dir,
"uevent", &linsysfs_fill_uevent_drm, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(sub_dir, &cur_file, "uevent",
&linsysfs_fill_uevent_drm, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dev;
sprintf(devname, "card%d",
device_get_unit(dev));
sub_dir = pfs_create_dir(drm,
devname, NULL, NULL, NULL, 0);
cur_file = pfs_create_link(sub_dir,
"device", &linsysfs_fill_vgapci, NULL,
NULL, NULL, PFS_RD);
pfs_create_dir(drm, &sub_dir, devname, NULL,
NULL, NULL, 0);
pfs_create_link(sub_dir, &cur_file, "device",
&linsysfs_fill_vgapci, NULL, NULL, NULL,
PFS_RD);
cur_file->pn_data = (void*)dir;
}
}
@@ -479,10 +480,10 @@ linsysfs_listcpus(struct pfs_node *dir)
for (i = 0; i < mp_ncpus; ++i) {
/* /sys/devices/system/cpu/cpuX */
sprintf(name, "cpu%d", i);
cpu = pfs_create_dir(dir, name, NULL, NULL, NULL, 0);
pfs_create_dir(dir, &cpu, name, NULL, NULL, NULL, 0);
pfs_create_file(cpu, "online", &linsysfs_cpuxonline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(cpu, NULL, "online", &linsysfs_cpuxonline, NULL,
NULL, NULL, PFS_RD);
}
free(name, M_TEMP);
}
@@ -509,24 +510,24 @@ linsysfs_init(PFS_INIT_ARGS)
root = pi->pi_root;
/* /sys/bus/... */
dir = pfs_create_dir(root, "bus", NULL, NULL, NULL, 0);
pfs_create_dir(root, &dir, "bus", NULL, NULL, NULL, 0);
/* /sys/class/... */
class = pfs_create_dir(root, "class", NULL, NULL, NULL, 0);
scsi = pfs_create_dir(class, "scsi_host", NULL, NULL, NULL, 0);
drm = pfs_create_dir(class, "drm", NULL, NULL, NULL, 0);
pfs_create_dir(class, "power_supply", NULL, NULL, NULL, 0);
pfs_create_dir(root, &class, "class", NULL, NULL, NULL, 0);
pfs_create_dir(class, &scsi, "scsi_host", NULL, NULL, NULL, 0);
pfs_create_dir(class, &drm, "drm", NULL, NULL, NULL, 0);
pfs_create_dir(class, NULL, "power_supply", NULL, NULL, NULL, 0);
/* /sys/class/net/.. */
net = pfs_create_dir(class, "net", NULL, NULL, NULL, 0);
pfs_create_dir(class, &net, "net", NULL, NULL, NULL, 0);
/* /sys/dev/... */
devdir = pfs_create_dir(root, "dev", NULL, NULL, NULL, 0);
chardev = pfs_create_dir(devdir, "char", NULL, NULL, NULL, 0);
pfs_create_dir(root, &devdir, "dev", NULL, NULL, NULL, 0);
pfs_create_dir(devdir, &chardev, "char", NULL, NULL, NULL, 0);
/* /sys/devices/... */
dir = pfs_create_dir(root, "devices", NULL, NULL, NULL, 0);
pci = pfs_create_dir(dir, "pci0000:00", NULL, NULL, NULL, 0);
pfs_create_dir(root, &dir, "devices", NULL, NULL, NULL, 0);
pfs_create_dir(dir, &pci, "pci0000:00", NULL, NULL, NULL, 0);
devclass = devclass_find("root");
if (devclass == NULL) {
@@ -541,24 +542,24 @@ linsysfs_init(PFS_INIT_ARGS)
linsysfs_run_bus(dev, pci, scsi, chardev, drm, "/pci0000:00", "0000");
/* /sys/devices/system */
sys = pfs_create_dir(dir, "system", NULL, NULL, NULL, 0);
pfs_create_dir(dir, &sys, "system", NULL, NULL, NULL, 0);
/* /sys/devices/system/cpu */
cpu = pfs_create_dir(sys, "cpu", NULL, NULL, NULL, 0);
pfs_create_dir(sys, &cpu, "cpu", NULL, NULL, NULL, 0);
pfs_create_file(cpu, "online", &linsysfs_cpuonline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(cpu, "possible", &linsysfs_cpuonline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(cpu, "present", &linsysfs_cpuonline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(cpu, NULL, "online", &linsysfs_cpuonline, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(cpu, NULL, "possible", &linsysfs_cpuonline, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(cpu, NULL, "present", &linsysfs_cpuonline, NULL, NULL,
NULL, PFS_RD);
linsysfs_listcpus(cpu);
/* /sys/kernel */
kernel = pfs_create_dir(root, "kernel", NULL, NULL, NULL, 0);
pfs_create_dir(root, &kernel, "kernel", NULL, NULL, NULL, 0);
/* /sys/kernel/debug, mountpoint for lindebugfs. */
pfs_create_dir(kernel, "debug", NULL, NULL, NULL, 0);
pfs_create_dir(kernel, NULL, "debug", NULL, NULL, NULL, 0);
linsysfs_net_init();
+12 -12
View File
@@ -237,22 +237,22 @@ linsysfs_net_addif(if_t ifp, void *arg)
nic = pfs_find_node(dir, ifname);
if (nic == NULL) {
nic = pfs_create_dir(dir, ifname, NULL, linsysfs_if_visible,
pfs_create_dir(dir, &nic, ifname, NULL, linsysfs_if_visible,
NULL, 0);
pfs_create_file(nic, "address", &linsysfs_if_addr,
pfs_create_file(nic, NULL, "address", &linsysfs_if_addr, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(nic, NULL, "addr_len", &linsysfs_if_addrlen,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "addr_len", &linsysfs_if_addrlen,
pfs_create_file(nic, NULL, "flags", &linsysfs_if_flags, NULL,
NULL, NULL, PFS_RD);
pfs_create_file(nic, NULL, "ifindex", &linsysfs_if_ifindex,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "flags", &linsysfs_if_flags,
pfs_create_file(nic, NULL, "mtu", &linsysfs_if_mtu, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(nic, NULL, "tx_queue_len", &linsysfs_if_txq_len,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "ifindex", &linsysfs_if_ifindex,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "mtu", &linsysfs_if_mtu,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "tx_queue_len", &linsysfs_if_txq_len,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, "type", &linsysfs_if_type,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(nic, NULL, "type", &linsysfs_if_type, NULL,
NULL, NULL, PFS_RD);
}
/*
* There is a small window between registering the if_arrival
+32 -32
View File
@@ -156,42 +156,42 @@ procfs_init(PFS_INIT_ARGS)
root = pi->pi_root;
pfs_create_link(root, "curproc", procfs_docurproc,
NULL, NULL, NULL, 0);
pfs_create_link(root, "self", procfs_docurproc,
NULL, NULL, NULL, 0);
pfs_create_link(root, NULL, "curproc", procfs_docurproc, NULL, NULL,
NULL, 0);
pfs_create_link(root, NULL, "self", procfs_docurproc, NULL, NULL, NULL,
0);
dir = pfs_create_dir(root, "pid",
procfs_attr_all_rx, NULL, NULL, PFS_PROCDEP);
pfs_create_file(dir, "cmdline", procfs_doproccmdline,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "dbregs", procfs_doprocdbregs,
pfs_create_dir(root, &dir, "pid", procfs_attr_all_rx, NULL, NULL,
PFS_PROCDEP);
pfs_create_file(dir, NULL, "cmdline", procfs_doproccmdline, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "dbregs", procfs_doprocdbregs,
procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "etype", procfs_doproctype,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "fpregs", procfs_doprocfpregs,
pfs_create_file(dir, NULL, "etype", procfs_doproctype, NULL, NULL, NULL,
PFS_RD);
pfs_create_file(dir, NULL, "fpregs", procfs_doprocfpregs,
procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "map", procfs_doprocmap,
NULL, procfs_notsystem, NULL, PFS_RD);
pfs_create_file(dir, "mem", procfs_doprocmem,
procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "note", procfs_doprocnote,
procfs_attr_w, procfs_candebug, NULL, PFS_WR);
pfs_create_file(dir, "notepg", procfs_doprocnote,
procfs_attr_w, procfs_candebug, NULL, PFS_WR);
pfs_create_file(dir, "regs", procfs_doprocregs,
procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "rlimit", procfs_doprocrlimit,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "status", procfs_doprocstatus,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "osrel", procfs_doosrel,
procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR);
pfs_create_file(dir, NULL, "map", procfs_doprocmap, NULL,
procfs_notsystem, NULL, PFS_RD);
pfs_create_file(dir, NULL, "mem", procfs_doprocmem, procfs_attr_rw,
procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, NULL, "note", procfs_doprocnote, procfs_attr_w,
procfs_candebug, NULL, PFS_WR);
pfs_create_file(dir, NULL, "notepg", procfs_doprocnote, procfs_attr_w,
procfs_candebug, NULL, PFS_WR);
pfs_create_file(dir, NULL, "regs", procfs_doprocregs, procfs_attr_rw,
procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, NULL, "rlimit", procfs_doprocrlimit, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "status", procfs_doprocstatus, NULL, NULL,
NULL, PFS_RD);
pfs_create_file(dir, NULL, "osrel", procfs_doosrel, procfs_attr_rw,
procfs_candebug, NULL, PFS_RDWR);
pfs_create_link(dir, "file", procfs_doprocfile,
NULL, procfs_notsystem, NULL, 0);
pfs_create_link(dir, "exe", procfs_doprocfile,
NULL, procfs_notsystem, NULL, 0);
pfs_create_link(dir, NULL, "file", procfs_doprocfile, NULL,
procfs_notsystem, NULL, 0);
pfs_create_link(dir, NULL, "exe", procfs_doprocfile, NULL,
procfs_notsystem, NULL, 0);
return (0);
}
+43 -23
View File
@@ -239,81 +239,101 @@ pfs_fixup_dir(struct pfs_node *parent)
/*
* Create a directory
*/
struct pfs_node *
pfs_create_dir(struct pfs_node *parent, const char *name,
pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy,
int flags)
int
pfs_create_dir(struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_attr_t attr, pfs_vis_t vis,
pfs_destroy_t destroy, int flags)
{
struct pfs_node *pn;
struct pfs_node *pdir, *pn;
int rc;
pn = pfs_alloc_node_flags(parent->pn_info, name,
/* Preserve in case the caller is reusing the one pointer for both. */
pdir = parent;
if (opn != NULL)
*opn = NULL;
pn = pfs_alloc_node_flags(pdir->pn_info, name,
(flags & PFS_PROCDEP) ? pfstype_procdir : pfstype_dir, flags);
if (pn == NULL)
return (NULL);
return (ENOMEM);
pn->pn_attr = attr;
pn->pn_vis = vis;
pn->pn_destroy = destroy;
pn->pn_flags = flags;
rc = pfs_add_node(parent, pn);
rc = pfs_add_node(pdir, pn);
if (rc == 0)
rc = pfs_fixup_dir_flags(pn, flags);
if (rc != 0) {
pfs_destroy(pn);
pn = NULL;
} else if (opn != NULL) {
*opn = pn;
}
return (pn);
return (rc);
}
/*
* Create a file
*/
struct pfs_node *
pfs_create_file(struct pfs_node *parent, const char *name, pfs_fill_t fill,
pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy,
int flags)
int
pfs_create_file(struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_fill_t fill, pfs_attr_t attr,
pfs_vis_t vis, pfs_destroy_t destroy, int flags)
{
struct pfs_node *pn;
int rc;
if (opn != NULL)
*opn = NULL;
pn = pfs_alloc_node_flags(parent->pn_info, name, pfstype_file, flags);
if (pn == NULL)
return (NULL);
return (ENOMEM);
pn->pn_fill = fill;
pn->pn_attr = attr;
pn->pn_vis = vis;
pn->pn_destroy = destroy;
pn->pn_flags = flags;
if (pfs_add_node(parent, pn) != 0) {
if ((rc = pfs_add_node(parent, pn)) != 0) {
pfs_destroy(pn);
pn = NULL;
} else if (opn != NULL) {
*opn = pn;
}
return (pn);
return (rc);
}
/*
* Create a symlink
*/
struct pfs_node *
pfs_create_link(struct pfs_node *parent, const char *name, pfs_fill_t fill,
pfs_attr_t attr, pfs_vis_t vis, pfs_destroy_t destroy,
int flags)
int
pfs_create_link(struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_fill_t fill, pfs_attr_t attr,
pfs_vis_t vis, pfs_destroy_t destroy, int flags)
{
struct pfs_node *pn;
int rc;
if (opn != NULL)
*opn = NULL;
pn = pfs_alloc_node_flags(parent->pn_info, name, pfstype_symlink, flags);
if (pn == NULL)
return (NULL);
return (ENOMEM);
pn->pn_fill = fill;
pn->pn_attr = attr;
pn->pn_vis = vis;
pn->pn_destroy = destroy;
pn->pn_flags = flags;
if (pfs_add_node(parent, pn) != 0) {
if ((rc = pfs_add_node(parent, pn)) != 0) {
pfs_destroy(pn);
pn = NULL;
} else if (opn != NULL) {
*opn = pn;
}
return (pn);
return (rc);
}
/*
+10 -9
View File
@@ -260,17 +260,18 @@ int pfs_vfsuninit (struct pfs_info *pi, struct vfsconf *vfc);
/*
* Directory structure construction and manipulation
*/
struct pfs_node *pfs_create_dir (struct pfs_node *parent, const char *name,
int pfs_create_dir (struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_attr_t attr,
pfs_vis_t vis, pfs_destroy_t destroy,
int flags);
int pfs_create_file (struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_fill_t fill,
pfs_attr_t attr, pfs_vis_t vis,
pfs_destroy_t destroy, int flags);
int pfs_create_link (struct pfs_node *parent, struct pfs_node **opn,
const char *name, pfs_fill_t fill,
pfs_attr_t attr, pfs_vis_t vis,
pfs_destroy_t destroy, int flags);
struct pfs_node *pfs_create_file(struct pfs_node *parent, const char *name,
pfs_fill_t fill, pfs_attr_t attr,
pfs_vis_t vis, pfs_destroy_t destroy,
int flags);
struct pfs_node *pfs_create_link(struct pfs_node *parent, const char *name,
pfs_fill_t fill, pfs_attr_t attr,
pfs_vis_t vis, pfs_destroy_t destroy,
int flags);
struct pfs_node *pfs_find_node (struct pfs_node *parent, const char *name);
void pfs_purge (struct pfs_node *pn);
int pfs_destroy (struct pfs_node *pn);
+35
View File
@@ -0,0 +1,35 @@
@ pfs_create_dir_ret_ident @
expression _pfn, E1, E2, E3, E4, E5, E6;
@@
-_pfn = pfs_create_dir(E1, E2, E3, E4, E5, E6);
+pfs_create_dir(E1, &_pfn, E2, E3, E4, E5, E6);
@ pfs_create_file_ret @
expression _pfn, E1, E2, E3, E4, E5, E6, E7;
@@
-_pfn = pfs_create_file(E1, E2, E3, E4, E5, E6, E7);
+pfs_create_file(E1, &_pfn, E2, E3, E4, E5, E6, E7);
@ pfs_create_link_ret @
expression _pfn, E1, E2, E3, E4, E5, E6, E7;
@@
-_pfn = pfs_create_link(E1, E2, E3, E4, E5, E6, E7);
+pfs_create_link(E1, &_pfn, E2, E3, E4, E5, E6, E7);
@ pfs_create_dir_noret @
expression E1, E2, E3, E4, E5, E6;
@@
-pfs_create_dir(E1, E2, E3, E4, E5, E6);
+pfs_create_dir(E1, NULL, E2, E3, E4, E5, E6);
@ pfs_create_file_noret @
expression E1, E2, E3, E4, E5, E6, E7;
@@
-pfs_create_file(E1, E2, E3, E4, E5, E6, E7);
+pfs_create_file(E1, NULL, E2, E3, E4, E5, E6, E7);
@ pfs_create_link_noret @
expression E1, E2, E3, E4, E5, E6, E7;
@@
-pfs_create_link(E1, E2, E3, E4, E5, E6, E7);
+pfs_create_link(E1, NULL, E2, E3, E4, E5, E6, E7);