Allow FIONBIO and FIOASYNC ioctls on POSIX shm descriptors.

They have no effect, as with filesystem file descriptors.
This improves compatibility with some existing userspace code.

Submitted by:	Greg V <greg@unrelenting.technology>
Reviewed by:	kib
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D19330
This commit is contained in:
Mark Johnston 2019-02-28 22:00:36 +00:00
parent 1f8c4546a8
commit 2b64ab22e8

View File

@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/filio.h>
#include <sys/fnv_hash.h>
#include <sys/kernel.h>
#include <sys/uio.h>
@ -126,6 +127,7 @@ static int shm_remove(char *path, Fnv32_t fnv, struct ucred *ucred);
static fo_rdwr_t shm_read;
static fo_rdwr_t shm_write;
static fo_truncate_t shm_truncate;
static fo_ioctl_t shm_ioctl;
static fo_stat_t shm_stat;
static fo_close_t shm_close;
static fo_chmod_t shm_chmod;
@ -139,7 +141,7 @@ struct fileops shm_ops = {
.fo_read = shm_read,
.fo_write = shm_write,
.fo_truncate = shm_truncate,
.fo_ioctl = invfo_ioctl,
.fo_ioctl = shm_ioctl,
.fo_poll = invfo_poll,
.fo_kqfilter = invfo_kqfilter,
.fo_stat = shm_stat,
@ -363,6 +365,24 @@ shm_truncate(struct file *fp, off_t length, struct ucred *active_cred,
return (shm_dotruncate(shmfd, length));
}
int
shm_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred,
struct thread *td)
{
switch (com) {
case FIONBIO:
case FIOASYNC:
/*
* Allow fcntl(fd, F_SETFL, O_NONBLOCK) to work,
* just like it would on an unlinked regular file
*/
return (0);
default:
return (ENOTTY);
}
}
static int
shm_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
struct thread *td)