linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / xfs / xfs_vnodeops.c
index 7151482..aa90340 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2006 Silicon Graphics, Inc.
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.
  * All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -16,6 +16,8 @@
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <linux/capability.h>
+
 #include "xfs.h"
 #include "xfs_fs.h"
 #include "xfs_types.h"
@@ -25,6 +27,7 @@
 #include "xfs_trans.h"
 #include "xfs_sb.h"
 #include "xfs_ag.h"
+#include "xfs_dir.h"
 #include "xfs_dir2.h"
 #include "xfs_dmapi.h"
 #include "xfs_mount.h"
 #include "xfs_bmap_btree.h"
 #include "xfs_alloc_btree.h"
 #include "xfs_ialloc_btree.h"
+#include "xfs_dir_sf.h"
 #include "xfs_dir2_sf.h"
 #include "xfs_attr_sf.h"
 #include "xfs_dinode.h"
 #include "xfs_inode.h"
 #include "xfs_inode_item.h"
+#include "xfs_dir_leaf.h"
 #include "xfs_itable.h"
 #include "xfs_btree.h"
 #include "xfs_ialloc.h"
 #include "xfs_log_priv.h"
 #include "xfs_mac.h"
 
+
+/*
+ * The maximum pathlen is 1024 bytes. Since the minimum file system
+ * blocksize is 512 bytes, we can get a max of 2 extents back from
+ * bmapi.
+ */
+#define SYMLINK_MAPS 2
+
+/*
+ * For xfs, we check that the file isn't too big to be opened by this kernel.
+ * No other open action is required for regular files.  Devices are handled
+ * through the specfs file system, pipes through fifofs.  Device and
+ * fifo vnodes are "wrapped" by specfs and fifofs vnodes, respectively,
+ * when a new vnode is first looked up or created.
+ */
 STATIC int
 xfs_open(
        bhv_desc_t      *bdp,
        cred_t          *credp)
 {
        int             mode;
-       bhv_vnode_t     *vp = BHV_TO_VNODE(bdp);
-       xfs_inode_t     *ip = XFS_BHVTOI(bdp);
+       vnode_t         *vp;
+       xfs_inode_t     *ip;
+
+       vp = BHV_TO_VNODE(bdp);
+       ip = XFS_BHVTOI(bdp);
 
        if (XFS_FORCED_SHUTDOWN(ip->i_mount))
                return XFS_ERROR(EIO);
@@ -78,35 +101,6 @@ xfs_open(
        return 0;
 }
 
-STATIC int
-xfs_close(
-       bhv_desc_t      *bdp,
-       int             flags,
-       lastclose_t     lastclose,
-       cred_t          *credp)
-{
-       bhv_vnode_t     *vp = BHV_TO_VNODE(bdp);
-       xfs_inode_t     *ip = XFS_BHVTOI(bdp);
-
-       if (XFS_FORCED_SHUTDOWN(ip->i_mount))
-               return XFS_ERROR(EIO);
-
-       if (lastclose != L_TRUE || !VN_ISREG(vp))
-               return 0;
-
-       /*
-        * If we previously truncated this file and removed old data in
-        * the process, we want to initiate "early" writeout on the last
-        * close.  This is an attempt to combat the notorious NULL files
-        * problem which is particularly noticable from a truncate down,
-        * buffered (re-)write (delalloc), followed by a crash.  What we
-        * are effectively doing here is significantly reducing the time
-        * window where we'd otherwise be exposed to that problem.
-        */
-       if (VUNTRUNCATE(vp) && VN_DIRTY(vp) && ip->i_delayed_blks > 0)
-               return bhv_vop_flush_pages(vp, 0, -1, XFS_B_ASYNC, FI_NONE);
-       return 0;
-}
 
 /*
  * xfs_getattr
@@ -114,13 +108,13 @@ xfs_close(
 STATIC int
 xfs_getattr(
        bhv_desc_t      *bdp,
-       bhv_vattr_t     *vap,
+       vattr_t         *vap,
        int             flags,
        cred_t          *credp)
 {
        xfs_inode_t     *ip;
        xfs_mount_t     *mp;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
 
        vp  = BHV_TO_VNODE(bdp);
        vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
@@ -248,7 +242,7 @@ xfs_getattr(
 int
 xfs_setattr(
        bhv_desc_t              *bdp,
-       bhv_vattr_t             *vap,
+       vattr_t                 *vap,
        int                     flags,
        cred_t                  *credp)
 {
@@ -263,7 +257,7 @@ xfs_setattr(
        gid_t                   gid=0, igid=0;
        xid_t                   xid=0, ixid=0;
        int                     timeflags = 0;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        xfs_prid_t              projid=0, iprojid=0;
        int                     mandlock_before, mandlock_after;
        struct xfs_dquot        *udqp, *gdqp, *olddquot1, *olddquot2;
@@ -356,6 +350,7 @@ xfs_setattr(
         */
        tp = NULL;
        lock_flags = XFS_ILOCK_EXCL;
+       ASSERT(flags & ATTR_NOLOCK ? flags & ATTR_DMI : 1);
        if (flags & ATTR_NOLOCK)
                need_iolock = 0;
        if (!(mask & XFS_AT_SIZE)) {
@@ -628,7 +623,6 @@ xfs_setattr(
                        code = xfs_igrow_start(ip, vap->va_size, credp);
                }
                xfs_iunlock(ip, XFS_ILOCK_EXCL);
-               vn_iowait(vp); /* wait for the completion of any pending DIOs */
                if (!code)
                        code = xfs_itruncate_data(ip, vap->va_size);
                if (code) {
@@ -679,17 +673,9 @@ xfs_setattr(
                                            ((ip->i_d.di_nlink != 0 ||
                                              !(mp->m_flags & XFS_MOUNT_WSYNC))
                                             ? 1 : 0));
-                       if (code)
+                       if (code) {
                                goto abort_return;
-                       /*
-                        * Truncated "down", so we're removing references
-                        * to old data here - if we now delay flushing for
-                        * a long time, we expose ourselves unduly to the
-                        * notorious NULL files problem.  So, we mark this
-                        * vnode and flush it when the file is closed, and
-                        * do not wait the usual (long) time for writeout.
-                        */
-                       VTRUNCATE(vp);
+                       }
                }
                /*
                 * Have to do this even if the file's size doesn't change.
@@ -831,8 +817,6 @@ xfs_setattr(
                                di_flags |= XFS_DIFLAG_NODUMP;
                        if (vap->va_xflags & XFS_XFLAG_PROJINHERIT)
                                di_flags |= XFS_DIFLAG_PROJINHERIT;
-                       if (vap->va_xflags & XFS_XFLAG_NODEFRAG)
-                               di_flags |= XFS_DIFLAG_NODEFRAG;
                        if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) {
                                if (vap->va_xflags & XFS_XFLAG_RTINHERIT)
                                        di_flags |= XFS_DIFLAG_RTINHERIT;
@@ -881,7 +865,7 @@ xfs_setattr(
         * If this is a synchronous mount, make sure that the
         * transaction goes to disk before returning to the user.
         * This is slightly sub-optimal in that truncates require
-        * two sync transactions instead of one for wsync filesystems.
+        * two sync transactions instead of one for wsync filesytems.
         * One for the truncate and one for the timestamps since we
         * don't want to change the timestamps unless we're sure the
         * truncate worked.  Truncates are less than 1% of the laddis
@@ -902,7 +886,7 @@ xfs_setattr(
         */
        mandlock_after = MANDLOCK(vp, ip->i_d.di_mode);
        if (mandlock_before != mandlock_after) {
-               bhv_vop_vnode_change(vp, VCHANGE_FLAGS_ENF_LOCKING,
+               VOP_VNODE_CHANGE(vp, VCHANGE_FLAGS_ENF_LOCKING,
                                 mandlock_after);
        }
 
@@ -968,13 +952,6 @@ xfs_access(
 }
 
 
-/*
- * The maximum pathlen is 1024 bytes. Since the minimum file system
- * blocksize is 512 bytes, we can get a max of 2 extents back from
- * bmapi.
- */
-#define SYMLINK_MAPS 2
-
 /*
  * xfs_readlink
  *
@@ -990,7 +967,7 @@ xfs_readlink(
        int             count;
        xfs_off_t       offset;
        int             pathlen;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
        int             error = 0;
        xfs_mount_t     *mp;
        int             nmaps;
@@ -1040,7 +1017,7 @@ xfs_readlink(
                nmaps = SYMLINK_MAPS;
 
                error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen),
-                                 0, NULL, 0, mval, &nmaps, NULL, NULL);
+                                 0, NULL, 0, mval, &nmaps, NULL);
 
                if (error) {
                        goto error_return;
@@ -1210,7 +1187,7 @@ xfs_fsync(
 
                /*
                 * If this inode is on the RT dev we need to flush that
-                * cache as well.
+                * cache aswell.
                 */
                if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME)
                        xfs_blkdev_issue_flush(ip->i_mount->m_rtdev_targp);
@@ -1248,8 +1225,8 @@ xfs_inactive_free_eofblocks(
 
        nimaps = 1;
        xfs_ilock(ip, XFS_ILOCK_SHARED);
-       error = XFS_BMAPI(mp, NULL, &ip->i_iocore, end_fsb, map_len, 0,
-                         NULL, 0, &imap, &nimaps, NULL, NULL);
+       error = xfs_bmapi(NULL, ip, end_fsb, map_len, 0,
+                         NULL, 0, &imap, &nimaps, NULL);
        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
        if (!error && (nimaps != 0) &&
@@ -1375,10 +1352,10 @@ xfs_inactive_symlink_rmt(
         */
        done = 0;
        XFS_BMAP_INIT(&free_list, &first_block);
-       nmaps = ARRAY_SIZE(mval);
+       nmaps = sizeof(mval) / sizeof(mval[0]);
        if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size),
                        XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps,
-                       &free_list, NULL)))
+                       &free_list)))
                goto error0;
        /*
         * Invalidate the block(s).
@@ -1393,7 +1370,7 @@ xfs_inactive_symlink_rmt(
         * Unmap the dead block(s) to the free_list.
         */
        if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps,
