[XFS] move v_iocount from bhv_vnode to xfs_inode
authorChristoph Hellwig <hch@infradead.org>
Wed, 29 Aug 2007 01:46:28 +0000 (11:46 +1000)
committerTim Shimmin <tes@chook.melbourne.sgi.com>
Tue, 16 Oct 2007 01:38:56 +0000 (11:38 +1000)
struct bhv_vnode is on it's way out, so move the I/O count to the XFS
inode.

SGI-PV: 969608
SGI-Modid: xfs-linux-melb:xfs-kern:29497a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_aops.h
fs/xfs/linux-2.6/xfs_vnode.c
fs/xfs/linux-2.6/xfs_vnode.h
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vnodeops.c

index 22a40bd0cce29bc66e0370b38dbe658eefd56d1d..1dd198ec28904d79f406d6aaf4bd80dd482c82a2 100644 (file)
@@ -140,9 +140,11 @@ xfs_destroy_ioend(
                next = bh->b_private;
                bh->b_end_io(bh, !ioend->io_error);
        }
-       if (unlikely(ioend->io_error))
-               vn_ioerror(ioend->io_vnode, ioend->io_error, __FILE__,__LINE__);
-       vn_iowake(ioend->io_vnode);
+       if (unlikely(ioend->io_error)) {
+               vn_ioerror(XFS_I(ioend->io_inode), ioend->io_error,
+                               __FILE__,__LINE__);
+       }
+       vn_iowake(XFS_I(ioend->io_inode));
        mempool_free(ioend, xfs_ioend_pool);
 }
 
@@ -157,14 +159,10 @@ STATIC void
 xfs_setfilesize(
        xfs_ioend_t             *ioend)
 {
-       xfs_inode_t             *ip;
+       xfs_inode_t             *ip = XFS_I(ioend->io_inode);
        xfs_fsize_t             isize;
        xfs_fsize_t             bsize;
 
-       ip = xfs_vtoi(ioend->io_vnode);
-       if (!ip)
-               return;
-
        ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG);
        ASSERT(ioend->io_type != IOMAP_READ);
 
