![]() |
![]()
| ![]() |
![]()
̾??
????
???????????Υ????ȥ??ݥ????Ȥϡ??ե??????????Ƥ??ɤ߹??ߤޤ??Ͻ??ߤޤ??? ?????ϰʲ????̤??Ǥ???
ioflag ?????ϡ??ե????륷???ƥ????Ф???̿?ᤪ???ӥҥ??Ȥ?Ϳ???뤿???˻??Ѥ????ޤ??? ?ɤ߹??ߤ????ߤ????ˤϡ????̤? 16 ?ӥåȤϡ? ?ե????륷???ƥब???ߤ??٤????ɤߤΥҥ??Ȥ? (?ե????륷???ƥ??֥??å?ñ?̤?) ???뤿???˻??Ѥ????ޤ??? ???̤? 16 ?ӥåȤϡ??ʲ??Υե饰???ޤळ?Ȥ??Ǥ????ӥåȥޥ????Ǥ??? ???å????????ˡ??ե??????ϥ??å??????Ƥ????٤??ǡ???λ???ޤǥ??å?????³???ޤ??? ?????????????ˤ? 0 ???֤??졢?????Ǥʤ??????ˤϥ??顼?????ɤ??֤????ޤ??? ??????????int vop_read(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) { struct buf *bp; off_t bytesinfile; daddr_t lbn, nextlbn; long size, xfersize, blkoffset; int error; size = block size of file system; for (error = 0, bp = NULL; uio->uio_resid > 0; bp = NULL) { bytesinfile = size of file - uio->uio_offset; if (bytesinfile <= 0) break; lbn = uio->uio_offset / size; blkoffset = uio->uio_offset - lbn * size; xfersize = size - blkoffset; if (uio->uio_resid < xfersize) xfersize = uio->uio_resid; if (bytesinfile < xfersize) xfersize = bytesinfile; error = bread(vp, lbn, size, NOCRED, &bp); if (error) { brelse(bp); bp = NULL; break; } /* * ?????ϥ??顼???????ä????ˤ? 0 ?Ǥʤ? b_resid ?Τ? * ?????ޤ????????Ͼ??? break ?????????????٤??Ǥ??? * ???????ʤ??顢û???ɤ߹??ߤ????顼?????ʤ??ä? * ?????ˤϡ??ְ??ä??ޤ??Ͻ??????????Ƥ??ʤ??ǡ????? * uiomove ???Ԥʤ??ʤ????Ȥ??ݾڤ??????? */ size -= bp->b_resid; if (size < xfersize) { if (size == 0) break; xfersize = size; } error = uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); if (error) break; bqrelse(bp); } if (bp != NULL) bqrelse(bp); return (error); } int vop_write(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) { struct buf *bp; off_t bytesinfile; daddr_t lbn, nextlbn; off_t osize; long size, resid, xfersize, blkoffset; int flags; int error; osize = size of file; size = block size of file system; resid = uio->uio_resid; if (ioflag & IO_SYNC) flags = B_SYNC; else flags = 0; for (error = 0; uio->uio_resid > 0;) { lbn = uio->uio_offset / size; blkoffset = uio->uio_offset - lbn * size; xfersize = size - blkoffset; if (uio->uio_resid < xfersize) xfersize = uio->uio_resid; if (uio->uio_offset + xfersize > size of file) vnode_pager_setsize(vp, uio->uio_offset + xfersize); if (size > xfersize) flags |= B_CLRBUF; else flags &= ~B_CLRBUF; error = find_block_in_file(vp, lbn, blkoffset + xfersize, cred, &bp, flags); if (error) break; if (uio->uio_offset + xfersize > size of file) set size of file to uio->uio_offset + xfersize; error = uiomove((char *)bp->b_data + blkoffset, (int) xfersize, uio); /* XXX ufs ?Ϥ????ǥ??顼?????å??Ƥ??ޤ?????? */ if (ioflag & IO_VMIO) bp->b_flags |= B_RELBUF; /* ??? */ if (ioflag & IO_SYNC) bwrite(bp); else if (xfersize + blkoffset == size) bawrite(bp); else bdwrite(bp); if (error || xfersize == 0) break; } if (error) { if (ioflag & IO_UNIT) { /* ?ե????????ڤ??ͤ?????Ū?ʥ롼???????ƤӽФ??? */ your_truncate(vp, osize, ioflag & IO_SYNC, cred, uio->uio_td); uio->uio_offset -= resid - uio->uio_resid; uio->uio_resid = resid; } } else if (resid > uio->uio_resid && (ioflag & IO_SYNC)) { struct timeval tv; error = VOP_UPDATE(vp, &tv, &tv, 1); /* XXX ?????ϲ??Ƥ?????? */ } return (error); } ???顼
??Ϣ???????????Υޥ˥奢???ڡ????? Doug Rabson ???ޤ?????
|