pseudofs: make readdir work without a pid again
Specifically, the following was broken: $ mount -t procfs procfs /proc $ ls -l /proc r351741 reworked readdir slightly to avoid pfs_node/pidhash LOR, but inadvertently regressed pid == NO_PID; new pfs_lookup_proc() fails for the obvious reasons, and later pfs_visible_proc doesn't capture the pid == NO_PID -> return 1 aspect of pfs_visible. We can infact skip this whole block if we're operating on a directory w/ NO_PID, as it's always visible. Reported by: trasz Reviewed by: mjg Differential Revision: https://reviews.freebsd.org/D21518
This commit is contained in:
parent
f0298be018
commit
f99c5e8d28
@ -809,24 +809,29 @@ pfs_readdir(struct vop_readdir_args *va)
|
||||
if (resid == 0)
|
||||
PFS_RETURN (0);
|
||||
|
||||
if (!pfs_lookup_proc(pid, &proc))
|
||||
proc = NULL;
|
||||
if (pid != NO_PID && !pfs_lookup_proc(pid, &proc))
|
||||
PFS_RETURN (ENOENT);
|
||||
|
||||
sx_slock(&allproc_lock);
|
||||
pfs_lock(pd);
|
||||
PROC_LOCK(proc);
|
||||
|
||||
/* check if the directory is visible to the caller */
|
||||
if (!pfs_visible_proc(curthread, pd, proc)) {
|
||||
_PRELE(proc);
|
||||
PROC_UNLOCK(proc);
|
||||
sx_sunlock(&allproc_lock);
|
||||
pfs_unlock(pd);
|
||||
PFS_RETURN (ENOENT);
|
||||
}
|
||||
KASSERT(pid == NO_PID || proc != NULL,
|
||||
("%s(): no process for pid %lu", __func__, (unsigned long)pid));
|
||||
|
||||
if (pid != NO_PID) {
|
||||
PROC_LOCK(proc);
|
||||
|
||||
/* check if the directory is visible to the caller */
|
||||
if (!pfs_visible_proc(curthread, pd, proc)) {
|
||||
_PRELE(proc);
|
||||
PROC_UNLOCK(proc);
|
||||
sx_sunlock(&allproc_lock);
|
||||
pfs_unlock(pd);
|
||||
PFS_RETURN (ENOENT);
|
||||
}
|
||||
}
|
||||
|
||||
/* skip unwanted entries */
|
||||
for (pn = NULL, p = NULL; offset > 0; offset -= PFS_DELEN) {
|
||||
if (pfs_iterate(curthread, proc, pd, &pn, &p) == -1) {
|
||||
|
Loading…
Reference in New Issue
Block a user