nfsclient: convert to use vn_delayed_setsize()
Reviewed by: rmacklem Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55595
This commit is contained in:
@@ -1041,7 +1041,7 @@ ncl_write(struct vop_write_args *ap)
|
||||
NFSLOCKNODE(np);
|
||||
np->n_size = uio->uio_offset + n;
|
||||
np->n_flag |= NMODIFIED;
|
||||
np->n_flag &= ~NVNSETSZSKIP;
|
||||
vn_clear_delayed_setsize(vp);
|
||||
vnode_pager_setsize(vp, np->n_size);
|
||||
NFSUNLOCKNODE(np);
|
||||
|
||||
@@ -1071,7 +1071,7 @@ ncl_write(struct vop_write_args *ap)
|
||||
if (uio->uio_offset + n > np->n_size) {
|
||||
np->n_size = uio->uio_offset + n;
|
||||
np->n_flag |= NMODIFIED;
|
||||
np->n_flag &= ~NVNSETSZSKIP;
|
||||
vn_clear_delayed_setsize(vp);
|
||||
vnode_pager_setsize(vp, np->n_size);
|
||||
}
|
||||
NFSUNLOCKNODE(np);
|
||||
|
||||
@@ -646,7 +646,7 @@ ncl_pager_setsize(struct vnode *vp, u_quad_t *nsizep)
|
||||
(curthread->td_pflags2 & TDP2_SBPAGES) == 0)
|
||||
setnsize = true;
|
||||
else
|
||||
np->n_flag |= NVNSETSZSKIP;
|
||||
vn_delay_setsize(vp);
|
||||
}
|
||||
if (nsizep == NULL) {
|
||||
NFSUNLOCKNODE(np);
|
||||
|
||||
@@ -155,7 +155,7 @@ static vop_getextattr_t nfs_getextattr;
|
||||
static vop_setextattr_t nfs_setextattr;
|
||||
static vop_listextattr_t nfs_listextattr;
|
||||
static vop_deleteextattr_t nfs_deleteextattr;
|
||||
static vop_lock1_t nfs_lock;
|
||||
static vop_delayed_setsize_t nfs_delayed_setsize;
|
||||
|
||||
/*
|
||||
* Global vfs data structures for nfs
|
||||
@@ -168,13 +168,13 @@ static struct vop_vector newnfs_vnodeops_nosig = {
|
||||
.vop_advlockasync = nfs_advlockasync,
|
||||
.vop_close = nfs_close,
|
||||
.vop_create = nfs_create,
|
||||
.vop_delayed_setsize = nfs_delayed_setsize,
|
||||
.vop_fsync = nfs_fsync,
|
||||
.vop_getattr = nfs_getattr,
|
||||
.vop_getpages = ncl_getpages,
|
||||
.vop_putpages = ncl_putpages,
|
||||
.vop_inactive = ncl_inactive,
|
||||
.vop_link = nfs_link,
|
||||
.vop_lock1 = nfs_lock,
|
||||
.vop_lookup = nfs_lookup,
|
||||
.vop_mkdir = nfs_mkdir,
|
||||
.vop_mknod = nfs_mknod,
|
||||
@@ -331,73 +331,19 @@ SYSCTL_U64(_vfs_nfs, OID_AUTO, maxalloclen, CTLFLAG_RW,
|
||||
*/
|
||||
|
||||
static int
|
||||
nfs_lock(struct vop_lock1_args *ap)
|
||||
nfs_delayed_setsize(struct vop_delayed_setsize_args *ap)
|
||||
{
|
||||
struct vnode *vp;
|
||||
struct nfsnode *np;
|
||||
u_quad_t nsize;
|
||||
int error, lktype;
|
||||
bool onfault;
|
||||
|
||||
vp = ap->a_vp;
|
||||
lktype = ap->a_flags & LK_TYPE_MASK;
|
||||
error = VOP_LOCK1_APV(&default_vnodeops, ap);
|
||||
if (error != 0 || vp->v_op != &newnfs_vnodeops)
|
||||
return (error);
|
||||
np = VTONFS(vp);
|
||||
if (np == NULL)
|
||||
return (0);
|
||||
NFSLOCKNODE(np);
|
||||
if ((np->n_flag & NVNSETSZSKIP) == 0 || (lktype != LK_SHARED &&
|
||||
lktype != LK_EXCLUSIVE && lktype != LK_UPGRADE &&
|
||||
lktype != LK_TRYUPGRADE)) {
|
||||
NFSUNLOCKNODE(np);
|
||||
return (0);
|
||||
}
|
||||
onfault = (ap->a_flags & LK_EATTR_MASK) == LK_NOWAIT &&
|
||||
(ap->a_flags & LK_INIT_MASK) == LK_CANRECURSE &&
|
||||
(lktype == LK_SHARED || lktype == LK_EXCLUSIVE);
|
||||
if (onfault && vp->v_vnlock->lk_recurse == 0) {
|
||||
/*
|
||||
* Force retry in vm_fault(), to make the lock request
|
||||
* sleepable, which allows us to piggy-back the
|
||||
* sleepable call to vnode_pager_setsize().
|
||||
*/
|
||||
NFSUNLOCKNODE(np);
|
||||
VOP_UNLOCK(vp);
|
||||
return (EBUSY);
|
||||
}
|
||||
if ((ap->a_flags & LK_NOWAIT) != 0 ||
|
||||
(lktype == LK_SHARED && vp->v_vnlock->lk_recurse > 0)) {
|
||||
NFSUNLOCKNODE(np);
|
||||
return (0);
|
||||
}
|
||||
if (lktype == LK_SHARED) {
|
||||
NFSUNLOCKNODE(np);
|
||||
VOP_UNLOCK(vp);
|
||||
ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
|
||||
ap->a_flags |= LK_EXCLUSIVE;
|
||||
error = VOP_LOCK1_APV(&default_vnodeops, ap);
|
||||
if (error != 0 || vp->v_op != &newnfs_vnodeops)
|
||||
return (error);
|
||||
if (vp->v_data == NULL)
|
||||
goto downgrade;
|
||||
MPASS(vp->v_data == np);
|
||||
if (np != NULL) {
|
||||
NFSLOCKNODE(np);
|
||||
if ((np->n_flag & NVNSETSZSKIP) == 0) {
|
||||
NFSUNLOCKNODE(np);
|
||||
goto downgrade;
|
||||
}
|
||||
}
|
||||
np->n_flag &= ~NVNSETSZSKIP;
|
||||
nsize = np->n_size;
|
||||
NFSUNLOCKNODE(np);
|
||||
vnode_pager_setsize(vp, nsize);
|
||||
downgrade:
|
||||
if (lktype == LK_SHARED) {
|
||||
ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
|
||||
ap->a_flags |= LK_DOWNGRADE;
|
||||
(void)VOP_LOCK1_APV(&default_vnodeops, ap);
|
||||
nsize = np->n_size;
|
||||
NFSUNLOCKNODE(np);
|
||||
vnode_pager_setsize(vp, nsize);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -160,7 +160,6 @@ struct nfsnode {
|
||||
#define NWRITEOPENED 0x00040000 /* Has been opened for writing */
|
||||
#define NHASBEENLOCKED 0x00080000 /* Has been file locked. */
|
||||
#define NDSCOMMIT 0x00100000 /* Commit is done via the DS. */
|
||||
#define NVNSETSZSKIP 0x00200000 /* Skipped vnode_pager_setsize() */
|
||||
#define NMIGHTBELOCKED 0x00400000 /* Might be file locked. */
|
||||
#define NNAMEDNOTSUPP 0x00800000 /* Openattr is not supported. */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user