soft updates / background fsck directory link count bug

Don Lewis truckman at FreeBSD.org
Sun Sep 25 00:21:31 PDT 2005


On 25 Sep, Tor Egge wrote:
>> Relying on ufs_inactive() is probably the wrong thing to do because the
>> ufs_inactive() call can be deferred indefinitely if another process
>> holds a reference to the vnode.  This is sufficient to cause background
>> fsck to do the wrong thing even in the normal case.
> 
>> I think the cleanest fix would be for handle_workitem_remove() to
>> explicity call ffs_update().
> 
> Agreed.  The enclosed patch does that.

It works well for me in the testing that I have done.  It also has the
advantage of doing the dirrem rundown much more quickly than the
unmodified code in your directory tree removal example.

BTW, without this modification, your directory tree removal example will
trigger a timeout in the syncer thread shutdown code if the system is
immediately rebooted after the rm -r.

-------------- next part --------------
Index: sys/ufs/ffs/ffs_softdep.c
===================================================================
RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_softdep.c,v
retrieving revision 1.184
diff -u -r1.184 ffs_softdep.c
--- sys/ufs/ffs/ffs_softdep.c	5 Sep 2005 22:14:33 -0000	1.184
+++ sys/ufs/ffs/ffs_softdep.c	24 Sep 2005 22:09:50 -0000
@@ -3477,6 +3477,8 @@
 	}
 	WORKLIST_INSERT(&inodedep->id_inowait, &dirrem->dm_list);
 	FREE_LOCK(&lk);
+	ip->i_flag |= IN_CHANGE;
+	ffs_update(vp, 0);
 	vput(vp);
 }
 


More information about the freebsd-current mailing list