diff options
author | Rick Macklem <rmacklem@FreeBSD.org> | 2013-07-04 00:54:23 +0000 |
---|---|---|
committer | Rick Macklem <rmacklem@FreeBSD.org> | 2013-07-04 00:54:23 +0000 |
commit | 913df8fd72b732f1a8c64e5ddbd4de73c7be5d78 (patch) | |
tree | cf165a87e1ea5d2bc9cf778e830eb0f7efd46cde /sys/nfsclient | |
parent | 960116ec24ced22c009bfdeb9169dc0e596b0ed1 (diff) | |
download | src-test2-913df8fd72b732f1a8c64e5ddbd4de73c7be5d78.tar.gz src-test2-913df8fd72b732f1a8c64e5ddbd4de73c7be5d78.zip |
Notes
Diffstat (limited to 'sys/nfsclient')
-rw-r--r-- | sys/nfsclient/nfs_subs.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c index c41bc613f38b..5dfab1ca8781 100644 --- a/sys/nfsclient/nfs_subs.c +++ b/sys/nfsclient/nfs_subs.c @@ -581,6 +581,7 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp, vap->va_size = np->n_size; np->n_attrstamp = 0; KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp); + vnode_pager_setsize(vp, np->n_size); } else if (np->n_flag & NMODIFIED) { /* * We've modified the file: Use the larger @@ -592,12 +593,22 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp, np->n_size = vap->va_size; np->n_flag |= NSIZECHANGED; } + vnode_pager_setsize(vp, np->n_size); + } else if (vap->va_size < np->n_size) { + /* + * When shrinking the size, the call to + * vnode_pager_setsize() cannot be done + * with the mutex held, so delay it until + * after the mtx_unlock call. + */ + nsize = np->n_size = vap->va_size; + np->n_flag |= NSIZECHANGED; + setnsize = 1; } else { np->n_size = vap->va_size; np->n_flag |= NSIZECHANGED; + vnode_pager_setsize(vp, np->n_size); } - setnsize = 1; - nsize = vap->va_size; } else { np->n_size = vap->va_size; } |