Merge branch 'xfs-da-geom' into for-next
authorDave Chinner <david@fromorbit.com>
Mon, 9 Jun 2014 21:32:41 +0000 (07:32 +1000)
committerDave Chinner <david@fromorbit.com>
Mon, 9 Jun 2014 21:32:41 +0000 (07:32 +1000)
17 files changed:
fs/xfs/xfs_aops.c
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_da_btree.c
fs/xfs/xfs_dir2.c
fs/xfs/xfs_fsops.c
fs/xfs/xfs_ialloc.c
fs/xfs/xfs_ialloc.h
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode_buf.c
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_log.h
fs/xfs/xfs_log_cil.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_sb.c
fs/xfs/xfs_sb.h

index 0479c32c5eb1703ba0081f21af9b380e5a3c95cb..d1b99b692ccb88d6d53b20692b217fdd928e9d63 100644 (file)
@@ -982,7 +982,32 @@ xfs_vm_writepage(
        offset = i_size_read(inode);
        end_index = offset >> PAGE_CACHE_SHIFT;
        last_index = (offset - 1) >> PAGE_CACHE_SHIFT;
-       if (page->index >= end_index) {
+
+       /*
+        * The page index is less than the end_index, adjust the end_offset
+        * to the highest offset that this page should represent.
+        * -----------------------------------------------------
+        * |                    file mapping           | <EOF> |
+        * -----------------------------------------------------
+        * | Page ... | Page N-2 | Page N-1 |  Page N  |       |
+        * ^--------------------------------^----------|--------
+        * |     desired writeback range    |      see else    |
+        * ---------------------------------^------------------|
+        */
+       if (page->index < end_index)
+               end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT;
+       else {
+               /*
+                * Check whether the page to write out is beyond or straddles
+                * i_size or not.
+                * -------------------------------------------------------
+                * |            file mapping                    | <EOF>  |
+                * -------------------------------------------------------
+                * | Page ... | Page N-2 | Page N-1 |  Page N   | Beyond |
+                * ^--------------------------------^-----------|---------
+                * |                                |      Straddles     |
+                * ---------------------------------^-----------|--------|
+                */
                unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1);
 
                /*
@@ -990,24 +1015,36 @@ xfs_vm_writepage(
                 * truncate operation that is in progress. We must redirty the
                 * page so that reclaim stops reclaiming it. Otherwise
                 * xfs_vm_releasepage() is called on it and gets confused.
+                *
+                * Note that the end_index is unsigned long, it would overflow
+                * if the given offset is greater than 16TB on 32-bit system
+                * and if we do check the page is fully outside i_size or not
+                * via "if (page->index >= end_index + 1)" as "end_index + 1"
+                * will be evaluated to 0.  Hence this page will be redirtied
+                * and be written out repeatedly which would result in an
+                * infinite loop, the user program that perform this operation
+                * will hang.  Instead, we can verify this situation by checking
+                * if the page to write is totally beyond the i_size or if it's
+                * offset is just equal to the EOF.
                 */
-               if (page->index >= end_index + 1 || offset_into_page == 0)
+               if (page->index > end_index ||
+                   (page->index == end_index && offset_into_page == 0))
                        goto redirty;
 
                /*
                 * The page straddles i_size.  It must be zeroed out on each
                 * and every writepage invocation because it may be mmapped.
                 * "A file is mapped in multiples of the page size.  For a file
-                * that is not a multiple of the  page size, the remaining
+                * that is not a multiple of the page size, the remaining
                 * memory is zeroed when mapped, and writes to that region are
                 * not written out to the file."
                 */
                zero_user_segment(page, offset_into_page, PAGE_CACHE_SIZE);
+
+               /* Adjust the end_offset to the end of file */
+               end_offset = offset;
        }
 
-       end_offset = min_t(unsigned long long,
-                       (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT,
-                       offset);
        len = 1 << inode->i_blkbits;
 
        bh = head = page_buffers(page);
index 296160b8e78c694c811e4e4391a06ced33bb3eef..057f671811d6128da5c27f5af595ad13c834a42b 100644 (file)
@@ -1519,7 +1519,6 @@ xfs_collapse_file_space(
 
        while (!error && !done) {
                tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
-               tp->t_flags |= XFS_TRANS_RESERVE;
                /*
                 * We would need to reserve permanent block for transaction.
                 * This will come into picture when after shifting extent into
@@ -1529,7 +1528,6 @@ xfs_collapse_file_space(
                error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
                                XFS_DIOSTRAT_SPACE_RES(mp, 0), 0);
                if (error) {
-                       ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp));
                        xfs_trans_cancel(tp, 0);
                        break;
                }
index 166087fd1946f4b545b64a892f61d8ca49623fd7..a514ab616650cd247013ffbb6cd2a4dbbfbc0c75 100644 (file)
@@ -2617,47 +2617,6 @@ xfs_da_read_buf(
                xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF);
        else
                xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF);
-
-       /*
-        * This verification code will be moved to a CRC verification callback
-        * function so just leave it here unchanged until then.
-        */
-       {
-               xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
-               xfs_dir2_free_t         *free = bp->b_addr;
-               xfs_da_blkinfo_t        *info = bp->b_addr;
-               uint                    magic, magic1;
-               struct xfs_mount        *mp = dp->i_mount;
-
-               magic = be16_to_cpu(info->magic);
-               magic1 = be32_to_cpu(hdr->magic);
-               if (unlikely(
-                   XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) &&
-                                  (magic != XFS_DA3_NODE_MAGIC) &&
-                                  (magic != XFS_ATTR_LEAF_MAGIC) &&
-                                  (magic != XFS_ATTR3_LEAF_MAGIC) &&
-                                  (magic != XFS_DIR2_LEAF1_MAGIC) &&
-                                  (magic != XFS_DIR3_LEAF1_MAGIC) &&
-                                  (magic != XFS_DIR2_LEAFN_MAGIC) &&
-                                  (magic != XFS_DIR3_LEAFN_MAGIC) &&
-                                  (magic1 != XFS_DIR2_BLOCK_MAGIC) &&
-                                  (magic1 != XFS_DIR3_BLOCK_MAGIC) &&
-                                  (magic1 != XFS_DIR2_DATA_MAGIC) &&
-                                  (magic1 != XFS_DIR3_DATA_MAGIC) &&
-                                  (free->hdr.magic !=
-                                       cpu_to_be32(XFS_DIR2_FREE_MAGIC)) &&
-                                  (free->hdr.magic !=
-                                       cpu_to_be32(XFS_DIR3_FREE_MAGIC)),
-                               mp, XFS_ERRTAG_DA_READ_BUF,
-                               XFS_RANDOM_DA_READ_BUF))) {
-                       trace_xfs_da_btree_corrupt(bp, _RET_IP_);
-                       XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)",
-                                            XFS_ERRLEVEL_LOW, mp, info);
-                       error = XFS_ERROR(EFSCORRUPTED);
-                       xfs_trans_brelse(trans, bp);
-                       goto out_free;
-               }
-       }
        *bpp = bp;
 out_free:
        if (mapp != &map)
