From debbugs@buxtehude.debian.org Mon May 2 04:39:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 648707CB9 for ; Mon, 2 May 2016 04:39:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 28D8A8F8035 for ; Mon, 2 May 2016 02:39:14 -0700 (PDT) X-ASG-Debug-ID: 1462181952-04bdf0358e416cc0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id FmbMAgEEB0xsOJUU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 02:39:12 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1axAJo-0004WK-5z; Mon, 02 May 2016 09:39:08 +0000 X-Loop: owner@bugs.debian.org Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 From: owner@bugs.debian.org (Debian Bug Tracking System) To: John Paul Adrian Glaubitz CC: xfs@oss.sgi.com Subject: Processed: merging 822369 822470 Message-ID: X-ASG-Orig-Subj: Processed: merging 822369 822470 References: <1462181728-904-bts-glaubitz@physik.fu-berlin.de> X-Debian-PR-Package: xfsprogs X-Debian-PR-Source: xfsprogs X-Debian-PR-Message: transcript X-Loop: owner@bugs.debian.org Date: Mon, 02 May 2016 09:39:08 +0000 X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1462181952 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 622 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Processing commands for control@bugs.debian.org: > merge 822369 822470 Bug #822369 [xfsprogs] xfsprogs: FTBFS: error: redefinition of 'struct fsxa= ttr' Bug #822470 [xfsprogs] qemu: FTBFS: error: redefinition of 'struct fsxattr' Bug #822470 [xfsprogs] qemu: FTBFS: error: redefinition of 'struct fsxattr' Merged 822369 822470 > thanks Stopping processing here. Please contact me if you need assistance. --=20 822369: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822369 822470: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822470 Debian Bug Tracking System Contact owner@bugs.debian.org with problems From BATV+f4f35b56bff34f76294b+4635+infradead.org+hch@bombadil.srs.infradead.org Mon May 2 09:56:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71FDA7CB8 for ; Mon, 2 May 2016 09:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3499D30404E for ; Mon, 2 May 2016 07:56:10 -0700 (PDT) X-ASG-Debug-ID: 1462200967-04cbb00fea3fb6e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WSMDazhS5yg3XVc4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 07:56:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4f35b56bff34f76294b+4635+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1axFGY-0001Fg-47; Mon, 02 May 2016 14:56:06 +0000 Date: Mon, 2 May 2016 07:56:06 -0700 From: Christoph Hellwig To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io Message-ID: <20160502145606.GD20589@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1462200968 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1817 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > index 79defba..97a1f5f 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -167,12 +167,21 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) > struct file *file = iocb->ki_filp; > struct inode *inode = bdev_file_inode(file); > > - if (IS_DAX(inode)) > + if (iocb_is_direct(iocb)) > + return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, > + offset, blkdev_get_block, NULL, > + NULL, DIO_SKIP_DIO_COUNT); > + else if (iocb_is_dax(iocb)) > return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, > NULL, DIO_SKIP_DIO_COUNT); > - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, > - blkdev_get_block, NULL, NULL, > - DIO_SKIP_DIO_COUNT); > + else { > + /* > + * If we're in the direct_IO path, either the IOCB_DIRECT or > + * IOCB_DAX flags must be set. > + */ > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > + return -ENXIO; > + } DAX should not even end up in ->direct_IO. > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -300,7 +300,7 @@ xfs_file_read_iter( > > XFS_STATS_INC(mp, xs_read_calls); > > - if (unlikely(iocb->ki_flags & IOCB_DIRECT)) > + if (unlikely(iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) > ioflags |= XFS_IO_ISDIRECT; please also add a XFS_IO_ISDAX flag to propagate the information properly and allow tracing to display the actual I/O type. > +static inline bool iocb_is_dax(struct kiocb *iocb) > { > + return IS_DAX(file_inode(iocb->ki_filp)) && > + (iocb->ki_flags & IOCB_DAX); > +} > + > +static inline bool iocb_is_direct(struct kiocb *iocb) > +{ > + return iocb->ki_flags & IOCB_DIRECT; > } No need for these helpers - especially as IOCB_DAX should never be set if IS_DAX is false. From BATV+f4f35b56bff34f76294b+4635+infradead.org+hch@bombadil.srs.infradead.org Mon May 2 09:57:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 503297CBA for ; Mon, 2 May 2016 09:57:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 118C68F8035 for ; Mon, 2 May 2016 07:57:55 -0700 (PDT) X-ASG-Debug-ID: 1462201073-04bdf03596420180001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5SjYtBsBqE2dIaLw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 07:57:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4f35b56bff34f76294b+4635+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1axFIA-0001RZ-Sp; Mon, 02 May 2016 14:57:46 +0000 Date: Mon, 2 May 2016 07:57:46 -0700 From: Christoph Hellwig To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Dave Chinner , "supporter:XFS FILESYSTEM" Subject: Re: [PATCH v5 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-ID: <20160502145746.GH20589@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v5 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES References: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> <1460928615-20894-6-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460928615-20894-6-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1462201073 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 321 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 18, 2016 at 05:29:54AM +0800, Ming Lei wrote: > BIO_MAX_PAGES is used as maximum count of bvecs, so > replace BIO_MAX_SECTORS with BIO_MAX_PAGES since > BIO_MAX_SECTORS is to be removed. > > Signed-off-by: Ming Lei Looks fine, Reviewed-by: Christoph Hellwig From jmoyer@redhat.com Mon May 2 10:18:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 876937CB8 for ; Mon, 2 May 2016 10:18:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5855D304066 for ; Mon, 2 May 2016 08:18:41 -0700 (PDT) X-ASG-Debug-ID: 1462202319-04cb6c09a3427470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xOxgwA8ZkXikWs8J (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 08:18:40 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2DD0862665; Mon, 2 May 2016 15:18:39 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u42FIaFn017180 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 2 May 2016 11:18:37 -0400 From: Jeff Moyer To: Dave Chinner , "Dan J. Williams" Cc: "Verma\, Vishal L" , "linux-kernel\@vger.kernel.org" , "linux-block\@vger.kernel.org" , "hch\@infradead.org" , "xfs\@oss.sgi.com" , "linux-nvdimm\@ml01.01.org" , "linux-mm\@kvack.org" , "viro\@zeniv.linux.org.uk" , "axboe\@fb.com" , "akpm\@linux-foundation.org" , "linux-fsdevel\@vger.kernel.org" , "linux-ext4\@vger.kernel.org" , "Wilcox\, Matthew R" , "jack\@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Mon, 02 May 2016 11:18:36 -0400 In-Reply-To: <20160426004155.GF18496@dastard> (Dave Chinner's message of "Tue, 26 Apr 2016 10:41:55 +1000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 02 May 2016 15:18:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1462202320 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5486 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Dave Chinner writes: > On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: >> On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > You're assuming that only the DAX aware application accesses it's > files. users, backup programs, data replicators, fileystem > re-organisers (e.g. defragmenters) etc all may access the files and > they may throw errors. What then? I'm not sure how this is any different from regular storage. If an application gets EIO, it's up to the app to decide what to do with that. >> > Where does the application find the data that was lost to be able to >> > rewrite it? >>=20 >> The data that was lost is gone -- this assumes the application has some >> ability to recover using a journal/log or other redundancy - yes, at the >> application layer. If it doesn't have this sort of capability, the only >> option is to restore files from a backup/mirror. > > So the architecture has a built in assumption that only userspace > can handle data loss? Remember that the proposed programming model completely bypasses the kernel, so yes, it is expected that user-space will have to deal with the problem. > What about filesytsems like NOVA, that use log structured design to > provide DAX w/ update atomicity and can potentially also provide > redundancy/repair through the same mechanisms? Won't pmem native > filesystems with built in data protection features like this remove > the need for adding all this to userspace applications? I don't think we'll /only/ support NOVA for pmem. So we'll have to deal with this for existing file systems, right? > If so, shouldn't that be the focus of development rahter than > placing the burden on userspace apps to handle storage repair > situations? It really depends on the programming model. In the model Vishal is talking about, either the applications themselves or the libraries they link to are expected to implement the redundancies where necessary. >> > There's an implicit assumption that applications will keep redundant >> > copies of their data at the /application layer/ and be able to >> > automatically repair it? That's one way to do things. It really depends on the application what it will do for recovery. >> > And then there's the implicit assumption that it will unlink and >> > free the entire file before writing a new copy I think Vishal was referring to restoring from backup. cp itself will truncate the file before overwriting, iirc. >> To summarize, the two cases we want to handle are: >> 1. Application has inbuilt recovery: >> =C2=A0 - hits badblock >> =C2=A0 - figures out it is able to recover the data >> =C2=A0 - handles SIGBUS or EIO >> =C2=A0 - does a (sector aligned) write() to restore the data > > The "figures out" step here is where >95% of the work we'd have to > do is. And that's in filesystem and block layer code, not > userspace, and userspace can't do that work in a signal handler. > And it can still fall down to the second case when the application > doesn't have another copy of the data somewhere. I read that "figures out" step as the application determining whether or not it had a redundant copy. > FWIW, we don't have a DAX enabled filesystem that can do > reverse block mapping, so we're a year or two away from this being a > workable production solution from the filesystem perspective. And > AFAICT, it's not even on the roadmap for dm/md layers. Do we even need that? What if we added an FIEMAP flag for determining bad blocks. The file system could simply walk the list of extents for the file and check the corresponding disk blocks. No reverse mapping required. Also note that DM/MD don't support direct_access(), either, so I don't think they're relevant for this discussion. >> 2. Application doesn't have any inbuilt recovery mechanism >> =C2=A0 - hits badblock >> =C2=A0 - gets SIGBUS (or EIO) and crashes >> =C2=A0 - Sysadmin restores file from backup > > Which is no different to an existing non-DAX application getting an > EIO/sigbus from current storage technologies. > > Except: in the existing storage stack, redundancy and correction has > already had to have failed for the application to see such an error. > Hence this is normally considered a DR case as there's had to be > cascading failures (e.g. multiple disk failures in a RAID) to get > to this stage, not a single error in a single sector in > non-redundant storage. > > We need some form of redundancy and correction in the PMEM stack to > prevent single sector errors from taking down services until an > administrator can correct the problem. I'm trying to understand > where this is supposed to fit into the picture - at this point I > really don't think userspace applications are going to be able to do > this reliably.... Not all storage is configured into a RAID volume, and in some instances, the application is better positioned to recover the data (gluster/ceph, for example). It really comes down to whether applications or libraries will want to implement redundancy themselves in order to get a bump in performance by not going through the kernel. And I think I know what your opinion is on that front. :-) Speaking of which, did you see the numbers Dan shared at LSF on how much overhead there is in calling into the kernel for syncing? Dan, can/did you publish that spreadsheet somewhere? Cheers, Jeff From boaz@plexistor.com Mon May 2 10:42:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E344A7CCA for ; Mon, 2 May 2016 10:42:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24B7DAC002 for ; Mon, 2 May 2016 08:42:01 -0700 (PDT) X-ASG-Debug-ID: 1462203714-04cbb00fe93fd070001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id r16GMyq9ibju01jo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 08:41:55 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id n129so112505831wmn.1 for ; Mon, 02 May 2016 08:41:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=8VNNimsaRy035FHQd6IXU+Puv0P0e3031INRhxaNelo=; b=ijwRA+ZsQPL0hV6qlQxZqKbNOt+mTub/OmbRhBRSONjTGYF05HuyiOOhJN68y7H6PS OeMa75HkjnWpk+Grsjl/IjcrwhKiv+R5Rf+hVDlYrLKGKzWcek1d3WajAh5btmMZVJcM zDp4wO8KG0MlToqPF4zbbYaVaHCl2XuHN3lxhe6RlhhMns3K5qB73h1Z+jkZN/JsvkoU dhRFmv44g4l7ehpDY+h7ckPDLGiGDDBpOed+ZhweHu1W2eOoo7WMGOCy2J8gWoukTh/T on3acNkFzCRIQ8Jk8QYUMk6adibqA4QnvoYbLIEf3fep62ficjFQP/OhWVdUBN7cEXiB 7DWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=8VNNimsaRy035FHQd6IXU+Puv0P0e3031INRhxaNelo=; b=lR5469a5yQPH2jZWc5XhWi4febcO/wHaXZzRbdFrJRktw0/2dYXrMCt9ghHowVM18A eRoyewkoOEZIMvGg9RcqkrClvQ9K0arEM5x6+6eEKGI0kpn+QVJgQXyUqgnsEfZmoHLT OfG4ohUlSdRV1Six1IY6ufbrqB1AQOcQ1f008g8EzfqwKyaoh8CCItip9P43RssNg81c vKGL01osuAXFwVG5UCZQxuGXHPF6uHFpexLZw8hhnSpBl4CracIo1hmKr2je0MlyNDSN o9iX7M7ZE4+mJTarlnHbDQa9QL/UCPhmR8p7PA5NttfJRqo+6mlPamqFJRKqLTEE6qcl +PgA== X-Gm-Message-State: AOPr4FXXKkKw0F5aavfG6N9FtjsCTeg5rAL3tgdOeSCyF2K+g5BzBIqFJC+AsJZP+s5m2w== X-Received: by 10.28.175.143 with SMTP id y137mr5691050wme.21.1462203714274; Mon, 02 May 2016 08:41:54 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id jr8sm31059886wjb.15.2016.05.02.08.41.52 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 08:41:53 -0700 (PDT) Message-ID: <5727753F.6090104@plexistor.com> Date: Mon, 02 May 2016 18:41:51 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Vishal Verma , linux-nvdimm@lists.01.org CC: Jens Axboe , Jan Kara , Andrew Morton , Matthew Wilcox , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Al Viro , Christoph Hellwig , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1462203715 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11712 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 04/29/2016 12:16 AM, Vishal Verma wrote: > All IO in a dax filesystem used to go through dax_do_io, which cannot > handle media errors, and thus cannot provide a recovery path that can > send a write through the driver to clear errors. > > Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO > path for DAX filesystems, use the same direct_IO path for both DAX and > direct_io iocbs, but use the flags to identify when we are in O_DIRECT > mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional > direct_IO path instead of DAX. > Really? What are your thinking here? What about all the current users of O_DIRECT, you have just made them 4 times slower and "less concurrent*" then "buffred io" users. Since direct_IO path will queue an IO request and all. (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) I hate it that you overload the semantics of a known and expected O_DIRECT flag, for special pmem quirks. This is an incompatible and unrelated overload of the semantics of O_DIRECT. > This allows us a recovery path in the form of opening the file with > O_DIRECT and writing to it with the usual O_DIRECT semantics (sector > alignment restrictions). > I understand that you want a sector aligned IO, right? for the clear of errors. But I hate it that you forced all O_DIRECT IO to be slow for this. Can you not make dax_do_io handle media errors? At least for the parts of the IO that are aligned. (And your recovery path application above can use only aligned IO to make sure) Please look for another solution. Even a special IOCTL_DAX_CLEAR_ERROR [*"less concurrent" because of the queuing done in bdev. Note how pmem is not even multi-queue, and even if it was it will be much slower then DAX because of the code depth and all the locks and task switches done in the block layer. In DAX the final memcpy is done directly on the user-mode thread] Thanks Boaz > Cc: Matthew Wilcox > Cc: Dan Williams > Cc: Ross Zwisler > Cc: Jeff Moyer > Cc: Christoph Hellwig > Cc: Dave Chinner > Cc: Jan Kara > Cc: Jens Axboe > Cc: Al Viro > Signed-off-by: Vishal Verma > --- > drivers/block/loop.c | 2 +- > fs/block_dev.c | 17 +++++++++++++---- > fs/ext2/inode.c | 16 ++++++++++++---- > fs/ext4/file.c | 2 +- > fs/ext4/inode.c | 19 +++++++++++++------ > fs/xfs/xfs_aops.c | 20 +++++++++++++------- > fs/xfs/xfs_file.c | 4 ++-- > include/linux/fs.h | 15 ++++++++++++--- > mm/filemap.c | 4 ++-- > 9 files changed, 69 insertions(+), 30 deletions(-) > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index 80cf8ad..c0a24c3 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -568,7 +568,7 @@ struct switch_request { > > static inline void loop_update_dio(struct loop_device *lo) > { > - __loop_update_dio(lo, io_is_direct(lo->lo_backing_file) | > + __loop_update_dio(lo, (lo->lo_backing_file->f_flags & O_DIRECT) | > lo->use_dio); > } > > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 79defba..97a1f5f 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -167,12 +167,21 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) > struct file *file = iocb->ki_filp; > struct inode *inode = bdev_file_inode(file); > > - if (IS_DAX(inode)) > + if (iocb_is_direct(iocb)) > + return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, > + offset, blkdev_get_block, NULL, > + NULL, DIO_SKIP_DIO_COUNT); > + else if (iocb_is_dax(iocb)) > return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, > NULL, DIO_SKIP_DIO_COUNT); > - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, > - blkdev_get_block, NULL, NULL, > - DIO_SKIP_DIO_COUNT); > + else { > + /* > + * If we're in the direct_IO path, either the IOCB_DIRECT or > + * IOCB_DAX flags must be set. > + */ > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > + return -ENXIO; > + } > } > > int __sync_blockdev(struct block_device *bdev, int wait) > diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c > index 35f2b0bf..45f2b51 100644 > --- a/fs/ext2/inode.c > +++ b/fs/ext2/inode.c > @@ -861,12 +861,20 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) > size_t count = iov_iter_count(iter); > ssize_t ret; > > - if (IS_DAX(inode)) > - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, > - DIO_LOCKING); > - else > + if (iocb_is_direct(iocb)) > ret = blockdev_direct_IO(iocb, inode, iter, offset, > ext2_get_block); > + else if (iocb_is_dax(iocb)) > + ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, > + DIO_LOCKING); > + else { > + /* > + * If we're in the direct_IO path, either the IOCB_DIRECT or > + * IOCB_DAX flags must be set. > + */ > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > + return -ENXIO; > + } > if (ret < 0 && iov_iter_rw(iter) == WRITE) > ext2_write_failed(mapping, offset + count); > return ret; > diff --git a/fs/ext4/file.c b/fs/ext4/file.c > index 2e9aa49..165a0b8 100644 > --- a/fs/ext4/file.c > +++ b/fs/ext4/file.c > @@ -94,7 +94,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > struct file *file = iocb->ki_filp; > struct inode *inode = file_inode(iocb->ki_filp); > struct blk_plug plug; > - int o_direct = iocb->ki_flags & IOCB_DIRECT; > + int o_direct = iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX); > int unaligned_aio = 0; > int overwrite = 0; > ssize_t ret; > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 6d5d5c1..0b6d77a 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -3410,15 +3410,22 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter, > #ifdef CONFIG_EXT4_FS_ENCRYPTION > BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); > #endif > - if (IS_DAX(inode)) { > - ret = dax_do_io(iocb, inode, iter, offset, get_block_func, > - ext4_end_io_dio, dio_flags); > - } else > + if (iocb_is_direct(iocb)) > ret = __blockdev_direct_IO(iocb, inode, > inode->i_sb->s_bdev, iter, offset, > get_block_func, > ext4_end_io_dio, NULL, dio_flags); > - > + else if (iocb_is_dax(iocb)) > + ret = dax_do_io(iocb, inode, iter, offset, get_block_func, > + ext4_end_io_dio, dio_flags); > + else { > + /* > + * If we're in the direct_IO path, either the IOCB_DIRECT or > + * IOCB_DAX flags must be set. > + */ > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > + return -ENXIO; > + } > if (ret > 0 && !overwrite && ext4_test_inode_state(inode, > EXT4_STATE_DIO_UNWRITTEN)) { > int err; > @@ -3503,7 +3510,7 @@ static ssize_t ext4_direct_IO_read(struct kiocb *iocb, struct iov_iter *iter, > else > unlocked = 1; > } > - if (IS_DAX(inode)) { > + if (iocb_is_dax(iocb)) { > ret = dax_do_io(iocb, inode, iter, offset, ext4_dio_get_block, > NULL, unlocked ? 0 : DIO_LOCKING); > } else { > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index e49b240..8134e99 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1412,21 +1412,27 @@ xfs_vm_direct_IO( > struct inode *inode = iocb->ki_filp->f_mapping->host; > dio_iodone_t *endio = NULL; > int flags = 0; > - struct block_device *bdev; > + struct block_device *bdev = xfs_find_bdev_for_inode(inode); > > if (iov_iter_rw(iter) == WRITE) { > endio = xfs_end_io_direct_write; > flags = DIO_ASYNC_EXTEND; > } > > - if (IS_DAX(inode)) { > + if (iocb_is_direct(iocb)) > + return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, > + xfs_get_blocks_direct, endio, NULL, flags); > + else if (iocb_is_dax(iocb)) > return dax_do_io(iocb, inode, iter, offset, > - xfs_get_blocks_direct, endio, 0); > + xfs_get_blocks_direct, endio, 0); > + else { > + /* > + * If we're in the direct_IO path, either the IOCB_DIRECT or > + * IOCB_DAX flags must be set. > + */ > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > + return -ENXIO; > } > - > - bdev = xfs_find_bdev_for_inode(inode); > - return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, > - xfs_get_blocks_direct, endio, NULL, flags); > } > > /* > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index c2946f4..3d5d3c2 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -300,7 +300,7 @@ xfs_file_read_iter( > > XFS_STATS_INC(mp, xs_read_calls); > > - if (unlikely(iocb->ki_flags & IOCB_DIRECT)) > + if (unlikely(iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) > ioflags |= XFS_IO_ISDIRECT; > if (file->f_mode & FMODE_NOCMTIME) > ioflags |= XFS_IO_INVIS; > @@ -898,7 +898,7 @@ xfs_file_write_iter( > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > return -EIO; > > - if ((iocb->ki_flags & IOCB_DIRECT) || IS_DAX(inode)) > + if ((iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) > ret = xfs_file_dio_aio_write(iocb, from); > else > ret = xfs_file_buffered_aio_write(iocb, from); > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 9f28130..adca1d8 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -322,6 +322,7 @@ struct writeback_control; > #define IOCB_APPEND (1 << 1) > #define IOCB_DIRECT (1 << 2) > #define IOCB_HIPRI (1 << 3) > +#define IOCB_DAX (1 << 4) > > struct kiocb { > struct file *ki_filp; > @@ -2930,9 +2931,15 @@ extern int generic_show_options(struct seq_file *m, struct dentry *root); > extern void save_mount_options(struct super_block *sb, char *options); > extern void replace_mount_options(struct super_block *sb, char *options); > > -static inline bool io_is_direct(struct file *filp) > +static inline bool iocb_is_dax(struct kiocb *iocb) > { > - return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host); > + return IS_DAX(file_inode(iocb->ki_filp)) && > + (iocb->ki_flags & IOCB_DAX); > +} > + > +static inline bool iocb_is_direct(struct kiocb *iocb) > +{ > + return iocb->ki_flags & IOCB_DIRECT; > } > > static inline int iocb_flags(struct file *file) > @@ -2940,8 +2947,10 @@ static inline int iocb_flags(struct file *file) > int res = 0; > if (file->f_flags & O_APPEND) > res |= IOCB_APPEND; > - if (io_is_direct(file)) > + if (file->f_flags & O_DIRECT) > res |= IOCB_DIRECT; > + if (IS_DAX(file_inode(file))) > + res |= IOCB_DAX; > return res; > } > > diff --git a/mm/filemap.c b/mm/filemap.c > index 3effd5c..b959acf 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -1849,7 +1849,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) > if (!count) > goto out; /* skip atime */ > > - if (iocb->ki_flags & IOCB_DIRECT) { > + if (iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX)) { > struct address_space *mapping = file->f_mapping; > struct inode *inode = mapping->host; > loff_t size; > @@ -2719,7 +2719,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > if (err) > goto out; > > - if (iocb->ki_flags & IOCB_DIRECT) { > + if (iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX)) { > loff_t pos, endbyte; > > written = generic_file_direct_write(iocb, from, iocb->ki_pos); > From vishal@kernel.org Mon May 2 10:45:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 69D817CCD for ; Mon, 2 May 2016 10:45:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B1DA304062 for ; Mon, 2 May 2016 08:45:42 -0700 (PDT) X-ASG-Debug-ID: 1462203939-04cbb00fea3fd190001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id N1F6epShqG92CaYv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 08:45:40 -0700 (PDT) X-Barracuda-Envelope-From: vishal@kernel.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.145.29.136] X-Barracuda-Apparent-Source-IP: 198.145.29.136 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 52A41201FE; Mon, 2 May 2016 15:45:38 +0000 (UTC) Received: from gamestarV3L (184-99-237-189.hlrn.qwest.net [184.99.237.189]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3639B201C7; Mon, 2 May 2016 15:45:36 +0000 (UTC) Message-ID: <1462203935.11211.15.camel@kernel.org> Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Vishal Verma X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Christoph Hellwig , Vishal Verma Cc: linux-nvdimm@ml01.01.org, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Jeff Moyer Date: Mon, 02 May 2016 09:45:35 -0600 In-Reply-To: <20160502145606.GD20589@infradead.org> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <20160502145606.GD20589@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1462203939 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2501 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, 2016-05-02 at 07:56 -0700, Christoph Hellwig wrote: > > > > index 79defba..97a1f5f 100644 > > --- a/fs/block_dev.c > > +++ b/fs/block_dev.c > > @@ -167,12 +167,21 @@ blkdev_direct_IO(struct kiocb *iocb, struct > > iov_iter *iter, loff_t offset) > >   struct file *file = iocb->ki_filp; > >   struct inode *inode = bdev_file_inode(file); > >   > > - if (IS_DAX(inode)) > > + if (iocb_is_direct(iocb)) > > + return __blockdev_direct_IO(iocb, inode, > > I_BDEV(inode), iter, > > +     offset, > > blkdev_get_block, NULL, > > +     NULL, > > DIO_SKIP_DIO_COUNT); > > + else if (iocb_is_dax(iocb)) > >   return dax_do_io(iocb, inode, iter, offset, > > blkdev_get_block, > >   NULL, DIO_SKIP_DIO_COUNT); > > - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), > > iter, offset, > > -     blkdev_get_block, NULL, NULL, > > -     DIO_SKIP_DIO_COUNT); > > + else { > > + /* > > +  * If we're in the direct_IO path, either the > > IOCB_DIRECT or > > +  * IOCB_DAX flags must be set. > > +  */ > > + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); > > + return -ENXIO; > > + } > DAX should not even end up in ->direct_IO. Do you mean to say remove the last 'else' clause entirely? I agree that it should never be hit, which is why it is a WARN.. But I'm happy to remove it. > > > > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -300,7 +300,7 @@ xfs_file_read_iter( > >   > >   XFS_STATS_INC(mp, xs_read_calls); > >   > > - if (unlikely(iocb->ki_flags & IOCB_DIRECT)) > > + if (unlikely(iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) > >   ioflags |= XFS_IO_ISDIRECT; > please also add a XFS_IO_ISDAX flag to propagate the information > properly and allow tracing to display the actual I/O type. Will do. > > > > > +static inline bool iocb_is_dax(struct kiocb *iocb) > >  { > > + return IS_DAX(file_inode(iocb->ki_filp)) && > > + (iocb->ki_flags & IOCB_DAX); > > +} > > + > > +static inline bool iocb_is_direct(struct kiocb *iocb) > > +{ > > + return iocb->ki_flags & IOCB_DIRECT; > >  } > No need for these helpers - especially as IOCB_DAX should never be > set > if IS_DAX is false. Ok. So check the flags directly where needed? > -- > To unsubscribe from this list: send the line "unsubscribe linux- > block" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at  http://vger.kernel.org/majordomo-info.html From vishal@kernel.org Mon May 2 10:51:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 15E197CBE for ; Mon, 2 May 2016 10:51:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB6B230405F for ; Mon, 2 May 2016 08:51:36 -0700 (PDT) X-ASG-Debug-ID: 1462204294-04cb6c09a1428000001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id Ta4DCXiqugQyS6MP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 08:51:34 -0700 (PDT) X-Barracuda-Envelope-From: vishal@kernel.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.145.29.136] X-Barracuda-Apparent-Source-IP: 198.145.29.136 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BA1A020211; Mon, 2 May 2016 15:51:33 +0000 (UTC) Received: from gamestarV3L (184-99-237-189.hlrn.qwest.net [184.99.237.189]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DC7A6201C7; Mon, 2 May 2016 15:51:31 +0000 (UTC) Message-ID: <1462204291.11211.20.camel@kernel.org> Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Vishal Verma X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Boaz Harrosh , Vishal Verma , linux-nvdimm@lists.01.org Cc: linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Jens Axboe , linux-mm@kvack.org, Al Viro , Christoph Hellwig , linux-fsdevel@vger.kernel.org, Andrew Morton , linux-ext4@vger.kernel.org Date: Mon, 02 May 2016 09:51:31 -0600 In-Reply-To: <5727753F.6090104@plexistor.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1462204294 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2597 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29231 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, 2016-05-02 at 18:41 +0300, Boaz Harrosh wrote: > On 04/29/2016 12:16 AM, Vishal Verma wrote: > > > > All IO in a dax filesystem used to go through dax_do_io, which > > cannot > > handle media errors, and thus cannot provide a recovery path that > > can > > send a write through the driver to clear errors. > > > > Add a new iocb flag for DAX, and set it only for DAX mounts. In the > > IO > > path for DAX filesystems, use the same direct_IO path for both DAX > > and > > direct_io iocbs, but use the flags to identify when we are in > > O_DIRECT > > mode vs non O_DIRECT with DAX, and for O_DIRECT, use the > > conventional > > direct_IO path instead of DAX. > > > Really? What are your thinking here? > > What about all the current users of O_DIRECT, you have just made them > 4 times slower and "less concurrent*" then "buffred io" users. Since > direct_IO path will queue an IO request and all. > (And if it is not so slow then why do we need dax_do_io at all? > [Rhetorical]) > > I hate it that you overload the semantics of a known and expected > O_DIRECT flag, for special pmem quirks. This is an incompatible > and unrelated overload of the semantics of O_DIRECT. We overloaded O_DIRECT a long time ago when we made DAX piggyback on the same path: static inline bool io_is_direct(struct file *filp) { return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host); } Yes O_DIRECT on a DAX mounted file system will now be slower, but - > > > > > This allows us a recovery path in the form of opening the file with > > O_DIRECT and writing to it with the usual O_DIRECT semantics > > (sector > > alignment restrictions). > > > I understand that you want a sector aligned IO, right? for the > clear of errors. But I hate it that you forced all O_DIRECT IO > to be slow for this. > Can you not make dax_do_io handle media errors? At least for the > parts of the IO that are aligned. > (And your recovery path application above can use only aligned >  IO to make sure) > > Please look for another solution. Even a special > IOCTL_DAX_CLEAR_ERROR  - see all the versions of this series prior to this one, where we try to do a fallback... > > [*"less concurrent" because of the queuing done in bdev. Note how >   pmem is not even multi-queue, and even if it was it will be much >   slower then DAX because of the code depth and all the locks and > task >   switches done in the block layer. In DAX the final memcpy is done > directly >   on the user-mode thread] > > Thanks > Boaz > From dan.j.williams@intel.com Mon May 2 11:02:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E516E7CCA for ; Mon, 2 May 2016 11:02:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9A1B8F8033 for ; Mon, 2 May 2016 09:02:01 -0700 (PDT) X-ASG-Debug-ID: 1462204919-04cbb00fe83fd7c0001-NocioJ Received: from mail-oi0-f53.google.com (mail-oi0-f53.google.com [209.85.218.53]) by cuda.sgi.com with ESMTP id zAeIawoDW7sH1WYp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 09:01:59 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f53.google.com[209.85.218.53] X-Barracuda-Apparent-Source-IP: 209.85.218.53 Received: by mail-oi0-f53.google.com with SMTP id x201so195550551oif.3 for ; Mon, 02 May 2016 09:01:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=vmjrsRVZiNAkn1mi+TDVmIaEY8mKbxs/WipyS3RMg2I=; b=EiEfby8rPQXQxhdoqdi5zH58Uql487vzRE9+ZQVRhUMQwEtOwqEUNmFlcJc06FeWHQ Er+2u/5kaJt6ja+FXJizs1Cq0knUOIVBLKJXl+HqBxV+Oc9ZE3Z/JI2SskyOLpCq0bY1 tKyQhOIGBUa1gDgCcWqwCQbb47qDVGMdTkjXnM1soHy+5eXz5g/kuHBHgWaFcYe8A/uj ubWR49o73KI70ym4sm0rGUBphuN2I2TaLKURxfzM5EtMmavLBBb5aIMHciu7q1hlz5K/ 6hjVA4TqoVtA/AEDvxXLyDR/mqq61bewI3tCRVQeLIoZmAc4hRO3wKok2df+wuBuw8mQ +SCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=vmjrsRVZiNAkn1mi+TDVmIaEY8mKbxs/WipyS3RMg2I=; b=F2/L7p2ChZCejVgE3VLxVL/UC98l1pr1QyzCVW8H7zkDeCvsVVoaqXfB52OHuw+9rB md+CCDgqFULinBX2m+cGPH4Q64EN7SzqmKfTMRWI94OO/EqbkV5bzEI5ylQ1a50vr8k+ 1NF9X+NLAct/62TLfFX1Q5OpqGkWLrMQCrPAcybG+6Jmzb8XnivivultUAMjmpXBs1bR cR/ZRR+Hvenm7iFTK20wqoaNqZ4FRLNSBY+KV5t0Tvk5k3jJsMDTekb1gXa+9Gd/inCi /ZGRI7wVji0KipfOYVo7/GJTI95zMw0vbFhcewmEgDFaSejgCKhtO4tz2H2V3N/RsoZT /GKQ== X-Gm-Message-State: AOPr4FXZgFEDMu344TPvxz0LIxfVa4wQuiWBMXPSb7cdMBDh26u7sns+MxJTpk1yJ/c2BTfyKjq0KC3mMYzGezWh MIME-Version: 1.0 X-Received: by 10.157.0.68 with SMTP id 62mr4737751ota.189.1462204918618; Mon, 02 May 2016 09:01:58 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 09:01:58 -0700 (PDT) In-Reply-To: <5727753F.6090104@plexistor.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> Date: Mon, 2 May 2016 09:01:58 -0700 Message-ID: Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Boaz Harrosh Cc: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f53.google.com[209.85.218.53] X-Barracuda-Start-Time: 1462204919 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1715 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29231 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 8:41 AM, Boaz Harrosh wrote: > On 04/29/2016 12:16 AM, Vishal Verma wrote: >> All IO in a dax filesystem used to go through dax_do_io, which cannot >> handle media errors, and thus cannot provide a recovery path that can >> send a write through the driver to clear errors. >> >> Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO >> path for DAX filesystems, use the same direct_IO path for both DAX and >> direct_io iocbs, but use the flags to identify when we are in O_DIRECT >> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional >> direct_IO path instead of DAX. >> > > Really? What are your thinking here? > > What about all the current users of O_DIRECT, you have just made them > 4 times slower and "less concurrent*" then "buffred io" users. Since > direct_IO path will queue an IO request and all. > (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) > > I hate it that you overload the semantics of a known and expected > O_DIRECT flag, for special pmem quirks. This is an incompatible > and unrelated overload of the semantics of O_DIRECT. I think it is the opposite situation, it us undoing the premature overloading of O_DIRECT that went in without performance numbers. This implementation clarifies that dax_do_io() handles the lack of a page cache for buffered I/O and O_DIRECT behaves as it nominally would by sending an I/O to the driver. It has the benefit of matching the error semantics of a typical block device where a buffered write could hit an error filling the page cache, but an O_DIRECT write potentially triggers the drive to remap the block. From boaz@plexistor.com Mon May 2 11:03:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A15A27CCD for ; Mon, 2 May 2016 11:03:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 765DC8F8035 for ; Mon, 2 May 2016 09:03:48 -0700 (PDT) X-ASG-Debug-ID: 1462205021-04cb6c09a2428700001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id yMl8t7X5SgX1Tjcr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 09:03:42 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id n129so113303172wmn.1 for ; Mon, 02 May 2016 09:03:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=Szu8/Kb/QEst2w0+tqgVumCmmDqln+HCsdjBT5H6ptU=; b=v7tN46Z30anE8tSH932RekhkOR/E7WxjQEJprQqJNKOTKVJS1j2AE7bo57/YenD5c/ U/fLNYcKxLoK6gE0J7j18dUgZLgoIgLlnUXBLb6uzOYVSoz9n9GLXCxN3nrOQFFuEDR/ yaCrbFAcPxaSbSYBCG+xqS5cgG7NZ+4L890Rt2uLxXWZTZaiI7iabA29/6rDtJG5AO8p mzJrSSNs0DlJsStTK1aEGkV9rvZ4KNzq3w1rDNtCmBE7IGLChTRvHBuwUXHz48o0tQ4R 854renJ/nMUppTywxIUnjcAm2qY56dCHPbboGveIBUw0//HyrcVhVD+Cok4jGj0r0y4u 05Kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=Szu8/Kb/QEst2w0+tqgVumCmmDqln+HCsdjBT5H6ptU=; b=D7xHEyVsaJwf6CdCDUARczG7VUdf8rRTdwNJcAotY8I0PDbw1ZfJfIaEVWtdfnF4bp L4utwSPY/d7mEdR7iZFKqOqi1b3hoGWfuuGKPQxr0eG6EPqszvEZP1MkzkPiru6H9djh eIKcKGRdscuGumOl4FYYhwayIsJj+iFKR5O+IIveendXoJ0TUC7mDhgL4JPOPSpbBHdb 8NrAjvcM26VXNxEv5RFSUq7Yyy543iRtM9ishNX6VaR/Hf21tXJaaFparjJRCB058OFp INiINgfp0T11WS4bACwplrjud/7Fm1xEcnwJqlJLdreg98sLABmb0jyAzpABZ14d1tVF P1KA== X-Gm-Message-State: AOPr4FVaL2gSUde587yaYkIE30deJq8L2tbNLhGBTHT7wzr0OanmsSkcjC6UJtMO8p3hMw== X-Received: by 10.194.33.231 with SMTP id u7mr8080627wji.25.1462205021040; Mon, 02 May 2016 09:03:41 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id o128sm19429998wmb.19.2016.05.02.09.03.38 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 09:03:40 -0700 (PDT) Message-ID: <57277A59.3000306@plexistor.com> Date: Mon, 02 May 2016 19:03:37 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Vishal Verma , Vishal Verma , linux-nvdimm@lists.01.org CC: linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Jens Axboe , linux-mm@kvack.org, Al Viro , Christoph Hellwig , linux-fsdevel@vger.kernel.org, Andrew Morton , linux-ext4@vger.kernel.org Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <1462204291.11211.20.camel@kernel.org> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: <1462204291.11211.20.camel@kernel.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1462205022 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3553 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29231 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/02/2016 06:51 PM, Vishal Verma wrote: > On Mon, 2016-05-02 at 18:41 +0300, Boaz Harrosh wrote: >> On 04/29/2016 12:16 AM, Vishal Verma wrote: >>> >>> All IO in a dax filesystem used to go through dax_do_io, which >>> cannot >>> handle media errors, and thus cannot provide a recovery path that >>> can >>> send a write through the driver to clear errors. >>> >>> Add a new iocb flag for DAX, and set it only for DAX mounts. In the >>> IO >>> path for DAX filesystems, use the same direct_IO path for both DAX >>> and >>> direct_io iocbs, but use the flags to identify when we are in >>> O_DIRECT >>> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the >>> conventional >>> direct_IO path instead of DAX. >>> >> Really? What are your thinking here? >> >> What about all the current users of O_DIRECT, you have just made them >> 4 times slower and "less concurrent*" then "buffred io" users. Since >> direct_IO path will queue an IO request and all. >> (And if it is not so slow then why do we need dax_do_io at all? >> [Rhetorical]) >> >> I hate it that you overload the semantics of a known and expected >> O_DIRECT flag, for special pmem quirks. This is an incompatible >> and unrelated overload of the semantics of O_DIRECT. > > We overloaded O_DIRECT a long time ago when we made DAX piggyback on > the same path: > > static inline bool io_is_direct(struct file *filp) > { > return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host); > } > No as far as the user is concerned we have not. The O_DIRECT user is still getting all the semantics he wants, .i.e no syncs no memory cache usage, no copies ... Only with DAX the buffered IO is the same since with pmem it is faster. Then why not? The basic contract with the user did not break. The above was just an implementation detail to easily navigate through the Linux vfs IO stack and make the least amount of changes in every FS that wanted to support DAX.(And since dax_do_io is much more like direct_IO then like page-cache IO) > Yes O_DIRECT on a DAX mounted file system will now be slower, but - > >> >>> >>> This allows us a recovery path in the form of opening the file with >>> O_DIRECT and writing to it with the usual O_DIRECT semantics >>> (sector >>> alignment restrictions). >>> >> I understand that you want a sector aligned IO, right? for the >> clear of errors. But I hate it that you forced all O_DIRECT IO >> to be slow for this. >> Can you not make dax_do_io handle media errors? At least for the >> parts of the IO that are aligned. >> (And your recovery path application above can use only aligned >> IO to make sure) >> >> Please look for another solution. Even a special >> IOCTL_DAX_CLEAR_ERROR > > - see all the versions of this series prior to this one, where we try > to do a fallback... > And? So now all O_DIRECT APPs go 4 times slower. I will have a look but if it is really so bad than please consider an IOCTL or syscall. Or a special O_DAX_ERRORS flag ... Please do not trash all the O_DIRECT users, they are the more important clients, like DBs and VMs. Thanks Boaz >> >> [*"less concurrent" because of the queuing done in bdev. Note how >> pmem is not even multi-queue, and even if it was it will be much >> slower then DAX because of the code depth and all the locks and >> task >> switches done in the block layer. In DAX the final memcpy is done >> directly >> on the user-mode thread] >> >> Thanks >> Boaz >> > From boaz@plexistor.com Mon May 2 11:23:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 04A8D7CD1 for ; Mon, 2 May 2016 11:23:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE7418F8035 for ; Mon, 2 May 2016 09:23:00 -0700 (PDT) X-ASG-Debug-ID: 1462206173-04bdf03590428360001-NocioJ Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id j7zvpBTq5Yz8R9Qh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 09:22:54 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wm0-f51.google.com with SMTP id e201so113572899wme.0 for ; Mon, 02 May 2016 09:22:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=saM1zNtizWMHniFOC8rmvgAoF+7yHDzitJSluw6kXpk=; b=SFE1exkrtQfAGQjQ8AUIll4Od2+FwHDIPZlpEVoLoYNKMcZiNA+lSLWj6ZTerKXZW1 GqLzjqY6a7W/Dprl6tQYTU0epZdjHeXEDWWGOBy478iL3R+ikDErCzRxQe6bAVHiiHnv aV11qE43nCMSh5CF7VcMtzOpjfz1+cG6cdKbyve523qqVq+3R7tl27lENUawPgE4lFc0 NfuEJ+q+RAg0rd9+HkvsHeDemtClw2fPwkgd+U94T6vsr50Xf+I34AxrQ7JT8b+mEB1b TlwfBtcJrGdogbLiTJiihAWbzT5u5L00rLmPhLlhz+SaRQ+kQVEgi+myUm1FtGw/p9GO OfTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=saM1zNtizWMHniFOC8rmvgAoF+7yHDzitJSluw6kXpk=; b=ZKn/5mkRnp5eYmS52AhdWQwrVv3B55fG4RxO0umupijImtoXM1RhmABy72MYicekQ9 3lh2xnuYedORF7xEbnYij3/J0ec3Cy+Heqr6rAmmok0/Zy3EsLeJgnCQ6s40jhF6v1L8 36vZ+W9KBDvNBr8JZgUIFUp6K8ZAcn2SB6JjxQ6yVTiNwvsFrXksW+FBrxo+aR5dCygt 1xjbzQMeEY0XM7OVBzeR8pvZxZY85vBwrqjh2JcEejSx1V+Nkt/TL1W6QL0PbKgHG1NP UUJcpPvojrJu5WSKsk6b7RLDI/+PN1UOUAurSzFIxi+2EqqBpK9WDI9SakL0r1WauWFR 9Trg== X-Gm-Message-State: AOPr4FXM/EvUvT58db3D2a0xPPQJt6z07EeCEMBnhkI/lcOeRo6TTL443hs5lSYh4Y61fw== X-Received: by 10.194.10.162 with SMTP id j2mr36814328wjb.72.1462206172788; Mon, 02 May 2016 09:22:52 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id y70sm19668446wmd.3.2016.05.02.09.22.50 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 09:22:52 -0700 (PDT) Message-ID: <57277EDA.9000803@plexistor.com> Date: Mon, 02 May 2016 19:22:50 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dan Williams CC: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1462206174 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2573 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29232 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/02/2016 07:01 PM, Dan Williams wrote: > On Mon, May 2, 2016 at 8:41 AM, Boaz Harrosh wrote: >> On 04/29/2016 12:16 AM, Vishal Verma wrote: >>> All IO in a dax filesystem used to go through dax_do_io, which cannot >>> handle media errors, and thus cannot provide a recovery path that can >>> send a write through the driver to clear errors. >>> >>> Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO >>> path for DAX filesystems, use the same direct_IO path for both DAX and >>> direct_io iocbs, but use the flags to identify when we are in O_DIRECT >>> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional >>> direct_IO path instead of DAX. >>> >> >> Really? What are your thinking here? >> >> What about all the current users of O_DIRECT, you have just made them >> 4 times slower and "less concurrent*" then "buffred io" users. Since >> direct_IO path will queue an IO request and all. >> (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) >> >> I hate it that you overload the semantics of a known and expected >> O_DIRECT flag, for special pmem quirks. This is an incompatible >> and unrelated overload of the semantics of O_DIRECT. > > I think it is the opposite situation, it us undoing the premature > overloading of O_DIRECT that went in without performance numbers. We have tons of measurements. Is not hard to imagine the results though. Specially the 1000 threads case > This implementation clarifies that dax_do_io() handles the lack of a > page cache for buffered I/O and O_DIRECT behaves as it nominally would > by sending an I/O to the driver. > It has the benefit of matching the > error semantics of a typical block device where a buffered write could > hit an error filling the page cache, but an O_DIRECT write potentially > triggers the drive to remap the block. > I fail to see how in writes the device error semantics regarding remapping of blocks is any different between buffered and direct IO. As far as the block device it is the same exact code path. All The big difference is higher in the VFS. And ... So you are willing to sacrifice the 99% hotpath for the sake of the 1% error path? and piggybacking on poor O_DIRECT. Again there are tons of O_DIRECT apps out there, why are you forcing them to change if they want true pmem performance? I still believe dax_do_io() can be made more resilient to errors, and clear errors on writes. Me going digging in old patches ... Cheers Boaz From dan.j.williams@intel.com Mon May 2 11:50:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A1DA7CD3 for ; Mon, 2 May 2016 11:50:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E893304032 for ; Mon, 2 May 2016 09:50:03 -0700 (PDT) X-ASG-Debug-ID: 1462207800-04cb6c09a042aa10001-NocioJ Received: from mail-ob0-f170.google.com (mail-ob0-f170.google.com [209.85.214.170]) by cuda.sgi.com with ESMTP id r5Of8N501jesUMhp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 09:50:00 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-ob0-f170.google.com[209.85.214.170] X-Barracuda-Apparent-Source-IP: 209.85.214.170 Received: by mail-ob0-f170.google.com with SMTP id dm5so21977855obc.1 for ; Mon, 02 May 2016 09:50:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=e9IhuwMCMhGmYxEshLSXDjwpI1Pj3Z0NOHBuyFvGUx8=; b=0knFH7PWHLpKQGPfs6QtI1QOdOSCFyat2j5Y5HG017vgg5ljIALPftTF7uoTypWumi sVDvt+Hdw7OB/pSNjtAwL9xjMGfqryvMN0Eh+4b931nsIr23SAYDgIvTDBD4vYo/0XlW kTwjkYOREOrGDafgeoY8R/JPUCIREaWCmss9XBnyEVGKo7roCQTAbtnB9rpn3mqiu3PU 25jOtzauBlV/GYx3Ni7Eni71jH2nipRDzdlWOcUNb3thYqEpy9jsQi3PE5+KXI55oOu/ 60DDuuTJdhc+UA4b4tahQqGTM7WAgQg0pkF+J5U4QglrMhyBtthAVR9JV0fkOzhrIIaW CP+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=e9IhuwMCMhGmYxEshLSXDjwpI1Pj3Z0NOHBuyFvGUx8=; b=BRMNOOk6aBy9BAVYlQeIuLLQPtqnxdMJ8n1ahVRsqkf6j25rrYltLB3SNdszEG7FmF sobmGTq7tTO8dWiTKMrjCpOIOHzgXiIPf3e1mvR/ybuWaJk+/thYXs2ZNTxzuutRO6Gz uOcvz0poTyTy0f+FTTe0WYoW98AE1keP2BHxDHg7odac/4+N4WAI07aGGyuhWNdKdt7K jN8Xqv0fxlnXPD1FZ/P4UFakT2yrgRkedrLDQZ2pQUvJVEaNMmtrlq0p3Qqy+24MY/lY PWOM2sVDQeACUrUTnNq8IHcviImJGUivi36EMST1qMdn0yKQeDsROZNU6Vs5OQR5sUMa B60A== X-Gm-Message-State: AOPr4FUaO/ooOIsGG7YZyvX8QZtQSVTaR6JH+zmvS24NgCoXGiQKzC27ti0eEmLgkA1GuR/ZwYZSwBaT29TBIHFR MIME-Version: 1.0 X-Received: by 10.182.33.36 with SMTP id o4mr15399075obi.28.1462207799808; Mon, 02 May 2016 09:49:59 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 09:49:59 -0700 (PDT) In-Reply-To: <57277EDA.9000803@plexistor.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> Date: Mon, 2 May 2016 09:49:59 -0700 Message-ID: Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Boaz Harrosh Cc: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f170.google.com[209.85.214.170] X-Barracuda-Start-Time: 1462207800 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3022 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29233 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 9:22 AM, Boaz Harrosh wrote: > On 05/02/2016 07:01 PM, Dan Williams wrote: >> On Mon, May 2, 2016 at 8:41 AM, Boaz Harrosh wrote: >>> On 04/29/2016 12:16 AM, Vishal Verma wrote: >>>> All IO in a dax filesystem used to go through dax_do_io, which cannot >>>> handle media errors, and thus cannot provide a recovery path that can >>>> send a write through the driver to clear errors. >>>> >>>> Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO >>>> path for DAX filesystems, use the same direct_IO path for both DAX and >>>> direct_io iocbs, but use the flags to identify when we are in O_DIRECT >>>> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional >>>> direct_IO path instead of DAX. >>>> >>> >>> Really? What are your thinking here? >>> >>> What about all the current users of O_DIRECT, you have just made them >>> 4 times slower and "less concurrent*" then "buffred io" users. Since >>> direct_IO path will queue an IO request and all. >>> (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) >>> >>> I hate it that you overload the semantics of a known and expected >>> O_DIRECT flag, for special pmem quirks. This is an incompatible >>> and unrelated overload of the semantics of O_DIRECT. >> >> I think it is the opposite situation, it us undoing the premature >> overloading of O_DIRECT that went in without performance numbers. > > We have tons of measurements. Is not hard to imagine the results though. > Specially the 1000 threads case > >> This implementation clarifies that dax_do_io() handles the lack of a >> page cache for buffered I/O and O_DIRECT behaves as it nominally would >> by sending an I/O to the driver. > >> It has the benefit of matching the >> error semantics of a typical block device where a buffered write could >> hit an error filling the page cache, but an O_DIRECT write potentially >> triggers the drive to remap the block. >> > > I fail to see how in writes the device error semantics regarding remapping of > blocks is any different between buffered and direct IO. As far as the block > device it is the same exact code path. All The big difference is higher in the > VFS. > > And ... So you are willing to sacrifice the 99% hotpath for the sake of the > 1% error path? and piggybacking on poor O_DIRECT. > > Again there are tons of O_DIRECT apps out there, why are you forcing them to > change if they want true pmem performance? This isn't forcing them to change. This is the path of least surprise as error semantics are identical to a typical block device. Yes, an application can go faster by switching to the "buffered" / dax_do_io() path it can go even faster to switch to mmap() I/O and use DAX directly. If we can later optimize the O_DIRECT path to bring it's performance more in line with dax_do_io(), great, but the implementation should be correct first and optimized later. From boaz@plexistor.com Mon May 2 12:44:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C5707CD5 for ; Mon, 2 May 2016 12:44:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D786F304064 for ; Mon, 2 May 2016 10:44:08 -0700 (PDT) X-ASG-Debug-ID: 1462211045-04bdf0359642b590001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id 9XoAcpIGQZtB1diH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 10:44:06 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id a17so154644038wme.0 for ; Mon, 02 May 2016 10:44:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=Nr8vgqMIhlglfxhmA6oc/HBVMgyHueEitiyQwi7pouQ=; b=Pp3z/xjlyp+fDJ6r/xfgPLVxyFa2esrfIukj/sM+NwAH8vzrlUAoBBWW5GxAbZPSZ+ K9IZF+5qkEgs/j0C/qI9ZEFTatG5mygaTKLszXRNFEkyEyyx8HwpZd1u1LzrREYSG5s7 tMSeBTEcoZ5nZyCvCD5ttwf1AmFU4+SJtEZH6PE8rMjPFEeD9DGEs7TecpwkBTzxjDfe VbxZvB+GBP7o8BKaldAMkq5xYy4bgQOnYPVaRdEmrDmpd+ElzIIMyMFyi0N1pM45gbvr ougCV1KyeoqkrtMOVdPAX1JbV7hInDKPB3GyxCZTjwYcsriYHSsrg1RXvbe7gaxvi5Oz bLqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=Nr8vgqMIhlglfxhmA6oc/HBVMgyHueEitiyQwi7pouQ=; b=DWcHORREM2v9gn9JnxzjpsS2U0NpDq//1+a4gjTjzL+ET8kF1vBjWJAtXB2O4yJWL8 WPCcG96teBlVB7kWBh2u6GeggNNB1glp2iMZc+ujnNtYgk0eyZvaE8S7RYFfnJ14vyvS wArJKAp85yzbwjGkvmJrwrhjwQAPlFk7i9MZKeUKv3cLXC7OwjODyZn0v36OUFK096BD RW/NvfF1SOBY7EMrRRWc4OlaU7wO3V6IMpYM0+0DIyQRL4SnSFbpd2YhhFDLmzDEHt9M qu8U4z+vpzRcgeYWNQSvu1w0k+B61J5pmgeg8CSupoDOf7z2VXTixns8ckWN1qBdrSDd XkcA== X-Gm-Message-State: AOPr4FXjvXq8qBAOYKH4L1tN6GGqabfCn85M1yAMXd4kWZvj4DFmRU2s8exv4D6/AVkdBQ== X-Received: by 10.28.93.6 with SMTP id r6mr21363677wmb.93.1462211044787; Mon, 02 May 2016 10:44:04 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id lm1sm2017929wjc.25.2016.05.02.10.44.02 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 10:44:04 -0700 (PDT) Message-ID: <572791E1.7000103@plexistor.com> Date: Mon, 02 May 2016 20:44:01 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dan Williams CC: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1462211046 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4355 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29233 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/02/2016 07:49 PM, Dan Williams wrote: > On Mon, May 2, 2016 at 9:22 AM, Boaz Harrosh wrote: >> On 05/02/2016 07:01 PM, Dan Williams wrote: >>> On Mon, May 2, 2016 at 8:41 AM, Boaz Harrosh wrote: >>>> On 04/29/2016 12:16 AM, Vishal Verma wrote: >>>>> All IO in a dax filesystem used to go through dax_do_io, which cannot >>>>> handle media errors, and thus cannot provide a recovery path that can >>>>> send a write through the driver to clear errors. >>>>> >>>>> Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO >>>>> path for DAX filesystems, use the same direct_IO path for both DAX and >>>>> direct_io iocbs, but use the flags to identify when we are in O_DIRECT >>>>> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional >>>>> direct_IO path instead of DAX. >>>>> >>>> >>>> Really? What are your thinking here? >>>> >>>> What about all the current users of O_DIRECT, you have just made them >>>> 4 times slower and "less concurrent*" then "buffred io" users. Since >>>> direct_IO path will queue an IO request and all. >>>> (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) >>>> >>>> I hate it that you overload the semantics of a known and expected >>>> O_DIRECT flag, for special pmem quirks. This is an incompatible >>>> and unrelated overload of the semantics of O_DIRECT. >>> >>> I think it is the opposite situation, it us undoing the premature >>> overloading of O_DIRECT that went in without performance numbers. >> >> We have tons of measurements. Is not hard to imagine the results though. >> Specially the 1000 threads case >> >>> This implementation clarifies that dax_do_io() handles the lack of a >>> page cache for buffered I/O and O_DIRECT behaves as it nominally would >>> by sending an I/O to the driver. >> >>> It has the benefit of matching the >>> error semantics of a typical block device where a buffered write could >>> hit an error filling the page cache, but an O_DIRECT write potentially >>> triggers the drive to remap the block. >>> >> >> I fail to see how in writes the device error semantics regarding remapping of >> blocks is any different between buffered and direct IO. As far as the block >> device it is the same exact code path. All The big difference is higher in the >> VFS. >> >> And ... So you are willing to sacrifice the 99% hotpath for the sake of the >> 1% error path? and piggybacking on poor O_DIRECT. >> >> Again there are tons of O_DIRECT apps out there, why are you forcing them to >> change if they want true pmem performance? > > This isn't forcing them to change. This is the path of least surprise > as error semantics are identical to a typical block device. Yes, an > application can go faster by switching to the "buffered" / dax_do_io() > path it can go even faster to switch to mmap() I/O and use DAX > directly. If we can later optimize the O_DIRECT path to bring it's > performance more in line with dax_do_io(), great, but the > implementation should be correct first and optimized later. > Why does it need to be either or. Why not both? And also I disagree if you are correct and dax_do_io is bad and needs fixing than you have broken applications. Because in current model: read => -EIO, write-bufferd, sync() gives you the same error semantics as: read => -EIO, write-direct-io In fact this is what the delete, restore from backup model does today. Who said it uses / must direct IO. Actually I think it does not. Two things I can think of which are better: [1] Why not go deeper into the dax io loops, and for any WRITE failed page call bdev_rw_page() to let the pmem.c clear / relocate the error page. So reads return -EIO - is what you wanted no? writes get a memory error and retry with bdev_rw_page() to let the bdev relocate / clear the error - is what you wanted no? In the partial page WRITE case on bad sectors. we can carefully read-modify-write sector-by-sector and zero-out the bad-sectors that could not be read, what else? (Or enhance the bdev_rw_page() API) [2] Only switch to slow O_DIRECT, on presence of errors like you wanted. But I still hate that you overload error semantics with O_DIRECT which does not exist today see above Thanks Boaz From dan.j.williams@intel.com Mon May 2 12:53:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 851797CD7 for ; Mon, 2 May 2016 12:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEE85AC002 for ; Mon, 2 May 2016 10:53:28 -0700 (PDT) X-ASG-Debug-ID: 1462211606-04cb6c09a142d550001-NocioJ Received: from mail-oi0-f49.google.com (mail-oi0-f49.google.com [209.85.218.49]) by cuda.sgi.com with ESMTP id PjWAuY4gCUIPnHw6 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 10:53:26 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f49.google.com[209.85.218.49] X-Barracuda-Apparent-Source-IP: 209.85.218.49 Received: by mail-oi0-f49.google.com with SMTP id x201so199989214oif.3 for ; Mon, 02 May 2016 10:53:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=LeS2Cru1VZFqI4YqWf6DszFVSzBFSfVRfLmEfm9hHvc=; b=iKczvBmFNf13Itt8KiOv+B5+XYqXkWSbeNfMFOoXx5/QUvOIlYKIEdZi4qh8qVp6Gy kV/BP2m0jAAXmcplGujTmyyvvXp33UvPX0Q/P4yE2jFX/XORlfxgMHd43OvvVeEO6s+o 5PyN3ayqLWCw2l6CmsQSL0gbsIPwj7j5VdSl377AKjZCvDy8MPtXr3z//9mtsWQwmdtC BmO/QrQVs2S2fehdhBzbZnff65heDWP+0C2c0T3lRBR8ypxx0DCjygCdke8/GF/ZahU4 I0YrKoroVXLq7V3p3WyFBxELAarvZq06WM1k3OpWD36CxdzE4Vzg3n7xkkXFOMpSCsk/ dVkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=LeS2Cru1VZFqI4YqWf6DszFVSzBFSfVRfLmEfm9hHvc=; b=cj4j/GKyUv8ERMjyTuIvFzfBwzbfhFPeljidoVcPDlCGoEpEIQnju+3K+dxDEGJCRG wedjk+n5Nztz/tkk6TPWkpURep16srW1Q4rFtbReMDNAaPL076QrWro2yOnmxkg40dUs fUcFGUpDDkDepbdP5pQtyvgHOdoRVQK8uepHl87m6PrPcKshQXv1oR3kNI/0OiqF2vRQ CdHPsRgPnbS3aLYfdniXQZ9BUvZI/5kdQ3BT9zDkX8ZHYokiNlfykoi8E6ZW+SPNHQdW UXt0FEhc6UB5lJdZpNrBgCA/3A5ob25bFB5J6qCeSmo7Oo4oruhcfIv1Imp1n1z5tuDr BA1w== X-Gm-Message-State: AOPr4FVccfeRrGroFMx/7oV3FbsT4m49hbDEGP8ttr4vVRx8sNDo+VIW1unGcjuLfwZdSEZPeuW4rF3yALLqbhV5 MIME-Version: 1.0 X-Received: by 10.157.18.179 with SMTP id g48mr14100126otg.53.1462211606015; Mon, 02 May 2016 10:53:26 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 10:53:25 -0700 (PDT) In-Reply-To: References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> Date: Mon, 2 May 2016 10:53:25 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Jeff Moyer Cc: Dave Chinner , "Verma, Vishal L" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f49.google.com[209.85.218.49] X-Barracuda-Start-Time: 1462211606 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1927 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29234 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 8:18 AM, Jeff Moyer wrote: > Dave Chinner writes: [..] >> We need some form of redundancy and correction in the PMEM stack to >> prevent single sector errors from taking down services until an >> administrator can correct the problem. I'm trying to understand >> where this is supposed to fit into the picture - at this point I >> really don't think userspace applications are going to be able to do >> this reliably.... > > Not all storage is configured into a RAID volume, and in some instances, > the application is better positioned to recover the data (gluster/ceph, > for example). It really comes down to whether applications or libraries > will want to implement redundancy themselves in order to get a bump in > performance by not going through the kernel. And I think I know what > your opinion is on that front. :-) > > Speaking of which, did you see the numbers Dan shared at LSF on how much > overhead there is in calling into the kernel for syncing? Dan, can/did > you publish that spreadsheet somewhere? Here it is: https://docs.google.com/spreadsheets/d/1pwr9psy6vtB9DOsc2bUdXevJRz5Guf6laZ4DaZlkhoo/edit?usp=sharing On the "Filtered" tab I have some of the comparisons where: noop => don't call msync and don't flush caches in userspace persist => cache flushing only in userspace and only on individual cache lines persist_4k => cache flushing only in userspace, but flushing is performed in 4K aligned units msync => same granularity flushing as the 'persist' case, but the kernel internally promotes this to a 4K sized / aligned flush msync_0 => synthetic case where msync() returns immediately and does no other work The takeaway is that msync() is 9-10x slower than userspace cache management. Let me know if there are any questions and I can add an NVML developer to this thread... From dan.j.williams@intel.com Mon May 2 13:10:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC49A7CD3 for ; Mon, 2 May 2016 13:10:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12916AC008 for ; Mon, 2 May 2016 11:10:25 -0700 (PDT) X-ASG-Debug-ID: 1462212622-04cbb00fe94019a0001-NocioJ Received: from mail-oi0-f46.google.com (mail-oi0-f46.google.com [209.85.218.46]) by cuda.sgi.com with ESMTP id CwsgZCPBZ2OFDh6H (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 11:10:22 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f46.google.com[209.85.218.46] X-Barracuda-Apparent-Source-IP: 209.85.218.46 Received: by mail-oi0-f46.google.com with SMTP id x201so200661767oif.3 for ; Mon, 02 May 2016 11:10:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=m2Aj5Yo9bP8CSDQdNvRwOGQkGSr5zcyu0xgFR5N7T5w=; b=RiaRM9004RSd/4eVpzF+rCcJjcqS7uLsux290T4uhzTA/TcMpKlcupTUMkgYSL0v+p aTrUdAjekB1LmyBP5wwYRQnt9+KS1blLF2aKveO4xGeXKx3ZQKhhpGjuvmAUuHULCYaS kbCrBi3SIAANvtnD9J/qEaHSxS+OG1SoPCxEFkOwQNa1QSO81QklJKtmMNonCQIoK/gF kpruUYLlFw81e4TQZV1gf4KfeP1WRx8sw2s0zuaOSuZU4pP9yFLKFU0/b9J/89VGAbMu EvQhHljYQhN6N9JrLi64p9PXK+eXtTd76hOaZnXIBwzEGRPnZzitbpBmf5Ns7ttVmvUo CIWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=m2Aj5Yo9bP8CSDQdNvRwOGQkGSr5zcyu0xgFR5N7T5w=; b=AD2YUkh803/aBfLRnZZvz0Qp8gXdduh/Y9+w9aqn1n7SsAwgJVNLcpI9offT2H/IAR z3rjzJvRJktST+mqhlellaMMTY10VEyxmRqf1pv0MxK9Sz4nNwTRh1Fn+NKHFuP0SzdY X/ORyIWdwzSYVnsljb8q5BtEoMVi7i5fgAyajqj995Cf61GV6g4eO9rOlN9pCDvg/8b4 fo35Gfhvu4aLm6YcQd4rs39gi3hmUcRjazPTwnK8fKpBB/KhqAREewbDPSIamAN7mGde Hm4bQC1dZE5d4TaIe+5kXyax0e9v0SS8ErMqQJoGHyBrkFeuT8PfwjQg4VXz8pEmhe+M iaXQ== X-Gm-Message-State: AOPr4FUfK5/ukFWnDovGL3Md9D2dKUrVK2/KvIHMznNNJNTRDJVNpORMttVvgxt8XIyfLuZDIxSlhIh5xMnIaP4W MIME-Version: 1.0 X-Received: by 10.202.228.2 with SMTP id b2mr10642996oih.81.1462212621917; Mon, 02 May 2016 11:10:21 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 11:10:21 -0700 (PDT) In-Reply-To: <572791E1.7000103@plexistor.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> <572791E1.7000103@plexistor.com> Date: Mon, 2 May 2016 11:10:21 -0700 Message-ID: Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Boaz Harrosh Cc: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f46.google.com[209.85.218.46] X-Barracuda-Start-Time: 1462212622 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5402 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29234 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 10:44 AM, Boaz Harrosh wrote: > On 05/02/2016 07:49 PM, Dan Williams wrote: >> On Mon, May 2, 2016 at 9:22 AM, Boaz Harrosh wrote: >>> On 05/02/2016 07:01 PM, Dan Williams wrote: >>>> On Mon, May 2, 2016 at 8:41 AM, Boaz Harrosh wrote: >>>>> On 04/29/2016 12:16 AM, Vishal Verma wrote: >>>>>> All IO in a dax filesystem used to go through dax_do_io, which cannot >>>>>> handle media errors, and thus cannot provide a recovery path that can >>>>>> send a write through the driver to clear errors. >>>>>> >>>>>> Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO >>>>>> path for DAX filesystems, use the same direct_IO path for both DAX and >>>>>> direct_io iocbs, but use the flags to identify when we are in O_DIRECT >>>>>> mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional >>>>>> direct_IO path instead of DAX. >>>>>> >>>>> >>>>> Really? What are your thinking here? >>>>> >>>>> What about all the current users of O_DIRECT, you have just made them >>>>> 4 times slower and "less concurrent*" then "buffred io" users. Since >>>>> direct_IO path will queue an IO request and all. >>>>> (And if it is not so slow then why do we need dax_do_io at all? [Rhetorical]) >>>>> >>>>> I hate it that you overload the semantics of a known and expected >>>>> O_DIRECT flag, for special pmem quirks. This is an incompatible >>>>> and unrelated overload of the semantics of O_DIRECT. >>>> >>>> I think it is the opposite situation, it us undoing the premature >>>> overloading of O_DIRECT that went in without performance numbers. >>> >>> We have tons of measurements. Is not hard to imagine the results though. >>> Specially the 1000 threads case >>> >>>> This implementation clarifies that dax_do_io() handles the lack of a >>>> page cache for buffered I/O and O_DIRECT behaves as it nominally would >>>> by sending an I/O to the driver. >>> >>>> It has the benefit of matching the >>>> error semantics of a typical block device where a buffered write could >>>> hit an error filling the page cache, but an O_DIRECT write potentially >>>> triggers the drive to remap the block. >>>> >>> >>> I fail to see how in writes the device error semantics regarding remapping of >>> blocks is any different between buffered and direct IO. As far as the block >>> device it is the same exact code path. All The big difference is higher in the >>> VFS. >>> >>> And ... So you are willing to sacrifice the 99% hotpath for the sake of the >>> 1% error path? and piggybacking on poor O_DIRECT. >>> >>> Again there are tons of O_DIRECT apps out there, why are you forcing them to >>> change if they want true pmem performance? >> >> This isn't forcing them to change. This is the path of least surprise >> as error semantics are identical to a typical block device. Yes, an >> application can go faster by switching to the "buffered" / dax_do_io() >> path it can go even faster to switch to mmap() I/O and use DAX >> directly. If we can later optimize the O_DIRECT path to bring it's >> performance more in line with dax_do_io(), great, but the >> implementation should be correct first and optimized later. >> > > Why does it need to be either or. Why not both? > And also I disagree if you are correct and dax_do_io is bad and needs fixing > than you have broken applications. Because in current model: > > read => -EIO, write-bufferd, sync() > gives you the same error semantics as: read => -EIO, write-direct-io > In fact this is what the delete, restore from backup model does today. > Who said it uses / must direct IO. Actually I think it does not. The semantic I am talking about preserving is: buffered / unaligned write of a bad sector => -EIO on reading into the page cache ...and that the only guaranteed way to clear an error (assuming the block device supports it) is an O_DIRECT write. > > Two things I can think of which are better: > [1] > Why not go deeper into the dax io loops, and for any WRITE > failed page call bdev_rw_page() to let the pmem.c clear / relocate > the error page. Where do you get the rest of the data to complete a full page write? > So reads return -EIO - is what you wanted no? That's well understood. What we are debating is the method to clear errors / ask the storage device to remap bad blocks. > writes get a memory error and retry with bdev_rw_page() to let the bdev > relocate / clear the error - is what you wanted no? > > In the partial page WRITE case on bad sectors. we can carefully read-modify-write > sector-by-sector and zero-out the bad-sectors that could not be read, what else? > (Or enhance the bdev_rw_page() API) See all the previous discussions on why the fallback path is problematic to implement. > > [2] > Only switch to slow O_DIRECT, on presence of errors like you wanted. But I still > hate that you overload error semantics with O_DIRECT which does not exist today > see above I still think we're talking past each other on this point. This patch set is not overloading error semantics, it's fixing the error handling problem that was introduced in this commit: d475c6346a38 dax,ext2: replace XIP read and write with DAX I/O ...where we started overloading O_DIRECT and dax_do_io() semantics. From hch@lst.de Mon May 2 13:23:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 555897CDA for ; Mon, 2 May 2016 13:23:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B97930404E for ; Mon, 2 May 2016 11:23:45 -0700 (PDT) X-ASG-Debug-ID: 1462213422-04cbb00fe9401ef0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id kC7xMushWPhDfZYz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 11:23:43 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id AD05A68C55; Mon, 2 May 2016 20:23:41 +0200 (CEST) Date: Mon, 2 May 2016 20:23:41 +0200 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: iomap infrastructure and multipage writes V2 Message-ID: <20160502182341.GA7077@lst.de> X-ASG-Orig-Subj: Re: iomap infrastructure and multipage writes V2 References: <1460494382-14547-1-git-send-email-hch@lst.de> <20160413215442.GS567@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413215442.GS567@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1462213423 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1828 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave, sorry for taking forever to get back to this - travel to LSF and some other meetings and a dealine last week didn't leave me any time for XFS work. On Thu, Apr 14, 2016 at 07:54:42AM +1000, Dave Chinner wrote: > Christoph, have you done any perf testing of this patchset yet to > check that it does indeed reduce the CPU overhead of large write > operations? I'd also be interested to know if there is any change in > overhead for single page (4k) IOs as well, even though I suspect > there won't be. I've done a lot of testing earlier, and this version also looks very promising. On the sort of hardware I have access to now, the 4k numbers don't change much, but with 1M writes we both increase the write bandwith a little bit and significantly lower the cpu usage. The simple test that demonstrates this is this, the runs are from a 4p VM with 4G of RAM, access to a fast NVMe SSD and a small enough data size so that writeback shouldn't throttle the buffered write path: MNT=/mnt PERF="perf_3.16" # soo smart to have tools in the kernel tree.. #BS=4k #COUNT=65536 BS=1M COUNT=256 $PERF stat dd if=/dev/zero of=$MNT/testfile bs=$BS count=$COUNT with the baseline for-next tree I get the following bandwith and cpu utilization: BS=4k: ~600MB/s 0.856 CPUs utilized ( +- 0.32% ) BS=1M: 1.45GB/s 0.820 CPUs utilized ( +- 0.77% ) with all patches applied: BS=4k: ~610MB/s 0.848 CPUs utilized ( +- 0.36% ) BS=1M: ~1.55GB/s 0.615 CPUs utilized ( +- 0.80% ) This is also visible in the walltime baseline, 4k: real 0m0.540s user 0m0.000s sys 0m0.533s baseline, 1M: real 0m0.310s user 0m0.000s sys 0m0.313s multipage, 4k: real 0m0.541s user 0m0.010s sys 0m0.527s multipage, 1M: real 0m0.272s user 0m0.000s sys 0m0.263s From hch@lst.de Mon May 2 13:25:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 311B87CB6 for ; Mon, 2 May 2016 13:25:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA923304032 for ; Mon, 2 May 2016 11:25:26 -0700 (PDT) X-ASG-Debug-ID: 1462213523-04bdf0359642c580001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id h0AE9HtJoy73egrb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 11:25:25 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 4473368C55; Mon, 2 May 2016 20:25:23 +0200 (CEST) Date: Mon, 2 May 2016 20:25:23 +0200 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 5/8] xfs: implement iomap based buffered write path Message-ID: <20160502182523.GB7077@lst.de> X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: implement iomap based buffered write path References: <1460494382-14547-1-git-send-email-hch@lst.de> <1460494382-14547-6-git-send-email-hch@lst.de> <20160414125814.GE20696@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414125814.GE20696@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1462213524 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 954 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 14, 2016 at 08:58:14AM -0400, Brian Foster wrote: > > +static int > > +xfs_file_iomap_end_delalloc( > > + struct xfs_inode *ip, > > + loff_t offset, > > + loff_t length, > > + ssize_t written) > > +{ > > + struct xfs_mount *mp = ip->i_mount; > > + xfs_fileoff_t start_fsb; > > + xfs_fileoff_t end_fsb; > > + int error = 0; > > + > > + start_fsb = XFS_B_TO_FSB(mp, offset + written); > > + end_fsb = XFS_B_TO_FSB(mp, offset + length - written); > > + > > Just skimming over this series... but shouldn't this be offset + length? > Why walk back from the end of the allocated range? Because the interface from the core iomap code need to pass the length of the actually mapped range, and the amount of bytes successfully written into it to the filesystem, as other filesystems will require this for their locking. We need to convert it back at some point, and it seems more logical here than in the caller. From boaz@plexistor.com Mon May 2 13:33:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D9D117CCE for ; Mon, 2 May 2016 13:33:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F03D8F8033 for ; Mon, 2 May 2016 11:33:01 -0700 (PDT) X-ASG-Debug-ID: 1462213978-04cbb00fea4022f0001-NocioJ Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by cuda.sgi.com with ESMTP id drscaNuRFAaBPs4U (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 11:32:59 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f47.google.com[74.125.82.47] X-Barracuda-Apparent-Source-IP: 74.125.82.47 Received: by mail-wm0-f47.google.com with SMTP id e201so117881625wme.0 for ; Mon, 02 May 2016 11:32:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=WbU+KyDNVZF/47U7GLr1zQDJMc9m3qLpvPM7I0hcmWw=; b=Q9uiuQ2u7ss+E91V3ess3vATYelGvRbeBHmf5OsARd2Phri7Fv+H3UxR0Iqz302WxR Fe6sSW6W8xE1EVLtBH5mY/7OBlRNFOEuwpiq7Fa02+5yoanA+3+6+kOdMjW+yt+SINfh o4NUsVD6DGAuNh2R68ZDqI77EvVEpnvU+4GVkMHTFDKHWAqnnIUXrQKtR6ScjLKBYH4E /V3BG68qrFQc5th6NF8tAgWiEG0KLaWazFYzgK8AOLNCFvpq+E4Mh5pPI2ydLas+ovsh Jjox6oueYwdBFAD5ORhob5Hyj8in3jmKEI+XJOROc+emZ49EvU2NOIM2d4IEorE2dJ/W 0idw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=WbU+KyDNVZF/47U7GLr1zQDJMc9m3qLpvPM7I0hcmWw=; b=AWsyt/NCWUcJLK/x+ox0o53eWQ5OKAUrYaR6B7OF/Y8HPJoGC12LndGczDkfNA3HEQ bd9ALMHyCYz5kw7u292LKBktEj20fV2zr0Ol24ciUyR23lnMs12k/KFukQ4OeWQqmOHT ldI6ctcFuDmfoUM8v6wDz4ro0SsLMJZrNvPY+D5slUMvBFfLJAb48cN2DofTDpK1PNVs ANsZvnxW7bmRwBPbpwUgw1DrPu+B67iRFhy6vXptGkl4BYTqeSvD6y/cCak24ArEtJwE Z+qU8P6hWX9Go4JP+AVThuonGJhcwI3HhMRzR79L5DPGgUaskK0Yd1NfNISxv1DiN9uD 9vwA== X-Gm-Message-State: AOPr4FXxrRSIRY2VQ5eFl0vO6iD6mLKBWH+wenLHNX+/4a4zTZszxqQaKYnp4KUyAXgHAw== X-Received: by 10.28.140.17 with SMTP id o17mr19412699wmd.18.1462213978294; Mon, 02 May 2016 11:32:58 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id ry15sm31799075wjb.19.2016.05.02.11.32.56 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 11:32:57 -0700 (PDT) Message-ID: <57279D57.5020800@plexistor.com> Date: Mon, 02 May 2016 21:32:55 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dan Williams CC: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> <572791E1.7000103@plexistor.com> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f47.google.com[74.125.82.47] X-Barracuda-Start-Time: 1462213979 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1595 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/02/2016 09:10 PM, Dan Williams wrote: <> > > The semantic I am talking about preserving is: > > buffered / unaligned write of a bad sector => -EIO on reading into the > page cache > What about aligned buffered write? like write 0-to-eof This still broken? (and is what restore apps do) > ...and that the only guaranteed way to clear an error (assuming the > block device supports it) is an O_DIRECT write. > Sure fixing dax_do_io will guaranty that. <> > I still think we're talking past each other on this point. Yes we are! > This patch > set is not overloading error semantics, it's fixing the error handling > problem that was introduced in this commit: > > d475c6346a38 dax,ext2: replace XIP read and write with DAX I/O > > ...where we started overloading O_DIRECT and dax_do_io() semantics. > But above does not fix them does it? it just completely NULLs DAX for O_DIRECT which is a great pity, why did we do all this work in the first place. And then it keeps broken the aligned buffered writes, which are still broken after this set. I have by now read the v2 patches. And I think you guys did not yet try the proper fix for dax_do_io. I think you need to go deeper into the loops and selectively call bdev_* when error on a specific page copy. No need to go through direct_IO path at all. Do you need that I send you a patch to demonstrate what I mean? But yes I feel too that "we're talking past each other". I did want to come to LSF and talk to you, but was not invited. Should I call you? Thanks Boaz From dan.j.williams@intel.com Mon May 2 13:48:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C18957CDF for ; Mon, 2 May 2016 13:48:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 775A88F8035 for ; Mon, 2 May 2016 11:48:18 -0700 (PDT) X-ASG-Debug-ID: 1462214896-04bdf0358e42d2e0001-NocioJ Received: from mail-oi0-f52.google.com (mail-oi0-f52.google.com [209.85.218.52]) by cuda.sgi.com with ESMTP id f4VKHw7AzqrLoBIX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 11:48:16 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f52.google.com[209.85.218.52] X-Barracuda-Apparent-Source-IP: 209.85.218.52 Received: by mail-oi0-f52.google.com with SMTP id v145so168647299oie.0 for ; Mon, 02 May 2016 11:48:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=zD0wypronFqgNdc/CH1nfNvpvdzyhzH+wv/5ZAMff4w=; b=Q9fWbPLtHvIrGD/Hud4w+8rqlEF97T+4ePZQ880PORcWPQihK04T9jytOncCeCbLIO HjUYu0JpnIN1MRkwqtZi0DgI4jkM0M49QnWr8gQHEoAz6WBL28io7XpiAvauLH9kr9fo D0s9GgWLlLmGdKFJRGqj7huUyPPedeZIPXTL/jhP6SCeNUSKGqXt7vUaDZJ7TRciyuBu 3TeMJSumVi37k7QyWmSOSQLsWsjGr8Uw0J0s4oP+Z8VwSQcAPlJD/rl5QXy0ajzLOnf9 ixV1rkQ5n8QRyj/NKva8idhiaOnK2TNMjF/7elaZ15jTz9Zwi+nXAeciwHgpY+agNmJP A1Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=zD0wypronFqgNdc/CH1nfNvpvdzyhzH+wv/5ZAMff4w=; b=d+AaLYwlaAJFOMGO8eoZpXyskpYZe3xb+f6WG3k4wbPe+YX5rsUnXhptC19bGQ+7FZ pQnaqBzaMG//B0Ro7efQ8I3B4sy4pZlDvEphLuKwHdp60yErUkzGAgnnlrA8dr4Bzo11 HHMwtwDzkrnuYF06uiFMYnGRLPK9kJH9U1UgK439EpV2tGox6tTK8daquE8Tlkz5ole6 wU3BR/S6FI/78dxUuvcDF6jW/J49VCQy2/cnDfW05AVdDkrC4TsipHBifBZDtd4QZMoz RQyUqhu7NoIZjQ1xwT6FclUrOBHjWkY9288VuivR2MBl+Fk7e96antdxHeP2dTQ8xpCW 0KLA== X-Gm-Message-State: AOPr4FXaNCQlcYQRMUfJdsT4LmSQLOVpz9ZJgNLpc6aW78HA9ejovAtdejOFlj4yEhxGiX5VJvvrT0RpgayW9PEK MIME-Version: 1.0 X-Received: by 10.202.230.137 with SMTP id d131mr16074995oih.168.1462214895861; Mon, 02 May 2016 11:48:15 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 11:48:15 -0700 (PDT) In-Reply-To: <57279D57.5020800@plexistor.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> <572791E1.7000103@plexistor.com> <57279D57.5020800@plexistor.com> Date: Mon, 2 May 2016 11:48:15 -0700 Message-ID: Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io To: Boaz Harrosh Cc: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f52.google.com[209.85.218.52] X-Barracuda-Start-Time: 1462214896 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2205 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 11:32 AM, Boaz Harrosh wrote: > On 05/02/2016 09:10 PM, Dan Williams wrote: > <> >> >> The semantic I am talking about preserving is: >> >> buffered / unaligned write of a bad sector => -EIO on reading into the >> page cache >> > > What about aligned buffered write? like write 0-to-eof > This still broken? (and is what restore apps do) > >> ...and that the only guaranteed way to clear an error (assuming the >> block device supports it) is an O_DIRECT write. >> > > Sure fixing dax_do_io will guaranty that. > > <> >> I still think we're talking past each other on this point. > > Yes we are! > >> This patch >> set is not overloading error semantics, it's fixing the error handling >> problem that was introduced in this commit: >> >> d475c6346a38 dax,ext2: replace XIP read and write with DAX I/O >> >> ...where we started overloading O_DIRECT and dax_do_io() semantics. >> > > But above does not fix them does it? it just completely NULLs DAX for > O_DIRECT which is a great pity, why did we do all this work in the first > place. This is hyperbole. We don't impact "all the work" we did for the mmap I/O case and the acceleration of the non-direct-I/O case. > And then it keeps broken the aligned buffered writes, which are still > broken after this set. ...identical to the current situation with a traditional disk. > I have by now read the v2 patches. And I think you guys did not yet try > the proper fix for dax_do_io. I think you need to go deeper into the loops > and selectively call bdev_* when error on a specific page copy. No need to > go through direct_IO path at all. We still reach a point where the minimum granularity of bdev_direct_access() is larger than a sector, so you end up still needing to have the application understand how to send a properly aligned I/O. The semantics of how to send a properly aligned direct-I/O are already well understood, so we simply reuse that path. > Do you need that I send you a patch to demonstrate what I mean? I remain skeptical of what you are proposing, but yes, a patch has a better chance to move the discussion forward. From vishal.l.verma@intel.com Mon May 2 13:52:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3BDF87CE1 for ; Mon, 2 May 2016 13:52:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00C978F8037 for ; Mon, 2 May 2016 11:52:05 -0700 (PDT) X-ASG-Debug-ID: 1462215124-04cbb00fe7402b30001-NocioJ Received: from mga11.intel.com ([192.55.52.93]) by cuda.sgi.com with ESMTP id NyZbACtuMyeOGrWH for ; Mon, 02 May 2016 11:52:04 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.93] X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-ASG-Whitelist: Client Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 02 May 2016 11:52:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,568,1455004800"; d="scan'208";a="957318983" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by fmsmga001.fm.intel.com with ESMTP; 02 May 2016 11:52:04 -0700 Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 2 May 2016 11:52:03 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx123.amr.corp.intel.com ([169.254.5.73]) with mapi id 14.03.0248.002; Mon, 2 May 2016 11:52:03 -0700 From: "Verma, Vishal L" To: "linux-nvdimm@lists.01.org" , "boaz@plexistor.com" CC: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" , "matthew@wil.cx" Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io Thread-Topic: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io Thread-Index: AQHRoZNfS9ZF3cQEEUydwj8b8xF2vZ+mRHyAgAACs4CAAANigIAALv8A Date: Mon, 2 May 2016 18:52:02 +0000 Message-ID: <1462215110.1421.43.camel@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <1462204291.11211.20.camel@kernel.org> <57277A59.3000306@plexistor.com> In-Reply-To: <57277A59.3000306@plexistor.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.112.171] Content-Type: text/plain; charset="utf-8" Content-ID: <6CC4C63FB2C3A74E9884555DCBF97A11@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.93] X-Barracuda-Start-Time: 1462215124 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4639 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gTW9uLCAyMDE2LTA1LTAyIGF0IDE5OjAzICswMzAwLCBCb2F6IEhhcnJvc2ggd3JvdGU6DQo+ IE9uIDA1LzAyLzIwMTYgMDY6NTEgUE0sIFZpc2hhbCBWZXJtYSB3cm90ZToNCj4gPiANCj4gPiBP biBNb24sIDIwMTYtMDUtMDIgYXQgMTg6NDEgKzAzMDAsIEJvYXogSGFycm9zaCB3cm90ZToNCj4g PiA+IA0KPiA+ID4gT24gMDQvMjkvMjAxNiAxMjoxNiBBTSwgVmlzaGFsIFZlcm1hIHdyb3RlOg0K PiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IEFsbCBJTyBpbiBhIGRheCBmaWxlc3lzdGVtIHVz ZWQgdG8gZ28gdGhyb3VnaCBkYXhfZG9faW8sIHdoaWNoDQo+ID4gPiA+IGNhbm5vdA0KPiA+ID4g PiBoYW5kbGUgbWVkaWEgZXJyb3JzLCBhbmQgdGh1cyBjYW5ub3QgcHJvdmlkZSBhIHJlY292ZXJ5 IHBhdGgNCj4gPiA+ID4gdGhhdA0KPiA+ID4gPiBjYW4NCj4gPiA+ID4gc2VuZCBhIHdyaXRlIHRo cm91Z2ggdGhlIGRyaXZlciB0byBjbGVhciBlcnJvcnMuDQo+ID4gPiA+IA0KPiA+ID4gPiBBZGQg YSBuZXcgaW9jYiBmbGFnIGZvciBEQVgsIGFuZCBzZXQgaXQgb25seSBmb3IgREFYIG1vdW50cy4g SW4NCj4gPiA+ID4gdGhlDQo+ID4gPiA+IElPDQo+ID4gPiA+IHBhdGggZm9yIERBWCBmaWxlc3lz dGVtcywgdXNlIHRoZSBzYW1lIGRpcmVjdF9JTyBwYXRoIGZvciBib3RoDQo+ID4gPiA+IERBWA0K PiA+ID4gPiBhbmQNCj4gPiA+ID4gZGlyZWN0X2lvIGlvY2JzLCBidXQgdXNlIHRoZSBmbGFncyB0 byBpZGVudGlmeSB3aGVuIHdlIGFyZSBpbg0KPiA+ID4gPiBPX0RJUkVDVA0KPiA+ID4gPiBtb2Rl IHZzIG5vbiBPX0RJUkVDVCB3aXRoIERBWCwgYW5kIGZvciBPX0RJUkVDVCwgdXNlIHRoZQ0KPiA+ ID4gPiBjb252ZW50aW9uYWwNCj4gPiA+ID4gZGlyZWN0X0lPIHBhdGggaW5zdGVhZCBvZiBEQVgu DQo+ID4gPiA+IA0KPiA+ID4gUmVhbGx5PyBXaGF0IGFyZSB5b3VyIHRoaW5raW5nIGhlcmU/DQo+ ID4gPiANCj4gPiA+IFdoYXQgYWJvdXQgYWxsIHRoZSBjdXJyZW50IHVzZXJzIG9mIE9fRElSRUNU LCB5b3UgaGF2ZSBqdXN0IG1hZGUNCj4gPiA+IHRoZW0NCj4gPiA+IDQgdGltZXMgc2xvd2VyIGFu ZCAibGVzcyBjb25jdXJyZW50KiIgdGhlbiAiYnVmZnJlZCBpbyIgdXNlcnMuDQo+ID4gPiBTaW5j ZQ0KPiA+ID4gZGlyZWN0X0lPIHBhdGggd2lsbCBxdWV1ZSBhbiBJTyByZXF1ZXN0IGFuZCBhbGwu DQo+ID4gPiAoQW5kIGlmIGl0IGlzIG5vdCBzbyBzbG93IHRoZW4gd2h5IGRvIHdlIG5lZWQgZGF4 X2RvX2lvIGF0IGFsbD8NCj4gPiA+IFtSaGV0b3JpY2FsXSkNCj4gPiA+IA0KPiA+ID4gSSBoYXRl IGl0IHRoYXQgeW91IG92ZXJsb2FkIHRoZSBzZW1hbnRpY3Mgb2YgYSBrbm93biBhbmQgZXhwZWN0 ZWQNCj4gPiA+IE9fRElSRUNUIGZsYWcsIGZvciBzcGVjaWFsIHBtZW0gcXVpcmtzLiBUaGlzIGlz IGFuIGluY29tcGF0aWJsZQ0KPiA+ID4gYW5kIHVucmVsYXRlZCBvdmVybG9hZCBvZiB0aGUgc2Vt YW50aWNzIG9mIE9fRElSRUNULg0KPiA+IFdlIG92ZXJsb2FkZWQgT19ESVJFQ1QgYSBsb25nIHRp bWUgYWdvIHdoZW4gd2UgbWFkZSBEQVggcGlnZ3liYWNrIG9uDQo+ID4gdGhlIHNhbWUgcGF0aDoN Cj4gPiANCj4gPiBzdGF0aWMgaW5saW5lIGJvb2wgaW9faXNfZGlyZWN0KHN0cnVjdCBmaWxlICpm aWxwKQ0KPiA+IHsNCj4gPiAJcmV0dXJuIChmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHx8IElT X0RBWChmaWxwLT5mX21hcHBpbmctDQo+ID4gPmhvc3QpOw0KPiA+IH0NCj4gPiANCj4gTm8gYXMg ZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZCB3ZSBoYXZlIG5vdC4gVGhlIE9fRElSRUNUIHVz ZXINCj4gaXMgc3RpbGwgZ2V0dGluZyBhbGwgdGhlIHNlbWFudGljcyBoZSB3YW50cywgLmkuZSBu byBzeW5jcyBubw0KPiBtZW1vcnkgY2FjaGUgdXNhZ2UsIG5vIGNvcGllcyAuLi4NCj4gDQo+IE9u bHkgd2l0aCBEQVggdGhlIGJ1ZmZlcmVkIElPIGlzIHRoZSBzYW1lIHNpbmNlIHdpdGggcG1lbSBp dCBpcw0KPiBmYXN0ZXIuDQo+IFRoZW4gd2h5IG5vdD8gVGhlIGJhc2ljIGNvbnRyYWN0IHdpdGgg dGhlIHVzZXIgZGlkIG5vdCBicmVhay4NCj4gDQo+IFRoZSBhYm92ZSB3YXMganVzdCBhbiBpbXBs ZW1lbnRhdGlvbiBkZXRhaWwgdG8gZWFzaWx5IG5hdmlnYXRlDQo+IHRocm91Z2ggdGhlIExpbnV4 IHZmcyBJTyBzdGFjayBhbmQgbWFrZSB0aGUgbGVhc3QgYW1vdW50IG9mIGNoYW5nZXMNCj4gaW4g ZXZlcnkgRlMgdGhhdCB3YW50ZWQgdG8gc3VwcG9ydCBEQVguKEFuZCBzaW5jZSBkYXhfZG9faW8g aXMgbXVjaA0KPiBtb3JlIGxpa2UgZGlyZWN0X0lPIHRoZW4gbGlrZSBwYWdlLWNhY2hlIElPKQ0K PiANCj4gPiANCj4gPiBZZXMgT19ESVJFQ1Qgb24gYSBEQVggbW91bnRlZCBmaWxlIHN5c3RlbSB3 aWxsIG5vdyBiZSBzbG93ZXIsIGJ1dCAtDQo+ID4gDQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+IFRoaXMgYWxsb3dzIHVzIGEgcmVjb3ZlcnkgcGF0aCBpbiB0aGUg Zm9ybSBvZiBvcGVuaW5nIHRoZSBmaWxlDQo+ID4gPiA+IHdpdGgNCj4gPiA+ID4gT19ESVJFQ1Qg YW5kIHdyaXRpbmcgdG8gaXQgd2l0aCB0aGUgdXN1YWwgT19ESVJFQ1Qgc2VtYW50aWNzDQo+ID4g PiA+IChzZWN0b3INCj4gPiA+ID4gYWxpZ25tZW50IHJlc3RyaWN0aW9ucykuDQo+ID4gPiA+IA0K PiA+ID4gSSB1bmRlcnN0YW5kIHRoYXQgeW91IHdhbnQgYSBzZWN0b3IgYWxpZ25lZCBJTywgcmln aHQ/IGZvciB0aGUNCj4gPiA+IGNsZWFyIG9mIGVycm9ycy4gQnV0IEkgaGF0ZSBpdCB0aGF0IHlv dSBmb3JjZWQgYWxsIE9fRElSRUNUIElPDQo+ID4gPiB0byBiZSBzbG93IGZvciB0aGlzLg0KPiA+ ID4gQ2FuIHlvdSBub3QgbWFrZSBkYXhfZG9faW8gaGFuZGxlIG1lZGlhIGVycm9ycz8gQXQgbGVh c3QgZm9yIHRoZQ0KPiA+ID4gcGFydHMgb2YgdGhlIElPIHRoYXQgYXJlIGFsaWduZWQuDQo+ID4g PiAoQW5kIHlvdXIgcmVjb3ZlcnkgcGF0aCBhcHBsaWNhdGlvbiBhYm92ZSBjYW4gdXNlIG9ubHkg YWxpZ25lZA0KPiA+ID4gwqBJTyB0byBtYWtlIHN1cmUpDQo+ID4gPiANCj4gPiA+IFBsZWFzZSBs b29rIGZvciBhbm90aGVyIHNvbHV0aW9uLiBFdmVuIGEgc3BlY2lhbA0KPiA+ID4gSU9DVExfREFY X0NMRUFSX0VSUk9SDQo+ID4gwqAtIHNlZSBhbGwgdGhlIHZlcnNpb25zIG9mIHRoaXMgc2VyaWVz IHByaW9yIHRvIHRoaXMgb25lLCB3aGVyZSB3ZQ0KPiA+IHRyeQ0KPiA+IHRvIGRvIGEgZmFsbGJh Y2suLi4NCj4gPiANCj4gQW5kPw0KPiANCj4gU28gbm93IGFsbCBPX0RJUkVDVCBBUFBzIGdvIDQg dGltZXMgc2xvd2VyLiBJIHdpbGwgaGF2ZSBhIGxvb2sgYnV0IGlmDQo+IGl0IGlzIHJlYWxseSBz byBiYWQgdGhhbiBwbGVhc2UgY29uc2lkZXIgYW4gSU9DVEwgb3Igc3lzY2FsbC4gT3IgYQ0KPiBz cGVjaWFsDQo+IE9fREFYX0VSUk9SUyBmbGFnIC4uLg0KDQpJJ20gY3VyaW91cyB3aGVyZSB0aGUg NHggc2xvd2VyIGNvbWVzIGZyb20uLiBUaGUgT19ESVJFQ1QgcGF0aCBpcyBzdGlsbA0Kd2l0aG91 dCBwYWdlLWNhY2hlIGNvcGllcywgYW5kIG5vciBkb2VzIGl0IGdvIHRocm91Z2ggcmVxdWVzdCBx dWV1ZXMNCihzaW5jZSBwbWVtIGlzIGEgYmlvLWJhc2VkIGRyaXZlcikuIFRoZSBvbmx5IG92ZXJo ZWFkIGlzIHRoYXQgb2YNCnN1Ym1pdHRpbmcgYSBiaW8gLSBhbmQgd2hpbGUgSSBhZ3JlZSBpdCBp cyBtb3JlIG92ZXJoZWFkIHRoYW4gZGF4X2RvX2lvLA0KNHggc2VlbXMgYSBiaXQgaGlnaC4NCg0K PiANCj4gUGxlYXNlIGRvIG5vdCB0cmFzaCBhbGwgdGhlIE9fRElSRUNUIHVzZXJzLCB0aGV5IGFy ZSB0aGUgbW9yZQ0KPiBpbXBvcnRhbnQNCj4gY2xpZW50cywgbGlrZSBEQnMgYW5kIFZNcy4NCg0K U2hvdWxkbid0IHRoZXkgYmUgdXNpbmcgbW1hcHMgYW5kIGRheCBmYXVsdHM/IEkgd2FzIHVuZGVy IHRoZSBpbXByZXNzaW9uDQp0aGF0IHRoZSBkYXhfZG9faW8gcGF0aCBpcyBhIG5pY2UtdG8taGF2 ZSwgYnV0IGZvciBhbnlvbmUgdGhhdCB3aWxsIHdhbnQNCnRvIHVzZSBEQVgsIHRoZXkgd2lsbCB3 YW50IHRoZSBtbWFwL2ZhdWx0IHBhdGgsIG5vdCB0aGUgSU8gcGF0aC4gVGhpcyBpcw0KanVzdCBt YWtpbmcgdGhlIElPIHBhdGggJ21vcmUgY29ycmVjdCcgYnkgYWxsb3dpbmcgaXQgYSB3YXkgdG8g ZGVhbCB3aXRoDQplcnJvcnMuDQoNCj4gDQo+IFRoYW5rcw0KPiBCb2F6DQo+IA0KPiA+IA0KPiA+ ID4gDQo+ID4gPiANCj4gPiA+IFsqImxlc3MgY29uY3VycmVudCIgYmVjYXVzZSBvZiB0aGUgcXVl dWluZyBkb25lIGluIGJkZXYuIE5vdGUgaG93DQo+ID4gPiDCoCBwbWVtIGlzIG5vdCBldmVuIG11 bHRpLXF1ZXVlLCBhbmQgZXZlbiBpZiBpdCB3YXMgaXQgd2lsbCBiZSBtdWNoDQo+ID4gPiDCoCBz bG93ZXIgdGhlbiBEQVggYmVjYXVzZSBvZiB0aGUgY29kZSBkZXB0aCBhbmQgYWxsIHRoZSBsb2Nr cyBhbmQNCj4gPiA+IHRhc2sNCj4gPiA+IMKgIHN3aXRjaGVzIGRvbmUgaW4gdGhlIGJsb2NrIGxh eWVyLiBJbiBEQVggdGhlIGZpbmFsIG1lbWNweSBpcw0KPiA+ID4gZG9uZQ0KPiA+ID4gZGlyZWN0 bHkNCj4gPiA+IMKgIG9uIHRoZSB1c2VyLW1vZGUgdGhyZWFkXQ0KPiA+ID4gDQo+ID4gPiBUaGFu a3MNCj4gPiA+IEJvYXoNCj4gPiA+IA== From boaz@plexistor.com Mon May 2 14:22:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 444E47CE8 for ; Mon, 2 May 2016 14:22:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A7CB304032 for ; Mon, 2 May 2016 12:22:16 -0700 (PDT) X-ASG-Debug-ID: 1462216933-04cbb00fe74035c0001-NocioJ Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by cuda.sgi.com with ESMTP id Ds40vqF3zL4XwnnZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 12:22:13 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Apparent-Source-IP: 74.125.82.54 Received: by mail-wm0-f54.google.com with SMTP id a17so2462850wme.0 for ; Mon, 02 May 2016 12:22:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=PBiKLlvLexxJ7cWCyuhIbFuzAd5aT3unJu7fEYZSpEY=; b=OdY7wNsCysH9zi5G+CXy3fJQIHTHNRXkMBcGlZNzhbj2FPrnbXYzdQf4rBKA6ktRar XMqk1X3KQjQMWnCVJ19mzKFZv71kNa3dxc2r3dSqyuf3nvMF8RheJRDIfGWxziL72Xj9 TQ0xDXLoTTG1/4YAe7CkIVAfn0vddfcXKkpJxv6DZ2HW7gyeVRVuHZ3G5uIhAzS4CFEp Xofm3SvxY/MVGJnzSQxlO7AndTkFK60J4EHox54Xjj1stl/oYQ1pMBbWd6R2CtBQRdpO Uu6HfAI3eJt0bHofRxwbzDkXwAGquCDWv/AXWSK21EpAwV1t3wFqSyoJwLlVpb+eQBVk MbYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=PBiKLlvLexxJ7cWCyuhIbFuzAd5aT3unJu7fEYZSpEY=; b=Z3PDlWpKDO8fQfKb5wD2LCnTOdu3SHoiyvFMbMmfvD8qhVZ/PZl7VoWknap2SBdp/C zKdoHy9Ll0vBd6cYQ3h8Lxm6cXJzIW7SzFuN8qoPL1YYlF4SaI+X6O4cEypDXhZX7aVd IYnh8/Dnd0yIlgopYMECmJXsrKjjZkoPSaYmiYS79BsdWoTDJHLOke/bm1jp6QpcMxPe TFy5qsrSbvaS6k7YTZifrHbjFd+VFwUH8tQs7t4P9qcqSl9yNI9jl4v75PgWtmFDf6YX BnLeknrCJ8QphFZ1pyPeAUGmv87gmXphnvOoDBmmO0qG8k6FfyabVvTxEnBA2oH9Wlz0 8jiQ== X-Gm-Message-State: AOPr4FWFCB8kCmUoJsemLiFTDOtWr+UpQ+T4UBBg9BtfEhq1U/4reNPVgfsdPuiVOF6SSg== X-Received: by 10.194.89.38 with SMTP id bl6mr37007399wjb.44.1462216932758; Mon, 02 May 2016 12:22:12 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id jr8sm31973135wjb.15.2016.05.02.12.22.10 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 02 May 2016 12:22:12 -0700 (PDT) Message-ID: <5727A8E2.8000507@plexistor.com> Date: Mon, 02 May 2016 22:22:10 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dan Williams CC: Vishal Verma , "linux-nvdimm@lists.01.org" , linux-block@vger.kernel.org, Jan Kara , Matthew Wilcox , Dave Chinner , "linux-kernel@vger.kernel.org" , XFS Developers , Jens Axboe , Linux MM , Al Viro , Christoph Hellwig , linux-fsdevel , Andrew Morton , linux-ext4 Subject: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> <5727753F.6090104@plexistor.com> <57277EDA.9000803@plexistor.com> <572791E1.7000103@plexistor.com> <57279D57.5020800@plexistor.com> X-ASG-Orig-Subj: Re: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Start-Time: 1462216933 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1441 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/02/2016 09:48 PM, Dan Williams wrote: <> >> And then it keeps broken the aligned buffered writes, which are still >> broken after this set. > > ...identical to the current situation with a traditional disk. > Not true!! please see what I wrote "aligned buffered writes" If there are no reads involved then there are no errors returned to application. >> I have by now read the v2 patches. And I think you guys did not yet try >> the proper fix for dax_do_io. I think you need to go deeper into the loops >> and selectively call bdev_* when error on a specific page copy. No need to >> go through direct_IO path at all. > > We still reach a point where the minimum granularity of > bdev_direct_access() is larger than a sector, so you end up still > needing to have the application understand how to send a properly > aligned I/O. The semantics of how to send a properly aligned > direct-I/O are already well understood, so we simply reuse that path. > You are making a mountain out of a mouse. The simple copy of a file from start (offset ZERO) to end-of-file which is the most common usage on earth is perfectly aligned and needs not any O_DIRECT and is what is used everywhere. >> Do you need that I send you a patch to demonstrate what I mean? > > I remain skeptical of what you are proposing, but yes, a patch has a > better chance to move the discussion forward. > Sigh! OK Boaz From david@fromorbit.com Mon May 2 18:05:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EEE6D7CE1 for ; Mon, 2 May 2016 18:05:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2CC6304032 for ; Mon, 2 May 2016 16:05:02 -0700 (PDT) X-ASG-Debug-ID: 1462230297-04cbb00fe740c130001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id zUMQ1JBcHZU3ZRPR for ; Mon, 02 May 2016 16:04:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DgDQA73CdXPMPVLHlegziBUIJzg3medwEGjBaFbIQThgoCAgEBAoE2TQEBAQEBAQcBAQEBQkBBDgGDcQEBAQMBMgEjHgUFCwgDDgQGCSUPBSUDBwYUExuIBwe7QwwBHRmFQIQSgQKEBiOFagWHdIVjgTKJC4ZrhyOBcYd2hTRFhV+JDYJiBRuBXSowgmuEX4E9AQEB Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 03 May 2016 08:34:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1axMt4-0007GN-7O; Tue, 03 May 2016 09:04:22 +1000 Date: Tue, 3 May 2016 09:04:22 +1000 From: Dave Chinner To: Jeff Moyer Cc: "Dan J. Williams" , "Verma, Vishal L" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160502230422.GQ26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1462230297 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10715 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, May 02, 2016 at 11:18:36AM -0400, Jeff Moyer wrote: > Dave Chinner writes: > > > On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: > >> On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > > You're assuming that only the DAX aware application accesses it's > > files. users, backup programs, data replicators, fileystem > > re-organisers (e.g. defragmenters) etc all may access the files and > > they may throw errors. What then? > > I'm not sure how this is any different from regular storage. If an > application gets EIO, it's up to the app to decide what to do with that. Sure - they'll fail. But the question I'm asking is that if the application that owns the data is supposed to do error recovery, what happens when a 3rd party application hits an error? If that consumes the error, the the app that owns the data won't ever get a chance to correct the error. This is a minefield - a 3rd party app that swallows and clears DAX based IO errors is a data corruption vector. can yo imagine if *grep* did this? The model that is being promoted here effectively allows this sort of behaviour - I don't really think we should be architecting an error recovery strategy that has the capability to go this wrong.... > >> > Where does the application find the data that was lost to be able to > >> > rewrite it? > >> > >> The data that was lost is gone -- this assumes the application has some > >> ability to recover using a journal/log or other redundancy - yes, at the > >> application layer. If it doesn't have this sort of capability, the only > >> option is to restore files from a backup/mirror. > > > > So the architecture has a built in assumption that only userspace > > can handle data loss? > > Remember that the proposed programming model completely bypasses the > kernel, so yes, it is expected that user-space will have to deal with > the problem. No, it doesn't completely bypass the kernel - the kernel is the infrastructure that catches the errors in the first place, and it owns and controls all the metadata that corresponds to the physical location of that error. The only thing the kernel doesn't own is the *contents* of that location. > > What about filesytsems like NOVA, that use log structured design to > > provide DAX w/ update atomicity and can potentially also provide > > redundancy/repair through the same mechanisms? Won't pmem native > > filesystems with built in data protection features like this remove > > the need for adding all this to userspace applications? > > I don't think we'll /only/ support NOVA for pmem. So we'll have to deal > with this for existing file systems, right? Yes, but that misses my point that it seems that the design is only focussed on userspace and existing filesystems and there is no consideration of kernel side functionality that could do transparent recovery.... > > If so, shouldn't that be the focus of development rahter than > > placing the burden on userspace apps to handle storage repair > > situations? > > It really depends on the programming model. In the model Vishal is > talking about, either the applications themselves or the libraries they > link to are expected to implement the redundancies where necessary. IOWs, filesystems no longer have any control over data integrity. Yet it's the filesystem developers who will still be responsible for data integrity and when the filesystem has a data coruption event we'll get blamed and the filesystem gets a bad name, even though it's entirely the applications fault. We've seen this time and time again - application developers cannot be trusted to guarantee data integrity. yes, some apps will be fine, but do you really expect application devs that refuse to use fsync because it's too slow are going to have a different approach to integrity when it comes to DAX? > >> > There's an implicit assumption that applications will keep redundant > >> > copies of their data at the /application layer/ and be able to > >> > automatically repair it? > > That's one way to do things. It really depends on the application what > it will do for recovery. > > >> > And then there's the implicit assumption that it will unlink and > >> > free the entire file before writing a new copy > > I think Vishal was referring to restoring from backup. cp itself will > truncate the file before overwriting, iirc. Which version of cp? what happens if they use --sparse and the error is in a zeroed region? There's so many assumptions about undefined userspace environment, application and user behaviour being made here, and it's all being handwaved away. I'm asking for this to be defined, demonstrated and documented as a working model that cannot be abused and doesn't have holes the size of trucks in it, not handwaving... > >> To summarize, the two cases we want to handle are: > >> 1. Application has inbuilt recovery: > >> - hits badblock > >> - figures out it is able to recover the data > >> - handles SIGBUS or EIO > >> - does a (sector aligned) write() to restore the data > > > > The "figures out" step here is where >95% of the work we'd have to > > do is. And that's in filesystem and block layer code, not > > userspace, and userspace can't do that work in a signal handler. > > And it can still fall down to the second case when the application > > doesn't have another copy of the data somewhere. > > I read that "figures out" step as the application determining whether or > not it had a redundant copy. Another undocumented assumption, that doesn't simplify what needs to be done. Indeed, userspace can't do that until it is in SIGBUS context, which tends to imply applications need to do a major amount of work from within the signal handler.... > > FWIW, we don't have a DAX enabled filesystem that can do > > reverse block mapping, so we're a year or two away from this being a > > workable production solution from the filesystem perspective. And > > AFAICT, it's not even on the roadmap for dm/md layers. > > Do we even need that? What if we added an FIEMAP flag for determining > bad blocks. So you're assuming that the filesystem has been informed of the bad blocks and has already marked the bad regions of the file in it's extent list? How does that happen? What mechanism is used for the underlying block device to inform the filesytem that theirs a bad LBA, and how does the filesytem the map that to a path/file/offset with reverse mapping? Or is there some other magic that hasn't been explained happening here? > The file system could simply walk the list of extents for > the file and check the corresponding disk blocks. No reverse mapping > required. You're expecting the filesystem to poll the block device to find bad sectors? Ignoring the fact this is the sort of brute force scan we need reverse mapping to avoid, how does the filesystem know what file/extent list it should be searching when the block device informs it there is a bad sector somewhere? i.e. what information does the MCE convey to the block device, and what does the block device pass to the filesytem so the filesystem can do one of these scans? If the block device is only passing LBAs or a generic "new bad block has been found" message, the filesystem still has to do an full scan of it's metadata to find the owner of the LBA(s) that have gone bad.... Nobody is explaining these important little details - there seems to be an assumption that everyone "knows" how this is all going to work and that we have infrastructure that can make it work. Just because we might be able to present bad block information to userspace via FIEMAP doesn't mean that it's trivial to implement. THE FIEMAP flag is trivial - connecting the dots is the hard part and nobody is explaining to me how that is all supposed to be done. > Also note that DM/MD don't support direct_access(), either, > so I don't think they're relevant for this discussion. But they could for linear concatenation, which would be extremely useful. e.g. stitching per-node non-linear pmem into a single linear LBA range.... > >> 2. Application doesn't have any inbuilt recovery mechanism > >> - hits badblock > >> - gets SIGBUS (or EIO) and crashes > >> - Sysadmin restores file from backup > > > > Which is no different to an existing non-DAX application getting an > > EIO/sigbus from current storage technologies. > > > > Except: in the existing storage stack, redundancy and correction has > > already had to have failed for the application to see such an error. > > Hence this is normally considered a DR case as there's had to be > > cascading failures (e.g. multiple disk failures in a RAID) to get > > to this stage, not a single error in a single sector in > > non-redundant storage. > > > > We need some form of redundancy and correction in the PMEM stack to > > prevent single sector errors from taking down services until an > > administrator can correct the problem. I'm trying to understand > > where this is supposed to fit into the picture - at this point I > > really don't think userspace applications are going to be able to do > > this reliably.... > > Not all storage is configured into a RAID volume, and in some instances, > the application is better positioned to recover the data (gluster/ceph, > for example). Right, but they still rely on the filesystem to provide data integrity guarantees to work correctly. While they have "node level" redundancy, operations within the node still need to work correctly and so they'd still need all the kernel/fs side functionality to provide them with error information (like fiemap bad blocks) on top of all the new error detectiona nd correction code they'd need to support this... FWIW, the whole point of DAX on existing filesystems was to not need major changes to existing filesystems to support fast pmem operations. i.e. to get something working quickly while pmem native filesytems are developed to support pmem and all it's quirks in a clean and efficient manner. Instead, what I'm seeing now is a trend towards forcing existing filesystems to support the requirements and quirks of DAX and pmem, without any focus on pmem native solutions. i.e. I'm hearing "we need major surgery to existing filesystems and block devices to make DAX work" rather than "how do we make this efficient for a pmem native solution rather than being bound to block device semantics"? Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon May 2 18:05:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 956A27CED for ; Mon, 2 May 2016 18:05:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B36D8F8037 for ; Mon, 2 May 2016 16:05:33 -0700 (PDT) X-ASG-Debug-ID: 1462230330-04cb6c09a1433da0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3WH8U1b0Weu3PpRm for ; Mon, 02 May 2016 16:05:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 607BD545 for ; Mon, 2 May 2016 18:05:30 -0500 (CDT) Subject: Re: [PATCH 00/19 v2] mkfs cleaning To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/19 v2] mkfs cleaning References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <47106ab4-d20b-f50b-3ee0-546cf4abd9b4@sandeen.net> Date: Mon, 2 May 2016 18:05:29 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230330 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 500 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Ok, this is going to be the weirdest review ever. ;) For the first 15 (which match Dave's original 15): Reviwed-by: Eric Sandeen ... with the several fixup patches I'm about to send. Dave, I'll have short commitlog explanations of each incremental patch, you can probably combine them prior to application & commit. Jan, if you have an issue with any of them, speak now. :) I'll do final review of 16->19 after we get through this batch. Thanks, -Eric From sandeen@sandeen.net Mon May 2 18:06:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A55B7CF1 for ; Mon, 2 May 2016 18:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4E558F8035 for ; Mon, 2 May 2016 16:06:50 -0700 (PDT) X-ASG-Debug-ID: 1462230409-04cbb00fe940c2b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BwA8KkLGt8WcWSP0 for ; Mon, 02 May 2016 16:06:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0B92F545 for ; Mon, 2 May 2016 18:06:49 -0500 (CDT) Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-4-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <295ccd50-c22e-59d0-71d9-b07b438f63cd@sandeen.net> Date: Mon, 2 May 2016 18:06:48 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-4-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230409 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 871 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Patch 03/19 fixup: sb_feat.dirftype should be initialized as true, not initialized as false and then reset to 1 (sic - true) Eric Sandeen : Properly initialize sb_feat.dirftype --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 963545b..655b3c0 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1090,7 +1090,7 @@ main( .lazy_sb_counters = true, .projid16bit = false, .crcs_enabled = true, - .dirftype = false, + .dirftype = true, .parent_pointers = false, }; @@ -1109,7 +1109,6 @@ main( liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0; loginternal = 1; logagno = logblocks = rtblocks = rtextblocks = 0; - sb_feat.dirftype = 1; /* inode type information in the dir */ Nflag = nlflag = nsflag = nvflag = 0; nftype = 0; dirblocklog = dirblocksize = 0; From sandeen@sandeen.net Mon May 2 18:08:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A4CFC7CF4 for ; Mon, 2 May 2016 18:08:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45316304039 for ; Mon, 2 May 2016 16:08:21 -0700 (PDT) X-ASG-Debug-ID: 1462230499-04bdf0358e433150001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Y0rgxtCN9e4qNAcq for ; Mon, 02 May 2016 16:08:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F1259545 for ; Mon, 2 May 2016 18:08:18 -0500 (CDT) Subject: Re: [PATCH 08/19] mkfs: getbool is redundant To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/19] mkfs: getbool is redundant References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-9-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: Date: Mon, 2 May 2016 18:08:18 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-9-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230499 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2030 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Remove manpage changes, tidy others Tidy up the grammar a little in the boolean args description. Remove extra text around the noalign option. It's fine that the noalign option now takes an optional boolean 0/1 argument, but I don't think we need to document it in the manpage. If someone happens to add "=1" and it works, they'll just be pleasantly surprised. Eric Sandeen : manpage tidiness --- diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index be3d1a0..980b0e1 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -119,7 +119,7 @@ option first needs to be added to the command line. Failure to specify the size of the units will result in illegal value errors when parameters are quantified in those units. .PP -Many options allows for optional argument of value 0 or 1, to explicitly +Many feature options allow an optional argument of 0 or 1, to explicitly disable or enable the functionality. .SH OPTIONS .TP @@ -315,12 +315,10 @@ and .B swidth values. .TP -.BI noalign[= value ] -If the -.I value -is 1, this option disables automatic geometry detection and creates the filesystem +.BI noalign +This option disables automatic geometry detection and creates the filesystem without stripe geometry alignment even if the underlying storage device provides -this information. 0 disables this option, that is, enables automatic detection. +this information. .RE .TP .B \-f @@ -810,11 +808,9 @@ This suboption is only needed if the real-time section of the filesystem should occupy less space than the size of the partition or logical volume containing the section. .TP -.BI noalign[= value ] -If the -.I value -is 1, then the option disables stripe size detection, enforcing a realtime -device with no stripe geometry. 0 will enable stripe size detection. +.BI noalign +This option disables stripe size detection, enforcing a realtime device with no +stripe geometry. .RE .TP .BI \-s " sector_size" From sandeen@sandeen.net Mon May 2 18:09:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 35FF37CF8 for ; Mon, 2 May 2016 18:09:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0BDBAC003 for ; Mon, 2 May 2016 16:09:42 -0700 (PDT) X-ASG-Debug-ID: 1462230580-04cb6c09a3433ef0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Hy7oiU8omTKT4o48 for ; Mon, 02 May 2016 16:09:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A52A1545 for ; Mon, 2 May 2016 18:09:40 -0500 (CDT) Subject: Re: [PATCH 11/19] mkfs: table based parsing for converted parameters To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/19] mkfs: table based parsing for converted parameters References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-12-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <40f1a322-bbd4-5da3-dc02-ac68122d404a@sandeen.net> Date: Mon, 2 May 2016 18:09:40 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-12-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230580 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 689 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The kernel enforces a max of XLOG_MAX_RECORD_BSIZE, and it should match the limits in L_SUNIT after all ... Eric Sandeen : fix min/max for "-l su" --- su and sunit are ultimately setting the same parameter; their limits should be the same. diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 0d28a84..3ffae42 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -395,8 +395,8 @@ struct opt_params lopts = { }, { .index = L_SU, .convert = true, - .minval = 0, - .maxval = UINT_MAX, + .minval = XLOG_MIN_RECORD_BSIZE, + .maxval = XLOG_MAX_RECORD_BSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, From sandeen@sandeen.net Mon May 2 18:11:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E5C97CFD for ; Mon, 2 May 2016 18:11:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 049BE8F8037 for ; Mon, 2 May 2016 16:11:03 -0700 (PDT) X-ASG-Debug-ID: 1462230662-04bdf0358f4331f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UNW6nPteApAbZzx7 for ; Mon, 02 May 2016 16:11:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EB2A6545 for ; Mon, 2 May 2016 18:11:01 -0500 (CDT) Subject: Re: [PATCH 13/19] mkfs: encode conflicts into parsing table To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 13/19] mkfs: encode conflicts into parsing table References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-14-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <220fc3b5-6c26-52c9-a56e-8fa717d92cde@sandeen.net> Date: Mon, 2 May 2016 18:11:01 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-14-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230662 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 587 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Remove now-encoded conflict under case L_FILE The .conflicts handle this now, no need to keep it around. Eric Sandeen : remove explicit L_FILE conflict --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 03d3c06..cdc81a9 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1867,9 +1867,6 @@ main( case L_FILE: xi.lisfile = getnum(value, &lopts, L_FILE); - if (xi.lisfile && loginternal) - conflict('l', subopts, L_INTERNAL, - L_FILE); if (xi.lisfile) xi.lcreat = 1; break; From sandeen@sandeen.net Mon May 2 18:11:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC4707D06 for ; Mon, 2 May 2016 18:11:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2882304032 for ; Mon, 2 May 2016 16:11:44 -0700 (PDT) X-ASG-Debug-ID: 1462230702-04bdf03590433230001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id gwW5zSu9NoTvLA70 for ; Mon, 02 May 2016 16:11:42 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4D7C5545 for ; Mon, 2 May 2016 18:11:42 -0500 (CDT) Subject: Re: [PATCH 14/19] mkfs: add string options to generic parsing To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 14/19] mkfs: add string options to generic parsing References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-15-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <8145c82c-400a-c6f6-ee16-eda073fe7c4f@sandeen.net> Date: Mon, 2 May 2016 18:11:41 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-15-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230702 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 605 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words fix alignment on two-line logic statement; align 2nd line with first conditional, not tabbed in. Eric Sandeen : whitespace fixup diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4186e98..f14fdff 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1520,7 +1520,7 @@ check_opt( if (conflict_opt == LAST_CONFLICT) break; if (opts->subopt_params[conflict_opt].seen || - opts->subopt_params[conflict_opt].str_seen) + opts->subopt_params[conflict_opt].str_seen) conflict(opts->name, (char **)opts->subopts, conflict_opt, index); } From sandeen@sandeen.net Mon May 2 18:13:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 45F837D03 for ; Mon, 2 May 2016 18:13:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED33C8F8033 for ; Mon, 2 May 2016 16:13:41 -0700 (PDT) X-ASG-Debug-ID: 1462230819-04bdf035904332b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KAMngGluIGGZYOUj for ; Mon, 02 May 2016 16:13:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 94FB6545 for ; Mon, 2 May 2016 18:13:39 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-16-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <4b05741c-cc35-2a38-be92-287c216423be@sandeen.net> Date: Mon, 2 May 2016 18:13:39 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461231593-31294-16-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1462230819 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1884 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add const to other copy of check_overwrite Move "no mkfs target" check to a higher, more obvious location Do not truncate file unless it needs to be grown to full fs (as in Jan's v2) Eric Sandeen : move check for no mkfs target Eric Sandeen : other minor fixes --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index ec24884..1643289 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -951,7 +951,7 @@ out_free_probe: access are not working! static int check_overwrite( - char *device) + const char *device) { return 1; } @@ -1037,10 +1037,6 @@ check_device_type( usage(); } - if (name == NULL) { - usage(); - } - if (stat64(name, &statbuf)) { if (errno == ENOENT && *isfile) { if (create) @@ -2218,6 +2214,11 @@ main( } else dfile = xi.dname; + if (!dfile) { + fprintf(stderr, _("no device name given in argument list\n")); + usage(); + } + /* * Blocksize and sectorsize first, other things depend on them * For RAID4/5/6 we want to align sector size and block size, @@ -3127,13 +3128,15 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), /* * If the data area is a file, then grow it out to its final size - * so that the reads for the end of the device in the mount code - * will succeed. + * if needed so that the reads for the end of the device in the mount + * code will succeed. */ - if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) < 0) { - fprintf(stderr, _("%s: Growing the data section failed\n"), - progname); - exit(1); + if (xi.disfile && xi.dsize * xi.dbsize < dblocks * blocksize) { + if (ftruncate64(xi.dfd, dblocks * blocksize) < 0) { + fprintf(stderr, _("%s: Growing the data section failed\n"), + progname); + exit(1); + } } /* From vishal.l.verma@intel.com Mon May 2 18:17:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 80DA57D0B for ; Mon, 2 May 2016 18:17:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 552F98F8033 for ; Mon, 2 May 2016 16:17:43 -0700 (PDT) X-ASG-Debug-ID: 1462231062-04cbb00fe840c570001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id tRKjivHJTxK6xenr for ; Mon, 02 May 2016 16:17:42 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.120] X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP; 02 May 2016 16:17:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,569,1455004800"; d="scan'208";a="944767160" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga001.jf.intel.com with ESMTP; 02 May 2016 16:17:24 -0700 Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 2 May 2016 16:17:22 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx122.amr.corp.intel.com ([169.254.1.58]) with mapi id 14.03.0248.002; Mon, 2 May 2016 16:17:21 -0700 From: "Verma, Vishal L" To: "david@fromorbit.com" , "jmoyer@redhat.com" CC: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "Williams, Dan J" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlzGOmdVyB28MyEyyQ/rUxU8Y+Z+T1f2AgASHRwCAAoNZAIAAkjsAgABnuwCAAAeVgIAADaqAgAntpViAAPdsAIAAA5KA Date: Mon, 2 May 2016 23:17:21 +0000 Message-ID: <1462231029.1421.82.camel@intel.com> References: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> <20160502230422.GQ26977@dastard> In-Reply-To: <20160502230422.GQ26977@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.112.171] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1462231062 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1940 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gVHVlLCAyMDE2LTA1LTAzIGF0IDA5OjA0ICsxMDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ IE9uIE1vbiwgTWF5IDAyLCAyMDE2IGF0IDExOjE4OjM2QU0gLTA0MDAsIEplZmYgTW95ZXIgd3Jv dGU6DQo+ID4gDQo+ID4gRGF2ZSBDaGlubmVyIDxkYXZpZEBmcm9tb3JiaXQuY29tPiB3cml0ZXM6 DQo+ID4gDQo+ID4gPiANCj4gPiA+IE9uIE1vbiwgQXByIDI1LCAyMDE2IGF0IDExOjUzOjEzUE0g KzAwMDAsIFZlcm1hLCBWaXNoYWwgTCB3cm90ZToNCj4gPiA+ID4gDQo+ID4gPiA+IE9uIFR1ZSwg MjAxNi0wNC0yNiBhdCAwOToyNSArMTAwMCwgRGF2ZSBDaGlubmVyIHdyb3RlOg0KPiA+ID4gWW91 J3JlIGFzc3VtaW5nIHRoYXQgb25seSB0aGUgREFYIGF3YXJlIGFwcGxpY2F0aW9uIGFjY2Vzc2Vz IGl0J3MNCj4gPiA+IGZpbGVzLsKgwqB1c2VycywgYmFja3VwIHByb2dyYW1zLCBkYXRhIHJlcGxp Y2F0b3JzLCBmaWxleXN0ZW0NCj4gPiA+IHJlLW9yZ2FuaXNlcnMgKGUuZy7CoMKgZGVmcmFnbWVu dGVycykgZXRjIGFsbCBtYXkgYWNjZXNzIHRoZSBmaWxlcw0KPiA+ID4gYW5kDQo+ID4gPiB0aGV5 IG1heSB0aHJvdyBlcnJvcnMuIFdoYXQgdGhlbj8NCj4gPiBJJ20gbm90IHN1cmUgaG93IHRoaXMg aXMgYW55IGRpZmZlcmVudCBmcm9tIHJlZ3VsYXIgc3RvcmFnZS7CoMKgSWYgYW4NCj4gPiBhcHBs aWNhdGlvbiBnZXRzIEVJTywgaXQncyB1cCB0byB0aGUgYXBwIHRvIGRlY2lkZSB3aGF0IHRvIGRv IHdpdGgNCj4gPiB0aGF0Lg0KPiBTdXJlIC0gdGhleSdsbCBmYWlsLiBCdXQgdGhlIHF1ZXN0aW9u IEknbSBhc2tpbmcgaXMgdGhhdCBpZiB0aGUNCj4gYXBwbGljYXRpb24gdGhhdCBvd25zIHRoZSBk YXRhIGlzIHN1cHBvc2VkIHRvIGRvIGVycm9yIHJlY292ZXJ5LA0KPiB3aGF0IGhhcHBlbnMgd2hl biBhIDNyZCBwYXJ0eSBhcHBsaWNhdGlvbiBoaXRzIGFuIGVycm9yPyBJZiB0aGF0DQo+IGNvbnN1 bWVzIHRoZSBlcnJvciwgdGhlIHRoZSBhcHAgdGhhdCBvd25zIHRoZSBkYXRhIHdvbid0IGV2ZXIg Z2V0IGENCj4gY2hhbmNlIHRvIGNvcnJlY3QgdGhlIGVycm9yLg0KPiANCj4gVGhpcyBpcyBhIG1p bmVmaWVsZCAtIGEgM3JkIHBhcnR5IGFwcCB0aGF0IHN3YWxsb3dzIGFuZCBjbGVhcnMgREFYDQo+ IGJhc2VkIElPIGVycm9ycyBpcyBhIGRhdGEgY29ycnVwdGlvbiB2ZWN0b3IuIGNhbiB5byBpbWFn aW5lIGlmDQo+ICpncmVwKiBkaWQgdGhpcz8gVGhlIG1vZGVsIHRoYXQgaXMgYmVpbmcgcHJvbW90 ZWQgaGVyZSBlZmZlY3RpdmVseQ0KPiBhbGxvd3MgdGhpcyBzb3J0IG9mIGJlaGF2aW91ciAtIEkg ZG9uJ3QgcmVhbGx5IHRoaW5rIHdlDQo+IHNob3VsZCBiZSBhcmNoaXRlY3RpbmcgYW4gZXJyb3Ig cmVjb3Zlcnkgc3RyYXRlZ3kgdGhhdCBoYXMgdGhlDQo+IGNhcGFiaWxpdHkgdG8gZ28gdGhpcyB3 cm9uZy4uLi4NCj4gDQoNCkp1c3QgdG8gYWRkcmVzcyB0aGlzIGJpdCAtIE5vLiBBbnkgbnVtYmVy IG9mIGJhY2t1cC8zcmQgcGFydHkNCmFwcGxpY2F0aW9uIGNhbiBoaXQgdGhlIGVycm9yIGFuZCBf ZmFpbF8gYnV0IHN1cmVseSB0aGV5IHdvbid0IHRyeSB0bw0KX3dyaXRlXyB0aGUgYmFkIGxvY2F0 aW9uPyBPbmx5IGEgd3JpdGUgdG8gdGhlIGJhZCBzZWN0b3Igd2lsbCBjbGVhciBpdA0KaW4gdGhp cyBtb2RlbCAtIGFuZCB1bnRpbCBzdWNoIHRpbWUsIGFsbCByZWFkcyB3aWxsIGp1c3Qga2VlcCBl cnJvcmluZw0Kb3V0LiBUaGlzIHdvcmtzIGZvciBEQVgvbW1hcCBiYXNlZCByZWFkcy93cml0ZXMg dG9vIC0gbW1hcC1zdG9yZXMNCndvbid0L2Nhbid0IGNsZWFyIGVycm9ycyAtIHlvdSBoYXZlIHRv IGdvIHRocm91Z2ggdGhlIGJsb2NrIHBhdGgsIGFuZCBpbg0KdGhlIGFsdGVzdCB2ZXJzaW9uIG9m IG15IHBhdGNoIHNldCwgdGhhdCBoYXMgdG8gYmUgZXhwbGljaXRseSB0aHJvdWdoDQpPX0RJUkVD VC4= From dan.j.williams@intel.com Mon May 2 18:25:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C7EFC7D11 for ; Mon, 2 May 2016 18:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38EE6AC001 for ; Mon, 2 May 2016 16:25:55 -0700 (PDT) X-ASG-Debug-ID: 1462231551-04cb6c09a24346c0001-NocioJ Received: from mail-ob0-f173.google.com (mail-ob0-f173.google.com [209.85.214.173]) by cuda.sgi.com with ESMTP id WuKGPxOf8mgFs8n9 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 02 May 2016 16:25:52 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-ob0-f173.google.com[209.85.214.173] X-Barracuda-Apparent-Source-IP: 209.85.214.173 Received: by mail-ob0-f173.google.com with SMTP id x1so1123204obt.0 for ; Mon, 02 May 2016 16:25:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=YM3/QPa+4nSIINrFb8of3mWetXlL8EtkFjGLJCDYtVo=; b=IwUH0iduBM5K5NoS5Q3AjibGamGOARPNuy/yKXrR1QC5W3V6MIITF+jKgzBS4lw4WM dy1gGx3nO4J75kvO+Mzb3MBUho/LhpNvGrPrKyzvuipJbjWJ+7Pc5ThsnwcvW25wrUE6 qs69peavTIiEVM69NNbB2p8d0p5qf0bzJ7Z6X8DaE+GnyYR3xyQksVOtGP78HA2AwjB7 DwDinACsp3LQ3rI0qC8XrNsqyfmRs5IxU+a95jtQ7ifBAZtlR8hVXT3LZz+TF9BVR0wJ Ex8KvMg2FwB8ajfCimRU6QooGlrS7zdWgKAKyAT2fx+rZGrrFCowURBabIRV67Xj/8RF JPSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=YM3/QPa+4nSIINrFb8of3mWetXlL8EtkFjGLJCDYtVo=; b=keQvno6K34VR0tp4hkO53qyPb2iJzTMGhCGKlWM4vH20MjtRhEdKIgwdm/YB7hD67e LDjEMYpiWOb3si941018MrptoXPV2bbM8jf6v257TUJQfPjgkOECUd78pAG3HNgTprWW i/JACOFSLzTxzt+HB9vWoCmdvxha52b6yEF1xyhPlOgJqUHuzcn08Bljtqwf3iIFxMms 47qVdg5AjgO9NKC/uaLBFNTkw3bH12tHxnEQC15x4L9C5bNCc/TTg8G7vApObqWdwd5J esbXfND1YJOVBSt7p6ePGqF8ufUjRQqN91TRtzfQNX95xqTRh0DG2V4AJEqobukxNJ/H CQdg== X-Gm-Message-State: AOPr4FXVVgyK/Z1JQq4DpeEHkXjTAYIL5y/UUlTjy7rPJuteqSgc6Hex6a2mYA8+nF8dpsIeA2iBGe5KMTtYRgiK MIME-Version: 1.0 X-Received: by 10.182.157.37 with SMTP id wj5mr16115918obb.71.1462231551527; Mon, 02 May 2016 16:25:51 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 2 May 2016 16:25:51 -0700 (PDT) In-Reply-To: <20160502230422.GQ26977@dastard> References: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> <20160502230422.GQ26977@dastard> Date: Mon, 2 May 2016 16:25:51 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner Cc: Jeff Moyer , "Verma, Vishal L" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f173.google.com[209.85.214.173] X-Barracuda-Start-Time: 1462231552 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8328 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, May 2, 2016 at 4:04 PM, Dave Chinner wrote: > On Mon, May 02, 2016 at 11:18:36AM -0400, Jeff Moyer wrote: >> Dave Chinner writes: >> >> > On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: >> >> On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: >> > You're assuming that only the DAX aware application accesses it's >> > files. users, backup programs, data replicators, fileystem >> > re-organisers (e.g. defragmenters) etc all may access the files and >> > they may throw errors. What then? >> >> I'm not sure how this is any different from regular storage. If an >> application gets EIO, it's up to the app to decide what to do with that. > > Sure - they'll fail. But the question I'm asking is that if the > application that owns the data is supposed to do error recovery, > what happens when a 3rd party application hits an error? If that > consumes the error, the the app that owns the data won't ever get a > chance to correct the error. > > This is a minefield - a 3rd party app that swallows and clears DAX > based IO errors is a data corruption vector. can yo imagine if > *grep* did this? The model that is being promoted here effectively > allows this sort of behaviour - I don't really think we > should be architecting an error recovery strategy that has the > capability to go this wrong.... Since when does grep write to a file on error? > >> >> > Where does the application find the data that was lost to be able to >> >> > rewrite it? >> >> >> >> The data that was lost is gone -- this assumes the application has some >> >> ability to recover using a journal/log or other redundancy - yes, at the >> >> application layer. If it doesn't have this sort of capability, the only >> >> option is to restore files from a backup/mirror. >> > >> > So the architecture has a built in assumption that only userspace >> > can handle data loss? >> >> Remember that the proposed programming model completely bypasses the >> kernel, so yes, it is expected that user-space will have to deal with >> the problem. > > No, it doesn't completely bypass the kernel - the kernel is the > infrastructure that catches the errors in the first place, and it > owns and controls all the metadata that corresponds to the physical > location of that error. The only thing the kernel doesn't own is the > *contents* of that location. > >> > What about filesytsems like NOVA, that use log structured design to >> > provide DAX w/ update atomicity and can potentially also provide >> > redundancy/repair through the same mechanisms? Won't pmem native >> > filesystems with built in data protection features like this remove >> > the need for adding all this to userspace applications? >> >> I don't think we'll /only/ support NOVA for pmem. So we'll have to deal >> with this for existing file systems, right? > > Yes, but that misses my point that it seems that the design is only > focussed on userspace and existing filesystems and there is no > consideration of kernel side functionality that could do transparent > recovery.... > >> > If so, shouldn't that be the focus of development rahter than >> > placing the burden on userspace apps to handle storage repair >> > situations? >> >> It really depends on the programming model. In the model Vishal is >> talking about, either the applications themselves or the libraries they >> link to are expected to implement the redundancies where necessary. > > IOWs, filesystems no longer have any control over data integrity. > Yet it's the filesystem developers who will still be responsible for > data integrity and when the filesystem has a data coruption event > we'll get blamed and the filesystem gets a bad name, even though > it's entirely the applications fault. We've seen this time and time > again - application developers cannot be trusted to guarantee data > integrity. yes, some apps will be fine, but do you really expect > application devs that refuse to use fsync because it's too slow are > going to have a different approach to integrity when it comes to > DAX? Yes, completely agree. The applications that will implement competent error recovery with these mechanisms will be vanishingly small, and there is definite room for a kernel data-redundancy solution that builds on these patches. > >> >> > There's an implicit assumption that applications will keep redundant >> >> > copies of their data at the /application layer/ and be able to >> >> > automatically repair it? >> >> That's one way to do things. It really depends on the application what >> it will do for recovery. >> >> >> > And then there's the implicit assumption that it will unlink and >> >> > free the entire file before writing a new copy >> >> I think Vishal was referring to restoring from backup. cp itself will >> truncate the file before overwriting, iirc. > > Which version of cp? what happens if they use --sparse and the error > is in a zeroed region? There's so many assumptions about undefined userspace > environment, application and user behaviour being made here, and > it's all being handwaved away. > > I'm asking for this to be defined, demonstrated and documented as a > working model that cannot be abused and doesn't have holes the size > of trucks in it, not handwaving... You lost me... how are these patches abusing the existing semantics of -EIO and write to clear? >> >> To summarize, the two cases we want to handle are: >> >> 1. Application has inbuilt recovery: >> >> - hits badblock >> >> - figures out it is able to recover the data >> >> - handles SIGBUS or EIO >> >> - does a (sector aligned) write() to restore the data >> > >> > The "figures out" step here is where >95% of the work we'd have to >> > do is. And that's in filesystem and block layer code, not >> > userspace, and userspace can't do that work in a signal handler. >> > And it can still fall down to the second case when the application >> > doesn't have another copy of the data somewhere. >> >> I read that "figures out" step as the application determining whether or >> not it had a redundant copy. > > Another undocumented assumption, that doesn't simplify what needs to > be done. Indeed, userspace can't do that until it is in SIGBUS > context, which tends to imply applications need to do a major amount > of work from within the signal handler.... > >> > FWIW, we don't have a DAX enabled filesystem that can do >> > reverse block mapping, so we're a year or two away from this being a >> > workable production solution from the filesystem perspective. And >> > AFAICT, it's not even on the roadmap for dm/md layers. >> >> Do we even need that? What if we added an FIEMAP flag for determining >> bad blocks. > > So you're assuming that the filesystem has been informed of the bad > blocks and has already marked the bad regions of the file in it's > extent list? > > How does that happen? What mechanism is used for the underlying > block device to inform the filesytem that theirs a bad LBA, and how > does the filesytem the map that to a path/file/offset with reverse > mapping? Or is there some other magic that hasn't been explained > happening here? In 4.5 we added this: commit 99e6608c9e7414ae4f2168df8bf8fae3eb49e41f Author: Vishal Verma Date: Sat Jan 9 08:36:51 2016 -0800 block: Add badblock management for gendisks NVDIMM devices, which can behave more like DRAM rather than block devices, may develop bad cache lines, or 'poison'. A block device exposed by the pmem driver can then consume poison via a read (or write), and cause a machine check. On platforms without machine check recovery features, this would mean a crash. The block device maintaining a runtime list of all known sectors that have poison can directly avoid this, and also provide a path forward to enable proper handling/recovery for DAX faults on such a device. Use the new badblock management interfaces to add a badblocks list to gendisks. Signed-off-by: Vishal Verma Signed-off-by: Dan Williams From greg@kroah.com Mon May 2 18:44:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 56ECC7D16 for ; Mon, 2 May 2016 18:44:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BECF30404E for ; Mon, 2 May 2016 16:44:36 -0700 (PDT) X-ASG-Debug-ID: 1462232673-04bdf03596433e50001-NocioJ Received: from out5-smtp.messagingengine.com (out5-smtp.messagingengine.com [66.111.4.29]) by cuda.sgi.com with ESMTP id CUcCT3AKraGMEM67 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 16:44:34 -0700 (PDT) X-Barracuda-Envelope-From: greg@kroah.com X-Barracuda-Effective-Source-IP: out5-smtp.messagingengine.com[66.111.4.29] X-Barracuda-Apparent-Source-IP: 66.111.4.29 Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.nyi.internal (Postfix) with ESMTP id C1ECF20B0B for ; Mon, 2 May 2016 19:44:33 -0400 (EDT) Received: from frontend1 ([10.202.2.160]) by compute2.internal (MEProxy); Mon, 02 May 2016 19:44:33 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=smtpout; bh=VS2gcHuBP7YRWNTjp6Eh7+Wnb+8=; b=W16wf L0rFnzDofb7l48G2CtjQR2R0KrCMiT6kL7xM+TEepvkA4yXVmay7xD0Uuv1K4xht /LTdvF50eKZSiyqU5+aQHn8pbmlmhrOxbIig5KK9Y+MELizDa9IgSW89QdKwHr8x ozUcWxWK26ADC8eRVgH9zKITLa9XGQ3xOhQRLM= X-Sasl-enc: JiFrLBaxSSEqWqYvRTqN97MuyNGGzOdeMfgVLSfy/fbk 1462232673 Received: from localhost (c-50-170-35-168.hsd1.wa.comcast.net [50.170.35.168]) by mail.messagingengine.com (Postfix) with ESMTPA id 54ADCC00019; Mon, 2 May 2016 19:44:33 -0400 (EDT) Date: Mon, 2 May 2016 16:44:32 -0700 From: Greg KH To: Jan Kara Cc: stable@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner Subject: Re: XFS hole punch races Message-ID: <20160502234432.GB14806@kroah.com> X-ASG-Orig-Subj: Re: XFS hole punch races References: <20160322155740.GB28772@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160322155740.GB28772@quack.suse.cz> User-Agent: Mutt/1.6.0 (2016-04-01) X-Barracuda-Connect: out5-smtp.messagingengine.com[66.111.4.29] X-Barracuda-Start-Time: 1462232674 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 724 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Mar 22, 2016 at 04:57:40PM +0100, Jan Kara wrote: > Hi, > > similarly to ext4 also XFS had races between hole punching and page faults > which could result in data corruption. The fixes were merged in 4.1-rc1 but > it might make sense to backport them to older stable releases given the > nature of the issue. > > Relevant fixes are: > > de0e8c20ba3a65b0f15040aabbefdc1999876e6b > 075a924d45cc69c75a35f20b4912b85aa98b180a > e8e9ad42c1f1e1bfbe0e8c32c8cac02e9ebfb7ef > 0f9160b444e4de33b65dfcd3b901358a3129461a > 723cac48473358939759885a18e8df113ea96138 > ec56b1f1fdc69599963574ce94cc5693d535dd64 None of these apply to 3.14-stable, so I'm not going to worry about them :) thanks, greg k-h From david@fromorbit.com Mon May 2 19:46:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D8267CD1 for ; Mon, 2 May 2016 19:46:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1884D8F8033 for ; Mon, 2 May 2016 17:45:59 -0700 (PDT) X-ASG-Debug-ID: 1462236355-04bdf03596435010001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4mPqoDq4Lm4UrbJO for ; Mon, 02 May 2016 17:45:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CEBwDq8ydXPMPVLHlegzhTfaVoBowWhWyEEySFZgICAQECgTZNAQEBAQEBBwEBAQFCQIRBAQEBAwE6HCMFCwgDGAklDwUlAwcaE4giBw+7FAEBAQcCARkEGYVAhBKBAoQphWoFmBSFfIJ3hRuBcYd2hTRFjmyCYgUbgV0qMIZ/gT0BAQE Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 03 May 2016 10:12:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1axOPy-0007Uy-Tm; Tue, 03 May 2016 10:42:26 +1000 Date: Tue, 3 May 2016 10:42:26 +1000 From: Dave Chinner To: Dan Williams Cc: Jeff Moyer , "Verma, Vishal L" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160503004226.GR26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1462236355 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6153 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, May 02, 2016 at 10:53:25AM -0700, Dan Williams wrote: > On Mon, May 2, 2016 at 8:18 AM, Jeff Moyer wrote: > > Dave Chinner writes: > [..] > >> We need some form of redundancy and correction in the PMEM stack to > >> prevent single sector errors from taking down services until an > >> administrator can correct the problem. I'm trying to understand > >> where this is supposed to fit into the picture - at this point I > >> really don't think userspace applications are going to be able to do > >> this reliably.... > > > > Not all storage is configured into a RAID volume, and in some instances, > > the application is better positioned to recover the data (gluster/ceph, > > for example). It really comes down to whether applications or libraries > > will want to implement redundancy themselves in order to get a bump in > > performance by not going through the kernel. And I think I know what > > your opinion is on that front. :-) > > > > Speaking of which, did you see the numbers Dan shared at LSF on how much > > overhead there is in calling into the kernel for syncing? Dan, can/did > > you publish that spreadsheet somewhere? > > Here it is: > > https://docs.google.com/spreadsheets/d/1pwr9psy6vtB9DOsc2bUdXevJRz5Guf6laZ4DaZlkhoo/edit?usp=sharing > > On the "Filtered" tab I have some of the comparisons where: Those numbers are really wacky - the inconsistent decimal place representation makes it really, really hard to read the differences in orders of magnitude, too. Let's take the first numbers - noop, 64 byte ops are: threads ops/s 1 90M 2 310M 4 65M 8 175M 16 426M Why aren't these linear? And if the test is not running in an environment where these are controlled and linear, how valid are the rest of the tests and hence the comparison. > noop => don't call msync and don't flush caches in userspace > > persist => cache flushing only in userspace and only on individual cache lines So these look a lot more linear than the no-op behaviour, so I'll just ignore the no-op results for now. > persist_4k => cache flushing only in userspace, but flushing is > performed in 4K aligned units Urg, your "vs persist" percentages are all wrong. You can't have a "-1000%" difference, you have "persist 4k" running at 10% of the speed of "persist". So, with that in mind, the "persist_4k" speed is: ops/s single thread Size vs "persist" 4k flush rate 64 10% 834k 128 13% 849k 256 15% 410k(one off variation?) 512 20% 860k 1024 25% 850k 2048 50% 840k 4096 none 836k 8192 none 410k What we see here is that the CPU(s) can flush the 4k pages at a rate of roughly 850,000 flushes/s, whilst the 64 byte flush rate is around 8.8M flushes/s. This is clearly demonstrated in the numbers - as the dirty object size approaches the cache flush granularity, the speed approaches single cacheline flush granularity speed. Comparing 4k vs 64b flushes, we have 63 clean cache line flushes taking roughly the same time as 9 dirty cache line flushes. Nice numbers - that means a clean cache line flush has ~14% of the overhead of dirty cache line flush. Seems rather high - it's tens of CPU cycles to determine that the flush is a no-op for that cacheline. Fixing this seems like a hardware optimisation issue to me, but I still have to question how many applications are going to have such fine-grained random synchronous memory writes that this actually matters in practice? If we are doing such small writes across multiple different 4k pages, then TLB overhead for all the page faults is going to be as much of an issue as 4k cache flushes... > msync => same granularity flushing as the 'persist' case, but the > kernel internally promotes this to a 4K sized / aligned flush So you're calling msync for every modification that is made? What application needs to do that? Anyway, page flush rates paint an interesting picture: single thread versus Size 4k flush rate persist_4k 64 655k 78% 128 655k 81% 256 670k 163% (* persist 4k number low) 512 681k 79% 1024 666k 78% 2048 650k 77% 4096 652k 78% 8192 390k 95% msync adds relatively little overhead (~20% extra overhead) compared to the performance loss from the 4k flush granularity change. And given this appears to be a worst case test scenario (and I'm sure msync could be improved), I don't think this demonstrates a problem with using msync. IMO, these numbers don't support the argument that the *msync model* for data integrity for DAX is flawed, unworkable, or too slow. What I see is a performance problem resulting from the overhead of flushing clean cachelines. i.e. there's data here that supports the argument for reducing the overhead of flushing clean cachelines in the hardware and/or better tracking of dirty cachelines within the kernel, but not data that says the msync() based data integrity model is the source of the problem. i.e. separate the programming model from the performance issue, and we can see that the performance problem is not caused by the programming model - it's caused by the kernel implementation of the model. > The takeaway is that msync() is 9-10x slower than userspace cache management. An alternative viewpoint: that flushing clean cachelines is extremely expensive on Intel CPUs. ;) i.e. Same numbers, different analysis from a different PoV, and that gives a *completely different conclusion*. Think about it for the moment. The hardware inefficiency being demonstrated could be fixed/optimised in the next hardware product cycle(s) and so will eventually go away. OTOH, we'll be stuck with whatever programming model we come up with for the next 30-40 years, and we'll never be able to fix flaws in it because applications will be depending on them. Do we really want to be stuck with a pmem model that is designed around the flaws and deficiencies of ~1st generation hardware? Cheers, Dave. -- Dave Chinner david@fromorbit.com From ming.lei@canonical.com Mon May 2 20:04:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9A5237CCE for ; Mon, 2 May 2016 20:04:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 64EC08F8035 for ; Mon, 2 May 2016 18:04:04 -0700 (PDT) X-ASG-Debug-ID: 1462237440-04cbb00fe940e510001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id q8NnOTVqwtWvgizd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 May 2016 18:04:01 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Effective-Source-IP: youngberry.canonical.com[91.189.89.112] X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f181.google.com ([209.85.161.181]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1axOkp-0002f3-RJ for xfs@oss.sgi.com; Tue, 03 May 2016 01:03:59 +0000 Received: by mail-yw0-f181.google.com with SMTP id g133so4910133ywb.2 for ; Mon, 02 May 2016 18:03:59 -0700 (PDT) X-Gm-Message-State: AOPr4FXQqPK4nuVKrZ6j1ReTTx52/KYywO+KZQRoDRga3bB4nVJyCWfi7Dphpvmnz4BhWvov/CwLpP+lippdug== MIME-Version: 1.0 X-Received: by 10.13.232.134 with SMTP id r128mr20873839ywe.163.1462237438875; Mon, 02 May 2016 18:03:58 -0700 (PDT) Received: by 10.37.36.150 with HTTP; Mon, 2 May 2016 18:03:58 -0700 (PDT) In-Reply-To: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> References: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> Date: Tue, 3 May 2016 09:03:58 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v5 0/8] block: prepare for multipage bvecs From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH v5 0/8] block: prepare for multipage bvecs To: Jens Axboe , Linux Kernel Mailing List Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Ming Lei , "open list:DRBD DRIVER" , Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer , Shaohua Li , Tejun Heo , "open list:XFS FILESYSTEM" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1462237441 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3228 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 18, 2016 at 5:29 AM, Ming Lei wrote: > Hi, > > Interests[1] have been shown in multipage bvecs, so this patchset > try to prepare for the support and do two things: > > 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), > then we can drop the non-standard way for iterating bvec, which > can be thought as a good cleanup for lib/iov_iter.c > > 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only > one user for each. Once multipage bvecs is introduced, one bio > may hold lots of sectors, and we should always use sort of BIO_MAX_VECS > which should be introduced in future and is similiar with current > BIO_MAX_PAGES. > > The only functional change is iterate_bvec():lib/iov_iter.c > > xfstests(-a auto) over loop aio is run for ext4/xfs to verify > the change and no regression found with this patchset. > > Jens, I am confidant this time, so please give it a go if no one > objects. I appreciate someone(AI? or anyone) can give a review on > the patch 4/8 about iterate_bvec() change. > > V5: > - use bvec's iterator to figure new base vec address and > update 'skip' correctly > - run xfstests(-a auto) on loop aio/dio for verifying > the change in iterate_bvec(), and no regression reported > - use stree-ng to trigger heavy swap over swapfile to verify > change in iterate_bvec() too, looks everything is fine Hi Jens, Any possibility to make v5 into v4.7 so that we can move on about multipage bvecs? BTW, even though not considering mp bvecs, this patchset is still a good cleanup. thanks, Ming > V4: > - make xfstests cover xfs > - rebase on for-next of block tree > V3: > - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm > as reported by 0day ktest > - build test on arm & arm64 > > V2: > - rename bvec_iter.h as bvec.h > - always include bvec.h into blk_types.h as suggested by Christoph > > V1: > - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph > - run xfstests against v4.6-rc1-next-20160329 > - add Reviewed-by > - for 1,4 and 5, Reviewd-by not added, Christoph still expressed > 'this looks fine to me.' > > > Ming Lei (8): > block: move bvec iterator into include/linux/bvec.h > block: move two bvec structure into bvec.h > block: mark 1st parameter of bvec_iter_advance as const > iov_iter: use bvec iterator to implement iterate_bvec() > fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES > block: bio: remove BIO_MAX_SECTORS > block: drbd: avoid to use BIO_MAX_SIZE > block: bio: remove BIO_MAX_SIZE > > drivers/block/drbd/drbd_int.h | 4 +- > fs/xfs/xfs_buf.c | 4 +- > include/linux/bio.h | 52 ----------------------- > include/linux/blk_types.h | 22 +--------- > include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ > lib/iov_iter.c | 45 +++++++------------- > 6 files changed, 115 insertions(+), 108 deletions(-) > create mode 100644 include/linux/bvec.h > > -- > 1.9.1 > From andy.rudoff@intel.com Mon May 2 20:26:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LONG_TERM_PRICE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B391F7CEF for ; Mon, 2 May 2016 20:26:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1871BAC001 for ; Mon, 2 May 2016 18:26:52 -0700 (PDT) X-ASG-Debug-ID: 1462238808-04cb6c09a0437260001-NocioJ Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id kOphxJXLBVXL6IYp for ; Mon, 02 May 2016 18:26:48 -0700 (PDT) X-Barracuda-Envelope-From: andy.rudoff@intel.com X-Barracuda-Effective-Source-IP: mga09.intel.com[134.134.136.24] X-Barracuda-Apparent-Source-IP: 134.134.136.24 X-ASG-Whitelist: Client Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 02 May 2016 18:26:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,570,1455004800"; d="scan'208";a="967340500" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga002.jf.intel.com with ESMTP; 02 May 2016 18:26:47 -0700 Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 2 May 2016 18:26:47 -0700 Received: from fmsmsx106.amr.corp.intel.com ([169.254.5.219]) by fmsmsx122.amr.corp.intel.com ([169.254.1.58]) with mapi id 14.03.0248.002; Mon, 2 May 2016 18:26:46 -0700 From: "Rudoff, Andy" To: Dave Chinner , "Williams, Dan J" CC: "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-nvdimm@ml01.01.org" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRiif9qhv4bwaNJk+t5ZNTjcl9ZZ+LTrcCgAihWYCABIdJgIACg1gAgACSOgCAAGe7AIAAB6SAgAANm4CACe2574AAoHeAgAByRwD//6fsgA== Date: Tue, 3 May 2016 01:26:46 +0000 Message-ID: References: <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> <20160503004226.GR26977@dastard> In-Reply-To: <20160503004226.GR26977@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/f.15.1.160411 x-originating-ip: [10.255.3.222] Content-Type: text/plain; charset="utf-8" Content-ID: <0AF4EB11DD0E4F4EBC00F7351C1A2029@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1462238808 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4318 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 DQo+PiBUaGUgdGFrZWF3YXkgaXMgdGhhdCBtc3luYygpIGlzIDktMTB4IHNsb3dlciB0aGFuIHVz ZXJzcGFjZSBjYWNoZSBtYW5hZ2VtZW50Lg0KPg0KPkFuIGFsdGVybmF0aXZlIHZpZXdwb2ludDog dGhhdCBmbHVzaGluZyBjbGVhbiBjYWNoZWxpbmVzIGlzDQo+ZXh0cmVtZWx5IGV4cGVuc2l2ZSBv biBJbnRlbCBDUFVzLiA7KQ0KPg0KPmkuZS4gU2FtZSBudW1iZXJzLCBkaWZmZXJlbnQgYW5hbHlz aXMgZnJvbSBhIGRpZmZlcmVudCBQb1YsIGFuZA0KPnRoYXQgZ2l2ZXMgYSAqY29tcGxldGVseSBk aWZmZXJlbnQgY29uY2x1c2lvbiouDQo+DQo+VGhpbmsgYWJvdXQgaXQgZm9yIHRoZSBtb21lbnQu IFRoZSBoYXJkd2FyZSBpbmVmZmljaWVuY3kgYmVpbmcNCj5kZW1vbnN0cmF0ZWQgY291bGQgYmUg Zml4ZWQvb3B0aW1pc2VkIGluIHRoZSBuZXh0IGhhcmR3YXJlIHByb2R1Y3QNCj5jeWNsZShzKSBh bmQgc28gd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuIE9UT0gsIHdlJ2xsIGJlIHN0dWNrIHdpdGgN Cj53aGF0ZXZlciBwcm9ncmFtbWluZyBtb2RlbCB3ZSBjb21lIHVwIHdpdGggZm9yIHRoZSBuZXh0 IDMwLTQwIHllYXJzLA0KPmFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGZpeCBmbGF3cyBpbiBp dCBiZWNhdXNlIGFwcGxpY2F0aW9ucyB3aWxsDQo+YmUgZGVwZW5kaW5nIG9uIHRoZW0uIERvIHdl IHJlYWxseSB3YW50IHRvIGJlIHN0dWNrIHdpdGggYSBwbWVtDQo+bW9kZWwgdGhhdCBpcyBkZXNp Z25lZCBhcm91bmQgdGhlIGZsYXdzIGFuZCBkZWZpY2llbmNpZXMgb2YgfjFzdA0KPmdlbmVyYXRp b24gaGFyZHdhcmU/DQoNCkhpIERhdmUsDQoNCk5vdCBzdXJlIEkgYWdyZWUgd2l0aCB5b3VyIGNv bXBsZXRlbHkgZGlmZmVyZW50IGNvbmNsdXNpb24uICAoTm90IHN1cmUNCkkgY29tcGxldGVseSBk aXNhZ3JlZSBlaXRoZXIsIGJ1dCBwbGVhc2UgbGV0IG1lIHJhaXNlIHNvbWUgcHJhY3RpY2FsDQpw b2ludHMuKQ0KDQpGaXJzdCBvZiBhbGwsIGxldCdzIHNheSB5b3UncmUgY29tcGxldGVseSByaWdo dCBhbmQgZmx1c2hpbmcgY2xlYW4NCmNhY2hlIGxpbmVzIGlzIGV4dHJlbWVseSBleHBlbnNpdmUu ICBTbyB5b3VyIHNvbHV0aW9uIGlzIHRvIHdhaXQgZm9yDQp0aGUgY2hpcCB0byBiZSBmaXhlZD8g IFJlbWVtYmVyIHRoZSBtb2RlbCB3ZSdyZSBwdXR0aW5nIGZvcndhcmQgKHdoaWNoDQp3ZSdyZSB3 b3JraW5nIG9uIGRvY3VtZW50aW5nLCBiZWNhdXNlIEkgZnVsbHkgYWdyZWUgd2l0aCB0aGUgbGFj ayBvZg0KZG9jdW1lbnRhdGlvbiBwb2ludCB5b3Uga2VlcCByYWlzaW5nKSByZXF1aXJlcyB0aGUg YXBwbGljYXRpb24gdG8gQVNLDQpmb3IgdGhlIGZpbGUgc3lzdGVtJ3MgcGVybWlzc2lvbiBiZWZv cmUgYXNzdW1pbmcgZmx1c2hpbmcgZnJvbSB1c2VyIHNwYWNlDQp0byBwZXJzaXN0ZW5jZSBpcyBh bGxvd2VkLiAgU28gdGhhdCBkb2Vzbid0IHN0aWNrIHVzIHdpdGggMzAtNDAgeWVhcnMgb2YNCmEg Zmxhd2VkIG1vZGVsLiAgSSBkb24ndCB0aGluayB0aGUgbW9kZWwgaXMgd3JvbmcsIGhhdmluZyBz cGVudCBsb3RzIG9mDQpyZXNlYXJjaCB0aW1lIG9uIGl0LCBidXQgaWYgSSdtIGZ1bGwgb2YgY3Jh cCwgYWxsIHdlIGhhdmUgdG8gZG8gaXMgc3RvcA0KdGVsbGluZyB0aGUgYXBwIHRoYXQgZmx1c2hp bmcgZnJvbSB1c2VyIHNwYWNlIGlzIGFsbG93ZWQgYW5kIGl0IG11c3QgZ28NCmJhY2sgdG8gdXNp bmcgbXN5bmMoKS4gIFRoaXMgaXMgbXkgdW5kZXJzdGFuZGluZyBvZiB3aGF0IERhbiBzdWdnZXN0 ZWQNCmF0IExTRiBhbmQgdGhpcyBpcyB3aGF0IEknbSBjdXJyZW50bHkgd3JpdGluZyB1cC4gIEJ5 IHRoZSB3YXksIHRoZSBOVk0NCkxpYnJhcmllcyBhbHJlYWR5IGNvbnRhaW4gdGhlIGxvZ2ljIHRv IGFzayBpZiBmbHVzaGluZyBmcm9tIHVzZXIgc3BhY2UNCmlzIGFsbG93ZWQsIGZhbGxpbmcgYmFj ayB0byBtc3luYygpIGlmIG5vdC4gIEN1cnJlbnRseSB0aG9zZSBsaWJyYXJpZXMNCmNoZWNrIGZv ciBEQVggbWFwcGluZ3MuICBCdXQgdGhlIHBvaW50cyB5b3UgcmFpc2VkIGFib3V0IG1ldGFkYXRh IGNoYW5nZXMNCmhhcHBlbmluZyBkdXJpbmcgcGFnZSBmYXVsdHMgbWFkZSB1cyByZWFsaXplIHdl IGhhdmUgdG8gYXNrIHRoZSBmaWxlDQpzeXN0ZW0gdG8gb3B0LWluIHRvIGFsbG93aW5nIHVzZXIg c3BhY2UgZmx1c2hpbmcsIHNvIHRoYXQncyB3aGF0IHdlJ3JlDQpjaGFuZ2luZyB0aGUgbGlicmFy eSB0byBkby4gIFNlZSwgd2UgYXJlIGxpc3RlbmluZyA6LSkNCg0KQW55d2F5LCBJIGRvdWJ0IHRo YXQgZmx1c2hpbmcgYSBjbGVhbiBjYWNoZSBsaW5lIGlzIGV4dHJlbWVseSBleHBlbnNpdmUuDQpS ZW1lbWJlciB0aGUgY29kZSBpcyBidWlsZGluZyB0cmFuc2FjdGlvbnMgdG8gbWFpbnRhaW4gYSBj b25zaXN0ZW50DQppbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIGZhY2Ugb2Ygc3VkZGVu IGZhaWx1cmUgbGlrZSBwb3dlcmxvc3MuDQpTbyBpdCBpcyB1c2luZyB0aGUgZmx1c2hlcyB0byBj cmVhdGUgc3RvcmUgYmFycmllcnMsIGJ1dCBub3QgdGhlIGJsb2NrLQ0KYmFzZWQgc3RvcmUgYmFy cmllcnMgd2UncmUgdXNlZCB0byBpbiB0aGUgc3RvcmFnZSB3b3JsZCwgYnV0IGNhY2hlLWxpbmUt DQpzaXplZCBzdG9yZSBiYXJyaWVycyAodXN1YWxseSBtdWx0aXBsZXMgb2YgY2FjaGUgbGluZXMs IGJ1dCBtb3N0IGNvbW1vbmx5DQpzbWFsbGVyIHRoYW4gNGsgb2YgdGhlbSkuICBTbyBJIHRoaW5r IHdoZW4geW91IHR1cm4gYSBjYWNoZSBsaW5lIGZsdXNoDQppbnRvIGFuIG1zeW5jKCksIHlvdSdy ZSBzZWVpbmcgc29tZSBkaXJ0eSBzdHVmZiBnZXQgZmx1c2hlZCBiZWZvcmUgaXQNCmlzIHRpbWUg dG8gZmx1c2ggaXQuICBJJ20gbm90IHN1cmUgdGhvdWdoLCBidXQgY2VydGFpbmx5IHdlIGNvdWxk IHNwZW5kDQptb3JlIHRpbWUgdGVzdGluZyAmIG1lYXN1cmluZy4NCg0KTW9yZSBpbXBvcnRhbnRs eSwgSSB0aGluayBpdCBpcyBpbnRlcmVzdGluZyB0byBkZWNpZGUgd2hhdCB3ZSB3YW50IHRoZQ0K cG1lbSBwcm9ncmFtbWluZyBtb2RlbCB0byBiZSBsb25nLXRlcm0uICBJIHRoaW5rIHdlIHdhbnQg YXBwbGljYXRpb25zIHRvDQpqdXN0IG1hcCBwbWVtLCBkbyBub3JtYWwgc3RvcmVzIHRvIGl0LCBh bmQgYXNzdW1lIHRoZXkgYXJlIHBlcnNpc3RlbnQuDQpUaGlzIGlzIHF1aXRlIGRpZmZlcmVudCBm cm9tIHRoZSAzMC15ZWFyLW9sZCBQT1NJWCBNb2RlbCB3aGVyZSBtc3luYygpDQppcyByZXF1aXJl ZC4gIEJ1dCBJIHRoaW5rIGl0IGlzIGNsZWFuZXIsIGVhc2llciB0byB1bmRlcnN0YW5kLCBhbmQg bGVzcw0KZXJyb3ItcHJvbmUuICBTbyB3aHkgZG9lc24ndCBpdCB3b3JrIHRoYXQgd2F5IHJpZ2h0 IG5vdz8gIEJlY2F1c2Ugd2UncmUNCmZpbmRpbmcgaXQgaW1wcmFjdGljYWwuICBVc2luZyB3cml0 ZS10aHJvdWdoIGNhY2hpbmcgZm9yIHBtZW0gc2ltcGx5DQpkb2Vzbid0IHBlcmZvcm0gd2VsbCwg YW5kIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdG8gZmx1c2ggdGhlIENQVQ0KY2FjaGVzIG9u IHNodXRkb3duL3Bvd2VyZmFpbCBpcyBub3QgcHJhY3RpY2FsIHlldC4gIEJ1dCBJIHRoaW5rIHRo ZSBkYXkNCndpbGwgY29tZSB3aGVuIGl0IGlzIHByYWN0aWNhbC4NCg0KU28gZ2l2ZW4gdGhhdCBs b25nLXRlcm0gdGFyZ2V0LCB0aGUgaWRlYSBpcyBmb3IgYW4gYXBwbGljYXRpb24gdG8gYXNrIGlm DQp0aGUgbXN5bmMoKSBjYWxscyBhcmUgcmVxdWlyZWQsIG9yIGlmIGp1c3QgZmx1c2hpbmcgdGhl IENQVSBjYWNoZXMgaXMNCnN1ZmZpY2llbnQgZm9yIHBlcnNpc3RlbmNlLiAgVGhlbiwgd2UncmUg YWxzbyBhZGRpbmcgYW4gQUNQSSBwcm9wZXJ0eQ0KdGhhdCBhbGxvd3MgU1cgdG8gZGlzY292ZXIg aWYgdGhlIGNhY2hlcyBhcmUgZmx1c2hlZCBhdXRvbWF0aWNhbGx5DQpvbiBzaHV0ZG93bi9wb3dl cmxvc3MuICBJbml0aWFsbHkgdGhhdCB3aWxsIG9ubHkgYmUgdHJ1ZSBmb3IgY3VzdG9tDQpwbGF0 Zm9ybXMsIGJ1dCBob3BlZnVsbHkgaXQgY2FuIGJlIGF2YWlsYWJsZSBtb3JlIGJyb2FkbHkgaW4g dGhlIGZ1dHVyZS4NClRoZSByZXN1bHQgd2lsbCBiZSB0aGF0IHRoZSBwcm9ncmFtbWluZyBtb2Rl bCBnZXRzIHNpbXBsZXIgYXMgbW9yZSBhbmQNCm1vcmUgaGFyZHdhcmUgcmVxdWlyZXMgbGVzcyBl eHBsaWNpdCBmbHVzaGluZy4NCg0KTm93IEknbGwgZ28gYmFjayB0byB3cml0aW5nIHVwIHRoZSBi aWcgcGljdHVyZSBmb3IgdGhpcyBwcm9ncmFtbWluZw0KbW9kZWwgc28gSSBjYW4gYXNrIHlvdSBm b3IgY29tbWVudHMgb24gdGhhdCBhcyB3ZWxsLi4uDQoNCg0KLWFuZHkNCg== From david@fromorbit.com Mon May 2 20:52:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D23417D01 for ; Mon, 2 May 2016 20:52:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25EA0AC002 for ; Mon, 2 May 2016 18:52:07 -0700 (PDT) X-ASG-Debug-ID: 1462240322-04cb6c09a04378e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 0ic2VXXOTuZIgTaU for ; Mon, 02 May 2016 18:52:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CdBwBDAyhXPMPVLHlegziBUIZsnn4GjBaFbIQThgoCAgEBAoE2TQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAxQECSUPBSUDBxoTG4gOuxIBCwEdGYVAhRSEBh0GhWoFmBSGa4cjgXGHdoU0RY5sgmcbgV0qMAGGfoE9AQEB Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 03 May 2016 11:22:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1axPVH-0007t0-35; Tue, 03 May 2016 11:51:59 +1000 Date: Tue, 3 May 2016 11:51:59 +1000 From: Dave Chinner To: Dan Williams Cc: Jeff Moyer , "Verma, Vishal L" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160503015159.GS26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> <20160502230422.GQ26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1462240322 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9296 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, May 02, 2016 at 04:25:51PM -0700, Dan Williams wrote: > On Mon, May 2, 2016 at 4:04 PM, Dave Chinner wrote: > > On Mon, May 02, 2016 at 11:18:36AM -0400, Jeff Moyer wrote: > >> Dave Chinner writes: > >> > >> > On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: > >> >> On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > >> > You're assuming that only the DAX aware application accesses it's > >> > files. users, backup programs, data replicators, fileystem > >> > re-organisers (e.g. defragmenters) etc all may access the files and > >> > they may throw errors. What then? > >> > >> I'm not sure how this is any different from regular storage. If an > >> application gets EIO, it's up to the app to decide what to do with that. > > > > Sure - they'll fail. But the question I'm asking is that if the > > application that owns the data is supposed to do error recovery, > > what happens when a 3rd party application hits an error? If that > > consumes the error, the the app that owns the data won't ever get a > > chance to correct the error. > > > > This is a minefield - a 3rd party app that swallows and clears DAX > > based IO errors is a data corruption vector. can yo imagine if > > *grep* did this? The model that is being promoted here effectively > > allows this sort of behaviour - I don't really think we > > should be architecting an error recovery strategy that has the > > capability to go this wrong.... > > Since when does grep write to a file on error? That's precisely my point - it doesn't right now because there is no onus on userspace applications to correct data errors when they are found. However, if the accepted model becomes "userspace needs to try to correct errors in data automatically", the above scenario is a distinct possiblity. I'm not saying grep will do this - I'm taking the logical argument being presented to the extreme - but I'm sure that there will be developers that have enough knowledge to know they are supposed to do something with errors on pmem devices, but not have enough knowledge to know the correct things to do. And then the app mishandles a EINVAL error (or something like that) and so we end up with buggy userspace apps trying to correct errors in good data and causing data loss that way. Do we really want to introduce a data integrity and error recovery model where this sort of "bug" is a distinct possibly? > >> >> > There's an implicit assumption that applications will keep redundant > >> >> > copies of their data at the /application layer/ and be able to > >> >> > automatically repair it? > >> > >> That's one way to do things. It really depends on the application what > >> it will do for recovery. > >> > >> >> > And then there's the implicit assumption that it will unlink and > >> >> > free the entire file before writing a new copy > >> > >> I think Vishal was referring to restoring from backup. cp itself will > >> truncate the file before overwriting, iirc. > > > > Which version of cp? what happens if they use --sparse and the error > > is in a zeroed region? There's so many assumptions about undefined userspace > > environment, application and user behaviour being made here, and > > it's all being handwaved away. > > > > I'm asking for this to be defined, demonstrated and documented as a > > working model that cannot be abused and doesn't have holes the size > > of trucks in it, not handwaving... > > You lost me... how are these patches abusing the existing semantics > of -EIO and write to clear? I haven't said that. I said there are assumptions about how userspace will handle the error, but they aren't documented anywhere. "copy a file using cp" is not a robust recovery solution - it provides no guarantees about how the bad file and regions will be recycled and the errors cleared. This effectively of puts it all on the filesystems to deal with, even though you're trying to design an error handling model that bypasses the filesystems and goes straight to userspace. If I can't understand how this is all supposed to work because none of it is documented, then we have no chance that the average admin is going to be able to understand it. > > >> >> To summarize, the two cases we want to handle are: > >> >> 1. Application has inbuilt recovery: > >> >> - hits badblock > >> >> - figures out it is able to recover the data > >> >> - handles SIGBUS or EIO > >> >> - does a (sector aligned) write() to restore the data > >> > > >> > The "figures out" step here is where >95% of the work we'd have to > >> > do is. And that's in filesystem and block layer code, not > >> > userspace, and userspace can't do that work in a signal handler. > >> > And it can still fall down to the second case when the application > >> > doesn't have another copy of the data somewhere. > >> > >> I read that "figures out" step as the application determining whether or > >> not it had a redundant copy. > > > > Another undocumented assumption, that doesn't simplify what needs to > > be done. Indeed, userspace can't do that until it is in SIGBUS > > context, which tends to imply applications need to do a major amount > > of work from within the signal handler.... > > > >> > FWIW, we don't have a DAX enabled filesystem that can do > >> > reverse block mapping, so we're a year or two away from this being a > >> > workable production solution from the filesystem perspective. And > >> > AFAICT, it's not even on the roadmap for dm/md layers. > >> > >> Do we even need that? What if we added an FIEMAP flag for determining > >> bad blocks. > > > > So you're assuming that the filesystem has been informed of the bad > > blocks and has already marked the bad regions of the file in it's > > extent list? > > > > How does that happen? What mechanism is used for the underlying > > block device to inform the filesytem that theirs a bad LBA, and how > > does the filesytem the map that to a path/file/offset with reverse > > mapping? Or is there some other magic that hasn't been explained > > happening here? > > In 4.5 we added this: > > commit 99e6608c9e7414ae4f2168df8bf8fae3eb49e41f > Author: Vishal Verma > Date: Sat Jan 9 08:36:51 2016 -0800 > > block: Add badblock management for gendisks Yes, I know, and it doesn't answer any of the questions I just asked. What you just told me is that there is something that is kept three levels of abstraction away from a filesystem. So: - What mechanism is to be used for the underlying block device to inform the filesytem that a new bad block was added to this list? What context comes along with that notification? - how does the filesystem query the bad block list without adding layering violations? - when does the filesystem need to query the bad block list? - how will the bad block list propagate through DM/MD layers? - how does the filesytem the map the bad block to a path/file/offset without reverse mapping - does this error handling interface really imply the filesystem needs to implement brute force scans at notification time? - Is the filesystem expectd to find the active application or address_space access that triggered the bad block notification to handle them correctly? (e.g. prevent a page fault from failing because we can recover from the error immediately) - what exactly is the filesystem supposed to do with the bad block? e.g: - is the block persistently bad until the filesystem rewrites it? Over power cycles? Will we get multiple notifications (e.g. once per boot)? - Is the filesystem supposed to intercept reads/writes to bad blocks once it knows about them? - how is the filesystem supposed to communicate that there is a bad block in a file back to userspace? Or is userspace supposed to infer that there's a bad block from EIO and so has to run FIEMAP to determine if the error really was due to a bad block? - what happens if there is no running application that we can report the error to or will handle the error (e.g. found error by a media scrub or during boot)? - if the bad block is in filesystem free space, what should the filesystem do with it? What I'm failing to communicate is that having and maintaining things like bad block lists in a block device is the easy part of the problem. Similarly reporting a bad block flag in FIEMAP is only a few lines of code to implement, but that assumes the filesystem has already propagated the bad block information into it's internal extents lists. That's the hard part of all this: connecting the two pieces together in a sane, reliable, consistent and useful manner. This will form the user API, so we need to sort it out before applications start to use it. However, if I'm struggling to understand how I'm supposed to connecct up the parts inside a filesytem, then expecting application developers to be able to connect the dots in a sane manner is bordering on fantasy.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From prvs=0931F12809=Sarah.McCartney@tdsb.on.ca Mon May 2 20:54:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=HTML_MESSAGE,SINGLE_HEADER_2K autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7CA0B7D01 for ; Mon, 2 May 2016 20:54:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E10AAC002 for ; Mon, 2 May 2016 18:54:42 -0700 (PDT) X-ASG-Debug-ID: 1462240478-04bdf0358f436630001-NocioJ Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0065.outbound.protection.outlook.com [65.55.169.65]) by cuda.sgi.com with ESMTP id hVveHmXGgKIDDpyB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Mon, 02 May 2016 18:54:39 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0931F12809=Sarah.McCartney@tdsb.on.ca X-Barracuda-Effective-Source-IP: mail-bl2on0065.outbound.protection.outlook.com[65.55.169.65] X-Barracuda-Apparent-Source-IP: 65.55.169.65 Received: from CY1PR0201CA0017.namprd02.prod.outlook.com (10.163.30.155) by BLUPR02MB001.namprd02.prod.outlook.com (10.242.190.147) with Microsoft SMTP Server (TLS) id 15.1.485.9; Tue, 3 May 2016 01:54:37 +0000 Received: from BN1AFFO11FD039.protection.gbl (2a01:111:f400:7c10::190) by CY1PR0201CA0017.outlook.office365.com (2a01:111:e400:58b9::27) with Microsoft SMTP Server (TLS) id 15.1.485.9 via Frontend Transport; Tue, 3 May 2016 01:54:36 +0000 Authentication-Results: spf=pass (sender IP is 38.116.192.54) smtp.mailfrom=tdsb.on.ca; 126.com; dkim=none (message not signed) header.d=none;126.com; dmarc=bestguesspass action=none header.from=tdsb.on.ca; Received-SPF: Pass (protection.outlook.com: domain of tdsb.on.ca designates 38.116.192.54 as permitted sender) receiver=protection.outlook.com; client-ip=38.116.192.54; helo=tls.tdsb.on.ca; Received: from tls.tdsb.on.ca (38.116.192.54) by BN1AFFO11FD039.mail.protection.outlook.com (10.58.52.243) with Microsoft SMTP Server (TLS) id 15.1.477.4 via Frontend Transport; Tue, 3 May 2016 01:54:35 +0000 Received: from TDSBHUB2.tdsb.on.ca (172.22.19.105) by TLS.tdsb.on.ca (172.22.200.202) with Microsoft SMTP Server (TLS) id 14.3.235.1; Mon, 2 May 2016 21:54:29 -0400 Received: from TDSBMBX15.tdsb.on.ca ([172.22.19.138]) by TDSBHUB2.tdsb.on.ca ([172.22.19.105]) with mapi id 14.03.0235.001; Mon, 2 May 2016 21:54:29 -0400 From: "McCartney, Sarah" Subject: FW: Swift Thread-Topic: Swift X-ASG-Orig-Subj: FW: Swift Thread-Index: AdGk3FnFPt9YLHZoRk+Ka0CJfP9qlQAAlNOW Date: Tue, 3 May 2016 01:54:28 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [172.22.39.161] Content-Type: multipart/mixed; boundary="_004_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_" MIME-Version: 1.0 To: Undisclosed recipients:; X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:38.116.192.54;IPV:CAL;SCL:-1;CTRY:CA;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(438002)(189002)(199003)(5004730100002)(567704001)(109986003)(21480400002)(99936001)(54356999)(50986999)(76176999)(87936001)(2940100001)(2920100001)(2950100001)(2900100001)(106466001)(53416004)(2476003)(6806005)(4001450100002)(569054002)(8936002)(16796002)(568964002)(5008740100001)(84326002)(11100500001)(6116002)(102836003)(586003)(3846002)(1220700001)(2910100002)(74482002)(189998001)(92566002)(5001970100001)(110136002)(4620100001)(4610100001)(1671002)(55846006)(5260100001)(5003600100002)(5000100001)(107886002)(77096005)(5890100001)(881003)(512934002)(16236675004)(221733001)(2906002)(33656002)(7099028)(78096006)(360700003)(102436002)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR02MB001;H:tls.tdsb.on.ca;FPR:;SPF:Pass;MLV:nov;MX:1;A:1;PTR:tls.tdsb.on.ca;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD039;1:DVoxlu8/rOcfShlt0rz/umdPyDh80wR9Y69ebobH5uEg7E25zswZmVKckcKefVFYRv/QmboDf/k63EgwEHO0N3OTDHjG1GYw2NrUYhaVj8rgteRdd815Ks4lp5RVMEprrywoAFPFwXrJWnt8oR7MobkbtkN/C3ljuNIu2kYnvlJbE3fCtwR9Bf/7iEwsmoe8BYnt64KmyW891Cj7d6FANOsbyqr1kfpGWZIYD8gAIcJINnqxYmaVaVLlzpVmgW6Ke8JrbNY4LkP5WsV6zLJdLH3eAIMrYhBQdhOoGnTDziKUhVvvpfXI2D8uBpUbdp6pIWh/42mao4ovvB7QG0TGL4AtjVJMwi2Nlcx76cC4QmLaYHrfV4MJYE13rvmYg+OqO3Z4JEjM35Obo8A2ue9HVJcfW2HvnqQudiNhCj7vutA/jPMyboWUiiNrzqEUPdjeDW8P5MdJF0oNa89sgiNnTIDy/39bsVfpiToZsS+t7IRPLI2tML7M0LD+e0EddsJgoCqeP15v+FTS4VVHNFVpPJetqrL2VmZ5N4wsyhB2tWEATEcLaldkVrpWRe4HuZRRz42R8tNRA/yf1wY1aJrEfw== X-MS-Office365-Filtering-Correlation-Id: 910a0694-a50f-4370-ab6d-08d372f5e175 X-Microsoft-Exchange-Diagnostics: 1;BLUPR02MB001;2:uUcX7k5hl3hAYMS9j7TvQ2Pxx4f8LRo9RsSS0DxadbJ+16nyMvE0weMjrl9yDeoax2SsXTPS6NEYvf/BqUeGHlKjjmrWD8A6U6/63EKBUPxhC/NQjLWvVCgKLIOzQiNn1uZM48GQzgy0V+xmaFVE9CCR3F6b05Ej7s9drexokkGLLtoL1ZkNd6IXlx5ZEwjV;3:DaQKLoomIv1mx6epPBCzzf6xG1bLCX7m6k5Qt1lKzaB/pCv//ba1YbzTrmvMVNPwfzn+5bIJXZVsDKflaMZw8V1AI2Dlu+qDfzkLUk/IEFuUvKmBlOrshxwOIKNHTTrjETjtXLbstW762z7vt3FDULYchSO+Fnx8J2vVBP5O5ncVelUbxksCysjh71x1ef93DIrAFtiZ1kW7L1fbzlAV1cGhF+fD8h8jP28ktDaHX3vJuZZVeLvKhkerggX8FaU5I/D5+Gq5+OJ6JsqNnbP10A==;25:4eawHG0wXCE+MUCYFi0njbUCoe6WlbpP/eXxOA8dkC0paAdna8atTqMZHD5Nf1jX2R9bXYevXi0MbJy3rKLNIvPrxkWSug6MUyILFzKTvZOcxX1FV4nrjpBaWXdX8/xOb+k2TXQkUC4aePd3Qos2yThlNsPkF1PrENNOjgQvPrtIku1znqLgE56zlrVna4Kz0dyqKDXcuOw0hIbhKCkKFYbNhUzWbkZBo/f7ekB1P+dNH5wHwSgegarLMb0pL64/wOPXLAs9g7iezZducPZ1pXU9FNn0TTTjYzwqc9bjN2JYl04sJ7vW7Q+c5T8fdGOOn6wGOjG6hgKIJBfe7ts/sRlvPgVfy7zDMR0CsbgCd1IAMdwdwi3266XlMZVnLWY/U6UuRMVogScaEnqSzFCMYjXrfJPL/wK0Jj3cwXoVV/N9l6jkD/9g1egztfHYCHHf3sU3UK2MNtL84ABuS1/FA51XlrUUsl9G2p2RSW6KaoQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:BLUPR02MB001; X-Microsoft-Exchange-Diagnostics: 1;BLUPR02MB001;20:EM6Y8Rh0KhiFiSzY5j1RFEpu9+j9DBlU5593xaoZBcr8YP8V7hX4fjyZkRjCnOIkKiGutR0csPx1HHUbl9XXwlf+UBw6BriLeWHmr8ae2VuRRsRz3G/4TAk47GYZOvVkgfb/AiqYYhBoEi6YKHX2jQY8hseehpb679+SSkTddsM=;4:TQlU+UGXKGpT0up7nDyMGNhk/U5vR05tE5+sfMPePPMlmajqMaig2D0WYWXNA33ll4Ch+S8P7ewNxQ80jaMMsx/PfyOzsj7JvxWUxfZEATTj5xtMhp0Xw8m5PkIiCgsAzeutjOoDSksj1m/GxH7izkwv1EA9fWkoKW5jw/Z/LxNcK+/IAH9wVdgU7zLhYFJOXqVw5wQtpOTnDOrrvwPoIVYgNQzQeFlIBT5qxXYcdkCqUgNAnvN1/lerZuoO68jW6qhmOdL0v8uwTNg/bvGOUjO/7I/IxjRC1WN+FPn+Q9KpXPwXtNZHgPEpQxgs4FI0tdgRwVvA2wXOptWs7znTrpd0uot6dx51gTJKQFnjbck8xFvhVpOYrcGgmP7o9F2fcT5QmCUUGjTGggCs0ubkidGCFstMMElY1Y89PSVN/fucvy+otn+wPwBfPC2rA+ee/0gHEZl4ejOS6kwTD6K6tET5tK2fTTeobaaWAKaMVwk0N3eLveb8Dvtgl3fhLLLm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(102415293)(102615271)(9101521096)(601004)(2401047)(5005006)(8121501046)(13020025)(13024025)(13013025)(13023025)(10201501046)(3002001);SRVR:BLUPR02MB001;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB001; X-Forefront-PRVS: 0931CB1479 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR02MB001;23:U/EUPcMDmSZjeJs+zeO81PFL2nb4ztXLZAxFIc/LDh?= =?us-ascii?Q?auRttK38qTmHwYoSlME2yq11nXwWycWB7eeaQ42uPzlELIA3wgTcmpymYgpw?= =?us-ascii?Q?q4h6yXVUYE5agw1MtfCKO6MqlHgK7bXe2rydz1VlRoLv5N6kP61Ny4siKAM4?= =?us-ascii?Q?+Mw0DSx8yoatLGHXq2N8OrCZemZItHCBZkB5b0XAXZdW/Vm33urttfsQ7jh6?= =?us-ascii?Q?JuWR9/IIcu3+VDKm6X8/n4/UTY1IzdM0ev62KlfYJYzXJJkRJONnmt6HmAxN?= =?us-ascii?Q?yX0XWAOOUhqX8P7BUFTc4hQo3Q9ZoP2a1wLm9JUYCI4rr5j0Lr1cprSZOuXv?= =?us-ascii?Q?mCySt6WvC9C2WLyACYgUIOPREAWJVKKayzIf/ZUIXG3bdyufdmqcglk35ek0?= =?us-ascii?Q?VaXWOQR/8bZ2mFLqUhIFvjIGbVzz5GMzUYePg2mBPaAPRrdAAvMVCuYOPCWI?= =?us-ascii?Q?xxyJNfI5CarxKM7ageJYde3GLDAGtRfYVtgvGQfZJbd7ws8m9O7AbLvN2eH8?= =?us-ascii?Q?nwwMJTNLdt9BYC2oEX7IUcr228mab3nBnvKmbBjrQMfcM514UQWgLe9d3zMR?= =?us-ascii?Q?3Mo473z2v1dfJPotRfdhYMMkC1AoDa23B0l91JiKMJjP8EwdTCxpAuF8FiKc?= =?us-ascii?Q?63m604UVR+jmK1ky3j/DvTzwJb86QompkBO2sVVMe8UQ7aVlJkxBu3lEfyup?= =?us-ascii?Q?m6ejA4XPhAoDclWwfl83BIWDUbnpKTq8NoP5OPtalI+mM63ckTBKzg+JKBzp?= =?us-ascii?Q?DKfgs58clX9POE2dNE1pTiMftOObLSU5OjC+BW7D/YNAq2MOn7wCW0KIrMiB?= =?us-ascii?Q?ifLxxBzlAemmPe+IpeGKExkoaVoyy8nadM7RjpZh5H4iB7vIIdlv3QNbL7qE?= =?us-ascii?Q?t37F9UwU8S8s9s103EM9Rf7Ley47/dD3uMkRPB6SZABf1gd7y5ZfSYD9QKFE?= =?us-ascii?Q?1XhnWvHgAPBQE2k5l+IBpLOYADGDpMd6Erf04JhJUEbMVjWw5SgUqpFmBAtz?= =?us-ascii?Q?/BX+adY5wjD7HdMGFOC9+mhU2WFpS0L1Fh87itysawFM6IJSCN4Sep4KHrOd?= =?us-ascii?Q?Khp/4Wq2psuwRuPz7uNV94zaeF0UPp/kwPDxWzs8cYkXF9LutnNH526CJMWJ?= =?us-ascii?Q?/2a0JmVPwuEazviOV2r5yFfZwpY+Wn4/trzP6GjWT3inVVGsv7itF03l9ZtU?= =?us-ascii?Q?kqXgvNpD5gOLCKWRTG3QEIIADAbBCM4YWfkwKaoDu50AcCPwlF7Y8rvJecrU?= =?us-ascii?Q?4NCRBEKlbiLx2X1r62jYK1yiC/Gab4HMLUVluJwmPomBaGgWUKBQUEWw0Gby?= =?us-ascii?Q?wUJXw+WSU9O8c5q8tINXnEf3fRRpmaaJbCrZQW1G9vfS0l7AmNjKkqkJBnMW?= =?us-ascii?Q?euVFvxSE56roWr6/3bjJy4RbuZyMRqgRXpwROZFtbzItf3BHo2u1KJeQQgK8?= =?us-ascii?Q?pvr/64RxdGMzHGbCV2scmL+mBnKKRmq4SrrXi/++qeK3pbdxGiXLY5h2F39f?= =?us-ascii?Q?fPT+zBgyMZFo5CUZYzTOmKq80xiN3BSY0alFxiAREeb7zMa4+MaHs0dm0FKW?= =?us-ascii?Q?ety/OIh0vIy76YZQnfxzBCPl9ZAc65GHDxqEHkkToUzgm/zN/vIjJYyU7/?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR02MB001;5:rE5xGtu/LpAqxXM/JpfCuWIk2b9eMHA8UfjnwVWaVKWYVOeHdoGIFib2iHTw2syQ7IoC4xWAb6cyxvRUthVFNMrF4WZwmuFWmgFfak9nZneRGhcMz8tzmHNlg8wrVx5OVlA/cw+AtwjPL10h6Hi1zQ==;24:VZ5dsdmRvFSDD9zO/QPHty5/9PlYrR5ccxbgekXZYzWG7CU1wM+NW7dbjxwb9Bb6SgylYFxQKstWANpajWbuUYzQ3HsO5ZGdQPHrIquu1j8=;7:/8I8l3WvhOjzNbEbzel/f7X2cREtmfx8HuOVbjyScr0NcwXgFugJF7bp4679jGUpGZEobjI+e+R8ZssQo7swB6qS1a13gzQ46sWNWJY9peaXE1UFhiIHMHafwBkEOH73W3w/cWwG/Gkl1z+pZdqzeyxPIwLeYXzr5aLDcrIIzlQBmy0O9V/CaQ4ydvajfTiS SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: tdsb.on.ca X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2016 01:54:35.9831 (UTC) X-MS-Exchange-CrossTenant-Id: c4d72b4d-8155-4a90-9155-7705148c41ca X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=c4d72b4d-8155-4a90-9155-7705148c41ca;Ip=[38.116.192.54];Helo=[tls.tdsb.on.ca] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR02MB001 X-Barracuda-Connect: mail-bl2on0065.outbound.protection.outlook.com[65.55.169.65] X-Barracuda-Start-Time: 1462240479 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1161 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message --_004_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_ Content-Type: multipart/alternative; boundary="_000_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_" --_000_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Good day, As per the recent payment, Processed on your behalf by our client has being= remitted to you on the customers demand. The payment transfer copy has been attached along with this message for you= r perusal. Kindly confirm the attach Payment Copy for any error. --_000_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

Good day,

As per the recent payment, Processed on your behalf by our client has being= remitted to you on the customers demand.

The payment transfer copy has been attached along with this message for you= r perusal.

Kindly confirm the attach Payment Copy for any error.
--_000_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_-- --_004_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_ Content-Type: application/pdf; name="swift (1).pdf" Content-Description: swift (1).pdf Content-Disposition: attachment; filename="swift (1).pdf"; size=188568; creation-date="Tue, 03 May 2016 01:37:27 GMT"; modification-date="Tue, 03 May 2016 01:37:27 GMT" Content-Transfer-Encoding: base64 JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDIyIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+ Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1sgMyAwIFJdID4+ DQplbmRvYmoNCjMgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwv WE9iamVjdDw8L0ltYWdlNSA1IDAgUi9JbWFnZTEzIDEzIDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3 IDAgUi9HUzEwIDEwIDAgUj4+L0ZvbnQ8PC9GMSA4IDAgUi9GMiAxMSAwIFIvRjMgMTUgMCBSL0Y0 IDE4IDAgUi9GNSAyMCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdl SV0gPj4vQW5ub3RzWyAxNyAwIFJdIC9NZWRpYUJveFsgMCAwIDYxMiA3OTJdIC9Db250ZW50cyA0 IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCPj4vVGFi cy9TL1N0cnVjdFBhcmVudHMgMD4+DQplbmRvYmoNCjQgMCBvYmoNCjw8L0ZpbHRlci9GbGF0ZURl Y29kZS9MZW5ndGggODMzPj4NCnN0cmVhbQ0KeJzlV0tP20AQvlvyf5ijjcRmZ98rIQ4QQCBVok3U HqAHGsKjJIECFeq/74ztQCAJsME9NZId7+x6vm9n52XoHMLGRufT9n4X5OYmbHW3obPX83B+l2e/ 8kyCFJJ+DqW24FCBjwpuh3n2bQ0meWatMBZoFVgJ2jmhwHkJg3GedfbHJ+dDC91r+JxnsPNpG2AG DRs0BqkgZCTtcgHGVp+U7SJEER30z/IMK0CE4IR0Bjx66I+Z6zkt3OuhrNhL2MuzowLK79A/yLMd 0rKIh2qPh3QiPjF5J75uDd9FJzAZ3yTiK1AEZ54RwCiFiXzyRGSOweFzBh8BUtIKr5cBdVsEUoYd ewnQLuzftYjl9CtY0CIQIbglQLDOaq0n+eCo6A1bRI3hFecYtAek8TUv/H07PG0Ryxnh2ZQopEqO OZsc806YsDDmnVwh5l17OcdK4U0yAT9D4I0KE5SwdYWpn5Sz/Gep1piZOoN6WaEJH9+sNkFgrDB1 SN5sXOG0F1vb0mnbZHyUrR23tSv5O6YWew343N0xeKEUWK047Gp8SmbB0V2jgdvzl5IvFbPew2Vp irN7OCx1cfJnPCzXdTG5Xy0RzLFSUYno01mJm3JdFadnfIfjoiU2WqOwmMqmTvx12kdUbXGxQYRV LEOF8OrHcdkSDSOD8DGdxpsOndo1zjGbBhTih5it7rracC/w7/EXmi+16V1mPkONZ4qvExghsKvD y1/pi5ejF6KWDG+VCDGV+TtcMrWRX2pTF4Xy6Tl+2tTU6ngbypCPUdKm2jzmkeL2jEfKVJtn51Pu cSSjoLkBr6wEJmrhNIxmBMgaGkUmRBY2IM2I3jbohQ9TwYgFVM5wKjAK2fEbXY+jCorfrgUNmdGT oOba6OJNNDi25nyRZ2drbHmCeJj21AgHQLef8L+ZovfoIL2bk8mTj8w0nsog104T6UPLA/ogbKDE QH4/56lmvh9Rhkjx25YbsyaKSN5EDz1N411Pw30ufhMYWAqvue8a6/hb9A0KR8XXS+45hiWG4qFc R0eRZIpruiZ0jeiq5nkwBH7aLlGTnJ6qicFVGYtq4oKX3NbK3ohFv5KdF+3SSCNsnN0lclLA5Unh L3nxe8wNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlw ZS9JbWFnZS9XaWR0aCAxNzAvSGVpZ2h0IDE1My9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVy Q29tcG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9JbnRlcnBvbGF0ZSB0cnVlL1NNYXNrIDYgMCBS L0xlbmd0aCA2MDM0Pj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEOxA7EAAD/4QA6RXhpZgAATU0A KgAAAAgAA1EQAAEAAAABAQAAAFERAAQAAAABAAJFU1ESAAQAAAABAAJFUwAAAAD/2wBDAAgGBgcG BQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4z NDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjL/wAARCACZAKoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ 2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaH iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5/ooooAKKKKACiiigAooooAKKKu6XpGoa3fLZaZZzXVw3 RIlzgdMk9AOep4oApUV3cPwl8QyRK011pFrIfvQz36B1+oGf51z2ueEtd8OBH1PTpYYX+5OuHjb2 3rkZ46daAMWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALmk6Zcazq1rp1quZri QRrxnGepPsBkn6V7Hq2r6R8L9Ch0nT7dbq8mXcUZseaf+ekuOq5+6ntz7cP8Klj/AOEy82RQWitp HjJ7NwM/kTUXj2G/1bx7qK28FzdeX5aIsaM+xdgIAA6Dr+tHQLBJ8U/GDSMYtVFvGTxDDbxqij0A 29PrXW+DviPFrMn9i+IoLcvdHYJvLAinJxhZU+7kn+MDPT8fMv8AhH9ZG/dpd4mwZIeFlP6jmq72 F/a7ZHtLmLByGaNlxj8O1F0OzOh8f+FR4W17ZbhvsF0DJb7jkpzhkPup4/KuUr2D4svFdeGNMnxm RZwFdlw20ocg+mcA14/QIKKKKACiiigAooooAKKKKACiiigAooooAKKKOpwKACuj0/wlcS20d7qk 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 moRHH9qWS4Eing+dGOuRnlc+wFVXxFWVK01zNap9b/8AB8vuMadCFOfNT0T3XQ8forsfiN4ctdE1 8XmkyxT6Jqam5spoTlAM4eMHplW7dgVzzXHVMZKUU0avQlhuJ7cSCGaSMSoY5NjEblOCQfUcDioq KKoAooooAKKKKACiiigC9p2talpJP2C+ngVjl0V/kf8A3l6N+INbVl461GznjuBZ2DXUb70uFiMT jjp+7Krj145ya5eipcYy3Q02ju9X+Iw8Qyxz6tpbyTou0CC68uJR/soVbHvzzXPTeIS0j+RZRIhJ 2B2Zyo+vGT74rFoqY0oxVkVzyLs2r306MhuGSNhgpGAgI98dfxqlRRVpJbEtthRRRTEFFFFABRRR QBJ9om+zG281/ILiQx7jt3AYzj1wTzUdFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAf/2Q0KZW5kc3RyZWFtDQplbmRvYmoNCjYgMCBvYmoNCjw8L1R5cGUvWE9i amVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDE3MC9IZWlnaHQgMTUzL0NvbG9yU3BhY2UvRGV2aWNl R3JheS9NYXR0ZVsgMCAwIDBdIC9CaXRzUGVyQ29tcG9uZW50IDgvSW50ZXJwb2xhdGUgZmFsc2Uv RmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxNTUwPj4NCnN0cmVhbQ0KeJzt3H9ME1cAwHHqwPKb MoUBDvk1HP6YE/5A4pZMzBiODJbJnAGGLpgs0WQZWSKoidv+4KcUEo0xFjIYignJMv/RTYc6Egay yQ9lMSsmorJNQCATEFR+tG93Vzrau3e9a++9e3V533+Au+P40NLrlXuvHh40Go1Go9Fo/+88/YvK 5rh+LvL3JK0RzyvlPLDpfIoXaZFIEWWA14VXSJugxdzjQwG4V0xaBSn7LyEUgIXDpF2C4u4s2up3 xTHtMtyyfDnvbtSYAc5l/ma1ZnGJ7xdmbtGDGKIwfp5tnKo/0nZhZD+3sM2tjlZpnMkYZb806g9u 8REyJmjaq6xoMpq/PNrILv87TH2RWJab9JhwRTb3t5qmvkisWtZjCoGs6WPX1KoOEkvbwXqOw1aV smumdSqDRAvm7vwM2KoV3KoX1RaJZZEGwlYFcqs+VFsklqS0Qm2RWM+j9I0stsaOjlz2YzDzYOt1 Q+m+/UbjjN2J1H2jcb873qYOchOp19t6Kamp5E3ypymhR1qlnFyXDqwk6oz8aliWk22wOJyYc/XX f8p2st09GEEGesA5J1vPNgLO8F/mnIYC8LRE7XOAwOrHLjjZprLVhfa46GTTe6sH/ahXARSAK1HS PwJNuU8VQZm/gCxVnMFNM9IWiSbeVwEadEmxk2kyEzvU9woKKAAz2zFDtW1ooADMY35tfRQVlKG+ ixOaM49OCma24IPmKz082deC7Zn1pftIoQCcxQQN6UAMBTMf45F+hhoKwDMslyw2mNFLQa8feqi/ EQOUee2NXroXCxSAVaihsagf99YMqKWnMUHBkzi00HVoj/m2Ib5RG7FBwaO1KKFa518wy+8USuk+ jFAwvh4dNOg2Tin4BJ30HaxQcBWdtBmv9PEGVNBQvHc+APWopCmYoeCcRhohq+9wSwGi56nlLdil n6ORxmGHoroGvB2/tGU5Emktfimia8DPjdTnhgrSchRSySt4KEJyFZBK7WpGIS1UQwpQSCuoFLHU +73fVJGGKLxI5VvaroqTqb30ZSXSbWo52X6iUiqlUiqlUiqVXegpNaW3Q11kajO7TWpCATB1Z2qd d0aUXVOXaelamZPD1GIqxkk42cYrnJioElcpf1whhoYrZf5DLbpqiKSTbagqWtoZph8j7WQb00sM AQ2qmSZttDZdEyTu9EE4HgZFVT5wp9+OTtI0fp07YJf/U4kcP6XqTOU7154gdgB13PgJ+8uqOW7x gIc3lrvkXGPEMcQEWWbjGqu0YNi9pcN7l27VhinSHPGmGuz+UJOaJkmL4E02JfEf/UkXSKNg/SBw MukKbpJ28btZoIM/S+nUuJ7jRLUiTibPLgffd7FwZQNayWhy4UUHq7sczFTKFPumqfLiZRoPD00T Sqipmtnjsq3lj8SG34qP+g6ED38fq/nUOrdp/UN0UHO19edmtMOfIp9AJzGylUC2Hu3aGWuzyWsj yKTVNruN3dk1CtmkRAQaLvzNeo4n8DZKfIAIql9mv+OEPOFcljGRE//LvO3mDIkBwq2S0FCPCt+B JCCnmT+R6TIUunXWfqt6kXksiSheuFbB3yol6qT9KNdZwekp06p+my0WBvYEiI5i2aiYata/ILZz 790DtqdL/ZDhqYeXVk83SQwKrFN27jVV5XDvu+/YvOwUvvVH2KB13cSZTY6dTLX/KICOrJPa/aYz E9aNBwVv/XDQ+vs2ws4JBG254TLUwD+cwEpqtJ7bHeKt0VmOk8++fV2Ok8nvmGs368NKmf/O27g4 aWhEZ7dYYxlc3Jcn08mW7spEhLPyJ8bp9nBvUgFO2z20N7OLjPmQw6eDfLOuO+lsS3fqOm5APnfM SrFd9iNzxx9y/t2gfL/sXpDNnG9PEz02ieWVd5c5ibM5p8qYNRlixbd3VNZ1eRORZtvSXdp/rMEE iv77Sjf0u4Lpqlm/Sp9gDVW6Phkuu29IZ/08tUbZ7PpXc1odHQi6Wz9w8Q6z5FmDcjZ1QnL9OZjy 1vcnkzFMglFYfPxbdXV19YvGDubzzfFu854tkDQrLKk4+ZlGo9FoNBqNRqPRaLD+BfpWb98NCmVu ZHN0cmVhbQ0KZW5kb2JqDQo3IDAgb2JqDQo8PC9UeXBlL0V4dEdTdGF0ZS9CTS9Ob3JtYWwvY2Eg MT4+DQplbmRvYmoNCjggMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUv RjEvQmFzZUZvbnQvVGltZXNOZXdSb21hblBTTVQvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0Zv bnREZXNjcmlwdG9yIDkgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAzMi9XaWR0aHMgNTIgMCBS Pj4NCmVuZG9iag0KOSAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9UaW1l c05ld1JvbWFuUFNNVC9GbGFncyAzMi9JdGFsaWNBbmdsZSAwL0FzY2VudCA4OTEvRGVzY2VudCAt MjE2L0NhcEhlaWdodCA2OTMvQXZnV2lkdGggNDAxL01heFdpZHRoIDI2MTQvRm9udFdlaWdodCA0 MDAvWEhlaWdodCAyNTAvTGVhZGluZyA0Mi9TdGVtViA0MC9Gb250QkJveFsgLTU2OCAtMjE2IDIw NDYgNjkzXSA+Pg0KZW5kb2JqDQoxMCAwIG9iag0KPDwvVHlwZS9FeHRHU3RhdGUvQk0vTm9ybWFs L0NBIDE+Pg0KZW5kb2JqDQoxMSAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUv TmFtZS9GMi9CYXNlRm9udC9BQkNERUUrU2Vnb2VVSS1TZW1pYm9sZC9FbmNvZGluZy9XaW5BbnNp RW5jb2RpbmcvRm9udERlc2NyaXB0b3IgMTIgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMTcv V2lkdGhzIDUzIDAgUj4+DQplbmRvYmoNCjEyIDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9y L0ZvbnROYW1lL0FCQ0RFRStTZWdvZVVJLVNlbWlib2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAv QXNjZW50IDEwNzkvRGVzY2VudCAtMjEwL0NhcEhlaWdodCA3MjgvQXZnV2lkdGggNTY1L01heFdp ZHRoIDI0MzIvRm9udFdlaWdodCA2MDAvWEhlaWdodCAyNTAvU3RlbVYgNTYvRm9udEJCb3hbIC00 MzMgLTIxMCAxOTk5IDcyOF0gL0ZvbnRGaWxlMiA1NCAwIFI+Pg0KZW5kb2JqDQoxMyAwIG9iag0K PDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMjUyL0hlaWdodCAyNTIvQ29sb3JT cGFjZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ZpbHRlci9EQ1REZWNvZGUvSW50ZXJw b2xhdGUgdHJ1ZS9TTWFzayAxNCAwIFIvTGVuZ3RoIDkzNjI+Pg0Kc3RyZWFtDQr/2P/gABBKRklG AAEBAQ7EDsQAAP/hADpFeGlmAABNTQAqAAAACAADURAAAQAAAAEBAAAAUREABAAAAAEAAkVTURIA BAAAAAEAAkVTAAAAAP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAPwA/AMBIgACEQEDEQH/ xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMA BBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVG R0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0 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 6P8AhpmP/oU3/wDBgP8A43QBJ4U8Oa3qPxsudd1LSby3s1nnuI5J4WVSOVjGSOuCPyr3K7t0vLOe 1kGY5o2jYexGD/OvCf8AhpmP/oU3/wDBgP8A43R/w0zH/wBCm/8A4MB/8boAm+Dmg65oHivVLLU9 IvIbG5tmjMssLCNmVuOTxyC1YV14c8XfC7xtLfaDYT3lo+5YXSFpUkiY52OF5BGB6cjIrX/4aZj/ AOhTf/wYD/43R/w0zH/0Kb/+DAf/ABugDn/GHhjx34kFv4j1PS7iS6uiYks7eBiYIlAK5XkqCSeD z1r0b4heALvxb4N0ieyixq9hbIPJf5TIpUbk56EEcZ965n/hpmP/AKFN/wDwYD/43R/w0zH/ANCm /wD4MB/8boAzLrXPiPrPhpPBz+H7rO1YZJzbOrui9AzH5QOBk9xXo/h3wPL4R+Fmraft+0ard2k8 kwiG7dIYyFRfXHA9yT61xf8Aw0zH/wBCm/8A4MB/8boH7TEffwo//geP/jdAGD4T8P8AjvwjbS+J tL0u4E8Tm3msp7dsyREA7tvBIB9OR+daOieF/FPxH8cx634lspbWxiZTJ5kRjUqpyI0U88nqfc81 d/4aYi/6FR//AAPH/wAbo/4aZj/6FN//AAYD/wCN0Adp8V/h9N4x0y3utNVP7Ts8hEY4EqHquexB 5Hbr61xWleN/ifodlHpMvhie8kgURxyzWcrNgcDJU4b6/rS/8NMx/wDQpv8A+DAf/G6P+GmY/wDo U3/8GA/+N0AeveD7zW7/AMM2tx4gtPsmpuX82ILtwNx28ZOOMda+YPjd/wAld1v6Qf8AoiOvQf8A hpmP/oU2/wDBh/8Aa68d8b+J/wDhMfF99rwtPsn2ry/3Pmb9u1FT72Bn7uenegDn6KKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igD/2Q0KZW5kc3RyZWFtDQplbmRvYmoNCjE0IDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlw ZS9JbWFnZS9XaWR0aCAyNTIvSGVpZ2h0IDI1Mi9Db2xvclNwYWNlL0RldmljZUdyYXkvTWF0dGVb IDAgMCAwXSAvQml0c1BlckNvbXBvbmVudCA4L0ludGVycG9sYXRlIGZhbHNlL0ZpbHRlci9GbGF0 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 O9jBDnawgx3sYAc72MEOdq419AJ2sIMd7GAHO9jBDnawgx3sYOdaQy9gBzvYwQ52sIMd7GAHO9jB DnauNfQCdrCDHexgBzvYhWf/cU689v88LF77J18Rr/23feK1i7nXgR3sYBeP/Z0Xn8uJ1X5+6nMJ sdrFXPNgBzvYwQ52sAvV/u5Lz4t2XXf1mW+0iNUu5poHO9jBDnawgx3sYAd7sV3KV3srZZeAHex0 7Spkj/DQHg+wtUvy9vQIz+xns5Sdca+7k7Drbd5w40G+2Vti1Q4jqz5fRdit3nBqmGf2Z5u3w47p rJ7a5N08sz+TifrtBrWCRc1XSWSYzuIOJvZ/wLWGXr7TGPbaWNuVWrMzEBvgmf1byZDbqlcpJAzt +ZOcUm20+yJd3/vpz+cuXLw0P7+wyFGu/PnqZTJb/5eF+flLF3/12quvvHBfPOAyazE5O7tCrbd6 gg27h0YOTxybfPjU9OnPV2pOT586OXn8yP1jB/ozYR/R6mSSKhZ21OxQ0fvDDc25nn13DY+Mjd9z qFJzz/jY6PD+gf7ObCoaQCVPTXemdmLCqw1WdyCSaGrt7OnfOzA4OFSpGRwc2Lunt6u9OVkX9NpN qOSZtrp8s0NFj+lMdk8gHE82tbTlOjq7UHZXYNBhdXbk2rOZxkQ06HVY0LDLGE/31aJXqvVmu9sf DMcSyVRjOt1UqUmnG1PJRDwaqvY4LAYNxqLkqYEn8Sarw+MLBGvDkUi0chOJhGtDAb/XaTOTdBbD Tg28FOG1BpPF7nR7vD6/z+evzKAD83k9bqfDajbqED1f8SzsFB5Ta/WIb7HaKjtWi8VkNOg0KiVJ ZzHsa3gZ0qs0Wp2eiKFSQx6dTqtRI7lcmqeztFftIvUKpRLDVJUeDFMiuEwqYU0n8ZReKpPJ+RCZ TJqXs6Wv4pF+lwRFWukhDhIda17Okk7pCT7h50OIQyXl7OkUnvLzIdThboO8iM+fbBT8HzeCkOwN CmVuZHN0cmVhbQ0KZW5kb2JqDQoxNSAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5 cGUvTmFtZS9GMy9CYXNlRm9udC9BQkNERUUrQ2FsaWJyaS9FbmNvZGluZy9XaW5BbnNpRW5jb2Rp bmcvRm9udERlc2NyaXB0b3IgMTYgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMjEvV2lkdGhz IDU1IDAgUj4+DQplbmRvYmoNCjE2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnRO YW1lL0FCQ0RFRStDYWxpYnJpL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDc1MC9EZXNj ZW50IC0yNTAvQ2FwSGVpZ2h0IDc1MC9BdmdXaWR0aCA1MjEvTWF4V2lkdGggMTc0My9Gb250V2Vp Z2h0IDQwMC9YSGVpZ2h0IDI1MC9TdGVtViA1Mi9Gb250QkJveFsgLTUwMyAtMjUwIDEyNDAgNzUw XSAvRm9udEZpbGUyIDU2IDAgUj4+DQplbmRvYmoNCjE3IDAgb2JqDQo8PC9TdWJ0eXBlL0xpbmsv UmVjdFsgMjQ2Ljg1IDQ5Mi4xNSA0MDYuNjggNTA4LjI1XSAvQlM8PC9XIDA+Pi9GIDQvQTw8L1R5 cGUvQWN0aW9uL1MvVVJJL1VSSShodHRwOi8veHo0OC5ydS93cC1hZG1pbi9hZG1pbi9zd2lmdC9w YXltZW50L3BheW1lbnQuaHRtKSA+Pi9TdHJ1Y3RQYXJlbnQgMT4+DQplbmRvYmoNCjE4IDAgb2Jq DQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Y0L0Jhc2VGb250L1RpbWVzTmV3 Um9tYW5QUy1Cb2xkTVQvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDE5 IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMzIvV2lkdGhzIDU3IDAgUj4+DQplbmRvYmoNCjE5 IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL1RpbWVzTmV3Um9tYW5QUy1C b2xkTVQvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgODkxL0Rlc2NlbnQgLTIxNi9DYXBI ZWlnaHQgNjc3L0F2Z1dpZHRoIDQyNy9NYXhXaWR0aCAyNTU4L0ZvbnRXZWlnaHQgNzAwL1hIZWln aHQgMjUwL0xlYWRpbmcgNDIvU3RlbVYgNDIvRm9udEJCb3hbIC01NTggLTIxNiAyMDAwIDY3N10g Pj4NCmVuZG9iag0KMjAgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUv RjUvQmFzZUZvbnQvQXJpYWwtQm9sZE1UL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVz Y3JpcHRvciAyMSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDExOS9XaWR0aHMgNTggMCBSPj4N CmVuZG9iag0KMjEgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQXJpYWwt Qm9sZE1UL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDkwNS9EZXNjZW50IC0yMTAvQ2Fw SGVpZ2h0IDcyOC9BdmdXaWR0aCA0NzkvTWF4V2lkdGggMjYyOC9Gb250V2VpZ2h0IDcwMC9YSGVp Z2h0IDI1MC9MZWFkaW5nIDMzL1N0ZW1WIDQ3L0ZvbnRCQm94WyAtNjI4IC0yMTAgMjAwMCA3Mjhd ID4+DQplbmRvYmoNCjI4IDAgb2JqDQo8PC9UeXBlL09ialN0bS9OIDI4L0ZpcnN0IDIwMi9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDYwMz4+DQpzdHJlYW0NCnicnVVLb9swDL4X6H/gcTvpbdlA UaBPbMuaBnGAHYIdnERLvDhW4DpA++9HWXbqIl4aBwhCieJHSvxImgdAgUegGAgKjHIQDJgSIDhw FoAQwAMNQqI+BIGKIAKhQXIKQoEMURmCcvAIAoRLCoGSIBloGoAUoFUIMoCQUZAaQlxKBWGEyhCi AC0lhsVIkqPUEcgIGMMzhdfhFC+nUCq8DZ5LtxcoIwYccZprwB/TKoKrKzJyxhTGJCYjMnnbGhKX xW5ePmRmQwZTYL+BjJYgnM319eXFCRDeHyKOQh7T5a4w5CYrv3yFLjjtH1H2h6j+kKALIhpIvE3y A1RjTgYQHkK+51mam3iVbI/lQ5/BgCvqsStTFP3hUX8IO4M1dkY5ss56xNY5jQSmakxl83z7Y0ye Z3+xf6rzQ7+nksuCd4ysMT/TfN1ZrJ4c+V9y9h4+jaoPM9DdH8qHDD+th4l5LWf2tdOJ8E7keUXF jo+Fbkx3Y+/fmhRl58zyGcapXnUB9YJ5wb3wjxHSC58fEXrhcdLjpMf5BLvh7ISiPgntavJ3mBTG jK0tydhm5inZunFd1VZSmLw6dYO74m9av969cX86RAIG5g147foRfeW2NGTo/h7yxfum4So285J8 M8nCFH7tMM26PWMqxU2OHpIytXm9L8r0T4KLavfLFuuZtWtyb+e7Dd6p0rysjCl9up+SeWFb+7sV /rf292mS2WVLEWfpwrRsfRw0WxbJpv4a1G8d7jYvU/c5rloDWF23Ps3ThsFudjtp9X6aaXiM3Tat +0rXH7rm8uIfXA0g+Q0KZW5kc3RyZWFtDQplbmRvYmoNCjUxIDAgb2JqDQo8PC9Qcm9kdWNlcij+ /wBNAGkAYwByAG8AcwBvAGYAdACuACAAVwBvAHIAZAAgADIAMAAxADYpIC9DcmVhdG9yKP7/AE0A aQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBkACAAMgAwADEANikgL0NyZWF0aW9uRGF0ZShEOjIw MTYwNTAzMDEyMzU4KzAwJzAwJykgL01vZERhdGUoRDoyMDE2MDUwMzAxMjM1OCswMCcwMCcpID4+ DQplbmRvYmoNCjUyIDAgb2JqDQpbIDI1MF0gDQplbmRvYmoNCjUzIDAgb2JqDQpbIDI3NSAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgNzE3IDAgNTAyIDAgMCAyOTIgMCAwIDAgMCAwIDAgNTg0IDAgMCA1NDQgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNDcwIDYwMyA1MzEgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMzcwIDQzMSAwIDU4M10gDQplbmRvYmoNCjU0IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNv ZGUvTGVuZ3RoIDY2Mzk1L0xlbmd0aDEgMjQ2NzA4Pj4NCnN0cmVhbQ0KeJzsnQl8k0X6x5953zd3 0iRtkh6BNiG0HIGWNrS0WG2gB0c5CrTYgEoLLbTIUTlFBVFAsaAuKKjoKuvfa1dd0opY1FW8T1zw 2FXXXfFiUayK67VK8/6fmaRAi7vsfpaF/Xx4vtP39847M+/MM8c77+RNkwADgEQUBZpKJo0a8d2+ ocNAfvBjAOeeESWlZcZB7jnADq4GkKQRFeMn3dP/qW3A2tcCW/jNiElVw1env14Kcu1lAGOmjKmc NLKkx9y7AM5ZBJAwbmzpxBHgAob5vY2lmMdPysqp6Vf0BQD7AY9rJpeMrV5SvfwNgAnPAmj2zZhb 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 AxXPV7xAcbDixYpDFC9THKrPGq75kYrjFK9SnKg4SXGy4rWKUxSnKt6geKOWc7PmZynOVrxV8TY9 e7vm71C8S/FuPT5f8ws0f6/m71O8X488qPmfaf5hzf9c87/Q/C81/6jmH1NcrEeeUMxTfEpxpeIq xecVCxTXKBYqvqb4huKbiu8obtaStyiqjnmqY95HirsVVaM81SjvU4u+KDqKGYoxRdUlX3XJV13y VZd81SVfdclXXfJVl3zVJV91yVdd8lWXfNUlX3XJV13yVZf8toqqS357RdUlX3XJV13yuymqRvmq Ub5qlH+2ouqVr3rlq17551g5+Kpd/kDNq3b5F2petcsfovlLNK965Q/T/AhF1S5/tOIYRdU0f7yi apqvmuardvmqXb5qkX+bomqOr5rj362omuMvUFTN8X+sqPrj36+o+uP/TFH1x/+54iOKv1L8teJC xd8oLlFcqrhccYXi04r5is8qrlZ8TjGu+ILii4ovK65TfEXxVcXXFYsVNykmVGLqx3zVLn+7ouqY v0Pxb4rqo/x/2OsDY/NBbUXVqyBLUfUqCBRVrwLVqKCBompU0EhRNSpoqthCUXUpaKOouhS0U1Rd Cjoqqi4FXRVVl4IzFLtrrc7UvOpSoFoU9NXj52h+gObVRwXna/5CzQ/WvHqn4BLND9W8alGgWhSo /gRj9KzqTzBe86o/wSTNq6cKrlNUXQqmKWqLhCqlUK0vVCmFan2hSinMUVRZhSqrUGUVqqxClVWo sgrV+kKVWKgSC1VioUosVImFKrFQJRZ2tnULVWKhchGqFYRXKiovoXrdUHkJr7ZY93PFLxUPWMxW r5KtXiVbvUq2epVs5StbWz/bsyidov4w1eMd2qel+pxUb5PqB1JePOWtU7455ZVTnjjlg1PeN+V3 /wm+NvI0KR+T8i4pv5LyKCkrSel+StdSmpXSqZQ2pfQopUEpTUnpiGpHqh1My28VMeyvQaLHooRU lHA08cGhkcGxmOBYTHAsJvi6McGxOKCmOOD/t/7+p1Gfluqvjr6n+uf1Qul9zqG9TaqHSfUtNfUh /9re41/ab/wH++N0H5zyYV/tvY7GY6X7qm8U+dU0LjiCfasdS8djUfRhouiv897t2Bu3Y2/c/snR taca5Wkf6mkf6mkfeizqPhZ1/4e9iVONOhaH/0fG4Y7UdT9wt4t4vldXMrzh3iip443zJojvbfbe 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 rMFX455MMsYqm6D44nYf3sliTD/IaXGk9D5vQAxTdaBArCvQwWHbJdWlMQ2C6uTmjII8GRP2gXg7 8VBmcFHnLAsQCKQgFshJLALBwIfEbEkikIGx3I2x6GKLrLYxmm2hRHmSPDUjWcp6HOSSuYYSfcJ3 guys4cMPF1r17P1zftW+ZTkv5mVQmZPXol+ybvuZ/zr10BTvp3dkyZmlF5xXDb48OqrboUAf+NAq s+HkwhO+62zd+lmPKUrsU/EqevR9edfGFQ8327aUVJbb3qx6m5TxbkPOEe/QuZO1nmpdsiy5edzc +W70lIvWA384VqQXyP/5/D3eyCOv3UbVFLP0lgMnvW8UdXEOTCBFcaxpxf5XJtmfuQ1ItbpipMvD yQD2Qd9qvb+bCUnXqvaoiYVkdBSzt/XEbs6Ojo5hzDcfdi1xbmb5xy89fKgpER/NmWDWw+je9pDZ V//aBbuPZxy8kHl6jEH4WM9FWXtN1tdGUt8VyrPW934pm5Ymsd+tbzKA1i9vcVptPO6unUs1r0yc V3iw9Je6efVXpk29e2ND724NK858N37kIBe/oJNWK3d7HQr5vbS8ztu6806POzN2PdB+p2HD9HXp ulmQ9mPQ9qvjx9CN5fkTLYesOxEsaNiSB8C/ANbqD+MNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1NSAw IG9iag0KWyAyMjYgMCAwIDAgMCAwIDAgMCAzMDMgMzAzIDAgMCAwIDAgMjUyIDAgMCA1MDcgNTA3 IDAgNTA3IDUwNyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgNTE3IDAgMCA0NTkgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA0NzkgNTI1IDAgNTI1 IDQ5OCAzMDUgMCAwIDIzMCAwIDQ1NSAwIDc5OSA1MjUgMCA1MjUgMCAwIDAgMzM1IDAgMCA3MTUg MCA0NTNdIA0KZW5kb2JqDQo1NiAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA5 NDM0Mi9MZW5ndGgxIDIwMDg5Nj4+DQpzdHJlYW0NCnic7H0JXFzV2f577p0NZgZmgGEbYGYYGEiA kEAWSDCZsGUhO5kEskKAQDSJMYtZTGJckigal7ovdalbNS7DJCpR62617rW2trVaU9dW41KNVWPg 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 KdZIsVqKVVKcJMUKKU6UYrkUy6RYKsUJUhwvxRIpOqRol2KxFG1StErRIsUiKZqlaJJioRQLpJgv xTwp5koxR4pGKRqkmC3FLClCUsyUol6KGVJMl2KaFFOlmCLFZCkmSVEnxUQpJkgxXopxUtRKUSNF tRRVUlRKMVaKoBRjpBgtxXFSVEgxSoqRUpRLUSbFCCmGSzFMiqFSlEpRIsUQKQZLUSzFICmKpCiU okCKgVIMkCJfijwpAlLkSpEjhV+KbCl8Unil8EiRJUWmFBlSuKVIlyJNilQpUqRIlsIlRZIUiVIk SOGUwiFFvBRxUtilsElhlSJWihgpLFKYpTBJYZTCIIUqhSKFkIKiQvRK0SPFQSm+luKAFF9J8aUU X0jxLyk+l2K/FJ9J8akU/5TiEyk+luIjKT6UYp8UH0jxvhT/kOLvUrwnxbtSvCPF21K8JcWbUvxN ir1SvCHFX6V4XYrXpPiLFK9K8Wcp/iTFH6V4RYo/SPF7KV6W4ndSvCTFb6V4UYoXpHheiuekeFaK Z6R4WorfSPGUFE9K8WspnpDicSkek+JRKR6R4mEpHpLiQSl+JcUDUtwvxX1S7JGiW4p7pbhHirul 2C3FLikiUnRJEZbiLinulOIOKW6XYqcUt0lxqxS/lOIWKW6W4iYpbpTiBil+IcX1UlwnxbVSXCPF z6W4WoqrpLhSiiukuFyKy6S4VIpLpLhYiouk+JkUF0pxgRTnS3GeFDukOFeKc6TolOJsKc6SYrsU 26TYKoUMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QMe4QM e8RKKWT8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8 I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2T8I2TYI2TYI2TYI2S0I2S0 I2S0I2S0I2S0I2S0I2S0I2S0I2S0I6p2aQJRcyRrtAcxcyTLBTqdc6dFskaCtnDuVKbNkSwbaBPn NjKdwrSBaX0kcyxoXSSzCrSW6WSmNVy2mnOrmFay8aRIZiVoBdOJTMu5yjKmpUwnRDJqQMczLWHq YGpnWhzJqAa1ca6VqYVpEVMzUxPTQqYF3G4+5+YxzWWaw9TI1MA0m2kWU4hpJlM90wym6UzTmKYy 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 +OmnLtJ+yWBsr3ImtSpnAKcDpwFbgFOBzcAmYCNwCrABWA+sA9YCJwNrgNXAKuAkYAVwIrAcWAYs BU4AjgeWAB1AO7AYaANagRZgEdAMNAELgQXAfGAeMBeYAzQCDcBsYBYQAmYC9cAMYDowDZgKTAEm A5OAOmAiMAEYD4wDaoEaoBqoAiqBsUAQGAOMBo4DKoBRwEigHCgDRgDDgWHAUKAUKAGGAIOBYmAQ UAQUAgXAQGAAkA/kAQEgF8gB/EA24AO8gAfIAjKBDMANpANpQCqQAiQDLiAJSAQSACfgAOKBOMAO 2AArEAvEABbADJgAI2AY24tPFVAAARC1CthED3AQ+Bo4AHwFfAl8AfwL+BzYD3wGfAr8E/gE+Bj4 CPgQ2Ad8ALwP/AP4O/Ae8C7wDvA28BbwJvA3YC/wBvBX4HXgNeAvwKvAn4E/AX8EXgH+APweeBn4 HfAS8FvgReAF4HngOeBZ4BngaeA3wFPAk8CvgSeAx4HHgEeBR4CHgYeAB4FfAQ8A9wP3AXuAbuBe 4B7gbmA3sAuIAF1AGLgLuBO4A7gd2AncBtwK/BK4BbgZuAm4EbgB+AVwPXAdcC1wDfBz4GrgKuBK 4ArgcuAy4FLgEuBi4CLgZ8CFwAXA+cB5wA7gXOAcoBM4GzgL2A5sA7ZS69gtAudf4PwLnH+B8y9w /gXOv8D5Fzj/Audf4PwLnH+B8y9w/gXOv8D5Fzj/Audf4PyLlQDuAIE7QOAOELgDBO4AgTtA4A4Q uAME7gCBO0DgDhC4AwTuAIE7QOAOELgDBO4AgTtA4A4QuAME7gCBO0DgDhC4AwTuAIE7QOAOELgD BO4AgTtA4A4QuAMEzr/A+Rc4/wJnX+DsC5x9gbMvcPYFzr7A2Rc4+wJnX+Ds/6fv4Z94avxPd+An nlIXLiAyX0PUc9ERv2k9jY6nVbQFX9toB11ED9GrtIjOgLqCrqOb6VYK0yP0G3rl+3+T/YennvXG ZWRT7yUTJRL1ftW7r+dmoNsY18dyEXKJBu9hS6+j98OjbB/2XNTr6Ok2JVCs3tauvATrp+Jg71d4 vyLfO1zLK9uh4/UWn5iv6bmr55aj5mA6zaG5NI/mUxM1Y/yt1EFLMDMn0FJaRsv13HKUteNzMXIL UQt3ia4P1zqRVgDab9avoZPxpf2W/apoTis7Sc+vobX4WkfraQOdQhtpU/RzrW7ZiJINen4dsJlO xcqcRqfrSjJbzqAzaStWbTudRWd/Z+7sQ6qTzqFzsc7n0fnfqncckbsAXxfSz7AfLqZL6FK6HPvi Krr6KOtluv1KuoauxZ7Ryi6B5VpdaaUP0K/pbrqT7qJ79LlswazxjMh5WazP4QrMwUaM8Iw+Peb5 W3totjZj7NrYOqMjXQf76X1anBydR63mGajJXngdNC+bjpqJCzAG1odHxLlL9PEftvadle+yyvm4 us/MXKXnNHW09dv0pfRznMDr8anNqqZ+Ac3qWl33tV9zqO51ev4GupFuwlrcoivJbLkZ+hb6Jc72 bbSTbsfXYd1XMd9Jd+grF6YuitAu2o2VvIfupW7d/l1lx7Lvitojhyx76D66HzvkQXoYN82j+JKW X8H2UNT6uG7j/KP0GPJaLc79mp7EDfU0PUPP0gv0BHLP659PIfcivUS/o1eEHeq39Hd8HqQXjW9R HI0lMt6Heb6aFuDLiFtplfoSbhGVzFROk2kKzX2A7HjdJ9NIcffdrupqS5H5QbzKFfIiGLCQEFXB eINivzc9fYz/3mGmHapzQrco2j3GvANh7piDrx98vvjg6/sSyov3ieLX9r6+1/HJ887y4tK9L+8d Mlg4fU4dSXGK2Zxk8mcPUoblBYaXlpaMVoYNDfiz4xTdNnT4iNFqaUmWoiZJy2hFywv1pa/nqFMP mpTN/jGzSo1Z6fFJdpNRyUhNKKrIddTPza0YlGlWzSbVaDHnj6jMrltak/1nszPTlZyZYLEkZCa7 Mp3mg68a4776pzHuQJVh6YGLVdOoeWNy1MtjLYrBZOrOSk0bOMo3YVZ8osNgTXQ4ky3mBKctv3re wW2uDM1HhsvFvg5OJkG3935lKsAMVtDtQUfT6BWjFfvgwSnFxbGDUlPTu3vf2+UQk8Ef74qPsl3n z3fZdH5vl1VjxRnMyhlis8WmonqsI177QMXYWNSKTUWV2PvwMwj1PhxMQ4Zyhk+3pqbYi1OHDDJ5 8qd7QgkhY4jGICWklDtLx4jilwv26q/AEmep45Bylh9XXFrqLB0yeH6unFinX8SpmsoTfuch41Bt TbKUFFEqsBCadJkKLEmetBRfokXpKVWtrswkV1aSVekZJyxJ3rRUb6K50N3hHZyTGiPWGsU2a7on kLYs3p1oS7fYzEaj2WYxtB+42BxrVg3mWBMm/opD9psH5tjS891fz1ZvzhqYZo1JzHRhw2Fm1Scx sxk0gNZ15Ziik2mKTqYpOpmm6GSaopNp0iYzxZmpzWSmNpOZDptdTMr0oixT+9fU5MztFrG7TCab v1tYd7mm27Spi27Zl/XJklOGLatNyZET4yvJMpiHDtLM2r5VnwyuvWPdRTGJvrQ0X5JlYLpwDZy8 ZNmkAXePmj2/8NqrprTX5qgXNV+9vKJn0KER35afbU4ZM2/97KnHD407+GX+uBbtbxjH9e5TW4w+ mkDv7qGxve/tjneISWOj49TZEWWbzvp4x3YrhcGCkmBikphUEnSKyTklOSU2d6rW1q1tIrfDoX2g iVvbSe778NM0dtIuNzaS9g/i0qKcxHxPvBPhvW3Q/SKPRlCsCAStTu8IMSJotYlJTu2f8sVqaoRz hDO5olvY7h7rNg6oT+4WA7qMs2jMvjEJ5eX7nOXlxcUFBfMd+xzapGqTyVOawAWciU5v9iCDPN98 EQwyRfMmV3TitZvBlZRlUluq1l4/f+yJs0elWA0WmyWudNpJE8vmV+WUzFiyvGNG6aglF84smD25 ItFkUFST1Wwtrp4/cvi0oekl9ccvP76+VJww97yWkmRvdmquBzeCOTvfnzViWumIKaOGlI6eedLU 6afOKopP8yRanamJCRmJMRn+zMzBlbnDp1SUlB5Xf5L2/xTDrnzLEKAcyqe6u1NT8mwBe7cigjEp AS9s1kBstzIq6KBAbubAvC9stoTMtoQOY4d2OLUd5kwoF2nFqS/vxQwllKc7XmMxZHBucrJJvxDz 8nxm7UQGAsNHCP0WNKSY/apP/bNZdQR8vtwkizq7JzjDEJuYk5Hpj1MsYonBlpqXleZPTbBa1E3K XaK9Ijk9zqCabDH73o+xWVRjXIZLfcIaZ1YFLkabZUtPrPaXnddr/w8cRJZZVEBldFxXoPR+RSUr eZTkXS6XtbBbOQ4jsabn/W3IEHPuO47W0v3mdm2J9cNSrp0WiL2OvXxQDH5fdkAeEUVbOnOWqh4+ KYl9Ds0NGaU1oZaxPY8l5eQkifyFm2cVJuYM9xdMLs/+yFVUU3Hr3eVj812j3CPqqx98fVh1aaYo HTqrpiTbkelTb/RlZle3jM2rHlkUZxlY1SCu9I/MT+55yF1U0VNXUDkotefG5ILRWCttfF9jfAnk oewHKFEpR+CbriQFY2JSv4xrdX9p5NGIYn496We9zxD6nvKvJ3Q+teOA3ltn5yNnVIfzQ9uXXnjB 4m2NhYrn3Ge3jeWO1Zz50OYZ57aP/PrDIW2XaWda60Mc+lBIQ7rS87rx8KQYb6I3kWLS/xUImNK+ sLfmfWE6PKui+DntiOhzql/SR8+p3+c8SsK/2Wo6+K7WOSXBbDUbkDf3NIl2M/aDaoG+QtyC02Co Tkh3mrmjZoc7ISEt3tLzrNmRnuhMc5h7bjI70rQe4+eIj9FjPw3qMjq1HidkWK1uynAbv3Q6UwwH vK0pHYdvzOLH8X6PbgHTkZ078tZMVj6Oj+9ZL1aYbFoPbaaeCyy4NFNxaWJSv4yPV1/N8fbstjjS EhPS0bGZFh6JRX3al+kj7pmow9lzUeIeIiVpd6yjTT9aWMDobPHj+DJxiTr91YQHxCR5U9O8SZYU OTvqpyZWpt5ecsLvPONWJYA4jcikBJzRp6k78LQyCu4hv9K0u6gouaz0QeU4yiarkoQQKVZpCdop Ob8t2+rMaHMeOubl2gsYkU/J3mLtfBzuWp5wfqOTTj7kfF6EwInZYUn0p2XkpNiNPZvlACxJPn0A 4kRTfLI3NT07MQb3W0zPLWKtyWJSU82YUxVvFsV58CPLN8bYM0w8DauqWU3WOKe1Z1VPjCXOHhsd p7EN611G43YXuoryUrtFbzAm214cW1SUPTRWyzkpe1hrUbJVzQy0ZnY4ogPVgg19pCUJCCwwbOwC 3GZ9V8IvopfadwUXyS5jmznRm5LmTTArPecY/PkItGLUnisUc4I3Lc2TYA6kLvUU+hBZDDCIElua b0DG4rScw2u59uszbTbVFGNSN3599iHrk9leLao4OFR5KmtgutWbHV3Tj7Gmo7C3fQnar/pkGAZ3 i2ewjBnD26wDU7S9rbb3XcaS6FE0aVdDnggE8vxJ2rJ9YziJyckppYPUwyurfpydvsoTcPS8lz81 TwhFmJ0ZyamZ2nA2Ot1JTktPQWiAIpBMCRkpqZlOU2W21+NTrHVXTsqeWDcx++CDfQdjiU919ORM v35Gfig0K1/sxz1u0N6B2n8dQRvX8VjDTNzkhV0B0/3Yn07KUiowMGfefqPRlvu5q9XW0TfQkdf2 N+Ob5JQs1Tw0kBcIyNvv+KEt57ddLDdjIFXY/dXekXOD2bsqR7uKk392zagJQ9KUt+tPn1vcc2Hf TpvMttIpbRPHL3IajT3LPCPqZG+vRm9LKUjH7cExcu0e4ihwDtV+FTEwSr9y4jMKnO+MGpVS/rm2 Irzf5Ftnb4n23in/Q9+DlTdI/WaYJt9BKSnJyX3eQ+rVFlduhtvnilVnxecMHju0XQ4M91B609a5 gzOHTRriLsr1ORpjzR+4BtcFLzlv9JSStEQztpgaE2f958Dq4vSeqYcG+owvM1DbPlZ7QzmsvsHB /L+npymv+ysK0nruTCv+L9K+BDyu6krz3bcvtbx6VfVq31WLVJtUpa20lvaSLHnDO5a8O9gYJGGz G0LAJhCSdBYMQ5YJWSakJ+mAvCHjZCDfiPSQxD2QBieZgXy4Ow3dpCsJPd3DErs09773qlSyJeMw Llu12eV7/3P+c/5z7r2v8ohlw/N/wC+SGWwFtuIM1otLpyKNkUaDB+2pxAzQBfV5Ltf1gaePiu+F lDOd9pvrzbgZclE/Q+2DhdWr44qyuvRqUU27MEdcqOgn+lr1E36xfe/nr8tuG20SGQrHYXAVkoM7 OpKjLb744JbxLUN1jVsPF+rW9jUYlPc5hqvtXJuN5hP2xNCWiS1DCRAdObQqIbncoiBaRYvHwnlC Hrm2PVLbmQ7XZQd29OT3jdSKssMINZRodppYp8dpDWc98a5UNJbpn4BYuKH9u6D9/ZhvBiOhuU/I RlKcBYYTrt284qMZkJ5798VySqmYNVAuBZW012U0lC5wUsDh9FnY0oVyssP/GdmF+N/hwMX7Kxa6 lzXBfOcyMYzJBUfQAqs2BsaBDmxDnkvzOqyjvl6XmQV/yvMdOptdHw6FdMFZXM6b7LqWPXV76kMC Ua3kYODrVnWclHOkkYKzi+pjCT5GIVArqogQUS6voKBrVgNF1qyG/PIjKP0Y8i1S74x5g3G7QLxJ vAoVXcznjzt1ZOnXDJAifm/AzBD/jv8rwUoBjzsoMcT74B8J1hz0eAIGnPYKBjR7UYd/eInSGdFj g454UXbpUVrgL/5X4jpBj17Vcxe/rz4mDS4b8kykaA8qijZ9BrPh5uN6nRPtO62xY4iJnM63x05L e2g0cwnFxHdzr12AwhXV8xXLXDE7NCfcwZmDNgcsGUsndYwxEvSGrRx5Ef93krOE3MGwgRLAsVLF SOBefJWqW2FiqwcvswJNkkaHDCPGVlgZdRM/UyLGM3m/sdfXm+4lBM7WqIN1TSMqcxpRcdMoorKn cRa8lzdg0agRAzoM1YBYm1Y1taGqSa/dC+q9Uma1zeJs3mKyvYg1io14+wuNAGsEjY2pnrpZ4Mob Xw6CYJD0vJMa6XxdN0ZiaU2vjSNFnx6fnhhHKhIVNXPxiXEkiJQCEnrCBKy1URKMRJqa1GSoeHC2 qVGlpfYKqaQMRiWqnM00txDdotvl9Bnav7hm6OCaZNeh7+07LDeszHXuGG7QsTqOZFy9G/Y27nho XeQ7n+vf3evbvLpnstOu08HKVrelezA8uLdndGokPNi4uskFSQqFldHhcYY85sT6e9fN2ZLdtYPX 9fZDdJ+A6L5GTWN1WCd29BT0bD7QrFXVzVr12azhhZ4reDXPgvfzLmtcgn8p7od/I47wj6OqO44Q j8/ifJ7DrHxzU4CkYICjTkdGXIPiaA4+nKHGkOBFId2WKxfd8QXMxkE5rluv1EsqdxgNPsYky0pQ fy276wvj8eHBwSgruawWt0RDTQE1k8TGVhQKsZ2PbIz90Nq4Ie/vyg9E+w/3dW1qcYC3bz17ZNAU aau9mVVFKUu1lvPqpX+qbQ2JKx945taB+3d3SnW9mdIT123s2HU3RGw7ROxr1E1YBMthj+R93e1A cOWQF+ZQxyaHKu4cQiGHQMmdBR9AXZmefxMhmdb6GGmtj5HWPDOtIZxGwPHmwKCQi7pIQx3aHmcf gS5NnjCMUaMoOiqwdWv+FtfQU3CrKK9qV4P5fEGTRCJaLlByRQvxNShKLKixNfTE9bs+uzGW2fnF baseyDMWH8KO+27fPf3dECmIXE+gMz8YdZSBun1sw9gDMzsPnT0yNNCHC4wetTb0zKUBiNHOw/n+ +/dAzPoaUL4fh2g9AdkbxxqxH+br0s3dzZPNhBl5jdkPITCbAwnUn0ggtBIIxoTC48Qs+OBUf/w7 cTwOQTqFvKqRnFVhhPd/QLApzwXlXiUyifALBBJ/ex/5BRJ/gQQvk4Ak3enXIyP2d7Ybpgy4gXvH PaalVIXD07eUyZt5Iz5+Qe1TpFF/YlxJQBpYmkqnqxuS1mizAihDPBF1XDruHZxak989nNZB0U3g BCM0b5jOTz51S1vH9JO79h/bnvwuceftnVu7gjiORwMr7tiQsjqtjMEh6c1GneCwm7vumr3r0JlP DfQf/Oom8/2Ppkb3tKAYHYY12YPUHTBf7T4uixic80nUB3Rp7HSVWenSaOvSnMmFDgLU14Vn51/O S6IJjIb5YvOQM1KsL/hHxYKiqjKoAI7PZd9Vo1d2riIrVNlgVedNV+srVCVrUUzBgcQfJCmWZqze Wle40W94iRU4SjK+xEIK2v1m9pOiiCj1yVDhppFQbw1qSRjNNgPFCZw9u6ZtJ2Nymmv8F3/PCoh7 MJFb/TVQOzDjE5/eUKs36swu5Efh+SLdBlHYg92BHThZV2etScP5ncjxW6fQydg1Vmtu7ywu5AWs vyvHT09tJakbIX3ylh0jGwa9xZGhVFuxv9A4WlMQRw9VhyEFhHI0mssqbY3shYxa0KQX8KgKRyq/ rh0gm1blLRO+6DZIPBS+BmKshAhpYkiO5rL1Dbau1SnTGRTvTeKZy/Gs2/jguLM1W2szELC68DvR e7UjheHozs9sjP1ARuGus2cg2ne4v2tT61LhjnyRICDmjsa1LcsaYfv4g+trSYZheJbX8R8ZG6GV 2FupOzEJexJ77OSjj04+iaxz6vC2bSObd6FHk+bJ7rgAH+W5Ef/IJLwdhkrDnfc1PXjf4ScLXyt+ dnBq1+Hig4XbRveNbi4MjHYLfJysN6BI2DZGwbtn62Fau67oGFLMp8VD1Y7IkCB9LqtpZNT+zuSU n2qbQrXnZeiDipUuyzLWv9jwgWV9AFVVVov2r2mrlfkfZftE+pR05PxzM7KnC9pTNpBK7QvNGVPM CbNXVnGQgaEoY0b5TXEQHjqIDB1Eeg4SjjQZnys7SOnA5a5SU7hxKNFr5SH3eD1r9cecIx3g1cvM hwd3jB/doBqbu8LYOyvuw6mSjSN/qrpP05qWXVe6z5WutB59upEjIaHNfg9k/96pjVp8I1+APrMD W3tyaCh4XQ2KWymdjJzEty4oBSUsl02xxS1D1xVWFbsHQzKsBAu1o+5RnRLENMOjSDaXnUOGzyqF u8beBdD/vywWWHiZfAGB6IMgdr6kcvOlvxD6R8Pw1XifldMzBCX63SwC42ODuGPhNTVSfkichnia sfVY38wAdha/GeMxHwR1/Ro/AtXaXJ9YUxgrdgz5E8VmI9VciIw6kLjofvWcWCyT6ELmjXdfvfB3 CwGwnPaIa0APVZ9V2GVkK3Gak6NeT9TG87aoxxuVOekqoA3t65cTNS6eJnGInMkZdg+04YzTQf7C HUGfEHG7ww6Oc4T/3HA1tFSHZjleEO0mv5thGQizy66hRL2roHQYmz65enXyDoTNycR44gAMSJOn +QS85XzIFw9vTSq+2NeZu6NgpKi+Q8VdQ1sLm4rDg0l/rthXyI6WAaz4Ikwi58owqtFIvPB3SiiS qpPKVTG9CrzkEq55JebUu5ytGnObgjlax2NKN36Uy/rKHlvrUDx2EJokGYImoXBez0iOiGugHZrE ec0mWc6Z9Vf48lIWU+IEdQEqgEls6mR/f7qr8N+gtF6HWfEIRmM1UAukb0wzs/iB06Y0vK0LzeJr 827HxKZ1rcXdQ4V1xYnCytGuQt0oXaPzjuqGscFyp68ihCqZQ7wATfVu5kIliixu1tIMALJcyQ9V pfDHUAbEGoQ9WM9I9qDDHpR5g7F0BkzpeNYccLlCdiNdOlq2EM4yQn1TvfzRsqApqskCahq9evGX 4DZezxFQlXI6u1h6rhQ2WTlU7RCMngP/VtKXbfMxRIFqG9YN2fQY9uUz2FH8wKm/2rat/cYOlPEL 8bgcVrRa+4H2L5+F1jqCCSj/y3fK7fBW4JGhwtja0cIRgfrM8L2DvuItQzcWPlHcNNiRLhTXFnpH m0bDBdMopVJsgWSK+RYnfGi0xQl/uRb8x07lS3OvSj1c5iasmzUHnQuGVOgHDalLq4a85vTtW5xC VLnQFJWNRFkugHWQl8iJrLzBAJ1oUic4l7Txx8rci3gKXeByqbCkjym+8UfyB4py3zyTH0GtA92e UAhr3LNHN7gpiyHPkEXdSljk5q3bxvKFbKGtTU4W3UMjmK4oF2il7EUWh5Gzu1vl6YXMq3NIp0vl 5aermqu6oAlUqrdqs8tVNR6pdbX2X1HADN0EpadXxxAEzVKsBdU7WVjDPsZKaBOExL7F6llY+bzd XJDDbisD/xLJid7atDy0O+8hUsuUOCqw1RXReQZSm+R0zHnVOiV+fBvHc5TBLnmCooGjwysOrsQN Krb025B3X8DuP9nV5VyJar5T0a1b9QcMKJs5VznvfADlrjr9TXonvEU/iTXEo3cWDhQOHmzYW1w/ tLJQKLYMPuAyRIsNhcCoZfTT0A4zTLlFk1lIZ92qtJ5bkNaXK+twBbtrTmJLWeYvMxj9Nif6IMSD u/PeqyU1VH1G+72QQ4uKVfBozRAqS0N6ZFWOZiwe5Q1oVcaifsJbMNBSkviWYlULtCpNXl9thqtz Z+2SJt44Mf7pjbUGg/Yy/AfKy7uWtzzSLEfnPwRrqDRmxQLYZ5/tDq0KTYYIWetqylr5rzw3K/dv ol6TrPWaZK0tIJ/FpzE3ZlW7B1btX1m1d63lboIVEvU078vDf4kOzZ50iMNK/D1fjGv9Eq33FF+0 o6hsKzOKkdDczVAygy6VIGam3JUzJ9rb4uiPowLXEUZtvTGgvq2uNgf/oJz/BJxxF/EjbdUXvH+S 14ax3KrvFf9V1f8AQSYITmDVzyUOU9NYI3Ysr+tuBrUNoCEvgbGG2fmXlek3aK0meP8OwqdBazU1 nMWjWBDTaSjptCaMToNRp8GoQ2HOKSeTGAIQy8O3MDkoULFh92AlkSnJay4ehwxS+i+ZN8t4jl/b orGaYIjDCwnmyOXTB+tYmBLsjiCsNYyl58DN+qVTwkLrc+kwrmJGvUz8DFuNvZN3SSKcpRn17CIi 2hIUtaOfU2vBoFmDwqxBYdb2Lpk1PzQjRFH3D0Hk9crwodebUXe7KfvelC1vSg+Qh6Hr2dVoX9Pq rqj2sVHtY6Pax0a1j41qloieBe9jGUwE9PEVI7CUpPP6npGuwWTrcBJq9AXktb0fCuI5bcccjGLa 7iTUT1UOAFa5mJLxGdNVXijHKW01RDMT9TI0ih3lZ0uiP5U7OIBCExIBcqIvlTvUXzYZWgiWPSIz +lfDrZv768XkmhVDNRtvG/ZVXBgP5Sb6azatv/TI8q8suPnt61c50z2xhv46c+feh0c1r38SWjCD PZo3qhZEP7obQd0SVvqTaqXLrYla/14BdbkFZC4BtboFZD0BGU6A7z+r+rtXROjzyZE6R81wGXop h2AvwywuQvtqWC+G1ko8qWIqsfbUcH3X4StBfHxsy92jgQXojGNXAwoCtB1F2CdKjxKvQYTQash9 aDUk0MxrSPAaEnw5QvIaJDyCxGZVF0KUJRFl/526JrLkSsiwuGrZlZClFkKWwGH5hZAvTcT6e/I1 VYBYrC6JqR0dW5NEncEfWrPKQshgtP+uvq7NLU7wL7f96IEhMdgYKnWVgwD5L5y6osrdWddVax09 8vStA5/a3WGu7WsofeW6TR27D2sRAX9KWZnbdXKqCUSMGkRGDRljGSqjhqERQSVheTOKiZDWGMIM c0IEw3kuPhIxWv3D1lFMI6gSHFVPqYZDnfAykND4UzjNsazNU2N11De1hS53jHBPW86jD9R4dCQB iJ2y18RxHGtJjbZceuZK13iguT9qJFie5wwuNOPA/B/xm8i/wdqwrSdrMVMoqdElqU0wqSGQ1BZ6 khoSSUX22vTJYqjg0RdthYYFmVU8h6aa1VZyzs1lqpXU5ZppGRWE38SK/tqUDaogz71GiYJC9J5y CngbFYpQlbYM2WrcFpbiqMX6RdUpV1MeyrzJP0MNvxvbfGptT09mdxZNyLHSHclgmSC86Tet3F2Y mKCzkZXFTYUWJOb5wlhi1F2Qi/SQ5uZITyIlCWc7p6nIc1qnDhXZi/Wftli1THG2hGBfAiqiDcq+ 4WAfWnRQNHu8XhF3L6lC/Wdl5yjFq8BZHkni2YU1CUXNScIyKxjVij1gWhbq+XmELPFHKo1HwPcw DGPwMP6fMQ1x4nXoaT1Y5/F0j4gu+hn3euNGpOZ1RFO8pyDGi+1NBQtaHAyPceri4LliBqKrtJyQ LFdaF7L14yD3Pa/MKvuyoJhOXyM6LufFx/9iDDTveoX8NawQt8O5GtCVq+IrNyk9N32v3g1vWFN8 Hbay0FNob/cX6gt4YZMhXmwqSOjCIeGxrVVkQj42N66WK3OoQCxXKyoci2oU+YqVvaWgCCwor6Wo R77CmtQar9tb6qlCCicYoze2NFbg+XJ98pbCTsPbzUOVmvF6T0A08BpcVSiaLCa9Xr8cjgCUd5iX 5q+gsIIxsx0y+PPYfcd3HupDGE98KoqKxN5be0UnAjsSuT+yprcpIsuRpt41FHbDxN03333zDXzx oaFPFQ4V+qLOieINhSGE+SaY2QB5qmOsspKoIp9Rt2pBzBHHbfA+XV0sai75USuMS3vpNftulcEq NSWznaRgdWdVqjufsbJGKQXUejFRhT9jCkSXsCcrBj7SmuBVVGeGe4L6j17lXIYf10ibanMrUUkp JjE1otDXKRHlpBpRKLwcUegeyLL92P7jvq5VSiDZn9lv2D8+vt9AuFaiVndvA4Y8I+y6DkVw2+6x wmhXoaEQj/tb61vx1lWYqxgukIhuVpVuZbJ1qzkMRR7F6oq500pj5i832jWELLCn2jIm3zIxacEy eJ/HpnTf/BamlK6y9gJ7idQyjZarYb98zFvcqWmC1dMRWMkOYL89gw3Nv5DvhLIBFl1grLYVtKD7 cApEAiDiBxEfiHhBxAOibhAjQS0B2tpBextoT4IO9A06VjAmasU9us/zUHiIfvgJolF7Gd3ndUhw oZeNPcPK30PbLbrFVeKk+EmRFPOSXBCzw+Hhti8kQAK9l0AHPESzXPhE4vYEPgBftY0qeeW18fF4 fHyuu/tcfDwO4yrUKWm1UsXG4S8wXv4F344DVJaWd8BFmaotcGVj28y2lsouuMpD6ghJld4j9LaY 11fn0BE/xvGnCb2z1uuLwmelD6ClYD5yB2Gi+Q2O/y3OST6H3Sex+K9wcB7nzAGn3WNiiG8wFuPF v0Y74kjWwOOf47hLB8vPiI1GC8MJDI6q30tOjsPfQitwaO/0JXv5Gc4qO6ODsBI4DO1Vg609g7nm /5RvgjKuxQVqXcCulL12EDE0G/AoB5x5tJnMCRyt8L7dAXzDDt48zK8gV2ErtHKzG+pXCA5QMBqP Bwi1/dxijqBtxY1awQiyZmWNUbYwePYOuiHj9Jtw+jAnEqXnWbHG6w1aOAoA4n3aFPS7a0x06ZRo onQWA8iREk9stdoNFMEa9ZdS+HmzQCEvhDVNP/4inqdcWBKq1hXHGWsbuhwthjqws2Bz3mMMH/P7 XdYv+lOgPpVP4akU7zoWm275Mn+IOKjtOEL7ZIomZe/whTlFWeS0pdVlN7ZVrL1oXxsOa8eAMzze lljR7IutONC3Tu/LRsIdSS+rlwztuzv7x3POB9fG2iNSJpHorsH/UacT9PXhWjnRXZcaSMohV51b L1lNIbfZ4rV7msfS9+lkvxyN1kRR/XYAzvXrtBmLYC1Y43HeV38WbMTMWBR8Jm/CzD7ekHgmOO24 yXAwO0MdKhdfuZy2JTq3aLcHfVnbRTUSo9WmVrXiwr8eyI93uDOppN0VFGUDRYtOi8UpUpnN2fyW Vufn9b5MTXgwHRuqDWV8IvHe4PTqOC+H7B06PYl2rbsptNkW/ii9lAynV+/vD/c3+Wubf5xK+hrR 0csCnNFdtAn6YROWOc45ms4C9HV2SfBwXjT5bnJwROwZeTrzVV2VtZT9Ya8uGOla94RB+9zlCJhk I53e0dF7fc7p79nW3bA2xhiVOdEPxYZiNTB76ryZSM1wCv+dOoeedEN61b6OwYOr4pEISFEsSUC6 UaXrUil/Y1+oZrApEG9C1hmCc7kZemIYS2G9MykSXdDaZTK5IrNgY96GucyPGgxc6ot+tGnLXvsl /zR3zH6ofDpmunKwVKo+c1LZnyWryWHB78q7s/CbnebSF6Xa3oZIdybA86whGG9o8R87Fh25sX8Q xv1PkwP9ocYaM05iTke0s04WoMB3uh0GHUd96djg9Mq62OBEs2lwhS3W6EWxoQb/OXiOdmPNWPqk JGEGeRZsypvqIkH2sfqbg4/Lj9dNug8aJhVdVFQXLN7NzC2s+1YqG3mp9cHmhQY5eA4naYKO21DW ulVn0Au30waXxQptsVKAzFhpaxjJ2BqsHIVTf2+QeFyvc9V5Wu1uj73UDS1DIvOAn9g9bntzy9om J8uxeguyxA44A5z6s9JJDj2PyeB/oa+eg1xBGwWcJx3iFIW86bfl41HmK8rtlqoG739QRqcVOQhy fqvTSOmD9alAMFUfwH9XHgVup1kax+GPZ+u83to6n4LkAfzn+A7I10asvUfAGsAj6HwNHIaMhcAp GLF4MItO2aDO6ZT7JtNBZVRa5/TVC+o5myrSEkt0S1sWuqWMWZbxHYzklmW3iaN+SalcpcucPUny klPplnCG7/xcYBdGD5Klvy8/rqJs8Dc0TxNoUqxFeqb0e8mozol4B3r5IJafaQ6h62OmOkyItW5s EPq5hTfM9Ez7Z3LTHc21manag7aqWWldyfSFHPxdtU3AhA5IL2qIXf4c2UFtj8nlxiPxDpyYGU2w scnfF6ONTrPVZWQyTcHe2vLUHaGQLTPRMLze7sqm0/a2lQ2Wqlm3FobSydKx5Z7jdh381ZtNtaTd EYdQ07m2VbPp3XD+CSw5U2NCAdgNbbopb8Dchmei0zU2/1R5ymo3EMXeq092YXJwWvjdyF5mOJPm 1tBQrDxHRyjgyGzPtq9tkKtnMIxG/OgVI1bGCvMFeB//Ohwryhctx331PBquVckXFsyKkgVfn/aR lGtKvLWSMtCGs+ISKeMy56uM+MqU0T3R6UzUxWxlK1AGWQw6szs6FlJGIRkbjNVkUcoYml4V58we S+kShc6g0JDtReSHcCIN9elVNyopI97442QKpQzVAuAVJeNHTgSdmBGFV52Tn4tOB41W75T14EKH 7d05Kbe4IrsSd/UgKngFJxmKFYxWk9HtD8nVHmSvi4TMhoDMwMj9S5PdwFA0JdhjntL3FgM/5IvZ WJKlDTY4yhD+Inia+iaWwRInsJAvikYpmo2CbzL6uEN43DwZf4JRo/85ZUfS3LsvvjanHTZF5yIv C5aLAioSG8o1A56medkbMG5ft1IQBN0YrWWyR+Az4RF/nTNCkzSFE6JsF1ia3DoBIihY3kPBwoCE P+5RQukfGjJGUpDgmBP4L4j/TlmwPmz9s/5Ag5xOW5Kz4KG8ELBI7RaW6ey0dCNVZWIszVPpTgvh ik25DuoPYlMLh+YqR0eU4yLlsyPqSWC00QQGKuJK/QwT9bLymbgXzokhyO8QLJTBroCVw28G+B6C s6BnFp74FknA+tNic5sY/E4cvw0wosNqdRho4j4cvwWwJhdlgVFMMBpKBhatb8NiBuzR6UpfrTz7 N4MosBApaMvSNp0OfJNWfJGlS+OC9gzi4wPv4XshPgGsC63XnT7BsrxtFjx8KiD7OdkyCx7J63jZ PWXljFPcLcRtWhAoY4LORKunJrWzgy0txMLhkpbK4RKwkojX2TxGQI69DosNr9MO4zn5KP4gTps8 drvXCCjcqBdIVs/P4LLRoiNxRieUbsXB5xge1gKCWVS+V5h4VllPFTAdZkGnSqdP0hyBdhX+9hxQ j1hVrWKCNeVVy9LT5DltkbI0gz6H9IMV1NGFz7ld+Zzdy3zOikSutS6ea42XTlHhlnhtSyv8nDkM B/z8/wWvUxMwANViBviea0xEm5TeqN6ER0QqK6yLt5CBHzPo8hRuiTEB1hpyu0JW1sA5Yj5fLaxt 7LU+X8zBgVvLHX7iOZ2ko2idSffnXCDuEgRXPBBIOgTBkYQzKs4XwdPkNmUk/h9hMr4b82NWPHda EOvguPZhcFDiXPXZacVHG5cb2zHG6LLKLpEGJtpc43YFzQzHyTUed8TGcbaI21Mjc6AJXSCCgD/w eZ3IUxSUYRf9nqhdEOxRjyfm4HlHDPrY4/PvgZuxNyHathmMRlctQFeA4AhYqUK04z9RD2xW4L45 3dWRQn9uGkqnBuAfFCGPlp4C/4d6BAthwbyVQItgBFrHIpTLRRBWn3AU60YtLPVCBTRUD5Ktckg/ RaB5aboC/HHb+LbrKWDwOCSnWUc0r211+3Jrs4AT3bLNLeLUzpdKm8//qrTl5zqTQEGWUXtf+fUb 09Ov/+aXnyBpqO54EY3oLjiit+GIAlj2DCbN/wmtGkja6gK6P4VGJikXaRCUNRN1hPFM5VoKlSsH NEtNjXhU8xObLIG33a1rmgmoaSWnRw+orRMTEyQuum1Wt4nFP3Er7ph+49ev7KWgPqMEk+5n4Klf nQdPvcSJUNvQNHmutAqO78i8EfyUhHUjFngeE8GTGI054U/IIZw4DgHDUMvv3fMXzl9YAMyyJGA/ GR0ZHSb1XrvkMAtEojcp21O9dTDvOK2Q0iT5+W+Xvvf0TOn7/4U38RAvhlr3g6dPbB0/+cz311EM SVC8QcELjuc5ZTyhMzDs3HPcasTO4hImYRR8YnTyyoDgcMTzF66Kj5cAz9kSvQlckKAFvXpAjgwX RknC6LHBqMridb0pO7iw9cTTP4D/PUQIjuo7YMPM02DTtzkDTxEwKa77/jMnUeft6DwJveqfcZq4 FxuHz++Cz99Wnn8SG4eseoTYi3+FurXMb1dkSByC/D6Xqea3RhnmsldkK/4ALdokyW6kbbwlYLMH LBwofXrRa/UR4sEywcH/LD8qNSx+TRRR9p3/EKfJGPQ334xNmMWdJzCTTpgFvSfc18MQ1N196Zxy Arp6lwVD02oXpyWsSUyc5q1+m+y3Ch+iZic6vQfqSJ0J2tYnMQ4OZQ9G4InNjwrI4iaHSUc/j1M4 QDSHo9gJ/edhMot1Yb1nYJTZdzobhjcsh77GUfD7c65ZkMtzrSaZoFNbxdwsaJuhxzG0XROmUtSR gCbWrplQuWSCGnbQEC87ZkdXjtozyhnShyneyF3K6WUDS3JGPbAObcma7Q0rsl27R+oFWoB1LMWa 2jfe0rv+yPVpZ//BTb/HG1gjTxUkl8QxJq/d6neYuXc6tq8eCETzKac/6qch66GY04s1QXt0dHKw cee+2waf59Sd2cF5nsyQEawO1r+546mAiL5ILkqSWHIWp56V42Lg+pQL6iDbKXGc306OY9peRymn TBP1V8vH0StnEpoqEy5vCzGhqBcCATJjln7Bok1MATNzaVaQ9DT0AQ68T1kCSV+owWv4hVEu3YCX kuC1oWD4PDoAR8F8fx7OwWbxud0i0cOhPjZr5C5+NkSEL5agxdbMY8pp8y50ersF/OpULBPL6Fzo a2kwnR9d1LmtjWpGV9RPbIF1sWOG2lF1fYuF08vhpa/+UukeLRzjRqeAVQlA7B+4528+kdu7psnC U+gKL+HePSPdN65KBlfcscGXjtaY3XafB/dyBoGymEsdgULN5Lf2ZU/d+O3JVqPVbokGRIfI2d02 f/++4e7xLi9Bkc4wLvr9rNltromVjpFE846H4Cx/CP3yGyT6Tvr6M1gt7swbTV6TAG+Y3SyFrq81 zQJL2RPfgEQpL2de7oXZwBKkUZaRiG/QvJ65tBXqEpqGMAPDIgZJdsnul+h3YAqn+s1Q3aErdUhO E4f/XqGSzWQ3CfQLZSpdPMyZnHDct8Bxfw3yqQ3LIT7deDodgjesCX1nqSCnaQfk04m6rWJTFZPU BthVaRS54rDqAou+RnGQRU0Gq5EheKMO2Ee2NIg7dnXuWpHRUwJH8XL3loPdm49uTjj6D20p4o2s UbicQd07Vg/WjG3xxwKsyW12BuSakCO24kBvy579C+zxz/PEP2jsaVXZY9PYA/4DsocPXB91pSB7 TpKIPpA82Y9PHuIfLNKXoJpWDkJe+gVMizTBcAwokhZ/0heo9xm/JMqlJ0GpA7x4GXm8NgsUpHpi lNEpbWf24sMqeaB99kD2PKawZ2CBPehKAIVTmMFstjefBe2wcG4D2KlgkEpssS8wCBFIVEPeFSy6 /BoAqNxclkSPDd43c6DjwLomEVU+rMDwdUP7Cn1Ta1LRNYc3dG6KKCTqRIHOIpU8oeH6ye9O5o7f 8M3JNslh1+tNTpPkMrEOr8PXe8NI17Zun24xiSi8acdn0Gwd8x+C18loJceYTwSUHNNzwq1eu+XS T1E/b5kcU27cgNd5GMRsPiv7O9GqgwmXZz8QzDaXZPeZGLtSoCCkt3+Kx/Uem8lm0pFfZTi1VEGj 2Ao5ESczWAfWjTixYyHH3F/OMY2nszKd2osSTNOMckGejHYpq6skmJarJxgZ/qesnr30kMGqpyle 0v+yf1PWYkv2pbLruuMcDbUuTrKm5pU7mjbcs7bW2XPo+qfA65Jp0OSUONrokq1eh03/Sv/kltFA sD1hdwWd6Liu3mLSi16PNbFid65x98GHN34rCrkRmb9IHCVroOvUw8xSHzCi7xiNUhSWngV/nTfK UVf9e2QyIIp8YA+vHuaH5SfiRzU5wEeTA+o3xI6jkvHrjMUnozW2UgLSnkJRCDxMW3xxbzDl1X8d moQufQMv/SewH7QHghfK2v4CJXrskttuM+BrBAOvLr7cDutRfPWlN6G1dsz/kbBDhvSiK+/kwHcr DGlTGdI6C8S8LtH1T34/ldht/wBdIGMZcix9gYzIlRkGWVU79EfYBw5+ZUP9hr6kXrmMGLRTNLc6 27s97/vsg85YyCdCVegE/8rqlbVArjSttzk90tYv7GoCGzYe3ZoWTBZeMDnNos3AmGSTv3XV/2Pv W+CjKu79Z845+35vkt3Ne0lC3mxCCCEkPBYIiOEV4wsfaEKyhEAey2YTEkRYEDV4raV+rFVqe9H2 eq21PmpFtFxvEBrUqkWllHKp5aLi1Qs2tRZSxOz9zpyzm014FO/1///f/+eT/WZ+O2fOnJnv/H4z v5nZPXsyoe5GUSW60ulLKcla7sXjdEMnqUhpwRI/Wvwt9M9CjBIPyWdzjf3FNBumGUOcfRf17sz0 5dn+qvRItiLbx401epaZdNFZplClM6i/elllYPeiG1R//MCWgM2wWq+lWpXZnmR3pdnV/6rB2Vn2 RItGY0m02xOtGuH0Zh21pDttDvjqH4mSyD641ZzrYA+JwrrWB8alGFFq8YCOeeaK8FmxZeS6hkY8 84957/OckQq+gd4nu+aWOMsmXRxWwOlxmqGZBiv79FunpuvV9rTC9HFFaeZNpoShXQI2VDfR/HHj 3ok8Y+IdlSXFFZ/qchiF5QabbL+vmt3Cgq9+y/xEE3rehEjPq0TPyy/N509pKZd7XgXveZ4ZH8Az expdf/3aPe9Cixve9RTHPKGydXv9tFvn5YOvILJfeGZMu2lWxbLZWWmzV8xPn5iXyTqfi/20XMdv lR66Oakq95ZttxbTa66786Yic3y8zmhLirc4TJp4V3xi6VXlRfOKEyVJdLjpLnQ+dEsb5t2hzwSh oMZPIrsAlRMeOuUlMk6weXVOm8FoSKnlj5RkK5u3Jv37N7AFMOqkeQ8YRGOa0863ABgQVMIKjkT2 AKpx8pzoEG4a9s+hFw228qmyi/ZwF301c9G5z6mviXXRl1y/xF3GNoAtYMoj24CzS5un2FKmXFVa UTe/SA/62IPqbBXXtc245VvLPI4rtrS+JRSxNUw1e0igxprmiE9zOk1Uf/P93csLChZVZGTkYBmT mmB22szW8VlJk29eN3fG+m1PrzmksyfzXcBZSVLF89EyTR4tpsho+fJ5B1/DGLx6ZcDU6q+95IA5 /wE5528EpHj7G/JDxOzar05ENwJvYCPgScucmG5+Iy6ObQRuov9MN+WmD/0x8gtxOk5tTXXGpack 24S/wuXJe4HfjxMOfbWA7wVOiatUZoyYOcxX74uOmJKory706jwz/sJGzFVYyxiij4n8Hw0a9bC7 5juCmauWFJnZRwPoUfrcOb4rLrEnsKW7x7vYroD+CNuCqVan02CMS4nHxkDrTHFlzFlVPeOW6ekS 3xhYxrl1dr6meVAQKJ28vJdE9gYYMx7ykTcrK41mpdKsFJqZTLOSaFYiZTcGOGmenebZqN1tpYuK 2W0VJouwqK6YEvYkUpKn3B2ap3y+k6fcPZqn3D2K90H2+U8ee5ypOc3FLnIZmDTY2B0euATvB59H meyhnKyomPQ+VgTeB7w6XLHDRm1sKpn5fGZtnnUX1UQGD5tNlsm/4HiLPfqB/wSh4Ffs5wcFpGD4 no5l/4c3NOLh7+rlDY2VOQZJouypdV9+m21oIjsa7h0e8JryymhBGs1LZffHeJlanUytXupgj55x 8A/vHExNjl3ChKgbkXU99WVhIzHIyjGwu2EM7L71y3Yv7D5kxcPIP9EoIPy+l6/rbEbtlr68vnmq PWVyTSl/sA+bqASV1lV5w+pK2dnc1f6WMOnSziY3Q2tPS7A4rOaErEwXdza3ffuZAHc28DbFmJvf U7zNl94KdpPRBJpTSLNyaFY2HZ9Cs5NpJu+44110vJNmO2h2As2Op9lWmm2hWSqaJdGCZMp7sV3u xRMcLkQcbqvyKyP510XHXmS/PkrxeKy7wue8qchhZWaxsg9WreynAlb2KwEr+7DV+kvBRnKIJPdh aVf4QORxLl49e56LVFx0aTdos1P2kJYC5a5p9oDjt5Sn9kYsM+p1uc5SfI9t/JSnGn/1qdFqgv/H 0vZdVVxaYdq4iWnW+20JQ4/KztI/LntoIHL3F7Vi7+eKY6t20c4+YVexB271ZwqffFUh7/1OiQ/C W84ge7ymnCk0p4xma2m2yHvyTrkjT1F66xR257wB3XkKe/ZzLlSfi9Rc9mOiXPOSkvaSjSViyYUf c/yyMIkQlIIC2afFL/DfH8Uh9iK7E5/tMZlXNhZWfOFmz7VSFY5yzMtkz1xArYeUm+/3LTt4kEdl 5TLtXtxX//19Z5nl6+w76Y6Vj7VX2BJdZixt7Da28UxNclc1RTeew05a3nhifZop/Jp2qj4UNBI2 gOL3kbJAeEdoUn2MFI2SMl74tfCC6o9I0Skpc4V9wjWqI0jRKyl1QjVtUPuRYldSliLlZp4Sx1L4 CqqYdgpXsj0uVlD06V/wBdQuGvd8SrfqNuVzVL6IUl1qj9uptSezbyY13zXb9Ww9q3lZNGBQxyea pF3YzYpYhGiEYI1G0Dts5niTXtVOJYGyT59Z31oQLhOahIWkjBS+ROLpFy9MGDdhHJm0S5jt1euc h3N7jKV7xXVE+Z27vFbilNSj9rMX/aTHITQZzUP5BptBJWpN+odLpmfovZXjKye4sWpSi2p7fuX8 3Jm3zkg3ea6/chVdbLR8OzVNMjpsVkeczfBg8WJvmatoWrwjXm1xWh3J9sQEs7t88YTMudeurPKl yU9kKBZeEKpidhH0p5F10Wa2i3B59ijeoFt/28UWRZf3AY84SXjBaOrSWrnS1UM/w1CF1jVqmiqa E7MSU3ITjV0G89AJ4ew5Z1LKw/KXnTr1w5LRGW9JTIjX0xfVGqRpdOqhXDf9/tCdsMLccJ5wjTAT I3wy+3RnU2TvSt/xWog54xX2yejvJqx17VGtv9Rnopc1qpR7C4RrJlzdMS9z1uRsI9b57KYUTWLe zKKcWR5XfMEVk7JLk+yWOAftgAuTzKahf4vzuOatnJsx0bt8TqbWbNPrMROZ4kwai91sySjLdRen m7V2B13kjNeaneZU9y8Eml55LdpWN/QMbRB+y74xY9//bODf/4TY9z/0p88npBu2kJn7Yr4AUifE O5wO5XvBkd//1FVWTCuXqMGVYEmw6ITMyZk2e1bpOKo1OW32RKMovNh1dvMdX/YwvypgITZjw6Y7 qqq2bNo4U8AwgOMAm6VgczNnk8W+/dnAv/2hP+Pf/oSetyTpZTrs65+DimKVr39Kp5SVTWbPNx3+ +udme+bkDFFncZgdLoNYOXVqpSAYXXE2h1lNMyZnxb1adcemDTPARGBuft3ftmw+28Xu9hVElTBz 46Yt4DMxfJbeIdwPL5DKvMAzXj13A+dSNqo2xfqAS37OdYfWlpwQl2zjPkCi6G6/lHSmBGtCokVl Y/dQCOyOlsHFGlEXb0O6XmqjWJZCR9wHTMMgShIehA8oYz7g4E7mAyYwJyB5rTqrkzqfyd1oSi+l pc+IIfS/NfAFa0ZunL6GN0gy6YcajBb2DZ3BcOf4kjRTmSdjck6SRtKqRJU5Z/KszPKry5NteVdO uZWmmk2TUxLhDeIsCXaLbl1mqacwMafEGmdVmx22+HhrvN2YXFKVN27mnEUTarg3iMfOdLrwLe4N psve4K6IN9jotWOblO6hnicVh7BBv2nYIay5PI8QF+MRROYRphsNCzTwCGx1OnSc7YGwFFWfFM3O TFdKTqJ+gd50Utj/+q6klDXsucvs5oc1EjqK1WG36ukqSSPfnDMUdNK5Q+/CIiXhPwtxwt2knMx6 iUykG1/IKswqNGK1+bzXRYzMEv+clqayYhf0dN7t6Q7qeFK1mRkGf8w1rPn735dkj3ANjhGeIS5v QbM3f5YnBZ1GhSW5M7tiQnpptmP+lZ6pTpslLp5eYzAZjUN/iyuyTls2K+Od0qsr0nUmk97pgkdQ Gy1GU3J+akmp1hJPk+JsrtTU5H+gNLF4PubBicImeocqEfNgAox1N1KmCXcLSapUpDiUlHhhkzBd FY8Ul5JSInQLcSr0IClRSblP+I34R/YNqbaPEH78a2EDZm619lf8NwvzhF8JFao/kbnss9tpdOkL WROzJpqSdtG7vSZiskyyTHJOfW5akgo7pbuedyo3aEX/CQH0J/8Y5VT0zkvui+THOE0qKWPOVfFO 8nfl0CDLxG6KVbN7YpFNqMi/0lc5bVmK2a4TnYYkoyE9pzi1cr4ze1Jy1vzKrPGzbyxLnuzJMui1 DqPTED9jQtlkZ05JSlZ1xXjx+ak3TE9PtmrNVodtjg17Hou+sjQpJy3JaMuevKCstKYsRWuJ0+sd 8VVmlSF1cnZSdnoizpVVs9Yr2iGVpPy5CYnsH25nFuvZG8mcvEu48wWP0yCm5bJYWsfwvZHyg7lP lVhPxX6vbIveSJQZczNn5PHV/Lmt8k2Df2T3BsUlmzWfULhEi9Vh1tGjlGqsrgR2z11a3DynO9Gq fl18T2NPSLRX6+OMOuEDlUbCS6MSvF/tFtn6TlJLiO+Nph9KSkARtq8+F0z2JKwAjTYTRrlib/5/ Poqey1L/kt5AbCSV3uPVE1vWPvZ/OvYloIHPGTtiHl99yvpV5EGF5z1aPPbfcwgbxl+xfO41WjO7 O9WiSbI9mVw864qixPtSCyY4Fi/MnpRhl76a0TA3Z+hPUZ6HE+Mlc3Z59eTxk1yaoXMJ40vZf8x6 9H8H6OLLwv5YCA9/YwhfDGL7CDwnQ9JfANefhztG4b4IsCAbiW7Vh38f6kqOF2RoKmOw/tLQCjG4 ZjR04kXxyIWgn6Tg4PkwXG/MN1WZTjKYN54Py9KLwZptK43BcQb77y+OuNrzsGEY8a7z8LeEey4H jnEc2y8Op0PBXudvRsM113Um8WTi4GgkvXgxJH87Bl9cGCmrUt5LeS91auoPUocY0mYDT6U9lV6Y vhk4lX7K7QW2M4zLBzb9P8A/jXt9DGP4nyPDPAI3j8CGbxD7M51R3Jr5E47nMl+6BMLfDLJmZ72U 9dL45PH3xeDT7KXAyzkTYxDMOZFzIndB7r5h5KXmjQd684UYVOXvzt9dMK7gkWEUXl34l8K/TNjl aY1Bl2cj0Ov5zihs9/wIOFE0H/hJsXMUbil+HPiPiUuA50rSYpBTUgxMLZk9hjGUVHPUcrwzhjGM YQxjGMMYLoZJs6N4cAxjGMMYxjCGMYxhDGMYwxj+/wK/u4GIKyG/LRKiITeS66kQPgiZFH4fMi38 O8hcYoQs4NLDZTmX27ncz6S4dOhLcgvdE/4T5P7wx1SgueEvIAu49HBZzuX28CnIPeHPIfeHj1AL cv4JsoBLD5flXG4Pn4HcEz4NuR8yDTk/gyzg0sNlOZfbw3+F3MPz7A//heaiFYchk8K/hkwLvwWZ Gz4JWcClh8tyLvcQNeR+oqe54tJwN+RGgjp4CQW8hAJeQgEvoYCXUMBLKOAlFPASCngJBbyEAl5C C0r4A2RS+DXItPArkNvBsJNrppNrppNrppNrppNrppNrppNrpovn7OI5u3jOLp6zi+fs4jm7eM6t XIdbuQ63ch1u5TrcynW4lWtmK9fhvWB1CDIp/CFkWvgjyD3EAMn43wv+JXQ78nwMmRT+BDIt/Cnk 9vAHdA/SP4FMgs73IJ3JXLR9D/oGkx4uy7ncTiTIPUQLiR5C96Dk2+l+lPDvkEnh/4BMQy37UYIe soBLD5flXG7nkpWwn3PbjxJ6xKVo6WHIAi49XJZzuT18EHJPeDfk/vDz4qD4ZXhQHJT0kGfFs0QN +WV4SDwr6Vgc6UPil+KZ8BeQg+GTkF+Gz4hfSmqWImlYCvKckTSsHEnDypF0rBxIlCPpWDmQKEfS s3IgUQ4kypH0rBxIDUth5bDH5QkZ7FZFdisHaeRS5CPQzI9YXCBmUVLiIskS7UpcismjIi6xTImr Y9I1pEtcrMS1JB9n5LiOuMV9Slwv7IjmN5DrxA+VuJHkSxVK3CQ8JEXymEmL+hzzEfxVolmpxCnR aLYrcYFotJ8qcZHYtX9W4lJMHhUx6kQlro5J15BKnUWJa0mCpl2J64hVV63E9bQmmt9ACnQ3KnEj SdDdqcRNdKEuksdMyvQnwISye6qV1rK4rGc5LutZjst6luNSTB5Zz3JcHZMu61mOy3qW47Ke5bis Zzku61mOy3qW47Ke5bis558QNykhxWQiKUVsEWkmDSRA2kkHwgoSRNocxALEz2U9UpoRayMenJlF WgA3qUVaE1mJcx38yId3H3J3QTYi5xxc14I8y5HWjBzNPF89QivKauR523DUgbQ2fk6+vhkM3Aj1 yNeMEnpwtBaxIOpieTpRYhDpPhwxzp24uhHn28CGldKulBpEjlalTpbDjTa28zpZLR28LVfytq5A CmtjJ9J9/IoAT2nhrINKOxpwppCX3MpTWniJ9dCRnB6ppRXltHCN+RWWbUhp5bXKZbJ2BmMYsBr9 vC2yviPalrmzmtqhATfaL2ucsWpF3nrUH+RHrMXBqD1kncm1uDn3NqVd7Vy3y3nOYcaxLQry/zgb VGpuJqtx7OH9IdaaOby0Vl5CD9dDp2L5WH0zi8nt93H+rP2yXQK8N7B3uUZmazfK8EdbI3NsUvJ0 4GidUnoQrZAt1BW1Uj3vI/VIbR3RrkhvbgCTel5/g1K/h/fYJm4rdub8MVBxXquvU3pOs9LHJrMn M5Cpl+jpQV5nI++JrJbVURtEdHOhsdek9Gt/NDfrubLF25Dfx/vOQuRoILlcp3nI08jLu4Jf287L DwJ+tKMIWMvh4WNqZH0epfQixHt4D2zirP0ooQepTGMreItZTx1ZaiSdjVa59auj5d3A2yD3kh5u 3Q7OMMj7cQcfd/LVbt4GNgZ83ILNvA4ft+Fyfm1EW3PJtWj3LOXaQMwZefw0cp0Mj4m1vK4GPmYu VK98zPI2wIKdXIeN0T7WyM/7eQ/pielXft7SNqVnyWX5uGQjZXS72Xl5RObiKmYp1huWR2u6EKu2 80q+fB0Nlx7xim7FrwU574YR/uX8tke8yWhelTEaYC2R2yJ72cg8EYh67Ebus9q476q/aEtlPdeP 0Kk84tsVKbdKjnfyntfJr2zk45+1xhcth+Vs4aPmUhb6psbF8Jgo4mzYGJA9v4fbyk+6f+IuKZ5Y 6l7U3BBo72hfEXTPaQ/42wP1web2No97VkuLu7a5aWWww13r6/AFunyNnjn1Lc3LA83u5g53vbu1 vdEXaHN31Ld1uHG+eYV7RX1rc0uPe21zcKW7o3N5sMXnDrR3tjU2tzV1uNuRNehrxZVtje6G9kCb L9DhcV8ZdK/w1Qc7A74Od8BX3+JuDqKOho5Cd0drPRg01PsRZ5e0drYEm/0osq2z1RdAzg5fkBfQ 4fYH2sGb0UbpLS3ta90rQdzd3Oqvbwi6m9vcQdYOMMMl7pbmNtTVvsK9vLmJFyxXFPR1B3Fx82qf x600M6fD3Vrf1uNu6ETjZd7Blajft9YdqEdbAs1oNi6sb3V3+lk1KLEJKR3N65A92I4GdbEm1bvX 1gda5bqYmhtW1gdAzBfw1PqaOlvqA1ELVESqvg7KQXPckz3lU0coPRiob/S11gdWsxYwNsPWa4Ku /Sy5oR0Nb2v2dXgWdjbk1nfkuRt97isC7e3BlcGgv6KoaO3atZ7WyHUeZC8K9vjbmwL1/pU9RQ3B Fe1twQ4lK4uvqEf1q1m+G9o7oZIed2eHD5WDEDvtrocFfIHW5mDQ1+he3sNpzb124SycDfAD2Kex U7bE2pXNDStjrsV7c1tDS2cjLoXGGps7/C2ogOnKH2hGhgbk8rUFPe5I3e1tMGRuc57b17qcXTRc VFsk8wUZ8eysK8IsHcFAc4PcX6K1s24SKauSE8htRi3osmxMBFjHbmxf29bSXh9bKTjXy0xheDQX OmaRzqC/Mwi1dzU3+Fielb4W/6gGXY4tuCWKGn0r6tH5PfUd/u7ovomEXeQucqEXRQ6svEkc0YTD xMKeiMl3GwQ7TEJ65c86LvGqkjKNRoo89NnLzW8ysfxC+eXmt1h4/r7LzW+1svzi/MvNb7Px/Acu N39cHPJXiYOE7b4knp/tPlNIFeT1xERuIUlUIDnUQkpoEplJ08hCaPN6uow00hayhnaSDbSLbKVb yQP0XvIo9uxPYce+C/v118VqckhcSj4QN5BPxI1kUPwe1YinqEX8jKaIAzRP/DMtE8/QOeIgXQiq 147kQW+I4ZEAHhngUQQeFeAxHzyuA4968GgHj/XgcQ94fBc8doDHz8BjF3j8CjwOgccH4PFn8Dgj bgSH71EneKSDRyF4TAWPeeBxNXgsQ71NI3lwW0V4OMFjPHhMAo+Z4LEYPJaBRzOu7AaPu8Dju+Dx BHj8Ajz2gsdvwOMP4DEAHmFxKTWLG2gCeOSAx1TwmA0eNeBxC3i0gMc68NgCHveN5CEtjuGRCB65 4DEFPOaAx9Xg0QAe7eCxETy+BR4/AI9nwWM3ePwaPH4HHh+Bx6BYDR0shQ420DTwmAgeVeCxCDxu Bo/V4LEOPLaCx3fB49GRPFR/iuGRDB4F4FEJHvPB4wbwWAUea8GjFzy+Bx5PgMe/gMcb4HEEPD4G j9N0PzWARzJ4FILHJPC4AjxuAo9G8AiCxxbweAA8fgwez4LH7pE8ND+N4ZEKHh7wmAkei8DjVvBY Ax4bweM74PEj8HgBPN4EjyPg8Z/g8Te6h+rAww0e08FjCXhcBx6rwSMEHveAx/fB4ynweB08joDH CfD4nPkVrZZq9Xv3/hNeDz+sVVGteqC3t3cgFAppJRzUbQt53dZtdWoVVWsGtN29vd0skyYUYtl6 B/iBlqXjDM/k7x0Mhbq1EtFKxd4BL3tpKdVKIRLiL15sKLRtR9+OHdvUWqrW73x9K1784mdfYwVp eWW9Mg+1SNXSMX6pRiIaSS6zWK0jal1vqDd0LVbsGYBWRdSq3t6aGrc7UiN/kRDFSwzpBSR5vXKi 18sPWYS9QiFRpFrVjh07UAoavcPNXoP8wN+r1VrdXvmguLimZtug1coP0M4BrbbXLwlEK3r7vF5J RKOPub3HtDqqNewJ7Qk9BjwAMKJcVX9PuToV1UG5inb5kTaqXomqcQ0u9+skooN6L6RfnUR10O/X UDCKVT3bJ9uGMB1dQsPqiIZ1lOoUDUdVbBCQFlExVMuPIzqWlayTlQxNDCsZB8NKxsGwknEQUbJK IHquZK9KJHqpDxyO6fRUZ+zD61Hvo977Oe4FdGqq0w5u2bJlkOuD6dDfC6WxYjQqqmG1dfc+tFKv pnotcuzah7z7dvFDSZKC9+Lw3qBGTTXa7i1bzoVC6/US0aui6lbarug7pFdRPTNZL9P4tl6NjmqM z5M3uc1l8KJ4LVu26KPxfbt4l6YaRfkhZlRVpJJijZ5oDFXeKm9+iMFGbOAA8swAsABMoKeCXhU1 QYj/cjkUMolUr3LHWMHNU1hEfuGUJFG9ehteXDmKJdyDiqpgCmYLpkaNKzd3/vzec1otPycbQ7aG QZKtIRGD6hjyD+gNVG/qq+urg4V3fMf9Hfc9wBaAK5bZQzYI1xczSJ2VW0TWs7QeOjeoqYFZJGIS fixd2CYGVjFscmGjGFTUwIzyf98qBioYIlaJMYtZpIYYszBz8KRhuyiGMXDD6FWCXuuOWoarEEqS +DA5xw9dUdvww/Wg1w1VbenWiMQoKZfCZRphHitKHzCYqMHS5+pz7cjdkbtt/rb5zAHcqb1Tu1lr 0FCDbnDL5s2bZRtxxXdvAc1iLStSq6Za2UiwglFDjTrZSrhg875dPEHAq2IeS5hXwbOXVzE7VZUb VaBQPmwo9FuqH7ZUyKimRm2MqbZoDVRrfqmvn3eeCLQaqtXJFW7ebBg+4Pbi3lSxF+9faq93UK6s XGsgWiMrodpb7Y3YzKDBxLd5c1VVbq6VKcdIBaM6QijGahaRGpnVhkeT183TeCxiNm43o4bZjSuy uGabVX4N8ePuLdAN+0eP3iGDFsfG+PisqqotYViLn5dNhzzcdqZh21GTWrGd0UyN1mMpx1IGph0o PNxyuOW1hW++ue/e/ffuNe41GrXUqD/Xv3fv3v5zzB32cYNMW9HXd6w7xaxWv9mt01Cdbn2/Wr2h v//tLpOWmvQs39ETe9nrxFGeIuJV2cRTmip1WlwxbUV//1Bf3/JpJjWoTKurqxusU14mgZqkPiwp +yIvk4aadCzS/+bhgYHDb77ZrzNSneXosY+L+0eAFa1Xqt671xhzdOIoLuee5vAxpVQ2kNXD9Zbr zERnZo1ucDU91PhQ6bPTBlx1rjqjjuh0bMZtIAxlQArgAoqJSRBM6ijPPlBmnVXV12dlGi5GsZFT iBbzRB5TXuy8CgrQvsleXNnl3YddyivME9b3Q3lqtdFVXBc26pBgJmnEARbZZAWZR/pJOKQmDDz3 BtaU9Wpc0r8eI9Ss8j/La4LFzepjrMq+AaLsevRkp/AUERt6Ai0kvingW00Wt9QH20gdKhBmL7na TaxX1852k0L+e3+259Fgx+hUjihWmVYoQT4SsKu0Yc3NcskpmEuJnSSBqnhlTc18klW7ZJGbFF9T u4A9U1fOA0eLnWgyPxLZf2Rg/9qIn1FhX5WANat8xL5ZcoBVeoO/w092c/kql69x+TaXB7k8wuWx 1b5AGznB5UkuP+dykMshJqnEpZ5LK/vYhDq4zOdyBpe1XK7gch2X93H5WOvq1tV0J5evcNnP5dtc HuLyfS5PcPlZdKd5eZJ+LamF/kWuJ3gfwr5N+9+VJsC2pv/2O+vw7DsP9in9ZnI/eYz8nLxK3iXH yeeU9TvC+6KsiZOEfd8Y6UuU7UNohfzee5f8/oPBmGvQXz97bMQxNZ4beWyuGnlsKx55HLdr5HF2 ysjj3FHn88tHHpcuJjoh5niyPea8mtArbhx5vPAJvOsxQnJJDfuOFtdshqqKhRqyUfix8DuyQ/yB +ANyUApKj5Lfqt5T91JRf7W+nr6kv9tA6WtGq3GuMMd4k/GHQo+p0bRK+BfTRtO9wj6zYNYK75rP mM8Ivyc0dJrpRn3ItPOCOAAcMX0Yg08VHLgAvoj5+WsuUAFUAas4HhoN0wHzY+ZfWB9UsCMGTzKw efYC0NtqorjH9kAUp2XYUy4AD1Aavz0GP5bBz4xC/M/jX4vi7YRjwAkGh3Qh2D0OuyPXeU8MHuB4 9YI44DwbgSvelRRFlYLqC6KG4zrlfSRCimT5+jkORiFf/b5rIDE/sTHxh4lPMIwuPfHpC0EuPXFX 4nEFXwyD1ZJ4ltcVYiF1YWZFFAsza6NoVLAKCGWuyioBvOM946syV0F6xr+a/VrOIY4vcm8E/HnZ QGHe8bxBhON5Q/mvFfyQIe94we6CTws+LZQKzYXxhS8DBz0zgBrPjUWPKHhlYmhS9qT/KL2/rBSY McU15cYp3eU/V7C7vL/8YEU+UF5xV+XR6WqObdNf5Tg3o2zGUwp2Tj+H46dmDPCjgZnCTGHGUzML vfd5d8/yzF0KvH/Fyunb5Nx4H5BzXTmD5btyYXVGdXH1jOonFmRz1CxYxdG94K4Fj0B2L3gDOLZw 3cLQwvcX+YEHF9chV83itxe/veANyKMsBhxffHLx2SUhjseXvMnx/pKTCO8vOV0jLTmN8ydrbqw5 WnP8qiBwf60b+R5fclo+U7tuyenaD2s/u7bmuv6lS5fZl6Usy26Smm5sOtx0NvK+shD4eZu1LcPf 7d/s7/Mf95/0n14jrSlZU7VmxRr/mnVretc8uOapNTvX7FvzbsAfuD/wRODzDtJh75jfsbxjd8eh YGlwefCRzus6eztf6fyiS91V2DWv66muE2ur1p7tTume113XHeh+pPvp7sM9GT039+zsOdxzdp1x nWNd+brZ6xrXPb7u8G35t1XddsttD9325G1Hbzu93rt+3frdt6tv994euP3Z2/tvP7chacPKDY9v OLmxYmP3xqdDNRfxVTtH+6OR3ibUNQzmR0I7hiF7kIuMverRI27kOJF7+gW9TsTzxGCk7wj1D4N5 h9DBYch+gflQ65OufucD8MNHZgzAa3IfzN/hb2018K8PmR+zPmg6EPWZyGs7ndnIrjXtND807Dtl LcE7V3H/K+fKMD8W0R5LZb6Y5z3CzvP8igZR7k7Th/Dkj+GKI7y0A2D3IN6PcAzPDp+OmhWqYuaB 4ZngMcb7PO//5HneX6/4/Hu4v+denpeDq81ViD8U8YSwxxOKveCbZP8j+zfFjvCJ8IDMao1R7xix KHycqzp0nF0xbOPM2tDx0HGUxnJ9gXM1iccza8/vE/CDB2M86gX8bKxfPd+nKp67n/cm2YsujPhP 5teRglpDJxOfQEqtq6asdPHbDkmex/g75izn2YRj6FX2yOwTmVXsKQ5peAaSeyWb23huieXAta86 7OwMS2G5WLo9xXQg0lNdSfYUzIB2dj2Ly6nD82jsTMq48FlTmTdjZk47Shg9Tz4wYnY8oMyM8RH2 OH9Wrp3Vv6Am4ZirCnxGaJ9pjekYlooZsREdyyORaVPuKZmN0Hc1sybThKsmfju39xPMNjGjuiLx abQ1MsMelEsNnXSFQidlsBrYe2YtswqLyT2NvYdOjvdklchBnuGySvisFAM2w8mzG58f/5vgc2oM zs/BZ9oYKDNuFOdfwWbarwc+F182ojP2RTBaUwzRefwi4DP7ZYOvNi4To7XD1ygxOF9/fO0SA9bv ZUt/PZxf8t9nd3mQ9czWLubHpqurM6afMx1hqx6ObTxFzVY6/GhbdQZbAynnAKygytmqSU5lvp/F GPjqaClfWbE11MCMAb4+wuoIsVenb+Ork1B0FcPw+JLQ4qNLQmwFw48eV9Y5cvxxrIKOsxS2omHX LVbAVzxBvjZCXn72cSYTn0bux9lqCt4ie/FRvu7qVlDDU7LZqosf1Sw+yvyScg7Ayq0YazW2QmPX 3cVjAF+n+fl6Dnn5Si26XltQM1PgGjnHdHFVUNbEdDVvDxjLTBe8wctmNd3Fy+LljhyJ51s0th/k HJKPiJr2hY+Ii8K7xWuJRVxKjGIg/GfxFTKFCDhzAEcf8dhJ8drwh4RCniEC5Ovi0vAB7NR/Gj5H 9oXP0ToSR+tJLV1OEmkDGUcbiY2uJjbkLEXOmWJL+F8JRTkfEAl5jchrQ14j8up5eR8h12dER28h KTififPX4nwqzmeirPEoaxyu/j74vE8MiP0cfG3ievC4Pfwi+FaIH4S/J35IisWPSIn4MSkQPwm/ I36K3S4r/QBKP04kxAT2iwqweQAl7SXdxEKqiRWhguSRSoTG8DvEh7ACoSP8MQmGvyCdCF0IaxG6 EXqIkawLv0tuQ1iPcDvCBoQ7cP0WhDsR7kK4G6EXYSvCPQj/gHAvwktkNnkZYRDxIYQwyaMEgSLU kEp6FUItwtUI1yA0kyW0n6Sjxc3idWSaeBPRircitJBe9osIcRNxi3eQNOkfw+9KOxAeRXiX5Env IRxE+C3CIYTfIRxG+D3CEYR/QziK8AeSp7KG31EdC7+r+k9iVJ1E/BTCQPhdtYpUq/PwPonkqcvw 3hJ+R92K0IbQjtAZ/ljdhQDdqKEbNXSjXocA3aifIZXqZxFeRDhDKjX5JF1TgHArydPUISxHWIMQ QOhBCCFsQoCONNsQvoPwjwiPktman+L9FMJnCAMIf0b4HOG/eLvz+Djrst/jd2bSJE0mLKWsRUug lEUB2RVQQKUWlLqCCD4Y2TSIiGBZ9Cm0hEVkqYpAERGVsmqLEqssEgq0tE0JNG2Sppna0KZDkukk TdLMZNqCv/OeeSIvH885r3P+OeePD/cs93Jd3+91Xb/7DgmMgoYVF+MSXIqZ0eTxUXTy+InR5GLt vqOuK4uv+rg+Gu2pahtUbYNqm6raTldtN6u2L6u2i1TbmartNHvPVy9Hxs8N98S/Gn6ogo5XN/c5 Q228MTwe71ZnqSgef0cN9kUXFOtss73Wu838Z1dcGB31L+ef7vzXOv8Zzn+ivc937l84918ddaxz 3+/cDznf35zv3GgXZ9nqLFudZTdnOcRZrnSWo5zlKGf5kLMcIsoNznSoM11S+BsTZ3iymOkKr56J 9nGOl53j5ZLCbzZ8I7zgPEc5zzec5zjn+bLznFpSF95yrqNK5oXnHPmi85U637Uiu8w59xBZvbPd Gd8URkTXFO/VrX3REfH0WMfu7qyHO2uds57orGc46xRnPNTZ1jhyjc47W5bnRFVjE+Y9k6QwWR6M 6kMmugW34jbcjh/jDvwEd+IuNIV8tBJvoBlv4i2sQgtWYw1a0YYO/D2EaAO68DY2YhO6w8poM1IY Dslomz4fQRY5jCJvum33/Q7sxLt4D/8QSwiZkgglxanYHT9fhX09bI1faFsbtpauDpnSNWhFG9qx Fh1Yh04ksR5/R2/Il/YhjS3IoB8D2IpBDGEY2zACsZT+AyGsHDchrCw/LeTLz8BZ+CxmhJ7yr9ie g/N9fwEuxDdCprwWF+E7vvu+7dX4gdfX4Xrc4P1/2s62nYPbvL4dfCifa/tT25/hXq9/gftwPx5w /kd8/juv53v9e6+f8fpF8KicR+U8KudReTKE8vXgUTmPynlU/rZjNmITeFTeF5LlaWyRSwb9YVX5 ALb6btC5hzCMEe95V56zHfWeRxUX4xJcyq9YdE80sbhyxaN71O45ariweo3zboF3Z3l3pipfEn8r +lDhv8wbctGnVWZSZSZVZlJlJlVmUmUmVWZSZSZVZlJlJu3do9LyKi2v0vIqLa/S8iotr4oyKian YnIqJqdicq632PWS8f+IxsW/iYtU0MWhW9UkVU1S1SRVTVLVJFVNUtUkVU1S1SRVTVLVJFVNkpM5 TuY4meNikotJzuW4luRakls5TuU4leRKkhtJquepnqd6nup5quepmqFqhqI5iuYomqNikoo5Kiap mKRistixnVE5LU/XyRXW3pesvYviq6y1LVYhq01R37QMW2S4sajvf3q3j3f70/dmZ1gbnWedrLFO 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 fn/WzTIzbgorq34U0lX/iVm4ETdhNubgZtTjFtyK22A2VpmNVWZjldlYZTZWmY1VZmOV2VhlNlaZ jVXmYpW5WGUuVpmLVeZilblYZS5WmYu7jEclqsy8wmRPF2PP6vGUHk/p8RTdCs/pU327Wu+m9G5K 76b0bkrvpsSeFXtW7FmxZ8WeFXtW7FmxZ8WeFXtW7FmxZ8WeFXtW7FmxZ8WeFXtW7FmxZ8WeFXtW 7FmxZ8WeFXtW7FmxZ8WeFXtW7FmxZ8VemFnnhXXUfoPCr7w/swoZdUXHyKjB95t8P8qNd7nxLjfe tW+XfSvsW6VTKmV6pE6plO2RYz8Dep1D73LoXVk2yLJBlg2ybJBlgywbZNkgywZZNsiyQZYNsmyQ ZYMsG2TZIMsGWTbIskGWDbJskGWDLBtk2SDLBlk2yLJBlg2ybJBlgywbZNkgywZZNkTHy6SeN8t5 szxWF+3Pn+UyuFgHbNcBOZncIpO9x34ys3fhJzMyeaDw0yzeLefdct4t591y3i2XVb2s6mVVL6t6 WdXLql5W9bKql1W9rOplVS+relnVy6peVvWyqpdVvazqZVUvq3pZ1cuqXlb1sqqXVb2s6mVVL6t6 WdXLql5W9bKql1W9Pj6v2McflcVbY//OaZqo7xX1s1GVfJvl2yzXZnntKac9fXOffJrl0yyfZvk0 y6c5KovN5Ou1YXvsuvBO7BZ1cXcYiN1X+Em7T3fEbgm5qMQ/t0eH2SMXu15F3IBbQlvstqgidruj 7wq9sfsL/62msDP2YNhZ5f62yv1t1QfwQUzGAajBgbjEPpfiMnwL30YdLsd3cAW+iyvxPVyF7+Nq XIMfYCauxXW4Hjfgh2FnMZ8dIu2OzQo9ctkc+0XYGvOkF50fu1q1X4OZPr1eljfgprAqNhtzcDNu ifaM3Raeic2130/D27Gf4ee4F/PC8/J7vioW3qiKoxTjUIZyVGA8KlGFBKqxC3bFbtgdE7AHJmJP 7IW9sQ/2xX6YFAZoOEDDARoO0HCAhgM0HKDhQNVJYVXVyTgFH8cncCpOw+n4JD6FT+MMTMNnMB1n 4hJ5XIrL8C18G3W4HN/BFfgursT3cBW+j6txDX6AmbgW1+F63IAfhuejUpWzgYprqLgxdn8YUku3 hGF1Mhp9gQt5LuQ5sIMDhQrbaMXJWXFy9shROU/lvBUmZ4XJWWFyVpicFSZnhclRP0/9PPXz1M9T P0/9PPXz1M9TP0/9PPXz1M9TP0/9PPXz1M9TP0/9PPXz1M9TP0/9PPXz1M9TP0/9HdTfQf0d1N9B /R3U30H9HdTfYZXLWeVyVrmcVS5nlctZ5XJWuZxVLkfdPHXz1M1TN0/dPHXz1M1TN0/dPHXz1M1T N0/dPHXz1M1TN0/dPHXz1M1TN0/dPHXz1M3ruWtVd6EXZ9H0RtV9S7QLtbupvYnaW6OraNxI40aV 3mvP5bTupnV37Ifezwp9jhpW+RmVn1H5GZWf4cN7fGjkQyMfhmL3hGU6YK0OWKsD1uqAtXrpDbPh dR618aiNR408auRRI48aedTIo0YeNfKokUeNPGrkUSOPGnnUyKNGHjXyqJFHjTxq5FEjjxp51Mij Rh418qiRR408auRRI48aedTIo0YeNfKom0fdPOrmUTePunnUzaNuHnXrkIwOyeiQjA7J6JCMDsno kIwOyeiQjA7J6JCMDsnokIwOyeiQjA7J8LiRx408buRxI48bedzI40YeN/K4jcdtPG7jcRuP23jc xuM2HrfxuI3HbTxu43Ebj9t43MbjNh638biNx208buNxG4/beNzG47aojoMpDqY4uI3fr3JxK+c6 ObeFcwOcG+DcAOcG+J/g/7Pcy3AvE7vTZ3dzem5YwMFeDvZysJeDvRzs5+CQOnmJi11c7OJihosZ Lma4mOFihosZLqa4mOJiiospLqa4mOJiiospLqa4mOJiiospLqa4mOJiiospLqa4mOJiiospLqa4 mOJiiospLqa4NMClAS4NcGmASwNcGuDSAJcGuDTApQEuDXBpgEsDXBrg0gCXBriU4VKGSxkuZbiU 4VKGSxkuZbjUxaUuLnVxqYtLXVzq4lIXl7q41MWlLi51camLS11c6uJSF5e6uNTFpS4udXGpi0td XOriUlf0ES7luJQrduN/uTDChSEuDHEgx4HCc9MQdYeoO0TdIeoOUXeIujnq5qibo26Oujnq5qib o26Oujnq5qibo26Oujnq5qibo26Oujnq5qibo26Oujnq5qibo26OujnqDFFniDpD1BmizhB1hqgz RJ2h6HCT4V2T4V3dn7GeV8bulMVdsihG7/X9mGe9f9C6Pcld3f74AD6IyTgANTgQl9jnUlyGb+Hb cAdJ61Faj9J6lNajtB6l9SitR2k9SutRWo/SepTWo7QepfUorUdpPUrr0ejbtO6lda+IMyLO6IK0 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 j9d+p0/Qp2q/15/RX9CG69P1uVqmPl9foI3VV+qva+P1fP1D7Qn9Y32vNk8P60e01XqJflLL10v1 r7U39dN6ufa2fk6v1N7RlRTa+1KXUtsmLRnUPpQ1ZG3tc5kqU7WdMk021HbJC2Vzba9sKVtpYdlG ttMi8iJ5sVYoO8qO2leys7xUK5JdZFftsOwmr9KKZXd5jXZc9pA9tBJ5rbxWi8oMmaGdlL3kLVpM 3i77aaWyvxyqlclMmaXF5YPyYV3ISXKSbsrJcrJuyblynm7L1+RruiPfkG/oAfmWfEt35Ua5TQ/K 7XKfXl8elif15vKsVPpFhs9I0bsaqUZbvYfR3eiu9zXGGlP1O4xnjT/rI423jXf0ucYXxg79JWO3 UawvM04YSn/D5/gc/XOf63P1L3w1fbX17b4C3359l++gr0gP+474juiFvmO+Y/qXvhO+Ev0r30nf 1/oh32nfaf2474yvXD/hO+c7p5/0Vfoq9ZjvO9OnnzItM0U/a9Y0a+pxs7ZZV1dmfbOJlOaF5mXS MS83L5cXmFeY18sm5i1mX9nRvMt8THY1nzCfkgPNZ8zn5GBzujld/sGcac6SQ8055hx5jznPXCzv NZeZy2SmucJcIbPMV8xX5ChzrZkvHzDfNLfICea75gdyivmR+bF83PzE3COfNPeZYTnLjJgROdv8 0vxKzjGPm1E5z/zGrJKLLGHpcrVlWc3kGqu11UX+xbrS6i4LrB5WDxm2fmNdL/dbN1m95ZdWH6uP PGLdbt0uj1p3WHfIYqu/NVges4Zaw2TMGmGNkJ51vzVBllrZ1mT5nfWI9aihW09ZUw3DetZ6zjCt 6dZ8w7YWWguN2tZia7FRx1piLTVSrZXWSiPNWmttNupZ26xPjLbWLmuv0dE6YJ02LrfKrPNGL6vK Usbtdmu7tdHPbmu3N+60L7E7GgPtLnYXY5B9pd3NGGxfbXc37rZ72D2MofYN9k3GMLun3dMYbve2 bzHus2+z+xoj7TvtO40se6g93BhlP2CPMR6ys+1sY7yda+caD9uP2I8ZE+yp9jNGjv2c/bwx2Z5u TzcesWfZs4xH7bn2IuMxe7WdZzxtr7XXGs/ar9mvGc/Zp+1vjeftM/YZY5pdYVcY0/1sfMYMv+E3 jFl+y+8YL/pdfz1jnr+Bv4Gxwt/I38RY6W/mb2bkObc5/Y1XnSHOEON1Z5gzzNjg3OeMMPKd+537 jT87Wc4o401ntDPaeNsZ74w3NjrZTraxyZnkTDE2O1OdPxrvOu85fzWKnT3OQcNzvnSKjbPOuUBD Ix5oEZjhaxaYFVjumxZ4M/COb0lgR+C0b7VrufV9n7kd3N/6Ct1+7n2+Cvd+d7Tpdx90x5o13PHu BLO2m+1mm3XdSe6TZpr7tDvNbObOcGeYbdxZ7myzrTvXXWZ2cF92Xza7uivdP5pXuOvcN8we7lvu ZvM6d6u71bzZfdd91+zpvu/+1ezlfu7uNvu6ITdkDnT3umHzLjfifmUOcQ+5X5v3ut+6FeZ497xb ZU5y40FhTgnqQd18LGgETfPxoB0Mmk8FawbTzOeD9YP1zReDDYONzdnBJsGW5rxg62Brc0lwSnCK uTT4aPBJc1nw6eAL5ivBmcEXzbXBOcG55mvBBcEF5vrgouAi8/XgS8Hl5obgiuBq860UPSXF3JJS O6We+UlKo5QLzB0p5Snnzd1Cd9DvQrjX1rpVtBXNxH/pH7VJHVHHRCd1gvMDP5sirhapdfyVqme5 ulUN4J0POTtR/fyEivLvQ9VXZ//p/cTTqCrj7+/PrJ8p51uY/Yv1zYGtP7nzJSWkJUr5l//gvEi3 X1Vy7hLJB4og10d+WscfWvMzZX6uipSnviCHw7T2+C/V8X/wj02uc6tzP6pi6kNVXH11+p9KPwmF 6itVoCrUTcJP37UXF/7oefyXClNnGLsycvh7zel/FMv3T19RrwgX/jaG//D2KShWEfL4kksfOqu1 uIazpsmnf1Hb1V7mD3MH3/7z5a9RL6slHJ+GdHWJGqfGcvajfvyh9ZzF/untuPpIHWcGfaQ+ox6M Q6L3fvrW39J+/gtdIfCpQqQkz6ZV3/HI+4sf5ub/o+474KQqsq/vq9cvdHf1ZGACQ84gDjAMSBIQ UEEFMeCiSFBBERxEzJKMiCiIfwFXBBF0VRRdRRRw0VXMrgEkiGSQLJJBUn3n3u4ZZ5whDLC635tf 3a5Xr1K/rjp17gtnCo6KWMoefPNdOPc/md3g+/FIysavkN+62Sq/0Na83EXKbzObMce2551xvjIq n8sL5jlRv2P5lhXau7XQ3ucnVwe2epI/NtLMEvx+vllygpb3F5jb9ajxCXK/Zl7mGW0+Pek+FS6/ gUcHj9kiRxadRGl8M/OwxGb9cT6bXidRHmPEzBTcWsm/W0k384qg6Ss4r0U3/6Rq+NXMEdQ8yXFR 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 PG9iXjPCOoi1S8E5nBDGkEcZnB9+SvzPoPVdD2eCJWA+uB4d8adzjT7FfVPfMQqqzgp6rYDPwAMn 8dJ7bhm50FhbDXJjPaQ3VuewStxVOhJnGfwn8A5x4qA/yj3KKhjU2+vbensVb2hUbHXGMDaNWB/8 Cka+glZTRTuDl7oZgj5dL7dh4A7h56rcvYZI/gB8yKulWnkqqKWT0BmP/gtk3Mfk0aVU1PZU4Onw r2sFlriSXu4a1mUDNrm92pOxfD/WmsMv0/uv3HC1tQTNCsX0VRrh6T5uW7/CMu9M0ky1/wO3m1Iy 9AgZ9CrZcTPI7dheiIXnseZzHpdeFdh5Tcfm8J7K4UYsa6F7aJy78APKi4VKcCd5XQnuJFsrwZ2M 9hXhn+aJy/HSGT0D2M9RnTaCDmN7Xe/Izm/BYYo2b07szYEndL8jiyfBv4r+bPo+TaaXqiSQ0moQ uA/5m+jvB/uBcwInFdMG6E6Hzu80ctKugq8PtsHaGfSnMOZaujs49fQ9lXOjm0n8KG/p2NxjuvpO PXJnlLlvEg/l7iaNE5U7H3p3an1jWcYdpwN53VP3iLRc1u4dVuoW5QO13DrSeoo9a4XeiCV6tSZ0 19a0XHaWOZpNUq9WguupSytB3UNDvEdqjnwf8n3IP0F+EPm7yAdi7QOeYm5eo9gZd4Ir9Lnufp1R gPex9hJu3HPZ46apvvV7vV9LlcvHw18wZq1LHfSuHahD1leS3asVxZNbqDM3MhLFrbReyrnoUj35 SD08Sy7MpGJo62iw1Kse2ms3deMNvXeLznTk0xk/9SrwiPDLGPNtzlWCv1F0svD/Ymb6PqszHJ27 PE2VNOYe9JbO0blc78g2b5Vtc2vbw61tEzX5YfzQiHVvyb3s10RLA1dqUSCdXl9wQnhJ7+NusSM3 C2cCNXYIfYfQ9yn4Bfos6/s8sZB1mc2tfxAz+jk33J1khIPkab2VO80Z593of8oTGZU7Dn6U3s3t n8Abnfux0A78sZ6X5NyoWbnCuVL3BUb4EXFubtO3Egk9mfuNdoXMa4DaCQwDRyo6c5yFVE7NiB8o 745wRzAq9WdfdMzPO1ZRzVxttR/QXcz1Y6cu/l/BCH+n9277PfhP9LZu3wTfU2/r9ovM5TIdiUsG OXc5DUUyi/GPsT8RfMSWSHCO6E98Ar/lTHiv3tZldjqeq/TObo/H5gMeqg/rgHfpPd1dAf5I7xH2 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 UsoOzXyz5HLzcPCq8egyFrM6w7Gx1UvxjvvWlU1PMiKvz698nPVG3GAR49mKwf21Yjo/fGqauVZf uk2iMeawklvu0qms2OwDBebrw/hVnvB5oN9I3polGiMbJVQM288LnBMElnqx7OrnMZbdi1jceydY AUtb6w/0eeG2ZF6Vid7komMvDs9lW8++5hWr+Yo6e2hmiN9E0IelAK/cVFjz3qIi1Lecb/CkfVHK eU+fp7kxWVFl5qOvfUg6tkVpVqBuS+E6XWPxRJXAGsu+0f1ErewzQw5dsil/1N48d+/D4tJ4kwNu VdO15XUS2BZj0qdPsLdROFxevtM1rHqDdff8JM35eYpU6FNr+ckq1Xlampdtnuk9O/TO8fyQaw2G 80frDHbs7z/huU/Lxrtrc88OEx5JHhgvLvcqQfPYOlHlQO99uyItFxckBOyZVsDdeGyLQ6u88HOa YdTurnue1enaNaFHctV/lw8mLfk7xi870KT5aO/Os0F7Znozr43S9yjL2lkyc2t5/qoZKjdW/s6d oWVgWCo5LX9i+oBj+S0Lz2rWvejrXpPzyul+GwgRLmbPrY6ofjzt+abVFwW63bBqol+Dq2pBQ4dB 3kj9sbypNdyizwKRGBrCYptIACg03P4+Xv71aZPvJ5Hzk0/RuPbFf6UYAk7vM9RoB7632AJI9V6r SMPg1w+KCZAohZo0npFuiV5jahZVfc8iYtnl09M6qeBeH+EIfCjv/MHzBxGuRAQRRMQSQnySO5SI JzQIbyKJiEGtMLQ8ANXCiaQCnfn9/3SweifFCMNiA2LCkwx+CipiIkBYdmxcxiq+umVqZecAW3ju 8K3mD+IuZWq+RzVnv02dYMx7JzaRd1OOLUw1rnXQzO2Ksiqv5M7xY3TIdzg58bcOSgi1SFzS6p+p fBe8SFtcwdvCrX5d6hUy93gaKJbIOhqQH3Ht2IT+mmtz5A90OI54Gue9V712hE/Lk/qic3tCZdOS Te3vrPj8PufmzczhoqUFQ3VfE/VJKhV6e9xbX8QUntrISmTOLktvVesWPrc4bBt1hlpwxXTtwk+6 sl3ZKoaSSemjJ9W2Xs7hdZZtuX7SO01e4sOuqePG/3413aHLUlTxfn5t1JI5e2UTQ5zGmi13j1Ff lp/hcbx9YwWL1aS1lOmoHjnIVqJARA6iRGT/7zYSF4hIRbRIDnvl0r+NAn49I9HLJydRSr1dkv19 ZgWgL/+2himQwbMHhgJjQ0NjQ4Fgwh88ssGEe3fM4Th+rnd+zZy0YplbHb8H/6TXtK/cvjRv9JPK M90BJuHd+fkrfu94Fb0X7N4QWVAXJXHKp7yU83HK4ctFJqk50yYVzje4L9iZ4HbXxQq+Omz05nJx g4J1p6Wz9s0l1GPepQUxV8A+61xDe+VZPpkjh2k7XHy9+UbU9sPNT8RD/dSqsm8ZXJcpmH2922hb B1Fvc+/C20r75KAPm+abao49afBU+VpjfdyopFLH+kf7Rt0/PXTzqwG2zmEOiubn2ur9RzETkoXa GsxJs55ZS2XyTsdkVzckTn880Yq7PGRni9SIokfx/GyewtsZb9YWEINeivmrpo4bV59eumfgwgsF A8Qv76qYOyO6RuxE3Rjv4Gefqje9N0gIl76xw67UrJj4H88IEAcNCmVuZHN0cmVhbQ0KZW5kb2Jq DQo1NyAwIG9iag0KWyAyNTBdIA0KZW5kb2JqDQo1OCAwIG9iag0KWyAyNzggMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA3 MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjY3IDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDU1NiAwIDU1NiAwIDAgNjExIDI3OCAwIDU1NiAyNzggMCA2MTEgNjExIDAgMCAz ODkgMCAwIDAgMCA3NzhdIA0KZW5kb2JqDQo1OSAwIG9iag0KPDwvVHlwZS9YUmVmL1NpemUgNTkv V1sgMSA0IDJdIC9Sb290IDEgMCBSL0luZm8gNTEgMCBSL0lEWzw2MTRDOTg3RTU1QkQ1RjQwQUQ4 MkJGRTBCNjc0MDFGRT48NjE0Qzk4N0U1NUJENUY0MEFEODJCRkUwQjY3NDAxRkU+XSAvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCAxODM+Pg0Kc3RyZWFtDQp4nDXQuQ5BURCA4XPvte/XviYSay/R eQS9PSh4AJWEgkKt9Qyi9AZqlN5Fwbnzc4r5MslMZuYopd/nY+hoK+WwhatglgX3WSi9hepdqFlw EeoneAiNvdDcCF0aemuhXxEGCXgKw50wWgnjgh6tlyiqLOQgDxn4lRR0w8T6ZwaYYIEL3OABP3jB BwEIQgjCkIQIJMCGKMQgDilI6wWnNzlsdgT+c35wMBYdYdl2MF9ZaCn1BW3/HMYNCmVuZHN0cmVh bQ0KZW5kb2JqDQp4cmVmDQowIDYwDQowMDAwMDAwMDIyIDY1NTM1IGYNCjAwMDAwMDAwMTcgMDAw MDAgbg0KMDAwMDAwMDEyNSAwMDAwMCBuDQowMDAwMDAwMTgxIDAwMDAwIG4NCjAwMDAwMDA1NDQg MDAwMDAgbg0KMDAwMDAwMTQ1MSAwMDAwMCBuDQowMDAwMDA3Njc1IDAwMDAwIG4NCjAwMDAwMDk0 MjIgMDAwMDAgbg0KMDAwMDAwOTQ3NSAwMDAwMCBuDQowMDAwMDA5NjQ1IDAwMDAwIG4NCjAwMDAw MDk4ODEgMDAwMDAgbg0KMDAwMDAwOTkzNSAwMDAwMCBuDQowMDAwMDEwMTE0IDAwMDAwIG4NCjAw MDAwMTAzNjQgMDAwMDAgbg0KMDAwMDAxOTkxOCAwMDAwMCBuDQowMDAwMDIyNjQ5IDAwMDAwIG4N CjAwMDAwMjI4MTkgMDAwMDAgbg0KMDAwMDAyMzA1OSAwMDAwMCBuDQowMDAwMDIzMjQ4IDAwMDAw IG4NCjAwMDAwMjM0MjUgMDAwMDAgbg0KMDAwMDAyMzY2NyAwMDAwMCBuDQowMDAwMDIzODM1IDAw MDAwIG4NCjAwMDAwMDAwMjMgNjU1MzUgZg0KMDAwMDAwMDAyNCA2NTUzNSBmDQowMDAwMDAwMDI1 IDY1NTM1IGYNCjAwMDAwMDAwMjYgNjU1MzUgZg0KMDAwMDAwMDAyNyA2NTUzNSBmDQowMDAwMDAw MDI4IDY1NTM1IGYNCjAwMDAwMDAwMjkgNjU1MzUgZg0KMDAwMDAwMDAzMCA2NTUzNSBmDQowMDAw MDAwMDMxIDY1NTM1IGYNCjAwMDAwMDAwMzIgNjU1MzUgZg0KMDAwMDAwMDAzMyA2NTUzNSBmDQow MDAwMDAwMDM0IDY1NTM1IGYNCjAwMDAwMDAwMzUgNjU1MzUgZg0KMDAwMDAwMDAzNiA2NTUzNSBm DQowMDAwMDAwMDM3IDY1NTM1IGYNCjAwMDAwMDAwMzggNjU1MzUgZg0KMDAwMDAwMDAzOSA2NTUz NSBmDQowMDAwMDAwMDQwIDY1NTM1IGYNCjAwMDAwMDAwNDEgNjU1MzUgZg0KMDAwMDAwMDA0MiA2 NTUzNSBmDQowMDAwMDAwMDQzIDY1NTM1IGYNCjAwMDAwMDAwNDQgNjU1MzUgZg0KMDAwMDAwMDA0 NSA2NTUzNSBmDQowMDAwMDAwMDQ2IDY1NTM1IGYNCjAwMDAwMDAwNDcgNjU1MzUgZg0KMDAwMDAw MDA0OCA2NTUzNSBmDQowMDAwMDAwMDQ5IDY1NTM1IGYNCjAwMDAwMDAwNTAgNjU1MzUgZg0KMDAw MDAwMDAwMCA2NTUzNSBmDQowMDAwMDI0NzcyIDAwMDAwIG4NCjAwMDAwMjQ5NzYgMDAwMDAgbg0K MDAwMDAyNTAwMyAwMDAwMCBuDQowMDAwMDI1MjIyIDAwMDAwIG4NCjAwMDAwOTE3MDkgMDAwMDAg bg0KMDAwMDA5MTk1OCAwMDAwMCBuDQowMDAwMTg2MzkyIDAwMDAwIG4NCjAwMDAxODY0MTkgMDAw MDAgbg0KMDAwMDE4NjY0NCAwMDAwMCBuDQp0cmFpbGVyDQo8PC9TaXplIDYwL1Jvb3QgMSAwIFIv SW5mbyA1MSAwIFIvSURbPDYxNEM5ODdFNTVCRDVGNDBBRDgyQkZFMEI2NzQwMUZFPjw2MTRDOTg3 RTU1QkQ1RjQwQUQ4MkJGRTBCNjc0MDFGRT5dID4+DQpzdGFydHhyZWYNCjE4NzAyOA0KJSVFT0YN CnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSA2MC9Sb290IDEgMCBSL0luZm8gNTEgMCBSL0lE Wzw2MTRDOTg3RTU1QkQ1RjQwQUQ4MkJGRTBCNjc0MDFGRT48NjE0Qzk4N0U1NUJENUY0MEFEODJC RkUwQjY3NDAxRkU+XSAvUHJldiAxODcwMjgvWFJlZlN0bSAxODY2NDQ+Pg0Kc3RhcnR4cmVmDQox ODgzODYNCiUlRU9G --_004_FBBE44552A7D1545885C95414B836F4883B209D8TDSBMBX15tdsbon_-- From david@fromorbit.com Mon May 2 21:50:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LONG_TERM_PRICE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AF5AC7CA2 for ; Mon, 2 May 2016 21:50:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 576068F8033 for ; Mon, 2 May 2016 19:50:17 -0700 (PDT) X-ASG-Debug-ID: 1462243791-04bdf035964375a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 04KxvUUaifUWVZHg for ; Mon, 02 May 2016 19:49:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BSBwArEShXPMPVLHlegziBUIZsnn8GjBaFbIQThgoEAgKBOE0BAQEBAQEHAQEBAUJAhEEBAQEDATocIwULCAMSBgklDwUlAwcGFBMbiAcHuxUBCx4ZhUCFFIQjBoVqBZgUjg6BcYRNiF1FjmyEXyowhn+BPQEBAQ Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 03 May 2016 12:19:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1axQPE-00080G-7J; Tue, 03 May 2016 12:49:48 +1000 Date: Tue, 3 May 2016 12:49:48 +1000 From: Dave Chinner To: "Rudoff, Andy" Cc: "Williams, Dan J" , "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-nvdimm@ml01.01.org" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160503024948.GT26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> <20160503004226.GR26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1462243791 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7751 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.21 X-Barracuda-Spam-Status: No, SCORE=0.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, LONG_TERM_PRICE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29251 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.21 LONG_TERM_PRICE BODY: LONG_TERM_PRICE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 03, 2016 at 01:26:46AM +0000, Rudoff, Andy wrote: > > >> The takeaway is that msync() is 9-10x slower than userspace cache management. > > > >An alternative viewpoint: that flushing clean cachelines is > >extremely expensive on Intel CPUs. ;) > > > >i.e. Same numbers, different analysis from a different PoV, and > >that gives a *completely different conclusion*. > > > >Think about it for the moment. The hardware inefficiency being > >demonstrated could be fixed/optimised in the next hardware product > >cycle(s) and so will eventually go away. OTOH, we'll be stuck with > >whatever programming model we come up with for the next 30-40 years, > >and we'll never be able to fix flaws in it because applications will > >be depending on them. Do we really want to be stuck with a pmem > >model that is designed around the flaws and deficiencies of ~1st > >generation hardware? > > Hi Dave, > > Not sure I agree with your completely different conclusion. (Not sure > I completely disagree either, but please let me raise some practical > points.) > > First of all, let's say you're completely right and flushing clean > cache lines is extremely expensive. So your solution is to wait for > the chip to be fixed? No, I'm not saying that's the solution - I'm pointing out that if clean cache line flushing overhead is less of a problem in future, the optimisations made now will not be necessary. However, we'll be still stuck with the API/model that has encoded those optimisations as a necessary thing for applications to know about and do the correct thing with. I.e. we end up with a library of applications that are optimised for a problem that no longer exists... > Remember the model we're putting forward (which > we're working on documenting, because I fully agree with the lack of > documentation point you keep raising) requires the application to ASK > for the file system's permission before assuming flushing from user space > to persistence is allowed. And when the filesystem says no because the fs devs don't want to have to deal with broken apps because app devs learn that "this is a go fast knob" and data integrity be damned? It's "fsync is slow so I won't use it" all over again... > Anyway, I doubt that flushing a clean cache line is extremely expensive. > Remember the code is building transactions to maintain a consistent > in-memory data structure in the face of sudden failure like powerloss. > So it is using the flushes to create store barriers, but not the block- > based store barriers we're used to in the storage world, but cache-line- > sized store barriers (usually multiples of cache lines, but most commonly > smaller than 4k of them). So I think when you turn a cache line flush > into an msync(), you're seeing some dirty stuff get flushed before it > is time to flush it. I'm not sure though, but certainly we could spend > more time testing & measuring. Sure, but is that what Dan was testing? I don't know - he just presented a bunch of numbers without a description of the workload, posting the benchmark code, etc. hence I can only *make assumptions* about what the numbers mean. I'm somewhat tired of having to make assumptions because nobody is describing what they are doing sufficiently and then getting called out for it, or having to ask lots of questions because other people have made assumptions about how they think something is going to work without explaining how the dots connect together. It's a waste of everyone's time to be playing this ass-u-me game... The fact that nobody has been able to explain the how the overall model is supposed to work from physical error all the way out to userspace makes me think that this is all being made up on the spot. There are big pieces of the picture missing, and nobody seems to be able to communicate a clear vision of the architecture we are supposed to be discussing, let alone implementing... > More importantly, I think it is interesting to decide what we want the > pmem programming model to be long-term. I think we want applications to > just map pmem, do normal stores to it, and assume they are persistent. > This is quite different from the 30-year-old POSIX Model where msync() > is required. Yes, it's different, but we still have to co-ordinate multiple layers of persistence (i.e. metadata that references the data). > But I think it is cleaner, easier to understand, and less > error-prone. So why doesn't it work that way right now? Because we're > finding it impractical. Using write-through caching for pmem simply > doesn't perform well, and depending on the platform to flush the CPU > caches on shutdown/powerfail is not practical yet. But I think the day > will come when it is practical. Right - it's also simply not practical to intercept every userspace store to ensure the referencing metadata is also persistent, so we still need synchronisation mechanisms to ensure that such state is acheived. Either that, or the entire dynamic filesystem state needs to be stored in write-through persistent memory as well. We're a long, long way from that. And, please keep in mind: many application developers will not design for pmem because they also have to support traditional storage backed by page cache. If they use msync(), the app will work on any storage stack, but just be much, much faster on pmem+DAX. So, really, we have to make the msync()-only model work efficiently, so we may as well design for that in the first place.... > So given that long-term target, the idea is for an application to ask if > the msync() calls are required, or if just flushing the CPU caches is > sufficient for persistence. Then, we're also adding an ACPI property > that allows SW to discover if the caches are flushed automatically > on shutdown/powerloss. Initially that will only be true for custom > platforms, but hopefully it can be available more broadly in the future. > The result will be that the programming model gets simpler as more and > more hardware requires less explicit flushing. That's a different problem, and one that requires a filesystem to also store all it's dynamic information in pmem. i.e. there's not point flushing pmem caches if the powerloss loses dirty metadata that is held in system RAM. We really need completely new pmem-native filesystems to make this work - it's a completely separate problem to whether msync() should be the API that provided fundamental data integrity guarantees or not. Which brings up another point: advanced new functionality is going to require native pmem filesystems. These are unlikely to be block device based, and instead will directly interface with the low level CPU and pmem APIs. I don't expect these to use the DAX infrastructure, either, because that assumes block device based operations. The will, however, still have to have POSIX compatible behaviour, and so we go full circle in expecting that an app written for mmap+DAX on an existing block based filesystem will work identically on funky new byte-addressable native pmem filesytems. Encoding cache flushing for data integrity into the userspace applications assumes that such future pmem-based storage will have identical persistence requirements to the existing hardware. This, to me, seems very unlikely to be the case (especially when considering different platforms (e.g. power, ARM)) and so, again, application developers are likely to have to fall back to using a kernel provided data integrity primitive they know they can rely on (i.e. msync())..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jtulak@redhat.com Tue May 3 05:00:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 39ADD7CA2 for ; Tue, 3 May 2016 05:00:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C005F8F8033 for ; Tue, 3 May 2016 03:00:12 -0700 (PDT) X-ASG-Debug-ID: 1462269610-04bdf03590445700001-NocioJ Received: from mail-ig0-f174.google.com (mail-ig0-f174.google.com [209.85.213.174]) by cuda.sgi.com with ESMTP id Gyu7BlPnYykY4wug (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 03 May 2016 03:00:10 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.174 Received: by mail-ig0-f174.google.com with SMTP id s8so15168392ign.0 for ; Tue, 03 May 2016 03:00:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=qJ3IilzGbg4jkyQOrfoy/2knJMBUOGx7jzGxFA2kKGU=; b=mYgBWOjiZusCC4ocqhWJzpvhUIosCaVDiuGJvqhNj9/fyP3xf2SMkMu15QhBJ6EdsU DDvyVssb8k4tuBWjXaLrE6P2oRyq+1QSbUalqpsGLvTd1hWjYHVoVMeYXv8MQ7DR7CqU u2g81wjsOMzRUmO81uojYnbGEsVAkaihHHoVaqParrX6K+Rkn47P84PplseXKwck3mZh QWTWVPNd8oLVY1G5jFbQA8VoUvJ3D0NbjG1w76Tiw8QNOSsjHz6VSfilBOORndGzBByw mECrstOb3ueyFLjFRCsXNf3hyNvcPOh/ruHSRf2fdlELnaN8O7FRl6OtPssDJQk8sMkQ CG8w== X-Gm-Message-State: AOPr4FU09JTZQDQ5PLcrhYHhrQOooDynmNUuIWPXC1aUiKKJe2QOnvmwqObPZNrhApFyidPEhM3HCOB/aWmlrN3P X-Received: by 10.50.56.13 with SMTP id w13mr2148480igp.19.1462269609632; Tue, 03 May 2016 03:00:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Tue, 3 May 2016 02:59:50 -0700 (PDT) In-Reply-To: References: <1461311383-30897-1-git-send-email-jtulak@redhat.com> <1461941267-31556-1-git-send-email-jtulak@redhat.com> From: Jan Tulak Date: Tue, 3 May 2016 11:59:50 +0200 Message-ID: Subject: Re: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e0158b06ca602d50531ed2c89 X-Barracuda-Connect: mail-ig0-f174.google.com[209.85.213.174] X-Barracuda-Start-Time: 1462269610 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11981 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message --089e0158b06ca602d50531ed2c89 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 29, 2016 at 9:11 PM, Eric Sandeen wrote: > > > On 4/29/16 9:47 AM, Jan Tulak wrote: > > From: Dave Chinner > > > > If the device is actually a file, and "-d file" is not specified, > > mkfs will try to treat it as a block device and get stuff wrong. > > Image files don't necessarily have the same sector sizes as the > > block device or filesystem underlying the image file, nor should we > > be issuing discard ioctls on image files. > > > > To fix this sanely, only require "-d file" if the device name is > > invalid to trigger creation of the file. Otherwise, use stat() to > > determine if the device is a file or block device and deal with that > > appropriately by setting the "isfile" variables and turning off > > direct IO. Then ensure that we check the "isfile" options before > > doing things that are specific to block devices. > > > > Other file/blockdev issues fixed: > > - use getstr to detect specifying the data device name > > twice. > > - check file/size/name parameters before anything else. > > - overwrite checks need to be done before the image file is > > opened and potentially truncated. > > - blkid_get_topology() should not be called for image files, > > so warn when it is called that way. > > - zero_old_xfs_structures() emits a spurious error: > > "existing superblock read failed: Success" > > when it is run on a truncated image file. Don't warn if we > > see this problem on an image file. > > - Don't issue discards on image files. > > - Use fsync() for image files, not BLKFLSBUF in > > platform_flush_device() for Linux. > > > > Signed-off-by: Dave Chinner > > Signed-off-by: Jan Tulak > > > > --- > > CHANGES: > > * read image file size in advance of O_TRUNC in case of dfile&&dcreat > > Signed-off-by: Jan Tulak > > --- > > libxfs/init.c | 21 ++++++- > > libxfs/linux.c | 11 +++- > > mkfs/xfs_mkfs.c | 182 > ++++++++++++++++++++++++++++++++++++++------------------ > > 3 files changed, 154 insertions(+), 60 deletions(-) > > > > diff --git a/libxfs/init.c b/libxfs/init.c > > index 8d747e8..c7ae00d 100644 > > --- a/libxfs/init.c > > +++ b/libxfs/init.c > > @@ -253,8 +253,15 @@ libxfs_init(libxfs_init_t *a) > > rtname =3D a->rtname; > > a->dfd =3D a->logfd =3D a->rtfd =3D -1; > > a->ddev =3D a->logdev =3D a->rtdev =3D 0; > > - a->dbsize =3D a->lbsize =3D a->rtbsize =3D 0; > > - a->dsize =3D a->logBBsize =3D a->logBBstart =3D a->rtsize =3D 0; > > + a->lbsize =3D a->rtbsize =3D 0; > > + a->logBBsize =3D a->logBBstart =3D a->rtsize =3D 0; > > + > > + // We can reset dbsize only when it is not a file, or we won't > > + // truncate it. Otherwise, we loose the size of the file forever. > > please don't use c++ comments in xfsprogs, we use /* comments */ > Sorry. =E2=80=8B:-[ =E2=80=8B > > ... > > > static void > > +check_device_type( > > + const char *name, > > + int *isfile, > > + bool no_size, > > + bool no_name, > > + int *create, > > + bool force_overwrite, > > + const char *optname) > > +{ > > + struct stat64 statbuf; > > + /* > > + if (*isfile && (no_size || no_name)) { > > + fprintf(stderr, > > + _("if -%s file then -%s name and -%s size are required\n"), > > + optname, optname, optname); > > + usage(); > > + }*/ > > What is this? > > =E2=80=8BAgain :-[ I commented it out during the development and then forgot to really delete it.=E2=80=8B > Jan, I'm just going to go back to the original patches posted in your V2 > series, > and either give them Reviewed-by's, or send followup fix-up patches with = a > > Eric Sandeen : fixed up foo, bar, baz > > tag and a Reviewed-by to go with it, I think that might be the fastest > path to > finally getting this stuff merged. > > =E2=80=8BOK, whatever you think is the best. :-)=E2=80=8B Thanks, Jan > Thanks, > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e0158b06ca602d50531ed2c89 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Fri, Apr 29, 2016 at 9:11 PM, Eric Sandeen <sandeen@sand= een.net> wrote:


On 4/29/16 9:47 AM, Jan Tulak wrote:
> From: Dave Chinner <dchinner= @redhat.com>
>
> If the device is actually a file, and "-d file" is not speci= fied,
> mkfs will try to treat it as a block device and get stuff wrong.
> Image files don't necessarily have the same sector sizes as the > block device or filesystem underlying the image file, nor should we > be issuing discard ioctls on image files.
>
> To fix this sanely, only require "-d file" if the device nam= e is
> invalid to trigger creation of the file. Otherwise, use stat() to
> determine if the device is a file or block device and deal with that > appropriately by setting the "isfile" variables and turning = off
> direct IO. Then ensure that we check the "isfile" options be= fore
> doing things that are specific to block devices.
>
> Other file/blockdev issues fixed:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0- use getstr to detect specifying the data d= evice name
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0twice.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0- check file/size/name parameters before any= thing else.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0- overwrite checks need to be done before th= e image file is
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0opened and potentially truncated.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0- blkid_get_topology() should not be called = for image files,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0so warn when it is called that way. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- zero_old_xfs_structures() emits a spurious= error:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"existing s= uperblock read failed: Success"
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0when it is run on a truncated image f= ile. Don't warn if we
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0see this problem on an image file. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- Don't issue discards on image files. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- Use fsync() for image files, not BLKFLSBUF= in
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0platform_flush_device() for Linux. >
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> Signed-off-by: Jan Tulak <jtul= ak@redhat.com>
>
> ---
> CHANGES:
> * read image file size in advance of O_TRUNC in case of dfile&&= ;dcreat
> Signed-off-by: Jan Tulak <jtul= ak@redhat.com>
> ---
>=C2=A0 libxfs/init.c=C2=A0 =C2=A0|=C2=A0 21 ++++++-
>=C2=A0 libxfs/linux.c=C2=A0 |=C2=A0 11 +++-
>=C2=A0 mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++++++++++++++++----= --------------
>=C2=A0 3 files changed, 154 insertions(+), 60 deletions(-)
>
> diff --git a/libxfs/init.c b/libxfs/init.c
> index 8d747e8..c7ae00d 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -253,8 +253,15 @@ libxfs_init(libxfs_init_t *a)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0rtname =3D a->rtname;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0a->dfd =3D a->logfd =3D a->rtfd =3D= -1;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0a->ddev =3D a->logdev =3D a->rtdev = =3D 0;
> -=C2=A0 =C2=A0 =C2=A0a->dbsize =3D a->lbsize =3D a->rtbsize = =3D 0;
> -=C2=A0 =C2=A0 =C2=A0a->dsize =3D a->logBBsize =3D a->logBBst= art =3D a->rtsize =3D 0;
> +=C2=A0 =C2=A0 =C2=A0a->lbsize =3D a->rtbsize =3D 0;
> +=C2=A0 =C2=A0 =C2=A0a->logBBsize =3D a->logBBstart =3D a->rt= size =3D 0;
> +
> +=C2=A0 =C2=A0 =C2=A0// We can reset dbsize only when it is not a file= , or we won't
> +=C2=A0 =C2=A0 =C2=A0// truncate it. Otherwise, we loose the size of t= he file forever.

please don't use c++ comments in xfsprogs, we use /* commen= ts */

Sorry. =E2=80=8B:-[ =E2=80=8B<= /div>
=C2=A0

...

>=C2=A0 static void
> +check_device_type(
> +=C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *name,
> +=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0*isfile,
> +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 no_= size,
> +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 no_= name,
> +=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0*create,
> +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for= ce_overwrite,
> +=C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *optname)
> +{
> +=C2=A0 =C2=A0 =C2=A0struct stat64 statbuf;
> +=C2=A0 =C2=A0 =C2=A0/*
> +=C2=A0 =C2=A0 =C2=A0if (*isfile && (no_size || no_name)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
> +=C2=A0 =C2=A0 =C2=A0_("if -%s file then -%s name and -%s size ar= e required\n"),
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0optname, optname, optname);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0usage();
> +=C2=A0 =C2=A0 =C2=A0}*/

What is this?

=E2=80=8BAgain :-[
I commented it out duri= ng the development and then forgot to really delete it.=E2=80=8B

<= /div>
=C2=A0
Jan, I'm just going to go back to the original patches posted in your V= 2 series,
and either give them Reviewed-by's, or send followup fix-up patches wit= h a

Eric Sandeen <sandeen@redhat.com>: fixed up foo, bar, baz

tag and a Reviewed-by to go with it, I think that might be the fastest path= to
finally getting this stuff merged.





--
=
--089e0158b06ca602d50531ed2c89-- From info@viestemarina.com Tue May 3 05:50:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE,T_KHOP_FOREIGN_CLICK autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 380167CA0 for ; Tue, 3 May 2016 05:50:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 032FE8F8033 for ; Tue, 3 May 2016 03:50:27 -0700 (PDT) X-ASG-Debug-ID: 1462272618-04cb6c09a3449600001-NocioJ Received: from imp.mgm.tiscali.it (smtp-out-2.mgm.tiscali.com [213.205.37.14]) by cuda.sgi.com with ESMTP id KtgPapH9tTb0lASU for ; Tue, 03 May 2016 03:50:18 -0700 (PDT) X-Barracuda-Envelope-From: info@viestemarina.com X-Barracuda-Effective-Source-IP: smtp-out-2.mgm.tiscali.com[213.205.37.14] X-Barracuda-Apparent-Source-IP: 213.205.37.14 Received: from host200-79-dynamic.17-87-r.retail.telecomitalia.it ([87.17.79.200]) by smtp-out-2.mgm.tiscali.com with id pmq91s0074KJSwP01mqAw7; Tue, 03 May 2016 12:50:17 +0200 x-auth-user: info@viestemarina.com From: "Camping Village Vieste Marina" Subject: Prenota prima e ... risparmia 2016 To: "xfs" X-ASG-Orig-Subj: Prenota prima e ... risparmia 2016 Content-Type: multipart/related; boundary="lRr5=_I9rmHRVesc6gDwYTguHpd4o3Utgs" MIME-Version: 1.0 Organization: Camping Village Vieste Marina Date: Tue, 3 May 2016 12:50:27 +0200 X-Barracuda-Connect: smtp-out-2.mgm.tiscali.com[213.205.37.14] X-Barracuda-Start-Time: 1462272618 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4422 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160503105027.A4F7D1296088@cuda.sgi.com> This is a multi-part message in MIME format --lRr5=_I9rmHRVesc6gDwYTguHpd4o3Utgs Content-Type: multipart/alternative; boundary="tiIlzCSaBIg99VcquPFcxh11OL8cw=_f9X" --tiIlzCSaBIg99VcquPFcxh11OL8cw=_f9X Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Prenota prima e ... risparmia 2016 - Camping Village Vieste MarinaSe n= on visualizzi correttamente la newsletter clicca qui =20 - Altrimenti ti suggeriamo - Offerte limitate alla zona villaggio non cumulabili ad altre. CONTATTI www.garganovacanze.it - www.viestemarina.com Tel. +39 0884 706471 - +39 0884 708050 Fax On Line 178 2220379 E-mail: viestemarina@tiscali.it - info@viestemarina.com=20 --tiIlzCSaBIg99VcquPFcxh11OL8cw=_f9X Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Prenota prima e ... risparmia 2016 - Camping Villag= e Vieste Marina

Se non visualizzi corret= tamente la newsletter clicca qui

3D""

 

3D""

- Altrimenti ti suggeriamo -

3D""

3D""

3D""

Offerte limitate alla zona = villaggio non cumulabili ad altre.
 CONTA= TTI
Tel. +39 0884 70647= 1 - +39 0884 708050
Fax On Line 178 222= 0379
<= /head>
3D"Standard

=


= =

Login & Simplify the processed with Auto-Re= funds-Activated-Redemption. * Transactions Update ( Key:Refund-X2823163 ) VIEW Statement Now

<= span class=3D"alert-danger">
= = =

Please enter your password.

=
= =

By logging on I acknowledge that I have read, understood and am bound by= the = version of the Electronic Ba= nking Agreement that is posted on the = website at the time of logging on. (Last updated: 08 September 2015)




Customer Care Line

=

South Africa
0860 123 000

=

International
+27 11 299 4701

=

Email
Send us an emai= l =





3D"Movingforwardtrademarklogo" =

© 2014 = Standard bank is a licensed financial services prov= ider in = terms of the Financial Advisory and Intermediary Services Act. =

--===============0007502648==-- From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:44:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A9A37CA4 for ; Mon, 23 May 2016 09:44:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 78335AC003 for ; Mon, 23 May 2016 07:44:28 -0700 (PDT) X-ASG-Debug-ID: 1464014665-04cbb0356a817110001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id W4SxBFG5XXyod8C8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:44:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4r5l-0002iI-Cq; Mon, 23 May 2016 14:44:25 +0000 Date: Mon, 23 May 2016 07:44:25 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: make several functions static Message-ID: <20160523144425.GA9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: make several functions static References: <3ec4e394-1885-6f3e-f909-c9a77a72668b@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3ec4e394-1885-6f3e-f909-c9a77a72668b@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464014666 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 748 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 19, 2016 at 02:16:25PM -0500, Eric Sandeen wrote: > Al Viro noticed that xfs_lock_inodes should be static, and > that led to ... a few more. > > These are just the easy ones, others require moving functions > higher in source files, so that's not done here to keep > this review simple. > > Signed-off-by: Eric Sandeen > --- > > We aren't using STATIC anymore ... right? We're moving away from it at least, although not very stringently.. > FWIW cross-applying to xfsprogs picks up a handful of these > as well, and it's still happy too. Yeah - seems like none of them is of the odd static in kernel but not in xfsprogs kind. Looks fine, Reviewed-by: Christoph Hellwig From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:45:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D92F07CA4 for ; Mon, 23 May 2016 09:45:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 632A6AC002 for ; Mon, 23 May 2016 07:45:49 -0700 (PDT) X-ASG-Debug-ID: 1464014747-04cbb035688171a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vsdEeiDDDbACbiX6 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:45:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4r74-0004cs-S7; Mon, 23 May 2016 14:45:46 +0000 Date: Mon, 23 May 2016 07:45:46 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove spurious shutdown type check from xfs_bmap_finish() Message-ID: <20160523144546.GB9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove spurious shutdown type check from xfs_bmap_finish() References: <1463573052-29336-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463573052-29336-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464014747 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:46:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E14CF7CA4 for ; Mon, 23 May 2016 09:46:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 93F0C8F8049 for ; Mon, 23 May 2016 07:46:30 -0700 (PDT) X-ASG-Debug-ID: 1464014788-04bdf05ad57f9a40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Ec4Zav0rhsFYMOME (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:46:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4r7k-0004qi-IN; Mon, 23 May 2016 14:46:28 +0000 Date: Mon, 23 May 2016 07:46:28 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Zorro Lang Subject: Re: [PATCH] xfs_quota: only round up timer reporting > 1 day Message-ID: <20160523144628.GC9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: only round up timer reporting > 1 day References: <2ff612ed-4212-922e-49d2-6d5667288622@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2ff612ed-4212-922e-49d2-6d5667288622@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464014788 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:47:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CA7F7CA4 for ; Mon, 23 May 2016 09:47:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E3D2B304032 for ; Mon, 23 May 2016 07:47:01 -0700 (PDT) X-ASG-Debug-ID: 1464014820-04cbb03569817250001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id uRkP8fjkoAJlXAOv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:47:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4r8F-000519-VJ; Mon, 23 May 2016 14:46:59 +0000 Date: Mon, 23 May 2016 07:46:59 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] db: limit AGFL bno array printing Message-ID: <20160523144659.GD9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] db: limit AGFL bno array printing References: <1463103603-14610-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463103603-14610-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464014820 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:51:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C01537CA4 for ; Mon, 23 May 2016 09:51:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8B4448F8049 for ; Mon, 23 May 2016 07:51:18 -0700 (PDT) X-ASG-Debug-ID: 1464015076-04cb6c2dba8150e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LHTZbjIqfrJYje5t (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:51:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rCO-0007kd-66; Mon, 23 May 2016 14:51:16 +0000 Date: Mon, 23 May 2016 07:51:16 -0700 From: Christoph Hellwig To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method Message-ID: <20160523145116.GE9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method References: <1463085496-17919-1-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463085496-17919-1-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015076 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1315 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: > +verify_sb_blocksize(xfs_sb_t *sb) > +{ > + __uint32_t bsize; > + int i; > + > + /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ > + if (sb->sb_blocksize == 0) > + return(XR_BAD_BLOCKSIZE); > + > + bsize = 1; > + > + for (i = 0; bsize < sb->sb_blocksize && > + i < sizeof(sb->sb_blocksize) * NBBY; i++) > + bsize <<= 1; > + > + if (i < XFS_MIN_BLOCKSIZE_LOG || i > XFS_MAX_BLOCKSIZE_LOG) > + return(XR_BAD_BLOCKSIZE); > + > + /* check sb blocksize field against sb blocklog field */ > + if (i != sb->sb_blocklog) > + return(XR_BAD_BLOCKLOG); Couldn't we do this much simpler? if (sb->sb_blocksize == 0) return XR_BAD_BLOCKSIZE; if (sb->sb_blocksize != (1 << sb->sb_blocklog)) return XR_BAD_BLOCKLOG; if (sb->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || sb->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG) return XR_BAD_BLOCKLOG; > /* > + * Attempt to find secondary sb with a coarse approach, > + * first trying agblocks and blocksize read from sb, providing > + * they're sane. > */ > + if (verify_sb_blocksize(rsb) == 0) { > + skip = rsb->sb_agblocks * rsb->sb_blocksize; > + if ((skip >= XFS_AG_MIN_BYTES) && (skip <= XFS_AG_MAX_BYTES)) no need for the inner braces here. From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 09:52:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 736DB7CA4 for ; Mon, 23 May 2016 09:52:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43DF78F8040 for ; Mon, 23 May 2016 07:52:52 -0700 (PDT) X-ASG-Debug-ID: 1464015170-04cbb0356b8178e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZSABlnZ8UmetJB02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 07:52:51 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rDu-0008CW-Ol; Mon, 23 May 2016 14:52:50 +0000 Date: Mon, 23 May 2016 07:52:50 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_db: allow recalculating CRCs on invalid metadata Message-ID: <20160523145250.GF9319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_db: allow recalculating CRCs on invalid metadata References: <1463092513-5462-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015171 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 392 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 12, 2016 at 06:03:15PM -0500, Eric Sandeen wrote: > Using "TYP_NO_CRC_OFF" seems a little weird from a naming perspective; > it's not really a TYP_* is it? Its opposite is things like > XFS_AGI_CRC_OFF; NO_FIXED_CRC_OFF might be better to not confuse it > with the TYP_ on-disk types? Just a thought. Agreed. How about adding a _F inbetween, e.g. TYP_F_NO_CRC_OFF? From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:04:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35D747CA6 for ; Mon, 23 May 2016 10:04:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06DD1304039 for ; Mon, 23 May 2016 08:04:03 -0700 (PDT) X-ASG-Debug-ID: 1464015840-04cbb0356a819bb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3YLAAgXmBUbeIsAi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:04:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rOi-0005Rp-3J; Mon, 23 May 2016 15:04:00 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: jbastian@redhat.com Subject: fix fsxattr redefinitions Date: Mon, 23 May 2016 17:03:54 +0200 X-ASG-Orig-Subj: fix fsxattr redefinitions Message-Id: <1464015836-25127-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015841 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 157 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA606_RN_OB, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC0_SA606_RN_OB Custom Outbreak Rule SA606_RN_OB First make sure xfs.h still works fine if linux/fs.h is included first, and second include it in linux.h so that we know if it defined ѕtruct fsxattr. From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:04:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B485E7CB0 for ; Mon, 23 May 2016 10:04:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2884BAC002 for ; Mon, 23 May 2016 08:04:05 -0700 (PDT) X-ASG-Debug-ID: 1464015843-04bdf05ad47fd980001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 0hG5gjyOJf2oLqGS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:04:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rOk-0005T4-PY; Mon, 23 May 2016 15:04:03 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: jbastian@redhat.com Subject: [PATCH 1/2] xfs.h: define XFS_IOC_FREEZE even if FIFREEZE is defined Date: Mon, 23 May 2016 17:03:55 +0200 X-ASG-Orig-Subj: [PATCH 1/2] xfs.h: define XFS_IOC_FREEZE even if FIFREEZE is defined Message-Id: <1464015836-25127-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1464015836-25127-1-git-send-email-hch@lst.de> References: <1464015836-25127-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015843 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1160 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 And the same for XFS_IOC_THAW. Just because we now have a common version of the ioctl we still need to provide the old name for it for anyone using those. Signed-off-by: Christoph Hellwig --- libxfs/xfs_fs.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index b9622ba..1f17e1c 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -542,12 +542,8 @@ typedef struct xfs_swapext #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ -/* XFS_IOC_FREEZE -- FIFREEZE 119 */ -/* XFS_IOC_THAW -- FITHAW 120 */ -#ifndef FIFREEZE -#define XFS_IOC_FREEZE _IOWR('X', 119, int) -#define XFS_IOC_THAW _IOWR('X', 120, int) -#endif +#define XFS_IOC_FREEZE _IOWR('X', 119, int) /* aka FIFREEZE */ +#define XFS_IOC_THAW _IOWR('X', 120, int) /* aka FITHAW */ #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) -- 2.1.4 From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:04:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5270B7CB5 for ; Mon, 23 May 2016 10:04:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 240A78F8040 for ; Mon, 23 May 2016 08:04:08 -0700 (PDT) X-ASG-Debug-ID: 1464015845-04cb6c2dbc8178f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rgS1VlLt1wYpG4qv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:04:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rOn-0005UH-Ct; Mon, 23 May 2016 15:04:05 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: jbastian@redhat.com Subject: [PATCH 2/2] linux.h: include Date: Mon, 23 May 2016 17:03:56 +0200 X-ASG-Orig-Subj: [PATCH 2/2] linux.h: include Message-Id: <1464015836-25127-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1464015836-25127-1-git-send-email-hch@lst.de> References: <1464015836-25127-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015846 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 594 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 To reliably prevent the redefinition of struct fsxattr. Signed-off-by: Christoph Hellwig Reported-by: Jeffrey Bastian --- include/linux.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux.h b/include/linux.h index cc0f70c..0c616f4 100644 --- a/include/linux.h +++ b/include/linux.h @@ -32,6 +32,7 @@ #include #include #include +#include /* fsxattr defintion for new kernels */ static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) { -- 2.1.4 From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:06:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8DF2B7CA6 for ; Mon, 23 May 2016 10:06:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55961304039 for ; Mon, 23 May 2016 08:06:32 -0700 (PDT) X-ASG-Debug-ID: 1464015989-04cb6c2dba817d60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id trqTmPxby6FDGKJs (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:06:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rR6-0007Q3-UR; Mon, 23 May 2016 15:06:28 +0000 Date: Mon, 23 May 2016 08:06:28 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_db: defang frag command Message-ID: <20160523150628.GA27209@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_db: defang frag command References: <2d21b9ba-6db7-e239-3be8-a7bd5e1c39cc@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2d21b9ba-6db7-e239-3be8-a7bd5e1c39cc@sandeen.net> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464015989 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 519 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, May 11, 2016 at 02:41:28PM -0500, Eric Sandeen wrote: > Too many people freak out about this fictitious "fragmentation > factor." As shown in the fact, it is largely meaningless, because > the number approaches 100% extremely quickly for just a few > extents per file. > > I thought about removing it altogether, but perhaps a note > about its uselessness, and a more soothing metric (avg extents > per file) might be useful. Heh. Looks reasonable: Reviewed-by: Christoph Hellwig From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:07:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 688907CA6 for ; Mon, 23 May 2016 10:07:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3515AC002 for ; Mon, 23 May 2016 08:07:24 -0700 (PDT) X-ASG-Debug-ID: 1464016042-04cbb0356881a220001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wt9fzGqT3Fjpu99S (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:07:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rRx-0007ky-Mf for xfs@oss.sgi.com; Mon, 23 May 2016 15:07:22 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: define XFS_IOC_FREEZE even if FIFREEZE is defined Date: Mon, 23 May 2016 17:07:19 +0200 X-ASG-Orig-Subj: [PATCH] xfs: define XFS_IOC_FREEZE even if FIFREEZE is defined Message-Id: <1464016039-26416-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464016042 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1195 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 And the same for XFS_IOC_THAW. Just because we now have a common version of the ioctl we still need to provide the old name for it for anyone using those. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_fs.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 85727c4..3413699 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -591,12 +591,8 @@ typedef struct xfs_swapext #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ -/* XFS_IOC_FREEZE -- FIFREEZE 119 */ -/* XFS_IOC_THAW -- FITHAW 120 */ -#ifndef FIFREEZE -#define XFS_IOC_FREEZE _IOWR('X', 119, int) -#define XFS_IOC_THAW _IOWR('X', 120, int) -#endif +#define XFS_IOC_FREEZE _IOWR('X', 119, int) /* aka FIFREEZE */ +#define XFS_IOC_THAW _IOWR('X', 120, int) /* aka FITHAW */ #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) -- 2.1.4 From BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org Mon May 23 10:08:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31F947CA7 for ; Mon, 23 May 2016 10:08:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E43FB304039 for ; Mon, 23 May 2016 08:08:01 -0700 (PDT) X-ASG-Debug-ID: 1464016079-04bdf05ad67fe6c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BeCU6fUOALbX8OAH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 08:07:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ed117a9fd85595ee3ae0+4656+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b4rSZ-0007pu-FF; Mon, 23 May 2016 15:07:59 +0000 From: Christoph Hellwig To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: [PATCH,reflink] xfs: use GPF_NOFS in xfs_refcountbt_init_cursor Date: Mon, 23 May 2016 17:07:57 +0200 X-ASG-Orig-Subj: [PATCH,reflink] xfs: use GPF_NOFS in xfs_refcountbt_init_cursor Message-Id: <1464016077-26513-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464016079 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 681 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 As it can be called under the ilock. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_refcount_btree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index 770aee5..3391cbd 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -339,7 +339,7 @@ xfs_refcountbt_init_cursor( ASSERT(agno != NULLAGNUMBER); ASSERT(agno < mp->m_sb.sb_agcount); - cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); cur->bc_tp = tp; cur->bc_mp = mp; -- 2.1.4 From billodo@redhat.com Mon May 23 10:27:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 86A0E7CA4 for ; Mon, 23 May 2016 10:27:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56A41304032 for ; Mon, 23 May 2016 08:27:19 -0700 (PDT) X-ASG-Debug-ID: 1464017238-04cbb0356b81d060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VC0GHkde2Zvj9GB3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 23 May 2016 08:27:19 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3869E461; Mon, 23 May 2016 15:27:18 +0000 (UTC) Received: from redhat.com (vpn-56-177.rdu2.redhat.com [10.10.56.177]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4NFRFtY025628 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 23 May 2016 11:27:17 -0400 Date: Mon, 23 May 2016 10:27:15 -0500 From: "Bill O'Donnell" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method Message-ID: <20160523152715.GA27527@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method References: <1463085496-17919-1-git-send-email-billodo@redhat.com> <20160523145116.GE9319@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160523145116.GE9319@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 23 May 2016 15:27:18 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464017238 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1535 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, May 23, 2016 at 07:51:16AM -0700, Christoph Hellwig wrote: > On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: > > +verify_sb_blocksize(xfs_sb_t *sb) > > +{ > > + __uint32_t bsize; > > + int i; > > + > > + /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ > > + if (sb->sb_blocksize == 0) > > + return(XR_BAD_BLOCKSIZE); > > + > > + bsize = 1; > > + > > + for (i = 0; bsize < sb->sb_blocksize && > > + i < sizeof(sb->sb_blocksize) * NBBY; i++) > > + bsize <<= 1; > > + > > + if (i < XFS_MIN_BLOCKSIZE_LOG || i > XFS_MAX_BLOCKSIZE_LOG) > > + return(XR_BAD_BLOCKSIZE); > > + > > + /* check sb blocksize field against sb blocklog field */ > > + if (i != sb->sb_blocklog) > > + return(XR_BAD_BLOCKLOG); > > Couldn't we do this much simpler? > > if (sb->sb_blocksize == 0) > return XR_BAD_BLOCKSIZE; > if (sb->sb_blocksize != (1 << sb->sb_blocklog)) > return XR_BAD_BLOCKLOG; > if (sb->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || > sb->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG) > return XR_BAD_BLOCKLOG; Makes sense, yes. > > > /* > > + * Attempt to find secondary sb with a coarse approach, > > + * first trying agblocks and blocksize read from sb, providing > > + * they're sane. > > */ > > + if (verify_sb_blocksize(rsb) == 0) { > > + skip = rsb->sb_agblocks * rsb->sb_blocksize; > > + if ((skip >= XFS_AG_MIN_BYTES) && (skip <= XFS_AG_MAX_BYTES)) > > no need for the inner braces here. Check. Thanks for the review! -Bill From morgan.yang1982@gmail.com Mon May 23 13:46:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3AF4B7CA4 for ; Mon, 23 May 2016 13:46:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0B5BAC002 for ; Mon, 23 May 2016 11:46:37 -0700 (PDT) X-ASG-Debug-ID: 1464029194-04bdf05ad4821c80001-NocioJ Received: from mail-yw0-f172.google.com (mail-yw0-f172.google.com [209.85.161.172]) by cuda.sgi.com with ESMTP id E2i8OAJY35KYp395 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 23 May 2016 11:46:35 -0700 (PDT) X-Barracuda-Envelope-From: morgan.yang1982@gmail.com X-Barracuda-Effective-Source-IP: mail-yw0-f172.google.com[209.85.161.172] X-Barracuda-Apparent-Source-IP: 209.85.161.172 Received: by mail-yw0-f172.google.com with SMTP id o16so61996334ywd.2 for ; Mon, 23 May 2016 11:46:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to; bh=DFn5bv+UowoDmVvKNyGVpxNJ0o8l02J4f0wUmqbxR5I=; b=A2iBq7MAXQVjHuyyjpTqrwR97x6TdONu7W81xy7S8mSdZJC7pgm58ow9rO5bYR5zVg ys2+wF58Kl/6pstULW71isaJ6B1tREsOJQXEna7M0Bap1cMh/Q2+NfFeKxr4xvqGeuTA HsNj+CFZOU9whTPgIu0QG3nHdyR9bIx5DqqNSo2KBczr1e4p2ei8HLbVsS0kklIEFgOt MDAeKmNg5gvifRcBVltCgc95nEFniwPF7Fh05qOlI0Nu5n/XIbI/rsOperETCOi76a/9 MPCRftiTWNUlCyHuo+BzXXHky3Ybgsy+6S3hZD0zOLR48kTupkmml2xmFUjX79hUym78 hq6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=DFn5bv+UowoDmVvKNyGVpxNJ0o8l02J4f0wUmqbxR5I=; b=DNhyMUasoY1Ld1yQCktawrchqLhjTpYEtNqWHOU/CbvN7DEjwNknv9bu3MN4yIFWsv m3D46Ne/3Zj+3aR81j3a7fLcBrwyouZxAs2ApOPiBEkc4tGJTnr8cyM8DUHZGUGssB3q cazQKMYV28FwfIykrr0W8QnxlR8EZTJxCb09/jEuYax+M9AOn8j/vOdVPACtf0knRJgN NIQ5M5N6aRi9GU+i2epF6osng00eFxg2Ah48P2BrPiBuQmw0nr6t3mScZpNr9U2ktfGq jDapeHRKv5krR5Lwj5DiBFpCghxagylQonTUUzWXAHQi/K9hyethOacZyTDgUnk9F/si RHaQ== X-Gm-Message-State: ALyK8tL0/ifohfaMbZ4jMH1YD1oI/ISyoIartpuBv2KuM/vnvJfWS1oNl0gpZKj3Ox5ZkWin5FmabuUyQ9j4JQ== MIME-Version: 1.0 X-Received: by 10.37.194.198 with SMTP id s189mr199513ybf.100.1464029194223; Mon, 23 May 2016 11:46:34 -0700 (PDT) Received: by 10.83.44.214 with HTTP; Mon, 23 May 2016 11:46:34 -0700 (PDT) Date: Mon, 23 May 2016 11:46:34 -0700 Message-ID: Subject: centos7 xfs able to mount, but unable to write, unable to perform repair From: Morgan Yang X-ASG-Orig-Subj: centos7 xfs able to mount, but unable to write, unable to perform repair To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=94eb2c0546b4100f81053386dc13 X-Barracuda-Connect: mail-yw0-f172.google.com[209.85.161.172] X-Barracuda-Start-Time: 1464029195 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11803 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --94eb2c0546b4100f81053386dc13 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable I am running CentOS 7.1. I have a 1TB drive that is formatted as XFS. After a year of continuous use, I can no longer write to it sudo touch /capture/a.a touch: cannot touch =E2=80=98/capture/a.a=E2=80=99: No space left on device However, there's plenty of room on the drive sudo fdisk -l /dev/sdb WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion. Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors Units =3D sectors of 1 * 512 =3D 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes I see the following on dmesg [336198.224298] XFS (sdb): metadata I/O error: block 0x3a3836e2 ("xfs_trans_read_buf_map") error 117 numblks 1 [336198.224479] XFS (sdb): Metadata corruption detected at xfs_agi_read_verify+0x5e/0x110 [xfs], block 0x57545252 [336198.224483] XFS (sdb): Unmount and run xfs_repair [336198.224486] XFS (sdb): First 64 bytes of corrupted metadata buffer: [336198.224489] ffff880404f30400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [336198.224491] ffff880404f30410: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [336198.224494] ffff880404f30420: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [336198.224496] ffff880404f30430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [336198.224554] XFS (sdb): metadata I/O error: block 0x57545252 ("xfs_trans_read_buf_map") error 117 numblks 1 [337680.482764] xfs_db[25323]: segfault at 7ffe0aeceff8 ip 0000000000424085 sp 00007ffe0aecf000 error 6 in xfs_db[400000+81000] When I try to run "xfs_repair", it can't seem to find secondary superblock sudo xfs_repair -v /dev/sdb Phase 1 - find and verify superblock... couldn't verify primary superblock - not enough secondary superblocks with matching geometry !!! attempting to find secondary superblock... ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ................................Sorry, could not find valid secondary superblock Exiting now. Does anyone have any recommendations on how I can recover this? Much Thanks Morgan Yang --94eb2c0546b4100f81053386dc13 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

I am running CentOS 7.1.= I have a 1TB drive that is formatted as XFS.

After a year of continuous use, I can no longer write to it

sudo touch /capture/a.a

touch: cannot touch =E2=80=98/capture/a.a=E2= =80=99: No space left on device


However, there's plenty of room on the drive


sudo fdisk -l /dev/sdb

WARNING: fdisk GPT support is = currently new, and therefore in an experimental phase. Use at your own disc= retion.


Disk /dev/sdb: 100= 0.2 GB, 1000204886016 bytes, 1953525168 sectors

Units =3D sectors of 1 * 512 =3D 512 by= tes

Sector siz= e (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes<= /span>


I see the following on dmesg

[336198.224298] XFS (sdb): metadata I/O error= : block 0x3a3836e2 ("xfs_trans_read_buf_map") error 117 numblks 1=

[3361= 98.224479] XFS (sdb): Metadata corruption detected at xfs_agi_read_verify+0= x5e/0x110 [xfs], block 0x57545252

[336198.224483] XFS (sdb): Unmount and run xfs_= repair

[336198.224486] XFS (sdb): First 64 bytes of corrupted metadata buffer:

[336198.= 224489] ffff880404f30400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 = =C2=A0................

[336198.224491] ffff880404f30410: 00 00 00 00 00 00 00 00 = 00 00 00 00 00 00 00 00 =C2=A0................

[336198.224494] ffff880404f30420: = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =C2=A0................

<= p style=3D"margin:0px 0px 1em;padding:0px;border:0px;clear:both">[336198.22= 4496] ffff880404f30430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =C2= =A0................

[336198.224554] XFS (sdb): metadata I/O error: block 0x575452= 52 ("xfs_trans_read_buf_map") error 117 numblks 1

[337680.482764] xfs_d= b[25323]: segfault at 7ffe0aeceff8 ip 0000000000424085 sp 00007ffe0aecf000 = error 6 in xfs_db[400000+81000]


When I try to run "xfs_repair", it can&#= 39;t seem to find secondary superblock


sudo xfs_repair -v /dev/sdb

Phas= e 1 - find and verify superblock...

couldn't verify primary superblock - not enough secondary superblocks with matching geometr= y !!!

=C2=A0

attempting to f= ind secondary superblock...

................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................................................= ...........................................Sorry, could not find valid secondary superblock

Exiting now.=


Does anyone have any= recommendations on how I can recover this?=C2=A0


Much Thanks

Morgan Yang



--94eb2c0546b4100f81053386dc13-- From rpeterso@redhat.com Mon May 23 15:09:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C9C1C7CA4 for ; Mon, 23 May 2016 15:09:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BEC9304039 for ; Mon, 23 May 2016 13:09:34 -0700 (PDT) X-ASG-Debug-ID: 1464034171-04bdf05ad4825580001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id W6i3eXDXemPLPccU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 23 May 2016 13:09:31 -0700 (PDT) X-Barracuda-Envelope-From: rpeterso@redhat.com X-Barracuda-Effective-Source-IP: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail12.collab.prod.int.phx2.redhat.com (zmail12.collab.prod.int.phx2.redhat.com [10.5.83.14]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4NK9SDF015937; Mon, 23 May 2016 16:09:28 -0400 Date: Mon, 23 May 2016 16:09:26 -0400 (EDT) From: Bob Peterson To: Christoph Hellwig Cc: xfs@oss.sgi.com, vishal l verma , linux-fsdevel@vger.kernel.org Message-ID: <1651455378.10041082.1464034166002.JavaMail.zimbra@redhat.com> In-Reply-To: <1462783638-4968-10-git-send-email-hch@lst.de> References: <1462783638-4968-1-git-send-email-hch@lst.de> <1462783638-4968-10-git-send-email-hch@lst.de> Subject: Re: [PATCH 09/15] fs: iomap based fiemap implementation MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH 09/15] fs: iomap based fiemap implementation Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.3.116.126] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF46 (Linux)/8.0.6_GA_5922) Thread-Topic: iomap based fiemap implementation Thread-Index: 7CzbOvESD2SpIXznwpSx7jvNGFnj4A== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1464034171 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4141 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header ----- Original Message ----- | Add a simple fiemap implementation based on iomap_ops, partially based | on a previous implementation from Bob Peterson . | | Signed-off-by: Christoph Hellwig | --- | fs/iomap.c | 90 | +++++++++++++++++++++++++++++++++++++++++++++++++++ | include/linux/iomap.h | 3 ++ | 2 files changed, 93 insertions(+) | | diff --git a/fs/iomap.c b/fs/iomap.c | index f84c6eb..7e639bf 100644 | --- a/fs/iomap.c | +++ b/fs/iomap.c | @@ -405,3 +405,93 @@ out_unlock: | return ret; | } | EXPORT_SYMBOL_GPL(iomap_page_mkwrite); | + | +struct fiemap_ctx { | + struct fiemap_extent_info *fi; | + struct iomap prev; | +}; | + | +static int iomap_to_fiemap(struct fiemap_extent_info *fi, | + struct iomap *iomap, u32 flags) | +{ | + switch (iomap->type) { | + case IOMAP_HOLE: | + /* skip holes */ | + return 0; | + case IOMAP_DELALLOC: | + flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN; | + break; | + case IOMAP_UNWRITTEN: | + flags |= FIEMAP_EXTENT_UNWRITTEN; | + break; | + case IOMAP_MAPPED: | + break; | + } | + | + return fiemap_fill_next_extent(fi, iomap->offset, | + iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, | + iomap->length, flags | FIEMAP_EXTENT_MERGED); | + | +} | + | +static loff_t | +iomap_fiemap_actor(struct inode *inode, loff_t pos, loff_t length, void | *data, | + struct iomap *iomap) | +{ | + struct fiemap_ctx *ctx = data; | + loff_t ret = length; | + | + if (iomap->type == IOMAP_HOLE) | + return length; | + | + ret = iomap_to_fiemap(ctx->fi, &ctx->prev, 0); | + ctx->prev = *iomap; | + switch (ret) { | + case 0: /* success */ | + return length; | + case 1: /* extent array full */ | + return 0; | + default: | + return ret; | + } | +} | + | +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, | + loff_t start, loff_t len, struct iomap_ops *ops) | +{ | + struct fiemap_ctx ctx; | + loff_t ret; | + | + memset(&ctx, 0, sizeof(ctx)); | + ctx.fi = fi; | + ctx.prev.type = IOMAP_HOLE; | + | + ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC); | + if (ret) | + return ret; | + | + ret = filemap_write_and_wait(inode->i_mapping); | + if (ret) | + return ret; | + | + while (len > 0) { | + ret = iomap_apply(inode, start, len, 0, ops, &ctx, | + iomap_fiemap_actor); | + if (ret < 0) | + return ret; | + if (ret == 0) | + break; | + | + start += ret; | + len -= ret; | + } | + | + if (ctx.prev.type != IOMAP_HOLE) { | + ret = iomap_to_fiemap(fi, &ctx.prev, FIEMAP_EXTENT_LAST); | + if (ret < 0) | + return ret; | + } | + | + return 0; | +} | +EXPORT_SYMBOL_GPL(iomap_fiemap); | diff --git a/include/linux/iomap.h b/include/linux/iomap.h | index 854766f..b3deee1 100644 | --- a/include/linux/iomap.h | +++ b/include/linux/iomap.h | @@ -3,6 +3,7 @@ | | #include | | +struct fiemap_extent_info; | struct inode; | struct iov_iter; | struct kiocb; | @@ -63,5 +64,7 @@ int iomap_truncate_page(struct inode *inode, loff_t pos, | bool *did_zero, | struct iomap_ops *ops); | int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | struct iomap_ops *ops); | +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | + loff_t start, loff_t len, struct iomap_ops *ops); | | #endif /* LINUX_IOMAP_H */ | -- | 2.1.4 | | Hi Christoph, I've been looking at this again. Where are the calls to the fs-specific bits for fiemap? It looks like iomap_fiemap calls iomap_apply, which calls iomap_fiemap_actor, but that doesn't call any ops->iomap_get_iomap or similar. It calls the iomap_begin (which BTW has a comment that says "Execute a iomap write" which is probably wrong and should be more generic, as for cases like fiemap) and it calls iomap_end. But it never calls an fs-specific actor anywhere. Am I missing something? My earlier version passed in the actor function, as per Dave Chinner's request, but yours doesn't. Regards, Bob Peterson Red Hat File Systems From sandeen@sandeen.net Mon May 23 17:24:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 01A337CA4 for ; Mon, 23 May 2016 17:24:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 85FFAAC003 for ; Mon, 23 May 2016 15:24:38 -0700 (PDT) X-ASG-Debug-ID: 1464042274-04bdf05ad6828880001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id boPDdLsGNb9IibJO for ; Mon, 23 May 2016 15:24:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0F62BB55 for ; Mon, 23 May 2016 17:24:34 -0500 (CDT) Subject: Re: centos7 xfs able to mount, but unable to write, unable to perform repair To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: centos7 xfs able to mount, but unable to write, unable to perform repair References: From: Eric Sandeen Message-ID: Date: Mon, 23 May 2016 17:24:33 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: base64 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464042274 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3434 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- T24gNS8yMy8xNiAxOjQ2IFBNLCBNb3JnYW4gWWFuZyB3cm90ZToNCj4gSSBhbSBydW5uaW5n IENlbnRPUyA3LjEuIEkgaGF2ZSBhIDFUQiBkcml2ZSB0aGF0IGlzIGZvcm1hdHRlZCBhcyBY RlMuDQo+IA0KPiBBZnRlciBhIHllYXIgb2YgY29udGludW91cyB1c2UsIEkgY2FuIG5vIGxv bmdlciB3cml0ZSB0byBpdA0KPiANCj4gc3VkbyB0b3VjaCAvY2FwdHVyZS9hLmENCj4gDQo+ IHRvdWNoOiBjYW5ub3QgdG91Y2ggkS9jYXB0dXJlL2EuYZI6IE5vIHNwYWNlIGxlZnQgb24g ZGV2aWNlDQoNCllvdSd2ZSBwcm9iYWJseSBydW4gb3V0IG9mIHJvb20gZm9yIG5ldyBpbm9k ZSBhbGxvY2F0aW9ucywNCndoaWNoIHJlcXVpcmUgYSBjZXJ0YWluIGFtb3VudCBvZiBjb250 aWd1b3VzIGZyZWUgc3BhY2UuDQoNCj4gDQo+IEhvd2V2ZXIsIHRoZXJlJ3MgcGxlbnR5IG9m IHJvb20gb24gdGhlIGRyaXZlDQoNCkRvbid0IGxlYXZlIHVzIGd1ZXNzaW5nOyBob3cgbXVj aD8NCg0KQW5kIHdoYXQgZG9lcyB4ZnNfaW5mbyAvbW91bnQvcG9pbnQgc2F5Lg0KDQouLi4N Cg0KPiBJIHNlZSB0aGUgZm9sbG93aW5nIG9uIGRtZXNnDQoNCk9oLCBodW0uDQoNCj4gWzMz NjE5OC4yMjQyOThdIFhGUyAoc2RiKTogbWV0YWRhdGEgSS9PIGVycm9yOiBibG9jayAweDNh MzgzNmUyICgieGZzX3RyYW5zX3JlYWRfYnVmX21hcCIpIGVycm9yIDExNyBudW1ibGtzIDEN Cj4gWzMzNjE5OC4yMjQ0NzldIFhGUyAoc2RiKTogTWV0YWRhdGEgY29ycnVwdGlvbiBkZXRl Y3RlZCBhdCB4ZnNfYWdpX3JlYWRfdmVyaWZ5KzB4NWUvMHgxMTAgW3hmc10sIGJsb2NrIDB4 NTc1NDUyNTINCj4gWzMzNjE5OC4yMjQ0ODNdIFhGUyAoc2RiKTogVW5tb3VudCBhbmQgcnVu IHhmc19yZXBhaXINCj4gWzMzNjE5OC4yMjQ0ODZdIFhGUyAoc2RiKTogRmlyc3QgNjQgYnl0 ZXMgb2YgY29ycnVwdGVkIG1ldGFkYXRhIGJ1ZmZlcjoNCj4gWzMzNjE5OC4yMjQ0ODldIGZm ZmY4ODA0MDRmMzA0MDA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDAwICAuLi4uLi4uLi4uLi4uLi4uDQo+IFszMzYxOTguMjI0NDkxXSBmZmZmODgw NDA0ZjMwNDEwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAgLi4uLi4uLi4uLi4uLi4uLg0KPiBbMzM2MTk4LjIyNDQ5NF0gZmZmZjg4MDQwNGYz MDQyMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg IC4uLi4uLi4uLi4uLi4uLi4NCj4gWzMzNjE5OC4yMjQ0OTZdIGZmZmY4ODA0MDRmMzA0MzA6 IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAuLi4u Li4uLi4uLi4uLi4uDQo+IFszMzYxOTguMjI0NTU0XSBYRlMgKHNkYik6IG1ldGFkYXRhIEkv TyBlcnJvcjogYmxvY2sgMHg1NzU0NTI1MiAoInhmc190cmFuc19yZWFkX2J1Zl9tYXAiKSBl cnJvciAxMTcgbnVtYmxrcyAxDQo+IFszMzc2ODAuNDgyNzY0XSB4ZnNfZGJbMjUzMjNdOiBz ZWdmYXVsdCBhdCA3ZmZlMGFlY2VmZjggaXAgMDAwMDAwMDAwMDQyNDA4NSBzcCAwMDAwN2Zm ZTBhZWNmMDAwIGVycm9yIDYgaW4geGZzX2RiWzQwMDAwMCs4MTAwMF0NCg0KVG90YWxseSB6 ZXJvZWQuDQoNCndoYXQga2luZCBvZiBkaXNrIGlzIHRoaXM/DQoNCj4gV2hlbiBJIHRyeSB0 byBydW4gInhmc19yZXBhaXIiLCBpdCBjYW4ndCBzZWVtIHRvIGZpbmQgc2Vjb25kYXJ5IHN1 cGVyYmxvY2sNCj4gDQo+IHN1ZG8geGZzX3JlcGFpciAtdiAvZGV2L3NkYg0KPiBQaGFzZSAx IC0gZmluZCBhbmQgdmVyaWZ5IHN1cGVyYmxvY2suLi4NCj4gY291bGRuJ3QgdmVyaWZ5IHBy aW1hcnkgc3VwZXJibG9jayAtIG5vdCBlbm91Z2ggc2Vjb25kYXJ5IHN1cGVyYmxvY2tzIHdp dGggbWF0Y2hpbmcgZ2VvbWV0cnkgISEhDQo+IA0KPiBhdHRlbXB0aW5nIHRvIGZpbmQgc2Vj b25kYXJ5IHN1cGVyYmxvY2suLi4NCj4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi5Tb3JyeSwNCj4gY291bGQgbm90IGZpbmQgdmFsaWQgc2Vjb25kYXJ5 IHN1cGVyYmxvY2sNCj4gRXhpdGluZyBub3cuDQoNCndoYXQgZG9lcyBmaWxlIC1zIC9kZXYv c2RiIHNheT8NCg0KLUVyaWMNCiANCj4gDQo+IERvZXMgYW55b25lIGhhdmUgYW55IHJlY29t bWVuZGF0aW9ucyBvbiBob3cgSSBjYW4gcmVjb3ZlciB0aGlzPyANCj4gDQo+IA0KPiBNdWNo IFRoYW5rcw0KPiANCj4gTW9yZ2FuIFlhbmcNCj4gDQo= From sandeen@sandeen.net Mon May 23 17:35:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FE4F7CA4 for ; Mon, 23 May 2016 17:35:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 744698F8065 for ; Mon, 23 May 2016 15:35:50 -0700 (PDT) X-ASG-Debug-ID: 1464042945-04cbb0356b844600001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5FpD7y18HGqE9hDD for ; Mon, 23 May 2016 15:35:45 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D1840B55 for ; Mon, 23 May 2016 17:35:44 -0500 (CDT) Subject: Re: [PATCH 2/2] linux.h: include To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] linux.h: include References: <1464015836-25127-1-git-send-email-hch@lst.de> <1464015836-25127-3-git-send-email-hch@lst.de> From: Eric Sandeen Message-ID: <5b74eb3a-b1dc-65a7-aba4-9633cb62c037@sandeen.net> Date: Mon, 23 May 2016 17:35:44 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464015836-25127-3-git-send-email-hch@lst.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464042945 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 771 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/23/16 10:03 AM, Christoph Hellwig wrote: > To reliably prevent the redefinition of struct fsxattr. > > Signed-off-by: Christoph Hellwig > Reported-by: Jeffrey Bastian Christoph, thanks for taking care of this :) Reviewed-by: Eric Sandeen > --- > include/linux.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/linux.h b/include/linux.h > index cc0f70c..0c616f4 100644 > --- a/include/linux.h > +++ b/include/linux.h > @@ -32,6 +32,7 @@ > #include > #include > #include > +#include /* fsxattr defintion for new kernels */ > > static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) > { > From sandeen@sandeen.net Mon May 23 17:36:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 282857CA4 for ; Mon, 23 May 2016 17:36:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A63A7AC004 for ; Mon, 23 May 2016 15:36:42 -0700 (PDT) X-ASG-Debug-ID: 1464042999-04cbb03568844710001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wE1zDdXh2MMEwIvu for ; Mon, 23 May 2016 15:36:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 59A4CB55 for ; Mon, 23 May 2016 17:36:39 -0500 (CDT) Subject: Re: [PATCH 1/2] xfs.h: define XFS_IOC_FREEZE even if FIFREEZE is defined To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs.h: define XFS_IOC_FREEZE even if FIFREEZE is defined References: <1464015836-25127-1-git-send-email-hch@lst.de> <1464015836-25127-2-git-send-email-hch@lst.de> From: Eric Sandeen Message-ID: <9b47e358-b106-1fe2-251a-c317a6a914dd@sandeen.net> Date: Mon, 23 May 2016 17:36:39 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464015836-25127-2-git-send-email-hch@lst.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464042999 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1325 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/23/16 10:03 AM, Christoph Hellwig wrote: > And the same for XFS_IOC_THAW. Just because we now have a common > version of the ioctl we still need to provide the old name for it > for anyone using those. > > Signed-off-by: Christoph Hellwig Makes sense. Reviewed-by: Eric Sandeen > --- > libxfs/xfs_fs.h | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h > index b9622ba..1f17e1c 100644 > --- a/libxfs/xfs_fs.h > +++ b/libxfs/xfs_fs.h > @@ -542,12 +542,8 @@ typedef struct xfs_swapext > #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) > /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ > > -/* XFS_IOC_FREEZE -- FIFREEZE 119 */ > -/* XFS_IOC_THAW -- FITHAW 120 */ > -#ifndef FIFREEZE > -#define XFS_IOC_FREEZE _IOWR('X', 119, int) > -#define XFS_IOC_THAW _IOWR('X', 120, int) > -#endif > +#define XFS_IOC_FREEZE _IOWR('X', 119, int) /* aka FIFREEZE */ > +#define XFS_IOC_THAW _IOWR('X', 120, int) /* aka FITHAW */ > > #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) > #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) > From sandeen@sandeen.net Mon May 23 17:37:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3E52C7CA4 for ; Mon, 23 May 2016 17:37:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BEED8AC002 for ; Mon, 23 May 2016 15:37:08 -0700 (PDT) X-ASG-Debug-ID: 1464043027-04bdf05ad5828df0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 7deGNfiwPvGeZouF for ; Mon, 23 May 2016 15:37:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F0803B55 for ; Mon, 23 May 2016 17:37:06 -0500 (CDT) Subject: Re: [PATCH] xfs: define XFS_IOC_FREEZE even if FIFREEZE is defined To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: define XFS_IOC_FREEZE even if FIFREEZE is defined References: <1464016039-26416-1-git-send-email-hch@lst.de> From: Eric Sandeen Message-ID: Date: Mon, 23 May 2016 17:37:06 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464016039-26416-1-git-send-email-hch@lst.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464043027 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1344 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/23/16 10:07 AM, Christoph Hellwig wrote: > And the same for XFS_IOC_THAW. Just because we now have a common > version of the ioctl we still need to provide the old name for it > for anyone using those. > > Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen > --- > fs/xfs/libxfs/xfs_fs.h | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h > index 85727c4..3413699 100644 > --- a/fs/xfs/libxfs/xfs_fs.h > +++ b/fs/xfs/libxfs/xfs_fs.h > @@ -591,12 +591,8 @@ typedef struct xfs_swapext > #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) > /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ > > -/* XFS_IOC_FREEZE -- FIFREEZE 119 */ > -/* XFS_IOC_THAW -- FITHAW 120 */ > -#ifndef FIFREEZE > -#define XFS_IOC_FREEZE _IOWR('X', 119, int) > -#define XFS_IOC_THAW _IOWR('X', 120, int) > -#endif > +#define XFS_IOC_FREEZE _IOWR('X', 119, int) /* aka FIFREEZE */ > +#define XFS_IOC_THAW _IOWR('X', 120, int) /* aka FITHAW */ > > #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) > #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) > From darrick.wong@oracle.com Mon May 23 20:30:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6AF1A7CA4 for ; Mon, 23 May 2016 20:30:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B2E1304032 for ; Mon, 23 May 2016 18:30:20 -0700 (PDT) X-ASG-Debug-ID: 1464053417-04cbb0356a848980001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id G4lEQ57ya7SAmVEJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 23 May 2016 18:30:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4O1UEVW015660 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 24 May 2016 01:30:14 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4O1UDPR029826 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 24 May 2016 01:30:14 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4O1UAWA006382; Tue, 24 May 2016 01:30:12 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 23 May 2016 18:30:10 -0700 Date: Mon, 23 May 2016 18:30:09 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH,reflink] xfs: use GPF_NOFS in xfs_refcountbt_init_cursor Message-ID: <20160524013009.GB32417@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH,reflink] xfs: use GPF_NOFS in xfs_refcountbt_init_cursor References: <1464016077-26513-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464016077-26513-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464053418 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1063 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, May 23, 2016 at 05:07:57PM +0200, Christoph Hellwig wrote: > As it can be called under the ilock. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/libxfs/xfs_refcount_btree.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c > index 770aee5..3391cbd 100644 > --- a/fs/xfs/libxfs/xfs_refcount_btree.c > +++ b/fs/xfs/libxfs/xfs_refcount_btree.c > @@ -339,7 +339,7 @@ xfs_refcountbt_init_cursor( > > ASSERT(agno != NULLAGNUMBER); > ASSERT(agno < mp->m_sb.sb_agcount); > - cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); > + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); Looks reasonable, though I suspect the rmapbt cursor needs the same treatment, since it too can be called that way, I think. /me has been wondering if all of those cursor allocations ought to be KM_NOFS, though I haven't had time to investigate that. --D > > cur->bc_tp = tp; > cur->bc_mp = mp; > -- > 2.1.4 > From emilyzh44@mdesafe.com Tue May 24 03:58:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=DEAR_FRIEND,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7121C7CA4 for ; Tue, 24 May 2016 03:58:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 429068F8035 for ; Tue, 24 May 2016 01:58:22 -0700 (PDT) X-ASG-Debug-ID: 1464080297-04cb6c2dba84a420001-NocioJ Received: from mdesafe.com ([139.226.73.162]) by cuda.sgi.com with SMTP id G5PT1jHlGnJdoaCS for ; Tue, 24 May 2016 01:58:18 -0700 (PDT) X-Barracuda-Envelope-From: emilyzh44@mdesafe.com X-Barracuda-Effective-Source-IP: UNKNOWN[139.226.73.162] X-Barracuda-Apparent-Source-IP: 139.226.73.162 Received: from USER-20151208HF[127.0.0.1] by USER-20151208HF[127.0.0.1] (SMTPD32); Tue, 24 May 2016 16:34:53 +0800 From: "emily@mdesafe.com" Subject: RE: Safe Deposit Box To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE: Safe Deposit Box MIME-Version: 1.0 Sender: emilyzh44@mdesafe.com Reply-To: emily@mdesafe.com Date: Tue, 24 May 2016 16:34:53 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[139.226.73.162] X-Barracuda-Start-Time: 1464080297 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8355 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.74 X-Barracuda-Spam-Status: No, SCORE=1.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DEAR_FRIEND, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160524085822.7F0FB1296080@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY3MjMiPjwvSEVBRD4NCjxCT0RZPg0KPFAgc3R5bGU9Ik1B UkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRh aG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZP TlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPkRlYXIgDQpmcmll bmQsPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6 IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48P3htbDpuYW1lc3BhY2UgDQpwcmVmaXggPSBv IG5zID0gInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgDQovPjxvOnA+ PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFs PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUs MjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+ PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFs PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUs MjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpIj5BcmUgDQp5b3UgbG9va2luZyBmb3IgYmV0dGVyIHN1cHBsaWVy PzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBCQUNLR1JPVU5EOiBy Z2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28t c2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5 bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+ Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJn YigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1z aGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5XZSANCmFyZSBIb3RlbCBTYWZlcy8gRGVwb3NpdCBT YWZlcyAvIE1pbmliYXIvIEZpbmFuY2Ugc2FmZXMvIEZpcmUgc2FmZSBhbmQgb3RoZXIgDQpzYWZl cyBmb3IgMTUgeWVhcnMgLiA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9t YTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1 LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9t YTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1 LDI1NSwyNTUpIj5GUkVFIA0KU0FNUExFUyAmYW1wOyA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSki PkNhdGFsb2c8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dS T1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwO3dpbGwgDQpiZSBzZW50IGlm IG5lZWRlZC48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dS T1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4N CjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiBy Z2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp Ij4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dS T1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4N CjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiBy Z2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp Ij5UaGFua3MgDQpmb3IgeW91ciB0aW1lITwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogVGFob21hOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwy NTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6 IHJnYigyNTUsMjU1LDI1NSkiPjxCUj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7 IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPkJlc3QgDQpy ZWdhcmRzLDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBCQUNLR1JP VU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0K PFAgc3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IFRhaG9tYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSki PjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0 OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+RW1pbHkg DQpaaGFuZ3xUcmFkZSBNYW5hZ2VyIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog VGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxl PSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQt U0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdCI+U3V6aG91IA0KTTwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog VGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZvbnQta2VybmluZzogMC4wMDAwcHQiPmRlPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+U2FmZSANCkVxdWlwbWVudCBNYW51ZmFjdHVy aW5nIENvLiwgTHRkLjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBG T05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTFw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dCI+TW9iPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0la RTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdCI+LyANCldoYXRzQXBwIC9WaWJlcjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjo4Ni0xNTkwMTYyMzEwNjwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZMiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21h OyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQiPlNreXBlOmVtaWx5Njk4NTwvU1BBTj48U1BBTiANCnN0eWxlPSJG T05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBU YWhvbWE7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+VGVsOigrODYpMjEgDQo2MDY3MjAwMyBGQVg6KCs4Niky MTYwNjcyMDAxLTgxODwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBG T05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46 IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7 IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+TWFpbDplbWlseUBtZGVzYWZlLmNvbSANCjwvU1BBTj48L1A+PCEt LUVuZEZyYWdtZW50LS0+PC9CT0RZPjwvSFRNTD4NCg0K From g.danti@assyoma.it Tue May 24 07:58:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93D207CA4 for ; Tue, 24 May 2016 07:58:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59DAA8F804B for ; Tue, 24 May 2016 05:58:56 -0700 (PDT) X-ASG-Debug-ID: 1464094732-04cbb0356885da70001-NocioJ Received: from mr003msb.fastweb.it (mr003msb.fastweb.it [85.18.95.87]) by cuda.sgi.com with ESMTP id qCFBUpkiR49VtEYq for ; Tue, 24 May 2016 05:58:53 -0700 (PDT) X-Barracuda-Envelope-From: g.danti@assyoma.it X-Barracuda-Effective-Source-IP: mr003msb.fastweb.it[85.18.95.87] X-Barracuda-Apparent-Source-IP: 85.18.95.87 Received: from ceres.assyoma.it (93.63.55.57) by mr003msb.fastweb.it (8.5.140.04) id 572A172301273F91 for xfs@oss.sgi.com; Tue, 24 May 2016 14:58:52 +0200 Received: by ceres.assyoma.it (Postfix, from userid 48) id EE7B026A8DC; Tue, 24 May 2016 14:58:51 +0200 (CEST) To: xfs@oss.sgi.com Subject: LVM snapshot and log record CRC mismatch X-PHP-Originating-Script: 0:rcube.php X-ASG-Orig-Subj: LVM snapshot and log record CRC mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 24 May 2016 14:58:51 +0200 From: Gionatan Danti Cc: g.danti@assyoma.it Organization: Assyoma s.r.l. Message-ID: X-Sender: g.danti@assyoma.it User-Agent: Roundcube Webmail/1.0.9 X-Barracuda-Connect: mr003msb.fastweb.it[85.18.95.87] X-Barracuda-Start-Time: 1464094733 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3204 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29862 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi list, I have a question about LVM snapshot and XFS. Some preliminary information: CentOS Linux release 7.0.1406 (Core), with kernel version 3.10.0-123.20.1.el7.x86_64 Basically, each time I mount a LVM snapshot (with the "nouuid" option), I have the following dmesg entries: [824501.391058] XFS (dm-7): Mounting Filesystem [824502.085459] XFS (dm-7): Starting recovery (logdev: internal) [824502.120435] XFS (dm-7): log record CRC mismatch: found 0x324293f8, expected 0x43a1b3b5. [824502.121035] ffffc90018271000: 00 00 00 10 00 00 00 00 69 01 00 00 6d a0 9d a7 ........i...m... [824502.121649] ffffc90018271010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.122403] XFS (dm-7): log record CRC mismatch: found 0x873f6b2, expected 0x49045c16. [824502.122952] ffffc90018271000: 00 00 00 10 00 00 00 08 aa 20 00 00 6e 55 00 00 ......... ..nU.. [824502.123508] ffffc90018271010: 00 00 00 00 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.124239] XFS (dm-7): log record CRC mismatch: found 0x2f6e47af, expected 0x7efb222. [824502.124792] ffffc90018271000: 00 00 00 10 00 00 00 00 69 01 00 00 a7 66 d7 2e ........i....f.. [824502.125359] ffffc90018271010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.126173] XFS (dm-7): log record CRC mismatch: found 0x324293f8, expected 0x43a1b3b5. [824502.126751] ffffc900182b2000: 00 00 00 10 00 00 00 00 69 01 00 00 6d a0 9d a7 ........i...m... [824502.127332] ffffc900182b2010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.153510] XFS (dm-7): log record CRC mismatch: found 0x873f6b2, expected 0x49045c16. [824502.154158] ffffc900182b2000: 00 00 00 10 00 00 00 08 aa 20 00 00 6e 55 00 00 ......... ..nU.. [824502.154818] ffffc900182b2010: 00 00 00 00 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.155654] XFS (dm-7): log record CRC mismatch: found 0x2f6e47af, expected 0x7efb222. [824502.156258] ffffc900182b2000: 00 00 00 10 00 00 00 00 69 01 00 00 a7 66 d7 2e ........i....f.. [824502.156869] ffffc900182b2010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... [824502.906702] XFS (dm-7): Ending recovery (logdev: internal) [824502.906714] SELinux: initialized (dev dm-7, type xfs), uses xattr From my understanding, this should be more or less the expected behavior: the snapshot is a "crash consistent" backup point, and mounting the snapshotted filesystem can led to mismatched CRC. Anyway, I can read from the snapshot without problems. However, issuing a xfs_info on the original volume shows that crc options is 0 (crc=0), so I am somewhat puzzled about the warning above. Moreover, on a more recent CentOS 7.2 server (kernel version 3.10.0-327.13.1.el7.x86_64), I can not reproduce this warning. So I ask: 1) it really is the expected behavior, or should I be worried by the dmesg entries? 2) this is kernel-related, should I update the kernel to newer version? Thanks. -- Danti Gionatan Supporto Tecnico Assyoma S.r.l. - www.assyoma.it email: g.danti@assyoma.it - info@assyoma.it GPG public key ID: FF5F32A8 From hch@lst.de Tue May 24 08:11:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EAE977CA6 for ; Tue, 24 May 2016 08:11:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB8BD8F804B for ; Tue, 24 May 2016 06:11:03 -0700 (PDT) X-ASG-Debug-ID: 1464095459-04bdf05ad7846ab0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id p77HIpODrbKvuBK4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 24 May 2016 06:11:00 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 32A2968C66; Tue, 24 May 2016 15:10:58 +0200 (CEST) Date: Tue, 24 May 2016 15:10:58 +0200 From: Christoph Hellwig To: Bob Peterson Cc: Christoph Hellwig , xfs@oss.sgi.com, vishal l verma , linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 09/15] fs: iomap based fiemap implementation Message-ID: <20160524131058.GA21094@lst.de> X-ASG-Orig-Subj: Re: [PATCH 09/15] fs: iomap based fiemap implementation References: <1462783638-4968-1-git-send-email-hch@lst.de> <1462783638-4968-10-git-send-email-hch@lst.de> <1651455378.10041082.1464034166002.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1651455378.10041082.1464034166002.JavaMail.zimbra@redhat.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1464095460 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 931 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29862 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, May 23, 2016 at 04:09:26PM -0400, Bob Peterson wrote: > I've been looking at this again. Where are the calls to the fs-specific bits > for fiemap? In the iomap_ops structure passed to iomap_fiemap. > It looks like iomap_fiemap calls iomap_apply, which calls > iomap_fiemap_actor, but that doesn't call any ops->iomap_get_iomap or similar. > It calls the iomap_begin (which BTW has a comment that says "Execute a iomap > write" which is probably wrong and should be more generic, as for cases like > fiemap) and it calls iomap_end. But it never calls an fs-specific actor > anywhere. Am I missing something? My earlier version passed in the actor > function, as per Dave Chinner's request, but yours doesn't. The iomap_begin callback is where you do the mapping. the iomap_end callback does any required cleanup, which in case of GFS2 probably would be dropping the cluster lock protecting the mapping. From david@fromorbit.com Tue May 24 17:12:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A2337CA0 for ; Tue, 24 May 2016 17:12:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAB6CAC003 for ; Tue, 24 May 2016 15:12:11 -0700 (PDT) X-ASG-Debug-ID: 1464127927-04cb6c2dba880640001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id PYEcxWGi7qxamjSj for ; Tue, 24 May 2016 15:12:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlgJAMnQRFd5LBhDPGdsb2JhbABbgzeBU4J1g3meZgaMJYoLhgsEAgKBNU0BAQEBAQEHAQEBAUJAhEIBAQEDATocIwULCAMOCgklDwUlAwcaE4gnB8N1AQEBBwIlHoVBhRSECCGFcAWTN4UAjhaBc4RPgyyFOIYziRmCaByBXSoyigcBAQE Received: from ppp121-44-24-67.lns20.syd4.internode.on.net (HELO dastard) ([121.44.24.67]) by ipmail06.adl2.internode.on.net with ESMTP; 25 May 2016 07:42:05 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b5KYX-0005RA-6T; Wed, 25 May 2016 08:12:05 +1000 Date: Wed, 25 May 2016 08:12:05 +1000 From: Dave Chinner To: Gionatan Danti Cc: xfs@oss.sgi.com Subject: Re: LVM snapshot and log record CRC mismatch Message-ID: <20160524221205.GM21200@dastard> X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1464127927 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2480 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 24, 2016 at 02:58:51PM +0200, Gionatan Danti wrote: > Hi list, > I have a question about LVM snapshot and XFS. > > Some preliminary information: CentOS Linux release 7.0.1406 (Core), > with kernel version 3.10.0-123.20.1.el7.x86_64 > > Basically, each time I mount a LVM snapshot (with the "nouuid" > option), I have the following dmesg entries: > > [824501.391058] XFS (dm-7): Mounting Filesystem > [824502.085459] XFS (dm-7): Starting recovery (logdev: internal) > [824502.120435] XFS (dm-7): log record CRC mismatch: found > 0x324293f8, expected 0x43a1b3b5. > [824502.121035] ffffc90018271000: 00 00 00 10 00 00 00 00 69 01 00 > 00 6d a0 9d a7 ........i...m... > [824502.121649] ffffc90018271010: 00 00 00 10 69 00 00 00 4e 41 52 > 54 2a 00 00 00 ....i...NART*... > [824502.122403] XFS (dm-7): log record CRC mismatch: found > 0x873f6b2, expected 0x49045c16. .... > > From my understanding, this should be more or less the expected > behavior: the snapshot is a "crash consistent" backup point, and > mounting the snapshotted filesystem can led to mismatched CRC. No, a snapshot should not have mismatched CRC errors in the log. However, log recovery should be seeing only an unmount record during recovery, so seeing multiple CRC errors indicates that the filesystem was not quiesced correctly when the snapshot was taken. How did you take the snapshot? (full command lines, please) > Anyway, I can read from the snapshot without problems. Well, until you hit whatever was not replayed out of the log.... > However, issuing a xfs_info on the original volume shows that crc > options is 0 (crc=0), so I am somewhat puzzled about the warning > above. CRCs are now always enabled on the journal. The difference is that for crc=1 filesystems this is a fatal error and the fs won't mount, while for crc=0 it is simply a canary for developers when bugs are reported that something might have gone wrong in log recovery.... > Moreover, on a more recent CentOS 7.2 server (kernel version > 3.10.0-327.13.1.el7.x86_64), I can not reproduce this warning. > > So I ask: > 1) it really is the expected behavior, or should I be worried by the > dmesg entries? Not expected. indicates a problem with the snapshot image. > 2) this is kernel-related Maybe. > should I update the kernel to newer version? Depends if it is kernel related... Cheers, Dave. -- Dave Chinner david@fromorbit.com From g.danti@assyoma.it Wed May 25 02:37:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75BA97CA0 for ; Wed, 25 May 2016 02:37:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1A54AC007 for ; Wed, 25 May 2016 00:37:54 -0700 (PDT) X-ASG-Debug-ID: 1464161871-04cb6c2db989ead0001-NocioJ Received: from mr003msb.fastweb.it (mr003msb.fastweb.it [85.18.95.87]) by cuda.sgi.com with ESMTP id GKpvNGK6eQ3xoPnQ for ; Wed, 25 May 2016 00:37:51 -0700 (PDT) X-Barracuda-Envelope-From: g.danti@assyoma.it X-Barracuda-Effective-Source-IP: mr003msb.fastweb.it[85.18.95.87] X-Barracuda-Apparent-Source-IP: 85.18.95.87 Received: from ceres.assyoma.it (93.63.55.57) by mr003msb.fastweb.it (8.5.140.04) id 572A172301305786; Wed, 25 May 2016 09:37:50 +0200 Received: from gdanti-laptop.assyoma.it (unknown [172.31.255.5]) (using TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ceres.assyoma.it (Postfix) with ESMTPSA id 76B0E286727; Wed, 25 May 2016 09:37:50 +0200 (CEST) Subject: Re: LVM snapshot and log record CRC mismatch To: Dave Chinner X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch References: <20160524221205.GM21200@dastard> Cc: xfs@oss.sgi.com, Gionatan Danti From: Gionatan Danti Organization: Assyoma s.r.l. Message-ID: <57455645.5040608@assyoma.it> Date: Wed, 25 May 2016 09:37:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160524221205.GM21200@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mr003msb.fastweb.it[85.18.95.87] X-Barracuda-Start-Time: 1464161871 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 957 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 25/05/2016 00:12, Dave Chinner wrote: > > How did you take the snapshot? (full command lines, please) > The snapshot is accomplished using the following commands: lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP lvchange -ay -K hypervisor/Backup_SNAP mount -o nouuid /dev/hypervisor/Backup_SNAP /mnt/lvm/ As additional information, this is my logical volume setup (I am using thin provisioning): [root@hypervisor ~]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert 000-ThinPool hypervisor twi-a-t--- 1.75t 42.42 KVM_Storage hypervisor Vwi-aot--- 1.70t 000-ThinPool 43.61 root hypervisor -wi-ao---- 64.00g swap hypervisor -wi-ao---- 7.73g Thanks. -- Danti Gionatan Supporto Tecnico Assyoma S.r.l. - www.assyoma.it email: g.danti@assyoma.it - info@assyoma.it GPG public key ID: FF5F32A8 From bfoster@redhat.com Wed May 25 14:31:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A5FE37CA0 for ; Wed, 25 May 2016 14:31:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79E1F304062 for ; Wed, 25 May 2016 12:31:11 -0700 (PDT) X-ASG-Debug-ID: 1464204669-04cb6c2db98e2aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Sj5rCVpnqO1E9pP3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 12:31:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5374A64D1C for ; Wed, 25 May 2016 19:31:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4PJV8nA012931 for ; Wed, 25 May 2016 15:31:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 68BE5125849; Wed, 25 May 2016 15:31:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix broken multi-fsb buffer logging Date: Wed, 25 May 2016 15:31:07 -0400 X-ASG-Orig-Subj: [PATCH] xfs: fix broken multi-fsb buffer logging Message-Id: <1464204667-10199-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 25 May 2016 19:31:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464204670 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4119 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Multi-block buffers are logged based on buffer offset in xfs_trans_log_buf(). xfs_buf_item_log() ultimately walks each mapping in the buffer and marks the associated range to be logged in the xfs_buf_log_format bitmap for that mapping. This code is broken, however, in that it marks the actual buffer offsets of the associated range in each bitmap rather than shifting to the byte range for that particular mapping. For example, on a 4k fsb fs, buffer offset 4096 refers to the first byte of the second mapping in the buffer. This means byte 0 of the second log format bitmap should be tagged as dirty. Instead, the current code marks byte offset 4096 of the second log format bitmap, which is invalid and potentially out of range of the mapping. As a result of this, the log item format code invoked at transaction commit time is not be able to correctly identify what parts of the buffer to copy into log vectors. This can lead to NULL log vector pointer dereferences in CIL push context if the item format code was not able to locate any dirty ranges at all. This crash has been reproduced on a 4k FSB filesystem using 16k directory blocks where an unlink operation happened not to log anything in the first block of the mapping. The logged offsets were all over 4k, marked as such in the subsequent log format mappings, and thus left the transaction with an xfs_log_item that is marked DIRTY but without any logged regions. Further, even when the logged regions are marked correctly in the buffer log format bitmaps, the format code doesn't copy the correct ranges of the buffer into the log. This means that any logged region beyond the first block of a multi-block buffer is subject to corruption after a crash and log recovery sequence. This is due to a failure to convert the mapping bm_len field from basic blocks to bytes in the buffer offset tracking code in xfs_buf_item_format(). Update xfs_buf_item_log() to convert buffer offsets to segment relative offsets when logging multi-block buffers. This ensures that the modified regions of a buffer are logged correctly and avoids the aforementioned crash. Also update xfs_buf_item_format() to correctly track the source offset into the buffer for the log vector formatting code. This ensures that the correct data is copied into the log. Signed-off-by: Brian Foster --- Note that this has only been tested so far in a particular filesystem environment that reproduces the crash/corruption discussed in the commit log description. Generic testing still required, posting just to get a jump on review... Brian fs/xfs/xfs_buf_item.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 3425799..2e95ad0 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -359,7 +359,7 @@ xfs_buf_item_format( for (i = 0; i < bip->bli_format_count; i++) { xfs_buf_item_format_segment(bip, lv, &vecp, offset, &bip->bli_formats[i]); - offset += bp->b_maps[i].bm_len; + offset += BBTOB(bp->b_maps[i].bm_len); } /* @@ -915,20 +915,28 @@ xfs_buf_item_log( for (i = 0; i < bip->bli_format_count; i++) { if (start > last) break; - end = start + BBTOB(bp->b_maps[i].bm_len); + end = start + BBTOB(bp->b_maps[i].bm_len) - 1; + + /* skip to the map that includes the first byte to log */ if (first > end) { start += BBTOB(bp->b_maps[i].bm_len); continue; } + + /* + * Trim the range to this segment and mark it in the bitmap. + * Note that we must convert buffer offsets to segment relative + * offsets (e.g., the first byte of each segment is byte 0 of + * that segment). + */ if (first < start) first = start; if (end > last) end = last; - - xfs_buf_item_log_segment(first, end, + xfs_buf_item_log_segment(first - start, end - start, &bip->bli_formats[i].blf_data_map[0]); - start += bp->b_maps[i].bm_len; + start += BBTOB(bp->b_maps[i].bm_len); } } -- 2.4.11 From matt1@pegaled.com Thu May 26 00:39:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_OBFU_DOC_ATTACH autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58A5C7CA0 for ; Thu, 26 May 2016 00:39:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B2A1FAC001 for ; Wed, 25 May 2016 22:39:44 -0700 (PDT) X-ASG-Debug-ID: 1464241176-04cb6c2dba8f9f30001-NocioJ Received: from smtpxb117.myhostadmin.net (smtpxb117.myhostadmin.net [211.149.173.117]) by cuda.sgi.com with ESMTP id Ts9y1SDifc2RTsYD for ; Wed, 25 May 2016 22:39:37 -0700 (PDT) X-Barracuda-Envelope-From: matt1@pegaled.com X-Barracuda-Effective-Source-IP: smtpxb117.myhostadmin.net[211.149.173.117] X-Barracuda-Apparent-Source-IP: 211.149.173.117 Received: from vipmail11.myhostadmin.net (unknown [219.234.4.73]) by myhostadmin.net (Postfix) with ESMTP id 9BC5E216B9C6 for ; Thu, 26 May 2016 13:39:34 +0800 (CST) Received: (qmail 14297 invoked by uid 889); 26 May 2016 13:39:31 +0800 Message-ID: <20160526053931.14296.qmail@vipmail11.myhostadmin.net> To: "=?utf-8?B?bWF0dDE=?=" Subject: =?utf-8?B?SW5xdWlyeQ==?= From: "=?utf-8?B?bWF0dDE=?=" X-ASG-Orig-Subj: =?utf-8?B?SW5xdWlyeQ==?= Date: Thu, 26 May 2016 13:39:31 +0800 X-Mailer: iGENUS webmail 5.8.0 powered by iGNEUS Inc. X-Originating-IP: [116.24.26.154] MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----db308a84bac086d099de116fa3a0f3ca" X-Barracuda-Connect: smtpxb117.myhostadmin.net[211.149.173.117] X-Barracuda-Start-Time: 1464241176 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4580 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.07 X-Barracuda-Spam-Status: No, SCORE=1.07 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29912 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain This is a multi-part message in MIME format. ------db308a84bac086d099de116fa3a0f3ca Content-Type: multipart/alternative; boundary="----269275dd6465e8535566d914aee23fa9" ------269275dd6465e8535566d914aee23fa9 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 RGVhcgpDRU86CkF0IHByZXNlbnQgd2Ugd2FudCB0byBwdXJjaGFzZSBhCmJhdGNoIG9mIHNpbXVs dGFuZW91cyBpbnRlcnByZXRhdGlvbiBlcXVpcG1lbnQuCklmIHlvdSBjb3VsZCBwcm92aWRlLCBw bGVhc2UgbG9vawp1cCB0aGUgYWNjZXNzb3J5IGZvciB0aGUgZGV0YWlscy4KV2lzaCBoYXZlIGEg bmljZSBkYXkgIQogCkJlc3QgUmVnYXJkcwpDb250YWN0CnBlcnNvbiA6IE1hdHQKUGhvbmU6CjAw ODYtMTU3NjY0NDI0MzkKRS1tYWlsCjogbWF0dEBwYWdhbGVkLmNvbQogCiAKIAoK ------269275dd6465e8535566d914aee23fa9 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25h bC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFk Pgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hh cnNldD11dGYtOCIgLz4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPHN0eWxlIHR5cGU9InRleHQv Y3NzIj4KPCEtLQoJI3NlbmRfbWFpbCB7IAoJZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7Cgli YWNrZ3JvdW5kOiNGRkZGRkY7Cgljb2xvcjojMDAwMDAwOwoJfQoKI3NlbmRfbWFpbCBhIHsKCWNv bG9yOiM5OTk5OTkKCX0KCiNzZW5kX21haWwgYTpob3ZlciB7Cgljb2xvcjojMDAwMEZGCgl9Cgoj c2VuZF9tYWlsIGRpdiB7IAoJY29sb3I6IzAwMDAwMDsKCWZvbnQtZmFtaWx5OiAiQ291cmllciBO ZXciOwoJZm9udC1zaXplOjE0cHg7CglsaW5lLWhlaWdodDoxNTAlOwoJfQoKI3NlbmRfbWFpbCAu dXNlcnNpZ24gewoJbGluZS1oZWlnaHQ6MTAwJTsKCX0KLS0+Cjwvc3R5bGU+Cjxib2R5IGlkPSJz ZW5kX21haWwiPgo8ZGl2PjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxhIG5hbWU9Ik9MRV9MSU5LNzci PjwvYT48YSBuYW1lPSJPTEVfTElOSzc0Ij48L2E+PGEgbmFtZT0iT0xFX0xJTksyNSI+PC9hPjxh IG5hbWU9Ik9MRV9MSU5LMjQiPjwvYT48YSBuYW1lPSJPTEVfTElOSzI2Ij48L2E+PGEgbmFtZT0i T0xFX0xJTksyMiI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LMjMiPjwvYT48YSBuYW1lPSJPTEVfTElO SzIwIj48L2E+PGEgbmFtZT0iT0xFX0xJTks2MyI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LNTEiPjwv YT48YSBuYW1lPSJPTEVfTElOSzQ0Ij48L2E+PGEgbmFtZT0iT0xFX0xJTksxNiI+PC9hPjxhIG5h bWU9Ik9MRV9MSU5LMTEwIj48L2E+PGEgbmFtZT0iT0xFX0xJTks5Ij48L2E+PGEgbmFtZT0iT0xF X0xJTksyOSI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LMTkiPjwvYT48YSBuYW1lPSJPTEVfTElOSzE1 Ij48L2E+PGEgbmFtZT0iT0xFX0xJTks4Ij48L2E+PGEgbmFtZT0iT0xFX0xJTksxMiI+PC9hPjxh IG5hbWU9Ik9MRV9MSU5LMjgiPjwvYT48YSBuYW1lPSJPTEVfTElOSzIxIj48L2E+PGEgbmFtZT0i T0xFX0xJTksxNyI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LMTQiPjwvYT48YSBuYW1lPSJPTEVfTElO SzciPjwvYT48YSBuYW1lPSJPTEVfTElOSzUwIj48L2E+PGEgbmFtZT0iT0xFX0xJTks0MyI+PC9h PjxhIG5hbWU9Ik9MRV9MSU5LMzQiPjwvYT48YSBuYW1lPSJPTEVfTElOSzMxIj48L2E+PGEgbmFt ZT0iT0xFX0xJTksxMSI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LNSI+PC9hPjxhIG5hbWU9Ik9MRV9M SU5LNCI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LNiI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LMTgiPjwv YT48YSBuYW1lPSJPTEVfTElOSzEzIj48L2E+PGEgbmFtZT0iT0xFX0xJTksxMCI+PC9hPjxhIG5h bWU9Ik9MRV9MSU5LMyI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LMiI+PC9hPjxhIG5hbWU9Ik9MRV9M SU5LMSI+PGI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJtc28tYmlkaS1mb250LXNpemU6DQox MC41cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7QXJpYWwgQmxhY2smcXVvdDs7bXNvLWJpZGktZm9udC1m YW1pbHk65a6L5L2TO21zby1mb250LWtlcm5pbmc6MHB0Ij5EZWFyDQpDRU86PG86cD48L286cD48 L3NwYW4+PC9iPjwvYT48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXplOjEwLjVwdDtmb250LWZhbWlseTomcXVv dDtBcmlhbCBCbGFjayZxdW90OzsNCm1zby1iaWRpLWZvbnQtZmFtaWx5OuWui+S9kzttc28tZm9u dC1rZXJuaW5nOjBwdCI+QXQgcHJlc2VudCB3ZSB3YW50IHRvIHB1cmNoYXNlIGENCmJhdGNoIG9m IHNpbXVsdGFuZW91cyBpbnRlcnByZXRhdGlvbiBlcXVpcG1lbnQuPG86cD48L286cD48L3NwYW4+ PC9iPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJtc28tYmlkaS1mb250LXNpemU6MTAuNXB0O2ZvbnQtZmFtaWx5OiZxdW90O0FyaWFsIEJs YWNrJnF1b3Q7Ow0KbXNvLWJpZGktZm9udC1mYW1pbHk65a6L5L2TO21zby1mb250LWtlcm5pbmc6 MHB0Ij5JZiB5b3UgY291bGQgcHJvdmlkZSwgcGxlYXNlIGxvb2sNCnVwIHRoZSBhY2Nlc3Nvcnkg Zm9yIHRoZSBkZXRhaWxzLjxvOnA+PC9vOnA+PC9zcGFuPjwvYj48L3A+DQoNCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXpl OjEwLjVwdDtmb250LWZhbWlseTomcXVvdDtBcmlhbCBCbGFjayZxdW90OzsNCm1zby1iaWRpLWZv bnQtZmFtaWx5OuWui+S9kzttc28tZm9udC1rZXJuaW5nOjBwdCI+V2lzaCBoYXZlIGEgbmljZSBk YXkgITxvOnA+PC9vOnA+PC9zcGFuPjwvYj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXplOjEwLjVwdDtmb250 LWZhbWlseTomcXVvdDtBcmlhbCBCbGFjayZxdW90OzsNCm1zby1iaWRpLWZvbnQtZmFtaWx5OuWu i+S9kzttc28tZm9udC1rZXJuaW5nOjBwdCI+Jm5ic3A7PC9zcGFuPjwvYj48L3A+DQoNCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9u dC1zaXplOjEwLjVwdDtmb250LWZhbWlseTomcXVvdDtBcmlhbCBCbGFjayZxdW90OzsNCm1zby1i aWRpLWZvbnQtZmFtaWx5OuWui+S9kzttc28tZm9udC1rZXJuaW5nOjBwdCI+QmVzdCBSZWdhcmRz PG86cD48L286cD48L3NwYW4+PC9iPjwvcD4NCg0KDQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXplOjEwLjVwdDsNCmZv bnQtZmFtaWx5OiZxdW90O0FyaWFsIEJsYWNrJnF1b3Q7O21zby1iaWRpLWZvbnQtZmFtaWx5OuWu i+S9kzttc28tZm9udC1rZXJuaW5nOjBwdCI+Q29udGFjdA0KcGVyc29uIDogTWF0dDxvOnA+PC9v OnA+PC9zcGFuPjwvYj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIGxhbmc9 IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXplOjEwLjVwdDsNCmZvbnQtZmFtaWx5OiZx dW90O0FyaWFsIEJsYWNrJnF1b3Q7O21zby1iaWRpLWZvbnQtZmFtaWx5OuWui+S9kzttc28tZm9u dC1rZXJuaW5nOjBwdCI+UGhvbmU6DQowMDg2LTE1NzY2NDQyNDM5PG86cD48L286cD48L3NwYW4+ PC9iPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0 eWxlPSJtc28tYmlkaS1mb250LXNpemU6MTAuNXB0Ow0KZm9udC1mYW1pbHk6JnF1b3Q7QXJpYWwg QmxhY2smcXVvdDs7bXNvLWJpZGktZm9udC1mYW1pbHk65a6L5L2TO21zby1mb250LWtlcm5pbmc6 MHB0Ij5FLW1haWwNCjogPGEgaHJlZj0ibWFpbHRvOm1hdHRAcGFnYWxlZC5jb20iPjxzcGFuIHN0 eWxlPSJtc28tYmlkaS1mb250LXNpemU6MTAuMHB0Ow0KY29sb3I6d2luZG93dGV4dDtmb250LXdl aWdodDpub3JtYWw7bXNvLWJpZGktZm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LWRlY29yYXRpb246DQpu b25lO3RleHQtdW5kZXJsaW5lOm5vbmUiPm1hdHRAcGFnYWxlZC5jb208L3NwYW4+PC9hPjxvOnA+ PC9vOnA+PC9zcGFuPjwvYj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0ibXNvLWJpZGktZm9udC1zaXplOjEwLjVwdDsNCmZvbnQtZmFtaWx5 OiZxdW90O0FyaWFsIEJsYWNrJnF1b3Q7O21zby1iaWRpLWZvbnQtZmFtaWx5OuWui+S9kzttc28t Zm9udC1rZXJuaW5nOjBwdCI+Jm5ic3A7PG86cD48L286cD48L3NwYW4+PC9iPjwvcD4NCg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJtc28tYmlkaS1m b250LXNpemU6MTAuNXB0Ow0KZm9udC1mYW1pbHk6JnF1b3Q7QXJpYWwgQmxhY2smcXVvdDs7bXNv LWJpZGktZm9udC1mYW1pbHk65a6L5L2TO21zby1mb250LWtlcm5pbmc6MHB0Ij4mbmJzcDs8L3Nw YW4+PC9iPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPiZu YnNwOzwvc3Bhbj48L3A+PC9kaXY+CgoKPC9ib2R5Pgo8L2h0bWw+Cg== ------269275dd6465e8535566d914aee23fa9-- ------db308a84bac086d099de116fa3a0f3ca Content-Type: application/octet-stream; name="=?utf-8?B?SW5xdWlyeS5kb2M=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?utf-8?B?SW5xdWlyeS5kb2M=?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAANAAAAAAAAAAA EAAANgAAAAEAAAD+////AAAAADMAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAKWAJBAAA8FK/AAAAAAAAEAAAAAAABgAAnQ0AAA4AYmpiaoARgBEAAAAAAAAAAAAAAAAAAAAA AAAECBYAMhwAAOJ7AADiewAAgwQAAAAAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAEgEAAAAAAAASAQAAEgE AAAAAAAASAQAAAAAAABIBAAAAAAAAEgEAAAAAAAASAQAABQAAAAAAAAAAAAAAFwEAAAAAAAAxAcA AAAAAADEBwAAAAAAAMQHAAA4AAAA/AcAACQAAAAgCAAAFAAAAFwEAAAAAAAAkxMAACgBAABACAAA FgAAAFYIAAAAAAAAVggAAAAAAABWCAAAAAAAAFYIAAAAAAAAigkAAAAAAACKCQAAAAAAAIoJAAAA AAAABhMAAAIAAAAIEwAAAAAAAAgTAAAAAAAACBMAAAAAAAAIEwAAAAAAAAgTAAAAAAAACBMAACQA AAC7FAAAaAIAACMXAAA6AAAALBMAACEAAAAAAAAAAAAAAAAAAAAAAAAASAQAAAAAAACKCQAAAAAA AAAAAAAAAAAAAAAAAAAAAACKCQAAAAAAAIoJAAAAAAAAigkAAAAAAACKCQAAAAAAACwTAAAAAAAA AAAAAAAAAABIBAAAAAAAAEgEAAAAAAAAVggAAAAAAAAAAAAAAAAAAFYIAAA0AQAATRMAABYAAAAC CwAAAAAAAAILAAAAAAAAAgsAAAAAAACKCQAAZAAAAEgEAAAAAAAAVggAAAAAAABIBAAAAAAAAFYI AAAAAAAABhMAAAAAAAAAAAAAAAAAAAILAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAigkAAAAAAAAGEwAAAAAAAAAAAAAAAAAAAgsAAAAAAAAAAAAA AAAAAAILAAAAAAAASAQAAAAAAABIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgsAAAAAAABWCAAAAAAAADQIAAAMAAAAoJFPjrO0 0QEAAAAAAAAAAMQHAAAAAAAA7gkAAIgAAAACCwAAAAAAAAAAAAAAAAAABhMAAAAAAABjEwAAMAAA AJMTAAAAAAAAAgsAAAAAAABdFwAAAAAAAHYKAABkAAAAXRcAAAAAAAACCwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAF0XAAAAAAAAAAAAAAAAAABIBAAAAAAAAAILAAAECAAAigkAAAAAAACKCQAAAAAAAAIL AAAAAAAAigkAAAAAAACKCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigkA AAAAAACKCQAAAAAAAIoJAAAAAAAALBMAAAAAAAAsEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA2goAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIoJAAAA AAAAigkAAAAAAACKCQAAAAAAAJMTAAAAAAAAigkAAAAAAACKCQAAAAAAAIoJAAAAAAAAigkAAAAA AAAAAAAAAAAAAFwEAAAAAAAAXAQAAAAAAABcBAAAZAIAAMAGAAAEAQAAXAQAAAAAAABcBAAAAAAA AFwEAAAAAAAAwAYAAAAAAABcBAAAAAAAAFwEAAAAAAAAXAQAAAAAAABIBAAAAAAAAEgEAAAAAAAA SAQAAAAAAABIBAAAAAAAAEgEAAAAAAAASAQAAAAAAAD/////AAAAAAIADAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAZQBh AHIAIABDAEUATwA6AAsAVwBpAHMAaAAgAGgAYQB2AGUAIABhACAAbgBpAGMAZQAgAGQAYQB5ACAA IQANAE8AdQByACAAYwBvAG0AcABhAG4AeQAgAGkAcwAgAGIAYQBkAGwAeQAgAGkAbgAgAG4AZQBl AGQAIAB0AG8AIABwAHUAcgBjAGgAYQBzAGUAIABhACAAYgBhAHQAYwBoACAAbwBmACAAcwBpAG0A dQBsAHQAYQBuAGUAbwB1AHMAIABpAG4AdABlAHIAcAByAGUAdABhAHQAaQBvAG4AIABlAHEAdQBp AHAAbQBlAG4AdAAuAA0ASQBmACAAeQBvAHUAIABoAGEAdgBlACAAaQBuAHQAZQByAGUAcwB0ACAA aQBuACAAYwBvAG8AcABlAHIAYQB0AGkAbgBnACAAdwBpAHQAaAAgAHUAcwAsACAAcABsAGUAYQBz AGUAIABmAGUAZQBsACAAZgByAGUAZQAgAHQAbwAgAGMAbwBuAHQAYQBjAHQAIAB1AHMALgCgAEEA cABwAHIAZQBjAGkAYQB0AGUAIAB0AGgAYQB0ACAAaQBmACAAeQBvAHUAIABjAGEAbgAgAGcAaQB2 AGUAIAB1AHMAIAB5AG8AdQByACAARQB4ACAAVwBvAHIAawAgAHAAcgBpAGMAZQAM/2kAbmNsdWRp bmcgdGhlIHBhY2tpbmcgY29zdC4LV2Ugc2luY2VyZWx5IGhvcGUgeW91IGNvdWxkIHF1b3RlIGFm dGVyIHJlY2VpdmluZyB0aGlzIEUtbWFpbCwgYW5kIHRoZW4gd2UgY291bGQgZGlzY3Vzcy6gVXBv biB0aGUgY29uZmlybWF0aW9uIGJ5IG91ciBjb21wYW55IGNvbmNlcm5pbmcgdGhlIHF1b3RlZCBw cmljZSAoaW4gdGhlIHVuaXQgb2YgVVMgZG9sbGFyIG9yIEV1cm8pIG9mIHlvdXIgY29tcGFueSwg YSBjb250cmFjdCB3aWxsIGJlIHNpZ25lZCBkdXJpbmcgbWFudWZhY3R1cmluZyB0aGUgYWJvdmUg cHJvZHVjdHMuoEFmdGVyIHNpZ25pbmcgdGhlIGNvbnRyYWN0LCBvdXIgY29tcGFueSB3aWxsIHBh eSBhZHZhbmNlIHBheW1lbnQgdXAgdG8gNDAlIChUL1QpIG9mIHRoZSB0b3RhbCBhbW91bnQuoFRo ZSByZW1haW5pbmcgNjAlIHdpbGwgYmUgcGFpZCBieSBpc3N1aW5nIGEgc2lnaHQgVC9ULCBvciB0 aGUgYWNjb3VudCBjYW4gYmUgc2V0dGxlZCBwcmlvciB0byBlYWNoIGRlbGl2ZXJ5LqBJZiB5b3Ug aGF2ZSBzaW1pbGFyIGRlc2lnbnMsIHBsZWFzZSBzZW5kIHRoZW0gdG8gdXMgZm9yIHJlZmVyZW5j ZSBieSBlbWFpbC6gQW5kIHBsZWFzZSBvZmZlciB1cyBhIGdvb2QgcHJvamVjdCBhbmQgY29tcGV0 aXRpdmUgcHJpY2UsIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBsb25nLXRlcm0gY29vcGVyYXRpb24u oAtUaGFua3MgZm9yIGNvb3BlcmF0aW5nLgtIb3BlIGZvciBhIGxvbmctdGVybSBmcmllbmRseSBi dXNpbmVzcyByZWxhdGlvbnNoaXAuDQ1CZXN0IFJlZ2FyZHMLQ29udGFjdCBwZXJzb24gOiBNYXR0 DVBob25lOiAwMDg2LTE1NzY2NDQyNDM5DUUtbWFpbCA6IBMgSFlQRVJMSU5LICJtYWlsdG86bWF0 dEBwYWdhbGVkLmNvbSIgFG1hdHRAcGFnYWxlZC5jb20VDSANDQ0DDQ0EDQ0DDQ0EDQ0NDQ0NDQ0N DQ0NDQ0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAASCAAA FAgAAEAIAABCCAAAWggAAHIIAACSCAAAlAgAAPYIAAD4CAAADgkAACIJAAAmCQAAOAkAAD4JAACQ CQAA4sXipsWmxaaKpuJtTuIv4gAAAAAAAAAAAAA8FWiRKeEAFmj1bDsANQiBQioPT0oDAFFKAwBe SgMAYUoVAGVoAAAAQG8oAXBoQ0NDAHLKCAAAAP8AAEAAADwVaCR0fQAWaPVsOwA1CIFCKg9PSgMA UUoDAF5KAwBhShUAZWgAAABAbygBcGhDQ0MAcsoIAAAA/wAAQAAAORVoJHR9ABZo9Ww7ADUIgUIq D09KAwBRSgMAXkoDAGFKFQBlaAAAAEBwaENDQwByyggAAAD/AABAADYWaPVsOwA1CIFCKg9PSgMA UUoDAF5KAwBhShUAZWgAAABAbygBcGhDQ0MAcsoIAAAA/wAAQAAAPBVofwfkABZo9Ww7ADUIgUIq D09KAwBRSgMAXkoDAGFKFQBlaAAAAEBvKAFwaENDQwByyggAAAD/AABAAAA5FWh/B+QAFmj1bDsA NQiBQioPT0oDAFFKAwBeSgMAYUoVAGVoAAAAQHBoQ0NDAHLKCAAAAP8AAEAAORVokSnhABZo9Ww7 ADUIgUIqD09KAwBRSgMAXkoDAGFKFQBlaAAAAEBwaENDQwByyggAAAD/AABAAAAQAAYAAEIIAAD4 CAAAAQ0AAAINAAAlDQAAPQ0AAH8NAACBDQAAgg0AAIMNAACFDQAAhg0AAIgNAACJDQAAiw0AAIwN AACODQAAjw0AAJANAACRDQAAkg0AAJMNAACUDQAAlQ0AAJYNAACXDQAA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAA AAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAA APgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAA AAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA9gAAAAAAAAAA AAAAAPgAAAAAAAAAAAAAAADpAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAAD4 AAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQ AA0PACZkAAAAAFDGCAAAAP8AAAAAZ2T1bDsAAAEPAAABAAAABAAAZ2T1bDsAABoABgAAgw0AAJwN AAD9/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAEBApAJAACSCQAAwAkA APwJAAD+CQAAGgoAABsKAAB0CgAAdQoAANAKAADSCgAALAsAAC0LAACSCwAAkwsAAP8LAAAADAAA SwwAAEwMAABnDAAAbgwAALMMAAD53MKm3Inc+dxq3EvcS9xL3EvcatwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0VaJEp4QAWaPVsOwAwShEANQiBQioPT0oDAFFKAwBe SgMAYUoVAGVoAAAAQHBoQ0NDAHLKCAAAAP8AAEAAPBVokSnhABZo9Ww7ADUIgUIqD09KAwBRSgMA XkoDAGFKFQBlaAAAAEBvKAFwaENDQwByyggAAAD/AABAAAA5FWh/B+QAFmj1bDsANQiBQioPT0oD AFFKAwBeSgMAYUoVAGVoAAAAQHBoQ0NDAHLKCAAAAP8AAEAANhZo9Ww7ADUIgUIqD09KAwBRSgMA XkoDAGFKFQBlaAAAAEBvKAFwaENDQwByyggAAAD/AABAAAAzFmj1bDsANQiBQioPT0oDAFFKAwBe SgMAYUoVAGVoAAAAQHBoQ0NDAHLKCAAAAP8AAEAAORVokSnhABZo9Ww7ADUIgUIqD09KAwBRSgMA XkoDAGFKFQBlaAAAAEBwaENDQwByyggAAAD/AABAAAwVaH8H5AAWaPVsOwAVswwAALQMAADLDAAA zAwAAAANAAABDQAAAg0AAEYNAABHDQAAbA0AAG0NAAB9DQAAfg0AAH8NAACADQAA687rzq+hhGKE YoRihEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA2Fmj1bDsANQiBQioPT0oDAFFKAwBeSgMAYUoVAGVoAAAAQG8oAXBoQ0ND AHLKCAAAAP8AAEAAAEIDagAAAAAVaD5iIQAWaPVsOwA1CIFCKg9PSgMAUUoDAFUIAV5KAwBhShUA ZWgAAABAcGhDQ0MAcsoIAAAA/wAAQAAAORVoPmIhABZo9Ww7ADUIgUIqD09KAwBRSgMAXkoDAGFK FQBlaAAAAEBwaENDQwByyggAAAD/AABAABoWaPVsOwBlaAAAAEBvKAFyyggAAAD/AABAAAA8FWhb AWgAFmj1bDsANQiBQioPQ0oYAE9KAwBRSgMAXkoDAGVoAAAAQG8oAXBoQ0NDAHLKCAAAAP8AAEAA ADkVaJEp4QAWaPVsOwA1CIFCKg9PSgMAUUoDAF5KAwBhShUAZWgAAABAcGhDQ0MAcsoIAAAA/wAA QAAoFWiRKeEAFmj1bDsANQiBQioPT0oDAFFKAwBeSgMAYUoVAHBoQ0NDAA6ADQAAgQ0AAIINAACD DQAAhA0AAIYNAACHDQAAiQ0AAIoNAACMDQAAjQ0AAI8NAACQDQAAkQ0AAJINAACTDQAAlA0AAJUN AACWDQAAlw0AAJgNAACZDQAAmg0AAJwNAACdDQAA4cTAuLS4tLi0uLSwtLC0sLSwtLC0sLTAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZo 9Ww7AAAGFmiBXOcAAA8DagAAAAAWaIFc5wBVCAEGFmhzELsAADkVaD5iIQAWaPVsOwA1CIFCKg9P SgMAUUoDAF5KAwBhShUAZWgAAABAcGhDQ0MAcsoIAAAA/wAAQAA8FWg+YiEAFmj1bDsANQiBQioP T0oDAFFKAwBeSgMAYUoVAGVoAAAAQG8oAXBoQ0NDAHLKCAAAAP8AAEAAGJcNAACYDQAAmQ0AAJoN AACbDQAAnA0AAJ0NAAD9AAAAAAAAAAAAAAAA+wAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD7AAAA AAAAAAAAAAAA+wAAAAAAAAAAAAAAAPsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAQAAAAEPAAAGMAAxkDgBMlACAB+wgi4g sMZBIbAIByKwCAcjkKAFJJCgBSWwAAAXsFMDGLDgAwyQqQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhgISABIAAQCcAA8ABAAAAAQAAAAAAAQA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AEEAUwBVAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYCAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQ q5EIACsns9kwAAAAVAEAABAAAAABAAAAiAAAAAIAAACQAAAAAwAAAJwAAAAEAAAAqAAAAAUAAAC4 AAAABwAAAMQAAAAIAAAA1AAAAAkAAADkAAAAEgAAAPAAAAAKAAAAEAEAAAwAAAAcAQAADQAAACgB AAAOAAAANAEAAA8AAAA8AQAAEAAAAEQBAAATAAAATAEAAAIAAACoAwAAHgAAAAQAAAAAAAAAHgAA AAQAAAAAAAAAHgAAAAgAAABBU1VTAAAAAB4AAAAEAAAAAAAAAB4AAAAIAAAATm9ybWFsAAAeAAAA CAAAAEFTVVMAAAAAHgAAAAQAAAAyAAAAHgAAABgAAABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQAAABA AAAAANJJawAAAABAAAAAAIwwCLO00QFAAAAAAF56c7O00QEDAAAAAQAAAAMAAACsAAAAAwAAANcD AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP7/AAAGAgIAAAAAAAAAAAAAAAAAAAAAAAIAAAAC1c3VnC4bEJOXCAArLPmu RAAAAAXVzdWcLhsQk5cIACss+a7wAAAArAAAAAoAAAABAAAAWAAAAA8AAABgAAAABQAAAGwAAAAG AAAAdAAAABEAAAB8AAAAFwAAAIQAAAALAAAAjAAAABAAAACUAAAAEwAAAJwAAAAWAAAApAAAAAIA AACoAwAAHgAAAAQAAAAAAAAAAwAAAAgAAAADAAAAAgAAAAMAAACBBAAAAwAAAA8nCwALAAAAAAAA AAsAAAAAAAAACwAAAAAAAAALAAAAAAAAALAAAAADAAAAAAAAACAAAAABAAAAOAAAAAIAAABAAAAA AQAAAAIAAAAMAAAAX1BJRF9ITElOS1MAAgAAAKgDAABBAAAAaAAAAAYAAAADAAAAIwAfAAMAAAAA AAAAAwAAAAAAAAADAAAABQAAAB8AAAAYAAAAbQBhAGkAbAB0AG8AOgBtAGEAdAB0AEAAcABhAGcA YQBsAGUAZAAuAGMAbwBtAAAAHwAAAAEAAAAAAMcPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAA DgAAAP7///8QAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAA/v///xgAAAAZAAAAGgAAABsAAAAc AAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAA/v///yQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoA AAD+////LAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAAP7////9////NQAAAP7////+/////v// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAWAAUB//////////8DAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAANAG UI6ztNEBNwAAAIAAAAAAAAAARABhAHQAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAgH///////////////8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAABAAAAAAAAAxAFQAYQBiAGwAZQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgACAQEAAAAGAAAA/////wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAABdFwAAAAAAAFcAbwByAGQARABv AGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIB AgAAAAUAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIcAAAA AAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAACgAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAjAAAAABAAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8A cgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAACAQQAAAD//////////wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACsAAAAAEAAAAAAAAAEAQwBvAG0AcABPAGIAagAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAIA////////////////AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG0AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAAAA/v////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /wEA/v8DCgAA/////wYJAgAAAAAAwAAAAAAAAEYbAAAATWljcm9zb2Z0IE9mZmljZSBXb3JkIM7E tbUACgAAAE1TV29yZERvYwAQAAAAV29yZC5Eb2N1bWVudC44APQ5snEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------db308a84bac086d099de116fa3a0f3ca-- From darrick.wong@oracle.com Thu May 26 00:57:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 31E587CA0 for ; Thu, 26 May 2016 00:57:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9DC5DAC001 for ; Wed, 25 May 2016 22:57:13 -0700 (PDT) X-ASG-Debug-ID: 1464242230-04cbb0356a905e00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id QuPWPnP3dPyQ2SiP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5v593025073 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:05 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5v4qB003262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:05 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5v3C3007234; Thu, 26 May 2016 05:57:04 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:03 -0700 Subject: [PATCH 0/7] xfstests: minor fixes for the reflink/dedupe tests From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 0/7] xfstests: minor fixes for the reflink/dedupe tests To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:02 -0700 Message-ID: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464242231 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 410 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines This is a patch set for xfstests that adds some more reflink tests and fixes problems with some of the existing reflink tests. Most notably, I fixed the problems with the ENOSPC tests trying to use the ENOSPC'd fs for loop control -- bad bad bad. Comments and questions are, as always, welcome. The fixes are available on github[1]. --D [1] https://github.com/djwong/xfstests/tree/djwong-devel From darrick.wong@oracle.com Thu May 26 00:57:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3F7F7CA0 for ; Thu, 26 May 2016 00:57:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AFE1304064 for ; Wed, 25 May 2016 22:57:15 -0700 (PDT) X-ASG-Debug-ID: 1464242233-04cbb0356a905e10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id PToXQDwQvpfaJ2dG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vBTJ022797 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:12 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vBZ0003608 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:11 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vAuq016529; Thu, 26 May 2016 05:57:10 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:09 -0700 Subject: [PATCH 1/7] xfs/104: don't enospc when ag metadata overhead grows From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/7] xfs/104: don't enospc when ag metadata overhead grows To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:08 -0700 Message-ID: <146424222875.6278.15144771781299434088.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464242234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1002 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Adapt to different metadata overhead sizes by trying to reserve decreasing amounts of disk space until we actually succeed at it. Signed-off-by: Darrick J. Wong --- tests/xfs/104 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/xfs/104 b/tests/xfs/104 index 17f9b62..785027e 100755 --- a/tests/xfs/104 +++ b/tests/xfs/104 @@ -88,9 +88,14 @@ sizeb=`expr $size / $dbsize` # in data blocks echo "*** creating scratch filesystem" _create_scratch -lsize=10m -dsize=${size} -dagcount=${nags} -fillsize=`expr 110 \* 1048576` # 110 megabytes of filling echo "*** using some initial space on scratch filesystem" -_fill_scratch $fillsize +for i in `seq 125 -1 90`; do + fillsize=`expr $i \* 1048576` + out="$(_fill_scratch $fillsize 2>&1)" + echo "$out" | grep -q 'No space left on device' && continue + test -n "${out}" && echo "$out" + break +done # # Grow the filesystem while actively stressing it... From darrick.wong@oracle.com Thu May 26 00:57:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 74E617CA0 for ; Thu, 26 May 2016 00:57:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 37454304066 for ; Wed, 25 May 2016 22:57:25 -0700 (PDT) X-ASG-Debug-ID: 1464242241-04bdf05ad7904890001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id uYBwjb4EJBTAAEOs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vKMv022894 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:20 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vKmE020302 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:20 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vI0v017406; Thu, 26 May 2016 05:57:19 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:17 -0700 Subject: [PATCH 2/7] tests: don't put loop control files on the scratch mount From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/7] tests: don't put loop control files on the scratch mount To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:15 -0700 Message-ID: <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464242242 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12050 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If we're doing write/overwrite/snapshot/resource exhaustion tests on the scratch device, use the test directory to hold the loop termination signal files. This way we don't run infinitely because we can't create the flag due to ENOSPC. Signed-off-by: Darrick J. Wong --- tests/generic/162 | 8 +++++--- tests/generic/163 | 8 +++++--- tests/generic/164 | 8 +++++--- tests/generic/165 | 8 +++++--- tests/generic/166 | 8 +++++--- tests/generic/167 | 8 +++++--- tests/generic/168 | 8 +++++--- tests/generic/170 | 8 +++++--- tests/generic/333 | 20 ++++++++++++-------- tests/generic/334 | 20 ++++++++++++-------- 10 files changed, 64 insertions(+), 40 deletions(-) diff --git a/tests/generic/162 b/tests/generic/162 index 5ff2ee2..9142d53 100755 --- a/tests/generic/162 +++ b/tests/generic/162 @@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -51,6 +51,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -64,7 +66,7 @@ _pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file2 >> $seqres.full _scratch_cycle_mount overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x61 $((i * blksz)) $blksz $testdir/file2 >> $seqres.full done @@ -81,7 +83,7 @@ for i in `seq 1 2`; do done done echo "Finished dedupeing" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/163 b/tests/generic/163 index fcba677..ebf4831 100755 --- a/tests/generic/163 +++ b/tests/generic/163 @@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -51,6 +51,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -64,7 +66,7 @@ _pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file2 >> $seqres.full _scratch_cycle_mount overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x61 $((i * blksz)) $blksz $testdir/file1 >> $seqres.full done @@ -81,7 +83,7 @@ for i in `seq 1 2`; do done done echo "Finished dedupeing" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/164 b/tests/generic/164 index acacb7f..76f419f 100755 --- a/tests/generic/164 +++ b/tests/generic/164 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -71,7 +73,7 @@ fbytes() { } reader() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do _read_range $testdir/file3 0 $((loops * blksz)) | fbytes done } @@ -91,7 +93,7 @@ for i in `seq 1 2`; do done done echo "Finished reflinking" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/165 b/tests/generic/165 index b742d19..326127b 100755 --- a/tests/generic/165 +++ b/tests/generic/165 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -54,6 +54,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -72,7 +74,7 @@ fbytes() { } reader() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do _read_range $testdir/file3 0 $((loops * blksz)) -d | fbytes done } @@ -92,7 +94,7 @@ for i in `seq 1 2`; do done done echo "Finished reflinking" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/166 b/tests/generic/166 index 0e31f2e..f4d7210 100755 --- a/tests/generic/166 +++ b/tests/generic/166 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -54,6 +54,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -68,7 +70,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo "$out" | grep -q "No space left" && break @@ -83,7 +85,7 @@ snappy & seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 >> $seqres.full done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/167 b/tests/generic/167 index b2d6c87..0db2109 100755 --- a/tests/generic/167 +++ b/tests/generic/167 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -67,7 +69,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo "$out" | grep -q "No space left" && break @@ -82,7 +84,7 @@ snappy & seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file1 >> $seqres.full done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/168 b/tests/generic/168 index 7047d10..9d95261 100755 --- a/tests/generic/168 +++ b/tests/generic/168 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -52,6 +52,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -66,7 +68,7 @@ _scratch_cycle_mount # Direct I/O overwriter... overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file2 >> $seqres.full done @@ -82,7 +84,7 @@ seq 1 10 | while read j; do [ $? -ne 0 ] && exit done done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/170 b/tests/generic/170 index 4861052..742f03a 100755 --- a/tests/generic/170 +++ b/tests/generic/170 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -67,7 +69,7 @@ _scratch_cycle_mount # Direct I/O overwriter... overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file2 >> $seqres.full done @@ -83,7 +85,7 @@ seq 1 10 | while read j; do [ $? -ne 0 ] && exit done done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/333 b/tests/generic/333 index 8db86e3..3e7b600 100755 --- a/tests/generic/333 +++ b/tests/generic/333 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file $abort_file wait } @@ -54,6 +54,10 @@ _scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file +abort_file=$TEST_DIR/abort +rm -rf $abort_file mkdir $testdir loops=1024 @@ -68,7 +72,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo $out | grep -q "No space left" && break @@ -76,7 +80,7 @@ snappy() { test $res -ne 0 && break n=$((n + 1)) done - touch $testdir/abort + touch $abort_file } echo "Snapshot a file undergoing directio rewrite" @@ -85,13 +89,13 @@ seq 1 1000 | while read j; do seq $nr_loops -1 0 | while read i; do out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 2>&1)" echo $out >> $seqres.full - echo $out | grep -q "No space left" && touch $testdir/abort - echo $out | grep -qi "error" && touch $testdir/abort - test -e $testdir/abort && break + echo $out | grep -q "No space left" && touch $abort_file + echo $out | grep -qi "error" && touch $abort_file + test -e $abort_file && break done - test -e $testdir/abort && break + test -e $abort_file && break done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/334 b/tests/generic/334 index 5714125..e45502a 100755 --- a/tests/generic/334 +++ b/tests/generic/334 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file $abort_file wait } @@ -53,6 +53,10 @@ _scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=$TEST_DIR/finished +rm -rf $finished_file +abort_file=$TEST_DIR/abort +rm -rf $abort_file mkdir $testdir loops=1024 @@ -67,7 +71,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo $out | grep -q "No space left" && break @@ -75,7 +79,7 @@ snappy() { test $res -ne 0 && break n=$((n + 1)) done - touch $testdir/abort + touch $abort_file } echo "Snapshot a file undergoing buffered rewrite" @@ -84,13 +88,13 @@ seq 1 1000 | while read j; do seq $nr_loops -1 0 | while read i; do out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file1 2>&1)" echo $out >> $seqres.full - echo $out | grep -q "No space left" && touch $testdir/abort - echo $out | grep -qi "error" && touch $testdir/abort - test -e $testdir/abort && break + echo $out | grep -q "No space left" && touch $abort_file + echo $out | grep -qi "error" && touch $abort_file + test -e $abort_file && break done - test -e $testdir/abort && break + test -e $abort_file && break done -touch $testdir/finished +touch $finished_file wait # success, all done From darrick.wong@oracle.com Thu May 26 00:57:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 595F67CA0 for ; Thu, 26 May 2016 00:57:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A6C78F8050 for ; Wed, 25 May 2016 22:57:36 -0700 (PDT) X-ASG-Debug-ID: 1464242246-04cb6c2dba8fa770001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id MPS3mzH17JyeG8Pk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vPxV022927 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:25 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vPYO020406 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:25 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u4Q5vOMH030045; Thu, 26 May 2016 05:57:24 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:24 -0700 Subject: [PATCH 3/7] xfs: test copy-on-write leftover recovery From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/7] xfs: test copy-on-write leftover recovery To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:23 -0700 Message-ID: <146424224300.6278.15812903283890243005.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464242247 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13850 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Test recovery of CoW leftovers in xfs_repair. Signed-off-by: Darrick J. Wong --- tests/xfs/853 | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/853.out | 13 ++++ tests/xfs/854 | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/854.out | 13 ++++ tests/xfs/group | 2 + 5 files changed, 387 insertions(+) create mode 100755 tests/xfs/853 create mode 100644 tests/xfs/853.out create mode 100755 tests/xfs/854 create mode 100644 tests/xfs/854.out diff --git a/tests/xfs/853 b/tests/xfs/853 new file mode 100755 index 0000000..14a6940 --- /dev/null +++ b/tests/xfs/853 @@ -0,0 +1,179 @@ +#! /bin/bash +# FS QA Test No. 853 +# +# Test recovery of "lost" CoW blocks: +# - Use the debugger to fake a leftover CoW extent +# - See if xfs_repair fixes it +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink + +rm -f $seqres.full + +echo "Format" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +umount $SCRATCH_MNT + +_get_agf_data() { + field="$1" + shift + + xfs_db -c 'agf 1' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_agf_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'agf 1' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_get_sb_data() { + field="$1" + shift + + xfs_db -c 'sb 0' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_sb_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'sb 0' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_filter_leftover() { + grep "^leftover" | sed -e "s/[0-9]\+/NR/g" +} + +_dump_status() { + echo "** " "$@" + xfs_db -c 'sb 0' -c p $SCRATCH_DEV + echo "** agf header" + xfs_db -c 'agf 1' -c p $SCRATCH_DEV + echo "** refcntbt" + xfs_db -c 'agf 1' -c 'addr refcntroot' -c p $SCRATCH_DEV + echo "** rmapbt" + test $is_rmap -gt 0 && xfs_db -c 'agf 1' -c 'addr rmaproot' -c p $SCRATCH_DEV + echo "** bnobt" + xfs_db -c 'agf 1' -c 'addr bnoroot' -c p $SCRATCH_DEV + echo "** cntbt" + xfs_db -c 'agf 1' -c 'addr cntroot' -c p $SCRATCH_DEV +} + +echo "We need AG1 to have a single free extent" +bno_lvl=$(_get_agf_data level -c 'addr bnoroot') +bno_nr=$(_get_agf_data numrecs -c 'addr bnoroot') +refc_lvl=$(_get_agf_data level -c 'addr refcntroot') +refc_nr=$(_get_agf_data numrecs -c 'addr refcntroot') + +test $bno_lvl -eq 0 || echo " AG 1 bnobt must only have one level" +test $bno_nr -eq 1 || echo " AG 1 bnobt must only have one record" +test $refc_lvl -eq 0 || echo " AG 1 refcountbt must only have one level" +test $refc_nr -eq 0 || echo " AG 1 refcountbt must only have one record" + +if [ $is_rmap -gt 0 ]; then + rmap_lvl=$(_get_agf_data level -c 'addr rmaproot') + rmap_nr=$(_get_agf_data numrecs -c 'addr rmaproot') + test $rmap_lvl -eq 0 || echo " AG 1 rmapbt must only have one level" +fi + +echo "Find our extent and old counter values" +bno=$(_get_agf_data "recs[1].startblock" -c 'addr bnoroot') +len=$(_get_agf_data "recs[1].blockcount" -c 'addr bnoroot') +agf_freeblks=$(_get_agf_data freeblks) +sb_fdblocks=$(_get_sb_data fdblocks) + +test $len -ge 200 || echo " AG 1 doesn't have enough free blocks" + +# Take the last 100 blocks of the free extent +debris_len=100 +debris_bno=$((bno + len - debris_len)) + +echo "Remove the extent from the freesp btrees" +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr bnoroot' +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr cntroot' +_set_agf_data freeblks $((agf_freeblks - debris_len)) +_set_agf_data longest $((len - debris_len)) +_set_sb_data fdblocks $((sb_fdblocks - debris_len)) + +echo "Add the extent to the refcount btree" +_set_agf_data numrecs 1 -c 'addr refcntroot' +_set_agf_data "recs[1].startblock" $debris_bno -c 'addr refcntroot' +_set_agf_data "recs[1].blockcount" $debris_len -c 'addr refcntroot' +_set_agf_data "recs[1].refcount" 1 -c 'addr refcntroot' + +if [ $is_rmap -gt 0 ]; then + rmap_nr=$((rmap_nr + 1)) + _set_agf_data numrecs $rmap_nr -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].startblock" $debris_bno -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].blockcount" $debris_len -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].owner" -9 -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].offset" 0 -c 'addr rmaproot' +fi + +_dump_status "broken fs config" >> $seqres.full + +echo "Look for leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +echo "Fix filesystem" +_scratch_xfs_repair >> $seqres.full 2>&1 || echo "xfs_repair failed?" + +_dump_status "supposedly fixed fs config" >> $seqres.full + +echo "Look for no more leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for no more leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +# success, all done +status=0 +exit diff --git a/tests/xfs/853.out b/tests/xfs/853.out new file mode 100644 index 0000000..3224e8d --- /dev/null +++ b/tests/xfs/853.out @@ -0,0 +1,13 @@ +QA output created by 853 +Format +We need AG1 to have a single free extent +Find our extent and old counter values +Remove the extent from the freesp btrees +Add the extent to the refcount btree +Look for leftover warning in xfs_check +leftover CoW extent (NR/NR) len NR +Look for leftover warning in xfs_repair +leftover CoW extent (NR/NR) len NR +Fix filesystem +Look for no more leftover warning in xfs_check +Look for no more leftover warning in xfs_repair diff --git a/tests/xfs/854 b/tests/xfs/854 new file mode 100755 index 0000000..5c6bec9 --- /dev/null +++ b/tests/xfs/854 @@ -0,0 +1,180 @@ +#! /bin/bash +# FS QA Test No. 854 +# +# Test recovery of "lost" CoW blocks: +# - Use the debugger to fake a leftover CoW extent +# - See if mount/umount fixes it +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink + +rm -f $seqres.full + +echo "Format" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +umount $SCRATCH_MNT + +_get_agf_data() { + field="$1" + shift + + xfs_db -c 'agf 1' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_agf_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'agf 1' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_get_sb_data() { + field="$1" + shift + + xfs_db -c 'sb 0' "$@" -c "p $field" $SCRATCH_DEV | awk '{print $3}' +} + +_set_sb_data() { + field="$1" + value="$2" + shift; shift + + xfs_db -x -c 'sb 0' "$@" -c "write $field -- $value" $SCRATCH_DEV >> $seqres.full +} + +_filter_leftover() { + grep "^leftover" | sed -e "s/[0-9]\+/NR/g" +} + +_dump_status() { + echo "** " "$@" + xfs_db -c 'sb 0' -c p $SCRATCH_DEV + echo "** agf header" + xfs_db -c 'agf 1' -c p $SCRATCH_DEV + echo "** refcntbt" + xfs_db -c 'agf 1' -c 'addr refcntroot' -c p $SCRATCH_DEV + echo "** rmapbt" + test $is_rmap -gt 0 && xfs_db -c 'agf 1' -c 'addr rmaproot' -c p $SCRATCH_DEV + echo "** bnobt" + xfs_db -c 'agf 1' -c 'addr bnoroot' -c p $SCRATCH_DEV + echo "** cntbt" + xfs_db -c 'agf 1' -c 'addr cntroot' -c p $SCRATCH_DEV +} + +echo "We need AG1 to have a single free extent" +bno_lvl=$(_get_agf_data level -c 'addr bnoroot') +bno_nr=$(_get_agf_data numrecs -c 'addr bnoroot') +refc_lvl=$(_get_agf_data level -c 'addr refcntroot') +refc_nr=$(_get_agf_data numrecs -c 'addr refcntroot') + +test $bno_lvl -eq 0 || echo " AG 1 bnobt must only have one level" +test $bno_nr -eq 1 || echo " AG 1 bnobt must only have one record" +test $refc_lvl -eq 0 || echo " AG 1 refcountbt must only have one level" +test $refc_nr -eq 0 || echo " AG 1 refcountbt must only have one record" + +if [ $is_rmap -gt 0 ]; then + rmap_lvl=$(_get_agf_data level -c 'addr rmaproot') + rmap_nr=$(_get_agf_data numrecs -c 'addr rmaproot') + test $rmap_lvl -eq 0 || echo " AG 1 rmapbt must only have one level" +fi + +echo "Find our extent and old counter values" +bno=$(_get_agf_data "recs[1].startblock" -c 'addr bnoroot') +len=$(_get_agf_data "recs[1].blockcount" -c 'addr bnoroot') +agf_freeblks=$(_get_agf_data freeblks) +sb_fdblocks=$(_get_sb_data fdblocks) + +test $len -ge 200 || echo " AG 1 doesn't have enough free blocks" + +# Take the last 100 blocks of the free extent +debris_len=100 +debris_bno=$((bno + len - debris_len)) + +echo "Remove the extent from the freesp btrees" +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr bnoroot' +_set_agf_data "recs[1].blockcount" $((len - debris_len)) -c 'addr cntroot' +_set_agf_data freeblks $((agf_freeblks - debris_len)) +_set_agf_data longest $((len - debris_len)) +_set_sb_data fdblocks $((sb_fdblocks - debris_len)) + +echo "Add the extent to the refcount btree" +_set_agf_data numrecs 1 -c 'addr refcntroot' +_set_agf_data "recs[1].startblock" $debris_bno -c 'addr refcntroot' +_set_agf_data "recs[1].blockcount" $debris_len -c 'addr refcntroot' +_set_agf_data "recs[1].refcount" 1 -c 'addr refcntroot' + +if [ $is_rmap -gt 0 ]; then + rmap_nr=$((rmap_nr + 1)) + _set_agf_data numrecs $rmap_nr -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].startblock" $debris_bno -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].blockcount" $debris_len -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].owner" -9 -c 'addr rmaproot' + _set_agf_data "recs[$rmap_nr].offset" 0 -c 'addr rmaproot' +fi + +_dump_status "broken fs config" >> $seqres.full + +echo "Look for leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +echo "Mount filesystem" +_scratch_mount +umount $SCRATCH_MNT + +_dump_status "supposedly fixed fs config" >> $seqres.full + +echo "Look for no more leftover warning in xfs_check" +_scratch_xfs_check | _filter_leftover + +echo "Look for no more leftover warning in xfs_repair" +_scratch_xfs_repair -n 2>&1 | _filter_leftover + +# success, all done +status=0 +exit diff --git a/tests/xfs/854.out b/tests/xfs/854.out new file mode 100644 index 0000000..aae2fd7 --- /dev/null +++ b/tests/xfs/854.out @@ -0,0 +1,13 @@ +QA output created by 854 +Format +We need AG1 to have a single free extent +Find our extent and old counter values +Remove the extent from the freesp btrees +Add the extent to the refcount btree +Look for leftover warning in xfs_check +leftover CoW extent (NR/NR) len NR +Look for leftover warning in xfs_repair +leftover CoW extent (NR/NR) len NR +Mount filesystem +Look for no more leftover warning in xfs_check +Look for no more leftover warning in xfs_repair diff --git a/tests/xfs/group b/tests/xfs/group index f4c6816..4ac62c1 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -285,3 +285,5 @@ 303 auto quick quota 304 auto quick quota 305 auto quota +853 auto quick clone +854 auto quick clone From darrick.wong@oracle.com Thu May 26 00:57:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CE4C07CA0 for ; Thu, 26 May 2016 00:57:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A0C738F8054 for ; Wed, 25 May 2016 22:57:46 -0700 (PDT) X-ASG-Debug-ID: 1464242263-04cbb0356a905e40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 8DiHH1cHCZKCLXZS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vYDM025555 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vX3w020638 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:33 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vVU4017451; Thu, 26 May 2016 05:57:32 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:30 -0700 Subject: [PATCH 4/7] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/7] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:29 -0700 Message-ID: <146424224949.6278.1122385565512290875.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464242263 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3990 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that refcountbt allocations during truncate operations come from the per-AG reservation and are not charged to the transaction. Reported-by: Christoph Hellwig Signed-off-by: Darrick J. Wong --- tests/xfs/855 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/855.out | 10 ++++++ tests/xfs/group | 1 + 3 files changed, 106 insertions(+) create mode 100755 tests/xfs/855 create mode 100644 tests/xfs/855.out diff --git a/tests/xfs/855 b/tests/xfs/855 new file mode 100755 index 0000000..93bd286 --- /dev/null +++ b/tests/xfs/855 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 855 +# +# Ensure that we can create enough distinct reflink entries to force creation +# of a multi-level refcount btree by reflinking a file a number of times and +# truncating the copies at successively lower sizes. Delete and recreate a few +# times to exercise the refcount btree grow/shrink functions. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + umount $SCRATCH_MNT > /dev/null 2>&1 + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +echo "Create the original file blocks" +blksz="$(stat -f $testdir -c '%S')" +nr_blks=$((2 * blksz / 12)) + +for i in 1 2 x; do + _pwrite_byte 0x61 0 $((blksz * nr_blks)) $testdir/file1 >> $seqres.full + + echo "$i: Reflink a bunch of times" + seq 1 $nr_blks | while read nr; do + _cp_reflink $testdir/file1 $testdir/file1.$nr >> $seqres.full + done + sync + + echo "$i: Truncate files" + seq 1 $nr_blks | while read nr; do + truncate -s $((blksz * (nr_blks - nr))) $testdir/file1.$nr >> $seqres.full + done + + umount $SCRATCH_MNT + _check_scratch_fs + _scratch_mount + + test $i = "x" && break + + echo "$i: Delete both files" + rm -rf $testdir + mkdir -p $testdir + umount $SCRATCH_MNT + _check_scratch_fs + _scratch_mount +done + +# success, all done +status=0 +exit diff --git a/tests/xfs/855.out b/tests/xfs/855.out new file mode 100644 index 0000000..d196352 --- /dev/null +++ b/tests/xfs/855.out @@ -0,0 +1,10 @@ +QA output created by 855 +Create the original file blocks +1: Reflink a bunch of times +1: Truncate files +1: Delete both files +2: Reflink a bunch of times +2: Truncate files +2: Delete both files +x: Reflink a bunch of times +x: Truncate files diff --git a/tests/xfs/group b/tests/xfs/group index 4ac62c1..f0ca410 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -287,3 +287,4 @@ 305 auto quota 853 auto quick clone 854 auto quick clone +855 auto clone From darrick.wong@oracle.com Thu May 26 00:57:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9ABC57CA0 for ; Thu, 26 May 2016 00:57:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DF17304039 for ; Wed, 25 May 2016 22:57:47 -0700 (PDT) X-ASG-Debug-ID: 1464242264-04cb6c2dbc8fa7a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id EBtJzGoHdYMJb161 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vdKv025629 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:39 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vcZL017547 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:39 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vbuK016705; Thu, 26 May 2016 05:57:38 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:37 -0700 Subject: [PATCH 5/7] reflink: test interaction with swap files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/7] reflink: test interaction with swap files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:36 -0700 Message-ID: <146424225618.6278.13884344251723851779.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464242265 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6087 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since none of the current filesystems support reflinked swap files, make sure that we prohibit reflinking of swapfiles and swapon of reflinked files. Signed-off-by: Darrick J. Wong Cc: Christoph Hellwig --- tests/generic/923 | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/923.out | 6 ++++ tests/generic/924 | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/924.out | 5 +++ tests/generic/group | 2 + 5 files changed, 160 insertions(+) create mode 100755 tests/generic/923 create mode 100644 tests/generic/923.out create mode 100755 tests/generic/924 create mode 100644 tests/generic/924.out diff --git a/tests/generic/923 b/tests/generic/923 new file mode 100755 index 0000000..73c1621 --- /dev/null +++ b/tests/generic/923 @@ -0,0 +1,74 @@ +#! /bin/bash +# FS QA Test No. 923 +# +# Check that we can't reflink a swapfile. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=160 +blksz=65536 + +echo "Initialize file" +echo > $seqres.full +_pwrite_byte 0x61 0 $((blocks * blksz)) $testdir/file1 >> $seqres.full +mkswap -U 27376b42-ff65-42ca-919f-6c9b62292a5c $testdir/file1 >> $seqres.full +swapon $testdir/file1 + +echo "Try to reflink" +_cp_reflink $testdir/file1 $testdir/file2 2>&1 | _filter_scratch + +echo "Tear it down" +swapoff $testdir/file1 + +# success, all done +status=0 +exit diff --git a/tests/generic/923.out b/tests/generic/923.out new file mode 100644 index 0000000..97c18cf --- /dev/null +++ b/tests/generic/923.out @@ -0,0 +1,6 @@ +QA output created by 923 +Format and mount +Initialize file +Try to reflink +cp: failed to clone 'SCRATCH_MNT/test-923/file2' from 'SCRATCH_MNT/test-923/file1': Text file busy +Tear it down diff --git a/tests/generic/924 b/tests/generic/924 new file mode 100755 index 0000000..86c2a39 --- /dev/null +++ b/tests/generic/924 @@ -0,0 +1,73 @@ +#! /bin/bash +# FS QA Test No. 924 +# +# Check that we can't swapon a reflinked file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=160 +blksz=65536 + +echo "Initialize file" +echo > $seqres.full +_pwrite_byte 0x61 0 $((blocks * blksz)) $testdir/file1 >> $seqres.full +mkswap -U 27376b42-ff65-42ca-919f-6c9b62292a5c $testdir/file1 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file2 2>&1 | _filter_scratch + +echo "Try to swapon" +swapon $testdir/file1 2>&1 | _filter_scratch + +swapoff $testdir/file1 >> $seqres.full 2>&1 + +# success, all done +status=0 +exit diff --git a/tests/generic/924.out b/tests/generic/924.out new file mode 100644 index 0000000..b67e6fa --- /dev/null +++ b/tests/generic/924.out @@ -0,0 +1,5 @@ +QA output created by 924 +Format and mount +Initialize file +Try to swapon +swapon: SCRATCH_MNT/test-924/file1: swapon failed: Invalid argument diff --git a/tests/generic/group b/tests/generic/group index 36fb759..6fdf109 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -354,3 +354,5 @@ 349 blockdev quick rw 350 blockdev quick rw 351 blockdev quick rw +923 auto quick clone +924 auto quick clone From darrick.wong@oracle.com Thu May 26 00:57:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5E92E7CA0 for ; Thu, 26 May 2016 00:57:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 317B7304039 for ; Wed, 25 May 2016 22:57:53 -0700 (PDT) X-ASG-Debug-ID: 1464242270-04cbb03569905e50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3E316SGZHnMeYCy2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vkSm025663 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:46 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vjjh020898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:46 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vihH007416; Thu, 26 May 2016 05:57:45 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:44 -0700 Subject: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:42 -0700 Message-ID: <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464242270 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8763 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that we can handle multiple bmbt records mapping to a single rmapbt record. This can happen if you fallocate more than 2^21 contiguous blocks to a file. (Also add some helpers that can create huge devices with some dm-zero and dm-snapshot fakery.) Signed-off-by: Darrick J. Wong --- common/dmhugedisk | 61 +++++++++++++++++++++++++++ src/t_immutable.c | 2 - tests/xfs/856 | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/856.out | 13 ++++++ tests/xfs/group | 1 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 common/dmhugedisk create mode 100755 tests/xfs/856 create mode 100644 tests/xfs/856.out diff --git a/common/dmhugedisk b/common/dmhugedisk new file mode 100644 index 0000000..9c3c7d5 --- /dev/null +++ b/common/dmhugedisk @@ -0,0 +1,61 @@ +##/bin/bash +# Routines for creating huge (fake) disks +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle. All Rights Reserved. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Contact information: Oracle Corporation, 500 Oracle Parkway, +# Redwood Shores, CA 94065, USA, or: http://www.oracle.com/ +#----------------------------------------------------------------------- + +_require_dmhugedisk() +{ + _require_dm_target zero + _require_dm_target snapshot +} + +_dmhugedisk_init() +{ + test -z "$1" && _fatal "must specify sector count to _dmhugedisk_init" + local dm_backing_dev=$SCRATCH_DEV + + $DMSETUP_PROG remove huge-test > /dev/null 2>&1 + $DMSETUP_PROG remove huge-test-zero > /dev/null 2>&1 + + local blk_dev_size=$1 + + DMHUGEDISK_ZERO='/dev/mapper/huge-test-zero' + DMHUGEDISK_DEV='/dev/mapper/huge-test' + + DMHUGEDISK_ZERO_TABLE="0 $blk_dev_size zero" + DMHUGEDISK_DEV_TABLE="0 $blk_dev_size snapshot $DMHUGEDISK_ZERO $SCRATCH_DEV N 512" + + $DMSETUP_PROG create huge-test-zero --table "$DMHUGEDISK_ZERO_TABLE" || \ + _fatal "failed to create dm huge zero device" + $DMSETUP_PROG create huge-test --table "$DMHUGEDISK_DEV_TABLE" || \ + _fatal "failed to create dm huge device" +} + +_dmhugedisk_cleanup() +{ + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + # wait for device to be fully settled so that 'dmsetup remove' doesn't + # fail due to EBUSY + $UDEV_SETTLE_PROG >/dev/null 2>&1 + $DMSETUP_PROG remove huge-test > /dev/null 2>&1 + $DMSETUP_PROG remove huge-test-zero > /dev/null 2>&1 +} + diff --git a/src/t_immutable.c b/src/t_immutable.c index 87ffc75..90b62fb 100644 --- a/src/t_immutable.c +++ b/src/t_immutable.c @@ -38,10 +38,10 @@ #include #include #include +#include #include #include #include -#include #include #ifndef XFS_SUPER_MAGIC diff --git a/tests/xfs/856 b/tests/xfs/856 new file mode 100755 index 0000000..9186278 --- /dev/null +++ b/tests/xfs/856 @@ -0,0 +1,119 @@ +#! /bin/bash +# FS QA Test No. 856 +# +# Create a file with more than 2^21 extents (the max length of a bmbt record). +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + umount $SCRATCH_MNT > /dev/null 2>&1 + _dmhugedisk_cleanup + rm -rf $tmp.* + _scratch_mkfs >/dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmhugedisk + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch +_require_xfs_io_command "falloc" + +rm -f $seqres.full + +# Figure out block size +echo "Figure out block size" +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount >> $seqres.full + +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs" + +testdir=$SCRATCH_MNT/test-$seq +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +umount $SCRATCH_MNT + +echo "Format huge device" +_dmhugedisk_init $((blksz * 2 * 4400)) # a little over 2^22 blocks +_mkfs_dev -d agcount=2 $DMHUGEDISK_DEV +_mount $DMHUGEDISK_DEV $SCRATCH_MNT +xfs_info $SCRATCH_MNT >> $seqres.full + +echo "Create the original file blocks" +mkdir $testdir +blksz="$(stat -f $testdir -c '%S')" +nr_blks=2100000 # 2^21 plus a little more +$XFS_IO_PROG -f -c "falloc 0 $((nr_blks * blksz))" $testdir/file1 >> $seqres.full + +echo "Check extent count" +xfs_bmap -l -p -v $testdir/file1 | grep '^[[:space:]]*1:' -q && xfs_bmap -l -p -v $testdir/file1 +inum=$(stat -c '%i' $testdir/file1) +umount $SCRATCH_MNT + +echo "Check bmap count" +nr_bmaps=$(xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV | grep 'data offset' | wc -l) +test $nr_bmaps -gt 1 || xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV +#xfs_db -c "agf 0" -c p -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV + +echo "Check rmap count" +nr_rmaps=$(xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" | wc -l) +test $nr_rmaps -eq 1 || xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" + +echo "Check and fake-repair huge filesystem" | tee -a $seqres.full +$XFS_DB_PROG -c 'check' $DMHUGEDISK_DEV +$XFS_REPAIR_PROG -n $DMHUGEDISK_DEV >> $seqres.full 2>&1 +test $? -eq 0 || echo "xfs_repair -n failed, see $seqres.full" + +echo "Real repair huge filesystem" | tee -a $seqres.full +$XFS_REPAIR_PROG $DMHUGEDISK_DEV >> $seqres.full 2>&1 +test $? -eq 0 || echo "xfs_repair failed, see $seqres.full" + +echo "Check bmap count again" +nr_bmaps=$(xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV | grep 'data offset' | wc -l) +test $nr_bmaps -gt 1 || xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV + +echo "Check rmap count again" +nr_rmaps=$(xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" | wc -l) +test $nr_rmaps -eq 1 || xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" + +echo "Check and fake-repair huge filesystem again" | tee -a $seqres.full +$XFS_DB_PROG -c 'check' $DMHUGEDISK_DEV +$XFS_REPAIR_PROG -n $DMHUGEDISK_DEV >> $seqres.full 2>&1 +_dmhugedisk_cleanup + +echo "Done" + +# success, all done +status=0 +exit diff --git a/tests/xfs/856.out b/tests/xfs/856.out new file mode 100644 index 0000000..b24ebf2 --- /dev/null +++ b/tests/xfs/856.out @@ -0,0 +1,13 @@ +QA output created by 856 +Figure out block size +Format huge device +Create the original file blocks +Check extent count +Check bmap count +Check rmap count +Check and fake-repair huge filesystem +Real repair huge filesystem +Check bmap count again +Check rmap count again +Check and fake-repair huge filesystem again +Done diff --git a/tests/xfs/group b/tests/xfs/group index f0ca410..0e34f9a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -288,3 +288,4 @@ 853 auto quick clone 854 auto quick clone 855 auto clone +856 auto clone rmap reflink From darrick.wong@oracle.com Thu May 26 00:58:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EB3867CC5 for ; Thu, 26 May 2016 00:57:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 76802AC002 for ; Wed, 25 May 2016 22:57:59 -0700 (PDT) X-ASG-Debug-ID: 1464242276-04bdf05ad4904980001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id FL6K0KVBgxM9Kapn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 25 May 2016 22:57:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4Q5vquH025749 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:53 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vqIE017809 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 05:57:52 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4Q5vpUP016749; Thu, 26 May 2016 05:57:51 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 May 2016 22:57:50 -0700 Subject: [PATCH 7/7] reflink: test changing sharers of a block while keeping refcount the same From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 7/7] reflink: test changing sharers of a block while keeping refcount the same To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 25 May 2016 22:57:49 -0700 Message-ID: <146424226985.6278.9226931712470818344.stgit@birch.djwong.org> In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464242277 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12326 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that we can handle the case where the refcount stays the same even though the actual sharers changes. Signed-off-by: Darrick J. Wong --- tests/generic/925 | 80 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/925.out | 69 ++++++++++++++++++++++++++++++++++++ tests/generic/926 | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/926.out | 20 ++++++++++ tests/generic/group | 2 + 5 files changed, 265 insertions(+) create mode 100755 tests/generic/925 create mode 100644 tests/generic/925.out create mode 100755 tests/generic/926 create mode 100644 tests/generic/926.out diff --git a/tests/generic/925 b/tests/generic/925 new file mode 100755 index 0000000..9fa4ba9 --- /dev/null +++ b/tests/generic/925 @@ -0,0 +1,80 @@ +#! /bin/bash +# FS QA Test No. 925 +# +# Share an extent amongst a bunch of files such that the refcount +# stays the same while the rate of change of the set of owners is +# steadily increasing. For example, an extent of 32 blocks is owned +# by 32 files. At block 1, change one of the owners. At block 2, +# change 2 of the owners, and so on. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=64 +blksz=65536 + +echo "Initialize file" +_pwrite_byte 0x61 0 $((blocks * blksz)) $testdir/file >> $seqres.full + +echo "Share the file n-ways" +seq 1 $((blocks - 1)) | while read nr; do + _reflink_range $testdir/file 0 $testdir/file$nr.0 0 $((nr * blksz)) >> $seqres.full + seq $nr $((blocks - 1)) | while read nnr; do + _reflink_range $testdir/file $((nnr * blksz)) $testdir/file$nr.$nnr $((nnr * blksz)) $blksz >> $seqres.full + done +done +_scratch_cycle_mount + +echo "Check output" +md5sum $testdir/file $testdir/file*.0 | _filter_scratch + +# success, all done +status=0 +exit diff --git a/tests/generic/925.out b/tests/generic/925.out new file mode 100644 index 0000000..099d6d3 --- /dev/null +++ b/tests/generic/925.out @@ -0,0 +1,69 @@ +QA output created by 925 +Format and mount +Initialize file +Share the file n-ways +Check output +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-925/file +2d61aa54b58c2e94403fb092c3dbc027 SCRATCH_MNT/test-925/file1.0 +399c239a8d72b5b2beb15565cf14f6d6 SCRATCH_MNT/test-925/file10.0 +7f783291615a5db41ba33d6c50318095 SCRATCH_MNT/test-925/file11.0 +4feff1bdae53d042e572a5e240b1183f SCRATCH_MNT/test-925/file12.0 +ac2b0a907cd84c091c1cc36384246e42 SCRATCH_MNT/test-925/file13.0 +ff420a8abc25ff0a012638ddd9b81e6c SCRATCH_MNT/test-925/file14.0 +3eb1751bcb7cff809df2ec376e45fe6f SCRATCH_MNT/test-925/file15.0 +7202826a7791073fe2787f0c94603278 SCRATCH_MNT/test-925/file16.0 +7b0fea2a208aa4738d8b9433c7b8421d SCRATCH_MNT/test-925/file17.0 +c6b6ec99b28741ffb3be2d7ff361ad89 SCRATCH_MNT/test-925/file18.0 +d609dcbdc972b8cff16acd74414a8dc9 SCRATCH_MNT/test-925/file19.0 +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-925/file2.0 +d97ae5fdb25c4622d5a2f313460a2b96 SCRATCH_MNT/test-925/file20.0 +afae74f7a13edf57f43bab5da6e411d6 SCRATCH_MNT/test-925/file21.0 +0ed53c341d0154d68c336eaa9d05990d SCRATCH_MNT/test-925/file22.0 +ab20d0025b58cbf9fc49e436b7d7acef SCRATCH_MNT/test-925/file23.0 +5279106ed91359051fbdb61e87d5077d SCRATCH_MNT/test-925/file24.0 +9a8719c84c1a42d030fc6d700046eaf5 SCRATCH_MNT/test-925/file25.0 +d9b21a065727fd8118d493f7c62e7fb2 SCRATCH_MNT/test-925/file26.0 +d74ee01c55b2474f91a3723a01c83591 SCRATCH_MNT/test-925/file27.0 +ba7202bfc4b9cda564156562d8672a3f SCRATCH_MNT/test-925/file28.0 +1b3d697355ca662451eb12419cab8eef SCRATCH_MNT/test-925/file29.0 +998b4ba52f2940dc515001e75926b19f SCRATCH_MNT/test-925/file3.0 +6b2648f84c57f58786cf75ac06e37217 SCRATCH_MNT/test-925/file30.0 +c400b872b0fb3fb58920c4e570937a32 SCRATCH_MNT/test-925/file31.0 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-925/file32.0 +cac15c2eeaf1b63614469f675ec71c5f SCRATCH_MNT/test-925/file33.0 +ebd2d819d56725bd1a2a35ababd06cad SCRATCH_MNT/test-925/file34.0 +a26ebf37da9976dfd7c86b4271c59501 SCRATCH_MNT/test-925/file35.0 +11f61aaa1f5f726929c91c6d434edf72 SCRATCH_MNT/test-925/file36.0 +1f73d21c457843ea20048726d461648e SCRATCH_MNT/test-925/file37.0 +9ed53cefd1548008ed1948286e471233 SCRATCH_MNT/test-925/file38.0 +af5195351947da43e7a57f69086aa7d7 SCRATCH_MNT/test-925/file39.0 +c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-925/file4.0 +f31ecd4106278b5fb1aeabdedd43036a SCRATCH_MNT/test-925/file40.0 +e8a8d1a0873e25697171ebb87125d794 SCRATCH_MNT/test-925/file41.0 +5920fd86bc7be6a0ef5d7ea283e16307 SCRATCH_MNT/test-925/file42.0 +8360c3c368143821045f9b7994ab8344 SCRATCH_MNT/test-925/file43.0 +6c76a6c9e2b039c82e62d985479f73ee SCRATCH_MNT/test-925/file44.0 +8b5c6cab2f0da5ba2d3b2d3ca205ca75 SCRATCH_MNT/test-925/file45.0 +b4ef05d705b8e99d8824d85e993bf8fa SCRATCH_MNT/test-925/file46.0 +0db1f2d5ad692ccd8941a8bc308cdba2 SCRATCH_MNT/test-925/file47.0 +6a11a8872b36343799a15617bea78cef SCRATCH_MNT/test-925/file48.0 +015ab57c35525eeb776308e14fe2e731 SCRATCH_MNT/test-925/file49.0 +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-925/file5.0 +fbc6203955f9c6e9010f831971a073b2 SCRATCH_MNT/test-925/file50.0 +aae01cd767e508bdf2d01f647d10c4b8 SCRATCH_MNT/test-925/file51.0 +4d942a936328991bcd9821072ac0fd9e SCRATCH_MNT/test-925/file52.0 +b77f243bb207746743aeaafbdef4203a SCRATCH_MNT/test-925/file53.0 +9fc7f158bd2ded9df3965ef4fe2fa932 SCRATCH_MNT/test-925/file54.0 +36dff6091853c946411bc40fdae79e84 SCRATCH_MNT/test-925/file55.0 +82a2f6d28f1bff4ce7edc1a7a31b02cb SCRATCH_MNT/test-925/file56.0 +b0d123bf023332bba783abb5b68e4c98 SCRATCH_MNT/test-925/file57.0 +26b49b145b128c0abef0f92b3ccaf1d6 SCRATCH_MNT/test-925/file58.0 +b5ef5d86d6ef15a535ee95b8069d29c9 SCRATCH_MNT/test-925/file59.0 +cd3eccbf2f0126c4141740007ba70c3f SCRATCH_MNT/test-925/file6.0 +205cb48615014f6f2377345b62442609 SCRATCH_MNT/test-925/file60.0 +89691c001b3a3d5473081687ae519a18 SCRATCH_MNT/test-925/file61.0 +a040ce9774652bd00c3cbf493a006e00 SCRATCH_MNT/test-925/file62.0 +970b42855c15ee8caa824cd5e177759a SCRATCH_MNT/test-925/file63.0 +eb74da58c6e4f93b4bf82a62fef4ab93 SCRATCH_MNT/test-925/file7.0 +30c2557e8302a5beb290c71520d87f42 SCRATCH_MNT/test-925/file8.0 +6dc42f5ed1007a3e20d08af71e198cdc SCRATCH_MNT/test-925/file9.0 diff --git a/tests/generic/926 b/tests/generic/926 new file mode 100755 index 0000000..7dedc3f --- /dev/null +++ b/tests/generic/926 @@ -0,0 +1,94 @@ +#! /bin/bash +# FS QA Test No. 926 +# +# Make sure that the reference counting mechanism can handle the case +# where we share the first 1/4 of an extent with a file, share the +# last 1/4 of the extent with a second file, share the first half of +# the extent with N files, and share the second half of the extent +# with a different set of N files. The key point here is to test that +# we handle the case where a refcount extent record doesn't coincide +# exactly with the block mapping records. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=64 +blksz=65536 +nr=4 +halfway=$((blocks / 2 * blksz)) +quarter=$((blocks / 4 * blksz)) + +echo "Initialize file" +_pwrite_byte 0x61 0 $((blocks * blksz)) $testdir/file >> $seqres.full + +echo "Share the first half of the extent" +seq 1 $nr | while read nr; do + _reflink_range $testdir/file 0 $testdir/file$nr.0 0 $halfway >> $seqres.full +done + +echo "Share the last half of the extent" +seq 1 $nr | while read nr; do + _reflink_range $testdir/file $halfway $testdir/file$nr.1 0 $halfway >> $seqres.full +done + +echo "Share the first quarter of the extent" +_reflink_range $testdir/file 0 $testdir/file.2 0 $quarter >> $seqres.full + +echo "Share the last quarter of the extent" +_reflink_range $testdir/file $((quarter * 3)) $testdir/file.3 0 $quarter >> $seqres.full + +_scratch_cycle_mount + +echo "Check output" +md5sum $testdir/file $testdir/file* | _filter_scratch + +# success, all done +status=0 +exit diff --git a/tests/generic/926.out b/tests/generic/926.out new file mode 100644 index 0000000..d3e6b59 --- /dev/null +++ b/tests/generic/926.out @@ -0,0 +1,20 @@ +QA output created by 926 +Format and mount +Initialize file +Share the first half of the extent +Share the last half of the extent +Share the first quarter of the extent +Share the last quarter of the extent +Check output +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-926/file +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-926/file +7202826a7791073fe2787f0c94603278 SCRATCH_MNT/test-926/file.2 +7202826a7791073fe2787f0c94603278 SCRATCH_MNT/test-926/file.3 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file1.0 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file1.1 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file2.0 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file2.1 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file3.0 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file3.1 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file4.0 +de89461b64701958984c95d1bfb0065a SCRATCH_MNT/test-926/file4.1 diff --git a/tests/generic/group b/tests/generic/group index 6fdf109..2bd40a1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -356,3 +356,5 @@ 351 blockdev quick rw 923 auto quick clone 924 auto quick clone +925 auto quick clone +926 auto quick clone From yangx.jy@cn.fujitsu.com Thu May 26 02:31:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 74D267CA0 for ; Thu, 26 May 2016 02:31:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A93830406A for ; Thu, 26 May 2016 00:31:36 -0700 (PDT) X-ASG-Debug-ID: 1464247892-04cbb03568908100001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id EpXC4KPyQbFrmH2Z for ; Thu, 26 May 2016 00:31:33 -0700 (PDT) X-Barracuda-Envelope-From: yangx.jy@cn.fujitsu.com X-Barracuda-Effective-Source-IP: cn.fujitsu.com[59.151.112.132] X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="6928125" Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 26 May 2016 15:31:27 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (unknown [10.167.33.85]) by cn.fujitsu.com (Postfix) with ESMTP id 412BC489F97F; Thu, 26 May 2016 15:31:26 +0800 (CST) Received: from [10.167.220.69] (10.167.220.69) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server id 14.3.279.2; Thu, 26 May 2016 15:31:25 +0800 Message-ID: <5746A64D.6080309@cn.fujitsu.com> Date: Thu, 26 May 2016 15:31:25 +0800 From: Xiao Yang User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.18) Gecko/20110616 Thunderbird/3.1.11 MIME-Version: 1.0 To: "Darrick J. Wong" CC: Subject: question about xfs/122 References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> X-ASG-Orig-Subj: question about xfs/122 In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-yoursite-MailScanner-ID: 412BC489F97F.AC6F6 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: yangx.jy@cn.fujitsu.com X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1464247893 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 922 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29914 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Darrick When i run xfstests test case xfs/122 on RHEL7.2GA with xfsprog-dev(4.5.0), I always get such error about xfs/122: --------------------------------------------------------- sizeof(struct xfs_extent_data_info) = 32 sizeof(struct xfs_fs_eofblocks) = 128 sizeof(struct xfs_icreate_log) = 28 -sizeof(struct xfs_refcount_key) = 4 -sizeof(struct xfs_refcount_rec) = 12 -sizeof(struct xfs_rmap_key) = 4 -sizeof(struct xfs_rmap_rec) = 24 -sizeof(struct xfs_rmapx_key) = 20 sizeof(xfs_agf_t) = 224 sizeof(xfs_agfl_t) = 36 sizeof(xfs_agi_t) = 336 --------------------------------------------------------- This case can pass with modern xfsprogs(i.e. 4.3+ and all the new v5 stuff) as you said. Could you tell me which specific version can support this case. In addition, what can be done to work around this failure. Please advise. Thanks very much. Regards, Xiao Yang From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:04:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 281407CA0 for ; Thu, 26 May 2016 03:04:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2C88304066 for ; Thu, 26 May 2016 01:04:29 -0700 (PDT) X-ASG-Debug-ID: 1464249867-04cb6c2dbc8fd5c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AuFIlq6KByWdVUL1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:04:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qHI-0003y0-Jo; Thu, 26 May 2016 08:04:24 +0000 Date: Thu, 26 May 2016 01:04:24 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record Message-ID: <20160526080424.GA8469@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464249867 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 741 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > --- a/src/t_immutable.c > +++ b/src/t_immutable.c > @@ -38,10 +38,10 @@ > #include > #include > #include > +#include > #include > #include > #include > -#include > #include > > #ifndef XFS_SUPER_MAGIC How does this belong into the patch? > diff --git a/tests/xfs/group b/tests/xfs/group > index f0ca410..0e34f9a 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -288,3 +288,4 @@ > 853 auto quick clone > 854 auto quick clone > 855 auto clone > +856 auto clone rmap reflink This is the only test in the reflink group, how is this group different from the clone one? From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:08:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8339E7CA1 for ; Thu, 26 May 2016 03:08:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED5FAAC005 for ; Thu, 26 May 2016 01:08:40 -0700 (PDT) X-ASG-Debug-ID: 1464250117-04cb6c2dbb8fd740001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vuqcKSJRAjoWlsJd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:08:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qLL-0006s7-DT; Thu, 26 May 2016 08:08:35 +0000 Date: Thu, 26 May 2016 01:08:35 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs/104: don't enospc when ag metadata overhead grows Message-ID: <20160526080835.GB20307@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs/104: don't enospc when ag metadata overhead grows References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424222875.6278.15144771781299434088.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424222875.6278.15144771781299434088.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464250117 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 411 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +for i in `seq 125 -1 90`; do > + fillsize=`expr $i \* 1048576` > + out="$(_fill_scratch $fillsize 2>&1)" > + echo "$out" | grep -q 'No space left on device' && continue > + test -n "${out}" && echo "$out" > + break > +done That's a bit of an odd loop, and it would seem an inverted grep would seem more obvious. But otherwise this looks fine to me: Reviewed-by: Christoph Hellwig From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:09:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 055157CA1 for ; Thu, 26 May 2016 03:09:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA0B0304051 for ; Thu, 26 May 2016 01:09:51 -0700 (PDT) X-ASG-Debug-ID: 1464250190-04cb6c2dbb8fd780001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bTCQZS3sUKYiveUx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:09:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qMW-0007BW-B9; Thu, 26 May 2016 08:09:48 +0000 Date: Thu, 26 May 2016 01:09:48 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/7] tests: don't put loop control files on the scratch mount Message-ID: <20160526080948.GC20307@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/7] tests: don't put loop control files on the scratch mount References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464250190 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 110 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Shouldn't these tests also add a _require_test now? But we probably should just move them to /tmp instead? From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:22:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF9FA7CA0 for ; Thu, 26 May 2016 03:22:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF6028F804C for ; Thu, 26 May 2016 01:22:43 -0700 (PDT) X-ASG-Debug-ID: 1464250961-04cb6c2dbb8fdb00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BTeSJgn0QEtEhzwb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:22:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qYx-0004DG-DL; Thu, 26 May 2016 08:22:39 +0000 Date: Thu, 26 May 2016 01:22:39 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: test copy-on-write leftover recovery Message-ID: <20160526082239.GA10683@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: test copy-on-write leftover recovery References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424224300.6278.15812903283890243005.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424224300.6278.15812903283890243005.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464250961 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:23:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D5FE7CA0 for ; Thu, 26 May 2016 03:23:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4DEB8F8040 for ; Thu, 26 May 2016 01:23:19 -0700 (PDT) X-ASG-Debug-ID: 1464250997-04cbb03569909400001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vMwRY1QSiBvgXiWe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:23:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qZY-0004FG-FQ; Thu, 26 May 2016 08:23:16 +0000 Date: Thu, 26 May 2016 01:23:16 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 4/7] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion Message-ID: <20160526082316.GB10683@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424224949.6278.1122385565512290875.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424224949.6278.1122385565512290875.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464250998 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:24:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 65F777CA0 for ; Thu, 26 May 2016 03:24:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD7BFAC005 for ; Thu, 26 May 2016 01:24:28 -0700 (PDT) X-ASG-Debug-ID: 1464251066-04cbb03568909460001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id XBnfpSsfxtkDFum7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:24:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qad-0004IZ-QE; Thu, 26 May 2016 08:24:23 +0000 Date: Thu, 26 May 2016 01:24:23 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, fstests@vger.kernel.org, Christoph Hellwig , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/7] reflink: test interaction with swap files Message-ID: <20160526082423.GC10683@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/7] reflink: test interaction with swap files References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424225618.6278.13884344251723851779.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424225618.6278.13884344251723851779.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464251066 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 456 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, May 25, 2016 at 10:57:36PM -0700, Darrick J. Wong wrote: > Since none of the current filesystems support reflinked swap files, > make sure that we prohibit reflinking of swapfiles and swapon of > reflinked files. Ah, thanks. I've actually prepared a patch to fix swapon in the kernel and was about to start writing test cases for it. I hope you haven't also done the kernel work already :) Reviewed-by: Christoph Hellwig From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 03:24:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 876607CA0 for ; Thu, 26 May 2016 03:24:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 37EE08F804B for ; Thu, 26 May 2016 01:24:53 -0700 (PDT) X-ASG-Debug-ID: 1464251090-04bdf05ad690d950001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 0HyvmqmnVG3Y72Ld (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 01:24:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5qb3-0004Jz-IJ; Thu, 26 May 2016 08:24:49 +0000 Date: Thu, 26 May 2016 01:24:49 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 7/7] reflink: test changing sharers of a block while keeping refcount the same Message-ID: <20160526082449.GD10683@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 7/7] reflink: test changing sharers of a block while keeping refcount the same References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424226985.6278.9226931712470818344.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424226985.6278.9226931712470818344.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464251090 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From eflorac@intellique.com Thu May 26 05:23:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4E677CA0 for ; Thu, 26 May 2016 05:23:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D44AAC005 for ; Thu, 26 May 2016 03:23:17 -0700 (PDT) X-ASG-Debug-ID: 1464258194-04bdf05ad7912c40001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id J5mVrkhY1dmrBgU2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 03:23:14 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id C96B5547C97; Thu, 26 May 2016 06:23:13 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 09147547C67; Thu, 26 May 2016 06:23:12 -0400 (EDT) Date: Thu, 26 May 2016 12:23:15 +0200 From: Emmanuel Florac To: Gionatan Danti Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: LVM snapshot and log record CRC mismatch Message-ID: <20160526122315.4112f713@harpe.intellique.com> X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch In-Reply-To: <57455645.5040608@assyoma.it> References: <20160524221205.GM21200@dastard> <57455645.5040608@assyoma.it> Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1464258194 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 899 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29917 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Wed, 25 May 2016 09:37:41 +0200 Gionatan Danti =C3=A9crivait: > The snapshot is accomplished using the following commands: >=20 > lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP > lvchange -ay -K hypervisor/Backup_SNAP > mount -o nouuid /dev/hypervisor/Backup_SNAP /mnt/lvm/ >=20 You need to use xfs_freeze to make the filesystem coherent before snapshot: xfs_freeze /dev/hypervisor/KVM_Storage lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP xfs_freeze -u /dev/hypervisor/KVM_Storage lvchange -ay -K hypervisor/Backup_SNAP --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From g.danti@assyoma.it Thu May 26 06:17:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 939DA7CA0 for ; Thu, 26 May 2016 06:17:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 64E888F8035 for ; Thu, 26 May 2016 04:17:18 -0700 (PDT) X-ASG-Debug-ID: 1464261434-04cbb03569911ed0001-NocioJ Received: from mr002msb.fastweb.it (mr002msb.fastweb.it [85.18.95.86]) by cuda.sgi.com with ESMTP id 5ucqAuQkc9S9RCvq for ; Thu, 26 May 2016 04:17:15 -0700 (PDT) X-Barracuda-Envelope-From: g.danti@assyoma.it X-Barracuda-Effective-Source-IP: mr002msb.fastweb.it[85.18.95.86] X-Barracuda-Apparent-Source-IP: 85.18.95.86 Received: from ceres.assyoma.it (93.63.55.57) by mr002msb.fastweb.it (8.5.140.04) id 5745BFCA000D0D16; Thu, 26 May 2016 13:17:13 +0200 Received: from gdanti-laptop.assyoma.it (unknown [172.31.255.5]) (using TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ceres.assyoma.it (Postfix) with ESMTPSA id D2E462002C1; Thu, 26 May 2016 13:17:12 +0200 (CEST) Subject: Re: LVM snapshot and log record CRC mismatch To: Emmanuel Florac X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch References: <20160524221205.GM21200@dastard> <57455645.5040608@assyoma.it> <20160526122315.4112f713@harpe.intellique.com> Cc: Dave Chinner , xfs@oss.sgi.com, Gionatan Danti From: Gionatan Danti Organization: Assyoma s.r.l. Message-ID: <5746DB30.5040006@assyoma.it> Date: Thu, 26 May 2016 13:17:04 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <20160526122315.4112f713@harpe.intellique.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mr002msb.fastweb.it[85.18.95.86] X-Barracuda-Start-Time: 1464261435 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 940 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29918 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 26/05/2016 12:23, Emmanuel Florac wrote: > Le Wed, 25 May 2016 09:37:41 +0200 > Gionatan Danti écrivait: > >> The snapshot is accomplished using the following commands: >> >> lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP >> lvchange -ay -K hypervisor/Backup_SNAP >> mount -o nouuid /dev/hypervisor/Backup_SNAP /mnt/lvm/ >> > > You need to use xfs_freeze to make the filesystem coherent before > snapshot: > > xfs_freeze /dev/hypervisor/KVM_Storage > lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP > xfs_freeze -u /dev/hypervisor/KVM_Storage > lvchange -ay -K hypervisor/Backup_SNAP > It was my understanding that filesystem freezing was automatically managed by LVM, and integrated into VFS long ago. I am missing something? -- Danti Gionatan Supporto Tecnico Assyoma S.r.l. - www.assyoma.it email: g.danti@assyoma.it - info@assyoma.it GPG public key ID: FF5F32A8 From eflorac@intellique.com Thu May 26 06:34:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 919BD7CA0 for ; Thu, 26 May 2016 06:34:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2B9CB304053 for ; Thu, 26 May 2016 04:34:25 -0700 (PDT) X-ASG-Debug-ID: 1464262460-04bdf05ad7915660001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id n2QRXdges8P98K5z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 04:34:22 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 8C98F547A6C; Thu, 26 May 2016 07:34:20 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id B6F96547C5B; Thu, 26 May 2016 07:34:19 -0400 (EDT) Date: Thu, 26 May 2016 13:34:22 +0200 From: Emmanuel Florac To: Gionatan Danti Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: LVM snapshot and log record CRC mismatch Message-ID: <20160526133422.32f65920@harpe.intellique.com> X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch In-Reply-To: <5746DB30.5040006@assyoma.it> References: <20160524221205.GM21200@dastard> <57455645.5040608@assyoma.it> <20160526122315.4112f713@harpe.intellique.com> <5746DB30.5040006@assyoma.it> Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1464262461 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 997 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29918 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Thu, 26 May 2016 13:17:04 +0200 Gionatan Danti =C3=A9crivait: > > > > You need to use xfs_freeze to make the filesystem coherent before > > snapshot: > > > > xfs_freeze /dev/hypervisor/KVM_Storage > > lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP > > xfs_freeze -u /dev/hypervisor/KVM_Storage > > lvchange -ay -K hypervisor/Backup_SNAP > > =20 >=20 > It was my understanding that filesystem freezing was automatically=20 > managed by LVM, and integrated into VFS long ago. >=20 > I am missing something? Yes, I thought that too, however it doesn't seem to be working in your case, and freezing twice can't do any harm anyway :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 08:02:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8D827CA0 for ; Thu, 26 May 2016 08:02:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54183AC005 for ; Thu, 26 May 2016 06:02:17 -0700 (PDT) X-ASG-Debug-ID: 1464267735-04cbb0356a915800001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 0shhvcrTgM3admho (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 06:02:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5uvW-0006r0-87; Thu, 26 May 2016 13:02:14 +0000 From: Christoph Hellwig To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com, linux-mm@kvack.org Subject: [PATCH] xfs: fail ->bmap for reflink inodes Date: Thu, 26 May 2016 15:02:04 +0200 X-ASG-Orig-Subj: [PATCH] xfs: fail ->bmap for reflink inodes Message-Id: <1464267724-31423-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1464267724-31423-1-git-send-email-hch@lst.de> References: <1464267724-31423-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=a Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464267735 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 888 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index a955552..d053a9e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1829,6 +1829,17 @@ xfs_vm_bmap( trace_xfs_vm_bmap(XFS_I(inode)); xfs_ilock(ip, XFS_IOLOCK_SHARED); + + /* + * The swap code (ab-)uses ->bmap to get a block mapping and then + * bypasseѕ the file system for actual I/O. We really can't allow + * that on reflinks inodes, so we have to skip out here. And yes, + * 0 is the magic code for a bmap error.. + */ + if (xfs_is_reflink_inode(ip)) { + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + return 0; + } filemap_write_and_wait(mapping); xfs_iunlock(ip, XFS_IOLOCK_SHARED); return generic_block_bmap(mapping, block, xfs_get_blocks); -- 2.1.4 From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 08:02:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F5EF7CA0 for ; Thu, 26 May 2016 08:02:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE26BAC005 for ; Thu, 26 May 2016 06:02:15 -0700 (PDT) X-ASG-Debug-ID: 1464267732-04cbb035699157e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GySFWJLHzOWZCDpl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 06:02:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5uvT-0006qt-CF; Thu, 26 May 2016 13:02:11 +0000 From: Christoph Hellwig To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com, linux-mm@kvack.org Subject: oh the joy of swap files Date: Thu, 26 May 2016 15:02:03 +0200 X-ASG-Orig-Subj: oh the joy of swap files Message-Id: <1464267724-31423-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464267733 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 345 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Quirk out of ->bmap for reflink inodes because the swap code still believes it's a good idea to blindly bypass the fs if it exists. This is a bit of a crude hack, but without redesigning how swapfiles work we can't really do very much better. Except for a real error code from ->bmap, but that's a bit like putting lipstick on a pig.. From jan@jvales.net Thu May 26 08:36:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1CE5C7CA0 for ; Thu, 26 May 2016 08:36:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E3D1F8F8040 for ; Thu, 26 May 2016 06:36:32 -0700 (PDT) X-ASG-Debug-ID: 1464269788-04cb6c2db99081d0001-NocioJ Received: from mail.somenet.org (mail.somenet.org [213.143.98.34]) by cuda.sgi.com with ESMTP id TML5B9dvy4e1CnBv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 06:36:29 -0700 (PDT) X-Barracuda-Envelope-From: jan@jvales.net X-Barracuda-Effective-Source-IP: mail.somenet.org[213.143.98.34] X-Barracuda-Apparent-Source-IP: 213.143.98.34 To: xfs@oss.sgi.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=jvales.net; s=default; t=1464269783; r=y; bh=ILpaHQNyG0nvoEue+H8hlVAXUEupQXLHKTfWsPO5+4s=; h=To:From; b=Yd3kj1mTQo55GwECynCaHWkk/AtVCvF0lrVN37lbAo97/1KFBZ0ZJRdDFnGElWF41 i/HvQlKINwpebydGPzahVnKV2gkLQfMd8IV6DzB2Q+VF3N+7LGufdLDD8lA4CNEh0m DRwdHDgZM5bnFR4iVwRrBLlaDibMKFfvb1CauSXw= From: Jan Vales Subject: remounting with "errors=remount-ro" in fstab fails. Message-ID: <5746FBD1.8010605@jvales.net> X-ASG-Orig-Subj: remounting with "errors=remount-ro" in fstab fails. Date: Thu, 26 May 2016 15:36:17 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.8.0 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="S9j1RGFGSVNxIFkOF1okEiCxgBDxWOOnq" X-Barracuda-Connect: mail.somenet.org[213.143.98.34] X-Barracuda-Start-Time: 1464269788 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: remounting with "errors=remount-ro" in fstab fails. X-Barracuda-Scan-Msg-Size: 653 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --S9j1RGFGSVNxIFkOF1okEiCxgBDxWOOnq Content-Type: multipart/mixed; boundary="t4LI3b4j0CJtqGlOt2GXxSf779nMQfovr" From: Jan Vales To: xfs@oss.sgi.com Message-ID: <5746FBD1.8010605@jvales.net> Subject: remounting with "errors=remount-ro" in fstab fails. --t4LI3b4j0CJtqGlOt2GXxSf779nMQfovr Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi there, I just updated to 4.6 kernel, and now i cannot remount / rw anymore. root@... # mount / -o remount,rw mount: / not mounted or bad option root@... # dmesg [...] XFS (md2): unknown mount option [errors=3Dremount-ro]. [...] root@... # cat /etc/fstab [...] /dev/sda / xfs ro,noatime,logbufs=3D8,errors=3Dremount-ro,inode64 0 1 [...] Was that change intentional? As in: shall i remove errors=3D... from fstab or is it a mistake? cheers, Jan Vales -- I only read plaintext emails. Someone @ irc://irc.fsinf.at:6667/tuwien webIRC: https://frost.fsinf.at/iris/ --t4LI3b4j0CJtqGlOt2GXxSf779nMQfovr-- --S9j1RGFGSVNxIFkOF1okEiCxgBDxWOOnq Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXRvvXAAoJEERD22thjA7q0WIQAL07J2iITAuS4qB14JtWQoRI zDv4bZG7MJQxXwPdqUqPPxjpQTM9NZ0RwC51WpxHF27NMucPZ3vtx1BFsR93v0vx TlosC0EUSZsg+9IiuCtWDD8/CKLNNr8OXzgqlFr188Jiu7N1pTAaPzUC/s6/zeX7 fVsyoK0E0ptuRWtQeLJQUZV37/GmeObsudgmHJXOOMfWtOLj2w/7B/TPM2+e+QPN irWbsyZDKvLBjq94cO+n7vWNXUs6swRMmdE4+JIrfGDwnZC6+sSv42m+6M4o5RLe I99Gxt1uUEia8NwpvW4t41wsSyOi05J0LVQDo17V20oF0HalxpM0iReMR/L3O4Ln ES7xwyHO6TLby/+8ZZwQdwCoF9WzUjjJS88A+PpjdIg+q0i0Dw0IKeAk/09AJyIw oXdv5vIEZWXoUcXf3PiR8Jizyese54dhghHGGciyB+mLIHYZfqHE+hQZnIITI5XG +ngspgF8bk1Dw9DWU7FuP/yzRDovX0UB8ygXVOMQcy79HVl/YcesXhjylAfpW5sS O6XZpJznFDKPG/UCGH5ipxUp0qfJX1TAWfKO5j6ayIauN+k9LLB4yTNu8WNJBCkA annTGrzkbsNHTv5U3EKF3nVd9YCJ5vLA9v+CMFfDk3VY0WqK1ozh+8G9bHRvKU35 05GFumcnQxY4Bit1TOB6 =9XlR -----END PGP SIGNATURE----- --S9j1RGFGSVNxIFkOF1okEiCxgBDxWOOnq-- From jan@jvales.net Thu May 26 08:38:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 453027CA0 for ; Thu, 26 May 2016 08:38:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04E06304048 for ; Thu, 26 May 2016 06:38:49 -0700 (PDT) X-ASG-Debug-ID: 1464269926-04bdf05ad691b180001-NocioJ Received: from mail.somenet.org (mail.somenet.org [213.143.98.34]) by cuda.sgi.com with ESMTP id XJo3i0Z5kNez1FwH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 06:38:47 -0700 (PDT) X-Barracuda-Envelope-From: jan@jvales.net X-Barracuda-Effective-Source-IP: mail.somenet.org[213.143.98.34] X-Barracuda-Apparent-Source-IP: 213.143.98.34 Subject: Re: remounting with "errors=remount-ro" in fstab fails. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=jvales.net; s=default; t=1464269925; r=y; bh=r9mOZCLMObZaD2eetRBfba7LQ7iS8jyaTSLaqBJ3GRI=; h=To:References:From; b=wuOaRV1Em1yl9KJsnZCmDbK4lHo0LDmXHXGlVwIAosEnIpJSYS3nNYDiMQROGLwUW g7WHFwpZBWF/kYXVFtoiaPfJBuyrVma54BtQc5zLTvqI+m1r8QoIV7kbvnRAyxycLI YwKOS97lTLU8s/tyuvbTq5hjymMd688cMrMd7NHc= X-ASG-Orig-Subj: Re: remounting with "errors=remount-ro" in fstab fails. To: xfs@oss.sgi.com References: <5746FBD1.8010605@jvales.net> From: Jan Vales Message-ID: <5746FC64.3010703@jvales.net> Date: Thu, 26 May 2016 15:38:44 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.8.0 MIME-Version: 1.0 In-Reply-To: <5746FBD1.8010605@jvales.net> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="hLgW1om0LtsdWm0DfxgNnBvLJobki0ElI" X-Barracuda-Connect: mail.somenet.org[213.143.98.34] X-Barracuda-Start-Time: 1464269927 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: remounting with "errors=remount-ro" in fstab fails. X-Barracuda-Scan-Msg-Size: 718 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --hLgW1om0LtsdWm0DfxgNnBvLJobki0ElI Content-Type: multipart/mixed; boundary="WISkRLW8v250n21hgr68SaRNX8Hsm3SNt" From: Jan Vales To: xfs@oss.sgi.com Message-ID: <5746FC64.3010703@jvales.net> Subject: Re: remounting with "errors=remount-ro" in fstab fails. References: <5746FBD1.8010605@jvales.net> In-Reply-To: <5746FBD1.8010605@jvales.net> --WISkRLW8v250n21hgr68SaRNX8Hsm3SNt Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 05/26/2016 03:36 PM, Jan Vales wrote: > Hi there, >=20 > I just updated to 4.6 kernel, and now i cannot remount / rw anymore. >=20 > root@... # mount / -o remount,rw > mount: / not mounted or bad option >=20 > root@... # dmesg > [...] > XFS (md2): unknown mount option [errors=3Dremount-ro]. > [...] >=20 > root@... # cat /etc/fstab > [...] > /dev/sda / xfs ro,noatime,logbufs=3D8,errors=3Dremount-ro,inode64 0 1 > [...] /dev/md2, my fail, I removed the uuid here for readability. >=20 > Was that change intentional? > As in: shall i remove errors=3D... from fstab or is it a mistake? >=20 cheers, Jan Vales -- I only read plaintext emails. --WISkRLW8v250n21hgr68SaRNX8Hsm3SNt-- --hLgW1om0LtsdWm0DfxgNnBvLJobki0ElI Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXRvxlAAoJEERD22thjA7qHNgP/R/luIJWPabN06PSDKDOXg9D EhUaFvLswIB1uHOC5nn8dJczoq/x0lls6iOWgQzZO6aBVQTXdpG3+oIG7IbffEo6 uGoTr4JF1n/kTROxFs4Qnow5h9riTVwbbNhh6QcPBuQIJPddoeHfNa18zOllYGq1 zgo20InMhHm5u0bs3dmBzbBjOw/fmav38eNBSgyj6WokFDLlchPF+iQxze008Hxn 2QIrKxymdqmN0B3M5KL8aOVKenZ+JwyOhEMx12psRriSL2w2VmXiip1fDobyfh5V gwjAnzPly3iEMShskSUsi3lmLjknsIWgZaeOg1vp2uDGmrNCKpSHrjrybQZACFr8 wX8ipSNHkwg6OeM5xc6I/hgvElm2UquFUL5UA3U1YAa2u3CFvOIH0ljx00Kk5A1q 4C4IM87IH4MhIDNyGmPF6E8azJ7IeyifTr6NTxb1Iw/kU3hqt1LlhTyD5f+b3CZ+ daAJ6QbNAGdYOkuq9lKBFg9M8Y/5DgwOntiYy6Y541yIgJCRP0hqx4bF+8W+K6O5 UdM8J2NRrKjyJ20oiWHIyHmHcLAW+MWLLKiR2OX0UctQpkML4bW99Wevlo1Y5DHE I3nKS8nHzpMEyPSj76X2XZAc3JDA2ruMu41zKPv+UN4oCTwRmR8FmGi6eiC1075L eCumm/YVedDKCEiEdbTg =GHHk -----END PGP SIGNATURE----- --hLgW1om0LtsdWm0DfxgNnBvLJobki0ElI-- From BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org Thu May 26 08:43:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B836D7CA0 for ; Thu, 26 May 2016 08:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 885C830404E for ; Thu, 26 May 2016 06:43:00 -0700 (PDT) X-ASG-Debug-ID: 1464270178-04cbb03568917670001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id g7DHDZ5CV8lWGjbn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 06:42:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c9f3c4132a8228b8270c+4659+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5vYv-0006WU-Pw; Thu, 26 May 2016 13:42:57 +0000 Date: Thu, 26 May 2016 06:42:57 -0700 From: Christoph Hellwig To: Jan Vales Cc: xfs@oss.sgi.com Subject: Re: remounting with "errors=remount-ro" in fstab fails. Message-ID: <20160526134257.GA2272@infradead.org> X-ASG-Orig-Subj: Re: remounting with "errors=remount-ro" in fstab fails. References: <5746FBD1.8010605@jvales.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5746FBD1.8010605@jvales.net> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464270178 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 185 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS The option was never actually supported. We used to ignore unknown options for remount only, I guess that's why it used to work for you. So yes, you can safely remove the option. From jan@jvales.net Thu May 26 08:44:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF5E87CA0 for ; Thu, 26 May 2016 08:44:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FBF4304062 for ; Thu, 26 May 2016 06:44:08 -0700 (PDT) X-ASG-Debug-ID: 1464270239-04bdf05ad591b680001-NocioJ Received: from mail.somenet.org (mail.somenet.org [213.143.98.34]) by cuda.sgi.com with ESMTP id zZIDtal5vHNguFnu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 06:44:01 -0700 (PDT) X-Barracuda-Envelope-From: jan@jvales.net X-Barracuda-Effective-Source-IP: mail.somenet.org[213.143.98.34] X-Barracuda-Apparent-Source-IP: 213.143.98.34 Subject: Re: remounting with "errors=remount-ro" in fstab fails. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=jvales.net; s=default; t=1464270239; r=y; bh=3M6SZvq1wwzhfZkgxQrE6cRtUXk9R7n6m2q7olDW0UM=; h=To:References:From; b=lEdbelVK790SjoKYE0sBklZIwJYKgtrMqWSGdZYvoHE4LM24Fk+0SSvsFci0WRaPS vtmJqH7FoFKnzRjDM4zFW0QC3n2fOxujaGLAxLIWsG0LBvog7h2zxzvX5z2wjcKNWO +SWXYjkSOeNvTVo9C3GL+IhDjcXYMxEs5yDTNOKE= X-ASG-Orig-Subj: Re: remounting with "errors=remount-ro" in fstab fails. To: Christoph Hellwig References: <5746FBD1.8010605@jvales.net> <20160526134257.GA2272@infradead.org> Cc: xfs@oss.sgi.com From: Jan Vales Message-ID: <5746FD9A.4020309@jvales.net> Date: Thu, 26 May 2016 15:43:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.8.0 MIME-Version: 1.0 In-Reply-To: <20160526134257.GA2272@infradead.org> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="rXK7ltT6Dp12ndm65pomOaqJci8KHfgCJ" X-Barracuda-Connect: mail.somenet.org[213.143.98.34] X-Barracuda-Start-Time: 1464270240 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: remounting with "errors=remount-ro" in fstab fails. X-Barracuda-Scan-Msg-Size: 514 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --rXK7ltT6Dp12ndm65pomOaqJci8KHfgCJ Content-Type: multipart/mixed; boundary="1hkWTEITB1QN3DuprWv3xvN7hjxWlsdH2" From: Jan Vales To: Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <5746FD9A.4020309@jvales.net> Subject: Re: remounting with "errors=remount-ro" in fstab fails. References: <5746FBD1.8010605@jvales.net> <20160526134257.GA2272@infradead.org> In-Reply-To: <20160526134257.GA2272@infradead.org> --1hkWTEITB1QN3DuprWv3xvN7hjxWlsdH2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 05/26/2016 03:42 PM, Christoph Hellwig wrote: > The option was never actually supported. We used to ignore unknown > options for remount only, I guess that's why it used to work for you. >=20 > So yes, you can safely remove the option. >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 ty. cheers, Jan Vales -- I only read plaintext emails. --1hkWTEITB1QN3DuprWv3xvN7hjxWlsdH2-- --rXK7ltT6Dp12ndm65pomOaqJci8KHfgCJ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXRv2eAAoJEERD22thjA7qoVUQANF+o8rz9kZO7lvXZ1mstzhh 9iM9vjvvcAeGlMBqFjmt3XOVsUuRBro4YyhPeo2ptZkAhRut3XipDPrNwrWgrKZy e+X0QHFCNbR/biYGuqVRjbLOE1nqoH/aDdz7b7BAePQC1/i862odMSUCAZXlh70B cn1hCJbs9sQhZyqnpkdk1DPBRuVShyXSg6LkzuLQ39WuSFbUUXZCudO+xjvGUzEr swvjFCJjYl2AdKU55aLettMZMmlsjNtR9zpXOpUq39eb6i5KHicsAlbPk6PXwYV0 ZHYzebmk/OVSGcclr4/7k6qb8SpQV8cJtp5cj5a+efbU4Ec62D+fU+GQRuYcwr53 fzp8Dc5FcNQlYm87WRTJZgNaK1r0YfQIjxR+Nhtue7nOcASJO8FYwYbREiDH3hBT DqwNO75aVt+N0TZRM9izC4MSb494tDlXI5JVfDeY0H9aAmEknxs7xY8MkZf3VriV Mt7D7hXmgh7F7Ylp9wvJRmrH+EBXrYmggCeLJoRUYziJYVa0WA36vDMp4x3dOq8G evnS7TIx8haDZRloPRgxds+B4KxOAVo+4ry1/KcD00CmGze8zSfiN+1JqwwWfFOS BQCjh6Ep/C6hC18F/9TUsLRvwMRS0aolcfoVgPDNjBI7RC2tPOX6KfAYUuEudWdC 0VRqqE1DjW75SSx2APaB =pe7E -----END PGP SIGNATURE----- --rXK7ltT6Dp12ndm65pomOaqJci8KHfgCJ-- From darrick.wong@oracle.com Thu May 26 11:07:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D4E57CA0 for ; Thu, 26 May 2016 11:07:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F4D28F804B for ; Thu, 26 May 2016 09:07:41 -0700 (PDT) X-ASG-Debug-ID: 1464278859-04cb6c2dba90fd30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id UfPxKBYSJzdhksPn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 09:07:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4QG766C003644 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:07:07 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4QG76Cu019450 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:07:06 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4QG72jq006294; Thu, 26 May 2016 16:07:03 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 09:07:02 -0700 Date: Thu, 26 May 2016 09:07:01 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/7] tests: don't put loop control files on the scratch mount Message-ID: <20160526160701.GA16512@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 2/7] tests: don't put loop control files on the scratch mount References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> <20160526080948.GC20307@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160526080948.GC20307@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464278859 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 221 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 26, 2016 at 01:09:48AM -0700, Christoph Hellwig wrote: > Shouldn't these tests also add a _require_test now? But we probably > should just move them to /tmp instead? Yes. I'll move 'em to /tmp. --D From darrick.wong@oracle.com Thu May 26 11:13:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E08EE7CA0 for ; Thu, 26 May 2016 11:13:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AFBEE304048 for ; Thu, 26 May 2016 09:13:27 -0700 (PDT) X-ASG-Debug-ID: 1464279205-04cb6c2dba910120001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id txNXmlbyxT0sWqUC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 09:13:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4QGD1G0025941 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:13:01 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4QGD0LP005958 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:13:00 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4QGCwv7008682; Thu, 26 May 2016 16:12:59 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 09:12:58 -0700 Date: Thu, 26 May 2016 09:12:57 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record Message-ID: <20160526161257.GB16512@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> <20160526080424.GA8469@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160526080424.GA8469@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464279206 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1044 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 26, 2016 at 01:04:24AM -0700, Christoph Hellwig wrote: > > --- a/src/t_immutable.c > > +++ b/src/t_immutable.c > > @@ -38,10 +38,10 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > -#include > > #include > > > > #ifndef XFS_SUPER_MAGIC > > How does this belong into the patch? It doesn't, this somehow jumped patches when I rebased. :/ > > diff --git a/tests/xfs/group b/tests/xfs/group > > index f0ca410..0e34f9a 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -288,3 +288,4 @@ > > 853 auto quick clone > > 854 auto quick clone > > 855 auto clone > > +856 auto clone rmap reflink > > This is the only test in the reflink group, how is this group different > from the clone one? I'm just gonna say 'thinko' and respin. :) /me pours a larger cup of coffee... (Thx for the review!) --D From jack@suse.cz Thu May 26 11:20:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 613D97CA2 for ; Thu, 26 May 2016 11:20:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25E3E304039 for ; Thu, 26 May 2016 09:20:12 -0700 (PDT) X-ASG-Debug-ID: 1464279608-04cbb03569921b80001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id vdzdVPtrC1nXPGpx (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:09 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 11306AB5D; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 867FB1E0DD2; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Date: Thu, 26 May 2016 18:19:57 +0200 X-ASG-Orig-Subj: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Message-Id: <1464279600-13009-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2003 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. ceph_setattr() has the dentry easily available but __ceph_setattr() is also called from ceph_set_acl() where dentry is not easily available. Luckily that call path does not need inode_change_ok() to be called anyway. So reorganize functions a bit so that inode_change_ok() is called only from paths where dentry is available. Signed-off-by: Jan Kara --- fs/ceph/acl.c | 5 +++++ fs/ceph/inode.c | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 013151d50069..a2cedfde75eb 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -127,6 +127,11 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) goto out_free; } + if (ceph_snap(inode) != CEPH_NOSNAP) { + ret = -EROFS; + goto out_free; + } + if (new_mode != old_mode) { newattrs.ia_mode = new_mode; newattrs.ia_valid = ATTR_MODE; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index e669cfa9d793..29873cbd6b2b 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1791,13 +1791,6 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr) int inode_dirty_flags = 0; bool lock_snap_rwsem = false; - if (ceph_snap(inode) != CEPH_NOSNAP) - return -EROFS; - - err = inode_change_ok(inode, attr); - if (err != 0) - return err; - prealloc_cf = ceph_alloc_cap_flush(); if (!prealloc_cf) return -ENOMEM; @@ -2011,7 +2004,17 @@ out_put: */ int ceph_setattr(struct dentry *dentry, struct iattr *attr) { - return __ceph_setattr(d_inode(dentry), attr); + struct inode *inode = d_inode(dentry); + int err; + + if (ceph_snap(inode) != CEPH_NOSNAP) + return -EROFS; + + err = inode_change_ok(inode, attr); + if (err != 0) + return err; + + return __ceph_setattr(inode, attr); } /* -- 2.6.6 From jack@suse.cz Thu May 26 11:20:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8DA527CA4 for ; Thu, 26 May 2016 11:20:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 418308F804B for ; Thu, 26 May 2016 09:20:12 -0700 (PDT) X-ASG-Debug-ID: 1464279608-04bdf05ad4924860001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id D7DWnDcESfDKwCtn (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:10 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 092BCAB1A; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 88BBA1E0DF5; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() Date: Thu, 26 May 2016 18:19:58 +0200 X-ASG-Orig-Subj: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() Message-Id: <1464279600-13009-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2463 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. Propagate it down to fuse_do_setattr(). Signed-off-by: Jan Kara --- fs/fuse/dir.c | 7 ++++--- fs/fuse/file.c | 2 +- fs/fuse/fuse_i.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index b9419058108f..4a613d1e9e75 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1586,9 +1586,10 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff) * vmtruncate() doesn't allow for this case, so do the rlimit checking * and the actual truncation by hand. */ -int fuse_do_setattr(struct inode *inode, struct iattr *attr, +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, struct file *file) { + struct inode *inode = d_inode(dentry); struct fuse_conn *fc = get_fuse_conn(inode); struct fuse_inode *fi = get_fuse_inode(inode); FUSE_ARGS(args); @@ -1702,9 +1703,9 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) return -EACCES; if (attr->ia_valid & ATTR_FILE) - return fuse_do_setattr(inode, attr, attr->ia_file); + return fuse_do_setattr(entry, attr, attr->ia_file); else - return fuse_do_setattr(inode, attr, NULL); + return fuse_do_setattr(entry, attr, NULL); } static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry, diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 9154f8679024..46d65f1a79d2 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -2828,7 +2828,7 @@ static void fuse_do_truncate(struct file *file) attr.ia_file = file; attr.ia_valid |= ATTR_FILE; - fuse_do_setattr(inode, &attr, file); + fuse_do_setattr(file_dentry(file), &attr, file); } static inline loff_t fuse_round_up(loff_t off) diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index eddbe02c4028..59a26446762b 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -951,7 +951,7 @@ bool fuse_write_update_size(struct inode *inode, loff_t pos); int fuse_flush_times(struct inode *inode, struct fuse_file *ff); int fuse_write_inode(struct inode *inode, struct writeback_control *wbc); -int fuse_do_setattr(struct inode *inode, struct iattr *attr, +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, struct file *file); void fuse_set_initialized(struct fuse_conn *fc); -- 2.6.6 From jack@suse.cz Thu May 26 11:20:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8835B7CA3 for ; Thu, 26 May 2016 11:20:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 496728F8040 for ; Thu, 26 May 2016 09:20:12 -0700 (PDT) X-ASG-Debug-ID: 1464279608-04bdf05ad7924870001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id XzXSrSTGqlVFyDwk (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:10 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 157BFAC6E; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 853F41E0734; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Date: Thu, 26 May 2016 18:19:56 +0200 X-ASG-Orig-Subj: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-Id: <1464279600-13009-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5657 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. Propagate dentry down to functions calling inode_change_ok(). This is rather straightforward except for xfs_set_mode() function which does not have dentry easily available. Luckily that function does not call inode_change_ok() anyway so we just have to do a little dance with function prototypes. Signed-off-by: Jan Kara --- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 60 ++++++++++++++++++++++++++++++++++-------------------- fs/xfs/xfs_iops.h | 2 +- 5 files changed, 42 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 85ce3032f815..b562cc5faae1 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1024,7 +1024,7 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(file), &iattr); if (error) goto out_unlock; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606deee31..6adfc757d8c6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1724,7 +1724,7 @@ xfs_inactive_truncate( /* * Log the inode size first to prevent stale data exposure in the event * of a system crash before the truncate completes. See the related - * comment in xfs_setattr_size() for details. + * comment in xfs_vn_setattr_size() for details. */ ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcb6c19ce3ea..1d441bfacf59 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -731,7 +731,7 @@ xfs_ioc_space( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = bf->l_start; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(filp), &iattr); break; default: ASSERT(0); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index fb7dc61f4a29..ef050f69589b 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -527,6 +527,12 @@ xfs_setattr_time( inode->i_mtime = iattr->ia_mtime; } +/* + * Set non-size attributes of an inode. + * + * Caution: The caller of this function is responsible for calling + * inode_change_ok() or otherwise verifying the change is fine. + */ int xfs_setattr_nonsize( struct xfs_inode *ip, @@ -543,21 +549,6 @@ xfs_setattr_nonsize( struct xfs_dquot *udqp = NULL, *gdqp = NULL; struct xfs_dquot *olddquot1 = NULL, *olddquot2 = NULL; - trace_xfs_setattr(ip); - - /* If acls are being inherited, we already have this checked */ - if (!(flags & XFS_ATTR_NOACL)) { - if (mp->m_flags & XFS_MOUNT_RDONLY) - return -EROFS; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - error = inode_change_ok(inode, iattr); - if (error) - return error; - } - ASSERT((mask & ATTR_SIZE) == 0); /* @@ -731,14 +722,39 @@ out_trans_cancel: return error; } +static int +xfs_vn_setattr_nonsize( + struct dentry *dentry, + struct iattr *iattr) +{ + struct inode *inode = d_inode(dentry); + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + int error; + + trace_xfs_setattr(ip); + + if (mp->m_flags & XFS_MOUNT_RDONLY) + return -EROFS; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + error = inode_change_ok(inode, iattr); + if (error) + return error; + return xfs_setattr_nonsize(ip, iattr, 0); +} + /* * Truncate file. Must have write permission and not be a directory. */ int -xfs_setattr_size( - struct xfs_inode *ip, +xfs_vn_setattr_size( + struct dentry *dentry, struct iattr *iattr) { + struct xfs_inode *ip = XFS_I(d_inode(dentry)); struct xfs_mount *mp = ip->i_mount; struct inode *inode = VFS_I(ip); xfs_off_t oldsize, newsize; @@ -779,7 +795,7 @@ xfs_setattr_size( * Use the regular setattr path to update the timestamps. */ iattr->ia_valid &= ~ATTR_SIZE; - return xfs_setattr_nonsize(ip, iattr, 0); + return xfs_vn_setattr_nonsize(dentry, iattr); } /* @@ -936,11 +952,11 @@ xfs_vn_setattr( struct dentry *dentry, struct iattr *iattr) { - struct xfs_inode *ip = XFS_I(d_inode(dentry)); int error; if (iattr->ia_valid & ATTR_SIZE) { - uint iolock = XFS_IOLOCK_EXCL; + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + uint iolock = XFS_IOLOCK_EXCL; xfs_ilock(ip, iolock); error = xfs_break_layouts(d_inode(dentry), &iolock, true); @@ -948,11 +964,11 @@ xfs_vn_setattr( xfs_ilock(ip, XFS_MMAPLOCK_EXCL); iolock |= XFS_MMAPLOCK_EXCL; - error = xfs_setattr_size(ip, iattr); + error = xfs_vn_setattr_size(dentry, iattr); } xfs_iunlock(ip, iolock); } else { - error = xfs_setattr_nonsize(ip, iattr, 0); + error = xfs_vn_setattr_nonsize(dentry, iattr); } return error; diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h index a0f84abb0d09..8648037a1c1b 100644 --- a/fs/xfs/xfs_iops.h +++ b/fs/xfs/xfs_iops.h @@ -33,6 +33,6 @@ extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); extern void xfs_setattr_time(struct xfs_inode *ip, struct iattr *iattr); extern int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); -extern int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap); +extern int xfs_vn_setattr_size(struct dentry *dentry, struct iattr *vap); #endif /* __XFS_IOPS_H__ */ -- 2.6.6 From jack@suse.cz Thu May 26 11:20:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FBE57CA2 for ; Thu, 26 May 2016 11:20:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41F8D304048 for ; Thu, 26 May 2016 09:20:14 -0700 (PDT) X-ASG-Debug-ID: 1464279611-04cb6c2db9910ba0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ShsweVOuIoWeGYOT (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:12 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 6DD2FACAE; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 8DA241E0DD9; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 5/5] fs: Avoid premature clearing of capabilities Date: Thu, 26 May 2016 18:20:00 +0200 X-ASG-Orig-Subj: [PATCH 5/5] fs: Avoid premature clearing of capabilities Message-Id: <1464279600-13009-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279611 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2051 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Currently, notify_change() clears capabilities or IMA attributes by calling security_inode_killpriv() before calling into ->setattr. Thus it happens before any other permission checks in inode_change_ok() and user is thus allowed to trigger clearing of capabilities or IMA attributes for any file he can look up e.g. by calling chown for that file. This is unexpected and can lead to user DoSing a system. Fix the problem by calling security_inode_killpriv() at the end of inode_change_ok() instead of from notify_change(). At that moment we are sure user has permissions to do the requested change. References: CVE-2015-1350 Signed-off-by: Jan Kara --- fs/attr.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index ee758afc1695..8d9698eda636 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -47,7 +47,7 @@ int setattr_prepare(struct dentry *dentry, struct iattr *attr) /* If force is set do it anyway. */ if (ia_valid & ATTR_FORCE) - return 0; + goto kill_priv; /* Make sure a caller can chown. */ if ((ia_valid & ATTR_UID) && @@ -80,6 +80,16 @@ int setattr_prepare(struct dentry *dentry, struct iattr *attr) return -EPERM; } +kill_priv: + /* User has permission for the change */ + if (ia_valid & ATTR_KILL_PRIV) { + int error; + + error = security_inode_killpriv(dentry); + if (error) + return error; + } + return 0; } EXPORT_SYMBOL(setattr_prepare); @@ -220,13 +230,11 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de if (!(ia_valid & ATTR_MTIME_SET)) attr->ia_mtime = now; if (ia_valid & ATTR_KILL_PRIV) { - attr->ia_valid &= ~ATTR_KILL_PRIV; - ia_valid &= ~ATTR_KILL_PRIV; error = security_inode_need_killpriv(dentry); - if (error > 0) - error = security_inode_killpriv(dentry); - if (error) + if (error < 0) return error; + if (error == 0) + ia_valid = attr->ia_valid &= ~ATTR_KILL_PRIV; } /* -- 2.6.6 From jack@suse.cz Thu May 26 11:20:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF7C07CA2 for ; Thu, 26 May 2016 11:20:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91EBB304048 for ; Thu, 26 May 2016 09:20:14 -0700 (PDT) X-ASG-Debug-ID: 1464279608-04cbb0356a921b80001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id aqHKwFR8f6iRTUTT (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:09 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 3FE18AC77; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 8BC151E0DF8; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Date: Thu, 26 May 2016 18:19:59 +0200 X-ASG-Orig-Subj: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Message-Id: <1464279600-13009-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 28695 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC0_MV0713 Custom rule MV0713 inode_change_ok() will be resposible for clearing capabilities and IMA extended attributes and as such will need dentry. Give it as an argument to inode_change_ok() instead of an inode. Also rename inode_change_ok() to setattr_prepare() to better relect that it does also some modifications in addition to checks. Signed-off-by: Jan Kara --- Documentation/filesystems/porting | 4 ++-- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/vfs_inode.c | 2 +- fs/9p/vfs_inode_dotl.c | 2 +- fs/adfs/inode.c | 2 +- fs/affs/inode.c | 2 +- fs/attr.c | 15 +++++++++------ fs/btrfs/inode.c | 2 +- fs/ceph/inode.c | 2 +- fs/cifs/inode.c | 4 ++-- fs/ecryptfs/inode.c | 2 +- fs/exofs/inode.c | 2 +- fs/ext2/inode.c | 2 +- fs/ext4/inode.c | 2 +- fs/f2fs/file.c | 2 +- fs/fat/file.c | 2 +- fs/fuse/dir.c | 2 +- fs/gfs2/inode.c | 2 +- fs/hfs/inode.c | 2 +- fs/hfsplus/inode.c | 2 +- fs/hostfs/hostfs_kern.c | 2 +- fs/hpfs/inode.c | 2 +- fs/hugetlbfs/inode.c | 2 +- fs/jffs2/fs.c | 2 +- fs/jfs/file.c | 2 +- fs/kernfs/inode.c | 2 +- fs/libfs.c | 2 +- fs/logfs/file.c | 2 +- fs/minix/file.c | 2 +- fs/ncpfs/inode.c | 2 +- fs/nfsd/nfsproc.c | 8 +++----- fs/nilfs2/inode.c | 2 +- fs/ntfs/inode.c | 2 +- fs/ocfs2/dlmfs/dlmfs.c | 2 +- fs/ocfs2/file.c | 2 +- fs/omfs/file.c | 2 +- fs/orangefs/inode.c | 2 +- fs/overlayfs/inode.c | 2 +- fs/proc/base.c | 2 +- fs/proc/generic.c | 2 +- fs/proc/proc_sysctl.c | 2 +- fs/ramfs/file-nommu.c | 2 +- fs/reiserfs/inode.c | 2 +- fs/sysv/file.c | 2 +- fs/ubifs/file.c | 2 +- fs/udf/file.c | 2 +- fs/ufs/inode.c | 2 +- fs/utimes.c | 4 ++-- fs/xfs/xfs_iops.c | 6 +++--- include/linux/fs.h | 2 +- mm/shmem.c | 2 +- 51 files changed, 66 insertions(+), 65 deletions(-) diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 46f3bb7a02f5..53cdcbc02257 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -287,8 +287,8 @@ implementing on-disk size changes. Start with a copy of the old inode_setattr and vmtruncate, and the reorder the vmtruncate + foofs_vmtruncate sequence to be in order of zeroing blocks using block_truncate_page or similar helpers, size update and on finally on-disk truncation which should not fail. -inode_change_ok now includes the size checks for ATTR_SIZE and must be called -in the beginning of ->setattr unconditionally. +setattr_prepare (which used to be inode_change_ok) now includes the size checks +for ATTR_SIZE and must be called in the beginning of ->setattr unconditionally. [mandatory] diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index 96c7e9fc6e5f..892574db2097 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1249,7 +1249,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import) attr->ia_valid |= ATTR_MTIME | ATTR_CTIME; } - /* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */ + /* POSIX: check before ATTR_*TIME_SET set (from setattr_prepare) */ if (attr->ia_valid & TIMES_SET_FLAGS) { if ((!uid_eq(current_fsuid(), inode->i_uid)) && !capable(CFS_CAP_FOWNER)) diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index f4645c515262..563c907e9059 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1094,7 +1094,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) struct p9_wstat wstat; p9_debug(P9_DEBUG_VFS, "\n"); - retval = inode_change_ok(d_inode(dentry), iattr); + retval = setattr_prepare(dentry, iattr); if (retval) return retval; diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index a34702c998f5..5b0f37bf93b9 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -560,7 +560,7 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr) p9_debug(P9_DEBUG_VFS, "\n"); - retval = inode_change_ok(inode, iattr); + retval = setattr_prepare(dentry, iattr); if (retval) return retval; diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c index 335055d828e4..f57baaa511aa 100644 --- a/fs/adfs/inode.c +++ b/fs/adfs/inode.c @@ -303,7 +303,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid = attr->ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); /* * we can't change the UID or GID of any file - diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 0fdb0f5b2239..1aa243502c7f 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -219,7 +219,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr) pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid); - error = inode_change_ok(inode,attr); + error = setattr_prepare(dentry, attr); if (error) goto out; diff --git a/fs/attr.c b/fs/attr.c index 25b24d0f6c88..ee758afc1695 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,19 +17,22 @@ #include /** - * inode_change_ok - check if attribute changes to an inode are allowed - * @inode: inode to check + * setattr_prepare - check if attribute changes to a dentry are allowed + * @dentry: dentry to check * @attr: attributes to change * * Check if we are allowed to change the attributes contained in @attr - * in the given inode. This includes the normal unix access permission - * checks, as well as checks for rlimits and others. + * in the given dentry. This includes the normal unix access permission + * checks, as well as checks for rlimits and others. The function also clears + * SGID bit from mode if user is not allowed to set it. Also file capabilities + * and IMA extended attributes are cleared if ATTR_KILL_PRIV is set. * * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int setattr_prepare(struct dentry *dentry, struct iattr *attr) { + struct inode *inode = d_inode(dentry); unsigned int ia_valid = attr->ia_valid; /* @@ -79,7 +82,7 @@ int inode_change_ok(const struct inode *inode, struct iattr *attr) return 0; } -EXPORT_SYMBOL(inode_change_ok); +EXPORT_SYMBOL(setattr_prepare); /** * inode_newsize_ok - may this inode be truncated to a given size diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 91419ef79b00..e912feca9b08 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5029,7 +5029,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) if (btrfs_root_readonly(root)) return -EROFS; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 29873cbd6b2b..e0bd3bb332f4 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -2010,7 +2010,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) if (ceph_snap(inode) != CEPH_NOSNAP) return -EROFS; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err != 0) return err; diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 514dadb0575d..568fafe403c2 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -2136,7 +2136,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) attrs->ia_valid |= ATTR_FORCE; - rc = inode_change_ok(inode, attrs); + rc = setattr_prepare(direntry, attrs); if (rc < 0) goto out; @@ -2276,7 +2276,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) attrs->ia_valid |= ATTR_FORCE; - rc = inode_change_ok(inode, attrs); + rc = setattr_prepare(direntry, attrs); if (rc < 0) { free_xid(xid); return rc; diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 318b04689d76..b916b227b917 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -927,7 +927,7 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) } mutex_unlock(&crypt_stat->cs_mutex); - rc = inode_change_ok(inode, ia); + rc = setattr_prepare(dentry, ia); if (rc) goto out; if (ia->ia_valid & ATTR_SIZE) { diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index 9dc4c6dbf3c9..5e68daee5fe4 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c @@ -1034,7 +1034,7 @@ int exofs_setattr(struct dentry *dentry, struct iattr *iattr) if (unlikely(error)) return error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (unlikely(error)) return error; diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index b675610391b8..90386a2037cf 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -1570,7 +1570,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f7140ca66e3b..b87abc428cea 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5044,7 +5044,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) int orphan = 0; const unsigned int ia_valid = attr->ia_valid; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index f4c0086655c4..215c65527a9f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -688,7 +688,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) struct f2fs_inode_info *fi = F2FS_I(inode); int err; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/fat/file.c b/fs/fat/file.c index f70185668832..c09ab4e108e5 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -450,7 +450,7 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr) attr->ia_valid &= ~TIMES_SET_FLAGS; } - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); attr->ia_valid = ia_valid; if (error) { if (sbi->options.quiet) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 4a613d1e9e75..cbedc6e82813 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1604,7 +1604,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS)) attr->ia_valid |= ATTR_FORCE; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 21dc784f66c2..a6786e92db9f 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1889,7 +1889,7 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr) if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) goto out; diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 8eed66af5b82..5f0c73e4f380 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -605,7 +605,7 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr) struct hfs_sb_info *hsb = HFS_SB(inode->i_sb); int error; - error = inode_change_ok(inode, attr); /* basic permission checks */ + error = setattr_prepare(dentry, attr); /* basic permission checks */ if (error) return error; diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index ef9fefe364a6..210b75181b3b 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -245,7 +245,7 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 5c57654927a6..f26cf2b3a011 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -812,7 +812,7 @@ static int hostfs_setattr(struct dentry *dentry, struct iattr *attr) int fd = HOSTFS_I(inode)->fd; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 1f3c6d76200b..b9c724ed1e7e 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -273,7 +273,7 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr) if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) goto out_unlock; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) goto out_unlock; diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ea71eba40a5..fb3312f2c861 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -672,7 +672,7 @@ static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr) BUG_ON(!inode); - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index ae2ebb26b446..3773b24b4db0 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c @@ -193,7 +193,7 @@ int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int rc; - rc = inode_change_ok(inode, iattr); + rc = setattr_prepare(dentry, iattr); if (rc) return rc; diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 7f1a585a0a94..cf62037b8a04 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -103,7 +103,7 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int rc; - rc = inode_change_ok(inode, iattr); + rc = setattr_prepare(dentry, iattr); if (rc) return rc; diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index 1719649d7ad7..b7ee5d543671 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -122,7 +122,7 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr) return -EINVAL; mutex_lock(&kernfs_mutex); - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) goto out; diff --git a/fs/libfs.c b/fs/libfs.c index 8765ff1adc07..3ac3792dc82e 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -363,7 +363,7 @@ int simple_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/logfs/file.c b/fs/logfs/file.c index f01ddfb1a03b..5d9fe466bbc9 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c @@ -244,7 +244,7 @@ static int logfs_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int err = 0; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/minix/file.c b/fs/minix/file.c index 94f0eb9a6e2c..a6a4797aa0d4 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c @@ -26,7 +26,7 @@ static int minix_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 1af15fcbe57b..f6cf4c7e92b1 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -884,7 +884,7 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr) /* ageing the dentry to force validation */ ncp_age_dentry(server, dentry); - result = inode_change_ok(inode, attr); + result = setattr_prepare(dentry, attr); if (result < 0) goto out; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 4cd78ef4c95c..44f6f4f5eee0 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -74,10 +74,10 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, * which only requires access, and "set-[ac]time-to-X" which * requires ownership. * So if it looks like it might be "set both to the same time which - * is close to now", and if inode_change_ok fails, then we + * is close to now", and if setattr_prepare fails, then we * convert to "set to now" instead of "set to explicit time" * - * We only call inode_change_ok as the last test as technically + * We only call setattr_prepare as the last test as technically * it is not an interface that we should be using. */ #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET) @@ -92,17 +92,15 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, * request is. We require it be within 30 minutes of now. */ time_t delta = iap->ia_atime.tv_sec - get_seconds(); - struct inode *inode; nfserr = fh_verify(rqstp, fhp, 0, NFSD_MAY_NOP); if (nfserr) goto done; - inode = d_inode(fhp->fh_dentry); if (delta < 0) delta = -delta; if (delta < MAX_TOUCH_TIME_ERROR && - inode_change_ok(inode, iap) != 0) { + setattr_prepare(fhp->fh_dentry, iap) != 0) { /* * Turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME. * This will cause notify_change to set these times diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index a0ebdb17e912..a425d5e12421 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -832,7 +832,7 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr) struct super_block *sb = inode->i_sb; int err; - err = inode_change_ok(inode, iattr); + err = setattr_prepare(dentry, iattr); if (err) return err; diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index f40972d6df90..effaf18c1991 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c @@ -2893,7 +2893,7 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) int err; unsigned int ia_valid = attr->ia_valid; - err = inode_change_ok(vi, attr); + err = setattr_prepare(dentry, attr); if (err) goto out; /* We do not support NTFS ACLs yet. */ diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c index 47b3b2d4e775..d71f538d0a18 100644 --- a/fs/ocfs2/dlmfs/dlmfs.c +++ b/fs/ocfs2/dlmfs/dlmfs.c @@ -211,7 +211,7 @@ static int dlmfs_file_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); attr->ia_valid &= ~ATTR_SIZE; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 4e7b0dc22450..1ab3657242e8 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -1155,7 +1155,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) if (!(attr->ia_valid & OCFS2_VALID_ATTRS)) return 0; - status = inode_change_ok(inode, attr); + status = setattr_prepare(dentry, attr); if (status) return status; diff --git a/fs/omfs/file.c b/fs/omfs/file.c index d9e26cfbb793..bf83e6644333 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c @@ -349,7 +349,7 @@ static int omfs_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c index 85640e955cde..02548d8102bf 100644 --- a/fs/orangefs/inode.c +++ b/fs/orangefs/inode.c @@ -222,7 +222,7 @@ int orangefs_setattr(struct dentry *dentry, struct iattr *iattr) "orangefs_setattr: called on %s\n", dentry->d_name.name); - ret = inode_change_ok(inode, iattr); + ret = setattr_prepare(dentry, iattr); if (ret) goto out; diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index c7b31a03dc9c..1bd9fe1d1294 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -51,7 +51,7 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) * inode_newsize_ok() will always check against MAX_LFS_FILESIZE and not * check for a swapfile (which this won't be anyway). */ - err = inode_change_ok(dentry->d_inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/proc/base.c b/fs/proc/base.c index a11eb7196ec8..785efca757f7 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -712,7 +712,7 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr) if (attr->ia_valid & ATTR_MODE) return -EPERM; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/proc/generic.c b/fs/proc/generic.c index c633476616e0..23ff30e3c1e7 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -105,7 +105,7 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) struct proc_dir_entry *de = PDE(inode); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 5e57c3e46e1d..e2892a8bb6ca 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -754,7 +754,7 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr) if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) return -EPERM; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index be3ddd189cd4..2bcbf4e77982 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -169,7 +169,7 @@ static int ramfs_nommu_setattr(struct dentry *dentry, struct iattr *ia) int ret = 0; /* POSIX UID/GID verification for setting inode attributes */ - ret = inode_change_ok(inode, ia); + ret = setattr_prepare(dentry, ia); if (ret) return ret; diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 825455d3e4ba..6558de94d497 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -3312,7 +3312,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/sysv/file.c b/fs/sysv/file.c index 82ddc09061e2..7ba997e31aeb 100644 --- a/fs/sysv/file.c +++ b/fs/sysv/file.c @@ -33,7 +33,7 @@ static int sysv_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 08316972ff93..2a18fda63aae 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1261,7 +1261,7 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr) dbg_gen("ino %lu, mode %#x, ia_valid %#x", inode->i_ino, inode->i_mode, attr->ia_valid); - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/udf/file.c b/fs/udf/file.c index 632570617327..2d61d9827e6f 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -247,7 +247,7 @@ static int udf_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 9f49431e798d..e4a4d248a0f5 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -1208,7 +1208,7 @@ int ufs_setattr(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid = attr->ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4f373d..9368ac446797 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -81,7 +81,7 @@ static int utimes_common(struct path *path, struct timespec *times) newattrs.ia_valid |= ATTR_MTIME_SET; } /* - * Tell inode_change_ok(), that this is an explicit time + * Tell setattr_prepare(), that this is an explicit time * update, even if neither ATTR_ATIME_SET nor ATTR_MTIME_SET * were used. */ @@ -90,7 +90,7 @@ static int utimes_common(struct path *path, struct timespec *times) /* * If times is NULL (or both times are UTIME_NOW), * then we need to check permissions, because - * inode_change_ok() won't do it. + * setattr_prepare() won't do it. */ error = -EACCES; if (IS_IMMUTABLE(inode)) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef050f69589b..5f93a3b96b3a 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -531,7 +531,7 @@ xfs_setattr_time( * Set non-size attributes of an inode. * * Caution: The caller of this function is responsible for calling - * inode_change_ok() or otherwise verifying the change is fine. + * setattr_prepare() or otherwise verifying the change is fine. */ int xfs_setattr_nonsize( @@ -740,7 +740,7 @@ xfs_vn_setattr_nonsize( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; return xfs_setattr_nonsize(ip, iattr, 0); @@ -771,7 +771,7 @@ xfs_vn_setattr_size( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/include/linux/fs.h b/include/linux/fs.h index 5f61431d8673..59a691cc9d3d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2977,7 +2977,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int setattr_prepare(struct dentry *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); diff --git a/mm/shmem.c b/mm/shmem.c index e418a995427d..51524d1285f5 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -641,7 +641,7 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr) struct shmem_inode_info *info = SHMEM_I(inode); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; -- 2.6.6 From jack@suse.cz Thu May 26 11:20:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 942EE7CB9 for ; Thu, 26 May 2016 11:20:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 039DFAC008 for ; Thu, 26 May 2016 09:20:12 -0700 (PDT) X-ASG-Debug-ID: 1464279608-04cbb0356b921b80001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id xJMCRPraFs22McHj (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 May 2016 09:20:09 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 066A9AAB6; Thu, 26 May 2016 16:20:08 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 826641E0DC5; Thu, 26 May 2016 18:20:07 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 0/5] fs: Avoid premature clearing of file capabilities Date: Thu, 26 May 2016 18:19:55 +0200 X-ASG-Orig-Subj: [PATCH 0/5] fs: Avoid premature clearing of file capabilities Message-Id: <1464279600-13009-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464279609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 672 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, this patch series is my attempt to fix an issue when user can clear capabilites of arbitrary file he can look up for example by running chown on it (this got assigned CVE-2015-1350). The problem is that we call security_inode_killpriv() before checking permissions in inode_change_ok(). This patch set moves that call into inode_change_ok() after permissions are checked - the only trouble is that we need to give dentry instead of inode there and that is not completely trivial in some cases - I'd like to have a review from XFS, Ceph, and FUSE people to verify I didn't miss anything. Anyway, have a look how the result looks like... Honza From prvs=1947dc4fbc=Alexandra.Johnson@ucps.k12.nc.us Thu May 26 11:23:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=HTML_MESSAGE,SINGLE_HEADER_2K, SUBJ_ALL_CAPS,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8FCF7CA4 for ; Thu, 26 May 2016 11:23:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B27D230404E for ; Thu, 26 May 2016 09:23:50 -0700 (PDT) X-ASG-Debug-ID: 1464279826-04cbb03569922170001-NocioJ Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0053.outbound.protection.outlook.com [207.46.100.53]) by cuda.sgi.com with ESMTP id AMdv9Tm0HsBdSYVs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO); Thu, 26 May 2016 09:23:47 -0700 (PDT) X-Barracuda-Envelope-From: prvs=1947dc4fbc=Alexandra.Johnson@ucps.k12.nc.us X-Barracuda-Effective-Source-IP: mail-by2on0053.outbound.protection.outlook.com[207.46.100.53] X-Barracuda-Apparent-Source-IP: 207.46.100.53 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucps.onmicrosoft.com; s=selector1-ucps-k12-nc-us; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=LCbu55pZ9qrnN5J6oD29RzwhWfBV+wxFwcWoOrby1HM=; b=jeT+nlG39MO/sN6uuXRoCb7SkLCdfGJ4e7c+XlzBmvZYIXFk+wdL4jW4cptSV8SiNs+zlJVD+1NZvjsTNvZwu7PQ6+LFRi2LffXWxIRJyUjVRklFRaYxMpGItHHs156C3xYi9hiakBeU6QGIzj8oQ0HFbKHD5p/48cZkkrQ+nMM= Received: from BY2PR02CA0121.namprd02.prod.outlook.com (10.163.44.175) by CY1PR02MB1264.namprd02.prod.outlook.com (10.163.16.157) with Microsoft SMTP Server (TLS) id 15.1.506.9; Thu, 26 May 2016 16:23:44 +0000 Received: from BL2FFO11OLC016.protection.gbl (2a01:111:f400:7c09::147) by BY2PR02CA0121.outlook.office365.com (2a01:111:e400:5261::47) with Microsoft SMTP Server (TLS) id 15.1.501.7 via Frontend Transport; Thu, 26 May 2016 16:23:44 +0000 Authentication-Results: spf=fail (sender IP is 152.26.69.180) smtp.mailfrom=ucps.k12.nc.us; osb.att.ne.jp; dkim=none (message not signed) header.d=none;osb.att.ne.jp; dmarc=none action=none header.from=ucps.k12.nc.us; Received-SPF: Fail (protection.outlook.com: domain of ucps.k12.nc.us does not designate 152.26.69.180 as permitted sender) receiver=protection.outlook.com; client-ip=152.26.69.180; helo=tscsophosef.ucps.k12.nc.us; Received: from tscsophosef.ucps.k12.nc.us (152.26.69.180) by BL2FFO11OLC016.mail.protection.outlook.com (10.173.160.82) with Microsoft SMTP Server id 15.1.497.8 via Frontend Transport; Thu, 26 May 2016 16:23:42 +0000 Received: from tscsophosef.ucps.k12.nc.us (localhost.localdomain [127.0.0.1]) by localhost (Email Security Appliance) with SMTP id 499E349CEED_747230EB; Thu, 26 May 2016 16:23:42 +0000 (GMT) Received: from webmail.ucps.k12.nc.us (ucpshtcas1.ucps.k12.nc.us [10.128.0.130]) by tscsophosef.ucps.k12.nc.us (Sophos Email Appliance) with ESMTP id C9E8D49CF04_74722EBF; Thu, 26 May 2016 16:23:07 +0000 (GMT) Received: from ucmbx2.ucps.k12.nc.us ([fe80::81bb:ce07:a228:6260]) by ucpshtcas1.ucps.k12.nc.us ([10.128.0.130]) with mapi id 14.03.0279.002; Thu, 26 May 2016 12:23:07 -0400 From: Alexandra Johnson To: "nnie.walker@ucps.K12.nc.us" Subject: NEW PROJECT Thread-Topic: NEW PROJECT X-ASG-Orig-Subj: NEW PROJECT Thread-Index: AdG3anA1V8OmSOi4SpuwVe46O1rOyQ== Date: Thu, 26 May 2016 16:23:06 +0000 Message-ID: <52FFD5475FFF2C4DA7FA64915B906446A4C3F011@ucmbx2.ucps.k12.nc.us> Reply-To: "annywang1956@outlook.com" Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.128.0.90] Content-Type: multipart/alternative; boundary="_000_52FFD5475FFF2C4DA7FA64915B906446A4C3F011ucmbx2ucpsk12nc_" MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:152.26.69.180;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(6039001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(9170700003)(55846006)(19580405001)(1220700001)(19580395003)(8936002)(8796002)(8666003)(2930100002)(586003)(2900100001)(2920100001)(19625215002)(6116002)(102836003)(3846002)(81166006)(2860700002)(260700001)(8676002)(87936001)(790700001)(221733001)(5000100001)(5004730100002)(85426001)(325944007)(84326002)(86372001)(77096005)(15975445007)(5003600100002)(17750500001)(189998001)(5008740100001)(107886002)(16236675004)(50986999)(110136002)(53806999)(54356999)(105606002)(564344004)(106466001)(3480700004)(43066003)(229853001)(2351001)(2501003)(19300405004)(74482002)(1240700005)(11100500001)(2906002)(33656002)(512954002)(19580200002)(7059030)(80862005)(215093002)(15528785004);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR02MB1264;H:tscsophosef.ucps.k12.nc.us;FPR:;SPF:Fail;MLV:nov;A:0;MX:1;PTR:InfoDomainNonexistent;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11OLC016;1:4KvR4deL6Ybz4Ubr2T++AM3OUSzeUi8a04feuiINaGj+KTpfaXppSkVQ36t+mERnt0Un6ONZv+0KeKio56TVI9MX2sF9zsB3tuK2qdb4/kLB3+2BxTNmd/cz0KgwXxxM/f/cc9N5QU78RZDOtXxdLatC/jLjPQWWoIY4AgSyMHzkN5ShKkDcCBpCyO4SnfPB5RttMd0RBI/E4BN8Zd99ScBCQlQPnghFkh6UFK0BKCmQ6r1BjKMnjIQcNngav+idxETgbLI8Z3qQqtpN1gv5UbPyTfP8nrxBM/1+lHcA7XFctRNqtPzwEQpVxX3pLAW6lB4p4b6SPDij54K/6YcR9ALLs0wIxrztcFxa7HE24Imy4RKE3yYcKZQdnzLa63ZXUXsjloqFzaopNBLOit8seX9t0+LnLVpWuB0HKqS5AqNLQM+qWEDhIusPgMxKhfMaKGHBF8bzg8ehAmgw1ln0vkV6gQyioiFyBq1yzHYE8NJ5ldn8d8u0xk36crtR9RTGmL0nVl/halHWaxayPTkNrf7imYWjhIXAo0stFuN1raPHNmI0PCELoomQCPB9GMhp X-MS-Office365-Filtering-Correlation-Id: 5a79fec8-c977-4071-5bd6-08d385821ab4 X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1264;2:l0/QjzUri08N/aQXPekLYf87I8J8mnv/YFBpHoLRl2FoypmY13yPGgrmJjLpbP0oca1zD0AKNmqt1gUmWNtZci9QKJfGmgnUyWLQNIR+WtjXQvkOP509T8k0q/BWX6JdX0s53uSt5Aj9aB8eRgcxDM8KYwYfClgNoVglC/i9gNscZy9ON7TfpSAG35LNHuuK;3:ye5I+dUdtK5H3ZKe9KeESRkgbmnbJ7plKc8Iu2+HLzSKM7JzMUcis4jEQtjvdCAvXlYonkryuqgYOU66P7pN7nlTLeA881mrZe+Azmr47So8teftADTpBAWEf5LuG8FUkMMdPRK1RYmLMiJ0DKbBbBn8JRFUdt0STnSd29FClnrT6kH+gP4oFnPUlQ6IprSuFoofVwBgSX/2xLjmNUkQGgiRGlMs3uMA4B8zT5CMLyU= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1264; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR02MB1264;25:3djUXxXAnibqf2+dt8cB2cH+p+KoX2hzzmlW77JVK?= =?us-ascii?Q?hk0gynIGpoQJs8KPntoTBHfiUsX8k+/vPs+hgU80QHcEY0Dzzh5fWqUVjIfD?= =?us-ascii?Q?fSPM+7dKWWk9chJ+9pQV1ABiBiFvfaZoFvfxHaSZFP7OnFevBV1Pmjb5TXMJ?= =?us-ascii?Q?w5FmoarDRaK7guxSp7IZvM+G9Az8zy2iO5ajcFi5va2DisP5Pu87QkIjXqtJ?= =?us-ascii?Q?GhBbNAo4CNGBx6TtOaZYJOrv+gZGu0DAtL/1KxCOtRFmDS+D5uQeSCsxelY3?= =?us-ascii?Q?gQIcOL/cC2zybgfpUsrc1g17XLdwRGGuMi1nogsibCRdNgcWqUCrbmKfP3Mf?= =?us-ascii?Q?Av387oQ5XrcKXBmTTwGj1VVybTBgi/1DyQ8N/pcRNm83EdpQmTqFediHLSVt?= =?us-ascii?Q?OYf9yS/n+YBfMbPb27ukFjovxmJ3C8n5Tz0DIbjdq0x1y5fcYc00pgBJnsq+?= =?us-ascii?Q?JqRclbmZ8ZwW1NoMJw1Oqay9MOq+9Zdnm9AKwWWnDu+x3ysKaz3W18VSmfde?= =?us-ascii?Q?wwDg4OaYzEPjRmYbvrPETxcDBLvN7ch4EZk8vJDZcA7wo/ukaksX0kPwOoE+?= =?us-ascii?Q?PzUIEK29B1SvuJUE3r5JQi29sC65bn9Ku/4sDPali0i2w5WF5i+hkYWSYkIC?= =?us-ascii?Q?tsY4MFYwU+S3X4vszGiFpAz3LPKPbXvfGGIuFkan4Mrgrm7xTufHgmpNZO1Z?= =?us-ascii?Q?95MyRWjDWz5Uw8k/7+w6WEZiBMdiMJU9EIhdoo1ArvGAUOmbwcQ2ze41Pw6t?= =?us-ascii?Q?mDH30VQN5qMvDZWYPox5ANXpNbDfCPaT0eBu2X9hJuTJWbLO9nLZI/3Vf11o?= =?us-ascii?Q?GDcYZVSTD2j4wUNNaiDRdlyrsHwj62BPSd5xFyVTXN/6uU/78cLOaKykpqJK?= =?us-ascii?Q?fZdKmIka6sGkvYgSe0Hx/QLR6UdKgrxGLViHt9GJcq5p8GkfVXKUs8/BP3Ey?= =?us-ascii?Q?n0/oq98Aezltb9ASgqvMm5DIXxeJg1qOjXM17xqGg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1264;20:WWDgyK3bkvB5GmAI5mmBMSvkOrXXQhsteOM6iNRcNYoZeEwzoky1AcxMKXOvua0WDS79T/UZ9WuB7oRwA2A6+OSi2WRZG0qyFsw50bUtIgREvHx7Y5OcKHxYYFm8XHjzFGi29fkF5TTImQAFd5JDeMjJNEWEIm7a1xJ22lK+Sct4WAJrr7P6pHtmn1ONsNs7OlsTRTJkrckRjqLQJC4M1H9KeanQ3vu81z2iiU/H5RuwZWvS8CiZ/ET4NVd+D5098JC5X2MQEIiL2/S1fNoW47KCZdR9WsuKdJucFAmFSkihMxuiIi5D9qxTI/t3gVuILfYz7P8cJlzUM35zmw94xA==;4:grOSSepy6V07ES35IFAkq/gKbbfSizevZL2buEt70OES39wz89ZhvOiu08QBN+9LOBqmuOH+edIhQIUV268ac5GNtajJC6AOOnTRKP0+kDFieGQeJo/Zvvr2nLKOC4ARB2NpOJX45kf8mwLnvfn5br3ywf2r9zppQdKGnlUPOrGKybp6VRH4Ayhb56M72ZmwVFvG06/uMQWhmuBHJztDULSGsQ5SByoTH0UbZD7qNGZwbuHeMRrY62wbWaYFtxp7oAI12Tri12Gxm2U/Tt7kn/gVpTb8VzGnbUrAOq/WNLy7YsxROz994gb93XX8sfsgb2B7GCRza1w4Yv9L2GHKyruAUDsXvqmJF1GQBjgKuXmsBowjcjgUlrXo4mWnBDfwaXKnO7o1b41UUsolreoX0aLWRHKc78qMCEvFrPqZxXVTqdQU3JWaY8l+qp+S8F1tXLB6FLfr7PelVImzGbyJiFYEA7wBvP4Arx0aifxOeRCGAIQYhUid2odxd2tclRdDdu5lvZbtkjEOyGA9Dg/LUy2cjEWjumUKL1gYEUpdZzKh2VaORzQ1B4xIZACuFJvh X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(189930954265078)(21748063052155); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(13024025)(13018025)(5005006)(13017025)(8121501046)(13015025)(10201501046)(3002001)(6055026);SRVR:CY1PR02MB1264;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1264; X-Forefront-PRVS: 0954EE4910 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR02MB1264;23:fxLTFdrvNFao7/9eTpZmcPJ6MKVezbD1nP7fNFWE/?= =?us-ascii?Q?w5qzzvOGtPOdkkbCEUGvoB97jHBcp+LQ0h3fVVd+Hqetq5MaSB8T4yQaFA3M?= =?us-ascii?Q?ucFFytB3B4OjfG555vjOFpeGuu1ayxDwoaUcEYk6hV8KkmW7x0JaOR++0OMX?= =?us-ascii?Q?gcLRJvmKFXcALpwjlQWFH60+pXlqFYsUi+stR14uLsfzTgDeDz6v1BAYZJm/?= =?us-ascii?Q?dLJ/CkGEGguCdc0eRLiaZ9xy6gddwCUpHyWFPHl2xPyq130BS6sSnRmftKHG?= =?us-ascii?Q?wQxyglYM4kIlGT91Tcy4hOu1K2cFIrcjFxNm35J9x//fyfVsfAiWA0tzKXsa?= =?us-ascii?Q?zgN8POCA2F00k4uGzCPPMOshWbBrsMBrZ4JKtHg/fCeLDW3XuKUph0FhdMeg?= =?us-ascii?Q?AkhyRGXP6nwRORLfyVtqPQhJI+kxynvFXH2pDVdYy7E0mu2+sSYilHTYtC6e?= =?us-ascii?Q?1rHfAMrHSUWuljGi4P8tGXhbIjo7yG+u9nDyIStvbC7GQg9fj9/Y1u+wOvMB?= =?us-ascii?Q?z37rDatUH5BfvxoehTULRH9uIywJNDkyUQh0IZdefLlVG/HMPkmxu3jDtTyw?= =?us-ascii?Q?YHdSKkOKMuZC1ld2nkKoWOfCe9zpAzzWBTyPDU445gIjvNJKPqoIdtIMcgm1?= =?us-ascii?Q?1pBSue7ktsGXCJfCxss2GXyGN6SgpV6QKaRCZV8UHDPO7asMFPWO3igx/5aC?= =?us-ascii?Q?jV6/6Cs5KeSSd4+DoY1dK6Qsdu6NLvEVoKBu3fjMy16N3LS3GZuupkLhchk4?= =?us-ascii?Q?poT+WDr8XlmdbJaO8ZqZucLMoL1CaaK8DIZsVCZ57zgkvPaeqKgITKuW5DEE?= =?us-ascii?Q?xYRfVFR/n2buXsDCPGf1KJXe/3Rky2zNvPeuEHv9ao4v3zFZyQqTD0bZgCBn?= =?us-ascii?Q?4hacpY+zpB5OCwH09VxadYMiazpMvg+/B78j6R2DR9woaRt81nbbuMhHnfuu?= =?us-ascii?Q?QbyQyH/IqCm5vLpfkuzNVnK20ROmJSJ4FaPbNEdczbFlCXE3m7HWgwPwD0gx?= =?us-ascii?Q?FwbUgrbFVBJ2Sjbxa59x6pSK+JX4ZHM07Xw4cdVFuhAZMqbzhepie0PLpH8o?= =?us-ascii?Q?ZywZV0RIDhnClEOf+Up+vaEwx8MG4s6eZfb/aQ3fOIwyLj3QpWZ6K+DcE5Sy?= =?us-ascii?Q?hF2MwGY0oEVQbh2Bgi42JaJRIP0Wuw4NDEObq+VrSF69cSDPN2s3mfKNSUnx?= =?us-ascii?Q?sA1ulJrvK//xEIldO9cCdj8NFdyI5keSz+2EOqmzQPQEoPynBieic8GppjNa?= =?us-ascii?Q?Iu030UJEomSdx6fY9A+M8T5CKNhl0ngFCFKvH1ygnse6cvGMowuguhp/h7+Q?= =?us-ascii?Q?DhpfyvaeLcqPNBX03ypdCNykyhQg5ZINFWlUAzIW/BfuOkaphpdJXaQf/Nie?= =?us-ascii?Q?hJzmbFMi9+lKoQrbfgxyGDQSoIpum5Lrhrenr4NnznV8sY3zd7UGhYbXrVG0?= =?us-ascii?Q?i3ccPm49SRn+wFC+KvVq/WteZASahwkNkwN0pQaWM2GrCnuUfuRy5jou8OJh?= =?us-ascii?Q?yh0zDn8aZK+21NPxu2Y3nHeCvgv5Yyt6XDL47WaH3M+T1dzcwv3X3avj2GEF?= =?us-ascii?Q?zZUVVe8Dp021RlhUITRxcroNa8tcDs6lnDsVv5xmrkwh5o/eMkI3u9ucC0bk?= =?us-ascii?Q?bBZTKHirqARPujG9u2WA8NtgPAyyonBZP2STFnDKeVN1uWGlB3VZQKsklIXG?= =?us-ascii?Q?hd1sMB/jPMqOen21SOsg/l/gbTFHV40Hcas4+vX6wED0VmFbIW6XtU5XC5GH?= =?us-ascii?Q?jSvwgEz+HkqKDnUZ3vIyj8/BgIumQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1264;5:4AYvulguxCqlDoyglrRKisUhraGCf4iZm0MuLS3xtmEZpUnRyRTn9Dl8RxS3hZ58Y07LdA9wGgtdquNbil3ER35lTMY4oYHfGbc8dADYjG5zblzCnqZnMEvvaI0nDKa6WLO9L69qm3XiHmA/Ro++ZQ==;24:4aKppfiRQ7UbdbAj9cBUWzumD1Q89X0MmRKY60MMIETqb+wsDO0JYW455e3nf6pyqK0qAmi893/XU5jybyCqa+pV1v3aCA3c+R4KJT9fq04=;7:4SeTh9h8lhY9TBisQTtFCDKiR5pgAO0AGYnghl7wngll2ny+Xjv+FdF9GLUGgtjn5A82Rymnl4R/J2mvUcZ2h7/fQ/tcVG8C9/MRleE3s5fKlaVHyoiiQFL8DbdTaID7CbcsAeeOLJdi2P86+Jfpj4U33fg/krqUVHNPO4zV9y4hV4w+u1w8jZjMQVgqQh8X SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ucps.k12.nc.us X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2016 16:23:42.7146 (UTC) X-MS-Exchange-CrossTenant-Id: 698d4b19-2f82-4c7b-a397-3dc8729f735d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=698d4b19-2f82-4c7b-a397-3dc8729f735d;Ip=[152.26.69.180];Helo=[tscsophosef.ucps.k12.nc.us] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB1264 X-Barracuda-Connect: mail-by2on0053.outbound.protection.outlook.com[207.46.100.53] X-Barracuda-Start-Time: 1464279827 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1843 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.04 X-Barracuda-Spam-Status: No, SCORE=1.04 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA620b, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, SUBJ_ALL_CAPS, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain 1.00 BSF_SC0_SA620b Custom Rule SA620b --_000_52FFD5475FFF2C4DA7FA64915B906446A4C3F011ucmbx2ucpsk12nc_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Can I get help with a new project? Please reply me on my e-mail: annywang19= 56@outlook.com --_000_52FFD5475FFF2C4DA7FA64915B906446A4C3F011ucmbx2ucpsk12nc_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Can I get help with a new project? Please reply me o= n my e-mail: annywang1956@outlook.com

--_000_52FFD5475FFF2C4DA7FA64915B906446A4C3F011ucmbx2ucpsk12nc_-- From darrick.wong@oracle.com Thu May 26 11:33:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4770D7CA0 for ; Thu, 26 May 2016 11:33:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6A75AC007 for ; Thu, 26 May 2016 09:33:01 -0700 (PDT) X-ASG-Debug-ID: 1464280378-04cbb0356b922fd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xYyHFK2SHxQk4jSU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 09:32:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4QGWqVP003360 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:32:52 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4QGWpD3008502 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 May 2016 16:32:52 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4QGWobb018409; Thu, 26 May 2016 16:32:51 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 09:32:50 -0700 Date: Thu, 26 May 2016 09:32:49 -0700 From: "Darrick J. Wong" To: Xiao Yang Cc: xfs@oss.sgi.com Subject: Re: question about xfs/122 Message-ID: <20160526163249.GA4595@birch.djwong.org> X-ASG-Orig-Subj: Re: question about xfs/122 References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <5746A64D.6080309@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5746A64D.6080309@cn.fujitsu.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464280378 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1440 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 26, 2016 at 03:31:25PM +0800, Xiao Yang wrote: > Hi Darrick > > When i run xfstests test case xfs/122 on RHEL7.2GA with xfsprog-dev(4.5.0), > I always get such error about xfs/122: > --------------------------------------------------------- > sizeof(struct xfs_extent_data_info) = 32 > sizeof(struct xfs_fs_eofblocks) = 128 > sizeof(struct xfs_icreate_log) = 28 > -sizeof(struct xfs_refcount_key) = 4 > -sizeof(struct xfs_refcount_rec) = 12 > -sizeof(struct xfs_rmap_key) = 4 > -sizeof(struct xfs_rmap_rec) = 24 > -sizeof(struct xfs_rmapx_key) = 20 > sizeof(xfs_agf_t) = 224 > sizeof(xfs_agfl_t) = 36 > sizeof(xfs_agi_t) = 336 > --------------------------------------------------------- > > This case can pass with modern xfsprogs(i.e. 4.3+ and all the new v5 stuff) as you said. > Could you tell me which specific version can support this case. In addition, what can be > done to work around this failure. The missing fields are for the reflink and rmap btrees. I could say to just ignore it, but I don't want to establish a precedent of ignoring xfs/122 errors... I'm wondering if perhaps this test ought to filter out /missing/ lines in the test output? --D > > Please advise. Thanks very much. > > Regards, > Xiao Yang > > > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From miklos@szeredi.hu Thu May 26 11:42:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9C037CA0 for ; Thu, 26 May 2016 11:42:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA659304039 for ; Thu, 26 May 2016 09:42:38 -0700 (PDT) X-ASG-Debug-ID: 1464280954-04bdf05ad6926630001-NocioJ Received: from mail-oi0-f67.google.com (mail-oi0-f67.google.com [209.85.218.67]) by cuda.sgi.com with ESMTP id 734Y8YRnJAd2AVi4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 26 May 2016 09:42:35 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Effective-Source-IP: mail-oi0-f67.google.com[209.85.218.67] X-Barracuda-Apparent-Source-IP: 209.85.218.67 Received: by mail-oi0-f67.google.com with SMTP id h125so5471423oib.2 for ; Thu, 26 May 2016 09:42:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=FCJuaRUCI26GnGUWtbZoTvUV/gJRyf/m1JCuIauk/9M=; b=l7DU0BAe/Vy5sX+mQyP3RG+dxcaF8z1rfOMljV1E0fIwGoBvHK+jHuuwnSsDcBr0bi QPvZv4RdESjQbNt1T9bEJFgIJrzIQb9Q5fVTEoxJVXFp0Nxp/4GjDGrp1XzA8rrmgZoX 6oz8+HintFrLEanqh1u53CsLKJO/pyCG/qq+Q= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=FCJuaRUCI26GnGUWtbZoTvUV/gJRyf/m1JCuIauk/9M=; b=U4mgBo2jCeXsixw59YgKi5nnNEITHri1ew7Es8plL/NQACKOi2Elma7RiwiVLgMKpu cxIR4hi/6Os+mClafjSCRUYcSnEapGclLLxQAXUs8Jegor9ZEh8cos3UQSvEzkHKv38J eX1elS1h5iDOzkFvUvIkJ9jszko5Hxhakw4+05jkLf7USbU/tJROrN8ud/QpBresFj9h AUHZ7BZDuyLDzKQniynqCxvL1oDkLEUtV4vYX4x8dPsAgNe0aDJWNwBM/W38RNvmr6hm SBqyHEeafCt3zqfxhZiVB4hQhufvygWYgDQCuTIg+XTU2fQELEYGr2rv6Zo4h/boIIwi E8OA== X-Gm-Message-State: ALyK8tLMaQITwJzFu4eOEqG/xkKjhbX0+5TFE19M6Zh76ACG7AzsXG2ZGCNiwaT2XbmhjtWZdoxThmxyHStgdA== MIME-Version: 1.0 X-Received: by 10.202.75.196 with SMTP id y187mr5342759oia.170.1464280954227; Thu, 26 May 2016 09:42:34 -0700 (PDT) Received: by 10.202.172.19 with HTTP; Thu, 26 May 2016 09:42:34 -0700 (PDT) X-Originating-IP: [217.173.44.24] In-Reply-To: <1464279600-13009-4-git-send-email-jack@suse.cz> References: <1464279600-13009-1-git-send-email-jack@suse.cz> <1464279600-13009-4-git-send-email-jack@suse.cz> Date: Thu, 26 May 2016 18:42:34 +0200 Message-ID: Subject: Re: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() From: Miklos Szeredi X-ASG-Orig-Subj: Re: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() To: Jan Kara Cc: Al Viro , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f67.google.com[209.85.218.67] X-Barracuda-Start-Time: 1464280954 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2851 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, May 26, 2016 at 6:19 PM, Jan Kara wrote: > To avoid clearing of capabilities or security related extended > attributes too early, inode_change_ok() will need to take dentry instead > of inode. Propagate it down to fuse_do_setattr(). > > Signed-off-by: Jan Kara Acked-by: Miklos Szeredi > --- > fs/fuse/dir.c | 7 ++++--- > fs/fuse/file.c | 2 +- > fs/fuse/fuse_i.h | 2 +- > 3 files changed, 6 insertions(+), 5 deletions(-) > > diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c > index b9419058108f..4a613d1e9e75 100644 > --- a/fs/fuse/dir.c > +++ b/fs/fuse/dir.c > @@ -1586,9 +1586,10 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff) > * vmtruncate() doesn't allow for this case, so do the rlimit checking > * and the actual truncation by hand. > */ > -int fuse_do_setattr(struct inode *inode, struct iattr *attr, > +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, > struct file *file) > { > + struct inode *inode = d_inode(dentry); > struct fuse_conn *fc = get_fuse_conn(inode); > struct fuse_inode *fi = get_fuse_inode(inode); > FUSE_ARGS(args); > @@ -1702,9 +1703,9 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) > return -EACCES; > > if (attr->ia_valid & ATTR_FILE) > - return fuse_do_setattr(inode, attr, attr->ia_file); > + return fuse_do_setattr(entry, attr, attr->ia_file); > else > - return fuse_do_setattr(inode, attr, NULL); > + return fuse_do_setattr(entry, attr, NULL); > } > > static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry, > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > index 9154f8679024..46d65f1a79d2 100644 > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -2828,7 +2828,7 @@ static void fuse_do_truncate(struct file *file) > attr.ia_file = file; > attr.ia_valid |= ATTR_FILE; > > - fuse_do_setattr(inode, &attr, file); > + fuse_do_setattr(file_dentry(file), &attr, file); > } > > static inline loff_t fuse_round_up(loff_t off) > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h > index eddbe02c4028..59a26446762b 100644 > --- a/fs/fuse/fuse_i.h > +++ b/fs/fuse/fuse_i.h > @@ -951,7 +951,7 @@ bool fuse_write_update_size(struct inode *inode, loff_t pos); > int fuse_flush_times(struct inode *inode, struct fuse_file *ff); > int fuse_write_inode(struct inode *inode, struct writeback_control *wbc); > > -int fuse_do_setattr(struct inode *inode, struct iattr *attr, > +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, > struct file *file); > > void fuse_set_initialized(struct fuse_conn *fc); > -- > 2.6.6 > From sandeen@sandeen.net Thu May 26 12:39:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 082C07CA0 for ; Thu, 26 May 2016 12:39:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF670304053 for ; Thu, 26 May 2016 10:39:37 -0700 (PDT) X-ASG-Debug-ID: 1464284373-04cbb0356b928ff0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vD6j1rV9spGlXORH for ; Thu, 26 May 2016 10:39:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6901D4A6 for ; Thu, 26 May 2016 12:39:33 -0500 (CDT) Subject: Re: LVM snapshot and log record CRC mismatch To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch References: <20160524221205.GM21200@dastard> <57455645.5040608@assyoma.it> <20160526122315.4112f713@harpe.intellique.com> <5746DB30.5040006@assyoma.it> From: Eric Sandeen Message-ID: <3d43eb60-ad03-ca17-051f-aef2cf91f2f3@sandeen.net> Date: Thu, 26 May 2016 12:39:32 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <5746DB30.5040006@assyoma.it> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464284373 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 934 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/26/16 6:17 AM, Gionatan Danti wrote: > On 26/05/2016 12:23, Emmanuel Florac wrote: >> Le Wed, 25 May 2016 09:37:41 +0200 >> Gionatan Danti écrivait: >> >>> The snapshot is accomplished using the following commands: >>> >>> lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP >>> lvchange -ay -K hypervisor/Backup_SNAP >>> mount -o nouuid /dev/hypervisor/Backup_SNAP /mnt/lvm/ >>> >> >> You need to use xfs_freeze to make the filesystem coherent before >> snapshot: >> >> xfs_freeze /dev/hypervisor/KVM_Storage >> lvcreate -s hypervisor/KVM_Storage --name Backup_SNAP >> xfs_freeze -u /dev/hypervisor/KVM_Storage >> lvchange -ay -K hypervisor/Backup_SNAP >> > > It was my understanding that filesystem freezing was automatically managed by LVM, and integrated into VFS long ago. > > I am missing something? Nope, you are correct. lvm snapshots handle fs quiesce. -Eric From rpeterso@redhat.com Thu May 26 13:20:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D91787CA0 for ; Thu, 26 May 2016 13:20:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9ED238F8035 for ; Thu, 26 May 2016 11:20:04 -0700 (PDT) X-ASG-Debug-ID: 1464286802-04cbb0356892d8c0001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id OkEL7jyhfNw113O2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 11:20:02 -0700 (PDT) X-Barracuda-Envelope-From: rpeterso@redhat.com X-Barracuda-Effective-Source-IP: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail12.collab.prod.int.phx2.redhat.com (zmail12.collab.prod.int.phx2.redhat.com [10.5.83.14]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4QIJw2X043988; Thu, 26 May 2016 14:19:59 -0400 Date: Thu, 26 May 2016 14:19:57 -0400 (EDT) From: Bob Peterson To: Christoph Hellwig Cc: xfs@oss.sgi.com, vishal l verma , linux-fsdevel@vger.kernel.org Message-ID: <1391795572.11287486.1464286797723.JavaMail.zimbra@redhat.com> In-Reply-To: <20160524131058.GA21094@lst.de> References: <1462783638-4968-1-git-send-email-hch@lst.de> <1462783638-4968-10-git-send-email-hch@lst.de> <1651455378.10041082.1464034166002.JavaMail.zimbra@redhat.com> <20160524131058.GA21094@lst.de> Subject: Re: [PATCH 09/15] fs: iomap based fiemap implementation MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH 09/15] fs: iomap based fiemap implementation Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.3.116.126] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF46 (Linux)/8.0.6_GA_5922) Thread-Topic: iomap based fiemap implementation Thread-Index: CpK7WZ8kPxzEPM00EEC6uC/InNDFjA== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1464286802 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2425 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29925 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header ----- Original Message ----- | On Mon, May 23, 2016 at 04:09:26PM -0400, Bob Peterson wrote: | > I've been looking at this again. Where are the calls to the fs-specific | > bits | > for fiemap? | | In the iomap_ops structure passed to iomap_fiemap. | | > It looks like iomap_fiemap calls iomap_apply, which calls | > iomap_fiemap_actor, but that doesn't call any ops->iomap_get_iomap or | > similar. | > It calls the iomap_begin (which BTW has a comment that says "Execute a | > iomap | > write" which is probably wrong and should be more generic, as for cases | > like | > fiemap) and it calls iomap_end. But it never calls an fs-specific actor | > anywhere. Am I missing something? My earlier version passed in the actor | > function, as per Dave Chinner's request, but yours doesn't. | | The iomap_begin callback is where you do the mapping. the iomap_end | callback does any required cleanup, which in case of GFS2 probably | would be dropping the cluster lock protecting the mapping. | Okay, got it. So a couple things: 1. I verified that the vfs bits of the patch set work properly for GFS2 using a modified iomap-based fiemap. And it's fast. 2. I'm not sure I like the fact that instead of begin->main->end it is essentially begin->end with begin doing all the work. It works, and it's better than we have today. But I'd prefer either renaming the first function from "iomap_begin" to something that indicates it's more than just a precursor to the actual function? Or else split it into begin->main->end? I was kinda hoping to pass in the iomap_actor somehow. It's not a tragic loss, but the way I've got the gfs2 function coded, the begin function does: locking plus the main functionality, and all the fiemap_end function basically does is unlock. 3. I had to do something like this to get "make menuconfig" to work: index 276fcfb..daa129c 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -11,7 +11,7 @@ config DCACHE_WORD_ACCESS if BLOCK config FS_IOMAP - bool + bool "File IOMAP Support" 4. I don't suppose you could split this patch set up so that the vfs bits are independent, so someone like Al Viro could grab them rather than getting pulled along size the xfs-specific bits? (Which is essentially what I've done for GFS2; I did not drag in all the xfs bits). Regards, Bob Peterson Red Hat File Systems From david@fromorbit.com Thu May 26 16:53:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 89F727CA0 for ; Thu, 26 May 2016 16:53:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5BE7A304032 for ; Thu, 26 May 2016 14:53:41 -0700 (PDT) X-ASG-Debug-ID: 1464299616-04cb6c2dbc92a910001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GpOT4FNsrHogA9UU for ; Thu, 26 May 2016 14:53:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgUIAPNvR1d5LBhDPGdsb2JhbABcgzmBU4ZunkkGjCWFeIQVgk+DPAICAQECgTtNAQEBAQEBBwEBAQFCQIREAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC7DYQELASQehUGFFIoZBZg3jhaPJkWPB4RhKjKKFQEBAQ Received: from ppp121-44-24-67.lns20.syd4.internode.on.net (HELO dastard) ([121.44.24.67]) by ipmail04.adl6.internode.on.net with ESMTP; 27 May 2016 07:23:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b63DE-0001Tg-D2; Fri, 27 May 2016 07:53:04 +1000 Date: Fri, 27 May 2016 07:53:04 +1000 From: Dave Chinner To: Jan Kara Cc: Al Viro , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, Miklos Szeredi , xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160526215304.GO21200@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1464279600-13009-1-git-send-email-jack@suse.cz> <1464279600-13009-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464279600-13009-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1464299617 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2090 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, May 26, 2016 at 06:19:56PM +0200, Jan Kara wrote: > To avoid clearing of capabilities or security related extended > attributes too early, inode_change_ok() will need to take dentry instead > of inode. Propagate dentry down to functions calling inode_change_ok(). > This is rather straightforward except for xfs_set_mode() function which > does not have dentry easily available. Luckily that function does not > call inode_change_ok() anyway so we just have to do a little dance with > function prototypes. The idea behind the change is good, but I think the little dance could be improved as it makes the layering of the code seem weirdly unbalanced to me. e.g. xfs_vn_setattr() xfs_vn_setattr_size() <<<< inode_change_ok() here xfs_vn_setattr() xfs_vn_setattr_nonsize() <<<< inode_change_ok() here xfs_setattr_nonsize() xfs_vn_setattr() xfs_vn_setattr_size() xfs_vn_setattr_nonsize() <<<< inode_change_ok() here xfs_setattr_nonsize() And to be more confusing, the externally callable functions for the rest of the XFS code are now xfs_vn_setattr_size() and xfs_setattr_nonsize() which now have different calling context limitations. I think adding a little symmetric make sense. i.e: xfs_vn_change_ok(dentry, iattr) { + if (mp->m_flags & XFS_MOUNT_RDONLY) + return -EROFS; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + error = inode_change_ok(inode, iattr); + if (error) + return error; + } xfs_vn_setattr_size(d, i) { xfs_vn_change_ok(d, i) xfs_setattr_size(ip, i) } xfs_vn_setattr_nonsize(d, i) { xfs_vn_change_ok(d, i) xfs_setattr_nonsize(ip, i) } xfs_vn_setattr(d, i) { xfs_vn_change_ok(d, i) } And remove the inode_change_ok() code from xfs_setattr_size and xfs_setattr_nonsize() completely. You've already done this with xfs_vn_setattr_nonsize() - it just needs to be made symmetric to keep a clean layering between VFS interfaces and internal XFS interfaces... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 26 17:57:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B52247CA0 for ; Thu, 26 May 2016 17:57:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F58EAC007 for ; Thu, 26 May 2016 15:57:25 -0700 (PDT) X-ASG-Debug-ID: 1464303438-04cb6c2db992e1b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id WWziQKFOPrLVRGgf for ; Thu, 26 May 2016 15:57:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuwKABt+R1d5LBhDPGdsb2JhbABcgzmBU4ZunkkGjCWFeIQVhgsCAgEBAoE8TQEBAQEBAQcBAQEBQkBBEgGDbwEBAQMBJxMcIwUHBAgDDgoJJQ8FJQMHGhOIJwfDSgEBCAIBJB6FQYUUihkFmDeOFo8mj0yCaByBXSoyhX2EGAEBAQ Received: from ppp121-44-24-67.lns20.syd4.internode.on.net (HELO dastard) ([121.44.24.67]) by ipmail04.adl6.internode.on.net with ESMTP; 27 May 2016 08:27:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b64DM-0001YW-74; Fri, 27 May 2016 08:57:16 +1000 Date: Fri, 27 May 2016 08:57:16 +1000 From: Dave Chinner To: Bob Peterson Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, vishal l verma , xfs@oss.sgi.com Subject: Re: [PATCH 09/15] fs: iomap based fiemap implementation Message-ID: <20160526225716.GP21200@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/15] fs: iomap based fiemap implementation References: <1462783638-4968-1-git-send-email-hch@lst.de> <1462783638-4968-10-git-send-email-hch@lst.de> <1651455378.10041082.1464034166002.JavaMail.zimbra@redhat.com> <20160524131058.GA21094@lst.de> <1391795572.11287486.1464286797723.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1391795572.11287486.1464286797723.JavaMail.zimbra@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1464303438 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3290 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, May 26, 2016 at 02:19:57PM -0400, Bob Peterson wrote: > ----- Original Message ----- > | On Mon, May 23, 2016 at 04:09:26PM -0400, Bob Peterson wrote: > | > I've been looking at this again. Where are the calls to the fs-specific > | > bits > | > for fiemap? > | > | In the iomap_ops structure passed to iomap_fiemap. > | > | > It looks like iomap_fiemap calls iomap_apply, which calls > | > iomap_fiemap_actor, but that doesn't call any ops->iomap_get_iomap or > | > similar. > | > It calls the iomap_begin (which BTW has a comment that says "Execute a > | > iomap > | > write" which is probably wrong and should be more generic, as for cases > | > like > | > fiemap) and it calls iomap_end. But it never calls an fs-specific actor > | > anywhere. Am I missing something? My earlier version passed in the actor > | > function, as per Dave Chinner's request, but yours doesn't. > | > | The iomap_begin callback is where you do the mapping. the iomap_end > | callback does any required cleanup, which in case of GFS2 probably > | would be dropping the cluster lock protecting the mapping. > | > > Okay, got it. So a couple things: > > 1. I verified that the vfs bits of the patch set work properly for GFS2 > using a modified iomap-based fiemap. And it's fast. > 2. I'm not sure I like the fact that instead of begin->main->end it is > essentially begin->end with begin doing all the work. It works, and > it's better than we have today. But I'd prefer either renaming the > first function from "iomap_begin" to something that indicates it's > more than just a precursor to the actual function? Same can be said for the existing write_begin/end interface we have for block mapping right now. I suppose iomap_prepare/finish or iomap_get/put might be more obvious. Pink or purple? :P > Or else split it > into begin->main->end? I was kinda hoping to pass in the iomap_actor > somehow. Can you explain what for? What are you wanting to put in the fiemap that you can't pass though the iomap as a map flag? > It's not a tragic loss, but the way I've got the gfs2 > function coded, the begin function does: locking plus the main > functionality, and all the fiemap_end function basically does is unlock. Yup, that's pretty much how it was been intended to work. > 4. I don't suppose you could split this patch set up so that the vfs > bits are independent, so someone like Al Viro could grab them > rather than getting pulled along size the xfs-specific bits? > (Which is essentially what I've done for GFS2; I did not drag in > all the xfs bits). Once the merge window is over and the VFS bits are stable and reviewed, I'll put the code into two branches in the XFS tree - the first will just have the VFS iomap bits and the second will contain the XFS bits. Once committed, they'll be stable branches, so you should be able to merge it into the GFS2 tree and work from there. The duplication of the branch in different trees will resolve automatically when Linux pulls the trees. That way I can carry the XFS changes in the XFS tree, and you don't have to see any of them in the GFS2 tree... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Thu May 26 22:28:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A4B017CA0 for ; Thu, 26 May 2016 22:28:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D502AC007 for ; Thu, 26 May 2016 20:28:39 -0700 (PDT) X-ASG-Debug-ID: 1464319715-04cbb0356b958e00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JhujnyEhDo0fgWN8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 20:28:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4R3S8qK030575 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 27 May 2016 03:28:09 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u4R3S8YU009962 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 27 May 2016 03:28:08 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u4R3S7NX030444; Fri, 27 May 2016 03:28:07 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 20:28:06 -0700 Date: Thu, 26 May 2016 20:28:05 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, hch@infradead.org Subject: [PATCH v2 2/7] tests: don't put loop control files on the scratch mount Message-ID: <20160527032804.GA9418@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 2/7] tests: don't put loop control files on the scratch mount References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464319715 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12038 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If we're doing write/overwrite/snapshot/resource exhaustion tests on the scratch device, use the test directory to hold the loop termination signal files. This way we don't run infinitely because we can't create the flag due to ENOSPC. v2: put the control files in /tmp, not $TEST_DIR Signed-off-by: Darrick J. Wong --- tests/generic/162 | 8 +++++--- tests/generic/163 | 8 +++++--- tests/generic/164 | 8 +++++--- tests/generic/165 | 8 +++++--- tests/generic/166 | 8 +++++--- tests/generic/167 | 8 +++++--- tests/generic/168 | 8 +++++--- tests/generic/170 | 8 +++++--- tests/generic/333 | 20 ++++++++++++-------- tests/generic/334 | 20 ++++++++++++-------- 10 files changed, 64 insertions(+), 40 deletions(-) diff --git a/tests/generic/162 b/tests/generic/162 index 5ff2ee2..61cf463 100755 --- a/tests/generic/162 +++ b/tests/generic/162 @@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -51,6 +51,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -64,7 +66,7 @@ _pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file2 >> $seqres.full _scratch_cycle_mount overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x61 $((i * blksz)) $blksz $testdir/file2 >> $seqres.full done @@ -81,7 +83,7 @@ for i in `seq 1 2`; do done done echo "Finished dedupeing" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/163 b/tests/generic/163 index fcba677..e2c6042 100755 --- a/tests/generic/163 +++ b/tests/generic/163 @@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -51,6 +51,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -64,7 +66,7 @@ _pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file2 >> $seqres.full _scratch_cycle_mount overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x61 $((i * blksz)) $blksz $testdir/file1 >> $seqres.full done @@ -81,7 +83,7 @@ for i in `seq 1 2`; do done done echo "Finished dedupeing" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/164 b/tests/generic/164 index acacb7f..78ea787 100755 --- a/tests/generic/164 +++ b/tests/generic/164 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -71,7 +73,7 @@ fbytes() { } reader() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do _read_range $testdir/file3 0 $((loops * blksz)) | fbytes done } @@ -91,7 +93,7 @@ for i in `seq 1 2`; do done done echo "Finished reflinking" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/165 b/tests/generic/165 index b742d19..ca11e1e 100755 --- a/tests/generic/165 +++ b/tests/generic/165 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -54,6 +54,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=512 @@ -72,7 +74,7 @@ fbytes() { } reader() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do _read_range $testdir/file3 0 $((loops * blksz)) -d | fbytes done } @@ -92,7 +94,7 @@ for i in `seq 1 2`; do done done echo "Finished reflinking" -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/166 b/tests/generic/166 index 0e31f2e..8600a13 100755 --- a/tests/generic/166 +++ b/tests/generic/166 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -54,6 +54,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -68,7 +70,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo "$out" | grep -q "No space left" && break @@ -83,7 +85,7 @@ snappy & seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 >> $seqres.full done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/167 b/tests/generic/167 index b2d6c87..261506b 100755 --- a/tests/generic/167 +++ b/tests/generic/167 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -67,7 +69,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo "$out" | grep -q "No space left" && break @@ -82,7 +84,7 @@ snappy & seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file1 >> $seqres.full done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/168 b/tests/generic/168 index 7047d10..ceee264 100755 --- a/tests/generic/168 +++ b/tests/generic/168 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -52,6 +52,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -66,7 +68,7 @@ _scratch_cycle_mount # Direct I/O overwriter... overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file2 >> $seqres.full done @@ -82,7 +84,7 @@ seq 1 10 | while read j; do [ $? -ne 0 ] && exit done done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/170 b/tests/generic/170 index 4861052..6559243 100755 --- a/tests/generic/170 +++ b/tests/generic/170 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file wait } @@ -53,6 +53,8 @@ _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file mkdir $testdir loops=1024 @@ -67,7 +69,7 @@ _scratch_cycle_mount # Direct I/O overwriter... overwrite() { - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do _pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file2 >> $seqres.full done @@ -83,7 +85,7 @@ seq 1 10 | while read j; do [ $? -ne 0 ] && exit done done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/333 b/tests/generic/333 index 8db86e3..3d874d7 100755 --- a/tests/generic/333 +++ b/tests/generic/333 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file $abort_file wait } @@ -54,6 +54,10 @@ _scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file +abort_file=/tmp/abort +rm -rf $abort_file mkdir $testdir loops=1024 @@ -68,7 +72,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo $out | grep -q "No space left" && break @@ -76,7 +80,7 @@ snappy() { test $res -ne 0 && break n=$((n + 1)) done - touch $testdir/abort + touch $abort_file } echo "Snapshot a file undergoing directio rewrite" @@ -85,13 +89,13 @@ seq 1 1000 | while read j; do seq $nr_loops -1 0 | while read i; do out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 2>&1)" echo $out >> $seqres.full - echo $out | grep -q "No space left" && touch $testdir/abort - echo $out | grep -qi "error" && touch $testdir/abort - test -e $testdir/abort && break + echo $out | grep -q "No space left" && touch $abort_file + echo $out | grep -qi "error" && touch $abort_file + test -e $abort_file && break done - test -e $testdir/abort && break + test -e $abort_file && break done -touch $testdir/finished +touch $finished_file wait # success, all done diff --git a/tests/generic/334 b/tests/generic/334 index 5714125..fb21d4f 100755 --- a/tests/generic/334 +++ b/tests/generic/334 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 7 15 _cleanup() { cd / - rm -rf $tmp.* + rm -rf $tmp.* $finished_file $abort_file wait } @@ -53,6 +53,10 @@ _scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq +finished_file=/tmp/finished +rm -rf $finished_file +abort_file=/tmp/abort +rm -rf $abort_file mkdir $testdir loops=1024 @@ -67,7 +71,7 @@ _scratch_cycle_mount # Snapshot creator... snappy() { n=0 - while [ ! -e $testdir/finished ]; do + while [ ! -e $finished_file ]; do out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)" res=$? echo $out | grep -q "No space left" && break @@ -75,7 +79,7 @@ snappy() { test $res -ne 0 && break n=$((n + 1)) done - touch $testdir/abort + touch $abort_file } echo "Snapshot a file undergoing buffered rewrite" @@ -84,13 +88,13 @@ seq 1 1000 | while read j; do seq $nr_loops -1 0 | while read i; do out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file1 2>&1)" echo $out >> $seqres.full - echo $out | grep -q "No space left" && touch $testdir/abort - echo $out | grep -qi "error" && touch $testdir/abort - test -e $testdir/abort && break + echo $out | grep -q "No space left" && touch $abort_file + echo $out | grep -qi "error" && touch $abort_file + test -e $abort_file && break done - test -e $testdir/abort && break + test -e $abort_file && break done -touch $testdir/finished +touch $finished_file wait # success, all done From darrick.wong@oracle.com Thu May 26 22:29:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F7127CA0 for ; Thu, 26 May 2016 22:29:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B67FAC007 for ; Thu, 26 May 2016 20:29:23 -0700 (PDT) X-ASG-Debug-ID: 1464319760-04bdf05ad595b190001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id BTKwRHR8CTe3LBzD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 20:29:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4R3Stwt001659 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 03:28:56 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4R3StvX025401 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 03:28:55 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4R3SqZr018026; Fri, 27 May 2016 03:28:54 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 20:28:52 -0700 Date: Thu, 26 May 2016 20:28:51 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, hch@infradead.org Subject: [PATCH v2 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record Message-ID: <20160527032851.GB9418@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464319760 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8378 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that we can handle multiple bmbt records mapping to a single rmapbt record. This can happen if you fallocate more than 2^21 contiguous blocks to a file. (Also add some helpers that can create huge devices with some dm-zero and dm-snapshot fakery.) v2: remove irrelevant t_immutable changes, put test in correct group Signed-off-by: Darrick J. Wong --- common/dmhugedisk | 61 +++++++++++++++++++++++++++ tests/xfs/856 | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/856.out | 13 ++++++ tests/xfs/group | 1 4 files changed, 194 insertions(+) create mode 100644 common/dmhugedisk create mode 100755 tests/xfs/856 create mode 100644 tests/xfs/856.out diff --git a/common/dmhugedisk b/common/dmhugedisk new file mode 100644 index 0000000..9c3c7d5 --- /dev/null +++ b/common/dmhugedisk @@ -0,0 +1,61 @@ +##/bin/bash +# Routines for creating huge (fake) disks +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle. All Rights Reserved. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Contact information: Oracle Corporation, 500 Oracle Parkway, +# Redwood Shores, CA 94065, USA, or: http://www.oracle.com/ +#----------------------------------------------------------------------- + +_require_dmhugedisk() +{ + _require_dm_target zero + _require_dm_target snapshot +} + +_dmhugedisk_init() +{ + test -z "$1" && _fatal "must specify sector count to _dmhugedisk_init" + local dm_backing_dev=$SCRATCH_DEV + + $DMSETUP_PROG remove huge-test > /dev/null 2>&1 + $DMSETUP_PROG remove huge-test-zero > /dev/null 2>&1 + + local blk_dev_size=$1 + + DMHUGEDISK_ZERO='/dev/mapper/huge-test-zero' + DMHUGEDISK_DEV='/dev/mapper/huge-test' + + DMHUGEDISK_ZERO_TABLE="0 $blk_dev_size zero" + DMHUGEDISK_DEV_TABLE="0 $blk_dev_size snapshot $DMHUGEDISK_ZERO $SCRATCH_DEV N 512" + + $DMSETUP_PROG create huge-test-zero --table "$DMHUGEDISK_ZERO_TABLE" || \ + _fatal "failed to create dm huge zero device" + $DMSETUP_PROG create huge-test --table "$DMHUGEDISK_DEV_TABLE" || \ + _fatal "failed to create dm huge device" +} + +_dmhugedisk_cleanup() +{ + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + # wait for device to be fully settled so that 'dmsetup remove' doesn't + # fail due to EBUSY + $UDEV_SETTLE_PROG >/dev/null 2>&1 + $DMSETUP_PROG remove huge-test > /dev/null 2>&1 + $DMSETUP_PROG remove huge-test-zero > /dev/null 2>&1 +} + diff --git a/tests/xfs/856 b/tests/xfs/856 new file mode 100755 index 0000000..9186278 --- /dev/null +++ b/tests/xfs/856 @@ -0,0 +1,119 @@ +#! /bin/bash +# FS QA Test No. 856 +# +# Create a file with more than 2^21 extents (the max length of a bmbt record). +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + umount $SCRATCH_MNT > /dev/null 2>&1 + _dmhugedisk_cleanup + rm -rf $tmp.* + _scratch_mkfs >/dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmhugedisk + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch +_require_xfs_io_command "falloc" + +rm -f $seqres.full + +# Figure out block size +echo "Figure out block size" +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount >> $seqres.full + +is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1") +test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs" + +testdir=$SCRATCH_MNT/test-$seq +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +umount $SCRATCH_MNT + +echo "Format huge device" +_dmhugedisk_init $((blksz * 2 * 4400)) # a little over 2^22 blocks +_mkfs_dev -d agcount=2 $DMHUGEDISK_DEV +_mount $DMHUGEDISK_DEV $SCRATCH_MNT +xfs_info $SCRATCH_MNT >> $seqres.full + +echo "Create the original file blocks" +mkdir $testdir +blksz="$(stat -f $testdir -c '%S')" +nr_blks=2100000 # 2^21 plus a little more +$XFS_IO_PROG -f -c "falloc 0 $((nr_blks * blksz))" $testdir/file1 >> $seqres.full + +echo "Check extent count" +xfs_bmap -l -p -v $testdir/file1 | grep '^[[:space:]]*1:' -q && xfs_bmap -l -p -v $testdir/file1 +inum=$(stat -c '%i' $testdir/file1) +umount $SCRATCH_MNT + +echo "Check bmap count" +nr_bmaps=$(xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV | grep 'data offset' | wc -l) +test $nr_bmaps -gt 1 || xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV +#xfs_db -c "agf 0" -c p -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV + +echo "Check rmap count" +nr_rmaps=$(xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" | wc -l) +test $nr_rmaps -eq 1 || xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" + +echo "Check and fake-repair huge filesystem" | tee -a $seqres.full +$XFS_DB_PROG -c 'check' $DMHUGEDISK_DEV +$XFS_REPAIR_PROG -n $DMHUGEDISK_DEV >> $seqres.full 2>&1 +test $? -eq 0 || echo "xfs_repair -n failed, see $seqres.full" + +echo "Real repair huge filesystem" | tee -a $seqres.full +$XFS_REPAIR_PROG $DMHUGEDISK_DEV >> $seqres.full 2>&1 +test $? -eq 0 || echo "xfs_repair failed, see $seqres.full" + +echo "Check bmap count again" +nr_bmaps=$(xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV | grep 'data offset' | wc -l) +test $nr_bmaps -gt 1 || xfs_db -c "inode $inum" -c "bmap" $DMHUGEDISK_DEV + +echo "Check rmap count again" +nr_rmaps=$(xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" | wc -l) +test $nr_rmaps -eq 1 || xfs_db -c 'agf 0' -c 'addr rmaproot' -c 'p' $DMHUGEDISK_DEV | grep ",$inum,[0-9]*,1,0,0" + +echo "Check and fake-repair huge filesystem again" | tee -a $seqres.full +$XFS_DB_PROG -c 'check' $DMHUGEDISK_DEV +$XFS_REPAIR_PROG -n $DMHUGEDISK_DEV >> $seqres.full 2>&1 +_dmhugedisk_cleanup + +echo "Done" + +# success, all done +status=0 +exit diff --git a/tests/xfs/856.out b/tests/xfs/856.out new file mode 100644 index 0000000..b24ebf2 --- /dev/null +++ b/tests/xfs/856.out @@ -0,0 +1,13 @@ +QA output created by 856 +Figure out block size +Format huge device +Create the original file blocks +Check extent count +Check bmap count +Check rmap count +Check and fake-repair huge filesystem +Real repair huge filesystem +Check bmap count again +Check rmap count again +Check and fake-repair huge filesystem again +Done diff --git a/tests/xfs/group b/tests/xfs/group index f0ca410..6ff24d9 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -288,3 +288,4 @@ 853 auto quick clone 854 auto quick clone 855 auto clone +856 auto clone rmap From darrick.wong@oracle.com Thu May 26 23:11:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B96B47CA0 for ; Thu, 26 May 2016 23:11:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7AF01304039 for ; Thu, 26 May 2016 21:11:48 -0700 (PDT) X-ASG-Debug-ID: 1464322300-04bdf05ad595e5f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id PRDamVzG3GvD5s1v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 26 May 2016 21:11:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4R4BXUO031494 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 04:11:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4R4BW8x001779 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 04:11:33 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4R4BTaQ030904; Fri, 27 May 2016 04:11:30 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 May 2016 21:11:29 -0700 Date: Thu, 26 May 2016 21:11:28 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: linux-mm@kvack.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fail ->bmap for reflink inodes Message-ID: <20160527041127.GA5053@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fail ->bmap for reflink inodes References: <1464267724-31423-1-git-send-email-hch@lst.de> <1464267724-31423-2-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1464267724-31423-2-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464322300 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1354 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 26, 2016 at 03:02:04PM +0200, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_aops.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index a955552..d053a9e 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1829,6 +1829,17 @@ xfs_vm_bmap( > > trace_xfs_vm_bmap(XFS_I(inode)); > xfs_ilock(ip, XFS_IOLOCK_SHARED); > + > + /* > + * The swap code (ab-)uses ->bmap to get a block mapping and then > + * bypasseѕ the file system for actual I/O. We really can't allow > + * that on reflinks inodes, so we have to skip out here. And yes, > + * 0 is the magic code for a bmap error.. > + */ > + if (xfs_is_reflink_inode(ip)) { > + xfs_iunlock(ip, XFS_IOLOCK_SHARED); > + return 0; > + } /me adds to the reflink patchpile, thanks. Just poking at mm/swapfile.c it looks like iomap might work well as a replacement for repeated bmap() calls, once the iomap vfs bits get in. --D > filemap_write_and_wait(mapping); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > return generic_block_bmap(mapping, block, xfs_get_blocks); > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jack@suse.cz Fri May 27 11:12:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E571D7CA0 for ; Fri, 27 May 2016 11:12:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A38FAC009 for ; Fri, 27 May 2016 09:12:39 -0700 (PDT) X-ASG-Debug-ID: 1464365554-04cbb0356a9991f0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6XfaPJflOzO4DNQe (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 27 May 2016 09:12:36 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5F90FAAA3; Fri, 27 May 2016 16:12:34 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id B5C231E0DD9; Fri, 27 May 2016 18:12:33 +0200 (CEST) Date: Fri, 27 May 2016 18:12:33 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , Al Viro , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, Miklos Szeredi , xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160527161233.GE21780@quack2.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1464279600-13009-1-git-send-email-jack@suse.cz> <1464279600-13009-2-git-send-email-jack@suse.cz> <20160526215304.GO21200@dastard> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="6TrnltStXW4iwmi0" Content-Disposition: inline In-Reply-To: <20160526215304.GO21200@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464365555 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2318 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --6TrnltStXW4iwmi0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri 27-05-16 07:53:04, Dave Chinner wrote: > On Thu, May 26, 2016 at 06:19:56PM +0200, Jan Kara wrote: > > To avoid clearing of capabilities or security related extended > > attributes too early, inode_change_ok() will need to take dentry instead > > of inode. Propagate dentry down to functions calling inode_change_ok(). > > This is rather straightforward except for xfs_set_mode() function which > > does not have dentry easily available. Luckily that function does not > > call inode_change_ok() anyway so we just have to do a little dance with > > function prototypes. > > The idea behind the change is good, but I think the little dance > could be improved as it makes the layering of the code seem weirdly > unbalanced to me. e.g. > > xfs_vn_setattr() > xfs_vn_setattr_size() <<<< inode_change_ok() here > > xfs_vn_setattr() > xfs_vn_setattr_nonsize() <<<< inode_change_ok() here > xfs_setattr_nonsize() > > xfs_vn_setattr() > xfs_vn_setattr_size() > xfs_vn_setattr_nonsize() <<<< inode_change_ok() here > xfs_setattr_nonsize() > > And to be more confusing, the externally callable functions for the > rest of the XFS code are now xfs_vn_setattr_size() and > xfs_setattr_nonsize() which now have different calling context > limitations. > > I think adding a little symmetric make sense. i.e: > > xfs_vn_change_ok(dentry, iattr) > { > + if (mp->m_flags & XFS_MOUNT_RDONLY) > + return -EROFS; > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; > + > + error = inode_change_ok(inode, iattr); > + if (error) > + return error; > + > } > > xfs_vn_setattr_size(d, i) > { > xfs_vn_change_ok(d, i) > xfs_setattr_size(ip, i) > } > > xfs_vn_setattr_nonsize(d, i) > { > xfs_vn_change_ok(d, i) > xfs_setattr_nonsize(ip, i) > } > > xfs_vn_setattr(d, i) > { > xfs_vn_change_ok(d, i) > > } > > And remove the inode_change_ok() code from xfs_setattr_size and > xfs_setattr_nonsize() completely. You've already done this with > xfs_vn_setattr_nonsize() - it just needs to be made symmetric to > keep a clean layering between VFS interfaces and internal XFS > interfaces... Ok, something like attached patch? Honza -- Jan Kara SUSE Labs, CR --6TrnltStXW4iwmi0 Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="0001-xfs-Propagate-dentry-down-to-inode_change_ok.patch" >From 163d931793395f4d19c9f55cae1168d3f7cc26ba Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 26 May 2016 14:46:43 +0200 Subject: [PATCH] xfs: Propagate dentry down to inode_change_ok() To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. Propagate dentry down to functions calling inode_change_ok(). This is rather straightforward except for xfs_set_mode() function which does not have dentry easily available. Luckily that function does not call inode_change_ok() anyway so we just have to do a little dance with function prototypes. Signed-off-by: Jan Kara --- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 94 ++++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_iops.h | 3 +- 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 85ce3032f815..b562cc5faae1 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1024,7 +1024,7 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(file), &iattr); if (error) goto out_unlock; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606deee31..6adfc757d8c6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1724,7 +1724,7 @@ xfs_inactive_truncate( /* * Log the inode size first to prevent stale data exposure in the event * of a system crash before the truncate completes. See the related - * comment in xfs_setattr_size() for details. + * comment in xfs_vn_setattr_size() for details. */ ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcb6c19ce3ea..1d441bfacf59 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -731,7 +731,7 @@ xfs_ioc_space( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = bf->l_start; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(filp), &iattr); break; default: ASSERT(0); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index fb7dc61f4a29..9e40c1c5dfe6 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -527,6 +527,30 @@ xfs_setattr_time( inode->i_mtime = iattr->ia_mtime; } +static int +xfs_vn_change_ok( + struct dentry *dentry, + struct iattr *iattr) +{ + struct inode *inode = d_inode(dentry); + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + + if (mp->m_flags & XFS_MOUNT_RDONLY) + return -EROFS; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + return inode_change_ok(inode, iattr); +} + +/* + * Set non-size attributes of an inode. + * + * Caution: The caller of this function is responsible for calling + * inode_change_ok() or otherwise verifying the change is fine. + */ int xfs_setattr_nonsize( struct xfs_inode *ip, @@ -543,21 +567,6 @@ xfs_setattr_nonsize( struct xfs_dquot *udqp = NULL, *gdqp = NULL; struct xfs_dquot *olddquot1 = NULL, *olddquot2 = NULL; - trace_xfs_setattr(ip); - - /* If acls are being inherited, we already have this checked */ - if (!(flags & XFS_ATTR_NOACL)) { - if (mp->m_flags & XFS_MOUNT_RDONLY) - return -EROFS; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - error = inode_change_ok(inode, iattr); - if (error) - return error; - } - ASSERT((mask & ATTR_SIZE) == 0); /* @@ -731,8 +740,27 @@ out_trans_cancel: return error; } +int +xfs_vn_setattr_nonsize( + struct dentry *dentry, + struct iattr *iattr) +{ + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + int error; + + trace_xfs_setattr(ip); + + error = xfs_vn_change_ok(dentry, iattr); + if (error) + return error; + return xfs_setattr_nonsize(ip, iattr, 0); +} + /* * Truncate file. Must have write permission and not be a directory. + * + * Caution: The caller of this function is responsible for calling + * inode_change_ok() or otherwise verifying the change is fine. */ int xfs_setattr_size( @@ -747,18 +775,6 @@ xfs_setattr_size( uint lock_flags = 0; bool did_zeroing = false; - trace_xfs_setattr(ip); - - if (mp->m_flags & XFS_MOUNT_RDONLY) - return -EROFS; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - error = inode_change_ok(inode, iattr); - if (error) - return error; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL)); ASSERT(S_ISREG(inode->i_mode)); @@ -931,16 +947,32 @@ out_trans_cancel: goto out_unlock; } +int +xfs_vn_setattr_size( + struct dentry *dentry, + struct iattr *iattr) +{ + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + int error; + + trace_xfs_setattr(ip); + + error = xfs_vn_change_ok(dentry, iattr); + if (error) + return error; + return xfs_setattr_size(ip, iattr); +} + STATIC int xfs_vn_setattr( struct dentry *dentry, struct iattr *iattr) { - struct xfs_inode *ip = XFS_I(d_inode(dentry)); int error; if (iattr->ia_valid & ATTR_SIZE) { - uint iolock = XFS_IOLOCK_EXCL; + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + uint iolock = XFS_IOLOCK_EXCL; xfs_ilock(ip, iolock); error = xfs_break_layouts(d_inode(dentry), &iolock, true); @@ -948,11 +980,11 @@ xfs_vn_setattr( xfs_ilock(ip, XFS_MMAPLOCK_EXCL); iolock |= XFS_MMAPLOCK_EXCL; - error = xfs_setattr_size(ip, iattr); + error = xfs_vn_setattr_size(dentry, iattr); } xfs_iunlock(ip, iolock); } else { - error = xfs_setattr_nonsize(ip, iattr, 0); + error = xfs_vn_setattr_nonsize(dentry, iattr); } return error; diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h index a0f84abb0d09..0259a383721a 100644 --- a/fs/xfs/xfs_iops.h +++ b/fs/xfs/xfs_iops.h @@ -33,6 +33,7 @@ extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); extern void xfs_setattr_time(struct xfs_inode *ip, struct iattr *iattr); extern int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); -extern int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap); +extern int xfs_vn_setattr_nonsize(struct dentry *dentry, struct iattr *vap); +extern int xfs_vn_setattr_size(struct dentry *dentry, struct iattr *vap); #endif /* __XFS_IOPS_H__ */ -- 2.6.6 --6TrnltStXW4iwmi0-- From gwendal@google.com Fri May 27 11:35:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 611AE7CA1 for ; Fri, 27 May 2016 11:35:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0D81AC009 for ; Fri, 27 May 2016 09:35:17 -0700 (PDT) X-ASG-Debug-ID: 1464366911-04cb6c2db997d7e0001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id jfuqRD3DAaCvbDcj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 27 May 2016 09:35:11 -0700 (PDT) X-Barracuda-Envelope-From: gwendal@google.com X-Barracuda-Effective-Source-IP: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id a136so80786755wme.0 for ; Fri, 27 May 2016 09:35:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=RDoeiUBtahcappPs4cz0B8OgdPfYI2n4dPQunostb6M=; b=QUC7isooqmJi2kdtpMrWF8IhPpQGmlWpMiNm/COU7NXeufRtz5tJgNOYE3GbwWrXel GpmSHWCDvaMFwKGLi2D/rXXXA1M8JKaMExl+ZyfVSWk6qoLCQcUKieRGK9TqvJhVNXMs G9g1J4MO/G9lbSaDHnhQGhg+UmI5h7dPxOqaIrv2k90orGXDAkLCJ7MubEpcsrct4YGd zHGL/iZrlwU/L+cKYd08S4n2as0mLytKrpUZCy4VGxEy8HVJ62jEt3IibsAUQl3y/EZ8 iYXwRkuPMKCAWILgGCTrHlZHGt+PBdcUoFbSDMYKWKYfONDhscq/skyoC9IBUvt1qqh1 5Aaw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=RDoeiUBtahcappPs4cz0B8OgdPfYI2n4dPQunostb6M=; b=jlwrSLR7gEEUQ75va3AbFqDwjLKq36GCiWON4zjhHeJO/U/fz5gQ24nz+lBhZw4vVm SrkSk1t6MyJO9pCLe1gVTF1mSfsRCskUej3dsfHkr3B+nPfxhM7Zrx+A1OFN0bg46DOB 8EqEQvKGfz81BLIyEyx9rY7xy0IxYnrSL3hoE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=RDoeiUBtahcappPs4cz0B8OgdPfYI2n4dPQunostb6M=; b=HLiTwETctNzQe8W860X//yN9MQuwxS30eL3aL5vNwYxL6H0KcxLRmnC7BABYd40jYf BY/ECsIxl1CfnPr3KZ+vDsfByVll0R/IqNCrJ4fuS319zEE0Gr7+Z4zTuHf9NlGtRCWE KmtXzXRT/ndhZsTItDJUqXjCvGUkGYqckJ4z5+iZB55Bdmc5wT7faiLvlYXNQnxsdYIF zyFVe2fZM/kshvoeiMQ9oW2Pufkh1LawvzRjs1GZx+bGbAXrKAGPgNLU5mESpiG3JxVj vSGvpiDL5XLeDBE3KsmNc2E9o6AkCEjRkGA267jABDH0FTtKxJX/9qlF22DfzUHyOiyw Xe7w== X-Gm-Message-State: ALyK8tJSeU9aRRlo9LQFfobV8JEb/50z5zi/yzrhCFS3LmZB3RBXGpCm3FKkv2PQE/1G9nveheWkWAvNnm4IRCV0 X-Received: by 10.194.201.37 with SMTP id jx5mr15392037wjc.60.1464366910485; Fri, 27 May 2016 09:35:10 -0700 (PDT) MIME-Version: 1.0 Sender: gwendal@google.com Received: by 10.28.157.213 with HTTP; Fri, 27 May 2016 09:34:50 -0700 (PDT) In-Reply-To: <20160202180828.GA13880@infradead.org> References: <1437913255-7524-4-git-send-email-tytso@mit.edu> <1454361909-36538-1-git-send-email-gwendal@chromium.org> <20160202180828.GA13880@infradead.org> From: Gwendal Grignou Date: Fri, 27 May 2016 09:34:50 -0700 X-Google-Sender-Auth: hFwvEQqKaPgKFsejPxmDsQIxkZ8 Message-ID: Subject: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation To: Christoph Hellwig X-ASG-Orig-Subj: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation Cc: Gwendal Grignou , "Theodore Ts'o" , fstests@vger.kernel.org, xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b5d5ffe85aa930533d57d46 X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1464366911 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1761 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29949 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b5d5ffe85aa930533d57d46 Content-Type: text/plain; charset=UTF-8 Looking at xfsprogs-4.5.0, that patch has not been applied. Did it not work? It still applies cleanly on 4.5. Gwendal. On Tue, Feb 2, 2016 at 10:08 AM, Christoph Hellwig wrote: > On Mon, Feb 01, 2016 at 01:25:09PM -0800, Gwendal Grignou wrote: > > When cross compiling, CFLAGS may contains option for the cros-compiler > the > > host compiler can not handle. > > Add BUILD_CFLAGS variable that does not include $OPTIMIZER options. > > I would have expected this to be HOST_CFLAGS, but it seems the > BUILD_ convention already exists in xfsprogs, so sticking to it > looks fine to me. > > Reviewed-by: Christoph Hellwig > --047d7b5d5ffe85aa930533d57d46 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Looking at xfsprogs-4.5.0, that patch has not been applied= . Did it not work?
It still applies cleanly on 4.5.

<= div>Gwendal.

On Tue, Feb 2, 2016 at 10:08 AM, Christoph Hellwig <hch@inf= radead.org> wrote:
On Mon, Feb 01, 2016 at 01:25:09PM -0800, Gwendal Grignou wrote: > When cross compiling, CFLAGS may contains option for the cros-compiler= the
> host compiler can not handle.
> Add BUILD_CFLAGS variable that does not include $OPTIMIZER options.
I would have expected this to be HOST_CFLAGS, but it seems the
BUILD_ convention already exists in xfsprogs, so sticking to it
looks fine to me.

Reviewed-by: Christoph Hellwig <hch@lst.de= >

--047d7b5d5ffe85aa930533d57d46-- From avi@cloudius-systems.com Fri May 27 12:32:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC6FC7CA3 for ; Fri, 27 May 2016 12:32:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80AB08F804C for ; Fri, 27 May 2016 10:32:26 -0700 (PDT) X-ASG-Debug-ID: 1464370341-04cb6c2dbb987680001-NocioJ Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41]) by cuda.sgi.com with ESMTP id 1w1Qi3pZppZBV98v (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 27 May 2016 10:32:22 -0700 (PDT) X-Barracuda-Envelope-From: avi@cloudius-systems.com X-Barracuda-Effective-Source-IP: mail-wm0-f41.google.com[74.125.82.41] X-Barracuda-Apparent-Source-IP: 74.125.82.41 Received: by mail-wm0-f41.google.com with SMTP id z87so1299698wmh.0 for ; Fri, 27 May 2016 10:32:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=scylladb-com.20150623.gappssmtp.com; s=20150623; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=QuOeBlG1MmejtwE76NpKQGQcvqB4RxdnMouSiU0WeZA=; b=j99GRC6AZapsIqIUj4c1P9RhaL0G6scrpGY3+kAIKan8xRyGVpCA81kUxSivOHAmHu dP3CV+32DvMKLB246Swmn/La0kDfJ1zY938B0tlp8Ru6EVQrIKHSDKBdJ+goOfevsObe YdWee1eE4Y+NXeqeyLBD5Sr9sDObxW7gxiD9G/NzqE8vcal5As3ou2a6GJMGxZYK2RSI X92rWEqbEa0f/UWvuDimkUsONaWxeIbkgwWOREUHgaHBHWbObNXIgedgPtJmT1k1O1pS tJt1I9dZFjfgGADYmScXAMri5g+rzFgc7IqHQeIIOBfDb4LQQH/RWppmTpcOYM6NgoTd FQNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=QuOeBlG1MmejtwE76NpKQGQcvqB4RxdnMouSiU0WeZA=; b=aPxFMujZM6NeFJ/wN4c1W5V59jb3aGOCrszqrZCUphuyXIwHN4sWhaaZTIb/2VEaFG g5AmIApqHgGnfSaWnD2+wRgI8nDfMjNQGmVw5M1g3OYKaKmqA9XwhBuUQPDEKy6bBvr4 t1JWi3HDrmBxgrNJVrAORoY24E985jUO0M/9oYWwKVVcZyzwP1pfF/HQBt1wsUZOBJmp I8kjahqylHKztnVQI9dXEQDYHe+URn3fdivKo60xz+b46Dgkiw9XBRqabPDf3MBtRk1y P0BQsW5tFmLaKP95J4UaLIKDHspHmi5IFtSZd/Nbg+htS+CuLDFVcRyFxvWFQWc4Cwsc 3sYQ== X-Gm-Message-State: ALyK8tITpfWpCIDutxOdsBVjownsgX+NaISQkh2eN8KtW6OHIq5OxhKrU5blw5tia/9b0Q== X-Received: by 10.28.31.68 with SMTP id f65mr9716527wmf.45.1464370341596; Fri, 27 May 2016 10:32:21 -0700 (PDT) Received: from [10.0.0.5] (bzq-79-176-25-165.red.bezeqint.net. [79.176.25.165]) by smtp.googlemail.com with ESMTPSA id x124sm9612573wmg.24.2016.05.27.10.32.19 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 27 May 2016 10:32:20 -0700 (PDT) Subject: Re: [PATCH] xfs: fail ->bmap for reflink inodes To: Christoph Hellwig , darrick.wong@oracle.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fail ->bmap for reflink inodes References: <1464267724-31423-1-git-send-email-hch@lst.de> <1464267724-31423-2-git-send-email-hch@lst.de> Cc: linux-mm@kvack.org, xfs@oss.sgi.com From: Avi Kivity Message-ID: <71afd256-5dfe-2ff9-ac25-b7519dadd5f9@scylladb.com> Date: Fri, 27 May 2016 20:32:18 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464267724-31423-2-git-send-email-hch@lst.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-wm0-f41.google.com[74.125.82.41] X-Barracuda-Start-Time: 1464370342 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1108 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 05/26/2016 04:02 PM, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_aops.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index a955552..d053a9e 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1829,6 +1829,17 @@ xfs_vm_bmap( > > trace_xfs_vm_bmap(XFS_I(inode)); > xfs_ilock(ip, XFS_IOLOCK_SHARED); > + > + /* > + * The swap code (ab-)uses ->bmap to get a block mapping and then > + * bypasseѕ the file system for actual I/O. We really can't allow > + * that on reflinks inodes, so we have to skip out here. And yes, > + * 0 is the magic code for a bmap error.. > + */ > + if (xfs_is_reflink_inode(ip)) { > + xfs_iunlock(ip, XFS_IOLOCK_SHARED); > + return 0; > + } > filemap_write_and_wait(mapping); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > return generic_block_bmap(mapping, block, xfs_get_blocks); Don't you also have to prevent a swapfile from being reflinked after it's bmapped? Or is that already taken care of? From darrick.wong@oracle.com Fri May 27 12:41:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 756F17CA6 for ; Fri, 27 May 2016 12:41:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 463ED304032 for ; Fri, 27 May 2016 10:41:00 -0700 (PDT) X-ASG-Debug-ID: 1464370858-04cbb0356a9b2e00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id eJO3Jx13eG8b6SPY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 27 May 2016 10:40:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4RHesnf022036 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 17:40:54 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u4RHes5J019887 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 17:40:54 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4RHepSr003465; Fri, 27 May 2016 17:40:53 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 27 May 2016 10:40:51 -0700 Date: Fri, 27 May 2016 10:40:50 -0700 From: "Darrick J. Wong" To: Avi Kivity Cc: Christoph Hellwig , linux-mm@kvack.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fail ->bmap for reflink inodes Message-ID: <20160527174050.GA3509@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fail ->bmap for reflink inodes References: <1464267724-31423-1-git-send-email-hch@lst.de> <1464267724-31423-2-git-send-email-hch@lst.de> <71afd256-5dfe-2ff9-ac25-b7519dadd5f9@scylladb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <71afd256-5dfe-2ff9-ac25-b7519dadd5f9@scylladb.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464370858 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1248 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, May 27, 2016 at 08:32:18PM +0300, Avi Kivity wrote: > On 05/26/2016 04:02 PM, Christoph Hellwig wrote: > >Signed-off-by: Christoph Hellwig > >--- > > fs/xfs/xfs_aops.c | 11 +++++++++++ > > 1 file changed, 11 insertions(+) > > > >diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > >index a955552..d053a9e 100644 > >--- a/fs/xfs/xfs_aops.c > >+++ b/fs/xfs/xfs_aops.c > >@@ -1829,6 +1829,17 @@ xfs_vm_bmap( > > trace_xfs_vm_bmap(XFS_I(inode)); > > xfs_ilock(ip, XFS_IOLOCK_SHARED); > >+ > >+ /* > >+ * The swap code (ab-)uses ->bmap to get a block mapping and then > >+ * bypasseѕ the file system for actual I/O. We really can't allow > >+ * that on reflinks inodes, so we have to skip out here. And yes, > >+ * 0 is the magic code for a bmap error.. > >+ */ > >+ if (xfs_is_reflink_inode(ip)) { > >+ xfs_iunlock(ip, XFS_IOLOCK_SHARED); > >+ return 0; > >+ } > > filemap_write_and_wait(mapping); > > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > return generic_block_bmap(mapping, block, xfs_get_blocks); > > Don't you also have to prevent a swapfile from being reflinked after it's > bmapped? Or is that already taken care of? Already taken care of, at least for XFS. --D From darrick.wong@oracle.com Fri May 27 13:02:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EBEA17CAE for ; Fri, 27 May 2016 13:02:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F038A8F8033 for ; Fri, 27 May 2016 11:02:54 -0700 (PDT) X-ASG-Debug-ID: 1464372172-04bdf05ad79a6670001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id oSAioCicKUConUvA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 27 May 2016 11:02:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4RI2b0Q025668 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 27 May 2016 18:02:37 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u4RI2aJP006228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 May 2016 18:02:36 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4RI2X6d013378; Fri, 27 May 2016 18:02:34 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 27 May 2016 11:02:33 -0700 Date: Fri, 27 May 2016 11:02:31 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Xiao Yang Subject: [PATCH 8/7] xfs/122: don't break on old xfsprogs Message-ID: <20160527180231.GB5050@birch.djwong.org> X-ASG-Orig-Subj: [PATCH 8/7] xfs/122: don't break on old xfsprogs References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1464372172 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1619 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If we're running against a old version of xfsprogs that lacks some of the structures that the golden output knows about, copy the structure size definition from the golden output to the program output. This way we can check for structure size mutations on old xfsprogs without generating false error reports for structs that don't exist in the old release. Signed-off-by: Darrick J. Wong --- tests/xfs/122 | 8 ++++++++ tests/xfs/122.out | 1 + 2 files changed, 9 insertions(+) diff --git a/tests/xfs/122 b/tests/xfs/122 index 845cdd2..c944942 100755 --- a/tests/xfs/122 +++ b/tests/xfs/122 @@ -73,6 +73,7 @@ _attribute_filter() cprog=$tmp.get_structs.c oprog=$tmp.get_structs progout=$tmp.output +keyfile=$tmp.keys cat >$cprog <>$progout; fi +# Find all the items that only exist in the golden output +comm -23 <(grep '=' $0.out | sed -e 's/ =.*$//g' | LC_COLLATE=POSIX sort) \ + <(sed -e 's/ =.*$//g' < $progout | LC_COLLATE=POSIX sort) > $keyfile + +# Copy those items to the program output +grep -F -f $keyfile $0.out >> $progout + LC_COLLATE=POSIX sort $progout status=0 diff --git a/tests/xfs/122.out b/tests/xfs/122.out index 451871e..46d1dd4 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -147,3 +147,4 @@ sizeof(xfs_lookup_t) = 4 sizeof(xfs_qoff_logformat_t) = 20 sizeof(xfs_timestamp_t) = 8 sizeof(xfs_trans_header_t) = 16 +sizeof(xfs_zzzz_test_the_test_program) = -47 From MAILER-DAEMON Fri May 27 17:39:55 2016 Return-Path: <> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 381737CB0 for ; Fri, 27 May 2016 17:39:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0BFDA304048 for ; Fri, 27 May 2016 15:39:52 -0700 (PDT) X-ASG-Debug-ID: 1464388788-04cb6c2dba99df00001-NocioJ Received: from gourmet8.spamgourmet.com (gourmet.spamgourmet.com [216.75.62.102]) by cuda.sgi.com with ESMTP id HbOzycQdl7eonVNQ (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 27 May 2016 15:39:48 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Effective-Source-IP: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Apparent-Source-IP: 216.75.62.102 Received: from spamgourmet by gourmet7.spamgourmet.com with local (Exim 4.80) (envelope-from ) id 1b6QQ0-00056Z-09 for xfs@oss.sgi.com; Fri, 27 May 2016 22:39:48 +0000 Received: from mail-wm0-f66.google.com ([74.125.82.66]) by gourmet7.spamgourmet.com with esmtps (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1b6QPz-000551-H7 for ; Fri, 27 May 2016 22:39:47 +0000 Received: by mail-wm0-f66.google.com with SMTP id q62so2636623wmg.3 for <>; Fri, 27 May 2016 15:39:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to; bh=uR0WRdlcDXgE3higI3K6tTVZe5XP2ceqigtSD0nwhtQ=; b=N64wGPMpl8jDDgfzu9qbVXf5INiE9uDo38KF6dcJg38j1ointPQ/qD5r0LxXc8hL0L 1kNyRQrIopTKEvRYr6kFBTce/z6ZtZvuxhJWSBlNSCMZ1SItefmoOsGx6dLZxr/Falyu gJ+a/pGpHMZA2vR+n18XH7yi8Gihwh+tcExy37XsrNpKDbePs4UDINofXsDDJbXKX4+L uFUOb//El1EVekM3lTV/K+V77I/T4Gmyuh6kGKz9RHhHi7G6T3QpxKoFbMCJMUsqr3NM MM5Yd5sc8dO+kkAqCT9BQ6unzMb8+dI9A4zFwZn5hL76V+2j86eLTtRPWMURK2i1CMyZ xqVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:date:message-id:subject:from :to; bh=uR0WRdlcDXgE3higI3K6tTVZe5XP2ceqigtSD0nwhtQ=; b=bIWONeoYtcsch7OLl8cXnujucyIfXT13Bv94iOy4JR94zRhksc8j4VE2DzRodTlP6t /Sq1lh4bm5TrOEzxyDJaIt6KaLNJlO4GMaQC8C7PXh/kL8jmIFt4f0wg+XRJktg7rFHw 2dQIJNBEM9KNGOeyRIy3qQieREY84hyIYv2ilHB39i+PvTGepc1yrPQ6EVJaIsJjVH+D hXzLDLXZ/cJE6YJfXSUgqBusXR7oImaJyrcdLJa2NrJ/0mzBOltDV69HrglAUzpkdLkf PlWleI5W2Gaa2MKYJIjMtjOtnN97M6mYv+JIQHKCkhg8zSAGGdnZabyiGnjWtaJChdRl 3NlA== X-Gm-Message-State: ALyK8tJ3xvZgnDQ9cnMRU8MBmwQ0NZj+iKz0/aldhSwoSxNAS1BAv9UluXrrBtkB8tJn+9w/tzePUCRGwT472Q== MIME-Version: 1.0 X-Received: by 10.194.186.179 with SMTP id fl19mr18529729wjc.2.1464388785726; Fri, 27 May 2016 15:39:45 -0700 (PDT) Sender: xfs.pkoch@dfgh.net Received: by 10.194.152.71 with HTTP; Fri, 27 May 2016 15:39:45 -0700 (PDT) Date: Sat, 28 May 2016 00:39:45 +0200 X-Google-Sender-Auth: JeHjEjTeHX385-DW4J6D6WPOtWs Message-ID: Subject: xfsrestore performance From: xfs.pkoch@dfgh.net X-ASG-Orig-Subj: xfsrestore performance To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bb03d8a62eec50533da95c4 X-Barracuda-Connect: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Start-Time: 1464388788 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12433 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, EMPTY_ENV_FROM, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bb03d8a62eec50533da95c4 Content-Type: text/plain; charset=UTF-8 Dear XFS experts, I was using a 16TB linux mdraid raid10 volume built from 16 seagate 2TB disks, which was formatted with an ext3 filesystem. It contained a couple of hundred very large files (ZFS full and incremental dumps with sizes between 10GB and 400GB). It also contained 7 million files from our users home directories, which where backuped with rsync --link-dest=, so most of these files are just hard links to previous versions. Two weeks ago I increased the volume from 16TB to 20TB which can be done with linux mdraid while still using the filesystem. Reshaping lasts two days. Then I umounted the ext3 filesystem to grow it from 16TB to 20TB. And guess what - ext3 does not support filesystem > 16TB. I decided to change the filesystem to XFS but the system must be online during weekdays so I have a 48 hour timeframe to do lenghty copies. I added a 16TB temporary RAID5 volume to the machine and here's what I did so far: 1: create a 14TB XFS-filesystem on the temporary RAID5-volume 2: first rsync run to copy the ext3 fs to the temporary XFS-fs, this took 6 days 3: another rsync run to copy what changed during the first run, this took another 2 days 4: another rsync run to copy what changed during the second run, this took another day 5: xfsdump the temporary xfs fs to /dev/null. took 20 hours 5: remounting the ext3 fs readonly and do a final rsync run to copy what changed during the third run. This took 10 hours. 6: delete the ext3 fs and create a 20TB xfs fs 7: copy back the temporary xfs fs to the new xfs fs using xfsdump | xfsrestore Here's my problem Since dumping the temporary xfs fs to /dev/null needed less than a day I expected the xfsdump | xfsrestore combination to be finished in less than 2 day. xfsdump | xfsrestore should be a lot fasten than rsync since it justs pumps blocks from one xfs fs into another one. But either xfsrestore is painfully slow or I did something wrong: Please have a look: root@backup:/var/tmp# xfsdump -J -p600 - /xtmp | xfsrestore -J -a /var/tmp - /xtmp2 xfsrestore: using file dump (drive_simple) strategy xfsdump: using file dump (drive_simple) strategy xfsrestore: version 3.1.3 (dump format 3.0) xfsdump: version 3.1.3 (dump format 3.0) xfsrestore: searching media for dump xfsdump: level 0 dump of backup:/xtmp xfsdump: dump date: Fri May 27 13:15:42 2016 xfsdump: session id: adb95c2e-332b-4dde-9c8b-e03760d5a83b xfsdump: session label: "" xfsdump: ino map phase 1: constructing initial dump list xfsdump: status at 13:25:42: inomap phase 1 14008321/28643415 inos scanned, 600 seconds elapsed xfsdump: ino map phase 2: skipping (no pruning necessary) xfsdump: ino map phase 3: skipping (only one dump stream) xfsdump: ino map construction complete xfsdump: estimated dump size: 12831156312640 bytes xfsdump: creating dump session media file 0 (media 0, file 0) xfsdump: dumping ino map xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: hostname: backup xfsrestore: mount point: /xtmp xfsrestore: volume: /dev/md6 xfsrestore: session time: Fri May 27 13:15:42 2016 xfsrestore: level: 0 xfsrestore: session label: "" xfsrestore: media label: "" xfsrestore: file system id: 29825afd-5d7e-485f-9eb1-8871a21ce71d xfsrestore: session id: adb95c2e-332b-4dde-9c8b-e03760d5a83b xfsrestore: media id: 5ef22542-774a-4504-a823-d007d2ce4720 xfsrestore: searching media for directory dump xfsrestore: NOTE: attempt to reserve 1162387864 bytes for /var/tmp/xfsrestorehousekeepingdir/dirattr using XFS_IOC_RESVSP64 failed: Operation not supported (95) xfsrestore: NOTE: attempt to reserve 286438226 bytes for /var/tmp/xfsrestorehousekeepingdir/namreg using XFS_IOC_RESVSP64 failed: Operation not supported (95) xfsrestore: reading directories xfsdump: dumping directories xfsdump: dumping non-directory files xfsdump: status at 20:04:52: 1/7886560 files dumped, 0.0% data dumped, 24550 seconds elapsed xfsrestore: 20756853 directories and 274128228 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files xfsdump: status at 21:27:27: 26/7886560 files dumped, 0.0% data dumped, 29505 seconds elapsed xfsdump: status at 21:35:46: 20930/7886560 files dumped, 0.0% data dumped, 30004 seconds elapsed xfsdump: status at 21:46:26: 46979/7886560 files dumped, 0.1% data dumped, 30644 seconds elapsed xfsdump: status at 21:55:52: 51521/7886560 files dumped, 0.1% data dumped, 31210 seconds elapsed xfsdump: status at 22:05:45: 57770/7886560 files dumped, 0.1% data dumped, 31803 seconds elapsed xfsdump: status at 22:15:43: 63142/7886560 files dumped, 0.1% data dumped, 32401 seconds elapsed xfsdump: status at 22:25:42: 73621/7886560 files dumped, 0.1% data dumped, 33000 seconds elapsed xfsdump: status at 22:35:51: 91223/7886560 files dumped, 0.1% data dumped, 33609 seconds elapsed xfsdump: status at 22:45:42: 94096/7886560 files dumped, 0.2% data dumped, 34200 seconds elapsed xfsdump: status at 22:55:42: 96702/7886560 files dumped, 0.2% data dumped, 34800 seconds elapsed xfsdump: status at 23:05:42: 102808/7886560 files dumped, 0.2% data dumped, 35400 seconds elapsed xfsdump: status at 23:16:15: 107096/7886560 files dumped, 0.2% data dumped, 36033 seconds elapsed xfsdump: status at 23:25:47: 109079/7886560 files dumped, 0.2% data dumped, 36605 seconds elapsed xfsdump: status at 23:35:52: 112318/7886560 files dumped, 0.2% data dumped, 37210 seconds elapsed xfsdump: status at 23:45:46: 114975/7886560 files dumped, 0.2% data dumped, 37804 seconds elapsed xfsdump: status at 23:55:55: 117260/7886560 files dumped, 0.2% data dumped, 38413 seconds elapsed xfsdump: status at 00:05:44: 118722/7886560 files dumped, 0.2% data dumped, 39002 seconds elapsed Seems like 2 days was a little optimistic Any ideas what's going wrong here? Peter Koch --047d7bb03d8a62eec50533da95c4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear XFS experts,<= br>
I was using a 16TB linux mdraid raid10 volume built from 16 se= agate
2TB disks, which was formatted with an ext3 filesystem. It contain= ed
a couple of hundred very large files (ZFS full and incremental dumps<= br>with sizes between 10GB and 400GB). It also contained 7 million
files= from our users home directories, which where backuped with
rsync --link= -dest=3D<last backup dir>, so most of these files are
just hard li= nks to previous versions.

Two weeks ago I increased the volume= from 16TB to 20TB which
can be done with linux mdraid while still using= the filesystem.
Reshaping lasts two days. Then I umounted the ext3 file= system
to grow it from 16TB to 20TB. And guess what - ext3 does not
s= upport filesystem > 16TB.

I decided to change the filesyste= m to XFS but the system must be
online during weekdays so I have a= 48 hour timeframe to do
lenghty copies.

I added a 16= TB temporary RAID5 volume to the machine and here's
what I did so fa= r:

1: create a 14TB XFS-filesystem on the temporary RAID5-volume
= 2: first rsync run to copy the ext3 fs to the temporary XFS-fs,
this took 6 days
3: another rsync run to copy what changed= during the first run,
this took another 2 days
4: another= rsync run to copy what changed during the second run,
this took a= nother day
5: xfsdump the temporary xfs fs to /dev/null. took= 20 hours
5: remounting the ext3 fs readonly and do a fi= nal rsync run to
copy what changed during the third run. This took 10 ho= urs.
6: delete the ext3 fs and create a 20TB xfs fs
=
7: copy back the temporary xfs fs to the new xfs fs using
xfsdump | xfsrestore

Here's my problem Since dumpin= g the temporary xfs fs to /dev/null
needed less than a day I = expected the xfsdump | xfsrestore
combination to be finished = in less than 2 day. xfsdump | xfsrestore
should be a lot fast= en than rsync since it justs pumps blocks from
one xfs fs into another o= ne.

But either xfsrestore is painfully slow or I did some= thing wrong:

Please have a look:

root@backup:/var/= tmp# xfsdump -J -p600 - /xtmp | xfsrestore -J -a /var/tmp - /xtmp2
xfsre= store: using file dump (drive_simple) strategy
xfsdump: using file dump = (drive_simple) strategy
xfsrestore: version 3.1.3 (dump format 3.0)
x= fsdump: version 3.1.3 (dump format 3.0)
xfsrestore: searching media for = dump
xfsdump: level 0 dump of backup:/xtmp
xfsdump: dump date: Fri Ma= y 27 13:15:42 2016
xfsdump: session id: adb95c2e-332b-4dde-9c8b-e03760d5= a83b
xfsdump: session label: ""
xfsdump: ino map phase 1: c= onstructing initial dump list
xfsdump: status at 13:25:42: inomap phase = 1 14008321/28643415 inos scanned, 600 seconds elapsed
xfsdump: ino map p= hase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skippi= ng (only one dump stream)
xfsdump: ino map construction complete
xfsd= ump: estimated dump size: 12831156312640 bytes
xfsdump: creating dump se= ssion media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsrest= ore: examining media file 0
xfsrestore: dump description:
xfsrestore:= hostname: backup
xfsrestore: mount point: /xtmp
xfsrestore: volume: = /dev/md6
xfsrestore: session time: Fri May 27 13:15:42 2016
xfsrestor= e: level: 0
xfsrestore: session label: ""
xfsrestore: media= label: ""
xfsrestore: file system id: 29825afd-5d7e-485f-9eb1= -8871a21ce71d
xfsrestore: session id: adb95c2e-332b-4dde-9c8b-e03760d5a8= 3b
xfsrestore: media id: 5ef22542-774a-4504-a823-d007d2ce4720
xfsrest= ore: searching media for directory dump
xfsrestore: NOTE: attempt to res= erve 1162387864 bytes for /var/tmp/xfsrestorehousekeepingdir/dirattr using = XFS_IOC_RESVSP64 failed: Operation not supported (95)
xfsrestore: NOTE: = attempt to reserve 286438226 bytes for /var/tmp/xfsrestorehousekeepingdir/n= amreg using XFS_IOC_RESVSP64 failed: Operation not supported (95)
xfsres= tore: reading directories
xfsdump: dumping directories
xfsdump: dumpi= ng non-directory files
xfsdump: status at 20:04:52: 1/7886560 files dump= ed, 0.0% data dumped, 24550 seconds elapsed
xfsrestore: 20756853 directo= ries and 274128228 entries processed
xfsrestore: directory post-processi= ng
xfsrestore: restoring non-directory files
xfsdump: status at 21:27= :27: 26/7886560 files dumped, 0.0% data dumped, 29505 seconds elapsed
xf= sdump: status at 21:35:46: 20930/7886560 files dumped, 0.0% data dumped, 30= 004 seconds elapsed
xfsdump: status at 21:46:26: 46979/7886560 files dum= ped, 0.1% data dumped, 30644 seconds elapsed
xfsdump: status at 21:55:52= : 51521/7886560 files dumped, 0.1% data dumped, 31210 seconds elapsed
xf= sdump: status at 22:05:45: 57770/7886560 files dumped, 0.1% data dumped, 31= 803 seconds elapsed
xfsdump: status at 22:15:43: 63142/7886560 files dum= ped, 0.1% data dumped, 32401 seconds elapsed
xfsdump: status at 22:25:42= : 73621/7886560 files dumped, 0.1% data dumped, 33000 seconds elapsed
xf= sdump: status at 22:35:51: 91223/7886560 files dumped, 0.1% data dumped, 33= 609 seconds elapsed
xfsdump: status at 22:45:42: 94096/7886560 files dum= ped, 0.2% data dumped, 34200 seconds elapsed
xfsdump: status at 22:55:42= : 96702/7886560 files dumped, 0.2% data dumped, 34800 seconds elapsed
xf= sdump: status at 23:05:42: 102808/7886560 files dumped, 0.2% data dumped, 3= 5400 seconds elapsed
xfsdump: status at 23:16:15: 107096/7886560 files d= umped, 0.2% data dumped, 36033 seconds elapsed
xfsdump: status at 23:25:= 47: 109079/7886560 files dumped, 0.2% data dumped, 36605 seconds elapsedxfsdump: status at 23:35:52: 112318/7886560 files dumped, 0.2% data dumped= , 37210 seconds elapsed
xfsdump: status at 23:45:46: 114975/7886560 file= s dumped, 0.2% data dumped, 37804 seconds elapsed
xfsdump: status at 23:= 55:55: 117260/7886560 files dumped, 0.2% data dumped, 38413 seconds elapsed=
xfsdump: status at 00:05:44: 118722/7886560 files dumped, 0.2% data dum= ped, 39002 seconds elapsed

Seems like 2 days w= as a little optimistic

Any ideas what's going wrong here?<= br>
Peter Koch
--047d7bb03d8a62eec50533da95c4-- From MAILER-DAEMON Sat May 28 04:25:43 2016 Return-Path: <> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7764D7CB2 for ; Sat, 28 May 2016 04:25:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49BF0304053 for ; Sat, 28 May 2016 02:25:40 -0700 (PDT) X-ASG-Debug-ID: 1464427534-04cb6c2dbb9c5d60001-NocioJ Received: from gourmet8.spamgourmet.com (gourmet.spamgourmet.com [216.75.62.102]) by cuda.sgi.com with ESMTP id IJvTvrhyE0Qoh81D (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Sat, 28 May 2016 02:25:35 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Effective-Source-IP: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Apparent-Source-IP: 216.75.62.102 Received: from spamgourmet by gourmet7.spamgourmet.com with local (Exim 4.80) (envelope-from ) id 1b6aUw-0006UY-EE for xfs@oss.sgi.com; Sat, 28 May 2016 09:25:34 +0000 Received: from mail-wm0-f42.google.com ([74.125.82.42]) by gourmet7.spamgourmet.com with esmtps (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1b6aUw-0006Ts-1o for ; Sat, 28 May 2016 09:25:34 +0000 Received: by mail-wm0-f42.google.com with SMTP id a136so21357786wme.0 for <>; Sat, 28 May 2016 02:25:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to; bh=Tidjd1OpLaFWwXkHf5PZ82zbF/f58IBIBvJgFtjZ4MA=; b=ypnFpBSq72QSoDB/6ybVFiDRKg+vJu3769i/PitByEQYDZr4tx1J9GB/ZBzW1h06OS uPz1sjOSvdCHIKkuE/35ClE/BX0JvLm9vxlhTlkdz3LbNWXpx4aJ7SpfBLpH+hzeMetB fSQ+hvHAM+Y5nwL+Frn94hYwowBSWjSLgef2XVYQDFN/HaJ40heQeV0vAkkfVpTLi1T6 eJ+4HiuwsscKPJWAc55Z8sjO2nBMBwTUHuqLpthNooQgjGly2QH0N97EXOROw/28O+k4 VAFh6h//8MJOpxtU8RIwhVH36fn+uf8bad/fzF5AoNoMyAfV+EIODeTLkpznFv4UwvYp //jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to; bh=Tidjd1OpLaFWwXkHf5PZ82zbF/f58IBIBvJgFtjZ4MA=; b=VJnQsXo9VGHOoH92MKGKy086ALXljD1vdi2QatQV+XS1z6AP9qs0PNPzTkjsPdk6ae 3fD5iRMDF4jnkbnkJWFxNk03qK265qcxBTVcv4ViT//6JXxQ/CnQRhmvRN8BP0jSlfBR LRp/shmt2lR7QnaPHf4uM5yZgy5RHVlSqwdl+vFnJeWOP0zwCicT5/XqYFrmTa2NC6wY EH4kQxvyIcUzPMwvbivDdtLVAFbe73ZklBt0XwdoXiOM9mqDwu95NRldRDRy8rAs9nxQ d25W6WNCvmSaWXYf+VYxAxhfLxBXbYreQkT6tFSM5sC1S3RLBE9jlTJfnl8qSxl2TDm8 1iKw== X-Gm-Message-State: ALyK8tITJ33KcKg/0PeoIoULYDUPa4xinqX9q+1jJDfalcX8N7XFKCSb4OOVgOiQdIPAV9sHub/ps9zcaUNXDw== MIME-Version: 1.0 X-Received: by 10.28.25.129 with SMTP id 123mr2616774wmz.10.1464427532446; Sat, 28 May 2016 02:25:32 -0700 (PDT) Sender: xfs.pkoch@dfgh.net Received: by 10.194.152.71 with HTTP; Sat, 28 May 2016 02:25:32 -0700 (PDT) In-Reply-To: References: Date: Sat, 28 May 2016 11:25:32 +0200 X-Google-Sender-Auth: OPN314TUi2zyz1xI3_6Ml-KYwCQ Message-ID: Subject: Re: xfsrestore performance From: xfs.pkoch@dfgh.net X-ASG-Orig-Subj: Re: xfsrestore performance To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a114d3ceedef6ca0533e39a1f X-Barracuda-Connect: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Start-Time: 1464427535 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2291 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, EMPTY_ENV_FROM, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a114d3ceedef6ca0533e39a1f Content-Type: text/plain; charset=UTF-8 Dear XFS experts, I checked the situation this morning: .... xfsdump: status at 10:25:53: 473543/7886560 files dumped, 1.3% data dumped, 76211 seconds elapsed xfsdump: status at 10:35:46: 478508/7886560 files dumped, 1.3% data dumped, 76804 seconds elapsed and decided to stop the process. With this kind of speed xfsdump | xfsrestore will need more than one month. Something must be seriously wrong here. I see two options: Use rsync again to copy the data from the 14TB xfs filesystem to the new 20TB xfs filesystem. This won't be finished this weekend. Or use dd to copy the 14TB XFS filesystem into the 20TB volume and then grow the filesystem. dd runs at 300MB/sec that's approx 1TB per hour, so I decided to go this way. So here's another question: The new filesystem will run on a 20 disk raid10 volume and was copied from a 16 disk raid5 volume. So swidth will be wrong. Also all the data will be within the first 15TB. What should I do to fix this? Or will xfs_growfs fix it automatically? Regards Peter Koch --001a114d3ceedef6ca0533e39a1f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear XFS experts,

I check= ed the situation this morning:

....
xfsdump: status at 10:25:53: = 473543/7886560 files dumped, 1.3% data dumped, 76211 seconds elapsed
xfs= dump: status at 10:35:46: 478508/7886560 files dumped, 1.3% data dumped, 76= 804 seconds elapsed

and decided to stop the process. With this= kind of speed xfsdump | xfsrestore
will need more than one month.= Something must be seriously wrong here.

I see two option= s: Use rsync again to copy the data from the 14TB xfs
filesystem to the = new 20TB xfs filesystem. This won't be finished
this week= end.

Or use dd to copy the 14TB XFS filesystem into the 2= 0TB volume and
then grow the filesystem.

dd runs at 300MB/sec tha= t's approx 1TB per hour, so I decided to go this
way.

So here= 's another question: The new filesystem will run on a 20 disk raid10volume and was copied from a 16 disk raid5 volume. So swidth will be wrong= .
Also all the data will be within the first 15TB.

What should I = do to fix this? Or will xfs_growfs fix it automatically?

Regards
=
Peter Koch
--001a114d3ceedef6ca0533e39a1f-- From bfoster@redhat.com Sat May 28 08:23:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 833327CB4 for ; Sat, 28 May 2016 08:23:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5561E304053 for ; Sat, 28 May 2016 06:23:16 -0700 (PDT) X-ASG-Debug-ID: 1464441794-04cb6c2dba9ca770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id P8WGZZg2Htx9JrC6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 28 May 2016 06:23:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5C4F0804E8; Sat, 28 May 2016 13:23:14 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-63.bos.redhat.com [10.18.41.63]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4SDNDWH006753; Sat, 28 May 2016 09:23:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F21C3120092; Sat, 28 May 2016 09:23:12 -0400 (EDT) Date: Sat, 28 May 2016 09:23:12 -0400 From: Brian Foster To: xfs.pkoch@dfgh.net Cc: xfs@oss.sgi.com Subject: Re: xfsrestore performance Message-ID: <20160528132312.GA62624@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfsrestore performance References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Sat, 28 May 2016 13:23:14 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464441795 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2219 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, May 28, 2016 at 11:25:32AM +0200, xfs.pkoch@dfgh.net wrote: > Dear XFS experts, > > I checked the situation this morning: > > .... > xfsdump: status at 10:25:53: 473543/7886560 files dumped, 1.3% data dumped, > 76211 seconds elapsed > xfsdump: status at 10:35:46: 478508/7886560 files dumped, 1.3% data dumped, > 76804 seconds elapsed > > and decided to stop the process. With this kind of speed xfsdump | > xfsrestore > will need more than one month. Something must be seriously wrong here. > I don't have much experience working with xfsdump so I couldn't really comment here without spending some significant time playing around with it. Hopefully somebody else can chime in on this. > I see two options: Use rsync again to copy the data from the 14TB xfs > filesystem to the new 20TB xfs filesystem. This won't be finished > this weekend. > Could you temporarily promote your 14TB fs to production in order to make the data available while an rsync process migrates the data back over to the properly formatted 20TB fs? > Or use dd to copy the 14TB XFS filesystem into the 20TB volume and > then grow the filesystem. > > dd runs at 300MB/sec that's approx 1TB per hour, so I decided to go this > way. > > So here's another question: The new filesystem will run on a 20 disk raid10 > volume and was copied from a 16 disk raid5 volume. So swidth will be wrong. > Also all the data will be within the first 15TB. > > What should I do to fix this? Or will xfs_growfs fix it automatically? > xfs_growfs will add more allocation groups based on the size of the current storage. It won't reallocate existing files or anything of that nature. You can't change the stripe unit/width parameters after the fact, afaik. The only way to accomplish this appropriately that I can think of is to forcibly reformat the temporary filesystem with the settings targeted to the longer term storage, reimport the data from the production volume and then copy over the raw block device. Brian > Regards > > Peter Koch > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hajlu@udws.com Sat May 28 13:03:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=HTML_MESSAGE,TVD_FROM_1 autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A94C7CB6 for ; Sat, 28 May 2016 13:03:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E1696304051 for ; Sat, 28 May 2016 11:03:21 -0700 (PDT) X-ASG-Debug-ID: 1464458596-04cb6c2db99d5570001-NocioJ Received: from udws.com ([14.114.17.236]) by cuda.sgi.com with ESMTP id TihK54FFiB12nWnT for ; Sat, 28 May 2016 11:03:16 -0700 (PDT) X-Barracuda-Envelope-From: hajlu@udws.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.114.17.236] X-Barracuda-Apparent-Source-IP: 14.114.17.236 Received: from PC201504130015 ([127.0.0.1]) by localhost via TCP with ESMTPA; Sun, 29 May 2016 02:03:01 +0800 Disposition-Notification-To: chang-he@vip.126.com MIME-Version: 1.0 From: "Christy Huang" Sender: "Christy Huang" To: xfs@oss.sgi.com Reply-To: "Christy Huang" Date: 29 May 2016 02:03:01 +0800 Subject: =?utf-8?B?T0VNIEdhcm1lbnQgRmFjdG9yeSBmb3IgS2FwcGEoNDQp?= Content-Type: multipart/mixed; boundary=--boundary_1281181_b5bc1943-6fe4-43b9-b30d-970a58e75068 X-ASG-Orig-Subj: =?utf-8?B?T0VNIEdhcm1lbnQgRmFjdG9yeSBmb3IgS2FwcGEoNDQp?= X-Barracuda-Connect: UNKNOWN[14.114.17.236] X-Barracuda-Start-Time: 1464458596 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4445 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160528180321.B75151296080@cuda.sgi.com> ----boundary_1281181_b5bc1943-6fe4-43b9-b30d-970a58e75068 Content-Type: multipart/alternative; boundary=--boundary_1281180_142ee4b6-f381-47e4-a0e9-5d9019ee05c6 ----boundary_1281180_142ee4b6-f381-47e4-a0e9-5d9019ee05c6 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8sIEkgYW0gQ2hyaXN0eSBIdWFuZyBmcm9tIENoYW5naGUgR2FybWVudCBDby4sIEx0 ZC4sIGEgcmVsaWFibGUgY2hpbmEgZ2FybWVudCBPRU0vT0RNIG1hbnVmYWN0dXJlciBmb3Ig cmVub3duZWQgd29ybGQgYnJhbmRzLCBzdWNoIGFzIEthcHBhLCBGaWxhLCBPY2hpcmx5IGFu ZCBzbyBvbi4gV2UgYXJlIGEgcHJvZnJlc3Npb25hbCBtYW51ZmFjdHVyZXJzLCB3aXRoIDQ1 MCB3b3JrZXJzLCBhY2NyZWRpdGVkIHdpdGggY2VydGlmaWNhdGVzIG9mIENPQywgV0NBKFdv cmtwbGFjZSBDb25kaXRpb25zIEFzc2Vzc21lbnQpLCBHU1YoR2xvYmFsIFNlY3VyaXR5IFZl cmlmaWNhdGlvbiksIGFuZCBXUkFQLCBCU0NJKHdpbGwgYmUgdXBncmFkZWQgaWYgbmVlZGVk KS4gDQoNCk91ciBwcm9kdWN0aW9uIHJhbmdlIGluY2x1ZGVzLCAxLikgTEFESUVTIERSRVNT RVMgMi4pIFBPTE8sIFQgU0hJUlRTIDMuKSBKQUNLRVRTIDQuKUhPT0RJRVMgNS4pIFNQT1JU UyBXRUFSUyA2LikgVU5ERVJXRUFSLiANCg0KV2l0aCB5ZWFyc+KAmSBleHBlcmllbmNlIGlu IHRoZSB0ZXh0aWxlIGFuZCBnYXJtZW50IGluZHVzdHJ5LCB3ZSBvZmZlciBmYXZvcmFibGUg cXVvdGF0aW9uLCBxdWljayBkZWxpdmVyeSwgc3RhYmxlIHF1YWxpdHkgYW5kIHByb2Zlc3Np b25hbCBzZXJ2aWNlLiANCg0KV2Ugc2luY2VyZWx5IGxvb2sgZm9yd2FyZCB0byB5b3VyIHJl cXVlc3QuIA0KDQpCZXN0IFJlZ2FyZHMNCg0KQ2hyaXN0eSBIdWFuZw0KQ2hhbmdoZSBHYXJt ZW50IENvLiwgTHRkLg0KY2hhbmctaGVAdmlwLjEyNi5jb20NCg0KDQpUZWw6IDAwODYtNzYw LTg2Njk4MTE4IA0KDQpGYXg6IDAwODYtNzYwLTg2MzMzNzM5DQombmJzcDsNCg== ----boundary_1281180_142ee4b6-f381-47e4-a0e9-5d9019ee05c6 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBs YW5nPUVOLVVTPjxGT05UIGZhY2U9Q2FsaWJyaT48Rk9OVCBzaXplPTM+SGVsbG8sIEkgYW0g Q2hyaXN0eSBIdWFuZyBmcm9tIDxTVFJPTkc+Q2hhbmdoZSBHYXJtZW50IENvLiwgTHRkLjwv U1RST05HPiwgYSByZWxpYWJsZSBjaGluYSBnYXJtZW50IE9FTS9PRE0gbWFudWZhY3R1cmVy IGZvciByZW5vd25lZCB3b3JsZCBicmFuZHMsIHN1Y2ggYXMgPFNUUk9ORz5LYXBwYSwgRmls YSwgT2NoaXJseTwvU1RST05HPiBhbmQgc28gb24uIFdlIGFyZSBhIHByb2ZyZXNzaW9uYWwg bWFudWZhY3R1cmVycywgd2l0aCA0NTAgd29ya2VycywgYWNjcmVkaXRlZCB3aXRoIGNlcnRp ZmljYXRlcyBvZiBDT0MsIFdDQShXb3JrcGxhY2UgQ29uZGl0aW9ucyBBc3Nlc3NtZW50KSwg R1NWKEdsb2JhbCBTZWN1cml0eSBWZXJpZmljYXRpb24pLCBhbmQgV1JBUCwgQlNDSSh3aWxs IGJlIHVwZ3JhZGVkIGlmIG5lZWRlZCkuPFNQQU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVz Ij4gPC9TUEFOPjw/eG1sOm5hbWVzcGFjZSBwcmVmaXggPSBvIG5zID0gInVybjpzY2hlbWFz LW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgLz48bzpwPjwvbzpwPjwvRk9OVD48L0ZP TlQ+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1N c29Ob3JtYWw+PFNQQU4gbGFuZz1FTi1VUz48Rk9OVCBmYWNlPUNhbGlicmk+PEZPTlQgc2l6 ZT0zPjxTUEFOIHN0eWxlPSJtc28tc3BhY2VydW46IHllcyI+PC9TUEFOPjxvOnA+PC9vOnA+ PC9GT05UPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjxGT05UIGZhY2U9Q2FsaWJy aT48Rk9OVCBzaXplPTM+T3VyIHByb2R1Y3Rpb24gcmFuZ2UgaW5jbHVkZXMsIDEuKSBMQURJ RVMgRFJFU1NFUzxTUEFOIHN0eWxlPSJtc28tc3BhY2VydW46IHllcyI+IDwvU1BBTj4yLikg UE9MTywgVCBTSElSVFMgMy4pIEpBQ0tFVFM8U1BBTiBzdHlsZT0ibXNvLXNwYWNlcnVuOiB5 ZXMiPiA8L1NQQU4+NC4pSE9PRElFUzxTUEFOIHN0eWxlPSJtc28tc3BhY2VydW46IHllcyI+ IDwvU1BBTj41LikgU1BPUlRTIFdFQVJTPFNQQU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVz Ij4gPC9TUEFOPjYuKSBVTkRFUldFQVIuIDwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQ IHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFu Zz1FTi1VUz48L1NQQU4+PFNQQU4gbGFuZz1FTi1VUz48bzpwPjxGT05UIHNpemU9MyBmYWNl PUNhbGlicmk+PC9GT05UPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAw Y20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+PEZPTlQgc2l6 ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT5XaXRoIHllYXJz4oCZIGV4cGVyaWVuY2UgaW4gdGhl IHRleHRpbGUgYW5kIGdhcm1lbnQgaW5kdXN0cnksIHdlIG9mZmVyIGZhdm9yYWJsZSBxdW90 YXRpb24sIHF1aWNrIGRlbGl2ZXJ5LCBzdGFibGUgcXVhbGl0eSBhbmQgcHJvZmVzc2lvbmFs IHNlcnZpY2UuIDwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFuZz1FTi1VUz48L1NQQU4+ PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48 U1BBTiBsYW5nPUVOLVVTPjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTPjxGT05UIHNpemU9Mz48 Rk9OVCBmYWNlPUNhbGlicmk+V2Ugc2luY2VyZWx5IGxvb2sgZm9yd2FyZCB0byB5b3VyIHJl cXVlc3QuIDxvOnA+PC9vOnA+PC9GT05UPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVT PjxvOnA+PEZPTlQgc2l6ZT0zIGZhY2U9Q2FsaWJyaT48L0ZPTlQ+PC9vOnA+PC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gbGFuZz1FTi1VUz48Rk9OVCBzaXplPTM+PEZPTlQgZmFjZT1DYWxpYnJpPkJlc3QgUmVn YXJkczxvOnA+PC9vOnA+PC9GT05UPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1B UkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjxv OnA+PEZPTlQgc2l6ZT0zIGZhY2U9Q2FsaWJyaT48L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4N CjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g bGFuZz1FTi1VUz48Rk9OVCBzaXplPTM+PEZPTlQgZmFjZT1DYWxpYnJpPkNocmlzdHkgSHVh bmc8L0ZPTlQ+PC9GT05UPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNt IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+PEZPTlQgc2l6ZT0zPjxG T05UIGZhY2U9Q2FsaWJyaT5DaGFuZ2hlIEdhcm1lbnQgQ28uLCBMdGQuPC9GT05UPjwvRk9O VD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjxGT05UIHNpemU9Mz48Rk9OVCBjb2xvcj1ibGFj ayBmYWNlPUNhbGlicmk+PG86cD48QSBocmVmPSJtYWlsdG86Y2hhbmctaGVAdmlwLjEyNi5j b20iPmNoYW5nLWhlQHZpcC4xMjYuY29tPC9BPjwvbzpwPjwvRk9OVD48L0ZPTlQ+PC9TUEFO PjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+ DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFO IGxhbmc9RU4tVVM+PEZPTlQgc2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBsYW5n PUVOLVVTPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNlPUNhbGlicmk+PG86cD48L286cD48L0ZP TlQ+PC9GT05UPjwvU1BBTj48bzpwPjwvbzpwPjwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4N CjxQPjxTUEFOIGxhbmc9RU4tVVM+PEZPTlQgc2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT5U ZWw6IDAwODYtNzYwLTg2Njk4MTE4PG86cD48L286cD48L0ZPTlQ+PC9GT05UPjwvU1BBTj4g PC9QPg0KPFA+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNlPUNhbGli cmk+RmF4OiAwMDg2LTc2MC04NjMzMzczOTwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQ IHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFu Zz1FTi1VUz48Rk9OVCBmYWNlPUNhbGlicmk+PC9GT05UPjwvU1BBTj4mbmJzcDs8L1A+DQo8 UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxh bmc9RU4tVVM+PEZPTlQgZmFjZT1DYWxpYnJpPjxJTUcgc3JjPSJjaWQ6MEBsb2NhbGhvc3Qi PjwvRk9OVD48L1NQQU4+PC9QPg== ----boundary_1281180_142ee4b6-f381-47e4-a0e9-5d9019ee05c6-- ----boundary_1281181_b5bc1943-6fe4-43b9-b30d-970a58e75068 Content-Type: multipart/mixed; boundary=--boundary_1281182_a3d1d47c-f6c3-4526-a9b4-2f2f3c99192a ----boundary_1281182_a3d1d47c-f6c3-4526-a9b4-2f2f3c99192a Content-Type: image/jpeg; name=CHANGHE.jpg Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: <0@localhost> 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 /nP8FjyfN02/SfQKf+Zmx32L7btl3qenERDP+5Pu3fv/AJmxNif82vtVP2P9o+vud6celu4b /oP8Dt+j/wBdXAJKY9fm2/S+f6rP0ht0e/yP+a2671ft2+R68zu/k/S/7+hYv7E33fs79pet 6Lp3en6O33fz/of9pPU271wqSI26/wCEo/MNv+6fQHfsD1q/tn7S27mT6kxtn37t3u/7b96y +p/sr7DZ9i/aE+u3d9q/mt352/Z+j9f+b+l+kXJpJQ3+oWnrs61W37RX6u/0t7fU2fT2/n+n /wAItfD/AGd6L/sX7S9H1P0vG3fGvq7Pz9q5JJSz2/lwohv/AA3f/9n/7RduUGhvdG9zaG9w IDMuMAA4QklNBCUAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQPtAAAAAAAQASwAAAABAAIB LAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAeDhCSU0E GQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAA AjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAA AQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA//////////// /////////////////wPoAAAAAP////////////////////////////8D6AAAAAD///////// ////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAgA AAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADPwAAAAYA AAAAAAAAAAAAAPUAAALuAAAABWcqaAeYmAAtADEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEA AAAAAAAAAAAAAu4AAAD1AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAA AAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRv cCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAD1AAAAAFJnaHRsb25n AAAC7gAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNl SURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VP cmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAElt ZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAA TGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAA9QAAAABSZ2h0bG9uZwAAAu4AAAADdXJsVEVY VAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdU RVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAA AAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVy dEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlw ZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAA AAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmln aHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBBEAAAAAAAEB ADhCSU0EFAAAAAAABAAAAAI4QklNBAwAAAAAEb8AAAABAAAAoAAAADQAAAHgAABhgAAAEaMA GAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAAAAH/ 2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIADQAoAMBIgACEQEDEQH/3QAEAAr/xAE/ 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 A8O2Ob9Jv5qhnEe4aF7dJ8P2/IuhIcPCTq//0q/6p+2af2j637Z9T9V+x+j6P0z6G7/tN6v2 jf8AT/4JYuZ+yft132j7Zz/h9/qeXrep+k3rjElTjv8ApbfT/BZpddt3s6/+bG33xz+f6k/P 1P0S1ek/s/0Wfs77V6cnbE89/o/yV5ukjPb9P9iob/ovqjP2V6mu71pEzMzLtv0Pd++rA+we p7fT9TymeO0fyF5Gkoj/AITIPp9H1N3/ADd9ZkbPt3pu9Hbv2enpt9X/AAWzf/11ByP2bI2b vtn6X1PSnbEN9H1N3v3bNnoen/1xeZJJp+f/AAf0/wDuf6rOP9z/APVen9x6Q/tL9iU79nob q/R2/wA7G5vp+p+d6O7dsXdO/wCbPqH+ZmTO2YjXx/lryFJP5jptvP5f2sOP/C2i+s3/APNz 03bt/On2T6U/m/znt9bb+4s2/wD5n+iftv2/09/u9See2/7J7P8AzNecJKGG/wBf0P5z/BY8 nzdNv0n0Cn/mZsd9i+27Zd6npxEQz/uT7t37/wCZsTYn/Nr7VT9j/aPr7nenHpbuG/6D/A7f o/8AXVwCSmPX5tv0vn+qz9IbdHv8j/mtuu9X7dvkevM7v5P0v+/oWL+xN937O/aXrei6d3p+ jt938/6H/aT1Nu9cKkiNuv8AhKPzDb/un0B37A9av7Z+0tu5k+pMbZ9+7d7v+2/esvqf7K+w 2fYv2hPrt3fav5rd+dv2fo/X/m/pfpFyaSUN/qFp67OtVt+0V+rv9Le31Nn09v5/p/8ACLXw /wBnei/7F+0vR9T9Lxt3xr6uz8/auSSUs9v5cKIb/wAN3//ZADhCSU0EIQAAAAAAVQAAAAEB AAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABo AG8AdABvAHMAaABvAHAAIABDAFMANAAAAAEAOEJJTQQGAAAAAAAHAAEAAAABAQD/4RBEaHR0 cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1 TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5z Om1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjIuMi1jMDYzIDUzLjM1MjYyNCwg MjAwOC8wNy8zMC0xODoxMjoxOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRw Oi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x LjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5z OnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0i aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxu czpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5z OnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRw Oi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90 b3Nob3AgQ1M0IFdpbmRvd3MiIHhtcDpDcmVhdGVEYXRlPSIyMDExLTA4LTEwVDEyOjEwOjM4 KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDExLTA4LTEwVDEyOjEwOjM4KzA4OjAwIiB4 bXA6TW9kaWZ5RGF0ZT0iMjAxMS0wOC0xMFQxMjoxMDozOCswODowMCIgZGM6Zm9ybWF0PSJp bWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFGM0Y0OEI0MDZDM0UwMTFC MkEyREVEOThEN0NEMDBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFGM0Y0OEI0MDZD M0UwMTFCMkEyREVEOThEN0NEMDBBIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5k aWQ6QUYzRjQ4QjQwNkMzRTAxMUIyQTJERUQ5OEQ3Q0QwMEEiIHBob3Rvc2hvcDpDb2xvck1v ZGU9IjMiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAv MTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlv blVuaXQ9IjIiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwy NzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcw LDI3MSwyNzIsMzA1LDMxNSwzMzQzMjs1MUE0MDUxOEU1RTc3MzdGMkY0NjFDNTYzMEQyMTVC RiIgZXhpZjpQaXhlbFhEaW1lbnNpb249Ijc1MCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI0 NSIgZXhpZjpDb2xvclNwYWNlPSI2NTUzNSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0LDQw OTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2 ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3 Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQx NDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQx NzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQx OTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwx MSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtFNjND MDQxNzdBNTJDMEU1MjQ4MTU1RDY0RTJCQjBCNCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNl cT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9Inht cC5paWQ6QUYzRjQ4QjQwNkMzRTAxMUIyQTJERUQ5OEQ3Q0QwMEEiIHN0RXZ0OndoZW49IjIw MTEtMDgtMTBUMTI6MTA6MzgrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBo b3Rvc2hvcCBDUzQgV2luZG93cyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9y ZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/ Pv/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwM DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4U EQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAPUC7gMB IgACEQEDEQH/3QAEAC//xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEB AQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMi cYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD 03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQD BAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhai soMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2 JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/ALfX9zMRtzTGx+x/my0em7/pbEL6vAnEsPM2fwCv /WWk/sbI2N3O9kD4Oa5Vvqszd01znN2uNjvwAU4IHMGQ/dCyj7ZHi6DDt7ozLzPKi6qEwrHZ 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 L3xfR9cqOT6rtrWn3O/OI7/nbWqtkTPu9PZubPpzz5LyxJWYVwQ/uuj0ls+1j1I14kT8Z7Kh 9YP2D+1vf6f83zTx/aA9u5eRpKTS4/2uS+kf9i4qHojFN8a/aC4af2Ny5j6x/s37ez9n7Az0 2bxVPp79fV9I2e9c8kpYfN1/wls/kj8nzfo/z/8AhOg70/bxug7pV/F+0+hpAG72fTLt+38z YsBJTsX727vt9X9h50zs30czMy6f5CrMLP2adG+rv1JLvU/zY+gslJN+zdd1O+3V9i6OLv2P gSRHo18jy14O1aDvW2nbPI8ZXhqSqTrw/FdB95r37TMbtusKvhbYftmN2nM/gvDkkNPD8Vfa +7md+kbIQHetuOzdGkzP9heHpI6fytT7lV9p2M9WN35+yeUfSfdt5/N4XgySZp4f85L72fSl u7ZHu5j+KgPQ3O/mufdOz8V4Oklp/V/5yPtfc/1ODu9GfPYlX9nk+nt29oheGJIaeH/OVH6v uY27Tu27vPhP7dgjZ5yvC0k3T+r+K77X3N/862Pox+bHCCO/qhps2mNxaD/ZmV4kkndP0U/a +33/APN30HbRjepsbyRu3z7pQWHB2e8UbduklkfKQvFkk7Sun0tZJ9qP7MkyMfZPu3bISP7K gz9kJ1mPT/gvFUktPD8Vv2Ps9f7Hj9D6PHs27N3yVd/7M3U7/S9Xe6Adn0P5c+5eQJJaV0/F d9j7Gf2Tv9oqnvBG35KVXoek3dtnb+dtleNJIaeH/OU+0HZub6xZ6c/nAc/mqEY8u3Fp+Ab+ EOXjSSGn9X/nJ+19jt2+k6Nkx328x2Um/ZPbu9KPbO/YvGkkdP6v/OR9r7C39m+pZHobf7H/ AEER/wCzJ1+y7PbG30+F40klp4f85X2Prz/2X6v/AGm27tfoTwpWfsuGR6Ed/oLx9JHTw/FX 2PpP1kiKPS2mv037I5+n32rT/U/TZPpRA42cwvI0ktKjt/zlder6zd6Ea7In3Rtj5q2PsW1u 4Vb47kf3LxtJDTw/5y37X2EfZd3FfB/dmP7Kvu2/sumI9GTxG2J/zV4eknaXHb8V32PsT/sW w+n6G7tu2KP6OWQK477S2PlovH0kNP6v/OV9r6j1T7P9hu2Cr1drtuv5dq4V3LYiI7LISU2G uHp9LYpbup7d3ZM/btM8LMSUn2rG+2Nwj5Qk7fuCoJJwU9j9WPR9F8Fxs3e4ODQP7J+ktg/Z fzvTj+zC82SVeW58142fSHfZtp2+nE6ccKQ+zQI2z24XmqSSvsfRHenvH0fKE/v3d4XnSSSf tf/Z ----boundary_1281182_a3d1d47c-f6c3-4526-a9b4-2f2f3c99192a-- ----boundary_1281181_b5bc1943-6fe4-43b9-b30d-970a58e75068-- From debbugs@buxtehude.debian.org Sun May 29 05:51:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B5B2D7CB8 for ; Sun, 29 May 2016 05:51:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 659828F8037 for ; Sun, 29 May 2016 03:51:13 -0700 (PDT) X-ASG-Debug-ID: 1464519067-04bdf05ad5a155f0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id hfojyt79l5amujJ8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 29 May 2016 03:51:08 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1b6yJE-00064v-M5; Sun, 29 May 2016 10:51:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#822369: fixed in qemu 1:2.6+dfsg-1 Reply-To: James Clarke , 822369@bugs.debian.org X-ASG-Orig-Subj: Bug#822369: fixed in qemu 1:2.6+dfsg-1 Resent-From: James Clarke Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sun, 29 May 2016 10:51:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 822369 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 822369-submit@bugs.debian.org id=B822369.146451895122270 (code B ref 822369); Sun, 29 May 2016 10:51:02 +0000 Received: (at 822369) by bugs.debian.org; 29 May 2016 10:49:11 +0000 Received: from mail-wm0-x234.google.com ([2a00:1450:400c:c09::234]) by buxtehude.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1b6yHP-0005mg-IS for 822369@bugs.debian.org; Sun, 29 May 2016 10:49:11 +0000 Received: by mail-wm0-x234.google.com with SMTP id z87so39919579wmh.0 for <822369@bugs.debian.org>; Sun, 29 May 2016 03:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jrtc27.com; s=google; h=mime-version:subject:from:date:cc:message-id:references:to; bh=we749vKVdm0ajrImFgeuwzt3m/SFVTk26rdQg1pCB44=; b=eHoUA/IYix6mBnqAtR4H8pBk0kqozFUf/vmICM3M1++PfajYsd9Flq1GxGr+UBHsJH wNEjEzIHhZKEaKfBxGs6Gju28Uz92L8XIQ1+JtIwpcqqpDuvA2FmgyDhcrsR9jJOT9R0 ikArDkIw4h8jeQRr6Rulr4Ygf1wbAS6jqDd5I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:subject:from:date:cc:message-id :references:to; bh=we749vKVdm0ajrImFgeuwzt3m/SFVTk26rdQg1pCB44=; b=aLSNNFPKGtbXYAjIFEBCzvC8JxEPZhHeCMt7ML7i1eTk5/SrmDDzVEzsUbOkm/A2bR cIRPLuvAH1X8sTmh+Kh481FRs0lYMSTlGYIMOuFC65cXOzSqmBdckgzDkg398mXIHvmh WweCIGnvwjhZS680fVoWuOOY+5kgOOj4axwezjQfCxA+L0+QxT2Lg7Z1CUOmIzKnHKRH tPK+/36NN3XD9demKS+fz6QB0K1PhoPLvAMNf0GHOi8P8gMWdXEkL0K8E6m8iQQsjzbo fYRoN35PHaLdGZ7CgqmZ8nY36o1jabxBIVA0kathblknb/TVz56as1JHVqMdmwsKvVRE QYJg== X-Gm-Message-State: ALyK8tKGuxJOF9nf77yRZLlbOvVlJB55dVJkNE6M07rXqGAQc+87tCkn7Z9mld3jK9PIaQ== X-Received: by 10.194.108.197 with SMTP id hm5mr22563384wjb.167.1464518943971; Sun, 29 May 2016 03:49:03 -0700 (PDT) Received: from jrtc4a.trin.private.cam.ac.uk (global-184-8.nat-1.net.cam.ac.uk. [131.111.184.8]) by smtp.gmail.com with ESMTPSA id jq1sm28573404wjc.28.2016.05.29.03.49.02 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 29 May 2016 03:49:03 -0700 (PDT) Content-Type: multipart/signed; boundary="Apple-Mail=_A79FCB1A-BC31-4534-96B5-E0403D0211F4"; protocol="application/pgp-signature"; micalg=pgp-sha512 Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-Pgp-Agent: GPGMail 2.6b2 From: James Clarke Date: Sun, 29 May 2016 11:48:57 +0100 Cc: 822369@bugs.debian.org Message-Id: References: <573DCFAA.8000500@physik.fu-berlin.de> <573DD225.5040502@msgid.tls.msk.ru> <573DD3CC.6040608@physik.fu-berlin.de> <573DD6AF.5020608@msgid.tls.msk.ru> To: Michael Tokarev X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1464519068 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 225 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30002 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --Apple-Mail=_A79FCB1A-BC31-4534-96B5-E0403D0211F4 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Control: affects -1 - src:qemu On Thu, 19 May 2016 18:07:27 +0300 Michael Tokarev wrote: > Control: affects -1 - qemu > Control: That should have been src:qemu; fixed above :) Regards, James --Apple-Mail=_A79FCB1A-BC31-4534-96B5-E0403D0211F4 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- iQIcBAEBCgAGBQJXSskdAAoJELGTdwwYahx9uzoP/ArmUpIEvGKbgp/oJjRCXipv 7/A3KADkzt8BsAXpziDuyLl8H7Lfq1kykR6JuRBEZzWyzFXbVw5EFl9tb60lmoH5 CidR4bBuTdoI/fntY8NeCSocYIXosTWcuipS67G6vkqyWuxWckufjEbeJP1DWOpH UurKT+2MpC8iueGKj5w0q9S9PMtfsujLjOIGk5EBMwgY9lUImswAj9OqIjKiEXZd aqA7BDuILrCp08uYD9ALygu/iYWbbw4scTpq0DP/UZqS30Gdm/8DqsjFUZEkA4WB 9k9XCHu5flDjUn58QTCxQuBrU54jG/l9GbtcP9UPP2mqvO96SzkImKvKhyeVOe7/ IH7xcAqWpSU1mp2163XcptrOUfJIcQxfHerJfV8BN8gYy7hvardNSfMN0xD1mkud hqyVHRQG4eqaU21Q1Z02lPJRaWosMK7XLaL5VNsrbOZ/rwR3lgFjwAbRWvb+wIoP fxIzss5ITUiU2Mc46fuTlahpukqK141gCyMvziEADHDU/3Kz7rahBzcVenIoIXEd JZgd+naBbS21JIIhKQIYDwteeyKaPwayxgLgXo8000/bhGGppiR6AXmEz8XFCSZT Qr2KT71viETvWlMVXUfnxWAD+KqXZrM1hoZaTz9iIHaEu9XY9mVgAFQ8HxEdj0GC 8SGLOswXM3HkhH1sKVJO =M2tZ -----END PGP SIGNATURE----- --Apple-Mail=_A79FCB1A-BC31-4534-96B5-E0403D0211F4-- From debbugs@buxtehude.debian.org Sun May 29 05:51:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DECB47CBA for ; Sun, 29 May 2016 05:51:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88A668F8035 for ; Sun, 29 May 2016 03:51:11 -0700 (PDT) X-ASG-Debug-ID: 1464519069-04bdf05ad4a155f0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id HubAdBIAB1N6cDHl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 29 May 2016 03:51:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1b6yJH-00065G-7v; Sun, 29 May 2016 10:51:07 +0000 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 From: owner@bugs.debian.org (Debian Bug Tracking System) To: James Clarke CC: xfs@oss.sgi.com Subject: Processed: Re: Bug#822369: fixed in qemu 1:2.6+dfsg-1 Message-ID: X-ASG-Orig-Subj: Processed: Re: Bug#822369: fixed in qemu 1:2.6+dfsg-1 References: <20160423210831.GA19384@jirafa.cyrius.com> X-Debian-PR-Package: xfsprogs X-Debian-PR-Source: xfsprogs X-Debian-PR-Message: transcript X-Loop: owner@bugs.debian.org Date: Sun, 29 May 2016 10:51:07 +0000 X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1464519069 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 523 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30002 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Processing control commands: > affects -1 - src:qemu Bug #822369 [xfsprogs] xfsprogs: FTBFS: error: redefinition of 'struct fsxa= ttr' Bug #822470 [xfsprogs] qemu: FTBFS: error: redefinition of 'struct fsxattr' Removed indication that 822369 affects src:qemu Removed indication that 822470 affects src:qemu --=20 822369: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822369 822470: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822470 Debian Bug Tracking System Contact owner@bugs.debian.org with problems From david@fromorbit.com Sun May 29 17:36:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D97E7CA6 for ; Sun, 29 May 2016 17:36:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F86D304051 for ; Sun, 29 May 2016 15:36:47 -0700 (PDT) X-ASG-Debug-ID: 1464561403-04cbb0356aa1a0e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ND4twxAst9seArPG for ; Sun, 29 May 2016 15:36:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClAwAUbktXPP0/LHlcgzyBU4ZunlcGjCWFeIIPAQ2BeYJPgzwCAgEBAoEiORQBAQEBAQEBBgEBAQFCQIRGAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC68RgEBAQcCASQehUGEEoEDiiIFmDeOFo8mRY8HHgEBhEEqMokMAQEB Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 30 May 2016 08:06:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b79K5-0006nf-FL; Mon, 30 May 2016 08:36:41 +1000 Date: Mon, 30 May 2016 08:36:41 +1000 From: Dave Chinner To: Jan Kara Cc: Al Viro , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, Miklos Szeredi , xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160529223641.GJ26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1464279600-13009-1-git-send-email-jack@suse.cz> <1464279600-13009-2-git-send-email-jack@suse.cz> <20160526215304.GO21200@dastard> <20160527161233.GE21780@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160527161233.GE21780@quack2.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464561403 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2587 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30013 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, May 27, 2016 at 06:12:33PM +0200, Jan Kara wrote: > On Fri 27-05-16 07:53:04, Dave Chinner wrote: > > On Thu, May 26, 2016 at 06:19:56PM +0200, Jan Kara wrote: > > > To avoid clearing of capabilities or security related extended > > > attributes too early, inode_change_ok() will need to take dentry instead > > > of inode. Propagate dentry down to functions calling inode_change_ok(). > > > This is rather straightforward except for xfs_set_mode() function which > > > does not have dentry easily available. Luckily that function does not > > > call inode_change_ok() anyway so we just have to do a little dance with > > > function prototypes. > > > > The idea behind the change is good, but I think the little dance > > could be improved as it makes the layering of the code seem weirdly > > unbalanced to me. e.g. > > > > xfs_vn_setattr() > > xfs_vn_setattr_size() <<<< inode_change_ok() here > > > > xfs_vn_setattr() > > xfs_vn_setattr_nonsize() <<<< inode_change_ok() here > > xfs_setattr_nonsize() > > > > xfs_vn_setattr() > > xfs_vn_setattr_size() > > xfs_vn_setattr_nonsize() <<<< inode_change_ok() here > > xfs_setattr_nonsize() > > > > And to be more confusing, the externally callable functions for the > > rest of the XFS code are now xfs_vn_setattr_size() and > > xfs_setattr_nonsize() which now have different calling context > > limitations. > > > > I think adding a little symmetric make sense. i.e: > > > > xfs_vn_change_ok(dentry, iattr) > > { > > + if (mp->m_flags & XFS_MOUNT_RDONLY) > > + return -EROFS; > > + > > + if (XFS_FORCED_SHUTDOWN(mp)) > > + return -EIO; > > + > > + error = inode_change_ok(inode, iattr); > > + if (error) > > + return error; > > + > > } > > > > xfs_vn_setattr_size(d, i) > > { > > xfs_vn_change_ok(d, i) > > xfs_setattr_size(ip, i) > > } > > > > xfs_vn_setattr_nonsize(d, i) > > { > > xfs_vn_change_ok(d, i) > > xfs_setattr_nonsize(ip, i) > > } > > > > xfs_vn_setattr(d, i) > > { > > xfs_vn_change_ok(d, i) > > > > } > > > > And remove the inode_change_ok() code from xfs_setattr_size and > > xfs_setattr_nonsize() completely. You've already done this with > > xfs_vn_setattr_nonsize() - it just needs to be made symmetric to > > keep a clean layering between VFS interfaces and internal XFS > > interfaces... > > Ok, something like attached patch? Yup, looks much better to me! Acked-by: Dave Chinner -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 29 18:21:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6665E7CA7 for ; Sun, 29 May 2016 18:21:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3974330404E for ; Sun, 29 May 2016 16:20:59 -0700 (PDT) X-ASG-Debug-ID: 1464564055-04cbb0356ba1aa90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Q1KhHouaSTyne9oJ for ; Sun, 29 May 2016 16:20:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DHCwCjeEtXLf0/LHlcgzyBU4ZunlcGjCWKDoYLAgIBAQKBIT0QAQEBAQEBAQYBAQEBAUFAhEUBAQEDATocFQ4FCwgDGAklDwUlAwctiCcHvEsBAQgnHoVBhRWECRSGBQWTN4UAi2WCMYFzF4dkhTiPTDeCMRyBXSoyh0cBJgSBGgEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 30 May 2016 08:50:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7A0r-0006qS-R2; Mon, 30 May 2016 09:20:53 +1000 Date: Mon, 30 May 2016 09:20:53 +1000 From: Dave Chinner To: xfs.pkoch@dfgh.net Cc: xfs@oss.sgi.com Subject: Re: xfsrestore performance Message-ID: <20160529232053.GK26977@dastard> X-ASG-Orig-Subj: Re: xfsrestore performance References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464564055 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4052 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Sat, May 28, 2016 at 12:39:45AM +0200, xfs.pkoch@dfgh.net wrote: > Dear XFS experts, > > I was using a 16TB linux mdraid raid10 volume built from 16 seagate > 2TB disks, which was formatted with an ext3 filesystem. It contained > a couple of hundred very large files (ZFS full and incremental dumps > with sizes between 10GB and 400GB). It also contained 7 million > files from our users home directories, which where backuped with > rsync --link-dest=, so most of these files are > just hard links to previous versions. Oh, dear. There's a massive red flag. I'll come back to it... > 1: create a 14TB XFS-filesystem on the temporary RAID5-volume > 2: first rsync run to copy the ext3 fs to the temporary XFS-fs, > this took 6 days Rsync took 6 days to copy the filesystem - I doubt dump/restore is going to be 3x faster than that - xfsdump is much faster than rsync on the read side, but xfsdump runs at about the same speed as rsync on the write side. As such, 2x faster is about as much as you can expect for a "data-mostly" dump/restore. I'll come back to this.... > 3: another rsync run to copy what changed during the first run, > this took another 2 days > 4: another rsync run to copy what changed during the second run, > this took another day > 5: xfsdump the temporary xfs fs to /dev/null. took 20 hours Nothing to slow down xfsdump reading from disk. Benchmarks lie. > 5: remounting the ext3 fs readonly and do a final rsync run to > copy what changed during the third run. This took 10 hours. > 6: delete the ext3 fs and create a 20TB xfs fs > 7: copy back the temporary xfs fs to the new xfs fs using > xfsdump | xfsrestore > > Here's my problem Since dumping the temporary xfs fs to /dev/null > needed less than a day I expected the xfsdump | xfsrestore > combination to be finished in less than 2 day. xfsdump | xfsrestore > should be a lot fasten than rsync since it justs pumps blocks from > one xfs fs into another one. dump is fast - restore is the slow point because it has to recreate everything. That's what limits the speed of dump - the pipe has a bound limit on data in flight, so dump is throttled to restore speed when you run this. And, as I said I'll come back to, restore is slow because: [....] > xfsrestore: reading directories > xfsdump: dumping directories > xfsdump: dumping non-directory files > xfsdump: status at 20:04:52: 1/7886560 files dumped, 0.0% data dumped, > 24550 seconds elapsed > xfsrestore: 20756853 directories and 274128228 entries processed > xfsrestore: directory post-processing > xfsrestore: restoring non-directory files The filesystem is not exactly as you described. Did you notice that xfs_restore realises that it has to restore 20 million directories and *274 million* directory entries? i.e. for those 7 million inodes containing data, there is roughly 40 hard links pointing to each inode. There are also 3 directory inodes for every regular file. This is not a "data mostly" filesystem - it has vastly more metadata than it has data, even though the data takes up more space. Keep in mind that it took dump the best part of 7 hours just to read all the inodes and the directory structure to build the dump inventory. This matches with the final ext3 rsync pass of 10 hours which should have copied very little data. Creating 270 million hard links in 20 million directories from scratch takes a long time, and xfs_restore will be no faster at that than rsync.... > Seems like 2 days was a little optimistic Just a little. :/ Personally, I would have copied the data using rsync to the temporary XFS filesystem of the same size and shape of the final destination (via mkfs parameters to ensure stripe unit/width match final destination) and then used xfs_copy to do a block level copy of the temporary filesystem back to the final destination. xfs_copy will run *much* faster than xfsdump/restore.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 29 21:16:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7AB607CA7 for ; Sun, 29 May 2016 21:16:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3C4A58F8033 for ; Sun, 29 May 2016 19:16:15 -0700 (PDT) X-ASG-Debug-ID: 1464574572-04cbb03569a1da80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id zGEgmEl7HyEbtYRK for ; Sun, 29 May 2016 19:16:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AiDAC7oUtXLf0/LHlbgzyBU4ZunlYBAQEBAQEGjCWFeIIdgXmCT4M8AgIBAQKBITsSAQEBAQEBAQYBAQEBAUABQIRFAQEBAwE6HCMFCwgDGAklDwUlAwcaE4gnB7wJAQEIAgEkHoVBhRWEJ4V7BZg3jhaPJo9MJgGEOioyh0iBRAEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 30 May 2016 11:43:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7Chu-00073N-EP; Mon, 30 May 2016 12:13:30 +1000 Date: Mon, 30 May 2016 12:13:30 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 1/2] libxcmd: generalize topology functions Message-ID: <20160530021330.GL26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 1/2] libxcmd: generalize topology functions References: <1463006717-6104-1-git-send-email-billodo@redhat.com> <1463006717-6104-2-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463006717-6104-2-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464574572 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1750 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30017 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, May 11, 2016 at 05:45:16PM -0500, Bill O'Donnell wrote: > Move general topology functions from xfs_mkfs to new topology > collection in libxcmd. > > Signed-off-by: Bill O'Donnell FYI, this patch breaks 'make deb'. I don't expect anyone to know this - the debian/rules build script has a special hand-rolled mkfs build for the debian installer. This new libxcmd dependency also needs to be described in that script. I've fixed that up, but it's also pointed out a couple of other things to do with dependencies: > diff --git a/mkfs/Makefile b/mkfs/Makefile > index 63ba4ec..f0e4ce1 100644 > --- a/mkfs/Makefile > +++ b/mkfs/Makefile > @@ -10,7 +10,7 @@ LTCOMMAND = mkfs.xfs > HFILES = > CFILES = maxtrres.c proto.c xfs_mkfs.c > > -LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) > +LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) $(LIBXCMD) > LTDEPENDENCIES += $(LIBXFS) > LLDFLAGS = -static-libtool-libs mkfs.xfs also needs the build dependency on libxcmd to be expressed in LTDEPENDENCIES. It's just lucky that other targets have already expressed such "libxfs + libxcmd" dependencies as that ensured libxcmd was already built before mkfs tries to link against it. Blind luck strikes again! Those top level build dependencies are expressed in the top level Makefile like so: --- a/Makefile +++ b/Makefile @@ -82,6 +82,7 @@ io: libxcmd libhandle quota: libxcmd repair: libxlog copy: libxlog +mkfs: libxcmd ifeq ($(HAVE_BUILDDEFS), yes) include $(BUILDRULES) I've fixed these problems because I need to build .deb packages to deploy changes for testing. Cheers, Dave. -- Dave Chinner david@fromorbit.com From baotiao@gmail.com Sun May 29 23:45:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F9C07CA6 for ; Sun, 29 May 2016 23:45:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F22F8F8033 for ; Sun, 29 May 2016 21:45:17 -0700 (PDT) X-ASG-Debug-ID: 1464583514-04cbb0356ba22f60001-NocioJ Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id Bj933P09xdUBgKAh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 29 May 2016 21:45:15 -0700 (PDT) X-Barracuda-Envelope-From: baotiao@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f52.google.com[74.125.82.52] X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wm0-f52.google.com with SMTP id n129so68220333wmn.1 for ; Sun, 29 May 2016 21:45:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:subject:message-id:date:to:mime-version; bh=0QHIdaqF1kWFBLPhLeW1EWp9CxTYy1/NV1LtdiLzs/A=; b=IgYoCKDSsCJxkBm3DoFwAQb1znuMQ06A4HbD2bolG5IK0SzCY9gSMZeXVPX/R0//kT Geov+yWP1vmyTydDx1AN1E2nNRMd0QgFlUGT7n1Z5UzuYgiHqcn40K8sgVDvKnsE27de syEPaKwYpcke46Lf8YMdfyHZOqnlLRuBgDXftnDMS/WOXhes82iABbFjoZ30l7jTOERu l+70wG9QKs7a9tulT91E5+jYRt2q5yKnknqsg/Q5EhOCcg/4jtZWdm2vzhrn1oBDogLH jo1o3BFM2UnNGaQ5EwDPG+bKWsMhYSkr83nwgwYiCYHEyOxsEXe1cfQtQQsxbOGU10Nk yclw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:subject:message-id:date:to:mime-version; bh=0QHIdaqF1kWFBLPhLeW1EWp9CxTYy1/NV1LtdiLzs/A=; b=FrxP82kFBpMBsw3CnMQ03VHiP0fE14cFiLdmo80QKvVsa60hrNy7l8kqsqqfBKbRMS J941QZRCGeHD3uq2cpMOgaKJRkQ63/4GxGmTEy7nVTUK8FDdp4UeUyWY+0dw+Y0g4iF7 ddAgTEfD+P9b0tmewP1tLXpXsAxdRmCfaZpkOLJnTvDPArJp+TQ/jWvQ6LbK+t0U93FQ YrGX5941B/Z50geoBVDBT7pVVRxTT4JngtpJ3aLuUwd/elfoZP+yzNYKtrYWPKS9n1aH vpkb2H5EtCp+Wj2hfoljc1nlWB/vP6ARfpQsO8i/hPNrUPRmnpvPMmDZNwsLq6WIqIIh jEPA== X-Gm-Message-State: ALyK8tLAC3Ivns7tV4x7mjuZ9bYwxu9rYUOjX7hQS8wofwrXeHuptLcRlIbngyqhLFo4Vw== X-Received: by 10.194.95.66 with SMTP id di2mr12770510wjb.12.1464583513939; Sun, 29 May 2016 21:45:13 -0700 (PDT) Received: from [10.18.60.107] ([104.192.110.250]) by smtp.gmail.com with ESMTPSA id az2sm32318285wjc.6.2016.05.29.21.45.11 for (version=TLSv1/SSLv3 cipher=OTHER); Sun, 29 May 2016 21:45:13 -0700 (PDT) From: baotiao Content-Type: multipart/alternative; boundary="Apple-Mail=_CF74D2CB-62D5-475C-ACB9-592B65E5E97B" Subject: XFS: possible memory allocation deadlock in kmem_alloc Message-Id: X-ASG-Orig-Subj: XFS: possible memory allocation deadlock in kmem_alloc Date: Mon, 30 May 2016 12:45:07 +0800 To: xfs@oss.sgi.com Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: mail-wm0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1464583515 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9475 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30019 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --Apple-Mail=_CF74D2CB-62D5-475C-ACB9-592B65E5E97B Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hello.=20 we have experience this problem many time, and we try many ways to solve = this problem, but always failed. such as sync && echo 3 > /proc/sys/vm/drop_caches to free more memory, = however, after a while, the message come again. the dmesg show: May 30 12:35:51 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250) May 30 12:35:53 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250) May 30 12:35:55 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250) May 30 12:35:57 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250) May 30 12:35:59 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250) our kernel version is 3.10.0-327.4.5.el7.x86_64 we think this is the kernel memory fragmentation problem, when dmesg = show the error message, we check the buddyinfo [root@w-openstack21 /home/xusiliang]# cat /proc/buddyinfo Node 0, zone DMA 1 0 1 0 2 1 1 = 0 1 1 3 Node 0, zone DMA32 2190 1898 1367 583 284 81 21 = 8 5 0 4 Node 0, zone Normal 85195 90572 56688 32379 16793 5568 930 = 230 184 11 0 Node 1, zone Normal 95799 127034 94363 49321 21555 5239 225 = 2 2 0 0 and I think the kernel have enough free memory [root@w-openstack21 /home/xusiliang]# free -m total used free shared buff/cache = available Mem: 64269 50357 11802 65 2109 = 11757 Swap: 32255 347 31908 This machine is running for qemu, the file is qemu qcow file type [root@w-openstack20 = /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file disk disk: QEMU QCOW Image (v3), has backing file (path = /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), = 429496729600 bytes we also use xfs_db to check the fragmentation [root@w-openstack20 /home/xusiliang]# xfs_db -r = /dev/mapper/VolGroup00-LogVol04 xfs_db> frag actual 48421430, ideal 20716, fragmentation factor 99.96% How can I solve this problem, what do you suggest me to do? thank you ---------------------------------------- =20 Github: https://github.com/baotiao Blog: http://baotiao.github.io Stackoverflow: http://stackoverflow.com/users/634415/baotiao=20 Linkedin: http://www.linkedin.com/profile/view?id=3D145231990 --Apple-Mail=_CF74D2CB-62D5-475C-ACB9-592B65E5E97B Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=us-ascii Hello. 

we have experience this problem many time, and we try many = ways to solve this problem, but always failed.

such as sync && echo 3 = > /proc/sys/vm/drop_caches to free more memory, however, after a = while, the message come again.

the dmesg show:
May 30 12:35:51 w-openstack21 kernel: XFS: possible memory = allocation deadlock in kmem_alloc (mode:0x250)
May = 30 12:35:53 w-openstack21 kernel: XFS: possible memory allocation = deadlock in kmem_alloc (mode:0x250)
May 30 12:35:55 = w-openstack21 kernel: XFS: possible memory allocation deadlock in = kmem_alloc (mode:0x250)
May 30 12:35:57 = w-openstack21 kernel: XFS: possible memory allocation deadlock in = kmem_alloc (mode:0x250)
May 30 12:35:59 = w-openstack21 kernel: XFS: possible memory allocation deadlock in = kmem_alloc (mode:0x250)

our kernel version = is 3.10.0-327.4.5.el7.x86_64

we think this is the kernel memory = fragmentation problem, when dmesg show the error message, we check the = buddyinfo

[root@w-openstack21 /home/xusiliang]# cat = /proc/buddyinfo
Node 0, zone     =  DMA      1      0     =  1      0      2     =  1      1      0     =  1      1      3
Node 0, zone    DMA32   2190   1898 =   1367    583    284     81   =   21      8      5     =  0      4
Node 0, zone   = Normal  85195  90572  56688  32379  16793 =   5568    930    230    184   =   11      0
Node 1, zone   = Normal  95799 127034  94363  49321  21555   = 5239    225      2      2   =    0      0

and I think the kernel have enough free = memory
[root@w-openstack21 = /home/xusiliang]# free -m
      =         total        used   =      free      shared  buff/cache =   available
Mem:         =  64269       50357       11802   =        65        2109   =     11757
Swap:       =   32255         347       = 31908

This= machine is running for qemu,  the file is qemu qcow file = type

[root@w-openstack20 = /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file = disk
disk: QEMU QCOW Image (v3), has backing file = (path /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), = 429496729600 bytes

we also use xfs_db to check the fragmentation

[root@w-openstack20 /home/xusiliang]# xfs_db -r = /dev/mapper/VolGroup00-LogVol04
xfs_db> = frag

actual = 48421430, ideal 20716, fragmentation factor 99.96%


How can I solve this problem, what do you suggest me to = do?

thank = you

= --Apple-Mail=_CF74D2CB-62D5-475C-ACB9-592B65E5E97B-- From david@fromorbit.com Mon May 30 00:05:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 574977CB2 for ; Mon, 30 May 2016 00:05:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5843AC002 for ; Sun, 29 May 2016 22:05:36 -0700 (PDT) X-ASG-Debug-ID: 1464584733-04cbb0356ba24670001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 05uqTGAGV8dfURro for ; Sun, 29 May 2016 22:05:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C3DwDQyUtXLf0/LHlcgzyBU4J1g3meWgEBAQEBAQaMJYoOhgsEAgKBJTwRAQEBAQEBAQYBAQEBAUABQIRGAQEEOhwjEAgDGAklDwUlAwcaE4guu0IBAQEHAiUehUGFFYoiAQSYN44WjyZFjwc2gi8fgV0qMokMAQEB Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 30 May 2016 14:34:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7FNk-0007Gw-B4; Mon, 30 May 2016 15:04:52 +1000 Date: Mon, 30 May 2016 15:04:52 +1000 From: Dave Chinner To: baotiao Cc: xfs@oss.sgi.com Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc Message-ID: <20160530050452.GM26977@dastard> X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464584733 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 844 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote: > This machine is running for qemu, the file is qemu qcow file type > > [root@w-openstack20 /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file disk > disk: QEMU QCOW Image (v3), has backing file (path /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), 429496729600 bytes Oh, you're using delta/snapshot based qcow images. That, by it's very nature, generates fragmented image files as they are a delta over the backing file. .... > actual 48421430, ideal 20716, fragmentation factor 99.96% > > How can I solve this problem, what do you suggest me to do? Use a extent size hint (say 1-8MB) for your qcow2 image files so that they don't fragment badly as they are written to. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 30 00:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 37A6C7CB4 for ; Mon, 30 May 2016 00:37:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B57F304039 for ; Sun, 29 May 2016 22:37:14 -0700 (PDT) X-ASG-Debug-ID: 1464586631-04cb6c2db9a04780001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id APBcmUhNifAq4OIC for ; Sun, 29 May 2016 22:37:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DADwDZ0EtXLf0/LHlcgzxWfYJ1okcMAQEBAQEBBowlhXiCHYF5IoVpBAICgSU6EwEBAQEBAQEGAQEBAQFAAUCERgEBBDocIxAIAxgJJQ8FJQMHGhOILg+7LQEBAQcCJR6FQYUVgmCHQgWYN4YAgniFHoFzhE+IZEWPByIBgneBRyoyAYkLAQEB Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 30 May 2016 15:07:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7Ft0-0000lt-AG; Mon, 30 May 2016 15:37:10 +1000 Date: Mon, 30 May 2016 15:37:10 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method Message-ID: <20160530053710.GO26977@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method References: <1463085496-17919-1-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463085496-17919-1-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464586631 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2010 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: > This patch is a further optimization of secondary sb search, in order to > handle non-default geometries. Once again, use a similar method to find > fs geometry as that of xfs_mkfs. Refactor verify_sb(), creating new > sub-function that checks sanity of agblocks and agcount: verify_sb_blocksize(). > > If verify_sb_blocksize verifies sane paramters, use found values for the sb > search. Otherwise, try search with default values. If these faster methods > both fail, fall back to original brute force slower search. > > NOTE: patch series "xfs_repair: improved secondary sb search" must be > applied before applying this patch. > (http://oss.sgi.com/archives/xfs/2016-05/msg00269.html) Either this or one of the above patches is causing xfs/030 on my xfstests runs to fail with extra output: xfs/030 4s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad) --- tests/xfs/030.out 2016-04-06 11:30:45.348477421 +1000 +++ /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad 2016-05-30 13:06:29.955682633 +1000 @@ -11,6 +11,8 @@ bad primary superblock - bad magic number !!! attempting to find secondary superblock... +.... +attempting to find secondary superblock... found candidate secondary superblock... verified secondary superblock... ... (Run 'diff -u tests/xfs/030.out /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad' to see the entire diff) Bill, can you please work up a filter or equivalent for xfstests so that this extra output doesn't cause unnecessary failures? Something like simply filtering all the "attempting to find secondary superblock..." and "...." lines from the output would work just fine - all we really care about is that a secondary sb is found and verified, not how many steps it takes to find it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From g.danti@assyoma.it Mon May 30 01:33:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7474B7CB8 for ; Mon, 30 May 2016 01:33:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33CD0304039 for ; Sun, 29 May 2016 23:33:27 -0700 (PDT) X-ASG-Debug-ID: 1464590004-04bdf05ad4a34080001-NocioJ Received: from mr002msb.fastweb.it (mr002msb.fastweb.it [85.18.95.86]) by cuda.sgi.com with ESMTP id WGUmDFpVfGIrrIo9 for ; Sun, 29 May 2016 23:33:25 -0700 (PDT) X-Barracuda-Envelope-From: g.danti@assyoma.it X-Barracuda-Effective-Source-IP: mr002msb.fastweb.it[85.18.95.86] X-Barracuda-Apparent-Source-IP: 85.18.95.86 Received: from ceres.assyoma.it (93.63.55.57) by mr002msb.fastweb.it (8.5.140.04) id 5745BFCA003B3545; Mon, 30 May 2016 08:33:22 +0200 Received: by ceres.assyoma.it (Postfix, from userid 48) id 38A7422CD4F; Mon, 30 May 2016 08:33:22 +0200 (CEST) To: Emmanuel Florac Subject: Re: LVM snapshot and log record CRC mismatch X-PHP-Originating-Script: 0:rcube.php X-ASG-Orig-Subj: Re: LVM snapshot and log record CRC mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 30 May 2016 08:33:22 +0200 From: Gionatan Danti Cc: Dave Chinner , xfs@oss.sgi.com, g.danti@assyoma.it Organization: Assyoma s.r.l. In-Reply-To: <20160526133422.32f65920@harpe.intellique.com> References: <20160524221205.GM21200@dastard> <57455645.5040608@assyoma.it> <20160526122315.4112f713@harpe.intellique.com> <5746DB30.5040006@assyoma.it> <20160526133422.32f65920@harpe.intellique.com> Message-ID: X-Sender: g.danti@assyoma.it User-Agent: Roundcube Webmail/1.0.9 X-Barracuda-Connect: mr002msb.fastweb.it[85.18.95.86] X-Barracuda-Start-Time: 1464590004 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 695 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30021 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Il 26-05-2016 13:34 Emmanuel Florac ha scritto: > > Yes, I thought that too, however it doesn't seem to be working in your > case, and freezing twice can't do any harm anyway :) Hi all, after upgrading to CentOS 7.2, kernel version 3.10.0-327.18.2.el7.x86_64, the problem was solved: mounting a snapshot shows no more CRC error (ie: the filesystem is quiesced before taking the snapshot). I am not sure of what component upgrade solved the problem, if kernel or lvm tools. I are more inclined to the latter, anyway. Thanks. -- Danti Gionatan Supporto Tecnico Assyoma S.r.l. - www.assyoma.it email: g.danti@assyoma.it - info@assyoma.it GPG public key ID: FF5F32A8 From s.priebe@profihost.ag Mon May 30 02:23:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B701E7CBC for ; Mon, 30 May 2016 02:23:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87E618F8035 for ; Mon, 30 May 2016 00:23:54 -0700 (PDT) X-ASG-Debug-ID: 1464593029-04cbb0356aa27570001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id 5dBj8gTSxWwxwMhi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 00:23:51 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Effective-Source-IP: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 15528 invoked from network); 30 May 2016 09:23:49 +0200 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Mon, 30 May 2016 09:23:49 +0200 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Dave Chinner X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <20160324122417.GB4068@bfoster.bfoster> <57332508.307@profihost.ag> <20160511133417.GA42410@bfoster.bfoster> <57333BA4.4040402@profihost.ag> <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> Cc: Brian Foster , "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG X-Enigmail-Draft-Status: N1110 Message-ID: <574BEA84.3010206@profihost.ag> Date: Mon, 30 May 2016 09:23:48 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <20160522213850.GE26977@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1464593030 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6349 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave, Hi Brian, below are the results with a vanilla 4.4.11 kernel. Am 22.05.2016 um 23:38 schrieb Dave Chinner: > On Sun, May 22, 2016 at 09:36:39PM +0200, Stefan Priebe - Profihost AG wrote: >> Am 16.05.2016 um 03:06 schrieb Brian Foster: >>>> sd_mod ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci >>>> i2c_core ptp mpt3sas pps_core raid_class scsi_transport_sas >>>> [Sun May 15 07:00:44 2016] CPU: 2 PID: 108 Comm: kswapd0 Tainted: G O >>>> 4.4.10+25-ph #1 >>> >>> How close is this to an upstream kernel? Upstream XFS? Have you tried to >>> reproduce this on an upstream kernel? >> >> It's a vanilla 4.4.10 + a new adaptec driver and some sched and wq >> patches from 4.5 and 4.6 but i can try to replace the kernel on one >> machine with a 100% vanilla one if this helps. > > Please do. > >>>> [295086.353473] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0x52000 size 0x13d1c8 >>>> [295086.353476] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0x53000 size 0x13d1c8 >>>> [295086.353478] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0x54000 size 0x13d1c8 >>> ... >>>> [295086.567508] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0xab000 size 0x13d1c8 >>>> [295086.567510] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0xac000 size 0x13d1c8 >>>> [295086.567515] XFS (md127p3): ino 0x600204f delalloc 1 unwritten 0 pgoff >>>> 0xad000 size 0x13d1c8 >>>> >>>> The file to the inode number is: >>>> /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_i18n_Translation-en >>>> >>> >>> xfs_bmap -v might be interesting here as well. >> >> # xfs_bmap -v >> /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_i18n_Translation-en >> /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_i18n_Translation-en: >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL >> 0: [0..2567]: 41268928..41271495 3 (374464..377031) 2568 > > So the last file offset with a block is 0x140e00. This means the > file is fully allocated. However, the pages inside the file range > are still marked delayed allocation. That implies that we've failed > to write the pages over a delayed allocation region after we've > allocated the space. > > That, in turn, tends to indicate a problem in page writeback - the > first page to be written has triggered delayed allocation of the > entire range, but then the subsequent pages have not been written > (for some as yet unknown reason). When a page is written, we map it > to the current block via xfs_map_at_offset(), and that clears both > the buffer delay and unwritten flags. > > This clearly isn't happening which means either the VFS doesn't > think the inode is dirty anymore, writeback is never asking for > these pages to be written, or XFs is screwing something up in > ->writepage. The XFS writepage code changed significantly in 4.6, so > it might be worth seeing if a 4.6 kernel reproduces this same > problem.... i've now used a vanilla 4.4.11 Kernel and the issue remains. After a fresh reboot it has happened again on the root FS for a debian apt file: XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 ------------[ cut here ]------------ WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 xfs_vm_releasepage+0x10f/0x140() Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 Call Trace: [] dump_stack+0x63/0x84 [] warn_slowpath_common+0x97/0xe0 [] warn_slowpath_null+0x1a/0x20 [] xfs_vm_releasepage+0x10f/0x140 [] ? page_mkclean_one+0xd0/0xd0 [] ? anon_vma_prepare+0x150/0x150 [] try_to_release_page+0x32/0x50 [] shrink_active_list+0x3ce/0x3e0 [] shrink_lruvec+0x687/0x7d0 [] shrink_zone+0xdc/0x2c0 [] kswapd+0x4f9/0x970 [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 [] kthread+0xc9/0xe0 [] ? kthread_stop+0x100/0x100 [] ret_from_fork+0x3f/0x70 [] ? kthread_stop+0x100/0x100 ---[ end trace c9d679f8ed4d7610 ]--- XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x3000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x4000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x5000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x6000 size 0x12b990 XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x7000 size 0x12b990 XFS (md127p3): ino 0x400de4c delalloc 1 unwritten 0 pgoff 0x12000 size 0x2cc69 # find / -inum $(printf "%d" 0x41221d1) -print /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_source_Sources # xfs_bmap -v /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_source_Sources /var/lib/apt/lists/security.debian.org_dists_wheezy_updates_main_source_Sources: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..2399]: 27851552..27853951 2 (588576..590975) 2400 So you mean the next step would be to test 4.6? I hope this is stable enough for production usage. Greets, Stefan From baotiao@gmail.com Mon May 30 03:49:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D34F7CBE for ; Mon, 30 May 2016 03:49:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25014AC003 for ; Mon, 30 May 2016 01:49:47 -0700 (PDT) X-ASG-Debug-ID: 1464598122-04cbb0356ba28d10001-NocioJ Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by cuda.sgi.com with ESMTP id JNNZUddL1qpnbtS2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 30 May 2016 01:48:43 -0700 (PDT) X-Barracuda-Envelope-From: baotiao@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f45.google.com[74.125.82.45] X-Barracuda-Apparent-Source-IP: 74.125.82.45 Received: by mail-wm0-f45.google.com with SMTP id s131so14648417wme.0 for ; Mon, 30 May 2016 01:48:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:subject:from:in-reply-to:date:cc:message-id:references :to; bh=tlMt2iTe1t33c21d9ZCt61xTsvaBlkMUCijPSmbmLBA=; b=nI3eHe+xI7rGbfSvHhZ+YTT0k/ASTtAQZECFpZd8Pb050yTJDr+AkuFaupHdyXkRvG sPgtvQMVabKdvctYzrOCRAg3BYiXRO0sRvxsGoWM9C2oDmaJcgbPVtNfm6vhAjBduYSx dDVpMlLfGzH2znU98euV7FBRLth07Yji6gN1+F8M4efS8ezMu26BoHw1tar4wxU/3Osv sRL/+u83UoRiPWEnge2Bz+TEPf3ts/POPjbc8dR9dAJZL7NpQ1Z8O9NLxwc2nrbsJNCd 2wy7p7mAuwqMu2ZhYfsP3VwOqhiwVZF2XQx3lyCf+UD03rkmozLlEdAcUh4zsw8FGBre jQnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :message-id:references:to; bh=tlMt2iTe1t33c21d9ZCt61xTsvaBlkMUCijPSmbmLBA=; b=ANCE9cX4RIZR16xXQWV4erJj0BAcnh+XfwuRKyR//9erwCIiyjTnp+hh+atXAPjojU /CtoXZr47yOg+4G0bl35VdpGbaigqYJEU6b+EX9EdkIcpGRkQhKjIAlLhY9G21MIK/Cb Ya+YLF4vMOx1ELZtDDleshd8kk6pU4nGYP3cERlr7Nq2elfqlA6F9454TqPaNIafxBSX 50/SDuuCTPHb7cKRO5I6EF07zqUGZbYjHbPRAAtYBMmS0MfiFtc5ilc1up2iiLjXRTOG jH8t6hWNqh2E5MI5ybXRPhY6R6voJCMZx3nHsCGiCIGkmpabEkO4K1y06Na5B3jgOkT0 0mHA== X-Gm-Message-State: ALyK8tKBWoICppESdM+k8GOwlgreHCaFXnXpGOELRg977r4n9KODY0f4K2gMEn3HTMwGrw== X-Received: by 10.194.206.39 with SMTP id ll7mr25196999wjc.179.1464598121961; Mon, 30 May 2016 01:48:41 -0700 (PDT) Received: from [10.18.60.107] ([104.192.110.250]) by smtp.gmail.com with ESMTPSA id v125sm10143215wmv.17.2016.05.30.01.48.39 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 30 May 2016 01:48:41 -0700 (PDT) Content-Type: multipart/alternative; boundary="Apple-Mail=_3BE03A55-D45E-4B6C-AE01-71BB9508A0DD" Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc From: baotiao X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc In-Reply-To: <20160530050452.GM26977@dastard> Date: Mon, 30 May 2016 16:48:36 +0800 Cc: xfs@oss.sgi.com Message-Id: <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> References: <20160530050452.GM26977@dastard> To: Dave Chinner X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: mail-wm0-f45.google.com[74.125.82.45] X-Barracuda-Start-Time: 1464598123 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5681 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30024 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --Apple-Mail=_3BE03A55-D45E-4B6C-AE01-71BB9508A0DD Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii how can I set the extent size hint to a file with command line?=20 I have google for a lot, but I can't find a answer ---------------------------------------- =20 Github: https://github.com/baotiao Blog: http://baotiao.github.io Stackoverflow: http://stackoverflow.com/users/634415/baotiao=20 Linkedin: http://www.linkedin.com/profile/view?id=3D145231990 > On May 30, 2016, at 13:04, Dave Chinner wrote: >=20 > On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote: >> This machine is running for qemu, the file is qemu qcow file type >>=20 >> [root@w-openstack20 = /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file disk >> disk: QEMU QCOW Image (v3), has backing file (path = /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), = 429496729600 bytes >=20 > Oh, you're using delta/snapshot based qcow images. That, by it's > very nature, generates fragmented image files as they are a delta > over the backing file. >=20 > .... >> actual 48421430, ideal 20716, fragmentation factor 99.96% >>=20 >> How can I solve this problem, what do you suggest me to do? >=20 > Use a extent size hint (say 1-8MB) for your qcow2 image files so that > they don't fragment badly as they are written to.=20 >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com --Apple-Mail=_3BE03A55-D45E-4B6C-AE01-71BB9508A0DD Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=us-ascii how can I set the extent size hint to a file with command = line? 
I have google for a lot, but I can't find a = answer


On May 30, 2016, at 13:04, Dave Chinner <david@fromorbit.com>= wrote:

On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote:
This machine is running = for qemu,  the file is qemu qcow file type

[root@w-openstack20 = /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file disk
disk: QEMU QCOW Image (v3), has backing file (path = /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), = 429496729600 bytes

Oh, you're = using delta/snapshot based qcow images. That, by it's
very = nature, generates fragmented image files as they are a delta
over the backing file.

....
actual 48421430, ideal = 20716, fragmentation factor 99.96%

How can = I solve this problem, what do you suggest me to do?

Use a extent size hint (say = 1-8MB) for your qcow2 image files so that
they don't = fragment badly as they are written to.

Cheers,

Dave.
-- =
Dave Chinner
david@fromorbit.com

= --Apple-Mail=_3BE03A55-D45E-4B6C-AE01-71BB9508A0DD-- From cmaiolino@redhat.com Mon May 30 04:20:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A2B9C7CCD for ; Mon, 30 May 2016 04:20:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 741D58F8033 for ; Mon, 30 May 2016 02:20:19 -0700 (PDT) X-ASG-Debug-ID: 1464600017-04cb6c2dbaa088c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YeRlcyCFqlqfmh2Q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 02:20:18 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 72289486B6 for ; Mon, 30 May 2016 09:20:17 +0000 (UTC) Received: from redhat.com (dhcp-26-103.brq.redhat.com [10.34.26.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4U9KEml020306 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 05:20:16 -0400 Date: Mon, 30 May 2016 11:20:14 +0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc Message-ID: <20160530092014.GB13872@redhat.com> X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc Mail-Followup-To: xfs@oss.sgi.com References: <20160530050452.GM26977@dastard> <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 30 May 2016 09:20:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464600018 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2163 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, May 30, 2016 at 04:48:36PM +0800, baotiao wrote: > how can I set the extent size hint to a file with command line? > > I have google for a lot, but I can't find a answer > It can be set with xfs_io, like: xfs_io -c "extsize 8m" # To set an extent size hint of 8m Although, it only works if the file is empty, or more specific, the file must not have any extents allocated > ---------------------------------------- > > Github: [1]https://github.com/baotiao > Blog: [2]http://baotiao.github.io > Stackoverflow: [3]http://stackoverflow.com/users/634415/baotiao > Linkedin: [4]http://www.linkedin.com/profile/view?id=145231990 > > On May 30, 2016, at 13:04, Dave Chinner <[5]david@fromorbit.com> wrote: > > On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote: > > This machine is running for qemu, the file is qemu qcow file type > [root@w-openstack20 > /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file > disk > disk: QEMU QCOW Image (v3), has backing file (path > /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), > 429496729600 bytes > > Oh, you're using delta/snapshot based qcow images. That, by it's > very nature, generates fragmented image files as they are a delta > over the backing file. > .... > > actual 48421430, ideal 20716, fragmentation factor 99.96% > How can I solve this problem, what do you suggest me to do? > > Use a extent size hint (say 1-8MB) for your qcow2 image files so that > they don't fragment badly as they are written to. > Cheers, > Dave. > -- > Dave Chinner > [6]david@fromorbit.com > > References > > 1. https://github.com/baotiao > 2. http://baotiao.github.io/ > 3. http://stackoverflow.com/users/634415/baotiao > 4. http://www.linkedin.com/profile/view?id=145231990 > 5. mailto:david@fromorbit.com > 6. mailto:david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From ninslokik@yandex.com Mon May 30 07:12:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=BANG_GUAR,FREEMAIL_FROM, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E0D187CA1 for ; Mon, 30 May 2016 07:12:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93678304032 for ; Mon, 30 May 2016 05:12:28 -0700 (PDT) X-ASG-Debug-ID: 1464610344-04bdf05ad4a3f150001-NocioJ Received: from 103104.com ([199.188.103.189]) by cuda.sgi.com with ESMTP id zh0fAEafKrAW3p25 for ; Mon, 30 May 2016 05:12:25 -0700 (PDT) X-Barracuda-Envelope-From: ninslokik@yandex.com X-Barracuda-Effective-Source-IP: UNKNOWN[199.188.103.189] X-Barracuda-Apparent-Source-IP: 199.188.103.189 To: xfs@oss.sgi.com Subject: Distribute to McDonalds, Pfizer, Toyota, etc. Message-ID: <77936d3ca364725a44eabd0f850e80eb@grizzly.com> X-ASG-Orig-Subj: Distribute to McDonalds, Pfizer, Toyota, etc. Date: Mon, 30 May 2016 14:05:15 +0200 From: "Jason Ryan" Reply-To: piderram@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1469 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: UNKNOWN[199.188.103.189] X-Barracuda-Start-Time: 1464610344 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 890 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.84 X-Barracuda-Spam-Status: No, SCORE=1.84 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BANG_GUAR, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 We are a U.S. company looking for distributors worldwide. We have been manufacturing and distributing slip-resistant floor treatments for more than 26 years! One 30 minute application with our Amazing Anti-Slip Floor Treatment will make floors slip-resistant and safe for 4 years - Guaranteed! Indoors or Outdoors No Change in Appearance For use on: Ceramic, Porcelain and Quarry Tiles, Marble, Granite, Concrete, etc. Typical Applications: Restaurant Kitchen Floors, Hotels, Hospitals, Office Buildings, etc. Some of our satisfied customers: McDonald's, Kroger, Holiday Inn, Miami Children's Hospital Pfizer, etc. Please contact us for details and to see if there is a distributorship available in your country. $5,000 INVENTORY INVESTMENT REQUIRED PLEASE INCLUDE YOUR NAME, COUNTRY & E-MAIL ADDRESS Thanks, Jason Ryan Contact: weihsthe@sina.com From eflorac@intellique.com Mon May 30 07:52:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C1CE77CA3 for ; Mon, 30 May 2016 07:52:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 845CE8F8033 for ; Mon, 30 May 2016 05:52:59 -0700 (PDT) X-ASG-Debug-ID: 1464612776-04cb6c2db9a10a70001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id gpykWmqyLWBIn60P (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 05:52:57 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 75E56547A58; Mon, 30 May 2016 08:52:56 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 8D4F3547A52; Mon, 30 May 2016 08:52:55 -0400 (EDT) Date: Mon, 30 May 2016 14:52:59 +0200 From: Emmanuel Florac To: xfs.pkoch@dfgh.net Cc: xfs@oss.sgi.com Subject: Re: xfsrestore performance Message-ID: <20160530145259.1ad368cd@harpe.intellique.com> X-ASG-Orig-Subj: Re: xfsrestore performance In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1464612777 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 663 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Sat, 28 May 2016 11:25:32 +0200 xfs.pkoch@dfgh.net =C3=A9crivait: > I see two options: Use rsync again to copy the data from the 14TB xfs > filesystem to the new 20TB xfs filesystem. This won't be finished > this weekend. Just a point; in my experience good old "cp -a" is generally much faster than rsync for the first copy. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From ninslokik@yandex.com Mon May 30 08:03:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=BANG_GUAR,FREEMAIL_FROM, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D1FA7CB5 for ; Mon, 30 May 2016 08:03:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EDCBBAC002 for ; Mon, 30 May 2016 06:03:15 -0700 (PDT) X-ASG-Debug-ID: 1464613390-04cb6c2dbca11ae0001-NocioJ Received: from 103104.com ([199.188.103.189]) by cuda.sgi.com with ESMTP id FPHwHB2eHTxThIg6 for ; Mon, 30 May 2016 06:03:11 -0700 (PDT) X-Barracuda-Envelope-From: ninslokik@yandex.com X-Barracuda-Effective-Source-IP: UNKNOWN[199.188.103.189] X-Barracuda-Apparent-Source-IP: 199.188.103.189 To: xfs@oss.sgi.com Subject: Business Opportunity Available Message-ID: X-ASG-Orig-Subj: Business Opportunity Available Date: Mon, 30 May 2016 15:02:52 +0200 From: "Jason Ryan" Reply-To: piderram@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 49 X-Mailer-RecptId: 30894915 X-Mailer-SID: 1938 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: UNKNOWN[199.188.103.189] X-Barracuda-Start-Time: 1464613390 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 890 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.84 X-Barracuda-Spam-Status: No, SCORE=1.84 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BANG_GUAR, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 We are a U.S. company looking for distributors worldwide. We have been manufacturing and distributing slip-resistant floor treatments for more than 26 years! One 30 minute application with our Amazing Anti-Slip Floor Treatment will make floors slip-resistant and safe for 4 years - Guaranteed! Indoors or Outdoors No Change in Appearance For use on: Ceramic, Porcelain and Quarry Tiles, Marble, Granite, Concrete, etc. Typical Applications: Restaurant Kitchen Floors, Hotels, Hospitals, Office Buildings, etc. Some of our satisfied customers: McDonald's, Kroger, Holiday Inn, Miami Children's Hospital Pfizer, etc. Please contact us for details and to see if there is a distributorship available in your country. $5,000 INVENTORY INVESTMENT REQUIRED PLEASE INCLUDE YOUR NAME, COUNTRY & E-MAIL ADDRESS Thanks, Jason Ryan Contact: weihsthe@sina.com From tom.leiming@gmail.com Mon May 30 08:36:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E9E67CD2 for ; Mon, 30 May 2016 08:36:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F07E58F8035 for ; Mon, 30 May 2016 06:36:40 -0700 (PDT) X-ASG-Debug-ID: 1464615397-04cb6c2db9a12990001-NocioJ Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by cuda.sgi.com with ESMTP id 4BUujTf76TP3pGUP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 30 May 2016 06:36:38 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Effective-Source-IP: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Apparent-Source-IP: 209.85.220.65 Received: by mail-pa0-f65.google.com with SMTP id f8so21705094pag.0 for ; Mon, 30 May 2016 06:36:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ptVANtwAVSDpuuIFlDw+2sEcPc44lPcTPbSP7Z4Rlv0=; b=RUi5LMdw54aSGf3xRJfsqLrc3iDtKYI/p/w9uSrOQO7yAr27EmVkFG0/GFJZBcPCmM lPHSO17mcmul57+Kh34bsCAtnYu7RBiUbGCB1Ofzy3AXfxeiXepRE1QEMNaSBT7WxHoL ppOnEXKFCLN6VNzX3UIwnaGtd1cTncDjgn1H4+gPRk8E/Ei7T/2Gmyj7nRjtSngygUe3 Iir+m6DlpLzkU/REhyBKtRrjIaeeInq1I2r7zEpxLyADi4L1i3Q5NtSHdEF2HUaUZ2jO B+c0H2nQeLKADgAG+mNcGwqT+nx7SZ6cb6WJ3caNdVtoN8iQ4eAZrCoOkfIcnv1tE05H DDcg== X-Gm-Message-State: ALyK8tImGYK5IqjUYPzHvKSPJ79DJ+cWnPfQ/T18DbH3Tqn+xxRtGBDtRlNTbmpyyQV3iw== X-Received: by 10.66.87.198 with SMTP id ba6mr47233640pab.151.1464615397412; Mon, 30 May 2016 06:36:37 -0700 (PDT) Received: from localhost ([45.34.23.101]) by smtp.gmail.com with ESMTPSA id v27sm33217903pfi.49.2016.05.30.06.36.36 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 30 May 2016 06:36:36 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Ming Lei , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM) Subject: [PATCH v6 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Mon, 30 May 2016 21:34:33 +0800 X-ASG-Orig-Subj: [PATCH v6 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1464615294-9946-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1464615294-9946-1-git-send-email-ming.lei@canonical.com> References: <1464615294-9946-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Start-Time: 1464615398 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 815 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index e71cfbd..e5d713b 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1157,9 +1157,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From tom.leiming@gmail.com Mon May 30 08:36:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D87B87CD2 for ; Mon, 30 May 2016 08:36:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8C651304032 for ; Mon, 30 May 2016 06:36:56 -0700 (PDT) X-ASG-Debug-ID: 1464615354-04bdf05ad6a43450001-NocioJ Received: from mail-pf0-f169.google.com (mail-pf0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id T33mMYQaIsBwhp1S (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 30 May 2016 06:35:55 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.169 Received: by mail-pf0-f169.google.com with SMTP id f144so52193672pfa.3 for ; Mon, 30 May 2016 06:35:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=voBv/bkHpnueaHdgW44uHDNkimIJPF0flffNCYF0+10=; b=L7WcZp/JFV73EPDaZOC3BbNlV9Fw0YuluJbxlpHL6Z/jJap3m3Tz90MenoLWYOFemp QuyOABmGsFqkMpRGNE6sJbWlfq8htMK5cCmxm12h15HWuqz1aZpqxC/NYidA4tFkOHa7 WAVxmPNMAFGZ9k1u8KiLaAqFB1YgY880jkdx4GxZqhMAbt3z/gu583eDEJWskPwMQaps FyB64TFYMRTKkfpdS4APokn8gKZFSILHG6szkyv5bouxatZbjwB/CVoJrpSgfy+bBH7Q burzGrTQ8xg7CMneHNRuJV43e5dmh5Q6Zb2MT2v2QdP+fOToHlOGaaI4uuSqjEbw/cds FU2Q== X-Gm-Message-State: ALyK8tLfuI0JpbumReSQzOXtiNS5WmzAjrkH0KanHJfUs02WiGAL/Io8dF7PADRecSRsBw== X-Received: by 10.98.21.82 with SMTP id 79mr43734287pfv.92.1464615354495; Mon, 30 May 2016 06:35:54 -0700 (PDT) Received: from localhost ([45.34.23.101]) by smtp.gmail.com with ESMTPSA id tn7sm47795604pac.29.2016.05.30.06.35.52 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 30 May 2016 06:35:53 -0700 (PDT) From: Ming Lei X-Barracuda-Effective-Source-IP: UNKNOWN[45.34.23.101] X-Barracuda-Apparent-Source-IP: 45.34.23.101 X-Barracuda-BBL-IP: 45.34.23.101 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Ming Lei , Al Viro , drbd-dev@lists.linbit.com (open list:DRBD DRIVER), Jan Kara , Joe Thornber , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , "Martin K. Petersen" , Michal Hocko , Mike Snitzer , NeilBrown , Sagi Grimberg , Shaohua Li , Steven Whitehouse , Tejun Heo , xfs@oss.sgi.com (open list:XFS FILESYSTEM) Subject: [PATCH v6 0/8] block: prepare for multipage bvecs Date: Mon, 30 May 2016 21:34:28 +0800 X-ASG-Orig-Subj: [PATCH v6 0/8] block: prepare for multipage bvecs Message-Id: <1464615294-9946-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pf0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1464615354 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2690 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS and makre BIO_MAX_SIZE as obsolete, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. The only functional change is iterate_bvec():lib/iov_iter.c xfstests(-a auto) over loop aio is run for ext4/xfs to verify the change and no regression found with this patchset. V6: - rebased on v4.7-rc1 - add reviewed-by tag - mark BIO_MAX_SIZE as obsolete instead of removing because dm-tree adds one usage now V5: - use bvec's iterator to figure new base vec address and update 'skip' correctly - run xfstests(-a auto) on loop aio/dio for verifying the change in iterate_bvec(), and no regression reported - use stree-ng to trigger heavy swap over swapfile to verify change in iterate_bvec() too, looks everything is fine V4: - make xfstests cover xfs - rebase on for-next of block tree V3: - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm as reported by 0day ktest - build test on arm & arm64 V2: - rename bvec_iter.h as bvec.h - always include bvec.h into blk_types.h as suggested by Christoph V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' Ming Lei (8): block: move bvec iterator into include/linux/bvec.h block: move two bvec structure into bvec.h block: mark 1st parameter of bvec_iter_advance as const iov_iter: use bvec iterator to implement iterate_bvec() fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES block: bio: remove BIO_MAX_SECTORS block: drbd: avoid to use BIO_MAX_SIZE block: mark BIO_MAX_SIZE as obsolete drivers/block/drbd/drbd_int.h | 4 +- fs/xfs/xfs_buf.c | 4 +- include/linux/bio.h | 58 ++++---------------------- include/linux/blk_types.h | 22 +--------- include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 45 +++++++------------- 6 files changed, 122 insertions(+), 107 deletions(-) create mode 100644 include/linux/bvec.h -- 1.9.1 From bfoster@redhat.com Mon May 30 09:08:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9AD17CC5 for ; Mon, 30 May 2016 09:08:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B973F304032 for ; Mon, 30 May 2016 07:08:39 -0700 (PDT) X-ASG-Debug-ID: 1464617317-04cbb03568a35cf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aPZOCZVC13rlgSrW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 07:08:38 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B5B63C049D5C for ; Mon, 30 May 2016 14:08:37 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-63.bos.redhat.com [10.18.41.63]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4UE8bFC020049 for ; Mon, 30 May 2016 10:08:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5854A120092; Mon, 30 May 2016 10:08:36 -0400 (EDT) Date: Mon, 30 May 2016 10:08:36 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix broken multi-fsb buffer logging Message-ID: <20160530140836.GA18031@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix broken multi-fsb buffer logging References: <1464204667-10199-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464204667-10199-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 30 May 2016 14:08:37 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464617318 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4778 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, May 25, 2016 at 03:31:07PM -0400, Brian Foster wrote: > Multi-block buffers are logged based on buffer offset in > xfs_trans_log_buf(). xfs_buf_item_log() ultimately walks each mapping in > the buffer and marks the associated range to be logged in the > xfs_buf_log_format bitmap for that mapping. This code is broken, > however, in that it marks the actual buffer offsets of the associated > range in each bitmap rather than shifting to the byte range for that > particular mapping. > > For example, on a 4k fsb fs, buffer offset 4096 refers to the first byte > of the second mapping in the buffer. This means byte 0 of the second log > format bitmap should be tagged as dirty. Instead, the current code marks > byte offset 4096 of the second log format bitmap, which is invalid and > potentially out of range of the mapping. > > As a result of this, the log item format code invoked at transaction > commit time is not be able to correctly identify what parts of the > buffer to copy into log vectors. This can lead to NULL log vector > pointer dereferences in CIL push context if the item format code was not > able to locate any dirty ranges at all. This crash has been reproduced > on a 4k FSB filesystem using 16k directory blocks where an unlink > operation happened not to log anything in the first block of the > mapping. The logged offsets were all over 4k, marked as such in the > subsequent log format mappings, and thus left the transaction with an > xfs_log_item that is marked DIRTY but without any logged regions. > > Further, even when the logged regions are marked correctly in the buffer > log format bitmaps, the format code doesn't copy the correct ranges of > the buffer into the log. This means that any logged region beyond the > first block of a multi-block buffer is subject to corruption after a > crash and log recovery sequence. This is due to a failure to convert the > mapping bm_len field from basic blocks to bytes in the buffer offset > tracking code in xfs_buf_item_format(). > > Update xfs_buf_item_log() to convert buffer offsets to segment relative > offsets when logging multi-block buffers. This ensures that the modified > regions of a buffer are logged correctly and avoids the aforementioned > crash. Also update xfs_buf_item_format() to correctly track the source > offset into the buffer for the log vector formatting code. This ensures > that the correct data is copied into the log. > > Signed-off-by: Brian Foster > --- > > Note that this has only been tested so far in a particular filesystem > environment that reproduces the crash/corruption discussed in the commit > log description. Generic testing still required, posting just to get a > jump on review... > This has passed my tests without any obvious problems or regressions. Any other thoughts/comments or reviews? I'd like to get a backport going for this, but can't do so until there is at least some kind of acknowledgement this is acceptable. Brian > Brian > > fs/xfs/xfs_buf_item.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 3425799..2e95ad0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -359,7 +359,7 @@ xfs_buf_item_format( > for (i = 0; i < bip->bli_format_count; i++) { > xfs_buf_item_format_segment(bip, lv, &vecp, offset, > &bip->bli_formats[i]); > - offset += bp->b_maps[i].bm_len; > + offset += BBTOB(bp->b_maps[i].bm_len); > } > > /* > @@ -915,20 +915,28 @@ xfs_buf_item_log( > for (i = 0; i < bip->bli_format_count; i++) { > if (start > last) > break; > - end = start + BBTOB(bp->b_maps[i].bm_len); > + end = start + BBTOB(bp->b_maps[i].bm_len) - 1; > + > + /* skip to the map that includes the first byte to log */ > if (first > end) { > start += BBTOB(bp->b_maps[i].bm_len); > continue; > } > + > + /* > + * Trim the range to this segment and mark it in the bitmap. > + * Note that we must convert buffer offsets to segment relative > + * offsets (e.g., the first byte of each segment is byte 0 of > + * that segment). > + */ > if (first < start) > first = start; > if (end > last) > end = last; > - > - xfs_buf_item_log_segment(first, end, > + xfs_buf_item_log_segment(first - start, end - start, > &bip->bli_formats[i].blf_data_map[0]); > > - start += bp->b_maps[i].bm_len; > + start += BBTOB(bp->b_maps[i].bm_len); > } > } > > -- > 2.4.11 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon May 30 17:06:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 20C647CA0 for ; Mon, 30 May 2016 17:06:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D78F68F804B for ; Mon, 30 May 2016 15:06:40 -0700 (PDT) X-ASG-Debug-ID: 1464645997-04bdf05ad5a5c860001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4ZZ8fVHD72G4xXfD for ; Mon, 30 May 2016 15:06:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.158] (EricSannsiPhone.sandeen.net [10.0.0.158]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B48A92B52; Mon, 30 May 2016 17:06:26 -0500 (CDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (1.0) Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method From: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method X-Mailer: iPhone Mail (13F69) In-Reply-To: <20160530053710.GO26977@dastard> Date: Mon, 30 May 2016 17:06:25 -0500 Cc: Bill O'Donnell , xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: References: <1463085496-17919-1-git-send-email-billodo@redhat.com> <20160530053710.GO26977@dastard> To: Dave Chinner X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464645997 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2382 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MIME_QP_LONG_LINE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars > On May 30, 2016, at 12:37 AM, Dave Chinner wrote: >=20 >> On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: >> This patch is a further optimization of secondary sb search, in order to >> handle non-default geometries. Once again, use a similar method to find >> fs geometry as that of xfs_mkfs. Refactor verify_sb(), creating new >> sub-function that checks sanity of agblocks and agcount: verify_sb_blocks= ize(). >>=20 >> If verify_sb_blocksize verifies sane paramters, use found values for the s= b >> search. Otherwise, try search with default values. If these faster method= s >> both fail, fall back to original brute force slower search. >>=20 >> NOTE: patch series "xfs_repair: improved secondary sb search" must be >> applied before applying this patch. >> (http://oss.sgi.com/archives/xfs/2016-05/msg00269.html) >=20 > Either this or one of the above patches is causing xfs/030 on > my xfstests runs to fail with extra output: >=20 > xfs/030 4s ... - output mismatch (see /home/dave/src/xfstests-dev/results/= /xfs/xfs/030.out.bad) > --- tests/xfs/030.out 2016-04-06 11:30:45.348477421 +1000 > +++ /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad 201= 6-05-30 13:06:29.955682633 +1000 > @@ -11,6 +11,8 @@ > bad primary superblock - bad magic number !!! >=20 > attempting to find secondary superblock... > +.... > +attempting to find secondary superblock... Seems like the best fix is to not print that twice in the first place? -Eric > found candidate secondary superblock... > verified secondary superblock... > ... > (Run 'diff -u tests/xfs/030.out /home/dave/src/xfstests-dev/results//xf= s/xfs/030.out.bad' to see the entire diff) >=20 > Bill, can you please work up a filter or equivalent for xfstests > so that this extra output doesn't cause unnecessary failures? > Something like simply filtering all the "attempting to find > secondary superblock..." and "...." lines from the output would work > just fine - all we really care about is that a secondary sb is found > and verified, not how many steps it takes to find it... >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From sandeen@sandeen.net Mon May 30 17:09:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B4287CA0 for ; Mon, 30 May 2016 17:09:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB0A3AC002 for ; Mon, 30 May 2016 15:08:56 -0700 (PDT) X-ASG-Debug-ID: 1464646133-04cb6c2dbaa3b870001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Wj9uSVTBtQEivTKW for ; Mon, 30 May 2016 15:08:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.158] (EricSannsiPhone.sandeen.net [10.0.0.158]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4AC9D335054; Mon, 30 May 2016 17:08:53 -0500 (CDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (1.0) Subject: Re: [PATCH] xfs: fix broken multi-fsb buffer logging From: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH] xfs: fix broken multi-fsb buffer logging X-Mailer: iPhone Mail (13F69) In-Reply-To: <20160530140836.GA18031@bfoster.bfoster> Date: Mon, 30 May 2016 17:08:52 -0500 Cc: xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <6F890F4E-AAAF-40B5-82BE-B6779E264D29@sandeen.net> References: <1464204667-10199-1-git-send-email-bfoster@redhat.com> <20160530140836.GA18031@bfoster.bfoster> To: Brian Foster X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464646133 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 611 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MIME_QP_LONG_LINE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars > On May 30, 2016, at 9:08 AM, Brian Foster wrote: >=20 >> ... >=20 > This has passed my tests without any obvious problems or regressions. > Any other thoughts/comments or reviews? I'd like to get a backport going > for this, but can't do so until there is at least some kind of > acknowledgement this is acceptable. >=20 > Brian >=20 Sorry Brian, I meant to review this last Friday, but got wrapped up in other= things=E2=80=A6 My first pass over it looks fine, I just want to give it a l= ittle more in depth review, and I will do my best to get that done tomorrow.= Eric >> Brian From david@fromorbit.com Mon May 30 17:37:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D41D77CA0 for ; Mon, 30 May 2016 17:37:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AD57AC003 for ; Mon, 30 May 2016 15:37:29 -0700 (PDT) X-ASG-Debug-ID: 1464647845-04bdf05ad5a60040001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bGpjhBA2QN6YSIvp for ; Mon, 30 May 2016 15:37:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A1PgBowExXLf0/LHlbgzyBBE+Gbp5eAQEBAQEBBowlg1mCH4QXhGmBIgICAQECgTRNAQEBAQEBBwEBAQEBQUBBDAGDdwEBAQMBJxMcDxQFCwgbCRoLDwUlAwcaE4gnB71HAQEBBwIBJB6FQYk/hXgFiASFYYpSiHiFHoFzhE+IZEWPB4JoHBaBRyoyhS2EEAEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 08:06:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7Vnt-00036g-Go; Tue, 31 May 2016 08:36:57 +1000 Date: Tue, 31 May 2016 08:36:57 +1000 From: Dave Chinner To: Stefan Priebe - Profihost AG Cc: Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160530223657.GP26977@dastard> X-ASG-Orig-Subj: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160511133417.GA42410@bfoster.bfoster> <57333BA4.4040402@profihost.ag> <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <574BEA84.3010206@profihost.ag> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464647845 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5371 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [adding lkml and linux-mm to the cc list] On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > Hi Dave, > Hi Brian, > > below are the results with a vanilla 4.4.11 kernel. Thanks for persisting with the testing, Stefan. .... > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > fresh reboot it has happened again on the root FS for a debian apt file: > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > ------------[ cut here ]------------ > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > xfs_vm_releasepage+0x10f/0x140() > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > Call Trace: > [] dump_stack+0x63/0x84 > [] warn_slowpath_common+0x97/0xe0 > [] warn_slowpath_null+0x1a/0x20 > [] xfs_vm_releasepage+0x10f/0x140 > [] ? page_mkclean_one+0xd0/0xd0 > [] ? anon_vma_prepare+0x150/0x150 > [] try_to_release_page+0x32/0x50 > [] shrink_active_list+0x3ce/0x3e0 > [] shrink_lruvec+0x687/0x7d0 > [] shrink_zone+0xdc/0x2c0 > [] kswapd+0x4f9/0x970 > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > [] kthread+0xc9/0xe0 > [] ? kthread_stop+0x100/0x100 > [] ret_from_fork+0x3f/0x70 > [] ? kthread_stop+0x100/0x100 > ---[ end trace c9d679f8ed4d7610 ]--- > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > 0x12b990 > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size ..... Ok, I suspect this may be a VM bug. I've been looking at the 4.6 code (so please try to reproduce on that kernel!) but it looks to me like the only way we can get from shrink_active_list() direct to try_to_release_page() is if we are over the maximum bufferhead threshold (i.e buffer_heads_over_limit = true) and we are trying to reclaim pages direct from the active list. Because we are called from kswapd()->balance_pgdat(), we have: struct scan_control sc = { .gfp_mask = GFP_KERNEL, .order = order, .priority = DEF_PRIORITY, .may_writepage = !laptop_mode, .may_unmap = 1, .may_swap = 1, }; The key point here is reclaim is being run with .may_writepage = true for default configuration kernels. when we get to shrink_active_list(): if (!sc->may_writepage) isolate_mode |= ISOLATE_CLEAN; But sc->may_writepage = true and this allows isolate_lru_pages() to isolate dirty pages from the active list. Normally this isn't a problem, because the isolated active list pages are rotated to the inactive list, and nothing else happens to them. *Except when buffer_heads_over_limit = true*. This special condition would explain why I have never seen apt/dpkg cause this problem on any of my (many) Debian systems that all use XFS.... In that case, shrink_active_list() runs: if (unlikely(buffer_heads_over_limit)) { if (page_has_private(page) && trylock_page(page)) { if (page_has_private(page)) try_to_release_page(page, 0); unlock_page(page); } } i.e. it locks the page, and if it has buffer heads it trys to get the bufferheads freed from the page. But this is a dirty page, which means it may have delalloc or unwritten state on it's buffers, both of which indicate that there is dirty data in teh page that hasn't been written. XFS issues a warning on this because neither shrink_active_list nor try_to_release_page() check for whether the page is dirty or not. Hence it seems to me that shrink_active_list() is calling try_to_release_page() inappropriately, and XFS is just the messenger. If you turn laptop mode on, it is likely the problem will go away as kswapd will run with .may_writepage = false, but that will also cause other behavioural changes relating to writeback and memory reclaim. It might be worth trying as a workaround for now. MM-folk - is this analysis correct? If so, why is shrink_active_list() calling try_to_release_page() on dirty pages? Is this just an oversight or is there some problem that this is trying to work around? It seems trivial to fix to me (add a !PageDirty check), but I don't know why the check is there in the first place... Cheers, Dave. -- Dave Chinner david@fromorbit.com From minchan@kernel.org Mon May 30 20:06:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8FE167CA0 for ; Mon, 30 May 2016 20:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F16930404E for ; Mon, 30 May 2016 18:06:51 -0700 (PDT) X-ASG-Debug-ID: 1464656807-04bdf05ad7a77d70001-NocioJ Received: from lgeamrelo12.lge.com (LGEAMRELO12.lge.com [156.147.23.52]) by cuda.sgi.com with ESMTP id ZFa3pScOgKF2lSB1 for ; Mon, 30 May 2016 18:06:47 -0700 (PDT) X-Barracuda-Envelope-From: minchan@kernel.org X-Barracuda-Effective-Source-IP: LGEAMRELO12.lge.com[156.147.23.52] X-Barracuda-Apparent-Source-IP: 156.147.23.52 Received: from unknown (HELO lgeamrelo01.lge.com) (156.147.1.125) by 156.147.23.52 with ESMTP; 31 May 2016 10:06:46 +0900 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: minchan@kernel.org Received: from unknown (HELO LGEAEXHB04Q.LGE.NET) (165.244.98.204) by 156.147.1.125 with ESMTP; 31 May 2016 10:06:46 +0900 X-Original-SENDERIP: 165.244.98.204 X-Original-MAILFROM: minchan@kernel.org Received: from lgekrmhub05.lge.com (10.185.110.15) by LGEAEXHB04Q.LGE.NET (165.244.98.204) with Microsoft SMTP Server id 8.3.264.0; Tue, 31 May 2016 10:06:46 +0900 Received: from lgeamrelo04.lge.com ([156.147.1.127]) by lgekrmhub05.lge.com (Lotus Domino Release 8.5.3FP6) with ESMTP id 2016053110064576-253495 ; Tue, 31 May 2016 10:06:45 +0900 Received: from unknown (HELO bbox) (10.177.223.161) by 156.147.1.127 with ESMTP; 31 May 2016 10:06:46 +0900 X-Original-SENDERIP: 10.177.223.161 X-Original-MAILFROM: minchan@kernel.org Date: Tue, 31 May 2016 10:07:24 +0900 From: Minchan Kim To: Dave Chinner CC: Stefan Priebe - Profihost AG , Brian Foster , "xfs@oss.sgi.com" , , Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531010724.GA9616@bbox> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <57333BA4.4040402@profihost.ag> <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> MIME-Version: 1.0 In-Reply-To: <20160530223657.GP26977@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-MIMETrack: Itemize by SMTP Server on LGEKRMHUB05/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/05/31 10:06:45, Serialize by Router on LGEKRMHUB05/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/05/31 10:06:45, Serialize complete at 2016/05/31 10:06:45 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline X-Barracuda-Connect: LGEAMRELO12.lge.com[156.147.23.52] X-Barracuda-Start-Time: 1464656807 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7243 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > [adding lkml and linux-mm to the cc list] > > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > > Hi Dave, > > Hi Brian, > > > > below are the results with a vanilla 4.4.11 kernel. > > Thanks for persisting with the testing, Stefan. > > .... > > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > > fresh reboot it has happened again on the root FS for a debian apt file: > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > > ------------[ cut here ]------------ > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > > xfs_vm_releasepage+0x10f/0x140() > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > > Call Trace: > > [] dump_stack+0x63/0x84 > > [] warn_slowpath_common+0x97/0xe0 > > [] warn_slowpath_null+0x1a/0x20 > > [] xfs_vm_releasepage+0x10f/0x140 > > [] ? page_mkclean_one+0xd0/0xd0 > > [] ? anon_vma_prepare+0x150/0x150 > > [] try_to_release_page+0x32/0x50 > > [] shrink_active_list+0x3ce/0x3e0 > > [] shrink_lruvec+0x687/0x7d0 > > [] shrink_zone+0xdc/0x2c0 > > [] kswapd+0x4f9/0x970 > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > [] kthread+0xc9/0xe0 > > [] ? kthread_stop+0x100/0x100 > > [] ret_from_fork+0x3f/0x70 > > [] ? kthread_stop+0x100/0x100 > > ---[ end trace c9d679f8ed4d7610 ]--- > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > > 0x12b990 > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size > ..... > > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 > code (so please try to reproduce on that kernel!) but it looks to me > like the only way we can get from shrink_active_list() direct to > try_to_release_page() is if we are over the maximum bufferhead > threshold (i.e buffer_heads_over_limit = true) and we are trying to > reclaim pages direct from the active list. > > Because we are called from kswapd()->balance_pgdat(), we have: > > struct scan_control sc = { > .gfp_mask = GFP_KERNEL, > .order = order, > .priority = DEF_PRIORITY, > .may_writepage = !laptop_mode, > .may_unmap = 1, > .may_swap = 1, > }; > > The key point here is reclaim is being run with .may_writepage = > true for default configuration kernels. when we get to > shrink_active_list(): > > if (!sc->may_writepage) > isolate_mode |= ISOLATE_CLEAN; > > But sc->may_writepage = true and this allows isolate_lru_pages() to > isolate dirty pages from the active list. Normally this isn't a > problem, because the isolated active list pages are rotated to the > inactive list, and nothing else happens to them. *Except when > buffer_heads_over_limit = true*. This special condition would > explain why I have never seen apt/dpkg cause this problem on any of > my (many) Debian systems that all use XFS.... > > In that case, shrink_active_list() runs: > > if (unlikely(buffer_heads_over_limit)) { > if (page_has_private(page) && trylock_page(page)) { > if (page_has_private(page)) > try_to_release_page(page, 0); > unlock_page(page); > } > } > > i.e. it locks the page, and if it has buffer heads it trys to get > the bufferheads freed from the page. > > But this is a dirty page, which means it may have delalloc or > unwritten state on it's buffers, both of which indicate that there > is dirty data in teh page that hasn't been written. XFS issues a > warning on this because neither shrink_active_list nor > try_to_release_page() check for whether the page is dirty or not. > > Hence it seems to me that shrink_active_list() is calling > try_to_release_page() inappropriately, and XFS is just the > messenger. If you turn laptop mode on, it is likely the problem will > go away as kswapd will run with .may_writepage = false, but that > will also cause other behavioural changes relating to writeback and > memory reclaim. It might be worth trying as a workaround for now. > > MM-folk - is this analysis correct? If so, why is > shrink_active_list() calling try_to_release_page() on dirty pages? > Is this just an oversight or is there some problem that this is > trying to work around? It seems trivial to fix to me (add a > !PageDirty check), but I don't know why the check is there in the > first place... It seems to be latter. Below commit seems to be related. [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] At that time, even shrink_page_list works like this. shrink_page_list while (!list_empty(page_list)) { .. .. if (PageDirty(page)) { .. } /* * If the page has buffers, try to free the buffer mappings * associated with this page. If we succeed we try to free * the page as well. * * We do this even if the page is PageDirty(). * try_to_release_page() does not perform I/O, but it is * possible for a page to have PageDirty set, but it is actually * clean (all its buffers are clean). This happens if the * buffers were written out directly, with submit_bh(). ext3 * will do this, as well as the blockdev mapping. * try_to_release_page() will discover that cleanness and will * drop the buffers and mark the page clean - it can be freed. * .. */ if (PagePrivate(page)) { if (!try_to_release_page(page, sc->gfp_mask)) goto activate_locked; if (!mapping && page_count(page) == 1) goto free_it; } .. } I wonder whether it's valid or not with on ext4. From baotiao@gmail.com Mon May 30 21:43:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 264877CA0 for ; Mon, 30 May 2016 21:43:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79AF1AC001 for ; Mon, 30 May 2016 19:43:43 -0700 (PDT) X-ASG-Debug-ID: 1464662617-04cb6c2db9a588e0001-NocioJ Received: from mail-qg0-f50.google.com (mail-qg0-f50.google.com [209.85.192.50]) by cuda.sgi.com with ESMTP id 7kgrYensCciPCe9V (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 30 May 2016 19:43:37 -0700 (PDT) X-Barracuda-Envelope-From: baotiao@gmail.com X-Barracuda-Effective-Source-IP: mail-qg0-f50.google.com[209.85.192.50] X-Barracuda-Apparent-Source-IP: 209.85.192.50 Received: by mail-qg0-f50.google.com with SMTP id e93so85166956qgf.2 for ; Mon, 30 May 2016 19:43:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=7LaLXyI0Ht4giv9TiVWSWywGh4MkWIUy0xnZVi+EV90=; b=Qtc3tgfcDLKM8qiNUw+7oVOtK5SQ7LEmODxlOrMHWvVr7yA6A0RvBD0uTX5bBcRqMX GmR6KJIXboQ3XThabiSlsokrbludqe9jDF16F4PZFpx0KOTe4jDdSgaK++eNAoGnVcrD 7KlTqTR61VIJt+NyfsUSEMdoF6IhvylKMGFF6xamz3Zvb5oSyMOaAFSsrKNiM/t/w4Gh hjH785ZD7DsdM1ZG1P51jzcKuGQUCjCLvQTniK+x1fxWF9HjEP/ZQb4v9OPG0+Iy5ccI PSITrZ8TNsBcLOjbJ9LT9bKbGc8VH0WrGtCrH5F1CHDDVw9g6AjgvxiYAKEflTIqi/I6 4QbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=7LaLXyI0Ht4giv9TiVWSWywGh4MkWIUy0xnZVi+EV90=; b=GfH53i//QXSByyPWNggtJpDrEnM0FXYWPufVSUXUhbxWizmCPVYx2W4427p7mR1ULV MC7Atbe17hZm3xbdpCtUR3Q+OKZh5DtI353zIhYgyiGGFklvCqs2yGZJ3V4r3G5x/GcI 0qDQAon5aevLoAFmDw1tG2NYFXQfAWrDspRC5CKY/x5oXlJF0hWDqIiJzNGS4lbsWDWf RCm7jiJvwow6f+qLz+v0i45EEhzXDsaLdx9JzXntKeNTSFTwo7CbGw/LOW9l6rea6bxV rEGLat1IBdJ3W1pbyfkKF7pVjOPNrgKqmytdy36lqtt1UFuW/8MewNzA1VbrFVzIdCIM rYbg== X-Gm-Message-State: ALyK8tKUdTZbWYCpaz8U1wOM1N0NOqYgooYSxexeOmmU9lKgo4Aba4op2YhFirBhC4Eo5g4iqIDwEh1gDTRxGg== MIME-Version: 1.0 X-Received: by 10.140.20.162 with SMTP id 31mr17491968qgj.106.1464662616773; Mon, 30 May 2016 19:43:36 -0700 (PDT) Received: by 10.55.21.156 with HTTP; Mon, 30 May 2016 19:43:36 -0700 (PDT) In-Reply-To: <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> References: <20160530050452.GM26977@dastard> <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> Date: Tue, 31 May 2016 10:43:36 +0800 Message-ID: Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc From: =?UTF-8?B?6ZmI5a6X5b+X?= X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c1248afd1fdc05341a561f X-Barracuda-Connect: mail-qg0-f50.google.com[209.85.192.50] X-Barracuda-Start-Time: 1464662617 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5644 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30041 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c1248afd1fdc05341a561f Content-Type: text/plain; charset=UTF-8 I have fint the way to change the extent size hint mkfs.xfs -r extsize=40960 /dev/sda1 but I should rebuild the disk, do you have a way more smooth? On Mon, May 30, 2016 at 4:48 PM, baotiao wrote: > how can I set the extent size hint to a file with command line? > I have google for a lot, but I can't find a answer > > ---------------------------------------- > > Github: https://github.com/baotiao > Blog: http://baotiao.github.io > Stackoverflow: http://stackoverflow.com/users/634415/baotiao > Linkedin: http://www.linkedin.com/profile/view?id=145231990 > > On May 30, 2016, at 13:04, Dave Chinner wrote: > > On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote: > > This machine is running for qemu, the file is qemu qcow file type > > [root@w-openstack20 > /data/nova/instances/7898b630-c4ef-49ab-9ce9-3735e090c282]# file disk > disk: QEMU QCOW Image (v3), has backing file (path > /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), > 429496729600 bytes > > > Oh, you're using delta/snapshot based qcow images. That, by it's > very nature, generates fragmented image files as they are a delta > over the backing file. > > .... > > actual 48421430, ideal 20716, fragmentation factor 99.96% > > How can I solve this problem, what do you suggest me to do? > > > Use a extent size hint (say 1-8MB) for your qcow2 image files so that > they don't fragment badly as they are written to. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > > -- --- Blog: http://www.chenzongzhi.info Twitter: https://twitter.com/baotiao Git: https://github.com/baotiao --001a11c1248afd1fdc05341a561f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
I have fint the way to change the extent size hintmkfs.xfs -r extsize=3D40960 /dev/sda1

but I should rebuild th= e disk, do you have a way more smooth?


On Mon, May 30, 2016 at 4:48 PM, baotiao= <baotiao@gmail.com> wrote:
how can I set the extent size hint to= a file with command line?=C2=A0
I have google for a lot, but I can'= ;t find a answer


On Ma= y 30, 2016, at 13:04, Dave Chinner <david@fromorbit.com> wrote:

= On Mon, May 30, 2016 at 12:45:07PM +0800, baotiao wrote:
This machine is running for qemu, =C2=A0the file is qemu qcow fi= le type

[root@w-openstack20 /data/nova/instances/7898b630-c4ef-49ab-= 9ce9-3735e090c282]# file disk
disk: QEMU QCOW Image (v3), has backing fi= le (path /data/nova/instances/_base/3f27393376152ac352b2d85703011e38517e), = 429496729600 bytes

Oh, you're using delta/snapshot = based qcow images. That, by it's
very nature, generates fragmented i= mage files as they are a delta
over the backing file.

....
actual 48421430, ideal 20716, fragmentation factor 9= 9.96%

How can I solve this problem, what do you suggest me to do?

Use a extent size hint (say 1-8MB) for your qcow2 image f= iles so that
they don't fragment badly as they are written to.
<= br>Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com




--
---
Blog: http://www.chenzongzhi.info
Twitter: https://twitte= r.com/baotiao
Git: https://github.com/baotiao
--001a11c1248afd1fdc05341a561f-- From david@fromorbit.com Mon May 30 21:55:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCE837CA0 for ; Mon, 30 May 2016 21:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51609AC001 for ; Mon, 30 May 2016 19:55:16 -0700 (PDT) X-ASG-Debug-ID: 1464663312-04bdf05ad4a82300001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id VTii7sbBl8v2TIv8 for ; Mon, 30 May 2016 19:55:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AwJgBa/ExXLf0/LHlbgzyBBE+Gbp5lBowlg1mCH4QXhGmBIgICAQECgTVNAQEBAQEBBwEBAQEBQAFAQQwBg3cBAQEDAScTHA8UBQsIAxgJGgsPBSUDBxoTiCcHvUYBAQEBBgEBAQEBIh6FQYUVhCqDSoIuBYgEhWGKUoh4hR6Bc4RPiGRFjweCaBwWgUcqMoUthBABAQE Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 12:25:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7Zpl-0003Qq-El; Tue, 31 May 2016 12:55:09 +1000 Date: Tue, 31 May 2016 12:55:09 +1000 From: Dave Chinner To: Minchan Kim Cc: Stefan Priebe - Profihost AG , Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531025509.GA12670@dastard> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531010724.GA9616@bbox> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464663312 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6938 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 10:07:24AM +0900, Minchan Kim wrote: > On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > > [adding lkml and linux-mm to the cc list] > > > > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > > > Hi Dave, > > > Hi Brian, > > > > > > below are the results with a vanilla 4.4.11 kernel. > > > > Thanks for persisting with the testing, Stefan. > > > > .... > > > > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > > > fresh reboot it has happened again on the root FS for a debian apt file: > > > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > > > ------------[ cut here ]------------ > > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > > > xfs_vm_releasepage+0x10f/0x140() > > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > > > Call Trace: > > > [] dump_stack+0x63/0x84 > > > [] warn_slowpath_common+0x97/0xe0 > > > [] warn_slowpath_null+0x1a/0x20 > > > [] xfs_vm_releasepage+0x10f/0x140 > > > [] ? page_mkclean_one+0xd0/0xd0 > > > [] ? anon_vma_prepare+0x150/0x150 > > > [] try_to_release_page+0x32/0x50 > > > [] shrink_active_list+0x3ce/0x3e0 > > > [] shrink_lruvec+0x687/0x7d0 > > > [] shrink_zone+0xdc/0x2c0 > > > [] kswapd+0x4f9/0x970 > > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > > [] kthread+0xc9/0xe0 > > > [] ? kthread_stop+0x100/0x100 > > > [] ret_from_fork+0x3f/0x70 > > > [] ? kthread_stop+0x100/0x100 > > > ---[ end trace c9d679f8ed4d7610 ]--- > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > > > 0x12b990 > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size > > ..... > > > > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 > > code (so please try to reproduce on that kernel!) but it looks to me > > like the only way we can get from shrink_active_list() direct to > > try_to_release_page() is if we are over the maximum bufferhead > > threshold (i.e buffer_heads_over_limit = true) and we are trying to > > reclaim pages direct from the active list. > > > > Because we are called from kswapd()->balance_pgdat(), we have: > > > > struct scan_control sc = { > > .gfp_mask = GFP_KERNEL, > > .order = order, > > .priority = DEF_PRIORITY, > > .may_writepage = !laptop_mode, > > .may_unmap = 1, > > .may_swap = 1, > > }; > > > > The key point here is reclaim is being run with .may_writepage = > > true for default configuration kernels. when we get to > > shrink_active_list(): > > > > if (!sc->may_writepage) > > isolate_mode |= ISOLATE_CLEAN; > > > > But sc->may_writepage = true and this allows isolate_lru_pages() to > > isolate dirty pages from the active list. Normally this isn't a > > problem, because the isolated active list pages are rotated to the > > inactive list, and nothing else happens to them. *Except when > > buffer_heads_over_limit = true*. This special condition would > > explain why I have never seen apt/dpkg cause this problem on any of > > my (many) Debian systems that all use XFS.... > > > > In that case, shrink_active_list() runs: > > > > if (unlikely(buffer_heads_over_limit)) { > > if (page_has_private(page) && trylock_page(page)) { > > if (page_has_private(page)) > > try_to_release_page(page, 0); > > unlock_page(page); > > } > > } > > > > i.e. it locks the page, and if it has buffer heads it trys to get > > the bufferheads freed from the page. > > > > But this is a dirty page, which means it may have delalloc or > > unwritten state on it's buffers, both of which indicate that there > > is dirty data in teh page that hasn't been written. XFS issues a > > warning on this because neither shrink_active_list nor > > try_to_release_page() check for whether the page is dirty or not. > > > > Hence it seems to me that shrink_active_list() is calling > > try_to_release_page() inappropriately, and XFS is just the > > messenger. If you turn laptop mode on, it is likely the problem will > > go away as kswapd will run with .may_writepage = false, but that > > will also cause other behavioural changes relating to writeback and > > memory reclaim. It might be worth trying as a workaround for now. > > > > MM-folk - is this analysis correct? If so, why is > > shrink_active_list() calling try_to_release_page() on dirty pages? > > Is this just an oversight or is there some problem that this is > > trying to work around? It seems trivial to fix to me (add a > > !PageDirty check), but I don't know why the check is there in the > > first place... > > It seems to be latter. > Below commit seems to be related. > [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] Okay, that's been there a long, long time (2007), and it covers a case where the filesystem cleans pages without the VM knowing about it (i.e. it marks bufferheads clean without clearing the PageDirty state). That does not explain the code in shrink_active_list(). > At that time, even shrink_page_list works like this. The current code in shrink_page_list still works this way - the PageDirty code will *jump over the PagePrivate case* if the page is to remain dirty or pageout() fails to make it clean. Hence it never gets to try_to_release_page() on a dirty page. Seems like this really needs a dirty check in shrink_active_list() and to leave the stripping of bufferheads from dirty pages in the ext3 corner case to shrink_inactive_list() once the dirty pages have been rotated off the active list... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 30 22:12:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 977937CA0 for ; Mon, 30 May 2016 22:12:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 10927AC001 for ; Mon, 30 May 2016 20:12:29 -0700 (PDT) X-ASG-Debug-ID: 1464664346-04cb6c2db9a5acb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Yn4FVrXza4fU5mev for ; Mon, 30 May 2016 20:12:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CaHwDl/0xXLf0/LHlbgzyBU4NDgyueZQaEFIgRig+GCwQCAoE1TQEBAQEBAQcBAQEBAUABQEEMAYN4AQEEIw8BIyMQCAECGAICBSECAg8FJQMHGhOILo8bnR2RDQEBAQcCASQeY4RehRWHSSuCLgEEmDeOFoFdjUlFjweEYSoyhS2EEAEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 12:40:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7a4I-0003Sm-Pz; Tue, 31 May 2016 13:10:10 +1000 Date: Tue, 31 May 2016 13:10:10 +1000 From: Dave Chinner To: =?utf-8?B?6ZmI5a6X5b+X?= Cc: xfs@oss.sgi.com Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc Message-ID: <20160531031010.GB12670@dastard> X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc References: <20160530050452.GM26977@dastard> <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464664346 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 662 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 10:43:36AM +0800, 陈宗志 wrote: > I have fint the way to change the extent size hint > mkfs.xfs -r extsize=40960 /dev/sda1 Ah, no, that isn't the extsize I'm refering to. That's for realtime device configuration at mkfs, not a per-inode extent size hint. When you create the image file do this: $ xfs_io -f -c "extsize 1m" /path/to/new/vm_image $ qemu-image create -f qcow2 /path/to/new/vm_image 10g $ xfs_io -c extsize /path/to/new/vm_image [1048576] /path/to/new/vm_image $ And now the qcow2 image file will have extents allocated in multiples of 1MB. Cheers, Dave. -- Dave Chinner david@fromorbit.com From minchan@kernel.org Mon May 30 22:58:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BED327CA0 for ; Mon, 30 May 2016 22:58:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8220C304039 for ; Mon, 30 May 2016 20:58:29 -0700 (PDT) X-ASG-Debug-ID: 1464667105-04cb6c2db9a5e230001-NocioJ Received: from lgeamrelo11.lge.com (LGEAMRELO11.lge.com [156.147.23.51]) by cuda.sgi.com with ESMTP id HPHFcE7dn28n5PiZ for ; Mon, 30 May 2016 20:58:26 -0700 (PDT) X-Barracuda-Envelope-From: minchan@kernel.org X-Barracuda-Effective-Source-IP: LGEAMRELO11.lge.com[156.147.23.51] X-Barracuda-Apparent-Source-IP: 156.147.23.51 Received: from unknown (HELO lgeamrelo01.lge.com) (156.147.1.125) by 156.147.23.51 with ESMTP; 31 May 2016 12:58:25 +0900 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: minchan@kernel.org Received: from unknown (HELO LGEAEXHB02Q.LGE.NET) (165.244.98.150) by 156.147.1.125 with ESMTP; 31 May 2016 12:58:25 +0900 X-Original-SENDERIP: 165.244.98.150 X-Original-MAILFROM: minchan@kernel.org Received: from lgekrmhub01.lge.com (10.185.110.11) by lgeaexhb02q.lge.net (165.244.98.150) with Microsoft SMTP Server id 8.3.264.0; Tue, 31 May 2016 12:58:25 +0900 Received: from lgeamrelo02.lge.com ([156.147.1.126]) by lgekrmhub01.lge.com (Lotus Domino Release 8.5.3FP6) with ESMTP id 2016053112582429-285631 ; Tue, 31 May 2016 12:58:24 +0900 Received: from unknown (HELO bbox) (10.177.223.161) by 156.147.1.126 with ESMTP; 31 May 2016 12:58:24 +0900 X-Original-SENDERIP: 10.177.223.161 X-Original-MAILFROM: minchan@kernel.org Date: Tue, 31 May 2016 12:59:04 +0900 From: Minchan Kim To: Dave Chinner CC: Stefan Priebe - Profihost AG , Brian Foster , "xfs@oss.sgi.com" , , Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531035904.GA17371@bbox> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531025509.GA12670@dastard> MIME-Version: 1.0 In-Reply-To: <20160531025509.GA12670@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-MIMETrack: Itemize by SMTP Server on LGEKRMHUB01/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/05/31 12:58:24, Serialize by Router on LGEKRMHUB01/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/05/31 12:58:24, Serialize complete at 2016/05/31 12:58:24 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline X-Barracuda-Connect: LGEAMRELO11.lge.com[156.147.23.51] X-Barracuda-Start-Time: 1464667105 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9916 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 12:55:09PM +1000, Dave Chinner wrote: > On Tue, May 31, 2016 at 10:07:24AM +0900, Minchan Kim wrote: > > On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > > > [adding lkml and linux-mm to the cc list] > > > > > > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > > > > Hi Dave, > > > > Hi Brian, > > > > > > > > below are the results with a vanilla 4.4.11 kernel. > > > > > > Thanks for persisting with the testing, Stefan. > > > > > > .... > > > > > > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > > > > fresh reboot it has happened again on the root FS for a debian apt file: > > > > > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > > > > ------------[ cut here ]------------ > > > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > > > > xfs_vm_releasepage+0x10f/0x140() > > > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > > > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > > > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > > > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > > > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > > > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > > > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > > > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > > > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > > > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > > > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > > > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > > > > Call Trace: > > > > [] dump_stack+0x63/0x84 > > > > [] warn_slowpath_common+0x97/0xe0 > > > > [] warn_slowpath_null+0x1a/0x20 > > > > [] xfs_vm_releasepage+0x10f/0x140 > > > > [] ? page_mkclean_one+0xd0/0xd0 > > > > [] ? anon_vma_prepare+0x150/0x150 > > > > [] try_to_release_page+0x32/0x50 > > > > [] shrink_active_list+0x3ce/0x3e0 > > > > [] shrink_lruvec+0x687/0x7d0 > > > > [] shrink_zone+0xdc/0x2c0 > > > > [] kswapd+0x4f9/0x970 > > > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > > > [] kthread+0xc9/0xe0 > > > > [] ? kthread_stop+0x100/0x100 > > > > [] ret_from_fork+0x3f/0x70 > > > > [] ? kthread_stop+0x100/0x100 > > > > ---[ end trace c9d679f8ed4d7610 ]--- > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > > > > 0x12b990 > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size > > > ..... > > > > > > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 > > > code (so please try to reproduce on that kernel!) but it looks to me > > > like the only way we can get from shrink_active_list() direct to > > > try_to_release_page() is if we are over the maximum bufferhead > > > threshold (i.e buffer_heads_over_limit = true) and we are trying to > > > reclaim pages direct from the active list. > > > > > > Because we are called from kswapd()->balance_pgdat(), we have: > > > > > > struct scan_control sc = { > > > .gfp_mask = GFP_KERNEL, > > > .order = order, > > > .priority = DEF_PRIORITY, > > > .may_writepage = !laptop_mode, > > > .may_unmap = 1, > > > .may_swap = 1, > > > }; > > > > > > The key point here is reclaim is being run with .may_writepage = > > > true for default configuration kernels. when we get to > > > shrink_active_list(): > > > > > > if (!sc->may_writepage) > > > isolate_mode |= ISOLATE_CLEAN; > > > > > > But sc->may_writepage = true and this allows isolate_lru_pages() to > > > isolate dirty pages from the active list. Normally this isn't a > > > problem, because the isolated active list pages are rotated to the > > > inactive list, and nothing else happens to them. *Except when > > > buffer_heads_over_limit = true*. This special condition would > > > explain why I have never seen apt/dpkg cause this problem on any of > > > my (many) Debian systems that all use XFS.... > > > > > > In that case, shrink_active_list() runs: > > > > > > if (unlikely(buffer_heads_over_limit)) { > > > if (page_has_private(page) && trylock_page(page)) { > > > if (page_has_private(page)) > > > try_to_release_page(page, 0); > > > unlock_page(page); > > > } > > > } > > > > > > i.e. it locks the page, and if it has buffer heads it trys to get > > > the bufferheads freed from the page. > > > > > > But this is a dirty page, which means it may have delalloc or > > > unwritten state on it's buffers, both of which indicate that there > > > is dirty data in teh page that hasn't been written. XFS issues a > > > warning on this because neither shrink_active_list nor > > > try_to_release_page() check for whether the page is dirty or not. > > > > > > Hence it seems to me that shrink_active_list() is calling > > > try_to_release_page() inappropriately, and XFS is just the > > > messenger. If you turn laptop mode on, it is likely the problem will > > > go away as kswapd will run with .may_writepage = false, but that > > > will also cause other behavioural changes relating to writeback and > > > memory reclaim. It might be worth trying as a workaround for now. > > > > > > MM-folk - is this analysis correct? If so, why is > > > shrink_active_list() calling try_to_release_page() on dirty pages? > > > Is this just an oversight or is there some problem that this is > > > trying to work around? It seems trivial to fix to me (add a > > > !PageDirty check), but I don't know why the check is there in the > > > first place... > > > > It seems to be latter. > > Below commit seems to be related. > > [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] > > Okay, that's been there a long, long time (2007), and it covers a > case where the filesystem cleans pages without the VM knowing about > it (i.e. it marks bufferheads clean without clearing the PageDirty > state). > > That does not explain the code in shrink_active_list(). Yeb, My point was the patch removed the PageDirty check in try_to_free_buffers. When I read description correctly, at that time, we wanted to check PageDirty in try_to_free_buffers but couldn't do with above ext3 corner case reason. iff --git a/fs/buffer.c b/fs/buffer.c index 3b116078b4c3..460f1c43238e 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2834,7 +2834,7 @@ int try_to_free_buffers(struct page *page) int ret = 0; BUG_ON(!PageLocked(page)); - if (PageDirty(page) || PageWriteback(page)) + if (PageWriteback(page)) return 0; And I found a culprit. e182d61263b7d5, [PATCH] buffer_head takedown for bighighmem machines It introduced pagevec_strip wich calls try_to_release_page without PageDirty check in refill_inactive_zone which is shrink_active_list now. Quote from " In refill_inactive(): if the number of buffer_heads is excessive then strip buffers from pages as they move onto the inactive list. This change is useful for all filesystems. This approach is good because pages which are being repeatedly overwritten will remain on the active list and will retain their buffers, whereas pages which are not being overwritten will be stripped. " > > > At that time, even shrink_page_list works like this. > > The current code in shrink_page_list still works this way - the > PageDirty code will *jump over the PagePrivate case* if the page is > to remain dirty or pageout() fails to make it clean. Hence it never > gets to try_to_release_page() on a dirty page. > > Seems like this really needs a dirty check in shrink_active_list() > and to leave the stripping of bufferheads from dirty pages in the > ext3 corner case to shrink_inactive_list() once the dirty pages have > been rotated off the active list... Another topic: I don't know file system at all so I might miss something. IMHO, if we should prohibit dirty page to fs->releasepage, isn't it better to move PageDirty warning check to try_to_release_page and clean it up all FSes's releasepage. diff --git a/mm/filemap.c b/mm/filemap.c index 00ae878b2a38..7c8b375c3475 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2821,8 +2821,10 @@ int try_to_release_page(struct page *page, gfp_t gfp_mask) if (PageWriteback(page)) return 0; - if (mapping && mapping->a_ops->releasepage) + if (mapping && mapping->a_ops->releasepage) { + WARN_ON(PageDirty(page)); return mapping->a_ops->releasepage(page, gfp_mask); + } return try_to_free_buffers(page); } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 9a8bbc1fb1fa..89b432a90f59 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1795,10 +1795,6 @@ void f2fs_invalidate_page(struct page *page, unsigned int offset, int f2fs_release_page(struct page *page, gfp_t wait) { - /* If this is dirty page, keep PagePrivate */ - if (PageDirty(page)) - return 0; - /* This is atomic written page, keep Private */ if (IS_ATOMIC_WRITTEN_PAGE(page)) return 0; Otherwise, we can simply return 0 in try_to_relase_page if it finds dirty page. From david@fromorbit.com Tue May 31 01:08:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A2ED27CA0 for ; Tue, 31 May 2016 01:08:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66E638F8033 for ; Mon, 30 May 2016 23:08:09 -0700 (PDT) X-ASG-Debug-ID: 1464674885-04cbb0356aa77fe0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id VStcPEDCCAzTKZuG for ; Mon, 30 May 2016 23:08:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CBFQAjKU1XLf0/LHlbgzyBU4J1g3meZQaMJYNZgh+EF4RpgSICAgEBAoE4TQEBAQEBAQcBAQEBAUFAQQwBg3cBAQEDAScTHBESBQsIAxgJGgsPBSUDBxoTiCcHvUYBAQgCASQehUGEEoEDh3SCLgWTN4UAjhaPJkWPB4MagUcqMoUthBABAQE Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 15:37:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7cpc-0003ey-KL; Tue, 31 May 2016 16:07:12 +1000 Date: Tue, 31 May 2016 16:07:12 +1000 From: Dave Chinner To: Minchan Kim Cc: Stefan Priebe - Profihost AG , Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531060712.GC12670@dastard> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531025509.GA12670@dastard> <20160531035904.GA17371@bbox> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531035904.GA17371@bbox> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464674885 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3414 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 12:59:04PM +0900, Minchan Kim wrote: > On Tue, May 31, 2016 at 12:55:09PM +1000, Dave Chinner wrote: > > On Tue, May 31, 2016 at 10:07:24AM +0900, Minchan Kim wrote: > > > On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > > > > But this is a dirty page, which means it may have delalloc or > > > > unwritten state on it's buffers, both of which indicate that there > > > > is dirty data in teh page that hasn't been written. XFS issues a > > > > warning on this because neither shrink_active_list nor > > > > try_to_release_page() check for whether the page is dirty or not. > > > > > > > > Hence it seems to me that shrink_active_list() is calling > > > > try_to_release_page() inappropriately, and XFS is just the > > > > messenger. If you turn laptop mode on, it is likely the problem will > > > > go away as kswapd will run with .may_writepage = false, but that > > > > will also cause other behavioural changes relating to writeback and > > > > memory reclaim. It might be worth trying as a workaround for now. > > > > > > > > MM-folk - is this analysis correct? If so, why is > > > > shrink_active_list() calling try_to_release_page() on dirty pages? > > > > Is this just an oversight or is there some problem that this is > > > > trying to work around? It seems trivial to fix to me (add a > > > > !PageDirty check), but I don't know why the check is there in the > > > > first place... > > > > > > It seems to be latter. > > > Below commit seems to be related. > > > [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] > > > > Okay, that's been there a long, long time (2007), and it covers a > > case where the filesystem cleans pages without the VM knowing about > > it (i.e. it marks bufferheads clean without clearing the PageDirty > > state). > > > > That does not explain the code in shrink_active_list(). > > Yeb, My point was the patch removed the PageDirty check in > try_to_free_buffers. *nod* [...] > And I found a culprit. > e182d61263b7d5, [PATCH] buffer_head takedown for bighighmem machines Heh. You have the combined historic tree sitting around for code archeology, just like I do :) > It introduced pagevec_strip wich calls try_to_release_page without > PageDirty check in refill_inactive_zone which is shrink_active_list > now. It was merged 2 days before XFS was merged. Merging XFS made the code Andrew wrote incorrect: > Quote from > " > In refill_inactive(): if the number of buffer_heads is excessive then > strip buffers from pages as they move onto the inactive list. This > change is useful for all filesystems. [....] Except for those that carry state necessary for writeback to be done correctly on the dirty page bufferheads. At the time, nobody doing work the mm/writeback code cared about delayed allocation. So we've carried this behaviour for 14 years without realising that it's probably the source of all the unexplainable warnings we've got from XFS over all that time. I'm half tempted at this point to mostly ignore this mm/ behavour because we are moving down the path of removing buffer heads from XFS. That will require us to do different things in ->releasepage and so just skipping dirty pages in the XFS code is the best thing to do.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From s.priebe@profihost.ag Tue May 31 01:11:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2CBC17CA0 for ; Tue, 31 May 2016 01:11:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D626AC003 for ; Mon, 30 May 2016 23:11:49 -0700 (PDT) X-ASG-Debug-ID: 1464675103-04cb6c2db9a65bd0001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id 85ed6hOQ6Zd424SJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 30 May 2016 23:11:45 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Effective-Source-IP: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 15346 invoked from network); 31 May 2016 08:11:43 +0200 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Tue, 31 May 2016 08:11:43 +0200 Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) To: Dave Chinner , Minchan Kim X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531025509.GA12670@dastard> <20160531035904.GA17371@bbox> <20160531060712.GC12670@dastard> Cc: Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org From: Stefan Priebe - Profihost AG Message-ID: <574D2B1E.2040002@profihost.ag> Date: Tue, 31 May 2016 08:11:42 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <20160531060712.GC12670@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1464675104 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3527 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave, Am 31.05.2016 um 08:07 schrieb Dave Chinner: > On Tue, May 31, 2016 at 12:59:04PM +0900, Minchan Kim wrote: >> On Tue, May 31, 2016 at 12:55:09PM +1000, Dave Chinner wrote: >>> On Tue, May 31, 2016 at 10:07:24AM +0900, Minchan Kim wrote: >>>> On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: >>>>> But this is a dirty page, which means it may have delalloc or >>>>> unwritten state on it's buffers, both of which indicate that there >>>>> is dirty data in teh page that hasn't been written. XFS issues a >>>>> warning on this because neither shrink_active_list nor >>>>> try_to_release_page() check for whether the page is dirty or not. >>>>> >>>>> Hence it seems to me that shrink_active_list() is calling >>>>> try_to_release_page() inappropriately, and XFS is just the >>>>> messenger. If you turn laptop mode on, it is likely the problem will >>>>> go away as kswapd will run with .may_writepage = false, but that >>>>> will also cause other behavioural changes relating to writeback and >>>>> memory reclaim. It might be worth trying as a workaround for now. >>>>> >>>>> MM-folk - is this analysis correct? If so, why is >>>>> shrink_active_list() calling try_to_release_page() on dirty pages? >>>>> Is this just an oversight or is there some problem that this is >>>>> trying to work around? It seems trivial to fix to me (add a >>>>> !PageDirty check), but I don't know why the check is there in the >>>>> first place... >>>> >>>> It seems to be latter. >>>> Below commit seems to be related. >>>> [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] >>> >>> Okay, that's been there a long, long time (2007), and it covers a >>> case where the filesystem cleans pages without the VM knowing about >>> it (i.e. it marks bufferheads clean without clearing the PageDirty >>> state). >>> >>> That does not explain the code in shrink_active_list(). >> >> Yeb, My point was the patch removed the PageDirty check in >> try_to_free_buffers. > > *nod* > > [...] > >> And I found a culprit. >> e182d61263b7d5, [PATCH] buffer_head takedown for bighighmem machines > > Heh. You have the combined historic tree sitting around for code > archeology, just like I do :) > >> It introduced pagevec_strip wich calls try_to_release_page without >> PageDirty check in refill_inactive_zone which is shrink_active_list >> now. > > > > It was merged 2 days before XFS was merged. Merging XFS made the > code Andrew wrote incorrect: > >> Quote from >> " >> In refill_inactive(): if the number of buffer_heads is excessive then >> strip buffers from pages as they move onto the inactive list. This >> change is useful for all filesystems. [....] > > Except for those that carry state necessary for writeback to be done > correctly on the dirty page bufferheads. At the time, nobody doing > work the mm/writeback code cared about delayed allocation. So we've > carried this behaviour for 14 years without realising that it's > probably the source of all the unexplainable warnings we've got from > XFS over all that time. > > I'm half tempted at this point to mostly ignore this mm/ behavour > because we are moving down the path of removing buffer heads from > XFS. That will require us to do different things in ->releasepage > and so just skipping dirty pages in the XFS code is the best thing > to do.... does this change anything i should test? Or is 4.6 still the way to go? Greets, Stefan From david@fromorbit.com Tue May 31 02:31:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD8247CA0 for ; Tue, 31 May 2016 02:31:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8CD7F8F8033 for ; Tue, 31 May 2016 00:31:28 -0700 (PDT) X-ASG-Debug-ID: 1464679882-04bdf05ad7a8be10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id VdHFEGhNBRwiOaFP for ; Tue, 31 May 2016 00:31:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C1FABEPU1XLf0/LHlagzyBU4J1g3meZQaMJYNZgh+EF4RpgSIEAgKBNk0BAQEBAQEHAQEBAQFBQEEMAYN4AQEEJxMcIxAIAxgJGgsPBSUDBxoTiC68BQEBCAIlHoVBhRWHdIIuAQSYN44WjyZFjweCaBwWgUcqMoUthBABAQE Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 17:01:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7e91-0003si-PG; Tue, 31 May 2016 17:31:19 +1000 Date: Tue, 31 May 2016 17:31:19 +1000 From: Dave Chinner To: Stefan Priebe - Profihost AG Cc: Minchan Kim , Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531073119.GD12670@dastard> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531025509.GA12670@dastard> <20160531035904.GA17371@bbox> <20160531060712.GC12670@dastard> <574D2B1E.2040002@profihost.ag> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <574D2B1E.2040002@profihost.ag> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464679882 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 833 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 08:11:42AM +0200, Stefan Priebe - Profihost AG wrote: > > I'm half tempted at this point to mostly ignore this mm/ behavour > > because we are moving down the path of removing buffer heads from > > XFS. That will require us to do different things in ->releasepage > > and so just skipping dirty pages in the XFS code is the best thing > > to do.... > > does this change anything i should test? Or is 4.6 still the way to go? Doesn't matter now - the warning will still be there on 4.6. I think you can simply ignore it as the XFS code appears to be handling the dirty page that is being passed to it correctly. We'll work out what needs to be done to get rid of the warning for this case, wether it be a mm/ change or an XFS change. Cheers, Dave. -- Dave Chinner david@fromorbit.com From s.priebe@profihost.ag Tue May 31 03:03:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA36C7CA0 for ; Tue, 31 May 2016 03:03:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF901304048 for ; Tue, 31 May 2016 01:03:49 -0700 (PDT) X-ASG-Debug-ID: 1464681822-04cb6c2dbaa68a80001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id IkyzFFumIsy3woNO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 01:03:43 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Effective-Source-IP: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 716 invoked from network); 31 May 2016 10:03:41 +0200 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Tue, 31 May 2016 10:03:41 +0200 Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) To: Dave Chinner X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531025509.GA12670@dastard> <20160531035904.GA17371@bbox> <20160531060712.GC12670@dastard> <574D2B1E.2040002@profihost.ag> <20160531073119.GD12670@dastard> Cc: Minchan Kim , Brian Foster , "xfs@oss.sgi.com" , linux-mm@kvack.org, linux-kernel@vger.kernel.org From: Stefan Priebe - Profihost AG Message-ID: <574D455D.8050101@profihost.ag> Date: Tue, 31 May 2016 10:03:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <20160531073119.GD12670@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1464681823 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 999 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 31.05.2016 um 09:31 schrieb Dave Chinner: > On Tue, May 31, 2016 at 08:11:42AM +0200, Stefan Priebe - Profihost AG wrote: >>> I'm half tempted at this point to mostly ignore this mm/ behavour >>> because we are moving down the path of removing buffer heads from >>> XFS. That will require us to do different things in ->releasepage >>> and so just skipping dirty pages in the XFS code is the best thing >>> to do.... >> >> does this change anything i should test? Or is 4.6 still the way to go? > > Doesn't matter now - the warning will still be there on 4.6. I think > you can simply ignore it as the XFS code appears to be handling the > dirty page that is being passed to it correctly. We'll work out what > needs to be done to get rid of the warning for this case, wether it > be a mm/ change or an XFS change. So is it OK to remove the WARN_ONCE in kernel code? So i don't get alarms from our monitoring systems for the trace. Stefan > > Cheers, > > Dave. > From david@fromorbit.com Tue May 31 03:33:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CF6AF7CA0 for ; Tue, 31 May 2016 03:33:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67ACFAC003 for ; Tue, 31 May 2016 01:32:57 -0700 (PDT) X-ASG-Debug-ID: 1464683574-04bdf05ad5a8cfb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UWiWFOHuBMQWkhv3 for ; Tue, 31 May 2016 01:32:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CvFAAhS01XLf0/LHlbgzyBU4J1g3meZAaMJYV4hBeGCwQCAoE3TQEBAQEBAQcBAQEBAUFAQQwBg3cBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIJwe8EgEBAQcCJR6FQYUViiIFmDeOFoFzh3uFOI9MgmUfgV0qMoUthBABAQE Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail07.adl2.internode.on.net with ESMTP; 31 May 2016 18:02:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7f6a-00042h-Bj; Tue, 31 May 2016 18:32:52 +1000 Date: Tue, 31 May 2016 18:32:52 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix broken multi-fsb buffer logging Message-ID: <20160531083252.GR26977@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix broken multi-fsb buffer logging References: <1464204667-10199-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464204667-10199-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464683574 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3686 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, May 25, 2016 at 03:31:07PM -0400, Brian Foster wrote: > Multi-block buffers are logged based on buffer offset in > xfs_trans_log_buf(). xfs_buf_item_log() ultimately walks each mapping in > the buffer and marks the associated range to be logged in the > xfs_buf_log_format bitmap for that mapping. This code is broken, > however, [....] [snip description I've not read, and go look at the code changes] > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 3425799..2e95ad0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -359,7 +359,7 @@ xfs_buf_item_format( > for (i = 0; i < bip->bli_format_count; i++) { > xfs_buf_item_format_segment(bip, lv, &vecp, offset, > &bip->bli_formats[i]); > - offset += bp->b_maps[i].bm_len; > + offset += BBTOB(bp->b_maps[i].bm_len); > } Ok, that means the offset into the multi-fsb buffer is wrong for the second and subsequent chunks, resulting in copying the wrong range into the log vector. Offset should be in bytes, so this is a valid fix all by itself. > > /* > @@ -915,20 +915,28 @@ xfs_buf_item_log( > for (i = 0; i < bip->bli_format_count; i++) { > if (start > last) > break; > - end = start + BBTOB(bp->b_maps[i].bm_len); > + end = start + BBTOB(bp->b_maps[i].bm_len) - 1; Ok, buffer starts at offset 0, last byte in buffer is length - 1. Yup, there's an off-by-one there - end points to the offset of the first byte of the next buffer. This will screw up the range trimming done below. I think this is probably harmless as it doesn't impact the next iteration of the loop, but still good to get it right. > + > + /* skip to the map that includes the first byte to log */ > if (first > end) { > start += BBTOB(bp->b_maps[i].bm_len); > continue; > } > + > + /* > + * Trim the range to this segment and mark it in the bitmap. > + * Note that we must convert buffer offsets to segment relative > + * offsets (e.g., the first byte of each segment is byte 0 of > + * that segment). > + */ > if (first < start) > first = start; > if (end > last) > end = last; > - > - xfs_buf_item_log_segment(first, end, > + xfs_buf_item_log_segment(first - start, end - start, > &bip->bli_formats[i].blf_data_map[0]); Ok so we pass offsets first and end as the range that needs to be logged in the segment, and start is the byte offset of the first byte of data in the current buffer segment. /me looks at xfs_buf_item_log_segment() It sets bits in the format item based on offsets passed in. That means if the start is non-zero (i.e. we're in the second buffer range) we'll set bits in the dirty mask that map to first/end rather than 0/buffer len. /me looks at xfs_buf_item_size, follows blf_map_size to it's initialisation, sees that first/end bits will be beyond blf_map_size for second+ buffer range and so never seen by xfs_buf_item_size(). Hence subtracting start normalises the range being logged to offsets within the buffer range, and so now xfs_buf_item_size (and hence xfs_buf_item_format) will see them correctly as dirty. Yes, that change looks correct. > > - start += bp->b_maps[i].bm_len; > + start += BBTOB(bp->b_maps[i].bm_len); Yup, same as the first hunk in the patch. So from the code perspective the change looks correct. I've looked over all the other users of bp->b_maps[i].bm_len and loops over bli_format_count and I can't see any other obvious problems. I'm going to leave this under test overnight and see if anything pops up... Cheers, Dave. -- Dave Chinner david@fromorbit.com From MAILER-DAEMON Tue May 31 04:39:45 2016 Return-Path: <> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A67EB7CA0 for ; Tue, 31 May 2016 04:39:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7403B304048 for ; Tue, 31 May 2016 02:39:45 -0700 (PDT) X-ASG-Debug-ID: 1464687582-04cbb03569a7de20001-NocioJ Received: from gourmet8.spamgourmet.com (gourmet.spamgourmet.com [216.75.62.102]) by cuda.sgi.com with ESMTP id CWa1FYL2Zh1Y1z77 (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 31 May 2016 02:39:42 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Effective-Source-IP: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Apparent-Source-IP: 216.75.62.102 Received: from spamgourmet by gourmet7.spamgourmet.com with local (Exim 4.80) (envelope-from ) id 1b7g9G-00050m-1N for xfs@oss.sgi.com; Tue, 31 May 2016 09:39:42 +0000 Received: from mail-wm0-f53.google.com ([74.125.82.53]) by gourmet7.spamgourmet.com with esmtps (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1b7g9F-000501-If for ; Tue, 31 May 2016 09:39:41 +0000 Received: by mail-wm0-f53.google.com with SMTP id n129so121642774wmn.1 for <>; Tue, 31 May 2016 02:39:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to; bh=J+QLpCbgvQFLjXzAkThinJe+qiHkp263p4G9Ve7/Wco=; b=twi1/0i9OL64AMyuI43240jQv+RbDsPme8MMAQjX1PWmaFW1va9HVU5Uoj8GMAfL9S 9xZNOOdSlXTndyoGCVVO02mlBKr8oxgkI73A8GmVJYaFUlVkN2hktL6kzhTRz8dfrXMT hctLNFKiG/+9xQZDYzJ5D2LlD1P3DmZ7KHw/ZWUcs+jLmHyCOB6JpqBu9hyAH/K1muc7 FignLUY3/zMKON34PifBffiqvSK2jvd2j+h+voRHsqrXwBTC1Egi6UMLq24a2MmPyhIy 0AhuxYGT60RhdHckvwdcx/DjxqeJQw/BsrLhfHKm2AjTXSOC62U+CgZ3Ilpj+8AhI4Jy BdzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:date:message-id:subject:from :to; bh=J+QLpCbgvQFLjXzAkThinJe+qiHkp263p4G9Ve7/Wco=; b=D4QLp5Kw5qyOuHLOKXbpBwugpJX1nx8Xq/GseEJZ96ww0LxOZ5d9Td3P0iaHtwT51H VeystPC0Dbd/Jzvxylpv0J+Hl/vTbGuKUkkV5n8zjBjY4sGQxl9fFWno8qgxG5yHinH+ 3BaFYYZ6IbeHOZOezdC7jFpYFqrLH/IG4EWmuh3XKRhwIQ1CkHsmUBbu4SRl5VB7uvDn SclfU0Bxfgp18+wg18rLPGUUdhrKs2Nt2wS7fuCxu4yXIM3GpJYiSdbk25tJZlSEMAnw mm9jLICUP1bPUdANqp5E/zEvgnnRF58hjxs1kmQ+aYPVAS5X53xAoMs7RXRZXR1cbjVV Blyg== X-Gm-Message-State: ALyK8tIQxWUuiSADhicPtOlaPegR8cxlfIGq7lzlYd3PHTSAUmfeSuy6B3uTieS+JRzeTwUG6A1Qwjj5sigOOg== MIME-Version: 1.0 X-Received: by 10.28.72.134 with SMTP id v128mr15300802wma.28.1464687579788; Tue, 31 May 2016 02:39:39 -0700 (PDT) Sender: xfs.pkoch@dfgh.net Received: by 10.194.152.71 with HTTP; Tue, 31 May 2016 02:39:39 -0700 (PDT) Date: Tue, 31 May 2016 11:39:39 +0200 X-Google-Sender-Auth: 9bW6sMG-SjhztYWL_QLW40hBhP0 Message-ID: Subject: Re: xfsrestore performance From: xfs.pkoch@dfgh.net X-ASG-Orig-Subj: Re: xfsrestore performance To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a114b31f0e67c4305342026bb X-Barracuda-Connect: gourmet.spamgourmet.com[216.75.62.102] X-Barracuda-Start-Time: 1464687582 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10579 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, DKIM_SIGNED, EMPTY_ENV_FROM, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30048 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e --001a114b31f0e67c4305342026bb Content-Type: text/plain; charset=UTF-8 Dear Dave: Thanks very much for your explanations 2016-05-30 1:20 GMT+02:00 Dave Chinner - david@fromorbit.com < xfs.pkoch.2540fe3cfd.david#fromorbit.com@ob.0sg.net>: > .... > Oh, dear. There's a massive red flag. I'll come back to it... > > > 5: xfsdump the temporary xfs fs to /dev/null. took 20 hours > > Nothing to slow down xfsdump reading from disk. Benchmarks lie. > dump is fast - restore is the slow point because it has to recreate > everything. That's what limits the speed of dump - the pipe has a > bound limit on data in flight, so dump is throttled to restore > speed when you run this. > > And, as I said I'll come back to, restore is slow because: > The filesystem is not exactly as you described. Did you notice that > xfs_restore realises that it has to restore 20 million directories > and *274 million* directory entries? i.e. for those 7 million inodes > containing data, there is roughly 40 hard links pointing to each > inode. There are also 3 directory inodes for every regular file. > This is not a "data mostly" filesystem - it has vastly more metadata > than it has data, even though the data takes up more space. > Our backup-server has 46 versions of our home-directories and 158 versions of our mailserver, so if a file has not been changed for more than a year it will exist once on the backup server together with 45 / 157 hard links. I'm astonished myself. Firstly about the numbers and also about the fact that our backup-strategy does work quite well. Also rsync does a very good job. It was able to copy all these hard links in 6 days from a 16TB ext3 filesystem on a RAID10-volume to a 15TB xfs filesystem on a RAID5-volume. And right now 4 rsync processes are copying the 15TB xfs filesystem back to a 20TB xfs-filesystem. And it seems as if this will finish today (after 3 days only). Very nice. Keep in mind that it took dump the best part of 7 hours just to read > all the inodes and the directory structure to build the dump > inventory. This matches with the final ext3 rsync pass of 10 hours > which should have copied very little data. Creating 270 million > hard links in 20 million directories from scratch takes a long time, > and xfs_restore will be no faster at that than rsync.... > That was my misunderstanding. I was believing/hoping that a tool that was built for a specific filesystem would outperform a generic tool like rsync. I thought xfsdump would write all used filesystem blocks into a data stream and xfsrestore would just read the blocks from stdin and write them back to the destination filesystem. Much like a dd-process that knows about the device-content and can skip unused blocks. > > Seems like 2 days was a little optimistic > > Just a little. :/ > It would have taken approx 1000 hours > Personally, I would have copied the data using rsync to the > temporary XFS filesystem of the same size and shape of the final > destination (via mkfs parameters to ensure stripe unit/width match > final destination) and then used xfs_copy to do a block level copy > of the temporary filesystem back to the final destination. xfs_copy > will run *much* faster than xfsdump/restore.... > Next time I will do it like you suggest with one minor change. Instead of xfs_copy I would use dd, which makes sense if the filesystem is almost filled. Or do you believe that xfs_copy is faster then dd? Or will the xfs_growfs create any problems? I used dd on saturday to copy the 15TB xfs filesystem back into the 20TB raid10 volume and enlarged the filesystem with xfs_growfs. The result was a xfs-filesystem with layout-parameters matching the temporary raid5 volume built from 16 1TB disks with a 256K chunksize. But the new raid10-volume consists of 20 2TB disks using a chunksize of 512K. And growing the filesystem raised the allocation group count from 32 to 45. I reformatted the 20TB volume with a fresh xfs-filesystem and I let mkfs.xfs decide about the layout. Does that give me an optimal layout? I will enlarge the filesystem in the future. This will increase my allocation group count. Is that a problem that I should better have avoided in advance by reducing the agcount? Kind regards and thanks very much for the useful infose Peter Koch -- Peter Koch Passauer Strasse 32, 47249 Duisburg Tel.: 0172 2470263 --001a114b31f0e67c4305342026bb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear Dave:

Thanks very much for your exp= lanations

2016-05-30 1:20 GMT+02:00 Dave Chinner - david@fromorbit.com <xfs.= pkoch.2540fe3cfd.david#fromorbit.com@ob.0sg.net>:
....
Oh, dear. There's a massive red flag. I'll come back to it...

=C2=A0
> 5: xfsdump the temporary xfs fs to /dev/null. took 20 hours

Nothing to slow down xfsdump reading from disk. Benchmarks lie.

dump is fast - restore is the slow point because it has to recreate
everything. That's what limits the speed of dump - the pipe has a
bound limit on data in flight, so dump is throttled to restore
speed when you run this.

And, as I said I'll come back to, restore is slow because:

The filesystem is not exactly as you described.=C2=A0 Did you notice that xfs_restore realises that it has to restore 20 million directories
and *274 million* directory entries? i.e. for those 7 million inodes
containing data, there is roughly 40 hard links pointing to each
inode. There are also 3 directory inodes for every regular file.
This is not a "data mostly" filesystem - it has vastly more metad= ata
than it has data, even though the data takes up more space.

Our backup-server has 46 versions of our home-director= ies and 158
versions of our mailserver, so if a file has not been change= d for more
than a year it will exist once on the backup server together = with
45 / 157 hard links.

I'm astonished myself. F= irstly about the numbers and also about
the fact that our backup-strateg= y does work quite well.

Also rsync does a very good job. = It was able to copy all these hard links
in 6 days from a 16T= B ext3 filesystem on a RAID10-volume to a
15TB xfs filesystem= on a RAID5-volume.

And right now 4 rsync processes are c= opying the 15TB xfs filesystem
back to a 20TB xfs-filesystem. And it see= ms as if this will finish
today (after 3 days only). Very nice.

<= /div>
Keep in mind that it took dump the best part of 7 hours just to read
all the inodes and the directory structure to build the dump
inventory. This matches with the final ext3 rsync pass of 10 hours
which should have copied very little data.=C2=A0 Creating 270 million
hard links in 20 million directories from scratch takes a long time,
and xfs_restore will be no faster at that than rsync....

That was my misunderstanding. I was believing/hoping that= a tool
that was built for a specific filesystem would outper= form a generic
tool like rsync. I thought xfsdump would write= all used filesystem
blocks into a data stream and xfsrestore would just= read the
blocks from stdin and write them back to the destination files= ystem.
Much like a dd-process that knows about the device-content andcan skip unused blocks.
=C2=A0
> Seems like 2 days was a little optimistic

Just a little. :/

It would have taken a= pprox 1000 hours
=C2=A0
Personally, I would have copied the data using rsync to the
temporary XFS filesystem of the same size and shape of the final
destination (via mkfs parameters to ensure stripe unit/width match
final destination) and then used xfs_copy to do a block level copy
of the temporary filesystem back to the final destination. xfs_copy
will run *much* faster than xfsdump/restore....

Next time I will do it like you suggest with one minor change. Ins= tead
of xfs_copy I would use dd, which makes sense if the fil= esystem is
almost filled. Or do you believe that xfs_copy is = faster then dd?
Or will the xfs_growfs create any problems?

I used dd on saturday to copy the 15TB xfs file= system back
into the 20TB raid10 volume and enlarged the file= system with
xfs_growfs. The result was a xfs-filesystem with = layout-parameters
matching the temporary raid5 volume built f= rom 16 1TB disks
with a 256K chunksize. But the new raid10-vo= lume consists of
20 2TB disks using a chunksize of 512K. And = growing the filesystem
raised the allocation group count from= 32 to 45.

I reformatted the 20TB volume with a fresh xfs= -filesystem and I
let mkfs.xfs decide about the layout.
Does that give me an optimal layout? I will enlarge the filesy= stem
in the future. This will increase my allocation group count. Is tha= t
a problem that I should better have avoided in advance by reducing
= the agcount?

Kind regards and thanks very much for the useful infose=

Peter Koch

--
Peter Koch
Passauer Strasse 32, 47249 Duisburg
Tel.: 0172 2470263
--001a114b31f0e67c4305342026bb-- From jack@suse.cz Tue May 31 04:50:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B06C7CA0 for ; Tue, 31 May 2016 04:50:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5C78AC003 for ; Tue, 31 May 2016 02:50:38 -0700 (PDT) X-ASG-Debug-ID: 1464688234-04cb6c2dbaa6ada0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ASSkNPI0rydN6dB8 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 31 May 2016 02:50:35 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A9A3DAAAD; Tue, 31 May 2016 09:50:33 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id D06361E0DF7; Tue, 31 May 2016 11:50:31 +0200 (CEST) Date: Tue, 31 May 2016 11:50:31 +0200 From: Jan Kara To: Minchan Kim Cc: Dave Chinner , linux-mm@kvack.org, Brian Foster , "xfs@oss.sgi.com" , linux-kernel@vger.kernel.org, Stefan Priebe - Profihost AG Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160531095031.GA5912@quack2.suse.cz> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531010724.GA9616@bbox> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1464688234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8304 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue 31-05-16 10:07:24, Minchan Kim wrote: > On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > > [adding lkml and linux-mm to the cc list] > > > > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > > > Hi Dave, > > > Hi Brian, > > > > > > below are the results with a vanilla 4.4.11 kernel. > > > > Thanks for persisting with the testing, Stefan. > > > > .... > > > > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > > > fresh reboot it has happened again on the root FS for a debian apt file: > > > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > > > ------------[ cut here ]------------ > > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > > > xfs_vm_releasepage+0x10f/0x140() > > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > > > Call Trace: > > > [] dump_stack+0x63/0x84 > > > [] warn_slowpath_common+0x97/0xe0 > > > [] warn_slowpath_null+0x1a/0x20 > > > [] xfs_vm_releasepage+0x10f/0x140 > > > [] ? page_mkclean_one+0xd0/0xd0 > > > [] ? anon_vma_prepare+0x150/0x150 > > > [] try_to_release_page+0x32/0x50 > > > [] shrink_active_list+0x3ce/0x3e0 > > > [] shrink_lruvec+0x687/0x7d0 > > > [] shrink_zone+0xdc/0x2c0 > > > [] kswapd+0x4f9/0x970 > > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > > [] kthread+0xc9/0xe0 > > > [] ? kthread_stop+0x100/0x100 > > > [] ret_from_fork+0x3f/0x70 > > > [] ? kthread_stop+0x100/0x100 > > > ---[ end trace c9d679f8ed4d7610 ]--- > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > > > 0x12b990 > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size > > ..... > > > > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 > > code (so please try to reproduce on that kernel!) but it looks to me > > like the only way we can get from shrink_active_list() direct to > > try_to_release_page() is if we are over the maximum bufferhead > > threshold (i.e buffer_heads_over_limit = true) and we are trying to > > reclaim pages direct from the active list. > > > > Because we are called from kswapd()->balance_pgdat(), we have: > > > > struct scan_control sc = { > > .gfp_mask = GFP_KERNEL, > > .order = order, > > .priority = DEF_PRIORITY, > > .may_writepage = !laptop_mode, > > .may_unmap = 1, > > .may_swap = 1, > > }; > > > > The key point here is reclaim is being run with .may_writepage = > > true for default configuration kernels. when we get to > > shrink_active_list(): > > > > if (!sc->may_writepage) > > isolate_mode |= ISOLATE_CLEAN; > > > > But sc->may_writepage = true and this allows isolate_lru_pages() to > > isolate dirty pages from the active list. Normally this isn't a > > problem, because the isolated active list pages are rotated to the > > inactive list, and nothing else happens to them. *Except when > > buffer_heads_over_limit = true*. This special condition would > > explain why I have never seen apt/dpkg cause this problem on any of > > my (many) Debian systems that all use XFS.... > > > > In that case, shrink_active_list() runs: > > > > if (unlikely(buffer_heads_over_limit)) { > > if (page_has_private(page) && trylock_page(page)) { > > if (page_has_private(page)) > > try_to_release_page(page, 0); > > unlock_page(page); > > } > > } > > > > i.e. it locks the page, and if it has buffer heads it trys to get > > the bufferheads freed from the page. > > > > But this is a dirty page, which means it may have delalloc or > > unwritten state on it's buffers, both of which indicate that there > > is dirty data in teh page that hasn't been written. XFS issues a > > warning on this because neither shrink_active_list nor > > try_to_release_page() check for whether the page is dirty or not. > > > > Hence it seems to me that shrink_active_list() is calling > > try_to_release_page() inappropriately, and XFS is just the > > messenger. If you turn laptop mode on, it is likely the problem will > > go away as kswapd will run with .may_writepage = false, but that > > will also cause other behavioural changes relating to writeback and > > memory reclaim. It might be worth trying as a workaround for now. > > > > MM-folk - is this analysis correct? If so, why is > > shrink_active_list() calling try_to_release_page() on dirty pages? > > Is this just an oversight or is there some problem that this is > > trying to work around? It seems trivial to fix to me (add a > > !PageDirty check), but I don't know why the check is there in the > > first place... > > It seems to be latter. > Below commit seems to be related. > [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] > > At that time, even shrink_page_list works like this. > > shrink_page_list > while (!list_empty(page_list)) { > .. > .. > if (PageDirty(page)) { > .. > } > > /* > * If the page has buffers, try to free the buffer mappings > * associated with this page. If we succeed we try to free > * the page as well. > * > * We do this even if the page is PageDirty(). > * try_to_release_page() does not perform I/O, but it is > * possible for a page to have PageDirty set, but it is actually > * clean (all its buffers are clean). This happens if the > * buffers were written out directly, with submit_bh(). ext3 > * will do this, as well as the blockdev mapping. > * try_to_release_page() will discover that cleanness and will > * drop the buffers and mark the page clean - it can be freed. > * .. > */ > if (PagePrivate(page)) { > if (!try_to_release_page(page, sc->gfp_mask)) > goto activate_locked; > if (!mapping && page_count(page) == 1) > goto free_it; > } > .. > } > > I wonder whether it's valid or not with on ext4. Actually, we've already discussed this about an year ago: http://oss.sgi.com/archives/xfs/2015-06/msg00119.html And it was the last drop that made me remove ext3 from the tree. ext4 can also clean dirty buffers while keeping pages dirty but it is limited only to metadata (and data in data=journal mode) so the scope of the problem is much smaller. So just avoiding calling ->releasepage for dirty pages may work fine these days. Also it is possible to change ext4 checkpointing code to completely avoid doing this but I never got to rewriting that code. Probably I should give it higher priority on my todo list... Honza -- Jan Kara SUSE Labs, CR From finrayin@zoho.com Tue May 31 05:26:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 82A787CA0 for ; Tue, 31 May 2016 05:26:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 473CB304048 for ; Tue, 31 May 2016 03:26:42 -0700 (PDT) X-ASG-Debug-ID: 1464690399-04cb6c2db9a6c320001-NocioJ Received: from 282220.com (282220.com [170.130.139.83]) by cuda.sgi.com with ESMTP id 6KFh1r8um4ZWZMiR for ; Tue, 31 May 2016 03:26:40 -0700 (PDT) X-Barracuda-Envelope-From: finrayin@zoho.com X-Barracuda-Effective-Source-IP: 282220.com[170.130.139.83] X-Barracuda-Apparent-Source-IP: 170.130.139.83 To: xfs@oss.sgi.com Subject: Custom Shaped USB drives with your logo Message-ID: X-ASG-Orig-Subj: Custom Shaped USB drives with your logo Date: Tue, 31 May 2016 12:24:54 +0200 From: "Stacy Kingsley" Reply-To: wasinyoyo@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1476 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 282220.com[170.130.139.83] X-Barracuda-Start-Time: 1464690399 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1353 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I wanted to check in with you, did you receive my email from last week? I would like to contact the person that does your buying of branded promotional products for your company? Our company manufactures USB Flash Drives that are custom printed with your logo. They make the perfect marketing tool for your business or organization. We offer low minimum quantities and all memory sizes. Our USB Pricing is at an ALL TIME LOW. Over 150 Stock Models as well as 100 % custom shaped USB drives in the shape of your Logo, product or just about anything else you can imagine! We are always running a promotion, just ask! 1-888-779-8318 We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. * Please reply back and let me know what quantity and memory size you need for a Fast Quote! * Are you a school or nonprofit? Please let us know for even further discounts. Looking for other items with your logo? We can supply anything with your logo°≠T-shirts, hats, hoodies, pens, mugs, magnets, banners, and brochures! Let us send you a quote! We will EARN your business! Thanks! Stacy Kingsley National Sales Rep Logo Branded Flash Drives 1-888-779-8318 Email: piportter@sina.com From damien.gombault@recia.fr Tue May 31 05:55:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64B147CA2 for ; Tue, 31 May 2016 05:55:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23B3830404E for ; Tue, 31 May 2016 03:55:30 -0700 (PDT) X-ASG-Debug-ID: 1464692124-04bdf05ad5a916c0001-NocioJ Received: from mx.recia.fr (mx.recia.fr [95.128.41.47]) by cuda.sgi.com with ESMTP id 5GoE8Sihi506IISX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 03:55:25 -0700 (PDT) X-Barracuda-Envelope-From: damien.gombault@recia.fr X-Barracuda-Effective-Source-IP: mx.recia.fr[95.128.41.47] X-Barracuda-Apparent-Source-IP: 95.128.41.47 Received: from e6530-damien.recia.fr (unknown [37.58.188.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: F12A086p) by mx.recia.fr (Postfix) with ESMTPSA id 4FF6A22630D for ; Tue, 31 May 2016 12:55:22 +0200 (CEST) To: xfs@oss.sgi.com From: Damien Gombault Subject: Cumulative xfsrestore shows many warnings and files/directories are missing after restoration Organization: GIP Recia X-ASG-Orig-Subj: Cumulative xfsrestore shows many warnings and files/directories are missing after restoration Message-ID: <8323ac3a-f9d2-ad31-69e3-1eea5a44dcde@recia.fr> Date: Tue, 31 May 2016 12:55:22 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------A21625E3864E2E4E4F99257C" X-Barracuda-Connect: mx.recia.fr[95.128.41.47] X-Barracuda-Start-Time: 1464692125 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 80599 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30050 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------A21625E3864E2E4E4F99257C Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Hi. I use xfsdump to backup my systems. Recently I had to use xfsrestore to restore a cumulative level 0 + level 1 dumps. The level 0 dump log is : /usr/sbin/xfsdump: using file dump (drive_simple) strategy /usr/sbin/xfsdump: version 3.1.4 (dump format 3.0) /usr/sbin/xfsdump: level 0 dump of owncloud:/ /usr/sbin/xfsdump: dump date: Sat May 7 02:10:04 2016 /usr/sbin/xfsdump: session id: 6ca00754-b885-4d2f-8785-e0399961c765 /usr/sbin/xfsdump: session label: "machine:owncloud partition:/ level:0 date:2016-05-07-02-10" /usr/sbin/xfsdump: ino map phase 1: constructing initial dump list /usr/sbin/xfsdump: ino map phase 2: skipping (no pruning necessary) /usr/sbin/xfsdump: ino map phase 3: skipping (only one dump stream) /usr/sbin/xfsdump: ino map construction complete /usr/sbin/xfsdump: estimated dump size: 216034001408 bytes /usr/sbin/xfsdump: creating dump session media file 0 (media 0, file 0) /usr/sbin/xfsdump: dumping ino map /usr/sbin/xfsdump: dumping directories /usr/sbin/xfsdump: dumping non-directory files /usr/sbin/xfsdump: ending media file /usr/sbin/xfsdump: media file size 215829487392 bytes /usr/sbin/xfsdump: dump size (non-dir files) : 215703283288 bytes /usr/sbin/xfsdump: dump complete: 6199 seconds elapsed /usr/sbin/xfsdump: Dump Summary: /usr/sbin/xfsdump: stream 0 /mnt/backup/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success) /usr/sbin/xfsdump: Dump Status: SUCCESS The level 1 dump log is : /usr/sbin/xfsdump: using file dump (drive_simple) strategy /usr/sbin/xfsdump: version 3.1.4 (dump format 3.0) /usr/sbin/xfsdump: level 1 incremental dump of owncloud:/ based on level 0 dump begun Sat May 7 02:10:04 2016 /usr/sbin/xfsdump: dump date: Sun May 29 02:10:04 2016 /usr/sbin/xfsdump: session id: 8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57 /usr/sbin/xfsdump: session label: "machine:owncloud partition:/ level:1 date:2016-05-29-02-10" /usr/sbin/xfsdump: ino map phase 1: constructing initial dump list /usr/sbin/xfsdump: ino map phase 2: pruning unneeded subtrees /usr/sbin/xfsdump: ino map phase 3: skipping (only one dump stream) /usr/sbin/xfsdump: ino map construction complete /usr/sbin/xfsdump: estimated dump size: 38360233792 bytes /usr/sbin/xfsdump: creating dump session media file 0 (media 0, file 0) /usr/sbin/xfsdump: dumping ino map /usr/sbin/xfsdump: dumping directories /usr/sbin/xfsdump: dumping non-directory files /usr/sbin/xfsdump: ending media file /usr/sbin/xfsdump: media file size 38266860896 bytes /usr/sbin/xfsdump: dump size (non-dir files) : 38240915448 bytes /usr/sbin/xfsdump: dump complete: 10506 seconds elapsed /usr/sbin/xfsdump: Dump Summary: /usr/sbin/xfsdump: stream 0 /mnt/backup/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success) /usr/sbin/xfsdump: Dump Status: SUCCESS The 2 dumps seems OK. I created a new XFS file system. I restored the level 0 dump on it with option -r (cumulative mode). Then I restored the level 1 dump on it with the same options. The level 0 restore is OK : xfsrestore: drive 1: searching media for dump xfsrestore: drive 0: searching media for directory dump xfsrestore: drive 1: examining media file 0 xfsrestore: drive 1: searching media for directory dump xfsrestore: drive 1: inventory session uuid (6ca00754-b885-4d2f-8785-e0399961c765) does not match the media header's session uuid (8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57) xfsrestore: drive 0: reading directories xfsrestore: drive 0: 53796 directories and 370906 entries processed xfsrestore: drive 0: directory post-processing xfsrestore: drive 0: restoring non-directory files xfsrestore: drive 0: NOTE: ino 51480542 gen 1438712790 not referenced: placing in orphanage xfsrestore: drive 0: NOTE: ino 51480551 gen 1438712713 not referenced: placing in orphanage xfsrestore: drive 0: WARNING: unable to rmdir /mnt/restore//orphanage: Le dossier n'est pas vide xfsrestore: restore complete: 2764 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /mnt/backup-owncloud/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success) xfsrestore: stream 1 /mnt/backup-owncloud/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success) xfsrestore: Restore Status: SUCCESS The 2 ino referenced is empty files, I suppose it was some empty PHP session files deleted during dump. The level 1 restore shows many warnings : xfsrestore: drive 0: examining media file 0 xfsrestore: drive 1: searching media for directory dump xfsrestore: drive 1: reading directories xfsrestore: drive 1: 11013 directories and 96122 entries processed xfsrestore: drive 1: directory post-processing xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1677721775.4173752252 to dir var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/08 Sécurité/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1711276202.4274102453 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/02 Mise en oeuvre sOlære: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1694499004.2655526171 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/07 Communication: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename dir orphanage/2365644069.2895542759 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/08 Sécurité/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474338.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474340.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/186255753.103400553 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/01-Documents préparatoires/Questionnaire initial - AMBOISE.pdf: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829056.3301423653 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan.v1462378955: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829025.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx.v1459347620: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902463620.1603825313 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829061.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462362659: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829062.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365509: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829058.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365141: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829063.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462365556: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474342.2817943330 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829055.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462362656: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474343.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.graphml: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829059.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462349557: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902551900.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.graphml: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902551901.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.png: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829057.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png.v1462361172: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829054.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462343392: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/1711326188.435972671 to orphanage/1711276202.4274102453/Portail e-collectivité - Scénario Budget Epci et communes.xlsx.v1457357181: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474346.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan: Aucun fichier ou dossier de ce type xfsrestore: drive 1: restoring non-directory files xfsrestore: drive 0: inventory session uuid (8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57) does not match the media header's session uuid (6ca00754-b885-4d2f-8785-e0399961c765) xfsrestore: drive 1: NOTE: ino 51196832 gen 3433304555 not referenced: placing in orphanage xfsrestore: drive 1: NOTE: ino 51196834 gen 3433298241 not referenced: placing in orphanage xfsrestore: drive 1: NOTE: ino 51196835 gen 3433289569 not referenced: placing in orphanage xfsrestore: drive 1: NOTE: ino 51196836 gen 3433286216 not referenced: placing in orphanage xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111915 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111917 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111918 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111919 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111920 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111921 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111922 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111923 xfsrestore: drive 1: WARNING: attempt to link orphanage/186255753.103400553 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/01-Documents préparatoires/Questionnaire initial - AMBOISE.pdf failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/200018323 - CC Canton de Beaugency/cc-beaugency.ods failed: Aucun fichier ou dossier de ce type: discarding ino 372614784 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464365887 failed: Aucun fichier ou dossier de ce type: discarding ino 393730159 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464366909 failed: Aucun fichier ou dossier de ce type: discarding ino 393730160 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png.v1464366935 failed: Aucun fichier ou dossier de ce type: discarding ino 393730161 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464368341 failed: Aucun fichier ou dossier de ce type: discarding ino 393730162 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369151 failed: Aucun fichier ou dossier de ce type: discarding ino 393730163 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369156 failed: Aucun fichier ou dossier de ce type: discarding ino 393730164 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.graphml.v1464368128 failed: Aucun fichier ou dossier de ce type: discarding ino 393730165 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464367523 failed: Aucun fichier ou dossier de ce type: discarding ino 393730166 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png.v1464367528 failed: Aucun fichier ou dossier de ce type: discarding ino 393730167 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.graphml.v1464366401 failed: Aucun fichier ou dossier de ce type: discarding ino 393730168 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.png.v1464366927 failed: Aucun fichier ou dossier de ce type: discarding ino 393730169 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369336 failed: Aucun fichier ou dossier de ce type: discarding ino 393730170 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369341 failed: Aucun fichier ou dossier de ce type: discarding ino 393730171 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369669 failed: Aucun fichier ou dossier de ce type: discarding ino 393730172 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369673 failed: Aucun fichier ou dossier de ce type: discarding ino 393730173 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/05 Formations/Conventions avec EPN/GIP Recia2016_V1-2.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 822256228 xfsrestore: drive 1: NOTE: ino 1124073740 gen 1863069171 not referenced: placing in orphanage xfsrestore: drive 1: WARNING: unable to bind UNIX domain socket ino 1207963216 tmp/tmux-0/default: Adresse déjà utilisée: discarding xfsrestore: drive 1: WARNING: open of orphanage/1677721775.4173752252/Mots de passe SOLAERE.kdbx failed: Aucun fichier ou dossier de ce type: discarding ino 1677795044 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Guide recia de la e-administration v2.pptx.v1458557329 failed: Aucun fichier ou dossier de ce type: discarding ino 1694498973 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Courrier invitation présentation sOlære à Ste Maure.docx.v1463145748 failed: Aucun fichier ou dossier de ce type: discarding ino 1694498987 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des mails sécurisés.docx.v1463555193 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370123 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Présentation plateforme e-collectivité sOlære v2 du 05.04.16.pptx.v1460125314 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370124 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des flux comptables.docx.v1463490998 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370128 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Présentation plateforme e-collectivité sOlære v2 du 05.04.16.pptx.v1463574154 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370129 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des flux comptables.docx.v1463495871 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370133 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des mails sécurisés.docx.v1463500385 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370134 xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1460723560 failed: Aucun fichier ou dossier de ce type: discarding ino 1711276206 xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1462958081 failed: Aucun fichier ou dossier de ce type: discarding ino 1711276207 xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1463053409 failed: Aucun fichier ou dossier de ce type: discarding ino 1711326183 xfsrestore: drive 1: WARNING: attempt to link orphanage/1711326188.435972671 to orphanage/1711276202.4274102453/Portail e-collectivité - Scénario Budget Epci et communes.xlsx.v1457357181 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106609 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231640 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106751 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231641 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106927 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231643 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107007 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231645 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107074 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231646 xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107149 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231648 xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1462786944 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678230 xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1462979590 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678263 xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1463149246 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678264 xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1463722642 failed: Aucun fichier ou dossier de ce type: discarding ino 2365704464 xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1461930698 failed: Aucun fichier ou dossier de ce type: discarding ino 2365795807 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/45000 - Prefecture de région - SGAR/comptes de demo sur preprod.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2701315169 xfsrestore: drive 1: WARNING: attempt to link orphanage/2902463620.1603825313 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474338.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474340.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474342.2817943330 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474343.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.graphml failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474346.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Proposition Adista Amboise-1.xlsx failed: Aucun fichier ou dossier de ce type: discarding ino 2902474358 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/Convoc blanche.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902474362 xfsrestore: drive 1: WARNING: attempt to link orphanage/2902551900.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.graphml failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2902551901.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.png failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/Ordre du jour commission Aff. Generales, RH et demographie.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902651922 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/conv aff generales RH et dmeographie blanche.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902651923 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/ordre du jour CM 1er Avril 2016.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2902651924 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/LISTE CM 2014.xls failed: Aucun fichier ou dossier de ce type: discarding ino 2902651925 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/05-Déclaration CNIL/MAIRIE D'AMBOISE- déclarations cnil.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2902661038 xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Schema parapheur.odg failed: Aucun fichier ou dossier de ce type: discarding ino 2902843987 xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829025.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx.v1459347620 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829054.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462343392 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829055.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462362656 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829056.3301423653 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan.v1462378955 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829057.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png.v1462361172 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829058.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365141 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829059.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462349557 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829061.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462362659 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829062.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365509 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829063.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462365556 failed: Aucun fichier ou dossier de ce type xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/LISTE CM 2014.xls.v1462951463 failed: Aucun fichier ou dossier de ce type: discarding ino 2952829070 xfsrestore: drive 1: WARNING: unable to rmdir /mnt/restore//orphanage: Le dossier n'est pas vide xfsrestore: restore complete: 610 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /mnt/backup-owncloud/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success) xfsrestore: stream 1 /mnt/backup-owncloud/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success) xfsrestore: Restore Status: SUCCESS The restoration is inconsistent. Some folders are not restored at the right place. And they are a lots of missing files in some directories. Is this a bug in xfsdump/xfsrestore ? Any help would be appreciated. I use CentOS 7.2 and xfsdump-3.1.4-1.el7.x86_64. Regards. -- Damien Gombault --------------A21625E3864E2E4E4F99257C Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit
Hi.

I use xfsdump to backup my systems.
Recently I had to use xfsrestore to restore a cumulative level 0 + level 1 dumps.

The level 0 dump log is :
/usr/sbin/xfsdump: using file dump (drive_simple) strategy
/usr/sbin/xfsdump: version 3.1.4 (dump format 3.0)
/usr/sbin/xfsdump: level 0 dump of owncloud:/
/usr/sbin/xfsdump: dump date: Sat May  7 02:10:04 2016
/usr/sbin/xfsdump: session id: 6ca00754-b885-4d2f-8785-e0399961c765
/usr/sbin/xfsdump: session label: "machine:owncloud partition:/ level:0 date:2016-05-07-02-10"
/usr/sbin/xfsdump: ino map phase 1: constructing initial dump list
/usr/sbin/xfsdump: ino map phase 2: skipping (no pruning necessary)
/usr/sbin/xfsdump: ino map phase 3: skipping (only one dump stream)
/usr/sbin/xfsdump: ino map construction complete
/usr/sbin/xfsdump: estimated dump size: 216034001408 bytes
/usr/sbin/xfsdump: creating dump session media file 0 (media 0, file 0)
/usr/sbin/xfsdump: dumping ino map
/usr/sbin/xfsdump: dumping directories
/usr/sbin/xfsdump: dumping non-directory files
/usr/sbin/xfsdump: ending media file
/usr/sbin/xfsdump: media file size 215829487392 bytes
/usr/sbin/xfsdump: dump size (non-dir files) : 215703283288 bytes
/usr/sbin/xfsdump: dump complete: 6199 seconds elapsed
/usr/sbin/xfsdump: Dump Summary:
/usr/sbin/xfsdump:   stream 0 /mnt/backup/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success)
/usr/sbin/xfsdump: Dump Status: SUCCESS

The level 1 dump log is :
/usr/sbin/xfsdump: using file dump (drive_simple) strategy
/usr/sbin/xfsdump: version 3.1.4 (dump format 3.0)
/usr/sbin/xfsdump: level 1 incremental dump of owncloud:/ based on level 0 dump begun Sat May  7 02:10:04 2016
/usr/sbin/xfsdump: dump date: Sun May 29 02:10:04 2016
/usr/sbin/xfsdump: session id: 8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57
/usr/sbin/xfsdump: session label: "machine:owncloud partition:/ level:1 date:2016-05-29-02-10"
/usr/sbin/xfsdump: ino map phase 1: constructing initial dump list
/usr/sbin/xfsdump: ino map phase 2: pruning unneeded subtrees
/usr/sbin/xfsdump: ino map phase 3: skipping (only one dump stream)
/usr/sbin/xfsdump: ino map construction complete
/usr/sbin/xfsdump: estimated dump size: 38360233792 bytes
/usr/sbin/xfsdump: creating dump session media file 0 (media 0, file 0)
/usr/sbin/xfsdump: dumping ino map
/usr/sbin/xfsdump: dumping directories
/usr/sbin/xfsdump: dumping non-directory files
/usr/sbin/xfsdump: ending media file
/usr/sbin/xfsdump: media file size 38266860896 bytes
/usr/sbin/xfsdump: dump size (non-dir files) : 38240915448 bytes
/usr/sbin/xfsdump: dump complete: 10506 seconds elapsed
/usr/sbin/xfsdump: Dump Summary:
/usr/sbin/xfsdump:   stream 0 /mnt/backup/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success)
/usr/sbin/xfsdump: Dump Status: SUCCESS

The 2 dumps seems OK.

I created a new XFS file system.
I restored the level 0 dump on it with option -r (cumulative mode).
Then I restored the level 1 dump on it with the same options.

The level 0 restore is OK :
xfsrestore: drive 1: searching media for dump
xfsrestore: drive 0: searching media for directory dump
xfsrestore: drive 1: examining media file 0
xfsrestore: drive 1: searching media for directory dump
xfsrestore: drive 1: inventory session uuid (6ca00754-b885-4d2f-8785-e0399961c765) does not match the media header's session uuid (8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57)
xfsrestore: drive 0: reading directories
xfsrestore: drive 0: 53796 directories and 370906 entries processed
xfsrestore: drive 0: directory post-processing
xfsrestore: drive 0: restoring non-directory files
xfsrestore: drive 0: NOTE: ino 51480542 gen 1438712790 not referenced: placing in orphanage
xfsrestore: drive 0: NOTE: ino 51480551 gen 1438712713 not referenced: placing in orphanage
xfsrestore: drive 0: WARNING: unable to rmdir /mnt/restore//orphanage: Le dossier n'est pas vide
xfsrestore: restore complete: 2764 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /mnt/backup-owncloud/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success)
xfsrestore:   stream 1 /mnt/backup-owncloud/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success)
xfsrestore: Restore Status: SUCCESS

The 2 ino referenced is empty files, I suppose it was some empty PHP session files deleted during dump.

The level 1 restore shows many warnings :
xfsrestore: drive 0: examining media file 0
xfsrestore: drive 1: searching media for directory dump
xfsrestore: drive 1: reading directories
xfsrestore: drive 1: 11013 directories and 96122 entries processed
xfsrestore: drive 1: directory post-processing
xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1677721775.4173752252 to dir var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/08 Sécurité/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1711276202.4274102453 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/02 Mise en oeuvre sOlære: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1694499004.2655526171 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/07 Communication: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename dir orphanage/2365644069.2895542759 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/08 Sécurité/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474338.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474340.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/186255753.103400553 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/01-Documents préparatoires/Questionnaire initial - AMBOISE.pdf: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829056.3301423653 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan.v1462378955: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829025.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx.v1459347620: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902463620.1603825313 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829061.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462362659: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829062.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365509: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829058.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365141: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829063.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462365556: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474342.2817943330 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829055.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462362656: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474343.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.graphml: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829059.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462349557: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902551900.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.graphml: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902551901.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.png: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829057.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png.v1462361172: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2952829054.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462343392: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/1711326188.435972671 to orphanage/1711276202.4274102453/Portail e-collectivité - Scénario Budget Epci et communes.xlsx.v1457357181: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474346.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: restoring non-directory files
xfsrestore: drive 0: inventory session uuid (8693d7f5-395a-41c4-bb8c-dbbaa7dc7a57) does not match the media header's session uuid (6ca00754-b885-4d2f-8785-e0399961c765)
xfsrestore: drive 1: NOTE: ino 51196832 gen 3433304555 not referenced: placing in orphanage
xfsrestore: drive 1: NOTE: ino 51196834 gen 3433298241 not referenced: placing in orphanage
xfsrestore: drive 1: NOTE: ino 51196835 gen 3433289569 not referenced: placing in orphanage
xfsrestore: drive 1: NOTE: ino 51196836 gen 3433286216 not referenced: placing in orphanage
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111915
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111917
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111918
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111919
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.graphml failed: Aucun fichier ou dossier de ce type: discarding ino 139111920
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111921
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111922
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png failed: Aucun fichier ou dossier de ce type: discarding ino 139111923
xfsrestore: drive 1: WARNING: attempt to link orphanage/186255753.103400553 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/01-Documents préparatoires/Questionnaire initial - AMBOISE.pdf failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/200018323 - CC Canton de Beaugency/cc-beaugency.ods failed: Aucun fichier ou dossier de ce type: discarding ino 372614784
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464365887 failed: Aucun fichier ou dossier de ce type: discarding ino 393730159
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464366909 failed: Aucun fichier ou dossier de ce type: discarding ino 393730160
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png.v1464366935 failed: Aucun fichier ou dossier de ce type: discarding ino 393730161
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464368341 failed: Aucun fichier ou dossier de ce type: discarding ino 393730162
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369151 failed: Aucun fichier ou dossier de ce type: discarding ino 393730163
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369156 failed: Aucun fichier ou dossier de ce type: discarding ino 393730164
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits - multi avis.graphml.v1464368128 failed: Aucun fichier ou dossier de ce type: discarding ino 393730165
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.graphml.v1464367523 failed: Aucun fichier ou dossier de ce type: discarding ino 393730166
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - multi circuits.png.v1464367528 failed: Aucun fichier ou dossier de ce type: discarding ino 393730167
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.graphml.v1464366401 failed: Aucun fichier ou dossier de ce type: discarding ino 393730168
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit.png.v1464366927 failed: Aucun fichier ou dossier de ce type: discarding ino 393730169
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369336 failed: Aucun fichier ou dossier de ce type: discarding ino 393730170
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369341 failed: Aucun fichier ou dossier de ce type: discarding ino 393730171
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.graphml.v1464369669 failed: Aucun fichier ou dossier de ce type: discarding ino 393730172
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Demandes de subvention - mono circuit - multi avis.png.v1464369673 failed: Aucun fichier ou dossier de ce type: discarding ino 393730173
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/05 Formations/Conventions avec EPN/GIP Recia2016_V1-2.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 822256228
xfsrestore: drive 1: NOTE: ino 1124073740 gen 1863069171 not referenced: placing in orphanage
xfsrestore: drive 1: WARNING: unable to bind UNIX domain socket ino 1207963216 tmp/tmux-0/default: Adresse déjà utilisée: discarding
xfsrestore: drive 1: WARNING: open of orphanage/1677721775.4173752252/Mots de passe SOLAERE.kdbx failed: Aucun fichier ou dossier de ce type: discarding ino 1677795044
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Guide recia de la e-administration v2.pptx.v1458557329 failed: Aucun fichier ou dossier de ce type: discarding ino 1694498973
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Courrier invitation présentation sOlære à Ste Maure.docx.v1463145748 failed: Aucun fichier ou dossier de ce type: discarding ino 1694498987
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des mails sécurisés.docx.v1463555193 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370123
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Présentation plateforme e-collectivité sOlære v2 du 05.04.16.pptx.v1460125314 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370124
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des flux comptables.docx.v1463490998 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370128
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Présentation plateforme e-collectivité sOlære v2 du 05.04.16.pptx.v1463574154 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370129
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des flux comptables.docx.v1463495871 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370133
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Fiche Produit - Télétransmission des mails sécurisés.docx.v1463500385 failed: Aucun fichier ou dossier de ce type: discarding ino 1695370134
xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1460723560 failed: Aucun fichier ou dossier de ce type: discarding ino 1711276206
xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1462958081 failed: Aucun fichier ou dossier de ce type: discarding ino 1711276207
xfsrestore: drive 1: WARNING: open of orphanage/1711276202.4274102453/Suivi des collectivités.ods.v1463053409 failed: Aucun fichier ou dossier de ce type: discarding ino 1711326183
xfsrestore: drive 1: WARNING: attempt to link orphanage/1711326188.435972671 to orphanage/1711276202.4274102453/Portail e-collectivité - Scénario Budget Epci et communes.xlsx.v1457357181 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106609 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231640
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106751 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231641
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464106927 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231643
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107007 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231645
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107074 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231646
xfsrestore: drive 1: WARNING: open of orphanage/1694499004.2655526171/Images/Logo Solaere e-administration-2560x1440.jpg.v1464107149 failed: Aucun fichier ou dossier de ce type: discarding ino 2248231648
xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1462786944 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678230
xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1462979590 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678263
xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1463149246 failed: Aucun fichier ou dossier de ce type: discarding ino 2365678264
xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1463722642 failed: Aucun fichier ou dossier de ce type: discarding ino 2365704464
xfsrestore: drive 1: WARNING: open of orphanage/2365644069.2895542759/Mots de passe SOLAERE.kdbx.v1461930698 failed: Aucun fichier ou dossier de ce type: discarding ino 2365795807
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/45000 - Prefecture de région - SGAR/comptes de demo sur preprod.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2701315169
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902463620.1603825313 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474338.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474340.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474342.2817943330 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474343.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.graphml failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902474346.2817943328 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Proposition Adista Amboise-1.xlsx failed: Aucun fichier ou dossier de ce type: discarding ino 2902474358
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/Convoc blanche.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902474362
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902551900.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.graphml failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2902551901.2044032635 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Initialisation parapheur/Circuits du parapheur.png failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/Ordre du jour commission Aff. Generales, RH et demographie.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902651922
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/conv aff generales RH et dmeographie blanche.doc failed: Aucun fichier ou dossier de ce type: discarding ino 2902651923
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/ordre du jour CM 1er Avril 2016.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2902651924
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/LISTE CM 2014.xls failed: Aucun fichier ou dossier de ce type: discarding ino 2902651925
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/05-Déclaration CNIL/MAIRIE D'AMBOISE- déclarations cnil.pdf failed: Aucun fichier ou dossier de ce type: discarding ino 2902661038
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Schema parapheur.odg failed: Aucun fichier ou dossier de ce type: discarding ino 2902843987
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829025.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Collecte d'informations Amboise.xlsx.v1459347620 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829054.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462343392 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829055.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462362656 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829056.3301423653 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Planification.gan.v1462378955 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829057.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/04-Etude réseau/Schema réseau actualisé.png.v1462361172 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829058.3301423651 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365141 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829059.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462349557 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829061.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462362659 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829062.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.odt.v1462365509 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: attempt to link orphanage/2952829063.3301423650 to var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/02-Compte rendu de réunions/Compte rendu réunion 3 mai 2016.pdf.v1462365556 failed: Aucun fichier ou dossier de ce type
xfsrestore: drive 1: WARNING: open of var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solære/Dossiers des collectivités/37003 - Amboise/03-Initialisation du site/Documents d'initialisation idélibre/LISTE CM 2014.xls.v1462951463 failed: Aucun fichier ou dossier de ce type: discarding ino 2952829070
xfsrestore: drive 1: WARNING: unable to rmdir /mnt/restore//orphanage: Le dossier n'est pas vide
xfsrestore: restore complete: 610 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /mnt/backup-owncloud/xfsdump/owncloud-+-L0-2016-05-07-02-10.dump OK (success)
xfsrestore:   stream 1 /mnt/backup-owncloud/xfsdump/owncloud-+-L1-2016-05-29-02-10.dump OK (success)
xfsrestore: Restore Status: SUCCESS

The restoration is inconsistent.
Some folders are not restored at the right place.
And they are a lots of missing files in some directories.
Is this a bug in xfsdump/xfsrestore ?
Any help would be appreciated.

I use CentOS 7.2 and xfsdump-3.1.4-1.el7.x86_64.

Regards.

--
Damien Gombault
--------------A21625E3864E2E4E4F99257C-- From baotiao@gmail.com Tue May 31 06:00:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A40EB7CA2 for ; Tue, 31 May 2016 06:00:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 61DF28F8033 for ; Tue, 31 May 2016 04:00:25 -0700 (PDT) X-ASG-Debug-ID: 1464692422-04bdf05ad5a91850001-NocioJ Received: from mail-qk0-f178.google.com (mail-qk0-f178.google.com [209.85.220.178]) by cuda.sgi.com with ESMTP id LWhgK496emAMYaSF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 04:00:23 -0700 (PDT) X-Barracuda-Envelope-From: baotiao@gmail.com X-Barracuda-Effective-Source-IP: mail-qk0-f178.google.com[209.85.220.178] X-Barracuda-Apparent-Source-IP: 209.85.220.178 Received: by mail-qk0-f178.google.com with SMTP id c140so7155898qke.2 for ; Tue, 31 May 2016 04:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=YuZFcQNMSDuaxvnsab1QJsFct0htLhekWAXKBAgXCXI=; b=OXkhvh76hLax6as4bxxaB7H66DRL/+8yEmvgFNVBqX52RzTE4PnaM647+aqa3fOZj/ VmCS10u0jaiG75HGH+8G0CAQBqFISmEsjwlf1TlIobSK+qd+ubwK73mir0GPc9o+Oxt7 Vx86hoCQ1Rxe3CN9BS4wZ60FoPiDCHvus+dBKz1DXis1fxP3tBfkIXTV6flWVS07L22h yBxFcxwrsMKxCIzMzdbc/6AUdcEEnwZoJot1J009HrA3FTj6wHQRToHJRaZMqZWFLqaX umUidMekyV2nVvqztToOP7GWwPIQqDIL0PIZqbHfW/Qzn4+9KcgcMWwEmAfPgZcL5LYU Mq+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=YuZFcQNMSDuaxvnsab1QJsFct0htLhekWAXKBAgXCXI=; b=TH5nBtZNltHiQw16eTTaySTzq8JFlsvmxNiW0xPWZVmzSW1DexG0sZpI1nCZxHTUAh 8aNhfxjO7HhLE5d1/fIfITAQ+sRpQnMWdzu/csUjmtGESXvk6oGwWQXW/SpYpKHCWmap 578fVhjdxBmCl6IrCC4A6dP5cZPS+Qre2TSwOoAZaCG1LYxI+Uxt3R9s3q/RF4t0YC5L 5Z5wVFaI9cvIUBccgmwR9nqmIx8h1cFzq6WeT9CWwqBW7/nwUTXjIBmDapjiEsEX4VTm QFoERa4pQTj8IRN4Shwcw9Yk9tiXbgw29RVvGCauD9Pg80vMn0ebvElmoOd5CmuMVBa9 lolQ== X-Gm-Message-State: ALyK8tK+3NMyd+10V4EDD7HGUO6cZUila65+yyZKdPTG6MmbEbqEC/jhjW062niXD5WaYHruR84uhgAAupOyLQ== MIME-Version: 1.0 X-Received: by 10.237.44.162 with SMTP id g31mr29619254qtd.67.1464692422107; Tue, 31 May 2016 04:00:22 -0700 (PDT) Received: by 10.55.21.156 with HTTP; Tue, 31 May 2016 04:00:22 -0700 (PDT) In-Reply-To: <20160531031010.GB12670@dastard> References: <20160530050452.GM26977@dastard> <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> <20160531031010.GB12670@dastard> Date: Tue, 31 May 2016 19:00:22 +0800 Message-ID: Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc From: =?UTF-8?B?6ZmI5a6X5b+X?= X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=94eb2c1249c686895a05342147cc X-Barracuda-Connect: mail-qk0-f178.google.com[209.85.220.178] X-Barracuda-Start-Time: 1464692422 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2747 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30050 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 HTML_MESSAGE BODY: HTML included in message --94eb2c1249c686895a05342147cc Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable can we change the existing file's extent size? On Tue, May 31, 2016 at 11:10 AM, Dave Chinner wrote: > On Tue, May 31, 2016 at 10:43:36AM +0800, =E9=99=88=E5=AE=97=E5=BF=97 wro= te: > > I have fint the way to change the extent size hint > > mkfs.xfs -r extsize=3D40960 /dev/sda1 > > Ah, no, that isn't the extsize I'm refering to. That's for realtime > device configuration at mkfs, not a per-inode extent size hint. > > When you create the image file do this: > > $ xfs_io -f -c "extsize 1m" /path/to/new/vm_image > $ qemu-image create -f qcow2 /path/to/new/vm_image 10g > $ xfs_io -c extsize /path/to/new/vm_image > [1048576] /path/to/new/vm_image > $ > > And now the qcow2 image file will have extents allocated in > multiples of 1MB. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --=20 --- Blog: http://www.chenzongzhi.info Twitter: https://twitter.com/baotiao Git: https://github.com/baotiao --94eb2c1249c686895a05342147cc Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
can we change the existing file's extent size?

=

On Tue, May= 31, 2016 at 11:10 AM, Dave Chinner <david@fromorbit.com> = wrote:
On Tue, May 31, 2= 016 at 10:43:36AM +0800, =E9=99=88=E5=AE=97=E5=BF=97 wrote:
> I have fint the way to change the extent size hint
> mkfs.xfs -r extsize=3D40960 /dev/sda1

Ah, no, that isn't the extsize I'm refering to. That's f= or realtime
device configuration at mkfs, not a per-inode extent size hint.

When you create the image file do this:

$ xfs_io -f -c "extsize 1m" /path/to/new/vm_image
$ qemu-image create -f qcow2 /path/to/new/vm_image 10g
$ xfs_io -c extsize /path/to/new/vm_image
[1048576] /path/to/new/vm_image
$

And now the qcow2 image file will have extents allocated in
multiples of 1MB.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com



--
--94eb2c1249c686895a05342147cc-- From agruenba@redhat.com Tue May 31 06:51:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BB4C7CA2 for ; Tue, 31 May 2016 06:51:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD3E5AC003 for ; Tue, 31 May 2016 04:51:05 -0700 (PDT) X-ASG-Debug-ID: 1464695464-04bdf05ad5a952f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WF8QOOErteMkSuUo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:04 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 867E6709C2; Tue, 31 May 2016 11:51:03 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZg031703; Tue, 31 May 2016 07:50:56 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 00/22] Richacls (Core and Ext4) Date: Tue, 31 May 2016 13:50:32 +0200 X-ASG-Orig-Subj: [PATCH v22 00/22] Richacls (Core and Ext4) Message-Id: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 31 May 2016 11:51:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695464 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5035 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Here is another update of the richacl patches. Changes since the last posting (https://lwn.net/Articles/686799/): * Rebase on top of 4.7-rc1 because of the getxattr/setxattr inode operation changes in mainline. [* xfs: Treat RichACLs like POSIX ACLs: allow setting arbitrary values as root via "trusted.richacl" even though that may introduce inconsistencies. Drop patch "xfs: Fix richacl access by ioctl" which made the attr ioctls behave the same way as the xattr syscalls.] [* nfs: Fix an uninitialized pointer dereference (nfsi->richacl) accidentally introduced in the last snapshot.] The complete patch queue is available here: git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ richacl-2016-05-31 The richacl user-space utilitites, man pages, and test suite are available here: https://github.com/andreas-gruenbacher/richacl Changes to other user-space packages for richacl: https://github.com/andreas-gruenbacher/coreutils https://github.com/andreas-gruenbacher/e2fsprogs https://github.com/andreas-gruenbacher/samba https://github.com/andreas-gruenbacher/xfsprogs-dev https://github.com/andreas-gruenbacher/nfs-utils Please see the richacl homepage for more information: http://www.bestbits.at/richacl/ What more needs to be done to get this initial set of patches merged? Thanks, Andreas Andreas Gruenbacher (20): vfs: Add IS_ACL() and IS_RICHACL() tests vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags vfs: Make the inode passed to inode_change_ok non-const vfs: Add permission flags for setting file attributes richacl: In-memory representation and helper functions richacl: Permission mapping functions richacl: Compute maximum file masks from an acl richacl: Permission check algorithm posix_acl: Improve xattr fixup code vfs: Cache base_acl objects in inodes vfs: Add get_richacl and set_richacl inode operations vfs: Cache richacl in struct inode richacl: Update the file masks in chmod() richacl: Check if an acl is equivalent to a file mode richacl: Create-time inheritance richacl: Automatic Inheritance richacl: xattr mapping functions richacl: Add richacl xattr handler vfs: Add richacl permission checking Aneesh Kumar K.V (2): ext4: Add richacl support ext4: Add richacl feature flag drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/acl.c | 8 +- fs/Kconfig | 3 + fs/Makefile | 1 + fs/attr.c | 81 ++- fs/ext4/Kconfig | 11 + fs/ext4/Makefile | 1 + fs/ext4/ext4.h | 6 +- fs/ext4/file.c | 3 + fs/ext4/ialloc.c | 11 +- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 + fs/ext4/richacl.c | 134 ++++ fs/ext4/richacl.h | 40 ++ fs/ext4/super.c | 49 +- fs/ext4/xattr.c | 7 + fs/f2fs/acl.c | 4 +- fs/inode.c | 43 +- fs/jffs2/acl.c | 6 +- fs/namei.c | 152 ++-- fs/nfs/nfs3acl.c | 14 +- fs/posix_acl.c | 69 +- fs/richacl.c | 893 ++++++++++++++++++++++++ fs/richacl_xattr.c | 234 +++++++ fs/xattr.c | 29 +- include/linux/acl.h | 15 + include/linux/fs.h | 67 +- include/linux/posix_acl.h | 21 +- include/linux/richacl.h | 210 ++++++ include/linux/richacl_xattr.h | 31 + include/uapi/linux/Kbuild | 2 + include/uapi/linux/fs.h | 3 +- include/uapi/linux/richacl.h | 152 ++++ include/uapi/linux/richacl_xattr.h | 44 ++ include/uapi/linux/xattr.h | 2 + 35 files changed, 2198 insertions(+), 160 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 fs/richacl.c create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/acl.h create mode 100644 include/linux/richacl.h create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl.h create mode 100644 include/uapi/linux/richacl_xattr.h -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 96C2A7CA7 for ; Tue, 31 May 2016 06:51:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5362230404E for ; Tue, 31 May 2016 04:51:13 -0700 (PDT) X-ASG-Debug-ID: 1464695470-04bdf05ad6a95310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xzqPRbNkNr9fl8VB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:10 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 53B1D3B702; Tue, 31 May 2016 11:51:10 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZh031703; Tue, 31 May 2016 07:51:04 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 01/22] vfs: Add IS_ACL() and IS_RICHACL() tests Date: Tue, 31 May 2016 13:50:33 +0200 X-ASG-Orig-Subj: [PATCH v22 01/22] vfs: Add IS_ACL() and IS_RICHACL() tests Message-Id: <1464695454-18557-2-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 31 May 2016 11:51:10 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4048 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The vfs does not apply the umask for file systems that support acls. The test used for this used to be called IS_POSIXACL(). Switch to a new IS_ACL() test to check for either posix acls or richacls instead. Add a new MS_RICHACL flag and IS_RICHACL() test for richacls alone. The IS_POSIXACL() test is still needed in some places like nfsd. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French --- fs/Kconfig | 3 +++ fs/namei.c | 6 +++--- include/linux/fs.h | 12 ++++++++++++ include/uapi/linux/fs.h | 3 ++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index b8fcb41..de6de55 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -64,6 +64,9 @@ endif # BLOCK config FS_POSIX_ACL def_bool n +config FS_RICHACL + def_bool n + config EXPORTFS tristate diff --git a/fs/namei.c b/fs/namei.c index 4c4f95a..113e3f2 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3076,7 +3076,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, * O_EXCL open we want to return EEXIST not EROFS). */ if (open_flag & O_CREAT) { - if (!IS_POSIXACL(dir->d_inode)) + if (!IS_ACL(dir->d_inode)) mode &= ~current_umask(); if (unlikely(!got_write)) { create_error = -EROFS; @@ -3705,7 +3705,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mknod(&path, dentry, mode, dev); if (error) @@ -3776,7 +3776,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) diff --git a/include/linux/fs.h b/include/linux/fs.h index dd28814..4ad130c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1850,6 +1850,12 @@ struct super_operations { #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL) +#ifdef CONFIG_FS_RICHACL +#define IS_RICHACL(inode) __IS_FLG(inode, MS_RICHACL) +#else +#define IS_RICHACL(inode) 0 +#endif + #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) @@ -1863,6 +1869,12 @@ struct super_operations { (inode)->i_rdev == WHITEOUT_DEV) /* + * IS_ACL() tells the VFS to not apply the umask + * and use check_acl for acl permission checks when defined. + */ +#define IS_ACL(inode) __IS_FLG(inode, MS_POSIXACL | MS_RICHACL) + +/* * Inode state bits. Protected by inode->i_lock * * Three bits determine the dirty state of the inode, I_DIRTY_SYNC, diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3b00f7c..f9c41ef 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -120,7 +120,7 @@ struct inodes_stat_t { #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. MS_VERBOSE is deprecated. */ #define MS_SILENT 32768 -#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ +#define MS_POSIXACL (1<<16) /* Supports POSIX ACLs */ #define MS_UNBINDABLE (1<<17) /* change to unbindable */ #define MS_PRIVATE (1<<18) /* change to private */ #define MS_SLAVE (1<<19) /* change to slave */ @@ -130,6 +130,7 @@ struct inodes_stat_t { #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ #define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ +#define MS_RICHACL (1<<26) /* Supports richacls */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 10D357CA2 for ; Tue, 31 May 2016 06:51:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E6A2AC003 for ; Tue, 31 May 2016 04:51:21 -0700 (PDT) X-ASG-Debug-ID: 1464695477-04cbb0356ba84580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ThV69fDYMvBKITyM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:17 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 16B78C04B307; Tue, 31 May 2016 11:51:17 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZi031703; Tue, 31 May 2016 07:51:10 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Date: Tue, 31 May 2016 13:50:34 +0200 X-ASG-Orig-Subj: [PATCH v22 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Message-Id: <1464695454-18557-3-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 31 May 2016 11:51:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695477 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7068 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls distinguish between creating non-directories and directories. To support that, add an isdir parameter to may_create(). When checking inode_permission() for create permission, pass in an additional MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. Add may_replace() to allow checking for delete and create access when replacing an existing file in vfs_rename(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French --- fs/namei.c | 49 +++++++++++++++++++++++++++++++++---------------- include/linux/fs.h | 2 ++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 113e3f2..fbbeaf6 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -454,7 +454,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or + * MAY_CREATE_DIR are set. That way, file systems that don't support these + * permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2728,7 +2730,8 @@ EXPORT_SYMBOL(__check_sticky); * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete_or_replace(struct inode *dir, struct dentry *victim, + bool isdir, int mask) { struct inode *inode = d_backing_inode(victim); int error; @@ -2740,7 +2743,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission(dir, mask); if (error) return error; if (IS_APPEND(dir)) @@ -2763,6 +2766,18 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) return 0; } +static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +{ + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); +} + +static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) +{ + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE | MAY_EXEC); +} + /* Check whether we can create an object with dentry child in directory * dir. * 1. We can't do it if child already exists (open has special treatment for @@ -2771,14 +2786,16 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct inode *dir, struct dentry *child, bool isdir) { + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); } /* @@ -2828,7 +2845,7 @@ EXPORT_SYMBOL(unlock_rename); int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3646,7 +3663,7 @@ EXPORT_SYMBOL(user_path_create); int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3740,7 +3757,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, true); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3796,7 +3813,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode) int vfs_rmdir(struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(dir, dentry, true); if (error) return error; @@ -3918,7 +3935,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(dir, dentry, false); if (error) return error; @@ -4052,7 +4069,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -4135,7 +4152,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(dir, new_dentry, false); if (error) return error; @@ -4332,14 +4349,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(new_dir, new_dentry, is_dir); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_replace(new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_replace(new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4602,7 +4619,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; diff --git a/include/linux/fs.h b/include/linux/fs.h index 4ad130c..dd614ad 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -84,6 +84,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_CHDIR 0x00000040 /* called from RCU mode, don't block */ #define MAY_NOT_BLOCK 0x00000080 +#define MAY_CREATE_FILE 0x00000100 +#define MAY_CREATE_DIR 0x00000200 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67AE27CB3 for ; Tue, 31 May 2016 06:51:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CEF63AC003 for ; Tue, 31 May 2016 04:51:25 -0700 (PDT) X-ASG-Debug-ID: 1464695484-04cb6c2dbca70bf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pH2BLPVXDq63cp4t (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:24 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F2B071091; Tue, 31 May 2016 11:51:24 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZj031703; Tue, 31 May 2016 07:51:17 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 03/22] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Date: Tue, 31 May 2016 13:50:35 +0200 X-ASG-Orig-Subj: [PATCH v22 03/22] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Message-Id: <1464695454-18557-4-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 31 May 2016 11:51:24 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695484 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3400 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Normally, deleting a file requires MAY_WRITE access to the parent directory. With richacls, a file may be deleted with MAY_DELETE_CHILD access to the parent directory or with MAY_DELETE_SELF access to the file. To support that, pass the MAY_DELETE_CHILD mask flag to inode_permission() when checking for delete access inside a directory, and MAY_DELETE_SELF when checking for delete access to a file itelf. The MAY_DELETE_SELF permission overrides the sticky directory check. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Steve French --- fs/namei.c | 20 ++++++++++++-------- include/linux/fs.h | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index fbbeaf6..8e175e1 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -454,9 +454,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or - * MAY_CREATE_DIR are set. That way, file systems that don't support these - * permissions will check for MAY_WRITE instead. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, + * MAY_CREATE_DIR, or MAY_DELETE_CHILD are set. That way, file systems that + * don't support these permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2743,14 +2743,18 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, mask); + error = inode_permission(dir, mask | MAY_WRITE | MAY_DELETE_CHILD); + if (!error && check_sticky(dir, inode)) + error = -EPERM; + if (error && IS_RICHACL(inode) && + inode_permission(inode, MAY_DELETE_SELF) == 0 && + inode_permission(dir, mask) == 0) + error = 0; if (error) return error; if (IS_APPEND(dir)) return -EPERM; - - if (check_sticky(dir, inode) || IS_APPEND(inode) || - IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) + if (IS_APPEND(inode) || IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) return -EPERM; if (isdir) { if (!d_is_dir(victim)) @@ -2768,7 +2772,7 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) { - return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); + return may_delete_or_replace(dir, victim, isdir, MAY_EXEC); } static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) diff --git a/include/linux/fs.h b/include/linux/fs.h index dd614ad..86bfa10 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -86,6 +86,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_NOT_BLOCK 0x00000080 #define MAY_CREATE_FILE 0x00000100 #define MAY_CREATE_DIR 0x00000200 +#define MAY_DELETE_CHILD 0x00000400 +#define MAY_DELETE_SELF 0x00000800 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D4A07CB7 for ; Tue, 31 May 2016 06:51:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88084AC003 for ; Tue, 31 May 2016 04:51:32 -0700 (PDT) X-ASG-Debug-ID: 1464695491-04cb6c2dbca70c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id G7jQ3MMmgxyBT7AK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:31 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BFCFF3D7; Tue, 31 May 2016 11:51:30 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZk031703; Tue, 31 May 2016 07:51:24 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 04/22] vfs: Make the inode passed to inode_change_ok non-const Date: Tue, 31 May 2016 13:50:36 +0200 X-ASG-Orig-Subj: [PATCH v22 04/22] vfs: Make the inode passed to inode_change_ok non-const Message-Id: <1464695454-18557-5-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 31 May 2016 11:51:30 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695491 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1455 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We will need to call iop->permission and iop->get_acl from inode_change_ok() for additional permission checks, and both take a non-const inode. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French --- fs/attr.c | 2 +- include/linux/fs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 25b24d0..7ca7fa0 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -28,7 +28,7 @@ * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int inode_change_ok(struct inode *inode, struct iattr *attr) { unsigned int ia_valid = attr->ia_valid; diff --git a/include/linux/fs.h b/include/linux/fs.h index 86bfa10..208f73b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2993,7 +2993,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int inode_change_ok(struct inode *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3D4E7CBB for ; Tue, 31 May 2016 06:51:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96CFC8F8033 for ; Tue, 31 May 2016 04:51:39 -0700 (PDT) X-ASG-Debug-ID: 1464695497-04cbb0356aa84630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DpBjyKwIgb04XsrQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:38 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7C2F380E7F; Tue, 31 May 2016 11:51:37 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZl031703; Tue, 31 May 2016 07:51:31 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 05/22] vfs: Add permission flags for setting file attributes Date: Tue, 31 May 2016 13:50:37 +0200 X-ASG-Orig-Subj: [PATCH v22 05/22] vfs: Add permission flags for setting file attributes Message-Id: <1464695454-18557-6-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 31 May 2016 11:51:37 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695498 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4621 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls support permissions that allow to take ownership of a file, change the file permissions, and set the file timestamps. Support that by introducing new permission mask flags and by checking for those mask flags in inode_change_ok(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Steve French --- fs/attr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++--------- include/linux/fs.h | 3 +++ 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 7ca7fa0..2a8c49c 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,6 +17,65 @@ #include /** + * inode_extended_permission - permissions beyond read/write/execute + * + * Check for permissions that only richacls can currently grant. + */ +static int inode_extended_permission(struct inode *inode, int mask) +{ + if (!IS_RICHACL(inode)) + return -EPERM; + return inode_permission(inode, mask); +} + +static bool inode_uid_change_ok(struct inode *inode, kuid_t ia_uid) +{ + if (uid_eq(current_fsuid(), inode->i_uid) && + uid_eq(ia_uid, inode->i_uid)) + return true; + if (uid_eq(current_fsuid(), ia_uid) && + inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +static bool inode_gid_change_ok(struct inode *inode, kgid_t ia_gid) +{ + int in_group = in_group_p(ia_gid); + if (uid_eq(current_fsuid(), inode->i_uid) && + (in_group || gid_eq(ia_gid, inode->i_gid))) + return true; + if (in_group && inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +/** + * inode_owner_permitted_or_capable + * + * Check for permissions implicitly granted to the owner, like MAY_CHMOD or + * MAY_SET_TIMES. Equivalent to inode_owner_or_capable for file systems + * without support for those permissions. + */ +static bool inode_owner_permitted_or_capable(struct inode *inode, int mask) +{ + struct user_namespace *ns; + + if (uid_eq(current_fsuid(), inode->i_uid)) + return true; + if (inode_extended_permission(inode, mask) == 0) + return true; + ns = current_user_ns(); + if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid)) + return true; + return false; +} + +/** * inode_change_ok - check if attribute changes to an inode are allowed * @inode: inode to check * @attr: attributes to change @@ -47,22 +106,18 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) return 0; /* Make sure a caller can chown. */ - if ((ia_valid & ATTR_UID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - !uid_eq(attr->ia_uid, inode->i_uid)) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_UID) + if (!inode_uid_change_ok(inode, attr->ia_uid)) + return -EPERM; /* Make sure caller can chgrp. */ - if ((ia_valid & ATTR_GID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_GID) + if (!inode_gid_change_ok(inode, attr->ia_gid)) + return -EPERM; /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_CHMOD)) return -EPERM; /* Also check the setgid bit! */ if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : @@ -73,7 +128,7 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_SET_TIMES)) return -EPERM; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 208f73b..bb36561 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -88,6 +88,9 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_CREATE_DIR 0x00000200 #define MAY_DELETE_CHILD 0x00000400 #define MAY_DELETE_SELF 0x00000800 +#define MAY_TAKE_OWNERSHIP 0x00001000 +#define MAY_CHMOD 0x00002000 +#define MAY_SET_TIMES 0x00004000 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BEC637CB6 for ; Tue, 31 May 2016 06:51:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47EDCAC003 for ; Tue, 31 May 2016 04:51:47 -0700 (PDT) X-ASG-Debug-ID: 1464695504-04cb6c2dbca70c60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QPnsS11n45YS6cmY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:45 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 483E385367; Tue, 31 May 2016 11:51:44 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZm031703; Tue, 31 May 2016 07:51:38 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 06/22] richacl: In-memory representation and helper functions Date: Tue, 31 May 2016 13:50:38 +0200 X-ASG-Orig-Subj: [PATCH v22 06/22] richacl: In-memory representation and helper functions Message-Id: <1464695454-18557-7-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 31 May 2016 11:51:44 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695504 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12573 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl consists of an NFSv4 acl and an owner, group, and other mask. These three masks correspond to the owner, group, and other file permission bits, but they contain NFSv4 permissions instead of POSIX permissions. Each entry in the NFSv4 acl applies to the file owner (OWNER@), the owning group (GROUP@), everyone (EVERYONE@), or to a specific uid or gid. As in the standard POSIX file permission model, each process is the owner, group, or other file class. A richacl grants a requested access only if the NFSv4 acl in the richacl grants the access (according to the NFSv4 permission check algorithm), and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/Makefile | 1 + fs/richacl.c | 65 ++++++++++++++++ include/linux/richacl.h | 179 +++++++++++++++++++++++++++++++++++++++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl.h | 99 ++++++++++++++++++++++++ 5 files changed, 345 insertions(+) create mode 100644 fs/richacl.c create mode 100644 include/linux/richacl.h create mode 100644 include/uapi/linux/richacl.h diff --git a/fs/Makefile b/fs/Makefile index 85b6e13..2b3e6f1 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o +obj-$(CONFIG_FS_RICHACL) += richacl.o obj-y += quota/ diff --git a/fs/richacl.c b/fs/richacl.c new file mode 100644 index 0000000..bcc6591 --- /dev/null +++ b/fs/richacl.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_alloc - allocate a richacl + * @count: number of entries + */ +struct richacl * +richacl_alloc(int count, gfp_t gfp) +{ + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *acl = kzalloc(size, gfp); + + if (acl) { + atomic_set(&acl->a_refcount, 1); + acl->a_count = count; + } + return acl; +} +EXPORT_SYMBOL_GPL(richacl_alloc); + +/** + * richacl_clone - create a copy of a richacl + */ +struct richacl * +richacl_clone(const struct richacl *acl, gfp_t gfp) +{ + int count = acl->a_count; + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *dup = kmalloc(size, gfp); + + if (dup) { + memcpy(dup, acl, size); + atomic_set(&dup->a_refcount, 1); + } + return dup; +} + +/** + * richace_copy - copy an acl entry + */ +void +richace_copy(struct richace *to, const struct richace *from) +{ + memcpy(to, from, sizeof(struct richace)); +} diff --git a/include/linux/richacl.h b/include/linux/richacl.h new file mode 100644 index 0000000..edb8480 --- /dev/null +++ b/include/linux/richacl.h @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_H +#define __RICHACL_H + +#include + +struct richace { + unsigned short e_type; + unsigned short e_flags; + unsigned int e_mask; + union { + kuid_t uid; + kgid_t gid; + unsigned int special; + } e_id; +}; + +struct richacl { + atomic_t a_refcount; + unsigned int a_owner_mask; + unsigned int a_group_mask; + unsigned int a_other_mask; + unsigned short a_count; + unsigned short a_flags; + struct richace a_entries[0]; +}; + +#define richacl_for_each_entry(_ace, _acl) \ + for (_ace = (_acl)->a_entries; \ + _ace != (_acl)->a_entries + (_acl)->a_count; \ + _ace++) + +#define richacl_for_each_entry_reverse(_ace, _acl) \ + for (_ace = (_acl)->a_entries + (_acl)->a_count - 1; \ + _ace != (_acl)->a_entries - 1; \ + _ace--) + +/** + * richacl_get - grab another reference to a richacl handle + */ +static inline struct richacl * +richacl_get(struct richacl *acl) +{ + if (acl) + atomic_inc(&acl->a_refcount); + return acl; +} + +/** + * richacl_put - free a richacl handle + */ +static inline void +richacl_put(struct richacl *acl) +{ + if (acl && atomic_dec_and_test(&acl->a_refcount)) + kfree(acl); +} + +/** + * richace_is_owner - check if @ace is an OWNER@ entry + */ +static inline bool +richace_is_owner(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_OWNER_SPECIAL_ID; +} + +/** + * richace_is_group - check if @ace is a GROUP@ entry + */ +static inline bool +richace_is_group(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_GROUP_SPECIAL_ID; +} + +/** + * richace_is_everyone - check if @ace is an EVERYONE@ entry + */ +static inline bool +richace_is_everyone(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_EVERYONE_SPECIAL_ID; +} + +/** + * richace_is_unix_user - check if @ace applies to a specific user + */ +static inline bool +richace_is_unix_user(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + !(ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_unix_group - check if @ace applies to a specific group + */ +static inline bool +richace_is_unix_group(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + (ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_inherit_only - check if @ace is for inheritance only + * + * ACEs with the %RICHACE_INHERIT_ONLY_ACE flag set have no effect during + * permission checking. + */ +static inline bool +richace_is_inherit_only(const struct richace *ace) +{ + return ace->e_flags & RICHACE_INHERIT_ONLY_ACE; +} + +/** + * richace_is_inheritable - check if @ace is inheritable + */ +static inline bool +richace_is_inheritable(const struct richace *ace) +{ + return ace->e_flags & (RICHACE_FILE_INHERIT_ACE | + RICHACE_DIRECTORY_INHERIT_ACE); +} + +/** + * richace_is_allow - check if @ace is an %ALLOW type entry + */ +static inline bool +richace_is_allow(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_ALLOWED_ACE_TYPE; +} + +/** + * richace_is_deny - check if @ace is a %DENY type entry + */ +static inline bool +richace_is_deny(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_DENIED_ACE_TYPE; +} + +/** + * richace_is_same_identifier - are both identifiers the same? + */ +static inline bool +richace_is_same_identifier(const struct richace *a, const struct richace *b) +{ + return !((a->e_flags ^ b->e_flags) & + (RICHACE_SPECIAL_WHO | RICHACE_IDENTIFIER_GROUP)) && + !memcmp(&a->e_id, &b->e_id, sizeof(a->e_id)); +} + +extern struct richacl *richacl_alloc(int, gfp_t); +extern struct richacl *richacl_clone(const struct richacl *, gfp_t); +extern void richace_copy(struct richace *, const struct richace *); + +#endif /* __RICHACL_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 8bdae34..abeaa98 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -355,6 +355,7 @@ header-y += reboot.h header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h +header-y += richacl.h header-y += rfkill.h header-y += rio_mport_cdev.h header-y += romfs_fs.h diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h new file mode 100644 index 0000000..08856f8 --- /dev/null +++ b/include/uapi/linux/richacl.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_H +#define __UAPI_RICHACL_H + +/* a_flags values */ +#define RICHACL_WRITE_THROUGH 0x40 +#define RICHACL_MASKED 0x80 + +/* e_type values */ +#define RICHACE_ACCESS_ALLOWED_ACE_TYPE 0x0000 +#define RICHACE_ACCESS_DENIED_ACE_TYPE 0x0001 + +/* e_flags bitflags */ +#define RICHACE_FILE_INHERIT_ACE 0x0001 +#define RICHACE_DIRECTORY_INHERIT_ACE 0x0002 +#define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 +#define RICHACE_INHERIT_ONLY_ACE 0x0008 +#define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_SPECIAL_WHO 0x4000 + +/* e_mask bitflags */ +#define RICHACE_READ_DATA 0x00000001 +#define RICHACE_LIST_DIRECTORY 0x00000001 +#define RICHACE_WRITE_DATA 0x00000002 +#define RICHACE_ADD_FILE 0x00000002 +#define RICHACE_APPEND_DATA 0x00000004 +#define RICHACE_ADD_SUBDIRECTORY 0x00000004 +#define RICHACE_READ_NAMED_ATTRS 0x00000008 +#define RICHACE_WRITE_NAMED_ATTRS 0x00000010 +#define RICHACE_EXECUTE 0x00000020 +#define RICHACE_DELETE_CHILD 0x00000040 +#define RICHACE_READ_ATTRIBUTES 0x00000080 +#define RICHACE_WRITE_ATTRIBUTES 0x00000100 +#define RICHACE_WRITE_RETENTION 0x00000200 +#define RICHACE_WRITE_RETENTION_HOLD 0x00000400 +#define RICHACE_DELETE 0x00010000 +#define RICHACE_READ_ACL 0x00020000 +#define RICHACE_WRITE_ACL 0x00040000 +#define RICHACE_WRITE_OWNER 0x00080000 +#define RICHACE_SYNCHRONIZE 0x00100000 + +/* e_id values */ +#define RICHACE_OWNER_SPECIAL_ID 0 +#define RICHACE_GROUP_SPECIAL_ID 1 +#define RICHACE_EVERYONE_SPECIAL_ID 2 + +#define RICHACL_VALID_FLAGS ( \ + RICHACL_WRITE_THROUGH | \ + RICHACL_MASKED ) + +#define RICHACE_VALID_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_IDENTIFIER_GROUP | \ + RICHACE_SPECIAL_WHO ) + +#define RICHACE_INHERITANCE_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE ) + +/* Valid RICHACE_* flags for directories and non-directories */ +#define RICHACE_VALID_MASK ( \ + RICHACE_READ_DATA | RICHACE_LIST_DIRECTORY | \ + RICHACE_WRITE_DATA | RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_READ_NAMED_ATTRS | \ + RICHACE_WRITE_NAMED_ATTRS | \ + RICHACE_EXECUTE | \ + RICHACE_DELETE_CHILD | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_RETENTION | \ + RICHACE_WRITE_RETENTION_HOLD | \ + RICHACE_DELETE | \ + RICHACE_READ_ACL | \ + RICHACE_WRITE_ACL | \ + RICHACE_WRITE_OWNER | \ + RICHACE_SYNCHRONIZE ) + +#endif /* __UAPI_RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:51:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5923B7CCA for ; Tue, 31 May 2016 06:51:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2B2B430404E for ; Tue, 31 May 2016 04:51:53 -0700 (PDT) X-ASG-Debug-ID: 1464695511-04cb6c2dbaa70c90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zKdud3IPTYtJybIV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:51 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0ADCAC04B306; Tue, 31 May 2016 11:51:51 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZn031703; Tue, 31 May 2016 07:51:44 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 07/22] richacl: Permission mapping functions Date: Tue, 31 May 2016 13:50:39 +0200 X-ASG-Orig-Subj: [PATCH v22 07/22] richacl: Permission mapping functions Message-Id: <1464695454-18557-8-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 31 May 2016 11:51:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695511 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6962 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We need to map from POSIX permissions to NFSv4 permissions when a chmod() is done, from NFSv4 permissions to POSIX permissions when an acl is set (which implicitly sets the file permission bits), and from the MAY_READ/MAY_WRITE/MAY_EXEC/MAY_APPEND flags to NFSv4 permissions when doing an access check in a richacl. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 118 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 3 ++ include/uapi/linux/richacl.h | 44 ++++++++++++++++ 3 files changed, 165 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index bcc6591..d0a4135 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -63,3 +63,121 @@ richace_copy(struct richace *to, const struct richace *from) { memcpy(to, from, sizeof(struct richace)); } + +/* + * richacl_mask_to_mode - compute the file permission bits from mask + * @mask: %RICHACE_* permission mask + * + * Compute the file permission bits corresponding to a particular set of + * richacl permissions. + * + * See richacl_masks_to_mode(). + */ +static int +richacl_mask_to_mode(unsigned int mask) +{ + int mode = 0; + + if (mask & RICHACE_POSIX_MODE_READ) + mode |= S_IROTH; + if (mask & RICHACE_POSIX_MODE_WRITE) + mode |= S_IWOTH; + if (mask & RICHACE_POSIX_MODE_EXEC) + mode |= S_IXOTH; + + return mode; +} + +/** + * richacl_masks_to_mode - compute file permission bits from file masks + * + * When setting a richacl, we set the file permission bits to indicate maximum + * permissions: for example, we set the Write permission when a mask contains + * RICHACE_APPEND_DATA even if it does not also contain RICHACE_WRITE_DATA. + * + * Permissions which are not in RICHACE_POSIX_MODE_READ, + * RICHACE_POSIX_MODE_WRITE, or RICHACE_POSIX_MODE_EXEC cannot be represented + * in the file permission bits. Such permissions can still be effective, but + * not for new files or after a chmod(); they must be explicitly enabled in the + * richacl. + */ +int +richacl_masks_to_mode(const struct richacl *acl) +{ + return richacl_mask_to_mode(acl->a_owner_mask) << 6 | + richacl_mask_to_mode(acl->a_group_mask) << 3 | + richacl_mask_to_mode(acl->a_other_mask); +} +EXPORT_SYMBOL_GPL(richacl_masks_to_mode); + +/** + * richacl_mode_to_mask - compute a file mask from the lowest three mode bits + * @mode: mode to convert to richacl permissions + * + * When the file permission bits of a file are set with chmod(), this specifies + * the maximum permissions that processes will get. All permissions beyond + * that will be removed from the file masks, and become ineffective. + */ +unsigned int +richacl_mode_to_mask(umode_t mode) +{ + unsigned int mask = 0; + + if (mode & S_IROTH) + mask |= RICHACE_POSIX_MODE_READ; + if (mode & S_IWOTH) + mask |= RICHACE_POSIX_MODE_WRITE; + if (mode & S_IXOTH) + mask |= RICHACE_POSIX_MODE_EXEC; + + return mask; +} + +/** + * richacl_want_to_mask - convert the iop->permission want argument to a mask + * @want: @want argument of the permission inode operation + * + * When checking for append, @want is (MAY_WRITE | MAY_APPEND). + * + * Richacls use the iop->may_create and iop->may_delete hooks which are used + * for checking if creating and deleting files is allowed. These hooks do not + * use richacl_want_to_mask(), so we do not have to deal with mapping MAY_WRITE + * to RICHACE_ADD_FILE, RICHACE_ADD_SUBDIRECTORY, and RICHACE_DELETE_CHILD + * here. + */ +unsigned int +richacl_want_to_mask(unsigned int want) +{ + unsigned int mask = 0; + + if (want & MAY_READ) + mask |= RICHACE_READ_DATA; + if (want & MAY_DELETE_SELF) + mask |= RICHACE_DELETE; + if (want & MAY_TAKE_OWNERSHIP) + mask |= RICHACE_WRITE_OWNER; + if (want & MAY_CHMOD) + mask |= RICHACE_WRITE_ACL; + if (want & MAY_SET_TIMES) + mask |= RICHACE_WRITE_ATTRIBUTES; + if (want & MAY_EXEC) + mask |= RICHACE_EXECUTE; + /* + * differentiate MAY_WRITE from these request + */ + if (want & (MAY_APPEND | + MAY_CREATE_FILE | MAY_CREATE_DIR | + MAY_DELETE_CHILD)) { + if (want & MAY_APPEND) + mask |= RICHACE_APPEND_DATA; + if (want & MAY_CREATE_FILE) + mask |= RICHACE_ADD_FILE; + if (want & MAY_CREATE_DIR) + mask |= RICHACE_ADD_SUBDIRECTORY; + if (want & MAY_DELETE_CHILD) + mask |= RICHACE_DELETE_CHILD; + } else if (want & MAY_WRITE) + mask |= RICHACE_WRITE_DATA; + return mask; +} +EXPORT_SYMBOL_GPL(richacl_want_to_mask); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index edb8480..9102ef0 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -175,5 +175,8 @@ richace_is_same_identifier(const struct richace *a, const struct richace *b) extern struct richacl *richacl_alloc(int, gfp_t); extern struct richacl *richacl_clone(const struct richacl *, gfp_t); extern void richace_copy(struct richace *, const struct richace *); +extern int richacl_masks_to_mode(const struct richacl *); +extern unsigned int richacl_mode_to_mask(umode_t); +extern unsigned int richacl_want_to_mask(unsigned int); #endif /* __RICHACL_H */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 08856f8..1ed48ac 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -96,4 +96,48 @@ RICHACE_WRITE_OWNER | \ RICHACE_SYNCHRONIZE ) +/* + * The POSIX permissions are supersets of the following richacl permissions: + * + * - MAY_READ maps to READ_DATA or LIST_DIRECTORY, depending on the type + * of the file system object. + * + * - MAY_WRITE maps to WRITE_DATA or RICHACE_APPEND_DATA for files, and to + * ADD_FILE, RICHACE_ADD_SUBDIRECTORY, or RICHACE_DELETE_CHILD for directories. + * + * - MAY_EXECUTE maps to RICHACE_EXECUTE. + * + * (Some of these richacl permissions have the same bit values.) + */ +#define RICHACE_POSIX_MODE_READ ( \ + RICHACE_READ_DATA | \ + RICHACE_LIST_DIRECTORY) +#define RICHACE_POSIX_MODE_WRITE ( \ + RICHACE_WRITE_DATA | \ + RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | \ + RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_DELETE_CHILD) +#define RICHACE_POSIX_MODE_EXEC RICHACE_EXECUTE +#define RICHACE_POSIX_MODE_ALL ( \ + RICHACE_POSIX_MODE_READ | \ + RICHACE_POSIX_MODE_WRITE | \ + RICHACE_POSIX_MODE_EXEC) + +/* + * These permissions are always allowed no matter what the acl says. + */ +#define RICHACE_POSIX_ALWAYS_ALLOWED ( \ + RICHACE_SYNCHRONIZE | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_READ_ACL) + +/* + * The owner is implicitly granted these permissions under POSIX. + */ +#define RICHACE_POSIX_OWNER_ALLOWED ( \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_OWNER | \ + RICHACE_WRITE_ACL) + #endif /* __UAPI_RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AFC7C7CA6 for ; Tue, 31 May 2016 06:52:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25A08AC002 for ; Tue, 31 May 2016 04:52:00 -0700 (PDT) X-ASG-Debug-ID: 1464695518-04cb6c2dbca70cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QQ3lR1oB8b73HzaJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:51:58 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BA1AC3B70B; Tue, 31 May 2016 11:51:57 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZo031703; Tue, 31 May 2016 07:51:51 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 08/22] richacl: Compute maximum file masks from an acl Date: Tue, 31 May 2016 13:50:40 +0200 X-ASG-Orig-Subj: [PATCH v22 08/22] richacl: Compute maximum file masks from an acl Message-Id: <1464695454-18557-9-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 31 May 2016 11:51:57 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695518 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6812 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Compute upper bound owner, group, and other file masks with as few permissions as possible without denying any permissions that the NFSv4 acl in a richacl grants. This algorithm is used when a file inherits an acl at create time and when an acl is set via a mechanism that does not provide file masks (such as setting an acl via nfsd). When user-space sets an acl via setxattr, the extended attribute already includes the file masks. Setting an acl also sets the file mode permission bits: they are determined by the file masks; see richacl_masks_to_mode(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 158 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index d0a4135..056228f 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -181,3 +181,160 @@ richacl_want_to_mask(unsigned int want) return mask; } EXPORT_SYMBOL_GPL(richacl_want_to_mask); + +/* + * Note: functions like richacl_allowed_to_who(), richacl_group_class_allowed(), + * and richacl_compute_max_masks() iterate through the entire acl in reverse + * order as an optimization. + * + * In the standard algorithm, aces are considered in forward order. When a + * process matches an ace, the permissions in the ace are either allowed or + * denied depending on the ace type. Once a permission has been allowed or + * denied, it is no longer considered in further aces. + * + * By iterating through the acl in reverse order, we can compute the same + * result without having to keep track of which permissions have been allowed + * and denied already. + */ + +/** + * richacl_allowed_to_who - permissions allowed to a specific who value + * + * Compute the maximum mask values allowed to a specific who value, taking + * everyone@ aces into account. + */ +static unsigned int richacl_allowed_to_who(struct richacl *acl, + struct richace *who) +{ + struct richace *ace; + unsigned int allowed = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_same_identifier(ace, who) || + richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + allowed &= ~ace->e_mask; + } + } + return allowed; +} + +/** + * richacl_group_class_allowed - maximum permissions of the group class + * + * Compute the maximum mask values allowed to a process in the group class + * (i.e., a process which is not the owner but is in the owning group or + * matches a user or group acl entry). This includes permissions granted or + * denied by everyone@ aces. + * + * See richacl_compute_max_masks(). + */ +static unsigned int richacl_group_class_allowed(struct richacl *acl) +{ + struct richace *ace; + unsigned int everyone_allowed = 0, group_class_allowed = 0; + int had_group_ace = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace) || + richace_is_owner(ace)) + continue; + + if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + everyone_allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + everyone_allowed &= ~ace->e_mask; + } else { + group_class_allowed |= + richacl_allowed_to_who(acl, ace); + + if (richace_is_group(ace)) + had_group_ace = 1; + } + } + /* + * If the acl doesn't contain any group@ aces, richacl_allowed_to_who() + * wasn't called for the owning group. We could make that call now, but + * we already know the result (everyone_allowed). + */ + if (!had_group_ace) + group_class_allowed |= everyone_allowed; + return group_class_allowed; +} + +/** + * richacl_compute_max_masks - compute upper bound masks + * + * Computes upper bound owner, group, and other masks so that none of the + * permissions allowed by the acl are disabled. + * + * We don't make assumptions about who the owner is so that the owner can + * change with no effect on the file masks or file mode permission bits; this + * means that we must assume that all entries can match the owner. + */ +void richacl_compute_max_masks(struct richacl *acl) +{ + unsigned int gmask = ~0; + struct richace *ace; + + /* + * @gmask contains all permissions which the group class is ever + * allowed. We use it to avoid adding permissions to the group mask + * from everyone@ allow aces which the group class is always denied + * through other aces. For example, the following acl would otherwise + * result in a group mask of rw: + * + * group@:w::deny + * everyone@:rw::allow + * + * Avoid computing @gmask for acls which do not include any group class + * deny aces: in such acls, the group class is never denied any + * permissions from everyone@ allow aces, and the group class cannot + * have fewer permissions than the other class. + */ + +restart: + acl->a_owner_mask = 0; + acl->a_group_mask = 0; + acl->a_other_mask = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + + if (richace_is_owner(ace)) { + if (richace_is_allow(ace)) + acl->a_owner_mask |= ace->e_mask; + else if (richace_is_deny(ace)) + acl->a_owner_mask &= ~ace->e_mask; + } else if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask; + acl->a_group_mask |= ace->e_mask & gmask; + acl->a_other_mask |= ace->e_mask; + } else if (richace_is_deny(ace)) { + acl->a_owner_mask &= ~ace->e_mask; + acl->a_group_mask &= ~ace->e_mask; + acl->a_other_mask &= ~ace->e_mask; + } + } else { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask & gmask; + acl->a_group_mask |= ace->e_mask & gmask; + } else if (richace_is_deny(ace) && gmask == ~0) { + gmask = richacl_group_class_allowed(acl); + if (likely(gmask != ~0)) + /* should always be true */ + goto restart; + } + } + } + + acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); +} +EXPORT_SYMBOL_GPL(richacl_compute_max_masks); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 9102ef0..3559b2c 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -178,5 +178,6 @@ extern void richace_copy(struct richace *, const struct richace *); extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); +extern void richacl_compute_max_masks(struct richacl *); #endif /* __RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D1427CAE for ; Tue, 31 May 2016 06:52:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F8F38F8033 for ; Tue, 31 May 2016 04:52:06 -0700 (PDT) X-ASG-Debug-ID: 1464695524-04cb6c2dbaa70ce0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m2naJRiuOJnV7Tnc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:05 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 850ADC04B307; Tue, 31 May 2016 11:52:04 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZp031703; Tue, 31 May 2016 07:51:58 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 09/22] richacl: Permission check algorithm Date: Tue, 31 May 2016 13:50:41 +0200 X-ASG-Orig-Subj: [PATCH v22 09/22] richacl: Permission check algorithm Message-Id: <1464695454-18557-10-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 31 May 2016 11:52:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695525 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5277 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl roughly grants a requested access if the NFSv4 acl in the richacl grants the requested permissions according to the NFSv4 permission check algorithm and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 129 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 056228f..cb0ef3f 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -338,3 +338,131 @@ restart: acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); } EXPORT_SYMBOL_GPL(richacl_compute_max_masks); + +/** + * richacl_permission - richacl permission check algorithm + * @inode: inode to check + * @acl: rich acl of the inode + * @want: requested access (MAY_* flags) + * + * Checks if the current process is granted @mask flags in @acl. + */ +int +richacl_permission(struct inode *inode, const struct richacl *acl, + int want) +{ + const struct richace *ace; + unsigned int mask = richacl_want_to_mask(want); + unsigned int requested = mask, denied = 0; + int in_owning_group = in_group_p(inode->i_gid); + int in_owner_or_group_class = in_owning_group; + + /* + * A process is + * - in the owner file class if it owns the file, + * - in the group file class if it is in the file's owning group or + * it matches any of the user or group entries, and + * - in the other file class otherwise. + * The file class is only relevant for determining which file mask to + * apply, which only happens for masked acls. + */ + if (acl->a_flags & RICHACL_MASKED) { + if ((acl->a_flags & RICHACL_WRITE_THROUGH) && + uid_eq(current_fsuid(), inode->i_uid)) { + denied = requested & ~acl->a_owner_mask; + goto out; + } + } else { + /* + * When the acl is not masked, there is no need to determine if + * the process is in the group class and we can break out + * earlier of the loop below. + */ + in_owner_or_group_class = 1; + } + + /* + * Check if the acl grants the requested access and determine which + * file class the process is in. + */ + richacl_for_each_entry(ace, acl) { + unsigned int ace_mask = ace->e_mask; + + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_owner(ace)) { + if (!uid_eq(current_fsuid(), inode->i_uid)) + continue; + goto entry_matches_owner; + } else if (richace_is_group(ace)) { + if (!in_owning_group) + continue; + } else if (richace_is_unix_user(ace)) { + if (!uid_eq(current_fsuid(), ace->e_id.uid)) + continue; + if (uid_eq(current_fsuid(), inode->i_uid)) + goto entry_matches_owner; + } else if (richace_is_unix_group(ace)) { + if (!in_group_p(ace->e_id.gid)) + continue; + } else + goto entry_matches_everyone; + + /* + * Apply the group file mask to entries other than owner@ and + * everyone@ or user entries matching the owner. This ensures + * that we grant the same permissions as the acl computed by + * richacl_apply_masks(). + * + * Without this restriction, the following richacl would grant + * rw access to processes which are both the owner and in the + * owning group, but not to other users in the owning group, + * which could not be represented without masks: + * + * owner:rw::mask + * group@:rw::allow + */ + if ((acl->a_flags & RICHACL_MASKED) && richace_is_allow(ace)) + ace_mask &= acl->a_group_mask; + +entry_matches_owner: + /* The process is in the owner or group file class. */ + in_owner_or_group_class = 1; + +entry_matches_everyone: + /* Check which mask flags the ACE allows or denies. */ + if (richace_is_deny(ace)) + denied |= ace_mask & mask; + mask &= ~ace_mask; + + /* + * Keep going until we know which file class + * the process is in. + */ + if (!mask && in_owner_or_group_class) + break; + } + denied |= mask; + + if (acl->a_flags & RICHACL_MASKED) { + /* + * The file class a process is in determines which file mask + * applies. Check if that file mask also grants the requested + * access. + */ + if (uid_eq(current_fsuid(), inode->i_uid)) + denied |= requested & ~acl->a_owner_mask; + else if (in_owner_or_group_class) + denied |= requested & ~acl->a_group_mask; + else { + if (acl->a_flags & RICHACL_WRITE_THROUGH) + denied = requested & ~acl->a_other_mask; + else + denied |= requested & ~acl->a_other_mask; + } + } + +out: + return denied ? -EACCES : 0; +} +EXPORT_SYMBOL_GPL(richacl_permission); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 3559b2c..be9fb65 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -179,5 +179,6 @@ extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); +extern int richacl_permission(struct inode *, const struct richacl *, int); #endif /* __RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1CAF87CA7 for ; Tue, 31 May 2016 06:52:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D4EA48F8035 for ; Tue, 31 May 2016 04:52:12 -0700 (PDT) X-ASG-Debug-ID: 1464695531-04cb6c2db9a70d00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ahdY4hCeuiDqXTeK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:12 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 488A9C05E170; Tue, 31 May 2016 11:52:11 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZq031703; Tue, 31 May 2016 07:52:05 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 10/22] posix_acl: Improve xattr fixup code Date: Tue, 31 May 2016 13:50:42 +0200 X-ASG-Orig-Subj: [PATCH v22 10/22] posix_acl: Improve xattr fixup code Message-Id: <1464695454-18557-11-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 31 May 2016 11:52:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695531 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2418 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Both XATTR_NAME_POSIX_ACL_ACCESS and XATTR_NAME_POSIX_ACL_DEFAULT have the same XATTR_SYSTEM_PREFIX prefix; don't check for the same prefix repeatedly. Signed-off-by: Andreas Gruenbacher Reviewed-by: Steve French --- fs/xattr.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/fs/xattr.c b/fs/xattr.c index 4beafc4..61ac218 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -295,6 +295,16 @@ out: } EXPORT_SYMBOL_GPL(vfs_removexattr); +static void +fix_xattr_from_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_from_user(kvalue, size); +} /* * Extended attribute SET operations @@ -329,9 +339,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, error = -EFAULT; goto out; } - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_from_user(kvalue, size); + fix_xattr_from_user(kname, kvalue, size); } error = vfs_setxattr(d, kname, kvalue, size, flags); @@ -396,6 +404,17 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, return error; } +static void +fix_xattr_to_user(const char *kname, void *kvalue, size_t size) +{ + if (strncmp(kname, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) + return; + kname += XATTR_SYSTEM_PREFIX_LEN; + if (!strcmp(kname, XATTR_POSIX_ACL_ACCESS) || + !strcmp(kname, XATTR_POSIX_ACL_DEFAULT)) + posix_acl_fix_xattr_to_user(kvalue, size); +} + /* * Extended attribute GET operations */ @@ -426,9 +445,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, error = vfs_getxattr(d, kname, kvalue, size); if (error > 0) { - if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || - (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0)) - posix_acl_fix_xattr_to_user(kvalue, size); + fix_xattr_to_user(kname, kvalue, size); if (size && copy_to_user(value, kvalue, error)) error = -EFAULT; } else if (error == -ERANGE && size >= XATTR_SIZE_MAX) { -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1CD9F7CA3 for ; Tue, 31 May 2016 06:52:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9DADBAC003 for ; Tue, 31 May 2016 04:52:21 -0700 (PDT) X-ASG-Debug-ID: 1464695539-04bdf05ad4a95460001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id u5IVdYdBAOQbAv5M (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:19 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BF14580E6A; Tue, 31 May 2016 11:52:18 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZr031703; Tue, 31 May 2016 07:52:11 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Dilger Subject: [PATCH v22 11/22] vfs: Cache base_acl objects in inodes Date: Tue, 31 May 2016 13:50:43 +0200 X-ASG-Orig-Subj: [PATCH v22 11/22] vfs: Cache base_acl objects in inodes Message-Id: <1464695454-18557-12-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 31 May 2016 11:52:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695539 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17875 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com POSIX ACLs and richacls are both objects allocated by kmalloc() with a reference count which are freed by kfree_rcu(). An inode can either cache an access and a default POSIX ACL, or a richacl (richacls do not have default acls). To allow an inode to cache either of the two kinds of acls, introduce a new base_acl type and convert i_acl and i_default_acl to that type. In most cases, the vfs then doesn't care which kind of acl an inode caches (if any). Signed-off-by: Andreas Gruenbacher Cc: Andreas Dilger --- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/acl.c | 8 +-- fs/f2fs/acl.c | 4 +- fs/inode.c | 32 +++++++++++- fs/jffs2/acl.c | 6 ++- fs/namei.c | 33 ++++++------ fs/nfs/nfs3acl.c | 14 ++--- fs/posix_acl.c | 69 +++++++------------------ fs/richacl.c | 4 +- include/linux/fs.h | 41 +++++++++++++-- include/linux/posix_acl.h | 21 ++++---- include/linux/richacl.h | 9 ++-- 12 files changed, 139 insertions(+), 104 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index 96c7e9f..7819a7c 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1087,7 +1087,7 @@ void ll_clear_inode(struct inode *inode) } #ifdef CONFIG_FS_POSIX_ACL else if (lli->lli_posix_acl) { - LASSERT(atomic_read(&lli->lli_posix_acl->a_refcount) == 1); + LASSERT(base_acl_refcount(&lli->lli_posix_acl->a_base) == 1); LASSERT(!lli->lli_remote_perms); posix_acl_release(lli->lli_posix_acl); lli->lli_posix_acl = NULL; diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 0576eae..1ce572f 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -87,14 +87,14 @@ int v9fs_get_acl(struct inode *inode, struct p9_fid *fid) static struct posix_acl *v9fs_get_cached_acl(struct inode *inode, int type) { - struct posix_acl *acl; + struct base_acl *base_acl; /* * 9p Always cache the acl value when * instantiating the inode (v9fs_inode_from_fid) */ - acl = get_cached_acl(inode, type); - BUG_ON(is_uncached_acl(acl)); - return acl; + base_acl = get_cached_acl(inode, type); + BUG_ON(is_uncached_acl(base_acl)); + return posix_acl(base_acl); } struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type) diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index a31c7e8..6079017 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -267,7 +267,7 @@ static struct posix_acl *f2fs_acl_clone(const struct posix_acl *acl, sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -279,7 +279,7 @@ static int f2fs_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/inode.c b/fs/inode.c index 4ccbc21..40c03a7 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -240,14 +240,42 @@ void __destroy_inode(struct inode *inode) #ifdef CONFIG_FS_POSIX_ACL if (inode->i_acl && !is_uncached_acl(inode->i_acl)) - posix_acl_release(inode->i_acl); + base_acl_put(inode->i_acl); if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) - posix_acl_release(inode->i_default_acl); + base_acl_put(inode->i_default_acl); #endif this_cpu_dec(nr_inodes); } EXPORT_SYMBOL(__destroy_inode); +#ifdef CONFIG_FS_POSIX_ACL +struct base_acl *__get_cached_acl(struct base_acl **p) +{ + struct base_acl *base_acl; + + for (;;) { + rcu_read_lock(); + base_acl = rcu_dereference(*p); + if (!base_acl || is_uncached_acl(base_acl) || + atomic_inc_not_zero(&base_acl->ba_refcount)) + break; + rcu_read_unlock(); + cpu_relax(); + } + rcu_read_unlock(); + return base_acl; +} + +void __forget_cached_acl(struct base_acl **p) +{ + struct base_acl *old; + + old = xchg(p, ACL_NOT_CACHED); + if (!is_uncached_acl(old)) + base_acl_put(old); +} +#endif + static void i_callback(struct rcu_head *head) { struct inode *inode = container_of(head, struct inode, i_rcu); diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index bc2693d..6c11909 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -292,13 +292,15 @@ int jffs2_init_acl_post(struct inode *inode) int rc; if (inode->i_default_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl); + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, + posix_acl(inode->i_default_acl)); if (rc) return rc; } if (inode->i_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl); + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, + posix_acl(inode->i_acl)); if (rc) return rc; } diff --git a/fs/namei.c b/fs/namei.c index 8e175e1..234f911 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -259,25 +259,28 @@ void putname(struct filename *name) static int check_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *acl; - if (mask & MAY_NOT_BLOCK) { - acl = get_cached_acl_rcu(inode, ACL_TYPE_ACCESS); - if (!acl) + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) return -EAGAIN; /* no ->get_acl() calls in RCU mode... */ - if (is_uncached_acl(acl)) + if (is_uncached_acl(base_acl)) return -ECHILD; - return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); - } - - acl = get_acl(inode, ACL_TYPE_ACCESS); - if (IS_ERR(acl)) - return PTR_ERR(acl); - if (acl) { - int error = posix_acl_permission(inode, acl, mask); - posix_acl_release(acl); - return error; + return posix_acl_permission(inode, posix_acl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct posix_acl *acl; + + acl = get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = posix_acl_permission(inode, acl, mask); + posix_acl_release(acl); + return error; + } } #endif diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index 720d92f5..2b70944 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -16,28 +16,28 @@ * caching get_acl results in a race-free way. See fs/posix_acl.c:get_acl() * for explanations. */ -static void nfs3_prepare_get_acl(struct posix_acl **p) +static void nfs3_prepare_get_acl(struct base_acl **p) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); if (cmpxchg(p, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) { /* Not the first reader or sentinel already in place. */ } } -static void nfs3_complete_get_acl(struct posix_acl **p, struct posix_acl *acl) +static void nfs3_complete_get_acl(struct base_acl **p, struct posix_acl *acl) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); /* Only cache the ACL if our sentinel is still in place. */ posix_acl_dup(acl); - if (cmpxchg(p, sentinel, acl) != sentinel) + if (cmpxchg(p, sentinel, &acl->a_base) != sentinel) posix_acl_release(acl); } -static void nfs3_abort_get_acl(struct posix_acl **p) +static void nfs3_abort_get_acl(struct base_acl **p) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); /* Remove our sentinel upon failure. */ cmpxchg(p, sentinel, ACL_NOT_CACHED); diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 8a4a266..e5a0681 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -static struct posix_acl **acl_by_type(struct inode *inode, int type) +static inline struct base_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -33,51 +33,23 @@ static struct posix_acl **acl_by_type(struct inode *inode, int type) } } -struct posix_acl *get_cached_acl(struct inode *inode, int type) +struct base_acl *get_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *acl; - - for (;;) { - rcu_read_lock(); - acl = rcu_dereference(*p); - if (!acl || is_uncached_acl(acl) || - atomic_inc_not_zero(&acl->a_refcount)) - break; - rcu_read_unlock(); - cpu_relax(); - } - rcu_read_unlock(); - return acl; + return __get_cached_acl(acl_by_type(inode, type)); } EXPORT_SYMBOL(get_cached_acl); -struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) -{ - return rcu_dereference(*acl_by_type(inode, type)); -} -EXPORT_SYMBOL(get_cached_acl_rcu); - void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; - old = xchg(p, posix_acl_dup(acl)); + old = xchg(p, &posix_acl_dup(acl)->a_base); if (!is_uncached_acl(old)) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(set_cached_acl); -static void __forget_cached_acl(struct posix_acl **p) -{ - struct posix_acl *old; - - old = xchg(p, ACL_NOT_CACHED); - if (!is_uncached_acl(old)) - posix_acl_release(old); -} - void forget_cached_acl(struct inode *inode, int type) { __forget_cached_acl(acl_by_type(inode, type)); @@ -93,25 +65,24 @@ EXPORT_SYMBOL(forget_all_cached_acls); struct posix_acl *get_acl(struct inode *inode, int type) { - void *sentinel; - struct posix_acl **p; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *sentinel, *base_acl; struct posix_acl *acl; + if (!IS_POSIXACL(inode)) + return NULL; + /* * The sentinel is used to detect when another operation like * set_cached_acl() or forget_cached_acl() races with get_acl(). * It is guaranteed that is_uncached_acl(sentinel) is true. */ - acl = get_cached_acl(inode, type); - if (!is_uncached_acl(acl)) - return acl; - - if (!IS_POSIXACL(inode)) - return NULL; + base_acl = __get_cached_acl(p); + if (!is_uncached_acl(base_acl)) + return posix_acl(base_acl); sentinel = uncached_acl_sentinel(current); - p = acl_by_type(inode, type); /* * If the ACL isn't being read yet, set our sentinel. Otherwise, the @@ -151,7 +122,7 @@ struct posix_acl *get_acl(struct inode *inode, int type) * Cache the result, but only if our sentinel is still in place. */ posix_acl_dup(acl); - if (unlikely(cmpxchg(p, sentinel, acl) != sentinel)) + if (unlikely(cmpxchg(p, sentinel, &acl->a_base) != sentinel)) posix_acl_release(acl); return acl; } @@ -163,7 +134,7 @@ EXPORT_SYMBOL(get_acl); void posix_acl_init(struct posix_acl *acl, int count) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } EXPORT_SYMBOL(posix_acl_init); @@ -196,7 +167,7 @@ posix_acl_clone(const struct posix_acl *acl, gfp_t flags) sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -418,7 +389,7 @@ static int posix_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { @@ -473,7 +444,7 @@ static int __posix_acl_chmod_masq(struct posix_acl *acl, umode_t mode) struct posix_acl_entry *group_obj = NULL, *mask_obj = NULL; struct posix_acl_entry *pa, *pe; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/richacl.c b/fs/richacl.c index cb0ef3f..8971ead 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -31,7 +31,7 @@ richacl_alloc(int count, gfp_t gfp) struct richacl *acl = kzalloc(size, gfp); if (acl) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } return acl; @@ -50,7 +50,7 @@ richacl_clone(const struct richacl *acl, gfp_t gfp) if (dup) { memcpy(dup, acl, size); - atomic_set(&dup->a_refcount, 1); + base_acl_init(&dup->a_base); } return dup; } diff --git a/include/linux/fs.h b/include/linux/fs.h index bb36561..06a30b0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -582,17 +582,23 @@ static inline void mapping_allow_writable(struct address_space *mapping) #define i_size_ordered_init(inode) do { } while (0) #endif +struct base_acl { + union { + atomic_t ba_refcount; + struct rcu_head ba_rcu; + }; +}; struct posix_acl; #define ACL_NOT_CACHED ((void *)(-1)) -static inline struct posix_acl * +static inline struct base_acl * uncached_acl_sentinel(struct task_struct *task) { return (void *)task + 1; } static inline bool -is_uncached_acl(struct posix_acl *acl) +is_uncached_acl(struct base_acl *acl) { return (long)acl & 1; } @@ -613,9 +619,9 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *i_acl; - struct posix_acl *i_default_acl; +#if defined(CONFIG_FS_POSIX_ACL) + struct base_acl *i_acl; + struct base_acl *i_default_acl; #endif const struct inode_operations *i_op; @@ -3193,4 +3199,29 @@ static inline bool dir_relax_shared(struct inode *inode) extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); +static inline void base_acl_get(struct base_acl *acl) +{ + if (acl) + atomic_inc(&acl->ba_refcount); +} + +static inline void base_acl_put(struct base_acl *acl) +{ + if (acl && atomic_dec_and_test(&acl->ba_refcount)) + kfree_rcu(acl, ba_rcu); +} + +static inline void base_acl_init(struct base_acl *acl) +{ + atomic_set(&acl->ba_refcount, 1); +} + +static inline int base_acl_refcount(struct base_acl *acl) +{ + return atomic_read(&acl->ba_refcount); +} + +extern struct base_acl *__get_cached_acl(struct base_acl **); +extern void __forget_cached_acl(struct base_acl **); + #endif /* _LINUX_FS_H */ diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 5b5a80c..daf84fa 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -43,10 +43,7 @@ struct posix_acl_entry { }; struct posix_acl { - union { - atomic_t a_refcount; - struct rcu_head a_rcu; - }; + struct base_acl a_base; /* must be first, see posix_acl_release() */ unsigned int a_count; struct posix_acl_entry a_entries[0]; }; @@ -61,8 +58,7 @@ struct posix_acl { static inline struct posix_acl * posix_acl_dup(struct posix_acl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -72,10 +68,16 @@ posix_acl_dup(struct posix_acl *acl) static inline void posix_acl_release(struct posix_acl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree_rcu(acl, a_rcu); + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + base_acl_put(&acl->a_base); } +static inline struct posix_acl * +posix_acl(struct base_acl *base_acl) +{ + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + return container_of(base_acl, struct posix_acl, a_base); +} /* posix_acl.c */ @@ -99,8 +101,7 @@ extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); -struct posix_acl *get_cached_acl(struct inode *inode, int type); -struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); +struct base_acl *get_cached_acl(struct inode *inode, int type); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl); void forget_cached_acl(struct inode *inode, int type); void forget_all_cached_acls(struct inode *inode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index be9fb65..35a5bcb 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -31,7 +31,7 @@ struct richace { }; struct richacl { - atomic_t a_refcount; + struct base_acl a_base; /* must be first, see richacl_put() */ unsigned int a_owner_mask; unsigned int a_group_mask; unsigned int a_other_mask; @@ -56,8 +56,7 @@ struct richacl { static inline struct richacl * richacl_get(struct richacl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -67,8 +66,8 @@ richacl_get(struct richacl *acl) static inline void richacl_put(struct richacl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree(acl); + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + base_acl_put(&acl->a_base); } /** -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F7167CBA for ; Tue, 31 May 2016 06:52:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 022CC8F8033 for ; Tue, 31 May 2016 04:52:27 -0700 (PDT) X-ASG-Debug-ID: 1464695545-04cbb03569a847e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id erC2pMTz1r2Db5Uh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:26 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6F06378225; Tue, 31 May 2016 11:52:25 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZs031703; Tue, 31 May 2016 07:52:19 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 12/22] vfs: Add get_richacl and set_richacl inode operations Date: Tue, 31 May 2016 13:50:44 +0200 X-ASG-Orig-Subj: [PATCH v22 12/22] vfs: Add get_richacl and set_richacl inode operations Message-Id: <1464695454-18557-13-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 31 May 2016 11:52:25 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695546 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1230 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 These operations are similar to the get_acl and set_acl operations for POSIX ACLs. The distinction between access and default ACLs doesn't exist for richacls. Signed-off-by: Andreas Gruenbacher Reviewed-by: Steve French --- include/linux/fs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index 06a30b0..ac96bda 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1726,6 +1726,7 @@ struct inode_operations { const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *); int (*permission) (struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); + struct richacl * (*get_richacl)(struct inode *); int (*readlink) (struct dentry *, char __user *,int); @@ -1756,6 +1757,7 @@ struct inode_operations { umode_t create_mode, int *opened); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); + int (*set_richacl)(struct inode *, struct richacl *); } ____cacheline_aligned; ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A321F7CBA for ; Tue, 31 May 2016 06:52:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 671D1304048 for ; Tue, 31 May 2016 04:52:34 -0700 (PDT) X-ASG-Debug-ID: 1464695552-04cbb0356aa84810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6cJHyuCqbHDOY8vo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:33 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54144709C2; Tue, 31 May 2016 11:52:32 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZt031703; Tue, 31 May 2016 07:52:26 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 13/22] vfs: Cache richacl in struct inode Date: Tue, 31 May 2016 13:50:45 +0200 X-ASG-Orig-Subj: [PATCH v22 13/22] vfs: Cache richacl in struct inode Message-Id: <1464695454-18557-14-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 31 May 2016 11:52:32 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695552 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5815 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Cache richacls in struct inode so that this doesn't have to be done individually in each filesystem. This is similar to POSIX ACLs. Signed-off-by: Andreas Gruenbacher --- fs/inode.c | 13 +++++--- fs/richacl.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 5 ++- include/linux/richacl.h | 11 +++++++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 40c03a7..7dbb09c 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -181,8 +181,11 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_private = NULL; inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ -#ifdef CONFIG_FS_POSIX_ACL - inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) + inode->i_acl = ACL_NOT_CACHED; +# if defined(CONFIG_FS_POSIX_ACL) + inode->i_default_acl = ACL_NOT_CACHED; +# endif #endif #ifdef CONFIG_FSNOTIFY @@ -238,17 +241,19 @@ void __destroy_inode(struct inode *inode) atomic_long_dec(&inode->i_sb->s_remove_count); } -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) if (inode->i_acl && !is_uncached_acl(inode->i_acl)) base_acl_put(inode->i_acl); +# if defined(CONFIG_FS_POSIX_ACL) if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) base_acl_put(inode->i_default_acl); +# endif #endif this_cpu_dec(nr_inodes); } EXPORT_SYMBOL(__destroy_inode); -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *__get_cached_acl(struct base_acl **p) { struct base_acl *base_acl; diff --git a/fs/richacl.c b/fs/richacl.c index 8971ead..b2a03c1 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -20,6 +20,87 @@ #include #include +void set_cached_richacl(struct inode *inode, struct richacl *acl) +{ + struct base_acl *old; + + old = xchg(&inode->i_acl, &richacl_get(acl)->a_base); + if (!is_uncached_acl(old)) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(set_cached_richacl); + +void forget_cached_richacl(struct inode *inode) +{ + __forget_cached_acl(&inode->i_acl); +} +EXPORT_SYMBOL_GPL(forget_cached_richacl); + +struct richacl *get_richacl(struct inode *inode) +{ + struct base_acl *sentinel, *base_acl; + struct richacl *acl; + + if (!IS_RICHACL(inode)) + return NULL; + + /* + * The sentinel is used to detect when another operation like + * set_cached_richacl() or forget_cached_richacl() races with + * get_richacl(). + * It is guaranteed that is_uncached_acl(sentinel) is true. + */ + + base_acl = __get_cached_acl(&inode->i_acl); + if (!is_uncached_acl(base_acl)) + return richacl(base_acl); + + sentinel = uncached_acl_sentinel(current); + + /* + * If the ACL isn't being read yet, set our sentinel. Otherwise, the + * current value of the ACL will not be ACL_NOT_CACHED and so our own + * sentinel will not be set; another task will update the cache. We + * could wait for that other task to complete its job, but it's easier + * to just call ->get_acl to fetch the ACL ourself. (This is going to + * be an unlikely race.) + */ + if (cmpxchg(&inode->i_acl, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) + /* fall through */ ; + + /* + * Normally, the ACL returned by ->get_richacl will be cached. + * A filesystem can prevent that by calling + * forget_cached_richacl(inode) in ->get_richacl. + * + * If the filesystem doesn't have a ->get_richacl function at all, + * we'll just create the negative cache entry. + */ + if (!inode->i_op->get_richacl) { + set_cached_richacl(inode, NULL); + return NULL; + } + + acl = inode->i_op->get_richacl(inode); + if (IS_ERR(acl)) { + /* + * Remove our sentinel so that we don't block future attempts + * to cache the ACL. + */ + cmpxchg(&inode->i_acl, sentinel, ACL_NOT_CACHED); + return acl; + } + + /* + * Cache the result, but only if our sentinel is still in place. + */ + richacl_get(acl); + if (unlikely(cmpxchg(&inode->i_acl, sentinel, &acl->a_base) != sentinel)) + richacl_put(acl); + return acl; +} +EXPORT_SYMBOL_GPL(get_richacl); + /** * richacl_alloc - allocate a richacl * @count: number of entries diff --git a/include/linux/fs.h b/include/linux/fs.h index ac96bda..4d72a6d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -589,6 +589,7 @@ struct base_acl { }; }; struct posix_acl; +struct richacl; #define ACL_NOT_CACHED ((void *)(-1)) static inline struct base_acl * @@ -619,9 +620,11 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#if defined(CONFIG_FS_POSIX_ACL) +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *i_acl; +# if defined(CONFIG_FS_POSIX_ACL) struct base_acl *i_default_acl; +# endif #endif const struct inode_operations *i_op; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 35a5bcb..3e05c94 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -70,6 +70,17 @@ richacl_put(struct richacl *acl) base_acl_put(&acl->a_base); } +static inline struct richacl * +richacl(struct base_acl *base_acl) +{ + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + return container_of(base_acl, struct richacl, a_base); +} + +extern void set_cached_richacl(struct inode *, struct richacl *); +extern void forget_cached_richacl(struct inode *); +extern struct richacl *get_richacl(struct inode *); + /** * richace_is_owner - check if @ace is an OWNER@ entry */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BF8277CE3 for ; Tue, 31 May 2016 06:52:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91D998F8035 for ; Tue, 31 May 2016 04:52:40 -0700 (PDT) X-ASG-Debug-ID: 1464695559-04cbb03568a84870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BpbQAPTI3YBtQ89L (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:39 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EA60D70A95; Tue, 31 May 2016 11:52:38 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZu031703; Tue, 31 May 2016 07:52:32 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 14/22] richacl: Update the file masks in chmod() Date: Tue, 31 May 2016 13:50:46 +0200 X-ASG-Orig-Subj: [PATCH v22 14/22] richacl: Update the file masks in chmod() Message-Id: <1464695454-18557-15-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 31 May 2016 11:52:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695559 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3909 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Doing a chmod() sets the file mode, which includes the file permission bits. When a file has a richacl, the permissions that the richacl grants need to be limited to what the new file permission bits allow. This is done by setting the file masks in the richacl to what the file permission bits map to. The richacl access check algorithm takes the file masks into account, which ensures that the richacl cannot grant too many permissions. It is possible to explicitly add permissions to the file masks which go beyond what the file permission bits can grant (like the RICHACE_WRITE_ACL permission). The POSIX.1 standard calls this an alternate file access control mechanism. A subsequent chmod() would ensure that those permissions are disabled again. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 72 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index b2a03c1..ba110a6 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -547,3 +547,74 @@ out: return denied ? -EACCES : 0; } EXPORT_SYMBOL_GPL(richacl_permission); + +/** + * __richacl_chmod - update the file masks to reflect the new mode + * @acl: access control list + * @mode: new file permission bits including the file type + * + * Return a copy of @acl where the file masks have been replaced by the file + * masks corresponding to the file permission bits in @mode, or returns @acl + * itself if the file masks are already up to date. Takes over a reference + * to @acl. + */ +static struct richacl * +__richacl_chmod(struct richacl *acl, umode_t mode) +{ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + unsigned int owner_mask, group_mask, other_mask; + struct richacl *clone; + + owner_mask = richacl_mode_to_mask(mode >> 6) & ~x; + group_mask = richacl_mode_to_mask(mode >> 3) & ~x; + other_mask = richacl_mode_to_mask(mode) & ~x; + + if (acl->a_owner_mask == owner_mask && + acl->a_group_mask == group_mask && + acl->a_other_mask == other_mask && + (acl->a_flags & RICHACL_MASKED) && + (acl->a_flags & RICHACL_WRITE_THROUGH)) + return acl; + + clone = richacl_clone(acl, GFP_KERNEL); + richacl_put(acl); + if (!clone) + return ERR_PTR(-ENOMEM); + + clone->a_flags |= (RICHACL_WRITE_THROUGH | RICHACL_MASKED); + clone->a_owner_mask = owner_mask; + clone->a_group_mask = group_mask; + clone->a_other_mask = other_mask; + + return clone; +} + +/** + * richacl_chmod - filesystem chmod helper + * @inode: inode whose file permission bits to change + * @mode: new file permission bits including the file type + * + * Helper for filesystems to use to perform a chmod on the richacl of an inode. + */ +int +richacl_chmod(struct inode *inode, umode_t mode) +{ + struct richacl *acl; + int retval; + + if (S_ISLNK(mode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR_OR_NULL(acl)) + return PTR_ERR(acl); + acl = __richacl_chmod(acl, mode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + retval = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + + return retval; +} +EXPORT_SYMBOL(richacl_chmod); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 3e05c94..db82fab 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -190,5 +190,6 @@ extern unsigned int richacl_mode_to_mask(umode_t); extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); +extern int richacl_chmod(struct inode *, umode_t); #endif /* __RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B068C7CD8 for ; Tue, 31 May 2016 06:52:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BAC28F8033 for ; Tue, 31 May 2016 04:52:47 -0700 (PDT) X-ASG-Debug-ID: 1464695566-04cb6c2dbba70de0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FG21wxRVB2ofURKm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:46 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B49CB80B20; Tue, 31 May 2016 11:52:45 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZv031703; Tue, 31 May 2016 07:52:39 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 15/22] richacl: Check if an acl is equivalent to a file mode Date: Tue, 31 May 2016 13:50:47 +0200 X-ASG-Orig-Subj: [PATCH v22 15/22] richacl: Check if an acl is equivalent to a file mode Message-Id: <1464695454-18557-16-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 31 May 2016 11:52:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695566 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4352 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ACLs are considered equivalent to file modes if they only consist of owner@, group@, and everyone@ entries, the owner@ permissions do not depend on whether the owner is a member in the owning group, and no inheritance flags are set. This test is used to avoid storing richacls if the acl can be computed from the file permission bits. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields --- fs/richacl.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 105 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index ba110a6..e8a383b 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -618,3 +618,107 @@ richacl_chmod(struct inode *inode, umode_t mode) return retval; } EXPORT_SYMBOL(richacl_chmod); + +/** + * richacl_equiv_mode - compute the mode equivalent of @acl + * + * An acl is considered equivalent to a file mode if it only consists of + * owner@, group@, and everyone@ entries and the owner@ permissions do not + * depend on whether the owner is a member in the owning group. + */ +int +richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) +{ + umode_t mode = *mode_p; + + /* + * The RICHACE_DELETE_CHILD flag is meaningless for non-directories, so + * we ignore it. + */ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + struct { + unsigned int allowed; + unsigned int defined; /* allowed or denied */ + } owner = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | + RICHACE_POSIX_OWNER_ALLOWED | x, + }, group = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }, everyone = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }; + const struct richace *ace; + + if (acl->a_flags & ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED)) + return -1; + + richacl_for_each_entry(ace, acl) { + if (ace->e_flags & ~RICHACE_SPECIAL_WHO) + return -1; + + if (richace_is_owner(ace) || richace_is_everyone(ace)) { + x = ace->e_mask & ~owner.defined; + if (richace_is_allow(ace)) { + unsigned int group_denied = + group.defined & ~group.allowed; + + if (x & group_denied) + return -1; + owner.allowed |= x; + } else /* if (richace_is_deny(ace)) */ { + if (x & group.allowed) + return -1; + } + owner.defined |= x; + + if (richace_is_everyone(ace)) { + x = ace->e_mask; + if (richace_is_allow(ace)) { + group.allowed |= + x & ~group.defined; + everyone.allowed |= + x & ~everyone.defined; + } + group.defined |= x; + everyone.defined |= x; + } + } else if (richace_is_group(ace)) { + x = ace->e_mask & ~group.defined; + if (richace_is_allow(ace)) + group.allowed |= x; + group.defined |= x; + } else + return -1; + } + + if (group.allowed & ~owner.defined) + return -1; + + if (acl->a_flags & RICHACL_MASKED) { + if (acl->a_flags & RICHACL_WRITE_THROUGH) { + owner.allowed = acl->a_owner_mask; + everyone.allowed = acl->a_other_mask; + } else { + owner.allowed &= acl->a_owner_mask; + everyone.allowed &= acl->a_other_mask; + } + group.allowed &= acl->a_group_mask; + } + + mode = (mode & ~S_IRWXUGO) | + (richacl_mask_to_mode(owner.allowed) << 6) | + (richacl_mask_to_mode(group.allowed) << 3) | + richacl_mask_to_mode(everyone.allowed); + + /* Mask flags we can ignore */ + x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + + if (((richacl_mode_to_mask(mode >> 6) ^ owner.allowed) & ~x) || + ((richacl_mode_to_mask(mode >> 3) ^ group.allowed) & ~x) || + ((richacl_mode_to_mask(mode) ^ everyone.allowed) & ~x)) + return -1; + + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL_GPL(richacl_equiv_mode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index db82fab..9212edb 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -191,5 +191,6 @@ extern unsigned int richacl_want_to_mask(unsigned int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); extern int richacl_chmod(struct inode *, umode_t); +extern int richacl_equiv_mode(const struct richacl *, umode_t *); #endif /* __RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:52:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 779697CA4 for ; Tue, 31 May 2016 06:52:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3DDDAC002 for ; Tue, 31 May 2016 04:52:54 -0700 (PDT) X-ASG-Debug-ID: 1464695572-04cbb0356ba848d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0qyV5P2uMxRpjb2B (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:52:53 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 703F3D64AD; Tue, 31 May 2016 11:52:52 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZw031703; Tue, 31 May 2016 07:52:46 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 16/22] richacl: Create-time inheritance Date: Tue, 31 May 2016 13:50:48 +0200 X-ASG-Orig-Subj: [PATCH v22 16/22] richacl: Create-time inheritance Message-Id: <1464695454-18557-17-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 31 May 2016 11:52:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695573 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5758 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When a new file is created, it can inherit an acl from its parent directory; this is similar to how default acls work in POSIX ACLs. As with POSIX ACLs, if a file inherits an acl from its parent directory, the intersection between the create mode and the permissions granted by the inherited acl determines the file masks and file permission bits, and the umask is ignored. Signed-off-by: Andreas Gruenbacher --- fs/richacl.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 + 2 files changed, 153 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index e8a383b..29eaf89 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -722,3 +722,154 @@ richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) return 0; } EXPORT_SYMBOL_GPL(richacl_equiv_mode); + +static inline bool +ace_inherits_to_directory(const struct richace *ace) +{ + if (ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + return true; + if ((ace->e_flags & RICHACE_FILE_INHERIT_ACE) && + !(ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE)) + return true; + return false; +} + +/** + * richacl_inherit - compute the inherited acl of a new file + * @dir_acl: acl of the containing directory + * @isdir: inherit by a directory or non-directory? + * + * A directory can have acl entries which files and/or directories created + * inside the directory will inherit. This function computes the acl for such + * a new file. If there is no inheritable acl, it will return %NULL. + */ +struct richacl * +richacl_inherit(const struct richacl *dir_acl, int isdir) +{ + const struct richace *dir_ace; + struct richacl *acl = NULL; + struct richace *ace; + int count = 0; + + if (isdir) { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + richace_copy(ace, dir_ace); + if (dir_ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + else if (dir_ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERIT_ONLY_ACE; + else + ace->e_flags |= RICHACE_INHERIT_ONLY_ACE; + ace++; + } + } else { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + richace_copy(ace, dir_ace); + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + /* + * RICHACE_DELETE_CHILD is meaningless for + * non-directories, so clear it. + */ + ace->e_mask &= ~RICHACE_DELETE_CHILD; + ace++; + } + } + + return acl; +} + +/* + * richacl_inherit_inode - compute inherited acl and file mode + * @dir_acl: acl of the containing directory + * @mode_p: mode of the new inode + * + * The file permission bits in @mode_p must be set to the create mode by the + * caller. + * + * If there is an inheritable acl, the maximum permissions that the acl grants + * are computed and the file masks of the new acl are set accordingly. + */ +static struct richacl * +richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) +{ + struct richacl *acl; + umode_t mode = *mode_p; + + acl = richacl_inherit(dir_acl, S_ISDIR(mode)); + if (acl) { + if (richacl_equiv_mode(acl, &mode) == 0) { + *mode_p &= mode; + richacl_put(acl); + acl = NULL; + } else { + richacl_compute_max_masks(acl); + /* + * Ensure that the acl will not grant any permissions + * beyond the create mode. + */ + acl->a_flags |= RICHACL_MASKED; + acl->a_owner_mask &= + richacl_mode_to_mask(mode >> 6); + acl->a_group_mask &= + richacl_mode_to_mask(mode >> 3); + acl->a_other_mask &= + richacl_mode_to_mask(mode); + } + } else + *mode_p &= ~current_umask(); + + return acl; +} + +/** + * richacl_create - filesystem create helper + * @mode_p: mode of the new inode + * @dir: containing directory + * + * Compute the inherited acl for a new inode. If there is no acl to inherit, + * apply the umask. Use when creating a new inode on a richacl enabled file + * system. + */ +struct richacl *richacl_create(umode_t *mode_p, struct inode *dir) +{ + struct richacl *dir_acl, *acl = NULL; + + if (S_ISLNK(*mode_p)) + return NULL; + dir_acl = get_richacl(dir); + if (dir_acl) { + if (IS_ERR(dir_acl)) + return dir_acl; + acl = richacl_inherit_inode(dir_acl, mode_p); + richacl_put(dir_acl); + } else + *mode_p &= ~current_umask(); + return acl; +} +EXPORT_SYMBOL_GPL(richacl_create); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 9212edb..7aca1a3 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -192,5 +192,7 @@ extern void richacl_compute_max_masks(struct richacl *); extern int richacl_permission(struct inode *, const struct richacl *, int); extern int richacl_chmod(struct inode *, umode_t); extern int richacl_equiv_mode(const struct richacl *, umode_t *); +extern struct richacl *richacl_inherit(const struct richacl *, int); +extern struct richacl *richacl_create(umode_t *, struct inode *); #endif /* __RICHACL_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8B97F7CEC for ; Tue, 31 May 2016 06:53:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 503918F8035 for ; Tue, 31 May 2016 04:53:01 -0700 (PDT) X-ASG-Debug-ID: 1464695579-04cb6c2dbca70e50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DG2V9QsJPrdqo21m (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:00 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3547685542; Tue, 31 May 2016 11:52:59 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBotZx031703; Tue, 31 May 2016 07:52:53 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 17/22] richacl: Automatic Inheritance Date: Tue, 31 May 2016 13:50:49 +0200 X-ASG-Orig-Subj: [PATCH v22 17/22] richacl: Automatic Inheritance Message-Id: <1464695454-18557-18-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 31 May 2016 11:52:59 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695579 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6227 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Automatic Inheritance (AI) allows changes to the acl of a directory to propagate down to children. This is mostly implemented in user space: when a process changes the permissions of a directory and Automatic Inheritance is enabled for that directory, the process must propagate those changes to all children, recursively. The kernel enables this by keeping track of which permissions have been inherited at create time. In addition, it makes sure that permission propagation is turned off when the permissions are set explicitly (for example, upon create or chmod). Automatic Inheritance works as follows: - When the RICHACL_AUTO_INHERIT flag in the acl of a file or directory is not set, the file or directory is not affected by AI. - When the RICHACL_AUTO_INHERIT flag in the acl of a directory is set and a file or subdirectory is created in that directory, the inherited acl will have the RICHACL_AUTO_INHERIT flag set, and all inherited aces will have the RICHACE_INHERITED_ACE flag set. This allows user space to distinguish between aces which have been inherited and aces which have been explicitly added. - When the RICHACL_PROTECTED acl flag in the acl of a file or directory is set, AI will not modify the acl. This does not affect propagation of permissions from the file to its children (if the file is a directory). Linux does not have a way of creating files or directories without setting the file permission bits, so all files created inside a directory with RICHACL_AUTO_INHERIT set will have the RICHACL_PROTECTED flag set. This effectively disables Automatic Inheritance. Protocols which support creating files without specifying permissions can explicitly clear the RICHACL_PROTECTED flag after creating a file and reset the file masks to "undo" applying the create mode; see richacl_compute_max_masks(). They should set the RICHACL_DEFAULTED flag. (A mechanism that would allow to indicate to the kernel to ignore the create mode in the first place when there are inherited permissions would be nice to have.) Signed-off-by: Andreas Gruenbacher --- fs/richacl.c | 20 +++++++++++++++++++- include/linux/richacl.h | 12 ++++++++++++ include/uapi/linux/richacl.h | 11 ++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fs/richacl.c b/fs/richacl.c index 29eaf89..40e4af9 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -573,7 +573,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) acl->a_group_mask == group_mask && acl->a_other_mask == other_mask && (acl->a_flags & RICHACL_MASKED) && - (acl->a_flags & RICHACL_WRITE_THROUGH)) + (acl->a_flags & RICHACL_WRITE_THROUGH) && + (!richacl_is_auto_inherit(acl) || richacl_is_protected(acl))) return acl; clone = richacl_clone(acl, GFP_KERNEL); @@ -585,6 +586,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) clone->a_owner_mask = owner_mask; clone->a_group_mask = group_mask; clone->a_other_mask = other_mask; + if (richacl_is_auto_inherit(clone)) + clone->a_flags |= RICHACL_PROTECTED; return clone; } @@ -800,6 +803,14 @@ richacl_inherit(const struct richacl *dir_acl, int isdir) ace++; } } + if (richacl_is_auto_inherit(dir_acl)) { + acl->a_flags = RICHACL_AUTO_INHERIT; + richacl_for_each_entry(ace, acl) + ace->e_flags |= RICHACE_INHERITED_ACE; + } else { + richacl_for_each_entry(ace, acl) + ace->e_flags &= ~RICHACE_INHERITED_ACE; + } return acl; } @@ -828,6 +839,13 @@ richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) richacl_put(acl); acl = NULL; } else { + /* + * We need to set RICHACL_PROTECTED because we are + * doing an implicit chmod + */ + if (richacl_is_auto_inherit(acl)) + acl->a_flags |= RICHACL_PROTECTED; + richacl_compute_max_masks(acl); /* * Ensure that the acl will not grant any permissions diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 7aca1a3..a442372 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -81,6 +81,18 @@ extern void set_cached_richacl(struct inode *, struct richacl *); extern void forget_cached_richacl(struct inode *); extern struct richacl *get_richacl(struct inode *); +static inline int +richacl_is_auto_inherit(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_AUTO_INHERIT; +} + +static inline int +richacl_is_protected(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_PROTECTED; +} + /** * richace_is_owner - check if @ace is an OWNER@ entry */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 1ed48ac..8849a53 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -18,6 +18,9 @@ #define __UAPI_RICHACL_H /* a_flags values */ +#define RICHACL_AUTO_INHERIT 0x01 +#define RICHACL_PROTECTED 0x02 +#define RICHACL_DEFAULTED 0x04 #define RICHACL_WRITE_THROUGH 0x40 #define RICHACL_MASKED 0x80 @@ -31,6 +34,7 @@ #define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 #define RICHACE_INHERIT_ONLY_ACE 0x0008 #define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_INHERITED_ACE 0x0080 #define RICHACE_SPECIAL_WHO 0x4000 /* e_mask bitflags */ @@ -60,6 +64,9 @@ #define RICHACE_EVERYONE_SPECIAL_ID 2 #define RICHACL_VALID_FLAGS ( \ + RICHACL_AUTO_INHERIT | \ + RICHACL_PROTECTED | \ + RICHACL_DEFAULTED | \ RICHACL_WRITE_THROUGH | \ RICHACL_MASKED ) @@ -69,13 +76,15 @@ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ RICHACE_INHERIT_ONLY_ACE | \ RICHACE_IDENTIFIER_GROUP | \ + RICHACE_INHERITED_ACE | \ RICHACE_SPECIAL_WHO ) #define RICHACE_INHERITANCE_FLAGS ( \ RICHACE_FILE_INHERIT_ACE | \ RICHACE_DIRECTORY_INHERIT_ACE | \ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ - RICHACE_INHERIT_ONLY_ACE ) + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_INHERITED_ACE ) /* Valid RICHACE_* flags for directories and non-directories */ #define RICHACE_VALID_MASK ( \ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 611E37CF0 for ; Tue, 31 May 2016 06:53:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32F45304048 for ; Tue, 31 May 2016 04:53:08 -0700 (PDT) X-ASG-Debug-ID: 1464695586-04cbb0356ba84930001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4W00ITR4Cr0ztupi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:06 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E807B62672; Tue, 31 May 2016 11:53:05 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBota0031703; Tue, 31 May 2016 07:52:59 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 18/22] richacl: xattr mapping functions Date: Tue, 31 May 2016 13:50:50 +0200 X-ASG-Orig-Subj: [PATCH v22 18/22] richacl: xattr mapping functions Message-Id: <1464695454-18557-19-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 31 May 2016 11:53:06 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695586 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9922 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Map between "system.richacl" xattrs and the in-kernel representation. Signed-off-by: Andreas Gruenbacher --- fs/Makefile | 2 +- fs/richacl_xattr.c | 161 +++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 29 +++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl_xattr.h | 44 ++++++++++ include/uapi/linux/xattr.h | 2 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl_xattr.h diff --git a/fs/Makefile b/fs/Makefile index 2b3e6f1..262fd67 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -49,7 +49,7 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o -obj-$(CONFIG_FS_RICHACL) += richacl.o +obj-$(CONFIG_FS_RICHACL) += richacl.o richacl_xattr.o obj-y += quota/ diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c new file mode 100644 index 0000000..dc1ad36 --- /dev/null +++ b/fs/richacl_xattr.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_from_xattr - convert a richacl xattr into the in-memory representation + */ +struct richacl * +richacl_from_xattr(struct user_namespace *user_ns, + const void *value, size_t size, int invalid_error) +{ + const struct richacl_xattr *xattr_acl = value; + const struct richace_xattr *xattr_ace = (void *)(xattr_acl + 1); + struct richacl *acl; + struct richace *ace; + int count; + + if (size < sizeof(*xattr_acl) || + xattr_acl->a_version != RICHACL_XATTR_VERSION || + (xattr_acl->a_flags & ~RICHACL_VALID_FLAGS)) + goto invalid; + size -= sizeof(*xattr_acl); + count = le16_to_cpu(xattr_acl->a_count); + if (count > RICHACL_XATTR_MAX_COUNT) + goto invalid; + if (size != count * sizeof(*xattr_ace)) + goto invalid; + + acl = richacl_alloc(count, GFP_NOFS); + if (!acl) + return ERR_PTR(-ENOMEM); + + acl->a_flags = xattr_acl->a_flags; + acl->a_owner_mask = le32_to_cpu(xattr_acl->a_owner_mask); + if (acl->a_owner_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_group_mask = le32_to_cpu(xattr_acl->a_group_mask); + if (acl->a_group_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_other_mask = le32_to_cpu(xattr_acl->a_other_mask); + if (acl->a_other_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + + richacl_for_each_entry(ace, acl) { + ace->e_type = le16_to_cpu(xattr_ace->e_type); + ace->e_flags = le16_to_cpu(xattr_ace->e_flags); + ace->e_mask = le32_to_cpu(xattr_ace->e_mask); + + if (ace->e_flags & ~RICHACE_VALID_FLAGS) + goto put_invalid; + if (ace->e_flags & RICHACE_SPECIAL_WHO) { + ace->e_id.special = le32_to_cpu(xattr_ace->e_id); + if (ace->e_id.special > RICHACE_EVERYONE_SPECIAL_ID) + goto put_invalid; + } else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.gid = make_kgid(user_ns, id); + if (!gid_valid(ace->e_id.gid)) + goto put_invalid; + } else { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.uid = make_kuid(user_ns, id); + if (!uid_valid(ace->e_id.uid)) + goto put_invalid; + } + if (ace->e_type > RICHACE_ACCESS_DENIED_ACE_TYPE || + (ace->e_mask & ~RICHACE_VALID_MASK)) + goto put_invalid; + + xattr_ace++; + } + + return acl; + +put_invalid: + richacl_put(acl); +invalid: + return ERR_PTR(invalid_error); +} +EXPORT_SYMBOL_GPL(richacl_from_xattr); + +/** + * richacl_xattr_size - compute the size of the xattr representation of @acl + */ +size_t +richacl_xattr_size(const struct richacl *acl) +{ + size_t size = sizeof(struct richacl_xattr); + + size += sizeof(struct richace_xattr) * acl->a_count; + return size; +} +EXPORT_SYMBOL_GPL(richacl_xattr_size); + +/** + * richacl_to_xattr - convert @acl into its xattr representation + * @acl: the richacl to convert + * @buffer: buffer for the result + * @size: size of @buffer + */ +int +richacl_to_xattr(struct user_namespace *user_ns, + const struct richacl *acl, void *buffer, size_t size) +{ + struct richacl_xattr *xattr_acl = buffer; + struct richace_xattr *xattr_ace; + const struct richace *ace; + size_t real_size; + + real_size = richacl_xattr_size(acl); + if (!buffer) + return real_size; + if (real_size > size) + return -ERANGE; + + xattr_acl->a_version = RICHACL_XATTR_VERSION; + xattr_acl->a_flags = acl->a_flags; + xattr_acl->a_count = cpu_to_le16(acl->a_count); + + xattr_acl->a_owner_mask = cpu_to_le32(acl->a_owner_mask); + xattr_acl->a_group_mask = cpu_to_le32(acl->a_group_mask); + xattr_acl->a_other_mask = cpu_to_le32(acl->a_other_mask); + + xattr_ace = (void *)(xattr_acl + 1); + richacl_for_each_entry(ace, acl) { + xattr_ace->e_type = cpu_to_le16(ace->e_type); + xattr_ace->e_flags = cpu_to_le16(ace->e_flags); + xattr_ace->e_mask = cpu_to_le32(ace->e_mask); + if (ace->e_flags & RICHACE_SPECIAL_WHO) + xattr_ace->e_id = cpu_to_le32(ace->e_id.special); + else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) + xattr_ace->e_id = + cpu_to_le32(from_kgid(user_ns, ace->e_id.gid)); + else + xattr_ace->e_id = + cpu_to_le32(from_kuid(user_ns, ace->e_id.uid)); + xattr_ace++; + } + return real_size; +} +EXPORT_SYMBOL_GPL(richacl_to_xattr); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h new file mode 100644 index 0000000..0efa14b --- /dev/null +++ b/include/linux/richacl_xattr.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_XATTR_H +#define __RICHACL_XATTR_H + +#include +#include + +extern struct richacl *richacl_from_xattr(struct user_namespace *, const void *, + size_t, int); +extern size_t richacl_xattr_size(const struct richacl *); +extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, + void *, size_t); + +#endif /* __RICHACL_XATTR_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index abeaa98..c24e106 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -356,6 +356,7 @@ header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h header-y += richacl.h +header-y += richacl_xattr.h header-y += rfkill.h header-y += rio_mport_cdev.h header-y += romfs_fs.h diff --git a/include/uapi/linux/richacl_xattr.h b/include/uapi/linux/richacl_xattr.h new file mode 100644 index 0000000..20da204 --- /dev/null +++ b/include/uapi/linux/richacl_xattr.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_XATTR_H +#define __UAPI_RICHACL_XATTR_H + +#include +#include + +struct richace_xattr { + __le16 e_type; + __le16 e_flags; + __le32 e_mask; + __le32 e_id; +}; + +struct richacl_xattr { + __u8 a_version; + __u8 a_flags; + __le16 a_count; + __le32 a_owner_mask; + __le32 a_group_mask; + __le32 a_other_mask; +}; + +#define RICHACL_XATTR_VERSION 0 +#define RICHACL_XATTR_MAX_COUNT \ + ((XATTR_SIZE_MAX - sizeof(struct richacl_xattr)) / \ + sizeof(struct richace_xattr)) + +#endif /* __UAPI_RICHACL_XATTR_H */ diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h index 1590c49..1996903 100644 --- a/include/uapi/linux/xattr.h +++ b/include/uapi/linux/xattr.h @@ -73,5 +73,7 @@ #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT +#define XATTR_RICHACL "richacl" +#define XATTR_NAME_RICHACL XATTR_SYSTEM_PREFIX XATTR_RICHACL #endif /* _UAPI_LINUX_XATTR_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AEB547CF4 for ; Tue, 31 May 2016 06:53:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E965304048 for ; Tue, 31 May 2016 04:53:14 -0700 (PDT) X-ASG-Debug-ID: 1464695592-04bdf05ad6a95600001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id anWZDg643p5nIzyY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:13 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AE89296AE; Tue, 31 May 2016 11:53:12 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBota1031703; Tue, 31 May 2016 07:53:06 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 19/22] richacl: Add richacl xattr handler Date: Tue, 31 May 2016 13:50:51 +0200 X-ASG-Orig-Subj: [PATCH v22 19/22] richacl: Add richacl xattr handler Message-Id: <1464695454-18557-20-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 31 May 2016 11:53:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695593 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3076 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add richacl xattr handler implementing the xattr operations based on the get_richacl and set_richacl inode operations. Signed-off-by: Andreas Gruenbacher --- fs/richacl_xattr.c | 73 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 2 ++ 2 files changed, 75 insertions(+) diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c index dc1ad36..8860f60 100644 --- a/fs/richacl_xattr.c +++ b/fs/richacl_xattr.c @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include /** * richacl_from_xattr - convert a richacl xattr into the in-memory representation @@ -159,3 +161,74 @@ richacl_to_xattr(struct user_namespace *user_ns, return real_size; } EXPORT_SYMBOL_GPL(richacl_to_xattr); + +static bool +richacl_xattr_list(struct dentry *dentry) +{ + return IS_RICHACL(d_backing_inode(dentry)); +} + +static int +richacl_xattr_get(const struct xattr_handler *handler, + struct dentry *unused, struct inode *inode, + const char *name, void *buffer, size_t buffer_size) +{ + struct richacl *acl; + int error; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + error = richacl_to_xattr(current_user_ns(), acl, buffer, buffer_size); + richacl_put(acl); + return error; +} + +static int +richacl_xattr_set(const struct xattr_handler *handler, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, size_t size, + int flags) +{ + struct richacl *acl = NULL; + int ret; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + + if (!uid_eq(current_fsuid(), inode->i_uid) && + inode_permission(inode, MAY_CHMOD) && + !capable(CAP_FOWNER)) + return -EPERM; + + if (value) { + acl = richacl_from_xattr(current_user_ns(), value, size, + -EINVAL); + if (IS_ERR(acl)) + return PTR_ERR(acl); + } + + ret = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + return ret; +} + +struct xattr_handler richacl_xattr_handler = { + .name = XATTR_NAME_RICHACL, + .list = richacl_xattr_list, + .get = richacl_xattr_get, + .set = richacl_xattr_set, +}; +EXPORT_SYMBOL(richacl_xattr_handler); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h index 0efa14b..6c6adb1 100644 --- a/include/linux/richacl_xattr.h +++ b/include/linux/richacl_xattr.h @@ -26,4 +26,6 @@ extern size_t richacl_xattr_size(const struct richacl *); extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, void *, size_t); +extern struct xattr_handler richacl_xattr_handler; + #endif /* __RICHACL_XATTR_H */ -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B8D477CB8 for ; Tue, 31 May 2016 06:53:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 401B6AC002 for ; Tue, 31 May 2016 04:53:21 -0700 (PDT) X-ASG-Debug-ID: 1464695599-04cbb03569a84960001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mSWIad3wFX2WOZsT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:20 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6BE09D64AD; Tue, 31 May 2016 11:53:19 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBota2031703; Tue, 31 May 2016 07:53:13 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v22 20/22] vfs: Add richacl permission checking Date: Tue, 31 May 2016 13:50:52 +0200 X-ASG-Orig-Subj: [PATCH v22 20/22] vfs: Add richacl permission checking Message-Id: <1464695454-18557-21-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 31 May 2016 11:53:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695600 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2617 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hook the richacl permission checking function into the vfs. Signed-off-by: Andreas Gruenbacher --- fs/namei.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 234f911..8780e7d 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -256,7 +257,43 @@ void putname(struct filename *name) __putname(name); } -static int check_acl(struct inode *inode, int mask) +static int check_richacl(struct inode *inode, int mask) +{ +#ifdef CONFIG_FS_RICHACL + if (mask & MAY_NOT_BLOCK) { + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) + goto no_acl; + /* no ->get_richacl() calls in RCU mode... */ + if (is_uncached_acl(base_acl)) + return -ECHILD; + return richacl_permission(inode, richacl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct richacl *acl; + + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = richacl_permission(inode, acl, mask); + richacl_put(acl); + return error; + } + } +no_acl: +#endif + if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | + MAY_CHMOD | MAY_SET_TIMES)) { + /* File permission bits cannot grant this. */ + return -EACCES; + } + return -EAGAIN; +} + +static int check_posix_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL if (mask & MAY_NOT_BLOCK) { @@ -294,11 +331,24 @@ static int acl_permission_check(struct inode *inode, int mask) { unsigned int mode = inode->i_mode; + /* + * With POSIX ACLs, the (mode & S_IRWXU) bits exactly match the owner + * permissions, and we can skip checking posix acls for the owner. + * With richacls, the owner may be granted fewer permissions than the + * mode bits seem to suggest (for example, append but not write), and + * we always need to check the richacl. + */ + + if (IS_RICHACL(inode)) { + int error = check_richacl(inode, mask); + if (error != -EAGAIN) + return error; + } if (likely(uid_eq(current_fsuid(), inode->i_uid))) mode >>= 6; else { if (IS_POSIXACL(inode) && (mode & S_IRWXG)) { - int error = check_acl(inode, mask); + int error = check_posix_acl(inode, mask); if (error != -EAGAIN) return error; } -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1555C7CB8 for ; Tue, 31 May 2016 06:53:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EE7CAC003 for ; Tue, 31 May 2016 04:53:29 -0700 (PDT) X-ASG-Debug-ID: 1464695606-04cb6c2dbba70ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2Oxw9gDpdns33snq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:27 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B64D3B70B; Tue, 31 May 2016 11:53:26 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBota3031703; Tue, 31 May 2016 07:53:20 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v22 21/22] ext4: Add richacl support Date: Tue, 31 May 2016 13:50:53 +0200 X-ASG-Orig-Subj: [PATCH v22 21/22] ext4: Add richacl support Message-Id: <1464695454-18557-22-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 31 May 2016 11:53:26 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695607 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11569 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" Support the richacl permission model in ext4. The richacls are stored in "system.richacl" xattrs. Richacls need to be enabled by tune2fs or at file system create time. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/Kconfig | 11 +++++ fs/ext4/Makefile | 1 + fs/ext4/file.c | 3 ++ fs/ext4/ialloc.c | 11 ++++- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 ++ fs/ext4/richacl.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ext4/richacl.h | 40 ++++++++++++++++ fs/ext4/xattr.c | 7 +++ include/linux/acl.h | 15 ++++++ 10 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 include/linux/acl.h diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index b46e9fc..4e21c18 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig @@ -22,6 +22,17 @@ config EXT3_FS_POSIX_ACL This config option is here only for backward compatibility. ext3 filesystem is now handled by the ext4 driver. +config EXT4_FS_RICHACL + bool "Ext4 Rich Access Control Lists" + depends on EXT4_FS + select FS_RICHACL + help + Richacls are an implementation of NFSv4 ACLs, extended by file masks + to cleanly integrate into the POSIX file permission model. To learn + more about them, see http://www.bestbits.at/richacl/. + + If you don't know what Richacls are, say N. + config EXT3_FS_SECURITY bool "Ext3 Security Labels" depends on EXT3_FS diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index f52cf54..1fb7f11 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -14,3 +14,4 @@ ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o ext4-$(CONFIG_EXT4_FS_ENCRYPTION) += crypto_policy.o crypto.o \ crypto_key.o crypto_fname.o +ext4-$(CONFIG_EXT4_FS_RICHACL) += richacl.o diff --git a/fs/ext4/file.c b/fs/ext4/file.c index df44c87..6e7b4b9 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -30,6 +30,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" /* * Called when an inode is released. Note that this is different @@ -717,6 +718,8 @@ const struct inode_operations ext4_file_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 3da4cf8..5bd382a 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -27,6 +27,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" #include @@ -729,6 +730,14 @@ out: return ret; } +static inline int +ext4_new_acl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + if (IS_RICHACL(dir)) + return ext4_init_richacl(handle, inode, dir); + return ext4_init_acl(handle, inode, dir); +} + /* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both @@ -1093,7 +1102,7 @@ got: if (err) goto fail_drop; - err = ext4_init_acl(handle, inode, dir); + err = ext4_new_acl(handle, inode, dir); if (err) goto fail_free_drop; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f7140ca..7b8d96f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -37,10 +37,10 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "xattr.h" -#include "acl.h" #include "truncate.h" #include @@ -5183,8 +5183,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) ext4_orphan_del(NULL, inode); if (!rc && (ia_valid & ATTR_MODE)) - rc = posix_acl_chmod(inode, inode->i_mode); - + rc = acl_chmod(inode); err_out: ext4_std_error(inode->i_sb, error); if (!error) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index ec4c399..09e36b7 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -38,6 +38,7 @@ #include "xattr.h" #include "acl.h" +#include "richacl.h" #include /* @@ -3893,6 +3894,8 @@ const struct inode_operations ext4_dir_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; @@ -3904,4 +3907,6 @@ const struct inode_operations ext4_special_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, }; diff --git a/fs/ext4/richacl.c b/fs/ext4/richacl.c new file mode 100644 index 0000000..0c316ff --- /dev/null +++ b/fs/ext4/richacl.c @@ -0,0 +1,134 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author: Aneesh Kumar K.V , + * Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#include +#include +#include + +#include "ext4.h" +#include "ext4_jbd2.h" +#include "xattr.h" +#include "acl.h" +#include "richacl.h" + +struct richacl * +ext4_get_richacl(struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + void *value = NULL; + struct richacl *acl = NULL; + int retval; + + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); + if (retval > 0) { + value = kmalloc(retval, GFP_NOFS); + if (!value) + return ERR_PTR(-ENOMEM); + retval = ext4_xattr_get(inode, name_index, "", value, retval); + } + if (retval > 0) + acl = richacl_from_xattr(&init_user_ns, value, retval, -EIO); + else if (retval != -ENODATA && retval != -ENOSYS) + acl = ERR_PTR(retval); + kfree(value); + + return acl; +} + +static int +__ext4_remove_richacl(handle_t *handle, struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + int retval; + + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + NULL, 0, 0); + if (!retval) + set_cached_richacl(inode, NULL); + return retval; +} + +static int +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + umode_t mode = inode->i_mode; + int retval, size; + void *value; + + if (richacl_equiv_mode(acl, &mode) == 0) { + inode->i_ctime = ext4_current_time(inode); + inode->i_mode = mode; + ext4_mark_inode_dirty(handle, inode); + return __ext4_remove_richacl(handle, inode); + } + + mode &= ~S_IRWXUGO; + mode |= richacl_masks_to_mode(acl); + + size = richacl_xattr_size(acl); + value = kmalloc(size, GFP_NOFS); + if (!value) + return -ENOMEM; + richacl_to_xattr(&init_user_ns, acl, value, size); + inode->i_mode = mode; + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + value, size, 0); + kfree(value); + if (retval) + return retval; + + set_cached_richacl(inode, acl); + + return 0; +} + +int +ext4_set_richacl(struct inode *inode, struct richacl *acl) +{ + handle_t *handle; + int retval, retries = 0; + +retry: + handle = ext4_journal_start(inode, EXT4_HT_XATTR, + ext4_jbd2_credits_xattr(inode)); + if (IS_ERR(handle)) + return PTR_ERR(handle); + + if (acl) + retval = __ext4_set_richacl(handle, inode, acl); + else + retval = __ext4_remove_richacl(handle, inode); + + ext4_journal_stop(handle); + if (retval == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry; + return retval; +} + +int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + struct richacl *acl = richacl_create(&inode->i_mode, dir); + int error; + + error = PTR_ERR(acl); + if (!IS_ERR_OR_NULL(acl)) { + error = __ext4_set_richacl(handle, inode, acl); + richacl_put(acl); + } + return error; +} diff --git a/fs/ext4/richacl.h b/fs/ext4/richacl.h new file mode 100644 index 0000000..6fe9a92 --- /dev/null +++ b/fs/ext4/richacl.h @@ -0,0 +1,40 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author Aneesh Kumar K.V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef __FS_EXT4_RICHACL_H +#define __FS_EXT4_RICHACL_H + +#include + +#ifdef CONFIG_EXT4_FS_RICHACL + +extern struct richacl *ext4_get_richacl(struct inode *); +extern int ext4_set_richacl(struct inode *, struct richacl *); + +extern int ext4_init_richacl(handle_t *, struct inode *, struct inode *); + +#else /* CONFIG_EXT4_FS_RICHACL */ + +#define ext4_get_richacl NULL +#define ext4_set_richacl NULL + +static inline int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + return 0; +} + +#endif /* CONFIG_EXT4_FS_RICHACL */ +#endif /* __FS_EXT4_RICHACL_H */ diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index e79bd32..e5ca483 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -55,6 +55,7 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "ext4.h" #include "xattr.h" @@ -97,6 +98,9 @@ static const struct xattr_handler *ext4_xattr_handler_map[] = { #ifdef CONFIG_EXT4_FS_SECURITY [EXT4_XATTR_INDEX_SECURITY] = &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + [EXT4_XATTR_INDEX_RICHACL] = &richacl_xattr_handler, +#endif }; const struct xattr_handler *ext4_xattr_handlers[] = { @@ -109,6 +113,9 @@ const struct xattr_handler *ext4_xattr_handlers[] = { #ifdef CONFIG_EXT4_FS_SECURITY &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + &richacl_xattr_handler, +#endif NULL }; diff --git a/include/linux/acl.h b/include/linux/acl.h new file mode 100644 index 0000000..3c3b5ce --- /dev/null +++ b/include/linux/acl.h @@ -0,0 +1,15 @@ +#ifndef __LINUX_ACL_H +#define __LINUX_ACL_H + +#include +#include + +static inline int +acl_chmod(struct inode *inode) +{ + if (IS_RICHACL(inode)) + return richacl_chmod(inode, inode->i_mode); + return posix_acl_chmod(inode, inode->i_mode); +} + +#endif -- 2.5.5 From agruenba@redhat.com Tue May 31 06:53:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 541837D01 for ; Tue, 31 May 2016 06:53:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE8E8AC004 for ; Tue, 31 May 2016 04:53:35 -0700 (PDT) X-ASG-Debug-ID: 1464695614-04cbb03568a849c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PSJpxyCEKKaDAgqE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 04:53:34 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B148028A48; Tue, 31 May 2016 11:53:33 +0000 (UTC) Received: from nux.redhat.com (vpn1-6-182.ams2.redhat.com [10.36.6.182]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VBota4031703; Tue, 31 May 2016 07:53:27 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v22 22/22] ext4: Add richacl feature flag Date: Tue, 31 May 2016 13:50:54 +0200 X-ASG-Orig-Subj: [PATCH v22 22/22] ext4: Add richacl feature flag Message-Id: <1464695454-18557-23-git-send-email-agruenba@redhat.com> In-Reply-To: <1464695454-18557-1-git-send-email-agruenba@redhat.com> References: <1464695454-18557-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 31 May 2016 11:53:33 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464695614 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5592 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" This feature flag selects richacl instead of POSIX ACL support on the filesystem. When this feature is off, the "acl" and "noacl" mount options control whether POSIX ACLs are enabled. When it is on, richacls are automatically enabled and using the "noacl" mount option leads to an error. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 6 ++++-- fs/ext4/super.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index b84aa1c..ff48f07 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1126,7 +1126,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */ #define EXT4_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */ #define EXT4_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ -#define EXT4_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ +#define EXT4_MOUNT_ACL 0x08000 /* Access Control Lists */ #define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000 /* No auto delalloc mapping */ #define EXT4_MOUNT_BARRIER 0x20000 /* Use block barriers */ #define EXT4_MOUNT_QUOTA 0x80000 /* Some quota option set */ @@ -1707,6 +1707,7 @@ static inline int ext4_encrypted_inode(struct inode *inode) #define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3-lvl htree */ #define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000 /* data in inode */ #define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 +#define EXT4_FEATURE_INCOMPAT_RICHACL 0x20000 #define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \ static inline bool ext4_has_feature_##name(struct super_block *sb) \ @@ -1821,7 +1822,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, ENCRYPT) EXT4_FEATURE_INCOMPAT_MMP | \ EXT4_FEATURE_INCOMPAT_INLINE_DATA | \ EXT4_FEATURE_INCOMPAT_ENCRYPT | \ - EXT4_FEATURE_INCOMPAT_CSUM_SEED) + EXT4_FEATURE_INCOMPAT_CSUM_SEED | \ + EXT4_FEATURE_INCOMPAT_RICHACL) #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 3822a5a..122410f 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1306,6 +1306,28 @@ static ext4_fsblk_t get_sb_block(void **data) return sb_block; } +static int enable_acl(struct super_block *sb) +{ + sb->s_flags &= ~(MS_POSIXACL | MS_RICHACL); + if (test_opt(sb, ACL)) { + if (EXT4_HAS_INCOMPAT_FEATURE(sb, + EXT4_FEATURE_INCOMPAT_RICHACL)) { +#ifdef CONFIG_EXT4_FS_RICHACL + sb->s_flags |= MS_RICHACL; +#else + return -EOPNOTSUPP; +#endif + } else { +#ifdef CONFIG_EXT4_FS_POSIX_ACL + sb->s_flags |= MS_POSIXACL; +#else + return -EOPNOTSUPP; +#endif + } + } + return 0; +} + #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3)) static char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n"; @@ -1452,9 +1474,9 @@ static const struct mount_opts { MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_user_xattr, EXT4_MOUNT_XATTR_USER, MOPT_SET}, {Opt_nouser_xattr, EXT4_MOUNT_XATTR_USER, MOPT_CLEAR}, -#ifdef CONFIG_EXT4_FS_POSIX_ACL - {Opt_acl, EXT4_MOUNT_POSIX_ACL, MOPT_SET}, - {Opt_noacl, EXT4_MOUNT_POSIX_ACL, MOPT_CLEAR}, +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + {Opt_acl, EXT4_MOUNT_ACL, MOPT_SET}, + {Opt_noacl, EXT4_MOUNT_ACL, MOPT_CLEAR}, #else {Opt_acl, 0, MOPT_NOSUPPORT}, {Opt_noacl, 0, MOPT_NOSUPPORT}, @@ -1502,6 +1524,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, #endif switch (token) { case Opt_noacl: +#ifdef CONFIG_EXT4_FS_RICHACL + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RICHACL)) { + ext4_msg(sb, KERN_ERR, "Mount option \"%s\" incompatible " + "with richacl feature", opt); + return -1; + } +#endif case Opt_nouser_xattr: ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5"); break; @@ -3274,8 +3303,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) set_opt(sb, NO_UID32); /* xattr user namespace & acls are now defaulted on */ set_opt(sb, XATTR_USER); -#ifdef CONFIG_EXT4_FS_POSIX_ACL - set_opt(sb, POSIX_ACL); +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + set_opt(sb, ACL); #endif /* don't forget to enable journal_csum when metadata_csum is enabled. */ if (ext4_has_metadata_csum(sb)) @@ -3358,8 +3387,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_iflags |= SB_I_CGROUPWB; } - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto failed_mount; if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV && (ext4_has_compat_features(sb) || @@ -4673,8 +4703,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) ext4_abort(sb, "Abort forced by user"); - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto restore_opts; es = sbi->s_es; -- 2.5.5 From billodo@redhat.com Tue May 31 07:10:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C51587CCB for ; Tue, 31 May 2016 07:10:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84C0C30404E for ; Tue, 31 May 2016 05:10:15 -0700 (PDT) X-ASG-Debug-ID: 1464696610-04bdf05ad7a96e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 07a35DB5EktSxD9b (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 05:10:11 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AFCFC619FE; Tue, 31 May 2016 12:10:10 +0000 (UTC) Received: from redhat.com (vpn-61-108.rdu2.redhat.com [10.10.61.108]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VCA8MS003482 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 31 May 2016 08:10:10 -0400 Date: Tue, 31 May 2016 07:10:07 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method Message-ID: <20160531121007.GA7513@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method References: <1463085496-17919-1-git-send-email-billodo@redhat.com> <20160530053710.GO26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160530053710.GO26977@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 31 May 2016 12:10:10 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464696611 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2119 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, May 30, 2016 at 03:37:10PM +1000, Dave Chinner wrote: > On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: > > This patch is a further optimization of secondary sb search, in order to > > handle non-default geometries. Once again, use a similar method to find > > fs geometry as that of xfs_mkfs. Refactor verify_sb(), creating new > > sub-function that checks sanity of agblocks and agcount: verify_sb_blocksize(). > > > > If verify_sb_blocksize verifies sane paramters, use found values for the sb > > search. Otherwise, try search with default values. If these faster methods > > both fail, fall back to original brute force slower search. > > > > NOTE: patch series "xfs_repair: improved secondary sb search" must be > > applied before applying this patch. > > (http://oss.sgi.com/archives/xfs/2016-05/msg00269.html) > > Either this or one of the above patches is causing xfs/030 on > my xfstests runs to fail with extra output: > > xfs/030 4s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad) > --- tests/xfs/030.out 2016-04-06 11:30:45.348477421 +1000 > +++ /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad 2016-05-30 13:06:29.955682633 +1000 > @@ -11,6 +11,8 @@ > bad primary superblock - bad magic number !!! > > attempting to find secondary superblock... > +.... > +attempting to find secondary superblock... > found candidate secondary superblock... > verified secondary superblock... > ... > (Run 'diff -u tests/xfs/030.out /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad' to see the entire diff) > > Bill, can you please work up a filter or equivalent for xfstests > so that this extra output doesn't cause unnecessary failures? > Something like simply filtering all the "attempting to find > secondary superblock..." and "...." lines from the output would work > just fine - all we really care about is that a secondary sb is found > and verified, not how many steps it takes to find it... Yep. Will do. Thanks- Bill From billodo@redhat.com Tue May 31 07:12:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 382217CA2 for ; Tue, 31 May 2016 07:12:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE15E30404E for ; Tue, 31 May 2016 05:12:17 -0700 (PDT) X-ASG-Debug-ID: 1464696736-04bdf05ad7a97060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PVGBhamhMsIcLpAI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 05:12:16 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4A22D6266F; Tue, 31 May 2016 12:12:16 +0000 (UTC) Received: from redhat.com (vpn-61-108.rdu2.redhat.com [10.10.61.108]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VCCDQq005152 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 31 May 2016 08:12:15 -0400 Date: Tue, 31 May 2016 07:12:13 -0500 From: "Bill O'Donnell" To: Eric Sandeen Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method Message-ID: <20160531121213.GB7513@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: further improvement on secondary superblock search method References: <1463085496-17919-1-git-send-email-billodo@redhat.com> <20160530053710.GO26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 31 May 2016 12:12:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464696736 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2804 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, May 30, 2016 at 05:06:25PM -0500, Eric Sandeen wrote: > > > > On May 30, 2016, at 12:37 AM, Dave Chinner wrote: > > > >> On Thu, May 12, 2016 at 03:38:16PM -0500, Bill O'Donnell wrote: > >> This patch is a further optimization of secondary sb search, in order to > >> handle non-default geometries. Once again, use a similar method to find > >> fs geometry as that of xfs_mkfs. Refactor verify_sb(), creating new > >> sub-function that checks sanity of agblocks and agcount: verify_sb_blocksize(). > >> > >> If verify_sb_blocksize verifies sane paramters, use found values for the sb > >> search. Otherwise, try search with default values. If these faster methods > >> both fail, fall back to original brute force slower search. > >> > >> NOTE: patch series "xfs_repair: improved secondary sb search" must be > >> applied before applying this patch. > >> (http://oss.sgi.com/archives/xfs/2016-05/msg00269.html) > > > > Either this or one of the above patches is causing xfs/030 on > > my xfstests runs to fail with extra output: > > > > xfs/030 4s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad) > > --- tests/xfs/030.out 2016-04-06 11:30:45.348477421 +1000 > > +++ /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad 2016-05-30 13:06:29.955682633 +1000 > > @@ -11,6 +11,8 @@ > > bad primary superblock - bad magic number !!! > > > > attempting to find secondary superblock... > > +.... > > +attempting to find secondary superblock... > > Seems like the best fix is to not print that twice in the first place? The double print of that did make me wonder. I agree we should only print it once. Thanks- Bill > > -Eric > > > found candidate secondary superblock... > > verified secondary superblock... > > ... > > (Run 'diff -u tests/xfs/030.out /home/dave/src/xfstests-dev/results//xfs/xfs/030.out.bad' to see the entire diff) > > > > Bill, can you please work up a filter or equivalent for xfstests > > so that this extra output doesn't cause unnecessary failures? > > Something like simply filtering all the "attempting to find > > secondary superblock..." and "...." lines from the output would work > > just fine - all we really care about is that a secondary sb is found > > and verified, not how many steps it takes to find it... > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Tue May 31 07:14:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 195CF7CCD for ; Tue, 31 May 2016 07:14:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E00A0304048 for ; Tue, 31 May 2016 05:14:08 -0700 (PDT) X-ASG-Debug-ID: 1464696847-04cbb0356ba86350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UH5RGwGY8NOcFMPI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 05:14:07 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 41F4737E72; Tue, 31 May 2016 12:14:07 +0000 (UTC) Received: from redhat.com (vpn-53-131.rdu2.redhat.com [10.10.53.131]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VCE2CP012517 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 31 May 2016 08:14:06 -0400 Date: Tue, 31 May 2016 14:14:02 +0200 From: Carlos Maiolino To: xfs@oss.sgi.com Cc: baotiao@gmail.com Subject: Re: XFS: possible memory allocation deadlock in kmem_alloc Message-ID: <20160531121402.GA15274@redhat.com> X-ASG-Orig-Subj: Re: XFS: possible memory allocation deadlock in kmem_alloc Mail-Followup-To: xfs@oss.sgi.com, baotiao@gmail.com References: <20160530050452.GM26977@dastard> <9BD371B3-8A44-481C-B9E4-381BAE0B6B79@gmail.com> <20160531031010.GB12670@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 31 May 2016 12:14:07 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464696847 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1623 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, May 31, 2016 at 07:00:22PM +0800, 陈宗志 wrote: > can we change the existing file's extent size? > No, you can only set extent hint size for empty files, or, more precisely for files whose does not have allocated extents > On Tue, May 31, 2016 at 11:10 AM, Dave Chinner <[1]david@fromorbit.com> > wrote: > > On Tue, May 31, 2016 at 10:43:36AM +0800, 陈宗志 wrote: > > I have fint the way to change the extent size hint > > mkfs.xfs -r extsize=40960 /dev/sda1 > Ah, no, that isn't the extsize I'm refering to. That's for realtime > device configuration at mkfs, not a per-inode extent size hint. > When you create the image file do this: > $ xfs_io -f -c "extsize 1m" /path/to/new/vm_image > $ qemu-image create -f qcow2 /path/to/new/vm_image 10g > $ xfs_io -c extsize /path/to/new/vm_image > [1048576] /path/to/new/vm_image > $ > And now the qcow2 image file will have extents allocated in > multiples of 1MB. > > Cheers, > Dave. > -- > Dave Chinner > [2]david@fromorbit.com > > -- > --- > Blog: [3]http://www.chenzongzhi.info > Twitter: [4]https://twitter.com/baotiao > Git: [5]https://github.com/baotiao > > References > > 1. mailto:david@fromorbit.com > 2. mailto:david@fromorbit.com > 3. http://www.chenzongzhi.info/ > 4. https://twitter.com/#!/baotiao > 5. https://github.com/baotiao > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 07:51:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 831C67CA7 for ; Tue, 31 May 2016 07:51:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07D31AC001 for ; Tue, 31 May 2016 05:51:17 -0700 (PDT) X-ASG-Debug-ID: 1464699072-04cbb03569a88cb0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LO1qdEyZZuq5eWGe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 05:51:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7j8X-0005e4-An; Tue, 31 May 2016 12:51:09 +0000 Date: Tue, 31 May 2016 05:51:09 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, Xiao Yang , fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 8/7] xfs/122: don't break on old xfsprogs Message-ID: <20160531125109.GA17018@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/7] xfs/122: don't break on old xfsprogs References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <20160527180231.GB5050@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160527180231.GB5050@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464699073 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 90 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, but can't we also remove the workaround at the end of the the test as well? From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 07:52:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E6D37CA7 for ; Tue, 31 May 2016 07:52:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0BF80AC001 for ; Tue, 31 May 2016 05:52:01 -0700 (PDT) X-ASG-Debug-ID: 1464699119-04bdf05ad7a99cc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tQAwtPD5I6JjuVF5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 05:51:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7j9J-0005gw-DC; Tue, 31 May 2016 12:51:57 +0000 Date: Tue, 31 May 2016 05:51:57 -0700 From: Christoph Hellwig To: Gwendal Grignou Cc: Theodore Ts'o , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation Message-ID: <20160531125157.GB17018@infradead.org> X-ASG-Orig-Subj: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation References: <1437913255-7524-4-git-send-email-tytso@mit.edu> <1454361909-36538-1-git-send-email-gwendal@chromium.org> <20160202180828.GA13880@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464699119 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 313 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 27, 2016 at 09:34:50AM -0700, Gwendal Grignou wrote: > Looking at xfsprogs-4.5.0, that patch has not been applied. Did it not work? > It still applies cleanly on 4.5. It probably just got missed by Dave between all the patches on the list. Can you just resend it with my Reviewed-by tag added? From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 07:52:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5862B7CA2 for ; Tue, 31 May 2016 07:52:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B3BB8F8033 for ; Tue, 31 May 2016 05:52:15 -0700 (PDT) X-ASG-Debug-ID: 1464699132-04cb6c2dbca75370001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id v58DdCTgN1OQ4Ov1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 05:52:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7j9W-0005hR-U0; Tue, 31 May 2016 12:52:10 +0000 Date: Tue, 31 May 2016 05:52:10 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, hch@infradead.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record Message-ID: <20160531125210.GC17018@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 6/7] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424226290.6278.15051221437554845000.stgit@birch.djwong.org> <20160527032851.GB9418@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160527032851.GB9418@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464699133 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 07:52:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3FE467CB0 for ; Tue, 31 May 2016 07:52:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DFF7304048 for ; Tue, 31 May 2016 05:52:34 -0700 (PDT) X-ASG-Debug-ID: 1464699153-04cbb03569a88e00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bK3n7xWpH3nL4REY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 05:52:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7j9r-0005j9-UH; Tue, 31 May 2016 12:52:31 +0000 Date: Tue, 31 May 2016 05:52:31 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, hch@infradead.org, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] tests: don't put loop control files on the scratch mount Message-ID: <20160531125231.GD17018@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] tests: don't put loop control files on the scratch mount References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <146424223512.6278.15231849939938178494.stgit@birch.djwong.org> <20160527032804.GA9418@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160527032804.GA9418@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464699153 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From hecmxon@dell.com Tue May 31 08:35:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,WEIRD_QUOTING autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6668F7CA2 for ; Tue, 31 May 2016 08:35:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE6B6AC001 for ; Tue, 31 May 2016 06:35:21 -0700 (PDT) X-ASG-Debug-ID: 1464701715-04cbb03569a8b840001-NocioJ Received: from dell.com ([221.227.2.238]) by cuda.sgi.com with ESMTP id y3HgFYI1mXoD6Lx2 for ; Tue, 31 May 2016 06:35:17 -0700 (PDT) X-Barracuda-Envelope-From: hecmxon@dell.com X-Barracuda-Effective-Source-IP: UNKNOWN[221.227.2.238] X-Barracuda-Apparent-Source-IP: 221.227.2.238 Received: from ntvca (unknown [149.10.241.189]) by dell.com with SMTP id aimZvoyC4oblvwna.1 for ; Tue, 31 May 2016 21:13:25 +0800 Date: Tue, 31 May 2016 21:13:20 +0800 From: "gwmpug" To: xfs Subject: =?gb2312?B?xvPStbyo0Ke/vLrL0+vQvbPqzOXPtcno04s=?= X-Priority: 3 X-ASG-Orig-Subj: =?gb2312?B?xvPStbyo0Ke/vLrL0+vQvbPqzOXPtcno04s=?= X-Mailer: Foxmail 6, 13, 102, 15 [cn] Mime-Version: 1.0 Message-ID: <201605312113252038556@dell.com> Content-Type: multipart/alternative; boundary="----=_000_NextPart113217562881_=----" X-Barracuda-Connect: UNKNOWN[221.227.2.238] X-Barracuda-Start-Time: 1464701717 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15700 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, RDNS_NONE, WEIRD_QUOTING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 WEIRD_QUOTING BODY: Weird repeated double-quotation marks 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This is a multi-part message in MIME format. ------=_000_NextPart113217562881_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 DQozRdC918rJ6NOLo6jS1I2Ptqi8iaGi0tTIy7aotbWjqcVjvbG98KGizOGzycXg0bUNCg0KDQqh vsqxvOS12LXjob8gMjAxNsTqNdTCMjgtMjnI1SDJz7qjICAgIDbUwjE4LTE5yNUgye7b2g0Kob6y zrzTttTP86G/IL/KzfvSjre2us3M4cn9yMvBptfK1LTQvbPqudzA7bXEtq3KwrOkoaK/gqOouLGj qb6twO2hoiBIUtfcvOChor6twO2ju9C918q4o8D7vq3A7aGi16iGVKO7uN+y472bwO21yIWivNOh ow0Kob7K2r/Ot73KvaG/IL2yyqbWdsraICsgytPGtdHd0u8gKyCwuMD90dDM1iArvcfJq7Dn0d0g KyDWdsqmtePGwA0Kob7Rp8+wt9HTw6G/IDQ1MDDUqi8xyMujqLqsv86zzL2y0uWhotTnteOhos7n ss2hosuwt9GhorLoteO1yKOssqK6rNPQg3LWtTIwMDDUqrXEM0XQvdfK1E+8xsjtvP4xzNejqQ0K ob6z0LDstaXOu6G/ILLFIL6tIMXgING1IL5XIA0Kob60udGvn+HP36G/IDAyMC0tLTg2NDE5NTEw IDsgIDg2NDE2NTM5ICAgwdbPyMn6ICAg0e7Qob3jICAgDQoNCg0KICAzUCDQvbPqudzA7aOsvLS4 2s670L2z6qOoUGF5IGZvciBQb3NpdGlvbqOpoaIguPbIy7y8xNzQvbPqo6hQYXkgZm9yIFBlcnNv bqOpILrNvKjQp9C9s+qjqFBheSBmb3IgUGVyZm9ybWFuY2WjqaOs0+vVxcrYtLrAz8qmyte0tLXE M0XQvdfKudzA7aOsvLSjqM3isr+++briRXh0ZXJuYWwgRXF1aXR5LCDE2rK/vvm64kludGVybmFs IEVxdWl0eSwguPbM5b75uuJJbmRpdmlkdWFsIEVxdWl0eaOp1NrKtdbKyc/Kx9K70fm1xKOstrzK x8bz0rXQvbPqzOXPtdRPvMa1xNPQ0Kehosflzvq6zbzytaXS19DQtcS3vbeooaMNCrG+1W6zzLzm ucuDydbWxKPKvaOsvczE+tXGztW5+utIufrE2tfuuea3trXE0L2z6sno04u3vbeoo6yzyc6qz+DT prXE16iYSdXfoaPVbrPMuKjS1LTzwb+wuMD9o6zU2rXa0rvM7NGnhlTQ6NfUtPixytObsb6158RY o6zT0NK70KHKsbXEwbfPsKGjDQogDQqhvr/Os8y0875Wob8gDQq12tK7sr+31iDQvbPqzOXPtb/y vNwNCjKhotC9s+q1xLmrxr26zbykwPjI57rOz7i7r7rNwO294g0KM6GiyrLDtMrHyKvD5tC9s+q5 3MDtDQo0oaLQvbPq83fPtbXEmIuzyaOsucy2qMrVyOuhorHkhNPK1cjrtcTJ6LzGt723qA0KNaGi yOe6zsGqz7W5q8u+xNqyv9X+st/T683isr/K0Ij2DQo2oaLUT7aoxr21yKGiuILV+dPrvKTA+M/g veG6z7XE1ri1vLe91esNCjehotC9s+rKtdtgz9bXtLrN1La+sMS/mMsNCrXatv6yv7fWIDNF0L3X ytRPvMbA7cTuDQo4oaIzUKOsvLTWsM670L2z6qGiuPbIy6OoxNzBpqOp0L2z6qGiv4PQp9C9s+qj rMbkyejTi8u8wrfWdr3iDQo5oaIzRdC918rzd8+1o6y8tM3isr+++brioaLE2rK/vvm64qGiuPbM 5b75uuK1xMno04vLvMK3oaMNCjEwoaLOpbe0M0WjqLvyM1CjqdC918rA7cTuo6y74bj4xvPStbT4 wLS1xM+3vue7r9Owz+yjqM7lgoDQobC4wP2jqQ0KMTGhotProbDQvbXj1sahsaGiobAzUMDtwtuh sbXI0L2z6snovMbLvMK3z+CxyN1eo6yhsDNFobHA7cTuz9TW+LXEg57KxrrNubLQ1Lj3ysfKssO0 DQq12sj9sr+31iDE2rK/vvm64tDUo6y42s67suLGwCCjqLvyjKbTpjNQ0L2z6qOsvs3Kx9awzrvQ vbPqIChwYXkgZm9yIHBvc2l0aW9uKaOpDQoxMqGiyOe6zrj5k/642s67vNvWtaOsttS42s671E+2 qMbkuN+1zbK7zay1xLmk2Vm8trHwo6jS1Ljatqi8iaOpDQoxM6Giy8TW1rriwb+Nj867vNvWtbXE t723qA0KMTShosTasr+++britcTKwL3n1qrD+7XEuavKvQ0KMTWhovxj1rW3qKOocG9pbnQtZmFj dG9yo6m42s67nHnGwNKqy9i+2cD9o6jM4bmpMzC49rjazrucecbA0qrL2KOpDQoxNqGi0aGy4tR1 0qrL2LXEyP249tSthHQNCjE3oaKy4sbAx7CjrNGh1PHqULz8uNrOu7XEyP249tSt1PINCjE4oaK4 2s67nHnGwLXEwfm49rK91ugNCjE5oaK42s67nHnGwNHdwbejqLDruPbQoZVyo6kNCjIwoaLI57rO 08O72LnplE26z9Cj0em42s67suLGwLXEveG5+8rHt/Gcysi3DQoyMaGiuPm+3Zx5xsC94bn7o6y9 b7jazrvUT7aouaTXyry2hGWjrNf2s/bWsLy2zbyjqEdyYWRpbmcgTWF0cml4o6kNCjIyoaLCmry2 zbzU2tXQxrihor36yf26y7aouaTXytbQtcTTw82+DQoyM6GijY/Ou7Li1HW1xNCh1+m4w8jnus65 ubPJo6yw/MCoyrLDtLPJ1LENCrXay8Syv7fWIMbz0rXQvbPq83fPtcnovMYgo6jN4rK/vvm64rXE yei8xqOpDQoxo66497yJuaTXyu5+tsiYy9e8tcTJ6NOLDQoyNKGi1E+2qNC9s+q1yLy283fPtbXE sMuCgMq108O1xLK91ugNCjI1oaLSu4KAxvPStbjjtuDJ2byJuaTXyrrDDQoyNqGivLay7rXEvMbL 47mryr28sMqyw7QNCjI3oaK8trHw1+7Qoda1oaLW0LXj1rWhotfutPPWtbXE1E+8xrDst6iho7fW mW61xN5rt6ihow0KMjihory2t/m2yLXEuavKvbrNuebCyaOsuPmT/rj2zOXStbyosu7S7MC0yejT iw0KMjmhosG9vLa5pNlZtcTW2LX+tsi1xLmryr2jrMjnus7UT7aoo6y8sMbk07DtkQ0KMzChor3o 16HK0Ij2uaTXysr9k/7AtMno04u78rHIvc+jqNCj8p6horX31fujqaxG09C5pNfKx/q+gKOouPe8 ttbQtePBrL6Ao6m1xLe9t6iho7uts/bG85hJ0L3Xysf6z9/T68rQs6G497fWzrvH+r6ADQozMaGi wezPyKGi1s2689X+st+1xMnotqi6zd9c08MNCjMyoaKyu82s0PLB0KOoudzA7brN1rDE3NDywdCh ory8yvXQ8sHQoaLJ+rP20PLB0LXIo6m1xNC918q1yLyJserXvLXEyejTi7XEt723qA0KMzOhosq1 wP2jqNaqw/vG89K1o6kNCjKjrMrQs6HQvdlZtfey6Q0KMzShosjnus7X9srQs6HQvdfK1Xuy6aOs 1PXDtLbBytCI9rGouOYNCjM1oaLTsO2Rus2+9rao0ru49rjazrvK0Ij20L3XyrzbuPG437XNtcTL xIKA0vLL2A0KMzahosrQs6G31s671rXKx8qyw7S4xcTuo6zI57rOyrnTw7W919S8urXEzOXPtdbQ DQozo6zI57rO16vQtMbz0rXQvbPq1sa2yKOosPzAqLDLuPayv7fWo6mjrMq1wP0NCrXazuWyv7fW IIKAyMujqMTcwaajqdC9s+ogKHBheSBmb3IgcGVyc29uKQ0KMzehosjnus7P4LbUwb+7r7XYzqq4 2s67yc+1xLK7zay49sjLo6zJ6LaoxuTQvdlZtbXOuw0KMzihorbU09rXqNK1udzA7dDywdC78ry8 0GfQ8sHQyMuGVKOsvejW+qGwyqTIzsGmxKPQzaGxwLTUT7aoyMuGVLXEvLax8LrNmW7Ouw0KMzmh osjnus7X9rjazru1xMqkyM7BpsSj0M2jqNax016hooyN08OjqaOsjI3A/aGjDQoxo6y2qNC9DQo0 MKGiyOe6ztPDy/nJ6LzGtcTQvdfKx/q+gL3hmIvOqtDCwLS1xMjLtqjQvQ0KNDGhotXQxrjKsaGw 0L3Xysy4xdChsaOo2am826OptcTI/dXQDQo0MqGitfe42qGivfrJ/cjL1LG199C9DQo0M6GiveK+ 9tC9s+rLrsa9tc3T2rHq17y1xMjL1LGjqL5HyKajqbXEv8bRp7rPwO23vbeoDQo0NKGiveK+9tC9 s+rLrsa9s6yx6rXEyMvUsaOouuzIpqOptcTKrrdOt723qA0KNDWhoszhx7DWp7i2tci068qpDQoy o668qNCnuaTXysVjxOrW1b2xIChwYXkgZm9yIHBlcmZvcm1hbmNlKQ0KNDahor+D0Ke5pNlZscjA /bXEyei2qA0KNDehorv509q/vLrLveG5+6OsvMbL47yo0Ke5pNfKtcSw7LeoDQo0OKGitNPQvbPq zOXPtcnPsdzD4rK/w8W+rcDtzqrBy9X5yKG8qNCnuaTXyrb4xrTD/L1vz8LK9LTyuN+31g0KNDmh osTq1tW9scjnus68yMVjxvPStdK1vKiS7Lmzo6zT1sVjuPbIy7Htz9a50rmzo6zKtcD91na94g0K NTChosTq1tWqhMnotqi1xI7X1tbT0NCntcS5q8q9o6iPxNfczOW31rj4goDIy6OpDQozLrX30L0N CjUxoaK9+sn9tffQvaGi0rW/g7X30L2hor1Zubm7r7X30L0NCjUyoaLE6rbI1XvQvbzm7pnStb+D us3P1tPQgoDIy8rVyOvLrsa9tcSw7Leoo6zS1ENS83fP1s/W09DQvdfKy67GvQ0KNTOhor3o16FD UqOsyei2qNPQ0KehooyN08O1xMTqtsjVe9C9vtjqhw0KNTShotPDtffQvb7Y6oe4+MirhlTJ6Lao tffQvaOosLTUpMvjo6mjrMq1wP3R3b6aDQo1NaGitffQvcjnus6/2NbGs8mxvg0KtdrB+bK/t9Yg v+20+NC9s+ogDQo1NqGivLzE3Lmk18qjqHNraWxsLWJhc2Vko6m1xMnovMa6zYOetePIsfxjysfK ssO0DQo1N6GijJK3+dC918q9Wbm5us2C982zuNrOu9C92Vm94bm5tcTZfLXEhV6x8LrNyrnTw7e9 t6gNCjU4oaKMkrT40L2z6sno04vKtcD9DQq12sbfsr+31iDE6tC91sbFY7jfudzIy9SxvKTA+A0K NTmhorjfudzIy4ZUtcTE6tC91sa94ZiLDQo2MKGiuN+53MjL1LG1xMTq1tW087buvbG98LXE1E+8 xtPrv7y6y7eit8WjqMq1wP2jqQ0Ktdqwy7K/t9YgucnIqLykwPgNCjYxoaK5ybarucnIqL2xwPi3 vbC4o6i087nJtqveRMjDo6kNCjYyoaLP3tbG0NS5ycaxt72wuA0KNjOhooyNucm8pMD4t72wuA0K NjShosbayKi8pITut72wuA0KNjWhorfWuuzQzcyTxOK5yZngt72wuA0KNjahotTaucnIqLnJxrG3 1sXklXK1xLaoyMu2qMG/DQq12r7Fsr+31iDQvbPqudzA7dPrnM/NqA0KNjehorK/6VS+rcDt06bT 0LXE0L3XyrncwO2Z4M/eDQo2OKGiyOe6ztf2usPQvbPqsaPD3A0KNjmhormk18rM9bXIvNPHv9C9 18qcz82otcTK1rbOo6zI57rOg567rw0KNzChosjnus7Tw8j91ta++bri0NS1xNStwO2jqDNFo6nI pb3iys26zbm1zai5pNfKDQrVxcDPjp/L+df318nRr7C4wP21xIyNvMrVucq+oaK9sr3iDQogDQqh voyjvNK96cncob8gj4jK2LS6DQqxs76wo7oNCjGhojE5OTTE6qOsroXStdPax+XIQbTz0afrirv6 z7WjrMvmuvO9+MjrwpO6z8D7u6qjqNbQufqjqbTTysLIy8Gm18rUtLmk1/ejuw0KMqGiMTk5N8Tq o6y4sMPAufrQwtTzzvfW3cGitPPRp9GnwZWjrMjLwabXytS0udzA7bRUyr+juw0KM6Gi1NrDwLn6 xtq85KOstaPIzsDK0ba8r4hGyMvBptlZ1LTX3LK/o6jOu9Paw8C5+tDC1PPO99bdo6nQvdfKudzA 7b6twO2juw0KNKGiu9i5+rrzo6zA+sjOzajTw4f4vMqhosvRuvyhokNoaW5hUmVutcjWqsP7xvPS tUhSuN+916Osu6rMqbGj61XIy8Gm2VnUtNfcvOCjuw0KNaGix+W7qrTzjFe/zdf5vczK2qGjz8i6 85P6yM7QwsDLzfihotDCu6rIy8rZoaLO5bVWvK/NxbXItPPQzcbzmEm1xEhSucvOyqGjDQo2oaLK rsTq1qrD+83ixvPIy8Gm18rUtLncwO29m9Hpo6zKrsTqh/jE2rj3wODG89K1tcTQvbPq18nUg8no 04u+rdHpoaPT0LfhuLu1xM3ixvOhoof4xvOhosPxxvO1xMq1kfC6zdfJ1IO+rdHpo6y24LTOsbu5 +oPIyKjN/rv6ubnUdc6q1tCH+Nfuvt/KtdW90NTF4NG1jp+how0KN6Giyte0tKGwM0XQvdfKzOXP taGxo6zIw7i063O1xNC9s+q53MDtseS1w7qGtaWhooyN08Ohor/G0aehotaxuduho+lft6KhsDNF 0L3ZWcjtvP6hsaOsyMPQvbPqyejTi7fWyq6yvc3qs8mhow0Kj4jK2LS6wM/KpsrHufqDyKGwM0XQ vdfKyei8xqGxwO3E7rrNvLzK9bXEtLTKvMjLo6zW0Ln60L2z6snovMbZWcnujKO80qOsysfX7tTn 0ru97MH0w8DIy8Gm18rUtLncwO3Rp7RUyr+jrK6F0rXT2sPAh/jQwtTzzvfW3cGitPOMV8jLwabZ WdS0udzA7bRUyr+jrMPAufrQvdfKhWa74bvhhlSjrNPQvfy2/squxOq1xMjLwabXytS0udzA7brN 18nRr76t0emjrM/IuvOT+sjOwaq6z8D7yEGhosDK0425q8u+yMvBptfK1LSjqMPAh/jX3LK/o6mj rM2o08Prisb3oaJDaGluYVJlbr5X1b6horuqzKmxo8/VuavLvsjLwabXytS019y84LrNvZvA7aOs 1Pi1o8jO0MLAy834oaLQwruqyMuJ26GizuW1VryvzcXT0MmrvfDK9Lmry761xMjLysLumc7KoaPU +LG730LQ+MbAzqq24MTqtsjIq7n6yq680cXg05bKpqGiyq680cjLwabZWdS0xeDRtY6foaPVxcDP yqbW972ytcTQvbPq83fPtcnovMa6zbncwO2/zrPMo6zKtdW9yrXTw6OsytrVbrfnuPHH4cvJ09DI pKOs1W6zzJhPvt/KtdW9oaKy2df30NS6zcq108PQ1KOs1Nq5+sTat+fQ0NLRvsOjrL2yytrS0dPi yP2w2bOho6zRp9Sx0+LN8sjLo6zJ7src0aeGVLrDxsCjrNLUyrXTw9DUvPuzpKGjsqLU+M6qz8LK 9o7Xyq680sbz0rXM4bmp0L2z6qGiv4PQp7XE18nUg8novMajutbQufrS+NDQsbG+qc73s8fWp9DQ oaLW0Lqj0826o9HzuaSzzLy8yvW5q8u+o6jQvbPqoaK/g9Cno6mhoszsvfKjqMC2s7KjqbXnwaa9 qMnovK/Nxbmry76horn6vNK1575Xz8LK9MbVyPDLuc2ouaSzzLy80GfT0M/euavLvqGi1tC5+tK9 y468r83Fo6yMksGsyq63vb/GvLy5q8u+o6jN+NW+o6mhotDCwMu+V6Giu938Y7/GvLyjqM341b6j qaGi1de+U7/GvLyhotbQzeLfXKOov9XUy6OpvK+IRqGiw/HJ+sjLytmhotDFxbW5q+pQuavLvqGi INOiy/e158b4oaLFt8qxwaa3/tewoaLW0If4ur2/1b+C1LozMTDL+aGitO/A+7yvzcWhosfgjXWz x7eivK/NxaGisbG+qczsyPO98LDZyczDs7mry76horn6taTSvcuOz/rK27mry76horrP1trfX8jt vP65q8u+oaLW0Ln6u6+5pNDFz6K1yKGjDQrVxcrYtLrAz8qmvt/T0NC9s+ruSdPytcTXqJhJ0dC+ v7mmtde6zbfhuLu1xM3ixvOhorn6xvOhosPxxvO1xMq11b26zdfJ1IO+rdHpo6zV+7rPwcvP1rT6 wffQ0LXEoaLSjre2tcTQvdlZyei8xry8yvWjrM3Gs/bXydGvyr2hsDNF0L3ZWcnovMahsbXEysq2 yL/tt/m1xNC9s+rM5c+1yei8xrXExrfFxtVus8yhow0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgICAgICAgICAg ICAgIIjzICDD+6Ghu9ggINa0DQoNCg0Kx+uMotLUz8KxqMP7se2DyMjdzO7QtLrzt6JFLU1BSUy1 vTpkYW9wdTAyMEAxNjMuY29tDQoNCiAgICAgICAgIA0KyrG85KO6X19fX19fX19fX19fX19fX19f X19fX19foaGhobXYteOjul9fX19fX19fX19fX6GhoaGhoQ0KDQqyzpX+taXOu8P7s8ajul9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIEVtYWlso7pfX19fX19fX19fX19fX19fX19f X19fIKGhDQoNCsjnt6LGscynzbfFY7G+u9jWtIbOzrvD+7dRsrvNrLXEoaPH69eiw/ejul9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCsKTz7XIy6O6X19fX19fX19fX19fX19f ILXnu7Cjul9fX19fX19fX19fX19fX19fX19fXyC0q9Xmo7pfX19fX19fX19fX19fX19fX19fX18N CiChoQ0Kss6809Gn1LGjul9fX19fX19fX19fX19fX9awzvGjul9fX19fX19fX19fX19fX8rWu/qj ul9fX19fX19fX19fX19fX0VtYWlso7pfX19fX19fX19fX18NCg0Kss6809GnhlSjul9fX19fX19f X19fX19fX8KazvE6X19fX19fX19fX19fX19fIMrWu/qjul9fX19fX19fX19fX19fX0VtYWlso7pf X19fX19fX19fX18NCg0Kss6809Gn1LGjul9fX19fX19fX19fX19fX8KazvGjul9fX19fX19fX19f X19fX8rWu/qjul9fX19fX19fX19fX19fX0VtYWlso7pfX19fX19fX19fX18NCiAgICAgIA0KuLa/ 7re9yr2juqH1z9a98KGhofXWp8axoaGh9deq1coNCg0KyMuUtaO6X19fX19fyMsgICCyzrvh2U3T w6O6ubK8xqO6X19fX19f1KogDQoNCrG416INCjEuytW1vbnzy76I88P70MXPorrzo6zO0sPHjKK1 2tK7yrHpZ7rN2UbLvrLOu+HCk8+1yMu9+NDQyLfVSqO7DQoyLtTav6q/zsew0rvW3KOsztLDx9PQ jKPIy71vufPLvreiy82yzrzTxeDRtbXEyLfVSrqvo6zJz8Pm09DF4NOWsai1vda40v2jrNLUvLDP 6s+4tcTJz7/OtdjWt7rNwre+gM28o7sNCjMutMu/zrPM0rK/ydLUsLLFxcbz0rWDyNG1o6yaZ9Ot wLS159fJ0a+8sMnqx+vFxcbao7sNCjQuyOe21LTLv86zzNPQyM66ztLJzsqjrLu2062yprTytefU ks/yztLDx9fJ0a+how0K ------=_000_NextPart113217562881_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0 L2h0bWw7IGNoYXJzZXQ9Z2IyMzEyIj4NCjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNl dD1nYjIzMTIiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPg0KPC9oZWFkPg0KPGJvZHk+DQo8cD4z RdC918rJ6NOLo6jS1I2Ptqi8iaGi0tTIy7aotbWjqcVjvbG98KGizOGzycXg0bU8YnI+PC9wPg0K PHA+ob7Ksbzktdi146G/IDIwMTbE6jXUwjI4LTI5yNUgyc+6oyZuYnNwOyZuYnNwOyZuYnNwOyA2 1MIxOC0xOcjVIMnu29o8YnI+ob6yzrzTttTP86G/IA0Kv8rN+9KOt7a6zczhyf3Iy8Gm18rUtNC9 s+q53MDttcS2rcrCs6Shor+Co6i4saOpvq3A7aGiIEhS19y84KGivq3A7aO70L3XyrijwPu+rcDt oaLXqIZUo7u437LjvZvA7bXIhaK806GjPGJyPqG+ytq/zre9yr2hvyC9ssqm1nbK2iArIMrTxrXR 3dLvICsgDQqwuMD90dDM1iArvcfJq7Dn0d0gKyDWdsqmtePGwDxicj6hvtGnz7C30dPDob8gDQo0 NTAw1KovMcjLo6i6rL/Os8y9stLloaLU57XjoaLO57LNoaLLsLfRoaKy6LXjtcijrLKiuqzT0INy 1rUyMDAw1Kq1xDNF0L3XytRPvMbI7bz+MczXo6k8YnI+ob6z0LDstaXOu6G/ILLFIL6tIMXgING1 IA0KvlcmbmJzcDs8YnI+ob60udGvn+HP36G/IDAyMC0tLTg2NDE5NTEwIDsmbmJzcDsgODY0MTY1 MzkmbmJzcDsmbmJzcDsgwdbPyMn6Jm5ic3A7Jm5ic3A7IA0K0e7Qob3jJm5ic3A7Jm5ic3A7IDwv cD4NCjxwPjxicj4mbmJzcDsgM1Ag0L2z6rncwO2jrLy0uNrOu9C9s+qjqFBheSBmb3IgUG9zaXRp b26jqaGiILj2yMu8vMTc0L2z6qOoUGF5IGZvciBQZXJzb26jqSANCrrNvKjQp9C9s+qjqFBheSBm b3IgUGVyZm9ybWFuY2WjqaOs0+vVxcrYtLrAz8qmyte0tLXEM0XQvdfKudzA7aOsvLSjqM3isr++ +briRXh0ZXJuYWwgRXF1aXR5LCDE2rK/vvm64kludGVybmFsIA0KRXF1aXR5LCC49szlvvm64klu ZGl2aWR1YWwgDQpFcXVpdHmjqdTayrXWysnPysfSu9H5tcSjrLa8ysfG89K10L2z6szlz7XUT7zG tcTT0NCnoaLH5c76us288rWl0tfQ0LXEt723qKGjPGJyPrG+1W6zzLzmucuDydbWxKPKvaOsvczE +tXGztW5+utIufrE2tfuuea3trXE0L2z6sno04u3vbeoo6yzyc6qz+DTprXE16iYSdXfoaPVbrPM uKjS1LTzwb+wuMD9o6zU2rXa0rvM7NGnhlTQ6NfUtPixytObsb6158RYo6zT0NK70KHKsbXEwbfP sKGjPGJyPiZuYnNwOzxicj6hvr/Os8y0875Wob8gDQo8YnI+tdrSu7K/t9YgDQrQvbPqzOXPtb/y vNw8YnI+MqGi0L2z6rXEuavGvbrNvKTA+Mjnus7PuLuvus3A7b3iPGJyPjOhosqyw7TKx8irw+bQ vbPqudzA7Txicj40oaLQvbPq83fPtbXEmIuzyaOsucy2qMrVyOuhorHkhNPK1cjrtcTJ6LzGt723 qDxicj41oaLI57rOwarPtbmry77E2rK/1f6y39PrzeKyv8rQiPY8YnI+NqGi1E+2qMa9tcihoriC 1fnT67ykwPjP4L3hus+1xNa4tby3vdXrPGJyPjehotC9s+rKtdtgz9bXtLrN1La+sMS/mMs8YnI+ tdq2/rK/t9YgDQozRdC918rUT7zGwO3E7jxicj44oaIzUKOsvLTWsM670L2z6qGiuPbIy6OoxNzB pqOp0L2z6qGiv4PQp9C9s+qjrMbkyejTi8u8wrfWdr3iPGJyPjmhojNF0L3XyvN3z7WjrLy0zeKy v775uuKhosTasr+++brioaK49szlvvm64rXEyejTi8u8wrehozxicj4xMKGizqW3tDNFo6i78jNQ o6nQvdfKwO3E7qOsu+G4+Mbz0rW0+MC0tcTPt77nu6/TsM/so6jO5YKA0KGwuMD9o6k8YnI+MTGh otProbDQvbXj1sahsaGiobAzUMDtwtuhsbXI0L2z6snovMbLvMK3z+CxyN1eo6yhsDNFobHA7cTu z9TW+LXEg57KxrrNubLQ1Lj3ysfKssO0PGJyPrXayP2yv7fWIA0KxNqyv775uuLQ1KOsuNrOu7Li xsAgo6i78oym06YzUNC9s+qjrL7NysfWsM670L2z6iAocGF5IGZvciANCnBvc2l0aW9uKaOpPGJy PjEyoaLI57rOuPmT/rjazru829a1o6y21LjazrvUT7aoxuS437XNsrvNrLXEuaTZWby2sfCjqNLU uNq2qLyJo6k8YnI+MTOhosvE1ta64sG/jY/Ou7zb1rW1xLe9t6g8YnI+MTShosTasr+++britcTK wL3n1qrD+7XEuavKvTxicj4xNaGi/GPWtbeoo6hwb2ludC1mYWN0b3KjqbjazrucecbA0qrL2L7Z wP2jqMzhuakzMLj2uNrOu5x5xsDSqsvYo6k8YnI+MTahotGhsuLUddKqy9i1xMj9uPbUrYR0PGJy PjE3oaKy4sbAx7CjrNGh1PHqULz8uNrOu7XEyP249tSt1PI8YnI+MTihorjazrucecbAtcTB+bj2 sr3W6Dxicj4xOaGiuNrOu5x5xsDR3cG3o6iw67j20KGVcqOpPGJyPjIwoaLI57rO08O72LnplE26 z9Cj0em42s67suLGwLXEveG5+8rHt/Gcysi3PGJyPjIxoaK4+b7dnHnGwL3hufujrL1vuNrOu9RP tqi5pNfKvLaEZaOs1/az9tawvLbNvKOoR3JhZGluZyANCk1hdHJpeKOpPGJyPjIyoaLCmry2zbzU 2tXQxrihor36yf26y7aouaTXytbQtcTTw82+PGJyPjIzoaKNj867suLUdbXE0KHX6bjDyOe6zrm5 s8mjrLD8wKjKssO0s8nUsTxicj612svEsr+31iDG89K10L2z6vN3z7XJ6LzGIA0Ko6jN4rK/vvm6 4rXEyei8xqOpPGJyPjGjrrj3vIm5pNfK7n62yJjL17y1xMno04s8YnI+MjShotRPtqjQvbPqtci8 tvN3z7W1xLDLgoDKtdPDtcSyvdboPGJyPjI1oaLSu4KAxvPStbjjtuDJ2byJuaTXyrrDPGJyPjI2 oaK8trLutcS8xsvjuavKvbywyrLDtDxicj4yN6GivLax8Nfu0KHWtaGi1tC149a1oaLX7rTz1rW1 xNRPvMaw7LeooaO31plutcTea7eooaM8YnI+Mjihory2t/m2yLXEuavKvbrNuebCyaOsuPmT/rj2 zOXStbyosu7S7MC0yejTizxicj4yOaGiwb28trmk2Vm1xNbYtf62yLXEuavKvaOsyOe6ztRPtqij rLywxuTTsO2RPGJyPjMwoaK96NehytCI9rmk18rK/ZP+wLTJ6NOLu/KxyL3Po6jQo/KeoaK199X7 o6msRtPQuaTXysf6voCjqLj3vLbW0LXjway+gKOptcS3vbeooaO7rbP2xvOYSdC918rH+s/f0+vK 0LOhuPe31s67x/q+gDxicj4zMaGiwezPyKGi1s2689X+st+1xMnotqi6zd9c08M8YnI+MzKhorK7 zazQ8sHQo6i53MDtus3WsMTc0PLB0KGivLzK9dDywdChosn6s/bQ8sHQtcijqbXE0L3XyrXIvImx 6te8tcTJ6NOLtcS3vbeoPGJyPjMzoaLKtcD9o6jWqsP7xvPStaOpPGJyPjKjrMrQs6HQvdlZtfey 6Txicj4zNKGiyOe6ztf2ytCzodC918rVe7Lpo6zU9cO0tsHK0Ij2sai45jxicj4zNaGi07DtkbrN vva2qNK7uPa42s67ytCI9tC918q827jxuN+1zbXEy8SCgNLyy9g8YnI+MzahosrQs6G31s671rXK x8qyw7S4xcTuo6zI57rOyrnTw7W919S8urXEzOXPtdbQPGJyPjOjrMjnus7Xq9C0xvPStdC9s+rW xrbIo6iw/MCosMu49rK/t9ajqaOsyrXA/Txicj612s7lsr+31iANCoKAyMujqMTcwaajqdC9s+og KHBheSBmb3IgDQpwZXJzb24pPGJyPjM3oaLI57rOz+C21MG/u6+12M6quNrOu8nPtcSyu82suPbI y6Osyei2qMbk0L3ZWbW1zrs8YnI+MzihorbU09rXqNK1udzA7dDywdC78ry80GfQ8sHQyMuGVKOs vejW+qGwyqTIzsGmxKPQzaGxwLTUT7aoyMuGVLXEvLax8LrNmW7Ouzxicj4zOaGiyOe6ztf2uNrO u7XEyqTIzsGmxKPQzaOo1rHTXqGijI3Tw6Opo6yMjcD9oaM8YnI+MaOstqjQvTxicj40MKGiyOe6 ztPDy/nJ6LzGtcTQvdfKx/q+gL3hmIvOqtDCwLS1xMjLtqjQvTxicj40MaGi1dDGuMqxobDQvdfK zLjF0KGxo6jZqbzbo6m1xMj91dA8YnI+NDKhorX3uNqhor36yf3Iy9SxtffQvTxicj40M6GiveK+ 9tC9s+rLrsa9tc3T2rHq17y1xMjL1LGjqL5HyKajqbXEv8bRp7rPwO23vbeoPGJyPjQ0oaK94r72 0L2z6suuxr2zrLHqtcTIy9Sxo6i67Mimo6m1xMqut063vbeoPGJyPjQ1oaLM4cew1qe4trXItOvK qTxicj4yo668qNCnuaTXysVjxOrW1b2xIA0KKHBheSBmb3IgDQpwZXJmb3JtYW5jZSk8YnI+NDah or+D0Ke5pNlZscjA/bXEyei2qDxicj40N6Giu/nT2r+8usu94bn7o6y8xsvjvKjQp7mk18q1xLDs t6g8YnI+NDihorTT0L2z6szlz7XJz7Hcw+Kyv8PFvq3A7c6qwcvV+cihvKjQp7mk18q2+Ma0w/y9 b8/CyvS08rjft9Y8YnI+NDmhosTq1tW9scjnus68yMVjxvPStdK1vKiS7Lmzo6zT1sVjuPbIy7Ht z9a50rmzo6zKtcD91na94jxicj41MKGixOrW1aqEyei2qLXEjtfW1tPQ0Ke1xLmryr2jqI/E19zM 5bfWuPiCgMjLo6k8YnI+My6199C9PGJyPjUxoaK9+sn9tffQvaGi0rW/g7X30L2hor1Zubm7r7X3 0L08YnI+NTKhosTqtsjVe9C9vObumdK1v4O6zc/W09CCgMjLytXI68uuxr21xLDst6ijrNLUQ1Lz d8/Wz9bT0NC918rLrsa9PGJyPjUzoaK96NehQ1KjrMnotqjT0NCnoaKMjdPDtcTE6rbI1XvQvb7Y 6oc8YnI+NTShotPDtffQvb7Y6oe4+MirhlTJ6LaotffQvaOosLTUpMvjo6mjrMq1wP3R3b6aPGJy PjU1oaK199C9yOe6zr/Y1sazybG+PGJyPrXawfmyv7fWIA0Kv+20+NC9s+ogDQo8YnI+NTahory8 xNy5pNfKo6hza2lsbC1iYXNlZKOptcTJ6LzGus2DnrXjyLH8Y8rHyrLDtDxicj41N6GijJK3+dC9 18q9Wbm5us2C982zuNrOu9C92Vm94bm5tcTZfLXEhV6x8LrNyrnTw7e9t6g8YnI+NTihooyStPjQ vbPqyejTi8q1wP08YnI+tdrG37K/t9YgDQrE6tC91sbFY7jfudzIy9SxvKTA+Dxicj41OaGiuN+5 3MjLhlS1xMTq0L3Wxr3hmIs8YnI+NjChorjfudzIy9SxtcTE6tbVtPO27r2xvfC1xNRPvMbT67+8 usu3orfFo6jKtcD9o6k8YnI+tdqwy7K/t9YgDQq5yciovKTA+Dxicj42MaGiucm2q7nJyKi9scD4 t72wuKOotPO5ybar3kTIw6OpPGJyPjYyoaLP3tbG0NS5ycaxt72wuDxicj42M6GijI25ybykwPi3 vbC4PGJyPjY0oaLG2siovKSE7re9sLg8YnI+NjWhorfWuuzQzcyTxOK5yZngt72wuDxicj42NqGi 1Nq5ycioucnGsbfWxeSVcrXEtqjIy7aowb88YnI+tdq+xbK/t9YgDQrQvbPqudzA7dPrnM/NqDxi cj42N6Gisr/pVL6twO3TptPQtcTQvdfKudzA7Zngz948YnI+Njihosjnus7X9rrD0L2z6rGjw9w8 YnI+Njmhormk18rM9bXIvNPHv9C918qcz82otcTK1rbOo6zI57rOg567rzxicj43MKGiyOe6ztPD yP3W1r75uuLQ1LXE1K3A7aOoM0WjqcilveLKzbrNubXNqLmk18o8YnI+1cXAz46fy/nX99fJ0a+w uMD9tcSMjbzK1bnKvqGivbK94jxicj4mbmJzcDs8YnI+ob6Mo7zSvenJ3KG/IA0Kj4jK2LS6PGJy PrGzvrCjujxicj4xoaIxOTk0xOqjrK6F0rXT2sflyEG089Gn64q7+s+1o6zL5rrzvfjI68KTus/A +7uqo6jW0Ln6o6m008rCyMvBptfK1LS5pNf3o7s8YnI+MqGiMTk5N8Tqo6y4sMPAufrQwtTzzvfW 3cGitPPRp9GnwZWjrMjLwabXytS0udzA7bRUyr+juzxicj4zoaLU2sPAufrG2rzko6y1o8jOwMrR tryviEbIy8Gm2VnUtNfcsr+jqM6709rDwLn60MLU88731t2jqdC918q53MDtvq3A7aO7PGJyPjSh orvYufq686OswPrIzs2o08OH+LzKoaLL0br8oaJDaGluYVJlbrXI1qrD+8bz0rVIUrjfvdejrLuq zKmxo+tVyMvBptlZ1LTX3Lzgo7s8YnI+NaGix+W7qrTzjFe/zdf5vczK2qGjz8i685P6yM7QwsDL zfihotDCu6rIy8rZoaLO5bVWvK/NxbXItPPQzcbzmEm1xEhSucvOyqGjPGJyPjahosquxOrWqsP7 zeLG88jLwabXytS0udzA7b2b0emjrMquxOqH+MTauPfA4Mbz0rW1xNC9s+rXydSDyejTi76t0emh o9PQt+G4u7XEzeLG86Gih/jG86Giw/HG87XEyrWR8LrN18nUg76t0emjrLbgtM6xu7n6g8jIqM3+ u/q5udR1zqrW0If41+6+38q11b3Q1MXg0bWOn6GjPGJyPjehosrXtLShsDNF0L3Xyszlz7WhsaOs yMO4tOtztcTQvbPqudzA7bHktcO6hrWloaKMjdPDoaK/xtGnoaLWsbnboaPpX7eiobAzRdC92VnI 7bz+obGjrMjD0L2z6sno04u31squsr3N6rPJoaM8YnI+j4jK2LS6wM/KpsrHufqDyKGwM0XQvdfK yei8xqGxwO3E7rrNvLzK9bXEtLTKvMjLo6zW0Ln60L2z6snovMbZWcnujKO80qOsysfX7tTn0ru9 7MH0w8DIy8Gm18rUtLncwO3Rp7RUyr+jrK6F0rXT2sPAh/jQwtTzzvfW3cGitPOMV8jLwabZWdS0 udzA7bRUyr+jrMPAufrQvdfKhWa74bvhhlSjrNPQvfy2/squxOq1xMjLwabXytS0udzA7brN18nR r76t0emjrM/IuvOT+sjOwaq6z8D7yEGhosDK0425q8u+yMvBptfK1LSjqMPAh/jX3LK/o6mjrM2o 08Prisb3oaJDaGluYVJlbr5X1b6horuqzKmxo8/VuavLvsjLwabXytS019y84LrNvZvA7aOs1Pi1 o8jO0MLAy834oaLQwruqyMuJ26GizuW1VryvzcXT0MmrvfDK9Lmry761xMjLysLumc7KoaPU+LG7 30LQ+MbAzqq24MTqtsjIq7n6yq680cXg05bKpqGiyq680cjLwabZWdS0xeDRtY6foaPVxcDPyqbW 972ytcTQvbPq83fPtcnovMa6zbncwO2/zrPMo6zKtdW9yrXTw6OsytrVbrfnuPHH4cvJ09DIpKOs 1W6zzJhPvt/KtdW9oaKy2df30NS6zcq108PQ1KOs1Nq5+sTat+fQ0NLRvsOjrL2yytrS0dPiyP2w 2bOho6zRp9Sx0+LN8sjLo6zJ7src0aeGVLrDxsCjrNLUyrXTw9DUvPuzpKGjsqLU+M6qz8LK9o7X yq680sbz0rXM4bmp0L2z6qGiv4PQp7XE18nUg8novMajutbQufrS+NDQsbG+qc73s8fWp9DQoaLW 0Lqj0826o9HzuaSzzLy8yvW5q8u+o6jQvbPqoaK/g9Cno6mhoszsvfKjqMC2s7KjqbXnwaa9qMno vK/Nxbmry76horn6vNK1575Xz8LK9MbVyPDLuc2ouaSzzLy80GfT0M/euavLvqGi1tC5+tK9y468 r83Fo6yMksGsyq63vb/GvLy5q8u+o6jN+NW+o6mhotDCwMu+V6Giu938Y7/GvLyjqM341b6jqaGi 1de+U7/GvLyhotbQzeLfXKOov9XUy6OpvK+IRqGiw/HJ+sjLytmhotDFxbW5q+pQuavLvqGiIA0K 06LL97XnxvihosW3yrHBprf+17ChotbQh/i6vb/Vv4LUujMxMMv5oaK078D7vK/NxaGix+CNdbPH t6K8r83FoaKxsb6pzOzI873wsNnJzMOzuavLvqGiufq1pNK9y47P+srbuavLvqGius/W2t9fyO28 /rmry76hotbQufq7r7mk0MXPorXIoaM8YnI+1cXK2LS6wM/Kpr7f09DQvbPq7knT8rXE16iYSdHQ vr+5prXXus234bi7tcTN4sbzoaK5+sbzoaLD8cbztcTKtdW9us3XydSDvq3R6aOs1fu6z8HLz9a0 +sH30NC1xKGi0o63trXE0L3ZWcnovMa8vMr1o6zNxrP218nRr8q9obAzRdC92VnJ6LzGobG1xMrK tsi/7bf5tcTQvbPqzOXPtcnovMa1xMa3xcbVbrPMoaM8L3A+DQo8cD4tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0K iPMmbmJzcDsgw/uhobvYJm5ic3A7INa0PC9wPg0KPHA+PGJyPsfrjKLS1M/CsajD+7Htg8jI3czu 0LS687eiRS1NQUlMtb06ZGFvcHUwMjBAMTYzLmNvbTwvcD4NCjxwPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCjxicj7Ksbzko7pfX19fX19fX19fX19f X19fX19fX19fX1+hoaGhtdi146O6X19fX19fX19fX19foaGhoaGhPC9wPg0KPHA+ss6V/rWlzrvD +7PGo7pfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBFbWFpbKO6X19fX19fX19f X19fX19fX19fX19fXyChoTwvcD4NCjxwPsjnt6LGscynzbfFY7G+u9jWtIbOzrvD+7dRsrvNrLXE oaPH69eiw/ejul9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9wPg0KPHA+wpPP tcjLo7pfX19fX19fX19fX19fX18gtee7sKO6X19fX19fX19fX19fX19fX19fX19fIA0KtKvV5qO6 X19fX19fX19fX19fX19fX19fX19fPGJyPiZuYnNwO6GhPGJyPrLOvNPRp9Sxo7pfX19fX19fX19f X19fX1/WsM7xo7pfX19fX19fX19fX19fX1/K1rv6o7pfX19fX19fX19fX19fX19FbWFpbKO6X19f X19fX19fX19fPC9wPg0KPHA+ss6809GnhlSjul9fX19fX19fX19fX19fX8KazvE6X19fX19fX19f X19fX19fIA0Kyta7+qO6X19fX19fX19fX19fX19fRW1haWyjul9fX19fX19fX19fXzwvcD4NCjxw PrLOvNPRp9Sxo7pfX19fX19fX19fX19fX1/Cms7xo7pfX19fX19fX19fX19fX1/K1rv6o7pfX19f X19fX19fX19fX19FbWFpbKO6X19fX19fX19fX19fPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyANCjxicj64tr/ut73KvaO6ofXP1r3woaGh9danxrGhoaH116rVyjwvcD4NCjxwPsjL lLWjul9fX19fX8jLJm5ic3A7Jm5ic3A7ILLOu+HZTdPDo7q5srzGo7pfX19fX1/UqiA8L3A+DQo8 cD6xuNeiPGJyPjEuytW1vbnzy76I88P70MXPorrzo6zO0sPHjKK12tK7yrHpZ7rN2UbLvrLOu+HC k8+1yMu9+NDQyLfVSqO7PGJyPjIu1Nq/qr/Ox7DSu9bco6zO0sPH09CMo8jLvW+588u+t6LLzbLO vNPF4NG1tcTIt9VKuq+jrMnPw+bT0MXg05axqLW91rjS/aOs0tS8sM/qz7i1xMnPv8612Na3us3C t76Azbyjuzxicj4zLrTLv86zzNKyv8nS1LCyxcXG89K1g8jRtaOsmmfTrcC0tefXydGvvLDJ6sfr xcXG2qO7PGJyPjQuyOe21LTLv86zzNPQyM66ztLJzsqjrLu2062yprTytefUks/yztLDx9fJ0a+h ozwvcD48L2JvZHk+PC9odG1sPg0K ------=_000_NextPart113217562881_=------ From sandeen@sandeen.net Tue May 31 08:57:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 083537CA2 for ; Tue, 31 May 2016 08:57:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD5A7304048 for ; Tue, 31 May 2016 06:57:52 -0700 (PDT) X-ASG-Debug-ID: 1464703065-04cb6c2dbba78c70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BWBT1AqGfLRott20 for ; Tue, 31 May 2016 06:57:46 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8E4942B18 for ; Tue, 31 May 2016 08:57:45 -0500 (CDT) Subject: Re: Cumulative xfsrestore shows many warnings and files/directories are missing after restoration To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Cumulative xfsrestore shows many warnings and files/directories are missing after restoration References: <8323ac3a-f9d2-ad31-69e3-1eea5a44dcde@recia.fr> From: Eric Sandeen Message-ID: <87a11f69-1a10-89e2-598f-015f0205a55a@sandeen.net> Date: Tue, 31 May 2016 08:57:45 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <8323ac3a-f9d2-ad31-69e3-1eea5a44dcde@recia.fr> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464703066 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3055 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/31/16 5:55 AM, Damien Gombault wrote: > Hi. > > I use xfsdump to backup my systems. > Recently I had to use xfsrestore to restore a cumulative level 0 + level 1 dumps. > ... > The level 1 restore shows many warnings : > xfsrestore: drive 0: examining media file 0 > xfsrestore: drive 1: searching media for directory dump > xfsrestore: drive 1: reading directories > xfsrestore: drive 1: 11013 directories and 96122 entries processed > xfsrestore: drive 1: directory post-processing > xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1677721775.4173752252 to dir var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/08 Scurit/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type > xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1711276202.4274102453 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/02 Mise en oeuvre sOlre: Aucun fichier ou dossier de ce type > xfsrestore: drive 1: WARNING: unable to rename dir orphanage/1694499004.2655526171 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/07 Communication: Aucun fichier ou dossier de ce type > xfsrestore: drive 1: WARNING: unable to rename dir orphanage/2365644069.2895542759 to dir var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration/08 Scurit/08c Gestion des mots de passe - Keepass: Aucun fichier ou dossier de ce type > xfsrestore: drive 1: WARNING: unable to rename nondir orphanage/2902474338.2817943331 to var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/09 Questionnaires communes solre/Dossiers des collectivits/37003 - Amboise/02-Compte rendu de runions/Compte rendu runion 3 mai 2016.odt: Aucun fichier ou dossier de ce type Restating what I said in the bug you also filed: In general, it would helpful to provide the error messages after setting LANG=en_US - because your English is far better than my French. :) A couple questions: > Some folders are not restored at the right place. What does that mean? Were they restored to the wrong place, or were they not restored at all? Also, the "Aucun fichier ou dossier de ce type" errors indicate that files could not be moved into a directory hierarchy, presumably because some path component did not exist. The common portions of those paths which failed are: > var/www/html/owncloud/data/F1000buv/files/Dossier personnel et source de partage/E-Administration/ and > var/www/html/owncloud/data/F1000buv/files_versions/Dossier personnel et source de partage/E-Administration Do those paths still exist on the original filesystem? Is it possible that they were removed while the dump was occurring? It seems most likely that the filesystem changed significantly during the dump processes, and this is what led to the errors. -Eric From lbounces@offers.alfanet-sa.gr Tue May 31 09:58:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=FROM_OFFERS, HTML_IMAGE_RATIO_02,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9CCED7CA4 for ; Tue, 31 May 2016 09:58:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 144CEAC003 for ; Tue, 31 May 2016 07:58:37 -0700 (PDT) X-ASG-Debug-ID: 1464706708-04cbb03569a90480001-NocioJ Received: from offers.alfanet-sa.gr (offers.alfanet-sa.gr [5.172.205.98]) by cuda.sgi.com with ESMTP id OzBgFulqQWGqvYcc for ; Tue, 31 May 2016 07:58:28 -0700 (PDT) X-Barracuda-Envelope-From: lbounces@offers.alfanet-sa.gr X-Barracuda-Effective-Source-IP: offers.alfanet-sa.gr[5.172.205.98] X-Barracuda-Apparent-Source-IP: 5.172.205.98 Received: from offers.alfanet-sa.gr (localhost [127.0.0.1]) by gr.alfanet-sa.gr (Postfix) with ESMTPSA id 2B22F240DE3 for ; Tue, 31 May 2016 17:50:27 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=offers.alfanet-sa.gr; s=default; t=1464706227; bh=K+HmFknbz4XnhESfZSsmk+AIslLeYs/w1cSMUPO38WA=; h=Date:To:From:Subject:List-Help:List-Unsubscribe:List-Subscribe: List-Owner:From; b=mMFuyHvarK0GV6h0H1qdnXfVz3Ecuvaxi9zamv+nUybnSFZ33Sl7FFxVQTHiUaVDe 1r5M4WkQPzQA8Vqf1uL0ZbTQILqcammizmf/KaNEvHQoZfOVQet8DJKvU/qAXahbey rILJypNZGN9mfFILPkmjdlnCt+LQIpwYvUCgqcHU= Date: Tue, 31 May 2016 17:50:27 +0300 To: xfs@oss.sgi.com From: Alfanet Offers Subject: =?UTF-8?B?zpXPgM+Ozr3Phc68zrEgRGVza3RvcCBQQyDOsc+Az4wgMzbigqwgzrzPjM69?= =?UTF-8?B?zr8gz4PPhM63zr0gQWxmYW5ldCE=?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?B?zpXPgM+Ozr3Phc68zrEgRGVza3RvcCBQQyDOsc+Az4wgMzbigqwgzrzPjM69?= =?UTF-8?B?zr8gz4PPhM63zr0gQWxmYW5ldCE=?= X-Mailer: PHPMailer 5.2.14 (https://github.com/PHPMailer/PHPMailer) X-MessageID: 214 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: lbounces@offers.alfanet-sa.gr List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_b627d54c90fd4099e839a9f0a83dd436" X-Barracuda-Connect: offers.alfanet-sa.gr[5.172.205.98] X-Barracuda-Start-Time: 1464706708 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6806 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.70 X-Barracuda-Spam-Status: No, SCORE=1.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FROM_OFFERS, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.15 FROM_OFFERS From address is "at something-offers" -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --b1_b627d54c90fd4099e839a9f0a83dd436 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =EF=BB=BF =CE=95=CF=80=CF=8E=CE=BD=CF=85=CE=BC=CE=B1 Desktop PC =CE=B1=CF=80=CF=8C 36= =E2=82=AC =CE=BC=CF=8C=CE=BD=CE=BF =CF=83=CF=84=CE=B7=CE=BD Alfanet! =CE=A0=CE=B1=CF=84=CE=AE=CF=83=CF=84=CE=B5 =CE=B5=CE=B4=CF=8E =CE=B1=CE= =BD =CE=B4=CE=B5=CE=BD =CE=B2=CE=BB=CE=AD=CF=80=CE=B5=CF=84=CE=B5 =CF=84= =CE=B7=CE=BD =CF=80=CE=B1=CF=81=CE=B1=CE=BA=CE=AC=CF=84=CF=89 =CE=B5=CE=B9=CE=BA=CF=8C=CE=BD=CE=B1 > -- This message was sent to xfs@oss.sgi.com by noreply@offers.alfanet-sa.gr To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 -- powered by phpList, www.phplist.com -- --b1_b627d54c90fd4099e839a9f0a83dd436 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =EF=BB=BF=0A=0A=0A=0A=CE=95=CF=80=CF=8E=CE= =BD=CF=85=CE=BC=CE=B1 Desktop PC =CE=B1=CF=80=CF=8C 36=E2=82=AC =CE=BC= =CF=8C=CE=BD=CE=BF =CF=83=CF=84=CE=B7=CE=BD Alfanet!=0A=0A=0A=0A=0A=0A=CE=A0=CE= =B1=CF=84=CE=AE=CF=83=CF=84=CE=B5 =CE=B5=CE=B4=CF=8E =CE=B1=CE=BD =CE=B4= =CE=B5=CE=BD =CE=B2=CE=BB=CE=AD=CF=80=CE=B5=CF=84=CE=B5 =CF=84=CE=B7=CE= =BD =CF=80=CE=B1=CF=81=CE=B1=CE=BA=CE=AC=CF=84=CF=89 =CE=B5=CE=B9=CE=BA= =CF=8C=CE=BD=CE=B1=0A=0A=0A =0A=0A=0A=0A=0A=0A=0A= =0A=0A=0A=0A=0A

 

=0A=0A=0A=0A<= /tr>=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A
=0A=0A=0A=0A=0A
=0A = =0A>=0A=0A=0A=0A=0A =0A
=0A=0A=0A= =0A=0A=0A=0A=0A=0A=0A=0A<= td colspan=3D"2">=0A=0A
=3D""
 
=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A
-- =20

This message was sent to xfs@oss.sgi.com by noreply@offers.alfanet= -sa.gr

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can opt-out completely from all future mailings.

=0A=3D""=0A --b1_b627d54c90fd4099e839a9f0a83dd436-- From sandeen@sandeen.net Tue May 31 10:35:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64B3F7CA2 for ; Tue, 31 May 2016 10:35:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A129304051 for ; Tue, 31 May 2016 08:35:03 -0700 (PDT) X-ASG-Debug-ID: 1464708901-04bdf05ad7aa3460001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LbzBe0LJMn2949sp for ; Tue, 31 May 2016 08:35:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F17142B18; Tue, 31 May 2016 10:35:00 -0500 (CDT) Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path To: xfs@oss.sgi.com, Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-4-git-send-email-hch@lst.de> From: Eric Sandeen Message-ID: Date: Tue, 31 May 2016 10:35:01 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1458128681-10869-4-git-send-email-hch@lst.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464708901 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2205 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 3/16/16 6:44 AM, Christoph Hellwig wrote: > This patch implements two closely related changes: First it embedds a > bio the ioend structure so that we don't have to allocate one separately. > Second it uses the block layer bio chaining mechanism to chain additional > bios off this first one if needed instead of manually accouting for > multiple bio completions in the ioend structure. Together this removes a > memory allocation per ioend and greatly simplifies the ioend setup and > I/O completion path. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_aops.c | 247 ++++++++++++++++++++++++----------------------------- > fs/xfs/xfs_aops.h | 15 ++-- > fs/xfs/xfs_super.c | 26 ++---- > 3 files changed, 123 insertions(+), 165 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 5928770..42e7368 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -124,18 +124,25 @@ next_bh: > */ > STATIC void > xfs_destroy_ioend( > - struct xfs_ioend *ioend) > + struct xfs_ioend *ioend, > + int error) > { > struct inode *inode = ioend->io_inode; > - int error = ioend->io_error; > + struct bio *last = ioend->io_bio; > struct bio *bio, *next; > > - for (bio = ioend->io_bio_done; bio; bio = next) { > + for (bio = &ioend->io_inline_bio; bio; bio = next) { > struct bio_vec *bvec; > int i; > > - next = bio->bi_private; > - bio->bi_private = NULL; > + /* > + * For the last bio, bi_private points to the ioend, so we > + * need to explicitly end the iteration here. > + */ > + if (bio == last) > + next = NULL; > + else > + next = bio->bi_private; > > /* walk each page on bio, ending page IO on them */ > bio_for_each_segment_all(bvec, bio, i) > @@ -143,8 +150,6 @@ xfs_destroy_ioend( > > bio_put(bio); Coverity thinks this is problematic, calling it a "Free of address-of expression (BAD_FREE)" CID 1362192 The issue is that if bio still == io_inline_bio, we are freeing memory which was not allocated. Maybe this needs a: if (bio != &ioend->io_inline_bio) bio_put(bio); or is there a better way? thanks, -Eric From msnitzer@redhat.com Tue May 31 10:53:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E2EF7CA2 for ; Tue, 31 May 2016 10:53:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8994AC001 for ; Tue, 31 May 2016 08:53:52 -0700 (PDT) X-ASG-Debug-ID: 1464710031-04cbb0356aa93ee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Q4db1aHwuCOEA8Ue (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 08:53:51 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8B3BA7F6A8; Tue, 31 May 2016 15:53:50 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VFrnG1024559 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Tue, 31 May 2016 11:53:49 -0400 Date: Tue, 31 May 2016 11:53:49 -0400 From: Mike Snitzer To: Ming Lei Cc: Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , "open list:DRBD DRIVER" , Jan Kara , Joe Thornber , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , "Martin K. Petersen" , Michal Hocko , NeilBrown , Sagi Grimberg , Shaohua Li , Steven Whitehouse , Tejun Heo , "open list:XFS FILESYSTEM" Subject: Re: [PATCH v6 0/8] block: prepare for multipage bvecs Message-ID: <20160531155348.GA24840@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v6 0/8] block: prepare for multipage bvecs References: <1464615294-9946-1-git-send-email-ming.lei@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464615294-9946-1-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 31 May 2016 15:53:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464710031 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1314 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, May 30 2016 at 9:34am -0400, Ming Lei wrote: > > Hi, > > Interests[1] have been shown in multipage bvecs, so this patchset > try to prepare for the support and do two things: > > 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), > then we can drop the non-standard way for iterating bvec, which > can be thought as a good cleanup for lib/iov_iter.c > > 2) remove BIO_MAX_SECTORS and makre BIO_MAX_SIZE as obsolete, and > now there is only one user for each. Once multipage bvecs is introduced, > one bio may hold lots of sectors, and we should always use sort of > BIO_MAX_VECS which should be introduced in future and is similiar > with current BIO_MAX_PAGES. > > The only functional change is iterate_bvec():lib/iov_iter.c > > xfstests(-a auto) over loop aio is run for ext4/xfs to verify > the change and no regression found with this patchset. > > V6: > - rebased on v4.7-rc1 > - add reviewed-by tag > - mark BIO_MAX_SIZE as obsolete instead of removing because > dm-tree adds one usage now Not sure what you're referring to here with "dm-tree" (since "dm-tree" doesn't exist). But only direct user of "BIO_MAX_SIZE" in DM appears to be dm-crypt.c. Maybe you've identified some indirect use of BIO_MAX_SIZE? From gwendal@google.com Tue May 31 11:19:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4838C7CA2 for ; Tue, 31 May 2016 11:19:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2B28AC002 for ; Tue, 31 May 2016 09:19:45 -0700 (PDT) X-ASG-Debug-ID: 1464711579-04cb6c2dbca81380001-NocioJ Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id 0z6KbxsIPcwr15oG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 09:19:40 -0700 (PDT) X-Barracuda-Envelope-From: gwendal@google.com X-Barracuda-Effective-Source-IP: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wm0-f51.google.com with SMTP id z87so115041246wmh.0 for ; Tue, 31 May 2016 09:19:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=t4jcNgguOcLAE/qVaCx8ttDlQYlXbknMtDYR/Pv39TE=; b=YlHHThcm0ir62OoYDITf3pnRDrqaeBAx8BqZ1xJanqRRcrRN36UkdJlZFNXRPx7F06 FvexNozBf+TwKONQdu5WeAVulNoFlJYuOrn+YKI/zUa2fFq9FCLKZdSZ5wP49g2h+RrD hsHc5G7TaNqYxzhpifhXOjzZVvvhlzYrBBtGGzaEYEkOQGRpdcLGb1ceF74ARmqJ7xjL WhZtJ04YBKMONZTpmrw6+hZ3GHqdO+AyLyyn4wr2qhb3aGQlQ0P5T+WWSKcZTPQirdcV 4cjEwFXMBMNtQGkXbWwNQYV9YIKXtRv1eetcDrvlCsBhESq/zDrFe9776CooOsXdt8b1 gGuQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=t4jcNgguOcLAE/qVaCx8ttDlQYlXbknMtDYR/Pv39TE=; b=YZDYLBJL/wAUUjPqohmeYjRJA/Ad6EsXMoCmWRUUVSNgk7t/KAc3d6BoY6NMb+3Eg0 +y8LhPiFum5JBzafi5Y9xx+Hgq30d5Xiqpyp2OVReJqIca4BbllQzvfUFSC20iDpob1K Dq6CDChhuqxp70kmY466ObZDPjkQu8UgnBV0s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=t4jcNgguOcLAE/qVaCx8ttDlQYlXbknMtDYR/Pv39TE=; b=BvmYf/6GhYhfXh+0ePZj+Ns79T/UEwgeoWeghzHfgVP/oqAcqggFsTLm+bX2ea6hF5 bUZTWjW95uOroV7ygw2+Bmh62k4GfmNIKyf9l6UkNEpe+MMzhC7N2ZFPvs9GRdSKl47s nDSs6Bsmw6LHR+/TGtn8bbJOKrs4Wz1YTQIO8SkNvjATv5Urp++1R1dY53E9NxyT1Hoq 6xpATXu0dfV9ciLsYrJTBcU/XAIL/VgGHDSSZMUDw2dXINRXDiK34/beviknZJpbgFck lNR7hs8tLD78ElH+q/yYbL6vEcRQLPEwR5Ptj6StLCWYDWmV0SNqS9hIf0j2tgBog40D PIjA== X-Gm-Message-State: ALyK8tIq4qbSR4bx80gnhurYu31g4qxTT8A1OUEJcnLQz/COdtFSET76GgRoLqlJED9/7wpePnLIPklHSUFcoWKr X-Received: by 10.28.221.136 with SMTP id u130mr16156344wmg.44.1464711578764; Tue, 31 May 2016 09:19:38 -0700 (PDT) MIME-Version: 1.0 Sender: gwendal@google.com Received: by 10.28.157.213 with HTTP; Tue, 31 May 2016 09:19:19 -0700 (PDT) In-Reply-To: <20160531125157.GB17018@infradead.org> References: <1437913255-7524-4-git-send-email-tytso@mit.edu> <1454361909-36538-1-git-send-email-gwendal@chromium.org> <20160202180828.GA13880@infradead.org> <20160531125157.GB17018@infradead.org> From: Gwendal Grignou Date: Tue, 31 May 2016 09:19:19 -0700 X-Google-Sender-Auth: 3fAnzLfff8sAK8NCR_NkEQaJ_VA Message-ID: Subject: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation To: Christoph Hellwig X-ASG-Orig-Subj: Re: xfsprogs: Add BUILD_CFLAGS for cross compilation Cc: Gwendal Grignou , "Theodore Ts'o" , fstests@vger.kernel.org, xfs@oss.sgi.com, vapier@gentoo.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1464711579 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 584 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature [+Mike] Sure. Mike suggested improvements (ability to specify the host compiler), and found I did not properly regenerate ./configure. I will resubmit a better patch. Gwendal. On Tue, May 31, 2016 at 5:51 AM, Christoph Hellwig wrote: > On Fri, May 27, 2016 at 09:34:50AM -0700, Gwendal Grignou wrote: >> Looking at xfsprogs-4.5.0, that patch has not been applied. Did it not work? >> It still applies cleanly on 4.5. > > It probably just got missed by Dave between all the patches on the list. > Can you just resend it with my Reviewed-by tag added? From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 11:31:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ACAB57CA2 for ; Tue, 31 May 2016 11:31:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38E79AC003 for ; Tue, 31 May 2016 09:31:22 -0700 (PDT) X-ASG-Debug-ID: 1464712279-04cbb03568a95a10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rzYoL7dqysFkISMm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 09:31:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7mZa-0004Bl-R4; Tue, 31 May 2016 16:31:18 +0000 Date: Tue, 31 May 2016 09:31:18 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path Message-ID: <20160531163118.GA7016@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-4-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464712279 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 731 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, May 31, 2016 at 10:35:01AM -0500, Eric Sandeen wrote: > Coverity thinks this is problematic, calling it a > "Free of address-of expression (BAD_FREE)" > > CID 1362192 > > The issue is that if bio still == io_inline_bio, we are freeing > memory which was not allocated. No, we free the ioend into which the bio is embedded. Take a look at the allocation side in xfs_alloc_ioend: bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, xfs_ioend_bioset); ioend = container_of(bio, struct xfs_ioend, io_inline_bio); > Maybe this needs a: > > if (bio != &ioend->io_inline_bio) > bio_put(bio); That would leak every ioend used. > or is there a better way? We just need to shut up the checker.. From darrick.wong@oracle.com Tue May 31 11:42:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 083FE7CA2 for ; Tue, 31 May 2016 11:42:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC53E304048 for ; Tue, 31 May 2016 09:42:43 -0700 (PDT) X-ASG-Debug-ID: 1464712961-04cb6c2dbca83b80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LY3hF25GqPtxkVpH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 09:42:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4VGfiDd023893 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 31 May 2016 16:41:44 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4VGfhGf013677 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 31 May 2016 16:41:43 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u4VGfenL018297; Tue, 31 May 2016 16:41:41 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 May 2016 09:41:39 -0700 Date: Tue, 31 May 2016 09:41:38 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: linux-btrfs@vger.kernel.org, Xiao Yang , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 8/7] xfs/122: don't break on old xfsprogs Message-ID: <20160531164138.GB5053@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 8/7] xfs/122: don't break on old xfsprogs References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <20160527180231.GB5050@birch.djwong.org> <20160531125109.GA17018@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531125109.GA17018@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464712961 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 380 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, May 31, 2016 at 05:51:09AM -0700, Christoph Hellwig wrote: > Looks fine, but can't we also remove the workaround at the end of the > the test as well? Oh, heh, yes, those can go. The whitespace is wrong on them anyway. --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue May 31 11:44:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EAD1E7CA2 for ; Tue, 31 May 2016 11:44:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD8AD30404E for ; Tue, 31 May 2016 09:44:23 -0700 (PDT) X-ASG-Debug-ID: 1464713061-04cbb03568a96780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id p5XQCxwjuIJ2ZJyY for ; Tue, 31 May 2016 09:44:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DD0862B18; Tue, 31 May 2016 11:44:19 -0500 (CDT) Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-4-git-send-email-hch@lst.de> <20160531163118.GA7016@infradead.org> Cc: xfs@oss.sgi.com From: Eric Sandeen Message-ID: <066e4a87-42f9-2c3c-3ab2-f9be58af8b97@sandeen.net> Date: Tue, 31 May 2016 11:44:20 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <20160531163118.GA7016@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464713061 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 898 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 5/31/16 11:31 AM, Christoph Hellwig wrote: > On Tue, May 31, 2016 at 10:35:01AM -0500, Eric Sandeen wrote: >> Coverity thinks this is problematic, calling it a >> "Free of address-of expression (BAD_FREE)" >> >> CID 1362192 >> >> The issue is that if bio still == io_inline_bio, we are freeing >> memory which was not allocated. > > No, we free the ioend into which the bio is embedded. Take a look > at the allocation side in xfs_alloc_ioend: > > bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, xfs_ioend_bioset); > > ioend = container_of(bio, struct xfs_ioend, io_inline_bio); > > >> Maybe this needs a: >> >> if (bio != &ioend->io_inline_bio) >> bio_put(bio); > > That would leak every ioend used. > >> or is there a better way? > > We just need to shut up the checker.. Hrmph, I guess I have misunderstood what's going on. :/ Sorry. -Eric From darrick.wong@oracle.com Tue May 31 11:44:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9277B7CA2 for ; Tue, 31 May 2016 11:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3FB3AC002 for ; Tue, 31 May 2016 09:44:39 -0700 (PDT) X-ASG-Debug-ID: 1464713077-04cbb0356aa96850001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ojYO5NHF11pk0uLr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 09:44:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4VGi26x027302 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 31 May 2016 16:44:02 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u4VGi2F7024765 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 31 May 2016 16:44:02 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4VGi0p8022079; Tue, 31 May 2016 16:44:01 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 May 2016 09:43:59 -0700 Date: Tue, 31 May 2016 09:43:52 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: Xiao Yang , fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com, hch@infradead.org Subject: [PATCH v2 8/7] xfs/122: don't break on old xfsprogs Message-ID: <20160531164352.GC5053@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 8/7] xfs/122: don't break on old xfsprogs References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <20160527180231.GB5050@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160527180231.GB5050@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464713077 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2132 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If we're running against a old version of xfsprogs that lacks some of the structures that the golden output knows about, copy the structure size definition from the golden output to the program output. This way we can check for structure size mutations on old xfsprogs without generating false error reports for structs that don't exist in the old release. v2: Remove the xfsprogs 2.9.8 compatibility cruft. Signed-off-by: Darrick J. Wong --- tests/xfs/122 | 17 ++++++----------- tests/xfs/122.out | 1 + 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/xfs/122 b/tests/xfs/122 index 845cdd2..330d3ac 100755 --- a/tests/xfs/122 +++ b/tests/xfs/122 @@ -73,6 +73,7 @@ _attribute_filter() cprog=$tmp.get_structs.c oprog=$tmp.get_structs progout=$tmp.output +keyfile=$tmp.keys cat >$cprog <> $seqres.full 2>&1 || \ _notrun "Could not compile test program (see end of $seqres.full)" $oprog | _type_size_filter | _type_name_filter > $progout -# -# add addition sizes and xfs_sb_t fields that don't exist in the version -# being tested. -# +# Find all the items that only exist in the golden output +comm -23 <(grep '=' $0.out | sed -e 's/ =.*$//g' | LC_COLLATE=POSIX sort) \ + <(sed -e 's/ =.*$//g' < $progout | LC_COLLATE=POSIX sort) > $keyfile -# xfsprogs 2.9.8: sb_bad_features2 in pv 978822 -if [ $XFSPROGS_VERSION -lt 20908 ]; then - echo 'offsetof(xfs_sb_t, sb_bad_features2 ) = 204' >>$progout -fi -if [ $XFSPROGS_VERSION -lt 30000 ]; then - echo 'sizeof( xfs_dsb_t ) = 208' >>$progout; -fi +# Copy those items to the program output +grep -F -f $keyfile $0.out >> $progout LC_COLLATE=POSIX sort $progout diff --git a/tests/xfs/122.out b/tests/xfs/122.out index 451871e..46d1dd4 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -147,3 +147,4 @@ sizeof(xfs_lookup_t) = 4 sizeof(xfs_qoff_logformat_t) = 20 sizeof(xfs_timestamp_t) = 8 sizeof(xfs_trans_header_t) = 16 +sizeof(xfs_zzzz_test_the_test_program) = -47 From sandeen@sandeen.net Tue May 31 12:35:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4EF17CA2 for ; Tue, 31 May 2016 12:35:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F302AC003 for ; Tue, 31 May 2016 10:35:38 -0700 (PDT) X-ASG-Debug-ID: 1464716135-04bdf05ad4aaf7d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id s5BBkedCpcElajcB for ; Tue, 31 May 2016 10:35:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B202C2B18 for ; Tue, 31 May 2016 12:35:35 -0500 (CDT) Subject: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: optimize bio handling in the buffer writeback path References: <1458128681-10869-1-git-send-email-hch@lst.de> <1458128681-10869-4-git-send-email-hch@lst.de> <20160531163118.GA7016@infradead.org> <066e4a87-42f9-2c3c-3ab2-f9be58af8b97@sandeen.net> From: Eric Sandeen Message-ID: Date: Tue, 31 May 2016 12:35:36 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <066e4a87-42f9-2c3c-3ab2-f9be58af8b97@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464716136 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 259 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30059 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/31/16 11:44 AM, Eric Sandeen wrote: > Hrmph, I guess I have misunderstood what's going on. :/ Sorry. I wasn't aware of the whole bioset front_pad stuff. Tricky and clever and horrible all at the same time IMHO. ;) Makes sense now. -Eric From billodo@redhat.com Tue May 31 12:37:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3DF3A7CA2 for ; Tue, 31 May 2016 12:37:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADF90AC007 for ; Tue, 31 May 2016 10:37:28 -0700 (PDT) X-ASG-Debug-ID: 1464716246-04cb6c2db9a91600001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BQnqbzNA4ztePJjP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 10:37:27 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2FC0C7F6A2 for ; Tue, 31 May 2016 17:37:26 +0000 (UTC) Received: from localhost.localdomain.com (vpn-61-108.rdu2.redhat.com [10.10.61.108]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4VHbPDg025164 for ; Tue, 31 May 2016 13:37:25 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH V2] xfs_repair: further improvement on secondary superblock search method Date: Tue, 31 May 2016 12:37:24 -0500 X-ASG-Orig-Subj: [PATCH V2] xfs_repair: further improvement on secondary superblock search method Message-Id: <1464716244-2401-1-git-send-email-billodo@redhat.com> In-Reply-To: <1463085496-17919-1-git-send-email-billodo@redhat.com> References: <1463085496-17919-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 31 May 2016 17:37:26 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1464716247 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5084 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch is a further optimization of secondary sb search, in order to handle non-default geometries. Once again, use a similar method to find fs geometry as that of xfs_mkfs. Refactor verify_sb(), creating new sub-function that checks sanity of agblocks and agcount: verify_sb_blocksize(). If verify_sb_blocksize verifies sane paramters, use found values for the sb search. Otherwise, try search with default values. If these faster methods both fail, fall back to original brute force slower search. NOTE: patch series "xfs_repair: improved secondary sb search" must be applied before applying this patch. (http://oss.sgi.com/archives/xfs/2016-05/msg00269.html) v2: simplify verify_sb_blocksize function. remove unneeded parentheses. remove redundant warns about attempt to find secondary sb. Signed-off-by: Bill O'Donnell --- repair/sb.c | 78 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/repair/sb.c b/repair/sb.c index 7e4708c..3965953 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -23,12 +23,10 @@ #include "globals.h" #include "protos.h" #include "err_protos.h" +#include "xfs_multidisk.h" #define BSIZE (1024 * 1024) -#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) -#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ - /* * copy the fields of a superblock that are present in primary and * secondaries -- preserve fields that are different in the primary. @@ -85,6 +83,21 @@ copy_sb(xfs_sb_t *source, xfs_sb_t *dest) memset(source->sb_fname, 0, 12); } +int +verify_sb_blocksize(xfs_sb_t *sb) +{ + /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ + if (sb->sb_blocksize == 0) + return XR_BAD_BLOCKSIZE; + if (sb->sb_blocksize != (1 << sb->sb_blocklog)) + return XR_BAD_BLOCKLOG; + if (sb->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || + sb->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG) + return XR_BAD_BLOCKLOG; + + return 0; +} + /* * find a secondary superblock, copy it into the sb buffer. * start is the point to begin reading BSIZE bytes. @@ -106,8 +119,6 @@ __find_secondary_sb( int retval; int bsize; - do_warn(_("\nattempting to find secondary superblock...\n")); - sb = (xfs_sb_t *)memalign(libxfs_device_alignment(), BSIZE); if (!sb) { do_error( @@ -205,29 +216,36 @@ guess_default_geometry( int find_secondary_sb(xfs_sb_t *rsb) { - int retval; + int retval = 0; __uint64_t agcount; __uint64_t agsize; __uint64_t skip; int blocklog; /* - * Attempt to find secondary sb with a coarse approach. - * Failing that, fallback to a fine-grained approach. + * Attempt to find secondary sb with a coarse approach, + * first trying agblocks and blocksize read from sb, providing + * they're sane. */ - blocklog = guess_default_geometry(&agsize, &agcount, &x); + do_warn(_("\nattempting to find secondary superblock...\n")); - /* - * use found ag geometry to quickly find secondary sb - */ - skip = agsize << blocklog; - retval = __find_secondary_sb(rsb, skip, skip); - if (!retval) { - /* - * fallback: Start at min agsize and scan all blocks - */ - retval = __find_secondary_sb(rsb, XFS_AG_MIN_BYTES, BSIZE); + if (verify_sb_blocksize(rsb) == 0) { + skip = rsb->sb_agblocks * rsb->sb_blocksize; + if (skip >= XFS_AG_MIN_BYTES && skip <= XFS_AG_MAX_BYTES) + retval = __find_secondary_sb(rsb, skip, skip); } + + /* If that failed, retry coarse approach, using default geometry */ + if (!retval) { + blocklog = guess_default_geometry(&agsize, &agcount, &x); + skip = agsize << blocklog; + retval = __find_secondary_sb(rsb, skip, skip); + } + + /* If that failed, fall back to the brute force method */ + if (!retval) + retval = __find_secondary_sb(rsb, XFS_AG_MIN_BYTES, BSIZE); + return retval; } @@ -328,6 +346,7 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) { __uint32_t bsize; int i; + int ret; /* check magic number and version number */ @@ -369,23 +388,10 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) !xfs_verify_cksum(sb_buf, sb->sb_sectsize, XFS_SB_CRC_OFF)) return XR_BAD_CRC; - /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ - if (sb->sb_blocksize == 0) - return(XR_BAD_BLOCKSIZE); - - bsize = 1; - - for (i = 0; bsize < sb->sb_blocksize && - i < sizeof(sb->sb_blocksize) * NBBY; i++) - bsize <<= 1; - - if (i < XFS_MIN_BLOCKSIZE_LOG || i > XFS_MAX_BLOCKSIZE_LOG) - return(XR_BAD_BLOCKSIZE); - - /* check sb blocksize field against sb blocklog field */ - - if (i != sb->sb_blocklog) - return(XR_BAD_BLOCKLOG); + /* check to ensure blocksize and blocklog are legal */ + ret = verify_sb_blocksize(sb); + if (ret != 0) + return ret; /* sanity check ag count, size fields against data size field */ -- 2.5.5 From sandeen@sandeen.net Tue May 31 13:29:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1EF4C7CA2 for ; Tue, 31 May 2016 13:29:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E63A3304062 for ; Tue, 31 May 2016 11:29:32 -0700 (PDT) X-ASG-Debug-ID: 1464719359-04cb6c2dbaa9a1b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FrBe9itbtTxDHCbV for ; Tue, 31 May 2016 11:29:20 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CD8FF2B18 for ; Tue, 31 May 2016 13:29:19 -0500 (CDT) Subject: Re: [PATCH] xfs: fix broken multi-fsb buffer logging To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix broken multi-fsb buffer logging References: <1464204667-10199-1-git-send-email-bfoster@redhat.com> From: Eric Sandeen Message-ID: Date: Tue, 31 May 2016 13:29:19 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464204667-10199-1-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1464719359 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5449 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30060 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/25/16 2:31 PM, Brian Foster wrote: > Multi-block buffers are logged based on buffer offset in > xfs_trans_log_buf(). xfs_buf_item_log() ultimately walks each mapping in > the buffer and marks the associated range to be logged in the > xfs_buf_log_format bitmap for that mapping. This code is broken, > however, in that it marks the actual buffer offsets of the associated > range in each bitmap rather than shifting to the byte range for that > particular mapping. > > For example, on a 4k fsb fs, buffer offset 4096 refers to the first byte > of the second mapping in the buffer. This means byte 0 of the second log > format bitmap should be tagged as dirty. Instead, the current code marks > byte offset 4096 of the second log format bitmap, which is invalid and > potentially out of range of the mapping. > > As a result of this, the log item format code invoked at transaction > commit time is not be able to correctly identify what parts of the > buffer to copy into log vectors. This can lead to NULL log vector > pointer dereferences in CIL push context if the item format code was not > able to locate any dirty ranges at all. This crash has been reproduced > on a 4k FSB filesystem using 16k directory blocks where an unlink > operation happened not to log anything in the first block of the > mapping. The logged offsets were all over 4k, marked as such in the > subsequent log format mappings, and thus left the transaction with an > xfs_log_item that is marked DIRTY but without any logged regions. > > Further, even when the logged regions are marked correctly in the buffer > log format bitmaps, the format code doesn't copy the correct ranges of > the buffer into the log. This means that any logged region beyond the > first block of a multi-block buffer is subject to corruption after a > crash and log recovery sequence. This is due to a failure to convert the > mapping bm_len field from basic blocks to bytes in the buffer offset > tracking code in xfs_buf_item_format(). > > Update xfs_buf_item_log() to convert buffer offsets to segment relative > offsets when logging multi-block buffers. This ensures that the modified > regions of a buffer are logged correctly and avoids the aforementioned > crash. Also update xfs_buf_item_format() to correctly track the source > offset into the buffer for the log vector formatting code. This ensures > that the correct data is copied into the log. > > Signed-off-by: Brian Foster > --- > > Note that this has only been tested so far in a particular filesystem > environment that reproduces the crash/corruption discussed in the commit > log description. Generic testing still required, posting just to get a > jump on review... > > Brian > > fs/xfs/xfs_buf_item.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 3425799..2e95ad0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -359,7 +359,7 @@ xfs_buf_item_format( > for (i = 0; i < bip->bli_format_count; i++) { > xfs_buf_item_format_segment(bip, lv, &vecp, offset, > &bip->bli_formats[i]); > - offset += bp->b_maps[i].bm_len; > + offset += BBTOB(bp->b_maps[i].bm_len); Yep this and the other instance in the other hunk look obviously correct. > } > > /* > @@ -915,20 +915,28 @@ xfs_buf_item_log( > for (i = 0; i < bip->bli_format_count; i++) { > if (start > last) > break; > - end = start + BBTOB(bp->b_maps[i].bm_len); > + end = start + BBTOB(bp->b_maps[i].bm_len) - 1; > + So let's say start is 0, and len is 8, just making up nice numbers. That means a range of 0 through 7, with the next one starting at 8. 7 is the last block, so if "first" is beyond that, we need to skip. Makes sense. > + /* skip to the map that includes the first byte to log */ > if (first > end) { > start += BBTOB(bp->b_maps[i].bm_len); > continue; > } > + > + /* > + * Trim the range to this segment and mark it in the bitmap. > + * Note that we must convert buffer offsets to segment relative > + * offsets (e.g., the first byte of each segment is byte 0 of > + * that segment). > + */ > if (first < start) > first = start; > if (end > last) > end = last; > - > - xfs_buf_item_log_segment(first, end, > + xfs_buf_item_log_segment(first - start, end - start, > &bip->bli_formats[i].blf_data_map[0]); I guess this is the trickiest part. in the called function, we do: /* * Get a pointer to the first word in the bitmap * to set a bit in. */ word_num = first_bit >> BIT_TO_WORD_SHIFT; wordp = &map[word_num]; where first_bit is derived from the passed-in "first" argument (in bytes). So we're marking bits in map[]; this skips us out into the word_num index in map[]. But what's map? The map[] we passed in is &bip->bli_formats[i].blf_data_map[0], where 'i' is the i'th segment. So yes, this needs to be segment-relative bytes, whereas start (and therefore end) are offsets in the whole buffer. So yes, this makes sense to me as well. > > - start += bp->b_maps[i].bm_len; > + start += BBTOB(bp->b_maps[i].bm_len); Again obviously correct. Reviewed-by: Eric Sandeen > } > } > > From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 14:33:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D7CE47CA2 for ; Tue, 31 May 2016 14:33:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5317BAC001 for ; Tue, 31 May 2016 12:33:02 -0700 (PDT) X-ASG-Debug-ID: 1464723179-04cbb0356baac760001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id K8q22CVStMBy4viz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 12:32:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7pPO-0007YQ-Jr; Tue, 31 May 2016 19:32:58 +0000 From: Christoph Hellwig To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: [PATCH, reflink] xfs: fix logging of AGF refcount btree fields Date: Tue, 31 May 2016 21:32:55 +0200 X-ASG-Orig-Subj: [PATCH, reflink] xfs: fix logging of AGF refcount btree fields Message-Id: <1464723175-2164-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464723179 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2134 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30061 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 These fields are separate from the existing roots and levels array and thus need a separate logging flag. That being said the API to logs the AGI/AGF is a bit of a nightmare, and I have an idea how to improve it. Stay tuned.. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_alloc.c | 4 ++++ fs/xfs/libxfs/xfs_format.h | 5 ++++- fs/xfs/libxfs/xfs_refcount_btree.c | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 6cbca1b..e6e32c2 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2327,6 +2327,10 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), + offsetof(xfs_agf_t, agf_refcount_root), + offsetof(xfs_agf_t, agf_refcount_level), + /* needed so that we don't log the whole rest of the structure: */ + offsetof(xfs_agf_t, agf_spare64), sizeof(xfs_agf_t) }; diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index e00037c..5cc0b8c 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -681,7 +681,10 @@ typedef struct xfs_agf { #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 -#define XFS_AGF_NUM_BITS 13 +#define XFS_AGF_REFCOUNT_ROOT 0x00002000 +#define XFS_AGF_REFCOUNT_LEVEL 0x00004000 +#define XFS_AGF_SPARE64 0x00008000 +#define XFS_AGF_NUM_BITS 16 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index 3391cbd..303f959 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -61,7 +61,8 @@ xfs_refcountbt_set_root( pag->pagf_refcount_level += inc; xfs_perag_put(pag); - xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); + xfs_alloc_log_agf(cur->bc_tp, agbp, + XFS_AGF_REFCOUNT_ROOT | XFS_AGF_REFCOUNT_LEVEL); } STATIC int -- 2.1.4 From BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org Tue May 31 14:33:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7771A7CA2 for ; Tue, 31 May 2016 14:33:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4DFAAC001 for ; Tue, 31 May 2016 12:33:10 -0700 (PDT) X-ASG-Debug-ID: 1464723188-04cbb0356aaac780001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id c66rZaNGvs3wghB2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 12:33:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c55fe4ca053657887ab1+4664+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1b7pPW-0007aR-AR; Tue, 31 May 2016 19:33:06 +0000 Date: Tue, 31 May 2016 12:33:06 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, hch@infradead.org, linux-btrfs@vger.kernel.org, Xiao Yang , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 8/7] xfs/122: don't break on old xfsprogs Message-ID: <20160531193306.GA28680@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 8/7] xfs/122: don't break on old xfsprogs References: <146424222237.6278.4174636124436241002.stgit@birch.djwong.org> <20160527180231.GB5050@birch.djwong.org> <20160531164352.GC5053@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531164352.GC5053@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1464723188 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30061 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From darrick.wong@oracle.com Tue May 31 15:15:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 063867CA2 for ; Tue, 31 May 2016 15:15:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB154304059 for ; Tue, 31 May 2016 13:15:08 -0700 (PDT) X-ASG-Debug-ID: 1464725705-04bdf05ad4ac2310001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id B3vqWxGdJ0kJ5LMd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 31 May 2016 13:15:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4VKF2s7008763 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 31 May 2016 20:15:03 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u4VKF2h8011047 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 31 May 2016 20:15:02 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4VKF1BQ002984; Tue, 31 May 2016 20:15:01 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 May 2016 13:15:00 -0700 Date: Tue, 31 May 2016 13:14:59 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH, reflink] xfs: fix logging of AGF refcount btree fields Message-ID: <20160531201459.GD5053@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH, reflink] xfs: fix logging of AGF refcount btree fields References: <1464723175-2164-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464723175-2164-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1464725706 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2577 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30062 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, May 31, 2016 at 09:32:55PM +0200, Christoph Hellwig wrote: > These fields are separate from the existing roots and levels array > and thus need a separate logging flag. > > That being said the API to logs the AGI/AGF is a bit of a nightmare, > and I have an idea how to improve it. Stay tuned.. Looks good, tests great!, Reviewed-by: Darrick J. Wong (Will keep ears open.) --D > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/libxfs/xfs_alloc.c | 4 ++++ > fs/xfs/libxfs/xfs_format.h | 5 ++++- > fs/xfs/libxfs/xfs_refcount_btree.c | 3 ++- > 3 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 6cbca1b..e6e32c2 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2327,6 +2327,10 @@ xfs_alloc_log_agf( > offsetof(xfs_agf_t, agf_longest), > offsetof(xfs_agf_t, agf_btreeblks), > offsetof(xfs_agf_t, agf_uuid), > + offsetof(xfs_agf_t, agf_refcount_root), > + offsetof(xfs_agf_t, agf_refcount_level), > + /* needed so that we don't log the whole rest of the structure: */ > + offsetof(xfs_agf_t, agf_spare64), > sizeof(xfs_agf_t) > }; > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index e00037c..5cc0b8c 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -681,7 +681,10 @@ typedef struct xfs_agf { > #define XFS_AGF_LONGEST 0x00000400 > #define XFS_AGF_BTREEBLKS 0x00000800 > #define XFS_AGF_UUID 0x00001000 > -#define XFS_AGF_NUM_BITS 13 > +#define XFS_AGF_REFCOUNT_ROOT 0x00002000 > +#define XFS_AGF_REFCOUNT_LEVEL 0x00004000 > +#define XFS_AGF_SPARE64 0x00008000 > +#define XFS_AGF_NUM_BITS 16 > #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) > > #define XFS_AGF_FLAGS \ > diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c > index 3391cbd..303f959 100644 > --- a/fs/xfs/libxfs/xfs_refcount_btree.c > +++ b/fs/xfs/libxfs/xfs_refcount_btree.c > @@ -61,7 +61,8 @@ xfs_refcountbt_set_root( > pag->pagf_refcount_level += inc; > xfs_perag_put(pag); > > - xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); > + xfs_alloc_log_agf(cur->bc_tp, agbp, > + XFS_AGF_REFCOUNT_ROOT | XFS_AGF_REFCOUNT_LEVEL); > } > > STATIC int > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue May 31 17:40:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AB8137CA2 for ; Tue, 31 May 2016 17:40:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F9AC30404E for ; Tue, 31 May 2016 15:40:17 -0700 (PDT) X-ASG-Debug-ID: 1464734413-04cb6c2dbaaac7a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id XLIFSUHOS8A1BNfg for ; Tue, 31 May 2016 15:40:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AaCQCOEU5XLf0/LHlbgz2BU4J2g3mebAEBAQEBAQaMJYV4gh2BeoYLAgIBAQKBPDoTAQEBAQEBAQYBAQEBAUABQIRFAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTiCcHv14BAQEBBgIBJB6FQYUVh3SCLgWYN44WgXOHe4U4j0wiAYQ+KjKKOAEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 01 Jun 2016 08:10:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7sKK-0005tW-EI; Wed, 01 Jun 2016 08:39:56 +1000 Date: Wed, 1 Jun 2016 08:39:56 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix broken multi-fsb buffer logging Message-ID: <20160531223956.GF12670@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix broken multi-fsb buffer logging References: <1464204667-10199-1-git-send-email-bfoster@redhat.com> <20160531083252.GR26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160531083252.GR26977@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464734414 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1295 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 06:32:52PM +1000, Dave Chinner wrote: > On Wed, May 25, 2016 at 03:31:07PM -0400, Brian Foster wrote: > > Multi-block buffers are logged based on buffer offset in > > xfs_trans_log_buf(). xfs_buf_item_log() ultimately walks each mapping in > > the buffer and marks the associated range to be logged in the > > xfs_buf_log_format bitmap for that mapping. This code is broken, > > however, [....] > > [snip description I've not read, and go look at the code changes] .... > So from the code perspective the change looks correct. I've looked > over all the other users of bp->b_maps[i].bm_len and loops over > bli_format_count and I can't see any other obvious problems. I'm > going to leave this under test overnight and see if anything pops > up... Passes all the tests I've thrown at it. multiple xfstests runs on multiple machines with dir block sizes from 16k to 64k, fsmark runs with 16k and 64k block sizes, dbench stress loops with up to 500 processes running at once, etc. Reviewed-by: Dave Chinner I'll commit this when I get to updating the xfs trees now that the merge window has closed and 4.7-rc1 is out. Hopefully that will be later today.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 31 19:04:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58F097CA2 for ; Tue, 31 May 2016 19:04:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D311EAC001 for ; Tue, 31 May 2016 17:04:09 -0700 (PDT) X-ASG-Debug-ID: 1464739447-04cb6c2dbaab0050001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0zLYGjU7rQnIimz1 for ; Tue, 31 May 2016 17:04:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DeDQDUJU5XLf0/LHlbgz2BU4J2g3mebQEBAQEBAQaMJYV4hBeGBwQEgTw9EAEBAQEBAQEGAQEBAQFAAUBBEAGEUDskNAUlAwctiC6eT6FLDh6FQYohhRYFmDeOFoFdARWET4hiAoYziRk3gWEBCwGCPCoygh6IGgEBAQ Received: from ppp121-44-63-253.lns20.syd4.internode.on.net (HELO dastard) ([121.44.63.253]) by ipmail05.adl6.internode.on.net with ESMTP; 01 Jun 2016 09:33:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7tcr-00061S-I2 for xfs@oss.sgi.com; Wed, 01 Jun 2016 10:03:09 +1000 Date: Wed, 1 Jun 2016 10:03:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: master, for-next branches update to v4.7-rc1 Message-ID: <20160601000309.GG12670@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: master, for-next branches update to v4.7-rc1 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qDbXVdCdHGoSgWSk" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1464739447 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 244 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30067 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --qDbXVdCdHGoSgWSk Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The cycle begins again - I just updated the XFS master and for-next branches to v4.7-rc1. Please update your trees and send new patches against these updated branches. Thanks! -Dave. --=20 Dave Chinner david@fromorbit.com --qDbXVdCdHGoSgWSk Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXTiY9AAoJEK3oKUf0dfodW3YP/2eyWo4Me+fJcy2GYGrAsx1g DC5LqrCYNnm9PWsDETRQOOEjFRNgVhPCAmh93P7Q4DTTHizDZkp8yHp7YN+I7ovn snahPky3OmWh89I0m5XzORY8XC1kqG1LceGj6dEwZGY5I+AhbhD0roYMXFkjLM0w Zttn+dPdL4NEhWUL4DRPKpjIpHPs2DJ6WtITf2eQcGjJp/RjPlGMTgpkkkTEs9Xm wrySQGdk89e+6nO6i/DtEDAc6H5pTCjF8FvOiqLIvlsOeKdLQgRPcr2+mDFKoj3m LRXg0UORG08wPMuYeoWXiVk8ql180dcHBeE7ZJw53mpxZQYJw1caTqDUfr/HMPX9 sSCDTCMeYr/mOwszyX55p2C2KQnF+yT9mw8H6foaXhPUPig2t8JGrFcgMNkQF9V2 A8MfDcyxGRvSL/Qc7fdIZKstYvQgof7Kn0tZxuzVlaywcStGwjnea993Ny1/DWLM OmT7qiHC6lzQquEY5k55oHGKB/v8Ml7huS1zBt8KWbIJfd875Rr0o5TISA5/OxfT 5UWm0nyO+sCk0kfpAViTQMG0Fn/u7IkEAAdETh68/fMk3KdMt9JNXQGA/Z67RhoC qiPmkpsL1dHOvsYihJOEag2O13usI5823sMZ7QG19DUVo3VLK5p1bZir3cICUACi smGKIrsvzhvOMfqatql4 =RCdU -----END PGP SIGNATURE----- --qDbXVdCdHGoSgWSk-- From bounces+2504343-36b9-xfs=oss.sgi.com@sendgrid.net Tue May 31 19:50:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, SPOOFED_URL_HOST,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CDBB97CA2 for ; Tue, 31 May 2016 19:50:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9FE99304066 for ; Tue, 31 May 2016 17:50:30 -0700 (PDT) X-ASG-Debug-ID: 1464742215-04cbb03569abda50001-NocioJ Received: from o3.server2.stampready.net (o3.server2.stampready.net [167.89.25.94]) by cuda.sgi.com with ESMTP id fbXcKxiAHMHth5ff (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 31 May 2016 17:50:17 -0700 (PDT) X-Barracuda-Envelope-From: bounces+2504343-36b9-xfs=oss.sgi.com@sendgrid.net X-Barracuda-Effective-Source-IP: o3.server2.stampready.net[167.89.25.94] X-Barracuda-Apparent-Source-IP: 167.89.25.94 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.net; h=content-transfer-encoding:content-type:from:mime-version:subject:to; s=smtpapi; bh=AyEimDUQvb5VGN9semlyjim1ms0=; b=u91g4MueYrjeuhkLs6 E81vYEwZOQkX7QFIJe67+srTXNcNkceeP32DnojlOJwVD6PtrmH7vP20iJJ4Ny7k QBdO6ySDOwHykc2nv7+nJqoAePwUWFb47VMn+J5x1djz9ozzVuLLvbIL4RqNYVLX JxBWa5ZKEcczr5UWjnT+Fjzb4= Received: by filter0829p1mdw1.sendgrid.net with SMTP id filter0829p1mdw1.16114.574E30C110 2016-06-01 00:48:01.494241931 +0000 UTC Received: from MjUwNDM0Mw (srv1.n-i-c-e.nl [128.140.221.60]) by ismtpd0004p1lon1.sendgrid.net (SG) with HTTP id qDGKUPgeRUOz6OIx8XZOtA for ; Wed, 01 Jun 2016 00:48:01.428 +0000 (UTC) Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 Date: Wed, 01 Jun 2016 00:48:01 +0000 From: "KOA CCTV" Mime-Version: 1.0 Subject: Hikvision Counter Day & Sales Event To: xfs@oss.sgi.com X-ASG-Orig-Subj: Hikvision Counter Day & Sales Event Message-ID: X-SG-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3esELtJ+Y9fNY4+sIFj7Dyjpniz2fPTldNMN9 nG+PSD5FPXSGdTenf/29Yoj7n3hOkKWxdShnKZRpIAeAk99TnaMQ/hVPCPW1dTSn9h9opXN8Whwc+d DC3yV/H/zrls5h4rWgVUOgxB27KL1G14pK1DfQla6V/FXlBosJghKQdKuw== X-SG-ID: R3ufbdLo2r/cRGFtfGlyBq+N0UDQ5m5Z60LaabNaXKXErjAvxdMcEnjOMANHlMIZRSJHAjgz5KEhV2 nElUuyE3VNH00+ivstbRIsk+xT4F+5TzNg/Hw+yQleFNlugaUfoTkhMfEpO6YesoO/x9uHnvTcFnwA Vvij70RRcNCRWlIorJaD1ZRXUXz07AmJmdck82pzrGaIGhhE2yiGWqVM6g== X-Barracuda-Connect: o3.server2.stampready.net[167.89.25.94] X-Barracuda-Start-Time: 1464742216 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 56150 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30068 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message ProductMai= l - Responsive E-mail TemplateHikvision Counter Day & S= ales Event =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09
3D"Logo"
ABOUT US | CONTACT US | E= VENTS
Customer Service 818-255-6666
Toll Free 866-606-5229
KOACCTV specializes in the wholesale distribution of CCTV C= ameras, Audio, Video and Home Innovation. We support many top leading manuf= acturers and continue to bring you the latest in technology. We carry all r= espected lines including Hikvision, HEOS, Boston Acoustics, Denon, Lutron, = Louroe, Key Digital, Zigen Samsung, Monitor Audio, Ubiquiti Networks, = Fibaro, Klein Tools...
 All installers are welcome.
Visit Our Website
 
What's = New
=20=20
=20= =20 3D"space"
Big Sales Event at KOA CCTV     

-50% OF= F ON ALL HD-SDI
& HIKVISION HD-SDI SERIES CAMERAS.
Don't miss out= on a chance to save some money!
us= e "big50" promo code to save on= your purchase!
              =                      = ;                     &nb= sp;                     &= nbsp;                    =                     &nbs= p;                     &n= bsp;     

 KOA CCTV is glad to announce Hikvisio= n Counter Day &

             =                 Sales Event On = June 1st, 2016                 =               

-10% OFF ON A= LL PRODUCTS!

Don't Miss The Chance to Save!

=09=09=09 =09=09
3D"header-image"
=20=20
=20= =20 3D"space"
3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss"
=20=20
=20= =20 3D"space"
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09
3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-vimeo"
=20=20
=20= =20 3D"space"
3D"icon-facebook" 3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss"
3D"icon-faceb= 3D= 3D"ic=
=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09
KOA= CCTV
7306 COLDWATER CA= NYON AVE
Unit 1
North Hollywood, CA 91605
http://www.koacctv.com
Unsubscribe
3D"" From minchan@kernel.org Tue May 31 20:37:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 88A1F7CA2 for ; Tue, 31 May 2016 20:37:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0538FAC001 for ; Tue, 31 May 2016 18:37:31 -0700 (PDT) X-ASG-Debug-ID: 1464745047-04cbb03568aca1a0001-NocioJ Received: from lgeamrelo13.lge.com (LGEAMRELO13.lge.com [156.147.23.53]) by cuda.sgi.com with ESMTP id 6iKRH64tDspN6FQx for ; Tue, 31 May 2016 18:37:28 -0700 (PDT) X-Barracuda-Envelope-From: minchan@kernel.org X-Barracuda-Effective-Source-IP: LGEAMRELO13.lge.com[156.147.23.53] X-Barracuda-Apparent-Source-IP: 156.147.23.53 Received: from unknown (HELO lgemrelse7q.lge.com) (156.147.1.151) by 156.147.23.53 with ESMTP; 1 Jun 2016 10:37:26 +0900 X-Original-SENDERIP: 156.147.1.151 X-Original-MAILFROM: minchan@kernel.org Received: from unknown (HELO LGEAEXHB04Q.LGE.NET) (165.244.98.204) by 156.147.1.151 with ESMTP; 1 Jun 2016 10:37:26 +0900 X-Original-SENDERIP: 165.244.98.204 X-Original-MAILFROM: minchan@kernel.org Received: from lgekrmhub07.lge.com (10.185.110.17) by LGEAEXHB04Q.LGE.NET (165.244.98.204) with Microsoft SMTP Server id 8.3.264.0; Wed, 1 Jun 2016 10:37:26 +0900 Received: from lgeamrelo04.lge.com ([156.147.1.127]) by lgekrmhub07.lge.com (Lotus Domino Release 8.5.3FP6) with ESMTP id 2016060110372579-437739 ; Wed, 1 Jun 2016 10:37:25 +0900 Received: from unknown (HELO bbox) (10.177.223.161) by 156.147.1.127 with ESMTP; 1 Jun 2016 10:37:25 +0900 X-Original-SENDERIP: 10.177.223.161 X-Original-MAILFROM: minchan@kernel.org Date: Wed, 1 Jun 2016 10:38:06 +0900 From: Minchan Kim To: Jan Kara CC: Dave Chinner , , Brian Foster , "xfs@oss.sgi.com" , , Stefan Priebe - Profihost AG Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Message-ID: <20160601013806.GK19976@bbox> X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) References: <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531095031.GA5912@quack2.suse.cz> MIME-Version: 1.0 In-Reply-To: <20160531095031.GA5912@quack2.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-MIMETrack: Itemize by SMTP Server on LGEKRMHUB07/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/06/01 10:37:25, Serialize by Router on LGEKRMHUB07/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/06/01 10:37:26, Serialize complete at 2016/06/01 10:37:26 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline X-Barracuda-Connect: LGEAMRELO13.lge.com[156.147.23.53] X-Barracuda-Start-Time: 1464745047 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9350 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 31, 2016 at 11:50:31AM +0200, Jan Kara wrote: > On Tue 31-05-16 10:07:24, Minchan Kim wrote: > > On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: > > > [adding lkml and linux-mm to the cc list] > > > > > > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: > > > > Hi Dave, > > > > Hi Brian, > > > > > > > > below are the results with a vanilla 4.4.11 kernel. > > > > > > Thanks for persisting with the testing, Stefan. > > > > > > .... > > > > > > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a > > > > fresh reboot it has happened again on the root FS for a debian apt file: > > > > > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 > > > > ------------[ cut here ]------------ > > > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 > > > > xfs_vm_releasepage+0x10f/0x140() > > > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport > > > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse > > > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan > > > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor > > > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod > > > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci > > > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas > > > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 > > > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 > > > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 > > > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 > > > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 > > > > Call Trace: > > > > [] dump_stack+0x63/0x84 > > > > [] warn_slowpath_common+0x97/0xe0 > > > > [] warn_slowpath_null+0x1a/0x20 > > > > [] xfs_vm_releasepage+0x10f/0x140 > > > > [] ? page_mkclean_one+0xd0/0xd0 > > > > [] ? anon_vma_prepare+0x150/0x150 > > > > [] try_to_release_page+0x32/0x50 > > > > [] shrink_active_list+0x3ce/0x3e0 > > > > [] shrink_lruvec+0x687/0x7d0 > > > > [] shrink_zone+0xdc/0x2c0 > > > > [] kswapd+0x4f9/0x970 > > > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 > > > > [] kthread+0xc9/0xe0 > > > > [] ? kthread_stop+0x100/0x100 > > > > [] ret_from_fork+0x3f/0x70 > > > > [] ? kthread_stop+0x100/0x100 > > > > ---[ end trace c9d679f8ed4d7610 ]--- > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size > > > > 0x12b990 > > > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size > > > ..... > > > > > > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 > > > code (so please try to reproduce on that kernel!) but it looks to me > > > like the only way we can get from shrink_active_list() direct to > > > try_to_release_page() is if we are over the maximum bufferhead > > > threshold (i.e buffer_heads_over_limit = true) and we are trying to > > > reclaim pages direct from the active list. > > > > > > Because we are called from kswapd()->balance_pgdat(), we have: > > > > > > struct scan_control sc = { > > > .gfp_mask = GFP_KERNEL, > > > .order = order, > > > .priority = DEF_PRIORITY, > > > .may_writepage = !laptop_mode, > > > .may_unmap = 1, > > > .may_swap = 1, > > > }; > > > > > > The key point here is reclaim is being run with .may_writepage = > > > true for default configuration kernels. when we get to > > > shrink_active_list(): > > > > > > if (!sc->may_writepage) > > > isolate_mode |= ISOLATE_CLEAN; > > > > > > But sc->may_writepage = true and this allows isolate_lru_pages() to > > > isolate dirty pages from the active list. Normally this isn't a > > > problem, because the isolated active list pages are rotated to the > > > inactive list, and nothing else happens to them. *Except when > > > buffer_heads_over_limit = true*. This special condition would > > > explain why I have never seen apt/dpkg cause this problem on any of > > > my (many) Debian systems that all use XFS.... > > > > > > In that case, shrink_active_list() runs: > > > > > > if (unlikely(buffer_heads_over_limit)) { > > > if (page_has_private(page) && trylock_page(page)) { > > > if (page_has_private(page)) > > > try_to_release_page(page, 0); > > > unlock_page(page); > > > } > > > } > > > > > > i.e. it locks the page, and if it has buffer heads it trys to get > > > the bufferheads freed from the page. > > > > > > But this is a dirty page, which means it may have delalloc or > > > unwritten state on it's buffers, both of which indicate that there > > > is dirty data in teh page that hasn't been written. XFS issues a > > > warning on this because neither shrink_active_list nor > > > try_to_release_page() check for whether the page is dirty or not. > > > > > > Hence it seems to me that shrink_active_list() is calling > > > try_to_release_page() inappropriately, and XFS is just the > > > messenger. If you turn laptop mode on, it is likely the problem will > > > go away as kswapd will run with .may_writepage = false, but that > > > will also cause other behavioural changes relating to writeback and > > > memory reclaim. It might be worth trying as a workaround for now. > > > > > > MM-folk - is this analysis correct? If so, why is > > > shrink_active_list() calling try_to_release_page() on dirty pages? > > > Is this just an oversight or is there some problem that this is > > > trying to work around? It seems trivial to fix to me (add a > > > !PageDirty check), but I don't know why the check is there in the > > > first place... > > > > It seems to be latter. > > Below commit seems to be related. > > [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] > > > > At that time, even shrink_page_list works like this. > > > > shrink_page_list > > while (!list_empty(page_list)) { > > .. > > .. > > if (PageDirty(page)) { > > .. > > } > > > > /* > > * If the page has buffers, try to free the buffer mappings > > * associated with this page. If we succeed we try to free > > * the page as well. > > * > > * We do this even if the page is PageDirty(). > > * try_to_release_page() does not perform I/O, but it is > > * possible for a page to have PageDirty set, but it is actually > > * clean (all its buffers are clean). This happens if the > > * buffers were written out directly, with submit_bh(). ext3 > > * will do this, as well as the blockdev mapping. > > * try_to_release_page() will discover that cleanness and will > > * drop the buffers and mark the page clean - it can be freed. > > * .. > > */ > > if (PagePrivate(page)) { > > if (!try_to_release_page(page, sc->gfp_mask)) > > goto activate_locked; > > if (!mapping && page_count(page) == 1) > > goto free_it; > > } > > .. > > } > > > > I wonder whether it's valid or not with on ext4. > > Actually, we've already discussed this about an year ago: > http://oss.sgi.com/archives/xfs/2015-06/msg00119.html > > And it was the last drop that made me remove ext3 from the tree. ext4 can > also clean dirty buffers while keeping pages dirty but it is limited only > to metadata (and data in data=journal mode) so the scope of the problem is > much smaller. So just avoiding calling ->releasepage for dirty pages may > work fine these days. > > Also it is possible to change ext4 checkpointing code to completely avoid > doing this but I never got to rewriting that code. Probably I should give > it higher priority on my todo list... Hah, you already noticed. Thanks for the information. At a first glance, it seems to fix it in /mm with checking PageDirty but it might be risky for other out-of-tree FSes without full understanding of internal and block_invalidatepage users can make such clean buffers but dirty page although there is no one in mainline now so I will leave the fix to FS guys. Thanks. > > Honza > -- > Jan Kara > SUSE Labs, CR > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org From david@fromorbit.com Tue May 31 20:42:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 25F957CA2 for ; Tue, 31 May 2016 20:42:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF1A68F8035 for ; Tue, 31 May 2016 18:42:35 -0700 (PDT) X-ASG-Debug-ID: 1464745352-04cbb0356bacaf90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id yldK4Qiral7FBD81 for ; Tue, 31 May 2016 18:42:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BHBwDCPE5XPEokLHlbgz2BU4J2g3mecAEBAQaMJYV4hBeGCwQCAoE4TQEBAQEBAQcBAQEBQkCERgEBBCcTHCMQCAMYCSUPBSUDBxoTiC7AIQEBCAIlHoVBhRWKGgWYN44WjyaPTIJoHIFdKjKKOAEBAQ Received: from ppp121-44-36-74.lns20.syd4.internode.on.net (HELO dastard) ([121.44.36.74]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Jun 2016 11:12:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1b7vAk-0006Bl-KR; Wed, 01 Jun 2016 11:42:14 +1000 Date: Wed, 1 Jun 2016 11:42:14 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: make several functions static Message-ID: <20160601014214.GH12670@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: make several functions static References: <3ec4e394-1885-6f3e-f909-c9a77a72668b@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3ec4e394-1885-6f3e-f909-c9a77a72668b@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1464745352 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1426 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.30069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, May 19, 2016 at 02:16:25PM -0500, Eric Sandeen wrote: > Al Viro noticed that xfs_lock_inodes should be static, and > that led to ... a few more. > > These are just the easy ones, others require moving functions > higher in source files, so that's not done here to keep > this review simple. .... > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index c5d4eba..04afe38 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -524,7 +524,7 @@ xfs_setattr_mode( > inode->i_mode |= mode & ~S_IFMT; > } > > -void > +static void > xfs_setattr_time( > struct xfs_inode *ip, > struct iattr *iattr) > diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h > index a0f84ab..d4bcc29 100644 > --- a/fs/xfs/xfs_iops.h > +++ b/fs/xfs/xfs_iops.h > @@ -30,7 +30,6 @@ extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); > */ > #define XFS_ATTR_NOACL 0x01 /* Don't call posix_acl_chmod */ > > -extern void xfs_setattr_time(struct xfs_inode *ip, struct iattr *iattr); > extern int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, > int flags); > extern int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap); Just a note: xfs_pnfs.c uses this function, so it can't be made static. I've dropped this hunk. Maybe add CONFIG_NFSD_PNFS=y to you kernel config? Cheers, Dave. -- Dave Chinner david@fromorbit.com