Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/smbfs/smbfs_io.c
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
#include <netsmb/smb_subr.h> | #include <netsmb/smb_subr.h> | ||||
#include <fs/smbfs/smbfs.h> | #include <fs/smbfs/smbfs.h> | ||||
#include <fs/smbfs/smbfs_node.h> | #include <fs/smbfs/smbfs_node.h> | ||||
#include <fs/smbfs/smbfs_subr.h> | #include <fs/smbfs/smbfs_subr.h> | ||||
/*#define SMBFS_RWGENERIC*/ | /*#define SMBFS_RWGENERIC*/ | ||||
extern int smbfs_pbuf_freecnt; | extern uma_zone_t smbfs_pbuf_zone; | ||||
static int smbfs_fastlookup = 1; | static int smbfs_fastlookup = 1; | ||||
SYSCTL_DECL(_vfs_smbfs); | SYSCTL_DECL(_vfs_smbfs); | ||||
SYSCTL_INT(_vfs_smbfs, OID_AUTO, fastlookup, CTLFLAG_RW, &smbfs_fastlookup, 0, ""); | SYSCTL_INT(_vfs_smbfs, OID_AUTO, fastlookup, CTLFLAG_RW, &smbfs_fastlookup, 0, ""); | ||||
#define DE_SIZE (sizeof(struct dirent)) | #define DE_SIZE (sizeof(struct dirent)) | ||||
▲ Show 20 Lines • Show All 388 Lines • ▼ Show 20 Lines | #else | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
if (pages[npages - 1]->valid != 0 && --npages == 0) | if (pages[npages - 1]->valid != 0 && --npages == 0) | ||||
goto out; | goto out; | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
scred = smbfs_malloc_scred(); | scred = smbfs_malloc_scred(); | ||||
smb_makescred(scred, td, cred); | smb_makescred(scred, td, cred); | ||||
bp = getpbuf(&smbfs_pbuf_freecnt); | bp = uma_zalloc(smbfs_pbuf_zone, M_WAITOK); | ||||
kva = (vm_offset_t) bp->b_data; | kva = (vm_offset_t) bp->b_data; | ||||
pmap_qenter(kva, pages, npages); | pmap_qenter(kva, pages, npages); | ||||
VM_CNT_INC(v_vnodein); | VM_CNT_INC(v_vnodein); | ||||
VM_CNT_ADD(v_vnodepgsin, npages); | VM_CNT_ADD(v_vnodepgsin, npages); | ||||
count = npages << PAGE_SHIFT; | count = npages << PAGE_SHIFT; | ||||
iov.iov_base = (caddr_t) kva; | iov.iov_base = (caddr_t) kva; | ||||
iov.iov_len = count; | iov.iov_len = count; | ||||
uio.uio_iov = &iov; | uio.uio_iov = &iov; | ||||
uio.uio_iovcnt = 1; | uio.uio_iovcnt = 1; | ||||
uio.uio_offset = IDX_TO_OFF(pages[0]->pindex); | uio.uio_offset = IDX_TO_OFF(pages[0]->pindex); | ||||
uio.uio_resid = count; | uio.uio_resid = count; | ||||
uio.uio_segflg = UIO_SYSSPACE; | uio.uio_segflg = UIO_SYSSPACE; | ||||
uio.uio_rw = UIO_READ; | uio.uio_rw = UIO_READ; | ||||
uio.uio_td = td; | uio.uio_td = td; | ||||
error = smb_read(smp->sm_share, np->n_fid, &uio, scred); | error = smb_read(smp->sm_share, np->n_fid, &uio, scred); | ||||
smbfs_free_scred(scred); | smbfs_free_scred(scred); | ||||
pmap_qremove(kva, npages); | pmap_qremove(kva, npages); | ||||
relpbuf(bp, &smbfs_pbuf_freecnt); | uma_zfree(smbfs_pbuf_zone, bp); | ||||
if (error && (uio.uio_resid == count)) { | if (error && (uio.uio_resid == count)) { | ||||
printf("smbfs_getpages: error %d\n",error); | printf("smbfs_getpages: error %d\n",error); | ||||
return VM_PAGER_ERROR; | return VM_PAGER_ERROR; | ||||
} | } | ||||
size = count - uio.uio_resid; | size = count - uio.uio_resid; | ||||
▲ Show 20 Lines • Show All 86 Lines • ▼ Show 20 Lines | /* VOP_OPEN(vp, FWRITE, cred, td, NULL);*/ | ||||
count = ap->a_count; | count = ap->a_count; | ||||
rtvals = ap->a_rtvals; | rtvals = ap->a_rtvals; | ||||
npages = btoc(count); | npages = btoc(count); | ||||
for (i = 0; i < npages; i++) { | for (i = 0; i < npages; i++) { | ||||
rtvals[i] = VM_PAGER_ERROR; | rtvals[i] = VM_PAGER_ERROR; | ||||
} | } | ||||
bp = getpbuf(&smbfs_pbuf_freecnt); | bp = uma_zalloc(smbfs_pbuf_zone, M_WAITOK); | ||||
kva = (vm_offset_t) bp->b_data; | kva = (vm_offset_t) bp->b_data; | ||||
pmap_qenter(kva, pages, npages); | pmap_qenter(kva, pages, npages); | ||||
VM_CNT_INC(v_vnodeout); | VM_CNT_INC(v_vnodeout); | ||||
VM_CNT_ADD(v_vnodepgsout, count); | VM_CNT_ADD(v_vnodepgsout, count); | ||||
iov.iov_base = (caddr_t) kva; | iov.iov_base = (caddr_t) kva; | ||||
iov.iov_len = count; | iov.iov_len = count; | ||||
Show All 11 Lines | /* VOP_OPEN(vp, FWRITE, cred, td, NULL);*/ | ||||
smb_makescred(scred, td, cred); | smb_makescred(scred, td, cred); | ||||
error = smb_write(smp->sm_share, np->n_fid, &uio, scred); | error = smb_write(smp->sm_share, np->n_fid, &uio, scred); | ||||
smbfs_free_scred(scred); | smbfs_free_scred(scred); | ||||
/* VOP_CLOSE(vp, FWRITE, cred, td);*/ | /* VOP_CLOSE(vp, FWRITE, cred, td);*/ | ||||
SMBVDEBUG("paged write done: %d\n", error); | SMBVDEBUG("paged write done: %d\n", error); | ||||
pmap_qremove(kva, npages); | pmap_qremove(kva, npages); | ||||
relpbuf(bp, &smbfs_pbuf_freecnt); | uma_zfree(smbfs_pbuf_zone, bp); | ||||
if (error == 0) { | if (error == 0) { | ||||
vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid, | vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid, | ||||
npages * PAGE_SIZE, npages * PAGE_SIZE); | npages * PAGE_SIZE, npages * PAGE_SIZE); | ||||
} | } | ||||
return (rtvals[0]); | return (rtvals[0]); | ||||
#endif /* SMBFS_RWGENERIC */ | #endif /* SMBFS_RWGENERIC */ | ||||
} | } | ||||
▲ Show 20 Lines • Show All 48 Lines • Show Last 20 Lines |