summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-03-17 23:03:20 +0000
committerkib <kib@FreeBSD.org>2012-03-17 23:03:20 +0000
commit22e84b35272d9d55276d09eccdcdcfaf190b2167 (patch)
treee316c2ccc35f51359f42eaa18df2f18daffa7bf9 /sys/fs
parent2963c3c979b3491c27ed851b7e3ea47c0ae4167c (diff)
downloadFreeBSD-src-22e84b35272d9d55276d09eccdcdcfaf190b2167.zip
FreeBSD-src-22e84b35272d9d55276d09eccdcdcfaf190b2167.tar.gz
Add sysctl vfs.nfs.nfs_keep_dirty_on_error to switch the nfs client
behaviour on error from write RPC back to behaviour of old nfs client. When set to not zero, the pages for which write failed are kept dirty. PR: kern/165927 Reviewed by: alc MFC after: 2 weeks
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/nfsclient/nfs_clbio.c9
-rw-r--r--sys/fs/nfsclient/nfs_clvnops.c4
2 files changed, 10 insertions, 3 deletions
diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
index 29edf1c..3efff8c 100644
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -66,6 +66,7 @@ extern int ncl_numasync;
extern enum nfsiod_state ncl_iodwant[NFS_MAXASYNCDAEMON];
extern struct nfsmount *ncl_iodmount[NFS_MAXASYNCDAEMON];
extern int newnfs_directio_enable;
+extern int nfs_keep_dirty_on_error;
int ncl_pbuf_freecnt = -1; /* start out unlimited */
@@ -348,9 +349,11 @@ ncl_putpages(struct vop_putpages_args *ap)
pmap_qremove(kva, npages);
relpbuf(bp, &ncl_pbuf_freecnt);
- vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid);
- if (must_commit)
- ncl_clearcommit(vp->v_mount);
+ if (error == 0 || !nfs_keep_dirty_on_error) {
+ vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid);
+ if (must_commit)
+ ncl_clearcommit(vp->v_mount);
+ }
return rtvals[0];
}
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index 57c687c..b8f4c2c 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -241,6 +241,10 @@ int newnfs_directio_enable = 0;
SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs_directio_enable, CTLFLAG_RW,
&newnfs_directio_enable, 0, "Enable NFS directio");
+int nfs_keep_dirty_on_error;
+SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs_keep_dirty_on_error, CTLFLAG_RW,
+ &nfs_keep_dirty_on_error, 0, "Retry pageout if error returned");
+
/*
* This sysctl allows other processes to mmap a file that has been opened
* O_DIRECT by a process. In general, having processes mmap the file while
OpenPOWER on IntegriCloud