index 07aa3907d237ea3dcea89de0870c94e23a95b88b..79670cda48ae4797f902af912d59d105215885bb 100644 (file)
@@ -93,7 +93,7 @@ xfs_da_mount(
        int                     nodehdr_size;
 
 
-       ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb));
+       ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT);
        ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <=
               XFS_MAX_BLOCKSIZE);
 
index a8cbcf06e7926f2de7a61f6251d1da6745f1be1b..d2295561570af03ffc5971dcf7cf67630cd4f6e5 100644 (file)
@@ -76,23 +76,18 @@ xfs_fs_geometry(
        }
        if (new_version >= 3) {
                geo->version = XFS_FSOP_GEOM_VERSION;
-               geo->flags =
+               geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK |
+                            XFS_FSOP_GEOM_FLAGS_DIRV2 |
                        (xfs_sb_version_hasattr(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_ATTR : 0) |
-                       (xfs_sb_version_hasnlink(&mp->m_sb) ?
-                               XFS_FSOP_GEOM_FLAGS_NLINK : 0) |
                        (xfs_sb_version_hasquota(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_QUOTA : 0) |
                        (xfs_sb_version_hasalign(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_IALIGN : 0) |
                        (xfs_sb_version_hasdalign(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_DALIGN : 0) |
-                       (xfs_sb_version_hasshared(&mp->m_sb) ?
-                               XFS_FSOP_GEOM_FLAGS_SHARED : 0) |
                        (xfs_sb_version_hasextflgbit(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) |
-                       (xfs_sb_version_hasdirv2(&mp->m_sb) ?
-                               XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) |
                        (xfs_sb_version_hassector(&mp->m_sb) ?
                                XFS_FSOP_GEOM_FLAGS_SECTOR : 0) |
                        (xfs_sb_version_hasasciici(&mp->m_sb) ?
index 6ac0c2986c32ef28e7143e7516cd92ad703f7352..e8dfaf0392323169f5ac3521d22be004b677b462 100644 (file)
@@ -280,10 +280,8 @@ xfs_ialloc_inode_init(
                if (tp)
                        xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos,
                                        mp->m_sb.sb_inodesize, length, gen);
-       } else if (xfs_sb_version_hasnlink(&mp->m_sb))
+       } else
                version = 2;
-       else
-               version = 1;
 
        for (j = 0; j < nbufs; j++) {
                /*
@@ -1437,7 +1435,7 @@ xfs_difree_inobt(
        struct xfs_buf                  *agbp,
        xfs_agino_t                     agino,
        struct xfs_bmap_free            *flist,
-       int                             *delete,
+       int                             *deleted,
        xfs_ino_t                       *first_ino,
        struct xfs_inobt_rec_incore     *orec)
 {
@@ -1497,7 +1495,7 @@ xfs_difree_inobt(
        if (!(mp->m_flags & XFS_MOUNT_IKEEP) &&
            (rec.ir_freecount == mp->m_ialloc_inos)) {
 
-               *delete = 1;
+               *deleted = 1;
                *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino);
 
                /*
@@ -1525,7 +1523,7 @@ xfs_difree_inobt(
                                  XFS_AGINO_TO_AGBNO(mp, rec.ir_startino)),
                                  mp->m_ialloc_blks, flist, mp);
        } else {
-               *delete = 0;
+               *deleted = 0;
 
                error = xfs_inobt_update(cur, &rec);
                if (error) {
@@ -1662,7 +1660,7 @@ xfs_difree(
        struct xfs_trans        *tp,            /* transaction pointer */
        xfs_ino_t               inode,          /* inode to be freed */
        struct xfs_bmap_free    *flist,         /* extents to free */
-       int                     *delete,/* set if inode cluster was deleted */
+       int                     *deleted,/* set if inode cluster was deleted */
        xfs_ino_t               *first_ino)/* first inode in deleted cluster */
 {
        /* REFERENCED */
@@ -1714,7 +1712,7 @@ xfs_difree(
        /*
         * Fix up the inode allocation btree.
         */
-       error = xfs_difree_inobt(mp, tp, agbp, agino, flist, delete, first_ino,
+       error = xfs_difree_inobt(mp, tp, agbp, agino, flist, deleted, first_ino,
                                 &rec);
        if (error)
                goto error0;
index 812365d17e672d5a79b34ffac2550202c095b0f2..95ad1c002d600916f983806cdb6a484712f0a84b 100644 (file)
@@ -90,7 +90,7 @@ xfs_difree(
        struct xfs_trans *tp,           /* transaction pointer */
        xfs_ino_t       inode,          /* inode to be freed */
        struct xfs_bmap_free *flist,    /* extents to free */
-       int             *delete       /* set if inode cluster was deleted */
+       int             *deleted,       /* set if inode cluster was deleted */
        xfs_ino_t       *first_ino);    /* first inode in deleted cluster */
 
 /*
index 6d6b44a508f951071fb3cc5fb46ef40ddb0011d8..a6115fe1ac948a4b57efb6bf00830bb9a4845ed6 100644 (file)
@@ -681,6 +681,14 @@ xfs_ialloc(
                return error;
        ASSERT(ip != NULL);
 
+       /*
+        * We always convert v1 inodes to v2 now - we only support filesystems
+        * with >= v2 inode capability, so there is no reason for ever leaving
+        * an inode in v1 format.
+        */
+       if (ip->i_d.di_version == 1)
+               ip->i_d.di_version = 2;
+
        ip->i_d.di_mode = mode;
        ip->i_d.di_onlink = 0;
        ip->i_d.di_nlink = nlink;
@@ -690,27 +698,6 @@ xfs_ialloc(
        xfs_set_projid(ip, prid);
        memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
 
-       /*
-        * If the superblock version is up to where we support new format
-        * inodes and this is currently an old format inode, then change
-        * the inode version number now.  This way we only do the conversion
-        * here rather than here and in the flush/logging code.
-        */
-       if (xfs_sb_version_hasnlink(&mp->m_sb) &&
-           ip->i_d.di_version == 1) {
-               ip->i_d.di_version = 2;
-               /*
-                * We've already zeroed the old link count, the projid field,
-                * and the pad field.
-                */
-       }
-
-       /*
-        * Project ids won't be stored on disk if we are using a version 1 inode.
-        */
-       if ((prid != 0) && (ip->i_d.di_version == 1))
-               xfs_bump_ino_vers2(tp, ip);
-
        if (pip && XFS_INHERIT_GID(pip)) {
                ip->i_d.di_gid = pip->i_d.di_gid;
                if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) {
@@ -1055,40 +1042,6 @@ xfs_droplink(
        return error;
 }
 
-/*
- * This gets called when the inode's version needs to be changed from 1 to 2.
- * Currently this happens when the nlink field overflows the old 16-bit value
- * or when chproj is called to change the project for the first time.
- * As a side effect the superblock version will also get rev'd
- * to contain the NLINK bit.
- */
-void
-xfs_bump_ino_vers2(
-       xfs_trans_t     *tp,
-       xfs_inode_t     *ip)
-{
-       xfs_mount_t     *mp;
-
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-       ASSERT(ip->i_d.di_version == 1);
-
-       ip->i_d.di_version = 2;
-       ip->i_d.di_onlink = 0;
-       memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
-       mp = tp->t_mountp;
-       if (!xfs_sb_version_hasnlink(&mp->m_sb)) {
-               spin_lock(&mp->m_sb_lock);
-               if (!xfs_sb_version_hasnlink(&mp->m_sb)) {
-                       xfs_sb_version_addnlink(&mp->m_sb);
-                       spin_unlock(&mp->m_sb_lock);
-                       xfs_mod_sb(tp, XFS_SB_VERSIONNUM);
-               } else {
-                       spin_unlock(&mp->m_sb_lock);
-               }
-       }
-       /* Caller must log the inode */
-}
-
 /*
  * Increment the link count on an inode & log the change.
  */
@@ -1099,22 +1052,10 @@ xfs_bumplink(
 {
        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
 
+       ASSERT(ip->i_d.di_version > 1);
        ASSERT(ip->i_d.di_nlink > 0 || (VFS_I(ip)->i_state & I_LINKABLE));
        ip->i_d.di_nlink++;
        inc_nlink(VFS_I(ip));
-       if ((ip->i_d.di_version == 1) &&
-           (ip->i_d.di_nlink > XFS_MAXLINK_1)) {
-               /*
-                * The inode has increased its number of links beyond
-                * what can fit in an old format inode.  It now needs
-                * to be converted to a version 2 inode with a 32 bit
-                * link count.  If this is the first inode in the file
-                * system to do this, then we need to bump the superblock
-                * version number as well.
-                */
-               xfs_bump_ino_vers2(tp, ip);
-       }
-
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        return 0;
 }
@@ -3249,6 +3190,7 @@ xfs_iflush_int(
        ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
               ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
        ASSERT(iip != NULL && iip->ili_fields != 0);
+       ASSERT(ip->i_d.di_version > 1);
 
        /* set *dip = inode's place in the buffer */
        dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset);
@@ -3309,7 +3251,7 @@ xfs_iflush_int(
        }
 
        /*
-        * Inode item log recovery for v1/v2 inodes are dependent on the
+        * Inode item log recovery for v2 inodes are dependent on the
         * di_flushiter count for correct sequencing. We bump the flush
         * iteration count so we can detect flushes which postdate a log record
         * during recovery. This is redundant as we now log every change and
@@ -3332,37 +3274,6 @@ xfs_iflush_int(
        if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
                ip->i_d.di_flushiter = 0;
 
-       /*
-        * If this is really an old format inode and the superblock version
-        * has not been updated to support only new format inodes, then
-        * convert back to the old inode format.  If the superblock version
-        * has been updated, then make the conversion permanent.
-        */
-       ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb));
-       if (ip->i_d.di_version == 1) {
-               if (!xfs_sb_version_hasnlink(&mp->m_sb)) {
-                       /*
-                        * Convert it back.
-                        */
-                       ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1);
-                       dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink);
-               } else {
-                       /*
-                        * The superblock version has already been bumped,
-                        * so just make the conversion to the new inode
-                        * format permanent.
-                        */
-                       ip->i_d.di_version = 2;
-                       dip->di_version = 2;
-                       ip->i_d.di_onlink = 0;
-                       dip->di_onlink = 0;
-                       memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
-                       memset(&(dip->di_pad[0]), 0,
-                             sizeof(dip->di_pad));
-                       ASSERT(xfs_get_projid(ip) == 0);
-               }
-       }
-
        xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK);
        if (XFS_IFORK_Q(ip))
                xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK);
index 13aea548206c50dffef65f9d912326ac1e211369..f72bffa6726628224c2f9f0e9fbee6480b3995dd 100644 (file)
@@ -377,7 +377,6 @@ int         xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t,
                               struct xfs_inode **, int *);
 int            xfs_droplink(struct xfs_trans *, struct xfs_inode *);
 int            xfs_bumplink(struct xfs_trans *, struct xfs_inode *);
-void           xfs_bump_ino_vers2(struct xfs_trans *, struct xfs_inode *);
 
 /* from xfs_file.c */
 int            xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t);
index 24e993996bdcf90f9f955ed139d2783840082927..cb35ae41d4a18c8a7c88a7c9009f3660ea9e526b 100644 (file)
@@ -437,17 +437,16 @@ xfs_iread(
        }
 
        /*
-        * The inode format changed when we moved the link count and
-        * made it 32 bits long.  If this is an old format inode,
-        * convert it in memory to look like a new one.  If it gets
-        * flushed to disk we will convert back before flushing or
-        * logging it.  We zero out the new projid field and the old link
-        * count field.  We'll handle clearing the pad field (the remains
-        * of the old uuid field) when we actually convert the inode to
-        * the new format. We don't change the version number so that we
-        * can distinguish this from a real new format inode.
+        * Automatically convert version 1 inode formats in memory to version 2
+        * inode format. If the inode is modified, it will get logged and
+        * rewritten as a version 2 inode. We can do this because we set the
+        * superblock feature bit for v2 inodes unconditionally during mount
+        * and it means the reast of the code can assume the inode version is 2
+        * or higher.
         */
        if (ip->i_d.di_version == 1) {
+               ip->i_d.di_version = 2;
+               memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
                ip->i_d.di_nlink = ip->i_d.di_onlink;
                ip->i_d.di_onlink = 0;
                xfs_set_projid(ip, 0);
index 686889b4a1e5d8211e895a1384aadf6faa7de697..a640137b357326de1d4df03ac63b9b918ec92588 100644 (file)
@@ -145,34 +145,6 @@ xfs_inode_item_size(
                xfs_inode_item_attr_fork_size(iip, nvecs, nbytes);
 }
 
-/*
- * If this is a v1 format inode, then we need to log it as such.  This means
- * that we have to copy the link count from the new field to the old.  We
- * don't have to worry about the new fields, because nothing trusts them as
- * long as the old inode version number is there.
- */
-STATIC void
-xfs_inode_item_format_v1_inode(
-       struct xfs_inode        *ip)
-{
-       if (!xfs_sb_version_hasnlink(&ip->i_mount->m_sb)) {
-               /*
-                * Convert it back.
-                */
-               ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1);
-               ip->i_d.di_onlink = ip->i_d.di_nlink;
-       } else {
-               /*
-                * The superblock version has already been bumped,
-                * so just make the conversion to the new inode
-                * format permanent.
-                */
-               ip->i_d.di_version = 2;
-               ip->i_d.di_onlink = 0;
-               memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
-       }
-}
-
 STATIC void
 xfs_inode_item_format_data_fork(
        struct xfs_inode_log_item *iip,
@@ -370,6 +342,8 @@ xfs_inode_item_format(
        struct xfs_inode_log_format *ilf;
        struct xfs_log_iovec    *vecp = NULL;
 
+       ASSERT(ip->i_d.di_version > 1);
+
        ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT);
        ilf->ilf_type = XFS_LI_INODE;
        ilf->ilf_ino = ip->i_ino;
@@ -380,8 +354,6 @@ xfs_inode_item_format(
        ilf->ilf_size = 2; /* format + core */
        xlog_finish_iovec(lv, vecp, sizeof(struct xfs_inode_log_format));
 
-       if (ip->i_d.di_version == 1)
-               xfs_inode_item_format_v1_inode(ip);
        xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICORE,
                        &ip->i_d,
                        xfs_icdinode_size(ip->i_d.di_version));
index 2d8f4fdf07f9b3b595a443e1258c18b98972aa75..55724c8b204b901f695d7a11714cdbc13bc67f50 100644 (file)
@@ -1228,15 +1228,8 @@ xfs_ioctl_setattr(
                                olddquot = xfs_qm_vop_chown(tp, ip,
                                                        &ip->i_pdquot, pdqp);
                        }
+                       ASSERT(ip->i_d.di_version > 1);
                        xfs_set_projid(ip, fa->fsx_projid);
-
-                       /*
-                        * We may have to rev the inode as well as
-                        * the superblock version number since projids didn't
-                        * exist before DINODE_VERSION_2 and SB_VERSION_NLINK.
-                        */
-                       if (ip->i_d.di_version == 1)
-                               xfs_bump_ino_vers2(tp, ip);
                }
 
        }
index 2c4004475e71af25dbfa4a6e853af5cfd09bac75..84e0deb95abda6181b5a10b2a3f790df9c6f04ff 100644 (file)
@@ -24,7 +24,8 @@ struct xfs_log_vec {
        struct xfs_log_iovec    *lv_iovecp;     /* iovec array */
        struct xfs_log_item     *lv_item;       /* owner */
        char                    *lv_buf;        /* formatted buffer */
-       int                     lv_buf_len;     /* size of formatted buffer */
+       int                     lv_bytes;       /* accounted space in buffer */
+       int                     lv_buf_len;     /* aligned size of buffer */
        int                     lv_size;        /* size of allocated lv */
 };
 
@@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
        return vec->i_addr;
 }
 
+/*
+ * We need to make sure the next buffer is naturally aligned for the biggest
+ * basic data type we put into it.  We already accounted for this padding when
+ * sizing the buffer.
+ *
+ * However, this padding does not get written into the log, and hence we have to
+ * track the space used by the log vectors separately to prevent log space hangs
+ * due to inaccurate accounting (i.e. a leak) of the used log space through the
+ * CIL context ticket.
+ */
 static inline void
 xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len)
 {
-       /*
-        * We need to make sure the next buffer is naturally aligned for the
-        * biggest basic data type we put into it.  We already accounted for
-        * this when sizing the buffer.
-        */
        lv->lv_buf_len += round_up(len, sizeof(uint64_t));
+       lv->lv_bytes += len;
        vec->i_len = len;
 }
 