@@ -228,12 +226,11 @@ xfs_end_bio_unwritten(
 {
        xfs_ioend_t             *ioend =
                container_of(work, xfs_ioend_t, io_work);
-       bhv_vnode_t             *vp = ioend->io_vnode;
        xfs_off_t               offset = ioend->io_offset;
        size_t                  size = ioend->io_size;
 
        if (likely(!ioend->io_error)) {
-               xfs_bmap(xfs_vtoi(vp), offset, size,
+               xfs_bmap(XFS_I(ioend->io_inode), offset, size,
                                BMAPI_UNWRITTEN, NULL, NULL);
                xfs_setfilesize(ioend);
        }
@@ -277,10 +274,10 @@ xfs_alloc_ioend(
        ioend->io_error = 0;
        ioend->io_list = NULL;
        ioend->io_type = type;
-       ioend->io_vnode = vn_from_inode(inode);
+       ioend->io_inode = inode;
        ioend->io_buffer_head = NULL;
        ioend->io_buffer_tail = NULL;
-       atomic_inc(&ioend->io_vnode->v_iocount);
+       atomic_inc(&XFS_I(ioend->io_inode)->i_iocount);
        ioend->io_offset = 0;
        ioend->io_size = 0;
 
@@ -506,7 +503,7 @@ xfs_cancel_ioend(
                        unlock_buffer(bh);
                } while ((bh = next_bh) != NULL);
 
-               vn_iowake(ioend->io_vnode);
+               vn_iowake(XFS_I(ioend->io_inode));
                mempool_free(ioend, xfs_ioend_pool);
        } while ((ioend = next) != NULL);
 }
index 2244e516b66a339600830928682a7155df931639..3ba0631a38182fe04640d39c86551a84f653e05e 100644 (file)
@@ -32,7 +32,7 @@ typedef struct xfs_ioend {
        unsigned int            io_type;        /* delalloc / unwritten */
        int                     io_error;       /* I/O error code */
        atomic_t                io_remaining;   /* hold count */
-       struct bhv_vnode        *io_vnode;      /* file being written to */
+       struct inode            *io_inode;      /* file being written to */
        struct buffer_head      *io_buffer_head;/* buffer linked list head */
        struct buffer_head      *io_buffer_tail;/* buffer linked list tail */
        size_t                  io_size;        /* size of the extent */
index e6c559aee446724cf5e43ca121d74f289e751afe..bde8d2e7f559d5caf087c97c44b4c296b9874209 100644 (file)
 #include "xfs_bmap_btree.h"
 #include "xfs_inode.h"
 
+/*
+ * And this gunk is needed for xfs_mount.h"
+ */
+#include "xfs_log.h"
+#include "xfs_trans.h"
+#include "xfs_sb.h"
+#include "xfs_dmapi.h"
+#include "xfs_inum.h"
+#include "xfs_ag.h"
+#include "xfs_mount.h"
+
 uint64_t vn_generation;                /* vnode generation number */
 DEFINE_SPINLOCK(vnumber_lock);
 
@@ -42,19 +53,19 @@ vn_init(void)
 
 void
 vn_iowait(
-       bhv_vnode_t     *vp)
+       xfs_inode_t     *ip)
 {
-       wait_queue_head_t *wq = vptosync(vp);
+       wait_queue_head_t *wq = vptosync(ip);
 
-       wait_event(*wq, (atomic_read(&vp->v_iocount) == 0));
+       wait_event(*wq, (atomic_read(&ip->i_iocount) == 0));
 }
 
 void
 vn_iowake(
-       bhv_vnode_t     *vp)
+       xfs_inode_t     *ip)
 {
-       if (atomic_dec_and_test(&vp->v_iocount))
-               wake_up(vptosync(vp));
+       if (atomic_dec_and_test(&ip->i_iocount))
+               wake_up(vptosync(ip));
 }
 
 /*
@@ -64,12 +75,12 @@ vn_iowake(
  */
 void
 vn_ioerror(
-       bhv_vnode_t     *vp,
+       xfs_inode_t     *ip,
        int             error,
        char            *f,
        int             l)
 {
-       bhv_vfs_t       *vfsp = vfs_from_sb(vp->v_inode.i_sb);
+       bhv_vfs_t       *vfsp = XFS_MTOVFS(ip->i_mount);
 
        if (unlikely(error == -ENODEV))
                bhv_vfs_force_shutdown(vfsp, SHUTDOWN_DEVICE_REQ, f, l);
@@ -92,8 +103,6 @@ vn_initialize(
 
        ASSERT(VN_CACHED(vp) == 0);
 
-       atomic_set(&vp->v_iocount, 0);
-
 #ifdef XFS_VNODE_TRACE
        vp->v_trace = ktrace_alloc(VNODE_TRACE_SIZE, KM_SLEEP);
 #endif /* XFS_VNODE_TRACE */
index c8af208a73dce5bf70de7b4ea45c8fbaac3006b9..321346d95267ed7d812882fffe7fad2b9ea9cdcb 100644 (file)
@@ -29,7 +29,6 @@ typedef __u64         bhv_vnumber_t;
 
 typedef struct bhv_vnode {
        bhv_vnumber_t   v_number;               /* in-core vnode number */
-       atomic_t        v_iocount;              /* outstanding I/O count */
 #ifdef XFS_VNODE_TRACE
        struct ktrace   *v_trace;               /* trace header structure    */
 #endif
@@ -202,10 +201,13 @@ extern int        vn_revalidate(struct bhv_vnode *);
 extern int     __vn_revalidate(struct bhv_vnode *, bhv_vattr_t *);
 extern void    vn_revalidate_core(struct bhv_vnode *, bhv_vattr_t *);
 
-extern void    vn_iowait(struct bhv_vnode *vp);
-extern void    vn_iowake(struct bhv_vnode *vp);
-
-extern void    vn_ioerror(struct bhv_vnode *vp, int error, char *f, int l);
+/*
+ * Yeah, these don't take vnode anymore at all, all this should be
+ * cleaned up at some point.
+ */
+extern void    vn_iowait(struct xfs_inode *ip);
+extern void    vn_iowake(struct xfs_inode *ip);
+extern void    vn_ioerror(struct xfs_inode *ip, int error, char *f, int l);
 
 static inline int vn_count(struct bhv_vnode *vp)
 {
index c07553bbcdb470d10e2c575d41768f5cd0ed8a36..0349e714dc309daf7f1ec43cd0814f2f5eca3750 100644 (file)
@@ -864,6 +864,7 @@ xfs_iread(
        ip = kmem_zone_zalloc(xfs_inode_zone, KM_SLEEP);
        ip->i_ino = ino;
        ip->i_mount = mp;
+       atomic_set(&ip->i_iocount, 0);
        spin_lock_init(&ip->i_flags_lock);
 
        /*
@@ -1455,7 +1456,7 @@ xfs_itruncate_start(
        mp = ip->i_mount;
        vp = XFS_ITOV(ip);
 
-       vn_iowait(vp);  /* wait for the completion of any pending DIOs */
+       vn_iowait(ip);  /* wait for the completion of any pending DIOs */
        
        /*
         * Call toss_pages or flushinval_pages to get rid of pages
index ea1e24effd49dc45f18205057c8e15c243a470ea..c8bb1a818a52380e4042a1770f76d7e10c139ea1 100644 (file)
@@ -299,6 +299,7 @@ typedef struct xfs_inode {
        struct hlist_node       i_cnode;        /* cluster link node */
 
        xfs_fsize_t             i_size;         /* in-memory size */
+       atomic_t                i_iocount;      /* outstanding I/O count */
        /* Trace buffers per inode. */
 #ifdef XFS_BMAP_TRACE
        struct ktrace           *i_xtrace;      /* inode extent list trace */
index a9cebcb0b33b96472fc0e36d8dc3cc2de6cc583d..3fe64a3a77a91d69685e0a3c4f9343aeb758f48a 100644 (file)
@@ -1209,7 +1209,7 @@ xfs_sync_inodes(
                         * place after this point
                         */
                        if (flags & SYNC_IOWAIT)
-                               vn_iowait(vp);
+                               vn_iowait(ip);
 
                        xfs_ilock(ip, XFS_ILOCK_SHARED);
                }
index 8ed7af3c5d63d3bdab304509641e2f32ecd10a65..e7ef78fb4da31ccc776795768545c8be9fd4854a 100644 (file)
@@ -598,7 +598,7 @@ xfs_setattr(
                }
 
                /* wait for all I/O to complete */
-               vn_iowait(vp);
+               vn_iowait(ip);
 
                if (!code)
                        code = xfs_itruncate_data(ip, vap->va_size);
@@ -3683,7 +3683,7 @@ xfs_reclaim(
                return 0;
        }
 
-       vn_iowait(vp);
+       vn_iowait(ip);
 
        ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0);
 
@@ -4189,7 +4189,7 @@ xfs_free_file_space(
                need_iolock = 0;
        if (need_iolock) {
                xfs_ilock(ip, XFS_IOLOCK_EXCL);
-               vn_iowait(vp);  /* wait for the completion of any pending DIOs */
+               vn_iowait(ip);  /* wait for the completion of any pending DIOs */
        }
 
        rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, NBPP);