- register i;
- struct buf *bp, *nbp;
- int j, sh;
- daddr_t nb, *bap;
- dev_t dev;
-
- if(bn < 0) {
- u.u_error = EFBIG;
- return((daddr_t)0);
- }
- dev = ip->i_dev;
- rablock = 0;
-
- /*
- * blocks 0..NADDR-4 are direct blocks
- */
- if(bn < NADDR-3) {
- i = bn;
- nb = ip->i_un.i_addr[i];
- if(nb == 0) {
- if(rwflg==B_READ || (bp = alloc(dev))==NULL)
- return((daddr_t)-1);
- nb = dbtofsb(bp->b_blkno);
- if ((ip->i_mode&IFMT) == IFDIR)
- /*
- * Write directory blocks synchronously
- * so they never appear with garbage in
- * them on the disk.
- */
- bwrite(bp);
- else
- bdwrite(bp);
- ip->i_un.i_addr[i] = nb;
- ip->i_flag |= IUPD|ICHG;
- }
- if(i < NADDR-4)
- rablock = ip->i_un.i_addr[i+1];
- return(nb);
- }