-                       &first_block, &free_list, NULL, &done)))
+                       &first_block, &free_list, &done)))
                goto error1;
        ASSERT(done);
        /*
@@ -1420,7 +1397,7 @@ xfs_inactive_symlink_rmt(
         */
        ntp = xfs_trans_dup(tp);
        /*
-        * Commit the transaction containing extent freeing and EFDs.
+        * Commit the transaction containing extent freeing and EFD's.
         * If we get an error on the commit here or on the reserve below,
         * we need to unlock the inode since the new transaction doesn't
         * have the inode attached.
@@ -1509,6 +1486,9 @@ xfs_inactive_symlink_local(
        return 0;
 }
 
+/*
+ *
+ */
 STATIC int
 xfs_inactive_attrs(
        xfs_inode_t     *ip,
@@ -1561,16 +1541,16 @@ xfs_release(
        bhv_desc_t      *bdp)
 {
        xfs_inode_t     *ip;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
        xfs_mount_t     *mp;
        int             error;
 
        vp = BHV_TO_VNODE(bdp);
        ip = XFS_BHVTOI(bdp);
-       mp = ip->i_mount;
 
-       if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0))
+       if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) {
                return 0;
+       }
 
        /* If this is a read-only mount, don't do this (would generate I/O) */
        if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
