From owner-freebsd-fs@FreeBSD.ORG Thu Apr 2 21:02:50 2015 Return-Path: Delivered-To: freebsd-fs@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 694A02BA for ; Thu, 2 Apr 2015 21:02:50 +0000 (UTC) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0BA275E2 for ; Thu, 2 Apr 2015 21:02:49 +0000 (UTC) Received: from tom.home (kostik@localhost [127.0.0.1]) by kib.kiev.ua (8.14.9/8.14.9) with ESMTP id t32L2fHX035087 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 3 Apr 2015 00:02:41 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.9.2 kib.kiev.ua t32L2fHX035087 Received: (from kostik@localhost) by tom.home (8.14.9/8.14.9/Submit) id t32L2fZ6035086; Fri, 3 Apr 2015 00:02:41 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Fri, 3 Apr 2015 00:02:41 +0300 From: Konstantin Belousov To: Artem Kuchin Subject: Re: Little research how rm -rf and tar kill server Message-ID: <20150402210241.GD2379@kib.kiev.ua> 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> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <551C6D9F.8010506@artem.ru> User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on tom.home Cc: freebsd-fs@freebsd.org X-BeenThere: freebsd-fs@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Filesystems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Apr 2015 21:02:50 -0000 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); }