|
̾??
????
???????????Υ????ȥ??ݥ????Ȥϡ??ե??????????Ƥ??ɤ߹??ߤޤ??Ͻ??ߤޤ??? ?????ϰʲ????̤??Ǥ???
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 ???ޤ?????
|