+ resid = uio->uio_resid;
+ osize = ip->i_size;
+ fs = ip->i_fs;
+ do {
+ lbn = lblkno(fs, uio->uio_offset);
+ on = blkoff(fs, uio->uio_offset);
+ n = MIN((unsigned)(fs->fs_bsize - on), uio->uio_resid);
+ if (n < fs->fs_bsize)
+ flags = B_CLRBUF;
+ else
+ flags = 0;
+ if (error = balloc(ip, lbn, (int)(on + n), &bn, flags))
+ break;
+ if (uio->uio_offset + n > ip->i_size)
+ ip->i_size = uio->uio_offset + n;
+ size = blksize(fs, ip, lbn);
+ count = howmany(size, CLBYTES);
+ for (i = 0; i < count; i++)
+ munhash(ip->i_devvp, bn + i * CLBYTES / DEV_BSIZE);
+ if (n == fs->fs_bsize)
+ bp = getblk(ip->i_devvp, bn, size);
+ else
+ error = bread(ip->i_devvp, bn, size, NOCRED, &bp);
+ n = MIN(n, size - bp->b_resid);
+ if (error) {
+ brelse(bp);
+ break;
+ }
+ error = uiomove(bp->b_un.b_addr + on, n, uio);
+ if (ioflag & IO_SYNC)
+ (void) bwrite(bp);
+ else if (n + on == fs->fs_bsize) {
+ bp->b_flags |= B_AGE;
+ bawrite(bp);
+ } else
+ bdwrite(bp);
+ ip->i_flag |= IUPD|ICHG;
+ if (cred->cr_uid != 0)
+ ip->i_mode &= ~(ISUID|ISGID);
+ } while (error == 0 && uio->uio_resid > 0 && n != 0);
+ if (error && (ioflag & IO_UNIT)) {
+ (void) itrunc(ip, osize);
+ uio->uio_offset -= resid - uio->uio_resid;
+ uio->uio_resid = resid;
+ }
+ return (error);
+}
+
+/* ARGSUSED */
+ufs_ioctl(vp, com, data, fflag, cred)
+ struct vnode *vp;
+ int com;
+ caddr_t data;
+ int fflag;
+ struct ucred *cred;
+{
+
+ return (ENOTTY);
+}
+
+/* ARGSUSED */
+ufs_select(vp, which, cred)
+ struct vnode *vp;
+ int which;
+ struct ucred *cred;
+{
+
+ return (1); /* XXX */