summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsclient/nfs_clbio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/nfsclient/nfs_clbio.c')
-rw-r--r--sys/fs/nfsclient/nfs_clbio.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
index 2401c88..df027ac 100644
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -41,9 +41,6 @@ __FBSDID("$FreeBSD$");
#include <sys/buf.h>
#include <sys/kernel.h>
#include <sys/mount.h>
-#include <sys/proc.h>
-#include <sys/resourcevar.h>
-#include <sys/signalvar.h>
#include <sys/vmmeter.h>
#include <sys/vnode.h>
@@ -134,12 +131,15 @@ ncl_getpages(struct vop_getpages_args *ap)
*/
VM_OBJECT_LOCK(object);
if (pages[ap->a_reqpage]->valid != 0) {
- vm_page_lock_queues();
for (i = 0; i < npages; ++i) {
- if (i != ap->a_reqpage)
+ if (i != ap->a_reqpage) {
+ vm_page_lock(pages[i]);
+ vm_page_lock_queues();
vm_page_free(pages[i]);
+ vm_page_unlock_queues();
+ vm_page_unlock(pages[i]);
+ }
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
return (0);
}
@@ -174,12 +174,15 @@ ncl_getpages(struct vop_getpages_args *ap)
if (error && (uio.uio_resid == count)) {
ncl_printf("nfs_getpages: error %d\n", error);
VM_OBJECT_LOCK(object);
- vm_page_lock_queues();
for (i = 0; i < npages; ++i) {
- if (i != ap->a_reqpage)
+ if (i != ap->a_reqpage) {
+ vm_page_lock(pages[i]);
+ vm_page_lock_queues();
vm_page_free(pages[i]);
+ vm_page_unlock_queues();
+ vm_page_unlock(pages[i]);
+ }
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
return (VM_PAGER_ERROR);
}
@@ -192,12 +195,14 @@ ncl_getpages(struct vop_getpages_args *ap)
size = count - uio.uio_resid;
VM_OBJECT_LOCK(object);
- vm_page_lock_queues();
for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
vm_page_t m;
nextoff = toff + PAGE_SIZE;
m = pages[i];
+ vm_page_lock(m);
+ vm_page_lock_queues();
+
if (nextoff <= size) {
/*
* Read operation filled an entire page
@@ -244,8 +249,10 @@ ncl_getpages(struct vop_getpages_args *ap)
vm_page_free(m);
}
}
+
+ vm_page_unlock_queues();
+ vm_page_unlock(m);
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
return (0);
}
@@ -876,7 +883,6 @@ ncl_write(struct vop_write_args *ap)
daddr_t lbn;
int bcount;
int n, on, error = 0;
- struct proc *p = td?td->td_proc:NULL;
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_WRITE)
@@ -958,16 +964,8 @@ flush_and_restart:
* Maybe this should be above the vnode op call, but so long as
* file servers have no limits, i don't think it matters
*/
- if (p != NULL) {
- PROC_LOCK(p);
- if (uio->uio_offset + uio->uio_resid >
- lim_cur(p, RLIMIT_FSIZE)) {
- psignal(p, SIGXFSZ);
- PROC_UNLOCK(p);
- return (EFBIG);
- }
- PROC_UNLOCK(p);
- }
+ if (vn_rlimit_fsize(vp, uio, td))
+ return (EFBIG);
biosize = vp->v_mount->mnt_stat.f_iosize;
/*
OpenPOWER on IntegriCloud