index 039c873e6fb20e8b0976f67d3fbb1c5f14ebbc8e..b3425b34e3d5782d95252c71acadfffdbd24ad4c 100644 (file)
@@ -97,7 +97,7 @@ xfs_cil_prepare_item(
 {
        /* Account for the new LV being passed in */
        if (lv->lv_buf_len != XFS_LOG_VEC_ORDERED) {
-               *diff_len += lv->lv_buf_len;
+               *diff_len += lv->lv_bytes;
                *diff_iovecs += lv->lv_niovecs;
        }
 
@@ -111,7 +111,7 @@ xfs_cil_prepare_item(
        else if (old_lv != lv) {
                ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED);
 
-               *diff_len -= old_lv->lv_buf_len;
+               *diff_len -= old_lv->lv_bytes;
                *diff_iovecs -= old_lv->lv_niovecs;
                kmem_free(old_lv);
        }
@@ -239,7 +239,7 @@ xlog_cil_insert_format_items(
                         * that the space reservation accounting is correct.
                         */
                        *diff_iovecs -= lv->lv_niovecs;
-                       *diff_len -= lv->lv_buf_len;
+                       *diff_len -= lv->lv_bytes;
                } else {
                        /* allocate new data chunk */
                        lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS);
@@ -259,6 +259,7 @@ xlog_cil_insert_format_items(
 
                /* The allocated data region lies beyond the iovec region */
                lv->lv_buf_len = 0;
+               lv->lv_bytes = 0;
                lv->lv_buf = (char *)lv + buf_size - nbytes;
                ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t)));
 
