fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / fs / xfs / xfs_vfsops.c
index 09665b7..bace7cd 100644 (file)
@@ -24,7 +24,6 @@
 #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"
@@ -32,7 +31,6 @@
 #include "xfs_bmap_btree.h"
 #include "xfs_ialloc_btree.h"
 #include "xfs_alloc_btree.h"
-#include "xfs_dir_sf.h"
 #include "xfs_dir2_sf.h"
 #include "xfs_attr_sf.h"
 #include "xfs_dinode.h"
@@ -55,7 +53,7 @@
 #include "xfs_clnt.h"
 #include "xfs_fsops.h"
 
-STATIC int xfs_sync(bhv_desc_t *, int, cred_t *);
+STATIC int     xfs_sync(bhv_desc_t *, int, cred_t *);
 
 int
 xfs_init(void)
@@ -77,11 +75,12 @@ xfs_init(void)
                                                 "xfs_bmap_free_item");
        xfs_btree_cur_zone = kmem_zone_init(sizeof(xfs_btree_cur_t),
                                            "xfs_btree_cur");
-       xfs_inode_zone = kmem_zone_init(sizeof(xfs_inode_t), "xfs_inode");
        xfs_trans_zone = kmem_zone_init(sizeof(xfs_trans_t), "xfs_trans");
        xfs_da_state_zone =
                kmem_zone_init(sizeof(xfs_da_state_t), "xfs_da_state");
        xfs_dabuf_zone = kmem_zone_init(sizeof(xfs_dabuf_t), "xfs_dabuf");
