mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-22 15:47:37 +00:00
tmpfs + sendfile: do not produce partially valid pages for vnode's tail
See r213730 for details of analogous change in ZFS. MFC after: 3 days
This commit is contained in:
parent
f6bb41924c
commit
e07b64c567
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=213735
@ -538,6 +538,8 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio
|
||||
VM_OBJECT_UNLOCK(vobj);
|
||||
return (error);
|
||||
} else if (m != NULL && uio->uio_segflg == UIO_NOCOPY) {
|
||||
KASSERT(offset == 0,
|
||||
("unexpected offset in tmpfs_mappedread for sendfile"));
|
||||
if ((m->oflags & VPO_BUSY) != 0) {
|
||||
/*
|
||||
* Reference the page before unlocking and sleeping so
|
||||
@ -553,9 +555,10 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio
|
||||
sched_pin();
|
||||
sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
|
||||
ma = (char *)sf_buf_kva(sf);
|
||||
error = tmpfs_nocacheread_buf(tobj, idx, offset, tlen,
|
||||
ma + offset);
|
||||
error = tmpfs_nocacheread_buf(tobj, idx, 0, tlen, ma);
|
||||
if (error == 0) {
|
||||
if (tlen != PAGE_SIZE)
|
||||
bzero(ma + tlen, PAGE_SIZE - tlen);
|
||||
uio->uio_offset += tlen;
|
||||
uio->uio_resid -= tlen;
|
||||
}
|
||||
@ -563,7 +566,7 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio
|
||||
sched_unpin();
|
||||
VM_OBJECT_LOCK(vobj);
|
||||
if (error == 0)
|
||||
vm_page_set_valid(m, offset, tlen);
|
||||
m->valid = VM_PAGE_BITS_ALL;
|
||||
vm_page_wakeup(m);
|
||||
VM_OBJECT_UNLOCK(vobj);
|
||||
return (error);
|
||||
|
Loading…
Reference in New Issue
Block a user