index 1ec84c359ea5996ac88b5c566357b60690f1efdf..03c9d645865cbae4574eba4e301a5a2817f65125 100644 (file)
@@ -697,6 +697,12 @@ xfs_mountfs(
                        mp->m_update_flags |= XFS_SB_VERSIONNUM;
        }
 
+       /* always use v2 inodes by default now */
+       if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) {
+               mp->m_sb.sb_versionnum |= XFS_SB_VERSION_NLINKBIT;
+               mp->m_update_flags |= XFS_SB_VERSIONNUM;
+       }
+
        /*
         * Check if sb_agblocks is aligned at stripe boundary
         * If sb_agblocks is NOT aligned turn off m_dalign since
index 8baf61afae1ddf132757caad16c359ec447dcc39..c3453b11f5636d228cb5ceb433aa8c67e89c7709 100644 (file)
@@ -291,7 +291,8 @@ xfs_mount_validate_sb(
            (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */)    ||
            sbp->sb_dblocks == 0                                        ||
            sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp)                      ||
-           sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) {
+           sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp)                      ||
+           sbp->sb_shared_vn != 0)) {
                xfs_notice(mp, "SB sanity check failed");
                return XFS_ERROR(EFSCORRUPTED);
        }
@@ -333,15 +334,6 @@ xfs_mount_validate_sb(
                xfs_warn(mp, "Offline file system operation in progress!");
                return XFS_ERROR(EFSCORRUPTED);
        }
