From: Cheng Lin <cheng.lin130@xxxxxxxxxx> An dir nlinks overflow which down form 0 to 0xffffffff, cause the directory to become unusable until the next xfs_repair run. Introduce protection for drop nlink to reduce the impact of this. And produce a warning for directory nlink error during remove. Signed-off-by: Cheng Lin <cheng.lin130@xxxxxxxxxx> --- fs/xfs/xfs_inode.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 9e62cc5..536dbe4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -919,6 +919,15 @@ STATIC int xfs_iunlink_remove(struct xfs_trans *tp, struct xfs_perag *pag, xfs_trans_t *tp, xfs_inode_t *ip) { + xfs_mount_t *mp; + + if (VFS_I(ip)->i_nlink == 0) { + mp = ip->i_mount; + xfs_warn(mp, "%s: Deleting inode %llu with no links.", + __func__, ip->i_ino); + return 0; + } + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); drop_nlink(VFS_I(ip)); @@ -2442,7 +2451,12 @@ STATIC int xfs_iunlink_remove(struct xfs_trans *tp, struct xfs_perag *pag, */ if (is_dir) { ASSERT(VFS_I(ip)->i_nlink >= 2); - if (VFS_I(ip)->i_nlink != 2) { + if (VFS_I(ip)->i_nlink < 2) { + xfs_warn(ip->i_mount, + "%s: Remove dir (inode %llu) with invalid links.", + __func__, ip->i_ino); + } + if (VFS_I(ip)->i_nlink > 2) { error = -ENOTEMPTY; goto out_trans_cancel; } -- 1.8.3.1