]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: hoist xfs_{bump,drop}link to libxfs
authorDarrick J. Wong <djwong@kernel.org>
Wed, 2 Oct 2024 01:13:49 +0000 (18:13 -0700)
committerAndrey Albershteyn <aalbersh@redhat.com>
Fri, 4 Oct 2024 10:42:07 +0000 (12:42 +0200)
Source kernel commit: a9e583d34facc64b6edf3c9afb2ff4891038176d

Move xfs_bumplink and xfs_droplink to libxfs.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
include/xfs_inode.h
libxfs/inode.c
libxfs/libxfs_priv.h
libxfs/xfs_inode_util.c
libxfs/xfs_inode_util.h

index 19aaa78f314d0f508eb2ae3f7c0552abb8e5ac5b..170cc5288d3645ec5f3efbe91dd0873c1b7153ec 100644 (file)
@@ -407,8 +407,6 @@ extern void libxfs_trans_ichgtime(struct xfs_trans *,
                                struct xfs_inode *, int);
 extern int     libxfs_iflush_int (struct xfs_inode *, struct xfs_buf *);
 
-void libxfs_bumplink(struct xfs_trans *tp, struct xfs_inode *ip);
-
 int libxfs_icreate(struct xfs_trans *tp, xfs_ino_t ino,
                const struct xfs_icreate_args *args, struct xfs_inode **ipp);
 
index 20b9c483a5ea768d69f439e52758c5f8a3f19d6e..2062ecf54486cffcbd84818b0faeee53f26500b4 100644 (file)
 #include "xfs_da_btree.h"
 #include "xfs_dir2_priv.h"
 
-/*
- * Increment the link count on an inode & log the change.
- */
-void
-libxfs_bumplink(
-       struct xfs_trans        *tp,
-       struct xfs_inode        *ip)
-{
-       struct inode            *inode = VFS_I(ip);
-
-       xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
-
-       if (inode->i_nlink != XFS_NLINK_PINNED)
-               inc_nlink(inode);
-
-       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-}
-
 /*
  * Initialise a newly allocated inode and return the in-core inode to the
  * caller locked exclusively.
index a77524dfdc9364c3a6cbac0c3c3672315c54e1d4..b720cc5fac94ff4f2034b711cc1ff3560cb30512 100644 (file)
@@ -135,6 +135,7 @@ extern void cmn_err(int, char *, ...);
 enum ce { CE_DEBUG, CE_CONT, CE_NOTE, CE_WARN, CE_ALERT, CE_PANIC };
 
 #define xfs_info(mp,fmt,args...)       cmn_err(CE_CONT, _(fmt), ## args)
+#define xfs_info_ratelimited(mp,fmt,args...) cmn_err(CE_CONT, _(fmt), ## args)
 #define xfs_notice(mp,fmt,args...)     cmn_err(CE_NOTE, _(fmt), ## args)
 #define xfs_warn(mp,fmt,args...)       cmn_err((mp) ? CE_WARN : CE_WARN, _(fmt), ## args)
 #define xfs_err(mp,fmt,args...)                cmn_err(CE_ALERT, _(fmt), ## args)
index 2d7e970d72f26a5907e968f073a37420b16e0f20..62af002b2140dc59784e6faa32e6add256ef83fa 100644 (file)
@@ -624,3 +624,56 @@ xfs_iunlink_remove(
 
        return xfs_iunlink_remove_inode(tp, pag, agibp, ip);
 }
+
+/*
+ * Decrement the link count on an inode & log the change.  If this causes the
+ * link count to go to zero, move the inode to AGI unlinked list so that it can
+ * be freed when the last active reference goes away via xfs_inactive().
+ */
+int
+xfs_droplink(
+       struct xfs_trans        *tp,
+       struct xfs_inode        *ip)
+{
+       struct inode            *inode = VFS_I(ip);
+
+       xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
+
+       if (inode->i_nlink == 0) {
+               xfs_info_ratelimited(tp->t_mountp,
+ "Inode 0x%llx link count dropped below zero.  Pinning link count.",
+                               ip->i_ino);
+               set_nlink(inode, XFS_NLINK_PINNED);
+       }
+       if (inode->i_nlink != XFS_NLINK_PINNED)
+               drop_nlink(inode);
+
+       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+
+       if (inode->i_nlink)
+               return 0;
+
+       return xfs_iunlink(tp, ip);
+}
+
+/*
+ * Increment the link count on an inode & log the change.
+ */
+void
+xfs_bumplink(
+       struct xfs_trans        *tp,
+       struct xfs_inode        *ip)
+{
+       struct inode            *inode = VFS_I(ip);
+
+       xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
+
+       if (inode->i_nlink == XFS_NLINK_PINNED - 1)
+               xfs_info_ratelimited(tp->t_mountp,
+ "Inode 0x%llx link count exceeded maximum.  Pinning link count.",
+                               ip->i_ino);
+       if (inode->i_nlink != XFS_NLINK_PINNED)
+               inc_nlink(inode);
+
+       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+}
index 42a032afe3cacebe52acc7ce774f38e76ea915b2..50c14ba6ca5a2c7b7988a4ea00726f208f9f87df 100644 (file)
@@ -50,5 +50,7 @@ void xfs_inode_init(struct xfs_trans *tp, const struct xfs_icreate_args *args,
 int xfs_iunlink(struct xfs_trans *tp, struct xfs_inode *ip);
 int xfs_iunlink_remove(struct xfs_trans *tp, struct xfs_perag *pag,
                struct xfs_inode *ip);
+int xfs_droplink(struct xfs_trans *tp, struct xfs_inode *ip);
+void xfs_bumplink(struct xfs_trans *tp, struct xfs_inode *ip);
 
 #endif /* __XFS_INODE_UTIL_H__ */