The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=6f4de208eddec8556da1beba6e732f8abbbd8d8e

commit 6f4de208eddec8556da1beba6e732f8abbbd8d8e
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-07-29 13:35:17 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-07-30 21:27:12 +0000

    ufs: change isrmdir type to bool or u_int as appropriate
    
    Use bool for isrmdir argument to
    ufs_dirremove()/softdep_setup_remove()/newdirrem(), where it is used as
    bool.
    
    Use u_int for isrmdir argument to
    ufs_dirrewrite()/softdep_setup_directory_change()
    where it is 0/1/ino.  Without the change to unsigned, the
            if (isrmdir > 1)
    test is broken on volumes with many inodes.
    Use newparent instead of isrmdir for the argument name in this case.
    
    Reviewed by:    markj, olce
    Tested by:      pho
    Fixes:  610319c766e941de96e52f2d28fea9f8cfc51aeb
    Fixes:  98eb6f0eaa50d8bd9a6794f0a9da2eddeae5bcd8
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D51617
---
 sys/ufs/ffs/ffs_softdep.c | 20 ++++++++++----------
 sys/ufs/ufs/ufs_extern.h  |  8 ++++----
 sys/ufs/ufs/ufs_lookup.c  |  7 ++++---
 sys/ufs/ufs/ufs_vnops.c   |  8 ++++----
 4 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 3f4aec02ba49..67cd6fb4b738 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -274,7 +274,7 @@ void
 softdep_setup_remove(struct buf *bp,
        struct inode *dp,
        struct inode *ip,
-       int isrmdir)
+       bool isrmdir)
 {
 
        panic("softdep_setup_remove called");
@@ -285,7 +285,7 @@ softdep_setup_directory_change(struct buf *bp,
        struct inode *dp,
        struct inode *ip,
        ino_t newinum,
-       int isrmdir)
+       u_int newparent)
 {
 
        panic("softdep_setup_directory_change called");
@@ -765,7 +765,7 @@ static      void initiate_write_inodeblock_ufs2(struct 
inodedep *, struct buf *);
 static void handle_workitem_freefile(struct freefile *);
 static int handle_workitem_remove(struct dirrem *, int);
 static struct dirrem *newdirrem(struct buf *, struct inode *,
-           struct inode *, int, struct dirrem **);
+           struct inode *, bool, struct dirrem **);
 static struct indirdep *indirdep_lookup(struct mount *, struct inode *,
            struct buf *);
 static void cancel_indirdep(struct indirdep *, struct buf *,
@@ -9169,7 +9169,7 @@ softdep_setup_remove(
        struct buf *bp,         /* buffer containing directory block */
        struct inode *dp,       /* inode for the directory being modified */
        struct inode *ip,       /* inode for directory entry being removed */
-       int isrmdir)            /* indicates if doing RMDIR */
+       bool isrmdir)           /* indicates if doing RMDIR */
 {
        struct dirrem *dirrem, *prevdirrem;
        struct inodedep *inodedep;
@@ -9361,7 +9361,7 @@ newdirrem(
        struct buf *bp,         /* buffer containing directory block */
        struct inode *dp,       /* inode for the directory being modified */
        struct inode *ip,       /* inode for directory entry being removed */
-       int isrmdir,            /* indicates if doing RMDIR */
+       bool isrmdir,           /* indicates if doing RMDIR */
        struct dirrem **prevdirremp) /* previously referenced inode, if any */
 {
        int offset;
@@ -9490,7 +9490,7 @@ newdirrem(
        dirrem->dm_state |= COMPLETE;
        cancel_diradd(dap, dirrem, jremref, dotremref, dotdotremref);
 #ifdef INVARIANTS
-       if (isrmdir == 0) {
+       if (!isrmdir) {
                struct worklist *wk;
 
                LIST_FOREACH(wk, &dirrem->dm_jwork, wk_list)
@@ -9525,7 +9525,7 @@ softdep_setup_directory_change(
        struct inode *dp,       /* inode for the directory being modified */
        struct inode *ip,       /* inode for directory entry being removed */
        ino_t newinum,          /* new inode number for changed entry */
-       int isrmdir)            /* indicates if doing RMDIR */
+       u_int newparent)        /* indicates if doing RMDIR */
 {
        int offset;
        struct diradd *dap = NULL;
@@ -9558,10 +9558,10 @@ softdep_setup_directory_change(
        /*
         * Allocate a new dirrem and ACQUIRE_LOCK.
         */
-       dirrem = newdirrem(bp, dp, ip, isrmdir, &prevdirrem);
+       dirrem = newdirrem(bp, dp, ip, newparent != 0, &prevdirrem);
        pagedep = dirrem->dm_pagedep;
        /*
-        * The possible values for isrmdir:
+        * The possible values for newparent:
         *      0 - non-directory file rename
         *      1 - directory rename within same directory
         *   inum - directory rename to new directory of given inode number
@@ -9572,7 +9572,7 @@ softdep_setup_directory_change(
         * the DIRCHG flag to tell handle_workitem_remove to skip the 
         * followup dirrem.
         */
-       if (isrmdir > 1)
+       if (newparent > 1)
                dirrem->dm_state |= DIRCHG;
 
        /*
diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h
index ccd9046a5fa8..111fb1cb40b3 100644
--- a/sys/ufs/ufs/ufs_extern.h
+++ b/sys/ufs/ufs/ufs_extern.h
@@ -66,8 +66,8 @@ void   ufs_makedirentry(struct inode *, struct componentname 
*,
            struct direct *);
 int     ufs_direnter(struct vnode *, struct vnode *, struct direct *,
            struct componentname *, struct buf *);
-int     ufs_dirremove(struct vnode *, struct inode *, int, int);
-int     ufs_dirrewrite(struct inode *, struct inode *, ino_t, int, int);
+int     ufs_dirremove(struct vnode *, struct inode *, int, bool);
+int     ufs_dirrewrite(struct inode *, struct inode *, ino_t, int, u_int);
 int     ufs_lookup_ino(struct vnode *, struct vnode **, struct componentname *,
            ino_t *);
 int     ufs_getlbns(struct vnode *, ufs2_daddr_t, struct indir *, int *);
@@ -93,9 +93,9 @@ int   softdep_setup_directory_add(struct buf *, struct inode 
*, off_t,
            ino_t, struct buf *, int);
 void   softdep_change_directoryentry_offset(struct buf *, struct inode *,
            caddr_t, caddr_t, caddr_t, int);
-void   softdep_setup_remove(struct buf *,struct inode *, struct inode *, int);
+void   softdep_setup_remove(struct buf *,struct inode *, struct inode *, bool);
 void   softdep_setup_directory_change(struct buf *, struct inode *,
-           struct inode *, ino_t, int);
+           struct inode *, ino_t, u_int);
 void   softdep_change_linkcnt(struct inode *);
 int    softdep_slowdown(struct vnode *);
 void   softdep_setup_create(struct inode *, struct inode *);
diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c
index 3f9c95e934fc..fd0539c40c0d 100644
--- a/sys/ufs/ufs/ufs_lookup.c
+++ b/sys/ufs/ufs/ufs_lookup.c
@@ -1101,7 +1101,7 @@ ufs_direnter(struct vnode *dvp, struct vnode *tvp, struct 
direct *dirp,
  * to the size of the previous entry.
  */
 int
-ufs_dirremove(struct vnode *dvp, struct inode *ip, int flags, int isrmdir)
+ufs_dirremove(struct vnode *dvp, struct inode *ip, int flags, bool isrmdir)
 {
        struct inode *dp;
        struct direct *ep, *rep;
@@ -1224,7 +1224,7 @@ out:
  */
 int
 ufs_dirrewrite(struct inode *dp, struct inode *oip, ino_t newinum, int newtype,
-    int isrmdir)
+    u_int newparent)
 {
        struct buf *bp;
        struct direct *ep;
@@ -1267,7 +1267,8 @@ ufs_dirrewrite(struct inode *dp, struct inode *oip, ino_t 
newinum, int newtype,
        if (!OFSFMT(vdp))
                ep->d_type = newtype;
        if (DOINGSOFTDEP(vdp)) {
-               softdep_setup_directory_change(bp, dp, oip, newinum, isrmdir);
+               softdep_setup_directory_change(bp, dp, oip, newinum,
+                   newparent);
                bdwrite(bp);
        } else {
                if (DOINGASYNC(vdp)) {
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index b7453db9013c..ee2188baf28d 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -1051,7 +1051,7 @@ ufs_remove(
 #ifdef UFS_GJOURNAL
        ufs_gjournal_orphan(vp);
 #endif
-       error = ufs_dirremove(dvp, ip, ap->a_cnp->cn_flags, 0);
+       error = ufs_dirremove(dvp, ip, ap->a_cnp->cn_flags, false);
        if (ip->i_nlink <= 0)
                vp->v_vflag |= VV_NOSYNC;
        if (IS_SNAPSHOT(ip)) {
@@ -1209,7 +1209,7 @@ ufs_whiteout(
 #endif
 
                cnp->cn_flags &= ~DOWHITEOUT;
-               error = ufs_dirremove(dvp, NULL, cnp->cn_flags, 0);
+               error = ufs_dirremove(dvp, NULL, cnp->cn_flags, false);
                break;
        default:
                panic("ufs_whiteout: unknown op");
@@ -1728,7 +1728,7 @@ relock:
                            "rename: missing .. entry");
                cache_purge(fdvp);
        }
-       error = ufs_dirremove(fdvp, fip, fcnp->cn_flags, 0);
+       error = ufs_dirremove(fdvp, fip, fcnp->cn_flags, false);
        /*
         * The kern_renameat() looks up the fvp using the DELETE flag, which
         * causes the removal of the name cache entry for fvp.
@@ -2309,7 +2309,7 @@ ufs_rmdir(
        ip->i_effnlink--;
        if (DOINGSOFTDEP(vp))
                softdep_setup_rmdir(dp, ip);
-       error = ufs_dirremove(dvp, ip, cnp->cn_flags, 1);
+       error = ufs_dirremove(dvp, ip, cnp->cn_flags, true);
        if (error) {
                dp->i_effnlink++;
                ip->i_effnlink++;

Reply via email to