-
-       /*
-        * Version 1 directory format has never worked on Linux.
-        */
-       if (unlikely(!xfs_sb_version_hasdirv2(sbp))) {
-               xfs_warn(mp, "file system using version 1 directory format");
-               return XFS_ERROR(ENOSYS);
-       }
-
        return 0;
 }
 
index 950d1ea058b23653f3940f3a0fbdf259888d64df..c43c2d609a24bb38816b422d60b80ba06b18fcd4 100644 (file)
@@ -36,8 +36,6 @@ struct xfs_trans;
 #define        XFS_SB_VERSION_5        5               /* CRC enabled filesystem */
 #define        XFS_SB_VERSION_NUMBITS          0x000f
 #define        XFS_SB_VERSION_ALLFBITS         0xfff0
-#define        XFS_SB_VERSION_SASHFBITS        0xf000
-#define        XFS_SB_VERSION_REALFBITS        0x0ff0
 #define        XFS_SB_VERSION_ATTRBIT          0x0010
 #define        XFS_SB_VERSION_NLINKBIT         0x0020
 #define        XFS_SB_VERSION_QUOTABIT         0x0040
@@ -50,24 +48,15 @@ struct xfs_trans;
 #define        XFS_SB_VERSION_DIRV2BIT         0x2000
 #define        XFS_SB_VERSION_BORGBIT          0x4000  /* ASCII only case-insens. */
 #define        XFS_SB_VERSION_MOREBITSBIT      0x8000
