From owner-freebsd-current@freebsd.org Fri Aug 10 17:29:58 2018 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 57A341070B52 for ; Fri, 10 Aug 2018 17:29:58 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id AF0E673C63 for ; Fri, 10 Aug 2018 17:29:57 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id w7AHTgMN013701 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 10 Aug 2018 20:29:45 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua w7AHTgMN013701 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id w7AHTfaS013700; Fri, 10 Aug 2018 20:29:41 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Fri, 10 Aug 2018 20:29:41 +0300 From: Konstantin Belousov To: Rick Macklem Cc: "freebsd-current@FreeBSD.org" , "peter@holm.cc" Subject: Re: ffs_truncate3 panics Message-ID: <20180810172941.GA2113@kib.kiev.ua> References: <20180807131445.GC1884@kib.kiev.ua> <20180808221647.GH1884@kib.kiev.ua> <20180809111004.GK1884@kib.kiev.ua> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) 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.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Aug 2018 17:29:58 -0000 On Thu, Aug 09, 2018 at 08:38:50PM +0000, Rick Macklem wrote: > >BTW, does NFS server use extended attributes ? What for ? Can you, please, > >point out the code which does this ? > For the pNFS service, there are two system namespace extended attributes for > each file stored on the service. > pnfsd.dsfile - Stores where the data for the file is. Can be displayed by the > pnfsdsfile(8) command. > > pnfsd.dsattr - Cached attributes that change when a file is written (size, mtime, > change) so that the MDS doesn't have to do a Getattr on the data server for every client Getattr. > My reading of the nfsd code + ffs extattr handling reminds me that you already reported this issue some time ago. I suspected ufs_balloc() at that time. Now I think that the situation with the stray buffers hanging on the queue is legitimate, ffs_extread() might create such buffer and release it to a clean queue, then removal of the file would see inode with no allocated ext blocks but with the buffer. I think the easiest way to handle it is to always flush buffers and pages in the ext attr range, regardless of the number of allocated ext blocks. Patch below was not tested. diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c index 3cf58558c18..2ffd861f3b4 100644 --- a/sys/ufs/ffs/ffs_inode.c +++ b/sys/ufs/ffs/ffs_inode.c @@ -244,22 +244,19 @@ ffs_truncate(vp, length, flags, cred) extblocks = btodb(fragroundup(fs, ip->i_din2->di_extsize)); datablocks -= extblocks; } - if ((flags & IO_EXT) && extblocks > 0) { + if ((flags & IO_EXT) != 0) { if (length != 0) panic("ffs_truncate: partial trunc of extdata"); if (softdeptrunc || journaltrunc) { if ((flags & IO_NORMAL) == 0) goto extclean; needextclean = 1; - } else { - if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) - return (error); + } else if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) + return (error); + if (extblocks > 0) { #ifdef QUOTA (void) chkdq(ip, -extblocks, NOCRED, 0); #endif - vinvalbuf(vp, V_ALT, 0, 0); - vn_pages_remove(vp, - OFF_TO_IDX(lblktosize(fs, -extblocks)), 0); osize = ip->i_din2->di_extsize; ip->i_din2->di_blocks -= extblocks; ip->i_din2->di_extsize = 0; @@ -278,6 +275,8 @@ ffs_truncate(vp, length, flags, cred) vp->v_type, NULL, SINGLETON); } } + vinvalbuf(vp, V_ALT, 0, 0); + vn_pages_remove(vp, OFF_TO_IDX(lblktosize(fs, -UFS_NXADDR)), 0); } if ((flags & IO_NORMAL) == 0) return (0); @@ -631,7 +630,10 @@ ffs_truncate(vp, length, flags, cred) softdep_journal_freeblocks(ip, cred, length, IO_EXT); else softdep_setup_freeblocks(ip, length, IO_EXT); - return (ffs_update(vp, waitforupdate)); + error = ffs_update(vp, waitforupdate); + vinvalbuf(vp, V_ALT, 0, 0); + vn_pages_remove(vp, OFF_TO_IDX(lblktosize(fs, -UFS_NXADDR)), 0); + return (error); } /*