mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
kern/sys_process.c: make vmspace_rwmem() similar to io functions
In particular, if there were any bytes moved, and then vm_fault() faulted, do not return an error, but report the short io instead. PR: 297512 Reviewed by: markj Tested by: Stéphane D'Alu <[email protected]> Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D58838
This commit is contained in:
1 parent
f6000e9dd9
commit
1a71d24ecd
1 file changed
+5
-4
@@ -451,6 +451,7 @@ vmspace_rwmem(struct vmspace *vm, struct uio *uio)
|
||||
vm_map_t map;
|
||||
vm_offset_t pageno; /* page number */
|
||||
vm_prot_t reqprot;
|
||||
ssize_t orig_resid;
|
||||
int error, fault_flags, page_offset, writing;
|
||||
|
||||
map = &vm->vm_map;
|
||||
@@ -464,10 +465,12 @@ vmspace_rwmem(struct vmspace *vm, struct uio *uio)
|
||||
reqprot = writing ? VM_PROT_COPY | VM_PROT_READ : VM_PROT_READ;
|
||||
fault_flags = writing ? VM_FAULT_DIRTY : VM_FAULT_NORMAL;
|
||||
|
||||
orig_resid = uio->uio_resid;
|
||||
|
||||
if (writing) {
|
||||
error = priv_check(curthread, PRIV_PROC_MEM_WRITE);
|
||||
if (error != 0)
|
||||
goto out;
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -524,9 +527,7 @@ vmspace_rwmem(struct vmspace *vm, struct uio *uio)
|
||||
vm_page_unwire(m, PQ_ACTIVE);
|
||||
|
||||
} while (error == 0 && uio->uio_resid > 0);
|
||||
|
||||
out:
|
||||
return (error);
|
||||
return (uio->uio_resid == orig_resid ? error : 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
Reference in new issue
Block a user