Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Apr 2015 00:02:41 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Artem Kuchin <artem@artem.ru>
Cc:        freebsd-fs@freebsd.org
Subject:   Re: Little research how rm -rf and tar kill server
Message-ID:  <20150402210241.GD2379@kib.kiev.ua>
In-Reply-To: <551C6D9F.8010506@artem.ru>
References:  <1427727936.293597.247070269.5CE0D411@webmail.messagingengine.com> <55196FC7.8090107@artem.ru> <1427730597.303984.247097389.165D5AAB@webmail.messagingengine.com> <5519716F.6060007@artem.ru> <1427731061.306961.247099633.0A421E90@webmail.messagingengine.com> <5519740A.1070902@artem.ru> <1427731759.309823.247107417.308CD298@webmail.messagingengine.com> <5519F74C.1040308@artem.ru> <20150331164202.GN2379@kib.kiev.ua> <551C6D9F.8010506@artem.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Apr 02, 2015 at 01:13:51AM +0300, Artem Kuchin wrote:
> 31.03.2015 19:42, Konstantin Belousov пишет:
> > Syncer and sync(2) perform different kind of syncs. Take the snapshot of
> > sysctl debug.softdep before and after the situation occur to have some
> > hints what is going on.
> >
> >
> 
> Okay. Here is the sysctl  data

Try this.  It may be not enough, I will provide some update in this case.
No need to resend the sysctl data.  Just test whether explicit sync(2) is
needed in your situation after the patch.

diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index c29e5d5..8494223 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -160,7 +160,7 @@ void	softdep_journal_fsync(struct inode *);
 void	softdep_buf_append(struct buf *, struct workhead *);
 void	softdep_inode_append(struct inode *, struct ucred *, struct workhead *);
 void	softdep_freework(struct workhead *);
-
+int	softdep_need_sbupdate(struct ufsmount *ump);
 
 /*
  * Things to request flushing in softdep_request_cleanup()
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index ab2bd41..e6ed696 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -612,6 +612,13 @@ softdep_freework(wkhd)
 	panic("softdep_freework called");
 }
 
+int
+softdep_need_sbupdate(ump)
+     struct ufsmount *ump;
+{
+	
+	panic("softdep_need_sbupdate called");
+}
 #else
 
 FEATURE(softupdates, "FFS soft-updates support");
@@ -9479,6 +9486,18 @@ first_unlinked_inodedep(ump)
 	return (inodedep);
 }
 
+int
+softdep_need_sbupdate(ump)
+     struct ufsmount *ump;
+{
+	struct inodedep *inodedep;
+
+	ACQUIRE_LOCK(ump);
+	inodedep = first_unlinked_inodedep(ump);
+	FREE_LOCK(ump);
+	return (inodedep != NULL);
+}
+
 /*
  * Set the sujfree unlinked head pointer prior to writing a superblock.
  */
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 6e2e556..b2973a2 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1419,6 +1419,7 @@ static int
 ffs_sync_lazy(mp)
      struct mount *mp;
 {
+	struct ufsmount *ump;
 	struct vnode *mvp, *vp;
 	struct inode *ip;
 	struct thread *td;
@@ -1461,9 +1462,13 @@ qupdate:
 	qsync(mp);
 #endif
 
-	if (VFSTOUFS(mp)->um_fs->fs_fmod != 0 &&
-	    (error = ffs_sbupdate(VFSTOUFS(mp), MNT_LAZY, 0)) != 0)
-		allerror = error;
+	ump = VFSTOUFS(mp);
+	if (ump->um_fs->fs_fmod != 0 || (MOUNTEDSUJ(mp) &&
+	    softdep_need_sbupdate(ump))) {
+		error = ffs_sbupdate(ump, MNT_LAZY, 0);
+		if (error != 0)
+			allerror = error;
+	}
 	return (allerror);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150402210241.GD2379>