]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: use vfs inode nlink field everywhere
authorDave Chinner <dchinner@redhat.com>
Thu, 18 Feb 2016 01:03:51 +0000 (12:03 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 18 Feb 2016 01:03:51 +0000 (12:03 +1100)
Source kernel commit 54d7b5c1d03e9711cce2d72237d5b3f5c87431f4

The VFS tracks the inode nlink just like the xfs_icdinode. We can
remove the variable from the icdinode and use the VFS inode variable
everywhere, reducing the size of the xfs_icdinode by a further 4
bytes.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/check.c
include/xfs_inode.h
libxfs/util.c
libxfs/xfs_inode_buf.c
libxfs/xfs_inode_buf.h
mkfs/proto.c
repair/phase6.c
repair/phase7.c

index be81feedfa45720bda7ce642749b08c26342bb6c..5118e2995075359a2d7d6220cb84f82624870608 100644 (file)
@@ -2797,7 +2797,7 @@ process_inode(
                break;
        }
 
-       setlink_inode(id, xino.i_d.di_nlink, type == DBM_DIR, security);
+       setlink_inode(id, VFS_I(&xino)->i_nlink, type == DBM_DIR, security);
 
        switch (xino.i_d.di_format) {
        case XFS_DINODE_FMT_LOCAL:
index 1efff0f461dca09660d49797e7e2345864df4f76..dc1f9479a2f13f28dda12be418e10293006cb5e9 100644 (file)
@@ -34,6 +34,7 @@ struct xfs_dir_ops;
  * metadata.
  */
 struct inode {
+       uint32_t        i_nlink;
        struct timespec i_atime;
        struct timespec i_mtime;
        struct timespec i_ctime;
@@ -74,6 +75,16 @@ static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
 }
 #define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME)
 
+/* inode link counts */
+static inline void set_nlink(struct inode *inode, uint32_t nlink)
+{
+       inode->i_nlink = nlink;
+}
+static inline void inc_nlink(struct inode *inode)
+{
+       inode->i_nlink++;
+}
+
 /*
  * Project quota id helpers (previously projid was 16bit only and using two
  * 16bit values to hold new 32bit projid was chosen to retain compatibility with
index bbaf7901ae825b6de334794c10ab0fb6af6f8a24..9327a629a4bcd06026f97d1ff544aa0b68c121f1 100644 (file)
@@ -218,8 +218,7 @@ libxfs_ialloc(
        ASSERT(ip != NULL);
 
        ip->i_d.di_mode = (__uint16_t)mode;
-       ip->i_d.di_nlink = nlink;
-       ASSERT(ip->i_d.di_nlink == nlink);
+       set_nlink(VFS_I(ip), nlink);
        ip->i_d.di_uid = cr->cr_uid;
        ip->i_d.di_gid = cr->cr_gid;
        xfs_set_projid(&ip->i_d, pip ? 0 : fsx->fsx_projid);
@@ -387,7 +386,7 @@ libxfs_iprint(
                printf("    Other inode\n");
                break;
        }
-       printf("   di_nlink %x\n", dip->di_nlink);
+       printf("   di_nlink %x\n", VFS_I(ip)->i_nlink);
        printf("   di_uid %d\n", dip->di_uid);
        printf("   di_gid %d\n", dip->di_gid);
        printf("   di_nextents %d\n", dip->di_nextents);
index 66a827a708215072917bcf143d5f991e5555d329..dba8a4b1fd65898c5287b64361a9531b30d85d2f 100644 (file)
@@ -219,12 +219,12 @@ xfs_inode_from_disk(
         * minimum inode version format we support in the rest of the code.
         */
        if (to->di_version == 1) {
-               to->di_nlink = be16_to_cpu(from->di_onlink);
+               set_nlink(inode, be16_to_cpu(from->di_onlink));
                to->di_projid_lo = 0;
                to->di_projid_hi = 0;
                to->di_version = 2;
        } else {
-               to->di_nlink = be32_to_cpu(from->di_nlink);
+               set_nlink(inode, be32_to_cpu(from->di_nlink));
                to->di_projid_lo = be16_to_cpu(from->di_projid_lo);
                to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
        }
@@ -284,7 +284,6 @@ xfs_inode_to_disk(
        to->di_format = from->di_format;
        to->di_uid = cpu_to_be32(from->di_uid);
        to->di_gid = cpu_to_be32(from->di_gid);
-       to->di_nlink = cpu_to_be32(from->di_nlink);
        to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
        to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
 
@@ -295,6 +294,7 @@ xfs_inode_to_disk(
        to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
        to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec);
        to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
+       to->di_nlink = cpu_to_be32(inode->i_nlink);
 
        to->di_size = cpu_to_be64(from->di_size);
        to->di_nblocks = cpu_to_be64(from->di_nblocks);
index 489b96e9efa82a356a278f3be9344c4f6c420c6f..ccc40522a46ab96b3a19efa6fea998483dea2361 100644 (file)
@@ -34,7 +34,6 @@ struct xfs_icdinode {
        __uint16_t      di_flushiter;   /* incremented on flush */
        __uint32_t      di_uid;         /* owner's user id */
        __uint32_t      di_gid;         /* owner's group id */
-       __uint32_t      di_nlink;       /* number of links to file */
        __uint16_t      di_projid_lo;   /* lower part of owner's project id */
        __uint16_t      di_projid_hi;   /* higher part of owner's project id */
        xfs_fsize_t     di_size;        /* number of bytes in file */
index 72a1576972f2106d49c24f723c9ecfac1a26d8f3..9ff855482e78d09a6fd71f1d5bc728fd602cc8de 100644 (file)
@@ -546,7 +546,7 @@ parseproto(
                                &creds, fsxp, &ip);
                if (error)
                        fail(_("Inode allocation failed"), error);
-               ip->i_d.di_nlink++;             /* account for . */
+               inc_nlink(VFS_I(ip));           /* account for . */
                if (!pip) {
                        pip = ip;
                        mp->m_sb.sb_rootino = ip->i_ino;
@@ -557,7 +557,7 @@ parseproto(
                        xname.type = XFS_DIR3_FT_DIR;
                        newdirent(mp, tp, pip, &xname, ip->i_ino,
                                  &first, &flist);
-                       pip->i_d.di_nlink++;
+                       inc_nlink(VFS_I(pip));
                        libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE);
                }
                newdirectory(mp, tp, ip, pip);
index 00142e2d30ed090447b7e0c3346c6ee153b7ce67..7e14346bf9a9d8072fd77bc6fee36c34969cf717 100644 (file)
@@ -515,7 +515,7 @@ mk_rbmino(xfs_mount_t *mp)
        ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
 
-       ip->i_d.di_nlink = 1;           /* account for sb ptr */
+       set_nlink(VFS_I(ip), 1);        /* account for sb ptr */
 
        times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD;
        if (ip->i_d.di_version == 3) {
@@ -768,7 +768,7 @@ mk_rsumino(xfs_mount_t *mp)
        ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
 
-       ip->i_d.di_nlink = 1;           /* account for sb ptr */
+       set_nlink(VFS_I(ip), 1);        /* account for sb ptr */
 
        times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD;
        if (ip->i_d.di_version == 3) {
@@ -877,7 +877,7 @@ mk_root_dir(xfs_mount_t *mp)
        ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
 
-       ip->i_d.di_nlink = 1;           /* account for . */
+       set_nlink(VFS_I(ip), 1);        /* account for . */
 
        times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD;
        if (ip->i_d.di_version == 3) {
@@ -976,7 +976,7 @@ mk_orphanage(xfs_mount_t *mp)
                do_error(_("%s inode allocation failed %d\n"),
                        ORPHANAGE, error);
        }
-       ip->i_d.di_nlink++;             /* account for . */
+       inc_nlink(VFS_I(ip));           /* account for . */
        ino = ip->i_ino;
 
        irec = find_inode_rec(mp,
@@ -1027,7 +1027,7 @@ mk_orphanage(xfs_mount_t *mp)
         * bump up the link count in the root directory to account
         * for .. in the new directory
         */
-       pip->i_d.di_nlink++;
+       inc_nlink(VFS_I(pip));
        add_inode_ref(find_inode_rec(mp,
                                XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
                                XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino)), 0);
@@ -1133,7 +1133,7 @@ mv_orphanage(
                        if (irec)
                                add_inode_ref(irec, ino_offset);
                        else
-                               orphanage_ip->i_d.di_nlink++;
+                               inc_nlink(VFS_I(orphanage_ip));
                        libxfs_trans_log_inode(tp, orphanage_ip, XFS_ILOG_CORE);
 
                        err = -libxfs_dir_createname(tp, ino_p, &xfs_name_dotdot,
@@ -1143,7 +1143,7 @@ mv_orphanage(
        _("creation of .. entry failed (%d), filesystem may be out of space\n"),
                                        err);
 
-                       ino_p->i_d.di_nlink++;
+                       inc_nlink(VFS_I(ino_p));
                        libxfs_trans_log_inode(tp, ino_p, XFS_ILOG_CORE);
 
                        err = -libxfs_bmap_finish(&tp, &flist, ino_p);
@@ -1176,7 +1176,7 @@ mv_orphanage(
                        if (irec)
                                add_inode_ref(irec, ino_offset);
                        else
-                               orphanage_ip->i_d.di_nlink++;
+                               inc_nlink(VFS_I(orphanage_ip));
                        libxfs_trans_log_inode(tp, orphanage_ip, XFS_ILOG_CORE);
 
                        /*
@@ -1229,7 +1229,7 @@ mv_orphanage(
                                ORPHANAGE, err);
                ASSERT(err == 0);
 
-               ino_p->i_d.di_nlink = 1;
+               set_nlink(VFS_I(ino_p), 1);
                libxfs_trans_log_inode(tp, ino_p, XFS_ILOG_CORE);
 
                err = -libxfs_bmap_finish(&tp, &flist, ino_p);
index 72a8adedf9eb1e5741e6cf98bf60ef3dd0abdf5e..3e234b980ce8750ebebf0ecc6d720b755d434d98 100644 (file)
 #include "progress.h"
 #include "threads.h"
 
-/* dinoc is a pointer to the IN-CORE dinode core */
-static void
-set_nlinks(
-       struct xfs_icdinode     *dinoc,
-       xfs_ino_t               ino,
-       __uint32_t              nrefs,
-       int                     *dirty)
-{
-       if (dinoc->di_nlink == nrefs)
-               return;
-
-       if (!no_modify) {
-               *dirty = 1;
-               do_warn(_("resetting inode %" PRIu64 " nlinks from %u to %u\n"),
-                       ino, dinoc->di_nlink, nrefs);
-
-               ASSERT(dinoc->di_version > 1);
-               dinoc->di_nlink = nrefs;
-       } else  {
-               do_warn(
-_("would have reset inode %" PRIu64 " nlinks from %u to %u\n"),
-                       ino, dinoc->di_nlink, nrefs);
-       }
-}
-
 static void
 update_inode_nlinks(
        xfs_mount_t             *mp,
@@ -88,10 +63,20 @@ update_inode_nlinks(
 
        dirty = 0;
 
-       /*
-        * compare and set links for all inodes
-        */
-       set_nlinks(&ip->i_d, ino, nlinks, &dirty);
+       /* compare and set links if they differ.  */
+       if (VFS_I(ip)->i_nlink != nlinks) {
+               if (!no_modify) {
+                       do_warn(
+       _("resetting inode %" PRIu64 " nlinks from %u to %u\n"),
+                               ino, VFS_I(ip)->i_nlink, nlinks);
+                       set_nlink(VFS_I(ip), nlinks);
+                       dirty = 1;
+               } else {
+                       do_warn(
+       _("would have reset inode %" PRIu64 " nlinks from %u to %u\n"),
+                               ino, VFS_I(ip)->i_nlink, nlinks);
+               }
+       }
 
        if (!dirty)  {
                libxfs_trans_cancel(tp);