From patriciamaia@multiplaybandalarga.com.br Sun Jun 1 03:38:05 2014 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=HK_LOTTO 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 88B627F3F for ; Sun, 1 Jun 2014 03:38:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57B8C304039 for ; Sun, 1 Jun 2014 01:38:02 -0700 (PDT) X-ASG-Debug-ID: 1401611880-04bdf059a03b61f0001-NocioJ Received: from mg.netbandalarga.com.br (mg.netbandalarga.com.br [187.18.187.10]) by cuda.sgi.com with ESMTP id ZbqaY76tTd9AQJRd for ; Sun, 01 Jun 2014 01:38:00 -0700 (PDT) X-Barracuda-Envelope-From: patriciamaia@multiplaybandalarga.com.br X-Barracuda-Apparent-Source-IP: 187.18.187.10 X-WSS-ID: 0N6HEHM-01-XNS-02 X-M-MSG: Received: from ns01.netbandalarga.com.br (ns01.netbandalarga.com.br [187.18.187.2]) by mg.netbandalarga.com.br (Postfix) with ESMTP id 288299344DB; Sun, 1 Jun 2014 05:32:36 -0300 (BRT) Received: from multiplaybandalarga.com.br (localhost [127.0.0.1]) by ns01.netbandalarga.com.br (Postfix) with ESMTP id C9114147C47; Sun, 1 Jun 2014 05:41:23 -0300 (BRT) From: "CANADA-UK LOTTERY" Reply-To: onlinesweeptakes@cnegal.com Subject: Notification Date: Sun, 1 Jun 2014 09:41:23 +0100 X-ASG-Orig-Subj: Notification Message-Id: <20140601084003.M48029@multiplaybandalarga.com.br> X-Mailer: Multiplay 2.53 X-OriginatingIP: 79.141.162.19 (patriciamaia) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 To: undisclosed-recipients:; X-Barracuda-Connect: mg.netbandalarga.com.br[187.18.187.10] X-Barracuda-Start-Time: 1401611880 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is to notify that you have won in the Canada-Uk National Lottery. Reply to this mail for more details and claims. Regards, Mrs. Evelyn Mcgregor From earleen328@centurylink.net Sun Jun 1 04:59:18 2014 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8437E7F3F for ; Sun, 1 Jun 2014 04:59:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4BAD48F8037 for ; Sun, 1 Jun 2014 02:59:18 -0700 (PDT) X-ASG-Debug-ID: 1401616756-04bdf059a13b89a0001-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id j5c5ieWiSGAOo4Wu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Jun 2014 02:59:16 -0700 (PDT) X-Barracuda-Envelope-From: earleen328@centurylink.net X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=centurylink.net; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@centurylink.net; t=1401616754; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=fbhapYIb47w0SnTCl2pi/NvTbs0=; b=ohfrBxNcPsYqgUU7D9qfrlsni41bb7jgrmy0XgvsgP3qogyS3mpKMpJSXG1dcvSk z+pUJSozS8uuBrkz7OE7uJC5sqToJc2tjVFmo0PMMu3fIQvScg7jcFePdrA8vgrV JvhUQzWIuXNSaiUmj95wZHhjTCaBmZRPLUaizkWdXMDNLFH4mHNkIIa6j6JccoSD 1Jm/8Z00oreoe9Pnu5uFiCrY4oKEFsF5KiboGr1vZ5DJZG8SFJhBuCDx/uQ93Iyy Vdsqnl5xAFAljrK/mK9+s5G2sW3CIcfS1NWbRX/HfpSuobEas2pFLKPADnmq48/4 8txSNXXrAOrV1nEBocsKnw==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=PJKNCIWC c=1 sm=1 a=FKkrIqjQGGEA:10 a=YTHtZiAxaJsA:10 a=mF2eh9cmXfcA:10 a=eceY3pCtBLsA:10 a=zrtfsDcf3T0A:10 a=I_5RNyk1AAAA:8 a=UqCG9HQmAAAA:8 a=-f2FOd9MDDIDp8kthwMA:9 a=QEXdDO2ut3YA:10 a=xvyL8WiFRPkA:10 a=SXbhJL0pltMA:10 a=c5frLH11YNQA:10 a=YqDsoVYHJlkAElJ3WmYA:9 a=_W_S_7VecoQA:10 a=0BWfZHMhsHEA:10 a=woySP4Il718A:10 a=JpQqOLq4YqcA:10 a=UDo720tNcInnqUF9S9yrCA==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: ZWFybGVlbjMyOEBjZW50dXJ5bGluay5uZXQ= Authentication-Results: smtp03.agate.dfw.synacor.com smtp.mail=earleen328@centurylink.net; spf=neutral; sender-id=neutral Authentication-Results: smtp03.agate.dfw.synacor.com header.from=earleen328@centurylink.net; sender-id=neutral Received-SPF: neutral (smtp03.agate.dfw.synacor.com: 10.40.66.4 is neither permitted nor denied by domain of centurylink.net) Received: from [10.40.66.4] ([10.40.66.4:34023] helo=md06.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id D2/31-23437-E69FA835; Sun, 01 Jun 2014 05:59:13 -0400 Date: Sun, 1 Jun 2014 05:59:09 -0400 (EDT) From: Laila Vaserman Reply-To: = To: Laila Vaserman Message-ID: <625202560.29984987.1401616749954.JavaMail.root@centurylink.net> In-Reply-To: Subject: Re: MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Content-Type: multipart/alternative; boundary="----=_Part_29984986_1484946221.1401616749952" X-Originating-IP: [10.40.0.31] X-Mailer: Zimbra 7.2.2_GA_2852 (zclient/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1401616756 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6284 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 ------=_Part_29984986_1484946221.1401616749952 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I have an Inheritance for you ------=_Part_29984986_1484946221.1401616749952 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit  

I have an Inheritance for you ------=_Part_29984986_1484946221.1401616749952-- From scaron@umich.edu Sun Jun 1 11:21:59 2014 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 65C9E29DF8 for ; Sun, 1 Jun 2014 11:21:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39440304043 for ; Sun, 1 Jun 2014 09:21:59 -0700 (PDT) X-ASG-Debug-ID: 1401639716-04bdf059a03c4e70001-NocioJ Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com [209.85.216.43]) by cuda.sgi.com with ESMTP id QSCjFvcdAC52BSln (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 01 Jun 2014 09:21:56 -0700 (PDT) X-Barracuda-Envelope-From: scaron@umich.edu X-Barracuda-Apparent-Source-IP: 209.85.216.43 Received: by mail-qa0-f43.google.com with SMTP id m5so1425596qaj.16 for ; Sun, 01 Jun 2014 09:21: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:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=kiyikZBJ6a0/ONPJpyybRgirxxC4zfVLW3EEPWvAJ4M=; b=dFtE2z0jFM3shB0RW6YGxbeCiWrGXUKxmJp6UcZVRPw0xseC7BrCaAsYbFY7mU7H7E nwJ8EM4/M2PxOwMg5wrRHgmi+F64rCZ41pb/wumvtKEgov++6C4Pq/weTavxo+uSCvuT xKCVlJC+9TgQTBieFKoO2pfqoNlVAc5oeyph+ugpaKS8bMfo9tdgp4VAXIaUN9KtehBy Zm21f3o4Yb1Qa6DybZ8fdUJC/DyFUVORUs9NncG9U4ds3hjUdkdmmODjrIJqlpeWZ9J3 k7JCcDbSIppPhHQl41GYCZRt+ZhV+x8r2ZDGBz2zH0uUfvwvb1QgCHCUJg9zWvNNh5IO LB4Q== X-Gm-Message-State: ALoCoQlpFCBsjHGp/ZWb6GR2e7Z/uHPC6eZhbUugtrfChxO4kr+iIWplMO3/9Ixaa2E2T8oaxVz7 MIME-Version: 1.0 X-Received: by 10.140.102.166 with SMTP id w35mr38870990qge.97.1401639715891; Sun, 01 Jun 2014 09:21:55 -0700 (PDT) Received: by 10.224.100.72 with HTTP; Sun, 1 Jun 2014 09:21:55 -0700 (PDT) In-Reply-To: <20140531000117.GM6677@dastard> References: <20140531000117.GM6677@dastard> Date: Sun, 1 Jun 2014 12:21:55 -0400 Message-ID: Subject: Re: What to do when... xfs_repair hangs? From: Sean Caron X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? To: Dave Chinner , Sean Caron Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c15f3a5e9a4704fac8adbd X-Barracuda-Connect: mail-qa0-f43.google.com[209.85.216.43] X-Barracuda-Start-Time: 1401639716 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c15f3a5e9a4704fac8adbd Content-Type: text/plain; charset=UTF-8 Sorry, all, I was a little out-of-it on Friday afternoon, of course I had kicked off xfs_repair actually in the background with all output sent to a file, and I was just doing 'tail -f' on that file. So I kill the 'tail -f' and jump back to the command line, it appears that xfs_repair segfaulted and died. That line of text: disconnected inode 1109099673, was indeed the last thing that it printed before it crashed. If I look in dmesg, I just see - xfs_repair[6770]: segfault at 28 ip 000000000042307b sp 00007fffef61bad0 error 4 in xfs_repair[400000+72000] and that's it. I checked with 'df' and there's plenty of space everywhere; I don't see why it would have faulted out trying to connect something to lost+found. Underlying storage should be good; this is basically a RAID 60 built on top of a bunch of JBODs with LSI SAS9200 cards. MD sees all strings as started and running OK; no problems getting the array assembled at all. Since Dave is saying it's OK to try re-running xfs_repair; it'll just pick up where it left off; let me give it another pass and see if it manages to complete, or if it segfaults out again. I guess it it poops out a second time, maybe we'll just want to consider rebuilding the filesystem and restoring from our copies? Thanks for the feedback, Sean On Fri, May 30, 2014 at 8:01 PM, Dave Chinner wrote: > On Fri, May 30, 2014 at 03:49:13PM -0400, Sean Caron wrote: > > Hi all, > > > > Long story short, we have a big array formatted as XFS, we had a machine > go > > down hard maybe a month, month and a half ago... when it came back up, > XFS > > faulted out when we attempted to mount the filesystem; it complained the > > log was bad or something... I did a dry run of xfs_repair (-L) and it > > looked pretty bad, so we mounted up the filesystem read-only, ran a > > backup... I think we got pretty much everything out OK except maybe files > > that were open at the time of the crash. > > > > Now with a backup in hand, we kicked off xfs_repair "for real"... it ran > > for a while and did its thing, but now it appears to be stuck at the > stage - > > > > - agno = 436 > > rebuilding directory inode ... > > rebuilding directory inode ... > > rebuilding directory inode ... > > ... > > - traversal finished ... > > - moving disconected inodes to lost+found ... > > disconnected inode 1109099673, > > > > and then it just stops. I don't know how long its been sitting like that, > > but it hasn't moved in the last hour or two. I assume that's not good... > > Is that the total of the last line of output? If so, it's likely > stuck creating the lost+found directory. It's possible there's a > corruption in the inode AVL tree (e.g. endless loop) that is causing > it to spin doing an inode record lookup, but otherwise I can't see > any reason for it getting stuck here. > > The information that Brian asked for will be a good start in > tracking this down, as will the complete output of xfs_repair... > > > Interestingly when we ran a dry run of xfs_repair (-L) it got all the way > > through; it never hung up at any point. Not sure why it would start to > hang > > up, once it gets run "for real". > > That's because a dry-run skips the "move to lost_found" phase. > > > This machine is in single-user-mode, I have exactly 24 lines of console > > with no scrollback buffer, no other tty available besides that which I'm > > running xfs_repair on, the system console. > > $ man script > > or > > $ man tee > > > Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatever their > > current xfsprogs is. > > Upgrading xfsprogs to 3.2.0 would be a good idea. > > > This is a bit of an exceptional situation for me; I've never seen > > xfs_repair just hang outright. I hoped I could maybe get some feedback > from > > the experts here... what should I do? > > > > Try to Control-C out of the xfs_repair and ... re-run it? > > That's fine - the next time repair runs it will start again and > repair anything that wasn't repaired in the last run. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11c15f3a5e9a4704fac8adbd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Sorry, all, I was a little out-of-it on Friday afternoon, = of course I had kicked off xfs_repair actually in the background with all o= utput sent to a file, and I was just doing 'tail -f' on that file.<= div>
So I kill the 'tail -f' and jump back to the command= line, it appears that xfs_repair segfaulted and died.

=
That line of text:

discon= nected inode 1109099673,

wa= s indeed the last thing that it printed before it crashed.

If I loo= k in dmesg, I just see -

xfs_repa= ir[6770]: segfault at 28 ip 000000000042307b sp 00007fffef61bad0 error 4 in= xfs_repair[400000+72000]

and that= 's it.

I checke= d with 'df' and there's plenty of space everywhere; I don't= see why it would have faulted out trying to connect something to lost+foun= d.

Underlyi= ng storage should be good; this is basically a RAID 60 built on top of a bu= nch of JBODs with LSI SAS9200 cards. MD sees all strings as started and run= ning OK; no problems getting the array assembled at all.

Since Dave is saying it's OK to try re-running x= fs_repair; it'll just pick up where it left off; let me give it another= pass and see if it manages to complete, or if it segfaults out again. I gu= ess it it poops out a second time, maybe we'll just want to consider re= building the filesystem and restoring from our copies?

Than= ks for the feedback,

Sean



On Fri, M= ay 30, 2014 at 8:01 PM, Dave Chinner <david@fromorbit.com>= wrote:
On Fri, May 30, 2014 at 03:4= 9:13PM -0400, Sean Caron wrote:
> Hi all,
>
> Long story short, we have a big array formatted as XFS, we had a machi= ne go
> down hard maybe a month, month and a half ago... when it came back up,= XFS
> faulted out when we attempted to mount the filesystem; it complained t= he
> log was bad or something... I did a dry run of xfs_repair (-L) and it<= br> > looked pretty bad, so we mounted up the filesystem read-only, ran a > backup... I think we got pretty much everything out OK except maybe fi= les
> that were open at the time of the crash.
>
> Now with a backup in hand, we kicked off xfs_repair "for real&quo= t;... it ran
> for a while and did its thing, but now it appears to be stuck at the s= tage -
>
> - agno =3D 436
> rebuilding directory inode ...
> rebuilding directory inode ...
> rebuilding directory inode ...
> ...
> - traversal finished ...
> - moving disconected inodes to lost+found ...
> disconnected inode 1109099673,
>
> and then it just stops. I don't know how long its been sitting lik= e that,
> but it hasn't moved in the last hour or two. I assume that's n= ot good...

Is that the total of the last line of output? If so, it's likely<= br> stuck creating the lost+found directory. It's possible there's a corruption in the inode AVL tree (e.g. endless loop) that is causing
it to spin doing an inode record lookup, but otherwise I can't see
any reason for it getting stuck here.

The information that Brian asked for will be a good start in
tracking this down, as will the complete output of xfs_repair...

> Interestingly when we ran a dry run of xfs_repair (-L) it got all the = way
> through; it never hung up at any point. Not sure why it would start to= hang
> up, once it gets run "for real".

That's because a dry-run skips the "move to lost_found"= phase.

> This machine is in single-user-mode, I have exactly 24 lines of consol= e
> with no scrollback buffer, no other tty available besides that which I= 'm
> running xfs_repair on, the system console.

$ man script

or

$ man tee

> Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatever the= ir
> current xfsprogs is.

Upgrading xfsprogs to 3.2.0 would be a good idea.

> This is a bit of an exceptional situation for me; I've never seen<= br> > xfs_repair just hang outright. I hoped I could maybe get some feedback= from
> the experts here... what should I do?
>
> Try to Control-C out of the xfs_repair and ... re-run it?

That's fine - the next time repair runs it will start again and repair anything that wasn't repaired in the last run.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a11c15f3a5e9a4704fac8adbd-- From arnd@arndb.de Sun Jun 1 15:05:17 2014 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 2C5FF7F54 for ; Sun, 1 Jun 2014 15:05:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1BC888F8035 for ; Sun, 1 Jun 2014 13:05:13 -0700 (PDT) X-ASG-Debug-ID: 1401653111-04cb6c100aa92a0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id g1KBO44G5pG8vts8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Jun 2014 13:05:11 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue007) with ESMTP (Nemesis) id 0MZ6Kl-1XLHl940El-00Vkka; Sun, 01 Jun 2014 21:56:53 +0200 From: Arnd Bergmann To: Nicolas Pitre Cc: "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Sun, 01 Jun 2014 21:56:52 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <8618458.1EVJCoVbkH@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <538995D4.9050702@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:4EClS3nPPd0d++b1ODxeO+nue5a4n8U2xcvaEsTpM51 NNbYoUfHVjRI6n4HBWZqxU9H//A6zAFdkYD2eKWYx2Dax/tymJ Kzze8TDMyf1leACVKpS0iONSBU6cAjlM7l2wxv/9iV+KfBlc6F xuJ5mCmCYaLyAEtpBO4LGdzEsFFPPFf0nGKcrp8sksRP5ILUnX aBtQxbqN7Aq5wK4tSn7w7379PkbWh0C5KuQ6VpmFi0RTGgQ3QD 2grRWjtH/IWVcrdqniFi9jH5Mw6oHw7tPfBvleJSkjgGRn9Sil r5+0GS2uNXIhe8qAwbshMOSVjnvwTg7l0+QUXBsqO9ukleQT4A uAjckdDxmUoLUe6/1yMo= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401653111 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Saturday 31 May 2014 11:46:16 Nicolas Pitre wrote: > > readonly if not in reality than in practice. > > For those (legacy) filesystems with a signed 32-bit timestamps, any > attempt to create a timestamp past Jan 19 03:14:06 2038 UTC should be > (silently) clamped to 0x7fffffff and that value (the last representable > time) used as an overflow indicator. The filesystem driver should > convert that value into a corresponding overflow value for whatever > kernel internal time representation being used when read back, and this > should be propagated up to user space. It should not be a hard error > otherwise, as you rightfully stated, everything non read-only would come > to a halt on that day. I don't think there is much of a difference between not being able to write at all and all newly written files having the same timestamp, causing random things to break differently. The clamp to the maximum supported time stamp sounds like a reasonable choice for 'utimens' and related syscalls for the case of someone setting an arbitrary future date beyond what the file system can represent. Then again, I don't see a reason why that shouldn't just cause an error to be returned. For actually running kernels beyond 2038, the best idea I've seen so far is to disallow all broken code at compile time. I don't see a choice but to audit the entire kernel for invalid uses on both 32 and 64 bit in the next few years. A lot of code will get changed in the process so we can actually keep running 32-bit kernels and file systems, but other code will likely go away: * any system calls that pass a time_t, timeval or timespec on 32-bit systems return -ENOSYS, to ensure all user land uses the replacements we will put into place * The definition of 'time_t', 'timval' and 'timespec' can be hidden from the kernel, and all code using it left out. * ext2 and ext3 file system code will have to be disabled, but that's file since ext4 can mount old file systems. * until xfs gets extended, we can also disiable it at build time. For most users, we probably want to leave all that enabled by default until we get much closer to 2038, but a compile time option should allow us to test what works or doesn't, and it can be set by embedded developers that want to ensure their code keeps running for the next few decades. Arnd From hpa@zytor.com Sun Jun 1 15:29:37 2014 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 95BF27F54 for ; Sun, 1 Jun 2014 15:29:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51875AC004 for ; Sun, 1 Jun 2014 13:29:37 -0700 (PDT) X-ASG-Debug-ID: 1401654571-04bdf0599e3cc490001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id aw3nlzlkhku0MecE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Jun 2014 13:29:32 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from [22.4.236.43] ([172.56.17.16]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s51KQBTR003379 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 1 Jun 2014 13:26:13 -0700 User-Agent: K-9 Mail for Android In-Reply-To: <8618458.1EVJCoVbkH@wuerfel> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <538995D4.9050702@zytor.com> <8618458.1EVJCoVbkH@wuerfel> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: "H. Peter Anvin" X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Sun, 01 Jun 2014 13:26:03 -0700 To: Arnd Bergmann , Nicolas Pitre CC: Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Message-ID: <0ab4392c-d89d-4277-914d-1696f455daab@email.android.com> X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401654572 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Perhaps we should make this a kernel command line option instead, with the settings: error out on outside the standard window, or a date indicating the earliest date that should be recognized and do windowing (0 for no windowing, 1970 for retconning the Unix epoch as unsigned...) But again, the kernel is probably the least problem here... On June 1, 2014 12:56:52 PM PDT, Arnd Bergmann wrote: >On Saturday 31 May 2014 11:46:16 Nicolas Pitre wrote: >> > readonly if not in reality than in practice. >> >> For those (legacy) filesystems with a signed 32-bit timestamps, any >> attempt to create a timestamp past Jan 19 03:14:06 2038 UTC should be > >> (silently) clamped to 0x7fffffff and that value (the last >representable >> time) used as an overflow indicator. The filesystem driver should >> convert that value into a corresponding overflow value for whatever >> kernel internal time representation being used when read back, and >this >> should be propagated up to user space. It should not be a hard error > >> otherwise, as you rightfully stated, everything non read-only would >come >> to a halt on that day. > >I don't think there is much of a difference between not being able to >write at all and all newly written files having the same timestamp, >causing random things to break differently. > >The clamp to the maximum supported time stamp sounds like a reasonable >choice for 'utimens' and related syscalls for the case of someone >setting an arbitrary future date beyond what the file system can >represent. Then again, I don't see a reason why that shouldn't just >cause an error to be returned. > >For actually running kernels beyond 2038, the best idea I've seen so >far is to disallow all broken code at compile time. I don't see >a choice but to audit the entire kernel for invalid uses on both >32 and 64 bit in the next few years. A lot of code will get changed >in the process so we can actually keep running 32-bit kernels and >file systems, but other code will likely go away: > >* any system calls that pass a time_t, timeval or timespec on > 32-bit systems return -ENOSYS, to ensure all user land uses > the replacements we will put into place >* The definition of 'time_t', 'timval' and 'timespec' can be hidden > from the kernel, and all code using it left out. >* ext2 and ext3 file system code will have to be disabled, but that's > file since ext4 can mount old file systems. >* until xfs gets extended, we can also disiable it at build time. > >For most users, we probably want to leave all that enabled by >default until we get much closer to 2038, but a compile time >option should allow us to test what works or doesn't, and it >can be set by embedded developers that want to ensure their >code keeps running for the next few decades. > > Arnd -- Sent from my mobile phone. Please pardon brevity and lack of formatting. From eflorac@intellique.com Sun Jun 1 15:40:35 2014 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 74FFE7F54 for ; Sun, 1 Jun 2014 15:40:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56B8C304039 for ; Sun, 1 Jun 2014 13:40:32 -0700 (PDT) X-ASG-Debug-ID: 1401655228-04bdf059a13ccee0001-NocioJ Received: from smtp1-g21.free.fr (smtp1-g21.free.fr [212.27.42.1]) by cuda.sgi.com with ESMTP id mqGvRuXcKnpbPHVL for ; Sun, 01 Jun 2014 13:40:28 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.1 Received: from galadriel.home (unknown [82.235.234.79]) by smtp1-g21.free.fr (Postfix) with ESMTP id 7AA2994012C; Sun, 1 Jun 2014 22:38:33 +0200 (CEST) Date: Sun, 1 Jun 2014 22:40:24 +0200 From: Emmanuel Florac To: Sean Caron Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: What to do when... xfs_repair hangs? Message-ID: <20140601224024.628372c5@galadriel.home> X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? In-Reply-To: References: <20140531000117.GM6677@dastard> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp1-g21.free.fr[212.27.42.1] X-Barracuda-Start-Time: 1401655228 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Sun, 1 Jun 2014 12:21:55 -0400 vous =C3=A9criviez: > Since Dave is saying it's OK to try re-running xfs_repair; it'll just > pick up where it left off; let me give it another pass and see if it > manages to complete, or if it segfaults out again. I guess it it > poops out a second time, maybe we'll just want to consider rebuilding > the filesystem and restoring from our copies? You should definitely try a more up-to-date version of xfs_repair first. In case you're not afraid of running a binary from an unkown source, please find a 3.1.11 binary here: http://update.intellique.com/pub/xfsrepair.tar.gz --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Sun Jun 1 17:43:29 2014 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 1A9387F54 for ; Sun, 1 Jun 2014 17:43:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0457730405F for ; Sun, 1 Jun 2014 15:43:28 -0700 (PDT) X-ASG-Debug-ID: 1401662602-04cb6c1006ac960001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fHhodfU763PiK8kQ for ; Sun, 01 Jun 2014 15:43:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmB3AIyri1N5LL1sPGdsb2JhbABUBYMHg0WoEAEBAQEBAQaYGwGBCxcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOgfVaxcWhT+IGxEBD0EHhEAEmX+LHItcK4E5 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Jun 2014 08:13:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrETG-0003k0-Fm; Mon, 02 Jun 2014 08:43:18 +1000 Date: Mon, 2 Jun 2014 08:43:18 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <20140601224318.GO14410@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> <538743E0.70103@sgi.com> <20140531003918.GI14410@dastard> <538A8064.2030304@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538A8064.2030304@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1401662602 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 31, 2014 at 08:22:44PM -0500, Mark Tinguely wrote: > On 05/30/14 19:39, Dave Chinner wrote: > >On Thu, May 29, 2014 at 09:27:44AM -0500, Mark Tinguely wrote: > >>On 05/27/14 19:29, Dave Chinner wrote: > >>>On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: > >>>>A 7-8 hours on spinning rust. This is my burn in test. > >>> > >>>Can you try to narrow the problem down? Otherwise it's going to be a > >>>case of looking for a needle in a haystack.... > >> > >>Nod on the needle in a hay stack if it bmbt is really corrupt. > >> > >>I am running fsstress from xfstests with the top commit 9b7f704, and > >>I don't see any newer fsstress patches since then. > >> > >>I moved the test to another box with a kdump that works on top of > >>tree Linux and grabbed a vmcore. I grabbed a metadata dump of the > >>filesystem after the ASSERT. That should give some idea of what > >>inode/block it was looking up. > >> > >>I sent email to Namjae when I first tripped over this problem in > >>late April. No longer on the face of the earth and I can't look at > >>this until the weekend. > > > >No worries - it looks pretty hard to hit, so it's not something we > >urgently need to track down. Any time you can spare to try to narrow > >it down would be great! > > > >Cheers, > > > >Dave. > > The xfs_inode thinks there are 11 bmbt entries when there should only be 11: > i_df = { > if_bytes = 0xb0, <- here 11 entries 0x10 bytes long > if_real_bytes = 0x100, > if_broot = 0xffff88009f74c680, > if_broot_bytes = 0x28, > if_flags = 0x6, > if_u1 = { > if_extents = 0xffff88033c44a000, <- > if_ext_irec = 0xffff88033c44a000, > if_data = 0xffff88033c44a000 "" > }, > > Looking at the if_extents[]: > > crash> rd ffff88033c44a000 32 > ffff88033c44a000: 8000000000000200 000000b601800021 ........!....... > ffff88033c44a010: 0000000000004400 000000449a000007 .D..........D... > ffff88033c44a020: 0000000000005200 000002f897e00004 .R.............. > ffff88033c44a030: 8000000000005a00 000002f898600033 .Z......3.`..... > ffff88033c44a040: 000000000000c000 000002f89ec00001 ................ > ffff88033c44a050: 0000000000015c00 000005fdfba00010 .\.............. > ffff88033c44a060: 0000000000017c00 00000eab00400006 .|........@..... > ffff88033c44a070: 000000000001f800 00000ec752c00004 ...........R.... > ffff88033c44a080: 0000000000020000 00000e8ae6800004 ................ > ffff88033c44a090: 0000000000020800 00000e7167e00004 ...........gq... > ffff88033c44a0a0: 000000000002bfff ffffffc000a00001 ................ > ^^^^ bad ^^^^ > It appears that current_ext is 10 (11th entry). > The assert is on the bad entry. I don't think that's bad - it looks like a NULL start block which means an in-memory extent. i.e. a delayed allocation block with a indirect reservation of 1 block and a length of ~0x40 blocks? > xfs_db thinks there are 11 entries: > > recs[1-11] = [startoff,startblock,blockcount,extentflag] > 1:[1,372748,33,1] 2:[34,140496,18,0] 3:[52,1557619,53,1] > 4:[105,1557672,27,0] 5:[132,1557699,51,1] 6:[183,1557750,1,0] > 7:[261,3141597,16,0] 8:[277,7690242,6,0] 9:[339,7748246,4,0] > 10:[343,7624500,4,0] 11:[347,7572287,4,0] > > xfs_db> fsb 4262789 > xfs_db> type text > xfs_db> p > 000: 42 4d 41 50 00 00 00 0b ff ff ff ff ff ff ff ff BMAP............ > 010: ff ff ff ff ff ff ff ff 80 00 00 00 00 00 02 00 ................ > 020: 00 00 00 b6 01 80 00 21 00 00 00 00 00 00 44 00 ..............D. > 030: 00 00 00 44 9a 00 00 12 80 00 00 00 00 00 68 00 ...D..........h. > 040: 00 00 02 f8 8e 60 00 35 00 00 00 00 00 00 d2 00 .......5........ > 050: 00 00 02 f8 95 00 00 1b 80 00 00 00 00 01 08 00 ................ > 060: 00 00 02 f8 98 60 00 33 00 00 00 00 00 01 6e 00 .......3......n. > 070: 00 00 02 f8 9e c0 00 01 00 00 00 00 00 02 0a 00 ................ > 080: 00 00 05 fd fb a0 00 10 00 00 00 00 00 02 2a 00 ................ > 090: 00 00 0e ab 00 40 00 06 00 00 00 00 00 02 a6 00 ................ > 0a0: 00 00 0e c7 52 c0 00 04 00 00 00 00 00 02 ae 00 ....R........... > 0b0: 00 00 0e 8a e6 80 00 04 00 00 00 00 00 02 b6 00 ................ > 0c0: 00 00 0e 71 67 e0 00 04 00 00 00 00 00 00 00 00 ...qg........... > 0d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > 0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > > This xfs_db is before log replay, but it appears that the 3 extent is > missing in the data fork, everything shifted up and a garbage entry > in entry 11. There's very few identical extents between those two lists - the first is the same, the second has the same start offset and block but is much shorted, and all the others are completely different. So this is looking like a delalloc extent when the code is not expecting it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Jun 1 17:48:32 2014 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 B98387F54 for ; Sun, 1 Jun 2014 17:48:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A4E4C8F8037 for ; Sun, 1 Jun 2014 15:48:29 -0700 (PDT) X-ASG-Debug-ID: 1401662906-04cb6c1009acb80001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id iMrC6G9RAhjLlxws for ; Sun, 01 Jun 2014 15:48:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al93AImsi1N5LL1sPGdsb2JhbABYDoJ5g0WoEAEBAQEBAQaYGwGBCxcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hB1WwXFoU/iDRJB4RABJl/ixyLClIrgTE Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Jun 2014 08:18:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrEYD-0003kf-FD; Mon, 02 Jun 2014 08:48:25 +1000 Date: Mon, 2 Jun 2014 08:48:25 +1000 From: Dave Chinner To: Sean Caron Cc: xfs@oss.sgi.com Subject: Re: What to do when... xfs_repair hangs? Message-ID: <20140601224825.GP14410@dastard> X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? References: <20140531000117.GM6677@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: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1401662906 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jun 01, 2014 at 12:21:55PM -0400, Sean Caron wrote: > Sorry, all, I was a little out-of-it on Friday afternoon, of course I had > kicked off xfs_repair actually in the background with all output sent to a > file, and I was just doing 'tail -f' on that file. > > So I kill the 'tail -f' and jump back to the command line, it appears that > xfs_repair segfaulted and died. > > That line of text: > > disconnected inode 1109099673, > > was indeed the last thing that it printed before it crashed. > > If I look in dmesg, I just see - > > xfs_repair[6770]: segfault at 28 ip 000000000042307b sp 00007fffef61bad0 > error 4 in xfs_repair[400000+72000] > > and that's it. > > I checked with 'df' and there's plenty of space everywhere; I don't see why > it would have faulted out trying to connect something to lost+found. > > Underlying storage should be good; this is basically a RAID 60 built on top > of a bunch of JBODs with LSI SAS9200 cards. MD sees all strings as started > and running OK; no problems getting the array assembled at all. > > Since Dave is saying it's OK to try re-running xfs_repair; it'll just pick > up where it left off; let me give it another pass and see if it manages to > complete, or if it segfaults out again. I guess it it poops out a second > time, maybe we'll just want to consider rebuilding the filesystem and > restoring from our copies? You should update to the latest version of xfs_repair first (3.2.0). If that still crashes, running xfs-repair under gdb to get a stack trace would be a good start, or sending me a metadump image so I can reproduce the crash myself would be even better... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Jun 1 19:28:34 2014 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 534647F54 for ; Sun, 1 Jun 2014 19:28:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 047A18F8039 for ; Sun, 1 Jun 2014 17:28:30 -0700 (PDT) X-ASG-Debug-ID: 1401668906-04bdf059a03d9420001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Vv0SqXgvLbC9eZIq for ; Sun, 01 Jun 2014 17:28:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Akx4AC/Ei1N5LL1sPGdsb2JhbABYgwdSgnOoBQsBAQEBAQEGhxlckCYBgQ4XAwEBAQE4NYIlAQEFGg0THCMQCAMVAwklDwUlAwcaE4hB1gUWhT+IND4LB4RABJl/gT+JXYIiiTorgTEBHgY Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Jun 2014 09:58:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrG6w-0003vU-PD; Mon, 02 Jun 2014 10:28:22 +1000 Date: Mon, 2 Jun 2014 10:28:22 +1000 From: Dave Chinner To: Arnd Bergmann Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602002822.GQ14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <5507340.nVBP5LFtqn@wuerfel> <20140601002437.GL14410@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140601002437.GL14410@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1401668906 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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=FUZZY_VPILL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > In my list at http://kernelnewbies.org/y2038, I found that almost > > all file systems at least times until 2106, because they treat > > the on-disk value as unsigned on 64-bit systems, or they use > > a completely different representation. My guess is that somebody > > earlier spent a lot of work on making that happen. > > > > The exceptions are: > > > > * exofs uses signed values, which can probably be changed to be > > consistent with the others. > > * isofs has a bug that limits it until 2027 on architectures with > > a signed 'char' type (otherwise it's 2155). > > * udf can represent times for many thousands of years through a > > 16-bit year representation, but the code to convert to epoch > > uses a const array that ends at 2038. > > * afs uses signed seconds and can probably be fixed > > * coda relies on user space time representation getting passed > > through an ioctl. > > * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, > > where they really use signed. > > > > I was confused about XFS since I didn't noticed that there are > > separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected > > XFS to also use the 1970-2106 time range on 64-bit systems today. > > You've missed an awful lot more than just the implications for the > core kernel code. > > There's a good chance such changes propagate to APIs elsewhere in > the filesystems, because something you haven't realised is that XFS > effectively exposes the on-disk timestamp format directly to > userspace via the bulkstat interface (see struct xfs_bstat). It also > affects the XFS open-by-handle ioctl and the swap extent ioctl used > by the online defragmenter. > > IOWs, if we are changing the on-disk timestamp format then this > affects several ioctl()s and hence quite a few of the XFS userspace > utilities. The hardest to fix will be xfsdump which would need a new > dump format to store the extended timestamp ranges, and then > xfs_restore will need to be able to handle restoring such timestamps > on filesystems that don't have extended timestamp support... > > Put simply, changing the structure of system time isn't as straight > forward as changing the kernel structures. System time gets stored > permanently, and that has a cascade effect through the kernel all > to all of the filesystem utilities that know about that permanent > storage in some way.... > > So yes, you can change the kernel definition, but until the > permanent storage of system time can be extended to support the same > range as the kernel the *system* will still have nasty, silent epoch > overflow, truncation or corruption issues. Just to put that in context, here's the kernel patch to add extended epoch support to XFS. It's completely untested as I haven't done any userspace code changes to enable the feature. However, it should give you an indication of how far the simple act of changing the kernel time representation spread through the filesystem. This does not include any of the VFS infrastructure to specifying the range of supported timestamps. It survives some smoke testing, but dies when the online defragmenter starts using the bulkstat and swap extent ioctls (the assert in xfs_inode_time_from_epoch() fires), so I probably don't have that all sorted correctly yet... To test extended epoch support, however, I need to some fstests that define and validate the behaviour of the new syscalls - until we get those we can't validate that the filesystem follows the spec properly. I also suspect we are going to need an interface to query the supported range of timestamps from a filesystem so that we can test boundary conditions in an automated fashion.... Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: support timestamps beyond Unix epochs From: Dave Chinner The 32 bit second counters in timestamps are too small to represent time beyond the unix epoch (jan 2038) correctly. Extend the on-disk format for a timestamp to include an 8-bit epoch counter so that we can extend time for up to 255 Unix epochs. This should be good for representing timestamps from 1970 to somewhere around 19,000 A.D.... Signed-off-by: Dave Chinner --- fs/xfs/time.h | 7 ------ fs/xfs/xfs_bmap_util.c | 35 +++++++++++++++++----------- fs/xfs/xfs_dinode.h | 48 ++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_fs.h | 9 +++++++- fs/xfs/xfs_fsops.c | 5 +++- fs/xfs/xfs_inode.c | 16 ++++++++++--- fs/xfs/xfs_inode_buf.c | 8 +++++++ fs/xfs/xfs_ioctl32.c | 3 +++ fs/xfs/xfs_ioctl32.h | 5 +++- fs/xfs/xfs_iops.c | 59 +++++++++++++++++++++++++++++++----------------- fs/xfs/xfs_itable.c | 12 ++++++++++ fs/xfs/xfs_log_format.h | 4 ++++ fs/xfs/xfs_sb.h | 12 +++++++++- fs/xfs/xfs_trans_inode.c | 2 +- 14 files changed, 175 insertions(+), 50 deletions(-) diff --git a/fs/xfs/time.h b/fs/xfs/time.h index 387e695..9f38d60 100644 --- a/fs/xfs/time.h +++ b/fs/xfs/time.h @@ -21,16 +21,9 @@ #include #include -typedef struct timespec timespec_t; - static inline void delay(long ticks) { schedule_timeout_uninterruptible(ticks); } -static inline void nanotime(struct timespec *tvp) -{ - *tvp = CURRENT_TIME; -} - #endif /* __XFS_SUPPORT_TIME_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 703b3ec..dbc9a74 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1686,6 +1686,7 @@ xfs_swap_extents( int aforkblks = 0; int taforkblks = 0; __uint64_t tmp; + struct timespec tv; tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); if (!tempifp) { @@ -1746,25 +1747,33 @@ xfs_swap_extents( } /* - * Compare the current change & modify times with that - * passed in. If they differ, we abort this swap. - * This is the mechanism used to ensure the calling - * process that the file was not changed out from + * Compare the current change & modify times with that passed in. If + * they differ, we abort this swap. This is the mechanism used to + * ensure the calling process that the file was not changed out from * under it. */ - if ((sbp->bs_ctime.tv_sec != VFS_I(ip)->i_ctime.tv_sec) || - (sbp->bs_ctime.tv_nsec != VFS_I(ip)->i_ctime.tv_nsec) || - (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || - (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { + tv.tv_sec = xfs_inode_time_from_epoch(sbp->bs_ctime.tv_sec, + sbp->bs_ctime_epoch); + tv.tv_nsec = sbp->bs_ctime.tv_nsec; + if (timespec_compare(&tv, &VFS_I(ip)->i_ctime)) { error = XFS_ERROR(EBUSY); goto out_unlock; } - /* We need to fail if the file is memory mapped. Once we have tossed - * all existing pages, the page fault will have no option - * but to go to the filesystem for pages. By making the page fault call - * vop_read (or write in the case of autogrow) they block on the iolock - * until we have switched the extents. + tv.tv_sec = xfs_inode_time_from_epoch(sbp->bs_mtime.tv_sec, + sbp->bs_mtime_epoch); + tv.tv_nsec = sbp->bs_mtime.tv_nsec; + if (timespec_compare(&tv, &VFS_I(ip)->i_mtime)) { + error = XFS_ERROR(EBUSY); + goto out_unlock; + } + + /* + * We need to fail if the file is memory mapped. Once we have tossed + * all existing pages, the page fault will have no option but to go to + * the filesystem for pages. By making the page fault call vop_read (or + * write in the case of autogrow) they block on the iolock until we have + * switched the extents. */ if (VN_MAPPED(VFS_I(ip))) { error = XFS_ERROR(EBUSY); diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 623bbe8..79f94722 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -21,11 +21,53 @@ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ #define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) +/* + * Inode timestamps get more complex when we consider supporting times beyond + * the standard unix epoch of Jan 2038. The struct xfs_timestamp cannot support + * more than a single extension by playing sign games, and that is still not + * reliable. We also can't extend the timestamp structure because there is no + * free space around them in the on-disk inode. + * + * Hence the simplest thing to do is to add an epoch counter for each timestamp + * in the inode. This can be a single byte for each timestamp and make use of + * a hole we currently pad. This gives us another 255 epochs range for the + * timestamps, but requires a superblock feature bit to indicate that these + * fields have meaning and can be non-zero. + * + * Provide wrapper functions for converting the kernel inode time format to + * the on-disk fields. The nanosecond counter is unlikely to change in future, + * so it's mostly just for the second+epoch counter conversion. + */ typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ __be32 t_nsec; /* timestamp nanoseconds */ } xfs_timestamp_t; +static inline __uint8_t +xfs_timestamp_epoch( + struct timespec *time) +{ + /* will be zero until the extended struct inode_time is introduced */ + return 0; +} + +static inline __int32_t +xfs_timestamp_sec( + struct timespec *time) +{ + return time->tv_sec; +} + +static inline __kernel_time_t +xfs_inode_time_from_epoch( + __uint8_t epoch, + __int32_t seconds) +{ + /* need to handle non-zero epoch when struct inode_time is introduced */ + ASSERT(epoch == 0); + return seconds; +} + /* * On-disk inode structure. * @@ -54,7 +96,11 @@ typedef struct xfs_dinode { __be32 di_nlink; /* number of links to file */ __be16 di_projid_lo; /* lower part of owner's project id */ __be16 di_projid_hi; /* higher part owner's project id */ - __u8 di_pad[6]; /* unused, zeroed space */ + __u8 di_atime_epoch; /* access time epoch */ + __u8 di_mtime_epoch; /* modify time epoch */ + __u8 di_ctime_epoch; /* change time epoch */ + __u8 di_crtime_epoch;/* create time epoch */ + __u8 di_pad[2]; /* unused, zeroed space */ __be16 di_flushiter; /* incremented on flush */ xfs_timestamp_t di_atime; /* time last accessed */ xfs_timestamp_t di_mtime; /* time last modified */ diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index d34703d..fb0a0ea 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ +#define XFS_FSOP_GEOM_FLAGS_EPOCH 0x40000 /* timestamp epochs */ /* * Minimum and maximum sizes need for growth checks. @@ -280,6 +281,9 @@ typedef struct xfs_growfs_rt { /* * Structures returned from ioctl XFS_IOC_FSBULKSTAT & XFS_IOC_FSBULKSTAT_SINGLE + * + * Time epoch structures are only used if the XFS_FSOP_GEOM_FLAGS_EPOCH flag is + * asserted in the geometry output. */ typedef struct xfs_bstime { time_t tv_sec; /* seconds */ @@ -307,7 +311,10 @@ typedef struct xfs_bstat { #define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_forkoff; /* inode fork offset in bytes */ __u16 bs_projid_hi; /* higher part of project id */ - unsigned char bs_pad[10]; /* pad space, unused */ + __u8 bs_atime_epoch; /* access time epoch */ + __u8 bs_mtime_epoch; /* modify time epoch */ + __u8 bs_ctime_epoch; /* change time epoch */ + unsigned char bs_pad[7]; /* pad space, unused */ __u32 bs_dmevmask; /* DMIG event mask */ __u16 bs_dmstate; /* DMIG state info */ __u16 bs_aextents; /* attribute number of extents */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index d229556..7b8db57 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -103,7 +103,10 @@ xfs_fs_geometry( (xfs_sb_version_hasftype(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | (xfs_sb_version_hasfinobt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FINOBT : 0); + XFS_FSOP_GEOM_FLAGS_FINOBT : 0) | + (xfs_sb_version_hasepoch(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_EPOCH : 0); + geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index a6115fe..eecae93 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -654,7 +654,8 @@ xfs_ialloc( xfs_inode_t *ip; uint flags; int error; - timespec_t tv; + struct timespec tv; + bool has_epoch; /* * Call the space management code to pick @@ -720,12 +721,19 @@ xfs_ialloc( ip->i_d.di_nextents = 0; ASSERT(ip->i_d.di_nblocks == 0); - nanotime(&tv); - ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec; + has_epoch = xfs_sb_version_hasepoch(&mp->m_sb); + tv = current_fs_time(mp->m_super); + ip->i_d.di_mtime.t_sec = xfs_timestamp_sec(&tv); ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec; ip->i_d.di_atime = ip->i_d.di_mtime; ip->i_d.di_ctime = ip->i_d.di_mtime; + if (has_epoch) { + ip->i_d.di_mtime_epoch = xfs_timestamp_epoch(&tv); + ip->i_d.di_atime_epoch = ip->i_d.di_mtime_epoch; + ip->i_d.di_ctime_epoch = ip->i_d.di_mtime_epoch; + } + /* * di_gen will have been taken care of in xfs_iread. */ @@ -743,6 +751,8 @@ xfs_ialloc( ip->i_d.di_flags2 = 0; memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); ip->i_d.di_crtime = ip->i_d.di_mtime; + if (has_epoch) + ip->i_d.di_crtime_epoch = ip->i_d.di_mtime_epoch; } diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index cb35ae4..0459e3d 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -208,6 +208,10 @@ xfs_dinode_from_disk( to->di_nlink = be32_to_cpu(from->di_nlink); to->di_projid_lo = be16_to_cpu(from->di_projid_lo); to->di_projid_hi = be16_to_cpu(from->di_projid_hi); + to->di_atime_epoch = from->di_atime_epoch; + to->di_mtime_epoch = from->di_mtime_epoch; + to->di_ctime_epoch = from->di_ctime_epoch; + to->di_crtime_epoch = from->di_crtime_epoch; memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); to->di_flushiter = be16_to_cpu(from->di_flushiter); to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec); @@ -255,6 +259,10 @@ xfs_dinode_to_disk( to->di_nlink = cpu_to_be32(from->di_nlink); to->di_projid_lo = cpu_to_be16(from->di_projid_lo); to->di_projid_hi = cpu_to_be16(from->di_projid_hi); + to->di_atime_epoch = from->di_atime_epoch; + to->di_mtime_epoch = from->di_mtime_epoch; + to->di_ctime_epoch = from->di_ctime_epoch; + to->di_crtime_epoch = from->di_crtime_epoch; memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 944d5ba..215324f 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -161,6 +161,9 @@ xfs_ioctl32_bstat_copyin( get_user(bstat->bs_gen, &bstat32->bs_gen) || get_user(bstat->bs_projid_lo, &bstat32->bs_projid_lo) || get_user(bstat->bs_projid_hi, &bstat32->bs_projid_hi) || + get_user(bstat->bs_atime_epoch, &bstat32->bs_atime_epoch) || + get_user(bstat->bs_mtime_epoch, &bstat32->bs_mtime_epoch) || + get_user(bstat->bs_ctime_epoch, &bstat32->bs_ctime_epoch) || get_user(bstat->bs_dmevmask, &bstat32->bs_dmevmask) || get_user(bstat->bs_dmstate, &bstat32->bs_dmstate) || get_user(bstat->bs_aextents, &bstat32->bs_aextents)) diff --git a/fs/xfs/xfs_ioctl32.h b/fs/xfs/xfs_ioctl32.h index 80f4060..2a35c62 100644 --- a/fs/xfs/xfs_ioctl32.h +++ b/fs/xfs/xfs_ioctl32.h @@ -68,7 +68,10 @@ typedef struct compat_xfs_bstat { __u16 bs_projid_lo; /* lower part of project id */ #define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_projid_hi; /* high part of project id */ - unsigned char bs_pad[12]; /* pad space, unused */ + __u8 bs_atime_epoch; /* access time epoch */ + __u8 bs_mtime_epoch; /* modify time epoch */ + __u8 bs_ctime_epoch; /* change time epoch */ + unsigned char bs_pad[9]; /* pad space, unused */ __u32 bs_dmevmask; /* DMIG event mask */ __u16 bs_dmstate; /* DMIG state info */ __u16 bs_aextents; /* attribute number of extents */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 205613a..0588381 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -505,23 +505,34 @@ xfs_setattr_time( struct iattr *iattr) { struct inode *inode = VFS_I(ip); + bool has_epoch; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + has_epoch = xfs_sb_version_hasepoch(&ip->i_mount->m_sb); if (iattr->ia_valid & ATTR_ATIME) { inode->i_atime = iattr->ia_atime; - ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; - ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; + ip->i_d.di_atime.t_sec = xfs_timestamp_sec(&iattr->ia_atime); + ip->i_d.di_atime.t_nsec = (__int32_t)iattr->ia_atime.tv_nsec; + if (has_epoch) + ip->i_d.di_atime_epoch = + xfs_timestamp_epoch(&iattr->ia_atime); } if (iattr->ia_valid & ATTR_CTIME) { inode->i_ctime = iattr->ia_ctime; - ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; - ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; + ip->i_d.di_ctime.t_sec = xfs_timestamp_sec(&iattr->ia_ctime); + ip->i_d.di_ctime.t_nsec = (__int32_t)iattr->ia_ctime.tv_nsec; + if (has_epoch) + ip->i_d.di_ctime_epoch = + xfs_timestamp_epoch(&iattr->ia_ctime); } if (iattr->ia_valid & ATTR_MTIME) { inode->i_mtime = iattr->ia_mtime; - ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; - ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; + ip->i_d.di_mtime.t_sec = xfs_timestamp_sec(&iattr->ia_mtime); + ip->i_d.di_mtime.t_nsec = (__int32_t)iattr->ia_mtime.tv_nsec; + if (has_epoch) + ip->i_d.di_mtime_epoch = + xfs_timestamp_epoch(&iattr->ia_mtime); } } @@ -963,6 +974,7 @@ xfs_vn_update_time( struct xfs_mount *mp = ip->i_mount; struct xfs_trans *tp; int error; + struct iattr iattr = {0}; trace_xfs_update_time(ip); @@ -975,20 +987,19 @@ xfs_vn_update_time( xfs_ilock(ip, XFS_ILOCK_EXCL); if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; + iattr.ia_valid |= ATTR_CTIME; + iattr.ia_ctime = *now; } if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; + iattr.ia_valid |= ATTR_MTIME; + iattr.ia_mtime = *now; } if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; + iattr.ia_valid |= ATTR_ATIME; + iattr.ia_atime = *now; } + xfs_setattr_time(ip, &iattr); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return -xfs_trans_commit(tp, 0); @@ -1239,12 +1250,18 @@ xfs_setup_inode( inode->i_generation = ip->i_d.di_gen; i_size_write(inode, ip->i_d.di_size); - inode->i_atime.tv_sec = ip->i_d.di_atime.t_sec; - inode->i_atime.tv_nsec = ip->i_d.di_atime.t_nsec; - inode->i_mtime.tv_sec = ip->i_d.di_mtime.t_sec; - inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; - inode->i_ctime.tv_sec = ip->i_d.di_ctime.t_sec; - inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; + inode->i_atime.tv_sec = xfs_inode_time_from_epoch( + ip->i_d.di_atime_epoch, + ip->i_d.di_atime.t_sec); + inode->i_atime.tv_nsec = ip->i_d.di_atime.t_nsec; + inode->i_mtime.tv_sec = xfs_inode_time_from_epoch( + ip->i_d.di_mtime_epoch, + ip->i_d.di_mtime.t_sec); + inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; + inode->i_ctime.tv_sec = xfs_inode_time_from_epoch( + ip->i_d.di_ctime_epoch, + ip->i_d.di_ctime.t_sec); + inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; xfs_diflags_to_iflags(inode, ip); ip->d_ops = ip->i_mount->m_nondir_inode_ops; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index cb64f22..e902418 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -97,12 +97,24 @@ xfs_bulkstat_one_int( buf->bs_uid = dic->di_uid; buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size; + + /* timestamp epochs are emitted only when configured */ buf->bs_atime.tv_sec = dic->di_atime.t_sec; buf->bs_atime.tv_nsec = dic->di_atime.t_nsec; buf->bs_mtime.tv_sec = dic->di_mtime.t_sec; buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec; buf->bs_ctime.tv_sec = dic->di_ctime.t_sec; buf->bs_ctime.tv_nsec = dic->di_ctime.t_nsec; + if (xfs_sb_version_hasepoch(&mp->m_sb)) { + buf->bs_atime_epoch = dic->di_atime_epoch; + buf->bs_mtime_epoch = dic->di_mtime_epoch; + buf->bs_ctime_epoch = dic->di_ctime_epoch; + } else { + buf->bs_atime_epoch = 0; + buf->bs_mtime_epoch = 0; + buf->bs_ctime_epoch = 0; + } + buf->bs_xflags = xfs_ip2xflags(ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; buf->bs_extents = dic->di_nextents; diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h index f0969c7..abac6ad 100644 --- a/fs/xfs/xfs_log_format.h +++ b/fs/xfs/xfs_log_format.h @@ -374,6 +374,10 @@ typedef struct xfs_icdinode { __uint32_t di_nlink; /* number of links to file */ __uint16_t di_projid_lo; /* lower part of owner's project id */ __uint16_t di_projid_hi; /* higher part of owner's project id */ + __uint8_t di_atime_epoch; /* access time epoch */ + __uint8_t di_mtime_epoch; /* modify time epoch */ + __uint8_t di_ctime_epoch; /* change time epoch */ + __uint8_t di_crtime_epoch;/* create time epoch */ __uint8_t di_pad[6]; /* unused, zeroed space */ __uint16_t di_flushiter; /* incremented on flush */ xfs_ictimestamp_t di_atime; /* time last accessed */ diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index c43c2d6..1b3ccd8 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -509,8 +509,11 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_EPOCH (1 << 1) /* Time beyond 2038 */ #define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) + (XFS_SB_FEAT_INCOMPAT_FTYPE | \ + XFS_SB_FEAT_INCOMPAT_EPOCH | \ + 0) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool @@ -558,6 +561,13 @@ static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); } +static inline int xfs_sb_version_hasepoch(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_EPOCH); +} + + /* * end of superblock version macros */ diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 50c3f56..cdb4d86 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -70,7 +70,7 @@ xfs_trans_ichgtime( int flags) { struct inode *inode = VFS_I(ip); - timespec_t tv; + struct timespec tv; ASSERT(tp); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); From climmural@gmail.com Sun Jun 1 20:10:09 2014 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 72B9B7F54 for ; Sun, 1 Jun 2014 20:10:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0573EAC002 for ; Sun, 1 Jun 2014 18:10:05 -0700 (PDT) X-ASG-Debug-ID: 1401671398-04cb6c1009b2fe0001-NocioJ Received: from [175.184.136.46] ([175.184.136.46]) by cuda.sgi.com with SMTP id FqOtiJZShniJcqNY for ; Sun, 01 Jun 2014 18:09:59 -0700 (PDT) X-Barracuda-Envelope-From: climmural@gmail.com X-Barracuda-Apparent-Source-IP: 175.184.136.46 Reply-To: climmural@gmail.com From: climmural@gmail.com To: xfs@oss.sgi.com Subject: Climatiseur Mural promo Sender: climmural@gmail.com X-ASG-Orig-Subj: Climatiseur Mural promo Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Date: Mon, 2 Jun 2014 08:59:40 +0800 X-Barracuda-Connect: UNKNOWN[175.184.136.46] X-Barracuda-Start-Time: 1401671399 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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, MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140602011005.87C521296194@cuda.sgi.com> Climatisation Murale Nattendez pas la prochaine canicule. Climatiseurs muraux 9000 18000 BTU muni de compresseur Toshiba garanti de 5 ans partir de 1295$ installation comprise. Prix imbattables sur nos produits de marque Napolon Climatisation Dshumidification Chauffage jusqu' - 15 Celsius (avec arrt automatique) DC Inverter Compresseur Toshiba garantie 6 ans complte Appareil certifi Energy Star ligible une subvention de 650$ Appareil haut de gamme prix imbattables 12 000 BTU partir de 2195$ installation comprise Contactez-nous: Frigor - Groupe Senick RBQ: 8355-1929-45 Service rapide et professionnel Rservez maintenant 514 792- 6461 450 441- 1235 Sans frais: 1 800 678- 1673 From "info..."@financier.com Sun Jun 1 20:21:34 2014 Return-Path: <"info..."@financier.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLY, SUBJ_ALL_CAPS 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 55AA229DF8 for ; Sun, 1 Jun 2014 20:21:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 236BC8F8040 for ; Sun, 1 Jun 2014 18:21:31 -0700 (PDT) X-ASG-Debug-ID: 1401672085-04bdf059a03dd010001-NocioJ Received: from mail.vps.com ([168.62.9.222]) by cuda.sgi.com with ESMTP id KB3n4OdtOqjArUAY; Sun, 01 Jun 2014 18:21:26 -0700 (PDT) X-Barracuda-Envelope-From: info...@financier.com X-Barracuda-Apparent-Source-IP: 168.62.9.222 Received: from [168.62.9.222] (localhost [IPv6:::1]) by mail.vps.com (Postfix) with ESMTP id 60C1221F16; Sun, 1 Jun 2014 19:41:27 +0000 (UTC) Received: from 64.237.38.43 (SquirrelMail authenticated user admin) by 168.62.9.222 with HTTP; Sun, 1 Jun 2014 19:41:27 -0000 Message-ID: <1b4233ea427ac9fd033273fc6fbb533e.squirrel@168.62.9.222> Date: Sun, 1 Jun 2014 19:41:27 -0000 Subject: QUALITY LOAN CHANCE/TRUSTEE!!! From: "PINNACLE INVESTMENT" <"info..."@financier.com> X-ASG-Orig-Subj: QUALITY LOAN CHANCE/TRUSTEE!!! User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[168.62.9.222] X-Barracuda-Start-Time: 1401672086 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.20 X-Barracuda-Spam-Status: No, SCORE=2.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR, PLING_PLING, RDNS_NONE, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.46 PLING_PLING Subject has lots of exclamation marks 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 Im an investor and Lender, I am interested in funding good business plans, we render Construction funds, 100% JV Equity, Low Income Housing, Large-Scale Debt, Small Balance, DIP(Debtor in Possession), Apt. Equity Participation, Non Recourse for Multi Family & Assisted Living, Commercial Bridge/Hard Money, Mezzanine Programs, Income Producing Property, Commercial Land Development, Stock Loans, beneficiary trust fund as well as seed capital. Our interest rate is 4% per annum. Interested in getting your project funding, Feel free to contact me on email: pinnacleinvestment12@gmail.com Regards, Mrs Rose Normand From nicolas.pitre@linaro.org Sun Jun 1 20:36:30 2014 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 59D7F29DF8 for ; Sun, 1 Jun 2014 20:36:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 323B1304032 for ; Sun, 1 Jun 2014 18:36:30 -0700 (PDT) X-ASG-Debug-ID: 1401672988-04cb6c1006b4110001-NocioJ Received: from mail-qa0-f50.google.com (mail-qa0-f50.google.com [209.85.216.50]) by cuda.sgi.com with ESMTP id GfWKUm6dN3jx97Bz (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 01 Jun 2014 18:36:28 -0700 (PDT) X-Barracuda-Envelope-From: nicolas.pitre@linaro.org X-Barracuda-Apparent-Source-IP: 209.85.216.50 Received: by mail-qa0-f50.google.com with SMTP id j15so1831444qaq.23 for ; Sun, 01 Jun 2014 18:36:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=WUXjXLxeS/njWujENUJoaf6O/MmNgZcBLK8tBngqma0=; b=WLilNzCgfpTqaOmh2ejr7NZ/Bo8h8o/TiGmujduJPfrQSxSPSBWc9TnuLpMHFihbgX T+t/a5lkte24fWNnzZ8+qtFxvQbCay8uKDwCll/YRMeUoeojxWu+2dxXz4dmJ3ahoYWH FJghCT4J2Fx7mOqiMqUQfw5klzjgbpdSAgbAKnvJx6ZdZNZBnMO9PYT3zD8t+fRq4lT0 CKKPgDqvdtrm8N2r7uBIf4l4S1LKU5FBkr7TnQpwGWZ2WICopqXmeQJ7bTwt90EUGy9e jHOGCanxisvh+vwCCU+9EhnbgRaOjy038N+Kd+59dW9PXVC6qtRBi3zyXivq1sfIEqGM E6jw== X-Gm-Message-State: ALoCoQm6ru+GdOC1r+SKXN6CKsM3ymXmV0zsaGmNz0B3u0rK/86TIAKlA/8zRXuifZ9lYPGzPdLc X-Received: by 10.224.25.133 with SMTP id z5mr44869637qab.97.1401672988159; Sun, 01 Jun 2014 18:36:28 -0700 (PDT) Received: from xanadu.home (modemcable177.143-130-66.mc.videotron.ca. [66.130.143.177]) by mx.google.com with ESMTPSA id 73sm7420237qgw.5.2014.06.01.18.36.26 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 01 Jun 2014 18:36:27 -0700 (PDT) Date: Sun, 1 Jun 2014 21:36:26 -0400 (EDT) From: Nicolas Pitre To: Arnd Bergmann cc: "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <8618458.1EVJCoVbkH@wuerfel> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <538995D4.9050702@zytor.com> <8618458.1EVJCoVbkH@wuerfel> User-Agent: Alpine 2.11 (LFD 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-qa0-f50.google.com[209.85.216.50] X-Barracuda-Start-Time: 1401672988 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, 1 Jun 2014, Arnd Bergmann wrote: > On Saturday 31 May 2014 11:46:16 Nicolas Pitre wrote: > > > readonly if not in reality than in practice. > > > > For those (legacy) filesystems with a signed 32-bit timestamps, any > > attempt to create a timestamp past Jan 19 03:14:06 2038 UTC should be > > (silently) clamped to 0x7fffffff and that value (the last representable > > time) used as an overflow indicator. The filesystem driver should > > convert that value into a corresponding overflow value for whatever > > kernel internal time representation being used when read back, and this > > should be propagated up to user space. It should not be a hard error > > otherwise, as you rightfully stated, everything non read-only would come > > to a halt on that day. > > I don't think there is much of a difference between not being able to > write at all and all newly written files having the same timestamp, > causing random things to break differently. Well, in one case you have a crash certitude. In the other case you have some probability that your system might still be usable. > The clamp to the maximum supported time stamp sounds like a reasonable > choice for 'utimens' and related syscalls for the case of someone > setting an arbitrary future date beyond what the file system can > represent. Then again, I don't see a reason why that shouldn't just > cause an error to be returned. Resiliance is better than outright failure. > For actually running kernels beyond 2038, the best idea I've seen so > far is to disallow all broken code at compile time. I don't see > a choice but to audit the entire kernel for invalid uses on both > 32 and 64 bit in the next few years. A lot of code will get changed > in the process so we can actually keep running 32-bit kernels and > file systems, but other code will likely go away: > > * any system calls that pass a time_t, timeval or timespec on > 32-bit systems return -ENOSYS, to ensure all user land uses > the replacements we will put into place > * The definition of 'time_t', 'timval' and 'timespec' can be hidden > from the kernel, and all code using it left out. > * ext2 and ext3 file system code will have to be disabled, but that's > file since ext4 can mount old file systems. Syscalls and libs can be "fixed". Existing filesystem content might not. So if you need to mount some old media in read-write mode after 2038 and that happens to content an ext2 or similarly limited filesystem then it'd better just "work". Having the kernel refuse to modify the filesystem would be unacceptable. Nicolas From david@fromorbit.com Sun Jun 1 21:22:40 2014 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 A28CD29DF8 for ; Sun, 1 Jun 2014 21:22:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5136A8F8040 for ; Sun, 1 Jun 2014 19:22:40 -0700 (PDT) X-ASG-Debug-ID: 1401675753-04cbb050fd1b29b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tsOSQWjMy33gLc0e for ; Sun, 01 Jun 2014 19:22:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al53AF/fi1N5LL1sPGdsb2JhbABZgweDRagRAQEBAQEBBpgbAYEOFwMBAQEBODWCJQEBBScTHCMQCAMYCSUPBSUDBxoTiEHUEBcWhT+DXoRHAQ5JB4RABJl/ixyLXCuBMAEf Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Jun 2014 11:52:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrHt5-00048M-2J; Mon, 02 Jun 2014 12:22:11 +1000 Date: Mon, 2 Jun 2014 12:22:11 +1000 From: Dave Chinner To: Nicolas Pitre Cc: Arnd Bergmann , "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602022211.GN6677@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <538995D4.9050702@zytor.com> <8618458.1EVJCoVbkH@wuerfel> 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.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1401675753 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jun 01, 2014 at 09:36:26PM -0400, Nicolas Pitre wrote: > On Sun, 1 Jun 2014, Arnd Bergmann wrote: > > On Saturday 31 May 2014 11:46:16 Nicolas Pitre wrote: > > For actually running kernels beyond 2038, the best idea I've seen so > > far is to disallow all broken code at compile time. I don't see > > a choice but to audit the entire kernel for invalid uses on both > > 32 and 64 bit in the next few years. A lot of code will get changed > > in the process so we can actually keep running 32-bit kernels and > > file systems, but other code will likely go away: > > > > * any system calls that pass a time_t, timeval or timespec on > > 32-bit systems return -ENOSYS, to ensure all user land uses > > the replacements we will put into place > > * The definition of 'time_t', 'timval' and 'timespec' can be hidden > > from the kernel, and all code using it left out. > > * ext2 and ext3 file system code will have to be disabled, but that's > > file since ext4 can mount old file systems. > > Syscalls and libs can be "fixed". Existing filesystem content might > not. So if you need to mount some old media in read-write mode after > 2038 and that happens to content an ext2 or similarly limited filesystem > then it'd better just "work". Having the kernel refuse to modify the > filesystem would be unacceptable. We can already tell the VFS/filesystems not to update timestamps: inode->i_flags |= S_NOATIME | S_NOCMTIME; Just enforce that everywhere (i.e. notify_change()) rather than just on the IO path and the "legacy filesystem timestamp" problem is "solved". New interfaces need to return errors when an out-of-range parameter is set. And right now, >epoch dates are out of range for most filesystems, and so we need to handle that condition appropriately. Silent date overflow == filesystem corruption, and as such I'm going to error out such conditions in the filesystem regardless of what the userspace API says. Filesystems place all sorts of userspace visible limits on storage - ever tried to create a file >16TB on ext4? The on-disk format doesn't support it, so it returns an out of range error (E2BIG, I think) if you try. XFS, OTOH, handles this just fine and so it continues to work. It's exactly the same with timestamps - there's a physical limit to what can sanely be stored in any given filesystem and it's an *error condition* to go beyond that limit.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From geert.uytterhoeven@gmail.com Mon Jun 2 02:09:32 2014 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,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 2E15A7F54 for ; Mon, 2 Jun 2014 02:09:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CDF2FAC001 for ; Mon, 2 Jun 2014 00:09:28 -0700 (PDT) X-ASG-Debug-ID: 1401692963-04bdf0599e3eb610001-NocioJ Received: from mail-ig0-f178.google.com (mail-ig0-f178.google.com [209.85.213.178]) by cuda.sgi.com with ESMTP id K25V2ZmFHPlpQuW5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 00:09:24 -0700 (PDT) X-Barracuda-Envelope-From: geert.uytterhoeven@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] Received: by mail-ig0-f178.google.com with SMTP id hl10so3050770igb.17 for ; Mon, 02 Jun 2014 00:09:23 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=/2hw/2jKf7vgl31+I5DSvbTjvhNBtD1+rBnYM+4otw8=; b=dwZRbgD1TheRGKEn1WXJP4GfBFE5WC0gMPtXKVEHit0UrBQ+cmcJf8p9HZUfJXsNYQ HxPbE9Y0RwMQKK1gv7uPXzN1FoV8osdnW3GgNP9BZoPYxtGet+TgTvxI7tkXN3gHyTFV JsGzS66VEXT7UtKhSgoaXCnEmFoQ2K5NL9fv9pmAsKCMtUckzJCNq+If30dRbaxQaBmO B4daQZV+WxryejX4ue44H5KvxNT1ABg7riRIzOTidHf2ZAfM0EIqq4xSlUtLTfirDCwe 8jI1oIwbIJDCDvO8stSF73DXNl0wCW4UTbh7Kyae1wfx3yVAqlg+KnluuFwtgN1ZL19a a35w== MIME-Version: 1.0 X-Received: by 10.42.162.71 with SMTP id w7mr31967456icx.50.1401692963868; Mon, 02 Jun 2014 00:09:23 -0700 (PDT) Sender: geert.uytterhoeven@gmail.com Received: by 10.64.17.199 with HTTP; Mon, 2 Jun 2014 00:09:23 -0700 (PDT) In-Reply-To: <20140602022211.GN6677@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <538995D4.9050702@zytor.com> <8618458.1EVJCoVbkH@wuerfel> <20140602022211.GN6677@dastard> Date: Mon, 2 Jun 2014 09:09:23 +0200 X-Google-Sender-Auth: ucJLYpLDnEBNYh8KUivO1xla42g Message-ID: Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Geert Uytterhoeven X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time To: Dave Chinner Cc: Nicolas Pitre , Arnd Bergmann , "H. Peter Anvin" , "linux-kernel@vger.kernel.org" , Linux-Arch , "Joseph S. Myers" , John Stultz , Christoph Hellwig , Thomas Gleixner , Ley Foon Tan , Linux FS Devel , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f178.google.com[209.85.213.178] X-Barracuda-Start-Time: 1401692964 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6308 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 On Mon, Jun 2, 2014 at 4:22 AM, Dave Chinner wrote: > Filesystems place all sorts of userspace visible limits on storage - > ever tried to create a file >16TB on ext4? The on-disk format > doesn't support it, so it returns an out of range error (E2BIG, I > think) if you try. XFS, OTOH, handles this just fine and so it > continues to work. It's exactly the same with timestamps - there's a > physical limit to what can sanely be stored in any given filesystem > and it's an *error condition* to go beyond that limit.... This comparison doesn't fly. File sizes do not depend on the current time (except for the increase of megapixels in your new camera ;-). Writing a 15 GiB file to ext4 is not something that magically stops working tomorrow. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From bounce@itarget.vn Mon Jun 2 03:35:15 2014 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, 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 2B5407F55 for ; Mon, 2 Jun 2014 03:35:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D71CAC007 for ; Mon, 2 Jun 2014 01:35:14 -0700 (PDT) X-ASG-Debug-ID: 1401698111-04cbb050fb1c1270001-NocioJ Received: from server.itarget.vn (itarget.vn [162.243.116.224]) by cuda.sgi.com with ESMTP id Tm3hRzSc2DwGzV5B (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 01:35:11 -0700 (PDT) X-Barracuda-Envelope-From: bounce@itarget.vn X-Barracuda-Apparent-Source-IP: 162.243.116.224 Received: by server.itarget.vn (Postfix, from userid 0) id 976D0BD44A; Mon, 2 Jun 2014 04:31:38 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=itarget.vn; s=default; t=1401697898; bh=ajH3NwdKl7UYm3ET7sZUqr2tZAUWYeQ5OoSkAcfbrdE=; h=To:Subject:Date:From:Reply-To:List-Unsubscribe; b=b23K3XzDKlkVPWR2SdiZ7S0Q5HeXYJ53cebhGbE23BQOQDAjx7uUF0CUZ8ZeWvjNi BomJq9nYI9//ivERhGl14CcMyoKCKXC/E/lfQMsfP8L7v3le+ULc3T33DqHJn67Ndx KwrfTRnOBowb7ZunTlIKPn4pf70BTqkVxzz+j7/k= To: xfs@oss.sgi.com Subject: =?UTF-8?B?Q8O0bmcgdHkgbsOgbyBz4bq9IGPDsyBt4bq3dCB0cm9uZyBkYW5oIHPDoWNoIDUwIEPDtG5nIHR5IG5pw6ptIHnhur90IHThu5F0IG5o4bqldCBWaeG7h3QgTmFtIDIwMTQ/?= X-PHP-Originating-Script: 0:email.php X-ASG-Orig-Subj: =?UTF-8?B?Q8O0bmcgdHkgbsOgbyBz4bq9IGPDsyBt4bq3dCB0cm9uZyBkYW5oIHPDoWNoIDUwIEPDtG5nIHR5IG5pw6ptIHnhur90IHThu5F0IG5o4bqldCBWaeG7h3QgTmFtIDIwMTQ/?= Message-ID: <26e3330f27d24471b17c6f494531b1cd@app9.icontact.vn> Date: Mon, 02 Jun 2014 04:15:47 -0400 From: "Forbes Vietnam" Reply-To: newsletter@forbesvietnam.com MIME-Version: 1.0 X-Mailer-LID: 1401,1400 List-Unsubscribe: X-Mailer-RecptId: 5003309 X-Mailer-SID: 3398 X-Mailer-Sent-By: 51 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: itarget.vn[162.243.116.224] X-Barracuda-Start-Time: 1401698111 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.00 X-Barracuda-Spam-Status: No, SCORE=2.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC3_MV0164, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6309 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 2.00 BSF_SC3_MV0164 Custom rule MV0164
Trang chủ | Đặt báo dài hạn |  
Đầu tư thông minh cùng Forbes Việt
Nam
Đón đọc Forbes Việt Nam (số 12)
tháng 05.2014

Forbes Việt Nam giới thiệu số tháng 06.2014 (phát hành ngày 02.06.2014), với chủ đề “Danh sách 50 công ty niêm yết tốt nhất Việt Nam”

Nội dung đặc biệt trong số 13 là Danh sách 50 công ty niêm yết tốt nhất trên thị trường chứng khoán Việt Nam năm 2014 do Forbes Việt Nam xếp hạng. Đây là danh sách những công ty niêm yết đứng đầu các ngành, có các chỉ số tăng trưởng doanh thu và lợi nhuận ổn định trong các năm qua và triển vọng phát triển tốt trong tương lai.

Ngoài ra còn có Danh sách 2000 công ty niêm yết lớn nhất thế giới và Danh sách giàu nhất Hàn Quốc.

 
 
 
 
Diễn đàn kinh doanh Việt Nam và Kỷ niệm 1 năm xuất bản Forbes Việt Nam (tháng 06.2014)
 

Forbes Việt Nam lần đầu tiên tổ chức sự kiện “Forbes Việt Nam – Diễn đàn kinh doanh” năm 2014 với chủ đề “Việt Nam – Cơ hội mới” tại khách sạn Intercontinental Asiana Saigon vào ngày 3 tháng 7 năm 2014 với sự tham gia của những diễn giả và lãnh đạo doanh nghiệp hàng đầu Việt Nam và quốc tế.

 
 
Diễn Đàn Kinh Doanh Việt Nam
2014
 

Phí tham dự: US$500.

Tìm hiểu thêm thông tin sự kiện “Forbes Việt Nam – Diễn đàn kinh doanh” năm 2014 tại đây.

Để tham gia sự kiện, vui lòng đăng ký tại đây.

Tìm hiểu thêm về những sự kiện của Forbes Việt Nam tại đây.

 
Nhân kỷ niệm 1 năm Forbes Việt Nam ra mắt (06/2013 – 06/2014), chúng tôi xin trân trọng gửi đến khách hàng chương trình ưu đãi đặc biệt, GIẢM ĐẾN 40% cho những khách hàng tham gia đặt quảng cáo trước ngày 16/05/2014.
 
Để biết thêm chi tiết, vui lòng liên hệ
Phòng Kinh Doanh | Tel: +84 8 3936 9499
 

Forbes Việt Nam Pass – thẻ ưu đãi dành cho độc giả thân thiết của Forbes Việt Nam phát hành tháng 6.2014. Ngoài những quyền lợi từ Forbes Việt Nam, khi sở hữu thẻ bạn đọc có thể tận hưởng nhiều tiện ích trong dịch vụ với những đối tác tham gia khác.

Xin vui lòng xem thêm chi tiết tại: www.forbesvietnam/forbespass

 

Tạp chí Forbes Việt Nam số tháng 05.2014
Chiếm hơn 18% trong cơ cấu GDP của Việt Nam trong năm 2013, nông nghiệp là ngành sử dụng tới 47% tổng số lao động trên cả nước. Forbes Việt Nam ghi nhận xu hướng này, cùng những câu chuyện thể hiện bản lĩnh biết chấp nhận thử thách của doanh nhân Việt Nam trong một lĩnh vực truyền thống của Việt Nam nhưng đang gặp rất nhiều áp lực phải đổi mới.
Tạp chí Forbes Việt Nam số tháng 04.2014
Đọc những câu chuyện điển hình, những bình luận và quan điểm sắc bén của Forbes Việt Nam trong lĩnh vực này. Ngoài ra còn có danh sách những tỉ phú thế giới năm 2014.
Tạp chí Forbes Việt Nam tháng 03.2014
Tạp chí Forbes Việt Nam số tháng 03.2014
Forbes Việt Nam tôn vinh vai trò của nữ doanh nhân trong môi trường phát triển và hội nhập. Đặc biệt chúc mừng 3 nữ doanh nhân Việt Nam có tên trong top 10 nữ doanh nhân xuất sắc Châu Á do Forbes Asia bình chọn…
Forbes Việt Nam
Địa chỉ: Vincom B, 72 Lê Thánh Tôn, Quận 1, Tp. Hồ Chí Minh, Việt Nam
Tel: +84 8 3936 9499  |  Fax: +84 8 3936 9495  |  Email us
Copyright © 2014 Forbes Vietnam | All Rights Reserved.
You are receiving this email because you have a business relationship with Forbes Vietnam.
To unsubscribe, please click here.
From lczerner@redhat.com Mon Jun 2 05:13:50 2014 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 7B4D47F54 for ; Mon, 2 Jun 2014 05:13:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 57E2A8F804C for ; Mon, 2 Jun 2014 03:13:50 -0700 (PDT) X-ASG-Debug-ID: 1401704026-04cbb050fa1c4b90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cI9NeFYnEWOcBJo5 for ; Mon, 02 Jun 2014 03:13:46 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s52ADaZb003614 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 2 Jun 2014 06:13:36 -0400 Received: from vpn1-6-254.ams2.redhat.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s52ADV2O005993 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Jun 2014 06:13:33 -0400 Date: Mon, 2 Jun 2014 12:13:31 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Namjae Jeon cc: "'Dave Chinner'" , "'Theodore Ts'o'" , "'linux-ext4'" , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, "'Ashish Sangwan'" Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate In-Reply-To: <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> X-ASG-Orig-Subj: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: References: <003601cf6aa7$883103b0$98930b10$@samsung.com> <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-2027863592-1401704015=:2231" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401704026 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-2027863592-1401704015=:2231 Content-Type: TEXT/PLAIN; charset=iso-8859-2 Content-Transfer-Encoding: 8BIT On Sat, 31 May 2014, Namjae Jeon wrote: > Date: Sat, 31 May 2014 16:40:29 +0900 > From: Namjae Jeon > To: 'Luk Czerner' > Cc: 'Dave Chinner' , 'Theodore Ts'o' , > 'linux-ext4' , xfs@oss.sgi.com, > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > 'Ashish Sangwan' > Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for > fallocate > > > > > Date: Thu, 08 May 2014 19:23:19 +0900 > > > From: Namjae Jeon > > > To: Dave Chinner , Theodore Ts'o > > > Cc: linux-ext4 , xfs@oss.sgi.com, > > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > > Ashish Sangwan > > > Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate > > > > > > In continuation of the work of making the process of non linear editing of > > > media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE > > > for fallocate. > > > > > > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > > > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > > > in between the file within the range specified by offset and len. User can > > > write new data in this space. e.g. ads. > > > Like collapse range, currently we have the limitation that offset and len should > > > be block size aligned for both XFS and Ext4. > > > > > > The semantics of the flag are : > > > 1) It allocates new zeroed out on disk space of len bytes starting > > > at offset byte without overwriting any existing data. All the data blocks > > > from offset to EOF are shifted towards right to make space for inserting > > > new blocks > > > > Hi, > > > > this sounds a little bit weird to me. I understand the reason for > > this, but this is effectively two operations masking as one. We > > shift the existing data and then we allocate unwritten extents for > > the hole we've created. > > > > What would make more sense to me is to implement only the first > > operation - the shift. And then let the user to allocate unwritten > > extents for the hole using simple fallocate. > > > > The reason is that if you succeed the first part and then fail the > > second due to ENOSPC or any other reason the file will end up in > > undefined state unnecessarily. Yes in your current implementation > > it seems that you'll always end up with the hole in the file and the > > rest is properly shifted, but that may vary from file system to file > > system. Some might choose to roll back the shift, some might not. > > > > If FALLOC_FL_INSERT_RANGE (or any name you wish to choose) would > > just simply shift the extents then you'll get rid of this and the > > only thing that user needs to do (if he chooses to) is to use > > fallocate for the hole created by the shift. If it fails, then > > well, he can try again without any consequences. As a bonus you get > > the possibility to leave the hole in the file which might be useful > > as well. > > > > With current behaviour this might get very confusing very quickly. > > > > What do you and others think ? > Hi Lukas. > Insert range inherently means inserting a real range of space into > the file to provide guaranteed space with user in the inserted area > so that further writes should not fail with an -ENOSPC at least. > If insert range cannot gurantees the above semantics, It should > return error to user space. So what will happen when there is not enough space when "inserting a range" ? And how should user proceed from there ? > > If insert range has been performed on a file, It will reserve space > that write never fail in the inserted area, > In case of full partition or small available size than the range > user want, It seems odd just only left inserting a hole in the middle > of file and return success to user when no one can really write to > this hole. There is a fallocate for allocation, so as I already said you can shift the extents to make a hole in the file and then use fallocate to allocate space for it and you'll get the same result. You are basically doing that now as well, but when the allocation fails the whole "insert range" ioct fails, however the extents are already shifter and there is already a holi in the file so freeing some space and running this ioctl again will not help you at all. While if you fail a fallocate, you can free some space and run it again without any problems. The result will be as expected. What I am arguing about is basically that your insert range ioct is masking two operations as one. Why not to make it transparent and split it into "shift extents" and fallocate ? Then there is a question about the name because it's no longer "insert range" but rather "insert hole" which I think is better and arguably more useful semantic. Thanks! -Lukas > > Thanks! > > > > Thanks! > > -LUkas > > > > > > > 2) It should be used exclusively. No other fallocate flag in combination. > > > 3) Offset and length supplied to fallocate should be fs block size aligned > > > in case of xfs and ext4. > > > 4) Insert range does not work for the case when offset is overlapping/beyond > > > i_size. If the user wants to allocate space at the end of file they are > > > advised to use either ftruncate(2) or fallocate(2) with mode 0. > > > 5) It increses the size of file by len bytes. > > > > > > > > > Namjae Jeon (10): > > > fs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > xfsprogs: xfs_io: add finsert command for insert range via fallocate > > > xfstests: generic/027: Standard insert range tests > > > xfstests: generic/028: Delayed allocation insert range > > > xfstests: generic/029: Multi insert range tests > > > xfstests: generic/030: Delayed allocation multi insert > > > xfstests: fsstress: Add fallocate insert range operation > > > xfstests: fsx: Add fallocate insert range operation > > > > > > > > --8323328-2027863592-1401704015=:2231-- From uspesnitim@gmail.com Mon Jun 2 05:39:27 2014 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.1 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLY, HTML_MESSAGE,HTML_OBFUSCATE_05_10,SUBJ_ALL_CAPS,T_DKIM_INVALID,T_FRT_CONTACT 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 D64087F55 for ; Mon, 2 Jun 2014 05:39:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 853CB8F8037 for ; Mon, 2 Jun 2014 03:39:27 -0700 (PDT) X-ASG-Debug-ID: 1401705565-04bdf059a03f3ee0001-NocioJ Received: from mail-pb0-f68.google.com (mail-pb0-f68.google.com [209.85.160.68]) by cuda.sgi.com with ESMTP id NhmAnEzGYQsHfb9S (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 03:39:25 -0700 (PDT) X-Barracuda-Envelope-From: uspesnitim@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.68 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] Received: by mail-pb0-f68.google.com with SMTP id uo5so2160387pbc.7 for ; Mon, 02 Jun 2014 03:39:24 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=Rj6gxy2hd3mqmornF2BVQAT2jKkQj4S/ICEA8kLD1pI=; b=i2lMI/ZiFq6PowtZp0FqWtyWT7IBgN5ejh1LLQS1IEtR5gvT7dpW8Wve2JuoPdRAx+ lo3E/f7pNL9uB6WXOGBABlN69/TQGHDYg6ni40bVXRirRvig/bxa7ufC5xqdoHYqU6+3 7BMLEWkYsiJq0Ru8MTXscZ8a8FzsnSKyNLXcN758/PEyq9Qr3amE/OZG31/NeJIHc8SP c5ofwRHRCr9IitgOhLIVdgcQ5UUMRPuDJ9BmGSAYpQZ0Xqid+6kGNb07Y2ykePqdlmyu SohZRWXtheiHRCVzBEVt7nxctQurAMlQZXfuW8Pp1FsDehpMyA7FIA7jIbVe8GinZTuD STqw== MIME-Version: 1.0 X-Received: by 10.68.132.68 with SMTP id os4mr39075052pbb.129.1401705564808; Mon, 02 Jun 2014 03:39:24 -0700 (PDT) Received: by 10.70.68.135 with HTTP; Mon, 2 Jun 2014 03:39:24 -0700 (PDT) Date: Mon, 2 Jun 2014 12:39:24 +0200 Message-ID: Subject: VAZI DOK IMA NA ZALIHAMA From: "uspesni tim ." X-ASG-Orig-Subj: VAZI DOK IMA NA ZALIHAMA To: velikosnizenje@stranijezici.promo.net Content-Type: multipart/alternative; boundary=047d7b10ca9d45340304fad8022a X-Barracuda-Connect: mail-pb0-f68.google.com[209.85.160.68] X-Barracuda-Start-Time: 1401705565 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.21 X-Barracuda-Spam-Status: No, SCORE=2.21 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, HTML_OBFUSCATE_05_10, HTML_OBFUSCATE_05_10_2, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6311 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_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.57 HTML_OBFUSCATE_05_10_2 Message is 05% to 10% HTML obfuscation 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 --047d7b10ca9d45340304fad8022a Content-Type: text/plain; charset=UTF-8 *Engleski, nemacki, spanski, italijanski i francuski za slusanje u pokretu* *srpska verzija* Kurs je u formatu MP3 na 5 diskova i omogucava ljudima koji su stalno u pokretu i nemaju mnogo vremena da budu kod kuce pored svog racunara da uz pomoc najnovijih metoda nauce strani jezik. Na ovaj nacin strani jezik mozete uciti u kolima, na putu od kuce do posla i obrnuto, dok trcite ili setate, dok putujete ili se odmarate u prirodi, dakle na svom auto radiu ili mobilnom telefonu, MP3 plejeru i sl. strani jezik cete moci uciti na bilo kom mestu. Vreme u toku dana predvidjeno za ucenje jezika nije standardno, dakle mozete sami planirati koliko cete i gde preslusavati materijal. Rezultati ce biti bolji ukoliko imate kontinuitet u preslusavanju nasih diskova, sto znaci ukoliko cesce budete preslusavali brze cete savladati strani jezik. Materijal na diskovima obuhvata 4 nivoa datog jezika: pocetni nivo, produzeni kurs, visi tecaj i poslovni kurs, svaka rec ili recenica izgovorena na stranom jeziku posle nje sledi prevod na srpski (ovo se odnosi na pocetni i srednji nivo, visi i poslovni kurs podrazumeva da Vi vec imate odredjeno znanje datog jezika pa je i prevod suvisan) Na POKLON dobijate* i knjigu, recnik i gramatiku u elektronskoj formi na posebnom disku*, gde cete moci da proverite sve ono sto ste naucili ili da naucite nesto novo. Uz svaki kupljeni komplet-kurs dobijate i MULTIMEDIJALNI INTERAKTIVNI DVD KURS KOJI SADRZI 10 NIVOA UCENJA za dati jezik (engleski, nemacki, spanski, italijanski ili francuski jezik). Ova NOVA verzija kursa razvijena od strane najboljih strucnjaka u ovoj oblasti koristi se u najpoznatijim skolama i univerzitetima sirom sveta. Sigurno najkompletniji i najobimniki kurs omogucice Vam da na jednsostavan i zabavan nacin savladate dati jezik (citanje, pisanje, govor, gramatika itd) *PROMO PONUDA:* Kurs engleskog za slusanje u pokretu ukljucujuci i dodatne diskove : *3599,00* 1599.oo din. Kurs nemackog za slusanje u pokretu ukljucujuci i dodatne diskove : *3599,00* 1599.oo din. Kurs spanskog za slusanje u pokretu ukljucujuci i dodatne diskove : *3599,00* 1599.oo din. Kurs italijanskog za slusanje u pokretu ukljucujuci i dodatne diskove : *3599,00* 1599.oo din. Kurs francuskog za slusanje u pokretu ukljucujuci i dodatne diskove : *3599,00* 1599.oo din. * SPECIJALNA PONUDA: Za kupljena dva ili vise kursa dobijate dadatni POPUST od 10% na celokupan iznos. *U cenu jesu uracunati troskovi slanja paketa, sto znaci da Vi placate samo cenu koja je iznad navedena, tj. 1599,oo dinara.* Placanje je pouzecem, dakle po preuzimanju paketa, kao potvrdu placanja dobijate nalog kojim mozete vrsiti administrativno pravdanje gotovinskog placanja. Ukoliko zelite da porucite ovu nasu specijalnu ponudu potrebno je da dostavite Vase ime i prezime, adresu, mesto, postanski broj i broj telefona (obavezno je navesti sve podatke) i paket ce biti kod Vas u roku od 48 sati. Porudzbine slati iskljucivo na e-mail adresu: kursjezikazausput@gmail.com ** Dodatni diskovi obuhvataju knjigu, recnik i gramatiku u elektronskoj formi na posebnom disku kao i multimedijalni dvd kurs za dati jezik - 10 NIVOA ucenja i oni ulaze u PROMO cenu i ne naplacuju se dodatno. PROMO cena vazi do isteka zaliha, zato pozurite.* *U ponudi imamo i kurseve drugih jezika, ukoliko Vas interesuje neki jezik koji nije naveden u ponudi kontaktirajte nas na mail: kursjezikazausput@gmail.com * Izvinjavamo se ukoliko smo Vas slanjem ovog mail-a na bilo koj nacin uznemirili, ako niste zeleli da primite isti molimo Vas da posaljete prazan mail na mail.odjava@gmail.com --047d7b10ca9d45340304fad8022a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


Engleski, nemacki, spanski, italijanski i francuski za slusanje u pokretu

srpska verzija

=C2=A0

=C2=A0=C2=A0=C2=A0 Kurs je u forma= tu MP3 na 5 diskova i omogucava ljudima koji su stalno u pokretu i nemaju mnogo vremena da budu= kod kuce pored svog racunara da uz pomoc najnovijih metoda nauce strani =C2=A0jezik. Na ovaj nacin strani = jezik mozete uciti u kolima, na putu od kuce do posla i obrnuto, dok trcite ili setate, dok putu= jete ili se odmarate u prirodi, dakle =C2=A0na svom auto radiu ili mobilnom telefonu, MP3 plejeru i sl. strani jezik cete moci = uciti na bilo kom mestu. Vreme u toku dana =C2=A0predvidjeno za=C2=A0ucenje jezika=C2=A0nije standardno, dak= le mozete sami planirati koliko cete i gde preslusavati materijal. Rezultati c= e biti bolji ukoliko imate kontinuitet u preslusavanju nasih diskova, sto zna= ci ukoliko cesce budete preslusavali brze cete savladati stra= ni jezik. Materijal na diskovima obuhvata 4 nivoa datog jezika: pocetni nivo, produzeni kurs, visi tecaj i poslovni kurs, =C2=A0svaka rec ili recenica izgovorena=C2=A0na=C2=A0stranom jeziku posle nje sledi pr= evod=C2=A0na=C2=A0srpski (ovo se odnosi=C2=A0na=C2=A0pocetni i srednji = nivo, visi i poslovni kurs podrazumeva da Vi vec imate odredjeno znanje datog jezika pa je i prevod suvisan)

=C2=A0

Na POKLON dobijate i knjigu, re= cnik i gramatiku u elektronskoj formi =C2=A0na posebnom disku, gde cete= moci da proverite sve ono sto ste naucili ili da naucite nesto novo.

Uz svaki kupljeni komplet-kurs dob= ijate i MULTIMEDIJALNI INTERAKTIVNI DVD KURS KOJI SADRZI 10 NIVOA UCENJA za dati je= zik (engleski, nemacki, spanski, italijanski ili francuski jezik). Ova NOVA ver= zija kursa=C2=A0 razvijena od strane najboljih strucnjaka u ovoj oblasti koristi se u najpoznatijim skolama i univerziteti= ma sirom sveta. Sigurno najkompletniji i najobimniki kurs omogucice Vam da na jednsostavan i zabavan nacin savladate dati jezik (citanje, pisanje, govor, gramatika itd)

=C2=A0

PROMO PONUDA:

Kurs engleskog=C2=A0 za slusanje u pokretu=C2=A0ukljucujuci i dodatne diskove : 3599,00=C2=A0=C2=A0=C2=A0 1599.oo din.<= /span>

Kurs nemackog=C2=A0 za slusanje u pokretu=C2=A0ukljucujuci i dodatne diskove : 3599,00=C2=A0=C2=A0=C2=A0 1599.oo din.<= /span>

Kurs spanskog=C2=A0 za slusanje u pokretu=C2=A0ukljucujuci i dodatne diskove : 3599,00=C2=A0=C2=A0=C2=A0 1599.oo din.<= /span>

Kurs italijanskog=C2=A0 za slusanje u pokretu=C2=A0ukljucujuc= i i dodatne diskove : 3599,00=C2=A0=C2=A0=C2=A0 1599.oo din= .

Kurs francuskog=C2=A0 za slusanje u pokretu=C2=A0ukljucujuci= i dodatne diskove : 3599,00=C2=A0=C2=A0=C2=A0 1599.oo din.= *

=C2=A0

=C2=A0

SPECIJALNA PONUDA:

Za kupljena dva ili vise kursa dob= ijate dadatni POPUST od 10% =C2=A0na celokupan iznos.

=C2=A0

U cenu jesu uracunati troskovi slanja paketa, sto znaci da Vi placate samo cenu koja je iznad navedena, tj. 1599,oo dinara.

Placanje je pouzecem, dakle po pre= uzimanju paketa, kao=C2=A0potvrdu=C2= =A0placanja dobijate nalog kojim mozete vrsiti administrativno pravdanje gotovinskog placanja.

=C2=A0

Ukoliko zelite da porucite=C2=A0ov= u nasu specijalnu ponudu=C2=A0potrebno je da dostavite Vase ime i prezime, adresu, mesto, postanski broj=C2=A0i broj telefona (obavezno je navesti sve podatke)=C2=A0i paket ce biti kod Vas u roku od 48 sati.

Porudzbine slati iskljucivo na e-m= ail adresu:

=C2=A0

kursjezikazausput@gmail.com

=C2=A0

* Dodatni diskovi obuhvataju knjigu, recnik i gramatiku u elektronskoj formi=C2=A0 na posebnom disku kao i multimedijalni dvd kurs za dati jezik - 10 NIVOA=C2=A0 ucenja i oni ulaze u PROMO =C2=A0cenu=C2=A0 i ne naplacuju se dodatno. PROMO cena vazi do isteka zaliha, zato pozurite.

U ponudi imamo i kurseve drugih= jezika, ukoliko Vas interesuje neki jezik koji nije naveden u ponudi kontaktirajte = nas na=C2=A0 mail: =C2=A0kursjez= ikazausput@gmail.com

=C2=A0

=C2=A0

Izvinjavam= o se ukoliko smo Vas slanjem ovog mail-a na bilo koj nacin uznemirili, ako niste zeleli da primite isti=C2=A0 molimo Vas da posaljete prazan mail na mail.odjava@gmail.com

=C2=A0

=C2=A0

=C2=A0=

=C2=A0

--047d7b10ca9d45340304fad8022a-- From arnd@arndb.de Mon Jun 2 05:58:51 2014 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 41CAC7F55 for ; Mon, 2 Jun 2014 05:58:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE706AC002 for ; Mon, 2 Jun 2014 03:58:47 -0700 (PDT) X-ASG-Debug-ID: 1401706724-04cbb050fd1c6540001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by cuda.sgi.com with ESMTP id ewGtbK39YG1xu7BM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 03:58:45 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.24 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue103) with ESMTP (Nemesis) id 0MRB2F-1XFIwu0ILH-00UWtl; Mon, 02 Jun 2014 12:56:43 +0200 From: Arnd Bergmann To: Nicolas Pitre Cc: "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 12:56:42 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <4178301.j9kWdGCRLC@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:rc5WLQ/9j2qpMfwTsA0d0sLxGYtDN5Q90L7frf+Bkjc z7o7Ihk6Zig4bOCe3nDbDr8m1/GKHG9dL4ig8bggV4tUvPsW2n Wk1oolEllkgTXtYCEe9Iqj78J4EyLAdHt07DJKHkD4Gbqn8Ov6 SF4zQ2pA4F7poZBUHQuPhuuefpWtjJZ+mGUjUb7erpRcRLf/E9 uU5WD09126Dm3iPlY+1IrJL/2rM1HU77Vu0MDmNwy2MZ+mv6kH q7+TnOAWSFHDuGTWHswv6GoEDEtPRhThbh0gzGvin06XigZbnP ZYkjpKorAHKj1A+88kfEHLibIWL/CPvfQFqLFBm5b57zT2mpMK kboML90cXK+9Of5S7Ih8= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.24] X-Barracuda-Start-Time: 1401706725 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sunday 01 June 2014 21:36:26 Nicolas Pitre wrote: > > > For actually running kernels beyond 2038, the best idea I've seen so > > far is to disallow all broken code at compile time. I don't see > > a choice but to audit the entire kernel for invalid uses on both > > 32 and 64 bit in the next few years. A lot of code will get changed > > in the process so we can actually keep running 32-bit kernels and > > file systems, but other code will likely go away: > > > > * any system calls that pass a time_t, timeval or timespec on > > 32-bit systems return -ENOSYS, to ensure all user land uses > > the replacements we will put into place > > * The definition of 'time_t', 'timval' and 'timespec' can be hidden > > from the kernel, and all code using it left out. > > * ext2 and ext3 file system code will have to be disabled, but that's > > file since ext4 can mount old file systems. > > Syscalls and libs can be "fixed". Existing filesystem content might > not. So if you need to mount some old media in read-write mode after > 2038 and that happens to content an ext2 or similarly limited filesystem > then it'd better just "work". Having the kernel refuse to modify the > filesystem would be unacceptable. I think you misunderstood what I suggested: the intent is to avoid seeing things break in 2038 by making them break much earlier. We have a solution for ext2 file systems, it's called ext4, and we just need to ensure that everybody knows they have to migrate eventually. At some point before the mid 2030ies, you should no longer be able to build a kernel that has support for ext2 or any other module that will run into bugs later. Until then (rather sooner than later), I'd like to get to the point where you can choose whether to include those modules at build time or not, and then get everybody to turn off that option and fix the bugs they run into. You wouldn't need that for a 2014-generation long-term support disto (rhel 7, sles 12, debian 7, ubuntu 14.04, ...), but perhaps for the next generation, or the one after that. Arnd From arnd@arndb.de Mon Jun 2 06:02:33 2014 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 A728E7F56 for ; Mon, 2 Jun 2014 06:02:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88B06304059 for ; Mon, 2 Jun 2014 04:02:33 -0700 (PDT) X-ASG-Debug-ID: 1401706948-04cb6c100cc9b20001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.130]) by cuda.sgi.com with ESMTP id kvt67eZdfV5VweLH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 04:02:29 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.130 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue003) with ESMTP (Nemesis) id 0M4VfU-1Waxz13MAm-00yg4G; Mon, 02 Jun 2014 13:02:08 +0200 From: Arnd Bergmann To: "H. Peter Anvin" Cc: Nicolas Pitre , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 13:02:07 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <142924495.p3tVTERnnG@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <0ab4392c-d89d-4277-914d-1696f455daab@email.android.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <0ab4392c-d89d-4277-914d-1696f455daab@email.android.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:QhJnBhSvwSkofJdPVaDBMUwdbdcwYruw/hF6s9q5pnS vE84rvg93Tc0p4uFQKLxebzhy29CZHzmuY78XhZog9NyzGEuty 8IlsLMlsL+OiS+Gj/lfMe8AB96cD5U2cEWLxfj/U55SE4gKimN EhzygnJ4kPqMvHYuRObFgU99l+uqLHJD7KS8B6xwuRBUYoofnv Fys59Omtzf/FUXIQdRBdAftmI+/uDgjpqjrZ+1zEY3SzBZ/BAY G0WejfapIYM1VCj7/FWaDBxXaoWp/v7LhoNdjVxAZF8NuSSCyR C9yDykgpxmPjHcB1T5bE77vscv51MUGwy/c1OmF69QEeeACVMs 8D96IJ8ImOqNOdh5u0iM= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.130] X-Barracuda-Start-Time: 1401706948 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sunday 01 June 2014 13:26:03 H. Peter Anvin wrote: > Perhaps we should make this a kernel command line option instead, with the > settings: error out on outside the standard window, or a date indicating the > earliest date that should be recognized and do windowing (0 for no windowing, > 1970 for retconning the Unix epoch as unsigned...) What's wrong with compile-time errors? We have a pretty good understanding of how time values are passed in the kernel, and we know they will all break in 2038 for 32-bit kernels unless we do something about it. > But again, the kernel is probably the least problem here... I agree the glibc side is harder than this, but we have to get the kernel into shape first (at the minimum we have to do the APIs), and there is enough work to do here. Arnd From mp6058@gmail.com Mon Jun 2 06:22:26 2014 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,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 DFEF27F5D for ; Mon, 2 Jun 2014 06:22:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3A04AC002 for ; Mon, 2 Jun 2014 04:22:20 -0700 (PDT) X-ASG-Debug-ID: 1401708138-04cb6c1009ca680001-NocioJ Received: from mail-wg0-f52.google.com (mail-wg0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id ITmNtj56A765SqCg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 04:22:18 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wg0-f52.google.com with SMTP id l18so4874803wgh.23 for ; Mon, 02 Jun 2014 04:22:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=fW8bCTCWhc0zPLMzcMoS0/M61XAsyYgsHh3kuZS2+RI=; b=alfQEx7gdwG44ilG06NbGD1K27sZKcjhITvMG5L3eblc4ZyMnekNAOHy7p+c+l/NZW JNaGG9X3cUnmsImH4iJ3CGdTygWOHzbQhCuInbDEeGQVKD9NJtGkPGYDzaNRg17ZyeX2 +uTQE2kieuWYYUhBufc9NjhAY4qqTpIl9e1f7Lra1b5i9x3KKtTWqtJHcstURmkS2Wrl nI6HPwUcSm9u2b7YzNZkov7bNaMnUzSAn/LsYYiI6ZhvndDDOuFz1NO0szt9fKaFgr0o ONHAr3PHAVmKXOSiiEE+1GjteHvn+irtCscvO4uSGSjlWxX2EMganuAmpeL6feXpSGxN Ry2g== X-Received: by 10.180.183.131 with SMTP id em3mr21152765wic.56.1401708137961; Mon, 02 Jun 2014 04:22:17 -0700 (PDT) Received: from [192.168.1.14] ([37.131.0.23]) by mx.google.com with ESMTPSA id fh5sm31753986wic.9.2014.06.02.04.22.16 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Jun 2014 04:22:17 -0700 (PDT) Message-ID: <538C5E67.6090005@gmail.com> Date: Mon, 02 Jun 2014 14:22:15 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <20140503030221.GJ26353@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1401708138 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6312 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 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 >> How can I detect this situation? I mean I didn't see anything in >> /proc/mounts or references to the mount point from /proc//*, >> so I only managed to correct it (chdir elsewhere) by chance on a >> hunch. Would it not be desirable to know that there's a phantom >> FS referenced by a number of processes? > > lsof. No good. It happened again and the only thing showing up in lsof that's even remotely a match is the kernel process associated with the filesystem instance. "[xfs-data/sde103]". The mountpoint has been removed by the automatic mounting facility (udev? systemd?). The device is no longer id /dev (udev?). There's nothing useful in the output of "find /proc -ls" either. Any other suggestions to locate the processes that are holding up XFS? Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTjF5dAAoJELsEaSRwbVYrO7IP/016AVgVrdCQ2Vm95hFT5rdu LH6Sz0mpnZn6mAliNLAa+wFpXArDb6VPyssmomzNLgnpA95qLcfJeBqs1wF88tiA GO+aFSX3o3npAokbaq1N5c1dKz/g9lpsUPBkmiUEqcPLJMOKdJdSSd4T2nnnKrkD uDGRmEPZGKXLt75Z0SajnG8oX22bSQdzREn2o4DXZy+RJF9G8wsc490b8TzijDul AtL/2zlRL45LqbcaNNAOARUiTN4IAxy3xwYRU+xXKhqojPRc0x8K4wrjnGcsiw4x Cz5HjJ6CdBLmjn69TRf+S5Y/UXtUcyFOIS0XIUwYg6KtwrI1BY+N+GpkSJNG/DcH 0lAN6n7UBTAADw54ZJdYhyw5aUt9OEXdDx2nIuTxq+X/6u4ydEDchJWPvyLG2nv9 Z2vObyh07X9n7h+zknK3yBxlHHNcpi1/d3njxRSa3GKQIPKNbrLNkrFqB4U4+isr qrcldbcke5d6sUP/VdvjeOGTYWtymx8KqL1MDGPRXruOO1Y6N8DWTbseQCbeoQlS k0L9md5FsZOPG/aUgXHvD4350sKqYpQk2pgoGW7Ia6F+5nwi1TdSd8R6mlGJ0GyW hMymVeykhb19mVJzdc7UlmxyAUBUEd2zGEeO0uSenHt19yWc93vfEHG6GCtxFpu6 sxblWr9nRfPi6sOw7oUF =xn+2 -----END PGP SIGNATURE----- From roger@filmlight.ltd.uk Mon Jun 2 06:35:44 2014 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 CAF097F63 for ; Mon, 2 Jun 2014 06:35:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF99C304032 for ; Mon, 2 Jun 2014 04:35:44 -0700 (PDT) X-ASG-Debug-ID: 1401708942-04cbb050fc1c80d0001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id 5GTKO5dskDJIPMKA for ; Mon, 02 Jun 2014 04:35:42 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 8025 invoked from network); 2 Jun 2014 11:35:41 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.132?) (roger@10.44.0.132) by b.mx.filmlight.ltd.uk with SMTP; 2 Jun 2014 11:35:41 -0000 Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Roger Willcocks X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time To: Dave Chinner Cc: Arnd Bergmann , linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, lftan@altera.com, hch@infradead.org, john.stultz@linaro.org, "H. Peter Anvin" , linux-fsdevel@vger.kernel.org, geert@linux-m68k.org, tglx@linutronix.de, xfs@oss.sgi.com, joseph@codesourcery.com In-Reply-To: <20140602002822.GQ14410@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <5507340.nVBP5LFtqn@wuerfel> <20140601002437.GL14410@dastard> <20140602002822.GQ14410@dastard> Content-Type: text/plain Date: Mon, 02 Jun 2014 12:35:41 +0100 Message-Id: <1401708941.6065.51.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1401708942 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 2014-06-02 at 10:28 +1000, Dave Chinner wrote: > > The 32 bit second counters in timestamps are too small to represent > time beyond the unix epoch (jan 2038) correctly. Extend the on-disk > format for a timestamp to include an 8-bit epoch counter so that we > can extend time for up to 255 Unix epochs. This should be good for > representing timestamps from 1970 to somewhere around 19,000 A.D.... > I assume you're using an 'epoch' variable and not simply using the padding byte as an eight-bit prefix to the existing 32-bit counter because the existing counter is signed ? For long term sanity it might make more sense for the eight-bit value to be a simple (sign-extended) prefix from 1970. So if the feature bit is set it's a 40-bit signed time, which is good for 1970 +/- 17400 years or so. -- Roger From arnd@arndb.de Mon Jun 2 06:45:51 2014 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 078657F6B for ; Mon, 2 Jun 2014 06:45:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF785304032 for ; Mon, 2 Jun 2014 04:45:50 -0700 (PDT) X-ASG-Debug-ID: 1401709548-04cb6c1009cbfa0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.10]) by cuda.sgi.com with ESMTP id ykqBmIB3ZIorCObz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 04:45:48 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.10 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue101) with ESMTP (Nemesis) id 0M3jlp-1WaAme2FRB-00rLBd; Mon, 02 Jun 2014 13:43:45 +0200 From: Arnd Bergmann To: Dave Chinner Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 13:43:44 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <7106937.MLk03lftzD@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140602002822.GQ14410@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140601002437.GL14410@dastard> <20140602002822.GQ14410@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:fRAV9wDDOcEBbFybEsLcMyqv/ZBAftOBgtS3iQf+ECG rrUdoe9Xm0FA2ZhUDN+zhYmwGmXMe1BSZich9WINlfbDsp5EBl NhfdoELzAFf2QMS0K6aArK2IdXk3swnxvvFKVzxDiUI3aVrK9J 6fLp+y6ZjM/IfZuA4S1KHYZlHntSgMyBRwWjBW1kpqgfgGsZvQ 2FWszLtnoiWw/BFId+GbBkF0ckpRh/AKGhf6cVXMJcxb4PpJAU NnjLF/rH1NLjVuI+fa2hZHMR5MpuiplkabmgT7xtN2UeLed+a4 miWtJOsyCLhnWig3Jt2YFHcYaMz/EiYhA7Gg2DcE+MctqLvsVq wDY5pc+y3j3JloKLGyWI= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.10] X-Barracuda-Start-Time: 1401709548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 10:28:22 Dave Chinner wrote: > On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > > In my list at http://kernelnewbies.org/y2038, I found that almost > > > all file systems at least times until 2106, because they treat > > > the on-disk value as unsigned on 64-bit systems, or they use > > > a completely different representation. My guess is that somebody > > > earlier spent a lot of work on making that happen. > > > > > > The exceptions are: > > > > > > * exofs uses signed values, which can probably be changed to be > > > consistent with the others. > > > * isofs has a bug that limits it until 2027 on architectures with > > > a signed 'char' type (otherwise it's 2155). > > > * udf can represent times for many thousands of years through a > > > 16-bit year representation, but the code to convert to epoch > > > uses a const array that ends at 2038. > > > * afs uses signed seconds and can probably be fixed > > > * coda relies on user space time representation getting passed > > > through an ioctl. > > > * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, > > > where they really use signed. > > > > > > I was confused about XFS since I didn't noticed that there are > > > separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected > > > XFS to also use the 1970-2106 time range on 64-bit systems today. > > > > You've missed an awful lot more than just the implications for the > > core kernel code. > > > > There's a good chance such changes propagate to APIs elsewhere in > > the filesystems, because something you haven't realised is that XFS > > effectively exposes the on-disk timestamp format directly to > > userspace via the bulkstat interface (see struct xfs_bstat). It also > > affects the XFS open-by-handle ioctl and the swap extent ioctl used > > by the online defragmenter. I really didn't look at them at all, as ioctl is very late on my mental list of things to change. I do realize that a lot of drivers and file systems do have ioctls that pass time values and we need to address them one by one. I just looked at the ioctls you mentioned but don't see how open-by-handle is affected by this. Can you point me to what you mean? > Just to put that in context, here's the kernel patch to add extended > epoch support to XFS. It's completely untested as I haven't done any > userspace code changes to enable the feature. However, it should > give you an indication of how far the simple act of changing the > kernel time representation spread through the filesystem. This does > not include any of the VFS infrastructure to specifying the range of > supported timestamps. It survives some smoke testing, but dies when > the online defragmenter starts using the bulkstat and swap extent > ioctls (the assert in xfs_inode_time_from_epoch() fires), so I > probably don't have that all sorted correctly yet... > > To test extended epoch support, however, I need to some fstests that > define and validate the behaviour of the new syscalls - until we get > those we can't validate that the filesystem follows the spec > properly. I also suspect we are going to need an interface to query > the supported range of timestamps from a filesystem so that we can > test boundary conditions in an automated fashion.... Thanks a lot for having an initial look at this yourself! I'd still consider the two problems largely orthogonal. My patch set (at least with the 64-bit tv_sec) just gets 32-bit kernels to behave more like 64-bit kernels regarding inode time stamps, which does impact all the file systems that the a 64-bit time or the NFS unsigned epoch (1970-2106), while your patch extends the file system internal epoch (1901-2038 for XFS) so it can be used by anything that knows how to handle larger than 32-bit second values (either 64-bit kernel or 32-bit with inode_time patch). > diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h > index 623bbe8..79f94722 100644 > --- a/fs/xfs/xfs_dinode.h > +++ b/fs/xfs/xfs_dinode.h > @@ -21,11 +21,53 @@ > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > #define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) > > +/* > + * Inode timestamps get more complex when we consider supporting times beyond > + * the standard unix epoch of Jan 2038. The struct xfs_timestamp cannot support > + * more than a single extension by playing sign games, and that is still not > + * reliable. We also can't extend the timestamp structure because there is no > + * free space around them in the on-disk inode. > + * > + * Hence the simplest thing to do is to add an epoch counter for each timestamp > + * in the inode. This can be a single byte for each timestamp and make use of > + * a hole we currently pad. This gives us another 255 epochs range for the > + * timestamps, but requires a superblock feature bit to indicate that these > + * fields have meaning and can be non-zero. Nice trick! > +static inline __uint8_t > +xfs_timestamp_epoch( > + struct timespec *time) > +{ > + /* will be zero until the extended struct inode_time is introduced */ > + return 0; > +} > + > +static inline __int32_t > +xfs_timestamp_sec( > + struct timespec *time) > +{ > + return time->tv_sec; > +} > + > +static inline __kernel_time_t > +xfs_inode_time_from_epoch( > + __uint8_t epoch, > + __int32_t seconds) > +{ > + /* need to handle non-zero epoch when struct inode_time is introduced */ > + ASSERT(epoch == 0); > + return seconds; > +} Why don't you already implement epoch conversion for 64-bit kernels that are able to represent the time today? This is how ext4 does it (I mean the sizeof() trick, not the bit stuffing they do): static inline __le32 ext4_encode_extra_time(struct inode_time *time) { return cpu_to_le32((sizeof(time->tv_sec) > 4 ? (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) | ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK)); } static inline void ext4_decode_extra_time(struct inode_time *time, __le32 extra) { if (sizeof(time->tv_sec) > 4) time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32; time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; } I guess if there is general agreement on introducing 'struct inode_time', we can skip that intermediate step. > @@ -509,8 +509,11 @@ xfs_sb_has_ro_compat_feature( > } > > #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ > +#define XFS_SB_FEAT_INCOMPAT_EPOCH (1 << 1) /* Time beyond 2038 */ > #define XFS_SB_FEAT_INCOMPAT_ALL \ > - (XFS_SB_FEAT_INCOMPAT_FTYPE) > + (XFS_SB_FEAT_INCOMPAT_FTYPE | \ > + XFS_SB_FEAT_INCOMPAT_EPOCH | \ > + 0) > > #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL How does this flag get set? Do you have to manually change it in the superblock? Since most of the time I'd suspect you wouldn't actually use it for the foreseeable future, would it make sense to have a mount option that allows it to be set, but doesn't actually change the superblock until the first inode gets written with a nonzero epoch? That way, you'd still be able to mount it with an older kernel but also be forward compatible with time moving on. Arnd From namjae.jeon@samsung.com Mon Jun 2 06:52:56 2014 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 72D667F5A for ; Mon, 2 Jun 2014 06:52:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CED4DAC003 for ; Mon, 2 Jun 2014 04:52:55 -0700 (PDT) X-ASG-Debug-ID: 1401709972-04cbb050fb1c94e0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id AJUGoO3DZhUQPEaK (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Mon, 02 Jun 2014 04:52:53 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N6J002RJIC39800@mailout4.samsung.com> for xfs@oss.sgi.com; Mon, 02 Jun 2014 20:52:51 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm1.samsung.com ( [172.20.52.112]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 66.D4.13369.3956C835; Mon, 02 Jun 2014 20:52:51 +0900 (KST) X-AuditID: cbfee690-b7fb56d000003439-db-538c65934f20 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 21.C0.08203.3956C835; Mon, 02 Jun 2014 20:52:51 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N6J00LAIIC2PE20@mmp1.samsung.com>; Mon, 02 Jun 2014 20:52:51 +0900 (KST) From: Namjae Jeon To: =?iso-8859-2?Q?'Luk=E1=B9_Czerner'?= Cc: 'Dave Chinner' , 'Theodore Ts'o' , 'linux-ext4' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' References: <003601cf6aa7$883103b0$98930b10$@samsung.com> <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> In-reply-to: Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 02 Jun 2014 20:52:51 +0900 X-ASG-Orig-Subj: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <002201cf7e59$2e684c10$8b38e430$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-2 Content-transfer-encoding: quoted-printable X-Mailer: Microsoft Outlook 14.0 Thread-index: AQOcBKJD5lk5ojpc7FDcCMzPaSWP+QCjXdQQAXmE8b8CRXdbEJehkH8A Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrFIsWRmVeSWpSXmKPExsWyRsSkQHdyak+wwe+JKhZLJ15itthy7B6j xbIHm1ksZs67w2axZ+9JFovLu+awWbT2/GS3WNR3i9GBw+PUIgmPpjNHmT1WX9jK6PF+31U2 j74tqxg9Pm+SC2CL4rJJSc3JLEst0rdL4Mo429PNWPDEtmLhzOVsDYy/9bsYOTkkBEwkPh/7 ygphi0lcuLeerYuRi0NIYCmjxPP7h1hhirYsameBSCxilHjwYh8rhPOXUeLw4hVALRwcbALa En+2iII0iAjYScyd08IEUsMs8IlR4nzfa6ixjxkles+fBhvLKeAuMfHLFCaQZmEBf4kd6/xA wiwCqhKrHn1jBLF5BSwlPhw8wQ5hC0r8mHyPBaScWUBH4uukCJAwM9DaJ+8uQB2qILHj7GtG iBvcJI5uecoKUSMise/FO0aQEyQE/rJLtE9pYYTYJSDxbfIhsJkSArISmw4wQ8yRlDi44gbL BEaJWUg2z0LYPAvJ5llINixgZFnFKJpakFxQnJReZKJXnJhbXJqXrpecn7uJERjPp/89m7CD 8d4B60OMyUDbJzJLiSbnA9NBXkm8obGZkYWpiamxkbmlGWnCSuK8ao+SgoQE0hNLUrNTUwtS i+KLSnNSiw8xMnFwSjUwpmiY7J8mo2Cy/Vn8RV6eXA7DRQ8Z1TbNZRAvP9oauTskX/vmA+XV ialBXjq2i24/uilYo6Z7VXXZ4pfpv6cdNmpf9r16UcydbZxfuzaKONj4ZGoqrVKu1Dyo4Cd4 kneybmrLZ8nPQT7chXON/WrO9Mg/np6gV/NHWXrXvPv9xh8VlfkzGYOVWIozEg21mIuKEwGJ xq6+/QIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOKsWRmVeSWpSXmKPExsVy+t9jAd3JqT3BBk9OS1osnXiJ2WLLsXuM FssebGaxmDnvDpvFnr0nWSwu75rDZtHa85PdYlHfLUYHDo9TiyQ8ms4cZfZYfWEro8f7fVfZ PPq2rGL0+LxJLoAtqoHRJiM1MSW1SCE1Lzk/JTMv3VbJOzjeOd7UzMBQ19DSwlxJIS8xN9VW ycUnQNctMwfoICWFssScUqBQQGJxsZK+HaYJoSFuuhYwjRG6viFBcD1GBmggYQ1jxtmebsaC J7YVC2cuZ2tg/K3fxcjJISFgIrFlUTsLhC0mceHeerYuRi4OIYFFjBIPXuxjhXD+MkocXrwC KMPBwSagLfFniyhIg4iAncTcOS1MIDXMAp8YJc73vYbqfswo0Xv+NCtIFaeAu8TEL1OYQJqF BfwldqzzAwmzCKhKrHr0jRHE5hWwlPhw8AQ7hC0o8WPyPRaQcmYBHYmvkyJAwsxAa5+8u8AK caiCxI6zrxkhbnCTOLrlKStEjYjEvhfvGCcwCs1CMmkWwqRZSCbNQtKxgJFlFaNoakFyQXFS eq6hXnFibnFpXrpecn7uJkZwsngmtYNxZYPFIUYBDkYlHt6f6j3BQqyJZcWVuYcYJTiYlUR4 l1oAhXhTEiurUovy44tKc1KLDzEmA/05kVlKNDkfmMjySuINjU3MjCyNzA0tjIzNSRNWEuc9 0GodKCSQnliSmp2aWpBaBLOFiYNTqoGx4pLnv1czLVdxqL9Pafz+raXhcZ+BznfxoNYwTTfJ v5FPFW5PkmmZH+f0xehl7ab+iRv3efPX7dj6xJ5v79NHNt0moRpVy8P+suZ9L1stt2WG0rVz sl/v2TtWr3rgbn4/u7judvHqKoW9DAtyGFIsDUyWm37sYTx8Tu2Xzby5W3Mzr6i6uYgpsRRn JBpqMRcVJwIAo9SKYloDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1401709973 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 >=20 > > Date: Sat, 31 May 2014 16:40:29 +0900 > > From: Namjae Jeon > > To: 'Luk=E1=B9 Czerner' > > Cc: 'Dave Chinner' , 'Theodore Ts'o' = , > > 'linux-ext4' , xfs@oss.sgi.com, > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > 'Ashish Sangwan' > > Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE = for > > fallocate > > > > > > > > Date: Thu, 08 May 2014 19:23:19 +0900 > > > > From: Namjae Jeon > > > > To: Dave Chinner , Theodore Ts'o = > > > > Cc: linux-ext4 , xfs@oss.sgi.com, > > > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > > > Ashish Sangwan > > > > Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE = for fallocate > > > > > > > > In continuation of the work of making the process of non linear = editing of > > > > media files faster, we introduce here the new flag = FALLOC_FL_INSERT_RANGE > > > > for fallocate. > > > > > > > > This flag will work opposite to the newly added = FALLOC_FL_COLLAPSE_RANGE flag. > > > > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert = zeroed-out space > > > > in between the file within the range specified by offset and = len. User can > > > > write new data in this space. e.g. ads. > > > > Like collapse range, currently we have the limitation that = offset and len should > > > > be block size aligned for both XFS and Ext4. > > > > > > > > The semantics of the flag are : > > > > 1) It allocates new zeroed out on disk space of len bytes = starting > > > > at offset byte without overwriting any existing data. All the = data blocks > > > > from offset to EOF are shifted towards right to make space = for inserting > > > > new blocks > > > > > > Hi, > > > > > > this sounds a little bit weird to me. I understand the reason for > > > this, but this is effectively two operations masking as one. We > > > shift the existing data and then we allocate unwritten extents for > > > the hole we've created. > > > > > > What would make more sense to me is to implement only the first > > > operation - the shift. And then let the user to allocate unwritten > > > extents for the hole using simple fallocate. > > > > > > The reason is that if you succeed the first part and then fail the > > > second due to ENOSPC or any other reason the file will end up in > > > undefined state unnecessarily. Yes in your current implementation > > > it seems that you'll always end up with the hole in the file and = the > > > rest is properly shifted, but that may vary from file system to = file > > > system. Some might choose to roll back the shift, some might not. > > > > > > If FALLOC_FL_INSERT_RANGE (or any name you wish to choose) would > > > just simply shift the extents then you'll get rid of this and the > > > only thing that user needs to do (if he chooses to) is to use > > > fallocate for the hole created by the shift. If it fails, then > > > well, he can try again without any consequences. As a bonus you = get > > > the possibility to leave the hole in the file which might be = useful > > > as well. > > > > > > With current behaviour this might get very confusing very quickly. > > > > > > What do you and others think ? > > Hi Lukas. > > Insert range inherently means inserting a real range of space into > > the file to provide guaranteed space with user in the inserted area > > so that further writes should not fail with an -ENOSPC at least. > > If insert range cannot gurantees the above semantics, It should > > return error to user space. >=20 > So what will happen when there is not enough space when "inserting a > range" ? And how should user proceed from there ? If insert range fails with an ENOSPC error, user could use collapse range on the same range to remove the hole. And after freeing more space, he can again try inserting range. Ofcourse, this type of guidance should be properly documented in manpage. When updating fallocate(2) manpage, I will keep in mind to describe ENOSPC handling. >=20 > > > > If insert range has been performed on a file, It will reserve space > > that write never fail in the inserted area, > > In case of full partition or small available size than the range > > user want, It seems odd just only left inserting a hole in the = middle > > of file and return success to user when no one can really write to > > this hole. >=20 > There is a fallocate for allocation, so as I already said you can > shift the extents to make a hole in the file and then use fallocate > to allocate space for it and you'll get the same result. You are > basically doing that now as well, but when the allocation fails the > whole "insert range" ioct fails, however the extents are already > shifter and there is already a holi in the file so freeing some > space and running this ioctl again will not help you at all. While > if you fail a fallocate, you can free some space and run it again > without any problems. The result will be as expected. >=20 > What I am arguing about is basically that your insert range ioct is > masking two operations as one. Why not to make it transparent and > split it into "shift extents" and fallocate ? Then there is a > question about the name because it's no longer "insert range" but > rather "insert hole" which I think is better and arguably more > useful semantic. The same thoeory can be argued against collapse range semantics too. One can argue that collapse range should not remove any data blocks from the specified range as that can be done by punch hole, so user should first perform punch hole and then call collapse range to eliminate the hole. There are 2 reasons I make insert range to allocate space. One is to keep insert range behavior as exactly opposite of the collapse range and it is named as such so that it seems obvious that it is related with collapse range. Other one is that, there will always be need of allocating space for data after making hole. So doing this within insert range is saving user from making 1 extra sys call. That said, I agree with you that it is arguable and I am not biased to this behavior. Probably, need some more thoughts from other fs people. Thanks for your opinion! >=20 > Thanks! > -Lukas >=20 > > > > Thanks! > > > > > > Thanks! > > > -LUkas > > > > > > > > > > 2) It should be used exclusively. No other fallocate flag in = combination. > > > > 3) Offset and length supplied to fallocate should be fs block = size aligned > > > > in case of xfs and ext4. > > > > 4) Insert range does not work for the case when offset is = overlapping/beyond > > > > i_size. If the user wants to allocate space at the end of = file they are > > > > advised to use either ftruncate(2) or fallocate(2) with mode = 0. > > > > 5) It increses the size of file by len bytes. > > > > > > > > > > > > Namjae Jeon (10): > > > > fs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > xfsprogs: xfs_io: add finsert command for insert range via = fallocate > > > > xfstests: generic/027: Standard insert range tests > > > > xfstests: generic/028: Delayed allocation insert range > > > > xfstests: generic/029: Multi insert range tests > > > > xfstests: generic/030: Delayed allocation multi insert > > > > xfstests: fsstress: Add fallocate insert range operation > > > > xfstests: fsx: Add fallocate insert range operation > > > > > > > > > > > > From tytso@thunk.org Mon Jun 2 06:58:21 2014 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 937B07F5D for ; Mon, 2 Jun 2014 06:58:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26725AC002 for ; Mon, 2 Jun 2014 04:58:21 -0700 (PDT) X-ASG-Debug-ID: 1401710298-04bdf0599f3f9310001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 5c4wFJuRQDHNCUbx (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 04:58:18 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=wG0mFEioOsWQ6shRxrFB1C17CIyr1KbDTpoJM6nhYJY=; b=d3Jm03pp/sQcpwMK5QNSdh1k9Mn0gwKc72vw+4rH/ONwsQJ1VkuNmmbb7olh2dhrE3YUlLfGc2EPKUy1rR9D4w0krHycPylz7SPBU70WhIqiLNYCepohDix9i21a11CJtH6MKOU77cyMR/7pxhddZgYgapf/1FY7qGcAqHPpqzI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrQry-0000Ha-5q; Mon, 02 Jun 2014 11:57:38 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 6A1F35802C1; Mon, 2 Jun 2014 07:57:37 -0400 (EDT) Date: Mon, 2 Jun 2014 07:57:37 -0400 From: Theodore Ts'o To: Arnd Bergmann Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602115737.GB14276@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , Arnd Bergmann , Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4178301.j9kWdGCRLC@wuerfel> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401710298 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6313 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 On Mon, Jun 02, 2014 at 12:56:42PM +0200, Arnd Bergmann wrote: > > I think you misunderstood what I suggested: the intent is to avoid > seeing things break in 2038 by making them break much earlier. We have > a solution for ext2 file systems, it's called ext4, and we just need > to ensure that everybody knows they have to migrate eventually. > > At some point before the mid 2030ies, you should no longer be able to > build a kernel that has support for ext2 or any other module that will > run into bugs later.... Even for ext4, it's not quite so simple as that. You only have support for times post 2038 if you are using an inode size > 128 bytes. There are a very, very large number of machines which even today, are using 128 byte inodes with ext4 for performance reasons. The vast majority of those machines which I know of can probably move to 256 byte inodes relatively easily, since hard drive replacement cycles are order 5-6 years tops, so I'm not that concerned, but it just goes to show this is a very complicated problem. And even if we're talking about flash and embedded devices, the good news is if you assume that 10 years is enough time for people to update their embedded OS builds, and that the vast majority of deployed devices will probably only be in service for 10-15 years, we do have enough time to make file system format changes, although admittedly we can't afford to dilly-dally. Regards, - Ted From arnd@arndb.de Mon Jun 2 07:40:04 2014 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 597537F5F for ; Mon, 2 Jun 2014 07:40:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40DFA304051 for ; Mon, 2 Jun 2014 05:40:01 -0700 (PDT) X-ASG-Debug-ID: 1401712799-04cb6c100cd1580001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id mCeKB6WC1xSO8xiH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 05:39:59 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue001) with ESMTP (Nemesis) id 0LeUuc-1WSnNs1YgI-00qUSI; Mon, 02 Jun 2014 14:38:10 +0200 From: Arnd Bergmann To: Theodore Ts'o Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 14:38:09 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <4910284.a72lauVLNV@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140602115737.GB14276@thunk.org> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4178301.j9kWdGCRLC@wuerfel> <20140602115737.GB14276@thunk.org> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:hyHxUAEYL2K/w3t7GxaXRbyCBjx/nTbUpXXBN/9TR/3 zyy3JU/06PnUmYxEEexsgPQEhAG6cL+sMrCMrjXu3jJVqeWdmB FDgeJzJUYad1c/8C8CDFHK+ndhd3VGvs+xNjk5j1LPSK4UhTTe xwJyF/Y8rP6djwK+mf5X/zX+WMlNn4yVvzX0Q5hBKF57Y2D2oS XNyoN69Z2YgulUHnLaP1/J9d3glXrSN8jqUeeW5EuSNIPm1khD Cj4YXutvaTIT8zvAzaOoZEnh5n0HnVV7UD1xYonl90yy9QdWY/ eNuUUwiqys/aIp0/Ivt8/fFNL3eltbKllKWHAKy0b1Zw4QMbtw /ZJc81fL8H6Fcu+AXJOc= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401712799 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6313 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 07:57:37 Theodore Ts'o wrote: > On Mon, Jun 02, 2014 at 12:56:42PM +0200, Arnd Bergmann wrote: > > > > I think you misunderstood what I suggested: the intent is to avoid > > seeing things break in 2038 by making them break much earlier. We have > > a solution for ext2 file systems, it's called ext4, and we just need > > to ensure that everybody knows they have to migrate eventually. > > > > At some point before the mid 2030ies, you should no longer be able to > > build a kernel that has support for ext2 or any other module that will > > run into bugs later.... > > Even for ext4, it's not quite so simple as that. You only have > support for times post 2038 if you are using an inode size > 128 > bytes. There are a very, very large number of machines which even > today, are using 128 byte inodes with ext4 for performance reasons. > > The vast majority of those machines which I know of can probably move > to 256 byte inodes relatively easily, since hard drive replacement > cycles are order 5-6 years tops, so I'm not that concerned, but it > just goes to show this is a very complicated problem. Ok, I see. I also now noticed this comment above EXT4_FITS_IN_INODE(): "For new inodes we always reserve enough space for the kernel's known extended fields, but for inodes created with an old kernel this might not have been the case. None of the extended inode fields is critical for correct filesystem operation." Do we have to worry about this for inodes that contain extended attributes and that get updated after 2038? Arnd From arnd@arndb.de Mon Jun 2 07:54:01 2014 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 9A9AA7F66 for ; Mon, 2 Jun 2014 07:54:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FD3AAC001 for ; Mon, 2 Jun 2014 05:53:58 -0700 (PDT) X-ASG-Debug-ID: 1401713635-04bdf059a13ffd50001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.10]) by cuda.sgi.com with ESMTP id k6cDCUKVWAmU7l86 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 05:53:56 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.10 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue105) with ESMTP (Nemesis) id 0MSa8q-1XGe4H3jeO-00RdMk; Mon, 02 Jun 2014 14:52:14 +0200 From: Arnd Bergmann To: Theodore Ts'o Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 14:52:13 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <15496653.1vSv1RUCC0@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140602115737.GB14276@thunk.org> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4178301.j9kWdGCRLC@wuerfel> <20140602115737.GB14276@thunk.org> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:Og6uvkG7nhSQ3FBH+zzsRjY83ZWdKEvQC6Cgd1rzE79 LgH0wKzyn8AkTY/kJQQ2b1U/wW0ETUZgy/E0p2mJpAiy87I5mi OtgXeNND/vPcNTI8Oi4L4MzkfFa/yaPC38RiixMusSUJHSU6pT L9oW8z4Hf1R+in1vhlkdbaOQ2VLHVLlx3DRxhK7Wn9t86tdZkH L85M0RtSOv8exNH+ymxWV/C9Vwr9v0DjIOJXk0HEZGj7iX3ylL 6CYYstSCakFz/TIdH6CVCWp7uzWuPZ0u7vOSR4FEBI1PHx47e/ BgJq68NoNSnBm71/O1I7gchdMFtaY+59jRkD2WOdMDBhDJpXWZ tMlVXunpEkCUlDkvgu2g= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.10] X-Barracuda-Start-Time: 1401713636 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6314 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 07:57:37 Theodore Ts'o wrote: > On Mon, Jun 02, 2014 at 12:56:42PM +0200, Arnd Bergmann wrote: > > > > I think you misunderstood what I suggested: the intent is to avoid > > seeing things break in 2038 by making them break much earlier. We have > > a solution for ext2 file systems, it's called ext4, and we just need > > to ensure that everybody knows they have to migrate eventually. > > > > At some point before the mid 2030ies, you should no longer be able to > > build a kernel that has support for ext2 or any other module that will > > run into bugs later.... > > Even for ext4, it's not quite so simple as that. You only have > support for times post 2038 if you are using an inode size > 128 > bytes. There are a very, very large number of machines which even > today, are using 128 byte inodes with ext4 for performance reasons. > > The vast majority of those machines which I know of can probably move > to 256 byte inodes relatively easily, since hard drive replacement > cycles are order 5-6 years tops, so I'm not that concerned, but it > just goes to show this is a very complicated problem. One stupid question about the current code: static inline void ext4_decode_extra_time(struct inode_time *time, __le32 extra) { if (sizeof(time->tv_sec) > 4) time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32; time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; } #define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \ do { \ if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \ (einode)->xtime.tv_sec = \ (signed)le32_to_cpu((raw_inode)->xtime); \ else \ (einode)->xtime.tv_sec = 0; \ if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \ ext4_decode_extra_time(&(einode)->xtime, \ raw_inode->xtime ## _extra); \ else \ (einode)->xtime.tv_nsec = 0; \ } while (0) For a time between 2038 and 2106, this looks like xtime.tv_sec is negative when ext4_decode_extra_time gets called, so the '|=' operator doesn't actually do anything. Shouldn't that be '+='? Arnd From lczerner@redhat.com Mon Jun 2 08:06:34 2014 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 BB3107F67 for ; Mon, 2 Jun 2014 08:06:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 334FBAC002 for ; Mon, 2 Jun 2014 06:06:33 -0700 (PDT) X-ASG-Debug-ID: 1401714388-04cb6c100ad3be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SFg1CRQ7IgKryMMY for ; Mon, 02 Jun 2014 06:06:28 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s52D6IQG031027 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 2 Jun 2014 09:06:18 -0400 Received: from vpn1-6-254.ams2.redhat.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s52D6ETP018303 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Jun 2014 09:06:15 -0400 Date: Mon, 2 Jun 2014 15:06:13 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Namjae Jeon cc: "'Dave Chinner'" , "'Theodore Ts'o'" , "'linux-ext4'" , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, "'Ashish Sangwan'" Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate In-Reply-To: <002201cf7e59$2e684c10$8b38e430$@samsung.com> X-ASG-Orig-Subj: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: References: <003601cf6aa7$883103b0$98930b10$@samsung.com> <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> <002201cf7e59$2e684c10$8b38e430$@samsung.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-307683217-1401714377=:2231" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401714388 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-307683217-1401714377=:2231 Content-Type: TEXT/PLAIN; charset=iso-8859-2 Content-Transfer-Encoding: 8BIT On Mon, 2 Jun 2014, Namjae Jeon wrote: > Date: Mon, 02 Jun 2014 20:52:51 +0900 > From: Namjae Jeon > To: 'Luk Czerner' > Cc: 'Dave Chinner' , 'Theodore Ts'o' , > 'linux-ext4' , xfs@oss.sgi.com, > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > 'Ashish Sangwan' > Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for > fallocate > > > > > > Date: Sat, 31 May 2014 16:40:29 +0900 > > > From: Namjae Jeon > > > To: 'Luk Czerner' > > > Cc: 'Dave Chinner' , 'Theodore Ts'o' , > > > 'linux-ext4' , xfs@oss.sgi.com, > > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > > 'Ashish Sangwan' > > > Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for > > > fallocate > > > > > > > > > > > Date: Thu, 08 May 2014 19:23:19 +0900 > > > > > From: Namjae Jeon > > > > > To: Dave Chinner , Theodore Ts'o > > > > > Cc: linux-ext4 , xfs@oss.sgi.com, > > > > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > > > > Ashish Sangwan > > > > > Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate > > > > > > > > > > In continuation of the work of making the process of non linear editing of > > > > > media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE > > > > > for fallocate. > > > > > > > > > > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > > > > > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > > > > > in between the file within the range specified by offset and len. User can > > > > > write new data in this space. e.g. ads. > > > > > Like collapse range, currently we have the limitation that offset and len should > > > > > be block size aligned for both XFS and Ext4. > > > > > > > > > > The semantics of the flag are : > > > > > 1) It allocates new zeroed out on disk space of len bytes starting > > > > > at offset byte without overwriting any existing data. All the data blocks > > > > > from offset to EOF are shifted towards right to make space for inserting > > > > > new blocks > > > > > > > > Hi, > > > > > > > > this sounds a little bit weird to me. I understand the reason for > > > > this, but this is effectively two operations masking as one. We > > > > shift the existing data and then we allocate unwritten extents for > > > > the hole we've created. > > > > > > > > What would make more sense to me is to implement only the first > > > > operation - the shift. And then let the user to allocate unwritten > > > > extents for the hole using simple fallocate. > > > > > > > > The reason is that if you succeed the first part and then fail the > > > > second due to ENOSPC or any other reason the file will end up in > > > > undefined state unnecessarily. Yes in your current implementation > > > > it seems that you'll always end up with the hole in the file and the > > > > rest is properly shifted, but that may vary from file system to file > > > > system. Some might choose to roll back the shift, some might not. > > > > > > > > If FALLOC_FL_INSERT_RANGE (or any name you wish to choose) would > > > > just simply shift the extents then you'll get rid of this and the > > > > only thing that user needs to do (if he chooses to) is to use > > > > fallocate for the hole created by the shift. If it fails, then > > > > well, he can try again without any consequences. As a bonus you get > > > > the possibility to leave the hole in the file which might be useful > > > > as well. > > > > > > > > With current behaviour this might get very confusing very quickly. > > > > > > > > What do you and others think ? > > > Hi Lukas. > > > Insert range inherently means inserting a real range of space into > > > the file to provide guaranteed space with user in the inserted area > > > so that further writes should not fail with an -ENOSPC at least. > > > If insert range cannot gurantees the above semantics, It should > > > return error to user space. > > > > So what will happen when there is not enough space when "inserting a > > range" ? And how should user proceed from there ? > If insert range fails with an ENOSPC error, user could use collapse > range on the same range to remove the hole. > And after freeing more space, he can again try inserting range. > Ofcourse, this type of guidance should be properly documented in > manpage. When updating fallocate(2) manpage, I will keep in mind to > describe ENOSPC handling. Why collapse ? The hole is already there right ? Why not just use fallocate to allocate the space for the hole. And that's my point actually. Why not do it this way in the first place, because this is really counterintuitive. > > > > > > > > If insert range has been performed on a file, It will reserve space > > > that write never fail in the inserted area, > > > In case of full partition or small available size than the range > > > user want, It seems odd just only left inserting a hole in the middle > > > of file and return success to user when no one can really write to > > > this hole. > > > > There is a fallocate for allocation, so as I already said you can > > shift the extents to make a hole in the file and then use fallocate > > to allocate space for it and you'll get the same result. You are > > basically doing that now as well, but when the allocation fails the > > whole "insert range" ioct fails, however the extents are already > > shifter and there is already a holi in the file so freeing some > > space and running this ioctl again will not help you at all. While > > if you fail a fallocate, you can free some space and run it again > > without any problems. The result will be as expected. > > > > What I am arguing about is basically that your insert range ioct is > > masking two operations as one. Why not to make it transparent and > > split it into "shift extents" and fallocate ? Then there is a > > question about the name because it's no longer "insert range" but > > rather "insert hole" which I think is better and arguably more > > useful semantic. > The same thoeory can be argued against collapse range semantics too. > One can argue that collapse range should not remove any data blocks > from the specified range as that can be done by punch hole, so user > should first perform punch hole and then call collapse range to > eliminate the hole. That does not make any sense. The whole idea behind collapse range is, well collapse the range which means move the extents. And once you do that there is nothing to punch out. Puncing first and collapse later will not bring you anything at all. > There are 2 reasons I make insert range to allocate space. > One is to keep insert range behavior as exactly opposite of > the collapse range and it is named as such so that it seems obvious > that it is related with collapse range. > Other one is that, there will always be need of allocating space for > data after making hole. So doing this within insert range is saving > user from making 1 extra sys call. You're assuming that everyone will be using it the same way you intent to use it. That's not true however. There will be perfectly valid use cases for not allocating space for newly created hole. >From the top of my head, for example qemu could use it for volume management on top of image files - changing the size of the partitions without moving data around. And I bet there will be more use cases. With insert hole semantics it will give you more flexibility. -Lukas > That said, I agree with you that it is arguable and I am not biased > to this behavior. > Probably, need some more thoughts from other fs people. > > Thanks for your opinion! > > > > > Thanks! > > -Lukas > > > > > > > > Thanks! > > > > > > > > Thanks! > > > > -LUkas > > > > > > > > > > > > > 2) It should be used exclusively. No other fallocate flag in combination. > > > > > 3) Offset and length supplied to fallocate should be fs block size aligned > > > > > in case of xfs and ext4. > > > > > 4) Insert range does not work for the case when offset is overlapping/beyond > > > > > i_size. If the user wants to allocate space at the end of file they are > > > > > advised to use either ftruncate(2) or fallocate(2) with mode 0. > > > > > 5) It increses the size of file by len bytes. > > > > > > > > > > > > > > > Namjae Jeon (10): > > > > > fs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > > > > > xfsprogs: xfs_io: add finsert command for insert range via fallocate > > > > > xfstests: generic/027: Standard insert range tests > > > > > xfstests: generic/028: Delayed allocation insert range > > > > > xfstests: generic/029: Multi insert range tests > > > > > xfstests: generic/030: Delayed allocation multi insert > > > > > xfstests: fsstress: Add fallocate insert range operation > > > > > xfstests: fsx: Add fallocate insert range operation > > > > > > > > > > > > > > > > > > --8323328-307683217-1401714377=:2231-- From tytso@thunk.org Mon Jun 2 08:07:29 2014 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 4E6A57F74 for ; Mon, 2 Jun 2014 08:07:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38763304043 for ; Mon, 2 Jun 2014 06:07:26 -0700 (PDT) X-ASG-Debug-ID: 1401714440-04cbb050fd1d1480001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id GOfU1kEOIL1pFPsA (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 06:07:21 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=DvRPK2VjiFvHp+UlPjtaYqtso1BxT636PbJgbvinHoc=; b=pJ++/3yoYPvIQpoiG11yc9KJuAPVAZV6iMhHbLypF/2dg4RnnA5iZF9n15NrTc9fUj4b+F1RrWAYPJrzrs+D7X5yyw6X2hlxdTEfiTDh7Pz7w/WHrnbiPJvPpCIJCihlVWZU8IJ2bvukP9scUbrYAs9LtWQOOzbxpywBG0J37wU=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrRx7-00010w-Fs; Mon, 02 Jun 2014 13:07:01 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CE7405802C1; Mon, 2 Jun 2014 09:07:00 -0400 (EDT) Date: Mon, 2 Jun 2014 09:07:00 -0400 From: Theodore Ts'o To: Arnd Bergmann Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602130700.GC14276@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , Arnd Bergmann , Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4178301.j9kWdGCRLC@wuerfel> <20140602115737.GB14276@thunk.org> <15496653.1vSv1RUCC0@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <15496653.1vSv1RUCC0@wuerfel> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401714440 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6314 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 Yes, there are some ongoing dicussions about changing the post-2038 encoding of the timestamp in ext4, which is why this hasn't been fixed yet. The main thing that's been missing is time for me to review the patches, and a good way of writing regression tests that will work (or at least not fail) on build environments with a 32-bit time_t and 32-bit-only capable versions of functions such as gmtime(3). And given current discussions, I may want to think about some kind of superblock flag to allow the use of a 32-bit unsigned encoding for file systems using a 128-byte inode, with a way of setting that flag after scanning the file system to make sure there are no times that are previous to January 1, 1970. (Or more generally, allow any epoch to be defined using a 64-bit time_t offset stored in the superblock...) Cheers, - Ted From tytso@thunk.org Mon Jun 2 08:16:07 2014 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 5501C7F72 for ; Mon, 2 Jun 2014 08:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 21DB8304039 for ; Mon, 2 Jun 2014 06:16:06 -0700 (PDT) X-ASG-Debug-ID: 1401714964-04bdf0599e402450001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id q9IyTgKGajm07ikR (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 06:16:04 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=1TtxTK+LMLweW6LeRm+yCZK7qhIvg8Ti1lCj0xP882Q=; b=ygsFxFAAvGdGpO+WVrOQ3ANgbEjnKUbBNDR+8jZsphH6YOcW764dQGcQT+21gSfd+u4bmNDW1FfOjFOrzzjROWRmNyvqMgFsbGwcIm+bDuXBI4n++40KbQV3VFzE7GN9ZJzSLkjL8qxxCFQ6l6zMopqNS1RE0k6zRwRa0BW5HAw=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrS5k-00012v-Ab; Mon, 02 Jun 2014 13:15:56 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id A4E465802C1; Mon, 2 Jun 2014 09:15:55 -0400 (EDT) Date: Mon, 2 Jun 2014 09:15:55 -0400 From: Theodore Ts'o To: Arnd Bergmann Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602131555.GD14276@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , Arnd Bergmann , Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4178301.j9kWdGCRLC@wuerfel> <20140602115737.GB14276@thunk.org> <4910284.a72lauVLNV@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4910284.a72lauVLNV@wuerfel> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401714964 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6314 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 On Mon, Jun 02, 2014 at 02:38:09PM +0200, Arnd Bergmann wrote: > > "For new inodes we always reserve enough space for the kernel's known > extended fields, but for inodes created with an old kernel this might > not have been the case. None of the extended inode fields is critical > for correct filesystem operation." > > Do we have to worry about this for inodes that contain extended > attributes and that get updated after 2038? In practice, the extended timestamps was one of the first things added to ext4, so the vast majority of ext4 file systems with inode sizes > 128 bytes will have room for the extended timestamps. There are some legacy ext3 file systems with 256-byte inodes (enabled for fast sotrage of SELinux xattrs) that in theory, could have been converted to ext4 and had enough xattrs so that the extended timestamps couldn't be added. That would be a vanishingly small use case, and in practice, it's not likely to be the case for the embedded market. I could imagine someone worrying about file systems originally formatted using RHEL 4 post-2038 (perhaps running in a VM), but I don't work for IBM any more, and hopefully even IBM would just tell such customers that they need to suck it up, and do a backup/reformat/restore pass. Cheers, - Ted From joseph_myers@mentor.com Mon Jun 2 08:52:37 2014 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 2FB8C7F55 for ; Mon, 2 Jun 2014 08:52:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B6E38F8049 for ; Mon, 2 Jun 2014 06:52:36 -0700 (PDT) X-ASG-Debug-ID: 1401717154-04cbb050fc1d6050001-NocioJ Received: from relay1.mentorg.com (relay1.mentorg.com [192.94.38.131]) by cuda.sgi.com with ESMTP id 87g01MqOrm9NF29P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 06:52:35 -0700 (PDT) X-Barracuda-Envelope-From: joseph_myers@mentor.com X-Barracuda-Apparent-Source-IP: 192.94.38.131 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1WrSf1-0001m3-Q5 from joseph_myers@mentor.com ; Mon, 02 Jun 2014 06:52:23 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Mon, 2 Jun 2014 06:52:23 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Mon, 2 Jun 2014 14:52:20 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1WrSex-00058L-3K; Mon, 02 Jun 2014 13:52:19 +0000 Date: Mon, 2 Jun 2014 13:52:19 +0000 From: "Joseph S. Myers" X-X-Sender: jsm28@digraph.polyomino.org.uk To: Arnd Bergmann CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: Re: [RFC 00/32] making inode time stamps y2038 ready In-Reply-To: <1401480116-1973111-1-git-send-email-arnd@arndb.de> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Sender: Joseph Myers X-OriginalArrivalTime: 02 Jun 2014 13:52:23.0625 (UTC) FILETIME=[E1752390:01CF7E69] X-Barracuda-Connect: relay1.mentorg.com[192.94.38.131] X-Barracuda-Start-Time: 1401717155 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, 30 May 2014, Arnd Bergmann wrote: > a) is this the right approach in general? The previous discussion > pointed this way, but there may be other opinions. The syscall changes seem like the sort of thing I'd expect, although patches adding new syscalls or otherwise affecting the kernel/userspace interface (as opposed to those relating to an individual filesystem) should go to linux-api as well as other relevant lists. -- Joseph S. Myers joseph@codesourcery.com From jaegeuk@kernel.org Mon Jun 2 08:59:45 2014 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 DEAE47F63 for ; Mon, 2 Jun 2014 08:59:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9B548F8039 for ; Mon, 2 Jun 2014 06:59:45 -0700 (PDT) X-ASG-Debug-ID: 1401717583-04cbb050fc1d6c20001-NocioJ Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by cuda.sgi.com with ESMTP id iam8QBStJimu5tf9 for ; Mon, 02 Jun 2014 06:59:44 -0700 (PDT) X-Barracuda-Envelope-From: jaegeuk@kernel.org X-Barracuda-Apparent-Source-IP: 198.145.19.201 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 179BC203C4; Mon, 2 Jun 2014 13:59:43 +0000 (UTC) Received: from localhost (unknown [223.62.178.107]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4A745203B0; Mon, 2 Jun 2014 13:59:40 +0000 (UTC) From: jaegeuk@kernel.org To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforget.net, Jaegeuk Kim Subject: [PATCH] xfstests: f2fs support Date: Mon, 2 Jun 2014 22:59:32 +0900 X-ASG-Orig-Subj: [PATCH] xfstests: f2fs support Message-Id: <1401717572-21731-1-git-send-email-jaegeuk@kernel.org> X-Mailer: git-send-email 1.8.5.2 (Apple Git-48) X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: mail.kernel.org[198.145.19.201] X-Barracuda-Start-Time: 1401717584 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.23 X-Barracuda-Spam-Status: No, SCORE=0.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NO_REAL_NAME, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address From: Jaegeuk Kim This patch adds to support f2fs file system. Signed-off-by: Jaegeuk Kim --- common/config | 7 +++++++ common/rc | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/common/config b/common/config index 0dbf0b9..0607294 100644 --- a/common/config +++ b/common/config @@ -210,6 +210,7 @@ case "$HOSTOS" in export MKFS_XFS_PROG="`set_prog_path mkfs.xfs`" export MKFS_UDF_PROG="`set_prog_path mkudffs`" export MKFS_BTRFS_PROG="`set_btrfs_mkfs_prog_path_with_opts`" + export MKFS_F2FS_PROG="`set_prog_path mkfs.f2fs`" export BTRFS_UTIL_PROG="`set_prog_path btrfs`" export BTRFS_SHOW_SUPER_PROG="`set_prog_path btrfs-show-super`" export XFS_FSR_PROG="`set_prog_path xfs_fsr`" @@ -241,6 +242,9 @@ _mount_opts() # acls & xattrs aren't turned on by default on ext$FOO export MOUNT_OPTIONS="-o acl,user_xattr $EXT_MOUNT_OPTIONS" ;; + f2fs) + export MOUNT_OPTIONS="-o acl,user_xattr $F2FS_MOUNT_OPTIONS" + ;; reiserfs) # acls & xattrs aren't turned on by default on reiserfs export MOUNT_OPTIONS="-o acl,user_xattr $REISERFS_MOUNT_OPTIONS" @@ -295,6 +299,9 @@ _fsck_opts() reiserfs) export FSCK_OPTIONS="--yes" ;; + f2fs) + export FSCK_OPTIONS="" + ;; *) export FSCK_OPTIONS="-n" ;; diff --git a/common/rc b/common/rc index f27ee53..fcdabfe 100644 --- a/common/rc +++ b/common/rc @@ -105,6 +105,9 @@ case "$FSTYP" in btrfs) [ "$MKFS_BTRFS_PROG" = "" ] && _fatal "mkfs.btrfs not found" ;; + f2fs) + [ "$MKFS_F2FS_PROG" = "" ] && _fatal "mkfs.f2fs not found" + ;; nfs) ;; esac @@ -511,6 +514,9 @@ _scratch_mkfs() tmpfs) # do nothing for tmpfs ;; + f2fs) + $MKFS_F2FS_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null + ;; *) yes | $MKFS_PROG -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV ;; -- 1.8.5.2 (Apple Git-48) From joseph_myers@mentor.com Mon Jun 2 09:00:18 2014 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 6C4F27F63 for ; Mon, 2 Jun 2014 09:00:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49D048F8049 for ; Mon, 2 Jun 2014 07:00:18 -0700 (PDT) X-ASG-Debug-ID: 1401717615-04cb6c100cd9040001-NocioJ Received: from relay1.mentorg.com (relay1.mentorg.com [192.94.38.131]) by cuda.sgi.com with ESMTP id 3hnGJSCLOD7oBWsm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 07:00:16 -0700 (PDT) X-Barracuda-Envelope-From: joseph_myers@mentor.com X-Barracuda-Apparent-Source-IP: 192.94.38.131 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1WrSmc-0002dG-9J from joseph_myers@mentor.com ; Mon, 02 Jun 2014 07:00:14 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 2 Jun 2014 07:00:13 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Mon, 2 Jun 2014 15:00:12 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1WrSmZ-0005Ai-3Y; Mon, 02 Jun 2014 14:00:11 +0000 Date: Mon, 2 Jun 2014 14:00:11 +0000 From: "Joseph S. Myers" X-X-Sender: jsm28@digraph.polyomino.org.uk To: Dave Chinner CC: "H. Peter Anvin" , Arnd Bergmann , , , , , , , , , Subject: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140531055457.GK14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <20140531055457.GK14410@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Sender: Joseph Myers X-OriginalArrivalTime: 02 Jun 2014 14:00:13.0855 (UTC) FILETIME=[F9BC8AF0:01CF7E6A] X-Barracuda-Connect: relay1.mentorg.com[192.94.38.131] X-Barracuda-Start-Time: 1401717616 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, 31 May 2014, Dave Chinner wrote: > If we are changing the in-kernel timestamp to have a greater dynamic > range that anything we current support on disk, then we need support > for all filesystems for similar translation and constraint. The > filesystems need to be able to tell the kernel what they timestamp > range they support, and then the kernel needs to follow those > guidelines. And if the filesystem is mounted on a kernel that > doesn't support the current filesystem's timestamp format, then at > minimum that filesystem cannot do anything that writes a > timestamp.... > > Put simply: the filesystem defines the timestamp range that can be > used safely, not the userspace API. If the filesystem can't support > the date it is handed then that is an out-of-range error. Since > when have we accepted that it's OK to handle out-of-range data with > silent overflows or corruption of the data that we are attempting to > store? We're defining a new API to support a wider date range - > there is nothing that prevents us from saying ERANGE can be returned > to a timestamp that the file cannot store correctly.... I don't see anything new about this issue. All problems that could arise from the kernel being able to represent a timestamp some filesystems can't are problems that already apply with 64-bit kernels using 64-bit time_t internally. So while as part of Y2038-preparedness we do need a clear understanding of which filesystems have what timestamp limits and what happens with timestamps beyond those limits, I think this is a separate strand of the problem - one that applies to both 32-bit and 64-bit systems - from the more general issue for 32-bit systems. -- Joseph S. Myers joseph@codesourcery.com From bounce-278808-73699792-14228686@tomdiag.clients.ubivox.com Mon Jun 2 09:02:01 2014 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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F35377F75 for ; Mon, 2 Jun 2014 09:02:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E20D9304043 for ; Mon, 2 Jun 2014 07:01:57 -0700 (PDT) X-ASG-Debug-ID: 1401717711-04cb6c1009d9310001-NocioJ Received: from smtp007-ams.servers.ubivox.com (smtp007-ams.servers.ubivox.com [198.20.114.77]) by cuda.sgi.com with ESMTP id IeHpuMwrJ5BI47gR for ; Mon, 02 Jun 2014 07:01:52 -0700 (PDT) X-Barracuda-Envelope-From: bounce-278808-73699792-14228686@tomdiag.clients.ubivox.com X-Barracuda-Apparent-Source-IP: 198.20.114.77 Received: from app002-ams.servers.ubivox.com (app002-ams.servers.ubivox.com [198.20.114.152]) by smtp007-ams.servers.ubivox.com (Postfix) with ESMTP id 4AE20401B800 for ; Mon, 2 Jun 2014 16:01:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ubivox.com; i=customers@ubivox.com; q=dns/txt; s=ux201402; t=1401717711; h=Content-Type : Date : Feedback-ID : From : List-Archive : List-Id : List-Post : List-Unsubscribe : Message-Id : Mime-Version : Subject : To : X-Mailer : X-Postmaster-Information; bh=DR1aS+vN2npwmeaoC3EGaXTYLjPCEmML+ZraPYHxzB4=; b=WCjOlm3sJrVkuuIHrusfuaMVom9v9CLsYnqu7X1kr6EGsgj9GbbjNZQgZnFUYceqDchZbD gHqC82/lkDmyQVEEWu4K8xsRneVyJcTXkpxqPNYz/a4gdYYJK0Lgi8PWMc+G7dnp7CL7ESxK 7Uj3lNxpU5k7sz0ZXv9384EUqkVyo= From: Efichip Subject: Tomahawk Diagnostic Technologies Date: Mon, 02 Jun 2014 14:01:51 -0000 X-ASG-Orig-Subj: Tomahawk Diagnostic Technologies To: xfs@oss.sgi.com Message-Id: <1401717711128247.278808.73699792.5011.201.e9a58e98ed07f2a784050e185cbaa88a39ddf3e1@deliveries.ubivox.com> X-Mailer: Ubivox Mailengine 2.13.7 X-Postmaster-Information: List-Unsubscribe: , List-Id: <23217.list.tomdiag.clients.ubivox.com> List-Post: NO (posting not allowed on this list) Feedback-ID: 278808:23217:5011:ubivox List-Archive: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="Ubivox_Yci5MTnPkDltVCL3HuJvG8Xe" X-Barracuda-Connect: smtp007-ams.servers.ubivox.com[198.20.114.77] X-Barracuda-Start-Time: 1401717711 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA161e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC5_SA161e BODY: Custom Rule SA161e -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 This is a multi-part message in the MIME format. --Ubivox_Yci5MTnPkDltVCL3HuJvG8Xe Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable This text is a preheader which elaborates on the content in the newsletter View the newsletter online https://tomdiag.clients.ubivox.com/newsletter/278808/73699792/6883829/ ________________________________________________________________ Dear Customer EFICHIP - Professional Manufacture of Automotive Diagnostic Equipment. EFICHIP is a range of automotive diagnostic, scanning and code reading equipment under the EFICHIP product umbrella. EFICHIP designs, manufactures and delivers innovative products to meet the highest of the demands of today's automotive DIY'ers as well as the professional technicians.EFICHIP headquarters are located in Vilnius, Lithuania. The facilities include: executive administration offices, R&D (Research & Development) and manufacturing operations. This guarantees that all our products are designed, developed and produced in one place using the most advanced manufacturing process. EFICHIP has a long-standing commitment to create unique equipment for both beginners and experts. [1]www.efichip.com - fast, quality and easy web store. [1] http://efichip.com/EN/ /static/EFICHIP_logo2.gif http://www.efichip.com/EN/ __________________________________________________________________ Efichip provide to you!!! 1. We offer to you 1 years warranty; 2. Technical support; 3. Quality support; 4. Best price! ; 5. Fast delivery time(1-2 days past payment); 6. Opportunity to distribute goods; 7. Competent staff ; 8. Reliable customer services; 9. Various payments; 10. Discounts; /static/images (1).jpg __________________________________________________________________ Contact our sales representative to get your special discounts!!! __________________________________________________________________ NEC Programmer We can do all Mercedes cars from MY2006 to MY2011/2012 are using this chromium-plated key - v.57 without touching EIS. We can upgrade our devices. 3000 EUR upgrade for old customers. NEC v.57 solution and we could read EIS password from Keys with that SW version - 57. Also with IR Service Key is possible to read hashes from EIS. Key calculation for NEC-based EIS (MY2006 - MY2011) could start. http://www.efichip.com/EN/catalog/6/181/ BUY IT NOW!!! AdBlue V3 + NOX Emulator Adblue V3 + NOX Emulator allows you to override Adblue SCR system and NOX sensor on your truck. It can emulate working Adblue system and NOX sensor even on trucks with damaged Adblue SCR system. Adblue NOX emulator support list: - Volvo trucks; - Renault trucks; - DAF trucks; - MAN trucks; - Iveco trucks; - Scania trucks ; - Mercedes-Benz trucks. http://www.efichip.com/EN/catalog/4/176/ Only =E2=82=AC399 Eltrac Kit Iveco Eltrac Bluetooth Module enables wireless communication between vehicles and diagnostic computers and simplifies and accelerates repair operations in workshops. Only today is 2000eur!!! http://efichip.com/EN/catalog/4/39/ Price =E2=82=AC2000 __________________________________________________________________ VCI-560 MUX The VCI-560 is a powerful fault diagnosis device that has been developed using the latest advanced technology. Used in combination with a PC, it provides a tool for quick and efficient analysis of vehicle faults. The VCI-560 switches the input channel automatically to the required data line (K-line, L-line) or CAN-bus of the truckside "Diagnostic Connector". http://efichip.com/EN/catalog/4/35/ Whit this newlatter only 2000eur!!! SCANIA VCI2 Scania VCI2 is a tool that is used together with Scania Diagnos & Programmer 3 (SDP3) software to diagnose and troubleshoot Scania vehicles. __________________________________________________________________ For any kind of information please contact our sales office: Domas, Sales Representative +37066003497 +442070971475 Skype: sr6_rl Email: [1]sr6@tomdiag.com [2]www.EFICHIP.com [1] mailto:sr6@tomdiag.com [2] http://www.efichip.com/EN/ Click here to unsubscribe from the newsletter ________________________________________________________________ --Ubivox_Yci5MTnPkDltVCL3HuJvG8Xe Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Tomahawk Diagnostic Technologies
=20
This text = is a preheader which elaborates on the content in the newsletter View the newsletter o= nline
=C2=A0
=C2=A0
=C2=A0
=C2=A0
=C2=A0
=C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 =C2=A0
=09 =09 =20 =20
=3D""/
=20
=20 =20
=20 =20
=20 =20 =20
=20 =20 3D"" =20
3D""/ =09 =20 =20
=20 =20
=20 =20
=20 =20 =20
=20

Dear Customer

= 3D""/
=20 =20 =20
=20 =20 =20 =20 =20
=20 =20 3D"" =20
EFICHIP - Professional Manufacture of Automotive Diagnostic Equipment. EFICHIP is a range of a= utomotive diagnostic, scanning and code reading equipment under the EFICHIP product umbrella.=C2=A0EFICHIP designs, manufactures a= nd delivers innovative products to meet the highest of the demands of today= 's automotive DIY'ers as well as the professional technicians.EFICH= IP headquarters are located in Vilnius, Lithuania. The facilities = include: executive administration offices, R&D (Research & Developm= ent) and manufacturing operations. This guarantees that all our products ar= e designed, developed and produced in one place using the most advanced man= ufacturing process.=C2=A0EFICHIP has a long-standing commi= tment to create unique equipment for both beginners and experts. www.efichip.com - fast, qual= ity and easy web store.=C2=A0
=20
=20 =20
=20 =20
=20 =20 =20
3D""/
= =20 =20 =20
<= /td>
3D""/ =20 =20
=20 =20
=20 =20 =20
=20

Efichip provide to you!!!

= 3D""/
=20 =20 =20
=20 =20 =20 =20 =20
=20 =20 3D""/
1. We offer to you 1 years warranty;
2. Technical support;
3. Quality support;
4. Best price! ;
5. Fast delivery time(1-2 days past p= ayment);
6. Opp= ortunity to distribute goods;
7
. Competent staff=C2=A0;
8.=C2=A0Reliable customer services;
9.=C2=A0Various payments;
10. Discounts;
=C2=A0
=3D""/
<= /td>
=20
3D""/
=20 =20
=20 =20
=20 =20 =20
3D""/
=20
=20 =20 =20
=20 =20
=20 =20 =20
Contact= our sales representative to get your special discounts!!!<= /div>
=20 =20 =20 =20
=20 =20 =20
=20 =20 3D""/
=20
=20 =20
=20 =20
=20 =20 =20
3D""/
=20
=20 =20 =20 =20
=20 =20
=20 =20 =20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20

NEC Programmer

3D""/
=20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20 =20 3D""/3D""/
= 3D""/
=20 =20 =20 =20 =20 =20
3D""/
We can do all Mercedes cars from MY2006 to MY2011/2012 are using= this chromium-plated key - v.57 without touching EIS. We can upgrade our d= evices. 3000 EUR upgrade for old customers. NEC v.57 solution and we could = read EIS password from Keys with that SW version - 57. Also with IR Service= Key is possible to read hashes from EIS. Key calculation for NEC-based EIS= (MY2006 - MY2011) could start.
3D""/
=20 =20 =20
=20
3D""/ 3D""/
=3D""/ BUY IT = NOW!!! 3D"=
=3D""/ 3D""/=
3D""/
= 3D""/
=20
=20 =20 =20 =20
=20 =20 =20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20

AdBlue V3 + NOX Emulator

3D""/
=20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20 =20 3D""/3D""/
= 3D""/
=20 =20 =20 =20 =20 =20
3D""/
Adblue V3 + NOX Emulator allows you to override Adblue SCR syste= m and NOX sensor on your truck. It can emulate working Adblue system and NO= X sensor even on trucks with damaged Adblue SCR system.
Adblue NOX emul= ator support list:
- Volvo trucks;
- Renault trucks;
- DAF trucks;
- MAN trucks;
- Iveco trucks;
- = Scania trucks ;
- Mercedes-Benz trucks.=C2=A0
3D""/
=20 =20 =20
=20
3D""/ 3D""/
=3D""/ Only = =E2=82=AC399 3D"=
=3D""/ 3D""/=
3D""/
= 3D""/
=20
=20 =20 =20 =20
=20 =20 =20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20

Eltrac Kit

3D""/
=20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20 =20 3D""/3D""/
= 3D""/
=20 =20 =20 =20 =20 =20
3D""/
Iveco Eltrac Bluetooth Module enables wireless communication bet= ween vehicles and diagnostic computers and simplifies and accelerates repai= r operations in workshops.
Only= today is 2000eur!!!
3D""/
=20 =20 =20
=20
3D""/ 3D""/
=3D""/ Price = =E2=82=AC2000 3D"=
=3D""/ 3D""/=
3D""/
= 3D""/
=20
=20
=20 =20
=20 =20
=20 =20 =20
3D""/
=20
=20 =20 =20
=20 =20
=20 =20 =20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20

VCI-560 MUX

3D""/
=20 =20 =20 =20 =20 =20 =20
3D""/ =20 =20 3D"" =20 3D""/
= 3D""/
=20 =20 =20 =20 =20 =20
3D""/
The VCI-560 is a powerful fault diagnosis device that has been d= eveloped using the latest advanced technology. Used in combination with a P= C, it provides a tool for quick and efficient analysis of vehicle faults.The VCI-560 switches the input channel automatically to the required dat= a line (K-line, L-line) or CAN-bus of the truckside "Diagnostic Connector".=
3D""/
= 3D""/
=20 =20
=20
3D""/ 3D""/
=3D""/ Whit th= is newlatter only 2000eur!!! 3D"=
=3D""/ 3D""/=
=20
=20 =20 =20 =20
=20 =20 =20 =20 =20 =20 =20 =20 =20
3D""/
3D""/ =20

SCANIA VCI2

3D""/
=20 =20 =20 =20 =20 =20 =20
3D""/ =20 =20 3D"" =20 3D""/
= 3D""/
=20 =20 =20 =20 =20 =20
3D""/
Scania VCI2 is a tool that is used together with Scania Diagnos = & Programmer 3 (SDP3) software to diagnose and troubleshoot Scania vehi= cles.
3D""/
= 3D""/
=20
=20
=20 =20
=20 =20
=20 =20 =20
3D""/
=20
3D""/
3D""/
=C2=A0
=C2=A0
=C2=A0
=C2=A0
=C2=A0
=C2=A0
3D""
3D""/
=09 =09 =09 =20
=20 =20
=20 =20
=20 =20 =20
For any kind of informat= ion please contact our sales office:
Domas, Sales Repre= sentative +37066003497 +44207097147= 5
Skype: sr6_rl
Email: sr6@tomdiag.com
www.EFICHIP.co= m
3D""/
=20 =20
Click here to unsubscribe from the newsletter
3D""/
=09 --Ubivox_Yci5MTnPkDltVCL3HuJvG8Xe-- From bfoster@redhat.com Mon Jun 2 09:03:33 2014 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 8B3637F56 for ; Mon, 2 Jun 2014 09:03:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 21077AC001 for ; Mon, 2 Jun 2014 07:03:30 -0700 (PDT) X-ASG-Debug-ID: 1401717808-04bdf059a14072a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T0sE1R94erWej9To for ; Mon, 02 Jun 2014 07:03:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s52E3Q2s029602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 2 Jun 2014 10:03:26 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s52E3P54005069; Mon, 2 Jun 2014 10:03:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AD3A11248A9; Mon, 2 Jun 2014 10:03:24 -0400 (EDT) Date: Mon, 2 Jun 2014 10:03:24 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state Message-ID: <20140602140324.GA24196@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state References: <1401257083-13433-1-git-send-email-david@fromorbit.com> <20140530233906.GL6677@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140530233906.GL6677@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401717808 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, May 31, 2014 at 09:39:06AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > It's carried in state->args->geo, so there's no need to duplicate it > and use more stack space than necessary. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_attr.c | 8 -------- > fs/xfs/xfs_attr_leaf.c | 19 ++++++++++--------- > fs/xfs/xfs_da_btree.c | 13 +++++++------ > fs/xfs/xfs_da_btree.h | 2 -- > fs/xfs/xfs_dir2_node.c | 13 +++---------- > 5 files changed, 20 insertions(+), 35 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 470a22d..bfe36fc 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -896,8 +896,6 @@ restart: > state = xfs_da_state_alloc(); > state->args = args; > state->mp = mp; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > > /* > * Search to see if name already exists, and get back a pointer > @@ -1075,8 +1073,6 @@ restart: > state = xfs_da_state_alloc(); > state->args = args; > state->mp = mp; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > state->inleaf = 0; > error = xfs_da3_node_lookup_int(state, &retval); > if (error) > @@ -1167,8 +1163,6 @@ xfs_attr_node_removename(xfs_da_args_t *args) > state = xfs_da_state_alloc(); > state->args = args; > state->mp = dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > > /* > * Search to see if name exists, and get back a pointer to it. > @@ -1430,8 +1424,6 @@ xfs_attr_node_get(xfs_da_args_t *args) > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > > /* > * Search to see if name exists, and get back a pointer to it. > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index ae33b14..28712d2 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1494,8 +1494,8 @@ xfs_attr3_leaf_rebalance( > > xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); > xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); > - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); > - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); > + xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1); > + xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1); > > /* > * Copy out last hashval in each block for B-tree code. > @@ -1592,7 +1592,7 @@ xfs_attr3_leaf_figure_balance( > half += ichdr1->usedbytes + ichdr2->usedbytes + > xfs_attr_leaf_newentsize(state->args, NULL); > half /= 2; > - lastdelta = state->blocksize; > + lastdelta = state->args->geo->blksize; > entry = xfs_attr3_leaf_entryp(leaf1); > for (count = index = 0; count < max; entry++, index++, count++) { > > @@ -1690,7 +1690,7 @@ xfs_attr3_leaf_toosmall( > bytes = xfs_attr3_leaf_hdr_size(leaf) + > ichdr.count * sizeof(xfs_attr_leaf_entry_t) + > ichdr.usedbytes; > - if (bytes > (state->blocksize >> 1)) { > + if (bytes > (state->args->geo->blksize >> 1)) { > *action = 0; /* blk over 50%, don't try to join */ > return(0); > } > @@ -1744,7 +1744,8 @@ xfs_attr3_leaf_toosmall( > > xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); > > - bytes = state->blocksize - (state->blocksize >> 2) - > + bytes = state->args->geo->blksize - > + (state->args->geo->blksize >> 2) - > ichdr.usedbytes - ichdr2.usedbytes - > ((ichdr.count + ichdr2.count) * > sizeof(xfs_attr_leaf_entry_t)) - > @@ -1997,7 +1998,7 @@ xfs_attr3_leaf_unbalance( > struct xfs_attr_leafblock *tmp_leaf; > struct xfs_attr3_icleaf_hdr tmphdr; > > - tmp_leaf = kmem_zalloc(state->blocksize, KM_SLEEP); > + tmp_leaf = kmem_zalloc(state->args->geo->blksize, KM_SLEEP); > > /* > * Copy the header into the temp leaf so that all the stuff > @@ -2010,7 +2011,7 @@ xfs_attr3_leaf_unbalance( > tmphdr.magic = savehdr.magic; > tmphdr.forw = savehdr.forw; > tmphdr.back = savehdr.back; > - tmphdr.firstused = state->blocksize; > + tmphdr.firstused = state->args->geo->blksize; > > /* write the header to the temp buffer to initialise it */ > xfs_attr3_leaf_hdr_to_disk(tmp_leaf, &tmphdr); > @@ -2035,14 +2036,14 @@ xfs_attr3_leaf_unbalance( > tmp_leaf, &tmphdr, tmphdr.count, > drophdr.count); > } > - memcpy(save_leaf, tmp_leaf, state->blocksize); > + memcpy(save_leaf, tmp_leaf, state->args->geo->blksize); > savehdr = tmphdr; /* struct copy */ > kmem_free(tmp_leaf); > } > > xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); > xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, > - state->blocksize - 1); > + state->args->geo->blksize - 1); > > /* > * Copy out last hashval in each block for B-tree code. > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index f935370..2da9922 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -663,7 +663,7 @@ xfs_da3_node_split( > /* > * Do we have to split the node? > */ > - if (nodehdr.count + newcount > state->node_ents) { > + if (nodehdr.count + newcount > state->args->geo->node_ents) { > /* > * Allocate a new node, add to the doubly linked chain of > * nodes, then move some of our excess entries into it. > @@ -1089,14 +1089,15 @@ xfs_da3_root_join( > * that could occur. For dir3 blocks we also need to update the block > * number in the buffer header. > */ > - memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); > + memcpy(root_blk->bp->b_addr, bp->b_addr, state->args->geo->blksize); > root_blk->bp->b_ops = bp->b_ops; > xfs_trans_buf_copy_type(root_blk->bp, bp); > if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { > struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; > da3->blkno = cpu_to_be64(root_blk->bp->b_bn); > } > - xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); > + xfs_trans_log_buf(args->trans, root_blk->bp, 0, > + state->args->geo->blksize - 1); FYI, you've got a local args pointer in xfs_da3_root_join(). Reviewed-by: Brian Foster > error = xfs_da_shrink_inode(args, child, bp); > return(error); > } > @@ -1139,7 +1140,7 @@ xfs_da3_node_toosmall( > info = blk->bp->b_addr; > node = (xfs_da_intnode_t *)info; > dp->d_ops->node_hdr_from_disk(&nodehdr, node); > - if (nodehdr.count > (state->node_ents >> 1)) { > + if (nodehdr.count > (state->args->geo->node_ents >> 1)) { > *action = 0; /* blk over 50%, don't try to join */ > return(0); /* blk over 50%, don't try to join */ > } > @@ -1176,8 +1177,8 @@ xfs_da3_node_toosmall( > * We prefer coalescing with the lower numbered sibling so as > * to shrink a directory over time. > */ > - count = state->node_ents; > - count -= state->node_ents >> 2; > + count = state->args->geo->node_ents; > + count -= state->args->geo->node_ents >> 2; > count -= nodehdr.count; > > /* start with smaller blk num */ > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 0ac63ad..6e153e3 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -128,8 +128,6 @@ typedef struct xfs_da_state_path { > typedef struct xfs_da_state { > xfs_da_args_t *args; /* filename arguments */ > struct xfs_mount *mp; /* filesystem mount point */ > - unsigned int blocksize; /* logical block size */ > - unsigned int node_ents; /* how many entries in danode */ > xfs_da_state_path_t path; /* search/split paths */ > xfs_da_state_path_t altpath; /* alternate path for join */ > unsigned char inleaf; /* insert into 1->lf, 0->splf */ > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 65df8cb..da43d30 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -1414,7 +1414,7 @@ xfs_dir2_leafn_toosmall( > > count = leafhdr.count - leafhdr.stale; > bytes = dp->d_ops->leaf_hdr_size + count * sizeof(ents[0]); > - if (bytes > (state->blocksize >> 1)) { > + if (bytes > (state->args->geo->blksize >> 1)) { > /* > * Blk over 50%, don't try to join. > */ > @@ -1467,7 +1467,8 @@ xfs_dir2_leafn_toosmall( > * Count bytes in the two blocks combined. > */ > count = leafhdr.count - leafhdr.stale; > - bytes = state->blocksize - (state->blocksize >> 2); > + bytes = state->args->geo->blksize - > + (state->args->geo->blksize >> 2); > > leaf = bp->b_addr; > dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf); > @@ -1591,8 +1592,6 @@ xfs_dir2_node_addname( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > /* > * Look up the name. We're not supposed to find it, but > * this gives us the insertion point. > @@ -2037,8 +2036,6 @@ xfs_dir2_node_lookup( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > /* > * Fill in the path to the entry in the cursor. > */ > @@ -2092,8 +2089,6 @@ xfs_dir2_node_removename( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > > /* Look up the entry we're deleting, set up the cursor. */ > error = xfs_da3_node_lookup_int(state, &rval); > @@ -2162,8 +2157,6 @@ xfs_dir2_node_replace( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = args->geo->blksize; > - state->node_ents = args->geo->node_ents; > inum = args->inumber; > /* > * Lookup the entry to change in the btree. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hpa@zytor.com Mon Jun 2 09:56:05 2014 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 359CC7F56 for ; Mon, 2 Jun 2014 09:56:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 250AF8F8071 for ; Mon, 2 Jun 2014 07:56:01 -0700 (PDT) X-ASG-Debug-ID: 1401720960-04cbb050fa1dd240001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id lp9UPK9dftaR7zZC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 07:56:00 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from [IPv6:2601:9:7280:901:ac48:aaf7:ffcc:2626] ([IPv6:2601:9:7280:901:ac48:aaf7:ffcc:2626]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52EqoQp015784 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 07:52:50 -0700 Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (1.0) Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: "H. Peter Anvin" X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time X-Mailer: iPad Mail (11D201) In-Reply-To: <20140602115737.GB14276@thunk.org> Date: Mon, 2 Jun 2014 07:52:47 -0700 Cc: Arnd Bergmann , Nicolas Pitre , Dave Chinner , "linux-kernel@vger.kernel.org" , "linux-arch@vger.kernel.org" , "joseph@codesourcery.com" , "john.stultz@linaro.org" , "hch@infradead.org" , "tglx@linutronix.de" , "geert@linux-m68k.org" , "lftan@altera.com" , "linux-fsdevel@vger.kernel.org" , "xfs@oss.sgi.com" Content-Transfer-Encoding: quoted-printable Message-Id: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <20140602115737.GB14276@thunk.org> To: "Theodore Ts'o" X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401720960 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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, MIME_QP_LONG_LINE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6316 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 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > On Jun 2, 2014, at 4:57, "Theodore Ts'o" wrote: >=20 >> On Mon, Jun 02, 2014 at 12:56:42PM +0200, Arnd Bergmann wrote: >>=20 >> I think you misunderstood what I suggested: the intent is to avoid >> seeing things break in 2038 by making them break much earlier. We have >> a solution for ext2 file systems, it's called ext4, and we just need >> to ensure that everybody knows they have to migrate eventually. >>=20 >> At some point before the mid 2030ies, you should no longer be able to >> build a kernel that has support for ext2 or any other module that will >> run into bugs later.... >=20 > Even for ext4, it's not quite so simple as that. You only have > support for times post 2038 if you are using an inode size > 128 > bytes. There are a very, very large number of machines which even > today, are using 128 byte inodes with ext4 for performance reasons. >=20 > The vast majority of those machines which I know of can probably move > to 256 byte inodes relatively easily, since hard drive replacement > cycles are order 5-6 years tops, so I'm not that concerned, but it > just goes to show this is a very complicated problem. >=20 > And even if we're talking about flash and embedded devices, the good > news is if you assume that 10 years is enough time for people to > update their embedded OS builds, and that the vast majority of > deployed devices will probably only be in service for 10-15 years, we > do have enough time to make file system format changes, although > admittedly we can't afford to dilly-dally. I have a number of file systems older than any device they are sitting on. R= AID allows individual disks to be swapped out, and when all disks have been s= wapped out, extend the file system online. The system doesn't even have to b= e taken offline in the process if it is possible to physically get to the dr= ives with the system powered (e.g. hot plug bays), which is really damned ni= ce.= From arnd@arndb.de Mon Jun 2 10:02:52 2014 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 C22AB7F56 for ; Mon, 2 Jun 2014 10:02:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3376304039 for ; Mon, 2 Jun 2014 08:02:49 -0700 (PDT) X-ASG-Debug-ID: 1401721366-04cb6c100ce02a0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by cuda.sgi.com with ESMTP id GU1pOlLQVjNfpR9o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 08:02:47 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.24 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue102) with ESMTP (Nemesis) id 0LlFeI-1WHbDr3Ksw-00azEf; Mon, 02 Jun 2014 17:01:22 +0200 From: Arnd Bergmann To: Theodore Ts'o Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 17:01:20 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5896675.3VErDJM7s2@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140602130700.GC14276@thunk.org> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <15496653.1vSv1RUCC0@wuerfel> <20140602130700.GC14276@thunk.org> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:SNdR1vrDuzzqVL0vQDRk1V2ukWgeZoI99UU1eid5LlS fuLI/t6HzX7M9Tnf1nuIEi1ng1T9OJqx0VoUQe6fdJBd4Ekihd 7N8SqHag7FfGUYfFegVzGKUZ+c9VsQO8ULEqg3Zk9v/qOPFGeZ 6aCS5C1gKy0EPfu8QLUDawOWTffgbh8+7IJb5frlnXHUmSfqKT lkL8OEZ6EJlo4ovNEJSEiS+wyGCC/toA63BIm+8lkpGyaF7tV4 rXVucuDJW2Qg6AYdXyVxh4ddn8D6nAIHkdaFlJI9/eJ7C4eRRQ Zbm4ZFBfPh7frttxMCvSwnaImngDvp0ERED3X+zfqidNx8TCz0 j/6zcgRe2CXoVVHGlz20= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.24] X-Barracuda-Start-Time: 1401721367 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 09:07:00 Theodore Ts'o wrote: > Yes, there are some ongoing dicussions about changing the post-2038 > encoding of the timestamp in ext4, which is why this hasn't been fixed > yet. The main thing that's been missing is time for me to review the > patches, and a good way of writing regression tests that will work (or > at least not fail) on build environments with a 32-bit time_t and > 32-bit-only capable versions of functions such as gmtime(3). > > And given current discussions, I may want to think about some kind of > superblock flag to allow the use of a 32-bit unsigned encoding for > file systems using a 128-byte inode, with a way of setting that flag > after scanning the file system to make sure there are no times that > are previous to January 1, 1970. (Or more generally, allow any epoch > to be defined using a 64-bit time_t offset stored in the superblock...) FWIW, I've gone through the other file system implementations once more. The most common pattern I've encountered is to have a read_inode function with inode->i_mtime = le32_to_cpu(raw_inode->mtime); which results in interpreting the time as 'signed' on 32-bit kernels, but as 'unsigned' on 64-bit kernels. This could have been done intentionally to extend the valid time range to 2106 on 64-bit kernels, but it seems more likely that the code was written with no thought given to 64-bit time_t at all. I see this pattern on p9fs (old protocol only), afs, bfs, ceph, efs, freevxfs, hpfs, jffs2, jfs, minix, nfsv2/v3 (this was clearly intentional and is spelled out in the RFC), qnx4, qnx6, reiserfs, squashfs, sysv, and ufs (protocol version 1 only). The other behavior I see is to treat the on-disk 32-bit value as signed on both 32-bit and 64-bit kernels: inode->i_mtime = (signed)le32_to_cpu(raw_inode->mtime); this seems to be done intentionally in all cases, to maintain compatibility between 32-bit and 64-bit kernels, but it's relatively rare: exofs, ext2/3/4 (good old inodes) and xfs are the only ones doing this. In case of ext2/3/4, the sign handlign was introduced here: http://www.spinics.net/lists/linux-ext4/msg01758.html exofs and xfs seem to have done it like this for all of git history. Arnd From tytso@thunk.org Mon Jun 2 10:03:12 2014 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 4820D7F56 for ; Mon, 2 Jun 2014 10:03:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36F438F8040 for ; Mon, 2 Jun 2014 08:03:08 -0700 (PDT) X-ASG-Debug-ID: 1401721386-04cbb050fc1de0a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 1N3bIndv96ZeKH8E (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 08:03:06 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=E2KnvncZeqZPWkScAXj54igcVMu2ny3Fr2jDwp1lT7w=; b=kyPHuxYexmDyI86EEeQ5UQozbbi7cVGwO6qmPZX8hd92nPE88OUS7sUP2QkRBxCGupiKJz0rrUweFbw7HPJKOlpHj1/I8PEEYowe7c75Q0G4ZGLd52x4ZDbnOXzDEol6yGDO5wQsE6Yv14n3AXYkkmKOclO1q8P8E1ubdmhqQ20=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrTlQ-0001wx-3r; Mon, 02 Jun 2014 15:03:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 9F3D05802C1; Mon, 2 Jun 2014 11:02:58 -0400 (EDT) Date: Mon, 2 Jun 2014 11:02:58 -0400 From: Theodore Ts'o To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: Namjae Jeon , 'Dave Chinner' , 'linux-ext4' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' Subject: Re: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140602150258.GG30598@thunk.org> X-ASG-Orig-Subj: Re: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Mail-Followup-To: Theodore Ts'o , =?utf-8?B?THVrw6HFoQ==?= Czerner , Namjae Jeon , 'Dave Chinner' , 'linux-ext4' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' References: <003601cf6aa7$883103b0$98930b10$@samsung.com> <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> <002201cf7e59$2e684c10$8b38e430$@samsung.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.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401721386 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6316 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 On Mon, Jun 02, 2014 at 03:06:13PM +0200, Lukáš Czerner wrote: > > > So what will happen when there is not enough space when "inserting a > > > range" ? And how should user proceed from there ? > > If insert range fails with an ENOSPC error, user could use collapse > > range on the same range to remove the hole. > > And after freeing more space, he can again try inserting range. > > Ofcourse, this type of guidance should be properly documented in > > manpage. When updating fallocate(2) manpage, I will keep in mind to > > describe ENOSPC handling. > > Why collapse ? The hole is already there right ? Why not just use > fallocate to allocate the space for the hole. And that's my point > actually. Why not do it this way in the first place, because this is > really counterintuitive. It's worse than that. It's possible that the reason why you got the ENOSPC warning was because the operation to move the extents down required allocating a block, and it was *that* block allocation which failed. So it's not deterministic whether or not the file's extent mappings were modified after a ENOSPC error, and so it's not clear whether or not a collapse_range function will undo the range that had been inserted --- or whether it ends up deleting existing data blocks. In generally, you really want system calls to have all-or-nothing effects, where if the system call returns an error, the state of the file has not been changed. And for that reason, I agree with Lukáš that it is really a good idea to decouple moving the blocks down, and allocating space --- and to make sure that if there is any failure while inserting the range, the state of the file is not modified at all. Cheers, - Ted From chuck.lever@oracle.com Mon Jun 2 10:05:25 2014 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 20CAC7F56 for ; Mon, 2 Jun 2014 10:05:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 014098F8073 for ; Mon, 2 Jun 2014 08:05:24 -0700 (PDT) X-ASG-Debug-ID: 1401721522-04cbb050fd1de530001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id RAmBgAOB57IIw5yu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 08:05:23 -0700 (PDT) X-Barracuda-Envelope-From: chuck.lever@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s52F4QEZ011240 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 2 Jun 2014 15:04:27 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s52F4QEv019262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 2 Jun 2014 15:04:26 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s52F4P11028736; Mon, 2 Jun 2014 15:04:25 GMT Received: from anon-dhcp-162.1015granger.net (/68.40.85.241) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 02 Jun 2014 08:04:25 -0700 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.2\)) Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Chuck Lever X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <4178301.j9kWdGCRLC@wuerfel> Date: Mon, 2 Jun 2014 11:04:23 -0400 Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Content-Transfer-Encoding: quoted-printable Message-Id: <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> To: Arnd Bergmann X-Mailer: Apple Mail (2.1878.2) X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401721523 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA067, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 1.50 BSF_SC0_SA067 Custom Rule SA067 On Jun 2, 2014, at 6:56 AM, Arnd Bergmann wrote: > On Sunday 01 June 2014 21:36:26 Nicolas Pitre wrote: >>=20 >>> For actually running kernels beyond 2038, the best idea I've seen so >>> far is to disallow all broken code at compile time. I don't see >>> a choice but to audit the entire kernel for invalid uses on both >>> 32 and 64 bit in the next few years. A lot of code will get changed >>> in the process so we can actually keep running 32-bit kernels and >>> file systems, but other code will likely go away: >>>=20 >>> * any system calls that pass a time_t, timeval or timespec on >>> 32-bit systems return -ENOSYS, to ensure all user land uses >>> the replacements we will put into place >>> * The definition of 'time_t', 'timval' and 'timespec' can be hidden >>> from the kernel, and all code using it left out. >>> * ext2 and ext3 file system code will have to be disabled, but = that's >>> file since ext4 can mount old file systems. >>=20 >> Syscalls and libs can be "fixed". Existing filesystem content might=20= >> not. So if you need to mount some old media in read-write mode after=20= >> 2038 and that happens to content an ext2 or similarly limited = filesystem=20 >> then it'd better just "work". Having the kernel refuse to modify the=20= >> filesystem would be unacceptable. >=20 > I think you misunderstood what I suggested: the intent is to avoid > seeing things break in 2038 by making them break much earlier. We have > a solution for ext2 file systems, it's called ext4, and we just need > to ensure that everybody knows they have to migrate eventually. >=20 > At some point before the mid 2030ies, you should no longer be able to > build a kernel that has support for ext2 or any other module that will > run into bugs later. Until then (rather sooner than later), I'd like > to get to the point where you can choose whether to include those > modules at build time or not, and then get everybody to turn off that > option and fix the bugs they run into. You wouldn't need that for a > 2014-generation long-term support disto (rhel 7, sles 12, debian 7, > ubuntu 14.04, ...), but perhaps for the next generation, or the > one after that. I=92m wondering what should be done about NFS. A solution for NFS should match any scheme that is considered for local file systems, IMO. NFSv2/3 timestamps are a pair of unsigned 32-bit values: one value for seconds since midnight GMT Jan 1, 1970, and one value for nanoseconds. (See the definition of nfstime3 in RFC 1813). NFSv4 uses a signed 64-bit value where zero represents midnight UTC on January 1, 1970, and an unsigned 32-bit value for nanoseconds. (See the definition of nfstime4 in RFC 5661). The NFSv4 protocol is probably not problematic, and NFSv3 should be out of the picture by 2038. But if changes are planned for dealing _now_ with timestamp issues, compatibility with NFSv3 is a consideration. It is already the case that, via NFSv3, the Linux NFS client transmits timestamps earlier than 1970 as large positive numbers. Try this with xfstests generic/258. Maybe nfs3_proc_setattr() should recognize pre-epoch timestamps and timestamps larger than can be represented in an unsigned 32-bit field and return an immediate error to the requesting application (like = EINVAL). If the Linux NFS server encounters a local file with a timestamp that cannot be represented via a u32, should it also return NFS3ERR_INVAL? RFC 1813 does not provide guidance on the behavior nor does it suggest a particular error status code. The Solaris 11 server appears to return NFS3ERR_INVAL in this case. An alternative would be to =93cap=94 the timestamps transmitted via = NFSv3 by Linux, so that a pre-epoch timestamp is transmitted as zero, and a large timestamp is transmitted as UINT_MAX. -- Chuck Lever chuck[dot]lever[at]oracle[dot]com From tytso@thunk.org Mon Jun 2 10:31:44 2014 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 043C07F54 for ; Mon, 2 Jun 2014 10:31:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E63AD304043 for ; Mon, 2 Jun 2014 08:31:43 -0700 (PDT) X-ASG-Debug-ID: 1401723102-04cb6c1006e37e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id hcXtOa1BnKd4Dyf6 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 08:31:42 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=cWoRZ+C543MkRYENReeRvChAr48BlK+44YNULIf0DXo=; b=SZurO324qDpTk06OJ38cQeeiRxGx8Qc7pt68dS6f9CdAfqL2mB9BTEQG+R/GMgt68y68xwZzyQPRQ/366m+u+BMLSwYhJe1UZpNYN0sctobfO1GXp4xcuuRVG84LSD/Aethe5NoKHmukJ5OvsbrS4b0VfUME1yEoBeHnmuqmkKQ=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrUCq-000224-U7; Mon, 02 Jun 2014 15:31:24 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 420AA5802C1; Mon, 2 Jun 2014 11:31:24 -0400 (EDT) Date: Mon, 2 Jun 2014 11:31:24 -0400 From: Theodore Ts'o To: Chuck Lever Cc: Arnd Bergmann , Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602153124.GH30598@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , Chuck Lever , Arnd Bergmann , Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401723102 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6316 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 On Mon, Jun 02, 2014 at 11:04:23AM -0400, Chuck Lever wrote: > I’m wondering what should be done about NFS. A solution for NFS should > match any scheme that is considered for local file systems, IMO. > > An alternative would be to “cap” the timestamps transmitted via NFSv3 by > Linux, so that a pre-epoch timestamp is transmitted as zero, and a large > timestamp is transmitted as UINT_MAX. I wonder if it would make sense to try to promulgate via the Austin group, and possibly the C standards committee the concept of a bit pattern (that might commonly be INT_MAX or UINT_MAX) that means "time unknown", or "time indefinite" or "we couldn't encode the time". We would then teach gmtime(3) and asctime(3) to print some appropriate message, and we could teach programs like find (with the -mtime) option, make, tmpwatch, et. al., that they can't make any presumption about the comparibility of any timestamp which has a value of TIME_UNDEFINIED. It would be problematic for time(2) or gettimeofday(2) to return TIME_UNDEFINED, since there are programs that care about time ticking forward, but I could imagine a new interface which would be permitted to return a flag indicating that we don't know the current time (because the CMOS battery had run down, etc.) so instead we're going to be counting the number of seconds since the system was booted. - Ted From hpa@zytor.com Mon Jun 2 12:16:00 2014 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 2B7607F54 for ; Mon, 2 Jun 2014 12:16:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 07C4C8F8084 for ; Mon, 2 Jun 2014 10:15:56 -0700 (PDT) X-ASG-Debug-ID: 1401729355-04bdf059a142f980001-NocioJ Received: from mail.zytor.com (terminus.zytor.com [198.137.202.10]) by cuda.sgi.com with ESMTP id AGykstRPflDvlhcp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 10:15:55 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from hanvin-mobl6.amr.corp.intel.com (fmdmzpr04-ext.fm.intel.com [192.55.55.39]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52HCh9V027469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 10:12:43 -0700 Message-ID: <538CB085.5000502@zytor.com> Date: Mon, 02 Jun 2014 10:12:37 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: "Theodore Ts'o" , Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140602153124.GH30598@thunk.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: terminus.zytor.com[198.137.202.10] X-Barracuda-Start-Time: 1401729355 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6318 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 06/02/2014 08:31 AM, Theodore Ts'o wrote: > > I wonder if it would make sense to try to promulgate via the Austin > group, and possibly the C standards committee the concept of a bit > pattern (that might commonly be INT_MAX or UINT_MAX) that means "time > unknown", or "time indefinite" or "we couldn't encode the time". > (time_t)-1 already has this meaning for some calls (e.g. time(2)). However, this also means Wed Dec 31 23:59:59 UTC 1969, and unfortunately something similar applies to all possible bit patterns, certainly within the range of an int. > We would then teach gmtime(3) and asctime(3) to print some appropriate > message, and we could teach programs like find (with the -mtime) > option, make, tmpwatch, et. al., that they can't make any presumption > about the comparibility of any timestamp which has a value of > TIME_UNDEFINIED. > > It would be problematic for time(2) or gettimeofday(2) to return > TIME_UNDEFINED, since there are programs that care about time ticking > forward, but I could imagine a new interface which would be permitted > to return a flag indicating that we don't know the current time > (because the CMOS battery had run down, etc.) so instead we're going > to be counting the number of seconds since the system was booted. This assumes that we actually know that that is the case, which may be an aggressive assumption. -hpa From scaron@umich.edu Mon Jun 2 13:32:24 2014 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 675407F54 for ; Mon, 2 Jun 2014 13:32:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0935CAC001 for ; Mon, 2 Jun 2014 11:32:20 -0700 (PDT) X-ASG-Debug-ID: 1401733938-04bdf059a0455560001-NocioJ Received: from mail-qa0-f52.google.com (mail-qa0-f52.google.com [209.85.216.52]) by cuda.sgi.com with ESMTP id XypfC9Eqijj6Grrj (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 11:32:18 -0700 (PDT) X-Barracuda-Envelope-From: scaron@umich.edu X-Barracuda-Apparent-Source-IP: 209.85.216.52 Received: by mail-qa0-f52.google.com with SMTP id cm18so3255288qab.25 for ; Mon, 02 Jun 2014 11:32:18 -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:date :message-id:subject:from:to:cc:content-type; bh=X0Yw2m+gAeh1Xra/fjf0ZIxG2itrr69Ccr2YXa9W7ww=; b=ZTV4JmuigzLrYfDVnJ6ymp5NddPiWqbTyuAmr8Epom9nkOtYfjHPBzmUmB0sxFYE7J UfpPAqVuWneuuH8IoozJcYvbHejH/953hOUA+hopzoFm0sQxwtG/pOgfzTmW4QE7q2m4 Oocg4PWHGGwlbhljBCMllg0isMxvcJ0ShNoc4ZBdDDXuVuo4n7BFNzldZrnVlfTt41Hh 0OWuGA83sZGuNIruiWbyOqyeIMDFbDLhD+AL4p3COe1JpTESzBw6CTcEWUlFB+d4hWPu r2gwvDMuKs4EWAOG7EY2Q9j9JroBgIz3h+vEiRpns5cOBdCntcoCE9iStQjICM8rb83v Hjgw== X-Gm-Message-State: ALoCoQkJeSW1sEzCgzRdCsQQs1MomP/DFanpJW6F+n5sS4oEi7EI6v/+C2OcjE87UbZ8AHTG2DDa MIME-Version: 1.0 X-Received: by 10.140.30.70 with SMTP id c64mr47863357qgc.13.1401733937905; Mon, 02 Jun 2014 11:32:17 -0700 (PDT) Received: by 10.224.100.72 with HTTP; Mon, 2 Jun 2014 11:32:17 -0700 (PDT) In-Reply-To: <20140601224825.GP14410@dastard> References: <20140531000117.GM6677@dastard> <20140601224825.GP14410@dastard> Date: Mon, 2 Jun 2014 14:32:17 -0400 Message-ID: Subject: Re: What to do when... xfs_repair hangs? From: Sean Caron X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? To: Dave Chinner , Sean Caron Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11395d847047cc04fade9dd6 X-Barracuda-Connect: mail-qa0-f52.google.com[209.85.216.52] X-Barracuda-Start-Time: 1401733938 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11395d847047cc04fade9dd6 Content-Type: text/plain; charset=UTF-8 I tried re-running the version that came with Ubuntu 12.04 LTS and it very consistently segfaults at that point... so I went and pulled a copy of the most recent source from Git and I'm trying xfs_repair 3.2.0 now. I'll see how that goes (it'll probably take a day or two to run; 450 TB volume) and report back. Thanks everyone for the suggestions and feedback so far. Best, Sean On Sun, Jun 1, 2014 at 6:48 PM, Dave Chinner wrote: > On Sun, Jun 01, 2014 at 12:21:55PM -0400, Sean Caron wrote: > > Sorry, all, I was a little out-of-it on Friday afternoon, of course I had > > kicked off xfs_repair actually in the background with all output sent to > a > > file, and I was just doing 'tail -f' on that file. > > > > So I kill the 'tail -f' and jump back to the command line, it appears > that > > xfs_repair segfaulted and died. > > > > That line of text: > > > > disconnected inode 1109099673, > > > > was indeed the last thing that it printed before it crashed. > > > > If I look in dmesg, I just see - > > > > xfs_repair[6770]: segfault at 28 ip 000000000042307b sp 00007fffef61bad0 > > error 4 in xfs_repair[400000+72000] > > > > and that's it. > > > > I checked with 'df' and there's plenty of space everywhere; I don't see > why > > it would have faulted out trying to connect something to lost+found. > > > > Underlying storage should be good; this is basically a RAID 60 built on > top > > of a bunch of JBODs with LSI SAS9200 cards. MD sees all strings as > started > > and running OK; no problems getting the array assembled at all. > > > > Since Dave is saying it's OK to try re-running xfs_repair; it'll just > pick > > up where it left off; let me give it another pass and see if it manages > to > > complete, or if it segfaults out again. I guess it it poops out a second > > time, maybe we'll just want to consider rebuilding the filesystem and > > restoring from our copies? > > You should update to the latest version of xfs_repair first (3.2.0). > If that still crashes, running xfs-repair under gdb to get a stack > trace would be a good start, or sending me a metadump image so I can > reproduce the crash myself would be even better... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11395d847047cc04fade9dd6 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
I tried re-running the version that came with Ubuntu 12.04= LTS and it very consistently segfaults at that point... so I went and pull= ed a copy of the most recent source from Git and I'm trying xfs_repair = 3.2.0 now. I'll see how that goes (it'll probably take a day or two= to run; 450 TB volume) and report back. Thanks everyone for the suggestion= s and feedback so far.

Best,

Sean


On Sun, Jun 1, 2014 at 6:4= 8 PM, Dave Chinner <david@fromorbit.com> wrote:
On Sun, Jun 01, 2014 at 12:2= 1:55PM -0400, Sean Caron wrote:
> Sorry, all, I was a little out-of-it on Friday afternoon, of course I = had
> kicked off xfs_repair actually in the background with all output sent = to a
> file, and I was just doing 'tail -f' on that file.
>
> So I kill the 'tail -f' and jump back to the command line, it = appears that
> xfs_repair segfaulted and died.
>
> That line of text:
>
> disconnected inode 1109099673,
>
> was indeed the last thing that it printed before it crashed.
>
> If I look in dmesg, I just see -
>
> xfs_repair[6770]: segfault at 28 ip 000000000042307b sp 00007fffef61ba= d0
> error 4 in xfs_repair[400000+72000]
>
> and that's it.
>
> I checked with 'df' and there's plenty of space everywhere= ; I don't see why
> it would have faulted out trying to connect something to lost+found. >
> Underlying storage should be good; this is basically a RAID 60 built o= n top
> of a bunch of JBODs with LSI SAS9200 cards. MD sees all strings as sta= rted
> and running OK; no problems getting the array assembled at all.
>
> Since Dave is saying it's OK to try re-running xfs_repair; it'= ll just pick
> up where it left off; let me give it another pass and see if it manage= s to
> complete, or if it segfaults out again. I guess it it poops out a seco= nd
> time, maybe we'll just want to consider rebuilding the filesystem = and
> restoring from our copies?

You should update to the latest version of xfs_repair first (3.2.0).<= br> If that still crashes, running xfs-repair under gdb to get a stack
trace would be a good start, or sending me a metadump image so I can
reproduce the crash myself would be even better...

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a11395d847047cc04fade9dd6-- From arnd@arndb.de Mon Jun 2 13:52:25 2014 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 C506629DF8 for ; Mon, 2 Jun 2014 13:52:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 493D7AC004 for ; Mon, 2 Jun 2014 11:52:25 -0700 (PDT) X-ASG-Debug-ID: 1401735142-04cbb050fd21a8a0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id nCnnaEgjxYUioc4F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 11:52:23 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue005) with ESMTP (Nemesis) id 0M1CQ8-1WXXWy0veq-00tG0M; Mon, 02 Jun 2014 20:50:56 +0200 From: Arnd Bergmann To: "H. Peter Anvin" Cc: Theodore Ts'o , Chuck Lever , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 20:50:55 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <4548598.6TTMEpKtuS@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <538CB085.5000502@zytor.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:/90kk+gjD6hRNXSPjut3wwHX49joKS4yC+yNNbJ86QL H9umPu65m55QNquKiiF5ZtHy8rUaBi7JnahCxopnsT5iboNJ7L ioxeaM8Fz6OsMphunT7VSECDJdctzFcoVZktVnl3BnN/FN8kTR QT/N3VCaIzZjc+VRkehfMEcYrF5WE+TrV/bET63XFOZfWfZ5Cr Y0iql5fQVRwCk/rm95AKa5rydnsvnUWOkw94YJiC3hRPm9ysbQ iML2sf2ucQrF+oAs9Nw/s2joprprEZF/2XTo/hXSNHG3B4F5/0 +QGQGvSLmVSeIjpVMdCuoxpDcq/G5GNxPNZd7CflGHl5N+4/40 HaUarl+nSj7jW0wsQS04= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401735142 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Monday 02 June 2014 10:12:37 H. Peter Anvin wrote: > On 06/02/2014 08:31 AM, Theodore Ts'o wrote: > > > > I wonder if it would make sense to try to promulgate via the Austin > > group, and possibly the C standards committee the concept of a bit > > pattern (that might commonly be INT_MAX or UINT_MAX) that means "time > > unknown", or "time indefinite" or "we couldn't encode the time". > > > > (time_t)-1 already has this meaning for some calls (e.g. time(2)). > However, this also means Wed Dec 31 23:59:59 UTC 1969, and unfortunately > something similar applies to all possible bit patterns, certainly within > the range of an int. Worse than Wed Dec 31 23:59:59 UTC 1969, on NFSv3 it also means "Sun Feb 7 07:28:15 CET 2106", and that is much harder to distinguish from a real future date. If we had the choice, I'd go for something like 1, i.e. "Thu Jan 1 01:00:01 CET 1970". > > We would then teach gmtime(3) and asctime(3) to print some appropriate > > message, and we could teach programs like find (with the -mtime) > > option, make, tmpwatch, et. al., that they can't make any presumption > > about the comparibility of any timestamp which has a value of > > TIME_UNDEFINIED. > > > > It would be problematic for time(2) or gettimeofday(2) to return > > TIME_UNDEFINED, since there are programs that care about time ticking > > forward, but I could imagine a new interface which would be permitted > > to return a flag indicating that we don't know the current time > > (because the CMOS battery had run down, etc.) so instead we're going > > to be counting the number of seconds since the system was booted. > > This assumes that we actually know that that is the case, which may be > an aggressive assumption. It's harder for time(2), but for the inode case, we can definitely detect when the file system specific representation overflows or underflows, which may be be at a number of very different points of time. Arnd From arnd@arndb.de Mon Jun 2 13:52:55 2014 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 9BBDE29DF8 for ; Mon, 2 Jun 2014 13:52:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22523AC001 for ; Mon, 2 Jun 2014 11:52:55 -0700 (PDT) X-ASG-Debug-ID: 1401735172-04cb6c1006116480001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by cuda.sgi.com with ESMTP id EV7FlnPIS3bxoxDV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 11:52:53 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.24 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue105) with ESMTP (Nemesis) id 0LZwBp-1WO0sY3qaz-00lldb; Mon, 02 Jun 2014 20:52:44 +0200 From: Arnd Bergmann To: Chuck Lever Cc: Nicolas Pitre , "H. Peter Anvin" , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 20:52:43 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5109660.teHoOW5tSd@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-Provags-ID: V02:K0:PqaOK9Awxac+bE3z+cHQbCBldAtgnWxKwUCukAmCyyh CITZVSLsBDEbL/f4qUCVRtn/fRfAESAy80V0cuv7lc7LllCqLd t28Kynz6XiXml7tFjZLCB4v06yM4aNnt+Ucm6NCkbH8NA2OX6p p266NC2T1tIdiPFnJyj3BkJVpw0KlWEQ0HV1tgS6wiLfYglxsK x5WxS/DMI/SlfOZED/bzw2D7yhNhkKiBpuVzJYpxiYtV6LF278 +YY7bckwSH3/LUdd8tSbwCyJOCcdJV+OLcaf/oYhi0pQkDMZ0X pIwd0gmNpPxA2UjgTuq8VqP2NHk8VbD/JwG0Iuo68v/2BuCTyu bpSndfOg7nhdms+B5jU4= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.24] X-Barracuda-Start-Time: 1401735173 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 11:04:23 Chuck Lever wrote: > I=E2=80=99m wondering what should be done about NFS. A solution for N= FS should > match any scheme that is considered for local file systems, IMO. >=20 > NFSv2/3 timestamps are a pair of unsigned 32-bit values: one value fo= r > seconds since midnight GMT Jan 1, 1970, and one value for nanoseconds= . > (See the definition of nfstime3 in RFC 1813). >=20 > NFSv4 uses a signed 64-bit value where zero represents midnight UTC > on January 1, 1970, and an unsigned 32-bit value for nanoseconds. (Se= e > the definition of nfstime4 in RFC 5661). >=20 > The NFSv4 protocol is probably not problematic, and NFSv3 should be o= ut > of the picture by 2038. But if changes are planned for dealing _now_ > with timestamp issues, compatibility with NFSv3 is a consideration. >=20 > It is already the case that, via NFSv3, the Linux NFS client transmit= s > timestamps earlier than 1970 as large positive numbers. Try this with= > xfstests generic/258. If I read the code correctly, a pre-1970 timestamp will be sent as a large unsigned integer, but received as a post-2038 timestamp on 64-bit kernels, both in the nfs client and server code. This behavior is clearly wrong, but it's the same bug that we have in lots of other file systems, and it makes sense to have the same fix everywhere, at lease the cases where we know what interpretati= on we actually want. NFS has the luxury of having an actual specification saying that the value is unsigned. For most of the legacy file systems,= we can only make a guess at how other OSs would interpret the same numbers. =09Arnd From roger@filmlight.ltd.uk Mon Jun 2 13:58:27 2014 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 65D2029DF8 for ; Mon, 2 Jun 2014 13:58:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 324FA30404E for ; Mon, 2 Jun 2014 11:58:27 -0700 (PDT) X-ASG-Debug-ID: 1401735504-04bdf059a045f350001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id 45lOjsVy6UWjNWnG for ; Mon, 02 Jun 2014 11:58:25 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 300 invoked from network); 2 Jun 2014 18:58:24 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.132?) (roger@10.44.0.132) by b.mx.filmlight.ltd.uk with SMTP; 2 Jun 2014 18:58:24 -0000 Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Roger Willcocks X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time To: Chuck Lever Cc: Arnd Bergmann , Nicolas Pitre , linux-arch@vger.kernel.org, Linux NFS Mailing List , LKML Kernel , lftan@altera.com, Christoph Hellwig , john.stultz@linaro.org, "H. Peter Anvin" , linux-fsdevel , geert@linux-m68k.org, tglx@linutronix.de, xfs@oss.sgi.com, joseph@codesourcery.com In-Reply-To: <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> Content-Type: text/plain Date: Mon, 02 Jun 2014 19:58:24 +0100 Message-Id: <1401735504.6065.227.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1401735504 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 2014-06-02 at 11:04 -0400, Chuck Lever wrote: > NFSv2/3 timestamps are a pair of unsigned 32-bit values: one value for > seconds since midnight GMT Jan 1, 1970, and one value for nanoseconds. > (See the definition of nfstime3 in RFC 1813). > nfstime3 could be extended by redefining the otherwise unused nanoseconds bits{31,30} as seconds{33,32}, to give a (signed) 34-bit seconds field and an unsigned 30-bit nanoseconds field. This could represent 1970 +/- 272 years. Servers could indicate they can understand the extended time format by adding a new FSINFO capability - FSF3_CANSETTIME_EX. Clients would use a new SET_TO_CLIENT_TIME_EX time_how enum when sending timestamps so old servers would be protected from new clients. Old clients don't need to be protected from new servers because the on-the-wire bit pattern for dates between 1970 and 2106 stays the same, so they're no worse off than they were before. Arguably the new server ought to clamp out-of-range timestamps before sending them to old clients but that would need per-client state (and nfs3 is stateless.) -- Roger From chuck.lever@oracle.com Mon Jun 2 14:05:40 2014 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 8FD5029DF8 for ; Mon, 2 Jun 2014 14:05:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30D00AC004 for ; Mon, 2 Jun 2014 12:05:37 -0700 (PDT) X-ASG-Debug-ID: 1401735934-04bdf059a0461b00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JJxKbR3EnECUFhva (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 12:05:35 -0700 (PDT) X-Barracuda-Envelope-From: chuck.lever@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s52J4Xht006779 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 2 Jun 2014 19:04:34 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s52J4VnU013922 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Jun 2014 19:04:32 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s52J4TNL023470; Mon, 2 Jun 2014 19:04:30 GMT Received: from anon-dhcp-162.1015granger.net (/68.40.85.241) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 02 Jun 2014 12:04:29 -0700 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.2\)) Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Chuck Lever X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <1401735504.6065.227.camel@montana.filmlight.ltd.uk> Date: Mon, 2 Jun 2014 15:04:27 -0400 Cc: Arnd Bergmann , Nicolas Pitre , linux-arch@vger.kernel.org, Linux NFS Mailing List , LKML Kernel , lftan@altera.com, Christoph Hellwig , john.stultz@linaro.org, "H. Peter Anvin" , linux-fsdevel , geert@linux-m68k.org, tglx@linutronix.de, xfs@oss.sgi.com, joseph@codesourcery.com Content-Transfer-Encoding: quoted-printable Message-Id: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <1401735504.6065.227.camel@montana.filmlight.ltd.uk> To: Roger Willcocks X-Mailer: Apple Mail (2.1878.2) X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401735935 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA067, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 1.50 BSF_SC0_SA067 Custom Rule SA067 On Jun 2, 2014, at 2:58 PM, Roger Willcocks = wrote: >=20 > On Mon, 2014-06-02 at 11:04 -0400, Chuck Lever wrote: >=20 >> NFSv2/3 timestamps are a pair of unsigned 32-bit values: one value = for >> seconds since midnight GMT Jan 1, 1970, and one value for = nanoseconds. >> (See the definition of nfstime3 in RFC 1813). >>=20 >=20 > nfstime3 could be extended by redefining the otherwise unused > nanoseconds bits{31,30} as seconds{33,32}, to give a (signed) 34-bit > seconds field and an unsigned 30-bit nanoseconds field. >=20 > This could represent 1970 +/- 272 years. >=20 > Servers could indicate they can understand the extended time format by > adding a new FSINFO capability - FSF3_CANSETTIME_EX. >=20 > Clients would use a new SET_TO_CLIENT_TIME_EX time_how enum when = sending > timestamps so old servers would be protected from new clients. You would have to get the IETF=92s NFSv4 working group to sign off on this change. Otherwise, Linux would be the only NFSv3 implementation that supports the extension. But I suspect the answer you=92d get is =93Use NFSv4.=94 > Old clients don't need to be protected from new servers because the > on-the-wire bit pattern for dates between 1970 and 2106 stays the = same, > so they're no worse off than they were before. >=20 > Arguably the new server ought to clamp out-of-range timestamps before > sending them to old clients but that would need per-client state (and > nfs3 is stateless.) There=92s no reliable way in NFSv3 for clients and servers to identify the software running on the peer. Practically speaking, you should assume that the NFSv3 protocol is never going to change. -- Chuck Lever chuck[dot]lever[at]oracle[dot]com From arnd@arndb.de Mon Jun 2 14:11:03 2014 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 DF77529DF8 for ; Mon, 2 Jun 2014 14:11:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F4018F8050 for ; Mon, 2 Jun 2014 12:11:00 -0700 (PDT) X-ASG-Debug-ID: 1401736257-04bdf0599e4628f0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id sHFlMF5bcgaiYGhu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 12:10:58 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue001) with ESMTP (Nemesis) id 0MPdgn-1WwEaf3kUj-004kt7; Mon, 02 Jun 2014 21:10:49 +0200 From: Arnd Bergmann To: Chuck Lever Cc: Roger Willcocks , Nicolas Pitre , linux-arch@vger.kernel.org, Linux NFS Mailing List , LKML Kernel , lftan@altera.com, Christoph Hellwig , john.stultz@linaro.org, "H. Peter Anvin" , linux-fsdevel , geert@linux-m68k.org, tglx@linutronix.de, xfs@oss.sgi.com, joseph@codesourcery.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Mon, 02 Jun 2014 21:10:47 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5585593.Xe5bNQZW47@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401735504.6065.227.camel@montana.filmlight.ltd.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-Provags-ID: V02:K0:bXrzJyAzgEKl81TStkjWbriSWSQaIN1lXC/BVPRzOz9 e30zFHO7wPv9NopQs9o8/IgxftJc9DDKjL53AxDp+l3XKLijd+ upWIbCPzGW1r8f8geTxrDyIE3BE/onm56ZedlUsedp7gNMRlS6 w7UUVdX0kK5SXmohuocp+rVbbAWlcpfN/cuR81+dIt4B6W0qsZ iJsankvJXyzjGgqoUrSWX7U0AJbaAZBVG96Le54OrgKAZ59QtO Sk4u9CXEmfLJU+6IYhUpOOzUNOfQ7zvBrjSFfQBvEf8DpVmRud +Rf7HefjAQWGKMtBBV2wfhMvr6ClnqxahqO9GvJQdCp2PqG369 IJiBY9Yez2sg4pUorR+U= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401736257 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Monday 02 June 2014 15:04:27 Chuck Lever wrote: > On Jun 2, 2014, at 2:58 PM, Roger Willcocks = wrote: >=20 > >=20 > > On Mon, 2014-06-02 at 11:04 -0400, Chuck Lever wrote: > >=20 > >> NFSv2/3 timestamps are a pair of unsigned 32-bit values: one value= for > >> seconds since midnight GMT Jan 1, 1970, and one value for nanoseco= nds. > >> (See the definition of nfstime3 in RFC 1813). > >>=20 > >=20 > > nfstime3 could be extended by redefining the otherwise unused > > nanoseconds bits{31,30} as seconds{33,32}, to give a (signed) 34-bi= t > > seconds field and an unsigned 30-bit nanoseconds field. > >=20 > > This could represent 1970 +/- 272 years. > >=20 > > Servers could indicate they can understand the extended time format= by > > adding a new FSINFO capability - FSF3_CANSETTIME_EX. > >=20 > > Clients would use a new SET_TO_CLIENT_TIME_EX time_how enum when se= nding > > timestamps so old servers would be protected from new clients. >=20 > You would have to get the IETF=E2=80=99s NFSv4 working group to sign = off on > this change. Otherwise, Linux would be the only NFSv3 implementation > that supports the extension. >=20 > But I suspect the answer you=E2=80=99d get is =E2=80=9CUse NFSv4.=E2=80= =9D While I've never dealt with an NFS standardization, I'd assume this is a workable answer. The NFSv2 and NFSv3 definition clearly defines a val= id range of times until 2106 using unsigned seconds, and that should reall= y give enough time to migrate to something better (not necessarily NFSv4)= . =09Arnd From arnd@arndb.de Mon Jun 2 14:21:47 2014 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 5340B29DF8 for ; Mon, 2 Jun 2014 14:21:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA679AC003 for ; Mon, 2 Jun 2014 12:21:46 -0700 (PDT) X-ASG-Debug-ID: 1401736903-04bdf059a0463c50001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id eYbLiBP1FjClYlzr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 12:21:44 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue003) with ESMTP (Nemesis) id 0LgtBS-1WUu4Y1QQA-00oFlX; Mon, 02 Jun 2014 21:19:57 +0200 From: Arnd Bergmann To: "Joseph S. Myers" Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Mon, 02 Jun 2014 21:19:55 +0200 X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <4233989.Saca0ocOUr@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:N1Yd64vWkAjM0ROp+kC8egeIF6ETH0wOeYwjA9O2LDZ 7+sVunCrTZKbjtMgR+4sz6lrwmAVoVXd2YAJBNRlsfu8UWnTu5 2YtsEbwNSs64Yj7gNWu9PjFoxw4MBlxq7YNfg0UdwbvswKATut fo6WPS1bnedmxBtIe9Eaw1NbQXNIu4jaOFqvSZAzi7K+gsdj5E M8U54R4vSX46+RmOldxpOJ+8QO4ssxBbbctn0wrkJuX0J1ksF5 tFn3fTKnxB8oWQ06Q2ll3fW8IYUABqZdRV8za9QKBzcQZAQpq9 ud4pys4kK+EPg8pDWRUZcgdS0pRSwT5EgJq+bxQjqLwrRcug0v 2/91O6iRgrww9ivAg99c= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401736904 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6322 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Monday 02 June 2014 13:52:19 Joseph S. Myers wrote: > On Fri, 30 May 2014, Arnd Bergmann wrote: > > > a) is this the right approach in general? The previous discussion > > pointed this way, but there may be other opinions. > > The syscall changes seem like the sort of thing I'd expect, although > patches adding new syscalls or otherwise affecting the kernel/userspace > interface (as opposed to those relating to an individual filesystem) > should go to linux-api as well as other relevant lists. Ok. Sorry about missing linux-api, I confused it with linux-arch, which may not be as relevant here, except for the one question whether we actually want to have the new ABI on all 32-bit architectures or only as an opt-in for those that expect to stay around for another 24 years. Two more questions for you: - are you (and others) happy with adding this type of stat syscall (fstatat64/fstat64) as opposed to the more generic xstat that has been discussed in the past and that never made it through the bike- shedding discussion? - once we have enough buy-in from reviewers to merge this initial series, should we proceed to define rest of the syscall ABI (minus driver ioctls) so glibc and kernel can do the conversion on top of that, or should we better try to do things one syscall family at a time and actually get the kernel to handle them correctly internally? Arnd From hpa@zytor.com Mon Jun 2 14:27:57 2014 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 1DDCA29DF8 for ; Mon, 2 Jun 2014 14:27:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F07D58F8089 for ; Mon, 2 Jun 2014 12:27:56 -0700 (PDT) X-ASG-Debug-ID: 1401737274-04cb6c100611f460001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id EVMN5jvEdd35YqO5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 12:27:55 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from anacreon.sc.intel.com (fmdmzpr02-ext.fm.intel.com [192.55.55.37]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52JQRVT002473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 12:26:28 -0700 Message-ID: <538CCFDE.2010107@zytor.com> Date: Mon, 02 Jun 2014 12:26:22 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Arnd Bergmann , "Joseph S. Myers" CC: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@TELEMANN.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4233989.Saca0ocOUr@wuerfel> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready In-Reply-To: <4233989.Saca0ocOUr@wuerfel> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401737275 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6322 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On 06/02/2014 12:19 PM, Arnd Bergmann wrote: > On Monday 02 June 2014 13:52:19 Joseph S. Myers wrote: >> On Fri, 30 May 2014, Arnd Bergmann wrote: >> >>> a) is this the right approach in general? The previous discussion >>> pointed this way, but there may be other opinions. >> >> The syscall changes seem like the sort of thing I'd expect, although >> patches adding new syscalls or otherwise affecting the kernel/userspace >> interface (as opposed to those relating to an individual filesystem) >> should go to linux-api as well as other relevant lists. > > Ok. Sorry about missing linux-api, I confused it with linux-arch, which > may not be as relevant here, except for the one question whether we > actually want to have the new ABI on all 32-bit architectures or only > as an opt-in for those that expect to stay around for another 24 years. > > Two more questions for you: > > - are you (and others) happy with adding this type of stat syscall > (fstatat64/fstat64) as opposed to the more generic xstat that has > been discussed in the past and that never made it through the bike- > shedding discussion? > > - once we have enough buy-in from reviewers to merge this initial > series, should we proceed to define rest of the syscall ABI > (minus driver ioctls) so glibc and kernel can do the conversion > on top of that, or should we better try to do things one syscall > family at a time and actually get the kernel to handle them > correctly internally? > The bit that is really going to hurt is every single ioctl that uses a timespec. Honestly, though, I really don't understand the point with "struct inode_time". It seems like the zeroeth-order thing is to change the kernel internal version of struct timespec to have a 64-bit time... it isn't just about inodes. We then should be explicit about the external uses of time, and use accessors. -hpa From arnd@arndb.de Mon Jun 2 14:56:55 2014 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 18F1929DF8 for ; Mon, 2 Jun 2014 14:56:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 090B68F8070 for ; Mon, 2 Jun 2014 12:56:55 -0700 (PDT) X-ASG-Debug-ID: 1401739012-04cbb050fa23b9a0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id bf3LjAnYBItart7C (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 12:56:53 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.187 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue005) with ESMTP (Nemesis) id 0LrXNx-1WfYrl3CO5-013OTQ; Mon, 02 Jun 2014 21:55:53 +0200 From: Arnd Bergmann To: "H. Peter Anvin" Cc: "Joseph S. Myers" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@telemann.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Mon, 02 Jun 2014 21:55:52 +0200 X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <7175692.dpgYFMbTaP@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <538CCFDE.2010107@zytor.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4233989.Saca0ocOUr@wuerfel> <538CCFDE.2010107@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:uT+/Uve9SN0noSZFrkOQCUh6cef/b3abSKIoJ2DAuQe Qah2JguLGI1cjCxDJVwax8NuXa/GiGbEAPAesqoVT3/YPv1DST B1fUh0Ug+Q2O8x+yGABvPdcFUQ71Rp+b+ZRP68xdJ8XPb6ux/b DyDt34/79R0EcX0HTbkuX6AN8Q0bJV8FbHKQASSjRNLmD4Oe8z MN2lDy7mi61rRWFiqICPb5CLFDN0/Um5/f58VacqDbspxQUlBl 3sd1qKSRT5hQ6kFFYKJ/rBwdrCfZJ+NLWgo98MgJyOuPYQ7A2o TnLPuiCumxSk3Q2jkiZiDO6V18/ymPB2adR2Y5y00Ai4AMGHql 6oFRuoVW9HTDy+GGmRrA= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1401739013 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6323 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Monday 02 June 2014 12:26:22 H. Peter Anvin wrote: > On 06/02/2014 12:19 PM, Arnd Bergmann wrote: > > On Monday 02 June 2014 13:52:19 Joseph S. Myers wrote: > >> On Fri, 30 May 2014, Arnd Bergmann wrote: > >> > >>> a) is this the right approach in general? The previous discussion > >>> pointed this way, but there may be other opinions. > >> > >> The syscall changes seem like the sort of thing I'd expect, although > >> patches adding new syscalls or otherwise affecting the kernel/userspace > >> interface (as opposed to those relating to an individual filesystem) > >> should go to linux-api as well as other relevant lists. > > > > Ok. Sorry about missing linux-api, I confused it with linux-arch, which > > may not be as relevant here, except for the one question whether we > > actually want to have the new ABI on all 32-bit architectures or only > > as an opt-in for those that expect to stay around for another 24 years. > > > > Two more questions for you: > > > > - are you (and others) happy with adding this type of stat syscall > > (fstatat64/fstat64) as opposed to the more generic xstat that has > > been discussed in the past and that never made it through the bike- > > shedding discussion? > > > > - once we have enough buy-in from reviewers to merge this initial > > series, should we proceed to define rest of the syscall ABI > > (minus driver ioctls) so glibc and kernel can do the conversion > > on top of that, or should we better try to do things one syscall > > family at a time and actually get the kernel to handle them > > correctly internally? > > > > The bit that is really going to hurt is every single ioctl that uses a > timespec. > > Honestly, though, I really don't understand the point with "struct > inode_time". It seems like the zeroeth-order thing is to change the > kernel internal version of struct timespec to have a 64-bit time... it > isn't just about inodes. We then should be explicit about the external > uses of time, and use accessors. I picked these because they are fairly isolated from all other uses, in particular since inode times are the only things where we really care about times in the distant past or future (decades away as opposed to things that happened between boot and shutdown). For other kernel-internal uses, we may be better off migrating to a completely different representation, such as nanoseconds since boot or the architecture specific ktime_t, but this is really something to decide for each subsystem. I just tried building an arm32 kernel with a s64 time_t, and that failed horribly, I get linker errors for missing 64-bit divides and lots of warnings for code that expects time_t pointers to functions taking a 'long' or vice versa. I also think the only way to maintain ABI compatibility is to separate the internal uses from the interface, which means auditing all code in the end. Arnd From joseph_myers@mentor.com Mon Jun 2 16:02:40 2014 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 3A1C97F54 for ; Mon, 2 Jun 2014 16:02:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7FAEAC005 for ; Mon, 2 Jun 2014 14:02:39 -0700 (PDT) X-ASG-Debug-ID: 1401742953-04cbb050fa257f10001-NocioJ Received: from relay1.mentorg.com (relay1.mentorg.com [192.94.38.131]) by cuda.sgi.com with ESMTP id MamqegmMGAFKGC5h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 14:02:34 -0700 (PDT) X-Barracuda-Envelope-From: joseph_myers@mentor.com X-Barracuda-Apparent-Source-IP: 192.94.38.131 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1WrZN6-0007FJ-V7 from joseph_myers@mentor.com ; Mon, 02 Jun 2014 14:02:21 -0700 Received: from SVR-IES-FEM-02.mgc.mentorg.com ([137.202.0.106]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Mon, 2 Jun 2014 14:02:20 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-02.mgc.mentorg.com (137.202.0.106) with Microsoft SMTP Server id 14.2.247.3; Mon, 2 Jun 2014 22:02:17 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1WrZN1-0007no-QQ; Mon, 02 Jun 2014 21:02:15 +0000 Date: Mon, 2 Jun 2014 21:02:15 +0000 From: "Joseph S. Myers" X-X-Sender: jsm28@digraph.polyomino.org.uk To: Arnd Bergmann CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: Re: [RFC 00/32] making inode time stamps y2038 ready In-Reply-To: <4233989.Saca0ocOUr@wuerfel> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4233989.Saca0ocOUr@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Sender: Joseph Myers X-OriginalArrivalTime: 02 Jun 2014 21:02:20.0222 (UTC) FILETIME=[F16D75E0:01CF7EA5] X-Barracuda-Connect: relay1.mentorg.com[192.94.38.131] X-Barracuda-Start-Time: 1401742954 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 2 Jun 2014, Arnd Bergmann wrote: > Ok. Sorry about missing linux-api, I confused it with linux-arch, which > may not be as relevant here, except for the one question whether we > actually want to have the new ABI on all 32-bit architectures or only > as an opt-in for those that expect to stay around for another 24 years. For glibc I think it will make the most sense to add the support for 64-bit time_t across all architectures that currently have 32-bit time_t (with the new interfaces having fallback support to implementation in terms of the 32-bit kernel interfaces, if the 64-bit syscalls are unavailable either at runtime or in the kernel headers against which glibc is compiled - this fallback code will of course need to check for overflow when passing a time value to the kernel, hopefully with error handling consistent with whatever the kernel ends up doing when a filesystem can't support a timestamp). If some architectures don't provide the new interfaces in the kernel then that will mean the fallback code in glibc can't be removed until glibc support for those architectures is removed (as opposed to removing it when glibc no longer supports kernels predating the kernel support). > Two more questions for you: > > - are you (and others) happy with adding this type of stat syscall > (fstatat64/fstat64) as opposed to the more generic xstat that has > been discussed in the past and that never made it through the bike- > shedding discussion? I am. > - once we have enough buy-in from reviewers to merge this initial > series, should we proceed to define rest of the syscall ABI > (minus driver ioctls) so glibc and kernel can do the conversion > on top of that, or should we better try to do things one syscall > family at a time and actually get the kernel to handle them > correctly internally? I don't have any comments on that ordering question. -- Joseph S. Myers joseph@codesourcery.com From hpa@zytor.com Mon Jun 2 16:59:12 2014 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 EE94529DF8 for ; Mon, 2 Jun 2014 16:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E38A18F807A for ; Mon, 2 Jun 2014 14:59:08 -0700 (PDT) X-ASG-Debug-ID: 1401746346-04cb6c100a145240001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id u5DcBoUCTB7efSHf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 14:59:07 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from anacreon.sc.intel.com (fmdmzpr02-ext.fm.intel.com [192.55.55.37]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52LvV2p014643 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 14:57:32 -0700 Message-ID: <538CF346.2070504@zytor.com> Date: Mon, 02 Jun 2014 14:57:26 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Arnd Bergmann CC: "Joseph S. Myers" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@telemann.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <4233989.Saca0ocOUr@wuerfel> <538CCFDE.2010107@zytor.com> <7175692.dpgYFMbTaP@wuerfel> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready In-Reply-To: <7175692.dpgYFMbTaP@wuerfel> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401746347 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6327 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On 06/02/2014 12:55 PM, Arnd Bergmann wrote: >> >> The bit that is really going to hurt is every single ioctl that uses a >> timespec. >> >> Honestly, though, I really don't understand the point with "struct >> inode_time". It seems like the zeroeth-order thing is to change the >> kernel internal version of struct timespec to have a 64-bit time... it >> isn't just about inodes. We then should be explicit about the external >> uses of time, and use accessors. > > I picked these because they are fairly isolated from all other uses, > in particular since inode times are the only things where we really > care about times in the distant past or future (decades away as opposed > to things that happened between boot and shutdown). > If nothing else, I would expect to be able to set the system time to weird values for testing. So I'm not so sure I agree with that... > For other kernel-internal uses, we may be better off migrating to > a completely different representation, such as nanoseconds since > boot or the architecture specific ktime_t, but this is really something > to decide for each subsystem. Having a bunch of different time representations in the kernel seems like a real headache... -hpa From tytso@thunk.org Mon Jun 2 17:30:44 2014 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 165867F54 for ; Mon, 2 Jun 2014 17:30:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFF24304064 for ; Mon, 2 Jun 2014 15:30:40 -0700 (PDT) X-ASG-Debug-ID: 1401748238-04bdf059a04971e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 99taoVq9DHHpJ91d (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 15:30:38 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=0T9a35mm5XUD9Vbom7uySJgsvp5GUEUECVW/aGhcHSA=; b=Ar1jCBkhCcftKHJqkpj/87WevcX9d1XjloI0qDFmjRSB3k4lV+vP2+W+gcJC8SL/cdWHbGXsh7XuaHsu9eZNF1ml9/7w6d9AwG1mcS0QxHZrBf+PAtYXS753yOgckXYKBTWS90fmsdnScyjuVueNJLT4VGayD01u/iclxUOSZq0=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Wrajr-00057A-FN; Mon, 02 Jun 2014 22:29:55 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id E005F5802C1; Mon, 2 Jun 2014 18:29:54 -0400 (EDT) Date: Mon, 2 Jun 2014 18:29:54 -0400 From: Theodore Ts'o To: "H. Peter Anvin" Cc: Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602222954.GA29690@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , "H. Peter Anvin" , Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538CB085.5000502@zytor.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401748238 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6327 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, Jun 02, 2014 at 10:12:37AM -0700, H. Peter Anvin wrote: > > It would be problematic for time(2) or gettimeofday(2) to return > > TIME_UNDEFINED, since there are programs that care about time ticking > > forward, but I could imagine a new interface which would be permitted > > to return a flag indicating that we don't know the current time > > (because the CMOS battery had run down, etc.) so instead we're going > > to be counting the number of seconds since the system was booted. > > This assumes that we actually know that that is the case, which may be > an aggressive assumption. We won't know if the RTC clock is wrong, true --- but the kernel will know if (a) the hardware doesn't have RTC clock at all, or if (b) the RTC clock is ticking some time that can't be encoded using the current time_t type. So in that case, the fallback would be to be for the kernel to tick starting with time_t == 0 when the system is initially booted, and the "time indefinite flag" would be set. Now assume that we have a new system call, gettimestampofday(2), which returns a new timestamp structure which has a 64-bit ts_sec field, the ts_nsec field (ala struct timespec), and a ts_flags field, where the kernel could signal things like "time invalid", or "time can't be encoded in the legacy time_t type", or "I'm not sure if the time is correct" --- i.e., because the RTC battery isn't working. Not all hardware might be able to support the last, of course, but if the battery is low, or the system has been exposed to very low temperatures (or large amounts of cosmic radiation, etc.) the RTC time may just be plain wrong. No system is going to be perfect, but it should be possible to make htings better, at for certain classes of hardware. And since we are already returning (time_t) -1 in some cases, we might as well try to make things a bit more formal. - Ted From hpa@zytor.com Mon Jun 2 17:35:53 2014 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 7D83B7F54 for ; Mon, 2 Jun 2014 17:35:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F263AC007 for ; Mon, 2 Jun 2014 15:35:49 -0700 (PDT) X-ASG-Debug-ID: 1401748548-04cb6c100a14cf00001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id 9sBsRYtO1oyygCS6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 15:35:48 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from anacreon.sc.intel.com (fmdmzpr02-ext.fm.intel.com [192.55.55.37]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52MWeUQ024983 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 15:32:41 -0700 Message-ID: <538CFB83.20703@zytor.com> Date: Mon, 02 Jun 2014 15:32:35 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: "Theodore Ts'o" , Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> <20140602222954.GA29690@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140602222954.GA29690@thunk.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401748548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6327 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On 06/02/2014 03:29 PM, Theodore Ts'o wrote: > > And since we are already returning (time_t) -1 in some cases, we might > as well try to make things a bit more formal. > Are we? I am not aware of *Linux* actually using that. -hpa From tytso@thunk.org Mon Jun 2 18:32:42 2014 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 E80C37F54 for ; Mon, 2 Jun 2014 18:32:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66EC1AC002 for ; Mon, 2 Jun 2014 16:32:38 -0700 (PDT) X-ASG-Debug-ID: 1401751955-04cb6c1009158860001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id bhZhf2v9pgVbC85S (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 02 Jun 2014 16:32:36 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=vjUN2kYJtzcZcFomQ6ac87QTu2EfeRU1YFzK2l9gVaQ=; b=Y8+bFZBz+UdnKzHi/MsnT36ngyMgjcabqlQzB+5Eabm55eavLSjFW7zpVR6jXaDSHTzSFB9lQLUF/sP30fJ+4LM7pyVC01XtzKrEeKftWgRL+s1Zvl51QdrFlUhSjWcqo18Xi9pNSsaUn82NE+S/Q4TW3rg6dPe+9Djime5TwRc=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WrbiD-0005XP-TR; Mon, 02 Jun 2014 23:32:17 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 4A1A55802C1; Mon, 2 Jun 2014 19:32:12 -0400 (EDT) Date: Mon, 2 Jun 2014 19:32:12 -0400 From: Theodore Ts'o To: "H. Peter Anvin" Cc: Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140602233212.GA2060@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Mail-Followup-To: Theodore Ts'o , "H. Peter Anvin" , Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> <20140602222954.GA29690@thunk.org> <538CFB83.20703@zytor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538CFB83.20703@zytor.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401751956 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6328 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, Jun 02, 2014 at 03:32:35PM -0700, H. Peter Anvin wrote: > On 06/02/2014 03:29 PM, Theodore Ts'o wrote: > > > > And since we are already returning (time_t) -1 in some cases, we might > > as well try to make things a bit more formal. > > > > Are we? I am not aware of *Linux* actually using that. Linux's time(2) can return (time_t) -1 and set errno to EFAULT, per the Posix specification: SYSCALL_DEFINE1(time, time_t __user *, tloc) { time_t i = get_seconds(); if (tloc) { if (put_user(i,tloc)) return -EFAULT; } force_successful_syscall_return(); return i; } Cheers, - Ted From hpa@zytor.com Mon Jun 2 18:36:37 2014 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 6A5EA7F54 for ; Mon, 2 Jun 2014 18:36:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 139CDAC002 for ; Mon, 2 Jun 2014 16:36:37 -0700 (PDT) X-ASG-Debug-ID: 1401752195-04bdf059a04a3d50001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id Jk1Lt1ObaREMNJlF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Jun 2014 16:36:35 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from anacreon.sc.intel.com (jfdmzpr04-ext.jf.intel.com [134.134.137.73]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s52NXcEW009447 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 2 Jun 2014 16:33:39 -0700 Message-ID: <538D09CD.2080006@zytor.com> Date: Mon, 02 Jun 2014 16:33:33 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: "Theodore Ts'o" , Chuck Lever , Arnd Bergmann , Nicolas Pitre , Dave Chinner , LKML Kernel , linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, Christoph Hellwig , tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel , xfs@oss.sgi.com, Linux NFS Mailing List Subject: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> <20140602222954.GA29690@thunk.org> <538CFB83.20703@zytor.com> <20140602233212.GA2060@thunk.org> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140602233212.GA2060@thunk.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401752195 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On 06/02/2014 04:32 PM, Theodore Ts'o wrote: > On Mon, Jun 02, 2014 at 03:32:35PM -0700, H. Peter Anvin wrote: >> On 06/02/2014 03:29 PM, Theodore Ts'o wrote: >>> >>> And since we are already returning (time_t) -1 in some cases, we might >>> as well try to make things a bit more formal. >>> >> >> Are we? I am not aware of *Linux* actually using that. > > Linux's time(2) can return (time_t) -1 and set errno to EFAULT, per > the Posix specification: > > SYSCALL_DEFINE1(time, time_t __user *, tloc) > { > time_t i = get_seconds(); > > if (tloc) { > if (put_user(i,tloc)) > return -EFAULT; > } > force_successful_syscall_return(); > return i; > } > OK, I guess I should have said... other than for -EFAULT. I just don't know of anyone using time(2) with an argument other than NULL. -hpa From david@fromorbit.com Mon Jun 2 18:41:47 2014 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 A7C1F7F54 for ; Mon, 2 Jun 2014 18:41:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7598030404E for ; Mon, 2 Jun 2014 16:41:44 -0700 (PDT) X-ASG-Debug-ID: 1401752500-04bdf059a14a5560001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id moN4sN7B0bSl2rOq for ; Mon, 02 Jun 2014 16:41:40 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Atd1AHUKjVN5LL1sPGdsb2JhbABZgwdSgnOoFwEBAQEBAQaYGwGBDxcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hB0CQXFoU/iH0HhEAEmX+WeCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Jun 2014 09:11:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrbrE-0007Ay-1F; Tue, 03 Jun 2014 09:41:36 +1000 Date: Tue, 3 Jun 2014 09:41:36 +1000 From: Dave Chinner To: Martin Papik Cc: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect Message-ID: <20140602234135.GO6677@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect References: <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538C5E67.6090005@gmail.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: 1401752500 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jun 02, 2014 at 02:22:15PM +0300, Martin Papik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > > >> How can I detect this situation? I mean I didn't see anything in > >> /proc/mounts or references to the mount point from /proc//*, > >> so I only managed to correct it (chdir elsewhere) by chance on a > >> hunch. Would it not be desirable to know that there's a phantom > >> FS referenced by a number of processes? > > > > lsof. > > No good. lsof reports such things as belonging to / because it can't find the correct path for them. Indeed, you can't find them by filtering on mount point, file or anything else. But they are there. e.g: $ sudo mount /dev/vdc /mnt/scratch $ cd /mnt/scratch $ sudo umount -l /mnt/scratch $ sleep 300 $ cd ~ $ ps -ef |grep [s]leep dave 16341 7432 0 09:27 pts/1 00:00:00 sleep 300 $ sudo lsof |grep sleep sleep 16341 dave cwd DIR 253,32 6 96 / sleep 16341 dave rtd DIR 8,1 4096 2 / sleep 16341 dave txt REG 8,1 31208 32607 /bin/sleep sleep 16341 dave mem REG 8,1 1742520 245384 /lib/x86_64-linux-gnu/libc-2.17.so sleep 16341 dave mem REG 8,1 145160 245381 /lib/x86_64-linux-gnu/ld-2.17.so sleep 16341 dave mem REG 8,1 1607584 98063 /usr/lib/locale/locale-archive sleep 16341 dave 0u CHR 136,1 0t0 4 /dev/pts/1 sleep 16341 dave 1u CHR 136,1 0t0 4 /dev/pts/1 sleep 16341 dave 2u CHR 136,1 0t0 4 /dev/pts/1 See the first two DIR lines? They have different devices but the same path (/). That's what you need to look for - the non-root device with a root path - in this case 253,32: $ ls -l /dev/vdc brw-rw---- 1 root disk 253, 32 Jun 3 09:01 /dev/vdc $ With this knowledge, the simple way: $ sudo lsof |grep "253,32" bash 7432 dave cwd DIR 253,32 6 96 / sleep 16341 dave cwd DIR 253,32 6 96 / There's the two processes holding references to the unmounted filesystem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jun 2 19:33:09 2014 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 419C57F54 for ; Mon, 2 Jun 2014 19:33:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D8208F8070 for ; Mon, 2 Jun 2014 17:33:05 -0700 (PDT) X-ASG-Debug-ID: 1401755579-04cb6c1009163180001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qRteJLvk2WqYpR0D for ; Mon, 02 Jun 2014 17:33:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgV3AE4XjVN5LL1sPGdsb2JhbABZgwdSgnOoFwEBAQEBAQaHGVyQJgGBDxcDAQEBATg1giUBAQQBJxMcIwULCAMYCSUPBSUDBxoTiDoH0E4WhT+INEkHhEAEmX+BP4ldgiKJOiuBMAEBHgQC Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Jun 2014 10:02:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrceR-0007HN-60; Tue, 03 Jun 2014 10:32:27 +1000 Date: Tue, 3 Jun 2014 10:32:27 +1000 From: Dave Chinner To: Arnd Bergmann Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140603003227.GP6677@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140601002437.GL14410@dastard> <20140602002822.GQ14410@dastard> <7106937.MLk03lftzD@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7106937.MLk03lftzD@wuerfel> 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: 1401755579 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jun 02, 2014 at 01:43:44PM +0200, Arnd Bergmann wrote: > On Monday 02 June 2014 10:28:22 Dave Chinner wrote: > > On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > > > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > > > In my list at http://kernelnewbies.org/y2038, I found that almost > > > > all file systems at least times until 2106, because they treat > > > > the on-disk value as unsigned on 64-bit systems, or they use > > > > a completely different representation. My guess is that somebody > > > > earlier spent a lot of work on making that happen. > > > > > > > > The exceptions are: > > > > > > > > * exofs uses signed values, which can probably be changed to be > > > > consistent with the others. > > > > * isofs has a bug that limits it until 2027 on architectures with > > > > a signed 'char' type (otherwise it's 2155). > > > > * udf can represent times for many thousands of years through a > > > > 16-bit year representation, but the code to convert to epoch > > > > uses a const array that ends at 2038. > > > > * afs uses signed seconds and can probably be fixed > > > > * coda relies on user space time representation getting passed > > > > through an ioctl. > > > > * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, > > > > where they really use signed. > > > > > > > > I was confused about XFS since I didn't noticed that there are > > > > separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected > > > > XFS to also use the 1970-2106 time range on 64-bit systems today. > > > > > > You've missed an awful lot more than just the implications for the > > > core kernel code. > > > > > > There's a good chance such changes propagate to APIs elsewhere in > > > the filesystems, because something you haven't realised is that XFS > > > effectively exposes the on-disk timestamp format directly to > > > userspace via the bulkstat interface (see struct xfs_bstat). It also > > > affects the XFS open-by-handle ioctl and the swap extent ioctl used > > > by the online defragmenter. > > I really didn't look at them at all, as ioctl is very late on my > mental list of things to change. I do realize that a lot of drivers > and file systems do have ioctls that pass time values and we need to > address them one by one. > > I just looked at the ioctls you mentioned but don't see how open-by-handle > is affected by this. Can you point me to what you mean? Sorry, I misremembered how some of the XFS open-by-handle code works in userspace (XFS has a pretty rich open-by-handle ioctl() interface that predates the kernel syscalls by at least 10 years). Basically there is code in userspace that uses the information returned from bulkstat to construct file handles to pass to the open-by-handle ioctls. xfs_fsr then uses the combination of open-by-handle from the bulkstat output and the bulkstat output to feed into the swap extent ioctls.... i.e. the filesystem's idea of what time is is passed to userspace as an opaque cookie in this case, but it is not used directly by the open-by-handle interfaces like I implied it was. > > Just to put that in context, here's the kernel patch to add extended > > epoch support to XFS. It's completely untested as I haven't done any > > userspace code changes to enable the feature. However, it should > > give you an indication of how far the simple act of changing the > > kernel time representation spread through the filesystem. This does > > not include any of the VFS infrastructure to specifying the range of > > supported timestamps. It survives some smoke testing, but dies when > > the online defragmenter starts using the bulkstat and swap extent > > ioctls (the assert in xfs_inode_time_from_epoch() fires), so I > > probably don't have that all sorted correctly yet... > > > > To test extended epoch support, however, I need to some fstests that > > define and validate the behaviour of the new syscalls - until we get > > those we can't validate that the filesystem follows the spec > > properly. I also suspect we are going to need an interface to query > > the supported range of timestamps from a filesystem so that we can > > test boundary conditions in an automated fashion.... > > Thanks a lot for having an initial look at this yourself! > > I'd still consider the two problems largely orthogonal. Depends how you look at it. You can't extend the kernel's idea of time without permanent storage being able to specify the supported bounds - that's a non-negotiable aspect of introducing extended epoch timestamp support. The actual addition of extended timestamp support to each individual filesystem is orthoganol to the introduction of the struct inode_time, but doing this addition properly is dependent on the VFS infrastructure being there in the first place. > My patch set > (at least with the 64-bit tv_sec) just gets 32-bit kernels to behave > more like 64-bit kernels regarding inode time stamps, which does > impact all the file systems that the a 64-bit time or the NFS > unsigned epoch (1970-2106), while your patch extends the file > system internal epoch (1901-2038 for XFS) so it can be used by > anything that knows how to handle larger than 32-bit second values > (either 64-bit kernel or 32-bit with inode_time patch). Right, but the issue is that 64 bit second counters are broken right now because most filesystems can't support more than 32 bit values. So it doesn't matter whether it's 32 bit or 64 bit machines, just adding explicit support for >32 bit second counters without doing anything else just extends that brokenness into the indefinite future. If we don't fix it now (i.e in the new user API and supporting infrastructure), then we'll *never be able to fix it* and we'll be stuck with timestamps that do really weird things when you pass arbitrary future dates to the kernel. > > diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h > > index 623bbe8..79f94722 100644 > > --- a/fs/xfs/xfs_dinode.h > > +++ b/fs/xfs/xfs_dinode.h > > @@ -21,11 +21,53 @@ > > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > > #define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) > > > > +/* > > + * Inode timestamps get more complex when we consider supporting times beyond > > + * the standard unix epoch of Jan 2038. The struct xfs_timestamp cannot support > > + * more than a single extension by playing sign games, and that is still not > > + * reliable. We also can't extend the timestamp structure because there is no > > + * free space around them in the on-disk inode. > > + * > > + * Hence the simplest thing to do is to add an epoch counter for each timestamp > > + * in the inode. This can be a single byte for each timestamp and make use of > > + * a hole we currently pad. This gives us another 255 epochs range for the > > + * timestamps, but requires a superblock feature bit to indicate that these > > + * fields have meaning and can be non-zero. > > Nice trick! It's a pretty common way of extending the range of a variable for on-disk formats. The on-disk format is completely disconnected from the in-memory representation, so it's "easy" to play games like this within the on-disk format. If you look closely at ext4, you'll see all the lo/hi variables where extension of 16->32 bits or 32->48 bits has occurred from the ext2/3 variable formats... ;) > > > +static inline __uint8_t > > +xfs_timestamp_epoch( > > + struct timespec *time) > > +{ > > + /* will be zero until the extended struct inode_time is introduced */ > > + return 0; > > +} > > + > > +static inline __int32_t > > +xfs_timestamp_sec( > > + struct timespec *time) > > +{ > > + return time->tv_sec; > > +} > > + > > +static inline __kernel_time_t > > +xfs_inode_time_from_epoch( > > + __uint8_t epoch, > > + __int32_t seconds) > > +{ > > + /* need to handle non-zero epoch when struct inode_time is introduced */ > > + ASSERT(epoch == 0); > > + return seconds; > > +} > > Why don't you already implement epoch conversion for 64-bit kernels that > are able to represent the time today? Because I wasn't trying to solve the entire problem, just demonstrate the infrastructure needed to support extended timestamps..... > This is how ext4 does it (I mean > the sizeof() trick, not the bit stuffing they do): .... > I guess if there is general agreement on introducing 'struct inode_time', > we can skip that intermediate step. Also, I don't like the concept of having filesystems that will work on 64 bit but not 32 bit machines. Over the past 10 years, we've managed to remove most of those differences from the VFS and XFS, so adding new distinctions between 32/64 bit machines is not the direction I want to head in. As it is, I'm expecting to do this only after the struct inode_time and the superblock "time range" infrastructure have been added to the kernel and VFS. If that change is not made, then we've still only got 32 bit time.... > > @@ -509,8 +509,11 @@ xfs_sb_has_ro_compat_feature( > > } > > > > #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ > > +#define XFS_SB_FEAT_INCOMPAT_EPOCH (1 << 1) /* Time beyond 2038 */ > > #define XFS_SB_FEAT_INCOMPAT_ALL \ > > - (XFS_SB_FEAT_INCOMPAT_FTYPE) > > + (XFS_SB_FEAT_INCOMPAT_FTYPE | \ > > + XFS_SB_FEAT_INCOMPAT_EPOCH | \ > > + 0) > > > > #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL > > How does this flag get set? mkfs.xfs > Do you have to manually change it in the > superblock? Since most of the time I'd suspect you wouldn't actually > use it for the foreseeable future, would it make sense to have a mount > option that allows it to be set, but doesn't actually change the > superblock until the first inode gets written with a nonzero epoch? Yes, we could set the flag on the first timestamp that goes beyond the current epoch, but that has two problems: 1. filesystem silently becomes incompatible with older kernels so failed upgrade rollbacks become problematic; and 2. It adds unecessary complexity, as this will end up being the default behaviour for all new filesystems within a year. Then we end up with a mount option and conversion functions that never get used but we have to support for years.... > That way, you'd still be able to mount it with an older kernel but > also be forward compatible with time moving on. We've got plenty of time to roll this out so I don't see any need for putting in place temporary support mechanisms that unnecessarily complicate the code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From arnd@arndb.de Tue Jun 3 02:35:20 2014 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 E3B1A7F54 for ; Tue, 3 Jun 2014 02:35:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C068B8F80DC for ; Tue, 3 Jun 2014 00:35:20 -0700 (PDT) X-ASG-Debug-ID: 1401780918-04cbb050fc2b5a20001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) by cuda.sgi.com with ESMTP id cRKKGxXQnQ3P5NnC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 00:35:18 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.131 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue005) with ESMTP (Nemesis) id 0LouSd-1WL7IQ2II7-00gne1; Tue, 03 Jun 2014 09:33:37 +0200 From: Arnd Bergmann To: Dave Chinner Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Tue, 03 Jun 2014 09:33:36 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5082342.alZgfaU1Q0@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140603003227.GP6677@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <7106937.MLk03lftzD@wuerfel> <20140603003227.GP6677@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:ltmn9eYkxHyp7mS/qIRURiziPLZp0P/Qur7D94DU6Zm 4ijjSj7hkfOTSeqenwknoXosIIIM2/7gZRvUmq1TCEuZyEPFsq YUv1MDuAAtRc0fHXxCjfNi6J08AbYqkOPZJa0wHuNy9FEFtmPe wwDkatFJReDhBtNpVTbeuxtOh3hj9O84XVXRPPiVzc1SLWbmTH N1ZDf2dNQ8sFxU1lQlI+FoVoVO8As3qanqoc5Wvdem7JBwW94y INsGrsDzF6Kv8PlabwPK9lw3qtYgfauS+lo7IDUZ6AAyF7UelE IlptEA5+UI85H2P+RLK8tg5l59IZ6k8iblavk92lBaEJZP0lNP Cgz7ipfNTnIJtdD2mdGs= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.131] X-Barracuda-Start-Time: 1401780918 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tuesday 03 June 2014 10:32:27 Dave Chinner wrote: > On Mon, Jun 02, 2014 at 01:43:44PM +0200, Arnd Bergmann wrote: > > On Monday 02 June 2014 10:28:22 Dave Chinner wrote: > > > On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > > > > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > > > > In my list at http://kernelnewbies.org/y2038, I found that almost > > > > > all file systems at least times until 2106, because they treat > > > > > the on-disk value as unsigned on 64-bit systems, or they use > > > > > a completely different representation. My guess is that somebody > > > > > earlier spent a lot of work on making that happen. > > > > > > > > > > The exceptions are: > > > > > > > > > > * exofs uses signed values, which can probably be changed to be > > > > > consistent with the others. > > > > > * isofs has a bug that limits it until 2027 on architectures with > > > > > a signed 'char' type (otherwise it's 2155). > > > > > * udf can represent times for many thousands of years through a > > > > > 16-bit year representation, but the code to convert to epoch > > > > > uses a const array that ends at 2038. > > > > > * afs uses signed seconds and can probably be fixed > > > > > * coda relies on user space time representation getting passed > > > > > through an ioctl. > > > > > * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, > > > > > where they really use signed. > > > > > > > > > > I was confused about XFS since I didn't noticed that there are > > > > > separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected > > > > > XFS to also use the 1970-2106 time range on 64-bit systems today. > > > > > > > > You've missed an awful lot more than just the implications for the > > > > core kernel code. > > > > > > > > There's a good chance such changes propagate to APIs elsewhere in > > > > the filesystems, because something you haven't realised is that XFS > > > > effectively exposes the on-disk timestamp format directly to > > > > userspace via the bulkstat interface (see struct xfs_bstat). It also > > > > affects the XFS open-by-handle ioctl and the swap extent ioctl used > > > > by the online defragmenter. > > > > I really didn't look at them at all, as ioctl is very late on my > > mental list of things to change. I do realize that a lot of drivers > > and file systems do have ioctls that pass time values and we need to > > address them one by one. > > > > I just looked at the ioctls you mentioned but don't see how open-by-handle > > is affected by this. Can you point me to what you mean? > > Sorry, I misremembered how some of the XFS open-by-handle code works > in userspace (XFS has a pretty rich open-by-handle ioctl() interface > that predates the kernel syscalls by at least 10 years). Basically > there is code in userspace that uses the information returned from > bulkstat to construct file handles to pass to the open-by-handle > ioctls. xfs_fsr then uses the combination of open-by-handle from the > bulkstat output and the bulkstat output to feed into the swap extent > ioctls.... > > i.e. the filesystem's idea of what time is is passed to userspace as > an opaque cookie in this case, but it is not used directly by the > open-by-handle interfaces like I implied it was. Ok, I see. > > My patch set > > (at least with the 64-bit tv_sec) just gets 32-bit kernels to behave > > more like 64-bit kernels regarding inode time stamps, which does > > impact all the file systems that the a 64-bit time or the NFS > > unsigned epoch (1970-2106), while your patch extends the file > > system internal epoch (1901-2038 for XFS) so it can be used by > > anything that knows how to handle larger than 32-bit second values > > (either 64-bit kernel or 32-bit with inode_time patch). > > Right, but the issue is that 64 bit second counters are broken right > now because most filesystems can't support more than 32 bit values. > So it doesn't matter whether it's 32 bit or 64 bit machines, just > adding explicit support for >32 bit second counters without doing > anything else just extends that brokenness into the indefinite > future. Of course, "most filesystems" are obsolete, and most of the modern file systems already support >32 bit timestamps: ext4, btrfs, cifs, f2fs, 9p, nfsv4, ntfs, gfs2, ocfs2, fuse, ufs2. Everything else except xfs, ext2/3 and exofs uses the nfsv3 interpretation on 64-bit systems, which interprets time stamps with the high bit set as years 2038-2106 rather than 1903-1969. > If we don't fix it now (i.e in the new user API and supporting > infrastructure), then we'll *never be able to fix it* and we'll be > stuck with timestamps that do really weird things when you pass > arbitrary future dates to the kernel. We already have that. I agree it's fixable and we should fix it, but I don't see how this is different from what we had 20 years ago when Linux on Alpha first introduced a 64-bit time_t. It's been this way on every 64-bit Linux system since. > > This is how ext4 does it (I mean > > the sizeof() trick, not the bit stuffing they do): > .... > > I guess if there is general agreement on introducing 'struct inode_time', > > we can skip that intermediate step. > > Also, I don't like the concept of having filesystems that will work > on 64 bit but not 32 bit machines. Over the past 10 years, we've > managed to remove most of those differences from the VFS and XFS, > so adding new distinctions between 32/64 bit machines is not the > direction I want to head in. > > As it is, I'm expecting to do this only after the struct inode_time > and the superblock "time range" infrastructure have been added to > the kernel and VFS. If that change is not made, then we've still > only got 32 bit time.... Ok. > > Do you have to manually change it in the > > superblock? Since most of the time I'd suspect you wouldn't actually > > use it for the foreseeable future, would it make sense to have a mount > > option that allows it to be set, but doesn't actually change the > > superblock until the first inode gets written with a nonzero epoch? > > Yes, we could set the flag on the first timestamp that goes beyond > the current epoch, but that has two problems: > > 1. filesystem silently becomes incompatible with older > kernels so failed upgrade rollbacks become problematic; and > > 2. It adds unecessary complexity, as this will end up being > the default behaviour for all new filesystems within a year. > Then we end up with a mount option and conversion functions > that never get used but we have to support for years.... > > > That way, you'd still be able to mount it with an older kernel but > > also be forward compatible with time moving on. > > We've got plenty of time to roll this out so I don't see any need > for putting in place temporary support mechanisms that unnecessarily > complicate the code. Ok, fair enough. Arnd From david@fromorbit.com Tue Jun 3 03:41:38 2014 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 A16FE7F54 for ; Tue, 3 Jun 2014 03:41:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 716EC8F8162 for ; Tue, 3 Jun 2014 01:41:35 -0700 (PDT) X-ASG-Debug-ID: 1401784892-04cbb050fd2bc320001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id x8FVXdxmQ6uxai2p for ; Tue, 03 Jun 2014 01:41:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AodxALeJjVN5LL1sPGdsb2JhbABZgweDRYUIoxQBAgaYGwGBCxcDAQEBATg1giUBAQQBOhwjEAgDGAklDwUlAwcaE4g6B9E7FxaFP4h9B4MrgRUEmX+LHItcKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Jun 2014 18:11:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrkHi-0008JG-6A; Tue, 03 Jun 2014 18:41:30 +1000 Date: Tue, 3 Jun 2014 18:41:30 +1000 From: Dave Chinner To: Arnd Bergmann Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140603084130.GF14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <7106937.MLk03lftzD@wuerfel> <20140603003227.GP6677@dastard> <5082342.alZgfaU1Q0@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5082342.alZgfaU1Q0@wuerfel> 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: 1401784892 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6338 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jun 03, 2014 at 09:33:36AM +0200, Arnd Bergmann wrote: > On Tuesday 03 June 2014 10:32:27 Dave Chinner wrote: > > On Mon, Jun 02, 2014 at 01:43:44PM +0200, Arnd Bergmann wrote: > > > On Monday 02 June 2014 10:28:22 Dave Chinner wrote: > > > > On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > > > > > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > > My patch set > > > (at least with the 64-bit tv_sec) just gets 32-bit kernels to behave > > > more like 64-bit kernels regarding inode time stamps, which does > > > impact all the file systems that the a 64-bit time or the NFS > > > unsigned epoch (1970-2106), while your patch extends the file > > > system internal epoch (1901-2038 for XFS) so it can be used by > > > anything that knows how to handle larger than 32-bit second values > > > (either 64-bit kernel or 32-bit with inode_time patch). > > > > Right, but the issue is that 64 bit second counters are broken right > > now because most filesystems can't support more than 32 bit values. > > So it doesn't matter whether it's 32 bit or 64 bit machines, just > > adding explicit support for >32 bit second counters without doing > > anything else just extends that brokenness into the indefinite > > future. > > Of course, "most filesystems" are obsolete, and most of the modern > file systems already support >32 bit timestamps: ext4, btrfs, cifs, > f2fs, 9p, nfsv4, ntfs, gfs2, ocfs2, fuse, ufs2. Everything else > except xfs, ext2/3 and exofs uses the nfsv3 interpretation on > 64-bit systems, which interprets time stamps with the high bit > set as years 2038-2106 rather than 1903-1969. I'm not sure that's an entirely correct representation - the remainder of the 32 bit-only timestamp filesystems don't actively interpret the time stamp at all - it's just an opaque 32 bit value. hence the interpretation of the value is dependent on whether the kernel treats it as signed or unsigned.... > > infrastructure), then we'll *never be able to fix it* and we'll be > > stuck with timestamps that do really weird things when you pass > > arbitrary future dates to the kernel. > > We already have that. I agree it's fixable and we should fix it, > but I don't see how this is different from what we had 20 years > ago when Linux on Alpha first introduced a 64-bit time_t. It's > been this way on every 64-bit Linux system since. I see it differently: we've got 20 years more experience than when the 64 bit time_t was introduced. That experience tells us that best practices for API design are to range check every input to prevent unintended side effects from occurring due to out-of-range data.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Jun 3 04:18:00 2014 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 0A57C7F54 for ; Tue, 3 Jun 2014 04:18:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C03A78F8068 for ; Tue, 3 Jun 2014 02:17:59 -0700 (PDT) X-ASG-Debug-ID: 1401787077-04bdf059a14dd5d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id BYCLMLUzjSx8xogA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:17:58 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539HuGB027241 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:17:57 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539HuQX024728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Tue, 3 Jun 2014 09:17:56 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539HuQa024714 for ; Tue, 3 Jun 2014 09:17:56 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:17:55 -0700 Message-ID: <538D92BE.6040505@oracle.com> Date: Tue, 03 Jun 2014 17:17:50 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787078 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Remove the redundant BULKSTAT_RV_NOTHING assignment in case of call xfs_iget() failed at xfs_bulkstat_one_int(). Reviewed-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index cb64f22..2e7b397 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -76,10 +76,8 @@ xfs_bulkstat_one_int( error = xfs_iget(mp, NULL, ino, (XFS_IGET_DONTCACHE | XFS_IGET_UNTRUSTED), XFS_ILOCK_SHARED, &ip); - if (error) { - *stat = BULKSTAT_RV_NOTHING; + if (error) goto out_free; - } ASSERT(ip != NULL); ASSERT(ip->i_imap.im_blkno != 0); @@ -136,7 +134,6 @@ xfs_bulkstat_one_int( IRELE(ip); error = formatter(buffer, ubsize, ubused, buf); - if (!error) *stat = BULKSTAT_RV_DIDONE; -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:02 2014 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 E94FE7F58 for ; Tue, 3 Jun 2014 04:18:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB728304053 for ; Tue, 3 Jun 2014 02:17:59 -0700 (PDT) X-ASG-Debug-ID: 1401787074-04bdf059a04dd5b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id l9YxvvGhtDOeCKCm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:17:54 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539HrTg011410 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:17:53 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s539HqCF011930 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:17:53 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s539HoRW011845 for ; Tue, 3 Jun 2014 09:17:51 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:17:49 -0700 Message-ID: <538D92B6.5050402@oracle.com> Date: Tue, 03 Jun 2014 17:17:42 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1401787074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folk, This is the revised patches for xfs_ioc_bulkstat consolidation and code refactoring. As per Christoph's comments, I'm not include the per AG inumber patch in this series given that I don't actually introduce the relevant inumbers interface now. Similar to that reason, I also dropped the per AG bulkstat patch, it would be included in parallel quota check series. v3->v2: - one major bug fix is at xfs_bulkstat_ag_ichunk() regarding the user buffer pointer operations, it should be defined as a pointer-to-pointer since it would be updated inside xfs_bulkstat_ag_ichunk(). - separate xfs_inumber consolidate patch into two patches, the first one fix the formater function return value and consolidate the codes, another one does the actual logic changes for better error handling. - Add a separate patch to get rid of the redundant user buffer count checks at xfs_bulkstat() - fixed agino calculation issue at xfs_bulkstat_grab_ichunk(). v2: http://oss.sgi.com/archives/xfs/2014-04/msg00554.html v1: http://oss.sgi.com/archives/xfs/2013-12/msg00901.html Any comments are welcome! Cheers, -Jeff From jeff.liu@oracle.com Tue Jun 3 04:18:13 2014 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 4D77D7F54 for ; Tue, 3 Jun 2014 04:18:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1CCDAC003 for ; Tue, 3 Jun 2014 02:18:09 -0700 (PDT) X-ASG-Debug-ID: 1401787087-04cb6c100918f650001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 98zPSSfiqoDSFJId (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:08 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539I7xY027649 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:07 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s539I6cb012623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:06 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539I5B7013759 for ; Tue, 3 Jun 2014 09:18:05 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:05 -0700 Message-ID: <538D92CA.9090604@oracle.com> Date: Tue, 03 Jun 2014 17:18:02 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 02/10] xfs: remove xfs_bulkstat_single Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 02/10] xfs: remove xfs_bulkstat_single Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787088 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig xfs_bukstat_one doesn't have any failure case that would go away when called through xfs_bulkstat, so remove the fallback and the now unessecary xfs_bulkstat_single function. Reviewed-by: Jie Liu Signed-off-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_ioctl.c | 4 ++-- fs/xfs/xfs_itable.c | 48 ------------------------------------------------ fs/xfs/xfs_itable.h | 7 ------- 3 files changed, 2 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 55724c8..eb5a366 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -799,8 +799,8 @@ xfs_ioc_bulkstat( error = xfs_inumbers(mp, &inlast, &count, bulkreq.ubuffer, xfs_inumbers_fmt); else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) - error = xfs_bulkstat_single(mp, &inlast, - bulkreq.ubuffer, &done); + error = xfs_bulkstat_one(mp, inlast, bulkreq.ubuffer, + sizeof(xfs_bstat_t), NULL, &done); else /* XFS_IOC_FSBULKSTAT */ error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, sizeof(xfs_bstat_t), bulkreq.ubuffer, diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 2e7b397..4d62e63 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -509,54 +509,6 @@ xfs_bulkstat( return rval; } -/* - * Return stat information in bulk (by-inode) for the filesystem. - * Special case for non-sequential one inode bulkstat. - */ -int /* error status */ -xfs_bulkstat_single( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t *lastinop, /* inode to return */ - char __user *buffer, /* buffer with inode stats */ - int *done) /* 1 if there are more stats to get */ -{ - int count; /* count value for bulkstat call */ - int error; /* return value */ - xfs_ino_t ino; /* filesystem inode number */ - int res; /* result from bs1 */ - - /* - * note that requesting valid inode numbers which are not allocated - * to inodes will most likely cause xfs_imap_to_bp to generate warning - * messages about bad magic numbers. This is ok. The fact that - * the inode isn't actually an inode is handled by the - * error check below. Done this way to make the usual case faster - * at the expense of the error case. - */ - - ino = *lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - NULL, &res); - if (error) { - /* - * Special case way failed, do it the "long" way - * to see if that works. - */ - (*lastinop)--; - count = 1; - if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - sizeof(xfs_bstat_t), buffer, done)) - return error; - if (count == 0 || (xfs_ino_t)*lastinop != ino) - return error == EFSCORRUPTED ? - XFS_ERROR(EINVAL) : error; - else - return 0; - } - *done = 0; - return 0; -} - int xfs_inumbers_fmt( void __user *ubuffer, /* buffer to write to */ diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 97295d9..6ea8b39 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -50,13 +50,6 @@ xfs_bulkstat( char __user *ubuffer,/* buffer with inode stats */ int *done); /* 1 if there are more stats to get */ -int -xfs_bulkstat_single( - xfs_mount_t *mp, - xfs_ino_t *lastinop, - char __user *buffer, - int *done); - typedef int (*bulkstat_one_fmt_pf)( /* used size in bytes or negative error */ void __user *ubuffer, /* buffer to write to */ int ubsize, /* remaining user buffer sz */ -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:15 2014 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 D66507F62 for ; Tue, 3 Jun 2014 04:18:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B69B630404E for ; Tue, 3 Jun 2014 02:18:15 -0700 (PDT) X-ASG-Debug-ID: 1401787094-04cbb050fc2bfdf0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id bVUlBrDacXCXg68i (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:14 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539ICKc027891 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:13 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539ICmW014118 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:12 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IChm014113 for ; Tue, 3 Jun 2014 09:18:12 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:11 -0700 Message-ID: <538D92D0.4060806@oracle.com> Date: Tue, 03 Jun 2014 17:18:08 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 03/10] xfs: consolidate xfs_inumbers Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 03/10] xfs: consolidate xfs_inumbers Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787094 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Consolidate xfs_inumbers() to make the formatter function return correct error and make the source code looks a bit neat. Signed-off-by: Jie Liu --- fs/xfs/xfs_ioctl32.c | 4 +-- fs/xfs/xfs_itable.c | 71 ++++++++++++++++++++++++---------------------------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 944d5ba..8080a2e 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -102,7 +102,7 @@ xfs_compat_growfs_rt_copyin( STATIC int xfs_inumbers_fmt_compat( void __user *ubuffer, - const xfs_inogrp_t *buffer, + const struct xfs_inogrp *buffer, long count, long *written) { @@ -113,7 +113,7 @@ xfs_inumbers_fmt_compat( if (put_user(buffer[i].xi_startino, &p32[i].xi_startino) || put_user(buffer[i].xi_alloccount, &p32[i].xi_alloccount) || put_user(buffer[i].xi_allocmask, &p32[i].xi_allocmask)) - return -XFS_ERROR(EFAULT); + return XFS_ERROR(EFAULT); } *written = count * sizeof(*p32); return 0; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 4d62e63..dd68696 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -512,12 +512,12 @@ xfs_bulkstat( int xfs_inumbers_fmt( void __user *ubuffer, /* buffer to write to */ - const xfs_inogrp_t *buffer, /* buffer to read from */ + const struct xfs_inogrp *buffer, /* buffer to read from */ long count, /* # of elements to read */ long *written) /* # of bytes written */ { if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) - return -EFAULT; + return XFS_ERROR(EFAULT); *written = count * sizeof(*buffer); return 0; } @@ -527,37 +527,33 @@ xfs_inumbers_fmt( */ int /* error status */ xfs_inumbers( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t *lastino, /* last inode returned */ - int *count, /* size of buffer/count returned */ - void __user *ubuffer,/* buffer with inode descriptions */ - inumbers_fmt_pf formatter) + struct xfs_mount *mp,/* mount point for filesystem */ + xfs_ino_t *lastino,/* last inode returned */ + int *count,/* size of buffer/count returned */ + void __user *ubuffer,/* buffer with inode descriptions */ + inumbers_fmt_pf formatter) { - xfs_buf_t *agbp; - xfs_agino_t agino; - xfs_agnumber_t agno; - int bcount; - xfs_inogrp_t *buffer; - int bufidx; - xfs_btree_cur_t *cur; - int error; - xfs_inobt_rec_incore_t r; - int i; - xfs_ino_t ino; - int left; - int tmp; - - ino = (xfs_ino_t)*lastino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); - left = *count; + xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, *lastino); + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, *lastino); + struct xfs_btree_cur *cur = NULL; + xfs_buf_t *agbp = NULL; + struct xfs_inogrp *buffer; + int bcount; + int left = *count; + int bufidx = 0; + int error = 0; + *count = 0; + if (agno >= mp->m_sb.sb_agcount || + *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) + return error; + bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); - error = bufidx = 0; - cur = NULL; - agbp = NULL; while (left > 0 && agno < mp->m_sb.sb_agcount) { + struct xfs_inobt_rec_incore r; + int stat; + if (agbp == NULL) { error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) { @@ -574,7 +570,7 @@ xfs_inumbers( cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, - &tmp); + &stat); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); cur = NULL; @@ -589,8 +585,8 @@ xfs_inumbers( continue; } } - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error || stat == 0) { xfs_buf_relse(agbp); agbp = NULL; xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); @@ -609,16 +605,15 @@ xfs_inumbers( left--; if (bufidx == bcount) { long written; - if (formatter(ubuffer, buffer, bufidx, &written)) { - error = XFS_ERROR(EFAULT); + error = formatter(ubuffer, buffer, bufidx, &written); + if (error) break; - } ubuffer += written; *count += bufidx; bufidx = 0; } if (left) { - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); cur = NULL; @@ -636,9 +631,9 @@ xfs_inumbers( if (!error) { if (bufidx) { long written; - if (formatter(ubuffer, buffer, bufidx, &written)) - error = XFS_ERROR(EFAULT); - else + + error = formatter(ubuffer, buffer, bufidx, &written); + if (!error) *count += bufidx; } *lastino = XFS_AGINO_TO_INO(mp, agno, agino); -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:23 2014 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 27C637F69 for ; Tue, 3 Jun 2014 04:18:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE5548F804B for ; Tue, 3 Jun 2014 02:18:22 -0700 (PDT) X-ASG-Debug-ID: 1401787101-04bdf0599f4dd650001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id TGHIDNbLfwEO4GiT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:21 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539IJZu028180 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:20 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IJAs011500 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:19 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IJiA011494 for ; Tue, 3 Jun 2014 09:18:19 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:18 -0700 Message-ID: <538D92D7.8000401@oracle.com> Date: Tue, 03 Jun 2014 17:18:15 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 04/10] xfs: fix error handling at xfs_inumbers Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 04/10] xfs: fix error handling at xfs_inumbers Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787101 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu To fetch the file system number tables, we currently just ignore the errors and proceed to loop over the next AG or bump agino to the next chunk in case of btree operations failed, that is not properly because those errors might hint us potential file system problems. This patch rework xfs_inumbers() to handle the btree operation errors as well as the loop conditions. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 91 ++++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 54 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index dd68696..693e787 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -550,61 +550,40 @@ xfs_inumbers( bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); - while (left > 0 && agno < mp->m_sb.sb_agcount) { + do { struct xfs_inobt_rec_incore r; int stat; - if (agbp == NULL) { + if (!agbp) { error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); - if (error) { - /* - * If we can't read the AGI of this ag, - * then just skip to the next one. - */ - ASSERT(cur == NULL); - agbp = NULL; - agno++; - agino = 0; - continue; - } + if (error) + break; + cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, &stat); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - cur = NULL; - xfs_buf_relse(agbp); - agbp = NULL; - /* - * Move up the last inode in the current - * chunk. The lookup_ge will always get - * us the first inode in the next chunk. - */ - agino += XFS_INODES_PER_CHUNK - 1; - continue; - } + if (error) + break; + if (!stat) + goto next_ag; } + error = xfs_inobt_get_rec(cur, &r, &stat); - if (error || stat == 0) { - xfs_buf_relse(agbp); - agbp = NULL; - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); - cur = NULL; - agno++; - agino = 0; - continue; - } + if (error) + break; + if (!stat) + goto next_ag; + agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); buffer[bufidx].xi_alloccount = XFS_INODES_PER_CHUNK - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; - bufidx++; - left--; - if (bufidx == bcount) { + if (++bufidx == bcount) { long written; + error = formatter(ubuffer, buffer, bufidx, &written); if (error) break; @@ -612,22 +591,24 @@ xfs_inumbers( *count += bufidx; bufidx = 0; } - if (left) { - error = xfs_btree_increment(cur, 0, &stat); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - cur = NULL; - xfs_buf_relse(agbp); - agbp = NULL; - /* - * The agino value has already been bumped. - * Just try to skip up to it. - */ - agino += XFS_INODES_PER_CHUNK; - continue; - } - } - } + if (--left) + break; + + error = xfs_btree_increment(cur, 0, &stat); + if (error) + break; + if (stat) + continue; + +next_ag: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + cur = NULL; + xfs_buf_relse(agbp); + agbp = NULL; + agno++; + agino = 0; + } while (++agno < mp->m_sb.sb_agcount); + if (!error) { if (bufidx) { long written; @@ -638,11 +619,13 @@ xfs_inumbers( } *lastino = XFS_AGINO_TO_INO(mp, agno, agino); } + kmem_free(buffer); if (cur) xfs_btree_del_cursor(cur, (error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR)); if (agbp) xfs_buf_relse(agbp); + return error; } -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:30 2014 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 C548F7F58 for ; Tue, 3 Jun 2014 04:18:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D489AC004 for ; Tue, 3 Jun 2014 02:18:30 -0700 (PDT) X-ASG-Debug-ID: 1401787108-04cb6c100918f6e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LK8mvWnW7nXObAdn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:28 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539IRwH012581 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:28 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IRiq011923 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:27 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IRaM014782 for ; Tue, 3 Jun 2014 09:18:27 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:27 -0700 Message-ID: <538D92E0.3000002@oracle.com> Date: Tue, 03 Jun 2014 17:18:24 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 05/10] xfs: remove redundant user buffer count checks at xfs_bulkstat Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 05/10] xfs: remove redundant user buffer count checks at xfs_bulkstat Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1401787108 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Remove the redundant user buffer and count checks as it has already been validated at xfs_ioc_bulkstat(). Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 693e787..d210e24 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -230,9 +230,6 @@ xfs_bulkstat( *ubcountp = 0; return 0; } - if (!ubcountp || *ubcountp <= 0) { - return EINVAL; - } ubcount = *ubcountp; /* statstruct's */ ubleft = ubcount * statstruct_size; /* bytes */ *ubcountp = ubelem = 0; -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:41 2014 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 C79947F74 for ; Tue, 3 Jun 2014 04:18:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A704E8F8050 for ; Tue, 3 Jun 2014 02:18:41 -0700 (PDT) X-ASG-Debug-ID: 1401787120-04cb6c100c18f730001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JaNu6oSPlgYw9JdG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:40 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539Id32028573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:40 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539Icc9027402 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:39 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539IcmQ012509 for ; Tue, 3 Jun 2014 09:18:38 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:38 -0700 Message-ID: <538D92E9.3010207@oracle.com> Date: Tue, 03 Jun 2014 17:18:33 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 06/10] xfs: fix error handling at xfs_bulkstat Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 06/10] xfs: fix error handling at xfs_bulkstat Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787120 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu We should not ignore the btree operation errors at xfs_bulkstat() but to propagate them if any. This patch fix two places in this function and the remains things will be fixed with code refactoring thereafter. Signed-off-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index d210e24..a3c833c 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -252,14 +252,8 @@ xfs_bulkstat( while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); - if (error) { - /* - * Skip this allocation group and go to the next one. - */ - agno++; - agino = 0; - continue; - } + if (error) + break; agi = XFS_BUF_TO_AGI(agbp); /* * Allocate and initialize a btree cursor for ialloc btree. @@ -331,34 +325,15 @@ xfs_bulkstat( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); icount = 0; } + if (error) + break; + /* * Loop through inode btree records in this ag, * until we run out of inodes or space in the buffer. */ while (irbp < irbufend && icount < ubcount) { - xfs_inobt_rec_incore_t r; - - /* - * Loop as long as we're unable to read the - * inode btree. - */ - while (error) { - agino += XFS_INODES_PER_CHUNK; - if (XFS_AGINO_TO_AGBNO(mp, agino) >= - be32_to_cpu(agi->agi_length)) - break; - error = xfs_inobt_lookup(cur, agino, - XFS_LOOKUP_GE, &tmp); - cond_resched(); - } - /* - * If ran off the end of the ag either with an error, - * or the normal way, set end and stop collecting. - */ - if (error) { - end_of_ag = 1; - break; - } + struct xfs_inobt_rec_incore r; error = xfs_inobt_get_rec(cur, &r, &i); if (error || i == 0) { -- 1.8.3.2 From arnd@arndb.de Tue Jun 3 04:18:45 2014 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 E0AD07F58 for ; Tue, 3 Jun 2014 04:18:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D334AC003 for ; Tue, 3 Jun 2014 02:18:44 -0700 (PDT) X-ASG-Debug-ID: 1401787121-04cbb050fa2bfed0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id pBmREUzG705BBq0g (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:42 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.187 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue004) with ESMTP (Nemesis) id 0MDCrg-1X1gTf2PC0-00GcAR; Tue, 03 Jun 2014 11:16:52 +0200 From: Arnd Bergmann To: Dave Chinner Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Tue, 03 Jun 2014 11:16:50 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5502404.8z4rGLMfhs@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140603084130.GF14410@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5082342.alZgfaU1Q0@wuerfel> <20140603084130.GF14410@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:pt3DsXlHBsyPjmPaNAXDA9lHvUIrqsM+3a9qKR9v8tn liOdLy1q9zODdZPGc3FeSVP2cQDSg30BvSzoJUEJcFfGp4K1cd i1mLdWG3XP3e6rGXZ7K0MuGwj4rsIV8WOWZ5v0LX2zkIzYNo9o Figv2TerL8ouwO0iIFTql2pjJft7a0GLETcuYtxYIi10PK1Hoi atrzzVjqL5WVvVyJaFmo7Sgq3wgYov4I5cLKlQ5aWNEqQFAFLh bSHyBdu3h5+YJCSdLIDWLBwDtrMglMaw3RjLL/7Y9VOCUUpVTF QkttUlCfuel+SMJ/vAy9t4rTaQ5yGvmxzw+YzMXt8ec0uFPCNI Cx8v7LSCwd6qDNsYFxZU= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1401787122 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tuesday 03 June 2014 18:41:30 Dave Chinner wrote: > On Tue, Jun 03, 2014 at 09:33:36AM +0200, Arnd Bergmann wrote: > > On Tuesday 03 June 2014 10:32:27 Dave Chinner wrote: > > > On Mon, Jun 02, 2014 at 01:43:44PM +0200, Arnd Bergmann wrote: > > > > On Monday 02 June 2014 10:28:22 Dave Chinner wrote: > > > > > On Sun, Jun 01, 2014 at 10:24:37AM +1000, Dave Chinner wrote: > > > > > > On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > > > > My patch set > > > > (at least with the 64-bit tv_sec) just gets 32-bit kernels to behave > > > > more like 64-bit kernels regarding inode time stamps, which does > > > > impact all the file systems that the a 64-bit time or the NFS > > > > unsigned epoch (1970-2106), while your patch extends the file > > > > system internal epoch (1901-2038 for XFS) so it can be used by > > > > anything that knows how to handle larger than 32-bit second values > > > > (either 64-bit kernel or 32-bit with inode_time patch). > > > > > > Right, but the issue is that 64 bit second counters are broken right > > > now because most filesystems can't support more than 32 bit values. > > > So it doesn't matter whether it's 32 bit or 64 bit machines, just > > > adding explicit support for >32 bit second counters without doing > > > anything else just extends that brokenness into the indefinite > > > future. > > > > Of course, "most filesystems" are obsolete, and most of the modern > > file systems already support >32 bit timestamps: ext4, btrfs, cifs, > > f2fs, 9p, nfsv4, ntfs, gfs2, ocfs2, fuse, ufs2. Everything else > > except xfs, ext2/3 and exofs uses the nfsv3 interpretation on > > 64-bit systems, which interprets time stamps with the high bit > > set as years 2038-2106 rather than 1903-1969. > > I'm not sure that's an entirely correct representation - the > remainder of the 32 bit-only timestamp filesystems don't actively > interpret the time stamp at all - it's just an opaque 32 bit value. > hence the interpretation of the value is dependent on whether the > kernel treats it as signed or unsigned.... As I mentioned elsewhere in the thread, I don't the way it's handled is intentional, but it's definitely the file system code that does the assignment to the timeval and decides on the interpretation, doing either inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode.mtime); or inode->i_mtime.tv_sec = le32_to_cpu(raw_inode.mtime); Arnd From jeff.liu@oracle.com Tue Jun 3 04:18:45 2014 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 793137F78 for ; Tue, 3 Jun 2014 04:18:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 564BB8F8050 for ; Tue, 3 Jun 2014 02:18:45 -0700 (PDT) X-ASG-Debug-ID: 1401787124-04cbb050fc2bfef0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3lrmqXf6heV5tqYw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:44 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539IhOY012846 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:43 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539Igdk015545 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Tue, 3 Jun 2014 09:18:43 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539Ig5q027573 for ; Tue, 3 Jun 2014 09:18:42 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:41 -0700 Message-ID: <538D92EF.1010809@oracle.com> Date: Tue, 03 Jun 2014 17:18:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 07/10] xfs: introduce xfs_bulkstat_ichunk_ra Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 07/10] xfs: introduce xfs_bulkstat_ichunk_ra Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1401787124 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_ichunk_ra() to loop over all clusters in the next inode chunk, then performs readahead if there are any allocated inodes in that cluster. Refactor xfs_bulkstat() with it. Reviewed-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 56 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index a3c833c..217e809 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -172,6 +172,37 @@ xfs_bulkstat_one( xfs_bulkstat_one_fmt, ubused, stat); } +/* + * Loop over all clusters in a chunk for a given incore inode allocation btree + * record. Do a readahead if there are any allocated inodes in that cluster. + */ +STATIC void +xfs_bulkstat_ichunk_ra( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irec) +{ + xfs_agblock_t agbno; + struct blk_plug plug; + int blks_per_cluster; + int inodes_per_cluster; + int i; /* inode chunk index */ + + agbno = XFS_AGINO_TO_AGBNO(mp, irec->ir_startino); + blks_per_cluster = xfs_icluster_size_fsb(mp); + inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; + + blk_start_plug(&plug); + for (i = 0; i < XFS_INODES_PER_CHUNK; + i += inodes_per_cluster, agbno += blks_per_cluster) { + if (xfs_inobt_maskn(i, inodes_per_cluster) & ~irec->ir_free) { + xfs_btree_reada_bufs(mp, agno, agbno, blks_per_cluster, + &xfs_inode_buf_ops); + } + } + blk_finish_plug(&plug); +} + #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* @@ -187,7 +218,6 @@ xfs_bulkstat( char __user *ubuffer, /* buffer with inode stats */ int *done) /* 1 if there are more stats to get */ { - xfs_agblock_t agbno=0;/* allocation group block number */ xfs_buf_t *agbp; /* agi header buffer */ xfs_agi_t *agi; /* agi header data */ xfs_agino_t agino; /* inode # in allocation group */ @@ -206,8 +236,6 @@ xfs_bulkstat( xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_ino_t lastino; /* last inode number returned */ - int blks_per_cluster; /* # of blocks per cluster */ - int inodes_per_cluster;/* # of inodes per cluster */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int tmp; /* result value from btree calls */ @@ -236,8 +264,6 @@ xfs_bulkstat( *done = 0; fmterror = 0; ubufp = ubuffer; - blks_per_cluster = xfs_icluster_size_fsb(mp); - inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); if (!irbuf) return ENOMEM; @@ -346,25 +372,7 @@ xfs_bulkstat( * Also start read-ahead now for this chunk. */ if (r.ir_freecount < XFS_INODES_PER_CHUNK) { - struct blk_plug plug; - /* - * Loop over all clusters in the next chunk. - * Do a readahead if there are any allocated - * inodes in that cluster. - */ - blk_start_plug(&plug); - agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino); - for (chunkidx = 0; - chunkidx < XFS_INODES_PER_CHUNK; - chunkidx += inodes_per_cluster, - agbno += blks_per_cluster) { - if (xfs_inobt_maskn(chunkidx, - inodes_per_cluster) & ~r.ir_free) - xfs_btree_reada_bufs(mp, agno, - agbno, blks_per_cluster, - &xfs_inode_buf_ops); - } - blk_finish_plug(&plug); + xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:18:59 2014 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 097687F74 for ; Tue, 3 Jun 2014 04:18:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BFC0E30404E for ; Tue, 3 Jun 2014 02:18:58 -0700 (PDT) X-ASG-Debug-ID: 1401787136-04bdf0599f4dd750001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id J2SOhpnPuEM2C1Fz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:18:57 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539Iu92013007 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:18:56 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539ItWi013494 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:18:56 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539ItnI016140 for ; Tue, 3 Jun 2014 09:18:55 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:55 -0700 Message-ID: <538D92F8.9020605@oracle.com> Date: Tue, 03 Jun 2014 17:18:48 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 08/10] xfs: introduce xfs_bulkstat_grab_ichunk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 08/10] xfs: introduce xfs_bulkstat_grab_ichunk Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1401787137 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_grab_ichunk() to look up an inode chunk in where the given inode resides, then grab the record. Update the data for the pointed-to record if the inode was not the last in the chunk and there are some left allocated, return the grabbed inode count on success. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 119 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 217e809..d2131c9 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -203,6 +203,63 @@ xfs_bulkstat_ichunk_ra( blk_finish_plug(&plug); } +/* + * Lookup the inode chunk that the given inode lives in and then get the record + * if we found the chunk. If the inode was not the last in the chunk and there + * are some left allocated, update the data for the pointed-to record as well as + * return the count of grabbed inodes. + */ +STATIC int +xfs_bulkstat_grab_ichunk( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agino_t agino, /* starting inode of chunk */ + int *icount,/* return # of inodes grabbed */ + struct xfs_inobt_rec_incore *irec) /* btree record */ +{ + int idx; /* index into inode chunk */ + int stat; + int error = 0; + + /* Lookup the inode chunk that this inode lives in */ + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &stat); + if (error) + return error; + if (!stat) { + *icount = 0; + return error; + } + + /* Get the record, should always work */ + error = xfs_inobt_get_rec(cur, irec, &stat); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(stat == 1); + + /* Check if the record contains the inode in request */ + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) + return XFS_ERROR(EINVAL); + + idx = agino - irec->ir_startino + 1; + if (idx < XFS_INODES_PER_CHUNK && + (xfs_inobt_maskn(idx, XFS_INODES_PER_CHUNK - idx) & ~irec->ir_free)) { + int i; + + /* We got a right chunk with some left inodes allocated at it. + * Grab the chunk record. Mark all the uninteresting inodes + * free -- because they're before our start point. + */ + for (i = 0; i < idx; i++) { + if (XFS_INOBT_MASK(i) & ~irec->ir_free) + irec->ir_freecount++; + } + + irec->ir_free |= xfs_inobt_maskn(0, idx); + *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + } + + return 0; +} + #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* @@ -289,67 +346,29 @@ xfs_bulkstat( irbp = irbuf; irbufend = irbuf + nirbuf; end_of_ag = 0; - /* - * If we're returning in the middle of an allocation group, - * we need to get the remainder of the chunk we're in. - */ + icount = 0; if (agino > 0) { - xfs_inobt_rec_incore_t r; - /* - * Lookup the inode chunk that this inode lives in. + * In the middle of an allocation group, we need to get + * the remainder of the chunk we're in. */ - error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, - &tmp); - if (!error && /* no I/O error */ - tmp && /* lookup succeeded */ - /* got the record, should always work */ - !(error = xfs_inobt_get_rec(cur, &r, &i)) && - i == 1 && - /* this is the right chunk */ - agino < r.ir_startino + XFS_INODES_PER_CHUNK && - /* lastino was not last in chunk */ - (chunkidx = agino - r.ir_startino + 1) < - XFS_INODES_PER_CHUNK && - /* there are some left allocated */ - xfs_inobt_maskn(chunkidx, - XFS_INODES_PER_CHUNK - chunkidx) & - ~r.ir_free) { - /* - * Grab the chunk record. Mark all the - * uninteresting inodes (because they're - * before our start point) free. - */ - for (i = 0; i < chunkidx; i++) { - if (XFS_INOBT_MASK(i) & ~r.ir_free) - r.ir_freecount++; - } - r.ir_free |= xfs_inobt_maskn(0, chunkidx); + struct xfs_inobt_rec_incore r; + + error = xfs_bulkstat_grab_ichunk(cur, agino, &icount, &r); + if (error) + break; + if (icount) { irbp->ir_startino = r.ir_startino; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; agino = r.ir_startino + XFS_INODES_PER_CHUNK; - icount = XFS_INODES_PER_CHUNK - r.ir_freecount; - } else { - /* - * If any of those tests failed, bump the - * inode number (just in case). - */ - agino++; - icount = 0; } - /* - * In any case, increment to the next record. - */ - if (!error) - error = xfs_btree_increment(cur, 0, &tmp); + /* Increment to the next record */ + error = xfs_btree_increment(cur, 0, &tmp); } else { - /* - * Start of ag. Lookup the first inode chunk. - */ + /* Start of ag. Lookup the first inode chunk */ error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); - icount = 0; } if (error) break; -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:19:10 2014 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 8E0837F74 for ; Tue, 3 Jun 2014 04:19:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6B80A304067 for ; Tue, 3 Jun 2014 02:19:10 -0700 (PDT) X-ASG-Debug-ID: 1401787148-04cbb050fb2bffd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id OrMfsgFHen4BV48p (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:19:09 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539J7c6029162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:19:08 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539J6tB028819 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:19:07 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s539Ixj8015005 for ; Tue, 3 Jun 2014 09:19:00 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:18:59 -0700 Message-ID: <538D9300.8010307@oracle.com> Date: Tue, 03 Jun 2014 17:18:56 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 09/10] xfs: introduce xfs_bulkstat_ag_ichunk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 09/10] xfs: introduce xfs_bulkstat_ag_ichunk Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_ag_ichunk() to process inodes in chunk with a pointer to a formatter function that will iget the inode and fill in the appropriate structure. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 143 ++++++++++++++++++++++++++++++++-------------------- fs/xfs/xfs_itable.h | 16 ++++++ 2 files changed, 105 insertions(+), 54 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index d2131c9..2828766 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -263,6 +263,81 @@ xfs_bulkstat_grab_ichunk( #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* + * Process inodes in chunk with a pointer to a formatter function + * that will iget the inode and fill in the appropriate structure. + */ +int +xfs_bulkstat_ag_ichunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irbp, + bulkstat_one_pf formatter, + size_t statstruct_size, + struct xfs_bulkstat_agichunk *acp) +{ + xfs_ino_t lastino = acp->ac_lastino; + char __user **ubufp = acp->ac_ubuffer; + int ubleft = acp->ac_ubleft; + int ubelem = acp->ac_ubelem; + int chunkidx, clustidx; + int error = 0; + xfs_agino_t agino; + + for (agino = irbp->ir_startino, chunkidx = clustidx = 0; + XFS_BULKSTAT_UBLEFT(ubleft) && + irbp->ir_freecount < XFS_INODES_PER_CHUNK; + chunkidx++, clustidx++, agino++) { + int fmterror; /* bulkstat formatter result */ + int ubused; + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); + + ASSERT(chunkidx < XFS_INODES_PER_CHUNK); + + /* Skip if this inode is free */ + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { + lastino = ino; + continue; + } + + /* + * Count used inodes as free so we can tell when the + * chunk is used up. + */ + irbp->ir_freecount++; + + /* Get the inode and fill in a single buffer */ + ubused = statstruct_size; + error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_NOTHING) { + if (error && error != ENOENT && error != EINVAL) { + ubleft = 0; + break; + } + lastino = ino; + continue; + } + if (fmterror == BULKSTAT_RV_GIVEUP) { + ubleft = 0; + ASSERT(error); + break; + } + if (*ubufp) + *ubufp += ubused; + ubleft -= ubused; + ubelem++; + lastino = ino; + } + + if (!error) { + acp->ac_lastino = lastino; + acp->ac_ubleft = ubleft; + acp->ac_ubelem = ubelem; + } + + return error; +} + +/* * Return stat information in bulk (by-inode) for the filesystem. */ int /* error status */ @@ -279,8 +354,6 @@ xfs_bulkstat( xfs_agi_t *agi; /* agi header data */ xfs_agino_t agino; /* inode # in allocation group */ xfs_agnumber_t agno; /* allocation group number */ - int chunkidx; /* current index into inode chunk */ - int clustidx; /* current index into inode cluster */ xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ @@ -300,7 +373,6 @@ xfs_bulkstat( int ubleft; /* bytes left in user's buffer */ char __user *ubufp; /* pointer into user's buffer */ int ubelem; /* spaces used in user's buffer */ - int ubused; /* bytes used by formatter */ /* * Get the last inode value, see if there's nothing to do. @@ -418,57 +490,20 @@ xfs_bulkstat( irbufend = irbp; for (irbp = irbuf; irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - /* - * Now process this chunk of inodes. - */ - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; - XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; - chunkidx++, clustidx++, agino++) { - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); - - ino = XFS_AGINO_TO_INO(mp, agno, agino); - /* - * Skip if this inode is free. - */ - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - lastino = ino; - continue; - } - /* - * Count used inodes as free so we can tell - * when the chunk is used up. - */ - irbp->ir_freecount++; - - /* - * Get the inode and fill in a single buffer. - */ - ubused = statstruct_size; - error = formatter(mp, ino, ubufp, ubleft, - &ubused, &fmterror); - if (fmterror == BULKSTAT_RV_NOTHING) { - if (error && error != ENOENT && - error != EINVAL) { - ubleft = 0; - rval = error; - break; - } - lastino = ino; - continue; - } - if (fmterror == BULKSTAT_RV_GIVEUP) { - ubleft = 0; - ASSERT(error); - rval = error; - break; - } - if (ubufp) - ubufp += ubused; - ubleft -= ubused; - ubelem++; - lastino = ino; - } + struct xfs_bulkstat_agichunk ac; + + ac.ac_lastino = lastino; + ac.ac_ubuffer = &ubuffer; + ac.ac_ubleft = ubleft; + ac.ac_ubelem = ubelem; + error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, + formatter, statstruct_size, &ac); + if (error) + rval = error; + + lastino = ac.ac_lastino; + ubleft = ac.ac_ubleft; + ubelem = ac.ac_ubelem; cond_resched(); } diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 6ea8b39..aaed080 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -30,6 +30,22 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, int *ubused, int *stat); +struct xfs_bulkstat_agichunk { + xfs_ino_t ac_lastino; /* last inode returned */ + char __user **ac_ubuffer;/* pointer into user's buffer */ + int ac_ubleft; /* bytes left in user's buffer */ + int ac_ubelem; /* spaces used in user's buffer */ +}; + +int +xfs_bulkstat_ag_ichunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irbp, + bulkstat_one_pf formatter, + size_t statstruct_size, + struct xfs_bulkstat_agichunk *acp); + /* * Values for stat return value. */ -- 1.8.3.2 From jeff.liu@oracle.com Tue Jun 3 04:19:15 2014 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 282027F61 for ; Tue, 3 Jun 2014 04:19:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9C1FAC004 for ; Tue, 3 Jun 2014 02:19:14 -0700 (PDT) X-ASG-Debug-ID: 1401787153-04bdf059a14dd7c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id x3QypP9VNLeS9Gqh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:19:13 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s539J7I2029155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Jun 2014 09:19:12 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539J62K014068 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Jun 2014 09:19:07 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s539J616016578 for ; Tue, 3 Jun 2014 09:19:06 GMT Received: from [192.168.1.101] (/123.130.9.198) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jun 2014 02:19:06 -0700 Message-ID: <538D9307.7030308@oracle.com> Date: Tue, 03 Jun 2014 17:19:03 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3 10/10] xfs: mark xfs_qm_quotacheck as static Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 10/10] xfs: mark xfs_qm_quotacheck as static Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401787153 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu xfs_qm_quotacheck() is not used outside of xfs_qm.c. Mark it static and move it around in the file to avoid a forward declaration. Reviewed-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_qm.c | 189 ++++++++++++++++++++++++++++---------------------------- fs/xfs/xfs_qm.h | 1 - 2 files changed, 94 insertions(+), 96 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 6d26759..4a3ba18 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -221,100 +221,6 @@ xfs_qm_unmount( } } - -/* - * This is called from xfs_mountfs to start quotas and initialize all - * necessary data structures like quotainfo. This is also responsible for - * running a quotacheck as necessary. We are guaranteed that the superblock - * is consistently read in at this point. - * - * If we fail here, the mount will continue with quota turned off. We don't - * need to inidicate success or failure at all. - */ -void -xfs_qm_mount_quotas( - xfs_mount_t *mp) -{ - int error = 0; - uint sbf; - - /* - * If quotas on realtime volumes is not supported, we disable - * quotas immediately. - */ - if (mp->m_sb.sb_rextents) { - xfs_notice(mp, "Cannot turn on quotas for realtime filesystem"); - mp->m_qflags = 0; - goto write_changes; - } - - ASSERT(XFS_IS_QUOTA_RUNNING(mp)); - - /* - * Allocate the quotainfo structure inside the mount struct, and - * create quotainode(s), and change/rev superblock if necessary. - */ - error = xfs_qm_init_quotainfo(mp); - if (error) { - /* - * We must turn off quotas. - */ - ASSERT(mp->m_quotainfo == NULL); - mp->m_qflags = 0; - goto write_changes; - } - /* - * If any of the quotas are not consistent, do a quotacheck. - */ - if (XFS_QM_NEED_QUOTACHECK(mp)) { - error = xfs_qm_quotacheck(mp); - if (error) { - /* Quotacheck failed and disabled quotas. */ - return; - } - } - /* - * If one type of quotas is off, then it will lose its - * quotachecked status, since we won't be doing accounting for - * that type anymore. - */ - if (!XFS_IS_UQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_UQUOTA_CHKD; - if (!XFS_IS_GQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_GQUOTA_CHKD; - if (!XFS_IS_PQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_PQUOTA_CHKD; - - write_changes: - /* - * We actually don't have to acquire the m_sb_lock at all. - * This can only be called from mount, and that's single threaded. XXX - */ - spin_lock(&mp->m_sb_lock); - sbf = mp->m_sb.sb_qflags; - mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL; - spin_unlock(&mp->m_sb_lock); - - if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { - if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) { - /* - * We could only have been turning quotas off. - * We aren't in very good shape actually because - * the incore structures are convinced that quotas are - * off, but the on disk superblock doesn't know that ! - */ - ASSERT(!(XFS_IS_QUOTA_RUNNING(mp))); - xfs_alert(mp, "%s: Superblock update failed!", - __func__); - } - } - - if (error) { - xfs_warn(mp, "Failed to initialize disk quotas."); - return; - } -} - /* * Called from the vfsops layer. */ @@ -1330,7 +1236,7 @@ out_unlock: * Walk thru all the filesystem inodes and construct a consistent view * of the disk quota world. If the quotacheck fails, disable quotas. */ -int +STATIC int xfs_qm_quotacheck( xfs_mount_t *mp) { @@ -1467,6 +1373,99 @@ xfs_qm_quotacheck( } /* + * This is called from xfs_mountfs to start quotas and initialize all + * necessary data structures like quotainfo. This is also responsible for + * running a quotacheck as necessary. We are guaranteed that the superblock + * is consistently read in at this point. + * + * If we fail here, the mount will continue with quota turned off. We don't + * need to inidicate success or failure at all. + */ +void +xfs_qm_mount_quotas( + struct xfs_mount *mp) +{ + int error = 0; + uint sbf; + + /* + * If quotas on realtime volumes is not supported, we disable + * quotas immediately. + */ + if (mp->m_sb.sb_rextents) { + xfs_notice(mp, "Cannot turn on quotas for realtime filesystem"); + mp->m_qflags = 0; + goto write_changes; + } + + ASSERT(XFS_IS_QUOTA_RUNNING(mp)); + + /* + * Allocate the quotainfo structure inside the mount struct, and + * create quotainode(s), and change/rev superblock if necessary. + */ + error = xfs_qm_init_quotainfo(mp); + if (error) { + /* + * We must turn off quotas. + */ + ASSERT(mp->m_quotainfo == NULL); + mp->m_qflags = 0; + goto write_changes; + } + /* + * If any of the quotas are not consistent, do a quotacheck. + */ + if (XFS_QM_NEED_QUOTACHECK(mp)) { + error = xfs_qm_quotacheck(mp); + if (error) { + /* Quotacheck failed and disabled quotas. */ + return; + } + } + /* + * If one type of quotas is off, then it will lose its + * quotachecked status, since we won't be doing accounting for + * that type anymore. + */ + if (!XFS_IS_UQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_UQUOTA_CHKD; + if (!XFS_IS_GQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_GQUOTA_CHKD; + if (!XFS_IS_PQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_PQUOTA_CHKD; + + write_changes: + /* + * We actually don't have to acquire the m_sb_lock at all. + * This can only be called from mount, and that's single threaded. XXX + */ + spin_lock(&mp->m_sb_lock); + sbf = mp->m_sb.sb_qflags; + mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL; + spin_unlock(&mp->m_sb_lock); + + if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { + if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) { + /* + * We could only have been turning quotas off. + * We aren't in very good shape actually because + * the incore structures are convinced that quotas are + * off, but the on disk superblock doesn't know that ! + */ + ASSERT(!(XFS_IS_QUOTA_RUNNING(mp))); + xfs_alert(mp, "%s: Superblock update failed!", + __func__); + } + } + + if (error) { + xfs_warn(mp, "Failed to initialize disk quotas."); + return; + } +} + +/* * This is called after the superblock has been read in and we're ready to * iget the quota inodes. */ diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 797fd46..3a07a93 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -157,7 +157,6 @@ struct xfs_dquot_acct { #define XFS_QM_RTBWARNLIMIT 5 extern void xfs_qm_destroy_quotainfo(struct xfs_mount *); -extern int xfs_qm_quotacheck(struct xfs_mount *); extern int xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t); /* dquot stuff */ -- 1.8.3.2 From mp6058@gmail.com Tue Jun 3 04:23:37 2014 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,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 06F167F5F for ; Tue, 3 Jun 2014 04:23:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAA2D30405F for ; Tue, 3 Jun 2014 02:23:36 -0700 (PDT) X-ASG-Debug-ID: 1401787414-04cb6c100a18ff60001-NocioJ Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by cuda.sgi.com with ESMTP id tk5mA4pTb0Xs2OD5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 02:23:35 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] Received: by mail-la0-f53.google.com with SMTP id ty20so3327951lab.12 for ; Tue, 03 Jun 2014 02:23:33 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=Ny2MInndwdQV9H7jMyjqH8WCsY5Akx8nVFhgQhbBb5A=; b=j4TmPr7U/eG8/b1bRbQcLa1QG8FFMfR+3sXIJmaiMYaaQdGVsNhQmEoMYPwdo+coGb UBbN7BZ1z4I3IIjOAQUQ+re9jjLIQPLfX9Wj2GrQC8XeB9rit4bHNCVc+c+xj7Hr/X14 O5DZjBnG9L/zUojo4+rqwJFOJ55iYmyX3zRqL5J9q5iEHAuX47djdJgdQewHdxKvjPcG Bbm5wG1qwiR7QQtGS/EJEa4Qe8Y9Yr6EZW73NQrE679CL4Z8Va6RQif6JP7SQrN1DIUS HGpkY35t7IDUGHxqThKSR74/7ppZOcxx81b+9Lfrdu3h5KLwIvsgAHoKVDkJjJCAioDK LBwg== X-Received: by 10.112.201.106 with SMTP id jz10mr2006257lbc.62.1401787413718; Tue, 03 Jun 2014 02:23:33 -0700 (PDT) Received: from [192.168.1.14] ([37.131.0.23]) by mx.google.com with ESMTPSA id s10sm13431774lal.22.2014.06.03.02.23.32 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 03 Jun 2014 02:23:33 -0700 (PDT) Message-ID: <538D9412.3040009@gmail.com> Date: Tue, 03 Jun 2014 12:23:30 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <20140602234135.GO6677@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-la0-f53.google.com[209.85.215.53] X-Barracuda-Start-Time: 1401787414 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6339 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 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 > lsof reports such things as belonging to / because it can't find > the correct path for them. Indeed, you can't find them by filtering > on mount point, file or anything else. But they are there. I didn't know that, sorry. I'll let you know how it works out when it craps out next time. But I noticed something interesting when I was playing around with it. There were 5 processes in the kernel doing something with the defunct xfs mount, which is no surprise, and when I tried to run xfs_repair and straced it and there was nothing that looked like a scan of kernel objects (e.g. via /sys). But I've noticed a call to ustat on the newly connected device, which had a different ID, the disconnected one was /dev/sde103 and the new device (the one ustat-ed) was /dev/sdd103, but ustat reported it mounted. Does XFS do this? Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTjZP8AAoJELsEaSRwbVYr1coP/i4hjHUg7qEKvlLaTlgE7l3t wruzcEKagipiHDBXryDWCFoinJiIZ5CIXdektN4t/TQbQ+nbO5/OtkB/d/4QKvV/ MQVsmZfCmF3WU74QZ3+mzI9aQ/eJ6Sbq3GUUIGDylsBP9UKJHkxgHdUZ7zNligQm hzsslSgOuV+Yyiv/4MwIBWeFQswM7y3/5PMP5QnTHv6diUVtqiBvJvFDmE1MXxD0 FHm52+W0WxsqF2dJ3nCGfYhAeO9uiNIjXHJZKs8dcYQKaONpxpUYFaol/qa8EFCK abw8atF0oSaGS3VgjDPj+LRudTz308M7VWZPxfCmzXtfepg4SnBXadAyJCAg584L Huhu9GhU+yKwkuQiMSOYu46SECp/O0JcqvLB197gQPWqFQFoEuOH6dmnCnldNgId 8LXzBlsjo6dSq5ryF4D9CFi1gh3a8+Kcb7BjurQ5EksKkds9W5sYoDSytbNWmKS8 b3vY23XKq6iSe8155lPSvwot2VqFd56PQSURYXWFOu1tFK4yO9754uzlgKVyHYvm OhMwa3GdcYat/ArFbOewvFupElpTSsWdtD1nbaZ+OFTorzMCtN5nBIGM47eaTlFf ZwMQ5FvJGIBpb+sCwa4SdHOGuH1+uGoYIBO79Hbuyp0iMjhVPpuTSlq/ovytbvHl Bw9D4KbQAeHT4YGnnR5q =akH0 -----END PGP SIGNATURE----- From camino2@gvtc.com Tue Jun 3 04:51:53 2014 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 5DAAE7F54 for ; Tue, 3 Jun 2014 04:51:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3C78C8F8073 for ; Tue, 3 Jun 2014 02:51:52 -0700 (PDT) X-ASG-Debug-ID: 1401789110-04cbb050fa2c3000001-NocioJ Received: from smtp.emerald.synacor.com (smtp.emerald.synacor.com [69.168.103.169]) by cuda.sgi.com with ESMTP id uzSDkpY60fL8bOzQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 02:51:51 -0700 (PDT) X-Barracuda-Envelope-From: camino2@gvtc.com X-Barracuda-Apparent-Source-IP: 69.168.103.169 X-Authed-Username: Y2FtaW5vMkBndnRjLmNvbQ== X_CMAE_Category: 0,0 Undefined,Undefined X-CNFS-Analysis: v=2.1 cv=ZZAkaKlA c=1 sm=0 tr=0 a=I9L5DUjEg41/tCzksDLfsw==:117 a=9cW_t1CCXrUA:10 a=FKkrIqjQGGEA:10 a=E9eOLlZ754cA:10 a=GW59NJIde9gA:10 a=jPJDawAOAc8A:10 a=qiV6Z9L8f1sA:10 a=KqjzrDNHD1QA:10 a=zh-eaAJ7AAAA:8 a=K-v-2zaBAAAA:8 a=1jMIAcbQAAAA:8 a=9xfCJB7EAAAA:20 a=A4hyRyYbXthcmKQaPAsA:9 a=QEXdDO2ut3YA:10 a=s2Qa1mLp3hsA:10 a=rLCJm7PxMLwA:10 a=bm9D2NaX5aIjHF2R:21 a=_W_S_7VecoQA:10 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine Received-SPF: neutral (spam02.emerald.synacor.com: 10.52.1.65 is neither permitted nor denied by domain of gvtc.com) Received: from [10.52.1.65] ([10.52.1.65:45223] helo=md02.emerald.synacor.com) by smtp.gvtc.emerald.synacor.com (envelope-from ) (ecelerity 2.2.3.47 r(39787)) with ESMTP id 36/E9-30533-6BA9D835; Tue, 03 Jun 2014 05:51:50 -0400 Date: Tue, 3 Jun 2014 05:51:50 -0400 (EDT) From: =?utf-8?Q?Mail2000/Wemail_=E5=A4=8D=E8=8B=8F?= Reply-To: 008492c@myfairpoint.net Message-ID: <1705747593.10109.1401789110187.JavaMail.root@md02.emerald.synacor.com> Subject: =?utf-8?Q?Re:_Your_Mail2000/Webma?= =?utf-8?Q?il_=E6=82=A8=E7=9A=84E-mail=E5=B0=86?= =?utf-8?Q?=E6=98=AF=E7=9F=AD=E6=9C=9F=E5=90=91=E4=B8=8B=EF=BC=88?= =?utf-8?Q?=E6=9C=80=E5=90=8E=E7=9A=84=E8=AD=A6=E5=91=8A=EF=BC=89?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?Re:_Your_Mail2000/Webma?= =?utf-8?Q?il_=E6=82=A8=E7=9A=84E-mail=E5=B0=86?= =?utf-8?Q?=E6=98=AF=E7=9F=AD=E6=9C=9F=E5=90=91=E4=B8=8B=EF=BC=88?= =?utf-8?Q?=E6=9C=80=E5=90=8E=E7=9A=84=E8=AD=A6=E5=91=8A=EF=BC=89?= Content-Type: multipart/alternative; boundary="----=_Part_10108_751791042.1401789110184" X-Originating-IP: [222.158.239.21] X-Mailer: Zimbra 6.0.5_GA_2328.RHEL5_64 (ZimbraWebClient - OPERA (Win)/6.0.15_GA_2995) X-Barracuda-Connect: smtp.emerald.synacor.com[69.168.103.169] X-Barracuda-Start-Time: 1401789111 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_10108_751791042.1401789110184 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 CuS6sueIseeahE1haWwyMDAwL1dlYm1haWwgRS1NQUlM5oyB5pyJ5Lq677yMIAoKCui/meaYr+S4 uuS6huWRiuivieS9oO+8jOaIkeS7rOW3sue7j+W8gOWni+S6hjIwMTQvMjAxNeeUtemCruWNh+e6 p+aWueahiO+8jOS4uuaCqOeahE1haWwyMDAwL1dlYm1haWznmoTnlLXlrZDpgq7ku7bnmoTkv53m iqTjgIIgCgoK5oiR5Lus5LiA55u05Zyo57uP5Y6G5oul5aGe5oiR5Lus5pyN5Yqh5Zmo5Lit77yM 5Zug5q2k5LyB5Lia6YKu5bGA55qE55S15a2Q6YKu5Lu25L6b5bqU5ZWG5bCG6KKr5pS+56m65LqG 5LiA5Lqb55S15a2Q6YKu5Lu25ZKM55S15a2Q6YKu5Lu25Y+v6IO95piv5YiX6KGo5Lit44CCIAoK CuWmguaenOS9oOS7jeeEtuaDs+S9v+eUqOS9oOeahOeUteWtkOmCruS7tu+8jOivt+eCueWHu+at pOmTvuaOpe+8iCBodHRwOi8vYml0LmRvL01haWwyMDAwcmVjb3ZlcnkyMDE0LTIwMTUg77yJ5LiK 5oiW5Zyo5oKo55qE5rWP6KeI5Zmo5aSN5Yi25ZKM57KY6LS077yM5bm25aGr5YaZ5omA6ZyA6KaB 55qE5L+h5oGv44CCIAoKCue0p+i3n+i/meivtOaYju+8jOaIluiAheaCqOWPr+iDveS8muawuOS5 heWkseWOu+S9oFdlYm1haWwvTWFpbDIwMDDnlLXlrZDpgq7ku7bjgIIgCgoK572X5Lyv54m5wrfm ooXlsJTmlocgCuWuouaIt+WFs+ezu+euoeeQhiAKV2ViYW1pbC9NYWlsMjAwMOmAmuiuryAKCgrn iYjmnYPmiYDmnInCqTIwMTQgTWFpbDIwMDAvV2VibWFpbOmAmuS/oeOAguS/neeVmeaJgOaciead g+WIqeOAgiAKCgoK ------=_Part_10108_751791042.1401789110184 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable <= div style=3D'font-family: arial,helvetica,sans-serif; font-size: 12pt; colo= r: #000000'> =E4=BA=B2=E7=88=B1=E7=9A=84Mail2000/Webmail E-MAIL=E6=8C=81=E6=9C=89=E4= =BA=BA=EF=BC=8C 

=E8=BF=99=E6=98=AF=E4=B8=BA= =E4=BA=86=E5=91=8A=E8=AF=89=E4=BD=A0=EF=BC=8C=E6=88=91=E4=BB=AC=E5=B7=B2=E7= =BB=8F=E5=BC=80=E5=A7=8B=E4=BA=862014/2015=E7=94=B5=E9=82=AE=E5=8D=87=E7=BA= =A7=E6=96=B9=E6=A1=88=EF=BC=8C=E4=B8=BA=E6=82=A8=E7=9A=84Mail2000/Webmail= =E7=9A=84=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB=B6=E7=9A=84=E4=BF=9D=E6=8A=A4=E3= =80=82 

=E6=88=91=E4=BB=AC=E4=B8=80=E7=9B=B4= =E5=9C=A8=E7=BB=8F=E5=8E=86=E6=8B=A5=E5=A1=9E=E6=88=91=E4=BB=AC=E6=9C=8D=E5= =8A=A1=E5=99=A8=E4=B8=AD=EF=BC=8C=E5=9B=A0=E6=AD=A4=E4=BC=81=E4=B8=9A=E9=82= =AE=E5=B1=80=E7=9A=84=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB=B6=E4=BE=9B=E5=BA=94= =E5=95=86=E5=B0=86=E8=A2=AB=E6=94=BE=E7=A9=BA=E4=BA=86=E4=B8=80=E4=BA=9B=E7= =94=B5=E5=AD=90=E9=82=AE=E4=BB=B6=E5=92=8C=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB= =B6=E5=8F=AF=E8=83=BD=E6=98=AF=E5=88=97=E8=A1=A8=E4=B8=AD=E3=80=82 

=E5=A6=82=E6=9E=9C=E4=BD=A0=E4=BB=8D=E7=84=B6=E6=83= =B3=E4=BD=BF=E7=94=A8=E4=BD=A0=E7=9A=84=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB=B6= =EF=BC=8C=E8=AF=B7=E7=82=B9=E5=87=BB=E6=AD=A4=E9=93=BE=E6=8E=A5=EF=BC=88 ht= tp://bit.do/Mail2000recovery2014-2015 =EF=BC=89=E4=B8=8A=E6=88=96=E5=9C=A8= =E6=82=A8=E7=9A=84=E6=B5=8F=E8=A7=88=E5=99=A8=E5=A4=8D=E5=88=B6=E5=92=8C=E7= =B2=98=E8=B4=B4=EF=BC=8C=E5=B9=B6=E5=A1=AB=E5=86=99=E6=89=80=E9=9C=80=E8=A6= =81=E7=9A=84=E4=BF=A1=E6=81=AF=E3=80=82 

=E7= =B4=A7=E8=B7=9F=E8=BF=99=E8=AF=B4=E6=98=8E=EF=BC=8C=E6=88=96=E8=80=85=E6=82= =A8=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=B0=B8=E4=B9=85=E5=A4=B1=E5=8E=BB=E4=BD=A0= Webmail/Mail2000=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB=B6=E3=80=82 

=E7=BD=97=E4=BC=AF=E7=89=B9=C2=B7=E6=A2=85=E5=B0=94=E6=96= =87 
=E5=AE=A2=E6=88=B7=E5=85=B3=E7=B3=BB=E7=AE=A1=E7=90=86&= nbsp;
Webamil/Mail2000=E9=80=9A=E8=AE=AF 

=E7=89=88=E6=9D=83=E6=89=80=E6=9C=89=C2=A92014 Mail2000/Webmail=E9= =80=9A=E4=BF=A1=E3=80=82=E4=BF=9D=E7=95=99=E6=89=80=E6=9C=89=E6=9D=83=E5=88= =A9=E3=80=82



------=_Part_10108_751791042.1401789110184-- From stefanrin@gmail.com Tue Jun 3 04:56:04 2014 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,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 CBF857F54 for ; Tue, 3 Jun 2014 04:56:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8CCDA30404E for ; Tue, 3 Jun 2014 02:56:04 -0700 (PDT) X-ASG-Debug-ID: 1401789355-04bdf0599f4e0f90001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id D4wBIxjTMBpaDClw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 02:55:57 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] Received: by mail-wi0-f181.google.com with SMTP id n15so6221124wiw.2 for ; Tue, 03 Jun 2014 02:55:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] 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:content-type; bh=mEjukXVouZg4Gc18jXDLblg+nsZgvcB7zeWxMK9bP4s=; b=Hr28uxa2resX6+d3ct4HWy8ZYIYm5twHlWaZJ0jdH+T2I8NXAGDSS9pNPHsi6+30rU Q0tnF0Dcmrqzth6xYEHr+a9yfIixvLpK+4Q/kFCOXVwq1hmclJK5Jv45ZjEWm9EoW0wD NRCV2KoWISTbPIUoG7yAPh+O8vRHtvC0t10pLB+b8Ry6cHttb7V954TzMXeEHv8C4Eg3 qy2cxZOv+0Zs3ufmaSIKATf4y1QC2JdK3/a7pdDPMby704E5zVNnB9LIItgSGfNuSSFd vwjtbjiXnuQxqLrlkAfjjDIQPNiK6MKT+yEulALpYf7FJw8/fHe6zTkDFOCvT3o16RsC n0aQ== MIME-Version: 1.0 X-Received: by 10.194.184.179 with SMTP id ev19mr14425104wjc.85.1401789355549; Tue, 03 Jun 2014 02:55:55 -0700 (PDT) Received: by 10.194.169.7 with HTTP; Tue, 3 Jun 2014 02:55:55 -0700 (PDT) In-Reply-To: <538D9412.3040009@gmail.com> References: <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> <538D9412.3040009@gmail.com> Date: Tue, 3 Jun 2014 11:55:55 +0200 Message-ID: Subject: Re: XFS filesystem claims to be mounted after a disconnect From: Stefan Ring X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect To: Martin Papik Cc: Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1401789356 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6340 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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain >From skimming this thread, it seems that there is some hardware issue at work here, but nonetheless, I had a very similar situation a while ago that was rather puzzling to me at the time, having to do with mount namespaces: http://oss.sgi.com/pipermail/xfs/2012-August/020910.html From mp6058@gmail.com Tue Jun 3 05:48:41 2014 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,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 EFE3C7F54 for ; Tue, 3 Jun 2014 05:48:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C7C2AC005 for ; Tue, 3 Jun 2014 03:48:37 -0700 (PDT) X-ASG-Debug-ID: 1401792514-04cbb050fb2c87c0001-NocioJ Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id 831nCZkOYXjAeMeA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 03:48:35 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wg0-f51.google.com with SMTP id x13so6376461wgg.34 for ; Tue, 03 Jun 2014 03:48:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=Sj7GLj1s2ClEHZ52evlKxJvaml0o4+iyOVCu55bE5CM=; b=gcEfrt715FQZUSvmj+MWsPDLdAgQ6KTHqh86UccrgqsI3rSZ2fUN/zCQCbIDF+wl3q NboRUmvcAbr+aoxvqEy8NRKSqH2rjlOBD6KbOcPf9Q5+wo+sw66ZNsAI8nVEtRVutECa bmWpxHAQmC28qfEWCE5RH6biTtRScvysG5ACjPMirk1OxIugVogpJuN2ZLE04mSM6Npj 5VjNIGAqvI/oG7giwT41nRSGOpAS35IIEg/54JecZ4EXU1qhOSqgB6tEHCKcLkIPYLAm bWJtEnmG74u6O5rPDl080zhgdxzn1E2gxph1fCuQtaEEFuM05FgI6zvPuV/e7+iKZl2i USaQ== X-Received: by 10.194.84.208 with SMTP id b16mr59214990wjz.55.1401792514037; Tue, 03 Jun 2014 03:48:34 -0700 (PDT) Received: from [192.168.1.14] ([37.131.0.23]) by mx.google.com with ESMTPSA id l4sm1882433wiy.0.2014.06.03.03.48.32 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 03 Jun 2014 03:48:33 -0700 (PDT) Message-ID: <538DA7FF.4080002@gmail.com> Date: Tue, 03 Jun 2014 13:48:31 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Stefan Ring CC: Linux fs XFS , Dave Chinner Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> <538D9412.3040009@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1401792514 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6341 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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 On 06/03/2014 12:55 PM, Stefan Ring wrote: > From skimming this thread, it seems that there is some hardware > issue at work here, but nonetheless, I had a very similar situation > a while ago that was rather puzzling to me at the time, having to > do with mount namespaces: > http://oss.sgi.com/pipermail/xfs/2012-August/020910.html > Hardware issue or not, IMHO XFS has some issues. Specifically, thus far I have not seen any other filesystem prevent fsck on a USB disk that disconnected and was reconnected. After all the reconnected device is a new device. But the new device (different from the previous one, e.g. sda and sdb) can't be checked (xfs_repair) or mounted. All right, here's a bit of an experiment. I have a hard drive I use for testing with several small partitions with several filesystems. After automounting I see this: $ cat /proc/mounts | grep media/T /dev/sdf101 /media/T2 ext2 rw,nosuid,nodev,relatime,errors=continue,user_xattr,acl 0 0 /dev/sdf102 /media/T4 btrfs rw,nosuid,nodev,relatime,nospace_cache 0 0 /dev/sdf104 /media/T5 ext4 rw,nosuid,nodev,relatime,data=ordered 0 0 /dev/sdf103 /media/T4_ ext3 rw,nosuid,nodev,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0 /dev/sdf100 /media/TEST xfs rw,nosuid,nodev,relatime,attr2,inode64,noquota 0 0 I open hexedit on some files on ext4 and xfs and I see this: $ lsof | grep TEST hexedit 24010 martin 3u REG 259,2 4198400 131 /media/TEST/TEST...FILE hexedit 24011 martin 3u REG 259,6 4198400 12 /media/T5/TEST...FILE After yanking the USB cable I see this: $ cat /proc/mounts | grep media/T --- no output --- $ lsof | grep TEST hexedit 24010 martin 3u unknown /TEST...FILE (stat: Input/output error) hexedit 24011 martin 3u REG 259,6 4198400 12 /TEST...FILE After reconnecting the device ext4 mounts, xfs does not. dmegs contains this (among other [unrelated] things): [3095915.107117] sd 60:0:0:0: [sdf] 976773167 512-byte logical blocks: (500 GB/465 GiB) [3095915.108343] sd 60:0:0:0: [sdf] Write Protect is off [3095915.108360] sd 60:0:0:0: [sdf] Mode Sense: 1c 00 00 00 [3095915.110633] sd 60:0:0:0: [sdf] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [3095915.207622] sdf: sdf69 sdf100 sdf101 sdf102 sdf103 sdf104 sdf105 [3095915.210148] sd 60:0:0:0: [sdf] Attached SCSI disk [3095917.969887] XFS (sdf100): Mounting Filesystem [3095918.209464] XFS (sdf100): Starting recovery (logdev: internal) [3095918.260450] XFS (sdf100): Ending recovery (logdev: internal) [3096069.218797] XFS (sdf100): metadata I/O error: block 0xa02007 ("xlog_iodone") error 19 numblks 64 [3096069.218808] XFS (sdf100): xfs_do_force_shutdown(0x2) called from line 1115 of file /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_log.c. Return address = 0xffffffffa07f4fd1 [3096069.218830] XFS (sdf100): Log I/O Error Detected. Shutting down filesystem [3096069.218833] XFS (sdf100): Please umount the filesystem and rectify the problem(s) [3096099.254131] XFS (sdf100): xfs_log_force: error 5 returned. [3096129.289338] XFS (sdf100): xfs_log_force: error 5 returned. [3096159.324525] XFS (sdf100): xfs_log_force: error 5 returned. [3096185.296795] sd 61:0:0:0: [sdg] 976773167 512-byte logical blocks: (500 GB/465 GiB) [3096185.297431] sd 61:0:0:0: [sdg] Write Protect is off [3096185.297447] sd 61:0:0:0: [sdg] Mode Sense: 1c 00 00 00 [3096185.298022] sd 61:0:0:0: [sdg] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [3096185.392940] sdg: sdg69 sdg100 sdg101 sdg102 sdg103 sdg104 sdg105 [3096185.395247] sd 61:0:0:0: [sdg] Attached SCSI disk [3096189.359859] XFS (sdf100): xfs_log_force: error 5 returned. [3096219.395200] XFS (sdf100): xfs_log_force: error 5 returned. [3096249.430490] XFS (sdf100): xfs_log_force: error 5 returned. [3096279.465765] XFS (sdf100): xfs_log_force: error 5 returned. [3096309.501089] XFS (sdf100): xfs_log_force: error 5 returned. [3096339.536371] XFS (sdf100): xfs_log_force: error 5 returned. [3096369.571713] XFS (sdf100): xfs_log_force: error 5 returned. [3096399.607003] XFS (sdf100): xfs_log_force: error 5 returned. [3096429.642332] XFS (sdf100): xfs_log_force: error 5 returned. [3096459.677730] XFS (sdf100): xfs_log_force: error 5 returned. [3096489.712934] XFS (sdf100): xfs_log_force: error 5 returned. [3096519.748242] XFS (sdf100): xfs_log_force: error 5 returned. [3096549.783642] XFS (sdf100): xfs_log_force: error 5 returned. sdf100 (the old device) and sdg100 (the reconnected device) are different, but XFS won't touch it. # xfs_repair /dev/sdg100 xfs_repair: /dev/sdg100 contains a mounted filesystem fatal error -- couldn't initialize XFS library Also please do carefully note the difference between the lsof output for the hung file descriptor for xfs and ext4. ext4 reports everything the same as before, except for the mount path. xfs report changes, the device ID is missing, the file changes from REG to unknown. So, AFAIK and IMHO this is an issue with XFS. The impact can be the inability to recover from a device disconnect, since so far I don't see a good way to figure out which processes are holding up the FS. And besides, having to kill processes to mount a filesystem (xfs) is not a happy state of affairs. Oh yes, there is a hardware issue somewhere, but that is not the cause of the XFS behavior, only the trigger. Since the experiment in this email was without my USB HUB going nuts, I merely did a good old fashioned cable yank. And yes, it's not an every day occurrence, but a stable and reliable FS should deal with it. At least I think so, don't you? Sadly I can't help with the coding, I am not familiar with the code base, I got a bit lost trying to follow the path of ustat and proc mounts, it was ages since I touched the kernel sources. But I can provide information about what happened. :-) I hope it helps us all have a good FS. Martin PS # xfs_repair /dev/sdg100 xfs_repair: /dev/sdg100 contains a mounted filesystem fatal error -- couldn't initialize XFS library # kill 24010 # xfs_repair /dev/sdg100 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_repair. If you are unable to mount the filesystem, then use the -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTjaf4AAoJELsEaSRwbVYrJfsP/3z/WI5+dkk2XduRayB2FdOo S97IMjGHSEbNDNEAKvTsahYwZENE5TizuhyOrvQORl+fsMaedIdn2QYVS6fGAnJR llhNMQezUKOfwBZtpf3S3FmvFZCoN+q3BTfl2qkmY29c0aivLyxyTCsGlDprHY2Q pxv3QzsXRtM1FYk6+FFtc9XQYCiLU3KOAq4I7GoGcAMjFRpH8xpuogI2fQQQkFo8 NGxZBmtTq3xbOd/7237tug44Z98iM/uz+tT2xE5g3iJSqcEhaMTJbAkv9d6uBY8G xLb+yT5M2O6Z6xuZowk3ySFtO+Ia5Row3BhQrpuySdkRNueiJf9KTLMleMNxVqj8 DcNL2hFS6Fyog6g0wVfoUM3txm5wx80w15K2zN2cPnOsdDO11QKUbV9ktFjQ7f++ CLcmxGHtuq7SFM0bMgbcxvA5B9Gs/9tlzXDiN/jag3ixMZYTmOC15ayJevAM3Nru xN/lPBMiFO+Rr89yZz303M+hRRRD4pQL1VxcyPjs0f6l0tWqb2Xx0wpFBjantUyF EzIUwgekwMktzLefhTgXumDH/aE9xlY2au+sJtL255uX1XBq4qE4sxrGv73+L9Ti M+tToCi7sQPoMwzCqJqHHbYWwaisgbq9AFymy2FUFUSqiiV21NMdIZeu7zcDEzuj pG51qhnHCz5O48cPBpZx =ecc3 -----END PGP SIGNATURE----- From lczerner@redhat.com Tue Jun 3 06:34:47 2014 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 55D2D7F3F for ; Tue, 3 Jun 2014 06:34:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B63D8F8068 for ; Tue, 3 Jun 2014 04:34:44 -0700 (PDT) X-ASG-Debug-ID: 1401795282-04cbb050fb2cfab0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZDnfIGarWcZD5KS0 for ; Tue, 03 Jun 2014 04:34:43 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53BWY5X021783 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 3 Jun 2014 07:32:34 -0400 Received: from dhcp-1-230.brq.redhat.com (dhcp-1-230.brq.redhat.com [10.34.1.230]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53BWV0O003473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 3 Jun 2014 07:32:32 -0400 Date: Tue, 3 Jun 2014 13:32:30 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Jaegeuk Kim cc: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforget.net Subject: Re: [PATCH] xfstests: f2fs support In-Reply-To: <1401717572-21731-1-git-send-email-jaegeuk@kernel.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: f2fs support Message-ID: References: <1401717572-21731-1-git-send-email-jaegeuk@kernel.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401795283 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, 2 Jun 2014, jaegeuk@kernel.org wrote: > Date: Mon, 2 Jun 2014 22:59:32 +0900 > From: jaegeuk@kernel.org > To: Dave Chinner > Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, > linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforget.net, > Jaegeuk Kim > Subject: [PATCH] xfstests: f2fs support > > From: Jaegeuk Kim > > This patch adds to support f2fs file system. Hi, Looks good. Signed-off-by: Lukas Czerner Btw dry run option in fsck is quite useful here because when the file system gets corrupted you do not want it to get fixed, but rather investigate the corrupted file system to figure out what happened. But of course it's not required :) However after a quick look at you fsck code it seems that you do not attempt to fix anything at all... Also having mkfs to check for existing signatures on the device before attempting to create the file system is a good thing to do (at least xfs, btrfs extN are doing so) to avoid data loss by mistake. You can use libblkid from util-linux and it's very simple to use. Thanks! -Lukas > > Signed-off-by: Jaegeuk Kim > --- > common/config | 7 +++++++ > common/rc | 6 ++++++ > 2 files changed, 13 insertions(+) > > diff --git a/common/config b/common/config > index 0dbf0b9..0607294 100644 > --- a/common/config > +++ b/common/config > @@ -210,6 +210,7 @@ case "$HOSTOS" in > export MKFS_XFS_PROG="`set_prog_path mkfs.xfs`" > export MKFS_UDF_PROG="`set_prog_path mkudffs`" > export MKFS_BTRFS_PROG="`set_btrfs_mkfs_prog_path_with_opts`" > + export MKFS_F2FS_PROG="`set_prog_path mkfs.f2fs`" > export BTRFS_UTIL_PROG="`set_prog_path btrfs`" > export BTRFS_SHOW_SUPER_PROG="`set_prog_path btrfs-show-super`" > export XFS_FSR_PROG="`set_prog_path xfs_fsr`" > @@ -241,6 +242,9 @@ _mount_opts() > # acls & xattrs aren't turned on by default on ext$FOO > export MOUNT_OPTIONS="-o acl,user_xattr $EXT_MOUNT_OPTIONS" > ;; > + f2fs) > + export MOUNT_OPTIONS="-o acl,user_xattr $F2FS_MOUNT_OPTIONS" > + ;; > reiserfs) > # acls & xattrs aren't turned on by default on reiserfs > export MOUNT_OPTIONS="-o acl,user_xattr $REISERFS_MOUNT_OPTIONS" > @@ -295,6 +299,9 @@ _fsck_opts() > reiserfs) > export FSCK_OPTIONS="--yes" > ;; > + f2fs) > + export FSCK_OPTIONS="" > + ;; > *) > export FSCK_OPTIONS="-n" > ;; > diff --git a/common/rc b/common/rc > index f27ee53..fcdabfe 100644 > --- a/common/rc > +++ b/common/rc > @@ -105,6 +105,9 @@ case "$FSTYP" in > btrfs) > [ "$MKFS_BTRFS_PROG" = "" ] && _fatal "mkfs.btrfs not found" > ;; > + f2fs) > + [ "$MKFS_F2FS_PROG" = "" ] && _fatal "mkfs.f2fs not found" > + ;; > nfs) > ;; > esac > @@ -511,6 +514,9 @@ _scratch_mkfs() > tmpfs) > # do nothing for tmpfs > ;; > + f2fs) > + $MKFS_F2FS_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null > + ;; > *) > yes | $MKFS_PROG -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV > ;; > From arnd@arndb.de Tue Jun 3 07:24:01 2014 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 B26887F3F for ; Tue, 3 Jun 2014 07:24:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3DF95AC005 for ; Tue, 3 Jun 2014 05:23:58 -0700 (PDT) X-ASG-Debug-ID: 1401798235-04cbb050fd2d8ea0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id wuWj6sPNg0iqFJnV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 05:23:56 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.187 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue004) with ESMTP (Nemesis) id 0MOVOL-1Wunrb0i1d-005s9W; Tue, 03 Jun 2014 14:21:30 +0200 From: Arnd Bergmann To: Vyacheslav Dubeyko Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Tue, 03 Jun 2014 14:21:29 +0200 X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <7080340.W1OdttOEiZ@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <1401546649.2413.6.camel@slavad-CELSIUS-H720> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401546649.2413.6.camel@slavad-CELSIUS-H720> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:GCyaEvXF+a6CqYvAIaD0XSvsGbKpYYC5pdLSfa2ibf4 Pcj0L183367z9YpUfkI0zMCoBBAbor65lVV3SpkMzMdFMcwDHc cfAnvxNh7gW05d7+o+2el/OyWfxkhvcR0D0Tb+xV0Vy5dpH91o pY4UZWrXwtr0Iq1SGVphgKfFWLfR0I4CVnsuBM+kRZO9FYi/SO hytz0QhkW+DkpzflHPftTZGti1QrvH+Dd8NpzmjCujnVW5uKwj EMMCCvOmtUw3TITRCAG0/rmMrwDreABG+IcFMdFwLUFBRDe7sI ErjL/tgjro7hcPU/n6EnFUG2bHXpmp6ss/j16yfdHv2ynJlUjA lE8GQX1SC90Ljh0tuiGQ= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1401798236 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6342 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Saturday 31 May 2014 18:30:49 Vyacheslav Dubeyko wrote: > By the way, what about NILFS2? Is NILFS2 ready for suggested approach > without any changes? nilfs2 and a lot of other file systems don't need any changes for this, because they don't assign the inode time stamp fields to a 'struct timespec'. FWIW, nilfs2 uses a 64-bit seconds value, which is always safe and can represent the full range of user space timespec on all machines. Arnd From lczerner@redhat.com Tue Jun 3 07:52:05 2014 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 D5F537F3F for ; Tue, 3 Jun 2014 07:52:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA0898F8071 for ; Tue, 3 Jun 2014 05:52:02 -0700 (PDT) X-ASG-Debug-ID: 1401799921-04cbb050fc2dc3f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vDCvNMWh7oROtyrU for ; Tue, 03 Jun 2014 05:52:02 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53Cnvvl011668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 3 Jun 2014 08:49:58 -0400 Received: from dhcp-1-230.brq.redhat.com (dhcp-1-230.brq.redhat.com [10.34.1.230]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53Cns8T004204 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 3 Jun 2014 08:49:55 -0400 Date: Tue, 3 Jun 2014 14:49:53 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Jaegeuk Kim cc: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforget.net Subject: Re: [PATCH] xfstests: f2fs support In-Reply-To: X-ASG-Orig-Subj: Re: [PATCH] xfstests: f2fs support Message-ID: References: <1401717572-21731-1-git-send-email-jaegeuk@kernel.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-788635479-1401799797=:2112" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401799921 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-788635479-1401799797=:2112 Content-Type: TEXT/PLAIN; charset=ISO-8859-15 Content-Transfer-Encoding: 8BIT On Tue, 3 Jun 2014, Luk Czerner wrote: > Date: Tue, 3 Jun 2014 13:32:30 +0200 (CEST) > From: Luk Czerner > To: Jaegeuk Kim > Cc: Dave Chinner , xfs@oss.sgi.com, > linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, > linux-f2fs-devel@lists.sourceforget.net > Subject: Re: [PATCH] xfstests: f2fs support > > On Mon, 2 Jun 2014, jaegeuk@kernel.org wrote: > > > Date: Mon, 2 Jun 2014 22:59:32 +0900 > > From: jaegeuk@kernel.org > > To: Dave Chinner > > Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, > > linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforget.net, > > Jaegeuk Kim > > Subject: [PATCH] xfstests: f2fs support > > > > From: Jaegeuk Kim > > > > This patch adds to support f2fs file system. > > Hi, > > Looks good. > > Signed-off-by: Lukas Czerner > Oops, wrong macro. I meant to say Reviewed-by: Lukas Czerner > Btw dry run option in fsck is quite useful here because when the > file system gets corrupted you do not want it to get fixed, but > rather investigate the corrupted file system to figure out what > happened. But of course it's not required :) > > However after a quick look at you fsck code it seems that you do not > attempt to fix anything at all... > > Also having mkfs to check for existing signatures on the device > before attempting to create the file system is a good thing to do > (at least xfs, btrfs extN are doing so) to avoid data loss by > mistake. You can use libblkid from util-linux and it's very simple > to use. > > Thanks! > -Lukas > > > > > Signed-off-by: Jaegeuk Kim > > --- > > common/config | 7 +++++++ > > common/rc | 6 ++++++ > > 2 files changed, 13 insertions(+) > > > > diff --git a/common/config b/common/config > > index 0dbf0b9..0607294 100644 > > --- a/common/config > > +++ b/common/config > > @@ -210,6 +210,7 @@ case "$HOSTOS" in > > export MKFS_XFS_PROG="`set_prog_path mkfs.xfs`" > > export MKFS_UDF_PROG="`set_prog_path mkudffs`" > > export MKFS_BTRFS_PROG="`set_btrfs_mkfs_prog_path_with_opts`" > > + export MKFS_F2FS_PROG="`set_prog_path mkfs.f2fs`" > > export BTRFS_UTIL_PROG="`set_prog_path btrfs`" > > export BTRFS_SHOW_SUPER_PROG="`set_prog_path btrfs-show-super`" > > export XFS_FSR_PROG="`set_prog_path xfs_fsr`" > > @@ -241,6 +242,9 @@ _mount_opts() > > # acls & xattrs aren't turned on by default on ext$FOO > > export MOUNT_OPTIONS="-o acl,user_xattr $EXT_MOUNT_OPTIONS" > > ;; > > + f2fs) > > + export MOUNT_OPTIONS="-o acl,user_xattr $F2FS_MOUNT_OPTIONS" > > + ;; > > reiserfs) > > # acls & xattrs aren't turned on by default on reiserfs > > export MOUNT_OPTIONS="-o acl,user_xattr $REISERFS_MOUNT_OPTIONS" > > @@ -295,6 +299,9 @@ _fsck_opts() > > reiserfs) > > export FSCK_OPTIONS="--yes" > > ;; > > + f2fs) > > + export FSCK_OPTIONS="" > > + ;; > > *) > > export FSCK_OPTIONS="-n" > > ;; > > diff --git a/common/rc b/common/rc > > index f27ee53..fcdabfe 100644 > > --- a/common/rc > > +++ b/common/rc > > @@ -105,6 +105,9 @@ case "$FSTYP" in > > btrfs) > > [ "$MKFS_BTRFS_PROG" = "" ] && _fatal "mkfs.btrfs not found" > > ;; > > + f2fs) > > + [ "$MKFS_F2FS_PROG" = "" ] && _fatal "mkfs.f2fs not found" > > + ;; > > nfs) > > ;; > > esac > > @@ -511,6 +514,9 @@ _scratch_mkfs() > > tmpfs) > > # do nothing for tmpfs > > ;; > > + f2fs) > > + $MKFS_F2FS_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null > > + ;; > > *) > > yes | $MKFS_PROG -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV > > ;; > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > --8323328-788635479-1401799797=:2112-- From roger@filmlight.ltd.uk Tue Jun 3 08:09:50 2014 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 509377F3F for ; Tue, 3 Jun 2014 08:09:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DCBBCAC003 for ; Tue, 3 Jun 2014 06:09:46 -0700 (PDT) X-ASG-Debug-ID: 1401800984-04bdf0599e504880001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id NSWY1HLQXSXOrsCa for ; Tue, 03 Jun 2014 06:09:44 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 2896 invoked from network); 3 Jun 2014 13:09:44 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.132?) (roger@10.44.0.132) by b.mx.filmlight.ltd.uk with SMTP; 3 Jun 2014 13:09:44 -0000 Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: Roger Willcocks X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time To: Theodore Ts'o Cc: "H. Peter Anvin" , Nicolas Pitre , linux-arch@vger.kernel.org, Linux NFS Mailing List , Arnd Bergmann , LKML Kernel , xfs@oss.sgi.com, Christoph Hellwig , Chuck Lever , john.stultz@linaro.org, lftan@altera.com, linux-fsdevel , geert@linux-m68k.org, tglx@linutronix.de, joseph@codesourcery.com In-Reply-To: <20140602233212.GA2060@thunk.org> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <8618458.1EVJCoVbkH@wuerfel> <4178301.j9kWdGCRLC@wuerfel> <6868F108-F0B2-423F-AE31-90DF86A5B7DD@oracle.com> <20140602153124.GH30598@thunk.org> <538CB085.5000502@zytor.com> <20140602222954.GA29690@thunk.org> <538CFB83.20703@zytor.com> <20140602233212.GA2060@thunk.org> Content-Type: text/plain Date: Tue, 03 Jun 2014 14:09:43 +0100 Message-Id: <1401800983.6065.272.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1401800984 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6343 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 2014-06-02 at 19:32 -0400, Theodore Ts'o wrote: > Linux's time(2) can return (time_t) -1 and set errno to EFAULT, per > the Posix specification: > > SYSCALL_DEFINE1(time, time_t __user *, tloc) > { > time_t i = get_seconds(); > > if (tloc) { > if (put_user(i,tloc)) > return -EFAULT; > } > force_successful_syscall_return(); > return i; > } get_seconds() returns an unsigned long so there's potential for overflow here. -- Roger From arnd@arndb.de Tue Jun 3 09:25:09 2014 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 8F43D7F3F for ; Tue, 3 Jun 2014 09:25:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4ABE18F8081 for ; Tue, 3 Jun 2014 07:25:06 -0700 (PDT) X-ASG-Debug-ID: 1401805503-04bdf059a050d310001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id X4CPfQEuHhKMaC6f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 07:25:04 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.126.187 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue004) with ESMTP (Nemesis) id 0M5tBF-1WbvXe3QZF-00xpVE; Tue, 03 Jun 2014 16:22:20 +0200 From: Arnd Bergmann To: "H. Peter Anvin" Cc: "Joseph S. Myers" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@telemann.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Tue, 03 Jun 2014 16:22:19 +0200 X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <5011138.W0gbOc20Qp@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <538CF346.2070504@zytor.com> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <7175692.dpgYFMbTaP@wuerfel> <538CF346.2070504@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:/TknYcvxqhw//en3UBNTXYoqE+nfyCOaZmUTHg9HpZU aC0W/PXkJOE0Js/B8qBmgymT99hg/mBq0CoYbMg3+Ws5/vBDaw V5q8w4s9F070Oz04sogKJ9tWjemFSNUx9Yp/1O8RJEzRrc4jRV kO9ic3AMip5+RUjpxm/bnaJdXZ1s36b08xwkVVI88o+5W/J2am s7HCMRggMHyGdMTDHC3AFXGsJShC5hcmSWvvYrZOrEdK29R8Lp YhGd03/cwjR6NOZPHMOItDveG9Z8AYDbBvr8ht0C8SH4p97d9d EqyWi2k40+ydoqiahD6X4cNsBWaLd8+TWKENN7Chgg7/w1L3p4 p42LCxcvS7fkjtYYW/Xg= X-Barracuda-Connect: mout.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1401805504 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.6344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Monday 02 June 2014 14:57:26 H. Peter Anvin wrote: > On 06/02/2014 12:55 PM, Arnd Bergmann wrote: > >> > >> The bit that is really going to hurt is every single ioctl that uses a > >> timespec. > >> > >> Honestly, though, I really don't understand the point with "struct > >> inode_time". It seems like the zeroeth-order thing is to change the > >> kernel internal version of struct timespec to have a 64-bit time... it > >> isn't just about inodes. We then should be explicit about the external > >> uses of time, and use accessors. > > > > I picked these because they are fairly isolated from all other uses, > > in particular since inode times are the only things where we really > > care about times in the distant past or future (decades away as opposed > > to things that happened between boot and shutdown). > > > > If nothing else, I would expect to be able to set the system time to > weird values for testing. So I'm not so sure I agree with that... I think John Stultz and Thomas Gleixner have already started looking at how the timekeeping code can be updated. Once that is done, we should be able to add a functional 64-bit gettimeofday/settimeofday syscall pair. While I definitely agree this is one of the most basic things to have, it's also not an area of the kernel that is easy to change. > > For other kernel-internal uses, we may be better off migrating to > > a completely different representation, such as nanoseconds since > > boot or the architecture specific ktime_t, but this is really something > > to decide for each subsystem. > > Having a bunch of different time representations in the kernel seems > like a real headache... We already have time_t, ktime_t, timeval, timespec, compat_timespec, clock_t, cputime_t, cputime64_t, tm, nanoseconds, jiffies, jiffies64, and lots of driver or file system specific representations. I'm all for removing a bunch of these from the kernel, but my feeling is that this is one of the cases where we first have to add new ones in order to remove those that are already there. To complicate things further, we also have various times bases (realtime/utc, realtime/tai, monotonic, monotonic_raw, boottime, ...), and at least for the timespec values we pass around, it's not always obvious which one is used, of if that's the right one. We probably don't want to add a lot of new representations, and it's possible that we can change most of the internal code we have to ktime_t and then convert that to whatever user space wants at the interfaces. The possible uses I can see for non-ktime_t types in the kernel are: * inodes need 96 bit timestamps to represent the full range of values that can be stored in a file system, you made a convincing argument for that. Almost everything else can fit into 64 bit on a 32-bit kernel, in theory also on a 64-bit kernel if we want that. * A number of interfaces pass relative timespecs: nanosleep(), poll(), select(), sigtimedwait(), alarm(), futex() and probably more. There is nothing wrong with the use of timespec here, and it may be good to annotate that by using a new type (e.g. struct timeout) that is defined as compatible with the current timespec. * For new user interfaces, we need a new type such as the __kernel_timespec64 I introduced, so it doesn't clash with the normal user timespec that may be smaller, depending on the libc. * A lot of drivers will need new ioctl commands, and for drivers that just need time stamps (audio, v4l, sockets, ...) it may be more efficient and more correct to use a new timestamp_t (e.g. boot time 64-bit nanoseconds) than __kernel_timespec64, which is not normally monotonic and requires a normalization step. If we end up introducing such a type in the user interface, we can also start using it in the kernel. Arnd From joseph_myers@mentor.com Tue Jun 3 09:33:34 2014 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 574E67F3F for ; Tue, 3 Jun 2014 09:33:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4FECAC003 for ; Tue, 3 Jun 2014 07:33:33 -0700 (PDT) X-ASG-Debug-ID: 1401806009-04cbb050fd2e7c90001-NocioJ Received: from relay1.mentorg.com ([192.94.38.131]) by cuda.sgi.com with ESMTP id ojDchCIeNs7k5nGN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 07:33:30 -0700 (PDT) X-Barracuda-Envelope-From: joseph_myers@mentor.com X-Barracuda-Apparent-Source-IP: 192.94.38.131 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1Wrpm6-0001rv-MB from joseph_myers@mentor.com ; Tue, 03 Jun 2014 07:33:14 -0700 Received: from SVR-IES-FEM-02.mgc.mentorg.com ([137.202.0.106]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 3 Jun 2014 07:33:14 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-02.mgc.mentorg.com (137.202.0.106) with Microsoft SMTP Server id 14.2.247.3; Tue, 3 Jun 2014 15:33:12 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1Wrpm2-0003K0-PE; Tue, 03 Jun 2014 14:33:10 +0000 Date: Tue, 3 Jun 2014 14:33:10 +0000 From: "Joseph S. Myers" X-X-Sender: jsm28@digraph.polyomino.org.uk To: Arnd Bergmann CC: "H. Peter Anvin" , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: Re: [RFC 00/32] making inode time stamps y2038 ready In-Reply-To: <5011138.W0gbOc20Qp@wuerfel> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <7175692.dpgYFMbTaP@wuerfel> <538CF346.2070504@zytor.com> <5011138.W0gbOc20Qp@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Sender: Joseph Myers X-OriginalArrivalTime: 03 Jun 2014 14:33:14.0298 (UTC) FILETIME=[C095E9A0:01CF7F38] X-Barracuda-Connect: UNKNOWN[192.94.38.131] X-Barracuda-Start-Time: 1401806010 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, 3 Jun 2014, Arnd Bergmann wrote: > I think John Stultz and Thomas Gleixner have already started looking > at how the timekeeping code can be updated. Once that is done, we should > be able to add a functional 64-bit gettimeofday/settimeofday syscall > pair. While I definitely agree this is one of the most basic things to > have, it's also not an area of the kernel that is easy to change. 64-bit clock_gettime / clock_settime instead of gettimeofday / settimeofday should avoid the need for the kernel to have a 64-bit version of struct timeval. (Userspace 64-bit gettimeofday / settimeofday would need to use a combination of the syscalls if the tz pointer is non-NULL.) -- Joseph S. Myers joseph@codesourcery.com From bfoster@redhat.com Tue Jun 3 09:49:42 2014 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 363887F3F for ; Tue, 3 Jun 2014 09:49:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 199B58F8040 for ; Tue, 3 Jun 2014 07:49:42 -0700 (PDT) X-ASG-Debug-ID: 1401806979-04cbb050fd2e9460001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9y3gtElrSdM1WgG9 for ; Tue, 03 Jun 2014 07:49:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndIk017570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53End8q007347 for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 41C181248BB; Tue, 3 Jun 2014 10:49:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 2/4] xfs: support a union-based filter for eofblocks scans Date: Tue, 3 Jun 2014 10:49:36 -0400 X-ASG-Orig-Subj: [PATCH v3 2/4] xfs: support a union-based filter for eofblocks scans Message-Id: <1401806978-59205-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1401806978-59205-1-git-send-email-bfoster@redhat.com> References: <1401806978-59205-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401806981 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The eofblocks scan inode filter uses intersection logic by default. E.g., specifying both user and group quota ids filters out inodes that are not covered by both the specified user and group quotas. This is suitable for behavior exposed to userspace. Scans that are initiated from within the kernel might require more broad semantics, such as scanning all inodes under each quota associated with an inode to alleviate low free space conditions in each. Create the XFS_EOF_FLAGS_UNION flag to support a conditional union-based filtering algorithm for eofblocks scans. This flag is intentionally left out of the valid mask as it is not supported for scans initiated from userspace. Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 3 +++ fs/xfs/xfs_icache.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index d34703d..ffdabc6 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -375,6 +375,9 @@ struct xfs_fs_eofblocks { #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ +#define XFS_EOF_FLAGS_UNION (1 << 5) /* union filter algorithm; + * kernel only, not included in + * valid mask */ #define XFS_EOF_FLAGS_VALID \ (XFS_EOF_FLAGS_SYNC | \ XFS_EOF_FLAGS_UID | \ diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index ee87bcb..6be93e7 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1203,6 +1203,30 @@ xfs_inode_match_id( return 1; } +/* + * A union-based inode filtering algorithm. Process the inode if any of the + * criteria match. This is for global/internal scans only. + */ +STATIC int +xfs_inode_match_id_union( + struct xfs_inode *ip, + struct xfs_eofblocks *eofb) +{ + if ((eofb->eof_flags & XFS_EOF_FLAGS_UID) && + uid_eq(VFS_I(ip)->i_uid, eofb->eof_uid)) + return 1; + + if ((eofb->eof_flags & XFS_EOF_FLAGS_GID) && + gid_eq(VFS_I(ip)->i_gid, eofb->eof_gid)) + return 1; + + if ((eofb->eof_flags & XFS_EOF_FLAGS_PRID) && + xfs_get_projid(ip) == eofb->eof_prid) + return 1; + + return 0; +} + STATIC int xfs_inode_free_eofblocks( struct xfs_inode *ip, @@ -1212,6 +1236,7 @@ xfs_inode_free_eofblocks( int ret; struct xfs_eofblocks *eofb = args; bool need_iolock = true; + int match; ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); @@ -1231,7 +1256,11 @@ xfs_inode_free_eofblocks( return 0; if (eofb) { - if (!xfs_inode_match_id(ip, eofb)) + if (eofb->eof_flags & XFS_EOF_FLAGS_UNION) + match = xfs_inode_match_id_union(ip, eofb); + else + match = xfs_inode_match_id(ip, eofb); + if (!match) return 0; /* skip the inode if the file size is too small */ -- 1.8.3.1 From bfoster@redhat.com Tue Jun 3 09:49:42 2014 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 3C31C7F47 for ; Tue, 3 Jun 2014 09:49:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 235488F804B for ; Tue, 3 Jun 2014 07:49:42 -0700 (PDT) X-ASG-Debug-ID: 1401806979-04cbb050fc2e9460001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JQjxEXyvDbEDBRBs for ; Tue, 03 Jun 2014 07:49:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndkK017574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53Endjm032669 for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4D22F1248D1; Tue, 3 Jun 2014 10:49:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 3/4] xfs: run an eofblocks scan on ENOSPC/EDQUOT Date: Tue, 3 Jun 2014 10:49:37 -0400 X-ASG-Orig-Subj: [PATCH v3 3/4] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-Id: <1401806978-59205-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1401806978-59205-1-git-send-email-bfoster@redhat.com> References: <1401806978-59205-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401806981 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Speculative preallocation and and the associated throttling metrics assume we're working with large files on large filesystems. Users have reported inefficiencies in these mechanisms when we happen to be dealing with large files on smaller filesystems. This can occur because while prealloc throttling is aggressive under low free space conditions, it is not active until we reach 5% free space or less. For example, a 40GB filesystem has enough space for several files large enough to have multi-GB preallocations at any given time. If those files are slow growing, they might reserve preallocation for long periods of time as well as avoid the background scanner due to frequent modification. If a new file is written under these conditions, said file has no access to this already reserved space and premature ENOSPC is imminent. To handle this scenario, modify the buffered write ENOSPC handling and retry sequence to invoke an eofblocks scan. In the smaller filesystem scenario, the eofblocks scan resets the usage of preallocation such that when the 5% free space threshold is met, throttling effectively takes over to provide fair and efficient preallocation until legitimate ENOSPC. The eofblocks scan is selective based on the nature of the failure. For example, an EDQUOT failure in a particular quota will use a filtered scan for that quota. Because we don't know which quota might have caused an allocation failure at any given time, we include each applicable quota determined to be under low free space conditions in the scan. Signed-off-by: Brian Foster --- fs/xfs/xfs_dquot.h | 15 +++++++++++++++ fs/xfs/xfs_file.c | 23 +++++++++++++++++++---- fs/xfs/xfs_icache.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_icache.h | 1 + 4 files changed, 87 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 68a68f7..c24c67e 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -139,6 +139,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) } } +/* + * Check whether a dquot is under low free space conditions. We assume the quota + * is enabled and enforced. + */ +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) +{ + int64_t freesp; + + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) + return true; + + return false; +} + #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1b8160d..2e0e73b 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -38,6 +38,7 @@ #include "xfs_trace.h" #include "xfs_log.h" #include "xfs_dinode.h" +#include "xfs_icache.h" #include #include @@ -741,14 +742,28 @@ write_retry: ret = generic_perform_write(file, &from, pos); if (likely(ret >= 0)) iocb->ki_pos = pos + ret; + /* - * If we just got an ENOSPC, try to write back all dirty inodes to - * convert delalloc space to free up some of the excess reserved - * metadata space. + * If we hit a space limit, try to free up some lingering preallocated + * space before returning an error. In the case of ENOSPC, first try to + * write back all dirty inodes to free up some of the excess reserved + * metadata space. This reduces the chances that the eofblocks scan + * waits on dirty mappings. Since xfs_flush_inodes() is serialized, this + * also behaves as a filter to prevent too many eofblocks scans from + * running at the same time. */ - if (ret == -ENOSPC && !enospc) { + if (ret == -EDQUOT && !enospc) { + enospc = xfs_inode_free_quota_eofblocks(ip); + if (enospc) + goto write_retry; + } else if (ret == -ENOSPC && !enospc) { + struct xfs_eofblocks eofb = {0}; + enospc = 1; xfs_flush_inodes(ip->i_mount); + eofb.eof_scan_owner = ip->i_ino; /* for locking */ + eofb.eof_flags = XFS_EOF_FLAGS_SYNC; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); goto write_retry; } diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 6be93e7..35eb658 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -33,6 +33,9 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_bmap_util.h" +#include "xfs_quota.h" +#include "xfs_dquot_item.h" +#include "xfs_dquot.h" #include #include @@ -1300,6 +1303,55 @@ xfs_icache_free_eofblocks( eofb, XFS_ICI_EOFBLOCKS_TAG); } +/* + * Run eofblocks scans on the quotas applicable to the inode. For inodes with + * multiple quotas, we don't know exactly which quota caused an allocation + * failure. We make a best effort by including each quota under low free space + * conditions (less than 1% free space) in the scan. + */ +int +xfs_inode_free_quota_eofblocks( + struct xfs_inode *ip) +{ + int scan = 0; + struct xfs_eofblocks eofb = {0}; + struct xfs_dquot *dq; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + + /* + * Set the scan owner to avoid a potential livelock. Otherwise, the scan + * can repeatedly trylock on the inode we're currently processing. We + * run a sync scan to increase effectiveness and use the union filter to + * cover all applicable quotas in a single scan. + */ + eofb.eof_scan_owner = ip->i_ino; + eofb.eof_flags = XFS_EOF_FLAGS_UNION|XFS_EOF_FLAGS_SYNC; + + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_USER); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_uid = VFS_I(ip)->i_uid; + eofb.eof_flags |= XFS_EOF_FLAGS_UID; + scan = 1; + } + } + + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_gid = VFS_I(ip)->i_gid; + eofb.eof_flags |= XFS_EOF_FLAGS_GID; + scan = 1; + } + } + + if (scan) + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + + return scan; +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 152757f..b432d83 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -58,6 +58,7 @@ void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_icache_free_eofblocks(struct xfs_mount *, struct xfs_eofblocks *); +int xfs_inode_free_quota_eofblocks(struct xfs_inode *ip); void xfs_eofblocks_worker(struct work_struct *); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Tue Jun 3 09:49:43 2014 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 3AC4A7F47 for ; Tue, 3 Jun 2014 09:49:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3E05304032 for ; Tue, 3 Jun 2014 07:49:42 -0700 (PDT) X-ASG-Debug-ID: 1401806979-04bdf0599f50f6e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pJ1DJw4GG8jGEVQM for ; Tue, 03 Jun 2014 07:49:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndId008192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndWV005651 for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 389E7124894; Tue, 3 Jun 2014 10:49:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 1/4] xfs: add scan owner field to xfs_eofblocks Date: Tue, 3 Jun 2014 10:49:35 -0400 X-ASG-Orig-Subj: [PATCH v3 1/4] xfs: add scan owner field to xfs_eofblocks Message-Id: <1401806978-59205-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1401806978-59205-1-git-send-email-bfoster@redhat.com> References: <1401806978-59205-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401806981 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The scan owner field represents an optional inode number that is responsible for the current scan. The purpose is to identify that an inode is under iolock and as such, the iolock shouldn't be attempted when trimming eofblocks. This is an internal only field. Signed-off-by: Brian Foster --- fs/xfs/xfs_icache.c | 13 ++++++++++++- fs/xfs/xfs_icache.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index c48df5f..ee87bcb 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1211,6 +1211,9 @@ xfs_inode_free_eofblocks( { int ret; struct xfs_eofblocks *eofb = args; + bool need_iolock = true; + + ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); if (!xfs_can_free_eofblocks(ip, false)) { /* inode could be preallocated or append-only */ @@ -1235,9 +1238,17 @@ xfs_inode_free_eofblocks( if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && XFS_ISIZE(ip) < eofb->eof_min_file_size) return 0; + + /* + * A scan owner implies we already hold the iolock. Skip it in + * xfs_free_eofblocks() to avoid deadlock. This also eliminates + * the possibility of EAGAIN being returned. + */ + if (eofb->eof_scan_owner == ip->i_ino) + need_iolock = false; } - ret = xfs_free_eofblocks(ip->i_mount, ip, true); + ret = xfs_free_eofblocks(ip->i_mount, ip, need_iolock); /* don't revisit the inode if we're not waiting */ if (ret == EAGAIN && !(flags & SYNC_WAIT)) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 9cf017b..152757f 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -27,6 +27,7 @@ struct xfs_eofblocks { kgid_t eof_gid; prid_t eof_prid; __u64 eof_min_file_size; + xfs_ino_t eof_scan_owner; }; #define SYNC_WAIT 0x0001 /* wait for i/o to complete */ @@ -84,6 +85,7 @@ xfs_fs_eofblocks_from_user( dst->eof_flags = src->eof_flags; dst->eof_prid = src->eof_prid; dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_scan_owner = NULLFSINO; dst->eof_uid = INVALID_UID; if (src->eof_flags & XFS_EOF_FLAGS_UID) { -- 1.8.3.1 From bfoster@redhat.com Tue Jun 3 09:49:43 2014 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 226207F3F for ; Tue, 3 Jun 2014 09:49:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F529AC005 for ; Tue, 3 Jun 2014 07:49:42 -0700 (PDT) X-ASG-Debug-ID: 1401806979-04cb6c10091b84a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qW7DQqAwQSwVhI8s for ; Tue, 03 Jun 2014 07:49:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndTh006763 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndVO000387 for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 29B721248A9; Tue, 3 Jun 2014 10:49:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/4] xfs: run eofblocks scan on ENOSPC Date: Tue, 3 Jun 2014 10:49:34 -0400 X-ASG-Orig-Subj: [PATCH v3 0/4] xfs: run eofblocks scan on ENOSPC Message-Id: <1401806978-59205-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401806981 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v3 of the eofblocks scan on ENOSPC series. The primary change is the insertion of patch 2, which implements a union inode filter for eofblocks scans. This facilitates the EDQUOT handling in patch 3 to cover multiple quotas with a single scan. Version 2 and associated feedback is available here: http://oss.sgi.com/archives/xfs/2014-05/msg00527.html There was also some discussion about dropping the iolock in favor of introducing the scan owner field, but it's not clear if that is totally safe. FWIW, the scan owner field is kernel only, so can be removed and replaced with smarter locking any time down the road. Thoughts, reviews, flames appreciated. Brian v3: - Removed NULLFSINO check in eofblocks scan owner logic, added ASSERT. - Added union-based eofblocks scan filter patch and use in quota ENOSPC scan. v2: - Drop flush mechanism during eofblocks scan (along with prereq patch). - Simplify scan logic on ENOSPC. Separate EDQUOT from ENOSPC and tie ENOSPC scan to inode flush. - Eliminate unnecessary project quota handling from xfs_inode_free_quota_eofblocks() (ENOSPC is a separate path). Brian Foster (4): xfs: add scan owner field to xfs_eofblocks xfs: support a union-based filter for eofblocks scans xfs: run an eofblocks scan on ENOSPC/EDQUOT xfs: squash prealloc while over quota free space as well fs/xfs/xfs_dquot.h | 15 +++++++++ fs/xfs/xfs_file.c | 23 ++++++++++--- fs/xfs/xfs_fs.h | 3 ++ fs/xfs/xfs_icache.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_icache.h | 3 ++ fs/xfs/xfs_iomap.c | 20 +++++++---- 6 files changed, 148 insertions(+), 12 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Tue Jun 3 09:49:43 2014 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 AD38A7F47 for ; Tue, 3 Jun 2014 09:49:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 56087AC003 for ; Tue, 3 Jun 2014 07:49:43 -0700 (PDT) X-ASG-Debug-ID: 1401806980-04bdf0599e50f6e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nEwUhrLYDBk8hauP for ; Tue, 03 Jun 2014 07:49:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndgU014237 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53EndAV024676 for ; Tue, 3 Jun 2014 10:49:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 623781248D5; Tue, 3 Jun 2014 10:49:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 4/4] xfs: squash prealloc while over quota free space as well Date: Tue, 3 Jun 2014 10:49:38 -0400 X-ASG-Orig-Subj: [PATCH v3 4/4] xfs: squash prealloc while over quota free space as well Message-Id: <1401806978-59205-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1401806978-59205-1-git-send-email-bfoster@redhat.com> References: <1401806978-59205-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401806981 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 4d559a3b introduced heavy prealloc. squashing to catch the case of requesting too large a prealloc on smaller filesystems, leading to repeated flush and retry cycles that occur on ENOSPC. Now that we issue eofblocks scans on EDQUOT/ENOSPC, squash the prealloc against the minimum available free space across all applicable quotas as well to avoid a similar problem of repeated eofblocks scans. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 6c5eb4c..28629e9 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -397,7 +397,8 @@ xfs_quota_calc_throttle( struct xfs_inode *ip, int type, xfs_fsblock_t *qblocks, - int *qshift) + int *qshift, + int64_t *qfreesp) { int64_t freesp; int shift = 0; @@ -406,6 +407,7 @@ xfs_quota_calc_throttle( /* over hi wmark, squash the prealloc completely */ if (dq->q_res_bcount >= dq->q_prealloc_hi_wmark) { *qblocks = 0; + *qfreesp = 0; return; } @@ -418,6 +420,9 @@ xfs_quota_calc_throttle( shift += 2; } + if (freesp < *qfreesp) + *qfreesp = freesp; + /* only overwrite the throttle values if we are more aggressive */ if ((freesp >> shift) < (*qblocks >> *qshift)) { *qblocks = freesp; @@ -476,15 +481,18 @@ xfs_iomap_prealloc_size( } /* - * Check each quota to cap the prealloc size and provide a shift - * value to throttle with. + * Check each quota to cap the prealloc size, provide a shift value to + * throttle with and adjust amount of available space. */ if (xfs_quota_need_throttle(ip, XFS_DQ_USER, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_GROUP, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_PROJ, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift, + &freesp); /* * The final prealloc size is set to the minimum of free space available -- 1.8.3.1 From arnd@arndb.de Tue Jun 3 09:50:12 2014 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 EE5127F4E for ; Tue, 3 Jun 2014 09:50:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 869EFAC008 for ; Tue, 3 Jun 2014 07:50:11 -0700 (PDT) X-ASG-Debug-ID: 1401807009-04cb6c100c1b8590001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.13]) by cuda.sgi.com with ESMTP id kgGkOQCIarjdxy3c (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Jun 2014 07:50:10 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.13 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue105) with ESMTP (Nemesis) id 0Lxfpr-1WlIoF1wTL-017GJx; Tue, 03 Jun 2014 16:48:01 +0200 From: Arnd Bergmann To: "Joseph S. Myers" Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@telemann.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Tue, 03 Jun 2014 16:37:46 +0200 X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <18158267.ZX0ZMPkVDT@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5011138.W0gbOc20Qp@wuerfel> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:lhh16hhzDga+wuX0yot35qy8ewce/OLryeDVZ6Ib54z x8bh0dGp6kRHA5Pjkmp0eBlHXBwS878NPxUOpTgF6cynLgREKg pj+XgUwhISmBPt1+yqI8X+5tuqHJpdzrwZ57d/+K1P4skoa2T8 E1ohenQx6w28BbWlO0+R2wUEOcrMsUFcNTynqQX8TxKHrXM82E Vg4egsuBsozesDVmx0ou5ldMVIm5DbIlQo8Osv2gaIdsuDYV+v efLD4/ROf9J5woNWw7EoxtLSNvkMN61+G7645T2fYb0MCYjmEa LJZsTQjYOKSUdZkhlH2z8fjpe6SHvIB8ivM52ElBpf5ArfXSDj ivfVx9Ov9bPZVP4lx1h4= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.13] X-Barracuda-Start-Time: 1401807010 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tuesday 03 June 2014 14:33:10 Joseph S. Myers wrote: > On Tue, 3 Jun 2014, Arnd Bergmann wrote: > > > I think John Stultz and Thomas Gleixner have already started looking > > at how the timekeeping code can be updated. Once that is done, we should > > be able to add a functional 64-bit gettimeofday/settimeofday syscall > > pair. While I definitely agree this is one of the most basic things to > > have, it's also not an area of the kernel that is easy to change. > > 64-bit clock_gettime / clock_settime instead of gettimeofday / > settimeofday should avoid the need for the kernel to have a 64-bit version > of struct timeval. (Userspace 64-bit gettimeofday / settimeofday would > need to use a combination of the syscalls if the tz pointer is non-NULL.) Yes, that's what I meant. Arnd From bfoster@redhat.com Tue Jun 3 09:54:02 2014 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 16C927F47 for ; Tue, 3 Jun 2014 09:54:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C37398F8040 for ; Tue, 3 Jun 2014 07:54:01 -0700 (PDT) X-ASG-Debug-ID: 1401807240-04bdf0599e50fdf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7ReDfaoIOxIA4H8F for ; Tue, 03 Jun 2014 07:54:00 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com 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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53Es0Bb016323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 3 Jun 2014 10:54:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s53Erx5R013822; Tue, 3 Jun 2014 10:53:59 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B14091248A9; Tue, 3 Jun 2014 10:53:58 -0400 (EDT) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH v2] xfstests: test speculative preallocation reclaim on ENOSPC/EDQUOT Date: Tue, 3 Jun 2014 10:53:58 -0400 X-ASG-Orig-Subj: [PATCH v2] xfstests: test speculative preallocation reclaim on ENOSPC/EDQUOT Message-Id: <1401807238-59437-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401807240 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS can allocate significant amounts of space to files via speculative preallocation. Such preallocation may not be reclaimed automatically on file close() if a file is repeatedly opened and extended. For smaller filesystems with relatively large and slow growing files, this preallocation can linger for some time, including contributing to out of space conditions. Create a situation where an fs is near out of space while several files still have lingering, significant preallocations. Verify that new writers reclaim the preallocated space rather than return ENOSPC. Repeat a similar test for quota limits and EDQUOT. Signed-off-by: Brian Foster --- v2: - Added a post-test scratch fs check. - Use a loop device to reduce the space requirement. - Added support for analogous EDQUOT test and added to quota group. - Some refactoring, cleanups, etc. v1: http://oss.sgi.com/archives/xfs/2014-05/msg00531.html tests/xfs/014 | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/014.out | 1 + tests/xfs/group | 1 + 3 files changed, 214 insertions(+) create mode 100755 tests/xfs/014 create mode 100644 tests/xfs/014.out diff --git a/tests/xfs/014 b/tests/xfs/014 new file mode 100755 index 0000000..ef08bee --- /dev/null +++ b/tests/xfs/014 @@ -0,0 +1,212 @@ +#!/bin/bash +# FS QA Test No. xfs/014 +# +# Test the behavior of XFS dynamic speculative preallocation at ENOSPC and +# EDQUOT conditions. Speculative preallocation allocates post-EOF space to files +# as they are extended. This test creates conditions where an fs is near a space +# limit with lingering, relatively significant preallocations and verifies that +# new writers reclaim said preallocations rather than prematurely fail with +# ENOSPC/EDQUOT. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, 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! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/quota + +_cleanup() +{ + cd / + umount $LOOP_MNT 2>/dev/null + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# Create a file using a repeated open, extending write and close pattern. This +# causes the preallocation to persist after the file is closed. Preallocation +# will not be reclaimed unless the inode is evicted or we hit an allocation +# failure. +_spec_prealloc_file() +{ + file=$1 + + rm -f $file + + # a few file extending open-write-close cycles should be enough to + # trigger the fs to retain preallocation. write 256k in 32k intervals to + # be sure + for i in $(seq 0 32768 262144) + do + $XFS_IO_PROG -fc "pwrite $i 32k" $file | \ + _filter_xfs_io >> $seqres.full + done + + # write a 4k aligned amount of data to keep the calculations simple + $XFS_IO_PROG -c "pwrite 0 128m" $file | _filter_xfs_io >> $seqres.full + + size=`stat -c "%s" $file` + blocks=`stat -c "%b" $file` + blocksize=`stat -c "%B" $file` + + prealloc_size=$((blocks * blocksize - size)) + if [ $prealloc_size -eq 0 ] + then + echo "Warning: No speculative preallocation for $file." \ + "Check use of the allocsize= mount option." + fi + + # keep a running total of how much preallocation we've created + TOTAL_PREALLOC=$((TOTAL_PREALLOC + prealloc_size)) +} + +_consume_free_space() +{ + dir=$1 + + # calculate the rough amount of free space in MB + fsblocksize=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bsize | \ + awk '{ print $3 }'` + blocksavail=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bavail | \ + awk '{ print $3 }'` + freesp=$((fsblocksize * blocksavail / 1024 / 1024)) + + # allocate all but 10MB + freesp=$((freesp - 10)) + $XFS_IO_PROG -fc "falloc 0 ${freesp}M" $dir/spc +} + +# Create several files with preallocation and consume the remaining free space +# via fallocate to the put the fs at ENOSPC. Create a set of background writers +# to write into ENOSPC and cause the preallocation to be reclaimed and +# reallocated to the new writers. +_test_enospc() +{ + dir=$1 + + rm -rf $dir/* + + TOTAL_PREALLOC=0 + for i in $(seq 0 3) + do + _spec_prealloc_file $dir/pre$i + done + + _consume_free_space $dir + + # consume 1/2 of the current preallocation across the set of 4 writers + write_size=$((TOTAL_PREALLOC / 2 / 4)) + for i in $(seq 0 3) + do + $XFS_IO_PROG -fc "pwrite 0 $write_size" $dir/file.$i | \ + _filter_xfs_io >> $seqres.full & + done + + wait +} + +# Create preallocations accounted by both user and group quotas. Set the +# associated quota hard limits to put them at EDQUOT. Verify that a new writer +# reclaims the preallocated space and proceeds without error. +_test_edquot() +{ + dir=$1 + + rm -rf $dir/* + + TOTAL_PREALLOC=0 + _spec_prealloc_file $dir/user + chown $qa_user $dir/user + + _spec_prealloc_file $dir/group + chgrp $qa_group $dir/group + + # writing to a file under both quotas means both will be reclaimed on + # allocation failure + touch $dir/file + chown $qa_user $dir/file + chgrp $qa_group $dir/file + + # put both quotas at EDQUOT + blks=`$XFS_QUOTA_PROG -xc "quota -u $qa_user" $dir | \ + tail -n 1 | awk '{ print $2 }'` + $XFS_QUOTA_PROG -xc "limit -u bhard=${blks}k $qa_user" $dir + blks=`$XFS_QUOTA_PROG -xc "quota -g $qa_grup" $dir | \ + tail -n 1 | awk '{ print $2 }'` + $XFS_QUOTA_PROG -xc "limit -g bhard=${blks}k $qa_group" $dir + + # each quota has a single file worth of preallocation to reclaim. leave + # some wiggle room and write to 1/3 the total. + write_size=$((TOTAL_PREALLOC / 3)) + $XFS_IO_PROG -c "pwrite 0 $write_size" $dir/file | \ + _filter_xfs_io >> $seqres.full +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_io_command "falloc" +_require_loop +_require_quota +_require_user +_require_group + +rm -f $seqres.full + +_scratch_mkfs_xfs | _filter_mkfs >> $seqres.full 2>&1 +_scratch_mount + +# make sure the background eofblocks scanner doesn't interfere +orig_sp_time=`cat /proc/sys/fs/xfs/speculative_prealloc_lifetime` +echo 9999 > /proc/sys/fs/xfs/speculative_prealloc_lifetime + +LOOP_FILE=$SCRATCH_MNT/$seq.fs +LOOP_MNT=$SCRATCH_MNT/$seq.mnt + +$MKFS_XFS_PROG -d "file=1,name=$LOOP_FILE,size=$((1024*1024*1024 * 10))" | \ + _filter_mkfs >> $seqres.full 2>&1 + +mkdir -p $LOOP_MNT +mount -t xfs -o loop,uquota,gquota $LOOP_FILE $LOOP_MNT || \ + _fail "Failed to mount loop fs." + +_test_enospc $LOOP_MNT +_test_edquot $LOOP_MNT + +umount $LOOP_MNT + +echo $orig_sp_time > /proc/sys/fs/xfs/speculative_prealloc_lifetime + +umount $SCRATCH_MNT +_check_scratch_fs + +status=0 +exit diff --git a/tests/xfs/014.out b/tests/xfs/014.out new file mode 100644 index 0000000..a825535 --- /dev/null +++ b/tests/xfs/014.out @@ -0,0 +1 @@ +QA output created by 014 diff --git a/tests/xfs/group b/tests/xfs/group index 19fd968..13f07b8 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -10,6 +10,7 @@ 010 auto quick repair 012 rw auto quick 013 auto metadata stress +014 auto enospc quick quota 016 rw auto quick 017 mount auto quick stress 018 deprecated # log logprint v2log -- 1.8.3.1 From bfoster@redhat.com Tue Jun 3 13:29:07 2014 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 85E667F3F for ; Tue, 3 Jun 2014 13:29:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D747AC005 for ; Tue, 3 Jun 2014 11:29:03 -0700 (PDT) X-ASG-Debug-ID: 1401820131-04cbb050fa2fd640001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AXWyfeaXZ6xltIYB for ; Tue, 03 Jun 2014 11:28:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s53ISpDt024675 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 3 Jun 2014 14:28:51 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s53ISoka020107; Tue, 3 Jun 2014 14:28:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 76A351248A9; Tue, 3 Jun 2014 14:28:49 -0400 (EDT) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfs/013: allow non-write fsstress operations in background workload Date: Tue, 3 Jun 2014 14:28:49 -0400 X-ASG-Orig-Subj: [PATCH] xfs/013: allow non-write fsstress operations in background workload Message-Id: <1401820129-6543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401820131 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com It has been reported that test xfs/013 probably uses more space than necessary, exhausting space if run against a several GB sized ramdisk. xfs/013 primarily creates, links and removes inodes. Most of the space consumption occurs via the background fsstress workload. Remove the fsstress -w option that suppresses non-write operations. This slightly reduces the storage footprint while still providing a background workload for the test. Signed-off-by: Brian Foster --- Dave, I was able to squeeze an xfs/013 run into a 3GB ramdisk on my VM with this tweak. Let me know if this works for you. If not, we could probably start turning off some of the heavier allocating fsstress ops so long as the cost isn't too much. I'm measuring the effectiveness of this test via the fibt stats exported to /proc. Brian tests/xfs/013 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xfs/013 b/tests/xfs/013 index e95d027..d47bf53 100755 --- a/tests/xfs/013 +++ b/tests/xfs/013 @@ -121,7 +121,7 @@ _create $SCRATCH_MNT/dir1 $COUNT _cleaner $SCRATCH_MNT $LOOPS $MINDIRS & # start a background stress workload on the fs -$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -w -n 9999999 -p 2 -S t \ +$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -n 9999999 -p 2 -S t \ >> $seqres.full 2>&1 & # Each cycle clones the current directory and makes a random file replacement -- 1.8.3.1 From david@fromorbit.com Tue Jun 3 16:29:00 2014 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 1B2D67F3F for ; Tue, 3 Jun 2014 16:29:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 844AFAC00D for ; Tue, 3 Jun 2014 14:28:59 -0700 (PDT) X-ASG-Debug-ID: 1401830929-04cbb050fb310380001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id sp3LqBLaum2zB9XC for ; Tue, 03 Jun 2014 14:28:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnoOAKY9jlN5LL1s/2dsb2JhbABZgwdSVYIeqCIDAQEBBpgcAYEOF3SCJQEBBAE6HCMFCwgDDgoJJQ8FJQMhE4g6Bw7RRBcWhT+HA4ExSQeEQASaCZM0g0orL4EC Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Jun 2014 06:58:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrwG2-00021l-LE; Wed, 04 Jun 2014 07:28:34 +1000 Date: Wed, 4 Jun 2014 07:28:34 +1000 From: Dave Chinner To: Martin Papik Cc: Stefan Ring , Linux fs XFS Subject: Re: XFS filesystem claims to be mounted after a disconnect Message-ID: <20140603212834.GG14410@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect References: <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> <538D9412.3040009@gmail.com> <538DA7FF.4080002@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538DA7FF.4080002@gmail.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: 1401830930 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6355 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jun 03, 2014 at 01:48:31PM +0300, Martin Papik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > On 06/03/2014 12:55 PM, Stefan Ring wrote: > > From skimming this thread, it seems that there is some hardware > > issue at work here, but nonetheless, I had a very similar situation > > a while ago that was rather puzzling to me at the time, having to > > do with mount namespaces: > > http://oss.sgi.com/pipermail/xfs/2012-August/020910.html > > > > Hardware issue or not, IMHO XFS has some issues. No issues, XFS just behaves differently to hot-unplug scenarios to ext4. the ext4 behaviour is actually problematic when it comes to data and filesystem security in error conditions and so it is not a model we shoul dbe following. To summarise, yanking the device out from behind XFS iis causin an EIO error to a critical metadata write and it is shutting down to prevent further error and/or corruption propagation. You have to unmount the XFS shutdown filesystem before you can access the filesystem and mount point again. The fact that ext4 is not failing when you yank the plug is a bad sign. That's actually a major potential for Bad Stuff because there's no guarantee that the device you plugged back in is the same device, yet ext4 appears to think it is just fine. What happens next is likely to be filesystem corruption and data loss. > $ cat /proc/mounts | grep media/T > --- no output --- > $ lsof | grep TEST > hexedit 24010 martin 3u unknown > /TEST...FILE (stat: Input/output error) Yup, EIO - the device is gone, filesystem shutdown. This is a correct reposnse to the conditions you have created. > hexedit 24011 martin 3u REG 259,6 > 4198400 12 /TEST...FILE > > After reconnecting the device ext4 mounts, xfs does not. Yup - XFS refuses to mount a filesystem with a duplicate UUID, preventing you from mounting the same filesystem from two different logical block device instances that point to the same physical disk. That's the only sane thing to do in enterprise storage systems that use multi-pathing to present failure-tolerant access to a physical device. > dmegs contains this (among other [unrelated] things): > > [3095915.107117] sd 60:0:0:0: [sdf] 976773167 512-byte logical blocks: > (500 GB/465 GiB) > [3095915.108343] sd 60:0:0:0: [sdf] Write Protect is off > [3095915.108360] sd 60:0:0:0: [sdf] Mode Sense: 1c 00 00 00 > [3095915.110633] sd 60:0:0:0: [sdf] Write cache: enabled, read cache: > enabled, doesn't support DPO or FUA > [3095915.207622] sdf: sdf69 sdf100 sdf101 sdf102 sdf103 sdf104 sdf105 > [3095915.210148] sd 60:0:0:0: [sdf] Attached SCSI disk > [3095917.969887] XFS (sdf100): Mounting Filesystem > [3095918.209464] XFS (sdf100): Starting recovery (logdev: internal) > [3095918.260450] XFS (sdf100): Ending recovery (logdev: internal) > [3096069.218797] XFS (sdf100): metadata I/O error: block 0xa02007 > ("xlog_iodone") error 19 numblks 64 #define ENODEV 19 /* No such device */ Yup, that's what happened to the filesystem - you unplugged the device and it: > [3096069.218808] XFS (sdf100): xfs_do_force_shutdown(0x2) called from > line 1115 of file > /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_log.c. Return address > = 0xffffffffa07f4fd1 > [3096069.218830] XFS (sdf100): Log I/O Error Detected. Shutting down > filesystem > [3096069.218833] XFS (sdf100): Please umount the filesystem and > rectify the problem(s) triggered a shutdown and told you what to do next. > [3096099.254131] XFS (sdf100): xfs_log_force: error 5 returned. > [3096129.289338] XFS (sdf100): xfs_log_force: error 5 returned. > [3096159.324525] XFS (sdf100): xfs_log_force: error 5 returned. > [3096185.296795] sd 61:0:0:0: [sdg] 976773167 512-byte logical blocks: > (500 GB/465 GiB) > [3096185.297431] sd 61:0:0:0: [sdg] Write Protect is off > [3096185.297447] sd 61:0:0:0: [sdg] Mode Sense: 1c 00 00 00 > [3096185.298022] sd 61:0:0:0: [sdg] Write cache: enabled, read cache: Then the device was hot-plugged and it came back as a different block device. > sdf100 (the old device) and sdg100 (the reconnected device) are > different, but XFS won't touch it. > > # xfs_repair /dev/sdg100 > xfs_repair: /dev/sdg100 contains a mounted filesystem > > fatal error -- couldn't initialize XFS library Yup, because the filesystem is still mounted at /mnt/TEST. XFS checks whether the filesystem on the block device is mounted, not whether the block device *instance* is mounted. Again, this is needed in redundant path storage setups because, for example, /dev/sdc and /dev/sdx might be the same physical disk and filesystem but have different paths to get them. > Also please do carefully note the difference between the lsof output > for the hung file descriptor for xfs and ext4. ext4 reports everything > the same as before, except for the mount path. xfs report changes, the > device ID is missing, the file changes from REG to unknown. Of course - it can't be queried because the filesystem has shut down and it returned an error. > So, AFAIK and IMHO this is an issue with XFS. The impact can be the > inability to recover from a device disconnect, since so far I don't > see a good way to figure out which processes are holding up the FS. > And besides, having to kill processes to mount a filesystem (xfs) is > not a happy state of affairs. I think you have incorrect expectations of how filesystems should handle device hot-unplug and a later replug. You're expecting a filesystem that is designed for robustness in data center environments and complex redundant path storage configurations to behave like a filesystem designed for your laptop. Hot-unplug is a potential data loss event. Silent data loss is the single worst evil a filesystem can perpetrate on a user because the user does not know they lost their important cat videos until they try to show them to their friends. Now, would you prefer to know you lost your cat videos straight away (XFS behaviour), or a few months later when you try to retreive them (ext4 behaviour)? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Jun 3 16:38:20 2014 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 B247B7F3F for ; Tue, 3 Jun 2014 16:38:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CFC2AC008 for ; Tue, 3 Jun 2014 14:38:19 -0700 (PDT) X-ASG-Debug-ID: 1401831497-04cbb050fa3112b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id BTPvj3Apv9WH46oc for ; Tue, 03 Jun 2014 14:38:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmwOAAJAjlN5LL1s/2dsb2JhbABZgweDRagiAwEBAQaYHAGBDhd0giUBAQU6HCMQCAMYCSUPBSUDIROIQdFfFxaFP4gmVweEQASaCZM0g0orgTE Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Jun 2014 07:08:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WrwPC-00026X-QW; Wed, 04 Jun 2014 07:38:02 +1000 Date: Wed, 4 Jun 2014 07:38:02 +1000 From: Dave Chinner To: Arnd Bergmann Cc: "H. Peter Anvin" , "Joseph S. Myers" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@telemann.coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <20140603213802.GH14410@dastard> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <7175692.dpgYFMbTaP@wuerfel> <538CF346.2070504@zytor.com> <5011138.W0gbOc20Qp@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5011138.W0gbOc20Qp@wuerfel> 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: 1401831497 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6355 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jun 03, 2014 at 04:22:19PM +0200, Arnd Bergmann wrote: > On Monday 02 June 2014 14:57:26 H. Peter Anvin wrote: > > On 06/02/2014 12:55 PM, Arnd Bergmann wrote: > The possible uses I can see for non-ktime_t types in the kernel are: > * inodes need 96 bit timestamps to represent the full range of values > that can be stored in a file system, you made a convincing argument > for that. Almost everything else can fit into 64 bit on a 32-bit > kernel, in theory also on a 64-bit kernel if we want that. Just ot be pedantic, inodes don't *need* 96 bit timestamps - some filesystems can *support up to* 96 bit timestamps. If the kernel only supports 64 bit timestamps and that's all the kernel can represent, then the upper bits of the 96 bit on-disk inode timestamps simply remain zero. If you move the filesystem between kernels with different time ranges, then the filesystem needs to be able to tell the kernel what it's supported range is. This is where having the VFS limit the range of supported timestamps is important: the limit is the min(kernel range, filesystem range). This allows the filesystems to be indepenent of the kernel time representation, and the kernel to be independent of the physical filesystem time encoding.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rientjes@google.com Tue Jun 3 16:43:27 2014 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 40B5D7F3F for ; Tue, 3 Jun 2014 16:43:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0B01AC008 for ; Tue, 3 Jun 2014 14:43:26 -0700 (PDT) X-ASG-Debug-ID: 1401831805-04cbb050fc311ab0001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id j4ykrExdXkzenkCD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 14:43:25 -0700 (PDT) X-Barracuda-Envelope-From: rientjes@google.com X-Barracuda-Apparent-Source-IP: 209.85.213.175 X-Barracuda-IPDD: Level1 [google.com/209.85.213.175] Received: by mail-ig0-f175.google.com with SMTP id uq10so5522356igb.14 for ; Tue, 03 Jun 2014 14:43:24 -0700 (PDT) X-Barracuda-IPDD: Level1 [google.com/209.85.213.175] X-Barracuda-IPDD: Level1 [google.com/209.85.213.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=55XL2FyS/3CnWBbS19BbAcN0SP0TlWG96DuZ8t0FVzQ=; b=ZbKJmFRaiBNnZF3x5JoC2sX0uUVsxNdHNh7/RiKAkSGBQo21+3LKyduwM1QzhRBAHx D2qrOg0nH2ld0EZ9mM6xhMg8AJj9lGYATfVnURkRCTo9l+agHLWJQXkhaOYZVC8TgNZG 67d62+3Oc2m19HyrP5Wc9MwALc4IL6MSh3xDrU9q5fcMvo34+kJWkt7ubi1GUm3Om0xv kvmi3EH+S5KCU/W0QULcrkaCY9ehpdexWWzzYGRJbzzQ878C31ZZFCTgHFUTmrYFoGw5 Mm73Cc7963o7U/57rG/rA6HOVKZXj0WWDC5xwG1U0mpxe9buzxyHaSGd5vWcFojmpCRp sz0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=55XL2FyS/3CnWBbS19BbAcN0SP0TlWG96DuZ8t0FVzQ=; b=FRNvSOMD8i3TBqOdq6eDbz3UsRW9l8/z5WNJEElJC3lh7cQaQt7+Z8YWtuMjN49mMm H4n8j5LyV6V7bf/Ia6C5V0tAPEjB/tMgEFFHe1TIeRtNO9bswUumq3H4BhSj8h1Px1pr mmDbRjNAIHvWodo8zu0WISv2Va1hURMSKc8PwhdVsYPHpVbvLmdwqb1aoDuBvfr6hx6V QiZnTuGaXaSNVUpxwiUv/TipyZcug66a8D1CtpAvH+/wSfg6+5XixLYR3JHoRhp3vbqq tOOwR4UIE7rjj0gQnVYnxXROv9o9ZL9a9SA32GDKDcQegY5c43zAIypT/AWH55T9VvkZ tmlw== X-Gm-Message-State: ALoCoQnkzObWs5RzoFULMJympmXIwREGPhDcVTIx1vjUC/x6T2MNoEv3ylw99gdw9KVmlbHRQRUt X-Received: by 10.42.98.145 with SMTP id s17mr13739804icn.73.1401831804880; Tue, 03 Jun 2014 14:43:24 -0700 (PDT) Received: from [2620:0:1008:1101:be30:5bff:fed8:5e64] ([2620:0:1008:1101:be30:5bff:fed8:5e64]) by mx.google.com with ESMTPSA id q5sm39846241igg.10.2014.06.03.14.43.23 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 03 Jun 2014 14:43:23 -0700 (PDT) Date: Tue, 3 Jun 2014 14:43:22 -0700 (PDT) From: David Rientjes X-X-Sender: rientjes@chino.kir.corp.google.com To: Tetsuo Handa cc: Motohiro.Kosaki@us.fujitsu.com, david@fromorbit.com, riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, akpm@linux-foundation.org, hch@infradead.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever atshrink_inactive_list(). In-Reply-To: <201405262045.CDG95893.HLFFOSFMQOVOJt@I-love.SAKURA.ne.jp> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever atshrink_inactive_list(). Message-ID: References: <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> <20140520063024.GH18954@dastard> <201405202358.ADF10119.SMOFOQLFtOVHJF@I-love.SAKURA.ne.jp> <6B2BA408B38BA1478B473C31C3D2074E31D59D8673@SV-EXCHANGE1.Corp.FC.LOCAL> <201405262045.CDG95893.HLFFOSFMQOVOJt@I-love.SAKURA.ne.jp> User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1401831805 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.6355 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 On Mon, 26 May 2014, Tetsuo Handa wrote: > In shrink_inactive_list(), we do not insert delay at > > if (!sc->hibernation_mode && !current_is_kswapd()) > wait_iff_congested(zone, BLK_RW_ASYNC, HZ/10); > > if sc->hibernation_mode != 0. > Follow the same reason, we should not insert delay at > > while (unlikely(too_many_isolated(zone, file, sc))) { > congestion_wait(BLK_RW_ASYNC, HZ/10); > > /* We are about to die and free our memory. Return now. */ > if (fatal_signal_pending(current)) > return SWAP_CLUSTER_MAX; > } > > if sc->hibernation_mode != 0. > > Signed-off-by: Tetsuo Handa > --- > mm/vmscan.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 32c661d..89c42ca 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -1362,6 +1362,9 @@ static int too_many_isolated(struct zone *zone, int file, > if (current_is_kswapd()) > return 0; > > + if (sc->hibernation_mode) > + return 0; > + > if (!global_reclaim(sc)) > return 0; > This isn't the only too_many_isolated() functions that do a delay, how is the too_many_isolated() in mm/compaction.c different? From mp6058@gmail.com Tue Jun 3 17:37:26 2014 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,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 2C3027F3F for ; Tue, 3 Jun 2014 17:37:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 200F6304067 for ; Tue, 3 Jun 2014 15:37:23 -0700 (PDT) X-ASG-Debug-ID: 1401835039-04cb6c100a1e4430001-NocioJ Received: from mail-we0-f173.google.com (mail-we0-f173.google.com [74.125.82.173]) by cuda.sgi.com with ESMTP id rgfZCUdtqlaPRy5l (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 15:37:20 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.173 Received: by mail-we0-f173.google.com with SMTP id u57so7561272wes.18 for ; Tue, 03 Jun 2014 15:37:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=Z8XIyBRMg2kTJaQ0kIS2sOOtgCBMWkwX2XmdG6TBsQc=; b=xGJqaR2oKnTNPznFPCSggRf4Ohb6mlXmuAjUpbB46XiEa8GzihEzcCz2CqloJf+rok S5xw91j4XwjE/cJfYTx4knVeBfKJkjbkBagfZ8xgpUgLQiuYbS3NSFi/zED12DNETiX5 4L6iQcUuul24Z5hFEC9puKpbpeupdsWlsSL8zWPdnBqaV4zcTQ4qTrdr4t8PSpNEfdlD 3VZOcjhjFN25mQPNihaJEc5/LjxwK8AxGzEpECZilaxqSLJO+n6i4iQqa/rYPvMUXpXy YpXr7zK/nfELq/31TFti/2TYv24d3O6bVwNvfGv4WDUn9KIRnzR1AFP20L1EZJvnglCy IugA== X-Received: by 10.180.84.7 with SMTP id u7mr36290928wiy.31.1401835039524; Tue, 03 Jun 2014 15:37:19 -0700 (PDT) Received: from [192.168.1.14] ([37.131.0.1]) by mx.google.com with ESMTPSA id rw4sm1119164wjb.44.2014.06.03.15.37.17 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 03 Jun 2014 15:37:18 -0700 (PDT) Message-ID: <538E4E1B.1020003@gmail.com> Date: Wed, 04 Jun 2014 01:37:15 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: Linux fs XFS Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> <538D9412.3040009@gmail.com> <538DA7FF.4080002@gmail.com> <20140603212834.GG14410@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <20140603212834.GG14410@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-we0-f173.google.com[74.125.82.173] X-Barracuda-Start-Time: 1401835040 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6356 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 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 I think you're trying too hard to defend XFS which may be causing you to miss my point. Or it could be my bad communication. When I yank and replug a device, I can only remount the device only if I kill certain processes. But this limitation exists only on the same box. I.e. it won't prevent me from mounting the same disk on a different machine, just the same one. So here are a few questions. (1) If the device vanished, why not just terminate the mount instance? After all it's not like the device comes back one day and the processes will be able to continue writing to the files. If you could do that it would be good, but you yourself said you can't. (2) Following the methods of the prior experiments I did this, connected the disk to PC1, hexedit file, yank disk, plug disk, at this point PC1 won't touch the disk, moved the disk to PC2, it automatically, silently (Mounting Filesystem ++ Ending clean mount) mounts the FS, then move the disk back and the disk still doesn't mount, claiming it's mounted, never mind that since then the FS was mounted somewhere else and for all intents and purposes it a completely different disk, to which (question 1) the potentially unwritten data will never be written back. I apologize, but I really don't see what XFS is protecting me from or how and I doubt its success rate. Can you please explain? (3) Isn't it possible that XFS just doesn't recognize that whatever error condition happened is permanent and the disk won't come back. Isn't XFS just forcing me to take a manual action by accident? Imagine, I have some files, just saved them, didn't call fsync, the data is still in some cache, the cable is yanked, and the data is lost. But in this case the XFS won't complain. Only if there's a process. Seems more like circumstance than design. Is it? Is this an actual intentional behavior. Designed, as opposed to just happening. Again, I apologize, but it really seems to me that this isn't right, that it's neither intentional nor correct. I mean, if it was intentional, why not prevent me from mounting the FS on PC2, it wasn't cleanly unmounted, there was a file open, clearly there was some rationale to stop the auto-mount. And if it didn't stop me from mounting on PC2, why does it stop me on PC1, if after all the unwritten data will never ever be written. > Yup - XFS refuses to mount a filesystem with a duplicate UUID, > preventing you from mounting the same filesystem from two > different logical block device instances that point to the same > physical disk. That's the only sane thing to do in enterprise > storage systems that use multi-pathing to present failure-tolerant > access to a physical device. Actually, IMHO it would also be sane to forget you ever saw a UUID after the last underlying physical device is gone and you're not going to be ever writing to this. Since if you're never touching the FS with UUID XYZ then it's not mounted enough to prevent use. IMHO. But yes, as long as you do have a functioning relationship with UUID XYZ through /dev/sda1, lock /dev/sdb1 if it has the same UUID. But not after you've lost all block devices. ........ Or attempting to put my understanding of the situation in humorous terms "the kernel is preventing access to /dev/sdg100 out of grief for the death of /dev/sdf100". Lame joke, yes, but think please, what is the actual benefit of me having to kill a process, after which I yank again, plug again, and the FS mounts silently. I really don't get this. How is this not a bug? Martin On 06/04/2014 12:28 AM, Dave Chinner wrote: > On Tue, Jun 03, 2014 at 01:48:31PM +0300, Martin Papik wrote: >> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 >> >> On 06/03/2014 12:55 PM, Stefan Ring wrote: >>> From skimming this thread, it seems that there is some >>> hardware issue at work here, but nonetheless, I had a very >>> similar situation a while ago that was rather puzzling to me at >>> the time, having to do with mount namespaces: >>> http://oss.sgi.com/pipermail/xfs/2012-August/020910.html >>> >> >> Hardware issue or not, IMHO XFS has some issues. > > No issues, XFS just behaves differently to hot-unplug scenarios to > ext4. the ext4 behaviour is actually problematic when it comes to > data and filesystem security in error conditions and so it is not a > model we shoul dbe following. > > To summarise, yanking the device out from behind XFS iis causin an > EIO error to a critical metadata write and it is shutting down to > prevent further error and/or corruption propagation. You have to > unmount the XFS shutdown filesystem before you can access the > filesystem and mount point again. > > The fact that ext4 is not failing when you yank the plug is a bad > sign. That's actually a major potential for Bad Stuff because > there's no guarantee that the device you plugged back in is the > same device, yet ext4 appears to think it is just fine. What > happens next is likely to be filesystem corruption and data loss. > >> $ cat /proc/mounts | grep media/T --- no output --- $ lsof | grep >> TEST hexedit 24010 martin 3u unknown /TEST...FILE >> (stat: Input/output error) > > Yup, EIO - the device is gone, filesystem shutdown. This is a > correct reposnse to the conditions you have created. > >> hexedit 24011 martin 3u REG 259,6 >> 4198400 12 /TEST...FILE >> >> After reconnecting the device ext4 mounts, xfs does not. > > Yup - XFS refuses to mount a filesystem with a duplicate UUID, > preventing you from mounting the same filesystem from two > different logical block device instances that point to the same > physical disk. That's the only sane thing to do in enterprise > storage systems that use multi-pathing to present failure-tolerant > access to a physical device. > >> dmegs contains this (among other [unrelated] things): >> >> [3095915.107117] sd 60:0:0:0: [sdf] 976773167 512-byte logical >> blocks: (500 GB/465 GiB) [3095915.108343] sd 60:0:0:0: [sdf] >> Write Protect is off [3095915.108360] sd 60:0:0:0: [sdf] Mode >> Sense: 1c 00 00 00 [3095915.110633] sd 60:0:0:0: [sdf] Write >> cache: enabled, read cache: enabled, doesn't support DPO or FUA >> [3095915.207622] sdf: sdf69 sdf100 sdf101 sdf102 sdf103 sdf104 >> sdf105 [3095915.210148] sd 60:0:0:0: [sdf] Attached SCSI disk >> [3095917.969887] XFS (sdf100): Mounting Filesystem >> [3095918.209464] XFS (sdf100): Starting recovery (logdev: >> internal) [3095918.260450] XFS (sdf100): Ending recovery (logdev: >> internal) [3096069.218797] XFS (sdf100): metadata I/O error: >> block 0xa02007 ("xlog_iodone") error 19 numblks 64 > > #define ENODEV 19 /* No such device */ > > Yup, that's what happened to the filesystem - you unplugged the > device and it: > >> [3096069.218808] XFS (sdf100): xfs_do_force_shutdown(0x2) called >> from line 1115 of file >> /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_log.c. Return >> address = 0xffffffffa07f4fd1 [3096069.218830] XFS (sdf100): Log >> I/O Error Detected. Shutting down filesystem [3096069.218833] >> XFS (sdf100): Please umount the filesystem and rectify the >> problem(s) > > triggered a shutdown and told you what to do next. > >> [3096099.254131] XFS (sdf100): xfs_log_force: error 5 returned. >> [3096129.289338] XFS (sdf100): xfs_log_force: error 5 returned. >> [3096159.324525] XFS (sdf100): xfs_log_force: error 5 returned. >> [3096185.296795] sd 61:0:0:0: [sdg] 976773167 512-byte logical >> blocks: (500 GB/465 GiB) [3096185.297431] sd 61:0:0:0: [sdg] >> Write Protect is off [3096185.297447] sd 61:0:0:0: [sdg] Mode >> Sense: 1c 00 00 00 [3096185.298022] sd 61:0:0:0: [sdg] Write >> cache: enabled, read cache: > > Then the device was hot-plugged and it came back as a different > block device. > >> sdf100 (the old device) and sdg100 (the reconnected device) are >> different, but XFS won't touch it. >> >> # xfs_repair /dev/sdg100 xfs_repair: /dev/sdg100 contains a >> mounted filesystem >> >> fatal error -- couldn't initialize XFS library > > Yup, because the filesystem is still mounted at /mnt/TEST. XFS > checks whether the filesystem on the block device is mounted, not > whether the block device *instance* is mounted. Again, this is > needed in redundant path storage setups because, for example, > /dev/sdc and /dev/sdx might be the same physical disk and > filesystem but have different paths to get them. > >> Also please do carefully note the difference between the lsof >> output for the hung file descriptor for xfs and ext4. ext4 >> reports everything the same as before, except for the mount path. >> xfs report changes, the device ID is missing, the file changes >> from REG to unknown. > > Of course - it can't be queried because the filesystem has shut > down and it returned an error. > >> So, AFAIK and IMHO this is an issue with XFS. The impact can be >> the inability to recover from a device disconnect, since so far I >> don't see a good way to figure out which processes are holding up >> the FS. And besides, having to kill processes to mount a >> filesystem (xfs) is not a happy state of affairs. > > I think you have incorrect expectations of how filesystems should > handle device hot-unplug and a later replug. You're expecting a > filesystem that is designed for robustness in data center > environments and complex redundant path storage configurations to > behave like a filesystem designed for your laptop. > > Hot-unplug is a potential data loss event. Silent data loss is the > single worst evil a filesystem can perpetrate on a user because > the user does not know they lost their important cat videos until > they try to show them to their friends. Now, would you prefer to > know you lost your cat videos straight away (XFS behaviour), or a > few months later when you try to retreive them (ext4 behaviour)? > > Cheers, > > Dave. > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTjk4IAAoJELsEaSRwbVYrOyQQAIkEibi8/SNJkKpghkXEb8ZZ Ek+DO6xSeKg6glzXsZppQuKGPVytqJ0/J8X8+I98khnrI0+U07vzjHB/L7PFyZ/m afdrnROcxtJxgXF/td/a1+lZjx3JXZnXxidEkDIpJmb9EpjLErgHDyPqbBmVTcja o6FVAYG57av1LeTm07jL7T75f7Egb1i/LYMH44g/KKUYjo+b3Hr7LckkG58PGZZj a3bAeEnfnQnXCBSRJP6zsESiB3OZmfTCbN3m2BGLRMdfBYC4tp+duouWLn5raCWn cWjVfY9XzbfAR7ls2oKAN29Yfvz9mBecTwiL7F9cDRxpCtvfQXYBcyexkuK6w8Dn +FnsVP4DcrbxlMf7nf9c3kAxL0epis6WKKc+d2aiZZvwyZcqNGXx02Sm5/cB8Qqk 4Vrwe8/Ja2BcJFEK9WaT8DOLn91pIyVcUubH5yWVm830w/aYOWR+B7ZgUyH4HAee /DZrnMyzivE+hwEdFBuYnLxGypWhC/m+Zc3HpYOiycsn6t5lXXThmyfK/uzK5Vn1 qUirSp0IfBiCJaqvQGL/SyGAyWRUHHIj7Z/ZQb3WJblobN9gPYX9vRdno3TaIJas fQNMePWdpxxExFnj2mEWTFcanFwaIPQNmWxbPebiSn++KEdk1VPhtShrBD3ei5dO D895KEfSbfhA5ZIayc3x =M2a5 -----END PGP SIGNATURE----- From mp6058@gmail.com Tue Jun 3 17:59:00 2014 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,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 89FEA7F47 for ; Tue, 3 Jun 2014 17:59:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2021EAC004 for ; Tue, 3 Jun 2014 15:59:00 -0700 (PDT) X-ASG-Debug-ID: 1401836337-04cb6c10061e7f60001-NocioJ Received: from mail-wg0-f48.google.com (mail-wg0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id I2V8XoOXF55vR8Se (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 15:58:58 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wg0-f48.google.com with SMTP id k14so7572408wgh.7 for ; Tue, 03 Jun 2014 15:58:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=b9B2RBAHo5kyXW5hTbHwIhpyQjFBIFOnkG6kqEAdpRk=; b=QamnKDtdLgUpr3PBthxSo1ItZY9QnqULV8ZXLyFmtApiNz3gEA8Uhx3Q0MI1//pwCj 4zWXd6BOj1g5nDk7uq8Wdewy/t9Y6HLCE4BA/qz9uLFryjp4SgKkr4w4H34Abl9GGauY epbSpbONnXTUvIQ67Wmnr5TE7e9bMt+Z2n22VB5rXO7NaQxhZlCXpsSVMyrrBvDVpfUI hh0GDzj2tRNTbdr8XrZkTy8ApsP4YQkrEUSRl8986bC3XcWlsZFwNJ1XK8OEEIrRTtXS Cr6iMVrGBeSoHCxTenVCOO6j1N+DhmkAkCOq0gud8VGHQ7anOcyqHJfU8oiTW0bn4o5m XK+A== X-Received: by 10.180.98.163 with SMTP id ej3mr37066441wib.9.1401836337125; Tue, 03 Jun 2014 15:58:57 -0700 (PDT) Received: from [192.168.1.14] ([37.131.0.1]) by mx.google.com with ESMTPSA id ht5sm1173167wjb.49.2014.06.03.15.58.55 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 03 Jun 2014 15:58:56 -0700 (PDT) Message-ID: <538E532E.7050008@gmail.com> Date: Wed, 04 Jun 2014 01:58:54 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: Linux fs XFS Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> <20140503030221.GJ26353@dastard> <538C5E67.6090005@gmail.com> <20140602234135.GO6677@dastard> <538D9412.3040009@gmail.com> <538DA7FF.4080002@gmail.com> <20140603212834.GG14410@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <20140603212834.GG14410@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1401836337 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.6357 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 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 >> [3096069.218830] XFS (sdf100): Log I/O Error Detected. Shutting >> down filesystem [3096069.218833] XFS (sdf100): Please umount the >> filesystem and rectify the problem(s) > > triggered a shutdown and told you what to do next. Okay, here I'll pick nits. I hope you're not sick of me yet. 1) I would LOVE to unmount the FS, but how? umount /dev/xxx ... device no longer there. umount /media/xxx ... mount point no longer there. 2) I can't rectify the problems exactly because the FS is mounted (according to xfs_repair [ustat]), yet not mounted (according to /proc/mounts). .... unless rectifying the problem means reporting this as a bug. :-) 3) "Shutting down filesystem" ... isn't this when the new device should no longer be detected as mounted? 4) come to think of it, if XFS is shutting down, why isn't it unmounting itself? Anyway, sorry if I'm being annoying, but I'm really really convinced this is wrong. :-) Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTjlMuAAoJELsEaSRwbVYrzOAP/36uqrKeKBlAss8ILg9cwdtI cXxGG7kAPCI2r+jTNCmHnMsJW4ujptVB3jllIlNPiF+oglZHEFf2bhfoYL8D5q+0 oxHiaOuvU590hBfELf+yPHNxkTPpUirhF5VymwqD+ZvV/TEjuw/VvGZ8pAU4bZHv v4vfDX2ExCHqK3d5j7D5u5YF4wD754yTq+5Qz5L944JKubXCK2uo0xt7i3QluIMJ dcEHPw1LXIKjjmsTZ2BaCSUwtfLGnQhGp2mHQY2Oe8KeRx8Jog7reNjazcFqI5hn Ap6Q9ugSbtSn200e4P2pBbQOEsaHgfA9HzAQYZ6rhQk/Wrjr2I34uVxySNDn0RQk EbjBFV04DjoiLPfff/tWvHtUNR3yZ3X0ssV5kLbfub4nPk0dMApaDI/pB8j//+Qu 4CHZgtodi//9hOFaBX9h/3vJl5aD6XddUVznZGP+0W/W2Gifev5xr+jSiUK00xk6 xLGelmUdtkq5IlFNizXZU/QcTzLW2gcB2oyW0NpoMBqEhsGCFG6IE85H/POtV7Io otgBiWxBgxYEzGm73krja3yQlflKfuPK+SKJZue/liK5eNuIt8FRFmMH8jK/dGTc 6BMZ66Mnt2Pn7UkewLFmH0XtAPcMO7lyCEBBN0iG0s3f7Vg1T7b0tamNcaThkPt/ 476Ebh9LGukDmcNXeyXo =C9nD -----END PGP SIGNATURE----- From namjae.jeon@samsung.com Tue Jun 3 23:57:45 2014 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 1CDA07F3F for ; Tue, 3 Jun 2014 23:57:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC47E8F8074 for ; Tue, 3 Jun 2014 21:57:41 -0700 (PDT) X-ASG-Debug-ID: 1401857858-04cbb050fd332e60001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id S65XdZCIH2fxdB1V (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Tue, 03 Jun 2014 21:57:40 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N6M00BYQOG1CAD0@mailout1.samsung.com> for xfs@oss.sgi.com; Wed, 04 Jun 2014 13:57:37 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 8E.17.14704.147AE835; Wed, 04 Jun 2014 13:57:37 +0900 (KST) X-AuditID: cbfee68f-b7fef6d000003970-27-538ea741a452 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id C2.DF.07139.147AE835; Wed, 04 Jun 2014 13:57:37 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N6M006RROG1LB50@mmp1.samsung.com>; Wed, 04 Jun 2014 13:57:37 +0900 (KST) From: Namjae Jeon To: 'Theodore Ts'o' , 'Dave Chinner' Cc: 'linux-ext4' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' , =?UTF-8?Q?'Luk=C3=A1=C5=A1_Czerner'?= References: <003601cf6aa7$883103b0$98930b10$@samsung.com> <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> <002201cf7e59$2e684c10$8b38e430$@samsung.com> <20140602150258.GG30598@thunk.org> In-reply-to: <20140602150258.GG30598@thunk.org> Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Wed, 04 Jun 2014 13:57:37 +0900 X-ASG-Orig-Subj: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <000e01cf7fb1$814ab6d0$83e02470$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: quoted-printable X-Mailer: Microsoft Outlook 14.0 Thread-index: AQOcBKJD5lk5ojpc7FDcCMzPaSWP+QCjXdQQAXmE8b8CRXdbEAIX9EgtAn5X6noBZB3wwJd0cicA Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrFIsWRmVeSWpSXmKPExsWyRsSkSNdxeV+wwdsjshZLJ15itthy7B6j xbIHm1ksZs67w2axZ+9JFovLu+awWbT2/GS3WNR3i9GBw+PUIgmPpjNHmT1WX9jK6PF+31U2 j74tqxg9Pm+SC2CL4rJJSc3JLEst0rdL4MrY9eIaU8FSwYqnx3kaGE/ydjFyckgImEjs/DWH CcIWk7hwbz1bFyMXh5DAUkaJ732fgRIcYEWvF6lCxBcxSny49B+q6C+jxPGZ71hBitgEtCX+ bBEFGSQi4CnR9PIVO0gNs8ALRokpr66xQzR8ZZI4tPgRK0gVp4C+xMaPe8GahQX8JXas8wMJ swioSly6080MYvMKWEqs/dzBCGELSvyYfI8FxGYWUJeYNG8RM4StLfHk3QVWiA8UJHacfc0I cUSMxMxDh5kgakQk9r14xwhyg4TAX3aJaRP6mCCWCUh8m3yIBeJLWYlNB5gh5khKHFxxg2UC o8QsJKtnIVk9C8nqWUhWLGBkWcUomlqQXFCclF5krFecmFtcmpeul5yfu4kRGM+n/z3r38F4 94D1IcZkoPUTmaVEk/OB6SCvJN7Q2MzIwtTE1NjI3NKMNGElcd77D5OChATSE0tSs1NTC1KL 4otKc1KLDzEycXBKNTBOC/qgvMXFQ+6u+lZbXybXlbs+FezNv2ESrbT2kZNFyOK5e+4kS6Y9 ijyzU77Pt4PPr3Oqrbr+2nnPVXzemXA7tPibGpx/r8PjfKXNu1WY4/ExqzTmuonKOo+410dm y+uqPfcOqY7c8n2OvM8T7ziZyts3ZdT3Rai/8DJ/KadgEhK4LNjgnxJLcUaioRZzUXEiAA9H N6P9AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOKsWRmVeSWpSXmKPExsVy+t9jAV3H5X3BBu8bRC2WTrzEbLHl2D1G i2UPNrNYzJx3h81iz96TLBaXd81hs2jt+clusajvFqMDh8epRRIeTWeOMnusvrCV0eP9vqts Hn1bVjF6fN4kF8AW1cBok5GamJJapJCal5yfkpmXbqvkHRzvHG9qZmCoa2hpYa6kkJeYm2qr 5OIToOuWmQN0kJJCWWJOKVAoILG4WEnfDtOE0BA3XQuYxghd35AguB4jAzSQsIYxY9eLa0wF SwUrnh7naWA8ydvFyMEhIWAi8XqRahcjJ5ApJnHh3nq2LkYuDiGBRYwSHy79h3L+Mkocn/mO FaSBTUBb4s8WUZAGEQFPiaaXr9hBapgFXjBKTHl1jR2i4SuTxKHFj1hBqjgF9CU2ftwL1iws 4C+xY50fSJhFQFXi0p1uZhCbV8BSYu3nDkYIW1Dix+R7LCA2s4C6xKR5i5ghbG2JJ+8usEJc qiCx4+xrRogjYiRmHjrMBFEjIrHvxTvGCYxCs5CMmoVk1Cwko2YhaVnAyLKKUTS1ILmgOCk9 10ivODG3uDQvXS85P3cTIzhZPJPewbiqweIQowAHoxIP74SbvcFCrIllxZW5hxglOJiVRHj1 FvQFC/GmJFZWpRblxxeV5qQWH2JMBvp0IrOUaHI+MJHllcQbGpuYGVkamRtaGBmbkyasJM57 sNU6UEggPbEkNTs1tSC1CGYLEwenVAOjv5dXVm9K6tzXuY7XJ9xhuVgV+XO3WOWHybYCrBFS 9ZNNj4mI9QQt2fN7BoeqxANNZXYL0XfMfyS897JuEBA9dWqzYusj+YhDQSs9GhXq1z6vzQo6 fnfmZmmLQ39PmDz4c2EHX8CsuFWPP15c+MwrMf7m/+sfC21nzgyseW3F8Lqvu2nuYfHVSizF GYmGWsxFxYkAS0b23FoDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1401857859 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > On Mon, Jun 02, 2014 at 03:06:13PM +0200, Luk=C3=A1=C5=A1 Czerner = wrote: > > > > So what will happen when there is not enough space when = "inserting a > > > > range" ? And how should user proceed from there ? > > > If insert range fails with an ENOSPC error, user could use = collapse > > > range on the same range to remove the hole. > > > And after freeing more space, he can again try inserting range. > > > Ofcourse, this type of guidance should be properly documented in > > > manpage. When updating fallocate(2) manpage, I will keep in mind = to > > > describe ENOSPC handling. > > > > Why collapse ? The hole is already there right ? Why not just use > > fallocate to allocate the space for the hole. And that's my point > > actually. Why not do it this way in the first place, because this is > > really counterintuitive. >=20 > It's worse than that. It's possible that the reason why you got the > ENOSPC warning was because the operation to move the extents down > required allocating a block, and it was *that* block allocation which > failed. So it's not deterministic whether or not the file's extent > mappings were modified after a ENOSPC error, and so it's not clear > whether or not a collapse_range function will undo the range that had > been inserted --- or whether it ends up deleting existing data blocks. >=20 > In generally, you really want system calls to have all-or-nothing > effects, where if the system call returns an error, the state of the > file has not been changed. And for that reason, I agree with = Luk=C3=A1=C5=A1 > that it is really a good idea to decouple moving the blocks down, and > allocating space --- and to make sure that if there is any failure > while inserting the range, the state of the file is not modified at = all. Okay, I will remove allocating space part in insert range patch. But renaming flags as FALLOC_FL_INSERT_HOLE is needed to concent with XFS people. Because Dave prefered to call it FALLOC_FL_INSERT_RANGE so that it looks like it is related to collapse range. Hi Dave. Do you have any objection about renaming as insert hole ? Thanks for opinions! >=20 > Cheers, >=20 > - Ted From ybru@biz-offer4.ru Wed Jun 4 01:22:31 2014 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 25D947F47 for ; Wed, 4 Jun 2014 01:22:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B871E8F8033 for ; Tue, 3 Jun 2014 23:22:27 -0700 (PDT) X-ASG-Debug-ID: 1401862940-04bdf059a155fed0001-NocioJ Received: from biz-offer4.ru (biz-offer4.ru [37.9.53.181]) by cuda.sgi.com with SMTP id lvhC9n3GvQJ0MnRB for ; Tue, 03 Jun 2014 23:22:21 -0700 (PDT) X-Barracuda-Envelope-From: ybru@biz-offer4.ru X-Barracuda-Apparent-Source-IP: 37.9.53.181 Message-ID: <18840105786D439095E2A01F096BF849@cslta> From: =?windows-1251?B?z/Du5OLo5uXt6OU=?= To: Subject: =?windows-1251?B?0ODx8fvr6ugg5Ov/IMLg+OXj7iDz8e/l+O3u?= =?windows-1251?B?4+4g4ejn7eXx4CE=?= Date: Wed, 4 Jun 2014 10:22:16 +0400 X-ASG-Orig-Subj: =?windows-1251?B?0ODx8fvr6ugg5Ov/IMLg+OXj7iDz8e/l+O3u?= =?windows-1251?B?4+4g4ejn7eXx4CE=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_043E_01CF7FDE.DBDC7840" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: biz-offer4.ru[37.9.53.181] X-Barracuda-Start-Time: 1401862940 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_043E_01CF7FDE.DBDC7840 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5! =C2=FB =E7=E0=ED=E8=EC=E0=E5=F2=E5=F1= =FC =E1=E8=E7=ED=E5=F1=EE=EC =E8 =E2=E0=F8=E5=E9 =EA=EE=EC=EF=E0=ED=E8=E8= =E8/=E8=EB=E8 =EB=FE=E1=EE=EC=F3 =E4=F0=F3=E3=EE=EC=F3 =E2=E0=F8=E5=EC=F3 =EF=F0=EE=E5=EA= =F2=F3 =ED=F3=E6=ED=E0 =F0=E5=EA=EB=E0=EC=E0 =EF=EE =E1=E8=E7=ED=E5=F1=E0= =EA=F2=E8=E2=ED=FB=EC, =EA=F0=E5=E4=E8=F2=EE=F1=EF=EE=F1=EE=E1=ED=FB=EC =EB=FE=E4=FF=EC =E8 =EA=EE=EC=EF=E0=ED=E8=FF=EC? =CF=F0=E5=E4=EB=E0=E3=E0=E5=EC email-=F0=E0=F1=F1=FB=EB=EA=E8! =C2 =ED=E0=EB=E8=F7=E8=E8 =E1=E0=E7=FB =CC=EE=F1=EA=E2=FB(12.5=EC=EB=ED.= =E0=E4=F0=E5=F1=EE=E2) =E8 =F0=E5=E3=E8=EE=ED=EE=E2 =D0=EE=F1=F1=E8=E8(1= 7=EC=EB=ED.). =CC=E8=ED=E8=EC=E0=EB=FC=ED=FB=E9 =EE=E1=FA=E5=EC =E7=E0=EA=E0=E7=E0(2.5= =EC=EB=ED.)- 4000=F0=F3=E1=EB=E5=E9 =E7=E0 =F0=E0=F1=F1=FB=EB=EA=F3. =C2=F1=FF =CC=EE=F1=EA=E2=E0(12.5=EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2)- 1500= 0=F0=F3=E1=EB=E5=E9. =C2=F1=FF =D0=EE=F1=F1=E8=FF(29.5=EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2)- 2500= 0=F0=F3=E1=EB=E5=E9. =20 =C1=E0=E7=FB =F1=EE=E4=E5=F0=E6=E0=F2 =E0=E4=F0=E5=F1=E0 =E1=E8=E7=ED=E5= =F1-=E0=EA=F2=E8=E2=ED=FB=F5 =E8 =EA=F0=E5=E4=E8=F2=EE=F1=EF=EE=F1=EE=E1=ED= =FB=F5 =EB=FE=E4=E5=E9-=20 =F2=E5=F5, =EA=EE=EC=F3 =E1=F3=E4=F3=F2 =E8=ED=F2=E5=F0=E5=F1=ED=FB =E2=E0= =F8=E8 =E1=E8=E7=ED=E5=F1-=EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=FF. =CF=EE=F1=F2=EE=FF=ED=ED=FB=EC =E8 =EA=F0=F3=EF=ED=FB=EC =E7=E0=EA=E0=E7= =F7=E8=EA=E0=EC- =E1=EE=EB=FC=F8=E8=E5 =F1=EA=E8=E4=EA=E8! =D2=E0=EA=E6=E5 =E4=E5=E9=F1=F2=E2=F3=E5=F2 =E0=EA=F6=E8=FF- =EF=F0=E8 =E7= =E0=EA=E0=E7=E5 =EE=E4=ED=EE=E2=F0=E5=EC=E5=ED=ED=EE 2=F5 =E1=E0=E7- 3=FE =F0=E0=F1=F1=FB=EB=E0=E5=EC =C1=CE=CD=D3=D1=CE=CC! =C7=E0=EA=E0=E7 =F0=E5=EA=EB=E0=EC=FB: +7(926)1888-017 MAIL: Mosrek1 "=F1=EE=E1=E0=EA=E0" yahoo.com (=CF=E8=F8=E8=F2=E5 =D2=CE= =CB=DC=CA=CE =ED=E0 =FD=F2=EE=F2 =E0=E4=F0=E5=F1, =E0 =ED=E5 =E2 =EE=F2=E2= =E5=F2 =ED=E0 =EF=E8=F1=FC=EC=EE!) ------=_NextPart_000_043E_01CF7FDE.DBDC7840 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5= ! =C2=FB =E7=E0=ED=E8=EC=E0=E5=F2=E5=F1=FC =E1=E8=E7=ED=E5=F1=EE=EC =E8 =E2= =E0=F8=E5=E9=20 =EA=EE=EC=EF=E0=ED=E8=E8 =E8/=E8=EB=E8
=EB=FE=E1=EE=EC=F3 =E4=F0=F3=E3=EE=EC= =F3 =E2=E0=F8=E5=EC=F3 =EF=F0=EE=E5=EA=F2=F3 =ED=F3=E6=ED=E0=20 =F0=E5=EA=EB=E0=EC=E0 =EF=EE =E1=E8=E7=ED=E5=F1=E0=EA=F2=E8=E2=ED=FB= =EC, =EA=F0=E5=E4=E8=F2=EE=F1=EF=EE=F1=EE=E1=ED=FB=EC
=EB=FE=E4=FF=EC =E8 =EA=EE=EC=EF=E0=ED= =E8=FF=EC?
 =CF=F0=E5=E4=EB=E0=E3=E0= =E5=EC=20 email-=F0=E0=F1=F1=FB=EB=EA=E8!
 
 =C2 =ED=E0=EB=E8=F7=E8=E8 =E1=E0= =E7=FB =CC=EE=F1=EA=E2=FB(12.5=EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2) =E8=20 =F0=E5=E3=E8=EE=ED=EE=E2 =D0=EE=F1=F1=E8=E8(17=EC=EB=ED.).
 =CC=E8= =ED=E8=EC=E0=EB=FC=ED=FB=E9 =EE=E1=FA=E5=EC =E7=E0=EA=E0=E7=E0(2.5=EC=EB=ED= .)- 4000=F0=F3=E1=EB=E5=E9=20 =E7=E0 =F0=E0=F1=F1=FB=EB=EA=F3.
 =C2=F1=FF =CC=EE=F1=EA=E2=E0(1= 2.5=EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2)-=20 15000=F0=F3=E1=EB=E5=E9.
 =C2=F1=FF =D0=EE=F1=F1=E8=FF(2= 9.5=EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2)-=20 25000=F0=F3=E1=EB=E5=E9.
 
 =C1=E0=E7=FB =F1=EE=E4=E5=F0=E6= =E0=F2 =E0=E4=F0=E5=F1=E0 =E1=E8=E7=ED=E5=F1-=E0=EA=F2=E8=E2=ED=FB=F5= =20 =E8 =EA=F0=E5=E4=E8=F2=EE=F1=EF=EE=F1=EE=E1=ED=FB=F5 =EB=FE=E4=E5=E9-
 =F2=E5=F5, =EA=EE=EC=F3=20 =E1=F3=E4=F3=F2 =E8=ED=F2=E5=F0=E5=F1=ED=FB =E2=E0=F8=E8 =E1=E8=E7=ED=E5=F1= -=EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=FF.
 =CF=EE=F1=F2=EE=FF=ED=ED=FB=EC= =E8 =EA=F0=F3=EF=ED=FB=EC=20 =E7=E0=EA=E0=E7=F7=E8=EA=E0=EC- =E1=EE=EB=FC=F8=E8=E5 =F1=EA=E8=E4=EA=E8!=
 =D2=E0=EA=E6=E5 =E4=E5=E9=F1=F2=E2=F3=E5=F2 =E0=EA=F6=E8=FF- =EF= =F0=E8 =E7=E0=EA=E0=E7=E5=20 =EE=E4=ED=EE=E2=F0=E5=EC=E5=ED=ED=EE 2=F5 =E1=E0=E7-
 3=FE =F0=E0= =F1=F1=FB=EB=E0=E5=EC =C1=CE=CD=D3=D1=CE=CC!
 
   =C7=E0=EA=E0=E7 =F0=E5=EA= =EB=E0=EC=FB:=20 +7(926)1888-017
   MAIL: Mosrek1 "=F1=EE=E1= =E0=EA=E0"=20 yahoo.com
(=CF=E8=F8=E8=F2=E5 =D2=CE=CB=DC=CA=CE= =ED=E0 =FD=F2=EE=F2 =E0=E4=F0=E5=F1, =E0 =ED=E5 =E2 =EE=F2=E2=E5=F2 =ED=E0= =20 =EF=E8=F1=FC=EC=EE!)
------=_NextPart_000_043E_01CF7FDE.DBDC7840-- From androidpos13@gmail.com Wed Jun 4 01:38:02 2014 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_IMAGE_RATIO_06,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 C04D87F50 for ; Wed, 4 Jun 2014 01:38:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DBAE1AC003 for ; Tue, 3 Jun 2014 23:38:00 -0700 (PDT) X-ASG-Debug-ID: 1401863875-04cb6c100620a820001-NocioJ Received: from mail-ob0-f194.google.com (mail-ob0-f194.google.com [209.85.214.194]) by cuda.sgi.com with ESMTP id 7qgjsrxpjjuRiEau (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Jun 2014 23:37:56 -0700 (PDT) X-Barracuda-Envelope-From: androidpos13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] Received: by mail-ob0-f194.google.com with SMTP id va2so2100210obc.9 for ; Tue, 03 Jun 2014 23:37:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=NXsd99oHlUgtwqfIvaruudmkDMj/M5vFpiP64+5VEAE=; b=wH2geJuSStOJLQ+kXp3yCallaQnR5u3jlGdPPJtv4eaDyRRn4joBGVumbZ7M+z5taA QjZaCW8zkF0cyn54jX5c8W/O1MJeUU8MqMZc2a4KxN58K2LgPDMAVdw75B5/0RSuHRdD yP2BtRuDXAuBFXWaGljBuMIa/mpLTWID4qGtSRKQGlpmzdckOsBrj9r5EaV8TvE8KrBM l5GLvsY3Pznf65wKumlqzlS4H93XJ4r9zoTO9zBAWjzWRYX/7P37vSgkBZsouX9nDCpF K1ncT+ACeAViazOdkdV5ooXutaOz87fgWOB0rpWMFmBM6YIZ4klhnT7Qoh3jEzqYH8r6 Fkgg== MIME-Version: 1.0 X-Received: by 10.182.60.4 with SMTP id d4mr54447217obr.4.1401863874816; Tue, 03 Jun 2014 23:37:54 -0700 (PDT) Received: by 10.76.113.170 with HTTP; Tue, 3 Jun 2014 23:37:54 -0700 (PDT) Date: Wed, 4 Jun 2014 12:07:54 +0530 Message-ID: Subject: Android Invoice/Billing/POS app for Phone/Tablets From: ANDROID POS X-ASG-Orig-Subj: Android Invoice/Billing/POS app for Phone/Tablets To: Rajashekhar M B Content-Type: multipart/related; boundary=089e0158ac8648833704fafcde38 X-Barracuda-Connect: mail-ob0-f194.google.com[209.85.214.194] X-Barracuda-Start-Time: 1401863875 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com 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_MV0224, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_06, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6365 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_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 --089e0158ac8648833704fafcde38 Content-Type: multipart/alternative; boundary=089e0158ac8648832f04fafcde37 --089e0158ac8648832f04fafcde37 Content-Type: text/plain; charset=UTF-8 Dear User, Greetings for the day !!! *Tycoon SMB* (Small & Medium Business) is a comprehensive *INVOICE / RETAIL BILLING / POS *application incorporating "*Best in Trade*" practices specially for Individual run businesses, service producers, utility shops,corner shops, moving shops, line salesman, route sales, hawker etc. [image: Inline image 1] App will handle your billing/invoicing, customer ,out standing credit & receivables & dynamic stock management. Multiple bill printing options allows you to print invoices on most network enabled printers, selected blue tooth printers or mail a *PDF* or just send an *SMS *invoice. Multiple report options Sales, Cash Receipts, Expenses, Stock, Profits, Tax reports, Expenses, Withdrawals , Day End Reports allows you to control & mange your business in a professional manner. We have the paid/full/unlimited version at Google Pay as "*Tycoon SMB Pro*" available for you at price of just *20$ !!!*. *Downloads :* *Paid :* https://play.google.com/store/apps/details?id=com.tycoon.ui.pos OR search for "*Tycoon SMB Pro*" on your play store . *Free :* https://play.google.com/store/apps/details?id=com.tycoon.ui.sangrahana.standalone OR search for "*Tycoon SMB*" on your play store . Kindly ignore the message, if it is not interests you. --------- Thanks & Regards *Tycoon SMB Team* *Phone*:+91 9035000033 *Email:* support@tycoontech.com *Facebook*: www.facebook.com/TycoonPos --089e0158ac8648832f04fafcde37 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear User,
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
<= div class=3D"gmail_quote">
=

Greetings for the day !!!

Tycoon SMB=C2=A0(Small & Medium Business) is a com= prehensive=C2=A0INVOICE / RETAIL BILLING / POS=C2=A0application inco= rporating "Best in Trade" practices specially for Individu= al run businesses, service producers, utility shops,corner shops, moving sh= ops, line salesman, route sales, hawker etc.

3D"Inline

App will handle your billing/invoicing, customer ,out sta= nding credit & receivables & dynamic stock management.

Multiple bill printing options allows you to print invoic= es on most network enabled printers, selected blue tooth printers or mail a= =C2=A0PDF=C2=A0or just send an=C2=A0SMS=C2=A0invoice.<= /div>
Multiple report options Sales, Cash R= eceipts, Expenses, Stock, Profits, Tax reports, Expenses, Withdrawals , Day= End Reports allows you to control & mange your business in a professio= nal manner.=C2=A0

We have t= he paid/full/unlimited version at Google Pay =C2=A0as "Tycoon SMB P= ro" available for you at price of just 20$ !!!.=C2=A0
=

Downloads :

Paid :=C2= =A0https://play.google.com/store/apps/details?id=3Dcom= .tycoon.ui.pos=C2=A0 OR search for "Tycoon SMB Pro" on= your play store .

Free :=C2=A0https://play.google.com/stor= e/apps/details?id=3Dcom.tycoon.ui.sangrahana.standalone=C2=A0OR search = for "Tycoon SMB" on your play store .

Kindly ignore the message, if it is not interests you.<= /div>

----= -----
Thanks & Regards

Tycoon SMB Team
Phone:+91 9035000033

































































































































--089e0158ac8648832f04fafcde37-- --089e0158ac8648833704fafcde38 Content-Type: image/png; name="image.png" Content-Disposition: inline; filename="image.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_140585a3884d4318 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 RXoeKzEm/iM94UhNffhqi6dauur7eognvJKMt6e25CN+ie5lxI92oEOLdHSlE9seV7yoH3GZJ8mo jji1vvejJDPGL+kstCUCSwSmR2DsGOOYjjLqw0vPRaavVuRHh0gWubXNDzVYZSuSJ2m1kjefebzo 5q1H0yLC9evdFyame7tI7jICmsddYm6LtfMVym0duiz68eLK5NUm0B+0Xoa2HbN7K8nWlvjyl1pt HFbfj00DkRw8TjI8g6O3funz/A0nJU5WJCySVy0a+mxjBT3vh/roCZM2uBRh0vcrbIkZ/vFYXteL eRvQ1adWMi2ax/A+e7xaWxiqPZZ04Gl8opVqYZT887iS8zTheZ5ovo6+yC+v59ted2kvEVgisH0E dMzVkIaOv3z8HqaFgAceyN/V5bNoLAQcH+cfp7jxQP7lLCWZDz3ugXR+Pz3N38CN+LFf82uh35sR OB7bIecOG7w5O5Vk5Yf6siu6+kO1dLmI5jyFry/atwmb5bqEZc9+QEureI2v6JH8oKcaGn0KiQm6 9NlkBxpt34fmEybx5Lcw1R+rtQKZcELulRYhT0OCgT/NeCO2fJHfGtNzn/vcND5OGn58Ub/UJ5qx gKtydtq1oXkfkgzzYT6vznKsxWfWKB1Wd+sXGVk9PMjfnrSbswkHf+Db39upPrEP9Z6d2tvIFkjo qQ+f36I9O1o9Yg+Vnp4c2q2djHNi7p6az3csFneo7cR5cmCfOTJc+ugTJ/TPTo9Wtw/yc6Inhsm8 y/5pM3F3jU6hm+3neNCmHBx0D7ZD07gS0/6RXNtvwim6avFVN2KpSzttbl4U1xSnRinaFtZgrR3U hEr63o8SDvEaKvITmdpYh/THeLZGMyayFX/UZ9v/ffHj9XTawvIyeiY6ykpGOpGv/lkBQLqS8XXE s7OdZ6/sTuhgKZhbk/f2tf94Ggrqnx003xFuBKHbD6uuDsyRI1w7tD9sbe/nVH7toDu/cyjYV1lX Tzi7megHR8azffnA5NG/bt8XvGb3d/nyGHJHNk/20bN0y5dz5IENBPqN5vwLHrbll9qHMFLpxwmS ZDO//C+++xJ1Yt/L0k7XOqvN45bldc5szJzPrl07SosDR0d5DHftXvf//vTPXP2/3/Yt6Y4Tiwb6 XNrQNcJjJ4PNea41PtLQ/mFeNOpuh7KmO92s8aNt7avQ2dSX/5yvjbE6xUe2Zq5ai/Caaz81esSK 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 8ODO9MGZ09TDjx4CS3ov+ISL7v/+3//bBtbOZBFxHu+8486GjfwdDXvmM5+5dRZd+bqdZ9zofN3G YfJHptP0VAM3UgOZ31kn2KQN9Fu/9Vs3P/IjP7L5yI/8yG5udibRWJfWtruWC8+cMqAR3QoE+7RP +7TNm970pv5FEeuJeWEjh+OESHo6F9YaPS3fLA3ss+Ws1WyW/b/zne/cfPmXf/nmC77gCzZ/4A/8 gd4D4ziZN2fddq1/Xhax/rPfEZc9ahE+dp2XPIHn9lOf9Gb1GV9tzG3fiLYO47eGp3+cydYfv7Dk 4Ria/2f6QGunmy09R66Q8gMxA17Aop1D+yLFm+fb/WyaGqHyBtFzGv0rQJOBN6+lPPMasg68GQ4/ /VjD57J8814Dp3J1e3/QLZEHKgoaPSo20hZPZgjP8TjXp4fjJZ7L5XFfqm9SeouJkYsGg/KkBkIa 2LqzOkWZYr8pXu5fXVrUs5R1tXT54ubyxQ9UvFgnnpc6f+XSPQ1XFxz5LtepqPbTZjal9saHAgxX h5ajPHTPbGagpdHJgnYgWdelnHQfn9RJDwvBmesDO4ouBhHcD/uwD9tcvjKcebzy3Mz7P/D+3hRt mI961KN6LLKxcibnDTO80B/VtvrTcKqBG60B6wR77PWgHD02/L73vW/zUz/1U5s/8kf+yHZjnNtl y5nrM3ydz3yBax3zXTm0P/3TP7357//9v2+dSfWcSYEcmddrfqflUw3cLA1k7c16LLVWC+aIwC7Z p5NK80M+p+mxdXhOs37/7//9tZ4PZ2PmOefxm8vJ43EjAn5zOIz/Gm+mOUk+9HRwksjtzq/QlAba R+KEe8lGvFR7ql8GbBh4RX5U90YbHPeK7qCK48SWOzZifpP7SuEWaf/qIFU4+HLq2B+5dLJZZ4L7 5NXneTxPooPwmWkP4xF40vA/8oQySg7yvhTDw/DSWF/RL4bBAM/QUIVzBfMTQegT00bKUny27ZR3 FxjctDHja6OGoCfPlm5hPE8seOObk1zGIUPaMtFEvqoQeBtFydQfEiXbQXsfyPWXPCcJwUs603Tf VnzmfsJVbryZcIF3ff1Z14eHehuvAMapjkN518Pu2vzO7/zO5rM/+7O3m2Z058r2iU984uarv/qr N4973ONaTzZZ7YS3PP0pn4ZTDdwsDXDqfvM3f7Of5/2Jn/iJze/93u/15sn22CAnzyn8R33UR7Vt 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 4yl80Y05n