+       xfs_ifork_zone = kmem_zone_init(sizeof(xfs_ifork_t), "xfs_ifork");
+       xfs_acl_zone_init(xfs_acl_zone, "xfs_acl");
 
        /*
         * The size of the zone allocated buf log item is the maximum
@@ -93,17 +92,30 @@ xfs_init(void)
                                (((XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK) /
                                  NBWORD) * sizeof(int))),
                               "xfs_buf_item");
-       xfs_efd_zone = kmem_zone_init((sizeof(xfs_efd_log_item_t) +
-                                      ((XFS_EFD_MAX_FAST_EXTENTS - 1) * sizeof(xfs_extent_t))),
+       xfs_efd_zone =
+               kmem_zone_init((sizeof(xfs_efd_log_item_t) +
+                              ((XFS_EFD_MAX_FAST_EXTENTS - 1) *
+                                sizeof(xfs_extent_t))),
                                      "xfs_efd_item");
-       xfs_efi_zone = kmem_zone_init((sizeof(xfs_efi_log_item_t) +
-                                      ((XFS_EFI_MAX_FAST_EXTENTS - 1) * sizeof(xfs_extent_t))),
+       xfs_efi_zone =
+               kmem_zone_init((sizeof(xfs_efi_log_item_t) +
+                              ((XFS_EFI_MAX_FAST_EXTENTS - 1) *
+                                sizeof(xfs_extent_t))),
                                      "xfs_efi_item");
-       xfs_ifork_zone = kmem_zone_init(sizeof(xfs_ifork_t), "xfs_ifork");
-       xfs_ili_zone = kmem_zone_init(sizeof(xfs_inode_log_item_t), "xfs_ili");
-       xfs_chashlist_zone = kmem_zone_init(sizeof(xfs_chashlist_t),
-                                           "xfs_chashlist");
-       xfs_acl_zone_init(xfs_acl_zone, "xfs_acl");
+
+       /*
+        * These zones warrant special memory allocator hints
+        */
+       xfs_inode_zone =
+               kmem_zone_init_flags(sizeof(xfs_inode_t), "xfs_inode",
+                                       KM_ZONE_HWALIGN | KM_ZONE_RECLAIM |
+                                       KM_ZONE_SPREAD, NULL);
+       xfs_ili_zone =
+               kmem_zone_init_flags(sizeof(xfs_inode_log_item_t), "xfs_ili",
+                                       KM_ZONE_SPREAD, NULL);
+       xfs_chashlist_zone =
+               kmem_zone_init_flags(sizeof(xfs_chashlist_t), "xfs_chashlist",
+                                       KM_ZONE_SPREAD, NULL);
 
        /*
         * Allocate global trace buffers.
@@ -117,9 +129,6 @@ xfs_init(void)
 #ifdef XFS_BMBT_TRACE
        xfs_bmbt_trace_buf = ktrace_alloc(XFS_BMBT_TRACE_SIZE, KM_SLEEP);
 #endif
-#ifdef XFS_DIR_TRACE
-       xfs_dir_trace_buf = ktrace_alloc(XFS_DIR_TRACE_SIZE, KM_SLEEP);
-#endif
 #ifdef XFS_ATTR_TRACE
        xfs_attr_trace_buf = ktrace_alloc(XFS_ATTR_TRACE_SIZE, KM_SLEEP);
 #endif
@@ -163,9 +172,6 @@ xfs_cleanup(void)
 #ifdef XFS_ATTR_TRACE
        ktrace_free(xfs_attr_trace_buf);
 #endif
-#ifdef XFS_DIR_TRACE
-       ktrace_free(xfs_dir_trace_buf);
-#endif
 #ifdef XFS_BMBT_TRACE
        ktrace_free(xfs_bmbt_trace_buf);
 #endif
@@ -176,18 +182,18 @@ xfs_cleanup(void)
        ktrace_free(xfs_alloc_trace_buf);
 #endif
 
-       kmem_cache_destroy(xfs_bmap_free_item_zone);
-       kmem_cache_destroy(xfs_btree_cur_zone);
-       kmem_cache_destroy(xfs_inode_zone);
-       kmem_cache_destroy(xfs_trans_zone);
-       kmem_cache_destroy(xfs_da_state_zone);
-       kmem_cache_destroy(xfs_dabuf_zone);
-       kmem_cache_destroy(xfs_buf_item_zone);
-       kmem_cache_destroy(xfs_efd_zone);
-       kmem_cache_destroy(xfs_efi_zone);
-       kmem_cache_destroy(xfs_ifork_zone);
-       kmem_cache_destroy(xfs_ili_zone);
-       kmem_cache_destroy(xfs_chashlist_zone);
+       kmem_zone_destroy(xfs_bmap_free_item_zone);
+       kmem_zone_destroy(xfs_btree_cur_zone);
+       kmem_zone_destroy(xfs_inode_zone);
+       kmem_zone_destroy(xfs_trans_zone);
+       kmem_zone_destroy(xfs_da_state_zone);
+       kmem_zone_destroy(xfs_dabuf_zone);
+       kmem_zone_destroy(xfs_buf_item_zone);
+       kmem_zone_destroy(xfs_efd_zone);
+       kmem_zone_destroy(xfs_efi_zone);
+       kmem_zone_destroy(xfs_ifork_zone);
+       kmem_zone_destroy(xfs_ili_zone);
+       kmem_zone_destroy(xfs_chashlist_zone);
 }
 
 /*
@@ -198,7 +204,7 @@ xfs_cleanup(void)
  */
 STATIC int
 xfs_start_flags(
-       struct vfs              *vfs,
+       struct bhv_vfs          *vfs,
        struct xfs_mount_args   *ap,
        struct xfs_mount        *mp)
 {
@@ -258,8 +264,6 @@ xfs_start_flags(
                mp->m_inoadd = XFS_INO64_OFFSET;
        }
 #endif
-       if (ap->flags & XFSMNT_NOATIME)
-               mp->m_flags |= XFS_MOUNT_NOATIME;
        if (ap->flags & XFSMNT_RETERR)
                mp->m_flags |= XFS_MOUNT_RETERR;
        if (ap->flags & XFSMNT_NOALIGN)
@@ -296,8 +300,8 @@ xfs_start_flags(
 
        if (ap->flags2 & XFSMNT2_COMPAT_IOSIZE)
                mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE;
-       if (ap->flags2 & XFSMNT2_TAGXID)
-               mp->m_flags |= XFS_MOUNT_TAGXID;
+       if (ap->flags2 & XFSMNT2_TAGGED)
+               mp->m_flags |= XFS_MOUNT_TAGGED;
 
        /*
         * no recovery flag requires a read-only mount
@@ -327,7 +331,7 @@ xfs_start_flags(
  */
 STATIC int
 xfs_finish_flags(
-       struct vfs              *vfs,
+       struct bhv_vfs          *vfs,
        struct xfs_mount_args   *ap,
        struct xfs_mount        *mp)
 {
@@ -392,8 +396,8 @@ xfs_finish_flags(
                        return XFS_ERROR(EINVAL);
        }
 
-       if (ap->flags2 & XFSMNT2_TAGXID)
-               vfs->vfs_super->s_flags |= MS_TAGXID;
+       if (ap->flags2 & XFSMNT2_TAGGED)
+               vfs->vfs_super->s_flags |= MS_TAGGED;
        return 0;
 }
 
@@ -415,7 +419,7 @@ xfs_mount(
        struct xfs_mount_args   *args,
        cred_t                  *credp)
 {
-       struct vfs              *vfsp = bhvtovfs(bhvp);
+       struct bhv_vfs          *vfsp = bhvtovfs(bhvp);
        struct bhv_desc         *p;
        struct xfs_mount        *mp = XFS_BHVTOM(bhvp);
        struct block_device     *ddev, *logdev, *rtdev;
@@ -434,6 +438,9 @@ xfs_mount(
        p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO);
        mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs;
 
+       if (args->flags & XFSMNT_QUIET)
+               flags |= XFS_MFSI_QUIET;
+
        /*
         * Open real time and log devices - order is important.
         */
@@ -484,7 +491,7 @@ xfs_mount(
        error = xfs_start_flags(vfsp, args, mp);
        if (error)
                goto error1;
-       error = xfs_readsb(mp);
+       error = xfs_readsb(mp, flags);
        if (error)
                goto error1;
        error = xfs_finish_flags(vfsp, args, mp);
@@ -512,7 +519,7 @@ xfs_mount(
        if (error)
                goto error2;
 
-       if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY))
+       if (mp->m_flags & XFS_MOUNT_BARRIER)
                xfs_mountfs_check_barriers(mp);
 
        error = XFS_IOINIT(vfsp, args, flags);
@@ -541,10 +548,10 @@ xfs_unmount(
        int             flags,
        cred_t          *credp)
 {
-       struct vfs      *vfsp = bhvtovfs(bdp);
+       bhv_vfs_t       *vfsp = bhvtovfs(bdp);
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
        xfs_inode_t     *rip;
-       vnode_t         *rvp;
+       bhv_vnode_t     *rvp;
        int             unmount_event_wanted = 0;
        int             unmount_event_flags = 0;
        int             xfs_unmountfs_needed = 0;
@@ -624,7 +631,7 @@ xfs_quiesce_fs(
        xfs_mount_t             *mp)
 {
        int                     count = 0, pincount;
-               
+
        xfs_refcache_purge_mp(mp);
        xfs_flush_buftarg(mp->m_ddev_targp, 0);
        xfs_finish_reclaim_all(mp, 0);
@@ -635,7 +642,7 @@ xfs_quiesce_fs(
         * meta data (typically directory updates).
         * Which then must be flushed and logged before
         * we can write the unmount record.
-        */ 
+        */
        do {
                xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL);
                pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
@@ -654,40 +661,25 @@ xfs_mntupdate(
        int                             *flags,
        struct xfs_mount_args           *args)
 {
-       struct vfs      *vfsp = bhvtovfs(bdp);
+       bhv_vfs_t       *vfsp = bhvtovfs(bdp);
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
-       int             error;
 
-       if (args->flags & XFSMNT_NOATIME)
-               mp->m_flags |= XFS_MOUNT_NOATIME;
-       else
-               mp->m_flags &= ~XFS_MOUNT_NOATIME;
-
-       if (args->flags & XFSMNT_BARRIER)
-               mp->m_flags |= XFS_MOUNT_BARRIER;
-       else
-               mp->m_flags &= ~XFS_MOUNT_BARRIER;
-
-       if ((vfsp->vfs_flag & VFS_RDONLY) &&
-           !(*flags & MS_RDONLY)) {
-               vfsp->vfs_flag &= ~VFS_RDONLY;
-
-               if (args->flags & XFSMNT_BARRIER)
+       if (!(*flags & MS_RDONLY)) {                    /* rw/ro -> rw */
+               if (vfsp->vfs_flag & VFS_RDONLY)
+                       vfsp->vfs_flag &= ~VFS_RDONLY;
+               if (args->flags & XFSMNT_BARRIER) {
+                       mp->m_flags |= XFS_MOUNT_BARRIER;
                        xfs_mountfs_check_barriers(mp);
-       }
-
-       if (!(vfsp->vfs_flag & VFS_RDONLY) &&
-           (*flags & MS_RDONLY)) {
-               VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error);
-
+               } else {
+                       mp->m_flags &= ~XFS_MOUNT_BARRIER;
+               }
+       } else if (!(vfsp->vfs_flag & VFS_RDONLY)) {    /* rw -> ro */
+               bhv_vfs_sync(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL);
                xfs_quiesce_fs(mp);
-
-               /* Ok now write out an unmount record */
                xfs_log_unmount_write(mp);
                xfs_unmountfs_writesb(mp);
                vfsp->vfs_flag |= VFS_RDONLY;
        }
-
        return 0;
 }
 
@@ -705,7 +697,7 @@ xfs_unmount_flush(
        xfs_inode_t     *rip = mp->m_rootip;
        xfs_inode_t     *rbmip;
        xfs_inode_t     *rsumip = NULL;
-       vnode_t         *rvp = XFS_ITOV(rip);
+       bhv_vnode_t     *rvp = XFS_ITOV(rip);
        int             error;
 
        xfs_ilock(rip, XFS_ILOCK_EXCL);
@@ -784,9 +776,9 @@ fscorrupt_out2:
 STATIC int
 xfs_root(
        bhv_desc_t      *bdp,
-       vnode_t         **vpp)
+       bhv_vnode_t     **vpp)
 {
-       vnode_t         *vp;
+       bhv_vnode_t     *vp;
 
        vp = XFS_ITOV((XFS_BHVTOM(bdp))->m_rootip);
        VN_HOLD(vp);
@@ -804,8 +796,8 @@ xfs_root(
 STATIC int
 xfs_statvfs(
        bhv_desc_t      *bdp,
-       xfs_statfs_t    *statp,
-       vnode_t         *vp)
+       bhv_statvfs_t   *statp,
+       bhv_vnode_t     *vp)
 {
        __uint64_t      fakeinos;
        xfs_extlen_t    lsize;
@@ -818,11 +810,13 @@ xfs_statvfs(
 
        statp->f_type = XFS_SB_MAGIC;
 
+       xfs_icsb_sync_counters_lazy(mp);
        s = XFS_SB_LOCK(mp);
        statp->f_bsize = sbp->sb_blocksize;
        lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0;
        statp->f_blocks = sbp->sb_dblocks - lsize;
-       statp->f_bfree = statp->f_bavail = sbp->sb_fdblocks;
+       statp->f_bfree = statp->f_bavail =
+                               sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp);
        fakeinos = statp->f_bfree << sbp->sb_inopblog;
 #if XFS_BIG_INUMS
        fakeinos += mp->m_inoadd;
@@ -876,10 +870,10 @@ xfs_statvfs(
  *                    determine if they should be flushed sync, async, or
  *                    delwri.
  *      SYNC_CLOSE   - This flag is passed when the system is being
- *                    unmounted.  We should sync and invalidate everthing.
+ *                    unmounted.  We should sync and invalidate everything.
  *      SYNC_FSDATA  - This indicates that the caller would like to make
  *                    sure the superblock is safe on disk.  We can ensure
- *                    this by simply makeing sure the log gets flushed
+ *                    this by simply making sure the log gets flushed
  *                    if SYNC_BDFLUSH is set, and by actually writing it
  *                    out otherwise.
  *
@@ -902,9 +896,9 @@ xfs_sync(
 /*
  * xfs sync routine for internal use
  *
- * This routine supports all of the flags defined for the generic VFS_SYNC
+ * This routine supports all of the flags defined for the generic vfs_sync
  * interface as explained above under xfs_sync.  In the interests of not
- * changing interfaces within the 6.5 family, additional internallly-
+ * changing interfaces within the 6.5 family, additional internally-
  * required functions are specified within a separate xflags parameter,
  * only available by calling this routine.
  *
@@ -919,7 +913,7 @@ xfs_sync_inodes(
        xfs_inode_t     *ip = NULL;
        xfs_inode_t     *ip_next;
        xfs_buf_t       *bp;
-       vnode_t         *vp = NULL;
+       bhv_vnode_t     *vp = NULL;
        int             error;
        int             last_error;
        uint64_t        fflag;
@@ -1086,7 +1080,7 @@ xfs_sync_inodes(
                 * If this is just vfs_sync() or pflushd() calling
                 * then we can skip inodes for which it looks like
                 * there is nothing to do.  Since we don't have the
-                * inode locked this is racey, but these are periodic
+                * inode locked this is racy, but these are periodic
                 * calls so it doesn't matter.  For the others we want
                 * to know for sure, so we at least try to lock them.
                 */
@@ -1158,9 +1152,9 @@ xfs_sync_inodes(
                        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
                        if (XFS_FORCED_SHUTDOWN(mp)) {
-                               VOP_TOSS_PAGES(vp, 0, -1, FI_REMAPF);
+                               bhv_vop_toss_pages(vp, 0, -1, FI_REMAPF);
                        } else {
-                               VOP_FLUSHINVAL_PAGES(vp, 0, -1, FI_REMAPF);
+                               bhv_vop_flushinval_pages(vp, 0, -1, FI_REMAPF);
                        }
 
                        xfs_ilock(ip, XFS_ILOCK_SHARED);
@@ -1180,8 +1174,8 @@ xfs_sync_inodes(
                                 * across calls to the buffer cache.
                                 */
                                xfs_iunlock(ip, XFS_ILOCK_SHARED);
-                               VOP_FLUSH_PAGES(vp, (xfs_off_t)0, -1,
-                                                       fflag, FI_NONE, error);
+                               error = bhv_vop_flush_pages(vp, (xfs_off_t)0,
+                                                       -1, fflag, FI_NONE);
                                xfs_ilock(ip, XFS_ILOCK_SHARED);
                        }
 
@@ -1225,7 +1219,7 @@ xfs_sync_inodes(
                                        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
                                        error = xfs_itobp(mp, NULL, ip,
-                                                         &dip, &bp, 0);
+                                                         &dip, &bp, 0, 0);
                                        if (!error) {
                                                xfs_buf_relse(bp);
                                        } else {
@@ -1233,9 +1227,7 @@ xfs_sync_inodes(
                                                 * marker and free it.
                                                 */
                                                XFS_MOUNT_ILOCK(mp);
-
                                                IPOINTER_REMOVE(ip, mp);
-
                                                XFS_MOUNT_IUNLOCK(mp);
 
                                                ASSERT(!(lock_flags &
@@ -1423,9 +1415,9 @@ xfs_sync_inodes(
 /*
  * xfs sync routine for internal use
  *
- * This routine supports all of the flags defined for the generic VFS_SYNC
+ * This routine supports all of the flags defined for the generic vfs_sync
  * interface as explained above under xfs_sync.  In the interests of not
- * changing interfaces within the 6.5 family, additional internallly-
+ * changing interfaces within the 6.5 family, additional internally-
  * required functions are specified within a separate xflags parameter,
  * only available by calling this routine.
  *
@@ -1576,7 +1568,7 @@ xfs_syncsub(
 STATIC int
 xfs_vget(
        bhv_desc_t      *bdp,
-       vnode_t         **vpp,
+       bhv_vnode_t     **vpp,
        fid_t           *fidp)
 {
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
@@ -1657,13 +1649,15 @@ xfs_vget(
                                         * in stat(). */
 #define MNTOPT_ATTR2   "attr2"         /* do use attr2 attribute format */
 #define MNTOPT_NOATTR2 "noattr2"       /* do not use attr2 attribute format */
-#define MNTOPT_TAGXID  "tagxid"        /* context xid tagging for inodes */
+#define MNTOPT_TAGXID  "tagxid"        /* context tagging for inodes */
+#define MNTOPT_TAGGED  "tag"           /* context tagging for inodes */
+#define MNTOPT_NOTAGTAG        "notag"         /* do not use context tagging */
 
 STATIC unsigned long
-suffix_strtoul(const char *cp, char **endp, unsigned int base)
+suffix_strtoul(char *s, char **endp, unsigned int base)
 {
        int     last, shift_left_factor = 0;
-       char    *value = (char *)cp;
+       char    *value = s;
 
        last = strlen(value) - 1;
        if (value[last] == 'K' || value[last] == 'k') {
@@ -1679,7 +1673,7 @@ suffix_strtoul(const char *cp, char **endp, unsigned int base)
                value[last] = '\0';
        }
 
-       return simple_strtoul(cp, endp, base) << shift_left_factor;
+       return simple_strtoul((const char *)s, endp, base) << shift_left_factor;
 }
 
 STATIC int
@@ -1689,17 +1683,15 @@ xfs_parseargs(
        struct xfs_mount_args   *args,
        int                     update)
 {
-       struct vfs              *vfsp = bhvtovfs(bhv);
+       bhv_vfs_t               *vfsp = bhvtovfs(bhv);
        char                    *this_char, *value, *eov;
        int                     dsunit, dswidth, vol_dsunit, vol_dswidth;
        int                     iosize;
 
+       args->flags |= XFSMNT_IDELETE;
+       args->flags |= XFSMNT_BARRIER;
        args->flags2 |= XFSMNT2_COMPAT_IOSIZE;
 
-#if 0  /* XXX: off by default, until some remaining issues ironed out */
-       args->flags |= XFSMNT_IDELETE; /* default to on */
-#endif
-
        if (!options)
                goto done;
 
@@ -1713,42 +1705,48 @@ xfs_parseargs(
 
                if (!strcmp(this_char, MNTOPT_LOGBUFS)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        args->logbufs = simple_strtoul(value, &eov, 10);
                } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        args->logbufsize = suffix_strtoul(value, &eov, 10);
                } else if (!strcmp(this_char, MNTOPT_LOGDEV)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        strncpy(args->logname, value, MAXNAMELEN);
                } else if (!strcmp(this_char, MNTOPT_MTPT)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        strncpy(args->mtpt, value, MAXNAMELEN);
                } else if (!strcmp(this_char, MNTOPT_RTDEV)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        strncpy(args->rtname, value, MAXNAMELEN);
                } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
@@ -1757,7 +1755,8 @@ xfs_parseargs(
                        args->iosizelog = (uint8_t) iosize;
                } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
@@ -1766,7 +1765,8 @@ xfs_parseargs(
                        args->iosizelog = ffs(iosize) - 1;
                } else if (!strcmp(this_char, MNTOPT_IHASHSIZE)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
@@ -1787,7 +1787,8 @@ xfs_parseargs(
                } else if (!strcmp(this_char, MNTOPT_INO64)) {
                        args->flags |= XFSMNT_INO64;
 #if !XFS_BIG_INUMS
-                       printk("XFS: %s option not allowed on this system\n",
+                       cmn_err(CE_WARN,
+                               "XFS: %s option not allowed on this system",
                                this_char);
                        return EINVAL;
 #endif
@@ -1797,14 +1798,16 @@ xfs_parseargs(
                        args->flags |= XFSMNT_SWALLOC;
                } else if (!strcmp(this_char, MNTOPT_SUNIT)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
                        dsunit = simple_strtoul(value, &eov, 10);
                } else if (!strcmp(this_char, MNTOPT_SWIDTH)) {
                        if (!value || !*value) {
-                               printk("XFS: %s option requires an argument\n",
+                               cmn_err(CE_WARN,
+                                       "XFS: %s option requires an argument",
                                        this_char);
                                return EINVAL;
                        }
@@ -1812,7 +1815,8 @@ xfs_parseargs(
                } else if (!strcmp(this_char, MNTOPT_64BITINODE)) {
                        args->flags &= ~XFSMNT_32BITINODES;
 #if !XFS_BIG_INUMS
-                       printk("XFS: %s option not allowed on this system\n",
+                       cmn_err(CE_WARN,
+                               "XFS: %s option not allowed on this system",
                                this_char);
                        return EINVAL;
 #endif
@@ -1834,42 +1838,56 @@ xfs_parseargs(
                        args->flags |= XFSMNT_ATTR2;
                } else if (!strcmp(this_char, MNTOPT_NOATTR2)) {
                        args->flags &= ~XFSMNT_ATTR2;
-#ifndef CONFIG_INOXID_NONE
+#ifndef CONFIG_TAGGING_NONE
+               } else if (!strcmp(this_char, MNTOPT_TAGGED)) {
+                       args->flags2 |= XFSMNT2_TAGGED;
+               } else if (!strcmp(this_char, MNTOPT_NOTAGTAG)) {
+                       args->flags2 &= ~XFSMNT2_TAGGED;
                } else if (!strcmp(this_char, MNTOPT_TAGXID)) {
-                       args->flags2 |= XFSMNT2_TAGXID;
+                       args->flags2 |= XFSMNT2_TAGGED;
+#endif
+#ifdef CONFIG_PROPAGATE
+               } else if (!strcmp(this_char, MNTOPT_TAGGED)) {
+                       /* use value */
+                       args->flags2 |= XFSMNT2_TAGGED;
 #endif
                } else if (!strcmp(this_char, "osyncisdsync")) {
                        /* no-op, this is now the default */
-printk("XFS: osyncisdsync is now the default, option is deprecated.\n");
+                       cmn_err(CE_WARN,
+       "XFS: osyncisdsync is now the default, option is deprecated.");
                } else if (!strcmp(this_char, "irixsgid")) {
-printk("XFS: irixsgid is now a sysctl(2) variable, option is deprecated.\n");
+                       cmn_err(CE_WARN,
+       "XFS: irixsgid is now a sysctl(2) variable, option is deprecated.");
                } else {
-                       printk("XFS: unknown mount option [%s].\n", this_char);
+                       cmn_err(CE_WARN,
+                               "XFS: unknown mount option [%s].", this_char);
                        return EINVAL;
                }
        }
 
        if (args->flags & XFSMNT_NORECOVERY) {
                if ((vfsp->vfs_flag & VFS_RDONLY) == 0) {
-                       printk("XFS: no-recovery mounts must be read-only.\n");
+                       cmn_err(CE_WARN,
+                               "XFS: no-recovery mounts must be read-only.");
                        return EINVAL;
                }
        }
 
        if ((args->flags & XFSMNT_NOALIGN) && (dsunit || dswidth)) {
-               printk(
-       "XFS: sunit and swidth options incompatible with the noalign option\n");
+               cmn_err(CE_WARN,
+       "XFS: sunit and swidth options incompatible with the noalign option");
                return EINVAL;
        }
 
        if ((dsunit && !dswidth) || (!dsunit && dswidth)) {
-               printk("XFS: sunit and swidth must be specified together\n");
+               cmn_err(CE_WARN,
+                       "XFS: sunit and swidth must be specified together");
                return EINVAL;
        }
 
        if (dsunit && (dswidth % dsunit != 0)) {
-               printk(
-       "XFS: stripe width (%d) must be a multiple of the stripe unit (%d)\n",
+               cmn_err(CE_WARN,
+       "XFS: stripe width (%d) must be a multiple of the stripe unit (%d)",
                        dswidth, dsunit);
                return EINVAL;
        }
@@ -1912,12 +1930,11 @@ xfs_showargs(
                { XFS_MOUNT_NOUUID,             "," MNTOPT_NOUUID },
                { XFS_MOUNT_NORECOVERY,         "," MNTOPT_NORECOVERY },
                { XFS_MOUNT_OSYNCISOSYNC,       "," MNTOPT_OSYNCISOSYNC },
-               { XFS_MOUNT_IDELETE,            "," MNTOPT_NOIKEEP },
                { 0, NULL }
        };
        struct proc_xfs_info    *xfs_infop;
        struct xfs_mount        *mp = XFS_BHVTOM(bhv);
-       struct vfs              *vfsp = XFS_MTOVFS(mp);
+       struct bhv_vfs          *vfsp = XFS_MTOVFS(mp);
 
        for (xfs_infop = xfs_info; xfs_infop->flag; xfs_infop++) {
                if (mp->m_flags & xfs_infop->flag)
@@ -1925,7 +1942,7 @@ xfs_showargs(
        }
 
        if (mp->m_flags & XFS_MOUNT_IHASHSIZE)
-               seq_printf(m, "," MNTOPT_IHASHSIZE "=%d", mp->m_ihsize);
+               seq_printf(m, "," MNTOPT_IHASHSIZE "=%d", (int)mp->m_ihsize);
 
        if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)
                seq_printf(m, "," MNTOPT_ALLOCSIZE "=%dk",
@@ -1948,10 +1965,10 @@ xfs_showargs(
                seq_printf(m, "," MNTOPT_SWIDTH "=%d",
                                (int)XFS_FSB_TO_BB(mp, mp->m_swidth));
 
+       if (!(mp->m_flags & XFS_MOUNT_IDELETE))
+               seq_printf(m, "," MNTOPT_IKEEP);
        if (!(mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE))
                seq_printf(m, "," MNTOPT_LARGEIO);
-       if (mp->m_flags & XFS_MOUNT_BARRIER)
-               seq_printf(m, "," MNTOPT_BARRIER);
 
        if (!(vfsp->vfs_flag & VFS_32BITINODES))
                seq_printf(m, "," MNTOPT_64BITINODE);
@@ -1977,7 +1994,7 @@ xfs_freeze(
 }
 
 
-vfsops_t xfs_vfsops = {
+bhv_vfsops_t xfs_vfsops = {
        BHV_IDENTITY_INIT(VFS_BHV_XFS,VFS_POSITION_XFS),
        .vfs_parseargs          = xfs_parseargs,
        .vfs_showargs           = xfs_showargs,