diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 22b6404845a..4b1204a3f22 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -6918,7 +6918,7 @@ softdep_setup_remove(bp, dp, ip, isrmdir) * newdirrem() to setup the full directory remove which requires * isrmdir > 1. */ - dirrem = newdirrem(bp, dp, ip, isrmdir?2:0, &prevdirrem); + dirrem = newdirrem(bp, dp, ip, isrmdir, &prevdirrem); /* * Add the dirrem to the inodedep's pending remove list for quick * discovery later. @@ -7152,14 +7152,12 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) ip->i_effnlink + 2); dotremref = newjremref(dirrem, ip, ip, DOT_OFFSET, ip->i_effnlink + 1); - } else - jremref = newjremref(dirrem, dp, ip, dp->i_offset, - ip->i_effnlink + 1); - if (isrmdir > 1) { dotdotremref = newjremref(dirrem, ip, dp, DOTDOT_OFFSET, dp->i_effnlink + 1); dotdotremref->jr_state |= MKDIR_PARENT; - } + } else + jremref = newjremref(dirrem, dp, ip, dp->i_offset, + ip->i_effnlink + 1); } ACQUIRE_LOCK(&lk); lbn = lblkno(dp->i_fs, dp->i_offset); @@ -7184,7 +7182,7 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) * cancel it. Any pending journal work will be added to the dirrem * to be completed when the workitem remove completes. */ - if (isrmdir > 1) + if (isrmdir) dotdotremref = cancel_diradd_dotdot(ip, dirrem, dotdotremref); /* * Check for a diradd dependency for the same directory entry. diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index 794c2f39117..c396910123a 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1497,7 +1497,9 @@ relock: /* Don't go to bad here as the new link exists. */ if (error) goto unlockout; - } + } else if (DOINGSUJ(tdvp)) + /* Journal must account for each new link. */ + softdep_setup_dotdot_link(tdp, fip); fip->i_offset = mastertemplate.dot_reclen; ufs_dirrewrite(fip, fdp, newparent, DT_DIR, 0); cache_purge(fdvp);