-#define        XFS_SB_VERSION_OKSASHFBITS      \
-       (XFS_SB_VERSION_EXTFLGBIT | \
-        XFS_SB_VERSION_DIRV2BIT | \
-        XFS_SB_VERSION_BORGBIT)
-#define        XFS_SB_VERSION_OKREALFBITS      \
-       (XFS_SB_VERSION_ATTRBIT | \
-        XFS_SB_VERSION_NLINKBIT | \
-        XFS_SB_VERSION_QUOTABIT | \
-        XFS_SB_VERSION_ALIGNBIT | \
-        XFS_SB_VERSION_DALIGNBIT | \
-        XFS_SB_VERSION_SHAREDBIT | \
-        XFS_SB_VERSION_LOGV2BIT | \
-        XFS_SB_VERSION_SECTORBIT | \
-        XFS_SB_VERSION_MOREBITSBIT)
-#define        XFS_SB_VERSION_OKREALBITS       \
-       (XFS_SB_VERSION_NUMBITS | \
-        XFS_SB_VERSION_OKREALFBITS | \
-        XFS_SB_VERSION_OKSASHFBITS)
+
+/*
+ * Supported feature bit list is just all bits in the versionnum field because
+ * we've used them all up and understand them all. Except, of course, for the
+ * shared superblock bit, which nobody knows what it does and so is unsupported.
+ */
+#define        XFS_SB_VERSION_OKBITS           \
+       ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \
+               ~XFS_SB_VERSION_SHAREDBIT)
 
 /*
  * There are two words to hold XFS "feature" bits: the original
@@ -76,7 +65,6 @@ struct xfs_trans;
  *
  * These defines represent bits in sb_features2.
  */
