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:
@@ -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
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user