*/
fdp = skap->read_set;
filter = EVFILT_READ;
- fflags = 0;
+ fflags = NOTE_OLDAPI;
if (fdp)
break;
++skap->active_set;
*/
fdp = skap->write_set;
filter = EVFILT_WRITE;
- fflags = 0;
+ fflags = NOTE_OLDAPI;
if (fdp)
break;
++skap->active_set;
*/
fdp = skap->except_set;
filter = EVFILT_EXCEPT;
- fflags = NOTE_OOB;
+ fflags = NOTE_OLDAPI | NOTE_OOB;
if (fdp)
break;
++skap->active_set;
kev = &kevp[*events];
if (pfd->events & (POLLIN | POLLRDNORM)) {
EV_SET(kev++, pfd->fd, EVFILT_READ, EV_ADD|EV_ENABLE,
- 0, 0, (void *)(uintptr_t)
+ NOTE_OLDAPI, 0, (void *)(uintptr_t)
(pkap->lwp->lwp_kqueue_serial + pkap->pfds));
}
if (pfd->events & (POLLOUT | POLLWRNORM)) {
EV_SET(kev++, pfd->fd, EVFILT_WRITE, EV_ADD|EV_ENABLE,
- 0, 0, (void *)(uintptr_t)
+ NOTE_OLDAPI, 0, (void *)(uintptr_t)
(pkap->lwp->lwp_kqueue_serial + pkap->pfds));
}
if (pfd->events & (POLLPRI | POLLRDBAND)) {
EV_SET(kev++, pfd->fd, EVFILT_EXCEPT, EV_ADD|EV_ENABLE,
- NOTE_OOB, 0,
+ NOTE_OLDAPI | NOTE_OOB, 0,
(void *)(uintptr_t)
(pkap->lwp->lwp_kqueue_serial + pkap->pfds));
}
/*
* Flag indicating hint is a signal. Used by EVFILT_SIGNAL, and also
* shared by EVFILT_PROC (all knotes attached to p->p_klist)
+ *
+ * NOTE_OLDAPI is used to signal that standard filters are being called
+ * from the select/poll wrapper.
*/
#define NOTE_SIGNAL 0x08000000
+#define NOTE_OLDAPI 0x04000000 /* select/poll note */
#define FILTEROP_ISFD 0x0001 /* if ident == filedescriptor */
#define FILTEROP_MPSAFE 0x0002
{
struct vnode *vp = (struct vnode *)kn->kn_hook;
struct inode *ip = VTOI(vp);
+ off_t off;
/*
* filesystem is gone, so set the EOF flag and schedule
kn->kn_flags |= (EV_EOF | EV_ONESHOT);
return (1);
}
-
- kn->kn_data = ip->i_size - kn->kn_fp->f_offset;
+ off = ip->i_size - kn->kn_fp->f_offset;
+ kn->kn_data = (off < INTPTR_MAX) ? off : INTPTR_MAX;
+ if (kn->kn_sfflags & NOTE_OLDAPI)
+ return(1);
return (kn->kn_data != 0);
}
kn->kn_hook = (caddr_t)vp;
- /* XXX: kq token actually protects the list */
- lwkt_gettoken(&vp->v_token);
knote_insert(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
- lwkt_reltoken(&vp->v_token);
return(0);
}
{
struct vnode *vp = (void *)kn->kn_hook;
- lwkt_gettoken(&vp->v_token);
knote_remove(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
- lwkt_reltoken(&vp->v_token);
}
static int
{
struct vnode *vp = (void *)kn->kn_hook;
hammer_inode_t ip = VTOI(vp);
+ off_t off;
if (hint == NOTE_REVOKE) {
kn->kn_flags |= (EV_EOF | EV_ONESHOT);
return(1);
}
- kn->kn_data = ip->ino_data.size - kn->kn_fp->f_offset;
+ off = ip->ino_data.size - kn->kn_fp->f_offset;
+ kn->kn_data = (off < INTPTR_MAX) ? off : INTPTR_MAX;
+ if (kn->kn_sfflags & NOTE_OLDAPI)
+ return(1);
return (kn->kn_data != 0);
}
{
struct vnode *vp = (struct vnode *)kn->kn_hook;
struct inode *ip = VTOI(vp);
+ off_t off;
/*
* filesystem is gone, so set the EOF flag and schedule
return (1);
}
- kn->kn_data = ip->i_size - kn->kn_fp->f_offset;
+ off = ip->i_size - kn->kn_fp->f_offset;
+ kn->kn_data = (off < INTPTR_MAX) ? off : INTPTR_MAX;
+ if (kn->kn_sfflags & NOTE_OLDAPI)
+ return(1);
return (kn->kn_data != 0);
}