-#define XFS_SB_VERSION2_REALFBITS      0x00ffffff      /* Mask: features */
 #define XFS_SB_VERSION2_RESERVED1BIT   0x00000001
 #define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002      /* Superblk counters */
 #define XFS_SB_VERSION2_RESERVED4BIT   0x00000004
@@ -86,16 +74,11 @@ struct xfs_trans;
 #define XFS_SB_VERSION2_CRCBIT         0x00000100      /* metadata CRCs */
 #define XFS_SB_VERSION2_FTYPE          0x00000200      /* inode type in dir */
 
-#define        XFS_SB_VERSION2_OKREALFBITS     \
+#define        XFS_SB_VERSION2_OKBITS          \
        (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
         XFS_SB_VERSION2_ATTR2BIT       | \
         XFS_SB_VERSION2_PROJID32BIT    | \
         XFS_SB_VERSION2_FTYPE)
-#define        XFS_SB_VERSION2_OKSASHFBITS     \
-       (0)
-#define XFS_SB_VERSION2_OKREALBITS     \
-       (XFS_SB_VERSION2_OKREALFBITS |  \
-        XFS_SB_VERSION2_OKSASHFBITS )
 
 /*
  * Superblock - in core version.  Must match the ondisk version below.
@@ -345,214 +328,140 @@ typedef enum {
 
 #define        XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
 
-static inline int xfs_sb_good_version(xfs_sb_t *sbp)
-{
-       /* We always support version 1-3 */
-       if (sbp->sb_versionnum >= XFS_SB_VERSION_1 &&
-           sbp->sb_versionnum <= XFS_SB_VERSION_3)
-               return 1;
-
-       /* We support version 4 if all feature bits are supported */
-       if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) {
-               if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) ||
-                   ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
-                    (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS)))
-                       return 0;
-
-               if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN)
-                       return 0;
-               return 1;
-       }
-       if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5)
-               return 1;
-
-       return 0;
-}
-
 /*
- * Detect a mismatched features2 field.  Older kernels read/wrote
- * this into the wrong slot, so to be safe we keep them in sync.
+ * The first XFS version we support is a v4 superblock with V2 directories.
  */
