Unify eventfd ioctl method and use it for other similar interfaces.
MFC after: 1 month
This commit is contained in:
parent
5121b6ccec
commit
ed211c40f4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=314343
@ -177,7 +177,7 @@ static struct fileops timerfdops = {
|
||||
.fo_read = timerfd_read,
|
||||
.fo_write = invfo_rdwr,
|
||||
.fo_truncate = invfo_truncate,
|
||||
.fo_ioctl = invfo_ioctl,
|
||||
.fo_ioctl = eventfd_ioctl,
|
||||
.fo_poll = timerfd_poll,
|
||||
.fo_kqfilter = timerfd_kqfilter,
|
||||
.fo_stat = timerfd_stat,
|
||||
@ -760,7 +760,7 @@ eventfd_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
|
||||
mtx_lock(&efd->efd_lock);
|
||||
retry:
|
||||
if (efd->efd_count == 0) {
|
||||
if ((efd->efd_flags & LINUX_O_NONBLOCK) != 0) {
|
||||
if ((fp->f_flag & FNONBLOCK) != 0) {
|
||||
mtx_unlock(&efd->efd_lock);
|
||||
return (EAGAIN);
|
||||
}
|
||||
@ -811,7 +811,7 @@ eventfd_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
|
||||
mtx_lock(&efd->efd_lock);
|
||||
retry:
|
||||
if (UINT64_MAX - efd->efd_count <= count) {
|
||||
if ((efd->efd_flags & LINUX_O_NONBLOCK) != 0) {
|
||||
if ((fp->f_flag & FNONBLOCK) != 0) {
|
||||
mtx_unlock(&efd->efd_lock);
|
||||
/* Do not not return the number of bytes written */
|
||||
uio->uio_resid += sizeof(eventfd_t);
|
||||
@ -927,19 +927,18 @@ static int
|
||||
eventfd_ioctl(struct file *fp, u_long cmd, void *data,
|
||||
struct ucred *active_cred, struct thread *td)
|
||||
{
|
||||
struct eventfd *efd;
|
||||
|
||||
efd = fp->f_data;
|
||||
if (fp->f_type != DTYPE_LINUXEFD || efd == NULL)
|
||||
if (fp->f_data == NULL || (fp->f_type != DTYPE_LINUXEFD &&
|
||||
fp->f_type != DTYPE_LINUXTFD))
|
||||
return (EINVAL);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case FIONBIO:
|
||||
if (*(int *)data)
|
||||
efd->efd_flags |= LINUX_O_NONBLOCK;
|
||||
if ((*(int *)data))
|
||||
atomic_set_int(&fp->f_flag, FNONBLOCK);
|
||||
else
|
||||
efd->efd_flags &= ~LINUX_O_NONBLOCK;
|
||||
atomic_clear_int(&fp->f_flag, FNONBLOCK);
|
||||
case FIOASYNC:
|
||||
return (0);
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user