@@ -1582,6 +1562,8 @@ xfs_release(
                return 0;
 #endif
 
+       mp = ip->i_mount;
+
        if (ip->i_d.di_nlink != 0) {
                if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) &&
                     ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 ||
@@ -1592,7 +1574,7 @@ xfs_release(
                        if ((error = xfs_inactive_free_eofblocks(mp, ip)))
                                return error;
                        /* Update linux inode block count after free above */
-                       vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,
+                       LINVFS_GET_IP(vp)->i_blocks = XFS_FSB_TO_BB(mp,
                                ip->i_d.di_nblocks + ip->i_delayed_blks);
                }
        }
@@ -1614,8 +1596,8 @@ xfs_inactive(
        cred_t          *credp)
 {
        xfs_inode_t     *ip;
-       bhv_vnode_t     *vp;
-       xfs_bmap_free_t free_list;
+       vnode_t         *vp;
+       xfs_bmap_free_t free_list; 
        xfs_fsblock_t   first_block;
        int             committed;
        xfs_trans_t     *tp;
@@ -1673,7 +1655,7 @@ xfs_inactive(
                        if ((error = xfs_inactive_free_eofblocks(mp, ip)))
                                return VN_INACTIVE_CACHE;
                        /* Update linux inode block count after free above */
-                       vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,
+                       LINVFS_GET_IP(vp)->i_blocks = XFS_FSB_TO_BB(mp,
                                ip->i_d.di_nblocks + ip->i_delayed_blks);
                }
                goto out;
@@ -1795,7 +1777,7 @@ xfs_inactive(
                        cmn_err(CE_NOTE,
                "xfs_inactive:  xfs_ifree() returned an error = %d on %s",
                                error, mp->m_fsname);
-                       xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
+                       xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR);
                }
                xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
        } else {
@@ -1830,17 +1812,17 @@ xfs_inactive(
 STATIC int
 xfs_lookup(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
-       bhv_vnode_t             **vpp,
+       vname_t                 *dentry,
+       vnode_t                 **vpp,
        int                     flags,
-       bhv_vnode_t             *rdir,
+       vnode_t                 *rdir,
        cred_t                  *credp)
 {
        xfs_inode_t             *dp, *ip;
        xfs_ino_t               e_inum;
        int                     error;
        uint                    lock_mode;
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
 
        dir_vp = BHV_TO_VNODE(dir_bdp);
        vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address);
@@ -1867,15 +1849,15 @@ xfs_lookup(
 STATIC int
 xfs_create(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
-       bhv_vattr_t             *vap,
-       bhv_vnode_t             **vpp,
+       vname_t                 *dentry,
+       vattr_t                 *vap,
+       vnode_t                 **vpp,
        cred_t                  *credp)
 {
        char                    *name = VNAME(dentry);
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
        xfs_inode_t             *dp, *ip;
-       bhv_vnode_t             *vp = NULL;
+       vnode_t                 *vp=NULL;
        xfs_trans_t             *tp;
        xfs_mount_t             *mp;
        xfs_dev_t               rdev;
@@ -1973,7 +1955,8 @@ xfs_create(
        if (error)
                goto error_return;
 
-       if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen)))
+       if (resblks == 0 &&
+           (error = XFS_DIR_CANENTER(mp, tp, dp, name, namelen)))
                goto error_return;
        rdev = (vap->va_mask & XFS_AT_RDEV) ? vap->va_rdev : 0;
        error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 1,
@@ -2004,9 +1987,9 @@ xfs_create(
        xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
        dp_joined_to_trans = B_TRUE;
 
-       error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino,
-                                       &first_block, &free_list, resblks ?
-                                       resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
+       error = XFS_DIR_CREATENAME(mp, tp, dp, name, namelen, ip->i_ino,
+               &first_block, &free_list,
+               resblks ? resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
        if (error) {
                ASSERT(error != ENOSPC);
                goto abort_return;
@@ -2057,10 +2040,10 @@ xfs_create(
        XFS_QM_DQRELE(mp, gdqp);
 
        /*
-        * Propagate the fact that the vnode changed after the
+        * Propogate the fact that the vnode changed after the
         * xfs_inode locks have been released.
         */
-       bhv_vop_vnode_change(vp, VCHANGE_FLAGS_TRUNCATED, 3);
+       VOP_VNODE_CHANGE(vp, VCHANGE_FLAGS_TRUNCATED, 3);
 
        *vpp = vp;
 
@@ -2141,7 +2124,7 @@ int xfs_rm_attempts;
 STATIC int
 xfs_lock_dir_and_entry(
        xfs_inode_t     *dp,
-       bhv_vname_t     *dentry,
+       vname_t         *dentry,
        xfs_inode_t     *ip)    /* inode of entry 'name' */
 {
        int             attempts;
@@ -2355,10 +2338,10 @@ int remove_which_error_return = 0;
 STATIC int
 xfs_remove(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
+       vname_t                 *dentry,
        cred_t                  *credp)
 {
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
        char                    *name = VNAME(dentry);
        xfs_inode_t             *dp, *ip;
        xfs_trans_t             *tp = NULL;
@@ -2404,7 +2387,7 @@ xfs_remove(
         * for a log reservation. Since we'll have to wait for the
         * inactive code to complete before returning from xfs_iget,
         * we need to make sure that we don't have log space reserved
-        * when we call xfs_iget.  Instead we get an unlocked reference
+        * when we call xfs_iget.  Instead we get an unlocked referece
         * to the inode before getting our log reservation.
         */
        error = xfs_get_dir_entry(dentry, &ip);
@@ -2482,8 +2465,8 @@ xfs_remove(
         * Entry must exist since we did a lookup in xfs_lock_dir_and_entry.
         */
        XFS_BMAP_INIT(&free_list, &first_block);
-       error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino,
-                                       &first_block, &free_list, 0);
+       error = XFS_DIR_REMOVENAME(mp, tp, dp, name, namelen, ip->i_ino,
+               &first_block, &free_list, 0);
        if (error) {
                ASSERT(error != ENOENT);
                REMOVE_DEBUG_TRACE(__LINE__);
@@ -2545,7 +2528,7 @@ xfs_remove(
        /*
         * Let interposed file systems know about removed links.
         */
-       bhv_vop_link_removed(XFS_ITOV(ip), dir_vp, link_zero);
+       VOP_LINK_REMOVED(XFS_ITOV(ip), dir_vp, link_zero);
 
        IRELE(ip);
 
@@ -2598,8 +2581,8 @@ xfs_remove(
 STATIC int
 xfs_link(
        bhv_desc_t              *target_dir_bdp,
-       bhv_vnode_t             *src_vp,
-       bhv_vname_t             *dentry,
+       vnode_t                 *src_vp,
+       vname_t                 *dentry,
        cred_t                  *credp)
 {
        xfs_inode_t             *tdp, *sip;
@@ -2611,7 +2594,7 @@ xfs_link(
        xfs_fsblock_t           first_block;
        int                     cancel_flags;
        int                     committed;
-       bhv_vnode_t             *target_dir_vp;
+       vnode_t                 *target_dir_vp;
        int                     resblks;
        char                    *target_name = VNAME(dentry);
        int                     target_namelen;
@@ -2621,7 +2604,8 @@ xfs_link(
        vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address);
 
        target_namelen = VNAMELEN(dentry);
-       ASSERT(!VN_ISDIR(src_vp));
+       if (VN_ISDIR(src_vp))
+               return XFS_ERROR(EPERM);
 
        sip = xfs_vtoi(src_vp);
        tdp = XFS_BHVTOI(target_dir_bdp);
@@ -2696,17 +2680,18 @@ xfs_link(
         */
        if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
                     (tdp->i_d.di_projid != sip->i_d.di_projid))) {
-               error = XFS_ERROR(EXDEV);
+               error = XFS_ERROR(EPERM);
                goto error_return;
        }
 
        if (resblks == 0 &&
-           (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen)))
+           (error = XFS_DIR_CANENTER(mp, tp, tdp, target_name,
+                       target_namelen)))
                goto error_return;
 
        XFS_BMAP_INIT(&free_list, &first_block);
 
-       error = xfs_dir_createname(tp, tdp, target_name, target_namelen,
+       error = XFS_DIR_CREATENAME(mp, tp, tdp, target_name, target_namelen,
                                   sip->i_ino, &first_block, &free_list,
                                   resblks);
        if (error)
@@ -2716,8 +2701,9 @@ xfs_link(
        xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE);
 
        error = xfs_bumplink(tp, sip);
-       if (error)
+       if (error) {
                goto abort_return;
+       }
 
        /*
         * If this is a synchronous mount, make sure that the
@@ -2735,8 +2721,9 @@ xfs_link(
        }
 
        error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL);
-       if (error)
+       if (error) {
                goto std_return;
+       }
 
        /* Fall through to std_return with error = 0. */
 std_return:
@@ -2757,8 +2744,6 @@ std_return:
        xfs_trans_cancel(tp, cancel_flags);
        goto std_return;
 }
-
-
 /*
  * xfs_mkdir
  *
@@ -2766,15 +2751,15 @@ std_return:
 STATIC int
 xfs_mkdir(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
-       bhv_vattr_t             *vap,
-       bhv_vnode_t             **vpp,
+       vname_t                 *dentry,
+       vattr_t                 *vap,
+       vnode_t                 **vpp,
        cred_t                  *credp)
 {
        char                    *dir_name = VNAME(dentry);
        xfs_inode_t             *dp;
        xfs_inode_t             *cdp;   /* inode of created dir */
-       bhv_vnode_t             *cvp;   /* vnode of created dir */
+       vnode_t                 *cvp;   /* vnode of created dir */
        xfs_trans_t             *tp;
        xfs_mount_t             *mp;
        int                     cancel_flags;
@@ -2782,7 +2767,7 @@ xfs_mkdir(
        int                     committed;
        xfs_bmap_free_t         free_list;
        xfs_fsblock_t           first_block;
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
        boolean_t               dp_joined_to_trans;
        boolean_t               created = B_FALSE;
        int                     dm_event_sent = 0;
@@ -2872,7 +2857,7 @@ xfs_mkdir(
                goto error_return;
 
        if (resblks == 0 &&
-           (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen)))
+           (error = XFS_DIR_CANENTER(mp, tp, dp, dir_name, dir_namelen)))
                goto error_return;
        /*
         * create the directory inode.
@@ -2899,9 +2884,9 @@ xfs_mkdir(
 
        XFS_BMAP_INIT(&free_list, &first_block);
 
-       error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino,
-                                  &first_block, &free_list, resblks ?
-                                  resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
+       error = XFS_DIR_CREATENAME(mp, tp, dp, dir_name, dir_namelen,
+                       cdp->i_ino, &first_block, &free_list,
+                       resblks ? resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
        if (error) {
                ASSERT(error != ENOSPC);
                goto error1;
@@ -2915,14 +2900,16 @@ xfs_mkdir(
         */
        dp->i_gen++;
 
-       error = xfs_dir_init(tp, cdp, dp);
-       if (error)
+       error = XFS_DIR_INIT(mp, tp, cdp, dp);
+       if (error) {
                goto error2;
+       }
 
        cdp->i_gen = 1;
        error = xfs_bumplink(tp, dp);
-       if (error)
+       if (error) {
                goto error2;
+       }
 
        cvp = XFS_ITOV(cdp);
 
@@ -2999,7 +2986,7 @@ std_return:
 STATIC int
 xfs_rmdir(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
+       vname_t                 *dentry,
        cred_t                  *credp)
 {
        char                    *name = VNAME(dentry);
@@ -3012,7 +2999,7 @@ xfs_rmdir(
        xfs_fsblock_t           first_block;
        int                     cancel_flags;
        int                     committed;
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
        int                     dm_di_mode = 0;
        int                     last_cdp_link;
        int                     namelen;
@@ -3050,7 +3037,7 @@ xfs_rmdir(
         * for a log reservation.  Since we'll have to wait for the
         * inactive code to complete before returning from xfs_iget,
         * we need to make sure that we don't have log space reserved
-        * when we call xfs_iget.  Instead we get an unlocked reference
+        * when we call xfs_iget.  Instead we get an unlocked referece
         * to the inode before getting our log reservation.
         */
        error = xfs_get_dir_entry(dentry, &cdp);
@@ -3131,15 +3118,16 @@ xfs_rmdir(
                error = XFS_ERROR(ENOTEMPTY);
                goto error_return;
        }
-       if (!xfs_dir_isempty(cdp)) {
+       if (!XFS_DIR_ISEMPTY(mp, cdp)) {
                error = XFS_ERROR(ENOTEMPTY);
                goto error_return;
        }
 
-       error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino,
-                                       &first_block, &free_list, resblks);
-       if (error)
+       error = XFS_DIR_REMOVENAME(mp, tp, dp, name, namelen, cdp->i_ino,
+               &first_block, &free_list, resblks);
+       if (error) {
                goto error1;
+       }
 
        xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
 
@@ -3210,13 +3198,13 @@ xfs_rmdir(
        /*
         * Let interposed file systems know about removed links.
         */
-       bhv_vop_link_removed(XFS_ITOV(cdp), dir_vp, last_cdp_link);
+       VOP_LINK_REMOVED(XFS_ITOV(cdp), dir_vp, last_cdp_link);
 
        IRELE(cdp);
 
        /* Fall through to std_return with error = 0 or the errno
         * from xfs_trans_commit. */
- std_return:
+std_return:
        if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_POSTREMOVE)) {
                (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
                                        dir_vp, DM_RIGHT_NULL,
@@ -3226,18 +3214,20 @@ xfs_rmdir(
        }
        return error;
 
- error1:
+error1:
        xfs_bmap_cancel(&free_list);
        cancel_flags |= XFS_TRANS_ABORT;
        /* FALLTHROUGH */
 
- error_return:
+error_return:
        xfs_trans_cancel(tp, cancel_flags);
        goto std_return;
 }
 
 
 /*
+ * xfs_readdir
+ *
  * Read dp's entries starting at uiop->uio_offset and translate them into
  * bufsize bytes worth of struct dirents starting at bufbase.
  */
@@ -3257,23 +3247,28 @@ xfs_readdir(
                                               (inst_t *)__return_address);
        dp = XFS_BHVTOI(dir_bdp);
 
-       if (XFS_FORCED_SHUTDOWN(dp->i_mount))
+       if (XFS_FORCED_SHUTDOWN(dp->i_mount)) {
                return XFS_ERROR(EIO);
+       }
 
        lock_mode = xfs_ilock_map_shared(dp);
-       error = xfs_dir_getdents(tp, dp, uiop, eofp);
+       error = XFS_DIR_GETDENTS(dp->i_mount, tp, dp, uiop, eofp);
        xfs_iunlock_map_shared(dp, lock_mode);
        return error;
 }
 
 
+/*
+ * xfs_symlink
+ *
+ */
 STATIC int
 xfs_symlink(
        bhv_desc_t              *dir_bdp,
-       bhv_vname_t             *dentry,
-       bhv_vattr_t             *vap,
+       vname_t                 *dentry,
+       vattr_t                 *vap,
        char                    *target_path,
-       bhv_vnode_t             **vpp,
+       vnode_t                 **vpp,
        cred_t                  *credp)
 {
        xfs_trans_t             *tp;
@@ -3285,7 +3280,7 @@ xfs_symlink(
        xfs_bmap_free_t         free_list;
        xfs_fsblock_t           first_block;
        boolean_t               dp_joined_to_trans;
-       bhv_vnode_t             *dir_vp;
+       vnode_t                 *dir_vp;
        uint                    cancel_flags;
        int                     committed;
        xfs_fileoff_t           first_fsb;
@@ -3330,7 +3325,7 @@ xfs_symlink(
                int len, total;
                char *path;
 
-               for (total = 0, path = target_path; total < pathlen;) {
+               for(total = 0, path = target_path; total < pathlen;) {
                        /*
                         * Skip any slashes.
                         */
@@ -3424,7 +3419,7 @@ xfs_symlink(
         * Check for ability to enter directory entry, if no space reserved.
         */
        if (resblks == 0 &&
-           (error = xfs_dir_canenter(tp, dp, link_name, link_namelen)))
+           (error = XFS_DIR_CANENTER(mp, tp, dp, link_name, link_namelen)))
                goto error_return;
        /*
         * Initialize the bmap freelist prior to calling either
@@ -3479,7 +3474,7 @@ xfs_symlink(
                error = xfs_bmapi(tp, ip, first_fsb, fs_blocks,
                                  XFS_BMAPI_WRITE | XFS_BMAPI_METADATA,
                                  &first_block, resblks, mval, &nmaps,
-                                 &free_list, NULL);
+                                 &free_list);
                if (error) {
                        goto error1;
                }
@@ -3511,10 +3506,11 @@ xfs_symlink(
        /*
         * Create the directory entry for the symlink.
         */
-       error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino,
-                                  &first_block, &free_list, resblks);
-       if (error)
+       error = XFS_DIR_CREATENAME(mp, tp, dp, link_name, link_namelen,
+                       ip->i_ino, &first_block, &free_list, resblks);
+       if (error) {
                goto error1;
+       }
        xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
        xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
 
@@ -3562,7 +3558,7 @@ std_return:
        }
 
        if (!error) {
-               bhv_vnode_t *vp;
+               vnode_t *vp;
 
                ASSERT(ip);
                vp = XFS_ITOV(ip);
@@ -3627,10 +3623,10 @@ xfs_fid2(
 int
 xfs_rwlock(
        bhv_desc_t      *bdp,
-       bhv_vrwlock_t   locktype)
+       vrwlock_t       locktype)
 {
        xfs_inode_t     *ip;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
 
        vp = BHV_TO_VNODE(bdp);
        if (VN_ISDIR(vp))
@@ -3658,10 +3654,10 @@ xfs_rwlock(
 void
 xfs_rwunlock(
        bhv_desc_t      *bdp,
-       bhv_vrwlock_t   locktype)
+       vrwlock_t       locktype)
 {
        xfs_inode_t     *ip;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
 
        vp = BHV_TO_VNODE(bdp);
        if (VN_ISDIR(vp))
@@ -3765,6 +3761,7 @@ xfs_inode_flush(
        return error;
 }
 
+
 int
 xfs_set_dmattrs (
        bhv_desc_t      *bdp,
@@ -3805,12 +3802,16 @@ xfs_set_dmattrs (
        return error;
 }
 
+
+/*
+ * xfs_reclaim
+ */
 STATIC int
 xfs_reclaim(
        bhv_desc_t      *bdp)
 {
        xfs_inode_t     *ip;
-       bhv_vnode_t     *vp;
+       vnode_t         *vp;
 
        vp = BHV_TO_VNODE(bdp);
        ip = XFS_BHVTOI(bdp);
@@ -3865,7 +3866,7 @@ xfs_finish_reclaim(
        int             sync_mode)
 {
        xfs_ihash_t     *ih = ip->i_hash;
-       bhv_vnode_t     *vp = XFS_ITOV_NULL(ip);
+       vnode_t         *vp = XFS_ITOV_NULL(ip);
        int             error;
 
        if (vp && VN_BAD(vp))
@@ -4132,10 +4133,10 @@ retry:
                 * Issue the xfs_bmapi() call to allocate the blocks
                 */
                XFS_BMAP_INIT(&free_list, &firstfsb);
-               error = XFS_BMAPI(mp, tp, &ip->i_iocore, startoffset_fsb,
+               error = xfs_bmapi(tp, ip, startoffset_fsb,
                                  allocatesize_fsb, bmapi_flag,
                                  &firstfsb, 0, imapp, &nimaps,
-                                 &free_list, NULL);
+                                 &free_list);
                if (error) {
                        goto error0;
                }
@@ -4215,8 +4216,8 @@ xfs_zero_remaining_bytes(
        for (offset = startoff; offset <= endoff; offset = lastoffset + 1) {
                offset_fsb = XFS_B_TO_FSBT(mp, offset);
                nimap = 1;
-               error = XFS_BMAPI(mp, NULL, &ip->i_iocore, offset_fsb, 1, 0,
-                       NULL, 0, &imap, &nimap, NULL, NULL);
+               error = xfs_bmapi(NULL, ip, offset_fsb, 1, 0, NULL, 0, &imap,
+                       &nimap, NULL);
                if (error || nimap < 1)
                        break;
                ASSERT(imap.br_blockcount >= 1);
@@ -4275,7 +4276,7 @@ xfs_free_file_space(
        xfs_off_t               len,
        int                     attr_flags)
 {
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        int                     committed;
        int                     done;
        xfs_off_t               end_dmi_offset;
@@ -4324,12 +4325,11 @@ xfs_free_file_space(
                        return error;
        }
 
+       ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);
        if (attr_flags & ATTR_NOLOCK)
                need_iolock = 0;
-       if (need_iolock) {
+       if (need_iolock)
                xfs_ilock(ip, XFS_IOLOCK_EXCL);
-               vn_iowait(vp);  /* wait for the completion of any pending DIOs */
-       }
 
        rounding = MAX((__uint8_t)(1 << mp->m_sb.sb_blocklog),
                        (__uint8_t)NBPP);
@@ -4341,7 +4341,7 @@ xfs_free_file_space(
        if (VN_CACHED(vp) != 0) {
                xfs_inval_cached_trace(&ip->i_iocore, ioffset, -1,
                                ctooff(offtoct(ioffset)), -1);
-               bhv_vop_flushinval_pages(vp, ctooff(offtoct(ioffset)),
+               VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(ioffset)),
                                -1, FI_REMAPF_LOCKED);
        }
 
@@ -4353,8 +4353,8 @@ xfs_free_file_space(
         */
        if (rt && !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) {
                nimap = 1;
-               error = XFS_BMAPI(mp, NULL, &ip->i_iocore, startoffset_fsb,
-                       1, 0, NULL, 0, &imap, &nimap, NULL, NULL);
+               error = xfs_bmapi(NULL, ip, startoffset_fsb, 1, 0, NULL, 0,
+                       &imap, &nimap, NULL);
                if (error)
                        goto out_unlock_iolock;
                ASSERT(nimap == 0 || nimap == 1);
@@ -4368,8 +4368,8 @@ xfs_free_file_space(
                                startoffset_fsb += mp->m_sb.sb_rextsize - mod;
                }
                nimap = 1;
-               error = XFS_BMAPI(mp, NULL, &ip->i_iocore, endoffset_fsb - 1,
-                       1, 0, NULL, 0, &imap, &nimap, NULL, NULL);
+               error = xfs_bmapi(NULL, ip, endoffset_fsb - 1, 1, 0, NULL, 0,
+                       &imap, &nimap, NULL);
                if (error)
                        goto out_unlock_iolock;
                ASSERT(nimap == 0 || nimap == 1);
@@ -4441,9 +4441,9 @@ xfs_free_file_space(
                 * issue the bunmapi() call to free the blocks
                 */
                XFS_BMAP_INIT(&free_list, &firstfsb);
-               error = XFS_BUNMAPI(mp, tp, &ip->i_iocore, startoffset_fsb,
+               error = xfs_bunmapi(tp, ip, startoffset_fsb,
                                  endoffset_fsb - startoffset_fsb,
-                                 0, 2, &firstfsb, &free_list, NULL, &done);
+                                 0, 2, &firstfsb, &free_list, &done);
                if (error) {
                        goto error0;
                }
@@ -4503,8 +4503,8 @@ xfs_change_file_space(
        xfs_off_t       startoffset;
        xfs_off_t       llen;
        xfs_trans_t     *tp;
-       bhv_vattr_t     va;
-       bhv_vnode_t     *vp;
+       vattr_t         va;
+       vnode_t         *vp;
 
        vp = BHV_TO_VNODE(bdp);
        vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
@@ -4657,17 +4657,12 @@ xfs_change_file_space(
        return error;
 }
 
-bhv_vnodeops_t xfs_vnodeops = {
+vnodeops_t xfs_vnodeops = {
        BHV_IDENTITY_INIT(VN_BHV_XFS,VNODE_POSITION_XFS),
        .vop_open               = xfs_open,
-       .vop_close              = xfs_close,
        .vop_read               = xfs_read,
 #ifdef HAVE_SENDFILE
        .vop_sendfile           = xfs_sendfile,
-#endif
-#ifdef HAVE_SPLICE
-       .vop_splice_read        = xfs_splice_read,
-       .vop_splice_write       = xfs_splice_write,
 #endif
        .vop_write              = xfs_write,
        .vop_ioctl              = xfs_ioctl,