Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154286836
D34090.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D34090.id.diff
View Options
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -56,6 +56,7 @@
#include <sys/kernel.h>
#include <sys/limits.h>
#include <sys/lock.h>
+#include <sys/lockf.h>
#include <sys/malloc.h>
#include <sys/mount.h>
#include <sys/mutex.h>
@@ -4085,6 +4086,40 @@
CTLFLAG_RD|CTLFLAG_CAPRD|CTLFLAG_MPSAFE, sysctl_kern_proc_nfds,
"Number of open file descriptors");
+struct lock_info {
+ struct xfile *xf;
+ u_int flags;
+};
+
+static int
+lock_iterate(struct vnode *vn, struct flock *lk, void *arg)
+{
+ struct lock_info *lk_info;
+
+ lk_info = (struct lock_info *)arg;
+ if (lk->l_sysid == 0 && lk_info->xf->xf_pid == lk->l_pid) {
+ if (lk->l_type == F_RDLCK)
+ lk_info->flags |= O_SHLOCK;
+ if (lk->l_type == F_WRLCK)
+ lk_info->flags |= O_EXLOCK;
+ if (lk->l_start == 0 && lk->l_len == 0)
+ lk_info->flags |= O_LOCKWHOLEFILE;
+ }
+ return 0;
+}
+
+static u_int
+get_lock_flags(struct xfile *xf)
+{
+ int ret;
+ struct lock_info lk_info;
+
+ lk_info.xf = xf;
+ lk_info.flags = 0;
+ ret = lf_iteratelocks_vnode((struct vnode *)xf->xf_vnode, lock_iterate, &lk_info);
+ return lk_info.flags;
+}
+
/*
* Get file structures globally.
*/
@@ -4155,6 +4190,8 @@
xf.xf_msgcount = 0;
xf.xf_offset = foffset_get(fp);
xf.xf_flag = fp->f_flag;
+ if (xf.xf_type == DTYPE_VNODE && fp->f_ops != &path_fileops)
+ xf.xf_flag |= get_lock_flags(&xf);
error = SYSCTL_OUT(req, &xf, sizeof(xf));
if (error)
break;
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -2325,8 +2325,11 @@
static int
kqueue_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp)
{
-
+ struct kqueue *kq = fp->f_data;
kif->kf_type = KF_TYPE_KQUEUE;
+ kif->kf_un.kf_kqueue.kf_kqueue_addr = (uintptr_t)kq;
+ kif->kf_un.kf_kqueue.kf_kqueue_count = kq->kq_count;
+ kif->kf_un.kf_kqueue.kf_kqueue_state = kq->kq_state;
return (0);
}
diff --git a/sys/kern/kern_lockf.c b/sys/kern/kern_lockf.c
--- a/sys/kern/kern_lockf.c
+++ b/sys/kern/kern_lockf.c
@@ -1901,7 +1901,7 @@
ldesc->fl.l_len =
lf->lf_end - lf->lf_start + 1;
ldesc->fl.l_whence = SEEK_SET;
- ldesc->fl.l_type = F_UNLCK;
+ ldesc->fl.l_type = lf->lf_type;
ldesc->fl.l_pid = lf->lf_owner->lo_pid;
ldesc->fl.l_sysid = sysid;
STAILQ_INSERT_TAIL(&locks, ldesc, link);
@@ -1968,7 +1968,7 @@
ldesc->fl.l_len =
lf->lf_end - lf->lf_start + 1;
ldesc->fl.l_whence = SEEK_SET;
- ldesc->fl.l_type = F_UNLCK;
+ ldesc->fl.l_type = lf->lf_type;
ldesc->fl.l_pid = lf->lf_owner->lo_pid;
ldesc->fl.l_sysid = lf->lf_owner->lo_sysid;
STAILQ_INSERT_TAIL(&locks, ldesc, link);
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -1614,6 +1614,9 @@
kif->kf_un.kf_pipe.kf_pipe_addr = (uintptr_t)pi;
kif->kf_un.kf_pipe.kf_pipe_peer = (uintptr_t)pi->pipe_peer;
kif->kf_un.kf_pipe.kf_pipe_buffer_cnt = pi->pipe_buffer.cnt;
+ kif->kf_un.kf_pipe.kf_pipe_buffer_in = pi->pipe_buffer.in;
+ kif->kf_un.kf_pipe.kf_pipe_buffer_out = pi->pipe_buffer.out;
+ kif->kf_un.kf_pipe.kf_pipe_buffer_size = pi->pipe_buffer.size;
return (0);
}
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -387,6 +387,10 @@
inpcb = (struct inpcb *)(so->so_pcb);
kif->kf_un.kf_sock.kf_sock_inpcb =
(uintptr_t)inpcb->inp_ppcb;
+ kif->kf_un.kf_sock.kf_sock_rcv_sb_state =
+ so->so_rcv.sb_state;
+ kif->kf_un.kf_sock.kf_sock_snd_sb_state =
+ so->so_snd.sb_state;
kif->kf_un.kf_sock.kf_sock_sendq =
sbused(&so->so_snd);
kif->kf_un.kf_sock.kf_sock_recvq =
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -4586,7 +4586,6 @@
#endif /* !BURN_BRIDGES */
#define KINFO_VNODESLOP 10
-#ifdef notyet
/*
* Dump vnode list (via sysctl).
*/
@@ -4623,17 +4622,18 @@
break;
vref(vp);
xvn[n].xv_size = sizeof *xvn;
- xvn[n].xv_vnode = vp;
+ xvn[n].xv_vnode = (uint64_t)vp;
xvn[n].xv_id = 0; /* XXX compat */
#define XV_COPY(field) xvn[n].xv_##field = vp->v_##field
XV_COPY(usecount);
XV_COPY(writecount);
XV_COPY(holdcnt);
- XV_COPY(mount);
- XV_COPY(numoutput);
XV_COPY(type);
#undef XV_COPY
xvn[n].xv_flag = vp->v_vflag;
+ xvn[n].xv_mount = (uint64_t)vp->v_mount;
+ xvn[n].xv_numoutput = (int32_t)vp->v_writecount;
+ xvn[n].xv_lockf = (uint64_t)vp->v_lockf;
switch (vp->v_type) {
case VREG:
@@ -4649,10 +4649,10 @@
xvn[n].xv_dev = dev2udev(vp->v_rdev);
break;
case VSOCK:
- xvn[n].xv_socket = vp->v_socket;
+ xvn[n].xv_socket = (uint64_t)vp->v_unpcb;
break;
case VFIFO:
- xvn[n].xv_fifo = vp->v_fifoinfo;
+ xvn[n].xv_fifo = (uint64_t)vp->v_fifoinfo;
break;
case VNON:
case VBAD:
@@ -4680,7 +4680,6 @@
SYSCTL_PROC(_kern, KERN_VNODE, vnode, CTLTYPE_OPAQUE | CTLFLAG_RD |
CTLFLAG_MPSAFE, 0, 0, sysctl_vnode, "S,xvnode",
"");
-#endif
static void
unmount_or_warn(struct mount *mp)
diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h
--- a/sys/sys/fcntl.h
+++ b/sys/sys/fcntl.h
@@ -145,6 +145,10 @@
#define O_EMPTY_PATH 0x02000000
#endif
+#if __BSD_VISIBLE
+#define O_LOCKWHOLEFILE 0x04000000 /* the O_SHLOCK/O_EXLOCK applies to the entire file */
+#endif
+
/*
* XXX missing O_RSYNC.
*/
diff --git a/sys/sys/param.h b/sys/sys/param.h
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -76,7 +76,7 @@
* cannot include sys/param.h and should only be updated here.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1400051
+#define __FreeBSD_version 1400052
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/sys/user.h b/sys/sys/user.h
--- a/sys/sys/user.h
+++ b/sys/sys/user.h
@@ -420,8 +420,9 @@
uint64_t kf_pipe_addr;
uint64_t kf_pipe_peer;
uint32_t kf_pipe_buffer_cnt;
- /* Round to 64 bit alignment. */
- uint32_t kf_pipe_pad0[3];
+ uint32_t kf_pipe_buffer_in;
+ uint32_t kf_pipe_buffer_out;
+ uint32_t kf_pipe_buffer_size;
} kf_pipe;
struct {
uint32_t kf_spareint[4];
@@ -441,6 +442,11 @@
uint64_t kf_eventfd_value;
uint32_t kf_eventfd_flags;
} kf_eventfd;
+ struct {
+ uint64_t kf_kqueue_addr;
+ int32_t kf_kqueue_count;
+ int32_t kf_kqueue_state;
+ } kf_kqueue;
} kf_un;
};
uint16_t kf_status; /* Status flags. */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -197,20 +197,21 @@
* Userland version of struct vnode, for sysctl.
*/
struct xvnode {
- size_t xv_size; /* sizeof(struct xvnode) */
- void *xv_vnode; /* address of real vnode */
- u_long xv_flag; /* vnode vflags */
- int xv_usecount; /* reference count of users */
- int xv_writecount; /* reference count of writers */
- int xv_holdcnt; /* page & buffer references */
- u_long xv_id; /* capability identifier */
- void *xv_mount; /* address of parent mount */
- long xv_numoutput; /* num of writes in progress */
- enum vtype xv_type; /* vnode type */
+ ksize_t xv_size; /* sizeof(struct xvnode) */
+ uint64_t xv_vnode; /* address of real vnode */
+ uint32_t xv_flag; /* vnode vflags */
+ int xv_usecount; /* reference count of users */
+ int xv_writecount; /* reference count of writers */
+ int xv_holdcnt; /* page & buffer references */
+ uint64_t xv_id; /* capability identifier */
+ uint64_t xv_mount; /* address of parent mount */
+ int32_t xv_numoutput; /* num of writes in progress */
+ uint32_t xv_type; /* vnode type */
+ uint64_t xv_lockf; /* byte-level advisory lock list */
union {
- void *xvu_socket; /* unpcb, if VSOCK */
- void *xvu_fifo; /* fifo, if VFIFO */
- dev_t xvu_rdev; /* maj/min, if VBLK/VCHR */
+ uint64_t xvu_socket; /* unpcb, if VSOCK */
+ uint64_t xvu_fifo; /* fifo, if VFIFO */
+ dev_t xvu_rdev; /* maj/min, if VBLK/VCHR */
struct {
dev_t xvu_dev; /* device, if VDIR/VREG/VLNK */
ino_t xvu_ino; /* id, if VDIR/VREG/VLNK */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 28, 3:04 PM (10 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32286770
Default Alt Text
D34090.id.diff (7 KB)
Attached To
Mode
D34090: Kernel changes needed for lsof to work using only user mode APIs
Attached
Detach File
Event Timeline
Log In to Comment