diff options
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r-- | usr/src/uts/common/fs/vnode.c | 17 | ||||
-rw-r--r-- | usr/src/uts/common/sys/fcntl.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/sys/file.h | 3 |
3 files changed, 23 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/vnode.c b/usr/src/uts/common/fs/vnode.c index c57884a940..3babdbecdb 100644 --- a/usr/src/uts/common/fs/vnode.c +++ b/usr/src/uts/common/fs/vnode.c @@ -51,6 +51,7 @@ #include <sys/vfs.h> #include <sys/vfs_opreg.h> #include <sys/vnode.h> +#include <sys/filio.h> #include <sys/rwstlock.h> #include <sys/fem.h> #include <sys/stat.h> @@ -1254,6 +1255,22 @@ top: if ((error = VOP_SETATTR(vp, &vattr, 0, CRED(), NULL)) != 0) goto out; } + + /* + * Turn on directio, if requested. + */ + if (filemode & FDIRECT) { + if ((error = VOP_IOCTL(vp, _FIODIRECTIO, DIRECTIO_ON, 0, + CRED(), NULL, NULL)) != 0) { + /* + * On Linux, O_DIRECT returns EINVAL when the file + * system does not support directio, so we'll do the + * same. + */ + error = EINVAL; + goto out; + } + } out: ASSERT(vp->v_count > 0); diff --git a/usr/src/uts/common/sys/fcntl.h b/usr/src/uts/common/sys/fcntl.h index cf55ebbf2a..4af23583fd 100644 --- a/usr/src/uts/common/sys/fcntl.h +++ b/usr/src/uts/common/sys/fcntl.h @@ -37,7 +37,7 @@ */ /* Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. */ -/* Copyright 2015, Joyent, Inc. */ +/* Copyright 2020 Joyent, Inc. */ #ifndef _SYS_FCNTL_H #define _SYS_FCNTL_H @@ -89,6 +89,9 @@ extern "C" { #if !defined(_STRICT_SYMBOLS) || defined(_XPG7) #define O_DIRECTORY 0x1000000 /* fail if not a directory */ #endif +#if !defined(_STRICT_SYMBOLS) +#define O_DIRECT 0x2000000 /* direct disk access hint */ +#endif /* * fcntl(2) requests diff --git a/usr/src/uts/common/sys/file.h b/usr/src/uts/common/sys/file.h index f544033d2f..c7d67a5d47 100644 --- a/usr/src/uts/common/sys/file.h +++ b/usr/src/uts/common/sys/file.h @@ -27,7 +27,7 @@ /* All Rights Reserved */ /* Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. */ -/* Copyright 2017 Joyent, Inc. */ +/* Copyright 2020 Joyent, Inc. */ #ifndef _SYS_FILE_H #define _SYS_FILE_H @@ -119,6 +119,7 @@ typedef struct fpollinfo { #define FCLOEXEC 0x800000 /* O_CLOEXEC = 0x800000 */ #define FDIRECTORY 0x1000000 /* O_DIRECTORY = 0x1000000 */ +#define FDIRECT 0x2000000 /* O_DIRECT = 0x2000000 */ #if defined(_KERNEL) || defined(_FAKE_KERNEL) |