From owner-svn-src-all@FreeBSD.ORG  Fri Mar 27 15:46:00 2015
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by hub.freebsd.org (Postfix) with ESMTPS id 7B42D4A6;
 Fri, 27 Mar 2015 15:46:00 +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 02DDA81B;
 Fri, 27 Mar 2015 15:45:59 +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 t2RFjrpQ087845
 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
 Fri, 27 Mar 2015 17:45:53 +0200 (EET)
 (envelope-from kostikbel@gmail.com)
DKIM-Filter: OpenDKIM Filter v2.9.2 kib.kiev.ua t2RFjrpQ087845
Received: (from kostik@localhost)
 by tom.home (8.14.9/8.14.9/Submit) id t2RFjr0Y087844;
 Fri, 27 Mar 2015 17:45:53 +0200 (EET)
 (envelope-from kostikbel@gmail.com)
X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com
 using -f
Date: Fri, 27 Mar 2015 17:45:53 +0200
From: Konstantin Belousov <kostikbel@gmail.com>
To: Ian Lepore <ian@freebsd.org>
Subject: Re: svn commit: r280760 - head/sys/ufs/ffs
Message-ID: <20150327154552.GN2379@kib.kiev.ua>
References: <201503271355.t2RDtuLt071068@svn.freebsd.org>
 <1427470995.91374.7.camel@freebsd.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1427470995.91374.7.camel@freebsd.org>
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: svn-src-head@freebsd.org, svn-src-all@freebsd.org,
 src-committers@freebsd.org
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.18-1
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 27 Mar 2015 15:46:00 -0000

On Fri, Mar 27, 2015 at 09:43:15AM -0600, Ian Lepore wrote:
> On Fri, 2015-03-27 at 13:55 +0000, Konstantin Belousov wrote:
> > Author: kib
> > Date: Fri Mar 27 13:55:56 2015
> > New Revision: 280760
> > URL: https://svnweb.freebsd.org/changeset/base/280760
> > 
> > Log:
> >   Fix the hand after the immediate reboot when the following command
> >   sequence is performed on UFS SU+J rootfs:
> >   cp -Rp /sbin/init /sbin/init.old
> >   mv -f /sbin/init.old /sbin/init
> >   
> >   Hang occurs on the rootfs unmount.  There are two issues:
> >   
> >   1. Removed init binary, which is still mapped, creates a reference to
> >   the removed vnode. The inodeblock for such vnode must have active
> >   inodedep, which is (eventually) linked through the unlinked list. This
> >   means that ffs_sync(MNT_SUSPEND) cannot succeed, because number of
> >   softdep workitems for the mp is always > 0.  FFS is suspended during
> >   unmount, so unmount just hangs.
> >   
> >   2. As noted above, the inodedep is linked eventually.  It is not
> >   linked until the superblock is written.  But at the vfs_unmountall()
> >   time, when the rootfs is unmounted, the call is made to
> >   ffs_unmount()->ffs_sync() before vflush(), and ffs_sync() only calls
> >   ffs_sbupdate() after all workitems are flushed.  It is masked for
> >   normal system operations, because syncer works in parallel and
> >   eventually flushes superblock.  Syncer is stopped when rootfs
> >   unmounted, so ffs_sync() must do sb update on its own.
> >   
> >   Correct the issues listed above. For MNT_SUSPEND, count the number of
> >   linked unlinked inodedeps (this is not a typo) and substract the count
> >   of such workitems from the total. For the second issue, the
> >   ffs_sbupdate() is called right after device sync in ffs_sync() loop.
> >   
> >   There is third problem, occuring with both SU and SU+J. The
> >   softdep_waitidle() loop, which waits for softdep_flush() thread to
> >   clear the worklist, only waits 20ms max. It seems that the 1 tick,
> >   specified for msleep(9), was a typo.
> >   
> >   Add fsync(devvp, MNT_WAIT) call to softdep_waitidle(), which seems to
> >   significantly help the softdep thread, and change the MNT_LAZY update
> >   at the reboot time to MNT_WAIT for similar reasons.  Note that
> >   userspace cannot create more work while devvp is flushed, since the
> >   mount point is always suspended before the call to softdep_waitidle()
> >   in unmount or remount path.
> >   
> >   PR:	195458
> >   In collaboration with:	gjb, pho
> >   Reviewed by:	mckusick
> >   Sponsored by:	The FreeBSD Foundation
> >   MFC after:	2 weeks
> > 
> > Modified:
> >   head/sys/ufs/ffs/ffs_softdep.c
> >   head/sys/ufs/ffs/ffs_vfsops.c
> 
> This is causing warning: function declaration isn't a prototype on
> platforms that still compile with old gcc.  Simple fix, but I thought
> you might want to do the commit so you can get an mfc reminder along
> with the main commit.
> 
> -- Ian
> 
> Index: sys/ufs/ffs/ffs_softdep.c
> ===================================================================
> --- sys/ufs/ffs/ffs_softdep.c	(revision 280761)
> +++ sys/ufs/ffs/ffs_softdep.c	(working copy)
> @@ -804,6 +804,7 @@ static	struct indirdep *indirdep_lookup(struct mou
>  	    struct buf *);
>  static	void cancel_indirdep(struct indirdep *, struct buf *,
>  	    struct freeblks *);
> +static	int check_inodedep_free(struct inodedep *);
>  static	void free_indirdep(struct indirdep *);
>  static	void free_diradd(struct diradd *, struct workhead *);
>  static	void merge_diradd(struct inodedep *, struct diradd *);
> 

Yes, thank you.  I was already notified and trying to compile ppc GENERIC64
kernel to confirm the same fix.

Did you compile-tested the change on arm with gcc ?  If so, I will just
commit it.