The thread/proc pointer argument in the VFS subsystem originally existed
[dragonfly.git] / sys / vfs / ufs / ffs_inode.c
index 8219e0c..f556b77 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ffs_inode.c 8.13 (Berkeley) 4/21/95
  * $FreeBSD: src/sys/ufs/ffs/ffs_inode.c,v 1.56.2.5 2002/02/05 18:35:03 dillon Exp $
- * $DragonFly: src/sys/vfs/ufs/ffs_inode.c,v 1.11 2004/07/18 19:43:48 drhodus Exp $
+ * $DragonFly: src/sys/vfs/ufs/ffs_inode.c,v 1.22 2006/05/06 02:43:14 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -97,8 +97,9 @@ ffs_update(struct vnode *vp, int waitfor)
                ip->i_din.di_ouid = ip->i_uid;          /* XXX */
                ip->i_din.di_ogid = ip->i_gid;          /* XXX */
        }                                               /* XXX */
-       error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)),
-               (int)fs->fs_bsize, &bp);
+       error = bread(ip->i_devvp, 
+                     fsbtodoff(fs, ino_to_fsba(fs, ip->i_number)),
+                     (int)fs->fs_bsize, &bp);
        if (error) {
                brelse(bp);
                return (error);
@@ -107,7 +108,7 @@ ffs_update(struct vnode *vp, int waitfor)
                softdep_update_inodeblock(ip, bp, waitfor);
        else if (ip->i_effnlink != ip->i_nlink)
                panic("ffs_update: bad link cnt");
-       *((struct dinode *)bp->b_data +
+       *((struct ufs1_dinode *)bp->b_data +
            ino_to_fsbo(fs, ip->i_number)) = ip->i_din;
        if (waitfor && !DOINGASYNC(vp)) {
                return (bwrite(bp));
@@ -129,8 +130,7 @@ ffs_update(struct vnode *vp, int waitfor)
  * disk blocks.
  */
 int
-ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
-            struct thread *td)
+ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred)
 {
        struct vnode *ovp = vp;
        ufs_daddr_t lastblock;
@@ -169,7 +169,7 @@ ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
        if (fs->fs_ronly)
                panic("ffs_truncate: read-only filesystem");
 #ifdef QUOTA
-       error = getinoquota(oip);
+       error = ufs_getinoquota(oip);
        if (error)
                return (error);
 #endif
@@ -185,14 +185,15 @@ ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
                         * rarely, we solve the problem by syncing the file
                         * so that it will have no data structures left.
                         */
-                       if ((error = VOP_FSYNC(ovp, MNT_WAIT, td)) != 0)
+                       if ((error = VOP_FSYNC(ovp, MNT_WAIT)) != 0)
                                return (error);
                } else {
 #ifdef QUOTA
-                       (void) chkdq(oip, -oip->i_blocks, NOCRED, 0);
+                       (void) ufs_chkdq(oip, -oip->i_blocks, NOCRED, 0);
 #endif
                        softdep_setup_freeblocks(oip, length);
-                       vinvalbuf(ovp, 0, td, 0, 0);
+                       vinvalbuf(ovp, 0, 0, 0);
+                       vnode_pager_setsize(ovp, 0);
                        oip->i_flag |= IN_CHANGE | IN_UPDATE;
                        return (ffs_update(ovp, 0));
                }
@@ -252,7 +253,7 @@ ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
                 */
                if (DOINGSOFTDEP(ovp) && lbn < NDADDR &&
                    fragroundup(fs, blkoff(fs, length)) < fs->fs_bsize &&
-                   (error = VOP_FSYNC(ovp, MNT_WAIT, td)) != 0) {
+                   (error = VOP_FSYNC(ovp, MNT_WAIT)) != 0) {
                                return (error);
                }
                oip->i_size = length;
@@ -280,6 +281,7 @@ ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
        lastiblock[DOUBLE] = lastiblock[SINGLE] - NINDIR(fs);
        lastiblock[TRIPLE] = lastiblock[DOUBLE] - NINDIR(fs) * NINDIR(fs);
        nblocks = btodb(fs->fs_bsize);
+
        /*
         * Update file and block pointers on disk before we start freeing
         * blocks.  If we crash before free'ing blocks below, the blocks
@@ -307,7 +309,7 @@ ffs_truncate(struct vnode *vp, off_t length, int flags, struct ucred *cred,
        bcopy((caddr_t)oldblks, (caddr_t)&oip->i_db[0], sizeof oldblks);
        oip->i_size = osize;
 
-       error = vtruncbuf(ovp, td, length, fs->fs_bsize);
+       error = vtruncbuf(ovp, length, fs->fs_bsize);
        if (error && (allerror == 0))
                allerror = error;
 
@@ -389,8 +391,8 @@ done:
                if (newblks[i] != oip->i_db[i])
                        panic("ffs_truncate2");
        if (length == 0 &&
-           (!TAILQ_EMPTY(&ovp->v_dirtyblkhd) ||
-            !TAILQ_EMPTY(&ovp->v_cleanblkhd)))
+           (!RB_EMPTY(&ovp->v_rbdirty_tree) ||
+            !RB_EMPTY(&ovp->v_rbclean_tree)))
                panic("ffs_truncate3");
 #endif /* DIAGNOSTIC */
        /*
@@ -403,7 +405,7 @@ done:
                oip->i_blocks = 0;
        oip->i_flag |= IN_CHANGE;
 #ifdef QUOTA
-       (void) chkdq(oip, -blocksreleased, NOCRED, 0);
+       (void) ufs_chkdq(oip, -blocksreleased, NOCRED, 0);
 #endif
        return (allerror);
 }
@@ -448,19 +450,29 @@ ffs_indirtrunc(struct inode *ip, ufs_daddr_t lbn, ufs_daddr_t dbn,
         * to blocks to be free'd, and update on disk copy first.  Since
         * double(triple) indirect before single(double) indirect, calls
         * to bmap on these blocks will fail.  However, we already have
-        * the on disk address, so we have to set the b_blkno field
+        * the on disk address, so we have to set the bio_offset field
         * explicitly instead of letting bread do everything for us.
         */
        vp = ITOV(ip);
-       bp = getblk(vp, lbn, (int)fs->fs_bsize, 0, 0);
+       bp = getblk(vp, lblktodoff(fs, lbn), (int)fs->fs_bsize, 0, 0);
        if ((bp->b_flags & B_CACHE) == 0) {
-               bp->b_flags |= B_READ;
                bp->b_flags &= ~(B_ERROR|B_INVAL);
+               bp->b_cmd = BUF_CMD_READ;
                if (bp->b_bcount > bp->b_bufsize)
                        panic("ffs_indirtrunc: bad buffer size");
-               bp->b_blkno = dbn;
-               vfs_busy_pages(bp, 0);
-               VOP_STRATEGY(bp->b_vp, bp);
+               bp->b_bio2.bio_offset = dbtodoff(fs, dbn);
+               vfs_busy_pages(vp, bp);
+               /*
+                * Access the block device layer using the device vnode
+                * and the translated block number (bio2) instead of the
+                * file vnode (vp) and logical block number (bio1).
+                *
+                * Even though we are bypassing the vnode layer, we still
+                * want the vnode state to indicate that an I/O on its behalf
+                * is in progress.
+                */
+               bio_start_transaction(&bp->b_bio1, &vp->v_track_read);
+               vn_strategy(ip->i_devvp, &bp->b_bio2);
                error = biowait(bp);
        }
        if (error) {