-static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp)
+static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp)
 {
-       return (sbp->sb_bad_features2 != sbp->sb_features2);
-}
+       if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT))
+               return false;
 
-static inline unsigned xfs_sb_version_tonew(unsigned v)
-{
-       if (v == XFS_SB_VERSION_1)
-               return XFS_SB_VERSION_4;
+       /* check for unknown features in the fs */
+       if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) ||
+           ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
+            (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))
+               return false;
 
-       if (v == XFS_SB_VERSION_2)
-               return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT;
-
-       return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT |
-               XFS_SB_VERSION_NLINKBIT;
+       return true;
 }
 
-static inline unsigned xfs_sb_version_toold(unsigned v)
+static inline bool xfs_sb_good_version(struct xfs_sb *sbp)
 {
-       if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT))
-               return 0;
-       if (v & XFS_SB_VERSION_NLINKBIT)
-               return XFS_SB_VERSION_3;
-       if (v & XFS_SB_VERSION_ATTRBIT)
-               return XFS_SB_VERSION_2;
-       return XFS_SB_VERSION_1;
-}
-
-static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp)
-{
-       return sbp->sb_versionnum == XFS_SB_VERSION_2 ||
-               sbp->sb_versionnum == XFS_SB_VERSION_3 ||
-               (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-                (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT));
+       if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5)
+               return true;
+       if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4)
+               return xfs_sb_good_v4_features(sbp);
+       return false;
 }
 
-static inline void xfs_sb_version_addattr(xfs_sb_t *sbp)
+/*
+ * Detect a mismatched features2 field.  Older kernels read/wrote
+ * this into the wrong slot, so to be safe we keep them in sync.
+ */
+static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp)
 {
-       if (sbp->sb_versionnum == XFS_SB_VERSION_1)
-               sbp->sb_versionnum = XFS_SB_VERSION_2;
-       else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4)
-               sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
-       else
-               sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT;
+       return sbp->sb_bad_features2 != sbp->sb_features2;
 }
 
-static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp)
 {
-       return sbp->sb_versionnum == XFS_SB_VERSION_3 ||
-                (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-                 (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT));
+       return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT);
 }
 
-static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp)
+static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
 {
-       if (sbp->sb_versionnum <= XFS_SB_VERSION_2)
-               sbp->sb_versionnum = XFS_SB_VERSION_3;
-       else
-               sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT;
+       sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
 }
 
-static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp)
 {
-       return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
+       return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
 }
 
-static inline void xfs_sb_version_addquota(xfs_sb_t *sbp)
+static inline void xfs_sb_version_addquota(struct xfs_sb *sbp)
 {
-       if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4)
-               sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
-       else
-               sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) |
-                                       XFS_SB_VERSION_QUOTABIT;
+       sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
 }
 
-static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp)
 {
-       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
-              (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
+       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
                (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT));
 }
 
-static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp)
 {
-       return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
+       return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
 }
 
-static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp)
 {
-       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT);
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
+              (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT);
 }
 
-static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp)
 {
-       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
-              (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT));
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
+              (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT);
 }
 
-static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp)
 {
-       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
-              (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT));
+       return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
 }
 
-static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp)
 {
-       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
-              (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT));
+       return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
 }
 
-static inline int xfs_sb_version_hassector(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
 {
-       return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
-}
-
-static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp)
-{
-       return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
-}
-
-static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp)
-{
-       return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
-              (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 &&
-               (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT));
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
+              (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
 }
 
 /*
  * sb_features2 bit version macros.
- *
- * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro:
- *
- * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp)
- *     ((xfs_sb_version_hasmorebits(sbp) &&
- *      ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT)
  */
-
-static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp)
 {
        return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
               (xfs_sb_version_hasmorebits(sbp) &&
                (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT));
 }
 
-static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp)
 {
        return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
               (xfs_sb_version_hasmorebits(sbp) &&
                (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT));
 }
 
-static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp)
+static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
 {
        sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
        sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
+       sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT;
 }
 
-static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp)
+static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp)
 {
        sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
+       sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
        if (!sbp->sb_features2)
                sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
 }
 
-static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp)
+static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp)
 {
        return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
               (xfs_sb_version_hasmorebits(sbp) &&
                (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT));
 }
 
-static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp)
+static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp)
 {
        sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
        sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
@@ -625,12 +534,12 @@ xfs_sb_has_incompat_log_feature(
 /*
  * V5 superblock specific feature checks
  */
-static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp)
+static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp)
 {
        return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
 }
 
-static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp)
+static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp)
 {
        return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
 }