summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs
diff options
context:
space:
mode:
authorLuqman Aden <luqman@oxide.computer>2021-12-04 16:46:12 -0800
committerDan McDonald <danmcd@mnx.io>2022-11-21 12:06:50 -0500
commitb8af4a8966ef2150997d7664836f5c360b849005 (patch)
tree8d842d879dd022202c4c491a895f112e54ac4a71 /usr/src/uts/common/fs
parent067afcb3a52b5ebe76a00b3f366353cad54c649e (diff)
downloadillumos-joyent-b8af4a8966ef2150997d7664836f5c360b849005.tar.gz
13879 flock(3C) on NFS files should fail with EOPNOTSUPP
Reviewed by: Andy Stormont <andyjstormont@gmail.com> Approved by: Dan McDonald <danmcd@mnx.io>
Diffstat (limited to 'usr/src/uts/common/fs')
-rw-r--r--usr/src/uts/common/fs/fs_subr.c11
-rw-r--r--usr/src/uts/common/fs/nfs/nfs3_vnops.c118
-rw-r--r--usr/src/uts/common/fs/nfs/nfs4_vnops.c15
3 files changed, 86 insertions, 58 deletions
diff --git a/usr/src/uts/common/fs/fs_subr.c b/usr/src/uts/common/fs/fs_subr.c
index e3d07b595d..0682c96839 100644
--- a/usr/src/uts/common/fs/fs_subr.c
+++ b/usr/src/uts/common/fs/fs_subr.c
@@ -19,13 +19,14 @@
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
+/* All Rights Reserved */
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2017 Joyent, Inc.
+ * Copyright 2022 Oxide Computer Company
*/
/*
@@ -256,7 +257,7 @@ fs_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag, offset_t offset,
* TBD we do not support remote OFD locks at this time.
*/
if (flag & (F_REMOTELOCK | F_PXFSLOCK)) {
- error = EINVAL;
+ error = EOPNOTSUPP;
goto done;
}
skip_lock = B_TRUE;
@@ -331,7 +332,7 @@ fs_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag, offset_t offset,
* TBD we do not support remote OFD locks at this time.
*/
if (flag & (F_REMOTELOCK | F_PXFSLOCK)) {
- error = EINVAL;
+ error = EOPNOTSUPP;
goto done;
}
skip_lock = B_TRUE;
@@ -740,8 +741,8 @@ fs_acl_nontrivial(vnode_t *vp, cred_t *cr)
{
ulong_t acl_styles;
ulong_t acl_flavor;
- vsecattr_t vsecattr;
- int error;
+ vsecattr_t vsecattr;
+ int error;
int isnontrivial;
/* determine the forms of ACLs maintained */
diff --git a/usr/src/uts/common/fs/nfs/nfs3_vnops.c b/usr/src/uts/common/fs/nfs/nfs3_vnops.c
index b7354c168a..74d47dd93d 100644
--- a/usr/src/uts/common/fs/nfs/nfs3_vnops.c
+++ b/usr/src/uts/common/fs/nfs/nfs3_vnops.c
@@ -31,6 +31,7 @@
/*
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2022 Oxide Computer Company
*/
#include <sys/param.h>
@@ -275,7 +276,7 @@ const fs_operation_def_t nfs3_vnodeops_template[] = {
VOPNAME_SETSECATTR, { .vop_setsecattr = nfs3_setsecattr },
VOPNAME_GETSECATTR, { .vop_getsecattr = nfs3_getsecattr },
VOPNAME_SHRLOCK, { .vop_shrlock = nfs3_shrlock },
- VOPNAME_VNEVENT, { .vop_vnevent = fs_vnevent_support },
+ VOPNAME_VNEVENT, { .vop_vnevent = fs_vnevent_support },
NULL, NULL
};
@@ -342,7 +343,7 @@ nfs3_open(vnode_t **vpp, int flag, cred_t *cr, caller_context_t *ct)
/* ARGSUSED */
static int
nfs3_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
rnode_t *rp;
int error;
@@ -538,7 +539,7 @@ nfs3_directio_read(vnode_t *vp, struct uio *uiop, cred_t *cr)
/* ARGSUSED */
static int
nfs3_read(vnode_t *vp, struct uio *uiop, int ioflag, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
rnode_t *rp;
u_offset_t off;
@@ -647,7 +648,7 @@ nfs3_read(vnode_t *vp, struct uio *uiop, int ioflag, cred_t *cr,
/* ARGSUSED */
static int
nfs3_write(vnode_t *vp, struct uio *uiop, int ioflag, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
rlim64_t limit = uiop->uio_llimit;
rnode_t *rp;
@@ -928,7 +929,7 @@ bottom:
*/
static int
nfs3_rdwrlbn(vnode_t *vp, page_t *pp, u_offset_t off, size_t len,
- int flags, cred_t *cr)
+ int flags, cred_t *cr)
{
struct buf *bp;
int error;
@@ -1000,7 +1001,7 @@ nfs3_rdwrlbn(vnode_t *vp, page_t *pp, u_offset_t off, size_t len,
*/
static int
nfs3write(vnode_t *vp, caddr_t base, u_offset_t offset, int count, cred_t *cr,
- stable_how *stab_comm)
+ stable_how *stab_comm)
{
mntinfo_t *mi;
WRITE3args args;
@@ -1125,8 +1126,8 @@ nfs3write(vnode_t *vp, caddr_t base, u_offset_t offset, int count, cred_t *cr,
* Read from a file. Reads data in largest chunks our interface can handle.
*/
static int
-nfs3read(vnode_t *vp, caddr_t base, offset_t offset, int count,
- size_t *residp, cred_t *cr)
+nfs3read(vnode_t *vp, caddr_t base, offset_t offset, int count, size_t *residp,
+ cred_t *cr)
{
mntinfo_t *mi;
READ3args args;
@@ -1235,7 +1236,7 @@ nfs3read(vnode_t *vp, caddr_t base, offset_t offset, int count,
/* ARGSUSED */
static int
nfs3_ioctl(vnode_t *vp, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp,
- caller_context_t *ct)
+ caller_context_t *ct)
{
if (nfs_zone() != VTOMI(vp)->mi_zone)
@@ -1251,7 +1252,7 @@ nfs3_ioctl(vnode_t *vp, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp,
/* ARGSUSED */
static int
nfs3_getattr(vnode_t *vp, struct vattr *vap, int flags, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
rnode_t *rp;
@@ -1312,7 +1313,7 @@ nfs3_getattr(vnode_t *vp, struct vattr *vap, int flags, cred_t *cr,
/*ARGSUSED4*/
static int
nfs3_setattr(vnode_t *vp, struct vattr *vap, int flags, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
struct vattr va;
@@ -1921,8 +1922,8 @@ redo:
/* ARGSUSED */
static int
nfs3_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct pathname *pnp,
- int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
- int *direntflags, pathname_t *realpnp)
+ int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
+ int *direntflags, pathname_t *realpnp)
{
int error;
vnode_t *vp;
@@ -2006,7 +2007,7 @@ static int nfs3_lookup_dnlc_lookups = 0;
/* ARGSUSED */
int
nfs3lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct pathname *pnp,
- int flags, vnode_t *rdir, cred_t *cr, int rfscall_flags)
+ int flags, vnode_t *rdir, cred_t *cr, int rfscall_flags)
{
int error;
rnode_t *drp;
@@ -2140,7 +2141,7 @@ nfs3lookup_dnlc(vnode_t *dvp, char *nm, vnode_t **vpp, cred_t *cr)
static int
nfs3lookup_otw(vnode_t *dvp, char *nm, vnode_t **vpp, cred_t *cr,
- int rfscall_flags)
+ int rfscall_flags)
{
int error;
LOOKUP3args args;
@@ -2222,8 +2223,8 @@ static int nfs3_create_misses = 0;
/* ARGSUSED */
static int
nfs3_create(vnode_t *dvp, char *nm, struct vattr *va, enum vcexcl exclusive,
- int mode, vnode_t **vpp, cred_t *cr, int lfaware, caller_context_t *ct,
- vsecattr_t *vsecp)
+ int mode, vnode_t **vpp, cred_t *cr, int lfaware, caller_context_t *ct,
+ vsecattr_t *vsecp)
{
int error;
vnode_t *vp;
@@ -2396,7 +2397,7 @@ top:
/* ARGSUSED */
static int
nfs3create(vnode_t *dvp, char *nm, struct vattr *va, enum vcexcl exclusive,
- int mode, vnode_t **vpp, cred_t *cr, int lfaware)
+ int mode, vnode_t **vpp, cred_t *cr, int lfaware)
{
int error;
CREATE3args args;
@@ -2714,7 +2715,7 @@ nfs3excl_create_settimes(vnode_t *vp, struct vattr *vap, cred_t *cr)
/* ARGSUSED */
static int
nfs3mknod(vnode_t *dvp, char *nm, struct vattr *va, enum vcexcl exclusive,
- int mode, vnode_t **vpp, cred_t *cr)
+ int mode, vnode_t **vpp, cred_t *cr)
{
int error;
MKNOD3args args;
@@ -2973,7 +2974,7 @@ nfs3_remove(vnode_t *dvp, char *nm, cred_t *cr, caller_context_t *ct, int flags)
/* ARGSUSED */
static int
nfs3_link(vnode_t *tdvp, vnode_t *svp, char *tnm, cred_t *cr,
- caller_context_t *ct, int flags)
+ caller_context_t *ct, int flags)
{
int error;
LINK3args args;
@@ -3052,7 +3053,7 @@ nfs3_link(vnode_t *tdvp, vnode_t *svp, char *tnm, cred_t *cr,
/* ARGSUSED */
static int
nfs3_rename(vnode_t *odvp, char *onm, vnode_t *ndvp, char *nnm, cred_t *cr,
- caller_context_t *ct, int flags)
+ caller_context_t *ct, int flags)
{
vnode_t *realvp;
@@ -3373,7 +3374,7 @@ nfs3rename(vnode_t *odvp, char *onm, vnode_t *ndvp, char *nnm, cred_t *cr,
/* ARGSUSED */
static int
nfs3_mkdir(vnode_t *dvp, char *nm, struct vattr *va, vnode_t **vpp, cred_t *cr,
- caller_context_t *ct, int flags, vsecattr_t *vsecp)
+ caller_context_t *ct, int flags, vsecattr_t *vsecp)
{
int error;
MKDIR3args args;
@@ -3478,7 +3479,7 @@ nfs3_mkdir(vnode_t *dvp, char *nm, struct vattr *va, vnode_t **vpp, cred_t *cr,
/* ARGSUSED */
static int
nfs3_rmdir(vnode_t *dvp, char *nm, vnode_t *cdir, cred_t *cr,
- caller_context_t *ct, int flags)
+ caller_context_t *ct, int flags)
{
int error;
RMDIR3args args;
@@ -3583,7 +3584,7 @@ nfs3_rmdir(vnode_t *dvp, char *nm, vnode_t *cdir, cred_t *cr,
/* ARGSUSED */
static int
nfs3_symlink(vnode_t *dvp, char *lnm, struct vattr *tva, char *tnm, cred_t *cr,
- caller_context_t *ct, int flags)
+ caller_context_t *ct, int flags)
{
int error;
SYMLINK3args args;
@@ -3714,7 +3715,7 @@ static int nfs3_shrinkreaddir = 0;
/* ARGSUSED */
static int
nfs3_readdir(vnode_t *vp, struct uio *uiop, cred_t *cr, int *eofp,
- caller_context_t *ct, int flags)
+ caller_context_t *ct, int flags)
{
int error;
size_t count;
@@ -4530,8 +4531,8 @@ static int nfs3_lostpage = 0; /* number of times we lost original page */
/* ARGSUSED */
static int
nfs3_getpage(vnode_t *vp, offset_t off, size_t len, uint_t *protp,
- page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr,
- enum seg_rw rw, cred_t *cr, caller_context_t *ct)
+ page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr,
+ enum seg_rw rw, cred_t *cr, caller_context_t *ct)
{
rnode_t *rp;
int error;
@@ -4606,8 +4607,8 @@ retry:
/* ARGSUSED */
static int
nfs3_getapage(vnode_t *vp, u_offset_t off, size_t len, uint_t *protp,
- page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr,
- enum seg_rw rw, cred_t *cr)
+ page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr,
+ enum seg_rw rw, cred_t *cr)
{
rnode_t *rp;
uint_t bsize;
@@ -4875,7 +4876,7 @@ out:
static void
nfs3_readahead(vnode_t *vp, u_offset_t blkoff, caddr_t addr, struct seg *seg,
- cred_t *cr)
+ cred_t *cr)
{
int error;
page_t *pp;
@@ -4992,7 +4993,7 @@ nfs3_readahead(vnode_t *vp, u_offset_t blkoff, caddr_t addr, struct seg *seg,
/* ARGSUSED */
static int
nfs3_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
rnode_t *rp;
@@ -5027,7 +5028,7 @@ nfs3_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
*/
int
nfs3_putapage(vnode_t *vp, page_t *pp, u_offset_t *offp, size_t *lenp,
- int flags, cred_t *cr)
+ int flags, cred_t *cr)
{
u_offset_t io_off;
u_offset_t lbn_off;
@@ -5148,7 +5149,7 @@ nfs3_putapage(vnode_t *vp, page_t *pp, u_offset_t *offp, size_t *lenp,
static int
nfs3_sync_putapage(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
- int flags, cred_t *cr)
+ int flags, cred_t *cr)
{
int error;
rnode_t *rp;
@@ -5211,8 +5212,8 @@ nfs3_sync_putapage(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
/* ARGSUSED */
static int
nfs3_map(vnode_t *vp, offset_t off, struct as *as, caddr_t *addrp,
- size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
- cred_t *cr, caller_context_t *ct)
+ size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
+ cred_t *cr, caller_context_t *ct)
{
struct segvn_crargs vn_a;
int error;
@@ -5325,8 +5326,8 @@ done:
/* ARGSUSED */
static int
nfs3_addmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr,
- size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
- cred_t *cr, caller_context_t *ct)
+ size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
+ cred_t *cr, caller_context_t *ct)
{
rnode_t *rp;
@@ -5344,8 +5345,8 @@ nfs3_addmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr,
/* ARGSUSED */
static int
nfs3_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
- offset_t offset, struct flk_callback *flk_cbp, cred_t *cr,
- caller_context_t *ct)
+ offset_t offset, struct flk_callback *flk_cbp, cred_t *cr,
+ caller_context_t *ct)
{
netobj lm_fh3;
int rc;
@@ -5355,9 +5356,22 @@ nfs3_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
if (nfs_zone() != VTOMI(vp)->mi_zone)
return (EIO);
+
/* check for valid cmd parameter */
- if (cmd != F_GETLK && cmd != F_SETLK && cmd != F_SETLKW)
+ switch (cmd) {
+ case F_FLOCK:
+ case F_FLOCKW:
+ case F_OFD_GETLK:
+ case F_OFD_SETLK:
+ case F_OFD_SETLKW:
+ return (EOPNOTSUPP);
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ break;
+ default:
return (EINVAL);
+ }
/* Verify l_type. */
switch (bfp->l_type) {
@@ -5494,7 +5508,7 @@ done:
/* ARGSUSED */
static int
nfs3_space(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
- offset_t offset, cred_t *cr, caller_context_t *ct)
+ offset_t offset, cred_t *cr, caller_context_t *ct)
{
int error;
@@ -5553,8 +5567,8 @@ nfs3_realvp(vnode_t *vp, vnode_t **vpp, caller_context_t *ct)
/* ARGSUSED */
static int
nfs3_delmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr,
- size_t len, uint_t prot, uint_t maxprot, uint_t flags,
- cred_t *cr, caller_context_t *ct)
+ size_t len, uint_t prot, uint_t maxprot, uint_t flags,
+ cred_t *cr, caller_context_t *ct)
{
int caller_found;
int error;
@@ -5716,7 +5730,7 @@ static int nfs3_pathconf_cache_misses = 0;
/* ARGSUSED */
static int
nfs3_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
PATHCONF3args args;
@@ -5914,7 +5928,7 @@ nfs3_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
*/
static int
nfs3_sync_pageio(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
- int flags, cred_t *cr)
+ int flags, cred_t *cr)
{
int error;
@@ -5930,7 +5944,7 @@ nfs3_sync_pageio(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
/* ARGSUSED */
static int
nfs3_pageio(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
- int flags, cred_t *cr, caller_context_t *ct)
+ int flags, cred_t *cr, caller_context_t *ct)
{
int error;
rnode_t *rp;
@@ -5960,7 +5974,7 @@ nfs3_pageio(vnode_t *vp, page_t *pp, u_offset_t io_off, size_t io_len,
/* ARGSUSED */
static void
nfs3_dispose(vnode_t *vp, page_t *pp, int fl, int dn, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
rnode_t *rp;
@@ -6568,7 +6582,7 @@ nfs3_commit_vp(vnode_t *vp, u_offset_t poff, size_t plen, cred_t *cr)
static int
nfs3_sync_commit(vnode_t *vp, page_t *plist, offset3 offset, count3 count,
- cred_t *cr)
+ cred_t *cr)
{
int error;
page_t *pp;
@@ -6605,7 +6619,7 @@ nfs3_sync_commit(vnode_t *vp, page_t *plist, offset3 offset, count3 count,
static void
nfs3_async_commit(vnode_t *vp, page_t *plist, offset3 offset, count3 count,
- cred_t *cr)
+ cred_t *cr)
{
ASSERT(nfs_zone() == VTOMI(vp)->mi_zone);
(void) nfs3_sync_commit(vp, plist, offset, count, cr);
@@ -6614,7 +6628,7 @@ nfs3_async_commit(vnode_t *vp, page_t *plist, offset3 offset, count3 count,
/* ARGSUSED */
static int
nfs3_setsecattr(vnode_t *vp, vsecattr_t *vsecattr, int flag, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
mntinfo_t *mi;
@@ -6636,7 +6650,7 @@ nfs3_setsecattr(vnode_t *vp, vsecattr_t *vsecattr, int flag, cred_t *cr,
/* ARGSUSED */
static int
nfs3_getsecattr(vnode_t *vp, vsecattr_t *vsecattr, int flag, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
mntinfo_t *mi;
@@ -6658,7 +6672,7 @@ nfs3_getsecattr(vnode_t *vp, vsecattr_t *vsecattr, int flag, cred_t *cr,
/* ARGSUSED */
static int
nfs3_shrlock(vnode_t *vp, int cmd, struct shrlock *shr, int flag, cred_t *cr,
- caller_context_t *ct)
+ caller_context_t *ct)
{
int error;
struct shrlock nshr;
diff --git a/usr/src/uts/common/fs/nfs/nfs4_vnops.c b/usr/src/uts/common/fs/nfs/nfs4_vnops.c
index db93bf2e72..2a501bc898 100644
--- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c
+++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c
@@ -39,6 +39,7 @@
/*
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ * Copyright 2022 Oxide Computer Company
*/
#include <sys/param.h>
@@ -10849,8 +10850,20 @@ nfs4_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
return (EIO);
/* check for valid cmd parameter */
- if (cmd != F_GETLK && cmd != F_SETLK && cmd != F_SETLKW)
+ switch (cmd) {
+ case F_FLOCK:
+ case F_FLOCKW:
+ case F_OFD_GETLK:
+ case F_OFD_SETLK:
+ case F_OFD_SETLKW:
+ return (EOPNOTSUPP);
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ break;
+ default:
return (EINVAL);
+ }
/* Verify l_type. */
switch (bfp->l_type) {