From fadillah.w@highscope.or.id Wed Jan 2 03:35:51 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_50,BODY_SIR_MADAM, FREEMAIL_FORGED_REPLYTO,J_CHICKENPOX_44,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r029Zoxt242968 for ; Wed, 2 Jan 2013 03:35:51 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9C425304064 for ; Wed, 2 Jan 2013 01:38:36 -0800 (PST) X-ASG-Debug-ID: 1357119511-04cb6c05a69bad90001-NocioJ Received: from zimbra7.highscope.or.id (ip-173-253-static.velo.net.id [222.165.253.173]) by cuda.sgi.com with ESMTP id D1pNJw0xtUfY8mW7 for ; Wed, 02 Jan 2013 01:38:34 -0800 (PST) X-Barracuda-Envelope-From: fadillah.w@highscope.or.id X-Barracuda-Apparent-Source-IP: 222.165.253.173 Received: from localhost (localhost [127.0.0.1]) by zimbra7.highscope.or.id (Postfix) with ESMTP id A9E75262E91; Wed, 2 Jan 2013 14:59:02 +0700 (WIT) X-Amavis-Modified: Mail body modified (using disclaimer) - zimbra7.highscope.or.id X-Virus-Scanned: amavisd-new at highscope.or.id Received: from zimbra7.highscope.or.id ([127.0.0.1]) by localhost (zimbra7.highscope.or.id [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id x1qcxptXqEif; Wed, 2 Jan 2013 14:59:02 +0700 (WIT) Received: from zimbra7.highscope.or.id (zimbra7.highscope.or.id [172.17.40.10]) by zimbra7.highscope.or.id (Postfix) with ESMTP id 90CB2262E82; Wed, 2 Jan 2013 14:59:00 +0700 (WIT) Date: Wed, 02 Jan 2013 14:59:00 +0700 (WIT) From: Purchasing Department Reply-To: Purchasing Department Subject: Supply Needed. Message-ID: <454c06b7-734a-4e3e-8147-25693d3c53df@zimbra7> X-ASG-Orig-Subj: Supply Needed. Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-Mailer: Zimbra 7.1.2_GA_3268 (zclient/7.1.2_GA_3268) To: undisclosed-recipients:; X-Barracuda-Connect: ip-173-253-static.velo.net.id[222.165.253.173] X-Barracuda-Start-Time: 1357119513 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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_SA620a X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA620a Custom Rule SA620a Sir/Madam, Our Company is interested in your product,that we saw in trading site,your early reply is very necessary for further detail of specification immediately you receive our email. Regards Purchasing manager, Mr James Vincent . Innex, Inc. 325 Enterprise Place, Pomona, CA 91768 United States. ---------------------------------------------------------------------------- This message is confidential. Unless otherwise specifically stated by the sender, any documents or views presented are solely those of the sender and do not constitute official documents or views of HighScope Indonesia. Any unauthorized disclosure, use, copying or dissemination of the content, either whole or partial, is prohibited. If you are not the intended recipient of the message, please notify the sender immediately. HighScope Indonesia does not take any responsibility for any damages caused by this e-mail from any virus or communication failure. ---------------------------------------------------------------------------- From jellis@dhnet.us Wed Jan 2 08:09:01 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_23, J_CHICKENPOX_44,J_CHICKENPOX_55 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02E90GY000749 for ; Wed, 2 Jan 2013 08:09:01 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6ED5A8F804C for ; Wed, 2 Jan 2013 06:11:51 -0800 (PST) X-ASG-Debug-ID: 1357135904-04bdf04310432690001-NocioJ Received: from relay00.pair.com (relay00.pair.com [209.68.5.9]) by cuda.sgi.com with SMTP id hq3XPRBGUDewgCDZ for ; Wed, 02 Jan 2013 06:11:44 -0800 (PST) X-Barracuda-Envelope-From: jellis@dhnet.us X-Barracuda-Apparent-Source-IP: 209.68.5.9 Received: (qmail 84185 invoked from network); 2 Jan 2013 14:11:43 -0000 Received: from 199.188.183.126 (HELO ?192.168.2.3?) (199.188.183.126) by relay00.pair.com with SMTP; 2 Jan 2013 14:11:43 -0000 X-pair-Authenticated: 199.188.183.126 User-Agent: Microsoft-Entourage/12.35.0.121009 Date: Wed, 02 Jan 2013 09:11:41 -0500 Subject: Re: xfsdump INTERRUPT issue From: "J. Ellis" X-ASG-Orig-Subj: Re: xfsdump INTERRUPT issue To: Stan Hoeppner , Dave Chinner CC: "xfs@oss.sgi.com" Message-ID: Thread-Topic: xfsdump INTERRUPT issue Thread-Index: Ac3o8xYnHosLksPpGkS6+nAkD84h6g== In-Reply-To: <50D2A038.2040501@hardwarefreak.com> Mime-version: 1.0 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit X-Barracuda-Connect: relay00.pair.com[209.68.5.9] X-Barracuda-Start-Time: 1357135904 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FUZZY_VPILL, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam Resend of previous message sent during the holidays. Best, J. on 12/20/12 12:2 AM, Stan Hoeppner at stan@hardwarefreak.com wrote: > On 12/19/2012 4:12 P, Jeffrey Ellis wrote: >> Dave, is there a way of piping dmesg toa file? > > ~$ dmesg > /var/tmp/somefile.txt > > You can write the file anywhere. This path is an example. Tanks, Stan. That saved me a good 10 min. of copying and pasting. Ok, here'sthe output of dmesg after echoing /proc/sysrq-trigger: echo w > /pro/sysrq-trigger echo l > /proc/sysrq-trigger dmesg > dmesg_output.txt [ 8.732301] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 8.73233] Bluetooth: BNEP filters: protocol multicast [ 8.797787] usb 2-3.2: ew USB device found, idVendor=05ac, idProduct=1006 [ 8.797792] usb 2-3.2:New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 8.79779] usb 2-3.2: Product: Keyboard Hub [ 8.797797] usb 2-3.2: Manufacturer Apple, Inc. [ 8.797800] usb 2-3.2: SerialNumber: 000000000000 [ 8.798087] hub 2-3.2:1.0: USB hub found [ 8.798160] hub 2-3.2:1.0: 3 portcted [ 8.885137] usb 2-3.4: new full-speed USB device number 6 using ehci_hcd [ 8.944720] type=1400 audit(1356014900.737:11): apparmor="STATUS" operation="profile_load" name="/usr/lib/cups/backend/cups-pdf" pid=981 comm="apparmor_parser" [ 8.985216] usb 2-3.4: New USB device found, idVendor=05ac, idProduct=1105 [ 8.985219] usb 2-3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 8.985222] usb 2-3.4: Product: Display Audio [ 8.985224] usb 2-3.4: Manufacturer: Apple Inc. [ 8.985225] usb 2-3.4: SerialNumber: 21414402 [ 9.072803] usb 2-3.5: new high-speed USB device number 7 using ehci_hd [ 9.182374] usb 2-3.5: New USB device found, idVendor=05ac, idProduct=8508 [ 9.182378] usb 2-3.5: New SB device strings: Mfr=1, Product=2, SerialNumber=3 [ 9.182382] usb 2-3.5: Product: Dsplay iSight [ 9.182384] usb 2-3.5: Manufacturer: Apple Inc. [ 9.182387] usb 2-3.5 SerialNumber: 8TACU01G4BS03F00 [ 9.268480] usb 2-3.6: new full-speed USB device number 8 using ehci_hcd [ 9.351459] 6:1:1: cannot get freq at ep 0x4 [ 9.355323] 6:1:2: cannot get freq at ep 0x4 [ 9.361311] 6:2:1: cannot get freq at ep 0x84 [ 9.361563] usb 2-3.6: New USB device found, idVendor=05ac, idProduct=9226 [ .361567] usb 2-3.6: New USB device strings: Mfr=1, Product=2, SerialNumber= [ 9.361570] usb 2-3.6: Product: Apple LED Cinema Display [ 9.361573] usb 2-3.6: Manufacturer: Apple Inc. [ 9.362794] usbcore: registered new interface driver snd-usb-audio [ 9.373978] usbcore: registered new interface driver usbhid [ 9.373981] usbhid: USB HID core driver [ 9.413299] input:Apple Inc. Display Audio as /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.3/inut/input5 [ 9.413380] hid-generic 0003:05AC:1105.0001: input,hidraw0: USB HID v1.11 Dvice [Apple Inc. Display Audio] on usb-0000:00:1d.7-3.4/input3 [ 9.414585] hid-generic 0003:05AC:9226.0002: hiddev0,hidraw1: USB HID v1.11 Device [Apple Inc. Apple LED Cinema Display] on usb-0000:00:1d.7-3.6/input0 [ 9.437871] usb 5-1.1: new full-speed USB device number 3 using uhci_hcd [ 9.485560] Linux video capture interface: v2.00 [ 9.575631] usb 5-1.1: New USB device found, idVendor=05ac, idProduct=8215 [ 9.575636] usb 5-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 9.575639] usb 5-1.1: Product: Bluetooth USB Host Controller [ 9.575642] usb 5-1.1: Manufacturer: Apple Inc. [ 9.575644] usb 5-1.1: SerialNumber: 78CA39CD0990 [ 9.606832] uvcvideo: Found UVC 1.00 device Display iSight (05ac:8508) [ 9.611500] input: Display iSight as /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.5/2-3.5:1.0/input/input6 [ 9.611568] usbcore: registered new interface driver uvcvideo [ 9.611570] USB Video Class driver (1.1.1) [ 9.653500] usb 5-1.2: new full-speed USB device number 4 using uhci_hcd [ 9.746147] usbcore: registered new interface driver btusb [ 9.758319] usb 5-1.2: device descriptor read/all, error -71 [ 9.778284] hub 5-1:1.0: unable to enumerate USB device on port 2 [ 9.937144] ipheth 2-3.1:4.2: Apple iPhone USB Ethernet device attached [ 9.937168] usbcore: reistered new interface driver ipheth [ 9.995244] usb 1-2.3.4: new full-speed USB devic number 7 using ehci_hcd [ 10.104560] usb 1-2.3.4: New USB device found, idVendor=03f0 idProduct=1d17 [ 10.104564] usb 1-2.3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 10.104568] usb 1-2.3.4: Product: hp LaserJet 1320 series [ 10.104570] usb 1-2.3.4: Manufacturer: Hewlett-Packard [ 10.104573] usb 1-2.3.4: SerialNumber: 00CNHC5DP1R0 [ 10.175066] usb 1-2.4.1: new high-speed USB device number 8 using ehci_hcd [ 10.267032] usb 1-2.4.1: New USB device found, idVendor=0409, idProduct=005a [ 10.267036] usb 1-2.4.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 10.267306] hub 1-2.4.1:1.0: USB hub found [ 10.267397] hub 1-2.4.1:1.0: 4 ports detected [ 10.338637] usb 2-3.2.2: new low-speed USB device number 9 using ehci_hcd [ 10.436960] usb 2-3.2.2: New USB device found, idVendor=05ac, idProduct=0220 [ 10.436964] usb 2-3.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 10.436968] usb 2-3.2.2: Product: Apple Keyboard [ 10.436970] usb 2-3.2.2: Manufacturer: Apple, Inc [ 10.502750] input: Apple, Inc Apple Keyboard as /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.2/2-3.2.2/2-3.2.2:1.0/input/in put7 [ 10.502905] apple 0003:05AC:0220.0003: input,hidraw2: USB HID v1.11 Keyboard [Apple, Inc Apple Keyboard] on usb-0000:00:1d.7-3.2.2/input0 [ 10.503932] input: Apple, Inc Apple Keyboard as /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.2/2-3.2.2/2-3.2.2:1.1/input/in put8 [ 10.504029] apple 0003:05AC:0220.0004: input,hidraw3: USB HID v1.11 Device [Apple, Inc Apple Keyboard] on usb-0000:00:1d.7-3.2.2/input1 [ 10.514330] usb 2-3.2.3: new low-speed USB device number 10 using ehci_hcd [ 10.611908] usb 2-3.2.3: New USB device found, idVendor=05ac, idProduct=0304 [ 10.611911] usb 2-3.2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 10.611914] usb 2-3.2.3: Product: Apple Optical USB Mouse [ 10.611917] usb 2-3.2.3: Manufacturer: Mitsumi Electric [ 10.615011] input: Mitsumi Electric Apple Optical USB Mouse as /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.2/2-3.2.3/2-3.2.3:1.0/input/in put9 [ 10.615124] apple 0003:05AC:0304.0005: input,hidraw4: USB HID v1.10 Mouse [Mitsumi Electric Apple Optical USB Mouse] on usb-0000:00:1d.7-3.2.3/input0 [ 10.682497] usblp 1-2.3.4:1.0: usblp1: USB Bidirectional printer dev 7 if 0 alt 1 proto 2 vid 0x03F0 pid 0x1D17 [ 10.682521] usbcore: registered new interface driver usblp [ 10.833807] usb 1-2.4.1.4: new high-speed USB device number 9 using ehci_hcd [ 10.948606] usb 1-2.4.1.4: New USB device found, idVendor=04b8, idProduct=011b [ 10.948611] usb 1-2.4.1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 10.948614] usb 1-2.4.1.4: Product: EPSON Scanner [ 10.948617] usb 1-2.4.1.4: Manufacturer: EPSON [ 11.285388] vesafb: mode is 1400x1050x32, linelength=5632, pages=0[ 11.285390] vesafb: scrolling: redraw [ 11.285392] vesafb: Truecolor: size=0:8:8:8,shift=0:16:8:0 [ 11.292768] vesafb: framebuffer at 0x80000000, mapped to 0xf8e00000, uing 5824k, total 5824k [ 11.292946] Console: switching to colour frame buffer device 175x65 [ 11.292986] fb0: VESA VGA frame buffer device [ 13.240648] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 13.241017] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 13.365748] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready [ 13.366108] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready [ 13.369198] IPv6: ADDRCONF(NETDEV_UP): eth2: link is not ready [ 13.369722] IPv6: ADDRCONF(NETDEV_UP): eth2: link is not ready [ 14.663829] pci 0000:05:00.0: Invalid ROM contents [ 14.663837] pci 0000:05:00.0: Invalid ROM contents [ 14.663842] pci 0000:05:00.0: Invalid ROM contents [ 14.663846] pci 0000:05:00.0: Invalid ROM contents [ 14.663849] pci 0000:05:00.0: Invalid ROM contents [ 14.663853] pci 0000:05:00.0: Invalid ROM contents [ 14.663857] pci 0000:05:00.0: Invalid ROM contents [ 14.663861] pci 0000:05:00.0: Invalid ROM contents [ 14.663865] pci 0000:05:00.0: Invalid ROM contents [ 14.663868] pci 0000:05:00.0: Invalid ROM contents [ 14.663872] pci 0000:05:00.0: Invalid ROM contents [ 14.663876] pci 0000:05:00.0: Invalid ROM contents [ 14.663880] pci 0000:05:00.0: Invalid ROM contents [ 14.663883] pci 0000:05:00.0: Invalid ROM contents [ 14.663887] pci 0000:05:00.0: Invalid ROM contents [ 14.663891] pci 0000:05:00.0: Invalid ROM contents [ 16.341180] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx [ 16.341508] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready [ 16.606138] pci 0000:05:00.0: Invalid ROM contents [ 16.606146] pci 0000:05:00.0: Invalid ROM contents [ 16.606150] pci 0000:05:00.0: Invalid ROM contents [ 16.606154] pci 0000:05:00.0: Invalid ROM contents [ 16.606159] pci 0000:05:00.0: Invalid ROM contents [ 16.606163] pci 0000:05:00.0: Invalid ROM contents [ 16.606167] pci 0000:05:00.0: Invalid ROM contents [ 16.606171] pci 0000:05:00.0: Invalid ROM contents [ 16.606175] pci 0000:05:00.0: Invalid ROM contents [ 16.606179] pci 0000:05:00.0: Invalid ROM contents [ 16.606183] pci 0000:05:00.0: Invalid ROM contents [ 16.606187] pci 0000:05:00.0: Invalid ROM contents [ 16.606191] pci 0000:05:00.0: Invalid ROM contents [ 16.606195] pci 0000:05:00.0: Invalid ROM contents [ 16.606198] pci 0000:05:00.0: Invalid ROM contents [ 16.606202] pci 0000:05:00.0: Invalid ROM contents [ 26.477566] Bluetooth: HIDP (Human Interface Emulation) ver 1.2 [ 27.726532] 6:1:1: cannot get freq at ep 0x4 [ 27.731520] 6:2:1: cannot get freq at ep 0x84 [ 27.782437] 6:1:1: cannot get freq at ep 0x4 [ 27.786429] 6:2:1: cannot get freq at ep 0x84 [ 27.814383] 6:2:1: cannot get freq at ep 0x84 [ 27.826362] 6:1:1: cannot get freq at ep 0x4 [ 27.835347] 6:2:1: cannot get freq at ep 0x84 [ 299.575869] [Hardware Error]: Machine check events logged [ 935.469634] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled [ 935.496565] XFS (sda2): Mounting Filesystem [ 935.566619] XFS (sda2): Starting recovery (logdev: internal) [ 935.742295] XFS (sda2): Ending recovery (logdev: internal) [ 1014.810155] BUG: unable to handle kernel NULL pointer dereference at 00000070 [ 1014.810163] IP: [] __ticket_spin_lock+0x8/0x30 [ 1014.810174] *pdpt = 000000002e59f001 *pde = 0000000000000000 [ 1014.810178] Oops: 0002 [#1] SMP [ 1014.810182] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1001014.810224] [ 1014.810227] Pid: 3029, comm: xfsrestore Not tainted 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 1014.810230] EIP: 0060:[] EFLAGS: 00210202 CPU: 4 [ 1014.810232] EIP is at __ticket_spin_lock+0x8/0x30 [ 1014.810234] EAX: 00000070 EBX: f6d1cc00 ECX: 00000000 EDX: 00000100 [ 1014.810235] ESI: 2de4b7f0 EDI: 0010a266 EBP: ee6a369c ESP: ee6a369c [ 1014.810237] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 1014.810238] CR0: 8005003b CR2: 00000070 CR3: 2b179000 CR4: 000007f0 [ 1014.810240] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 1014.810241] DR6: ffff0ff0 DR7: 00000400 [ 1014.810243] Process xfsrestore (pid: 3029, ti=ee6a2000 task=eb966580 task.ti=ee6a2000) [ 1014.810244] Stack: [ 1014.810245] ee6a36a4 c15ca1cd ee6a36cc f94a0dbc ee6a3744 00000000 0002144c ee6a36f8 [ 1014.810250] 00000070 f6c6f8a0 2de4b7f0 0010a266 ee6a36f4 f94a1062 00000008 00000001 [ 1014.810255] 00000000 00000001 00000000 00000008 00000008 00000000 ee6a3718 f94a1bf6 [ 1014.810259] Call Trace: [ 1014.810265] [] _raw_spin_lock+0xd/0x10 [ 1014.810289] [] _xfs_buf_find+0x6c/0x240 [xfs] [ 1014.810304] [] xfs_buf_get+0x32/0x190 [xfs] [ 1014.810319] [] xfs_buf_read+0x26/0xd0 [xfs] [ 1014.810340] [] xfs_trans_read_buf+0x22f/0x380 [xfs] [ 1014.810361] [] xfs_rtbuf_get+0xe5/0x110 [xfs] [ 1014.810379] [] ? kmem_zone_zalloc+0x30/0x40 [xfs] [ 1014.810400] [] ? xfs_trans_add_item+0x24/0x60 [xfs] [ 1014.810421] [] xfs_rtcheck_range.constprop.3+0x59/0x360 [xfs] [ 1014.810441] [] ? xfs_rtbuf_get+0xe5/0x110 [xfs] [ 1014.810462] [] xfs_rtallocate_extent_block+0xd7/0x2d0 [xfs] [ 1014.810483] [] ? xfs_rtget_summary+0x87/0x120 [xfs] [ 1014.810504] [] xfs_rtallocate_extent_size+0xdc/0x310 [xfs] [ 1014.810508] [] ? kmem_cache_alloc+0x29/0x120 [ 1014.810510] [] ? kmem_cache_alloc+0x29/0x120 [ 1014.810527] [] ? kmem_zone_alloc+0x56/0xd0 [xfs] [ 1014.810549] [] xfs_rtallocate_extent+0x183/0x200 [xfs] [ 1014.810567] [] xfs_bmap_rtalloc+0x19a/0x370 [xfs] [ 1014.810585] [] xfs_bmap_alloc+0x35/0x40 [xfs] [ 1014.810603] [] xfs_bmapi_allocate+0xb3/0x300 [xfs] [ 1014.810622] [] xfs_bmapi_write+0x489/0x7f0 [xfs] [ 1014.810639] [] xfs_iomap_write_direct+0x28f/0x4e0 [xfs] [ 1014.810653] [] __xfs_get_blocks+0x50a/0x640 [xfs] [ 1014.810668] [] xfs_get_blocks_direct+0x26/0x30 [xfs] [ 1014.810672] [] do_direct_IO+0x5b4/0x1030 [ 1014.810674] [] ? do_blockdev_direct_IO+0x19f/0xe40 [ 1014.810677] [] ? schedule+0x23/0x60 [ 1014.810680] [] do_blockdev_direct_IO+0x41c/0xe40 [ 1014.810701] [] ? xlog_grant_sub_space.isra.3+0x1d/0x80 [xfs] [ 1014.810716] [] ? __xfs_get_blocks+0x640/0x640 [xfs] [ 1014.810719] [] __blockdev_direct_IO+0x6f/0x80 [ 1014.810733] [] ? __xfs_get_blocks+0x640/0x640 [xfs] [ 1014.810747] [] ? xfs_finish_ioend_sync+0x30/0x30 [xfs] [ 1014.810761] [] xfs_vm_direct_IO+0xd4/0x1c0 [xfs] [ 1014.810775] [] ? __xfs_get_blocks+0x640/0x640 [xfs] [ 1014.810789] [] ? xfs_finish_ioend_sync+0x30/0x30 [xfs] [ 1014.810793] [] generic_file_direct_write+0xcf/0x1e0 [ 1014.810812] [] xfs_file_dio_aio_write+0x1c5/0x247 [xfs] [ 1014.810828] [] xfs_file_aio_write+0x1a0/0x1b0 [xfs] [ 1014.810831] [] do_sync_write+0xb7/0xf0 [ 1014.810835] [] ? security_file_permission+0x24/0xb0 [ 1014.810838] [] ? rw_verify_area+0x63/0x110 [ 1014.810841] [] ? wait_on_retry_sync_kiocb+0x50/0x50 [ 1014.810843] [] vfs_write+0x8c/0x160 [ 1014.810846] [] ? wait_on_retry_sync_kiocb+0x50/0x50 [ 1014.810848] [] sys_write+0x3d/0x70 [ 1014.810852] [] sysenter_do_call+0x12/0x28 [ 1014.810853] Code: b9 fa 78 03 c1 e9 59 ff ff ff 90 b8 03 79 03 c1 b9 00 79 03 c1 e9 49 ff ff ff 66 90 66 90 66 90 66 90 90 55 ba 00 01 00 00 89 e5 66 0f c1 10 0f b6 ce 38 d1 74 0d 8d 74 26 00 f3 90 0f b6 10 [ 1014.810882] EIP: [] __ticket_spin_lock+0x8/0x30 SS:ESP 0068:ee6a369c [ 1014.810886] CR2: 0000000000000070 [ 1014.810896] ---[ end trace d20e0b6421a3233c ]--- [ 2608.263447] SysRq : Show Blocked State [ 2608.263455] task PC stack pid father [ 2608.263557] gnome-terminal D f7b9ee00 0 2741 1 0x00000000 [ 2608.263563] ed335ad4 00200086 00989680 f7b9ee00 0000025f f746e580 489bec7e 0000025f [ 2608.263571] c196be00 c196be00 00000002 f7b9ee00 f7b9ee00 f6ddcc20 00000000 00000000 [ 2608.263579] 00000020 f746e580 f6ddcc20 ed335ac0 c101002c ed335ac8 c107d52a 00000002 [ 2608.263587] Call Trace: [ 2608.263599] [] ? __switch_to+0xbc/0x260 [ 2608.263605] [] ? idle_balance+0x10a/0x150 [ 2608.263610] [] ? finish_task_switch+0x41/0xc0 [ 2608.263616] [] schedule+0x23/0x60 [ 2608.263620] [] schedule_timeout+0x215/0x280 [ 2608.263626] [] ? default_spin_lock_flags+0x8/0x10 [ 2608.263630] [] ? _raw_spin_lock_irqsave+0x2d/0x40 [ 2608.263634] [] ? try_to_wake_up+0x18e/0x230 [ 2608.263640] [] ? timerqueue_del+0x27/0x70 [ 2608.263644] [] wait_for_common+0xa1/0x120 [ 2608.263648] [] ? try_to_wake_up+0x230/0x230 [ 2608.263652] [] ? poll_schedule_timeout+0x60/0x60 [ 2608.263656] [] wait_for_completion+0x17/0x20 [ 2608.263661] [] flush_work+0x28/0x30 [ 2608.263664] [] ? wake_up_worker+0x30/0x30 [ 2608.26 [] ? regulator_is_supported_voltage+0x21/0x70 [ 2608.263673] [] tty_flush_to_ldisc+0x12/0x20 [ 2608.263678] [] n_tty_poll+0x5f/0x180 [ 2608.263682] [] ? n_tty_set_room+0x70/0x70 [ 2608.263686] [] tty_poll+0x6b/0x90 [ 2608.263689] [] ? n_tty_set_room+0x70/0x70 [ 2608.263693] [] do_sys_poll+0x1f4/0x430 [ 2608.263698] [] ? __enqueue_entity+0x70/0x80 [ 2608.263702] [] ? enqueue_entity+0xcb/0x510 [ 2608.263705] [] ? sched_clock_cpu+0xe5/0x160 [ 2608.263709] [] ? resched_task+0x25/0x70 [ 2608.263713] [] ? check_preempt_curr+0x65/0x90 [ 2608.263717] [] ? ttwu_do_wakeup+0x28/0x110 [ 2608.263721] [] ? unix_stream_recvmsg+0x5d0/0x680 [ 2608.263725] [] ? try_to_wake_up+0x18e/0x230 [ 2608.263729] [] ? poll_schedule_timeout+0x60/0x60 [ 2608.263732] [] ? __pollwait+0xd0/0xd0 [ 2608.263735] [] ? __pollwait+0xd0/0xd0 [ 2608.263739] [] ? __pollwait+0xd0/0xd0 [ 2608.263742] [] ? __pollwait+0xd0/0xd0 [ 2608.263745] [] ? __pollwait+0xd0/0xd0 [ 2608.263748] [] ? __pollwait+0xd0/0xd0 [ 2608.263751] [] ? __pollwait+0xd0/0xd0 [ 2608.263755] [] ? __pollwait+0xd0/0xd0 [ 2608.263758] [] ? __pollwait+0xd0/0xd0 [ 2608.263761] [] ? __pollwait+0xd0/0xd0 [ 2608.263766] [] ? security_file_permission+0x24/0xb0 [ 2608.263772] [] ? do_readv_writev+0x146/0x190 [ 2608.263776] [] ? ktime_get_ts+0xd1/0x100 [ 2608.263780] [] ? poll_select_set_timeout+0x64/0x80 [ 2608.263783] [] sys_poll+0x5a/0xd0 [ 2608.263788] [] sysenter_do_call+0x12/0x28 [ 2608.263792] [] ? bad_area+0x2d/0x3e [ 2608.263811] Sched Debug Version: v0.10, 3.5.0-19-generic #30-Ubuntu [ 2608.263814] ktime : 2612632.444740 [ 2608.263816] sched_clk : 2608263.809940 [ 2608.263818] cpu_clk : 2608263.810008 [ 2608.263820] jiffies : 578158 [ 2608.263822] sched_clock_stable : 1 [ 2608.263823] [ 2608.263825] sysctl_sched [ 2608.263827] .sysctl_sched_latency : 24.000000 [ 2608.263829] .sysctl_sched_min_granularity : 3.000000 [ 2608.263831] .sysctl_sched_wakeup_granularity : 4.000000 [ 2608.263833] .sysctl_sched_child_runs_first : 0 [ 2608.263835] .sysctl_sched_features : 24119 [ 2608.263837] .sysctl_sched_tunable_scaling : 1 (logaritmic) [ 2608.263839] [ 2608.263839] cpu#0, 2393.987 MHz [ 2608.263842] .nr_running : 0 [ 2608.263844] .load : 0 [ 2608.263846] .nr_switches : 499256 [ 2608.263848] .nr_load_updates : 71414 [ 2608.263850] .nr_uninterruptible : 209 [ 2608.263852] .next_balance : 0.578159 [ 2608.263853] .curr->pid : 0 [ 2608.263856] .clock : 2608263.456880 [ 2608.263857] .cpu_load[0] : 0 [ 2608.263859] .cpu_load[1] : 0 [ 2608.263861] .cpu_load[2] : 0 [ 2608.263863] .cpu_load[3] : 0 [ 2608.263864] .cpu_load[4] : 0 [ 2608.263866] .yld_count : 0 [ 2608.263868] .sched_count : 500743 [ 2608.263870] .sched_goidle : 224438 [ 2608.263872] .avg_idle : 1000000 [ 2608.263874] .ttwu_count : 236366 [ 2608.263875] .ttwu_local : 43308 [ 2608.263878] [ 2608.263878] cfs_rq[0]:/autogroup-114 [ 2608.263881] .exec_clock : 65.955837 [ 2608.263883] .MIN_vruntime : 0.000001 [ 2608.263886] .min_vruntime : 76.907285 [ 2608.263887] .max_vruntime : 0.000001 [ 2608.263889] read : 0.000000 [ 2608.263892] .spread0 : -321671.321079 [ 2608.263893] .nr_spread_over : 0 [ 2608.263895] .nr_running : 0 [ 2608.263897] .load : 0 [ 2608.263899] .load_avg : 5119.999488 [ 2608.263901] .load_period : 5.000767 [ 2608.263903] .load_contrib : 1023 [ 2608.263905] .load_tg : 1023 [ 2608.263907] .se->exec_start : 2608263.455344 [ 2608.263909] .se->vruntime : 321736.297866 [ 2608.263911] .se->sum_exec_runtime : 66.704593 [ 2608.263913] .se->statistics.wait_start : 0.000000 [ 2608.263915] .se->statistics.sleep_start : 0.000000 [ 2608.263917] .se->statistics.block_start : 0.000000 [ 2608.263919] .se->statistics.sleep_max : 0.000000 [ 2608.263921] .se->statistics.block_max : 0.000000 [ 2608.263923] .se->statistics.exec_max : 1.734161 [ 2608.263925] .se->statistics.slice_max : 1.734161 [ 2608.263927] .se->statistics.wait_max : 2.339911 [ 2608.263929] .se->statistics.wait_sum : 9.978312 [ 2608.263931] .se->statistics.wait_count : 1449 [ 2608.263932] .se->load.weight : 2 [ 2608.263935] [ 2608.263935] cfs_rq[0]:/ [ 2608.263938] .exec_clock : 93386.429538 [ 2608.263940] .MIN_vruntime : 0.000001 [ 2608.263942] .min_vruntime : 321748.228364 [ 2608.263944] .max_vruntime : 0.000001 [ 2608.263946] .spread : 0.000000 [ 2608.263947] .spread0 : 0.000000 [ 2608.263949] .nr_spread_over : 7 [ 2608.263951] .nr_running : 0 [ 2608.263953] .load : 0 [ 2608.263955] .load_avg : 0.000000 [ 2608.263957] .load_period : 0.000000 [ 2608.263958] .load_contrib : 0 [ 2608.263960] .load_tg : 0 [ 2608.263963] [ 2608.263963] rt_rq[0]:/ [ 2608.263966] .rt_nr_running : 0 [ 2608.263967] .rt_throttled : 0 [ 2608.263969] .rt_time : 0.011018 [ 2608.263971] .rt_runtime : 950.000000 [ 2608.263973] [ 2608.263973] runnable tasks: [ 2608.263973] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.263973] ---------------------------------------------------------------------------- ------------------------------ [ 2608.263998] [ 2608.263998] cpu#1, 2393.987 MHz [ 2608.264001] .nr_running : 0 [ 2608.264002] .load : 0 [ 2608.264004] .nr_switches : 214789 [ 2608.264006] .nr_load_updates : 36843 [ 2608.264008] .nr_uninterruptible : -27 [ 2608.264010] .next_balance : 0.578090 [ 2608.264012] .curr->pid : 0 [ 2608.264014] .clock : 2608263.423639 [ 2608.264016] .cpu_load[0] : 0 [ 2608.264017] .cpu_load[1] : 0 [ 2608.264019] .cpu_load[2] : 0 [ 2608.264021] .cpu_load[3] : 0 [ 2608.264022] .cpu_load[4] : 0 [ 2608.264024] .yld_count : 0 [ 2608.264026] .sched_count : 215474 [ 2608.264028] .sched_goidle : 93186 [ 2608.264030] .avg_idle : 1000000 [ 2608.264031] .ttwu_count : 107180 [ 2608.264033] .ttwu_local : 27563 [ 2608.264036] [ 2608.264036] cfs_rq[1]:/autogroup-112 [ 2608.264038] .exec_clock : 647.556883 [ 2608.264041] .MIN_vruntime : 0.000001 [ 2608.264043] .min_vruntime : 592.622327 [ 2608.264044] .max_vruntime : 0.000001 [ 2608.264046] .spread : 0.000000 [ 2608.264048] .spread0 : -321155.606037 [ 2608.264050] .nr_spread_over : 23 [ 2608.264052] .nr_running : 0 [ 2608.264054] .load : 0 [ 2608.264056] .load_avg : 5119.999488 [ 2608.264058] .load_period : 5.000633 [ 2608.264060] .load_contrib : 1023 [ 2608.264061] .load_tg : 1023 [ 2608.264064] .se->exec_start : 2608263.421810 [ 2608.264066] .se->vruntime : 256551.215709 [ 2608.264068] .se->sum_exec_runtime : 647.957249 [ 2608.264070] .se->statistics.wait_start : 0.000000 [ 2608.264072] .se->statistics.sleep_start : 0.000000 [ 2608.264073] .se->statistics.block_start : 0.000000 [ 2608.264075] .se->statistics.sleep_max : 0.000000 [ 2608.264077] .se->statistics.block_max : 0.000000 [ 2608.264079] .se->statistics.exec_max : 3.993087 [ 2608.264081] .se->statistics.slice_max : 2.780313 [ 2608.264083] .se->statistics.wait_max : 5.671250 [ 2608.264085] .se->statistics.wait_sum : 46.258561 [ 2608.264087] .se->statistics.wait_count : 5633 [ 2608.264088] .se->load.weight : 2 [ 2608.264090] [ 2608.264090] cfs_rq[1]:/ [ 2608.264093] .exec_clock : 63983.286366 [ 2608.264095] .MIN_vruntime : 0.000001 [ 2608.264097] .min_vruntime : 256563.160954 [ 2608.264099] .max_vruntime : 0.000001 [ 2608.264101] .spread : 0.000000 [ 2608.264103] .sprea : -65185.067410 [ 2608.264105] .nr_spread_over : 2 [ 2608.264106] .nr_running : 0 [ 2608.264108] .load : 0 [ 2608.264110] .load_avg : 0000 [ 2608.264112] .load_period : 0.000000 [ 2608.264114] .load_contrib : 0 [ 2606] .load_tg : 0 [ 2608.264118] [ 2608.264118] rt_rq[1]:/ [ 2608.264120] .rt_nr_running : 0 [ 2608.264122] .rt_throttled : 0 [ 2608.264124] .rt_time : 0.009495 [ 2608.264126] .rt_runtime : 950.000000 [ 2608.264128] [ 2608.264128] runnable tasks: [ 2608.264128] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264128] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264152] [ 2608.264152] cpu#2, 2393.987 MHz [ 2608.264155] .nr_running : 0 [ 2608.264156] .load : 0 [ 2608.264158] .nr_switches : 526088 [ 2608.264160] .nr_load_updates : 67427 [ 2608.264162] .nr_uninterruptible : 526 [ 2608.264164] .next_balance : 0.578159 [ 2608.264166] .curr->pid : 0 [ 2608.264168] .clock : 2608263.470243 [ 2608.264170] .cpu_load[0] : 0 [ 2608.264172] .cpu_load[1] : 0 [ 2608.264173] .cpu_load[2] : 0 [ 2608.264175] .cpu_load[3] : 0 [ 2608.264177] .cpu_load[4] : 0 [ 2608.264179] .yld_count : 0 [ 2608.264181] .sched_count : 526827 [ 2608.264182] .sched_goidle : 246248 [ 2608.264184] .avg_idle : 858045 [ 2608.264186] .ttwu_count : 304398 [ 2608.264188] .ttwu_local : 56346 [ 2608.264190] [ 2608.264190] cfs_rq[2]:/autogroup-110 [ 2608.264193] .exec_clock : 72589.372152 [ 2608.264195] .MIN_vruntime : 0.000001 [ 2608.264197] .min_vruntime : 63187.646445 [ 2608.264199] .max_vruntime : 0.000001 [ 2608.264201] .spread : 0.000000 [ 2608.264203] .spread0 : -258560.581919 [ 2608.264205] .nr_spread_over : 62 [ 2608.264207] .nr_running : 0 [ 2608.264209] .load : 0 [ 2608.264211] .load_avg : 5202.876928 [ 2608.264213] .load_period : 5.144022 [ 2608.264215] .load_contrib : 1011 [ 2608.264217] .load_tg : 3057 [ 2608.264219] .se->exec_start : 2608263.468591 [ 2608.264221] .se->vruntime : 301747.020960 [ 2608.264223] .se->sum_exec_runtime : 72589.909994 [ 2608.264225] .se->statistics.wait_start : 0.000000 [ 2608.264227] .se->statistics.sleep_start : 0.000000 [ 2608.264229] .se->statistics.block_start : 0.000000 [ 2608.264231] .se->statistics.sleep_max : 0.000000 [ 2608.264233] .se->statistics.block_max : 0.000000 [ 2608.264235] .se->statistics.exec_max : 4.045107 [ 2608.264237] .se->statistics.slice_max : 15.698259 [ 2608.264239] .se->statistics.wait_max : 7.299438 [ 2608.264240] .se->statistics.wait_sum : 888.256004 [ 2608.264242] .se->statistics.wait_count : 169897 [ 2608.264244] .se->load.weight : 2 [ 2608.264246] [ 2608.264246] cfs_rq[2]:/ [ 2608.264248] .exec_clock : 97643.201970 [ 2608.264251] .MIN_vruntime : 0.000001 [ 2608.264253] .min_vruntime : 301747.020960 [ 2608.264255] .max_vruntime : 0.000001 [ 2608.264256] .spread : 0.000000 [ 2608.264258] .spread0 : -20001.207404 [ 2608.264260] .nr_spread_over : 22 [ 2608.264262] .nr_running : 0 [ 2608.264264] .load : 0 [ 2608.264266] .load_avg : 0.000000 [ 2608.264268] .load_period : 0.000000 [ 2608.264270] .load_contrib : 0 [ 2608.264272] .load_tg : 0 [ 2608.264274] [ 2608.264274] rt_rq[2]:/ [ 2608.264276] .rt_nr_running : 0 [ 2608.264278] .rt_throttled : 0 [ 2608.264280] .rt_time : 0.008239 [ 2608.264282] .rt_runtime : 950.000000 [ 2608.264284] [ 2608.264284] runnable tasks: [ 2608.264284] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264284] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264309] [ 2608.264309] cpu#3, 2393.987 MHz [ 2608.264311] .nr_running : 0 [ 2608.264313] .load : 0 [ 2608.264315] .nr_switches : 207558 [ 2608.264317] .nr_load_updates : 35794 [ 2608.264319] .nr_uninterruptible : 119 [ 2608.264321] .next_balance : 0.578159 [ 2608.264323] .curr->pid : 0 [ 2608.264325] .clock : 2608263.386057 [ 2608.264326] .cpu_load[0] : 161 [ 2608.264328] .cpu_load[1] : 123 [ 2608.264330] .cpu_load[2] : 72 [ 2608.264332] .cpu_load[3] : 39 [ 2608.264333] .cpu_load[4] : 21 [ 2608.264335] .yld_count : 0 [ 2608.264337] .sched_count : 208264 [ 2608.264339] .sched_goidle : 97724 [ 2608.264341] .avg_idle : 428800 [ 2608.264343] .ttwu_count : 101722 [ 2608.264344] .ttwu_local : 24170 [ 2608.264346] [ 2608.264346] cfs_rq[3]:/ [ 2608.264349] .exec_clock : 68500.811814 [ 2608.264351] .MIN_vruntime : 0.000001 [ 2608.264353] .min_vruntime : 262134.063444 [ 2608.264355] .max_vruntime : 0.000001 [ 2608.264357] .spread : 0.000000 [ 2608.264359] .spread0 : -59614.164920 [ 2608.264361] .nr_spread_over : 36 [ 2608.264363] .nr_running : 0 [ 2608.264365] .load : 0 [ 2608.264367] .load_avg : 0.000000 [ 2608.264369] .load_period : 0.000000 [ 2608.264371] .load_contrib : 0 [ 2608.264372] .load_tg : 0 [ 2608.264375] [ 2608.264375] rt_rq[3]:/ [ 2608.264377] .rt_nr_running : 0 [ 2608.264379] .rt_throttled : 0 [ 2608.264381] .rt_time : 0.008229 [ 2608.264383] .rt_runtime : 950.000000 [ 2608.264385] [ 2608.264385] runnable tasks: [ 2608.264385] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264385] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264409] [ 2608.264409] cpu#4, 2393.987 MHz [ 2608.264412] .nr_running : 0 [ 2608.264413] .load : 0 [ 2608.264415] .nr_switches : 600932 [ 2608.264417] .nr_load_updates : 66459 [ 2608.264419] .nr_uninterruptible : -1039 [ 2608.264421] .next_balance : 0.578222 [ 2608.264423] .curr->pid : 0 [ 2608.264425] .clock : 2608263.404346 [ 2608.264427] .cpu_load[0] : 1024 [ 2608.264429] .cpu_load[1] : 512 [ 2608.264431] .cpu_load[2] : 256 [ 2608.264432] .cpu_load[3] : 128 [ 2608.264434] .cpu_load[4] : 65 [ 2608.264436] .yld_count : 0 [ 2608.264438] .sched_count : 601654 [ 2608.264440] .sched_goidle : 281434 [ 2608.264442] .avg_idle : 915257 [ 2608.264443] .ttwu_count : 304776 [ 2608.264445] .ttwu_local : 90359 [ 2608.264448] [ 2608.264448] cfs_rq[4]:/autogroup-104 [ 2608.264450] .exec_clock : 16476.016606 [ 2608.264453] .MIN_vruntime : 0.000001 [ 2608.264455] .min_vruntime : 16474.907377 [ 2608.264457] .max_vruntime : 0.000001 [ 2608.264459] .spread : 0.000000 [ 2608.264461] .spread0 : -305273.320987 [ 2608.264462] .nr_spread_over : 0 [ 2608.264464] .nr_running : 0 [ 2608.264466] .load : 0 [ 2608.264468] .load_avg : 5216.389632 [ 2608.264470] .load_period : 5.416344 [ 2608.264472] .load_contrib : 963 [ 2608.264474] .load_tg : 963 [ 2608.264476] .se->exec_start : 2608263.403633 [ 2608.264478] .se->vruntime : 348290.287053 [ 2608.264480] .se->sum_exec_runtime : 16477.144938 [ 2608.264482] .se->statistics.wait_start : 0.000000 [ 2608.264484] .se->statistics.sleep_start : 0.000000 [ 2608.264486] .se->statistics.block_start : 0.000000 [ 2608.264488] .se->statistics.sleep_max : 0.000000 [ 2608.264490] .se->statistics.block_max : 0.000000 [ 2608.264492] .se->statistics.exec_max : 4.027447 [ 2608.264494] .se->statistics.slice_max : 7.748998 [ 2608.264496] .se->statistics.wait_max : 6.442444 [ 2608.264498] .se->statistics.wait_sum : 307.203145 [ 2608.264499] .se->statistics.wait_count : 28117 [ 2608.264501] .se->load.weight : 2 [ 2608.264503] [ 2608.264503] cfs_rq[4]:/ [ 2608.264506] .exec_clock : 119393.912866 [ 2608.264508] .MIN_vruntime : 0.000001 [ 2608.264510] .min_vruntime : 348290.885109 [ 2608.264512] .max_vruntime : 0.000001 [ 2608.264514] .spread : 0.000000 [ 2608.264516] .spread0 : 26542.656745 [ 2608.264517] .nr_spread_over : 14 [ 2608.264519] .nr_running : 0 [ 2608.264521] .load : 0 [ 2608.264523] .load_avg : 0.000000 [ 2608.264525] .load_period : 0.000000 [ 2608.264527] .load_contrib : 0 [ 2608.264528] .load_tg : 0 [ 2608.264531] [ 2608.264531] rt_rq[4]:/ [ 2608.264533] .rt_nr_running : 0 [ 2608.264535] .rt_throttled : 0 [ 2608.264537] .rt_time : 0.007481 [ 2608.264539] .rt_runtime : 950.000000 [ 2608.264541] [ 2608.264541] runnable tasks: [ 2608.264541] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264541] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264565] [ 2608.264565] cpu#5, 2393.987 MHz [ 2608.264567] .nr_running : 0 [ 2608.264569] .load : 0 [ 2608.264571] .nr_switches : 218378 [ 2608.264573] .nr_load_updates : 46139 [ 2608.264575] .nr_uninterruptible : -45 [ 2608.264577] .next_balance : 0.578214 [ 2608.264579] .curr->pid : 0 [ 2608.264581] .clock : 2608263.418515 [ 2608.264583] .cpu_load[0] : 247 [ 2608.264585] .cpu_load[1] : 124 [ 2608.264586] .cpu_load[2] : 62 [ 2608.264588] .cpu_load[3] : 37 [ 2608.264590] .cpu_load[4] : 22 [ 2608.264592] .yld_count : 0 [ 2608.264594] .sched_count : 219205 [ 2608.264595] .sched_goidle : 101071 [ 2608.264597] .avg_idle : 1000000 [ 2608.264599] .ttwu_count : 106975 [ 2608.264601] .ttwu_local : 29941 [ 2608.264603] [ 2608.264603] cfs_rq[5]:/autogroup-110 [ 2608.264606] .exec_clock : 60160.158706 [ 2608.264608] .MIN_vruntime : 0.000001 [ 2608.264610] .min_vruntime : 92130.844600 [ 2608.264612] .max_vruntime : 0.000001 [ 2608.264614] .spread : 0.000000 [ 2608.264616] .spread0 : -229617.383764 [ 2608.264618] .nr_spread_over : 39 [ 2608.264620] .nr_running : 0 [ 2608.264621] .load : 0 [ 2608.264624] .load_avg : 5143.457280 [ 2608.264626] .load_period : 5.024656 [ 2608.264627] .load_contrib : 1023 [ 2608.264629] .load_tg : 3057 [ 2608.264631] .se->exec_start : 2608263.416766 [ 2608.264633] .se->vruntime : 259260.212644 [ 2608.264635] .se->sum_exec_runtime : 60160.542873 [ 2608.264637] .se->statistics.wait_start : 0.000000 [ 2608.264639] .se->statistics.sleep_start : 0.000000 [ 2608.264641] .se->statistics.block_start : 0.000000 [ 2608.264643] .se->statistics.sleep_max : 0.000000 [ 2608.264645] .se->statistics.block_max : 0.000000 [ 2608.264647] .se->statistics.exec_max : 3.998351 [ 2608.264649] .se->statistics.slice_max : 2.828527 [ 2608.264651] .se->statistics.wait_max : 5.509938 [ 2608.264653] .se->statistics.wait_sum : 192.446673 [ 2608.264654] .se->statistics.wait_count : 77553 [ 2608.264656] .se->load.weight : 2 [ 2608.264658] [ 2608.264658] cfs_rq[5]:/ [ 2608.264661] .exec_clock : 69415.478400 [ 2608.264663] .MIN_vruntime : 0.000001 [ 2608.264665] .min_vruntime : 259260.212644 [ 2608.264667] .max_vruntime : 0.000001 [ 2608.264668] .spread : 0.000000 [ 2608.264671] .spread0 : -62488.015720 [ 2608.264672] .nr_spread_over : 22 [ 2608.264674] .nr_running : 0 [ 2608.264676] .load : 0 [ 2608.264678] .load_avg : 0.000000 [ 2608.264680] .load_period : 0.000000 [ 2608.264682] .load_contrib : 0 [ 2608.264683] .load_tg : 0 [ 2608.264685] [ 2608.264685] rt_rq[5]:/ [ 2608.264688] .rt_nr_running : 0 [ 2608.264690] .rt_throttled : 0 [ 2608.264692] .rt_time : 0.006657 [ 2608.264694] .rt_runtime : 950.000000 [ 2608.264695] [ 2608.264695] runnable tasks: [ 2608.264695] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264695] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264720] [ 2608.264720] cpu#6, 2393.987 MHz [ 2608.264722] .nr_running : 0 [ 2608.264724] .load : 0 [ 2608.264726] .nr_switches : 464532 [ 2608.264728] .nr_load_updates : 50465 [ 2608.264730] .nr_uninterruptible : 268 [ 2608.264732] .next_balance : 0.578222 [ 2608.264734] .curr->pid : 0 [ 2608.264736] .clock : 2608263.464150 [ 2608.264738] .cpu_load[0] : 325 [ 2608.264740] .cpu_load[1] : 163 [ 2608.264742] .cpu_load[2] : 82 [ 2608.264743] .cpu_load[3] : 41 [ 2608.264745] .cpu_load[4] : 21 [ 2608.264747] .yld_count : 0 [ 2608.264749] .sched_count : 465255 [ 2608.264751] .sched_goidle : 216200 [ 2608.264753] .avg_idle : 1000000 [ 2608.264755] .ttwu_count : 235485 [ 2608.264756] .ttwu_local : 36257 [ 2608.264759] [ 2608.264759] cfs_rq[6]:/autogroup-110 [ 2608.264762] .exec_clock : 77690.529700 [ 2608.264764] .MIN_vruntime : 0.000001 [ 2608.264766] .min_vruntime : 60773.420553 [ 2608.264768] .max_vruntime : 0.000001 [ 2608.264770] .spread : 0.000000 [ 2608.264772] .spread0 : -260974.807811 [ 2608.264773] .nr_spread_over : 33 [ 2608.264775] .nr_running : 0 [ 2608.264777] .load : 0 [ 2608.264779] .load_avg : 5166.217728 [ 2608.264781] .load_period : 5.046505 [ 2608.264783] .load_contrib : 1023 [ 2608.264785] .load_tg : 3057 [ 2608.264787] .se->exec_start : 2608263.462779 [ 2608.264789] .se->vruntime : 307221.663412 [ 2608.264791] .se->sum_exec_runtime : 77691.119637 [ 2608.264793] .se->statistics.wait_start : 0.000000 [ 2608.264795] .se->statistics.sleep_start : 0.000000 [ 2608.264797] .se->statistics.block_start : 0.000000 [ 2608.264799] .se->statistics.sleep_max : 0.000000 [ 2608.264801] .se->statistics.block_max : 0.000000 [ 2608.264803] .se->statistics.exec_max : 3.999863 [ 2608.264805] .se->statistics.slice_max : 5.458054 [ 2608.264807] .se->statistics.wait_max : 6.129760 [ 2608.264809] .se->statistics.wait_sum : 732.381895 [ 2608.264810] .se->statistics.wait_count : 182086 [ 2608.264812] .se->load.weight : 2 [ 2608.264814] [ 2608.264814] cfs_rq[6]:/ [ 2608.264817] .exec_clock : 94977.998290 [ 2608.264819] .MIN_vruntime : 0.000001 [ 2608.264821] .min_vruntime : 307221.663412 [ 2608.264823] .max_vruntime : 0.000001 [ 2608.264825] .spread : 0.000000 [ 2608.264827] .spread0 : -14526.564952 [ 2608.264828] .nr_spread_over : 8 [ 2608.264830] .nr_running : 0 [ 2608.264832] .load : 0 [ 2608.264834] .load_avg : 0.000000 [ 2608.264836] .load_period : 0.000000 [ 2608.264838] .load_contrib : 0 [ 2608.264839] .load_tg : 0 [ 2608.264842] [ 2608.264842] rt_rq[6]:/ [ 2608.264844] .rt_nr_running : 0 [ 2608.264846] .rt_throttled : 0 [ 2608.264848] .rt_time : 0.007623 [ 2608.264850] .rt_runtime : 950.000000 [ 2608.264852] [ 2608.264852] runnable tasks: [ 2608.264852] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.264852] ---------------------------------------------------------------------------- ------------------------------ [ 2608.264876] [ 2608.264876] cpu#7, 2393.987 MHz [ 2608.264879] .nr_running : 2 [ 2608.264880] .load : 2048 [ 2608.264882] .nr_switches : 198271 [ 2608.264884] .nr_load_updates : 33533 [ 2608.264886] .nr_uninterruptible : -10 [ 2608.264888] .next_balance : 0.578222 [ 2608.264890] .curr->pid : 3683 [ 2608.264892] .clock : 2608263.379750 [ 2608.264894] .cpu_load[0] : 2048 [ 2608.264896] .cpu_load[1] : 1024 [ 2608.264897] .cpu_load[2] : 512 [ 2608.264899] .cpu_load[3] : 256 [ 2608.264901] .cpu_load[4] : 128 [ 2608.264903] .yld_count : 0 [ 2608.264904] .sched_count : 198975 [ 2608.264906] .sched_goidle : 93384 [ 2608.264908] .avg_idle : 1000000 [ 2608.264910] .ttwu_count : 93590 [ 2608.264912] .ttwu_local : 18562 [ 2608.264914] [ 2608.264914] cfs_rq[7]:/autogroup-123 [ 2608.264917] .exec_clock : 19.540854 [ 2608.264919] .MIN_vruntime : 0.000001 [ 2608.264921] .min_vruntime : 125.735193 [ 2608.264923] .max_vruntime : 0.000001 [ 2608.264925] .spread : 0.000000 [ 2608.264927] .spread0 : -321622.493171 [ 2608.264929] .nr_spread_over : 3 [ 2608.264931] .nr_running : 1 [ 2608.264932] .load : 1024 [ 2608.264935] .load_avg : 10239.998976 [ 2608.264937] .load_period : 9.999999 [ 2608.264938] .load_contrib : 1023 [ 2608.264940] .load_tg : 1023 [ 2608.264942] .se->exec_start : 2608263.375581 [ 2608.264944] .se->vruntime : 256061.945656 [ 2608.264946] .se->sum_exec_runtime : 19.547549 [ 2608.264948] .se->statistics.wait_start : 0.000000 [ 2608.264950] .se->statistics.sleep_start : 0.000000 [ 2608.264952] .se->statistics.block_start : 0.000000 [ 2608.264954] .se->statistics.sleep_max : 0.000000 [ 2608.264956] .se->statistics.block_max : 0.000000 [ 2608.264958] .se->statistics.exec_max : 3.992509 [ 2608.264960] .se->statistics.slice_max : 0.000000 [ 2608.264962] .se->statistics.wait_max : 2.457817 [ 2608.264964] .se->statistics.wait_sum : 2.486344 [ 2608.264965] .se->statistics.wait_count : 53 [ 2608.264967] .se->load.weight : 1024 [ 2608.264969] [ 2608.264969] cfs_rq[7]:/ [ 2608.264972] .exec_clock : 67944.365394 [ 2608.264974] .MIN_vruntime : 256061.830897 [ 2608.264976] .min_vruntime : 256073.830897 [ 2608.264978] .max_vruntime : 256061.830897 [ 2608.264980] .spread : 0.000000 [ 2608.264982] .spread0 : -65674.397467 [ 2608.264984] .nr_spread_over : 5 [ 2608.264986] .nr_running : 2 [ 2608.264987] .load : 2048 [ 2608.264989] .load_avg : 0.000000 [ 2608.264991] .load_period : 0.000000 [ 2608.264993] .load_contrib : 0 [ 2608.264995] .load_tg : 0 [ 2608.264997] [ 2608.264997] rt_rq[7]:/ [ 2608.265000] .rt_nr_running : 0 [ 2608.265001] .rt_throttled : 0 [ 2608.265003] .rt_time : 0.008355 [ 2608.265005] .rt_runtime : 950.000000 [ 2608.265007] [ 2608.265007] runnable tasks: [ 2608.265007] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 2608.265007] ---------------------------------------------------------------------------- ------------------------------ [ 2608.265012] kworker/7:0 33 256061.830897 1000 120 256061.830897 10.879965 2607877.265030 / [ 2608.265038] R bash 3683 125.735193 38 120 125.735193 52.301162 2497.168008 /autogroup-123 [ 2608.265046] [ 2620.490112] SysRq : Show backtrace of all active CPUs [ 2620.490121] sending NMI to all CPUs: [ 2620.490128] NMI backtrace for cpu 7 [ 2620.490129] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490199] [ 2620.490203] Pid: 3683, comm: bash Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490208] EIP: 0060:[] EFLAGS: 00200807 CPU: 7 [ 2620.490215] EIP is at delay_tsc+0x0/0x60 [ 2620.490218] EAX: 00243cc2 EBX: 00002710 ECX: fffff000 EDX: 00243cc1 [ 2620.490220] ESI: 00200286 EDI: 0000000f EBP: ea767ef4 ESP: ea767ef0 [ 2620.490222] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.490225] CR0: 80050033 CR2: a30df000 CR3: 2ab47000 CR4: 000007f0 [ 2620.490227] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.490229] DR6: ffff0ff0 DR7: 00000400 [ 2620.490232] Process bash (pid: 3683, ti=ea766000 task=eff28000 task.ti=ea766000) [ 2620.490234] Stack: [ 2620.490235] c12d25fb ea767f04 c102e4b2 c175f8ba 0000006c ea767f0c c138001d ea767f2c [ 2620.490244] c13803d9 c175eadd c17c67c4 c187d23c 00000002 eabc3a80 c1380430 ea767f3c [ 2620.490251] c1380470 08b3ec08 f0b70980 ea767f64 c119d664 ea767f9c c116806f f0b709d0 [ 2620.490259] Call Trace: [ 2620.490265] [] ? __const_udelay+0x1b/0x20 [ 2620.490272] [] arch_trigger_all_cpu_backtrace+0x62/0x80 [ 2620.490278] [] sysrq_handle_showallcpus+0xd/0x10 [ 2620.490282] [] __handle_sysrq+0xe9/0x140 [ 2620.490285] [] ? __handle_sysrq+0x140/0x140 [ 2620.490289] [] write_sysrq_trigger+0x40/0x50 [ 2620.490295] [] proc_reg_write+0x64/0xa0 [ 2620.490301] [] ? alloc_fd+0x9f/0xe0 [ 2620.490305] [] ? proc_reg_poll+0xa0/0xa0 [ 2620.490311] [] vfs_write+0x8c/0x160 [ 2620.490315] [] ? proc_reg_poll+0xa0/0xa0 [ 2620.490319] [] sys_write+0x3d/0x70 [ 2620.490325] [] sysenter_do_call+0x12/0x28 [ 2620.490326] Code: 66 66 90 64 8b 15 1c bd 96 c1 6b d2 3e 8d 04 80 c1 e0 02 f7 e2 8d 42 01 ff 15 80 5b 87 c1 5d c3 8d 74 26 00 8d bc 27 00 00 00 00 <55> 89 e5 57 56 53 83 ec 04 66 66 66 66 90 64 8b 1d 28 70 96 c1 [ 2620.490375] NMI backtrace for cpu 4 [ 2620.490378] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490425] [ 2620.490427] Pid: 2212, comm: compiz Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490431] EIP: 0073:[] EFLAGS: 00000202 CPU: 4 [ 2620.490434] EIP is at 0xb71296f1 [ 2620.490435] EAX: 00000001 EBX: b71df000 ECX: 0c397e80 EDX: 00000001 [ 2620.490437] ESI: 0c45b808 EDI: bfd4a850 EBP: bfd4a84c ESP: bfd4a800 [ 2620.490438] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 2620.490440] Process compiz (pid: 2212, ti=ef6a0000 task=f6717230 task.ti=ef6a0000) [ 2620.490441] [ 2620.490443] NMI backtrace for cpu 2 [ 2620.490445] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490483] [ 2620.490485] Pid: 0, comm: swapper/2 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490489] EIP: 0060:[] EFLAGS: 00000046 CPU: 2 [ 2620.490493] EIP is at intel_idle+0x91/0x120 [ 2620.490494] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 2620.490496] ESI: 00000008 EDI: f7ba225c EBP: f7543f44 ESP: f7543f20 [ 2620.490497] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.490498] CR0: 8005003b CR2: 9cf8a000 CR3: 01976000 CR4: 000007f0 [ 2620.490500] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.490501] DR6: ffff0ff0 DR7: 00000400 [ 2620.490503] Process swapper/2 (pid: 0, ti=f7542000 task=f746e580 task.ti=f7542000) [ 2620.490504] Stack: [ 2620.490505] 00000003 cf3e066f 12d18abe 00000020 c1878260 00000002 c1878260 000000e4 [ 2620.490511] f7ba225c f7543f54 c149bc15 c18abd2c 00000000 f7543f7c c149c178 01400000 [ 2620.490515] 00000082 00000002 c1878260 00000003 c18abd2c 00000000 00000000 f7543f90 [ 2620.490520] Call Trace: [ 2620.490527] [] cpuidle_enter+0x15/0x20 [ 2620.490529] [] cpuidle_idle_call+0x88/0x220 [ 2620.490533] [] cpu_idle+0xaa/0xe0 [ 2620.490538] [] start_secondary+0x1d5/0x1db [ 2620.490539] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 2620.490570] NMI backtrace for cpu 0 [ 2620.490572] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490639] [ 2620.490641] Pid: 2886, comm: firefox Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490645] EIP: 0073:[] EFLAGS: 00000206 CPU: 0 [ 2620.490647] EIP is at 0xb4e4d761 [ 2620.490648] EAX: ade232c0 EBX: b4e7a000 ECX: 00000001 EDX: b4e7a1f4 [ 2620.490650] ESI: ae0d5800 EDI: 00000002 EBP: 7fffffff ESP: bfd42408 [ 2620.490651] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 2620.490653] Process firefox (pid: 2886, ti=ed30c000 task=eae48000 task.ti=ed30c000) [ 2620.490654] [ 2620.490656] NMI backtrace for cpu 6 [ 2620.490658] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490696] [ 2620.490698] Pid: 0, comm: swapper/6 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490701] EIP: 0060:[] EFLAGS: 00000046 CPU: 6 [ 2620.490704] EIP is at intel_idle+0x91/0x120 [ 2620.490706] EAX: 00000010 EBX: 00000002 ECX: 00000001 EDX: 00000000 [ 2620.490707] ESI: 00000004 EDI: f7bda25c EBP: f7553f44 ESP: f7553f20 [ 2620.490708] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.490710] CR0: 8005003b CR2: 9cf8a000 CR3: 01976000 CR4: 000007f0 [ 2620.490711] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.490712] DR6: ffff0ff0 DR7: 00000400 [ 2620.490714] Process swapper/6 (pid: 0, ti=f7552000 task=f7549960 task.ti=f7552000) [ 2620.490715] Stack: [ 2620.490716] 00000002 cf3dfc27 12d18abe 00000010 c1878260 00000006 c1878260 00000098 [ 2620.490745] f7bda25c f7553f54 c149bc15 c18abd2c 00000000 f7553f7c c149c178 01400000 [ 2620.490756] 00000082 00000006 c1878260 00000002 c18abd2c 00000000 00000000 f7553f90 [ 2620.490761] Call Trace: [ 2620.490765] [] cpuidle_enter+0x15/0x20 [ 2620.490767] [] cpuidle_idle_call+0x88/0x220 [ 2620.490770] [] cpu_idle+0xaa/0xe0 [ 2620.490773] [] start_secondary+0x1d5/0x1db [ 2620.490774] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 2620.490806] NMI backtrace for cpu 5 [ 2620.490809] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.490875] [ 2620.490885] Pid: 0, comm: swapper/5 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.490914] EIP: 0060:[] EFLAGS: 00000046 CPU: 5 [ 2620.490922] EIP is at intel_idle+0x91/0x120 [ 2620.490925] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 2620.490927] ESI: 00000008 EDI: f7bcc25c EBP: f7551f44 ESP: f7551f20 [ 2620.490929] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.490932] CR0: 8005003b CR2: 0f205000 CR3: 01976000 CR4: 000007f0 [ 2620.490934] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.490936] DR6: ffff0ff0 DR7: 00000400 [ 2620.490939] Process swapper/5 (pid: 0, ti=f7550000 task=f7548cb0 task.ti=f7550000) [ 2620.490940] Stack: [ 2620.490942] 00000003 cc65b975 12d18abe 00000020 c1878260 00000005 c1878260 000000e4 [ 2620.490950] f7bcc25c f7551f54 c149bc15 c18abd2c 00000000 f7551f7c c149c178 01400000 [ 2620.490958] 00000082 00000005 c1878260 00000003 c18abd2c 00000000 00000000 f7551f90 [ 2620.490965] Call Trace: [ 2620.490972] [] cpuidle_enter+0x15/0x20 [ 2620.490976] [] cpuidle_idle_call+0x88/0x220 [ 2620.490981] [] cpu_idle+0xaa/0xe0 [ 2620.490986] [] start_secondary+0x1d5/0x1db [ 2620.490988] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 2620.491062] NMI backtrace for cpu 1 [ 2620.491066] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.491128] [ 2620.491132] Pid: 0, comm: swapper/1 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.491137] EIP: 0060:[] EFLAGS: 00000046 CPU: 1 [ 2620.491140] EIP is at intel_idle+0x91/0x120 [ 2620.491143] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 2620.491145] ESI: 00000008 EDI: f7b9425c EBP: f7541f44 ESP: f7541f20 [ 2620.491147] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.491149] CR0: 8005003b CR2: ac342000 CR3: 01976000 CR4: 000007f0 [ 2620.491152] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.491154] DR6: ffff0ff0 DR7: 00000400 [ 2620.491156] Process swapper/1 (pid: 0, ti=f7540000 task=f746d8d0 task.ti=f7540000) [ 2620.491158] Stack: [ 2620.491159] 00000003 cc659c6b 12d18abe 00000020 c1878260 00000001 c1878260 000000e4 [ 2620.491167] f7b9425c f7541f54 c149bc15 c18abd2c 00000000 f7541f7c c149c178 01400000 [ 2620.491175] 00000082 00000001 c1878260 00000003 c18abd2c 00000000 00000000 f7541f90 [ 2620.491183] Call Trace: [ 2620.491188] [] cpuidle_enter+0x15/0x20 [ 2620.491192] [] cpuidle_idle_call+0x88/0x220 [ 2620.491196] [] cpu_idle+0xaa/0xe0 [ 2620.491201] [] start_secondary+0x1d5/0x1db [ 2620.491203] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 2620.491251] NMI backtrace for cpu 3 [ 2620.491254] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 2620.491312] [ 2620.491316] Pid: 0, comm: swapper/3 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 2620.491321] EIP: 0060:[] EFLAGS: 00000046 CPU: 3 [ 2620.491324] EIP is at intel_idle+0x91/0x120 [ 2620.491327] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 2620.491329] ESI: 00000008 EDI: f7bb025c EBP: f7545f44 ESP: f7545f20 [ 2620.491331] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 2620.491334] CR0: 8005003b CR2: 0f1ac000 CR3: 01976000 CR4: 000007f0 [ 2620.491336] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 2620.491338] DR6: ffff0ff0 DR7: 00000400 [ 2620.491341] Process swapper/3 (pid: 0, ti=f7544000 task=f746f230 task.ti=f7544000) [ 2620.491342] Stack: [ 2620.491343] 00000003 cc65c546 12d18abe 00000020 c1878260 00000003 c1878260 000000e4 [ 2620.491351] f7bb025c f7545f54 c149bc15 c18abd2c 00000000 f7545f7c c149c178 01400000 [ 2620.491359] 00000082 00000003 c1878260 00000003 c18abd2c 00000000 00000000 f7545f90 [ 2620.491367] Call Trace: [ 2620.491372] [] cpuidle_enter+0x15/0x20 [ 2620.491376] [] cpuidle_idle_call+0x88/0x220 [ 2620.491380] [] cpu_idle+0xaa/0xe0 [ 2620.491384] [] start_secondary+0x1d5/0x1db [ 2620.491386] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 3439.182898] SysRq : Show Blocked State [ 3439.182904] task PC stack pid father [ 3439.182920] jbd2/sdb2-8 D c12a8bd4 0 307 2 0x00000000 [ 3439.182924] f6771e1c 00000046 f6d18cb8 c12a8bd4 f6d18c28 f7548000 be6346ba 00000320 [ 3439.182929] c196be00 c196be00 f6771de4 c12abdf1 f7bbae00 f673cc20 f0434400 f0434400 [ 3439.182934] ec48c828 f0434400 f673cc20 00000001 f6771dfc c12aa6d3 00000000 00000000 [ 3439.182939] Call Trace: [ 3439.182948] [] ? drive_stat_acct+0xd4/0x150 [ 3439.182951] [] ? blk_queue_bio+0x201/0x350 [ 3439.182954] [] ? generic_make_request+0x93/0xd0 [ 3439.182959] [] ? ktime_get_ts+0xd1/0x100 [ 3439.182963] [] schedule+0x23/0x60 [ 3439.182966] [] io_schedule+0x78/0xb0 [ 3439.182970] [] sleep_on_buffer+0xd/0x20 [ 3439.182972] [] __wait_on_bit+0x51/0x70 [ 3439.182974] [] ? do_thaw_one+0x70/0x70 [ 3439.182976] [] ? do_thaw_one+0x70/0x70 [ 3439.182979] [] out_of_line_wait_on_bit+0x61/0x70 [ 3439.182983] [] ? autoremove_wake_function+0x50/0x50 [ 3439.182985] [] __wait_on_buffer+0x2e/0x30 [ 3439.182989] [] jbd2_journal_commit_transaction+0x13e3/0x1590 [ 3439.182994] [] kjournald2+0x99/0x200 [ 3439.182997] [] ? finish_wait+0x70/0x70 [ 3439.182999] [] ? jbd2_journal_release_jbd_inode+0xe0/0xe0 [ 3439.183002] [] kthread+0x72/0x80 [ 3439.183005] [] ? kthread_freezable_should_stop+0x60/0x60 [ 3439.183009] [] kernel_thread_helper+0x6/0x10 [ 3439.183076] gnome-terminal D f7bbae00 0 2741 1 0x00000000 [ 3439.183078] ed335ad4 00200086 00989680 f7bbae00 00000320 f7548000 bf44ef51 00000320 [ 3439.183083] c196be00 c196be00 00000004 f7bbae00 f7bbae00 f6ddcc20 00000000 00000000 [ 3439.183088] 00000020 f7548000 f6ddcc20 ed335ac0 c101002c ed335ac8 c107d52a 00000004 [ 3439.183093] Call Trace: [ 3439.183098] [] ? __switch_to+0xbc/0x260 [ 3439.183101] [] ? idle_balance+0x10a/0x150 [ 3439.183105] [] ? finish_task_switch+0x41/0xc0 [ 3439.183108] [] schedule+0x23/0x60 [ 3439.183110] [] schedule_timeout+0x215/0x280 [ 3439.183114] [] ? default_spin_lock_flags+0x8/0x10 [ 3439.183117] [] ? _raw_spin_lock_irqsave+0x2d/0x40 [ 3439.183120] [] ? try_to_wake_up+0x18e/0x230 [ 3439.183123] [] ? timerqueue_del+0x27/0x70 [ 3439.183126] [] wait_for_common+0xa1/0x120 [ 3439.183128] [] ? try_to_wake_up+0x230/0x230 [ 3439.183131] [] ? poll_schedule_timeout+0x60/0x60 [ 3439.183134] [] wait_for_completion+0x17/0x20 [ 3439.183136] [] flush_work+0x28/0x30 [ 3439.183138] [] ? wake_up_worker+0x30/0x30 [ 3439.183142] [] ? regulator_is_supported_voltage+0x21/0x70 [ 3439.183144] [] tty_flush_to_ldisc+0x12/0x20 [ 3439.183148] [] n_tty_poll+0x5f/0x180 [ 3439.183151] [] ? n_tty_set_room+0x70/0x70 [ 3439.183153] [] tty_poll+0x6b/0x90 [ 3439.183155] [] ? n_tty_set_room+0x70/0x70 [ 3439.183157] [] do_sys_poll+0x1f4/0x430 [ 3439.183162] [] ? __slab_free+0xdf/0x22f [ 3439.183165] [] ? select_task_rq_fair+0x526/0x780 [ 3439.183169] [] ? kfree+0xcc/0xf0 [ 3439.183172] [] ? sched_clock+0x8/0x10 [ 3439.183175] [] ? sched_clock_cpu+0xe5/0x160 [ 3439.183178] [] ? unix_stream_recvmsg+0x5d0/0x680 [ 3439.183180] [] ? try_to_wake_up+0x18e/0x230 [ 3439.183182] [] ? poll_schedule_timeout+0x60/0x60 [ 3439.183185] [] ? __pollwait+0xd0/0xd0 [ 3439.183187] [] ? __pollwait+0xd0/0xd0 [ 3439.183189] [] ? __pollwait+0xd0/0xd0 [ 3439.183191] [] ? __pollwait+0xd0/0xd0 [ 3439.183193] [] ? __pollwait+0xd0/0xd0 [ 3439.183195] [] ? __pollwait+0xd0/0xd0 [ 3439.183197] [] ? __pollwait+0xd0/0xd0 [ 3439.183199] [] ? __pollwait+0xd0/0xd0 [ 3439.183201] [] ? __pollwait+0xd0/0xd0 [ 3439.183203] [] ? __pollwait+0xd0/0xd0 [ 3439.183208] [] ? security_file_permission+0x24/0xb0 [ 3439.183213] [] ? do_readv_writev+0x146/0x190 [ 3439.183215] [] ? ktime_get_ts+0xd1/0x100 [ 3439.183218] [] ? poll_select_set_timeout+0x64/0x80 [ 3439.183220] [] sys_poll+0x5a/0xd0 [ 3439.183222] [] sysenter_do_call+0x12/0x28 [ 3439.183231] thunderbird D 3624f000 0 3783 1 0x00000000 [ 3439.183233] eb75bee0 00200082 c1075e1e 3624f000 36241000 f746f230 be5e6e5f 00000320 [ 3439.183238] c196be00 c196be00 00000000 eb75be8c f7bace00 eb960000 c10655a0 00000000 [ 3439.183243] f6771f98 f6d1bc64 eb75bec4 c106d6c5 00000000 eb75beb4 eb75beb8 c1037af8 [ 3439.183248] Call Trace: [ 3439.183250] [] ? try_to_wake_up+0x18e/0x230 [ 3439.183253] [] ? autoremove_wake_function+0x20/0x50 [ 3439.183257] [] ? __wake_up_common+0x45/0x70 [ 3439.183260] [] ? default_spin_lock_flags+0x8/0x10 [ 3439.183262] [] ? _raw_spin_lock_irqsave+0x2d/0x40 [ 3439.183265] [] ? prepare_to_wait+0x4c/0x80 [ 3439.183267] [] schedule+0x23/0x60 [ 3439.183270] [] jbd2_log_wait_commit+0x95/0x100 [ 3439.183272] [] ? finish_wait+0x70/0x70 [ 3439.183276] [] ext4_sync_file+0x1b9/0x350 [ 3439.183279] [] ? getnstimeofday+0x56/0x140 [ 3439.183282] [] ? ext4_flush_completed_IO+0xa0/0xa0 [ 3439.183284] [] vfs_fsync+0x33/0x50 [ 3439.183286] [] do_fsync+0x28/0x50 [ 3439.183288] [] sys_fsync+0x12/0x20 [ 3439.183291] [] sysenter_do_call+0x12/0x28 [ 3439.183293] [] ? bad_area+0x2d/0x3e [ 3439.183301] Sched Debug Version: v0.10, 3.5.0-19-generic #30-Ubuntu [ 3439.183303] ktime : 3444984.552672 [ 3439.183305] sched_clk : 3439183.300524 [ 3439.183306] cpu_clk : 3439183.300553 [ 3439.183307] jiffies : 786246 [ 3439.183308] sched_clock_stable : 1 [ 3439.183309] [ 3439.183310] sysctl_sched [ 3439.183312] .sysctl_sched_latency : 24.000000 [ 3439.183313] .sysctl_sched_min_granularity : 3.000000 [ 3439.183314] .sysctl_sched_wakeup_granularity : 4.000000 [ 3439.183315] .sysctl_sched_child_runs_first : 0 [ 3439.183317] .sysctl_sched_features : 24119 [ 3439.183318] .sysctl_sched_tunable_scaling : 1 (logaritmic) [ 3439.183320] [ 3439.183320] cpu#0, 2393.987 MHz [ 3439.183321] .nr_running : 0 [ 3439.183323] .load : 0 [ 3439.183324] .nr_switches : 1037684 [ 3439.183325] .nr_load_updates : 146582 [ 3439.183326] .nr_uninterruptible : 259 [ 3439.183327] .next_balance : 0.786247 [ 3439.183329] .curr->pid : 0 [ 3439.183330] .clock : 3439182.776041 [ 3439.183331] .cpu_load[0] : 0 [ 3439.183332] .cpu_load[1] : 0 [ 3439.183333] .cpu_load[2] : 0 [ 3439.183334] .cpu_load[3] : 0 [ 3439.183336] .cpu_load[4] : 4 [ 3439.183337] .yld_count : 0 [ 3439.183338] .sched_count : 1039441 [ 3439.183339] .sched_goidle : 470894 [ 3439.183340] .avg_idle : 402113 [ 3439.183341] .ttwu_count : 467191 [ 3439.183343] .ttwu_local : 75868 [ 3439.183345] [ 3439.183345] cfs_rq[0]:/ [ 3439.183346] .exec_clock : 212243.930018 [ 3439.183348] .MIN_vruntime : 0.000001 [ 3439.183349] .min_vruntime : 768153.770722 [ 3439.183351] .max_vruntime : 0.000001 [ 3439.183352] .spread : 0.000000 [ 3439.183353] .spread0 : 0.000000 [ 3439.183354] .nr_spread_over : 7 [ 3439.183355] .nr_running : 0 [ 3439.183356] .load : 0 [ 3439.183358] .load_avg : 0.000000 [ 3439.183359] .load_period : 0.000000 [ 3439.183360] .load_contrib : 0 [ 3439.183361] .load_tg : 0 [ 3439.183364] [ 3439.183364] rt_rq[0]:/ [ 3439.183365] .rt_nr_running : 0 [ 3439.183367] .rt_throttled : 0 [ 3439.183368] .rt_time : 0.011003 [ 3439.183369] .rt_runtime : 950.000000 [ 3439.183371] [ 3439.183371] runnable tasks: [ 3439.183371] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183371] ---------------------------------------------------------------------------- ------------------------------ [ 3439.183390] [ 3439.183390] cpu#1, 2393.987 MHz [ 3439.183391] .nr_running : 0 [ 3439.183393] .load : 0 [ 3439.183394] .nr_switches : 444458 [ 3439.183395] .nr_load_updates : 74280 [ 3439.183396] .nr_uninterruptible : -17 [ 3439.183398] .next_balance : 0.786247 [ 3439.183399] .curr->pid : 0 [ 3439.183400] .clock : 3439182.917859 [ 3439.183401] .cpu_load[0] : 0 [ 3439.183402] .cpu_load[1] : 0 [ 3439.183403] .cpu_load[2] : 0 [ 3439.183404] .cpu_load[3] : 0 [ 3439.183406] .cpu_load[4] : 12 [ 3439.183407] .yld_count : 0 [ 3439.183408] .sched_count : 445373 [ 3439.183409] .sched_goidle : 192374 [ 3439.183410] .avg_idle : 907934 [ 3439.183411] .ttwu_count : 219308 [ 3439.183412] .ttwu_local : 48531 [ 3439.183414] [ 3439.183414] cfs_rq[1]:/autogroup-104 [ 3439.183416] .exec_clock : 4776.058690 [ 3439.183417] .MIN_vruntime : 0.000001 [ 3439.183418] .min_vruntime : 4775.010114 [ 3439.183420] .max_vruntime : 0.000001 [ 3439.183421] .spread : 0.000000 [ 3439.183422] .spread0 : -763378.760608 [ 3439.183423] .nr_spread_over : 0 [ 3439.183425] .nr_running : 0 [ 3439.183426] .load : 0 [ 3439.183427] .load_avg : 2212.895872 [ 3439.183428] .load_period : 6.880651 [ 3439.183429] .load_contrib : 321 [ 3439.183431] .load_tg : 321 [ 3439.183432] .se->exec_start : 3439182.916728 [ 3439.183433] .se->vruntime : 616160.121956 [ 3439.183435] .se->sum_exec_runtime : 4776.205736 [ 3439.183436] .se->statistics.wait_start : 0.000000 [ 3439.183437] .se->statistics.sleep_start : 0.000000 [ 3439.183438] .se->statistics.block_start : 0.000000 [ 3439.183440] .se->statistics.sleep_max : 0.000000 [ 3439.183441] .se->statistics.block_max : 0.000000 [ 3439.183442] .se->statistics.exec_max : 3.999553 [ 3439.183443] .se->statistics.slice_max : 10.259349 [ 3439.183445] .se->statistics.wait_max : 7.437392 [ 3439.183446] .se->statistics.wait_sum : 95.249226 [ 3439.183447] .se->statistics.wait_count : 8731 [ 3439.183448] .se->load.weight : 2 [ 3439.183450] [ 3439.183450] cfs_rq[1]:/autogroup-110 [ 3439.183451] .exec_clock : 138123.645424 [ 3439.183453] .MIN_vruntime : 0.000001 [ 3439.183454] .min_vruntime : 126775.750486 [ 3439.183455] .max_vruntime : 0.000001 [ 3439.183457] .spread : 0.000000 [ 3439.183458] .spread0 : -641378.020236 [ 3439.183459] .nr_spread_over : 38 [ 3439.183460] .nr_running : 0 [ 3439.183461] .load : 0 [ 3439.183462] .load_avg : 1283.787392 [ 3439.183464] .load_period : 6.506041 [ 3439.183465] .load_contrib : 197 [ 3439.183466] .load_tg : 2883 [ 3439.183468] .se->exec_start : 3439164.736308 [ 3439.183469] .se->vruntime : 616170.021821 [ 3439.183470] .se->sum_exec_runtime : 138124.445399 [ 3439.183471] .se->statistics.wait_start : 0.000000 [ 3439.183473] .se->statistics.sleep_start : 0.000000 [ 3439.183474] .se->statistics.block_start : 0.000000 [ 3439.183475] .se->statistics.sleep_max : 0.000000 [ 3439.183476] .se->statistics.block_max : 0.000000 [ 3439.183477] .se->statistics.exec_max : 4.116131 [ 3439.183479] .se->statistics.slice_max : 4.878453 [ 3439.183480] .se->statistics.wait_max : 7.703969 [ 3439.183481] .se->statistics.wait_sum : 580.577028 [ 3439.183482] .se->statistics.wait_count : 193786 [ 3439.183483] .se->load.weight : 2 [ 3439.183484] [ 3439.183484] cfs_rq[1]:/ [ 3439.183486] .exec_clock : 145258.756085 [ 3439.183487] .MIN_vruntime : 0.000001 [ 3439.183489] .min_vruntime : 616170.021821 [ 3439.183490] .max_vruntime : 0.000001 [ 3439.183491] .spread : 0.000000 [ 3439.183492] .spread0 : -151983.748901 [ 3439.183493] .nr_spread_over : 2 [ 3439.183494] .nr_running : 0 [ 3439.183496] .load : 0 [ 3439.183497] .load_avg : 0.000000 [ 3439.183498] .load_period : 0.000000 [ 3439.183499] .load_contrib : 0 [ 3439.183500] .load_tg : 0 [ 3439.183502] [ 3439.183502] rt_rq[1]:/ [ 3439.183503] .rt_nr_running : 0 [ 3439.183504] .rt_throttled : 0 [ 3439.183506] .rt_time : 0.009658 [ 3439.183507] .rt_runtime : 950.000000 [ 3439.183508] [ 3439.183508] runnable tasks: [ 3439.183508] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183508] ---------------------------------------------------------------------------- ------------------------------ [ 3439.183526] [ 3439.183526] cpu#2, 2393.987 MHz [ 3439.183528] .nr_running : 0 [ 3439.183529] .load : 0 [ 3439.183530] .nr_switches : 1071644 [ 3439.183531] .nr_load_updates : 145401 [ 3439.183532] .nr_uninterruptible : 578 [ 3439.183534] .next_balance : 0.786247 [ 3439.183535] .curr->pid : 0 [ 3439.183536] .clock : 3439182.995605 [ 3439.183537] .cpu_load[0] : 0 [ 3439.183538] .cpu_load[1] : 0 [ 3439.183540] .cpu_load[2] : 0 [ 3439.183541] .cpu_load[3] : 0 [ 3439.183542] .cpu_load[4] : 0 [ 3439.183543] .yld_count : 0 [ 3439.183544] .sched_count : 1072756 [ 3439.183545] .sched_goidle : 507617 [ 3439.183546] .avg_idle : 1000000 [ 3439.183548] .ttwu_count : 662967 [ 3439.183549] .ttwu_local : 105129 [ 3439.183550] [ 3439.183550] cfs_rq[2]:/autogroup-110 [ 3439.183552] .exec_clock : 161415.853497 [ 3439.183553] .MIN_vruntime : 0.000001 [ 3439.183555] .min_vruntime : 132494.143612 [ 3439.183556] .max_vruntime : 0.000001 [ 3439.183557] .spread : 0.000000 [ 3439.183559] .spread0 : -635659.627110 [ 3439.183560] .nr_spread_over : 72 [ 3439.183561] .nr_running : 0 [ 3439.183562] .load : 0 [ 3439.183563] .load_avg : 5119.999488 [ 3439.183565] .load_period : 5.000727 [ 3439.183566] .load_contrib : 1023 [ 3439.183567] .load_tg : 2883 [ 3439.183569] .se->exec_start : 3439182.994149 [ 3439.183570] .se->vruntime : 692338.803311 [ 3439.183571] .se->sum_exec_runtime : 161417.116862 [ 3439.183572] .se->statistics.wait_start : 0.000000 [ 3439.183574] .se->statistics.sleep_start : 0.000000 [ 3439.183575] .se->statistics.block_start : 0.000000 [ 3439.183576] .se->statistics.sleep_max : 0.000000 [ 3439.183577] .se->statistics.block_max : 0.000000 [ 3439.183579] .se->statistics.exec_max : 4.045107 [ 3439.183580] .se->statistics.slice_max : 15.698259 [ 3439.183581] .se->statistics.wait_max : 8.687668 [ 3439.183582] .se->statistics.wait_sum : 1792.531496 [ 3439.183583] .se->statistics.wait_count : 347865 [ 3439.183585] .se->load.weight : 2 [ 3439.183586] [ 3439.183586] cfs_rq[2]:/ [ 3439.183587] .exec_clock : 220241.632863 [ 3439.183589] .MIN_vruntime : 0.000001 [ 3439.183590] .min_vruntime : 692338.803311 [ 3439.183591] .max_vruntime : 0.000001 [ 3439.183592] .spread : 0.000000 [ 3439.183594] .spread0 : -75814.967411 [ 3439.183595] .nr_spread_over : 25 [ 3439.183596] .nr_running : 0 [ 3439.183597] .load : 0 [ 3439.183598] .load_avg : 0.000000 [ 3439.183600] .load_period : 0.000000 [ 3439.183601] .load_contrib : 0 [ 3439.183602] .load_tg : 0 [ 3439.183603] [ 3439.183603] rt_rq[2]:/ [ 3439.183605] .rt_nr_running : 0 [ 3439.183606] .rt_throttled : 0 [ 3439.183607] .rt_time : 0.008023 [ 3439.183609] .rt_runtime : 950.000000 [ 3439.183610] [ 3439.183610] runnable tasks: [ 3439.183610] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183610] ---------------------------------------------------------------------------- ------------------------------ [ 3439.183628] [ 3439.183628] cpu#3, 2393.987 MHz [ 3439.183629] .nr_running : 2 [ 3439.183630] .load : 2048 [ 3439.183632] .nr_switches : 416268 [ 3439.183633] .nr_load_updates : 70662 [ 3439.183634] .nr_uninterruptible : 118 [ 3439.183635] .next_balance : 0.786306 [ 3439.183636] .curr->pid : 3895 [ 3439.183638] .clock : 3439182.764069 [ 3439.183639] .cpu_load[0] : 1024 [ 3439.183640] .cpu_load[1] : 512 [ 3439.183641] .cpu_load[2] : 256 [ 3439.183642] .cpu_load[3] : 128 [ 3439.183643] .cpu_load[4] : 68 [ 3439.183644] .yld_count : 0 [ 3439.183646] .sched_count : 417208 [ 3439.183647] .sched_goidle : 197237 [ 3439.183648] .avg_idle : 1000000 [ 3439.183649] .ttwu_count : 210000 [ 3439.183650] .ttwu_local : 35744 [ 3439.183651] [ 3439.183651] cfs_rq[3]:/autogroup-125 [ 3439.183653] .exec_clock : 45.374110 [ 3439.183654] .MIN_vruntime : 0.000001 [ 3439.183656] .min_vruntime : 295.819635 [ 3439.183657] .max_vruntime : 0.000001 [ 3439.183658] .spread : 0.000000 [ 3439.183660] .spread0 : -767857.951087 [ 3439.183661] .nr_spread_over : 9 [ 3439.183662] .nr_running : 1 [ 3439.183663] .load : 1024 [ 3439.183664] .load_avg : 10239.998976 [ 3439.183665] .load_period : 9.999999 [ 3439.183667] .load_contrib : 1023 [ 3439.183668] .load_tg : 1023 [ 3439.183669] .se->exec_start : 3439182.758262 [ 3439.183670] .se->vruntime : 610007.876951 [ 3439.183672] .se->sum_exec_runtime : 45.380545 [ 3439.183673] .se->statistics.wait_start : 0.000000 [ 3439.183674] .se->statistics.sleep_start : 0.000000 [ 3439.183675] .se->statistics.block_start : 0.000000 [ 3439.183677] .se->statistics.sleep_max : 0.000000 [ 3439.183678] .se->statistics.block_max : 0.000000 [ 3439.183679] .se->statistics.exec_max : 3.993465 [ 3439.183680] .se->statistics.slice_max : 0.000000 [ 3439.183681] .se->statistics.wait_max : 0.700837 [ 3439.183683] .se->statistics.wait_sum : 0.742842 [ 3439.183684] .se->statistics.wait_count : 63 [ 3439.183685] .se->load.weight : 1024 [ 3439.183686] [ 3439.183686] cfs_rq[3]:/autogroup-110 [ 3439.183688] .exec_clock : 138590.337501 [ 3439.183689] .MIN_vruntime : 0.000001 [ 3439.183690] .min_vruntime : 166334.163173 [ 3439.183692] .max_vruntime : 0.000001 [ 3439.183693] .spread : 0.000000 [ 3439.183694] .spread0 : -601819.607549 [ 3439.183695] .nr_spread_over : 111 [ 3439.183696] .nr_running : 0 [ 3439.183698] .load : 0 [ 3439.183699] .load_avg : 1408.449920 [ 3439.183700] .load_period : 5.198067 [ 3439.183701] .load_contrib : 270 [ 3439.183702] .load_tg : 2883 [ 3439.183704] .se->exec_start : 3439167.695674 [ 3439.183705] .se->vruntime : 610019.850143 [ 3439.183706] .se->sum_exec_runtime : 138591.424870 [ 3439.183708] .se->statistics.wait_start : 0.000000 [ 3439.183709] .se->statistics.sleep_start : 0.000000 [ 3439.183710] .se->statistics.block_start : 0.000000 [ 3439.183711] .se->statistics.sleep_max : 0.000000 [ 3439.183712] .se->statistics.block_max : 0.000000 [ 3439.183714] .se->statistics.exec_max : 4.001704 [ 3439.183715] .se->statistics.slice_max : 7.245555 [ 3439.183716] .se->statistics.wait_max : 8.018562 [ 3439.183717] .se->statistics.wait_sum : 320.807433 [ 3439.183718] .se->statistics.wait_count : 169155 [ 3439.183720] .se->load.weight : 2 [ 3439.183721] [ 3439.183721] cfs_rq[3]:/ [ 3439.183722] .exec_clock : 148327.025103 [ 3439.183724] .MIN_vruntime : 610007.850143 [ 3439.183725] .min_vruntime : 610019.850143 [ 3439.183726] .max_vruntime : 610007.850143 [ 3439.183727] .spread : 0.000000 [ 3439.183729] .spread0 : -158133.920579 [ 3439.183730] .nr_spread_over : 36 [ 3439.183731] .nr_running : 2 [ 3439.183732] .load : 2048 [ 3439.183733] .load_avg : 0.000000 [ 3439.183735] .load_period : 0.000000 [ 3439.183736] .load_contrib : 0 [ 3439.183737] .load_tg : 0 [ 3439.183738] [ 3439.183738] rt_rq[3]:/ [ 3439.183740] .rt_nr_running : 0 [ 3439.183741] .rt_throttled : 0 [ 3439.183742] .rt_time : 0.009580 [ 3439.183744] .rt_runtime : 950.000000 [ 3439.183745] [ 3439.183745] runnable tasks: [ 3439.183745] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183745] ---------------------------------------------------------------------------- ------------------------------ [ 3439.183750] kworker/3:1 99 610007.850143 3094 120 610007.850143 20.566815 3438291.962706 / [ 3439.183767] R bash 3895 293.942577 41 120 293.942577 62.105185 39305.432164 /autogroup-125 [ 3439.183772] [ 3439.183772] cpu#4, 2393.987 MHz [ 3439.183774] .nr_running : 0 [ 3439.183775] .load : 0 [ 3439.183776] .nr_switches : 1208696 [ 3439.183777] .nr_load_updates : 139571 [ 3439.183779] .nr_uninterruptible : -1163 [ 3439.183780] .next_balance : 0.786306 [ 3439.183781] .curr->pid : 0 [ 3439.183783] .clock : 3439182.802769 [ 3439.183784] .cpu_load[0] : 288 [ 3439.183785] .cpu_load[1] : 144 [ 3439.183786] .cpu_load[2] : 72 [ 3439.183787] .cpu_load[3] : 36 [ 3439.183788] .cpu_load[4] : 18 [ 3439.183789] .yld_count : 0 [ 3439.183790] .sched_count : 1209765 [ 3439.183792] .sched_goidle : 573809 [ 3439.183793] .avg_idle : 1000000 [ 3439.183794] .ttwu_count : 588025 [ 3439.183795] .ttwu_local : 127201 [ 3439.183797] [ 3439.183797] cfs_rq[4]:/autogroup-110 [ 3439.183799] .exec_clock : 205710.450322 [ 3439.183800] .MIN_vruntime : 0.000001 [ 3439.183801] .min_vruntime : 171008.717955 [ 3439.183803] .max_vruntime : 0.000001 [ 3439.183804] .spread : 0.000000 [ 3439.183805] .spread0 : -597145.052767 [ 3439.183806] .nr_spread_over : 39 [ 3439.183808] .nr_running : 0 [ 3439.183809] .load : 0 [ 3439.183810] .load_avg : 5143.147520 [ 3439.183811] .load_period : 5.024028 [ 3439.183813] .load_contrib : 1023 [ 3439.183814] .load_tg : 2883 [ 3439.183815] .se->exec_start : 3439182.801346 [ 3439.183816] .se->vruntime : 819346.099780 [ 3439.183818] .se->sum_exec_runtime : 205711.579139 [ 3439.183819] .se->statistics.wait_start : 0.000000 [ 3439.183820] .se->statistics.sleep_start : 0.000000 [ 3439.183822] .se->statistics.block_start : 0.000000 [ 3439.183823] .se->statistics.sleep_max : 0.000000 [ 3439.183824] .se->statistics.block_max : 0.000000 [ 3439.183825] .se->statistics.exec_max : 4.030279 [ 3439.183826] .se->statistics.slice_max : 8.128120 [ 3439.183828] .se->statistics.wait_max : 9.702825 [ 3439.183829] .se->statistics.wait_sum : 1481.723827 [ 3439.183830] .se->statistics.wait_count : 490534 [ 3439.183831] .se->load.weight : 2 [ 3439.183832] [ 3439.183832] cfs_rq[4]:/ [ 3439.183834] .exec_clock : 254200.107560 [ 3439.183835] .MIN_vruntime : 0.000001 [ 3439.183837] .min_vruntime : 819346.099780 [ 3439.183838] .max_vruntime : 0.000001 [ 3439.183839] .spread : 0.000000 [ 3439.183840] .spread0 : 51192.329058 [ 3439.183841] .nr_spread_over : 17 [ 3439.183842] .nr_running : 0 [ 3439.183844] .load : 0 [ 3439.183845] .load_avg : 0.000000 [ 3439.183846] .load_period : 0.000000 [ 3439.183847] .load_contrib : 0 [ 3439.183848] .load_tg : 0 [ 3439.183850] [ 3439.183850] rt_rq[4]:/ [ 3439.183852] .rt_nr_running : 0 [ 3439.183853] .rt_throttled : 0 [ 3439.183854] .rt_time : 0.007596 [ 3439.183855] .rt_runtime : 950.000000 [ 3439.183857] [ 3439.183857] runnable tasks: [ 3439.183857] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183857] ---------------------------------------------------------------------------- ------------------------------ [ 3439.183875] [ 3439.183875] cpu#5, 2393.987 MHz [ 3439.183876] .nr_running : 0 [ 3439.183877] .load : 0 [ 3439.183879] .nr_switches : 424274 [ 3439.183880] .nr_load_updates : 83160 [ 3439.183881] .nr_uninterruptible : -43 [ 3439.183882] .next_balance : 0.786247 [ 3439.183883] .curr->pid : 0 [ 3439.183885] .clock : 3439183.003901 [ 3439.183886] .cpu_load[0] : 0 [ 3439.183887] .cpu_load[1] : 11 [ 3439.183888] .cpu_load[2] : 28 [ 3439.183889] .cpu_load[3] : 36 [ 3439.183890] .cpu_load[4] : 49 [ 3439.183892] .yld_count : 0 [ 3439.183893] .sched_count : 425344 [ 3439.183894] .sched_goidle : 200008 [ 3439.183895] .avg_idle : 1000000 [ 3439.183896] .ttwu_count : 208524 [ 3439.183897] .ttwu_local : 38731 [ 3439.183899] [ 3439.183899] cfs_rq[5]:/autogroup-114 [ 3439.183900] .exec_clock : 48.599685 [ 3439.183902] .MIN_vruntime : 0.000001 [ 3439.183903] .min_vruntime : 47.551109 [ 3439.183904] .max_vruntime : 0.000001 [ 3439.183906] .spread : 0.000000 [ 3439.183907] .spread0 : -768106.219613 [ 3439.183908] .nr_spread_over : 0 [ 3439.183909] .nr_running : 0 [ 3439.183910] .load : 0 [ 3439.183912] .load_avg : 5119.999488 [ 3439.183913] .load_period : 5.026570 [ 3439.183914] .load_contrib : 1018 [ 3439.183915] .load_tg : 1018 [ 3439.183917] .se->exec_start : 3439182.950421 [ 3439.183918] .se->vruntime : 611223.330396 [ 3439.183919] .se->sum_exec_runtime : 48.711989 [ 3439.183920] .se->statistics.wait_start : 0.000000 [ 3439.183922] .se->statistics.sleep_start : 0.000000 [ 3439.183923] .se->statistics.block_start : 0.000000 [ 3439.183924] .se->statistics.sleep_max : 0.000000 [ 3439.183925] .se->statistics.block_max : 0.000000 [ 3439.183926] .se->statistics.exec_max : 1.401478 [ 3439.183928] .se->statistics.slice_max : 0.988092 [ 3439.183929] .se->statistics.wait_max : 3.726779 [ 3439.183930] .se->statistics.wait_sum : 12.297594 [ 3439.183931] .se->statistics.wait_count : 712 [ 3439.183932] .se->load.weight : 2 [ 3439.183934] [ 3439.183934] cfs_rq[5]:/autogroup-110 [ 3439.183935] .exec_clock : 138654.801344 [ 3439.183937] .MIN_vruntime : 0.000001 [ 3439.183938] .min_vruntime : 165931.673283 [ 3439.183939] .max_vruntime : 0.000001 [ 3439.183940] .spread : 0.000000 [ 3439.183942] .spread0 : -602222.097439 [ 3439.183943] .nr_spread_over : 60 [ 3439.183944] .nr_running : 0 [ 3439.183945] .load : 0 [ 3439.183946] .load_avg : 252.077180 [ 3439.183948] .load_period : 7.237036 [ 3439.183949] .load_contrib : 34 [ 3439.183950] .load_tg : 2883 [ 3439.183952] .se->exec_start : 3439183.002329 [ 3439.183953] .se->vruntime : 611235.419027 [ 3439.183954] .se->sum_exec_runtime : 138655.937654 [ 3439.183955] .se->statistics.wait_start : 0.000000 [ 3439.183957] .se->statistics.sleep_start : 0.000000 [ 3439.183958] .se->statistics.block_start : 0.000000 [ 3439.183959] .se->statistics.sleep_max : 0.000000 [ 3439.183960] .se->statistics.block_max : 0.000000 [ 3439.183961] .se->statistics.exec_max : 3.999039 [ 3439.183963] .se->statistics.slice_max : 2.828527 [ 3439.183964] .se->statistics.wait_max : 8.670955 [ 3439.183965] .se->statistics.wait_sum : 324.308503 [ 3439.183966] .se->statistics.wait_count : 170251 [ 3439.183967] .se->load.weight : 2 [ 3439.183968] [ 3439.183968] cfs_rq[5]:/ [ 3439.183970] .exec_clock : 151352.660542 [ 3439.183971] .MIN_vruntime : 0.000001 [ 3439.183972] .min_vruntime : 611235.419027 [ 3439.183974] .max_vruntime : 0.000001 [ 3439.183975] .spread : 0.000000 [ 3439.183976] .spread0 : -156918.351695 [ 3439.183977] .nr_spread_over : 22 [ 3439.183978] .nr_running : 0 [ 3439.183979] .load : 0 [ 3439.183981] .load_avg : 0.000000 [ 3439.183982] .load_period : 0.000000 [ 3439.183983] .load_contrib : 0 [ 3439.183984] .load_tg : 0 [ 3439.183986] [ 3439.183986] rt_rq[5]:/ [ 3439.183987] .rt_nr_running : 0 [ 3439.183988] .rt_throttled : 0 [ 3439.183990] .rt_time : 0.007296 [ 3439.183991] .rt_runtime : 950.000000 [ 3439.183992] [ 3439.183992] runnable tasks: [ 3439.183992] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.183992] ---------------------------------------------------------------------------- ------------------------------ [ 3439.184010] [ 3439.184010] cpu#6, 2393.987 MHz [ 3439.184011] .nr_running : 0 [ 3439.184013] .load : 0 [ 3439.184014] .nr_switches : 917767 [ 3439.184015] .nr_load_updates : 105770 [ 3439.184016] .nr_uninterruptible : 285 [ 3439.184017] .next_balance : 0.786247 [ 3439.184019] .curr->pid : 0 [ 3439.184020] .clock : 3439086.916447 [ 3439.184021] .cpu_load[0] : 0 [ 3439.184022] .cpu_load[1] : 0 [ 3439.184023] .cpu_load[2] : 0 [ 3439.184024] .cpu_load[3] : 1 [ 3439.184025] .cpu_load[4] : 2 [ 3439.184027] .yld_count : 0 [ 3439.184028] .sched_count : 918854 [ 3439.184029] .sched_goidle : 433176 [ 3439.184030] .avg_idle : 415230 [ 3439.184031] .ttwu_count : 469405 [ 3439.184032] .ttwu_local : 53141 [ 3439.184034] [ 3439.184034] cfs_rq[6]:/ [ 3439.184035] .exec_clock : 210388.121627 [ 3439.184037] .MIN_vruntime : 0.000001 [ 3439.184038] .min_vruntime : 716618.947139 [ 3439.184039] .max_vruntime : 0.000001 [ 3439.184041] .spread : 0.000000 [ 3439.184042] .spread0 : -51534.823583 [ 3439.184043] .nr_spread_over : 8 [ 3439.184044] .nr_running : 0 [ 3439.184045] .load : 0 [ 3439.184047] .load_avg : 0.000000 [ 3439.184048] .load_period : 0.000000 [ 3439.184049] .load_contrib : 0 [ 3439.184050] .load_tg : 0 [ 3439.184052] [ 3439.184052] rt_rq[6]:/ [ 3439.184053] .rt_nr_running : 0 [ 3439.184055] .rt_throttled : 0 [ 3439.184056] .rt_time : 0.005601 [ 3439.184057] .rt_runtime : 950.000000 [ 3439.184058] [ 3439.184058] runnable tasks: [ 3439.184058] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.184058] ---------------------------------------------------------------------------- ------------------------------ [ 3439.184076] [ 3439.184076] cpu#7, 2393.987 MHz [ 3439.184078] .nr_running : 0 [ 3439.184079] .load : 0 [ 3439.184080] .nr_switches : 399474 [ 3439.184081] .nr_load_updates : 67477 [ 3439.184083] .nr_uninterruptible : -14 [ 3439.184084] .next_balance : 0.786247 [ 3439.184085] .curr->pid : 0 [ 3439.184086] .clock : 3439182.965780 [ 3439.184087] .cpu_load[0] : 0 [ 3439.184089] .cpu_load[1] : 27 [ 3439.184090] .cpu_load[2] : 81 [ 3439.184091] .cpu_load[3] : 108 [ 3439.184092] .cpu_load[4] : 110 [ 3439.184093] .yld_count : 0 [ 3439.184094] .sched_count : 400412 [ 3439.184095] .sched_goidle : 189858 [ 3439.184097] .avg_idle : 876196 [ 3439.184098] .ttwu_count : 190181 [ 3439.184099] .ttwu_local : 26320 [ 3439.184100] [ 3439.184100] cfs_rq[7]:/autogroup-112 [ 3439.184102] .exec_clock : 1938.500286 [ 3439.184104] .MIN_vruntime : 0.000001 [ 3439.184105] .min_vruntime : 1587.663585 [ 3439.184106] .max_vruntime : 0.000001 [ 3439.184107] .spread : 0.000000 [ 3439.184109] .spread0 : -766566.107137 [ 3439.184110] .nr_spread_over : 17 [ 3439.184111] .nr_running : 0 [ 3439.184112] .load : 0 [ 3439.184113] .load_avg : 5119.999488 [ 3439.184115] .load_period : 5.013694 [ 3439.184116] .load_contrib : 1021 [ 3439.184117] .load_tg : 1021 [ 3439.184118] .se->exec_start : 3439182.951407 [ 3439.184120] .se->vruntime : 607092.517054 [ 3439.184121] .se->sum_exec_runtime : 1940.063796 [ 3439.184122] .se->statistics.wait_start : 0.000000 [ 3439.184123] .se->statistics.sleep_start : 0.000000 [ 3439.184124] .se->statistics.block_start : 0.000000 [ 3439.184126] .se->statistics.sleep_max : 0.000000 [ 3439.184127] .se->statistics.block_max : 0.000000 [ 3439.184128] .se->statistics.exec_max : 3.995492 [ 3439.184129] .se->statistics.slice_max : 1.072718 [ 3439.184130] .se->statistics.wait_max : 7.122142 [ 3439.184132] .se->statistics.wait_sum : 174.704210 [ 3439.184133] .se->statistics.wait_count : 11138 [ 3439.184134] .se->load.weight : 2 [ 3439.184135] [ 3439.184135] cfs_rq[7]:/autogroup-110 [ 3439.184137] .exec_clock : 138919.098489 [ 3439.184138] .MIN_vruntime : 0.000001 [ 3439.184140] .min_vruntime : 132548.252319 [ 3439.184141] .max_vruntime : 0.000001 [ 3439.184142] .spread : 0.000000 [ 3439.184143] .spread0 : -635605.518403 [ 3439.184144] .nr_spread_over : 43 [ 3439.184146] .nr_running : 0 [ 3439.184147] .load : 0 [ 3439.184148] .load_avg : 2097.174656 [ 3439.184149] .load_period : 6.238103 [ 3439.184150] .load_contrib : 336 [ 3439.184152] .load_tg : 2883 [ 3439.184153] .se->exec_start : 3439166.938545 [ 3439.184154] .se->vruntime : 607104.454178 [ 3439.184156] .se->sum_exec_runtime : 138920.072919 [ 3439.184157] .se->statistics.wait_start : 0.000000 [ 3439.184158] .se->statistics.sleep_start : 0.000000 [ 3439.184159] .se->statistics.block_start : 0.000000 [ 3439.184160] .se->statistics.sleep_max : 0.000000 [ 3439.184162] .se->statistics.block_max : 0.000000 [ 3439.184163] .se->statistics.exec_max : 3.998904 [ 3439.184164] .se->statistics.slice_max : 5.873800 [ 3439.184165] .se->statistics.wait_max : 4.858515 [ 3439.184167] .se->statistics.wait_sum : 261.677979 [ 3439.184168] .se->statistics.wait_count : 170515 [ 3439.184169] .se->load.weight : 2 [ 3439.184170] [ 3439.184170] cfs_rq[7]:/ [ 3439.184172] .exec_clock : 148953.165791 [ 3439.184173] .MIN_vruntime : 0.000001 [ 3439.184174] .min_vruntime : 607104.454178 [ 3439.184175] .max_vruntime : 0.000001 [ 3439.184177] .spread : 0.000000 [ 3439.184178] .spread0 : -161049.316544 [ 3439.184179] .nr_spread_over : 5 [ 3439.184180] .nr_running : 0 [ 3439.184181] .load : 0 [ 3439.184182] .load_avg : 0.000000 [ 3439.184184] .load_period : 0.000000 [ 3439.184185] .load_contrib : 0 [ 3439.184186] .load_tg : 0 [ 3439.184187] [ 3439.184187] rt_rq[7]:/ [ 3439.184189] .rt_nr_running : 0 [ 3439.184190] .rt_throttled : 0 [ 3439.184191] .rt_time : 0.008812 [ 3439.184192] .rt_runtime : 950.000000 [ 3439.184194] [ 3439.184194] runnable tasks: [ 3439.184194] task PID tree-key switches prio exec-runtime sum-exec sum-sleep [ 3439.184194] ---------------------------------------------------------------------------- ------------------------------ [ 3439.184211] [ 3450.970910] SysRq : Show backtrace of all active CPUs [ 3450.970918] sending NMI to all CPUs: [ 3450.970926] NMI backtrace for cpu 1 [ 3450.970930] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971001] [ 3450.971005] Pid: 2345, comm: bamfdaemon Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971011] EIP: 0073:[] EFLAGS: 00000202 CPU: 1 [ 3450.971015] EIP is at 0xb6f1202e [ 3450.971017] EAX: 00000001 EBX: b6f30000 ECX: 087510e0 EDX: 00000002 [ 3450.971020] ESI: 00000001 EDI: 0874bf48 EBP: 0874bf48 ESP: bfbd93f8 [ 3450.971022] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 3450.971025] Process bamfdaemon (pid: 2345, ti=ef438000 task=ee4ae580 task.ti=ef438000) [ 3450.971027] [ 3450.971030] NMI backtrace for cpu 5 [ 3450.971033] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971094] [ 3450.971097] Pid: 0, comm: swapper/5 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971102] EIP: 0060:[] EFLAGS: 00000046 CPU: 5 [ 3450.971108] EIP is at intel_idle+0x91/0x120 [ 3450.971110] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 3450.971112] ESI: 00000008 EDI: f7bcc25c EBP: f7551f44 ESP: f7551f20 [ 3450.971115] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 3450.971117] CR0: 8005003b CR2: a0d53000 CR3: 01976000 CR4: 000007f0 [ 3450.971119] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 3450.971121] DR6: ffff0ff0 DR7: 00000400 [ 3450.971124] Process swapper/5 (pid: 0, ti=f7550000 task=f7548cb0 task.ti=f7550000) [ 3450.971126] Stack: [ 3450.971127] 00000003 8112d360 12d18b80 00000020 c1878260 00000005 c1878260 000000e4 [ 3450.971136] f7bcc25c f7551f54 c149bc15 c18abd2c 00000000 f7551f7c c149c178 01400000 [ 3450.971143] 00000082 00000005 c1878260 00000003 c18abd2c 00000000 00000000 f7551f90 [ 3450.971151] Call Trace: [ 3450.971160] [] cpuidle_enter+0x15/0x20 [ 3450.971164] [] cpuidle_idle_call+0x88/0x220 [ 3450.971170] [] cpu_idle+0xaa/0xe0 [ 3450.971176] [] start_secondary+0x1d5/0x1db [ 3450.971178] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 3450.971226] NMI backtrace for cpu 3 [ 3450.971227] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971284] [ 3450.971288] Pid: 3895, comm: bash Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971293] EIP: 0060:[] EFLAGS: 00200092 CPU: 3 [ 3450.971299] EIP is at delay_tsc+0x1f/0x60 [ 3450.971301] EAX: b9a848a8 EBX: 00000003 ECX: fffff000 EDX: 000007b4 [ 3450.971303] ESI: 00200286 EDI: 00243cc2 EBP: ea683eec ESP: ea683edc [ 3450.971306] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 3450.971308] CR0: 80050033 CR2: 9c469000 CR3: 2b6c7000 CR4: 000007f0 [ 3450.971310] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 3450.971312] DR6: ffff0ff0 DR7: 00000400 [ 3450.971315] Process bash (pid: 3895, ti=ea682000 task=eff2bf70 task.ti=ea682000) [ 3450.971316] Stack: [ 3450.971318] 00200286 00002710 00200286 0000000f ea683ef4 c12d25fb ea683f04 c102e4b2 [ 3450.971326] c175f8ba 0000006c ea683f0c c138001d ea683f2c c13803d9 c175eadd c17c67c4 [ 3450.971334] c187d23c 00000002 ebb6c3c0 c1380430 ea683f3c c1380470 08f94c08 f0b70980 [ 3450.971342] Call Trace: [ 3450.971347] [] __const_udelay+0x1b/0x20 [ 3450.971353] [] arch_trigger_all_cpu_backtrace+0x62/0x80 [ 3450.971359] [] sysrq_handle_showallcpus+0xd/0x10 [ 3450.971363] [] __handle_sysrq+0xe9/0x140 [ 3450.971367] [] ? __handle_sysrq+0x140/0x140 [ 3450.971370] [] write_sysrq_trigger+0x40/0x50 [ 3450.971377] [] proc_reg_write+0x64/0xa0 [ 3450.971382] [] ? alloc_fd+0x9f/0xe0 [ 3450.971386] [] ? proc_reg_poll+0xa0/0xa0 [ 3450.971393] [] vfs_write+0x8c/0x160 [ 3450.971397] [] ? proc_reg_poll+0xa0/0xa0 [ 3450.971401] [] sys_write+0x3d/0x70 [ 3450.971406] [] sysenter_do_call+0x12/0x28 [ 3450.971408] Code: c3 8d 74 26 00 8d bc 27 00 00 00 00 55 89 e5 57 56 53 83 ec 04 66 66 66 66 90 64 8b 1d 28 70 96 c1 89 c7 8d 76 00 0f ae e8 0f 31 <66> 66 66 90 89 c6 89 5d f0 eb 14 8d b6 00 00 00 00 f3 90 64 8b [ 3450.971456] NMI backtrace for cpu 7 [ 3450.971460] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971518] [ 3450.971521] Pid: 0, comm: swapper/7 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971527] EIP: 0060:[] EFLAGS: 00000046 CPU: 7 [ 3450.971530] EIP is at intel_idle+0x91/0x120 [ 3450.971533] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 3450.971535] ESI: 00000008 EDI: f7be825c EBP: f7555f44 ESP: f7555f20 [ 3450.971537] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 3450.971539] CR0: 8005003b CR2: 9c469000 CR3: 01976000 CR4: 000007f0 [ 3450.971542] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 3450.971544] DR6: ffff0ff0 DR7: 00000400 [ 3450.971546] Process swapper/7 (pid: 0, ti=f7554000 task=f754a610 task.ti=f7554000) [ 3450.971548] Stack: [ 3450.971549] 00000003 7475041f 12d18b80 00000020 c1878260 00000007 c1878260 000000e4 [ 3450.971557] f7be825c f7555f54 c149bc15 c18abd2c 00000000 f7555f7c c149c178 01400000 [ 3450.971565] 00000082 00000007 c1878260 00000003 c18abd2c 00000000 00000000 f7555f90 [ 3450.971572] Call Trace: [ 3450.971578] [] cpuidle_enter+0x15/0x20 [ 3450.971582] [] cpuidle_idle_call+0x88/0x220 [ 3450.971586] [] cpu_idle+0xaa/0xe0 [ 3450.971591] [] start_secondary+0x1d5/0x1db [ 3450.971593] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 3450.971641] NMI backtrace for cpu 4 [ 3450.971646] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971712] [ 3450.971716] Pid: 0, comm: swapper/4 Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971721] EIP: 0060:[] EFLAGS: 00000046 CPU: 4 [ 3450.971726] EIP is at intel_idle+0x91/0x120 [ 3450.971729] EAX: 00000020 EBX: 00000003 ECX: 00000001 EDX: 00000000 [ 3450.971731] ESI: 00000008 EDI: f7bbe25c EBP: f7547f44 ESP: f7547f20 [ 3450.971733] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 3450.971735] CR0: 8005003b CR2: 9c47e000 CR3: 01976000 CR4: 000007f0 [ 3450.971738] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 3450.971740] DR6: ffff0ff0 DR7: 00000400 [ 3450.971743] Process swapper/4 (pid: 0, ti=f7546000 task=f7548000 task.ti=f7546000) [ 3450.971744] Stack: [ 3450.971746] 00000003 8119c614 12d18b80 00000020 c1878260 00000004 c1878260 000000e4 [ 3450.971754] f7bbe25c f7547f54 c149bc15 c18abd2c 00000000 f7547f7c c149c178 01400000 [ 3450.971762] 00000082 00000004 c1878260 00000003 c18abd2c 00000000 00000000 f7547f90 [ 3450.971769] Call Trace: [ 3450.971777] [] cpuidle_enter+0x15/0x20 [ 3450.971781] [] cpuidle_idle_call+0x88/0x220 [ 3450.971786] [] cpu_idle+0xaa/0xe0 [ 3450.971791] [] start_secondary+0x1d5/0x1db [ 3450.971793] Code: 08 83 e2 08 75 25 31 d2 83 c0 08 89 d1 0f 01 c8 0f ae f0 66 90 89 e0 25 00 e0 ff ff 8b 40 08 a8 08 75 08 b1 01 8b 45 e8 0f 01 c9 4a 95 d6 ff 2b 45 e0 1b 55 e4 e8 1f 4b d2 ff 89 45 e8 89 d1 [ 3450.971841] NMI backtrace for cpu 2 [ 3450.971844] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971901] [ 3450.971905] Pid: 2361, comm: gtk-window-deco Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971910] EIP: 0073:[] EFLAGS: 00000286 CPU: 2 [ 3450.971914] EIP is at 0xb70c8737 [ 3450.971916] EAX: 08627348 EBX: b7114000 ECX: b7114000 EDX: b75b0f3b [ 3450.971918] ESI: 086380b0 EDI: b75b0f3b EBP: 0000012a ESP: bfd6f0d0 [ 3450.971920] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 3450.971923] Process gtk-window-deco (pid: 2361, ti=ee520000 task=f0910000 task.ti=ee520000) [ 3450.971925] [ 3450.971928] NMI backtrace for cpu 6 [ 3450.971931] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.971988] [ 3450.971992] Pid: 1886, comm: gnome-settings- Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.971997] EIP: 0073:[] EFLAGS: 00000282 CPU: 6 [ 3450.972000] EIP is at 0xb6bc8f3d [ 3450.972003] EAX: bfeb58ec EBX: b6c06000 ECX: 09b55840 EDX: 00000003 [ 3450.972005] ESI: 09b55840 EDI: 09c71b68 EBP: 09b47480 ESP: bfeb57d0 [ 3450.972007] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 3450.972010] Process gnome-settings- (pid: 1886, ti=ee494000 task=ef7b1960 task.ti=ee494000) [ 3450.972011] [ 3450.972014] NMI backtrace for cpu 0 [ 3450.972018] Modules linked in: xfs hidp vesafb usblp hid_apple ipheth btusb uvcvideo videobuf2_core videodev joydev videobuf2_vmalloc hid_generic videobuf2_memops usbhid snd_usb_audio hid snd_usbmidi_lib bnep rfcomm bluetooth parport_pc ppdev snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec firewire_sbp2 snd_hwdep snd_pcm snd_seq_midi snd_rawmidi radeon snd_seq_midi_event coretemp snd_seq b43 kvm_intel ttm snd_timer drm_kms_helper snd_seq_device kvm drm mac80211 snd ioatdma shpchp aesni_intel soundcore snd_page_alloc cryptd i7core_edac i2c_algo_bit aes_i586 dca edac_core applesmc cfg80211 lpc_ich microcode input_polldev bcma mac_hid lp parport firewire_ohci firewire_core crc_itu_t ssb e1000e [ 3450.972075] [ 3450.972078] Pid: 2212, comm: compiz Tainted: G D 3.5.0-19-generic #30-Ubuntu Apple Inc. MacPro5,1/Mac-F221BEC8 [ 3450.972083] EIP: 0073:[] EFLAGS: 00200202 CPU: 0 [ 3450.972087] EIP is at 0xb76c369a [ 3450.972089] EAX: 00000001 EBX: b7750000 ECX: 00000000 EDX: c78a4e00 [ 3450.972091] ESI: 098639b0 EDI: bfd4a6ec EBP: 098acad0 ESP: bfd4a5f0 [ 3450.972093] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b [ 3450.972096] Process compiz (pid: 2212, ti=ef6a0000 task=f6717230 task.ti=ef6a0000) [ 3450.972098] When then interrupted, here was the message from xfsrestore: ^C ========================= status and control dialog ========================== status at 10:49:00: 45/120310 files restored, 0.0% complete, 2634 seconds elapsed Best, J. From levon@inco.com.lb Wed Jan 2 08:59:15 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=BAYES_50,RCVD_IN_SORBS_WEB, TVD_SPACE_RATIO,TVD_SPACE_RATIO_MINFP autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02ExEXS004427 for ; Wed, 2 Jan 2013 08:59:14 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0E62AC006 for ; Wed, 2 Jan 2013 07:02:00 -0800 (PST) X-ASG-Debug-ID: 1357138915-04bdf07fae3a5aa0001-NocioJ Received: from bce.idm.net.lb (smtp.idm.net.lb [194.126.4.59]) by cuda.sgi.com with ESMTP id s4ocym0KXDMnVyWD for ; Wed, 02 Jan 2013 07:01:58 -0800 (PST) X-Barracuda-Envelope-From: levon@inco.com.lb X-Barracuda-Apparent-Source-IP: 194.126.4.59 MIME-version: 1.0 Content-transfer-encoding: 7BIT Content-type: text/plain; charset=iso-8859-1 Received: from [180.215.157.150] by bce.idm.net.lb (Sun Java(tm) System Messaging Server 6.3-8.04 (built Jul 29 2009; 32bit)) with ESMTPA id <0MG00022M6OLU8C0@bce.idm.net.lb> for xfs@oss.sgi.com; Wed, 02 Jan 2013 16:54:48 +0200 (EET) Message-id: <0MG0002686R8U8C0@bce.idm.net.lb> Content-description: Mail message body Subject: Upgrade To: Recipients X-ASG-Orig-Subj: Upgrade From: levon@inco.com.lb Date: Wed, 02 Jan 2013 20:30:24 +0530 X-Barracuda-Connect: smtp.idm.net.lb[194.126.4.59] X-Barracuda-Start-Time: 1357138917 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA609_NRN, BSF_SC0_SA_TO_FROM_ADDR_MATCH, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.10 BSF_SC0_SA609_NRN Custom Rule SA609_NRN click here https://docs.google.com/spreadsheet/viewform?formkey=dFpuUjhFU01xNnljcUpWTkMzanZBYWc6MQ From bfoster@redhat.com Wed Jan 2 12:03:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I3vF8024717 for ; Wed, 2 Jan 2013 12:03:57 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27F8F304066 for ; Wed, 2 Jan 2013 10:06:48 -0800 (PST) X-ASG-Debug-ID: 1357150007-04cbb035a5993b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tPcm4MqoCfxQGYNx for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) 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 r02I6ktc011531 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6jZ7026627 for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5186D120092; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 3/7] xfs: cap prealloc size to free space before shift Date: Wed, 2 Jan 2013 13:08:07 -0500 X-ASG-Orig-Subj: [PATCH v2 3/7] xfs: cap prealloc size to free space before shift Message-Id: <1357150091-37530-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-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: 1357150007 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com With the addition of quota preallocation throttling, we want to support a general algorithm that considers the maximum allowable prealloc size and recommended shift modifier from various sources (i.e., global fs state and all applicable quotas for an inode). Update the current global free space throttle algorithm to cap the preallocation size to the free space available in the filesystem. Signed-off-by: Brian Foster --- fs/xfs/xfs_iomap.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index b2002a5..5232954 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -351,6 +351,9 @@ xfs_iomap_prealloc_size( if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) shift++; } + if (alloc_blocks > freesp) + alloc_blocks = freesp; + if (shift) alloc_blocks >>= shift; /* -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:03:58 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_35, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I3v3T024732 for ; Wed, 2 Jan 2013 12:03:58 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC6568F8040 for ; Wed, 2 Jan 2013 10:06:48 -0800 (PST) X-ASG-Debug-ID: 1357150008-04cbb035a4993b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BhtM7rrhMYOFK1KQ for ; Wed, 02 Jan 2013 10:06:48 -0800 (PST) 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 r02I6lJn017097 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6lSD030513 for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7E8A3120095; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 6/7] xfs: add quota-driven speculative preallocation throttling Date: Wed, 2 Jan 2013 13:08:10 -0500 X-ASG-Orig-Subj: [PATCH v2 6/7] xfs: add quota-driven speculative preallocation throttling Message-Id: <1357150091-37530-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-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: 1357150008 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Introduce the need_throttle() and calc_throttle() functions to independently check whether throttling is required for a particular dquot and if so, calculate the associated throttling metrics based on the state of the quota. We use the same general algorithm to calculate the throttle shift as for global free space with the exception of using three stages rather than five. Update xfs_iomap_prealloc_size() to use the smallest available prealloc size based on each of the constraints and apply the maximum shift to obtain the throttled preallocation size. Signed-off-by: Brian Foster --- fs/xfs/xfs_iomap.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 82 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 5232954..00cc364 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -42,6 +42,8 @@ #include "xfs_iomap.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_dquot_item.h" +#include "xfs_dquot.h" #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ @@ -310,6 +312,61 @@ xfs_iomap_eof_want_preallocate( return 0; } +STATIC bool +xfs_quota_need_throttle( + struct xfs_inode *ip, + int type, + xfs_fsblock_t alloc_blocks) +{ + struct xfs_dquot *dq = xfs_inode_dquot(ip, type); + + if (!dq || !xfs_this_quota_on(ip->i_mount, type)) + return false; + + /* no hi watermark, no throttle */ + if (!dq->q_prealloc_hi_wmark) + return false; + + /* under the lo watermark, no throttle */ + if (dq->q_res_bcount + alloc_blocks < dq->q_prealloc_lo_wmark) + return false; + + return true; +} + +STATIC void +xfs_quota_calc_throttle( + struct xfs_inode *ip, + int type, + xfs_fsblock_t *qblocks, + int *qshift) +{ + int64_t freesp; + int shift = 0; + struct xfs_dquot *dq = xfs_inode_dquot(ip, type); + + /* over hi wmark, squash the prealloc completely */ + if (dq->q_res_bcount >= dq->q_prealloc_hi_wmark) { + *qblocks = 0; + return; + } + + freesp = dq->q_prealloc_hi_wmark - dq->q_res_bcount; + if (freesp < dq->q_low_space[XFS_QLOWSP_5_PCNT]) { + shift = 2; + if (freesp < dq->q_low_space[XFS_QLOWSP_3_PCNT]) + shift += 2; + if (freesp < dq->q_low_space[XFS_QLOWSP_1_PCNT]) + shift += 2; + } + + /* only overwrite the throttle values if we are more aggressive */ + if ((freesp >> shift) < (*qblocks >> *qshift)) { + *qblocks = freesp; + *qshift = shift; + } +} + /* * If we don't have a user specified preallocation size, dynamically increase * the preallocation size as the size of the file grows. Cap the maximum size @@ -324,6 +381,8 @@ xfs_iomap_prealloc_size( xfs_fsblock_t alloc_blocks = 0; int shift = 0; int64_t freesp; + xfs_fsblock_t qblocks; + int qshift = 0; if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) goto check_writeio; @@ -335,8 +394,8 @@ xfs_iomap_prealloc_size( * size, we round up first, apply appropriate throttling, round down and * cap the value to MAXEXTLEN. */ - alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), - XFS_B_TO_FSB(mp, XFS_ISIZE(ip))); + alloc_blocks = qblocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), + XFS_B_TO_FSB(mp, XFS_ISIZE(ip))); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); freesp = mp->m_sb.sb_fdblocks; @@ -354,6 +413,27 @@ xfs_iomap_prealloc_size( if (alloc_blocks > freesp) alloc_blocks = freesp; + /* + * Check each quota to cap the prealloc size and provide a shift + * value to throttle with. + */ + if (xfs_quota_need_throttle(ip, XFS_DQ_USER, alloc_blocks)) + xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift); + if (xfs_quota_need_throttle(ip, XFS_DQ_GROUP, alloc_blocks)) + xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift); + if (xfs_quota_need_throttle(ip, XFS_DQ_PROJ, alloc_blocks)) + xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift); + + /* + * The final prealloc size is set to the minimum of free space available + * in each of the quotas and the overall filesystem. + * + * The shift throttle value is set to the maximum value as determined by + * the global low free space values and per-quota low free space values. + */ + alloc_blocks = MIN(alloc_blocks, qblocks); + shift = MAX(shift, qshift); + if (shift) alloc_blocks >>= shift; /* -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:03:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I3vgu024716 for ; Wed, 2 Jan 2013 12:03:57 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2479A304048 for ; Wed, 2 Jan 2013 10:06:48 -0800 (PST) X-ASG-Debug-ID: 1357150006-04cbb035a6993b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cdh4IScqkceqHoUs for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) 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 r02I6kwH006926 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6jNO026628 for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 454EF120091; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 2/7] xfs: push rounddown_pow_of_two() to after prealloc throttle Date: Wed, 2 Jan 2013 13:08:06 -0500 X-ASG-Orig-Subj: [PATCH v2 2/7] xfs: push rounddown_pow_of_two() to after prealloc throttle Message-Id: <1357150091-37530-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-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: 1357150007 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The round down occurs towards the beginning of the function. Push it down after throttling has occurred. This is to support adding further transformations to 'alloc_blocks' that might not preserve power-of-two alignment (and thus could lead to rounding down multiple times). Signed-off-by: Brian Foster --- fs/xfs/xfs_iomap.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index bd7c060..b2002a5 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -329,13 +329,14 @@ xfs_iomap_prealloc_size( goto check_writeio; /* - * rounddown_pow_of_two() returns an undefined result - * if we pass in alloc_blocks = 0. Hence the "+ 1" to - * ensure we always pass in a non-zero value. + * MAXEXTLEN is not a power of two value but we round the prealloc down + * to the nearest power of two value after throttling. To prevent the + * round down from unconditionally reducing the maximum supported prealloc + * size, we round up first, apply appropriate throttling, round down and + * cap the value to MAXEXTLEN. */ - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; - alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, - rounddown_pow_of_two(alloc_blocks)); + alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), + XFS_B_TO_FSB(mp, XFS_ISIZE(ip))); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); freesp = mp->m_sb.sb_fdblocks; @@ -352,6 +353,14 @@ xfs_iomap_prealloc_size( } if (shift) alloc_blocks >>= shift; + /* + * rounddown_pow_of_two() returns an undefined result if we pass in + * alloc_blocks = 0. + */ + if (alloc_blocks) + alloc_blocks = rounddown_pow_of_two(alloc_blocks); + if (alloc_blocks > MAXEXTLEN) + alloc_blocks = MAXEXTLEN; check_writeio: if (alloc_blocks < mp->m_writeio_blocks) -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:04:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I40nj024764 for ; Wed, 2 Jan 2013 12:04:00 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F11DD8F8040 for ; Wed, 2 Jan 2013 10:06:47 -0800 (PST) X-ASG-Debug-ID: 1357150006-04bdf043124407f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id usma9FX5qdhp7jIo for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) 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 r02I6kTu006927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6jrQ005599 for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2EC39120090; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 0/7] speculative preallocation quota throttling Date: Wed, 2 Jan 2013 13:08:04 -0500 X-ASG-Orig-Subj: [PATCH v2 0/7] speculative preallocation quota throttling Message-Id: <1357150091-37530-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: 1357150007 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi all, This is v2 of the speculative prealloc. throttling set. The primary changes are to move the algorithm to a logarithmic throttler (akin to current ENOSPC throttling) and adjust the implementation to separate throttle trigger logic from the throttle itself. This has seen some decent sanity testing so far... several xfstests runs and some tests that involve driving 32 threads into various limits to measure effective use of free space (results below). One thing I noticed is that this scheme is less effective as the linear throttling approach at smaller limits because the low free space trigger is small relative to our maximum preallocation size (i.e., 5% of a 320GB limit is 16GB, and the max prealloc size is 8GB). I was a bit confused by the behavior here as compared to the global prealloc throttling (which works quite well at a comparable fs size), so I ran a little experiment to run this same test into global ENOSPC in a version of XFS without the ENOSPC flush/retry sequence and reproduced a similar reduction in effectiveness (e.g., the test stops at 285GB used vs. 320GB). To summarize, while the flush/retry might not directly free up this space, I suspect the time spent scanning and retrying indirectly allows this test to carry forward. I don't think this is necessarily a drawback of this approach, just a point of clarification for myself and a data point that suggests the combination of this throttle mechanism and an introduction of an eofblocks scan/retry sequence[1] should work together to provide good behavior at smaller limits or at scale. Brian [1] - http://oss.sgi.com/archives/xfs/2012-12/msg00112.html --- Test Results Run 32 writers (10GB each) into a quota limit with the remaining free space (i.e., limit-320GB) pre-consumed via fallocate: iozone -w -c -e -i 0 -+n -r 4k -s 10g -t 32 -F /mnt/data/file{0..31} Results measured in space consumed prior to the test stopping either due to completion or error (EDQUOT/ENOSPC). 320GB is the ideal result: 512GB uquota limit - Baseline - 273GB - Throttling - 291GB 1TB uquota limit: - Baseline - 275GB - Throttling - 293GB 5TB uquota limit: - Baseline - 273GB - Throttling - 321GB (no error) I also ran a test with a 512GB pquota limit. The space usage remains at around 320GB because pquotas result in ENOSPC, but the delalloc_enospc tracepoint is only triggered 136 times with throttling vs. 3940318 without. v2: - Fix up xfs_iomap_prealloc_size() rounding (patch 2). - Add pre-calculated fields to xfs_dquot to support throttling. - Move to logarithmic (shift) throttler and finer tuned trigger/throttle logic. Brian Foster (7): xfs: reorganize xfs_iomap_prealloc_size to remove indentation xfs: push rounddown_pow_of_two() to after prealloc throttle xfs: cap prealloc size to free space before shift xfs: pass xfs_dquot to xfs_qm_adjust_dqlimits() instead of xfs_disk_dquot_t xfs: xfs_dquot prealloc throttling watermarks and low free space xfs: add quota-driven speculative preallocation throttling xfs: xfs_iomap_prealloc_size() tracepoint fs/xfs/xfs_dquot.c | 46 +++++++++++++- fs/xfs/xfs_dquot.h | 15 ++++- fs/xfs/xfs_iomap.c | 150 +++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_qm.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 1 + fs/xfs/xfs_trace.h | 24 +++++++ fs/xfs/xfs_trans_dquot.c | 2 +- 7 files changed, 207 insertions(+), 33 deletions(-) -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:03:58 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_48, TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I3wZb024747 for ; Wed, 2 Jan 2013 12:03:58 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 456E4AC003 for ; Wed, 2 Jan 2013 10:06:49 -0800 (PST) X-ASG-Debug-ID: 1357150008-04cb6c05a59d5910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HBWRi0JuBCttzm6L for ; Wed, 02 Jan 2013 10:06:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6lxx006939 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r02I6lZ4023078 for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 73C43120094; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 5/7] xfs: xfs_dquot prealloc throttling watermarks and low free space Date: Wed, 2 Jan 2013 13:08:09 -0500 X-ASG-Orig-Subj: [PATCH v2 5/7] xfs: xfs_dquot prealloc throttling watermarks and low free space Message-Id: <1357150091-37530-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1357150008 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Enable tracking of high and low watermarks for preallocation throttling of files under quota restrictions. These values are calculated when the quota limit is read from disk or modified and cached for later use by the throttling algorithm. The high watermark specifies when preallocation is disabled, the low watermark specifies when throttling is enabled and the low free space data structure contains precalculated low free space limits to serve as input to determine the level of throttling required. Note that the low free space data structure is based on the existing global low free space data structure with the exception of using three stages (5%, 3% and 1%) rather than five to reduce the impact of xfs_dquot memory overhead. Signed-off-by: Brian Foster --- fs/xfs/xfs_dquot.c | 43 +++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_dquot.h | 13 +++++++++++++ fs/xfs/xfs_qm_syscalls.c | 1 + 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index cc52462..c459b00 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -90,13 +90,18 @@ xfs_qm_adjust_dqlimits( { xfs_quotainfo_t *q = mp->m_quotainfo; xfs_disk_dquot_t *d = &dq->q_core; + int prealloc = 0; ASSERT(d->d_id); - if (q->qi_bsoftlimit && !d->d_blk_softlimit) + if (q->qi_bsoftlimit && !d->d_blk_softlimit) { d->d_blk_softlimit = cpu_to_be64(q->qi_bsoftlimit); - if (q->qi_bhardlimit && !d->d_blk_hardlimit) + prealloc = 1; + } + if (q->qi_bhardlimit && !d->d_blk_hardlimit) { d->d_blk_hardlimit = cpu_to_be64(q->qi_bhardlimit); + prealloc = 1; + } if (q->qi_isoftlimit && !d->d_ino_softlimit) d->d_ino_softlimit = cpu_to_be64(q->qi_isoftlimit); if (q->qi_ihardlimit && !d->d_ino_hardlimit) @@ -105,6 +110,9 @@ xfs_qm_adjust_dqlimits( d->d_rtb_softlimit = cpu_to_be64(q->qi_rtbsoftlimit); if (q->qi_rtbhardlimit && !d->d_rtb_hardlimit) d->d_rtb_hardlimit = cpu_to_be64(q->qi_rtbhardlimit); + + if (prealloc) + xfs_dquot_init_prealloc(dq); } /* @@ -249,6 +257,34 @@ xfs_qm_init_dquot_blk( xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1); } +/* + * Initialize the preallocation throttling watermarks and low free space table. + * The lo/hi watermarks correspond to the soft and hard limits by default. If a + * soft limit is not specified, we use 95% of the hard limit. + */ +void +xfs_dquot_init_prealloc(struct xfs_dquot *dqp) +{ + int i; + int pct = 1; + + dqp->q_prealloc_hi_wmark = be64_to_cpu(dqp->q_core.d_blk_hardlimit); + dqp->q_prealloc_lo_wmark = be64_to_cpu(dqp->q_core.d_blk_softlimit); + if (!dqp->q_prealloc_lo_wmark) { + dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark; + do_div(dqp->q_prealloc_lo_wmark, 100); + dqp->q_prealloc_lo_wmark *= 95; + } + + for (i = 0; i < XFS_QLOWSP_MAX; i++) { + __uint64_t space = dqp->q_prealloc_hi_wmark; + + do_div(space, 100); + dqp->q_low_space[i] = space * pct; + pct += XFS_QLOWSP_PCNT_INCR; + } +} + static void xfs_dquot_buf_verify( struct xfs_buf *bp) @@ -655,6 +691,9 @@ xfs_qm_dqread( dqp->q_res_icount = be64_to_cpu(ddqp->d_icount); dqp->q_res_rtbcount = be64_to_cpu(ddqp->d_rtbcount); + /* initialize dquot prealloc throttling watermarks */ + xfs_dquot_init_prealloc(dqp); + /* Mark the buf so that this will stay incore a little longer */ xfs_buf_set_ref(bp, XFS_DQUOT_REF); diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 69491b6..7b026fe 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -32,6 +32,14 @@ struct xfs_mount; struct xfs_trans; +enum { + XFS_QLOWSP_1_PCNT = 0, + XFS_QLOWSP_3_PCNT, + XFS_QLOWSP_5_PCNT, + XFS_QLOWSP_MAX +}; +#define XFS_QLOWSP_PCNT_INCR 2 + /* * The incore dquot structure */ @@ -51,6 +59,9 @@ typedef struct xfs_dquot { xfs_qcnt_t q_res_bcount; /* total regular nblks used+reserved */ xfs_qcnt_t q_res_icount; /* total inos allocd+reserved */ xfs_qcnt_t q_res_rtbcount;/* total realtime blks used+reserved */ + xfs_qcnt_t q_prealloc_lo_wmark;/* prealloc throttle wmark */ + xfs_qcnt_t q_prealloc_hi_wmark;/* prealloc disabled wmark */ + int64_t q_low_space[XFS_QLOWSP_MAX]; struct mutex q_qlock; /* quota lock */ struct completion q_flush; /* flush completion queue */ atomic_t q_pincount; /* dquot pin count */ @@ -153,6 +164,8 @@ extern void xfs_qm_dqput(xfs_dquot_t *); extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); +extern void xfs_dquot_init_prealloc(struct xfs_dquot *); + static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) { xfs_dqlock(dqp); diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 5f53e75..f486d85 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -528,6 +528,7 @@ xfs_qm_scall_setqlim( if (hard == 0 || hard >= soft) { ddq->d_blk_hardlimit = cpu_to_be64(hard); ddq->d_blk_softlimit = cpu_to_be64(soft); + xfs_dquot_init_prealloc(dqp); if (id == 0) { q->qi_bhardlimit = hard; q->qi_bsoftlimit = soft; -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:03:58 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I3wfL024740 for ; Wed, 2 Jan 2013 12:03:58 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 08380AC001 for ; Wed, 2 Jan 2013 10:06:48 -0800 (PST) X-ASG-Debug-ID: 1357150007-04cb6c05a69d5910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uGt1JBs7X0PWq02I for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6lZL021632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r02I6lmW023077 for ; Wed, 2 Jan 2013 13:06:47 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8D254120096; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 7/7] xfs: xfs_iomap_prealloc_size() tracepoint Date: Wed, 2 Jan 2013 13:08:11 -0500 X-ASG-Orig-Subj: [PATCH v2 7/7] xfs: xfs_iomap_prealloc_size() tracepoint Message-Id: <1357150091-37530-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1357150007 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add a tracepoint to provide some feedback on preallocation size calculation. Signed-off-by: Brian Foster --- fs/xfs/xfs_iomap.c | 3 +++ fs/xfs/xfs_trace.h | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 00cc364..1940977 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -449,6 +449,9 @@ check_writeio: if (alloc_blocks < mp->m_writeio_blocks) alloc_blocks = mp->m_writeio_blocks; + trace_xfs_iomap_prealloc_size(ip, alloc_blocks, shift, + mp->m_writeio_blocks); + return alloc_blocks; } diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 2e137d4..7371acf 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -618,6 +618,30 @@ DECLARE_EVENT_CLASS(xfs_iref_class, (char *)__entry->caller_ip) ) +TRACE_EVENT(xfs_iomap_prealloc_size, + TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t blocks, int shift, + unsigned int writeio_blocks), + TP_ARGS(ip, blocks, shift, writeio_blocks), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fsblock_t, blocks) + __field(int, shift) + __field(unsigned int, writeio_blocks) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->blocks = blocks; + __entry->shift = shift; + __entry->writeio_blocks = writeio_blocks; + ), + TP_printk("dev %d:%d ino 0x%llx prealloc blocks %llu shift %d " + "m_writeio_blocks %u", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, + __entry->blocks, __entry->shift, __entry->writeio_blocks) +) + #define DEFINE_IREF_EVENT(name) \ DEFINE_EVENT(xfs_iref_class, name, \ TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:04:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I40XK024762 for ; Wed, 2 Jan 2013 12:04:00 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01DDC304066 for ; Wed, 2 Jan 2013 10:06:48 -0800 (PST) X-ASG-Debug-ID: 1357150006-04cbb035a7993b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FGDxCofM4xzthmUM for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) 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 r02I6kqL002204 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r02I6je2025272 for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3BB0012000A; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 1/7] xfs: reorganize xfs_iomap_prealloc_size to remove indentation Date: Wed, 2 Jan 2013 13:08:05 -0500 X-ASG-Orig-Subj: [PATCH v2 1/7] xfs: reorganize xfs_iomap_prealloc_size to remove indentation Message-Id: <1357150091-37530-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-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: 1357150007 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The majority of xfs_iomap_prealloc_size() executes within the check for lack of default I/O size. Reverse the logic to remove the extra indentation. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 55 ++++++++++++++++++++++++++------------------------- 1 files changed, 28 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index add06b4..bd7c060 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -322,37 +322,38 @@ xfs_iomap_prealloc_size( struct xfs_inode *ip) { xfs_fsblock_t alloc_blocks = 0; + int shift = 0; + int64_t freesp; - if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { - int shift = 0; - int64_t freesp; + if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) + goto check_writeio; - /* - * rounddown_pow_of_two() returns an undefined result - * if we pass in alloc_blocks = 0. Hence the "+ 1" to - * ensure we always pass in a non-zero value. - */ - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; - alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, - rounddown_pow_of_two(alloc_blocks)); - - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - freesp = mp->m_sb.sb_fdblocks; - if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { - shift = 2; - if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) - shift++; - if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) - shift++; - if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) - shift++; - if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) - shift++; - } - if (shift) - alloc_blocks >>= shift; + /* + * rounddown_pow_of_two() returns an undefined result + * if we pass in alloc_blocks = 0. Hence the "+ 1" to + * ensure we always pass in a non-zero value. + */ + alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; + alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, + rounddown_pow_of_two(alloc_blocks)); + + xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + freesp = mp->m_sb.sb_fdblocks; + if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { + shift = 2; + if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) + shift++; } + if (shift) + alloc_blocks >>= shift; +check_writeio: if (alloc_blocks < mp->m_writeio_blocks) alloc_blocks = mp->m_writeio_blocks; -- 1.7.7.6 From bfoster@redhat.com Wed Jan 2 12:04:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02I402c024766 for ; Wed, 2 Jan 2013 12:04:00 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18436AC001 for ; Wed, 2 Jan 2013 10:06:47 -0800 (PST) X-ASG-Debug-ID: 1357150006-04cb6c05a79d5900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RXlBTEFjPZMlrAuA for ; Wed, 02 Jan 2013 10:06:47 -0800 (PST) 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 r02I6kWX021624 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r02I6jQ2006690 for ; Wed, 2 Jan 2013 13:06:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 67429120093; Wed, 2 Jan 2013 13:08:11 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 4/7] xfs: pass xfs_dquot to xfs_qm_adjust_dqlimits() instead of xfs_disk_dquot_t Date: Wed, 2 Jan 2013 13:08:08 -0500 X-ASG-Orig-Subj: [PATCH v2 4/7] xfs: pass xfs_dquot to xfs_qm_adjust_dqlimits() instead of xfs_disk_dquot_t Message-Id: <1357150091-37530-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1357150091-37530-1-git-send-email-bfoster@redhat.com> References: <1357150091-37530-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: 1357150006 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Modify xfs_qm_adjust_dqlimits() to take the xfs_dquot as a parameter instead of just the xfs_disk_dquot_t so we can update in-memory fields if necessary. Signed-off-by: Brian Foster --- fs/xfs/xfs_dquot.c | 3 ++- fs/xfs/xfs_dquot.h | 2 +- fs/xfs/xfs_qm.c | 2 +- fs/xfs/xfs_trans_dquot.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 9e1bf52..cc52462 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -86,9 +86,10 @@ xfs_qm_dqdestroy( void xfs_qm_adjust_dqlimits( xfs_mount_t *mp, - xfs_disk_dquot_t *d) + struct xfs_dquot *dq) { xfs_quotainfo_t *q = mp->m_quotainfo; + xfs_disk_dquot_t *d = &dq->q_core; ASSERT(d->d_id); diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index c694a84..69491b6 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -146,7 +146,7 @@ extern void xfs_qm_dqunpin_wait(xfs_dquot_t *); extern void xfs_qm_adjust_dqtimers(xfs_mount_t *, xfs_disk_dquot_t *); extern void xfs_qm_adjust_dqlimits(xfs_mount_t *, - xfs_disk_dquot_t *); + struct xfs_dquot *); extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, xfs_dqid_t, uint, uint, xfs_dquot_t **); extern void xfs_qm_dqput(xfs_dquot_t *); diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 60eff47..87c95fe 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1057,7 +1057,7 @@ xfs_qm_quotacheck_dqadjust( * There are no timers for the default values set in the root dquot. */ if (dqp->q_core.d_id) { - xfs_qm_adjust_dqlimits(mp, &dqp->q_core); + xfs_qm_adjust_dqlimits(mp, dqp); xfs_qm_adjust_dqtimers(mp, &dqp->q_core); } diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 0c7fa54..5eaf6ce 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -412,7 +412,7 @@ xfs_trans_apply_dquot_deltas( * Start/reset the timer(s) if needed. */ if (d->d_id) { - xfs_qm_adjust_dqlimits(tp->t_mountp, d); + xfs_qm_adjust_dqlimits(tp->t_mountp, dqp); xfs_qm_adjust_dqtimers(tp->t_mountp, d); } -- 1.7.7.6 From adahl@sgi.com Wed Jan 2 12:17:30 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_05 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02IHUFY025986 for ; Wed, 2 Jan 2013 12:17:30 -0600 Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2873D304048 for ; Wed, 2 Jan 2013 10:20:21 -0800 (PST) Received: from localhost.localdomain (128.162.232.127) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 2 Jan 2013 12:20:20 -0600 Message-ID: <50E47A64.3020003@sgi.com> Date: Wed, 2 Jan 2013 12:20:20 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121029 Thunderbird/16.0.2 MIME-Version: 1.0 To: Subject: [PATCH] xfstests: SGI license update Content-Type: multipart/mixed; boundary="------------000802060809000004070807" X-Originating-IP: [128.162.232.127] --------------000802060809000004070807 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------000802060809000004070807 Content-Type: text/x-patch; name="update-looptest-sgi-license.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="update-looptest-sgi-license.patch" Updated SGI license in looptest.c Signed-off-by: Andrew Dahl --- src/looptest.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) Index: xfstests/src/looptest.c =================================================================== --- xfstests.orig/src/looptest.c +++ xfstests/src/looptest.c @@ -1,29 +1,18 @@ /* - * Copyright 2002 Silicon Graphics, Inc. ALL RIGHTS RESERVED - * - * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND - * - * Use, duplication or disclosure by the Government is subject to restrictions - * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the - * Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 - * and/or in similar or successor clauses in the FAR, or the DOD or NASA FAR - * Supplement. Unpublished -- rights reserved under the Copyright Laws - * of the United States. Contractor/manufacturer is Silicon Graphics, Inc., - * 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. - * - * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI - * - * The copyright notice above does not evidence any actual or intended - * publication or disclosure of this source code, which includes information - * that is the confidential and/or proprietary, and is a trade secret, - * of Silicon Graphics, Inc. Any use, duplication or disclosure not - * specifically authorized in writing by Silicon Graphics is strictly - * prohibited. ANY DUPLICATION, MODIFICATION, DISTRIBUTION,PUBLIC PERFORMANCE, - * OR PUBLIC DISPLAY OF THIS SOURCE CODE WITHOUT THE EXPRESS WRITTEN CONSENT - * OF SILICON GRAPHICS, INC. IS STRICTLY PROHIBITED. THE RECEIPT OR POSSESSION - * OF THIS SOURCE CODE AND/OR INFORMATION DOES NOT CONVEY ANY RIGHTS - * TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, OR TO MANUFACTURE, USE, - * OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. + * Copyright (c) 2012 SGI. 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 */ /* dxm - 28/2/2 */ --------------000802060809000004070807-- From david@fromorbit.com Wed Jan 2 15:45:59 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02LjxjP037888 for ; Wed, 2 Jan 2013 15:45:59 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B2EB48F8035 for ; Wed, 2 Jan 2013 13:48:47 -0800 (PST) X-ASG-Debug-ID: 1357163298-04cbb035a599ae20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id oiEJm4zMTsPBiPAN for ; Wed, 02 Jan 2013 13:48:18 -0800 (PST) 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: Ah4YAAOq5FB5LB7X/2dsb2JhbABFgX+DUrF1hQMCdxdzgh4BAQU6HCMQCAMYCSUPBSUDIROIErc5FIxDY4J/YQOWC5BJgwg Received: from ppp121-44-30-215.lns20.syd6.internode.on.net (HELO dastard) ([121.44.30.215]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Jan 2013 08:18:17 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TqWAP-0004Wv-TY; Thu, 03 Jan 2013 08:48:05 +1100 Date: Thu, 3 Jan 2013 08:48:05 +1100 From: Dave Chinner To: Jeffrey Cc: stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: xfsdump INTERRUPT issue Message-ID: <20130102214805.GC3120@dastard> X-ASG-Orig-Subj: Re: xfsdump INTERRUPT issue References: <50D2A038.2040501@hardwarefreak.com> <20121221032026.GD15182@dastard> <50D49899.2090901@hardwarefreak.com> <9AF752E5-941B-491F-A7DE-5D978DFFB3B0@dhnet.us> <50D57382.2060900@hardwarefreak.com> <50D5DB70.3020308@gmail.com> <20121222234532.GH15182@dastard> <50D70A4B.8040904@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50D70A4B.8040904@gmail.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: 1357163298 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.118764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Dec 23, 2012 at 08:42:35AM -0500, Jeffrey wrote: > Here's my output: > > # xfs_repair -n -r /dev/sda3 /dev/sda2 .... SO nothing apparentyl wrong with the filesytem on disk, so the corruption is occurring in memory and the oops is occurring before anything bad gets written to disk. I've tried reproducing it, but I'm not having any luck at the moment. Can you send me an ls -lR output so i can see the rough structure of the files being backed up? (Send it privately to me if you don't want everyone to see the contents of your disk....). Cheers, Dave. -- Dave Chinner david@fromorbit.com From kuszmaul@gmail.com Wed Jan 2 15:48:41 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02LmfJo038072 for ; Wed, 2 Jan 2013 15:48:41 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 804DA304039 for ; Wed, 2 Jan 2013 13:51:29 -0800 (PST) X-ASG-Debug-ID: 1357163488-04bdf0430f4488c0001-NocioJ Received: from mail-ia0-f177.google.com (mail-ia0-f177.google.com [209.85.210.177]) by cuda.sgi.com with ESMTP id szwZW2uqfmTPD5Gt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 02 Jan 2013 13:51:28 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] Received: by mail-ia0-f177.google.com with SMTP id u21so12211923ial.22 for ; Wed, 02 Jan 2013 13:51:28 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=oa6I7Q5c7LNqVDsUTze9OHBGMwbl8NmgE0mAMaQ5vP0=; b=nDdIrNHFc8hFdcDTDO7hyZ+L5reMqntCxrwsGvrPXTMJp3m6ROSMaRPyBLIu+Y5r9v RoK48LG8wzjGuF2CnJP3busCASOueEJ+o6AgkG4CSfK6yhyDFCT8w6jiFRM8qJPW67a9 IG3HJ0rGEIWgq1iz6bRoat2UFIFJAhKeXZN9RYtWBaMggmslTDrhrIJ7l2WfT8z2+TOW 8dP0a85QFg+l+EOHdvYYBLFTFZ6WQxW91sygetpDWFFDa/yszo1+0kqDnL1f0qhN+AcT im5xgCP7GWqepl5vzivFUD/Jf1Y+hUatuV71Xy42dqJAQwnDZ61pCRPdD/U/0Da5Fezl nZzQ== Received: by 10.50.33.147 with SMTP id r19mr42263268igi.73.1357163487984; Wed, 02 Jan 2013 13:51:27 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Wed, 2 Jan 2013 13:51:07 -0800 (PST) From: "Bradley C. Kuszmaul" Date: Wed, 2 Jan 2013 16:51:07 -0500 Message-ID: Subject: hole punching performance To: xfs@oss.sgi.com X-ASG-Orig-Subj: hole punching performance Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ia0-f177.google.com[209.85.210.177] X-Barracuda-Start-Time: 1357163488 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-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.2.118764 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 If I use hole-punching, what will happen to the performance of my application? I have a multithreaded application that creates large files (many gigabytes per file). The application sometimes wants to punch holes (say 1 megabyte in size). On Redhat 6, I've measured that punching holes requires about 2ms (this with a battery-backed up RAID controller), which is slower than I was hoping for, but it's probably OK. The throughput is only about 2ms per hole-punch even if I have lots of threads punching holes in lots of different files at the same time. The question I have: What will happen to the performance of other threads doing read() and write() operations? Will hole-punching slow down the other read() and write() operations running in other threads? I'm willing to do some measurements, but I'm not sure what I should be watching out for, so if you can educate me about it, I'd appreciate it. -Bradley From sandeen@sandeen.net Wed Jan 2 16:25:47 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02MPllP039874 for ; Wed, 2 Jan 2013 16:25:47 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 754C530405F for ; Wed, 2 Jan 2013 14:28:35 -0800 (PST) X-ASG-Debug-ID: 1357165713-04bdf07fae3bb620001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dGdGbbG9bnP37baj for ; Wed, 02 Jan 2013 14:28:33 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2AD2F6035AAC for ; Wed, 2 Jan 2013 16:28:33 -0600 (CST) Message-ID: <50E4B490.3000102@sandeen.net> Date: Wed, 02 Jan 2013 16:28:32 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: test multiply-logged inodes & continued transactions References: <5092A1DE.10609@redhat.com> X-ASG-Orig-Subj: [PATCH] xfstests: test multiply-logged inodes & continued transactions In-Reply-To: <5092A1DE.10609@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357165713 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.118766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- New test for 2 xfs_logprint error cases: As xlog_print_trans_inode() stands today, it will error out if more than one flag is set on f->ilf_fields: xlog_print_trans_inode: illegal inode type but this is a perfectly valid case, to have i.e. a data and an attr flag set. and: xlog_print_trans_inode() has a special case for 2 specific op_head->oh_len lengths. If it matches sizeof(xfs_inode_log_format_32_t) or sizeof(xfs_inode_log_format_64_t), it assumes that it's got an inode, and attempts to convert it and print it accordingly. However, if we arrive here via an op header which is continued, then the length is simply a continuation of the previous op, and it might *randomly* match the size of one of the inode log formats, and thus get parsed incorrectly. Test both of these cases. Signed-off-by: Eric Sandeen --- diff --git a/295 b/295 new file mode 100755 index 0000000..36ef284 --- /dev/null +++ b/295 @@ -0,0 +1,81 @@ +#! /bin/bash +# FS QA Test No. 295 +# +# Test xfs_logprint w/ multiply-logged inodes & continued transactions +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os IRIX Linux +_require_scratch + +rm -f $seq.full + +_scratch_mkfs -l size=2560b >/dev/null 2>&1 + +# Should yield a multiply-logged inode, thanks to xattr +# Old logprint says this, then coredumps: +# xlog_print_trans_inode: illegal inode type +_scratch_mount +echo hello > $SCRATCH_MNT/hello; setfattr -n user.name -v value $SCRATCH_MNT/hello +_scratch_unmount +_scratch_xfs_logprint 2>&1 >> $seq.full + +# Now go for a continued transaction +# The trick here is to get a transaction which is exactly the size of a +# xfs_inode_log_format_32_t or xfs_inode_log_format_64_t +# Prior to the bugfix, this was parsed like an inode due to the size +# match, not as a continued transaction. If that happens we'll see: +# xfs_logprint: unknown log operation type (494e) + +_scratch_mkfs -l size=2560b >/dev/null 2>&1 +_scratch_mount +for I in `seq 0 8192`; do + echo a >> $SCRATCH_MNT/cat + touch $SCRATCH_MNT/tmp$I +done +_scratch_unmount +_scratch_xfs_logprint 2>&1 >> $seq.full + +# success, all done +status=0 +exit diff --git a/295.out b/295.out new file mode 100644 index 0000000..9db122b --- /dev/null +++ b/295.out @@ -0,0 +1 @@ +QA output created by 295 diff --git a/group b/group index 0396ec1..a51e05a 100644 --- a/group +++ b/group @@ -412,3 +412,4 @@ deprecated 293 auto rw prealloc quick ioctl 294 auto rw prealloc quick ioctl 291 repair +295 auto logprint quick From sandeen@redhat.com Wed Jan 2 16:56:04 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02Mu39O041772 for ; Wed, 2 Jan 2013 16:56:04 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F258A304059 for ; Wed, 2 Jan 2013 14:58:54 -0800 (PST) X-ASG-Debug-ID: 1357167533-04bdf0430f44a310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6BvHCdkydGCEfIZM for ; Wed, 02 Jan 2013 14:58:54 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r02Mwru5011258 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 2 Jan 2013 17:58:53 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r02MwqdT025192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 2 Jan 2013 17:58:53 -0500 Message-ID: <50E4BBAC.9030604@redhat.com> Date: Wed, 02 Jan 2013 16:58:52 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/4] xfs_logprint tests & fixes X-Enigmail-Version: 1.4.6 X-ASG-Orig-Subj: [PATCH 0/4] xfs_logprint tests & fixes Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1357167534 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Resending in a straightforward series From sandeen@sandeen.net Wed Jan 2 16:59:32 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_44 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02MxWsR042111 for ; Wed, 2 Jan 2013 16:59:32 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 345AC8F8040 for ; Wed, 2 Jan 2013 15:02:19 -0800 (PST) X-ASG-Debug-ID: 1357167738-04bdf0431044a450001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DpOEgpomqfOmLE1Z for ; Wed, 02 Jan 2013 15:02:18 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 10FA66035AAD; Wed, 2 Jan 2013 17:02:18 -0600 (CST) Message-ID: <50E4BC79.3060706@sandeen.net> Date: Wed, 02 Jan 2013 17:02:17 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: [PATCH 1/4] xfs_logprint: Handle multiply-logged inode fields References: <50E4BBAC.9030604@redhat.com> X-ASG-Orig-Subj: [PATCH 1/4] xfs_logprint: Handle multiply-logged inode fields In-Reply-To: <50E4BBAC.9030604@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357167738 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.118768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As xlog_print_trans_inode() stands today, it will error out if more than one flag is set on f->ilf_fields: xlog_print_trans_inode: illegal inode type but this is a perfectly valid case, to have i.e. a data and an attr flag set. Following is a pretty big reworking of the function to handle more than one field type set, mostly following xlog_recover_inode_pass2() for logic. I've tested this by a simple test such as creating one file on an selinux box, so that data+attr is set, and logprinting; I've also tested by running logprint after subsequent xfstest runs (although we hit other bugs that way). Signed-off-by: Eric Sandeen --- diff --git a/logprint/log_misc.c b/logprint/log_misc.c index e42e108..2af67fd 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -657,97 +657,76 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) /* does anything come next */ op_head = (xlog_op_header_t *)*ptr; - switch (f->ilf_fields & XFS_ILOG_NONCORE) { - case XFS_ILOG_DEXT: { - ASSERT(f->ilf_size == 3); - (*i)++; - xlog_print_op_header(op_head, *i, ptr); - printf(_("EXTENTS inode data\n")); - *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { - return 1; - } - break; - } - case XFS_ILOG_DBROOT: { - ASSERT(f->ilf_size == 3); - (*i)++; - xlog_print_op_header(op_head, *i, ptr); - printf(_("BTREE inode data\n")); - *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { - return 1; - } - break; - } - case XFS_ILOG_DDATA: { - ASSERT(f->ilf_size == 3); - (*i)++; - xlog_print_op_header(op_head, *i, ptr); - printf(_("LOCAL inode data\n")); - if (mode == S_IFDIR) { - xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); - } - *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { - return 1; - } - break; - } - case XFS_ILOG_AEXT: { - ASSERT(f->ilf_size == 3); + + switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { + case XFS_ILOG_DEV: + printf(_("DEV inode: no extra region\n")); + break; + case XFS_ILOG_UUID: + printf(_("UUID inode: no extra region\n")); + break; + } + + /* Only the inode core is logged */ + if (f->ilf_size == 2) + return 0; + + ASSERT(f->ilf_size <= 4); + ASSERT((f->ilf_size == 3) || (f->ilf_fields & XFS_ILOG_AFORK)); + + if (f->ilf_fields & XFS_ILOG_DFORK) { (*i)++; xlog_print_op_header(op_head, *i, ptr); - printf(_("EXTENTS inode attr\n")); - *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { - return 1; + + switch (f->ilf_fields & XFS_ILOG_DFORK) { + case XFS_ILOG_DEXT: + printf(_("EXTENTS inode data\n")); + break; + case XFS_ILOG_DBROOT: + printf(_("BTREE inode data\n")); + break; + case XFS_ILOG_DDATA: + printf(_("LOCAL inode data\n")); + if (mode == S_IFDIR) + xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); + break; + default: + ASSERT((f->ilf_fields & XFS_ILOG_DFORK) == 0); + break; } - break; - } - case XFS_ILOG_ABROOT: { - ASSERT(f->ilf_size == 3); - (*i)++; - xlog_print_op_header(op_head, *i, ptr); - printf(_("BTREE inode attr\n")); + *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { + if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) return 1; - } - break; - } - case XFS_ILOG_ADATA: { - ASSERT(f->ilf_size == 3); + op_head = (xlog_op_header_t *)*ptr; + } + + if (f->ilf_fields & XFS_ILOG_AFORK) { (*i)++; xlog_print_op_header(op_head, *i, ptr); - printf(_("LOCAL inode attr\n")); - if (mode == S_IFDIR) { - xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); + + switch (f->ilf_fields & XFS_ILOG_AFORK) { + case XFS_ILOG_AEXT: + printf(_("EXTENTS attr data\n")); + break; + case XFS_ILOG_ABROOT: + printf(_("BTREE attr data\n")); + break; + case XFS_ILOG_ADATA: + printf(_("LOCAL attr data\n")); + if (mode == S_IFDIR) + xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); + break; + default: + ASSERT((f->ilf_fields & XFS_ILOG_AFORK) == 0); + break; } *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { + if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) return 1; - } - break; - } - case XFS_ILOG_DEV: { - ASSERT(f->ilf_size == 2); - printf(_("DEV inode: no extra region\n")); - break; - } - case XFS_ILOG_UUID: { - ASSERT(f->ilf_size == 2); - printf(_("UUID inode: no extra region\n")); - break; - } - case 0: { - ASSERT(f->ilf_size == 2); - break; - } - default: { - xlog_panic(_("xlog_print_trans_inode: illegal inode type")); - } + op_head = (xlog_op_header_t *)*ptr; } + return 0; } /* xlog_print_trans_inode */ From sandeen@sandeen.net Wed Jan 2 17:01:02 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02N124N042288 for ; Wed, 2 Jan 2013 17:01:02 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8247C8F8037 for ; Wed, 2 Jan 2013 15:03:53 -0800 (PST) X-ASG-Debug-ID: 1357167832-04cb6c05a79dea10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qAbo14qbBXPEnYDK for ; Wed, 02 Jan 2013 15:03:52 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5B1E16035AAD; Wed, 2 Jan 2013 17:03:52 -0600 (CST) Message-ID: <50E4BCD8.1040802@sandeen.net> Date: Wed, 02 Jan 2013 17:03:52 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: [PATCH 2/4] xfs_logprint: Handle continued inode transactions References: <50E4BBAC.9030604@redhat.com> X-ASG-Orig-Subj: [PATCH 2/4] xfs_logprint: Handle continued inode transactions In-Reply-To: <50E4BBAC.9030604@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357167832 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.118768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xlog_print_trans_inode() has a special case for 2 specific op_head->oh_len lengths. If it matches sizeof(xfs_inode_log_format_32_t) or sizeof(xfs_inode_log_format_64_t), it assumes that it's got an inode, and attempts to convert it and print it accordingly. However, if we arrive here via an op header which is continued, then the length is simply a continuation of the previous op, and it might *randomly* match the size of one of the inode log formats, and thus get parsed incorrectly. Change the caller to pass in whether or not it's a continued op, so that it can be handled correctly. Tested by running xfs_logprint of TEST_DEV in xfsprogs after sequential tests; without this change it gets off in the weeds eventually; with this fix, it lasts longer, until it hits some other yet-unfixed logprint bug... Signed-off-by: Eric Sandeen --- diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 2af67fd..b7af4ae 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -595,7 +595,11 @@ xlog_print_dir_sf(xfs_dir_shortform_t *sfp, int size) } int -xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) +xlog_print_trans_inode(xfs_caddr_t *ptr, + int len, + int *i, + int num_ops, + boolean_t continued) { xfs_icdinode_t dino; xlog_op_header_t *op_head; @@ -617,8 +621,9 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) memmove(&src_lbuf, *ptr, MIN(sizeof(xfs_inode_log_format_64_t), len)); (*i)++; /* bump index */ *ptr += len; - if (len == sizeof(xfs_inode_log_format_32_t) || - len == sizeof(xfs_inode_log_format_64_t)) { + if (!continued && + (len == sizeof(xfs_inode_log_format_32_t) || + len == sizeof(xfs_inode_log_format_64_t))) { f = xfs_inode_item_format_convert((char*)&src_lbuf, len, &dst_lbuf); printf(_("INODE: ")); printf(_("#regs: %d ino: 0x%llx flags: 0x%x dsize: %d\n"), @@ -924,16 +929,18 @@ xlog_print_record(int fd, ptr = buf; for (i=0; ioh_flags, XLOG_WAS_CONT_TRANS) || + XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)); /* print transaction data */ if (print_no_data || - ((XLOG_SET(op_head->oh_flags, XLOG_WAS_CONT_TRANS) || - XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) && - be32_to_cpu(op_head->oh_len) == 0)) { + (continued && be32_to_cpu(op_head->oh_len) == 0)) { for (n = 0; n < be32_to_cpu(op_head->oh_len); n++) { printf("%c", *ptr); ptr++; @@ -962,7 +969,7 @@ xlog_print_record(int fd, case XFS_LI_INODE: { skip = xlog_print_trans_inode(&ptr, be32_to_cpu(op_head->oh_len), - &i, num_ops); + &i, num_ops, continued); break; } case XFS_LI_DQUOT: { From sandeen@sandeen.net Wed Jan 2 17:02:41 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02N2fv8042471 for ; Wed, 2 Jan 2013 17:02:41 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7650AC006 for ; Wed, 2 Jan 2013 15:05:28 -0800 (PST) X-ASG-Debug-ID: 1357167927-04cbb035a599ca40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id g9XTBDr5KV5hJIOT for ; Wed, 02 Jan 2013 15:05:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A9C5D6035AAE; Wed, 2 Jan 2013 17:05:27 -0600 (CST) Message-ID: <50E4BD37.2090805@sandeen.net> Date: Wed, 02 Jan 2013 17:05:27 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: [PATCH 3/4] xfs_logprint: kill XLOG_SET References: <50E4BBAC.9030604@redhat.com> X-ASG-Orig-Subj: [PATCH 3/4] xfs_logprint: kill XLOG_SET In-Reply-To: <50E4BBAC.9030604@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357167927 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.118768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Per Christoph's suggestion, kill off XLOG_SET macro in favor of explicit "&" tests. Signed-off-by: Eric Sandeen --- diff --git a/logprint/log_misc.c b/logprint/log_misc.c index b7af4ae..2e3dbdf 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -25,8 +25,6 @@ #define BAD_HEADER (-1) #define NO_ERROR (0) -#define XLOG_SET(f,b) (((f) & (b)) == (b)) - static int logBBsize; char *trans_type[] = { "", @@ -646,7 +644,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, op_head = (xlog_op_header_t *)*ptr; xlog_print_op_header(op_head, *i, ptr); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { + if (op_head->oh_flags & XLOG_CONTINUE_TRANS) { return f->ilf_size-1; } @@ -701,7 +699,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, } *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) + if (op_head->oh_flags & XLOG_CONTINUE_TRANS) return 1; op_head = (xlog_op_header_t *)*ptr; } @@ -727,7 +725,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, break; } *ptr += be32_to_cpu(op_head->oh_len); - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) + if (op_head->oh_flags & XLOG_CONTINUE_TRANS) return 1; op_head = (xlog_op_header_t *)*ptr; } @@ -935,8 +933,8 @@ xlog_print_record(int fd, print_xlog_op_line(); xlog_print_op_header(op_head, i, &ptr); - continued = (XLOG_SET(op_head->oh_flags, XLOG_WAS_CONT_TRANS) || - XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)); + continued = ((op_head->oh_flags & XLOG_WAS_CONT_TRANS) || + (op_head->oh_flags & XLOG_CONTINUE_TRANS)); /* print transaction data */ if (print_no_data || From sandeen@sandeen.net Wed Jan 2 17:03:29 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02N3Sxc042603 for ; Wed, 2 Jan 2013 17:03:28 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 463D6AC006 for ; Wed, 2 Jan 2013 15:06:19 -0800 (PST) X-ASG-Debug-ID: 1357167978-04cb6c05a79deb20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Ue2hOGqDDMiAJJIP for ; Wed, 02 Jan 2013 15:06:18 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id ED91B6035AAE; Wed, 2 Jan 2013 17:06:17 -0600 (CST) Message-ID: <50E4BD69.2080500@sandeen.net> Date: Wed, 02 Jan 2013 17:06:17 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: [PATCH 4/4] xfstests: test multiply-logged inodes & continued transactions References: <50E4BBAC.9030604@redhat.com> X-ASG-Orig-Subj: [PATCH 4/4] xfstests: test multiply-logged inodes & continued transactions In-Reply-To: <50E4BBAC.9030604@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357167978 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.118768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- New test for 2 xfs_logprint error cases: As xlog_print_trans_inode() stands today, it will error out if more than one flag is set on f->ilf_fields: xlog_print_trans_inode: illegal inode type but this is a perfectly valid case, to have i.e. a data and an attr flag set. and: xlog_print_trans_inode() has a special case for 2 specific op_head->oh_len lengths. If it matches sizeof(xfs_inode_log_format_32_t) or sizeof(xfs_inode_log_format_64_t), it assumes that it's got an inode, and attempts to convert it and print it accordingly. However, if we arrive here via an op header which is continued, then the length is simply a continuation of the previous op, and it might *randomly* match the size of one of the inode log formats, and thus get parsed incorrectly. Test both of these cases. Signed-off-by: Eric Sandeen --- diff --git a/295 b/295 new file mode 100755 index 0000000..36ef284 --- /dev/null +++ b/295 @@ -0,0 +1,81 @@ +#! /bin/bash +# FS QA Test No. 295 +# +# Test xfs_logprint w/ multiply-logged inodes & continued transactions +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os IRIX Linux +_require_scratch + +rm -f $seq.full + +_scratch_mkfs -l size=2560b >/dev/null 2>&1 + +# Should yield a multiply-logged inode, thanks to xattr +# Old logprint says this, then coredumps: +# xlog_print_trans_inode: illegal inode type +_scratch_mount +echo hello > $SCRATCH_MNT/hello; setfattr -n user.name -v value $SCRATCH_MNT/hello +_scratch_unmount +_scratch_xfs_logprint 2>&1 >> $seq.full + +# Now go for a continued transaction +# The trick here is to get a transaction which is exactly the size of a +# xfs_inode_log_format_32_t or xfs_inode_log_format_64_t +# Prior to the bugfix, this was parsed like an inode due to the size +# match, not as a continued transaction. If that happens we'll see: +# xfs_logprint: unknown log operation type (494e) + +_scratch_mkfs -l size=2560b >/dev/null 2>&1 +_scratch_mount +for I in `seq 0 8192`; do + echo a >> $SCRATCH_MNT/cat + touch $SCRATCH_MNT/tmp$I +done +_scratch_unmount +_scratch_xfs_logprint 2>&1 >> $seq.full + +# success, all done +status=0 +exit diff --git a/295.out b/295.out new file mode 100644 index 0000000..9db122b --- /dev/null +++ b/295.out @@ -0,0 +1 @@ +QA output created by 295 diff --git a/group b/group index 0396ec1..a51e05a 100644 --- a/group +++ b/group @@ -412,3 +412,4 @@ deprecated 293 auto rw prealloc quick ioctl 294 auto rw prealloc quick ioctl 291 repair +295 auto logprint quick From david@fromorbit.com Wed Jan 2 17:24:20 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_52,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02NOKTb044499 for ; Wed, 2 Jan 2013 17:24:20 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D3B3AC005 for ; Wed, 2 Jan 2013 15:27:10 -0800 (PST) X-ASG-Debug-ID: 1357169228-04cbb035a599d3d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id n6l7rJrRkYmYlxK8 for ; Wed, 02 Jan 2013 15:27:08 -0800 (PST) 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: AiMZAIXB5FB5LB7X/2dsb2JhbAA9CIF/tUiFAwJ3F3OCHgEBBAE6HCMFCwgDGAklDwUlAyETiA0Ft2kUjEgSTIJ/YQOWC5BJgwg Received: from ppp121-44-30-215.lns20.syd6.internode.on.net (HELO dastard) ([121.44.30.215]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Jan 2013 09:57:08 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TqXiE-0004hH-E9; Thu, 03 Jan 2013 10:27:06 +1100 Date: Thu, 3 Jan 2013 10:27:06 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130102232706.GD3120@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1357169228 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Jan 02, 2013 at 04:51:07PM -0500, Bradley C. Kuszmaul wrote: > If I use hole-punching, what will happen to the performance of my application? > > I have a multithreaded application that creates large files (many > gigabytes per file). The application sometimes wants to punch holes > (say 1 megabyte in size). > > On Redhat 6, I've measured that punching holes requires about 2ms What version of RHEL 6.x? On x <= 1, hole punching is a synchronous transaction. On x >= 2, it is an asynchronous transaction and so is much, much faster. > (this with a battery-backed up RAID controller), which is slower than > I was hoping for, but it's probably OK. The throughput is only about > 2ms per hole-punch even if I have lots of threads punching holes in > lots of different files at the same time. That sounds like synchronous transaction behaviour. A current 3.8-rc1 kernel does a hole punch in well under 2ms. Here's 10,000 hole punches being done in ~300ms: $ cat t.c #define _GNU_SOURCE #include #include #include #include int main(int argc, char *argv[]) { int i, fd; fd = open("/mnt/scratch/blah", O_CREAT|O_TRUNC|O_RDWR, 0777); perror("open"); fallocate(fd, 0, 0, 20 * 1024 * 1024 * 1024LL); for (i = 0; i < 10000; i++) { // fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, i * 8192, 4096); struct xfs_flock64 l = {0}; l.l_whence = SEEK_SET; l.l_start = i * 8192; l.l_len = 4096; ioctl(fd, XFS_IOC_UNRESVSP, &l); } close(fd); } dave@test-4:~$ gcc -O2 t.c dave@test-4:~$ rm -f /mnt/scratch/blah dave@test-4:~$ time ./a.out open: Success real 0m0.336s user 0m0.000s sys 0m0.336s dave@test-4:~$ So that means roughly 300ms/10000 = 30uS per hole punch call. I get the same result with fallocate or XFS_IOC_UNRESVSP, and I get the same result on RHEL 6.2+. > The question I have: What will happen to the performance of other > threads doing read() and write() operations? Will hole-punching slow > down the other read() and write() operations running in other threads? That all depends. Hole punching is serialised the same way as truncation - all concurrent operations to the same file are locked out while the hole punch is performed. Operations to other files will unaffected unless they are trying to allocate or free extents in the same allocation group, or you are running a kernel that does synchronous transactions and the other operations serialise on the synchronous transaction commits... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@oss.sgi.com Wed Jan 2 17:24:58 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_14,T_FRT_LITTLE autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02NOwgr044633 for ; Wed, 2 Jan 2013 17:24:58 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r02NOtEe044545; Wed, 2 Jan 2013 17:24:55 -0600 Date: Wed, 2 Jan 2013 17:24:55 -0600 Message-Id: <201301022324.r02NOtEe044545@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. for-linus-v3.8-rc1-13587-g56431cd X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ec47eb6b0b450a4e82340b6de674104de3f0dc0a X-Git-Newrev: 56431cd194ca67a899a2a01a90ee94388ade1d0b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated d69043c xfs: drop buffer io reference when a bad bio is built 3daed8b xfs: fix broken error handling in xfs_vm_writepage 42e2976 xfs: fix attr tree double split corruption 6ce377a xfs: fix reading of wrapped log data 03b1293 xfs: fix buffer shudown reference count mismatch 4b62acf xfs: don't vmap inode cluster buffers during free ca250b1 xfs: invalidate allocbt blocks moved to the free list 1e7acbb xfs: silence uninitialised f.file warning. eaef854 xfs: growfs: don't read garbage for new secondary superblocks 1f3c785 xfs: move allocation stack switch up to xfs_bmapi_allocate 326c035 xfs: introduce XFS_BMAPI_STACK_SWITCH 408cc4e xfs: zero allocation_args on the kernel stack 7e9620f xfs: only update the last_sync_lsn when a transaction completes from ec47eb6b0b450a4e82340b6de674104de3f0dc0a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d69043c42d8c6414fa28ad18d99973aa6c1c2e24 Author: Dave Chinner Date: Mon Nov 12 22:09:46 2012 +1100 xfs: drop buffer io reference when a bad bio is built Error handling in xfs_buf_ioapply_map() does not handle IO reference counts correctly. We increment the b_io_remaining count before building the bio, but then fail to decrement it in the failure case. This leads to the buffer never running IO completion and releasing the reference that the IO holds, so at unmount we can leak the buffer. This leak is captured by this assert failure during unmount: XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0, file: fs/xfs/xfs_mount.c, line: 273 This is not a new bug - the b_io_remaining accounting has had this problem for a long, long time - it's just very hard to get a zero length bio being built by this code... Further, the buffer IO error can be overwritten on a multi-segment buffer by subsequent bio completions for partial sections of the buffer. Hence we should only set the buffer error status if the buffer is not already carrying an error status. This ensures that a partial IO error on a multi-segment buffer will not be lost. This part of the problem is a regression, however. cc: Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 3daed8bc3e49b9695ae931b9f472b5b90d1965b3 Author: Dave Chinner Date: Mon Nov 12 22:09:45 2012 +1100 xfs: fix broken error handling in xfs_vm_writepage When we shut down the filesystem, it might first be detected in writeback when we are allocating a inode size transaction. This happens after we have moved all the pages into the writeback state and unlocked them. Unfortunately, if we fail to set up the transaction we then abort writeback and try to invalidate the current page. This then triggers are BUG() in block_invalidatepage() because we are trying to invalidate an unlocked page. Fixing this is a bit of a chicken and egg problem - we can't allocate the transaction until we've clustered all the pages into the IO and we know the size of it (i.e. whether the last block of the IO is beyond the current EOF or not). However, we don't want to hold pages locked for long periods of time, especially while we lock other pages to cluster them into the write. To fix this, we need to make a clear delineation in writeback where errors can only be handled by IO completion processing. That is, once we have marked a page for writeback and unlocked it, we have to report errors via IO completion because we've already started the IO. We may not have submitted any IO, but we've changed the page state to indicate that it is under IO so we must now use the IO completion path to report errors. To do this, add an error field to xfs_submit_ioend() to pass it the error that occurred during the building on the ioend chain. When this is non-zero, mark each ioend with the error and call xfs_finish_ioend() directly rather than building bios. This will immediately push the ioends through completion processing with the error that has occurred. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 42e2976f131d65555d5c1d6c3d47facc63577814 Author: Dave Chinner Date: Mon Nov 12 22:09:44 2012 +1100 xfs: fix attr tree double split corruption In certain circumstances, a double split of an attribute tree is needed to insert or replace an attribute. In rare situations, this can go wrong, leaving the attribute tree corrupted. In this case, the attr being replaced is the last attr in a leaf node, and the replacement is larger so doesn't fit in the same leaf node. When we have the initial condition of a node format attribute btree with two leaves at index 1 and 2. Call them L1 and L2. The leaf L1 is completely full, there is not a single byte of free space in it. L2 is mostly empty. The attribute being replaced - call it X - is the last attribute in L1. The way an attribute replace is executed is that the replacement attribute - call it Y - is first inserted into the tree, but has an INCOMPLETE flag set on it so that list traversals ignore it. Once this transaction is committed, a second transaction it run to atomically mark Y as COMPLETE and X as INCOMPLETE, so that a traversal will now find Y and skip X. Once that transaction is committed, attribute X is then removed. So, the initial condition is: +--------+ +--------+ | L1 | | L2 | | fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 | | fsp: 0 | | fsp: N | |--------| |--------| | attr A | | attr 1 | |--------| |--------| | attr B | | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr X | | attr n | +--------+ +--------+ So now we go to replace X, and see that L1:fsp = 0 - it is full so we can't insert Y in the same leaf. So we record the the location of attribute X so we can track it for later use, then we split L1 into L1 and L3 and reblance across the two leafs. We end with: +--------+ +--------+ +--------+ | L1 | | L3 | | L2 | | fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: N | |--------| |--------| |--------| | attr A | | attr X | | attr 1 | |--------| +--------+ |--------| | attr B | | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ And we track that the original attribute is now at L3:0. We then try to insert Y into L1 again, and find that there isn't enough room because the new attribute is larger than the old one. Hence we have to split again to make room for Y. We end up with this: +--------+ +--------+ +--------+ +--------+ | L1 | | L4 | | L3 | | L2 | | fwd: 4 |---->| fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 4 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: J | | fsp: N | |--------| |--------| |--------| |--------| | attr A | | attr Y | | attr X | | attr 1 | |--------| + INCOMP + +--------+ |--------| | attr B | +--------+ | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ And now we have the new (incomplete) attribute @ L4:0, and the original attribute at L3:0. At this point, the first transaction is committed, and we move to the flipping of the flags. This is where we are supposed to end up with this: +--------+ +--------+ +--------+ +--------+ | L1 | | L4 | | L3 | | L2 | | fwd: 4 |---->| fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 4 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: J | | fsp: N | |--------| |--------| |--------| |--------| | attr A | | attr Y | | attr X | | attr 1 | |--------| +--------+ + INCOMP + |--------| | attr B | +--------+ | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ But that doesn't happen properly - the attribute tracking indexes are not pointing to the right locations. What we end up with is both the old attribute to be removed pointing at L4:0 and the new attribute at L4:1. On a debug kernel, this assert fails like so: XFS: Assertion failed: args->index2 < be16_to_cpu(leaf2->hdr.count), file: fs/xfs/xfs_attr_leaf.c, line: 2725 because the new attribute location does not exist. On a production kernel, this goes unnoticed and the code proceeds ahead merrily and removes L4 because it thinks that is the block that is no longer needed. This leaves the hash index node pointing to entries L1, L4 and L2, but only blocks L1, L3 and L2 to exist. Further, the leaf level sibling list is L1 <-> L4 <-> L2, but L4 is now free space, and so everything is busted. This corruption is caused by the removal of the old attribute triggering a join - it joins everything correctly but then frees the wrong block. xfs_repair will report something like: bad sibling back pointer for block 4 in attribute fork for inode 131 problem with attribute contents in inode 131 would clear attr fork bad nblocks 8 for inode 131, would reset to 3 bad anextents 4 for inode 131, would reset to 0 The problem lies in the assignment of the old/new blocks for tracking purposes when the double leaf split occurs. The first split tries to place the new attribute inside the current leaf (i.e. "inleaf == true") and moves the old attribute (X) to the new block. This sets up the old block/index to L1:X, and newly allocated block to L3:0. It then moves attr X to the new block and tries to insert attr Y at the old index. That fails, so it splits again. With the second split, the rebalance ends up placing the new attr in the second new block - L4:0 - and this is where the code goes wrong. What is does is it sets both the new and old block index to the second new block. Hence it inserts attr Y at the right place (L4:0) but overwrites the current location of the attr to replace that is held in the new block index (currently L3:0). It over writes it with L4:1 - the index we later assert fail on. Hopefully this table will show this in a foramt that is a bit easier to understand: Split old attr index new attr index vanilla patched vanilla patched before 1st L1:26 L1:26 N/A N/A after 1st L3:0 L3:0 L1:26 L1:26 after 2nd L4:0 L3:0 L4:1 L4:0 ^^^^ ^^^^ wrong wrong The fix is surprisingly simple, for all this analysis - just stop the rebalance on the out-of leaf case from overwriting the new attr index - it's already correct for the double split case. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 6ce377afd1755eae5c93410ca9a1121dfead7b87 Author: Dave Chinner Date: Fri Nov 2 11:38:44 2012 +1100 xfs: fix reading of wrapped log data Commit 4439647 ("xfs: reset buffer pointers before freeing them") in 3.0-rc1 introduced a regression when recovering log buffers that wrapped around the end of log. The second part of the log buffer at the start of the physical log was being read into the header buffer rather than the data buffer, and hence recovery was seeing garbage in the data buffer when it got to the region of the log buffer that was incorrectly read. Cc: # 3.0.x, 3.2.x, 3.4.x 3.6.x Reported-by: Torsten Kaiser Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 03b1293edad462ad1ad62bcc5160c76758e450d5 Author: Dave Chinner Date: Fri Nov 2 14:23:12 2012 +1100 xfs: fix buffer shudown reference count mismatch When we shut down the filesystem, we have to unpin and free all the buffers currently active in the CIL. To do this we unpin and remove them in one operation as a result of a failed iclogbuf write. For buffers, we do this removal via a simultated IO completion of after marking the buffer stale. At the time we do this, we have two references to the buffer - the active LRU reference and the buf log item. The LRU reference is removed by marking the buffer stale, and the active CIL reference is by the xfs_buf_iodone() callback that is run by xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone callback). However, ioend processing requires one more reference - that of the IO that it is completing. We don't have this reference, so we free the buffer prematurely and use it after it is freed. For buffers marked with XBF_ASYNC, this leads to assert failures in xfs_buf_rele() on debug kernels because the b_hold count is zero. Fix this by making sure we take the necessary IO reference before starting IO completion processing on the stale buffer, and set the XBF_ASYNC flag to ensure that IO completion processing removes all the active references from the buffer to ensure it is fully torn down. Cc: Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4b62acfe99e158fb7812982d1cf90a075710a92c Author: Dave Chinner Date: Fri Nov 2 11:38:42 2012 +1100 xfs: don't vmap inode cluster buffers during free Inode buffers do not need to be mapped as inodes are read or written directly from/to the pages underlying the buffer. This fixes a regression introduced by commit 611c994 ("xfs: make XBF_MAPPED the default behaviour"). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit ca250b1b3d711936d7dae9e97871f2261347f82d Author: Dave Chinner Date: Fri Nov 2 11:38:41 2012 +1100 xfs: invalidate allocbt blocks moved to the free list When we free a block from the alloc btree tree, we move it to the freelist held in the AGFL and mark it busy in the busy extent tree. This typically happens when we merge btree blocks. Once the transaction is committed and checkpointed, the block can remain on the free list for an indefinite amount of time. Now, this isn't the end of the world at this point - if the free list is shortened, the buffer is invalidated in the transaction that moves it back to free space. If the buffer is allocated as metadata from the free list, then all the modifications getted logged, and we have no issues, either. And if it gets allocated as userdata direct from the freelist, it gets invalidated and so will never get written. However, during the time it sits on the free list, pressure on the log can cause the AIL to be pushed and the buffer that covers the block gets pushed for write. IOWs, we end up writing a freed metadata block to disk. Again, this isn't the end of the world because we know from the above we are only writing to free space. The problem, however, is for validation callbacks. If the block was on old btree root block, then the level of the block is going to be higher than the current tree root, and so will fail validation. There may be other inconsistencies in the block as well, and currently we don't care because the block is in free space. Shutting down the filesystem because a freed block doesn't pass write validation, OTOH, is rather unfriendly. So, make sure we always invalidate buffers as they move from the free space trees to the free list so that we guarantee they never get written to disk while on the free list. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Phil White Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 1e7acbb7bc1ae7c1c62fd1310b3176a820225056 Author: Dave Chinner Date: Thu Oct 25 17:22:30 2012 +1100 xfs: silence uninitialised f.file warning. Uninitialised variable build warning introduced by 2903ff0 ("switch simple cases of fget_light to fdget"), gcc is not smart enough to work out that the variable is not used uninitialised, and the commit removed the initialisation at declaration that the old variable had. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit eaef854335ce09956e930fe4a193327417edc6c9 Author: Dave Chinner Date: Tue Oct 9 14:50:52 2012 +1100 xfs: growfs: don't read garbage for new secondary superblocks When updating new secondary superblocks in a growfs operation, the superblock buffer is read from the newly grown region of the underlying device. This is not guaranteed to be zero, so violates the underlying assumption that the unused parts of superblocks are zero filled. Get a new buffer for these secondary superblocks to ensure that the unused regions are zero filled correctly. Signed-off-by: Dave Chinner Reviewed-by: Carlos Maiolino Signed-off-by: Ben Myers commit 1f3c785c3adb7d2b109ec7c8f10081d1294b03d3 Author: Dave Chinner Date: Fri Oct 5 11:06:59 2012 +1000 xfs: move allocation stack switch up to xfs_bmapi_allocate Switching stacks are xfs_alloc_vextent can cause deadlocks when we run out of worker threads on the allocation workqueue. This can occur because xfs_bmap_btalloc can make multiple calls to xfs_alloc_vextent() and even if xfs_alloc_vextent() fails it can return with the AGF locked in the current allocation transaction. If we then need to make another allocation, and all the allocation worker contexts are exhausted because the are blocked waiting for the AGF lock, holder of the AGF cannot get it's xfs-alloc_vextent work completed to release the AGF. Hence allocation effectively deadlocks. To avoid this, move the stack switch one layer up to xfs_bmapi_allocate() so that all of the allocation attempts in a single switched stack transaction occur in a single worker context. This avoids the problem of an allocation being blocked waiting for a worker thread whilst holding the AGF. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 326c03555b914ff153ba5b40df87fd6e28e7e367 Author: Dave Chinner Date: Fri Oct 5 11:06:58 2012 +1000 xfs: introduce XFS_BMAPI_STACK_SWITCH Certain allocation paths through xfs_bmapi_write() are in situations where we have limited stack available. These are almost always in the buffered IO writeback path when convertion delayed allocation extents to real extents. The current stack switch occurs for userdata allocations, which means we also do stack switches for preallocation, direct IO and unwritten extent conversion, even those these call chains have never been implicated in a stack overrun. Hence, let's target just the single stack overun offended for stack switches. To do that, introduce a XFS_BMAPI_STACK_SWITCH flag that the caller can pass xfs_bmapi_write() to indicate it should switch stacks if it needs to do allocation. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 408cc4e97a3ccd172d2d676e4b585badf439271b Author: Mark Tinguely Date: Thu Sep 20 13:16:45 2012 -0500 xfs: zero allocation_args on the kernel stack Zero the kernel stack space that makes up the xfs_alloc_arg structures. Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 7e9620f21d8c9e389fd6845487e07d5df898a2e4 Author: Dave Chinner Date: Mon Oct 8 21:56:12 2012 +1100 xfs: only update the last_sync_lsn when a transaction completes The log write code stamps each iclog with the current tail LSN in the iclog header so that recovery knows where to find the tail of thelog once it has found the head. Normally this is taken from the first item on the AIL - the log item that corresponds to the oldest active item in the log. The problem is that when the AIL is empty, the tail lsn is dervied from the the l_last_sync_lsn, which is the LSN of the last iclog to be written to the log. In most cases this doesn't happen, because the AIL is rarely empty on an active filesystem. However, when it does, it opens up an interesting case when the transaction being committed to the iclog spans multiple iclogs. That is, the first iclog is stamped with the l_last_sync_lsn, and IO is issued. Then the next iclog is setup, the changes copied into the iclog (takes some time), and then the l_last_sync_lsn is stamped into the header and IO is issued. This is still the same transaction, so the tail lsn of both iclogs must be the same for log recovery to find the entire transaction to be able to replay it. The problem arises in that the iclog buffer IO completion updates the l_last_sync_lsn with it's own LSN. Therefore, If the first iclog completes it's IO before the second iclog is filled and has the tail lsn stamped in it, it will stamp the LSN of the first iclog into it's tail lsn field. If the system fails at this point, log recovery will not see a complete transaction, so the transaction will no be replayed. The fix is simple - the l_last_sync_lsn is updated when a iclog buffer IO completes, and this is incorrect. The l_last_sync_lsn shoul dbe updated when a transaction is completed by a iclog buffer IO. That is, only iclog buffers that have transaction commit callbacks attached to them should update the l_last_sync_lsn. This means that the last_sync_lsn will only move forward when a commit record it written, not in the middle of a large transaction that is rolling through multiple iclog buffers. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Wed Jan 2 17:26:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_14,T_FRT_LITTLE autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r02NQBBu044986 for ; Wed, 2 Jan 2013 17:26:11 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r02NQ8kc044853; Wed, 2 Jan 2013 17:26:08 -0600 Date: Wed, 2 Jan 2013 17:26:08 -0600 Message-Id: <201301022326.r02NQ8kc044853@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. for-linus-v3.8-rc1-13587-g56431cd X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: ec47eb6b0b450a4e82340b6de674104de3f0dc0a X-Git-Newrev: 56431cd194ca67a899a2a01a90ee94388ade1d0b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated d69043c xfs: drop buffer io reference when a bad bio is built 3daed8b xfs: fix broken error handling in xfs_vm_writepage 42e2976 xfs: fix attr tree double split corruption 6ce377a xfs: fix reading of wrapped log data 03b1293 xfs: fix buffer shudown reference count mismatch 4b62acf xfs: don't vmap inode cluster buffers during free ca250b1 xfs: invalidate allocbt blocks moved to the free list 1e7acbb xfs: silence uninitialised f.file warning. eaef854 xfs: growfs: don't read garbage for new secondary superblocks 1f3c785 xfs: move allocation stack switch up to xfs_bmapi_allocate 326c035 xfs: introduce XFS_BMAPI_STACK_SWITCH 408cc4e xfs: zero allocation_args on the kernel stack 7e9620f xfs: only update the last_sync_lsn when a transaction completes from ec47eb6b0b450a4e82340b6de674104de3f0dc0a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d69043c42d8c6414fa28ad18d99973aa6c1c2e24 Author: Dave Chinner Date: Mon Nov 12 22:09:46 2012 +1100 xfs: drop buffer io reference when a bad bio is built Error handling in xfs_buf_ioapply_map() does not handle IO reference counts correctly. We increment the b_io_remaining count before building the bio, but then fail to decrement it in the failure case. This leads to the buffer never running IO completion and releasing the reference that the IO holds, so at unmount we can leak the buffer. This leak is captured by this assert failure during unmount: XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0, file: fs/xfs/xfs_mount.c, line: 273 This is not a new bug - the b_io_remaining accounting has had this problem for a long, long time - it's just very hard to get a zero length bio being built by this code... Further, the buffer IO error can be overwritten on a multi-segment buffer by subsequent bio completions for partial sections of the buffer. Hence we should only set the buffer error status if the buffer is not already carrying an error status. This ensures that a partial IO error on a multi-segment buffer will not be lost. This part of the problem is a regression, however. cc: Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 3daed8bc3e49b9695ae931b9f472b5b90d1965b3 Author: Dave Chinner Date: Mon Nov 12 22:09:45 2012 +1100 xfs: fix broken error handling in xfs_vm_writepage When we shut down the filesystem, it might first be detected in writeback when we are allocating a inode size transaction. This happens after we have moved all the pages into the writeback state and unlocked them. Unfortunately, if we fail to set up the transaction we then abort writeback and try to invalidate the current page. This then triggers are BUG() in block_invalidatepage() because we are trying to invalidate an unlocked page. Fixing this is a bit of a chicken and egg problem - we can't allocate the transaction until we've clustered all the pages into the IO and we know the size of it (i.e. whether the last block of the IO is beyond the current EOF or not). However, we don't want to hold pages locked for long periods of time, especially while we lock other pages to cluster them into the write. To fix this, we need to make a clear delineation in writeback where errors can only be handled by IO completion processing. That is, once we have marked a page for writeback and unlocked it, we have to report errors via IO completion because we've already started the IO. We may not have submitted any IO, but we've changed the page state to indicate that it is under IO so we must now use the IO completion path to report errors. To do this, add an error field to xfs_submit_ioend() to pass it the error that occurred during the building on the ioend chain. When this is non-zero, mark each ioend with the error and call xfs_finish_ioend() directly rather than building bios. This will immediately push the ioends through completion processing with the error that has occurred. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 42e2976f131d65555d5c1d6c3d47facc63577814 Author: Dave Chinner Date: Mon Nov 12 22:09:44 2012 +1100 xfs: fix attr tree double split corruption In certain circumstances, a double split of an attribute tree is needed to insert or replace an attribute. In rare situations, this can go wrong, leaving the attribute tree corrupted. In this case, the attr being replaced is the last attr in a leaf node, and the replacement is larger so doesn't fit in the same leaf node. When we have the initial condition of a node format attribute btree with two leaves at index 1 and 2. Call them L1 and L2. The leaf L1 is completely full, there is not a single byte of free space in it. L2 is mostly empty. The attribute being replaced - call it X - is the last attribute in L1. The way an attribute replace is executed is that the replacement attribute - call it Y - is first inserted into the tree, but has an INCOMPLETE flag set on it so that list traversals ignore it. Once this transaction is committed, a second transaction it run to atomically mark Y as COMPLETE and X as INCOMPLETE, so that a traversal will now find Y and skip X. Once that transaction is committed, attribute X is then removed. So, the initial condition is: +--------+ +--------+ | L1 | | L2 | | fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 | | fsp: 0 | | fsp: N | |--------| |--------| | attr A | | attr 1 | |--------| |--------| | attr B | | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr X | | attr n | +--------+ +--------+ So now we go to replace X, and see that L1:fsp = 0 - it is full so we can't insert Y in the same leaf. So we record the the location of attribute X so we can track it for later use, then we split L1 into L1 and L3 and reblance across the two leafs. We end with: +--------+ +--------+ +--------+ | L1 | | L3 | | L2 | | fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: N | |--------| |--------| |--------| | attr A | | attr X | | attr 1 | |--------| +--------+ |--------| | attr B | | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ And we track that the original attribute is now at L3:0. We then try to insert Y into L1 again, and find that there isn't enough room because the new attribute is larger than the old one. Hence we have to split again to make room for Y. We end up with this: +--------+ +--------+ +--------+ +--------+ | L1 | | L4 | | L3 | | L2 | | fwd: 4 |---->| fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 4 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: J | | fsp: N | |--------| |--------| |--------| |--------| | attr A | | attr Y | | attr X | | attr 1 | |--------| + INCOMP + +--------+ |--------| | attr B | +--------+ | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ And now we have the new (incomplete) attribute @ L4:0, and the original attribute at L3:0. At this point, the first transaction is committed, and we move to the flipping of the flags. This is where we are supposed to end up with this: +--------+ +--------+ +--------+ +--------+ | L1 | | L4 | | L3 | | L2 | | fwd: 4 |---->| fwd: 3 |---->| fwd: 2 |---->| fwd: 0 | | bwd: 0 |<----| bwd: 1 |<----| bwd: 4 |<----| bwd: 3 | | fsp: M | | fsp: J | | fsp: J | | fsp: N | |--------| |--------| |--------| |--------| | attr A | | attr Y | | attr X | | attr 1 | |--------| +--------+ + INCOMP + |--------| | attr B | +--------+ | attr 2 | |--------| |--------| .......... .......... |--------| |--------| | attr W | | attr n | +--------+ +--------+ But that doesn't happen properly - the attribute tracking indexes are not pointing to the right locations. What we end up with is both the old attribute to be removed pointing at L4:0 and the new attribute at L4:1. On a debug kernel, this assert fails like so: XFS: Assertion failed: args->index2 < be16_to_cpu(leaf2->hdr.count), file: fs/xfs/xfs_attr_leaf.c, line: 2725 because the new attribute location does not exist. On a production kernel, this goes unnoticed and the code proceeds ahead merrily and removes L4 because it thinks that is the block that is no longer needed. This leaves the hash index node pointing to entries L1, L4 and L2, but only blocks L1, L3 and L2 to exist. Further, the leaf level sibling list is L1 <-> L4 <-> L2, but L4 is now free space, and so everything is busted. This corruption is caused by the removal of the old attribute triggering a join - it joins everything correctly but then frees the wrong block. xfs_repair will report something like: bad sibling back pointer for block 4 in attribute fork for inode 131 problem with attribute contents in inode 131 would clear attr fork bad nblocks 8 for inode 131, would reset to 3 bad anextents 4 for inode 131, would reset to 0 The problem lies in the assignment of the old/new blocks for tracking purposes when the double leaf split occurs. The first split tries to place the new attribute inside the current leaf (i.e. "inleaf == true") and moves the old attribute (X) to the new block. This sets up the old block/index to L1:X, and newly allocated block to L3:0. It then moves attr X to the new block and tries to insert attr Y at the old index. That fails, so it splits again. With the second split, the rebalance ends up placing the new attr in the second new block - L4:0 - and this is where the code goes wrong. What is does is it sets both the new and old block index to the second new block. Hence it inserts attr Y at the right place (L4:0) but overwrites the current location of the attr to replace that is held in the new block index (currently L3:0). It over writes it with L4:1 - the index we later assert fail on. Hopefully this table will show this in a foramt that is a bit easier to understand: Split old attr index new attr index vanilla patched vanilla patched before 1st L1:26 L1:26 N/A N/A after 1st L3:0 L3:0 L1:26 L1:26 after 2nd L4:0 L3:0 L4:1 L4:0 ^^^^ ^^^^ wrong wrong The fix is surprisingly simple, for all this analysis - just stop the rebalance on the out-of leaf case from overwriting the new attr index - it's already correct for the double split case. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 6ce377afd1755eae5c93410ca9a1121dfead7b87 Author: Dave Chinner Date: Fri Nov 2 11:38:44 2012 +1100 xfs: fix reading of wrapped log data Commit 4439647 ("xfs: reset buffer pointers before freeing them") in 3.0-rc1 introduced a regression when recovering log buffers that wrapped around the end of log. The second part of the log buffer at the start of the physical log was being read into the header buffer rather than the data buffer, and hence recovery was seeing garbage in the data buffer when it got to the region of the log buffer that was incorrectly read. Cc: # 3.0.x, 3.2.x, 3.4.x 3.6.x Reported-by: Torsten Kaiser Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 03b1293edad462ad1ad62bcc5160c76758e450d5 Author: Dave Chinner Date: Fri Nov 2 14:23:12 2012 +1100 xfs: fix buffer shudown reference count mismatch When we shut down the filesystem, we have to unpin and free all the buffers currently active in the CIL. To do this we unpin and remove them in one operation as a result of a failed iclogbuf write. For buffers, we do this removal via a simultated IO completion of after marking the buffer stale. At the time we do this, we have two references to the buffer - the active LRU reference and the buf log item. The LRU reference is removed by marking the buffer stale, and the active CIL reference is by the xfs_buf_iodone() callback that is run by xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone callback). However, ioend processing requires one more reference - that of the IO that it is completing. We don't have this reference, so we free the buffer prematurely and use it after it is freed. For buffers marked with XBF_ASYNC, this leads to assert failures in xfs_buf_rele() on debug kernels because the b_hold count is zero. Fix this by making sure we take the necessary IO reference before starting IO completion processing on the stale buffer, and set the XBF_ASYNC flag to ensure that IO completion processing removes all the active references from the buffer to ensure it is fully torn down. Cc: Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4b62acfe99e158fb7812982d1cf90a075710a92c Author: Dave Chinner Date: Fri Nov 2 11:38:42 2012 +1100 xfs: don't vmap inode cluster buffers during free Inode buffers do not need to be mapped as inodes are read or written directly from/to the pages underlying the buffer. This fixes a regression introduced by commit 611c994 ("xfs: make XBF_MAPPED the default behaviour"). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit ca250b1b3d711936d7dae9e97871f2261347f82d Author: Dave Chinner Date: Fri Nov 2 11:38:41 2012 +1100 xfs: invalidate allocbt blocks moved to the free list When we free a block from the alloc btree tree, we move it to the freelist held in the AGFL and mark it busy in the busy extent tree. This typically happens when we merge btree blocks. Once the transaction is committed and checkpointed, the block can remain on the free list for an indefinite amount of time. Now, this isn't the end of the world at this point - if the free list is shortened, the buffer is invalidated in the transaction that moves it back to free space. If the buffer is allocated as metadata from the free list, then all the modifications getted logged, and we have no issues, either. And if it gets allocated as userdata direct from the freelist, it gets invalidated and so will never get written. However, during the time it sits on the free list, pressure on the log can cause the AIL to be pushed and the buffer that covers the block gets pushed for write. IOWs, we end up writing a freed metadata block to disk. Again, this isn't the end of the world because we know from the above we are only writing to free space. The problem, however, is for validation callbacks. If the block was on old btree root block, then the level of the block is going to be higher than the current tree root, and so will fail validation. There may be other inconsistencies in the block as well, and currently we don't care because the block is in free space. Shutting down the filesystem because a freed block doesn't pass write validation, OTOH, is rather unfriendly. So, make sure we always invalidate buffers as they move from the free space trees to the free list so that we guarantee they never get written to disk while on the free list. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Phil White Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 1e7acbb7bc1ae7c1c62fd1310b3176a820225056 Author: Dave Chinner Date: Thu Oct 25 17:22:30 2012 +1100 xfs: silence uninitialised f.file warning. Uninitialised variable build warning introduced by 2903ff0 ("switch simple cases of fget_light to fdget"), gcc is not smart enough to work out that the variable is not used uninitialised, and the commit removed the initialisation at declaration that the old variable had. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit eaef854335ce09956e930fe4a193327417edc6c9 Author: Dave Chinner Date: Tue Oct 9 14:50:52 2012 +1100 xfs: growfs: don't read garbage for new secondary superblocks When updating new secondary superblocks in a growfs operation, the superblock buffer is read from the newly grown region of the underlying device. This is not guaranteed to be zero, so violates the underlying assumption that the unused parts of superblocks are zero filled. Get a new buffer for these secondary superblocks to ensure that the unused regions are zero filled correctly. Signed-off-by: Dave Chinner Reviewed-by: Carlos Maiolino Signed-off-by: Ben Myers commit 1f3c785c3adb7d2b109ec7c8f10081d1294b03d3 Author: Dave Chinner Date: Fri Oct 5 11:06:59 2012 +1000 xfs: move allocation stack switch up to xfs_bmapi_allocate Switching stacks are xfs_alloc_vextent can cause deadlocks when we run out of worker threads on the allocation workqueue. This can occur because xfs_bmap_btalloc can make multiple calls to xfs_alloc_vextent() and even if xfs_alloc_vextent() fails it can return with the AGF locked in the current allocation transaction. If we then need to make another allocation, and all the allocation worker contexts are exhausted because the are blocked waiting for the AGF lock, holder of the AGF cannot get it's xfs-alloc_vextent work completed to release the AGF. Hence allocation effectively deadlocks. To avoid this, move the stack switch one layer up to xfs_bmapi_allocate() so that all of the allocation attempts in a single switched stack transaction occur in a single worker context. This avoids the problem of an allocation being blocked waiting for a worker thread whilst holding the AGF. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 326c03555b914ff153ba5b40df87fd6e28e7e367 Author: Dave Chinner Date: Fri Oct 5 11:06:58 2012 +1000 xfs: introduce XFS_BMAPI_STACK_SWITCH Certain allocation paths through xfs_bmapi_write() are in situations where we have limited stack available. These are almost always in the buffered IO writeback path when convertion delayed allocation extents to real extents. The current stack switch occurs for userdata allocations, which means we also do stack switches for preallocation, direct IO and unwritten extent conversion, even those these call chains have never been implicated in a stack overrun. Hence, let's target just the single stack overun offended for stack switches. To do that, introduce a XFS_BMAPI_STACK_SWITCH flag that the caller can pass xfs_bmapi_write() to indicate it should switch stacks if it needs to do allocation. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 408cc4e97a3ccd172d2d676e4b585badf439271b Author: Mark Tinguely Date: Thu Sep 20 13:16:45 2012 -0500 xfs: zero allocation_args on the kernel stack Zero the kernel stack space that makes up the xfs_alloc_arg structures. Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 7e9620f21d8c9e389fd6845487e07d5df898a2e4 Author: Dave Chinner Date: Mon Oct 8 21:56:12 2012 +1100 xfs: only update the last_sync_lsn when a transaction completes The log write code stamps each iclog with the current tail LSN in the iclog header so that recovery knows where to find the tail of thelog once it has found the head. Normally this is taken from the first item on the AIL - the log item that corresponds to the oldest active item in the log. The problem is that when the AIL is empty, the tail lsn is dervied from the the l_last_sync_lsn, which is the LSN of the last iclog to be written to the log. In most cases this doesn't happen, because the AIL is rarely empty on an active filesystem. However, when it does, it opens up an interesting case when the transaction being committed to the iclog spans multiple iclogs. That is, the first iclog is stamped with the l_last_sync_lsn, and IO is issued. Then the next iclog is setup, the changes copied into the iclog (takes some time), and then the l_last_sync_lsn is stamped into the header and IO is issued. This is still the same transaction, so the tail lsn of both iclogs must be the same for log recovery to find the entire transaction to be able to replay it. The problem arises in that the iclog buffer IO completion updates the l_last_sync_lsn with it's own LSN. Therefore, If the first iclog completes it's IO before the second iclog is filled and has the tail lsn stamped in it, it will stamp the LSN of the first iclog into it's tail lsn field. If the system fails at this point, log recovery will not see a complete transaction, so the transaction will no be replayed. The fix is simple - the l_last_sync_lsn is updated when a iclog buffer IO completes, and this is incorrect. The l_last_sync_lsn shoul dbe updated when a transaction is completed by a iclog buffer IO. That is, only iclog buffers that have transaction commit callbacks attached to them should update the l_last_sync_lsn. This means that the last_sync_lsn will only move forward when a commit record it written, not in the middle of a large transaction that is rolling through multiple iclog buffers. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- XFS development tree From kuszmaul@gmail.com Wed Jan 2 19:42:55 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_43,J_CHICKENPOX_52,J_CHICKENPOX_92,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r031gteI069464 for ; Wed, 2 Jan 2013 19:42:55 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AEE508F8035 for ; Wed, 2 Jan 2013 17:45:43 -0800 (PST) X-ASG-Debug-ID: 1357177542-04cbb035a79a2790001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id NGMKsYsHTjxHPFuG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 02 Jan 2013 17:45:42 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id qd14so17667061ieb.34 for ; Wed, 02 Jan 2013 17:45:42 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=frgjbarEeaKTLIrgAnIK88vSK68da3qBInky/l3+avM=; b=eO9srxgGbgMOlqLhyYMaqeW/geIu53GQxKlEQZIhQ+SDqgs5yfAkhmG60oNEuE18Lp +Jt4t77XEMGkNG7Ifcc5/1Ah8wxqTWIbckDWSmCmj2F1zGoP8iNKe1cx/U19jFgnxZyt w72gISmLuECuhBjDuu6oKlM8tx+s4wv0sqbVpoSq4XPz4t7yzea624+OxoaA1/E5qUde vzZkDNlUjUnV9eSiloi0EeH/cCYsTcqc3V2qjPSXr7BMlipbtRcH3wLK/9cFU3LByaD0 2RtPSRQPSsHcpvFr5GAmi3R3H4Eh7kAK9SRw7gTJ39VQvZE04TVawPVsyhg3boUV1fAX 5kXw== Received: by 10.50.53.147 with SMTP id b19mr41347563igp.12.1357177542433; Wed, 02 Jan 2013 17:45:42 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Wed, 2 Jan 2013 17:45:22 -0800 (PST) In-Reply-To: <20130102232706.GD3120@dastard> References: <20130102232706.GD3120@dastard> From: "Bradley C. Kuszmaul" Date: Wed, 2 Jan 2013 20:45:22 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1357177542 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-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.2.118778 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 Thanks for the help. I got results similar to yours. However, the hole punching is much faster if you create the file with fallocate than if you actually write some data into it. fallocate and then hole-punch is about 1us per hole punch. write and then hole-punch is about 90us per hole punch. But 90us is likely to be plenty fast, so it's looking good. ( I'll try to track down why my other program was slow.) I'll also look into the multithreaded performance and report back... -Bradley On Wed, Jan 2, 2013 at 6:27 PM, Dave Chinner wrote: > On Wed, Jan 02, 2013 at 04:51:07PM -0500, Bradley C. Kuszmaul wrote: >> If I use hole-punching, what will happen to the performance of my application? >> >> I have a multithreaded application that creates large files (many >> gigabytes per file). The application sometimes wants to punch holes >> (say 1 megabyte in size). >> >> On Redhat 6, I've measured that punching holes requires about 2ms > > What version of RHEL 6.x? On x <= 1, hole punching is a synchronous > transaction. On x >= 2, it is an asynchronous transaction and so is > much, much faster. > >> (this with a battery-backed up RAID controller), which is slower than >> I was hoping for, but it's probably OK. The throughput is only about >> 2ms per hole-punch even if I have lots of threads punching holes in >> lots of different files at the same time. > > That sounds like synchronous transaction behaviour. > > A current 3.8-rc1 kernel does a hole punch in well under 2ms. Here's > 10,000 hole punches being done in ~300ms: > > $ cat t.c > #define _GNU_SOURCE > #include > #include > #include > #include > > int main(int argc, char *argv[]) > { > int i, fd; > fd = open("/mnt/scratch/blah", O_CREAT|O_TRUNC|O_RDWR, 0777); > perror("open"); > fallocate(fd, 0, 0, 20 * 1024 * 1024 * 1024LL); > for (i = 0; i < 10000; i++) { > // fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, i * 8192, 4096); > struct xfs_flock64 l = {0}; > > l.l_whence = SEEK_SET; > l.l_start = i * 8192; > l.l_len = 4096; > > ioctl(fd, XFS_IOC_UNRESVSP, &l); > } > close(fd); > } > dave@test-4:~$ gcc -O2 t.c > dave@test-4:~$ rm -f /mnt/scratch/blah > dave@test-4:~$ time ./a.out > open: Success > > real 0m0.336s > user 0m0.000s > sys 0m0.336s > dave@test-4:~$ > > So that means roughly 300ms/10000 = 30uS per hole punch call. > I get the same result with fallocate or XFS_IOC_UNRESVSP, and I get > the same result on RHEL 6.2+. > >> The question I have: What will happen to the performance of other >> threads doing read() and write() operations? Will hole-punching slow >> down the other read() and write() operations running in other threads? > > That all depends. Hole punching is serialised the same way as > truncation - all concurrent operations to the same file are locked > out while the hole punch is performed. Operations to other files > will unaffected unless they are trying to allocate or free extents > in the same allocation group, or you are running a kernel that does > synchronous transactions and the other operations serialise on the > synchronous transaction commits... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Wed Jan 2 23:48:18 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r035mIiM086344 for ; Wed, 2 Jan 2013 23:48:18 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 974218F8037 for ; Wed, 2 Jan 2013 21:51:06 -0800 (PST) X-ASG-Debug-ID: 1357192264-04bdf07fae3ce290001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9qRmhubOV0lxCkxg for ; Wed, 02 Jan 2013 21:51:04 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiMZAJUb5VB5LB7X/2dsb2JhbABFgX+1TYUDAncXc4IeAQEEATocIwULCAMYCSUPBSUDIROIDQW3bRSNJoJ/YQOWC5BJgwiBVAQ Received: from ppp121-44-30-215.lns20.syd6.internode.on.net (HELO dastard) ([121.44.30.215]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Jan 2013 16:21:03 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tqdhl-0005JF-Pw; Thu, 03 Jan 2013 16:51:01 +1100 Date: Thu, 3 Jan 2013 16:51:01 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130103055101.GE3120@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: <20130102232706.GD3120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357192264 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Jan 02, 2013 at 08:45:22PM -0500, Bradley C. Kuszmaul wrote: > Thanks for the help. I got results similar to yours. However, the > hole punching is much faster if you create the file with fallocate > than if you actually write some data into it. > fallocate and then hole-punch is about 1us per hole punch. > write and then hole-punch is about 90us per hole punch. No surprise - after a write the hole punch has a lot more to do. I modified the test program to not use O_TRUNC, then ran: $ /usr/sbin/xfs_io -f -c "truncate 0" -c "pwrite -b 1m 0 20g" /mnt/scratch/blah wrote 21474836480/21474836480 bytes at offset 0 20.000 GiB, 20480 ops; 0:00:30.00 (675.049 MiB/sec and 675.0491 ops/sec) $ sync $ time ./a.out real 0m1.664s user 0m0.000s sys 0m1.656s $ Why? perf top indicates that pretty quickly: 12.80% [kernel] [k] free_hot_cold_page 10.62% [kernel] [k] block_invalidatepage 10.62% [kernel] [k] _raw_spin_unlock_irq 8.35% [kernel] [k] kmem_cache_free 6.07% [kernel] [k] _raw_spin_unlock_irqrestore 3.65% [kernel] [k] put_page 3.51% [kernel] [k] __wake_up_bit 3.27% [kernel] [k] find_get_pages 2.84% [kernel] [k] get_pageblock_flags_group 2.66% [kernel] [k] cancel_dirty_page 2.09% [kernel] [k] truncate_inode_pages_range The page cache has to have holes punched in it after the write. So, lets rule that out by discarding it separately, and see just what the extent manipulation overhead is: $ rm -f /mnt/scratch/blah $ /usr/sbin/xfs_io -f -c "truncate 0" -c "pwrite -b 1m 0 20g" /mnt/scratch/blah wrote 21474836480/21474836480 bytes at offset 0 20.000 GiB, 20480 ops; 0:00:27.00 (749.381 MiB/sec and 749.3807 ops/sec) $ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" $ time ./a.out real 0m0.347s user 0m0.000s sys 0m0.332s $ Which is the same as the fallocate/punch method gives.... > But 90us is likely to be plenty fast, so it's looking good. ( I'll > try to track down why my other program was slow.) If you open the file O_SYNC or O_DSYNC, then you'll still get synchronous behaviour.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From akinobu.mita@gmail.com Thu Jan 3 06:17:17 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_43,J_CHICKENPOX_45,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03CHG6l129276 for ; Thu, 3 Jan 2013 06:17:16 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16287AC002 for ; Thu, 3 Jan 2013 04:20:04 -0800 (PST) X-ASG-Debug-ID: 1357215602-04cbb035a69c04e0001-NocioJ Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by cuda.sgi.com with ESMTP id TCHHZk54vjEEvyqL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Jan 2013 04:20:03 -0800 (PST) X-Barracuda-Envelope-From: akinobu.mita@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.48 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] Received: by mail-pa0-f48.google.com with SMTP id fa1so8686224pad.7 for ; Thu, 03 Jan 2013 04:20:02 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=GQfejs6LxqMD8vOZyP3C1IfR6iPPP+hqNFZgM4U7tis=; b=noKNekYovx5dlNyRf5BmlSkx57mHMMB7q/P6FdBYN/CIfJwaDk+zXGbFZQ9tEJdey7 g7qLFkeg/MNBiNtuchZQbqrmVNIR4vt/U3PmwP77PTxL6Jdq30fJBT03ajXgMoE55I5P eLcMyW7fZ0aRJyC2c9fVI3fbWbXTLGm1n5xZOkT9/FA8mc6OdcnYyB+XvfcWCaHDK3s6 oFn4OaCoEjqbNvUIQavwN6ymsy7Qz7HyKkpqYbn2mUgdmaz6EIsn/ixkirefaF1XFI9a Z9c1uWwtSjAynTpRtAw4l2E/Pbl3XUzPBzMuneXHw6XI9qlz0bTeK5U2Vfrjo7vm2v6M WCqg== X-Received: by 10.66.77.196 with SMTP id u4mr144995152paw.84.1357215602191; Thu, 03 Jan 2013 04:20:02 -0800 (PST) Received: from localhost.localdomain (p2126-ipbf3106hodogaya.kanagawa.ocn.ne.jp. [114.149.157.126]) by mx.google.com with ESMTPS id qn3sm28095334pbb.56.2013.01.03.04.20.00 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 03 Jan 2013 04:20:01 -0800 (PST) From: Akinobu Mita To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Cc: Akinobu Mita , Ben Myers , Alex Elder , xfs@oss.sgi.com Subject: [PATCH -v2 12/26] xfs: rename random32() to prandom_u32() Date: Thu, 3 Jan 2013 21:19:08 +0900 X-ASG-Orig-Subj: [PATCH -v2 12/26] xfs: rename random32() to prandom_u32() Message-Id: <1357215562-6288-13-git-send-email-akinobu.mita@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1357215562-6288-1-git-send-email-akinobu.mita@gmail.com> References: <1357215562-6288-1-git-send-email-akinobu.mita@gmail.com> X-Barracuda-Connect: mail-pa0-f48.google.com[209.85.220.48] X-Barracuda-Start-Time: 1357215602 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-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.2.118818 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 Use more preferable function name which implies using a pseudo-random number generator. Signed-off-by: Akinobu Mita Cc: Ben Myers Cc: Alex Elder Cc: xfs@oss.sgi.com --- No change from v1 fs/xfs/xfs_alloc.c | 2 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_log.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 393055f..d2dd19d 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -842,7 +842,7 @@ xfs_alloc_ag_vextent_near( */ int dofirst; /* set to do first algorithm */ - dofirst = random32() & 1; + dofirst = prandom_u32() & 1; #endif restart: diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 6104560..07bf3b9 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -66,7 +66,7 @@ xfs_error_test(int error_tag, int *fsidp, char *expression, int i; int64_t fsid; - if (random32() % randfactor) + if (prandom_u32() % randfactor) return 0; memcpy(&fsid, fsidp, sizeof(xfs_fsid_t)); diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index a815412..6c75865 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -373,7 +373,7 @@ xfs_ialloc_ag_alloc( * number from being easily guessable. */ error = xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, - args.len, random32()); + args.len, prandom_u32()); if (error) return error; diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 46bd9d5..92e036b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3485,7 +3485,7 @@ xlog_ticket_alloc( tic->t_curr_res = unit_bytes; tic->t_cnt = cnt; tic->t_ocnt = cnt; - tic->t_tid = random32(); + tic->t_tid = prandom_u32(); tic->t_clientid = client; tic->t_flags = XLOG_TIC_INITED; tic->t_trans_type = 0; -- 1.7.11.7 From grndlvl@gmail.com Thu Jan 3 07:18:34 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM, FROM_LOCAL_NOVOWEL,HK_RANDOM_FROM,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03DIYlt139931 for ; Thu, 3 Jan 2013 07:18:34 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EDAD8304039 for ; Thu, 3 Jan 2013 05:21:22 -0800 (PST) X-ASG-Debug-ID: 1357219281-04cb6c05a79fc440001-NocioJ Received: from mail-vc0-f175.google.com (mail-vc0-f175.google.com [209.85.220.175]) by cuda.sgi.com with ESMTP id XUvV8fwpF6m4veHi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Jan 2013 05:21:22 -0800 (PST) X-Barracuda-Envelope-From: grndlvl@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.175] Received: by mail-vc0-f175.google.com with SMTP id fy7so15188489vcb.20 for ; Thu, 03 Jan 2013 05:21:21 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:references:mime-version:in-reply-to:content-type :content-transfer-encoding:message-id:cc:x-mailer:from:subject:date :to; bh=3QOqQYOfFjA3xC6cde2j0PTQRZOSl7VQOE1LOXJzEYY=; b=ESYS6hr+QgUodUUziESdTfAnIWdNju+NcFfgDIXAEeBPzZEmd6qQSr6oONYelizw1/ 0pTGcF+y3A3TTW/pLPALwN8IO9NHzVdG4Ffst0ipxvZM09Woce2RMpD7Bu5qXQEZAGSJ M0y26twKkALOXvCvnJE3OodkKcmA1cHmX+4IzipSCtSXsUXtB47kZFwZqsVdCpw9NfVm tutxbrRaNtUdAZKX+qqzsXGL8E5ntaH3QgxcsRuYVXlBWlMAnJnPUVaUbMYt+zRYoaRm Xdu5MiXVynqIFlgM2djX5Lr15HSTYSKJ2nRpbIuD8VXIp8n5rfudk94t4jJHUEwe8OpS uCnw== X-Received: by 10.220.115.20 with SMTP id g20mr73867808vcq.31.1357219281420; Thu, 03 Jan 2013 05:21:21 -0800 (PST) Received: from [192.168.1.123] (cablepool4-18.stoweaccess.com. [199.188.181.18]) by mx.google.com with ESMTPS id dl18sm44805594vdb.2.2013.01.03.05.21.19 (version=SSLv3 cipher=OTHER); Thu, 03 Jan 2013 05:21:20 -0800 (PST) References: <50D2A038.2040501@hardwarefreak.com> <20121221032026.GD15182@dastard> <50D49899.2090901@hardwarefreak.com> <9AF752E5-941B-491F-A7DE-5D978DFFB3B0@dhnet.us> <50D57382.2060900@hardwarefreak.com> <50D5DB70.3020308@gmail.com> <20121222234532.GH15182@dastard> <50D70A4B.8040904@gmail.com> <20130102214805.GC3120@dastard> Mime-Version: 1.0 (1.0) In-Reply-To: <20130102214805.GC3120@dastard> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <104E5EA8-B962-4D36-BC08-9FD041ED9E02@gmail.com> Cc: "stan@hardwarefreak.com" , "xfs@oss.sgi.com" X-Mailer: iPhone Mail (10A551) From: Jeffrey Ellis Subject: Re: xfsdump INTERRUPT issue Date: Thu, 3 Jan 2013 08:21:18 -0500 X-ASG-Orig-Subj: Re: xfsdump INTERRUPT issue To: Dave Chinner X-Barracuda-Connect: mail-vc0-f175.google.com[209.85.220.175] X-Barracuda-Start-Time: 1357219281 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-Spam-Score: 2.53 X-Barracuda-Spam-Status: No, SCORE=2.53 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FROM_LOCAL_NOVOWEL, K2_FROM_LOCAL_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118823 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.20 FROM_LOCAL_NOVOWEL From: localpart has series of non-vowel letters 2.33 K2_FROM_LOCAL_NOVOWEL From: localpart has series of non-vowel letters Dave, do you want that for the volume being copied or my startup volume? Best, J. On Jan 2, 2013, at 4:48 PM, Dave Chinner wrote: > On Sun, Dec 23, 2012 at 08:42:35AM -0500, Jeffrey wrote: >> Here's my output: >> >> # xfs_repair -n -r /dev/sda3 /dev/sda2 > .... > > SO nothing apparentyl wrong with the filesytem on disk, so the > corruption is occurring in memory and the oops is occurring before > anything bad gets written to disk. I've tried reproducing it, but > I'm not having any luck at the moment. Can you send me an ls -lR > output so i can see the rough structure of the files being backed > up? (Send it privately to me if you don't want everyone to see the > contents of your disk....). > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bpm@sgi.com Thu Jan 3 07:50:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_31, J_CHICKENPOX_43,J_CHICKENPOX_51 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03DojU9141734 for ; Thu, 3 Jan 2013 07:50:45 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27CF6AC002; Thu, 3 Jan 2013 05:53:32 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id ADF6C4266DC; Thu, 3 Jan 2013 07:53:32 -0600 (CST) Date: Thu, 3 Jan 2013 07:53:32 -0600 From: Ben Myers To: Sergei Trofimovich , Eric Sandeen Cc: Alex Elder , bpm@sgi.com, Dave Chinner , xfs@oss.sgi.com, Phil White Subject: Re: [bisected] xfs panics when attempting to mount btrfs Message-ID: <20130103135332.GI27055@sgi.com> References: <20121229135229.4ea4615a@st.vba.domain> <50DF508D.2010105@sandeen.net> <20121230015109.1219d01f@sf> <50DF7CD1.90205@sandeen.net> <20121230122622.04e44f53@sf> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121230122622.04e44f53@sf> User-Agent: Mutt/1.5.20 (2009-06-14) On Sun, Dec 30, 2012 at 12:26:22PM +0300, Sergei Trofimovich wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On Sat, 29 Dec 2012 17:29:21 -0600 > Eric Sandeen wrote: > > > -----BEGIN PGP SIGNED MESSAGE----- > > Hash: SHA1 > > > > On 12/29/12 4:51 PM, Sergei Trofimovich wrote: > > > On Sat, 29 Dec 2012 14:20:29 -0600 > > > Eric Sandeen wrote: > > > > > >>> Panic showed all my drives and partitions which means > > >>> they were detected correctly. > > > > > >> Was it a panic, or was it simply a very verbose message which contained a backtrace? > > > > > >> Can you please include what you actually saw in your logs? > > > > > > Yes, it was a panic. Box did not boot (i would not bisect it otherwise). > > > I won't have access to real box thus I've reproduced it in minimal > > > UML: > > > > > > Current usermode linux perfectly reproduces the problem as well: > > > > > > $ cat ./run_ubda_fails > > > #!/bin/sh > > > > > > ./vmlinux \ > > > ubd0=$(pwd)/1G.img \ > > > root=/dev/ubda \ > > > rw \ > > > mem=256M \ > > > umid=foo \ > > > \ > > > "$@" > > > reset > > > > > > $ cat ./run_ubda > > > #!/bin/sh > > > > > > ./vmlinux \ > > > ubd0=$(pwd)/1G.img \ > > > root=/dev/ubda \ > > > rw rootfstype=btrfs \ > > > mem=256M \ > > > umid=foo \ > > > \ > > > "$@" > > > reset > > > > > > Note the rootfstype in the workign case. I've included only EXT4=y XFS=y and BTRFS=y > > > as supported FSen. The UML OOps: > > > > > > [ 0.170000] VFS: Cannot open root device "ubda" or unknown-block(98,0): error -117 > > > > Oh, ok, so it was panicing due to inability to mount root; not xfs itself panicing. > > > > Were there any messages from xfs prior to this? > > > > Especially if there were none, this might fix it, though TBH it's just > > a quick guess, I haven't really looked at how the probing works at > > boot time recently. Can you test it? > > > > From: Eric Sandeen > > > > Do not return EFSCORRUPTED when filesystem probe finds no XFS magic > > > > 9802182 changed the return value from EWRONGFS (aka EINVAL) > > to EFSCORRUPTED which doesn't seem to be handled properly by > > the root filesystem probe. > > > > Signed-off-by: Eric Sandeen > > Yeah, you patch is nicer. xfs_mount_validate_sb does the similar thing. > Thanks! > > Tested-by: Sergei Trofimovich Looks good to me. Reviewed-by: Ben Myers From BATV+d18cb2d2b1786be03a41+3420+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 3 12:16:46 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03IGj5n161317 for ; Thu, 3 Jan 2013 12:16:46 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4D220304043 for ; Thu, 3 Jan 2013 10:19:34 -0800 (PST) X-ASG-Debug-ID: 1357237172-04cb6c05a5a0f520001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id KjAE1YOfLBn802Mc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 03 Jan 2013 10:19:32 -0800 (PST) X-Barracuda-Envelope-From: BATV+d18cb2d2b1786be03a41+3420+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TqpO5-00062O-7p; Thu, 03 Jan 2013 18:19:29 +0000 Date: Thu, 3 Jan 2013 13:19:29 -0500 From: Christoph Hellwig To: Sergei Trofimovich Cc: xfs@oss.sgi.com, Alex Elder , Dave Chinner , linux-kernel@vger.kernel.org, Ben Myers , Phil White Subject: Re: [PATCH] xfs: return -EINVAL instead of -EUCLEAN when mounting non-xfs Message-ID: <20130103181929.GA23049@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: return -EINVAL instead of -EUCLEAN when mounting non-xfs References: <20121230015615.6cc9e03c@sf> <1356823010-29768-1-git-send-email-slyfox@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1356823010-29768-1-git-send-email-slyfox@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1357237172 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-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_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Sun, Dec 30, 2012 at 02:16:50AM +0300, Sergei Trofimovich wrote: > It fixes boot panic when trying to boot from btrfs filesystem. > kernel tries to mount as xfs and gets fatal -EUCLEAN: > > [ 0.170000] VFS: Cannot open root device "ubda" or unknown-block(98,0): error -117 > [ 0.170000] Please append a correct "root=" boot option; here are the available partitions: > [ 0.170000] 6200 1048576 ubda driver: uml-blkdev > [ 0.170000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(98,0) > > init/do_mounts.c expects only -EINVAL as 'retry another' option. > Fixes regression introduced by commit 98021821a502db347bd9c7671beeee6e8ce07ea6 Looks reasonable, but think xfs_readsb should simply be changed to turn all EFSCORRUPTED returns into EINVAL if loud is not set. The place that changes the errno value would also be a perfect place to comment why we are doing this in the code so that this knowledge doesn't get lost. From kuszmaul@gmail.com Thu Jan 3 12:23:20 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03INKEb161873 for ; Thu, 3 Jan 2013 12:23:20 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9F388F8033 for ; Thu, 3 Jan 2013 10:26:09 -0800 (PST) X-ASG-Debug-ID: 1357237568-04cb6c05a8a0fd00001-NocioJ Received: from mail-ia0-f173.google.com (mail-ia0-f173.google.com [209.85.210.173]) by cuda.sgi.com with ESMTP id O5A6MKbhCeQXxpOJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Jan 2013 10:26:08 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] Received: by mail-ia0-f173.google.com with SMTP id w21so13091399iac.18 for ; Thu, 03 Jan 2013 10:26:08 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=0xBvNmFAstQHOzOVxHf6MQiQPb7/lT552OyIB9GjstE=; b=XgVFiBbHamyWVFBL0YoYrV6IQRR4gAlF+BRsAD5Ij1aFoYsQVt4hadNJiG3H9h2tLK ytDTRf8NEgJtQY8Ygmr3tfH3BDDpIIf9FW4dHcldatF1CyK2DqRyRYD+PXlF+hJNw8Gh vTmA7rU+ZQOrDtoKfpyBcnMAx5JKZR/S8VJRPZUVxfdtAQNoCqiTIlF+VMwShRGYfQ8D FxvP4VhblqirEP+UJrsHhTLvrZCmUTKkV/fps4G0uObzGcAI7DC991slEa/5TCXaP6S4 jIicfF6Z9hUTcWAgoc5YeK0Sm2g9X7n4JpuzTWUTXoRWRYPfQ+hSDLsM/pNlc82gT/AT aOhg== Received: by 10.50.190.234 with SMTP id gt10mr44203418igc.73.1357237568529; Thu, 03 Jan 2013 10:26:08 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Thu, 3 Jan 2013 10:25:48 -0800 (PST) In-Reply-To: <20130103055101.GE3120@dastard> References: <20130102232706.GD3120@dastard> <20130103055101.GE3120@dastard> From: "Bradley C. Kuszmaul" Date: Thu, 3 Jan 2013 13:25:48 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ia0-f173.google.com[209.85.210.173] X-Barracuda-Start-Time: 1357237568 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-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.2.118843 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 Thanks Dave, this is very helpful information. I have a much better sense of what the benchmark (e.g., for regression testing). -Bradley On Thu, Jan 3, 2013 at 12:51 AM, Dave Chinner wrote: > On Wed, Jan 02, 2013 at 08:45:22PM -0500, Bradley C. Kuszmaul wrote: >> Thanks for the help. I got results similar to yours. However, the >> hole punching is much faster if you create the file with fallocate >> than if you actually write some data into it. >> fallocate and then hole-punch is about 1us per hole punch. >> write and then hole-punch is about 90us per hole punch. > > No surprise - after a write the hole punch has a lot more to do. > I modified the test program to not use O_TRUNC, then ran: > > $ /usr/sbin/xfs_io -f -c "truncate 0" -c "pwrite -b 1m 0 20g" /mnt/scratch/blah > wrote 21474836480/21474836480 bytes at offset 0 > 20.000 GiB, 20480 ops; 0:00:30.00 (675.049 MiB/sec and 675.0491 ops/sec) > $ sync > $ time ./a.out > > real 0m1.664s > user 0m0.000s > sys 0m1.656s > $ > > Why? perf top indicates that pretty quickly: > > 12.80% [kernel] [k] free_hot_cold_page > 10.62% [kernel] [k] block_invalidatepage > 10.62% [kernel] [k] _raw_spin_unlock_irq > 8.35% [kernel] [k] kmem_cache_free > 6.07% [kernel] [k] _raw_spin_unlock_irqrestore > 3.65% [kernel] [k] put_page > 3.51% [kernel] [k] __wake_up_bit > 3.27% [kernel] [k] find_get_pages > 2.84% [kernel] [k] get_pageblock_flags_group > 2.66% [kernel] [k] cancel_dirty_page > 2.09% [kernel] [k] truncate_inode_pages_range > > The page cache has to have holes punched in it after the write. So, > lets rule that out by discarding it separately, and see just what > the extent manipulation overhead is: > > $ rm -f /mnt/scratch/blah > $ /usr/sbin/xfs_io -f -c "truncate 0" -c "pwrite -b 1m 0 20g" /mnt/scratch/blah > wrote 21474836480/21474836480 bytes at offset 0 > 20.000 GiB, 20480 ops; 0:00:27.00 (749.381 MiB/sec and 749.3807 ops/sec) > $ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" > $ time ./a.out > > real 0m0.347s > user 0m0.000s > sys 0m0.332s > $ > > Which is the same as the fallocate/punch method gives.... > >> But 90us is likely to be plenty fast, so it's looking good. ( I'll >> try to track down why my other program was slow.) > > If you open the file O_SYNC or O_DSYNC, then you'll still get > synchronous behaviour.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From kuszmaul@gmail.com Thu Jan 3 13:09:27 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_43,J_CHICKENPOX_52,J_CHICKENPOX_92,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03J9Rg1172135 for ; Thu, 3 Jan 2013 13:09:27 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 999228F8052 for ; Thu, 3 Jan 2013 11:12:16 -0800 (PST) X-ASG-Debug-ID: 1357240335-04cb6c05a5a12c40001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id TseyIT8ccWqoTUK2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Jan 2013 11:12:15 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] Received: by mail-ie0-f171.google.com with SMTP id 17so18882139iea.30 for ; Thu, 03 Jan 2013 11:12:15 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=W/noX6Q7Q37EInYFKvzIY0rVFEiuSEVt1S6qizBsovo=; b=wWuWJGdd5el2tTe2ydLUIux3WZSat45eudrk8LuJ98XwgeGFxUfQLAdkGxKvQYyNLr XxeSLuQSVAvMkjKihLN3cnxeZDd/akm6mWMcShHaC97BefVAXuyf/JfAJc/hRoMc9TPN Ovy+AxJcQqwNEl90/CvCqUQiPtwsl8J+IRJVAcoER92QpFPlWnUAa7p/lFjLLoSG+sn6 /VT99/aUilBR8p522CMCBIVxBWIjgn/ZwPenFJy1WZG12I0hv1B0nKfDqJOHJ36K3m3D 5rhVSpnAo5GNiYjcAQF+J2P76z+D9cDSZFtN6tcntQL0KSbk5BZThKQA7cwCr95wCwcq LUtg== Received: by 10.50.187.165 with SMTP id ft5mr43671786igc.12.1357240335128; Thu, 03 Jan 2013 11:12:15 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Thu, 3 Jan 2013 11:11:55 -0800 (PST) In-Reply-To: <20130102232706.GD3120@dastard> References: <20130102232706.GD3120@dastard> From: "Bradley C. Kuszmaul" Date: Thu, 3 Jan 2013 14:11:55 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1357240335 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-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.2.118845 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 I'm getting errors from the fallocate() in this code ("Operation not supported"), and it appears that no holes got punched. Are you sure that the fallocate() is punching holes? Maybe I've messed up the code somehow.... It's possible that redhat 6.2 doesn't support fallocate(). Since falloc.h doesn't have the FALLOC_FL_PUNCH_HOLE defined, maybe it's just not supported in that libc/kernel combination. -Bradley On Wed, Jan 2, 2013 at 6:27 PM, Dave Chinner wrote: > On Wed, Jan 02, 2013 at 04:51:07PM -0500, Bradley C. Kuszmaul wrote: >> If I use hole-punching, what will happen to the performance of my application? >> >> I have a multithreaded application that creates large files (many >> gigabytes per file). The application sometimes wants to punch holes >> (say 1 megabyte in size). >> >> On Redhat 6, I've measured that punching holes requires about 2ms > > What version of RHEL 6.x? On x <= 1, hole punching is a synchronous > transaction. On x >= 2, it is an asynchronous transaction and so is > much, much faster. > >> (this with a battery-backed up RAID controller), which is slower than >> I was hoping for, but it's probably OK. The throughput is only about >> 2ms per hole-punch even if I have lots of threads punching holes in >> lots of different files at the same time. > > That sounds like synchronous transaction behaviour. > > A current 3.8-rc1 kernel does a hole punch in well under 2ms. Here's > 10,000 hole punches being done in ~300ms: > > $ cat t.c > #define _GNU_SOURCE > #include > #include > #include > #include > > int main(int argc, char *argv[]) > { > int i, fd; > fd = open("/mnt/scratch/blah", O_CREAT|O_TRUNC|O_RDWR, 0777); > perror("open"); > fallocate(fd, 0, 0, 20 * 1024 * 1024 * 1024LL); > for (i = 0; i < 10000; i++) { > // fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, i * 8192, 4096); > struct xfs_flock64 l = {0}; > > l.l_whence = SEEK_SET; > l.l_start = i * 8192; > l.l_len = 4096; > > ioctl(fd, XFS_IOC_UNRESVSP, &l); > } > close(fd); > } > dave@test-4:~$ gcc -O2 t.c > dave@test-4:~$ rm -f /mnt/scratch/blah > dave@test-4:~$ time ./a.out > open: Success > > real 0m0.336s > user 0m0.000s > sys 0m0.336s > dave@test-4:~$ > > So that means roughly 300ms/10000 = 30uS per hole punch call. > I get the same result with fallocate or XFS_IOC_UNRESVSP, and I get > the same result on RHEL 6.2+. > >> The question I have: What will happen to the performance of other >> threads doing read() and write() operations? Will hole-punching slow >> down the other read() and write() operations running in other threads? > > That all depends. Hole punching is serialised the same way as > truncation - all concurrent operations to the same file are locked > out while the hole punch is performed. Operations to other files > will unaffected unless they are trying to allocate or free extents > in the same allocation group, or you are running a kernel that does > synchronous transactions and the other operations serialise on the > synchronous transaction commits... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bpm@sgi.com Thu Jan 3 15:19:34 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03LJYRh182297 for ; Thu, 3 Jan 2013 15:19:34 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C8F78F8033; Thu, 3 Jan 2013 13:22:22 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 61E004266DC; Thu, 3 Jan 2013 15:22:22 -0600 (CST) Date: Thu, 3 Jan 2013 15:22:22 -0600 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Message-ID: <20130103212222.GJ27055@sgi.com> References: <1355870625-26638-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1355870625-26638-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Dave, On Wed, Dec 19, 2012 at 09:43:45AM +1100, Dave Chinner wrote: > From: Dave Chinner > > When _xfs_buf_find is passed an out of range address, it will fail > to find a relevant struct xfs_perag and oops with a null > dereference. This can happen when trying to walk a filesystem with a > metadata inode that has a partially corrupted extent map (i.e. the > block number returned is corrupt, but is otherwise intact) and we > try to read from the corrupted block address. > > In this case, just fail the lookup. If it is readahead being issued, > it will simply not be done, but if it is real read that fails we > will get an error being reported. Ideally this case should result > in an EFSCORRUPTED error being reported, but we cannot return an > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > may result in ENOMEM or EIO errors being reported instead. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index a80195b..16249d9 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -487,6 +487,7 @@ _xfs_buf_find( > struct rb_node *parent; > xfs_buf_t *bp; > xfs_daddr_t blkno = map[0].bm_bn; > + xfs_daddr_t eofs; > int numblks = 0; > int i; > > @@ -498,6 +499,23 @@ _xfs_buf_find( > ASSERT(!(numbytes < (1 << btp->bt_sshift))); > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > > + /* > + * Corrupted block numbers can get through to here, unfortunately, so we > + * have to check that the buffer falls within the filesystem bounds. > + */ > + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > + if (blkno >= eofs || blkno + numblks > eofs) { ^^^^^^^^^^^^^^^^^^^^^^ That looks suspect to me. I think you need to go over each buffer individually. I bounced it off Mark and this was his suggestion: for (i = 0; i < nmaps; i++) { if (map[i].bm_bn >= eofs || map[i].bm_bn + map[i].bm_len >= eofs) ... Regards, Ben From bpm@oss.sgi.com Thu Jan 3 16:08:06 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03M86bg186065 for ; Thu, 3 Jan 2013 16:08:06 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r03M85ul186039; Thu, 3 Jan 2013 16:08:05 -0600 Date: Thu, 3 Jan 2013 16:08:05 -0600 Message-Id: <201301032208.r03M85ul186039@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-8-g83a9ba0 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 56431cd194ca67a899a2a01a90ee94388ade1d0b X-Git-Newrev: 83a9ba00573904953c58565226f1d3bab9f10983 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 83a9ba0 xfs: don't zero structure members after a memset(0) f755503 xfs: remove int casts from debug dquot soft limit timer asserts from 56431cd194ca67a899a2a01a90ee94388ade1d0b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 83a9ba00573904953c58565226f1d3bab9f10983 Author: Eric Sandeen Date: Mon Dec 10 14:49:15 2012 -0600 xfs: don't zero structure members after a memset(0) Commit 408cc4e97a3ccd172d2d676e4b585badf439271b added memset(0, ...) to allocation args structures, so there is no need to explicitly set any of the fields to 0 after that. Signed-off-by: Eric Sandeen Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit f755503206ef705c20db622637d80a3e1b94a6f5 Author: Brian Foster Date: Fri Dec 21 10:45:17 2012 -0500 xfs: remove int casts from debug dquot soft limit timer asserts The int casts here make it easy to trigger an assert with a large soft limit. For example, set a >4TB soft limit on an empty volume to reproduce a (0 > -x) comparison due to an overflow of d_blk_softlimit. Signed-off-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_alloc.c | 2 -- fs/xfs/xfs_bmap.c | 4 ---- fs/xfs/xfs_ialloc.c | 4 ---- fs/xfs/xfs_qm_syscalls.c | 4 ++-- 4 files changed, 2 insertions(+), 12 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Thu Jan 3 16:08:20 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03M8KAm186171 for ; Thu, 3 Jan 2013 16:08:20 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r03M8J4D186131; Thu, 3 Jan 2013 16:08:19 -0600 Date: Thu, 3 Jan 2013 16:08:19 -0600 Message-Id: <201301032208.r03M8J4D186131@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-8-g83a9ba0 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 56431cd194ca67a899a2a01a90ee94388ade1d0b X-Git-Newrev: 83a9ba00573904953c58565226f1d3bab9f10983 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 83a9ba0 xfs: don't zero structure members after a memset(0) f755503 xfs: remove int casts from debug dquot soft limit timer asserts from 56431cd194ca67a899a2a01a90ee94388ade1d0b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 83a9ba00573904953c58565226f1d3bab9f10983 Author: Eric Sandeen Date: Mon Dec 10 14:49:15 2012 -0600 xfs: don't zero structure members after a memset(0) Commit 408cc4e97a3ccd172d2d676e4b585badf439271b added memset(0, ...) to allocation args structures, so there is no need to explicitly set any of the fields to 0 after that. Signed-off-by: Eric Sandeen Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit f755503206ef705c20db622637d80a3e1b94a6f5 Author: Brian Foster Date: Fri Dec 21 10:45:17 2012 -0500 xfs: remove int casts from debug dquot soft limit timer asserts The int casts here make it easy to trigger an assert with a large soft limit. For example, set a >4TB soft limit on an empty volume to reproduce a (0 > -x) comparison due to an overflow of d_blk_softlimit. Signed-off-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_alloc.c | 2 -- fs/xfs/xfs_bmap.c | 4 ---- fs/xfs/xfs_ialloc.c | 4 ---- fs/xfs/xfs_qm_syscalls.c | 4 ++-- 4 files changed, 2 insertions(+), 12 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Thu Jan 3 16:10:38 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03MAcUX186504 for ; Thu, 3 Jan 2013 16:10:38 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 39A258F8039; Thu, 3 Jan 2013 14:13:27 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 060AD4266DC; Thu, 3 Jan 2013 16:13:26 -0600 (CST) Date: Thu, 3 Jan 2013 16:13:26 -0600 From: Ben Myers To: Mark Tinguely Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: don't zero structure members after a memset(0) Message-ID: <20130103221326.GK27055@sgi.com> References: <50C64ACB.2090704@redhat.com> <50C64C83.4050906@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C64C83.4050906@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Dec 10, 2012 at 02:56:35PM -0600, Mark Tinguely wrote: > On 12/10/12 14:49, Eric Sandeen wrote: > >Commit 408cc4e97a3ccd172d2d676e4b585badf439271b > >added memset(0, ...) to allocation args structures, > >so there is no need to explicitly set any of the fields > >to 0 after that. > > > >Signed-off-by: Eric Sandeen > >--- > > > >Note, compile-tested only. > > Thank-you for cleaning up the junk I left behind. > > Reviewed-by: Mark Tinguely committed to git://oss.sgi.com/xfs/xfs.git master and for-next branches. From bpm@sgi.com Thu Jan 3 16:11:34 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03MBYT5186643 for ; Thu, 3 Jan 2013 16:11:34 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE1438F8037; Thu, 3 Jan 2013 14:14:26 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id CFED44266DC; Thu, 3 Jan 2013 16:14:26 -0600 (CST) Date: Thu, 3 Jan 2013 16:14:26 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove int casts from debug dquot soft limit timer asserts Message-ID: <20130103221426.GL27055@sgi.com> References: <1356104717-4722-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1356104717-4722-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Dec 21, 2012 at 10:45:17AM -0500, Brian Foster wrote: > The int casts here make it easy to trigger an assert with a large > soft limit. For example, set a >4TB soft limit on an empty volume > to reproduce a (0 > -x) comparison due to an overflow of > d_blk_softlimit. > > Signed-off-by: Brian Foster Looks good. Reviewed-by: Ben Myers committed to git://oss.sgi.com/xfs/xfs.git master and for-next branches From sandeen@sandeen.net Thu Jan 3 16:55:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03Msx0H190155 for ; Thu, 3 Jan 2013 16:54:59 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E963AC003 for ; Thu, 3 Jan 2013 14:57:48 -0800 (PST) X-ASG-Debug-ID: 1357253867-04bdf07fae407a90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DBIqFKjmlBVxa7iv for ; Thu, 03 Jan 2013 14:57:47 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 96561607B0DA; Thu, 3 Jan 2013 16:57:46 -0600 (CST) Message-ID: <50E60CEA.9040002@sandeen.net> Date: Thu, 03 Jan 2013 16:57:46 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: =?ISO-8859-1?Q?fugazzi=AE?= CC: xfs@oss.sgi.com Subject: Re: Xfsdump / restore, Problems with Linux file capabilities References: <2623173.XhKSAea7qn@orione> <50DF4DC1.8000200@sandeen.net> X-ASG-Orig-Subj: Re: Xfsdump / restore, Problems with Linux file capabilities In-Reply-To: <50DF4DC1.8000200@sandeen.net> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357253867 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.118861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 12/29/12 2:08 PM, Eric Sandeen wrote: > On 12/29/12 12:41 PM, fugazzi wrote: >> Hi everyone, I had a problem with xfsrestore not restoring Linux capabilities >> on my system. >> >> If I do "getcap ping" on my XFS file-system I normally get: >> /usr/bin/ping = cap_net_raw+ep. >> >> On the contrary, after a restore I get nothing, the capability is gone. >> I tried with posix acls and they got restored correctly so the problem seems >> to be only connected with capabilities. >> This is annoying because after a restore I have to remember to re install the >> packages that used capabilities to have them back on, otherwise no ping with >> normal user for example. >> >> I use Arch Linux 64 bit with kernel 3.7.1 vanilla on a core2 quad system. >> >> Hope this will be of help, >> Thank you, >> Fugazzi > > I get the same thing on my RHEL6 box FWIW; I'll try to look into it. Ok, here's what's going on; during the restore the cap does get set: xfs_xattr_set/xfsrestore: name is capability, value is xfs_xattr_set/xfsrestore: returns 0 but then it gets removed again: xfs_xattr_set/xfsrestore: name is capability, value is (null) xfs_xattr_set/xfsrestore: no value, removing, returning 0 Pid: 18041, comm: xfsrestore Tainted: GF O 3.8.0-rc2 #2 Call Trace: [] xfs_xattr_set+0x118/0x120 [xfs] [] generic_removexattr+0x80/0x90 [] cap_inode_killpriv+0x28/0x30 [] security_inode_killpriv+0x16/0x20 [] notify_change+0x18f/0x330 [] chown_common+0x60/0xa0 [] sys_fchown+0x80/0xd0 [] system_call_fastpath+0x16/0x1b so xfsrestore does set the capability, but then it does a chown which triggers security_inode_killpriv() and removes it again. \o/ perhaps we just need to swap the order of the xattr restores and the chowns in the xfsrestore process. -Eric From david@fromorbit.com Thu Jan 3 17:29:33 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03NTWoj199446 for ; Thu, 3 Jan 2013 17:29:33 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83EC9304043 for ; Thu, 3 Jan 2013 15:32:21 -0800 (PST) X-ASG-Debug-ID: 1357255939-04bdf043104972b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0oG960tmDuh42N1f for ; Thu, 03 Jan 2013 15:32:19 -0800 (PST) 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: ApUMAHsT5lB5Labi/2dsb2JhbABFhVGxfYYCF3OCHgEBBTIBIyMQCAMYCSUPBSUDIROIErZnFJEGA5JZgzKQSYMI Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Jan 2013 10:02:19 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TquGn-0007FT-E5; Fri, 04 Jan 2013 10:32:17 +1100 Date: Fri, 4 Jan 2013 10:32:17 +1100 From: Dave Chinner To: Eric Sandeen Cc: =?iso-8859-1?Q?fugazzi=AE?= , xfs@oss.sgi.com Subject: Re: Xfsdump / restore, Problems with Linux file capabilities Message-ID: <20130103233217.GJ3120@dastard> X-ASG-Orig-Subj: Re: Xfsdump / restore, Problems with Linux file capabilities References: <2623173.XhKSAea7qn@orione> <50DF4DC1.8000200@sandeen.net> <50E60CEA.9040002@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <50E60CEA.9040002@sandeen.net> 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: 1357255939 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.118863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 03, 2013 at 04:57:46PM -0600, Eric Sandeen wrote: > On 12/29/12 2:08 PM, Eric Sandeen wrote: > > On 12/29/12 12:41 PM, fugazzi wrote: > >> Hi everyone, I had a problem with xfsrestore not restoring > >> Linux capabilities on my system. > >> > >> If I do "getcap ping" on my XFS file-system I normally get: > >> /usr/bin/ping = cap_net_raw+ep. > >> > >> On the contrary, after a restore I get nothing, the capability > >> is gone. I tried with posix acls and they got restored > >> correctly so the problem seems to be only connected with > >> capabilities. This is annoying because after a restore I have > >> to remember to re install the packages that used capabilities > >> to have them back on, otherwise no ping with normal user for > >> example. > >> > >> I use Arch Linux 64 bit with kernel 3.7.1 vanilla on a core2 > >> quad system. > >> > >> Hope this will be of help, Thank you, Fugazzi > > > > I get the same thing on my RHEL6 box FWIW; I'll try to look into > > it. > > Ok, here's what's going on; during the restore the cap does get > set: > > xfs_xattr_set/xfsrestore: name is capability, value is > xfs_xattr_set/xfsrestore: returns 0 > > but then it gets removed again: > > xfs_xattr_set/xfsrestore: name is capability, value is (null) > xfs_xattr_set/xfsrestore: no value, removing, returning 0 Pid: > 18041, comm: xfsrestore Tainted: GF O 3.8.0-rc2 #2 Call > Trace: [] xfs_xattr_set+0x118/0x120 [xfs] > [] generic_removexattr+0x80/0x90 > [] cap_inode_killpriv+0x28/0x30 > [] security_inode_killpriv+0x16/0x20 > [] notify_change+0x18f/0x330 > [] chown_common+0x60/0xa0 [] > sys_fchown+0x80/0xd0 [] > system_call_fastpath+0x16/0x1b > > so xfsrestore does set the capability, but then it does a chown > which triggers security_inode_killpriv() and removes it again. > \o/ > > perhaps we just need to swap the order of the xattr restores and > the chowns in the xfsrestore process. If that's the case, then this has been broken for a long while, right? I take it we don't have any xfsdump/restore tests that check for capabilities being correctly restored? Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Jan 3 17:41:56 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r03NfuAp200738 for ; Thu, 3 Jan 2013 17:41:56 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5859B304039 for ; Thu, 3 Jan 2013 15:44:48 -0800 (PST) X-ASG-Debug-ID: 1357256687-04cb6c05a7a213c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nDxuknXW2DwDQ6tI for ; Thu, 03 Jan 2013 15:44:47 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0F1BE63BDFC6; Thu, 3 Jan 2013 17:44:47 -0600 (CST) Message-ID: <50E617EE.4040709@sandeen.net> Date: Thu, 03 Jan 2013 17:44:46 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: =?ISO-8859-1?Q?fugazzi=AE?= , xfs@oss.sgi.com Subject: Re: Xfsdump / restore, Problems with Linux file capabilities References: <2623173.XhKSAea7qn@orione> <50DF4DC1.8000200@sandeen.net> <50E60CEA.9040002@sandeen.net> <20130103233217.GJ3120@dastard> X-ASG-Orig-Subj: Re: Xfsdump / restore, Problems with Linux file capabilities In-Reply-To: <20130103233217.GJ3120@dastard> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357256687 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.118863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/3/13 5:32 PM, Dave Chinner wrote: > On Thu, Jan 03, 2013 at 04:57:46PM -0600, Eric Sandeen wrote: >> On 12/29/12 2:08 PM, Eric Sandeen wrote: >>> On 12/29/12 12:41 PM, fugazzi wrote: >>>> Hi everyone, I had a problem with xfsrestore not restoring >>>> Linux capabilities on my system. >>>> >>>> If I do "getcap ping" on my XFS file-system I normally get: >>>> /usr/bin/ping = cap_net_raw+ep. >>>> >>>> On the contrary, after a restore I get nothing, the capability >>>> is gone. I tried with posix acls and they got restored >>>> correctly so the problem seems to be only connected with >>>> capabilities. This is annoying because after a restore I have >>>> to remember to re install the packages that used capabilities >>>> to have them back on, otherwise no ping with normal user for >>>> example. >>>> >>>> I use Arch Linux 64 bit with kernel 3.7.1 vanilla on a core2 >>>> quad system. >>>> >>>> Hope this will be of help, Thank you, Fugazzi >>> >>> I get the same thing on my RHEL6 box FWIW; I'll try to look into >>> it. >> >> Ok, here's what's going on; during the restore the cap does get >> set: >> >> xfs_xattr_set/xfsrestore: name is capability, value is >> xfs_xattr_set/xfsrestore: returns 0 >> >> but then it gets removed again: >> >> xfs_xattr_set/xfsrestore: name is capability, value is (null) >> xfs_xattr_set/xfsrestore: no value, removing, returning 0 Pid: >> 18041, comm: xfsrestore Tainted: GF O 3.8.0-rc2 #2 Call >> Trace: [] xfs_xattr_set+0x118/0x120 [xfs] >> [] generic_removexattr+0x80/0x90 >> [] cap_inode_killpriv+0x28/0x30 >> [] security_inode_killpriv+0x16/0x20 >> [] notify_change+0x18f/0x330 >> [] chown_common+0x60/0xa0 [] >> sys_fchown+0x80/0xd0 [] >> system_call_fastpath+0x16/0x1b >> >> so xfsrestore does set the capability, but then it does a chown >> which triggers security_inode_killpriv() and removes it again. >> \o/ >> >> perhaps we just need to swap the order of the xattr restores and >> the chowns in the xfsrestore process. > > If that's the case, then this has been broken for a long while, > right? I take it we don't have any xfsdump/restore tests that check > for capabilities being correctly restored? Nope, but I've written one to be sent shortly. It could be added to an existing test but I figure we don't want to do that... -Eric > Cheers, > > Dave. > From sandeen@redhat.com Thu Jan 3 18:02:38 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0402cxA206911 for ; Thu, 3 Jan 2013 18:02:38 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F0DEAC002 for ; Thu, 3 Jan 2013 16:05:26 -0800 (PST) X-ASG-Debug-ID: 1357257925-04cb6c05a7a221b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AN8NuCW6uivOp94X for ; Thu, 03 Jan 2013 16:05:25 -0800 (PST) X-Barracuda-Envelope-From: sandeen@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 r0405OO1017483 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 3 Jan 2013 19:05:24 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0405N6C005721 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 3 Jan 2013 19:05:24 -0500 Message-ID: <50E61CC3.1000108@redhat.com> Date: Thu, 03 Jan 2013 18:05:23 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss CC: =?ISO-8859-1?Q?fugazzi=AE?= Subject: [PATCH] xfstests: test dump/restore of file capabilities X-Enigmail-Version: 1.4.6 X-ASG-Orig-Subj: [PATCH] xfstests: test dump/restore of file capabilities Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit 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: 1357257925 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfsrestore isn't properly restoring file capabilities; it restores them, but then chowns the file, which removes the caps: Call Trace: [] xfs_xattr_set+0x118/0x120 [xfs] [] generic_removexattr+0x80/0x90 [] cap_inode_killpriv+0x28/0x30 [] security_inode_killpriv+0x16/0x20 [] notify_change+0x18f/0x330 [] chown_common+0x60/0xa0 [] sys_fchown+0x80/0xd0 [] system_call_fastpath+0x16/0x1b This test demonstrates the problem. Reported-by: fugazzi Signed-off-by: Eric Sandeen --- diff --git a/296 b/296 new file mode 100755 index 0000000..efcfb09 --- /dev/null +++ b/296 @@ -0,0 +1,83 @@ +#! /bin/bash +# FS QA Test No. 296 +# +# Test that xfsdump/restore preserves file capabilities +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.dump + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_scratch + +rm -f $seq.full + +_wipe_fs + +mkdir -p $dump_dir +echo test > $dump_dir/testfile +# Set a generic xattr +setfattr -n user.name -v value $dump_dir/testfile +# Now set the cap (which is also an xattr) +setcap cap_setgid,cap_setuid+ep $dump_dir/testfile +# And make sure they are there on the source +echo "Checking for xattr on source file" +getfattr --absolute-names -m user.name $dump_dir/testfile | _dir_filter +echo "Checking for capability on source file" +getcap $dump_dir/testfile | _dir_filter +getfattr --absolute-names -m security.capability $dump_dir/testfile | _dir_filter + +_do_dump_file -f $tmp.df.0 +_prepare_restore_dir +_do_restore_file +# Basic dump/restore checks first - the file is there, right? +_ls_compare_sub +_diff_compare + +echo "Checking for xattr on restored file" +getfattr --absolute-names -m user.name $restore_dir/$dump_sdir/testfile | _dir_filter +echo "Checking for capability on restored file" +getcap $restore_dir/$dump_sdir/testfile | _dir_filter +getfattr --absolute-names -m security.capability $restore_dir/$dump_sdir/testfile | _dir_filter + +status=0 +exit diff --git a/296.out b/296.out new file mode 100644 index 0000000..7401e93 --- /dev/null +++ b/296.out @@ -0,0 +1,55 @@ +QA output created by 296 +Checking for xattr on source file +# file: DUMP_DIR/testfile +user.name + +Checking for capability on source file +DUMP_DIR/testfile = cap_setgid,cap_setuid+ep +# file: DUMP_DIR/testfile +security.capability + +Dumping to file... +xfsdump -f DUMP_FILE -M stress_tape_media -L stress_296 SCRATCH_MNT +xfsdump: using file dump (drive_simple) strategy +xfsdump: level 0 dump of HOSTNAME:SCRATCH_MNT +xfsdump: dump date: DATE +xfsdump: session id: ID +xfsdump: session label: "stress_296" +xfsdump: ino map +xfsdump: ino map construction complete +xfsdump: estimated dump size: NUM bytes +xfsdump: /var/xfsdump/inventory created +xfsdump: creating dump session media file 0 (media 0, file 0) +xfsdump: dumping ino map +xfsdump: dumping directories +xfsdump: dumping non-directory files +xfsdump: ending media file +xfsdump: media file size NUM bytes +xfsdump: dump size (non-dir files) : NUM bytes +xfsdump: dump complete: SECS seconds elapsed +xfsdump: Dump Status: SUCCESS +Restoring from file... +xfsrestore -f DUMP_FILE -L stress_296 RESTORE_DIR +xfsrestore: using file dump (drive_simple) strategy +xfsrestore: using online session inventory +xfsrestore: searching media for directory dump +xfsrestore: examining media file 0 +xfsrestore: reading directories +xfsrestore: 2 directories and 2 entries processed +xfsrestore: directory post-processing +xfsrestore: restoring non-directory files +xfsrestore: restore complete: SECS seconds elapsed +xfsrestore: Restore Status: SUCCESS +Comparing listing of dump directory with restore directory +Files TMP.dump_dir and TMP.restore_dir are identical +Comparing dump directory with restore directory +Files DUMP_DIR/testfile and RESTORE_DIR/DUMP_SUBDIR/testfile are identical +Only in SCRATCH_MNT: RESTORE_SUBDIR +Checking for xattr on restored file +# file: RESTORE_DIR/DUMP_SUBDIR/testfile +user.name + +Checking for capability on restored file +RESTORE_DIR/DUMP_SUBDIR/testfile = cap_setgid,cap_setuid+ep +# file: RESTORE_DIR/DUMP_SUBDIR/testfile +security.capability diff --git a/group b/group index a51e05a..0706c60 100644 --- a/group +++ b/group @@ -413,3 +413,4 @@ deprecated 294 auto rw prealloc quick ioctl 291 repair 295 logprint auto quick +296 dump auto quick From takeuchi_satoru@jp.fujitsu.com Thu Jan 3 23:58:13 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r045wDtZ245909 for ; Thu, 3 Jan 2013 23:58:13 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EEEBB304039 for ; Thu, 3 Jan 2013 22:01:02 -0800 (PST) X-ASG-Debug-ID: 1357279260-04cb6c05a7a2ef90001-NocioJ Received: from fgwmail6.fujitsu.co.jp (fgwmail6.fujitsu.co.jp [192.51.44.36]) by cuda.sgi.com with ESMTP id xaZHe441Fq9nUlAN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Jan 2013 22:01:01 -0800 (PST) X-Barracuda-Envelope-From: takeuchi_satoru@jp.fujitsu.com X-Barracuda-Apparent-Source-IP: 192.51.44.36 Received: from m2.gw.fujitsu.co.jp (unknown [10.0.50.72]) by fgwmail6.fujitsu.co.jp (Postfix) with ESMTP id EC9A73EE0AE for ; Fri, 4 Jan 2013 15:00:59 +0900 (JST) Received: from smail (m2 [127.0.0.1]) by outgoing.m2.gw.fujitsu.co.jp (Postfix) with ESMTP id D5CF545DE4D for ; Fri, 4 Jan 2013 15:00:59 +0900 (JST) Received: from s2.gw.fujitsu.co.jp (s2.gw.fujitsu.co.jp [10.0.50.92]) by m2.gw.fujitsu.co.jp (Postfix) with ESMTP id BD7D545DD74 for ; Fri, 4 Jan 2013 15:00:59 +0900 (JST) Received: from s2.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s2.gw.fujitsu.co.jp (Postfix) with ESMTP id B0A691DB803A for ; Fri, 4 Jan 2013 15:00:59 +0900 (JST) Received: from g01jpexchkw12.g01.fujitsu.local (g01jpexchkw12.g01.fujitsu.local [10.0.194.51]) by s2.gw.fujitsu.co.jp (Postfix) with ESMTP id 712481DB802C for ; Fri, 4 Jan 2013 15:00:59 +0900 (JST) Received: from [127.0.0.1] (10.124.101.217) by g01jpexchkw12.g01.fujitsu.local (10.0.194.51) with Microsoft SMTP Server id 14.2.309.2; Fri, 4 Jan 2013 15:00:58 +0900 X-SecurityPolicyCheck: OK by SHieldMailChecker v1.7.4 Message-ID: <50E66FFA.8010309@jp.fujitsu.com> Date: Fri, 4 Jan 2013 15:00:26 +0900 From: Satoru Takeuchi User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Andrew Dahl CC: Subject: Re: [PATCH] xfstests: SGI license update References: <50E47A64.3020003@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: SGI license update In-Reply-To: <50E47A64.3020003@sgi.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: fgwmail6.fujitsu.co.jp[192.51.44.36] X-Barracuda-Start-Time: 1357279261 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-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.2.118881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Andrew, > + * Copyright (c) 2012 SGI. All Rights Reserved. Just a trivial comment, "2013 SGI"? Satoru From mlsemon35@gmail.com Fri Jan 4 00:05:20 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0465KsU248858 for ; Fri, 4 Jan 2013 00:05:20 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC6218F8035 for ; Thu, 3 Jan 2013 22:08:09 -0800 (PST) X-ASG-Debug-ID: 1357279687-04bdf07fae416810001-NocioJ Received: from mail-oa0-f45.google.com (mail-oa0-f45.google.com [209.85.219.45]) by cuda.sgi.com with ESMTP id N1dbhnHGUJxL0D5U (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Jan 2013 22:08:07 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] Received: by mail-oa0-f45.google.com with SMTP id i18so14922334oag.32 for ; Thu, 03 Jan 2013 22:08:07 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] 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=i2WriRdH5hcGTuwXfLns9UkiSlsxT+PlJ7omW9DUkME=; b=eN8jjDilXm3ew19vQKZZHNn6JJHlwx0zzDaJ6MrKHILNcGsLIrgbisR14XFOMZsXgP bjYQX6pBQ1gQZQvbGW7r4i4/xULo87p/x6aDTLGcPKL5CEurzi8kWamM+1PMJrB0Mf0d dukgGc4C79qbjXYTFAI6WfY5T+IDx+Nd0zyeXc9fUejfu2pFBDmjsIy7ub0GpwCafZeo jsmrah6a8VVyKPvqg7UawUL3TSmaTgCZyZxEOEd1Wczn7tWb93srcN0BvJNZOHB8qz4Q J41JU8hcCaNRfHpcqSGtRHaKfyYSeyd0KnzBczA66BoXk7JB3uJ79/LgiqLT7UnGYnbz UpJw== MIME-Version: 1.0 Received: by 10.182.131.37 with SMTP id oj5mr38362254obb.54.1357279686967; Thu, 03 Jan 2013 22:08:06 -0800 (PST) Received: by 10.76.70.233 with HTTP; Thu, 3 Jan 2013 22:08:06 -0800 (PST) Date: Fri, 4 Jan 2013 01:08:06 -0500 Message-ID: Subject: Is xfs_fsr broken for Linux 3.8-rc? From: "Michael L. Semon" X-ASG-Orig-Subj: Is xfs_fsr broken for Linux 3.8-rc? To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-oa0-f45.google.com[209.85.219.45] X-Barracuda-Start-Time: 1357279687 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-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.2.118881 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 Hi! I upgraded the Linux kernel, glibc (to 2.17), and xfsprogs (to 3.1.9) on three 32-bit x86 PCs. Only one of them was upgraded to Linux 3.8-rc2, and I get xfs_fsr output like this, regardless of which XFS filesystem on which xfs_fsr is used: XFS_IOC_SWAPEXT failed: ino=1048813: Invalid argument On this particular XFS filesystem (/var), xfs_repair made no difference, so I went through the whole xfsdump/umount/zero/mkfs.xfs/mount/xfsrestore cycle for the /var partition. I got the lone fragmented file after a reboot. Upgrading yet again to the git version of xfsprogs did not change things. If you can reproduce this problem, could you tell me by which kernel or xfsprogs version this will be fixed? Really, a fix isn't really needed, merely an assurance that XFS will still be production-ready when kernel 3.8 has its main release. Thanks! Michael From BATV+88fba095bc615824109f+3421+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 4 07:53:48 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04Drmvh048930 for ; Fri, 4 Jan 2013 07:53:48 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 065C0304032 for ; Fri, 4 Jan 2013 05:56:40 -0800 (PST) X-ASG-Debug-ID: 1357307799-04cb6c05a6a40420001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id YeG4n7lvff8aDII3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Jan 2013 05:56:39 -0800 (PST) X-Barracuda-Envelope-From: BATV+88fba095bc615824109f+3421+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1Tr7lG-0004N3-HH; Fri, 04 Jan 2013 13:56:38 +0000 Date: Fri, 4 Jan 2013 08:56:38 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: simplify the fallocate path Message-ID: <20130104135638.GA16736@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: simplify the fallocate path References: <20121208120812.755863148@bombadil.infradead.org> <20121208121006.286014845@bombadil.infradead.org> <20121210020956.GN15784@dastard> <20121210105211.GA2794@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121210105211.GA2794@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1357307799 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-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_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Mon, Dec 10, 2012 at 05:52:12AM -0500, Christoph Hellwig wrote: > On Mon, Dec 10, 2012 at 01:09:56PM +1100, Dave Chinner wrote: > > You don't use this flag anywhere ;) > > Fixed. > > > While I like most of this series, I don't really like the > > duplication of this piece of code. It seems to me that a simple > > helper like: > > I had that in a previous version, but it seemed uglier than just > opencoding it. I'll give it another try, maybe I can come up > with something nicer now. I've looked at this and it does not seem to improve the code at all, unless you have a strong objection I'm going to repost the series just with the above unused variable removed. From grndlvl@gmail.com Fri Jan 4 08:29:27 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, FROM_LOCAL_NOVOWEL,HK_RANDOM_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04ETQCL052651 for ; Fri, 4 Jan 2013 08:29:27 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E61DAC008 for ; Fri, 4 Jan 2013 06:32:19 -0800 (PST) X-ASG-Debug-ID: 1357309934-04bdf07fae428430001-NocioJ Received: from mail-vc0-f182.google.com (mail-vc0-f182.google.com [209.85.220.182]) by cuda.sgi.com with ESMTP id C97C6syXz1Em8j8i (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Jan 2013 06:32:15 -0800 (PST) X-Barracuda-Envelope-From: grndlvl@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.182] Received: by mail-vc0-f182.google.com with SMTP id fy27so16552895vcb.41 for ; Fri, 04 Jan 2013 06:32:14 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type; bh=hm/SbB/D5/EzUFrmzbWlNXgDCWPgEUK4TbKuUpNHgf0=; b=XRu+iNEgeS0EIS2ADp9/H56RkNawIHkQjSBfiGXu8lCmhSQgznHdW/5B2vuSrhiSW9 CigABU0Bs/Xl+alGdlmiWE/QDwbQC3XZzx7dbcBzH6SN22Ka20zGk0DT45SVPbRLr++1 /Ud48L5lnnPEoAkxvF4ndwd1Nsx+wPXzNIoi4klmI0FlLHP+HFiOivvXjVjmJbpwHoBl aDqtl/ozWxGoRne/YGOen5WGcvd26GATu6bkIT+xzSU0K/K0icxmjzF0iX53PhzrMC7P a35Nzmh/CZ+iDv5e3I3qaDD1EY+7iqPEsoz8sj6i1g8By/X/VwKBUC12wCTNGNTRP4NN 13fg== X-Received: by 10.59.6.70 with SMTP id cs6mr77591439ved.60.1357309934311; Fri, 04 Jan 2013 06:32:14 -0800 (PST) Received: from [192.168.2.2] (cablepool6-126.stoweaccess.com. [199.188.183.126]) by mx.google.com with ESMTPS id ly6sm39347391veb.3.2013.01.04.06.32.12 (version=SSLv3 cipher=OTHER); Fri, 04 Jan 2013 06:32:13 -0800 (PST) Message-ID: <50E6E7EB.8070103@gmail.com> Date: Fri, 04 Jan 2013 09:32:11 -0500 From: Jeffrey User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: "stan@hardwarefreak.com" , "xfs@oss.sgi.com" Subject: Re: xfsdump INTERRUPT issue References: <20121221032026.GD15182@dastard> <50D49899.2090901@hardwarefreak.com> <9AF752E5-941B-491F-A7DE-5D978DFFB3B0@dhnet.us> <50D57382.2060900@hardwarefreak.com> <50D5DB70.3020308@gmail.com> <20121222234532.GH15182@dastard> <50D70A4B.8040904@gmail.com> <20130102214805.GC3120@dastard> <104E5EA8-B962-4D36-BC08-9FD041ED9E02@gmail.com> <20130103214509.GG3120@dastard> X-ASG-Orig-Subj: Re: xfsdump INTERRUPT issue In-Reply-To: <20130103214509.GG3120@dastard> Content-Type: multipart/alternative; boundary="------------080000080300030209000009" X-Barracuda-Connect: mail-vc0-f182.google.com[209.85.220.182] X-Barracuda-Start-Time: 1357309934 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-Spam-Score: 2.53 X-Barracuda-Spam-Status: No, SCORE=2.53 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FROM_LOCAL_NOVOWEL, HTML_MESSAGE, K2_FROM_LOCAL_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118915 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 0.20 FROM_LOCAL_NOVOWEL From: localpart has series of non-vowel letters 2.33 K2_FROM_LOCAL_NOVOWEL From: localpart has series of non-vowel letters This is a multi-part message in MIME format. --------------080000080300030209000009 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, Dave-- I don't think I'm doing this right, sorry. Here's my output: root@jeffrey:/mnt/hr20# ls -lR .: total 0 There are a huge number of files on this thing. So obviously I've got something wrong. Best, J. On 01/03/2013 04:45 PM, Dave Chinner wrote: > On Thu, Jan 03, 2013 at 08:21:18AM -0500, Jeffrey Ellis wrote: >> Dave, do you want that for the volume being copied or my startup volume? > The copy source volume. > > Cheers, > > Dave. --------------080000080300030209000009 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
Hi, Dave--

I don't think I'm doing this right, sorry. Here's my output:

root@jeffrey:/mnt/hr20# ls -lR
.:
total 0


There are a huge number of files on this thing. So obviously I've got something wrong.

Best,
J.


On 01/03/2013 04:45 PM, Dave Chinner wrote:
On Thu, Jan 03, 2013 at 08:21:18AM -0500, Jeffrey Ellis wrote:
Dave, do you want that for the volume being copied or my startup volume?
The copy source volume.

Cheers,

Dave.


--------------080000080300030209000009-- From pille+xfs+mailinglist+sgi@struction.de Fri Jan 4 09:34:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04FYRnV063805 for ; Fri, 4 Jan 2013 09:34:28 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 74257AC006 for ; Fri, 4 Jan 2013 07:37:17 -0800 (PST) X-ASG-Debug-ID: 1357313833-04bdf0430f4b94c0001-NocioJ Received: from rasta.struction.de (mail.struction.de [85.214.237.111]) by cuda.sgi.com with ESMTP id NmXrgItJq9Rk9APL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Jan 2013 07:37:15 -0800 (PST) X-Barracuda-Envelope-From: pille+xfs+mailinglist+sgi@struction.de X-Barracuda-Apparent-Source-IP: 85.214.237.111 Received: from e179171135.adsl.alicedsl.de ([85.179.171.135] helo=[192.168.1.166]) by rasta.struction.de with esmtpsa (TLSv1:DHE-RSA-CAMELLIA256-SHA:256) (Exim 4.76) (envelope-from ) id 1Tr9Kb-0007gW-CF for xfs@oss.sgi.com; Fri, 04 Jan 2013 16:37:13 +0100 Message-ID: <50E6F6D4.5090407@struction.de> Date: Fri, 04 Jan 2013 16:35:48 +0100 From: pille User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121104 Thunderbird/16.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: du vs. ls Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: du vs. ls Content-Transfer-Encoding: 7bit X-Authenticated-User: pille@struction.de X-Authenticator: plain X-Sender-Verify: SUCCEEDED (sender exists & accepts mail) X-Exim-Version: 4.76 (build at 10-Jul-2011 15:10:16) X-Date: 2013-01-04 16:37:13 X-Connected-IP: 85.179.171.135:48376 X-Message-Linecount: 125 X-Body-Linecount: 115 X-Message-Size: 3777 X-Body-Size: 3425 X-Barracuda-Connect: mail.struction.de[85.214.237.111] X-Barracuda-Start-Time: 1357313835 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-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.2.118919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- hi, since some weeks i've noticed that filesizes for new files differ in the outputs of ls and du. file contains 100MB of /dev/urandom. copy is a copy of file. # ls -l file copy -rw-r--r-- 1 root root 104857600 2013-01-04 11:43 copy -rw-r--r-- 1 root root 104857600 2013-01-04 10:21 file # ls -lh file copy -rw-r--r-- 1 root root 100M 2013-01-04 11:43 copy -rw-r--r-- 1 root root 100M 2013-01-04 10:21 file # du -bs file copy 104857600 file 104857600 copy # du -hs file copy 128M file !! 100M copy # stat file copy File: `file' Size: 104857600 Blocks: 262144 IO Block: 4096 regular file Device: fb03h/64259d Inode: 4705643 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-01-04 10:21:28.721872771 +0000 Modify: 2013-01-04 10:21:42.641599647 +0000 Change: 2013-01-04 10:21:42.641599647 +0000 File: `copy' Size: 104857600 Blocks: 204800 IO Block: 4096 regular file Device: fb03h/64259d Inode: 4709043 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-01-04 11:43:39.665785370 +0000 Modify: 2013-01-04 11:43:40.005778696 +0000 Change: 2013-01-04 11:43:40.005778696 +0000 notice the different count of blocks. this difference is reflected in the 28MB difference. # xfs_fsr -v file copy file file already fully defragmented. copy copy already fully defragmented. # sha1sum file copy 23071d0b4caeeb4aa9579283ca67c7c13e66b8ee file 23071d0b4caeeb4aa9579283ca67c7c13e66b8ee copy it's hard to create those files reliably, but the following procedure worked for me (see random.part): 1) dd file as concatenated parts 2) overwrite it again # dd if=/dev/urandom of=random.part bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 10.6646 s, 9.8 MB/s # dd if=/dev/urandom of=random.full bs=100M count=1 1+0 records in 1+0 records out 104857600 bytes (105 MB) copied, 11.132 s, 9.4 MB/s # ls -lh; du -hs * -rw-r--r-- 1 root root 100M 2013-01-04 12:11 random.full -rw-r--r-- 1 root root 100M 2013-01-04 12:10 random.part 100M random.full 100M random.part # dd if=/dev/urandom of=random.part bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 11.3788 s, 9.2 MB/s # dd if=/dev/urandom of=random.full bs=100M count=1 1+0 records in 1+0 records out 104857600 bytes (105 MB) copied, 10.6937 s, 9.8 MB/s # ls -lh; du -hs * -rw-r--r-- 1 root root 100M 2013-01-04 12:11 random.full -rw-r--r-- 1 root root 100M 2013-01-04 12:11 random.part 100M random.full 128M random.part !! i'm on ubuntu 10.04, kernel 2.6.38-13-server #57~lucid1-Ubuntu this issue does not exist as long as the uptime of the server is. i can't trigger this issue on another server that uses 3.2.0-35-generic #55-Ubuntu (12.04). is this a known issue? please tell me when you need additional information. cheers pille PS: when i stat the shell-script to check for the issue, it claims that it uses 128 blocks for 849 bytes: File: `check_issue8634.sh' Size: 849 Blocks: 128 IO Block: 4096 regular file Device: fb03h/64259d Inode: 4708316 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-01-03 10:45:15.000000000 +0000 Modify: 2013-01-04 11:54:01.583582496 +0000 Change: 2013-01-04 11:54:01.583582496 +0000 From bpm@sgi.com Fri Jan 4 10:11:13 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04GBDgW075998 for ; Fri, 4 Jan 2013 10:11:13 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id B61DA30406B; Fri, 4 Jan 2013 08:14:02 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6DCB94266DC; Fri, 4 Jan 2013 10:14:02 -0600 (CST) Date: Fri, 4 Jan 2013 10:14:02 -0600 From: Ben Myers To: pille Cc: xfs@oss.sgi.com Subject: Re: du vs. ls Message-ID: <20130104161402.GM27055@sgi.com> References: <50E6F6D4.5090407@struction.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50E6F6D4.5090407@struction.de> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Pille, On Fri, Jan 04, 2013 at 04:35:48PM +0100, pille wrote: > since some weeks i've noticed that filesizes for new files differ in the > outputs of ls and du. Hmm... > notice the different count of blocks. I wouldn't worry too much about a difference in the block count... > # sha1sum file copy > 23071d0b4caeeb4aa9579283ca67c7c13e66b8ee file > 23071d0b4caeeb4aa9579283ca67c7c13e66b8ee copy ...as long as the checksum is correct! If you want to dig further to understand it better, check out xfs_bmap. This will print out the block map for each file and you can see the differences in allocation. You might be seeing some speculative allocation past eof in the block count that has not yet been cleaned up. Probably nothing to worry about. Regards, Ben From ms@citd.de Fri Jan 4 10:12:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04GC7t4076153 for ; Fri, 4 Jan 2013 10:12:07 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2E91304059 for ; Fri, 4 Jan 2013 08:14:59 -0800 (PST) X-ASG-Debug-ID: 1357316094-04cb6c05a5a465a0001-NocioJ Received: from awesome.dsw2k3.info (awesome.dsw2k3.info [195.71.86.230]) by cuda.sgi.com with ESMTP id Gc3XEkh6iEFD5cUD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Jan 2013 08:14:55 -0800 (PST) X-Barracuda-Envelope-From: ms@citd.de X-Barracuda-Apparent-Source-IP: 195.71.86.230 Received: from localhost (localhost.localdomain [127.0.0.1]) by awesome.dsw2k3.info (Postfix) with ESMTP id A9705C0DFC; Fri, 4 Jan 2013 17:14:53 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at awesome.dsw2k3.info Received: from awesome.dsw2k3.info ([127.0.0.1]) by localhost (awesome.dsw2k3.info [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Aspx9+CMLGgm; Fri, 4 Jan 2013 17:14:52 +0100 (CET) Received: from citd.de (p4FC4D4AE.dip.t-dialin.net [79.196.212.174]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by awesome.dsw2k3.info (Postfix) with ESMTPSA; Fri, 4 Jan 2013 17:14:52 +0100 (CET) Date: Fri, 4 Jan 2013 17:14:49 +0100 From: Matthias Schniedermeyer To: pille Cc: xfs@oss.sgi.com Subject: Re: du vs. ls Message-ID: <20130104161449.GA25093@citd.de> X-ASG-Orig-Subj: Re: du vs. ls References: <50E6F6D4.5090407@struction.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50E6F6D4.5090407@struction.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: awesome.dsw2k3.info[195.71.86.230] X-Barracuda-Start-Time: 1357316094 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-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.2.118921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04.01.2013 16:35, pille wrote: > hi, > > # du -hs file copy > 128M file !! > 100M copy I think you are bitten by "speculative preallocation". When XFS "thinks" you will extent the file in the future it speculativly allocates space. This prevents fragmentation. This fixes itself over time. Either do enough IO that the cache of the copy gets reused or umount or "echo 3 > /proc/sys/vm/drop_caches" (The last one drops the whole cache (except dirty pages) of Linux!) If it is a problem, the behaviour can be disabled by using the mount-option "allocsize", for example: "allocsize=4k" -- Matthias From bpm@sgi.com Fri Jan 4 10:24:08 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04GO8qe077565 for ; Fri, 4 Jan 2013 10:24:08 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42BFB304059 for ; Fri, 4 Jan 2013 08:27:01 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1A5D14266DC; Fri, 4 Jan 2013 10:27:01 -0600 (CST) Resent-From: Ben Myers Resent-Date: Fri, 4 Jan 2013 10:27:01 -0600 Resent-Message-ID: <20130104162701.GB30652@sgi.com> Resent-To: xfs@oss.sgi.com X-Original-To: bpm@localhost Received: from whiskey.americas.sgi.com (localhost [127.0.0.1]) by whiskey.americas.sgi.com (Postfix) with ESMTP id 697774266AC for ; Thu, 3 Jan 2013 16:13:13 -0600 (CST) X-Original-To: bpm@estes.americas.sgi.com Received: from estes.americas by whiskey.americas.sgi.com with IMAP (fetchmail-6.3.9-rc2) for (single-drop); Thu, 03 Jan 2013 16:13:13 -0600 (CST) Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by estes.americas.sgi.com (Postfix) with ESMTP id 50D537000756 for ; Thu, 3 Jan 2013 16:13:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12ABD304039 for ; Thu, 3 Jan 2013 14:13:08 -0800 (PST) X-Barracuda-Redeliver: 1357251187 X-ASG-Debug-ID: 1357250598-04bdf07fae4050d0001-sI5la7 Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yNp3j1TBhqqnPAWo for ; Thu, 03 Jan 2013 14:03:19 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Jan 2013 08:32:49 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tqss9-00073y-1Q; Fri, 04 Jan 2013 09:02:45 +1100 Date: Fri, 4 Jan 2013 09:02:45 +1100 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Message-ID: <20130103220244.GH3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end References: <1355870625-26638-1-git-send-email-david@fromorbit.com> <20130103212222.GJ27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130103212222.GJ27055@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: 1357250598 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Quarantine-Per-User: PER_USER X-Barracuda-Spam-Score: 3.71 X-Barracuda-Spam-Status: Yes, SCORE=3.71 using per-user scores of TAG_LEVEL=2.8 QUARANTINE_LEVEL=3.5 KILL_LEVEL=5.0 tests=MILLION_USD_2, UPPERCASE_75_100_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.78 MILLION_USD_2 Talks about millions of dollars 1.93 UPPERCASE_75_100_2 message body is 75-100% uppercase On Thu, Jan 03, 2013 at 03:22:22PM -0600, Ben Myers wrote: > Dave, > > On Wed, Dec 19, 2012 at 09:43:45AM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > When _xfs_buf_find is passed an out of range address, it will fail > > to find a relevant struct xfs_perag and oops with a null > > dereference. This can happen when trying to walk a filesystem with a > > metadata inode that has a partially corrupted extent map (i.e. the > > block number returned is corrupt, but is otherwise intact) and we > > try to read from the corrupted block address. > > > > In this case, just fail the lookup. If it is readahead being issued, > > it will simply not be done, but if it is real read that fails we > > will get an error being reported. Ideally this case should result > > in an EFSCORRUPTED error being reported, but we cannot return an > > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > > may result in ENOMEM or EIO errors being reported instead. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ > > 1 file changed, 18 insertions(+) > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index a80195b..16249d9 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -487,6 +487,7 @@ _xfs_buf_find( > > struct rb_node *parent; > > xfs_buf_t *bp; > > xfs_daddr_t blkno = map[0].bm_bn; > > + xfs_daddr_t eofs; > > int numblks = 0; > > int i; > > > > @@ -498,6 +499,23 @@ _xfs_buf_find( > > ASSERT(!(numbytes < (1 << btp->bt_sshift))); > > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > > > > + /* > > + * Corrupted block numbers can get through to here, unfortunately, so we > > + * have to check that the buffer falls within the filesystem bounds. > > + */ > > + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > > + if (blkno >= eofs || blkno + numblks > eofs) { > ^^^^^^^^^^^^^^^^^^^^^^ > > That looks suspect to me. I think you need to go over each buffer > individually. I'm not trying to validate every single part of a buffer here - there is no need to do that as the block numbers are validated against device overruns during IO. i.e. we'll get an EIO and a log message telling us an attempt to access beyond the end of the device occurring during IO. I.e. we aren't doing validity checks on whether a buffer has a sane block number or not (that's up to the caller), what we are avoiding is attempting to look up a buffer that is outside of the range of the cache indexing. i.e. it's validating the cache index we are about to use, not passing judgement on whether the caller has asked for a valid set of blocks or not. > I bounced it off Mark and this was his suggestion: > > for (i = 0; i < nmaps; i++) { > if (map[i].bm_bn >= eofs || > map[i].bm_bn + map[i].bm_len >= eofs) > ... Sure, that would work, but we really don't care about the secondary block numbers here - there are completely unused by the buffer cache except for when IO is issued. And given that _xfs_buf_find is probably the hottest function in the XFS code base, avoiding unnecessary checks is somewhat important... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Fri Jan 4 11:10:14 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04HAEaU083429 for ; Fri, 4 Jan 2013 11:10:14 -0600 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB5A7304066 for ; Fri, 4 Jan 2013 09:13:03 -0800 (PST) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r04HD3KY002715 for ; Fri, 4 Jan 2013 11:13:03 -0600 (CST) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id r04HD3Qc002714; Fri, 4 Jan 2013 11:13:03 -0600 (CST) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-125.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20130104171304.536607409@sgi.com> User-Agent: quilt/0.51-1 Date: Fri, 04 Jan 2013 11:13:00 -0600 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 3.0-stable] xfs: fix xfstest 273 in Linux 3.0-stable Content-Disposition: inline; filename=xfs-factor-delalloc-reservations-out-of-xfs_bmapi.patch upstream commit: b64dfe4e180ab5047c59bcbe379538eb23be4d8e Author: Christoph Hellwig Date: Sun Sep 18 20:40:47 2011 +0000 xfs: factor delalloc reservations out of xfs_bmapi Move the reservation of delayed allocations, and addition of delalloc regions to the extent trees into a new helper function. For now this adds some twisted goto logic to xfs_bmapi, but that will be cleaned up in the following patches. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder Ported to Linux 3.0-stable Signed-off-by: Mark Tinguely --- xfstest 273 creates a directory of files created from /dev/zero. It then creates many threads, and each thread uses /bin/cp to recursively copy the original directory. xfstest 273 has been broken from Linux 2.6.39 commit fd0748 to Linux 3.1 rc1+ commit b64dfe. The copy fails and leaves an empty file. Changing the original files from zeros to random values, improves the success rate of the copy. This patch is a port of patch b64dfe. b64dfe is intended to be refactor patch. As best that I can tell, the only difference from the original code is the following if statement is not in the refactor code: /* * Determine state of extent, and the filesystem. * A wasdelay extent has been initialized, so * shouldn't be flagged as unwritten. */ if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) got.br_state = XFS_EXT_UNWRITTEN; } With this patch, xfstest 273 has been working overnight without failure. --- fs/xfs/xfs_bmap.c | 202 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 119 insertions(+), 83 deletions(-) Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4287,6 +4287,120 @@ xfs_bmap_validate_ret( #endif /* DEBUG */ +STATIC int +xfs_bmapi_reserve_delalloc( + struct xfs_inode *ip, + xfs_fileoff_t aoff, + xfs_filblks_t len, + struct xfs_bmbt_irec *got, + struct xfs_bmbt_irec *prev, + xfs_extnum_t *lastx, + int eof) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + xfs_extlen_t alen; + xfs_extlen_t indlen; + xfs_fsblock_t firstblock = NULLFSBLOCK; + struct xfs_btree_cur *cur = NULL; + int tmp_logflags = 0; + char rt = XFS_IS_REALTIME_INODE(ip); + xfs_extlen_t extsz; + int error; + + alen = XFS_FILBLKS_MIN(len, MAXEXTLEN); + if (!eof) + alen = XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); + + /* Figure out the extent size, adjust alen */ + extsz = xfs_get_extsz_hint(ip); + if (extsz) { + /* + * Make sure we don't exceed a single extent length when we + * align the extent by reducing length we are going to + * allocate by the maximum amount extent size aligment may + * require. + */ + alen = XFS_FILBLKS_MIN(len, MAXEXTLEN - (2 * extsz - 1)); + error = xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof, + 1, 0, &aoff, &alen); + ASSERT(!error); + } + + if (rt) + extsz = alen / mp->m_sb.sb_rextsize; + + /* + * Make a transaction-less quota reservation for delayed allocation + * blocks. This number gets adjusted later. We return if we haven't + * allocated blocks already inside this loop. + */ + error = xfs_trans_reserve_quota_nblks(NULL, ip, (long)alen, 0, + rt ? XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + if (error) + return error; + + /* + * Split changing sb for alen and indlen since they could be coming + * from different places. + */ + indlen = (xfs_extlen_t)xfs_bmap_worst_indlen(ip, alen); + ASSERT(indlen > 0); + + if (rt) { + error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, + -((int64_t)extsz), 0); + } else { + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)alen), 0); + } + + if (error) + goto out_unreserve_quota; + + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)indlen), 0); + if (error) + goto out_unreserve_blocks; + + + ip->i_delayed_blks += alen; + + got->br_startoff = aoff; + got->br_startblock = nullstartblock(indlen); + got->br_blockcount = alen; + got->br_state = XFS_EXT_NORM; + + error = xfs_bmap_add_extent(ip, lastx, &cur, got, &firstblock, + NULL, &tmp_logflags, XFS_DATA_FORK); + ASSERT(!error); + ASSERT(!tmp_logflags); + ASSERT(!cur); + + /* + * Update our extent pointer, given that xfs_bmap_add_extent might + * have merged it into one of the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *lastx), got); + + ASSERT(got->br_startoff <= aoff); + ASSERT(got->br_startoff + got->br_blockcount >= aoff + alen); + ASSERT(isnullstartblock(got->br_startblock)); + ASSERT(got->br_state == XFS_EXT_NORM); + return 0; + +out_unreserve_blocks: + if (rt) + xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); + else + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); +out_unreserve_quota: + if (XFS_IS_QUOTA_ON(mp)) + xfs_trans_unreserve_quota_nblks(NULL, ip, alen, 0, rt ? + XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + return error; +} + /* * Map file blocks to filesystem blocks. * File range is given by the bno/len pair. @@ -4325,7 +4439,6 @@ xfs_bmapi( int error; /* error return */ xfs_bmbt_irec_t got; /* current file extent record */ xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extlen_t indlen; /* indirect blocks length */ xfs_extnum_t lastx; /* last useful extent number */ int logflags; /* flags for transaction logging */ xfs_extlen_t minleft; /* min blocks left after allocation */ @@ -4463,43 +4576,9 @@ xfs_bmapi( } minlen = (flags & XFS_BMAPI_CONTIG) ? alen : 1; if (flags & XFS_BMAPI_DELAY) { - xfs_extlen_t extsz; - - /* Figure out the extent size, adjust alen */ - extsz = xfs_get_extsz_hint(ip); - if (extsz) { - /* - * make sure we don't exceed a single - * extent length when we align the - * extent by reducing length we are - * going to allocate by the maximum - * amount extent size aligment may - * require. - */ - alen = XFS_FILBLKS_MIN(len, - MAXEXTLEN - (2 * extsz - 1)); - error = xfs_bmap_extsize_align(mp, - &got, &prev, extsz, - rt, eof, - flags&XFS_BMAPI_DELAY, - flags&XFS_BMAPI_CONVERT, - &aoff, &alen); - ASSERT(!error); - } - - if (rt) - extsz = alen / mp->m_sb.sb_rextsize; - - /* - * Make a transaction-less quota reservation for - * delayed allocation blocks. This number gets - * adjusted later. We return if we haven't - * allocated blocks already inside this loop. - */ - error = xfs_trans_reserve_quota_nblks( - NULL, ip, (long)alen, 0, - rt ? XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); + error = xfs_bmapi_reserve_delalloc(ip, bno, len, + &got, &prev, + &lastx, eof); if (error) { if (n == 0) { *nmap = 0; @@ -4509,51 +4588,7 @@ xfs_bmapi( break; } - /* - * Split changing sb for alen and indlen since - * they could be coming from different places. - */ - indlen = (xfs_extlen_t) - xfs_bmap_worst_indlen(ip, alen); - ASSERT(indlen > 0); - - if (rt) { - error = xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - -((int64_t)extsz), 0); - } else { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)alen), 0); - } - if (!error) { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)indlen), 0); - if (error && rt) - xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - (int64_t)extsz, 0); - else if (error) - xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - (int64_t)alen, 0); - } - - if (error) { - if (XFS_IS_QUOTA_ON(mp)) - /* unreserve the blocks now */ - (void) - xfs_trans_unreserve_quota_nblks( - NULL, ip, - (long)alen, 0, rt ? - XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); - break; - } - - ip->i_delayed_blks += alen; - abno = nullstartblock(indlen); + goto trim_extent; } else { /* * If first time, allocate and fill in @@ -4696,6 +4731,7 @@ xfs_bmapi( * Then deal with the allocated space we found. */ ASSERT(ep != NULL); +trim_extent: if (!(flags & XFS_BMAPI_ENTIRE) && (got.br_startoff + got.br_blockcount > obno)) { if (obno > bno) From bpm@sgi.com Fri Jan 4 12:05:06 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04I55pf089638 for ; Fri, 4 Jan 2013 12:05:06 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E64C8F8050; Fri, 4 Jan 2013 10:07:55 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 48EF14266DC; Fri, 4 Jan 2013 12:07:55 -0600 (CST) Date: Fri, 4 Jan 2013 12:07:55 -0600 From: Ben Myers To: Akinobu Mita Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org, Alex Elder , xfs@oss.sgi.com Subject: Re: [PATCH -v2 12/26] xfs: rename random32() to prandom_u32() Message-ID: <20130104180755.GE30652@sgi.com> References: <1357215562-6288-1-git-send-email-akinobu.mita@gmail.com> <1357215562-6288-13-git-send-email-akinobu.mita@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357215562-6288-13-git-send-email-akinobu.mita@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) Akinobu, On Thu, Jan 03, 2013 at 09:19:08PM +0900, Akinobu Mita wrote: > Use more preferable function name which implies using a pseudo-random > number generator. > > Signed-off-by: Akinobu Mita > Cc: Ben Myers > Cc: Alex Elder > Cc: xfs@oss.sgi.com I didn't realize that random32 was a PRNG. Thanks. Acked-by: From pille+xfs+mailinglist+sgi@struction.de Fri Jan 4 12:17:50 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04IHo44091454 for ; Fri, 4 Jan 2013 12:17:50 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97B28304059 for ; Fri, 4 Jan 2013 10:20:40 -0800 (PST) X-ASG-Debug-ID: 1357323637-04cb6c05a7a4d2e0001-NocioJ Received: from rasta.struction.de (mail.struction.de [85.214.237.111]) by cuda.sgi.com with ESMTP id 2PdjFYDufNsTkb7D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Jan 2013 10:20:39 -0800 (PST) X-Barracuda-Envelope-From: pille+xfs+mailinglist+sgi@struction.de X-Barracuda-Apparent-Source-IP: 85.214.237.111 Received: from e179171135.adsl.alicedsl.de ([85.179.171.135] helo=[192.168.1.166]) by rasta.struction.de with esmtpsa (TLSv1:DHE-RSA-CAMELLIA256-SHA:256) (Exim 4.76) (envelope-from ) id 1TrBsj-0008Rn-H6 for xfs@oss.sgi.com; Fri, 04 Jan 2013 19:20:37 +0100 Message-ID: <50E71D1F.3040103@struction.de> Date: Fri, 04 Jan 2013 19:19:11 +0100 From: pille User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121104 Thunderbird/16.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: du vs. ls References: <50E6F6D4.5090407@struction.de> <20130104161449.GA25093@citd.de> X-ASG-Orig-Subj: Re: du vs. ls In-Reply-To: <20130104161449.GA25093@citd.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Authenticated-User: pille@struction.de X-Authenticator: plain X-Sender-Verify: SUCCEEDED (sender exists & accepts mail) X-Exim-Version: 4.76 (build at 10-Jul-2011 15:10:16) X-Date: 2013-01-04 19:20:37 X-Connected-IP: 85.179.171.135:50578 X-Message-Linecount: 32 X-Body-Linecount: 20 X-Message-Size: 1227 X-Body-Size: 743 X-Barracuda-Connect: mail.struction.de[85.214.237.111] X-Barracuda-Start-Time: 1357323638 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-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.2.118931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- hi mathias and ben, thanks for your fast reply. i've already played around with the allocsize option. xfs_bmap shows continuous files, as expected. i'm just worried, because these mismatches never showed before (while the volume was less than 50% full) and we didn't changed the workload. a quick comparsion shows overhead of about 1% for the whole volume, but given the 28MB overhead for 100MB, i expect this to increase in the future. On 01/04/2013 05:14 PM, Matthias Schniedermeyer wrote: > This fixes itself over time. > Either do enough IO that the cache of the copy gets reused or umount or i cannot understand that. does a already written file gets reorganized due to high I/O, because we've got that periodically. cheers pille From bpm@sgi.com Fri Jan 4 12:41:50 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04IfodV094302 for ; Fri, 4 Jan 2013 12:41:50 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FD2EAC005; Fri, 4 Jan 2013 10:44:39 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 22E6F4266DC; Fri, 4 Jan 2013 12:44:39 -0600 (CST) Date: Fri, 4 Jan 2013 12:44:39 -0600 From: Ben Myers To: Jan Kara Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] Use qa_user and qa_group for test 219 Message-ID: <20130104184439.GN27055@sgi.com> References: <1355830435-5942-1-git-send-email-jack@suse.cz> <50D071BE.20000@redhat.com> <20121218175006.GD5987@quack.suse.cz> <20121218183052.GG27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121218183052.GG27055@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Dec 18, 2012 at 12:30:52PM -0600, Ben Myers wrote: > On Tue, Dec 18, 2012 at 06:50:06PM +0100, Jan Kara wrote: > > On Tue 18-12-12 08:38:06, Brian Foster wrote: > > > On 12/18/2012 06:33 AM, Jan Kara wrote: > > > > Test 219 requires a special user. Use $qa_user and $qa_group (added in this > > > > patch) for that purpose instead of hardcoded uid & gid. This also fixes > > > > a false failure when repquota does not report quota for users not in passwd. > > > > > > > > Signed-off-by: Jan Kara > > > > --- > > > ... > > > > +# check for the fsgqa group on the machine > > > > +# > > > > +_require_group() > > > > +{ > > > > + qa_group=fsgqa > > > > + _cat_group | grep -q $qa_user > > > > + [ "$?" == "0" ] || _notrun "$qa_user user not defined." > > > > > > I assume you mean to use $qa_group instead of $qa_user in the above two > > > lines? > > Bah, right. The names are the same so I didn't notice my copy-and-paste > > mistake :). Fixed version attached. > > The 2nd rev looks good to me. It makes sense that you'd remove the uid > specific golden output since fsgqa isn't going to be the same uid/gid on all > systems. > > Reviewed-by: Ben Myers committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. From bpm@sgi.com Fri Jan 4 14:19:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04KJjT9112560 for ; Fri, 4 Jan 2013 14:19:45 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60234AC004; Fri, 4 Jan 2013 12:22:37 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 127894266DC; Fri, 4 Jan 2013 14:22:37 -0600 (CST) Date: Fri, 4 Jan 2013 14:22:37 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs-oss , Ben England Subject: Re: [PATCH, RFC] mkfs.xfs: go into multidisk mode when geometry is on cmdline Message-ID: <20130104202236.GO27055@sgi.com> References: <50ABB115.9070905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50ABB115.9070905@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Nov 20, 2012 at 10:34:29AM -0600, Eric Sandeen wrote: > In the course of some other investigations, I found that > calc_default_ag_geometry() doesn't go into "multidisk" mode > unless stripe geometry is *detected* (i.e. by the blkid routines). > > Specifying a geometry on the cmdline is *not* sufficient, because > we test (ft.dsunit | ft.dswidth) which are not set by the cmdline > options. > > If we move the AG calculations to after we have set dsunit & dswdith, > then we'll pick up either cmdline-specified or blkid-detected > geometry, and go into "multidisk" mode for AG size/count > calculations in both cases. > > So now for a ~5T fs, for example, we'd make several more > AGs: > > # truncate --size=5t fsfile > # mkfs.xfs -N -d su=128k,sw=8 fsfile | grep agcount > meta-data=fsfile isize=256 agcount=5, agsize=268435424 blks > # mkfs/mkfs.xfs -N -d su=128k,sw=8 fsfile | grep agcount > meta-data=fsfile isize=256 agcount=32, agsize=41943008 blks > > Signed-off-by: Eric Sandeen V3 of patch 1 and patch 2 have been committed to repos on oss.sgi.com From bfoster@redhat.com Fri Jan 4 14:24:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04KO7u3113486 for ; Fri, 4 Jan 2013 14:24:07 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1DFA28F804C for ; Fri, 4 Jan 2013 12:26:57 -0800 (PST) X-ASG-Debug-ID: 1357331216-04bdf0430f4cb790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o9oyxsGjM0w0wj3r for ; Fri, 04 Jan 2013 12:26:56 -0800 (PST) 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 r04KQsLx006013 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Jan 2013 15:26:55 -0500 Received: from laptop.bfoster (vpn-52-224.rdu2.redhat.com [10.10.52.224]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r04KK1dT024672 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 4 Jan 2013 15:20:02 -0500 Message-ID: <50E738F8.400@redhat.com> Date: Fri, 04 Jan 2013 15:18:00 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: pille CC: xfs@oss.sgi.com Subject: Re: du vs. ls References: <50E6F6D4.5090407@struction.de> <20130104161449.GA25093@citd.de> <50E71D1F.3040103@struction.de> X-ASG-Orig-Subj: Re: du vs. ls In-Reply-To: <50E71D1F.3040103@struction.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1357331216 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 01/04/2013 01:19 PM, pille wrote: .... > On 01/04/2013 05:14 PM, Matthias Schniedermeyer wrote: >> This fixes itself over time. >> Either do enough IO that the cache of the copy gets reused or umount or > > i cannot understand that. does a already written file gets reorganized > due to high I/O, because we've got that periodically. > No, it just means that XFS allocates extra blocks beyond the end of the file as the file is extended. Start a streaming write and do a 'watch "du file; ls -l file"' to see how the file size and space used increase differently. Typically this extra space is simply trimmed off when the file is closed, but it can hang around as an optimization if a file is opened, written and closed frequently. If the optimization occurs, the extra space is not trimmed off until the inode is reclaimed from cache. Note that in upcoming kernels (3.8 I believe), we have also added a background scanner (controlled via /proc/sys/fs/xfs/speculative_prealloc_lifetime) that checks for such (non-dirty) files every 5 minutes and trims off the space. Brian > cheers > pille > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Fri Jan 4 15:18:46 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04LIkqw124442 for ; Fri, 4 Jan 2013 15:18:46 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA0C6304039; Fri, 4 Jan 2013 13:21:36 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 7A70A4266DC; Fri, 4 Jan 2013 15:21:36 -0600 (CST) Date: Fri, 4 Jan 2013 15:21:36 -0600 From: Ben Myers To: Koen De Wit Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test for file clone functionality of btrfs ("reflinks") Message-ID: <20130104212136.GP27055@sgi.com> References: <50C762DA.2090907@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C762DA.2090907@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Koen, On Tue, Dec 11, 2012 at 05:44:10PM +0100, Koen De Wit wrote: > Tests included: > - Creating a reflink and overwriting the original contents > - Reflinking a directory tree > - Moving/deleting reflinks > - Diskspace consumption checks > - Cross-filesystem copies (should fail) > - Cross-subvolume copies > > Signed-off-by: Koen De Wit Think someone from the btrfs crew could provide a review? Regards, Ben From kuszmaul@gmail.com Fri Jan 4 16:01:17 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04M1Gag137200 for ; Fri, 4 Jan 2013 16:01:16 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5E8D8F8039 for ; Fri, 4 Jan 2013 14:04:09 -0800 (PST) X-ASG-Debug-ID: 1357337047-04cb6c05a7a5cf90001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id 5dC3rnBkE0VLwF4u (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Jan 2013 14:04:07 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] Received: by mail-ie0-f174.google.com with SMTP id c11so19971963ieb.5 for ; Fri, 04 Jan 2013 14:04:07 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] 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=nnf7s2aR9Mko7n4SORgAKrkJA0ciZ7o4mTz3M44sO84=; b=rPRXqu7ozx0mNWI8B+dh87Wf+89b2EOYLtRsEG/OA4rxqkeyB05gezf7CY922nmSii mwWtW2bnSylPwHRafWbViNJEglH5f9OiNosoyIvUVvi9fp04x6K+cqE2FUq3cgnN48kq 2FBWFvK1lY3SBBziwB+Dea7QA+96/vT27f1Sqio4zKUVoS/wZXKhZ+/eUXnma0rjD9/3 8PjloM5q7usbaO0kk55ySCLhcHC8Bnb3lbsTlpI2TURf8HZ++hDffNgeLMACn2qMz01f EK9GG3l8qP3+01ZqBexGcQnkQCVcIjbH9OHVo+/UYnoB0BeWCD2rUDe6IAnQOlTffNyG 6g6w== MIME-Version: 1.0 Received: by 10.50.187.165 with SMTP id ft5mr46616513igc.12.1357337047191; Fri, 04 Jan 2013 14:04:07 -0800 (PST) Received: by 10.64.58.106 with HTTP; Fri, 4 Jan 2013 14:04:07 -0800 (PST) Received: by 10.64.58.106 with HTTP; Fri, 4 Jan 2013 14:04:07 -0800 (PST) In-Reply-To: <20130104180755.GE30652@sgi.com> References: <1357215562-6288-1-git-send-email-akinobu.mita@gmail.com> <1357215562-6288-13-git-send-email-akinobu.mita@gmail.com> <20130104180755.GE30652@sgi.com> Date: Fri, 4 Jan 2013 17:04:07 -0500 Message-ID: Subject: Re: [PATCH -v2 12/26] xfs: rename random32() to prandom_u32() From: "Bradley C. Kuszmaul" X-ASG-Orig-Subj: Re: [PATCH -v2 12/26] xfs: rename random32() to prandom_u32() To: Ben Myers Cc: Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Akinobu Mita , akpm@linux-foundation.org Content-Type: multipart/alternative; boundary=14dae934102789cfa804d27da873 X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1357337047 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-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.2.118945 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 --14dae934102789cfa804d27da873 Content-Type: text/plain; charset=ISO-8859-1 On Jan 4, 2013 1:08 PM, "Ben Myers" wrote: > > Akinobu, > > On Thu, Jan 03, 2013 at 09:19:08PM +0900, Akinobu Mita wrote: > > Use more preferable function name which implies using a pseudo-random > > number generator. > > > > Signed-off-by: Akinobu Mita > > Cc: Ben Myers > > Cc: Alex Elder > > Cc: xfs@oss.sgi.com > > I didn't realize that random32 was a PRNG. Thanks. Seriously? --14dae934102789cfa804d27da873 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable


On Jan 4, 2013 1:08 PM, "Ben Myers" <bpm@sgi.com> wrote:
>
> Akinobu,
>
> On Thu, Jan 03, 2013 at 09:19:08PM +0900, Akinobu Mita wrote:
> > Use more preferable function name which implies using a pseudo-ra= ndom
> > number generator.
> >
> > Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> > Cc: Ben Myers <bpm@sgi.com&= gt;
> > Cc: Alex Elder <elder@kern= el.org>
> > Cc: xfs@oss.sgi.com
>
> I didn't realize that random32 was a PRNG. =A0Thanks.
Seriously?

--14dae934102789cfa804d27da873-- From bpm@sgi.com Fri Jan 4 16:08:30 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r04M8Ter138009 for ; Fri, 4 Jan 2013 16:08:29 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6FCFCAC004; Fri, 4 Jan 2013 14:11:19 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 094DE4266DC; Fri, 4 Jan 2013 16:11:18 -0600 (CST) Date: Fri, 4 Jan 2013 16:11:18 -0600 From: Ben Myers To: Alex Elder Cc: xfs@oss.sgi.com Subject: Re: [PATCH, v2] xfsdump: fix format string in restore_spec() Message-ID: <20130104221118.GR27055@sgi.com> References: <50D7A1C2.9000609@codefaber.co.uk> <50DB794F.7010906@inktank.com> <50DC56C6.5010607@inktank.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50DC56C6.5010607@inktank.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Dec 27, 2012 at 08:10:14AM -0600, Alex Elder wrote: > Nigel Tamplin reported getting a seg fault in xfsrestore when a path > name was too long. He correctly diagnosed that the problem was due > to an extra "%s" format specifier in the format value passed to a > call to mlog(). This patch corrects that. > > Signed-off-by: Alex Elder > Reported-by: Nigel Tamplin > Tested-by: Nigel Tamplin Looks good! committed to git://oss.sgi.com/xfs/cmds/xfsdump.git. Thanks Nigel and Alex. From most3785@163.com Fri Jan 4 20:57:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_95,MIME_8BIT_HEADER, MIME_BASE64_BLANKS,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r052vRt3168847 for ; Fri, 4 Jan 2013 20:57:28 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 924A6304032 for ; Fri, 4 Jan 2013 19:00:17 -0800 (PST) X-ASG-Debug-ID: 1357354811-04bdf0430f4e0750001-NocioJ Received: from m50-138.163.com (m50-138.163.com [123.125.50.138]) by cuda.sgi.com with ESMTP id quuy5gKNvMyx2o1T for ; Fri, 04 Jan 2013 19:00:12 -0800 (PST) X-Barracuda-Envelope-From: most3785@163.com X-Barracuda-Apparent-Source-IP: 123.125.50.138 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=Received:Reply-To:Message-ID:From:To:Subject:Date: MIME-Version:Content-Type:Content-Transfer-Encoding; bh=YBvu4KO+ PH8M/iAYFHxBB5gqoSUiFIiz9E4vM8a1t70=; b=Su3p44xVI3zO8+eqSpyQ48+q noM4zUmlxPtCiDfEhaa90ziU5+06+JNxcpsNF7BBYTdHEQISUKtYGs9EX9KniJXx /gXtgsFS3uXv/0+LLFEkts3i/H6DIcdfw/phUc8pCAW5x3tJ7qveUDEGiB4AP3Ml TlZ3g5uy7AnT+ErQ6yQ= Received: from hcedqt (unknown [120.86.36.141]) by smtp1 (Coremail) with SMTP id C9GowAB3QpQ5l+dQnyI2AA--.560S2; Sat, 05 Jan 2013 11:00:09 +0800 (CST) Reply-To: <13824384583@139.com> Message-ID: <9BE99C6A07F86205F205B6FE53C4C13A@hcedqt> From: =?gb2312?B?zO+hoQ==?= To: Subject: Date: Sat, 5 Jan 2013 10:59:54 +0800 X-ASG-Orig-Subj: MIME-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-CM-TRANSID:C9GowAB3QpQ5l+dQnyI2AA--.560S2 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUT4lkUUUUU X-CM-SenderInfo: xprv3jqxyvqiywtou0bp/1tbiQBKbwU9o2o6kbgAAsx X-Barracuda-Connect: m50-138.163.com[123.125.50.138] X-Barracuda-Start-Time: 1357354812 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.30 X-Barracuda-Spam-Status: No, SCORE=1.30 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_BLANKS, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118965 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_BASE64_BLANKS RAW: Extra blank lines in base64 encoding 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header IA0KICAgINPQILXNILXjICChvmZhob8gIMaxIL/JIOlfDQoNCiAgICC8sdDoICDH67vYuLQgwarP tQ0K From grigor@lns.pnpi.spb.ru Fri Jan 4 21:01:21 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=BAYES_40,TVD_SPACE_RATIO, TVD_SPACE_RATIO_MINFP autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0531KLe169562 for ; Fri, 4 Jan 2013 21:01:21 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E6A628F8035 for ; Fri, 4 Jan 2013 19:04:10 -0800 (PST) X-ASG-Debug-ID: 1357355043-04cbb035a5a2dad0001-NocioJ Received: from lns.pnpi.spb.ru (lns.pnpi.spb.ru [91.151.181.62]) by cuda.sgi.com with ESMTP id Jr6zfFLbIh6laTxF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Jan 2013 19:04:04 -0800 (PST) X-Barracuda-Envelope-From: grigor@lns.pnpi.spb.ru X-Barracuda-Apparent-Source-IP: 91.151.181.62 Received: from [115.240.70.77] by lns.pnpi.spb.ru with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.80.1) (envelope-from ) id 1TrJ0i-0004l8-92; Sat, 05 Jan 2013 05:57:27 +0400 Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Upgrade To: Recipients X-ASG-Orig-Subj: Upgrade From: Date: Sat, 05 Jan 2013 07:26:10 +0530 Message-Id: Sender: grigor@lns.pnpi.spb.ru X-Barracuda-Connect: lns.pnpi.spb.ru[91.151.181.62] X-Barracuda-Start-Time: 1357355044 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-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0035, BSF_SC0_SA609_NRN, BSF_SC0_SA_TO_FROM_ADDR_MATCH, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.118965 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.10 BSF_SC0_SA609_NRN Custom Rule SA609_NRN 0.50 BSF_SC0_MV0035 Custom Rule BSF_SC0_MV0035 click here https://docs.google.com/spreadsheet/viewform?formkey=3DdGktUzZ3R= nE4a3d2MnBCQVBSTUU3Q3c6MQ From yongtaofu@gmail.com Sat Jan 5 07:44:49 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, MIME_8BIT_HEADER,T_DKIM_INVALID,T_FRT_BELOW2,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05DinAX259844 for ; Sat, 5 Jan 2013 07:44:49 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E40E304039 for ; Sat, 5 Jan 2013 05:47:43 -0800 (PST) X-ASG-Debug-ID: 1357393633-04cb6c05a6a7ad70001-NocioJ Received: from mail-wg0-f54.google.com (mail-wg0-f54.google.com [74.125.82.54]) by cuda.sgi.com with ESMTP id 8FQDLxpBdxq2xQYS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Jan 2013 05:47:14 -0800 (PST) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.54 Received: by mail-wg0-f54.google.com with SMTP id fg15so8044475wgb.21 for ; Sat, 05 Jan 2013 05:47:13 -0800 (PST) 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 :content-transfer-encoding; bh=dPnmTuMHdTvAZC+ahxmCY5fatDR+OO+3ljYats8NWqY=; b=edkFn3otGwgXr8RUsidK0SRB0GifoB0rBuSZ9mkf9lFAQhB8X2yobpblYjHDF9IlIa Tc5sgebLblO86G6j7ySq/hXgbJhTqd6/xdLmLE62FkO7sbZGtSQ+9VAc8Yqe9g6EbKBI Wz9YHyHM83IVdYM3YSU3W9eu3o2btFUo0uaytY6yqDZ4OuYwCT81GDNMxIkdYYf2SzYP kDM6MURw8zsVC9az4AJsEl07Mi9TE3jsPjjKcuLI1DcH1Xou5hM9jUvHt0dd18qPTBDZ XYi+/D19yipnaVTEClGS07eTTjpxUhGAw7FXo/0/eUZdW79bY4c8rjPc3WyukKmjJFoL uPmQ== MIME-Version: 1.0 Received: by 10.180.33.202 with SMTP id t10mr2181706wii.3.1357393633552; Sat, 05 Jan 2013 05:47:13 -0800 (PST) Received: by 10.217.2.146 with HTTP; Sat, 5 Jan 2013 05:47:13 -0800 (PST) Date: Sat, 5 Jan 2013 21:47:13 +0800 Message-ID: Subject: help xfs filesystem crash From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: help xfs filesystem crash To: xfs@oss.sgi.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-wg0-f54.google.com[74.125.82.54] X-Barracuda-Start-Time: 1357393634 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-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.2.119005 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 Dear xfs experts, We're running glusterfs over top of xfs and recently we have encountered xfs filesystem crash two times on two different servers. Can you kindly help to give me some insight of how to debug this kind of failure? Bellow is xfs filesystem crash messages: server1: Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_iunlink_remove: xfs_inotobp() returned error 22. Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_inactive: xfs_ifree returned error 22 Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa029f20a Dec 28 16:55:01 localhost kernel: XFS (dm-0): I/O Error Detected. Shutting down filesystem Dec 28 16:55:01 localhost kernel: XFS (dm-0): Please umount the filesystem and rectify the problem(s) Dec 28 16:55:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:55:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:56:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:56:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:57:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:57:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:58:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:58:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:59:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 16:59:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:00:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:00:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:01:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:01:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:02:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:02:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:03:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:03:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:04:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:04:20 localhost sshd[20609]: Accepted publickey for fuyongtao from 10.1.12.99 port 56514 ssh2 Dec 28 17:04:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:05:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:05:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:06:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:06:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:07:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:07:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:08:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:08:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:08:55 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:08:55 localhost kernel: XFS (dm-0): xfs_log_force: error 5 return= ed. Dec 28 17:08:55 localhost kernel: XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 1056 of file fs/xfs/linux-2.6/xfs_buf.c. Return address =3D 0xffffffffa02a6213 server2: Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa022420a Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_imap_to_bp: xfs_trans_read_buf() returned error 5. Dec 27 00:30:02 localhost kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Dec 27 00:30:02 localhost kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Dec 27 00:30:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:30:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:31:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:31:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:32:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:32:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:33:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:33:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:34:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:34:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:35:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:35:32 localhost smbd[25481]: [2012/12/27 00:35:32.424643, 0] printing/print_cups.c:109(cups_connect) Dec 27 00:35:32 localhost smbd[25481]: Unable to connect to CUPS server localhost:631 - Connection refused Dec 27 00:35:32 localhost smbd[2061]: [2012/12/27 00:35:32.424906, 0] printing/print_cups.c:468(cups_async_callback) Dec 27 00:35:32 localhost smbd[2061]: failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL Dec 27 00:35:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:36:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. Dec 27 00:36:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returne= d. --=20 =B7=FB=D3=C0=CC=CE From sandeen@sandeen.net Sat Jan 5 09:37:48 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER, T_FRT_BELOW2 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05FbmVo008888 for ; Sat, 5 Jan 2013 09:37:48 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F20CD304032 for ; Sat, 5 Jan 2013 07:40:38 -0800 (PST) X-ASG-Debug-ID: 1357400437-04cb6c05a8a7da70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VTPApv7Egqr2qugt for ; Sat, 05 Jan 2013 07:40:37 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DD1C563C605D; Sat, 5 Jan 2013 09:40:36 -0600 (CST) Message-ID: <50E84977.4070807@sandeen.net> Date: Sat, 05 Jan 2013 09:40:39 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: xfs@oss.sgi.com Subject: Re: help xfs filesystem crash References: X-ASG-Orig-Subj: Re: help xfs filesystem crash In-Reply-To: X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357400437 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On 1/5/13 7:47 AM, wrote: > Dear xfs experts, > > We're running glusterfs over top of xfs and recently we have > encountered xfs filesystem crash two times on two different servers. > Can you kindly help to give me some insight of how to debug this kind > of failure? Please include more information about your system; at a minimum, what kernel are you running? See also: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F for a list of all relevant information to gather when reporting a problem. If this is a distribution kernel, in particular if you are talking about Red Hat Storage on Red Hat Enterprise Linux, you should probably contact your Red Hat support people first. > Bellow is xfs filesystem crash messages: > server1: > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_iunlink_remove: > xfs_inotobp() returned error 22. that is EINVAL, returned from xfs_inotbp, which tries to map an inode number to the buffer containing the on-disk version of the inode. It would take some debugging (and at least some more information about your system) to know where the EINVAL came from. > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_inactive: xfs_ifree > returned error 22 > Dec 28 16:55:01 localhost kernel: XFS (dm-0): So freeing the inode encountered a runtime error (EINVAL) and then: > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa029f20a > Dec 28 16:55:01 localhost kernel: XFS (dm-0): I/O Error Detected. > Shutting down filesystem the filesystem shut down as a result. -Eric > Dec 28 16:55:01 localhost kernel: XFS (dm-0): Please umount the > filesystem and rectify the problem(s) > Dec 28 16:55:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:55:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:56:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:56:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:57:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:57:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:58:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:58:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:59:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 16:59:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:00:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:00:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:01:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:01:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:02:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:02:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:03:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:03:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:04:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:04:20 localhost sshd[20609]: Accepted publickey for > fuyongtao from 10.1.12.99 port 56514 ssh2 > Dec 28 17:04:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:05:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:05:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:06:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:06:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:07:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:07:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:08:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:08:50 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:08:55 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:08:55 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. > Dec 28 17:08:55 localhost kernel: XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 1056 of file > fs/xfs/linux-2.6/xfs_buf.c. Return address = 0xffffffffa02a6213 > > > server2: > Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned error 22 > Dec 27 00:30:02 localhost kernel: XFS (sdb): > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa022420a > Dec 27 00:30:02 localhost kernel: XFS (sdb): xfs_imap_to_bp: > xfs_trans_read_buf() returned error 5. > Dec 27 00:30:02 localhost kernel: XFS (sdb): I/O Error Detected. > Shutting down filesystem > Dec 27 00:30:02 localhost kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s) > Dec 27 00:30:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:30:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:31:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:31:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:32:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:32:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:33:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:33:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:34:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:34:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:35:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:35:32 localhost smbd[25481]: [2012/12/27 00:35:32.424643, 0] > printing/print_cups.c:109(cups_connect) > Dec 27 00:35:32 localhost smbd[25481]: Unable to connect to CUPS > server localhost:631 - Connection refused > Dec 27 00:35:32 localhost smbd[2061]: [2012/12/27 00:35:32.424906, 0] > printing/print_cups.c:468(cups_async_callback) > Dec 27 00:35:32 localhost smbd[2061]: failed to retrieve printer list: > NT_STATUS_UNSUCCESSFUL > Dec 27 00:35:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:36:27 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > Dec 27 00:36:57 localhost kernel: XFS (sdb): xfs_log_force: error 5 returned. > > From joe.landman@gmail.com Sat Jan 5 09:45:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_FRT_BELOW2,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05FjJCq009625 for ; Sat, 5 Jan 2013 09:45:19 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6852B8F8035 for ; Sat, 5 Jan 2013 07:48:10 -0800 (PST) X-ASG-Debug-ID: 1357400886-04cbb035a4a409c0001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id uiRihFePB5j1EVca (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Jan 2013 07:48:06 -0800 (PST) X-Barracuda-Envelope-From: joe.landman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] Received: by mail-ie0-f179.google.com with SMTP id k14so20904446iea.38 for ; Sat, 05 Jan 2013 07:48:06 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=ZpI1PElSTfzWjyj8SbMp15G9DTeDplpFZ9gwn/fgo4s=; b=V2v6z6IxpVwn30j3NYHmLc8sJ6vooyd3YkZhwnJehUCkztvaDz9XRjjd4Pb0GPBcE4 MNZbENDB/A7TQ4zp0OEVqjiH4aV4Ndz7slOF/rM5Pe1p8Wo8b3FH7dlvpCK0Jk84rtUF v6IMU8e5eflldkWuQ3jHYQQb/V2kyh8+QhyQcJgw5yrar4/diTNyheb/DPv+/l7E7xlR NlBkwmg9B29AFq1ReM1xdmV3BMPK1vDR/7UBiYwlQVk2CtEbOhscpXlha+mczBovme+H 2/feu6rZFHqWH3gZfJzWvJrmPMNgyx1HV6ZihmIZlgMfMHK7RGLSB/U9I2is04fmkvmJ 9JEQ== X-Received: by 10.50.57.232 with SMTP id l8mr1727223igq.54.1357400886236; Sat, 05 Jan 2013 07:48:06 -0800 (PST) Received: from [192.168.5.129] ([70.88.96.213]) by mx.google.com with ESMTPS id j11sm2535748igc.5.2013.01.05.07.48.05 (version=SSLv3 cipher=OTHER); Sat, 05 Jan 2013 07:48:05 -0800 (PST) Message-ID: <50E84B34.5060201@gmail.com> Date: Sat, 05 Jan 2013 10:48:04 -0500 From: Joe Landman User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: help xfs filesystem crash References: X-ASG-Orig-Subj: Re: help xfs filesystem crash In-Reply-To: Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1357400886 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-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.2.119011 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 01/05/2013 08:47 AM, wrote: > Dear xfs experts, > > We're running glusterfs over top of xfs and recently we have > encountered xfs filesystem crash two times on two different servers. > Can you kindly help to give me some insight of how to debug this kind > of failure? > Bellow is xfs filesystem crash messages: > server1: > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_inactive: xfs_ifree > returned error 22 > Dec 28 16:55:01 localhost kernel: XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa029f20a > Dec 28 16:55:01 localhost kernel: XFS (dm-0): I/O Error Detected. > Shutting down filesystem > Dec 28 16:55:01 localhost kernel: XFS (dm-0): Please umount the > filesystem and rectify the problem(s) > Dec 28 16:55:20 localhost kernel: XFS (dm-0): xfs_log_force: error 5 returned. xfs sitting atop dm here. This looks like a dm issue, possibly the dm LV going away, or going offline. I'd start with tracing at the device level upwards to the LV, see if this is still alive and well behaved From kuszmaul@gmail.com Sat Jan 5 10:28:53 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_20,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05GSqor013657 for ; Sat, 5 Jan 2013 10:28:53 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BF8F304032 for ; Sat, 5 Jan 2013 08:31:43 -0800 (PST) X-ASG-Debug-ID: 1357403499-04cb6c05a5a7ee30001-NocioJ Received: from mail-ie0-f182.google.com (mail-ie0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id bLzsXHtS9yerLvA4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Jan 2013 08:31:39 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] Received: by mail-ie0-f182.google.com with SMTP id s9so21251076iec.27 for ; Sat, 05 Jan 2013 08:31:39 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=98xPYWZn3KwSnhzkOowLpC5OldZsDnLUYjisaXsDPjE=; b=Kj9qWu5kEl9LtPOde4zsGReGAD4U7fBdQJc++HatrsjfG0HDoKV1tXDUjwGXTYQkOC lvjtw/u34jVBbmU4fa48Oe8RQhJRBNmn+d40chgF+ebMtM7p42qT7/ARCv8V+7yphC75 gsUEOABjyY95kk52pODszrqzUHGunYKXi0jR1Lz6h2nLlVkS7xAtwq3ASP9ocVCEk8K/ sV3WOo+ymv/P8K8xVbohgVH6D5I7fTBA6eYtpi1CzRWvBxGL6YaRddRSj81HCxK4FN9p Y4g6i26zYkBegGHpvKQttPa06c+tkcNW+haMpLAEmLk8wMdr4vZWlkUmfj81IZRZSnFM CqNg== X-Received: by 10.50.187.165 with SMTP id ft5mr1863768igc.12.1357403499336; Sat, 05 Jan 2013 08:31:39 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Sat, 5 Jan 2013 08:31:19 -0800 (PST) In-Reply-To: <20130103220717.GI3120@dastard> References: <20130102232706.GD3120@dastard> <20130103220717.GI3120@dastard> From: "Bradley C. Kuszmaul" Date: Sat, 5 Jan 2013 11:31:19 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=14dae93410276514b404d28d213b X-Barracuda-Connect: mail-ie0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1357403499 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-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.2.119015 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 --14dae93410276514b404d28d213b Content-Type: text/plain; charset=ISO-8859-1 What are the requirements for alignment of punched holes? Is 512-byte alignment good enough? (I'll have 512-byte alignment anyway since I'll be using direct I/O on these files.) -Bradley --14dae93410276514b404d28d213b Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable What are the requirements for alignment of punched holes? =A0 =A0Is 512-byt= e alignment good enough? =A0(I'll have 512-byte alignment anyway since = I'll be using direct I/O on these files.)

-Bradley

--14dae93410276514b404d28d213b-- From tinguely@sgi.com Sat Jan 5 14:25:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05KPjCg040369 for ; Sat, 5 Jan 2013 14:25:45 -0600 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83D3B8F8039 for ; Sat, 5 Jan 2013 12:28:36 -0800 (PST) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r05KSY9s006112 for ; Sat, 5 Jan 2013 14:28:34 -0600 (CST) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id r05KSYxM006111; Sat, 5 Jan 2013 14:28:34 -0600 (CST) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-125.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20130105213420.307598929@sgi.com> User-Agent: quilt/0.51-1 Date: Sat, 05 Jan 2013 14:34:15 -0600 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: serialize iclog write of xlog_cil_push Content-Disposition: inline; filename=xfs-serialize-iclog-write-of-cil-push.patch The back-end of xlog_cil_push() allows multiple push sequences to write to the xlog at the same time. This will cause problems for recovery and also could cause the xlog_cil_committed() callback to be called out of sequence. This was discovered with an EFI/EFD misorder. There are several (5) active sequence pushes and 3 completed pushes. The callback for the sequence (2) holding the EFD is being processed but the callback for the sequence (1) holding the EFI has not yet been processed. The xlog_cil_committed() callback misorder happens because the buffer that contains the sequence ticket is filled by another sequence push and the callback for the buffer write happens before the callback is placed onto that buffer. This patch serializes the xlog_write() so that only one sequence (the lowest) is written at a time. This will also stop the race between xlog_commit_record() and the adding of the callback onto the buffer containing the sequence commit record. --- fs/xfs/xfs_log_cil.c | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) Index: b/fs/xfs/xfs_log_cil.c =================================================================== --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -390,6 +390,7 @@ xlog_cil_push( struct xfs_log_vec lvhdr = { NULL }; xfs_lsn_t commit_lsn; xfs_lsn_t push_seq; + xfs_lsn_t lowest_seq; if (!cil) return 0; @@ -495,6 +496,24 @@ xlog_cil_push( up_write(&cil->xc_ctx_lock); /* + * write the entried and checkpoint into the log. Strictly order + * the commit records so replay will get them in the right order. + */ +restart: + spin_lock(&cil->xc_cil_lock); + lowest_seq = ctx->sequence; + list_for_each_entry(new_ctx, &cil->xc_committing, committing) { + /* find the lowest sequence not yet committed */ + if (lowest_seq > new_ctx->sequence && !new_ctx->commit_lsn) + lowest_seq = new_ctx->sequence; + } + if (ctx->sequence != lowest_seq) { + xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); + goto restart; + } + spin_unlock(&cil->xc_cil_lock); + + /* * Build a checkpoint transaction header and write it to the log to * begin the transaction. We need to account for the space used by the * transaction header here as it is not accounted for in xlog_write(). @@ -521,30 +540,6 @@ xlog_cil_push( if (error) goto out_abort_free_ticket; - /* - * now that we've written the checkpoint into the log, strictly - * order the commit records so replay will get them in the right order. - */ -restart: - spin_lock(&cil->xc_cil_lock); - list_for_each_entry(new_ctx, &cil->xc_committing, committing) { - /* - * Higher sequences will wait for this one so skip them. - * Don't wait for own own sequence, either. - */ - if (new_ctx->sequence >= ctx->sequence) - continue; - if (!new_ctx->commit_lsn) { - /* - * It is still being pushed! Wait for the push to - * complete, then start again from the beginning. - */ - xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); - goto restart; - } - } - spin_unlock(&cil->xc_cil_lock); - /* xfs_log_done always frees the ticket on error. */ commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); if (commit_lsn == -1) @@ -556,7 +551,6 @@ restart: error = xfs_log_notify(log->l_mp, commit_iclog, &ctx->log_cb); if (error) goto out_abort; - /* * now the checkpoint commit is complete and we've attached the * callbacks to the iclog we can assign the commit LSN to the context From david@fromorbit.com Sat Jan 5 16:51:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r05Mpjtu054648 for ; Sat, 5 Jan 2013 16:51:45 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D0A5304039 for ; Sat, 5 Jan 2013 14:54:39 -0800 (PST) X-ASG-Debug-ID: 1357426473-04cbb035a7a4a990001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OORWIrhX7xHZTJYl for ; Sat, 05 Jan 2013 14:54:34 -0800 (PST) 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: AmMPAHuu6FB5LJFt/2dsb2JhbABFhVCyAIYGF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWtQYUkQEDlgqQSoMI Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Jan 2013 09:24:32 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TrcdL-0003SI-CG; Sun, 06 Jan 2013 09:54:31 +1100 Date: Sun, 6 Jan 2013 09:54:31 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130105225431.GL3120@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: <20130102232706.GD3120@dastard> <20130103220717.GI3120@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: 1357426474 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Jan 05, 2013 at 11:31:19AM -0500, Bradley C. Kuszmaul wrote: > What are the requirements for alignment of punched holes? Is 512-byte > alignment good enough? (I'll have 512-byte alignment anyway since I'll be > using direct I/O on these files.) No alignment at all - they have byte range granularity. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 5 18:05:48 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0605mGj061589 for ; Sat, 5 Jan 2013 18:05:48 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32211304039 for ; Sat, 5 Jan 2013 16:08:39 -0800 (PST) X-ASG-Debug-ID: 1357430916-04cbb035a7a4ca60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vGw1cR3Bt4nZFtVB for ; Sat, 05 Jan 2013 16:08:37 -0800 (PST) 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: AmQPAJC/6FB5LJFt/2dsb2JhbABFhVCxf4YGF3OCHgEBBAE6HCMFCwgDFAQJJQ8FJQMhEx6HcwW1ERSMY4QeA5JYgzKJToZ8gwg Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Jan 2013 10:38:36 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Trdn0-0003ZG-P3; Sun, 06 Jan 2013 11:08:34 +1100 Date: Sun, 6 Jan 2013 11:08:34 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push Message-ID: <20130106000834.GM3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push References: <20130105213420.307598929@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130105213420.307598929@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: 1357430916 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 05, 2013 at 02:34:15PM -0600, Mark Tinguely wrote: > The back-end of xlog_cil_push() allows multiple push sequences > to write to the xlog at the same time. It does this by design, and has since day zero. > This will cause problems > for recovery and also could cause the xlog_cil_committed() callback > to be called out of sequence. Log recovery is supposed to be able to handle it just fine in that recovery only replays up to the last checkpoint with a valid commit record. Checkpoints that don't have valid commit records - no matter the order they are written - will terminate recovery at the LSN of the lowest entire commit. > This was discovered with an EFI/EFD misorder. There are several (5) active > sequence pushes and 3 completed pushes. The callback for the sequence (2) > holding the EFD is being processed but the callback for the sequence (1) > holding the EFI has not yet been processed. What are the symptoms shown when this problem is hit? AFAICT, there is no problem here - this comment above __xfs_efi_release() explains that EFI/EFD misordering is expected: /* * Freeing the efi requires that we remove it from the AIL if it has already * been placed there. However, the EFI may not yet have been placed in the AIL * when called by xfs_efi_release() from EFD processing due to the ordering of * committed vs unpin operations in bulk insert operations. Hence the * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees * the EFI. */ This was introduced in this commit: $ gl -n 1 b199c8a4 commit b199c8a4ba11879df87daad496ceee41fdc6aa82 Author: Dave Chinner Date: Mon Dec 20 11:59:49 2010 +1100 xfs: Pull EFI/EFD handling out from under the AIL lock EFI/EFD interactions are protected from races by the AIL lock. They are the only type of log items that require the the AIL lock to serialise internal state, so they need to be separated from the AIL lock before we can do bulk insert operations on the AIL. To acheive this, convert the counter of the number of extents in the EFI to an atomic so it can be safely manipulated by EFD processing without locks. Also, convert the EFI state flag manipulations to use atomic bit operations so no locks are needed to record state changes. Finally, use the state bits to determine when it is safe to free the EFI and clean up the code to do this neatly. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Hence if there is some problem being seen as a result of allowing this behaviour, I'd like to know what that problem actually is.... > The xlog_cil_committed() callback misorder happens because the buffer that > contains the sequence ticket is filled by another sequence push and the > callback for the buffer write happens before the callback is placed onto > that buffer. I'm not sure I follow you here. xfs_log_done() takes a reference to the iclog that the commit record is added to, and I/O cannot be issued on that iclog until the reference count drops to zero. Hence the sequence of writing the commit record, obtaining the commit_lsn, adding the callbacks to the iclog and releasing the iclog are atomic from an I/O perspective, and IO is only issued when the reference count falls to zero. And given that xlog_write() uses the same reference counting to provide the same guarantees, I cannot see how concurrent in-memory writes to the same iclog could cause IO completion callbacks to be issued out of order. > This patch serializes the xlog_write() so that only one sequence (the lowest) > is written at a time. This will also stop the race between xlog_commit_record() > and the adding of the callback onto the buffer containing the sequence commit > record. The point of the separation of the commit record from the commit "data" is to allow interleaving of multiple transaction commits without serialising the transaction commit process. It's actually a significant performance win when dealing with synchronous transaction heavy workloads as it allows multiple concurrent synchronous transactions to aggregate into a single log buffer. From that perspective alone, that's a NACK from me to to this patch... Without knowing what the problem you are actually seeing is, I can't make any further suggestions or comments about whether there is a real issue here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 5 18:15:56 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER, T_FRT_BELOW2 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r060Fuht062655 for ; Sat, 5 Jan 2013 18:15:56 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BACFF8F8035 for ; Sat, 5 Jan 2013 16:18:47 -0800 (PST) X-ASG-Debug-ID: 1357431521-04cbb035a4a4d380001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9wsM504O0cHKazqB for ; Sat, 05 Jan 2013 16:18:43 -0800 (PST) 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: AmgPAOjA6FB5LJFt/2dsb2JhbABFhVBpsRaGBhdzgh4BAQUjDwEjFQ4QCAECGAICBSECAg8FJQMhE4gWixOad48JFIEOjmCBEwOWCpBKgwg Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Jan 2013 10:48:41 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Trdwm-0003ah-J8; Sun, 06 Jan 2013 11:18:40 +1100 Date: Sun, 6 Jan 2013 11:18:40 +1100 From: Dave Chinner To: =?utf-8?B?56ym5rC45rab?= Cc: xfs@oss.sgi.com Subject: Re: help xfs filesystem crash Message-ID: <20130106001840.GN3120@dastard> X-ASG-Orig-Subj: Re: help xfs filesystem crash References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1357431521 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 05, 2013 at 09:47:13PM +0800, 符永涛 wrote: > Dear xfs experts, > > We're running glusterfs over top of xfs and recently we have > encountered xfs filesystem crash two times on two different servers. > Can you kindly help to give me some insight of how to debug this kind > of failure? > Bellow is xfs filesystem crash messages: > server1: > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_inactive: xfs_ifree > returned error 22 That's a sign of a corrupt inode unlinked list. It's also an oldish kernel - xfs_inotobp() doesn't exist anymore in the mainline kernel... What does 'xfs_repair -n /dev/dm-0' tell you about the unlinked lists? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 5 18:17:40 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r060HegR062826 for ; Sat, 5 Jan 2013 18:17:40 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90AFE8F8039 for ; Sat, 5 Jan 2013 16:20:34 -0800 (PST) X-ASG-Debug-ID: 1357431632-04cbb035a5a4d450001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 2QsrUNsPN6O5uH5K for ; Sat, 05 Jan 2013 16:20:33 -0800 (PST) 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: AmMPAJfC6FB5LJFt/2dsb2JhbABFhVCxf4YGF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWtRMUkQEDlgqJToZ8gwg Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Jan 2013 10:50:32 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TrdyZ-0003aq-Id; Sun, 06 Jan 2013 11:20:31 +1100 Date: Sun, 6 Jan 2013 11:20:31 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push Message-ID: <20130106002031.GO3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push References: <20130105213420.307598929@sgi.com> <20130106000834.GM3120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130106000834.GM3120@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: 1357431632 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jan 06, 2013 at 11:08:34AM +1100, Dave Chinner wrote: > On Sat, Jan 05, 2013 at 02:34:15PM -0600, Mark Tinguely wrote: > > The back-end of xlog_cil_push() allows multiple push sequences > > to write to the xlog at the same time. > > It does this by design, and has since day zero. FWIW, I meant to say that the XFS log has done this since day zero (i.e. interleaved concurrent commits since 1994), not imply that it's a new feature of delayed logging.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kuszmaul@gmail.com Sat Jan 5 18:50:18 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r060oIFh066513 for ; Sat, 5 Jan 2013 18:50:18 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E5215AC001 for ; Sat, 5 Jan 2013 16:53:08 -0800 (PST) X-ASG-Debug-ID: 1357433586-04bdf04310504260001-NocioJ Received: from mail-vc0-f176.google.com (mail-vc0-f176.google.com [209.85.220.176]) by cuda.sgi.com with ESMTP id T7TqITdeQrZ3R4Cd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Jan 2013 16:53:07 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.176] Received: by mail-vc0-f176.google.com with SMTP id fo13so17874814vcb.35 for ; Sat, 05 Jan 2013 16:53:06 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:cc:content-type; bh=S9PDfQQSp1yjGjxNKabDHQizJtdy1Ct1Cnh4pt15dlU=; b=pILDIgPxhU1xWjoK5UG+7KBabFHDCW5lB42uQ/WMggFeDolTpzXWQH6RAAgFtY51tW 9CzbbB0ALJxdBEZspM5OrxpxDoZjhYTbVF9wVq/J9tBzUX0siZVOHWENsEW2Qb4DX9rl AKkKr3Lj4OramGT43ZutEXsNTAvcrwdgW8eon+TR3r/0RJ9dYmLAUm3ulbCXFIfl5tRY UE0YKDgfG/vhF3/h8ibUcOOadxhH6+PVNmZXTKliPEywz0BjL5xzi/26Gbjx8JUDdveB xKNj4VA1DGJwm1YGfXks0YsI37kAIPetfqYZIYY92WQ8tNbAej1UKIiTCYOTuzary7Wu FpHg== Received: by 10.58.118.115 with SMTP id kl19mr65522535veb.6.1357433586622; Sat, 05 Jan 2013 16:53:06 -0800 (PST) MIME-Version: 1.0 Received: by 10.58.34.226 with HTTP; Sat, 5 Jan 2013 16:52:46 -0800 (PST) From: "Bradley C. Kuszmaul" Date: Sat, 5 Jan 2013 19:52:46 -0500 Message-ID: Subject: Fragmentation and hole punching To: Dave Chinner X-ASG-Orig-Subj: Fragmentation and hole punching Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e01160374bca0e304d294229f X-Barracuda-Connect: mail-vc0-f176.google.com[209.85.220.176] X-Barracuda-Start-Time: 1357433587 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-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.2.119048 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 --089e01160374bca0e304d294229f Content-Type: text/plain; charset=ISO-8859-1 I'm using hole punching now in my code. Should I have any concerns about fragmentation? Here's how I use it: I perform pwrite() operations of various sizes. These are "blocks" in my application. These blocks are always 4KB-aligned, but they are of many different sizes. Most writes are near a megabyte in size, but hardly ever exactly a megabyte. I also punch holes. The holes always correspond exactly to a previously written pwrite(). A pwrite() always writes into a hole. (It never overwrites current data). For example I might write 1MB at offset 1MB then write 3MB at offset 2MB then punch a hole of size 1MB at offset 1MB then do some more activity elsewhere in the file then write 512K at an offset of 1MB (partially filling the hole that I had punched) I have a lot of experience running this code on xfs without the hole punching. The pattern of the pwrite()'s are the same with or without hole punching. So I'd hope that the hole punching didn't make things any worse, and maybe made things better. Can I expect that this will work reasonably well? By the way, all of your help has been outstanding. -Bradley --089e01160374bca0e304d294229f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I'm using hole punching now in my code. =A0Should I have any concerns a= bout fragmentation?

Here's how I use it:
= =A0I perform pwrite() operations of various sizes. =A0These are "block= s" in my application. =A0These blocks are always 4KB-aligned, but they= are of many different sizes. =A0Most writes are near a megabyte in size, b= ut hardly ever exactly a megabyte.
=A0I also punch holes. =A0The holes always correspond exactly to a pre= viously written pwrite().
=A0A pwrite() always writes into a hole= . =A0(It never overwrites current data).

For examp= le I might write
=A01MB at offset 1MB
then write 3MB at offset 2MB
= then punch a hole of size 1MB at offset 1MB
then do some more act= ivity elsewhere in the file
then write 512K at an offset of 1MB (= partially filling the hole that I had punched)

I have a lot of experience running this code on xfs wit= hout the hole punching. =A0The pattern of the pwrite()'s are the same w= ith or without hole punching. =A0So I'd hope that the hole punching did= n't make things any worse, and maybe made things better.

Can I expect that this will work reasonably well? =A0

By the way, all of your help has been outstanding.<= /div>

-Bradley
--089e01160374bca0e304d294229f-- From yongtaofu@gmail.com Sat Jan 5 21:34:31 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_45,MIME_8BIT_HEADER,T_DKIM_INVALID,T_FRT_BELOW2 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r063YVPF085422 for ; Sat, 5 Jan 2013 21:34:31 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2E9388F8035 for ; Sat, 5 Jan 2013 19:37:25 -0800 (PST) X-ASG-Debug-ID: 1357443443-04cb6c05a5a90dd0001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id CyRLEH99JknIktvk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Jan 2013 19:37:23 -0800 (PST) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id qd14so21162369ieb.20 for ; Sat, 05 Jan 2013 19:37:23 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] 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:content-transfer-encoding; bh=0mR6vg0oMXjUKXx7NWjp5DUdEK+QZmuWewFvRPjksSE=; b=rwZH1LVbVo0x1r1cab66gyySMuT4gAVrimvJ9o2z6KdAyhJTg5iobmuoJGB1BZVWBl Xivf4zoTLurvYy6QBA3GnlmGrF+Rj5nRW89i17n1R02CI+dbraBYYma+usU2x6CpWKKn 6w1G/Mg3+HnikJUy4uqun9q7l6iGg9DFa9/2Ko54YklpjpqQulr/PI3M8natTXiWw+Pw NNrDmwErxzzDp/nl4xv5FbIUPgngI2JqGYhRqutyQBm3qCqTwN7JX5RJamz+2tAWdFOG SRQKDqzHAe1eqGh9Lj8j0F625dN5SVDlx2X+/6CQaqNh+kMGzb3vadTw3mI7hxuV+Uxd yxtg== MIME-Version: 1.0 Received: by 10.50.237.104 with SMTP id vb8mr2642217igc.11.1357443443576; Sat, 05 Jan 2013 19:37:23 -0800 (PST) Received: by 10.43.102.134 with HTTP; Sat, 5 Jan 2013 19:37:23 -0800 (PST) In-Reply-To: <20130106001840.GN3120@dastard> References: <20130106001840.GN3120@dastard> Date: Sun, 6 Jan 2013 11:37:23 +0800 Message-ID: Subject: Re: help xfs filesystem crash From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: help xfs filesystem crash To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1357443443 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-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.2.119057 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 Hi david, Thank you for your help. One of our machine is still online so I can only run xfs_repair on one mach= ine. Bellow is the output: xfs_repair -n /dev/sdb |tee xfs_repair.logPhase 1 - find and verify superbl= ock=A1=AD Phase 2 - using internal log - scan filesystem freespace and inode maps=A1=AD agi unlinked bucket 1 is 4293569 in ag 0 (inode=3D4293569) agi unlinked bucket 3 is 4455043 in ag 0 (inode=3D4455043) agi unlinked bucket 22 is 3949334 in ag 0 (inode=3D3949334) agi unlinked bucket 24 is 3960984 in ag 0 (inode=3D3960984) agi unlinked bucket 28 is 4193564 in ag 0 (inode=3D4193564) agi unlinked bucket 38 is 4722982 in ag 0 (inode=3D4722982) - found root in ode chunk Phase 3 - for each AG=A1=AD - scan (but don't clear) agi unlinked lists=A1=AD - process known inodes and perform inode discovery=A1=AD - agno =3D 0 7f2631b97700: Badness in key lookup (length) bp=3D(bno 1974656, len 16384 bytes) key=3D(bno 1974656, len 8192 bytes) 7f2631b97700: Badness in key lookup (length) bp=3D(bno 1980464, len 16384 bytes) key=3D(bno 1980464, len 8192 bytes) 7f2631b97700: Badness in key lookup (length) bp=3D(bno 2096752, len 16384 bytes) key=3D(bno 2096752, len 8192 bytes) 7f2631b97700: Badness in key lookup (length) bp=3D(bno 2146768, len 16384 bytes) key=3D(bno 2146768, len 8192 bytes) 7f2631b97700: Badness in key lookup (length) bp=3D(bno 2227504, len 16384 bytes) key=3D(bno 2227504, len 8192 bytes) 7f2631b97700: Badness in key lookup (length) bp=3D(bno 2361472, len 16384 bytes) key=3D(bno 2361472, len 8192 bytes) - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - process newly discovered in odes.. Phase 4 - check for duplicate blocks=A1=AD - setting up duplicate extent list=A1=AD - check for inodes claiming duplicate blocks=A1=AD - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 4 - agno =3D 5 - agno =3D 7 - agno =3D 9 - agno =3D 6 - agno =3D 3 - agno =3D 8 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity=A1=AD - traversing filesystem =A1=AD - traversal finished =A1=AD - moving disconnected inodes to lost+found =A1=AD disconnected inode 4723622, would move to lost+found Phase 7 - verify link counts=A1=AD would have reset inode 4723622 nlinks from 0 to 1 No modify flag set, skipping filesystem flush and exiting.. xfs_check /dev/sdb;echo $? [root@10.10.135.25 ~]# xfs_check /dev/sdb;echo $? agi unlinked bucket 1 is 4293569 in ag 0 (inode=3D4293569) agi unlinked bucket 3 is 4455043 in ag 0 (inode=3D4455043) agi unlinked bucket 22 is 3949334 in ag 0 (inode=3D3949334) agi unlinked bucket 24 is 3960984 in ag 0 (inode=3D3960984) agi unlinked bucket 28 is 4193564 in ag 0 (inode=3D4193564) agi unlinked bucket 38 is 4722982 in ag 0 (inode=3D4722982) allocated inode 4723622 has 0 link count 3 xfs_repair -n /dev/sdb;echo $? Phase 1 - find and verify superblock=A1=AD Phase 2 - using internal log - scan filesystem freespace and inode maps=A1=AD agi unlinked bucket 1 is 4293569 in ag 0 (inode=3D4293569) agi unlinked bucket 3 is 4455043 in ag 0 (inode=3D4455043) agi unlinked bucket 22 is 3949334 in ag 0 (inode=3D3949334) agi unlinked bucket 24 is 3960984 in ag 0 (inode=3D3960984) agi unlinked bucket 28 is 4193564 in ag 0 (inode=3D4193564) agi unlinked bucket 38 is 4722982 in ag 0 (inode=3D4722982) - found root in ode chunk Phase 3 - for each AG=A1=AD - scan (but don't clear) agi unlinked lists=A1=AD - process known inodes and perform inode discovery=A1=AD - agno =3D 0 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 1974656, len 16384 bytes) key=3D(bno 1974656, len 8192 bytes) 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 1980464, len 16384 bytes) key=3D(bno 1980464, len 8192 bytes) 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 2096752, len 16384 bytes) key=3D(bno 2096752, len 8192 bytes) 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 2146768, len 16384 bytes) key=3D(bno 2146768, len 8192 bytes) 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 2227504, len 16384 bytes) key=3D(bno 2227504, len 8192 bytes) 7f35d7d9e700: Badness in key lookup (length) bp=3D(bno 2361472, len 16384 bytes) key=3D(bno 2361472, len 8192 bytes) - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - process newly discovered in odes.. Phase 4 - check for duplicate blocks=A1=AD - setting up duplicate extent list=A1=AD - check for inodes claiming duplicate blocks=A1=AD - agno =3D 0 - agno =3D 2 - agno =3D 4 - agno =3D 3 - agno =3D 7 - agno =3D 9 - agno =3D 1 - agno =3D 8 - agno =3D 6 - agno =3D 5 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity=A1=AD - traversing filesystem =A1=AD - traversal finished =A1=AD - moving disconnected inodes to lost+found =A1=AD disconnected inode 4723622, would move to lost+found Phase 7 - verify link counts=A1=AD would have reset inode 4723622 nlinks from 0 to 1 No modify flag set, skipping filesystem flush and exiting. 1. 2013/1/6, Dave Chinner : > On Sat, Jan 05, 2013 at 09:47:13PM +0800, =B7=FB=D3=C0=CC=CE wrote: >> Dear xfs experts, >> >> We're running glusterfs over top of xfs and recently we have >> encountered xfs filesystem crash two times on two different servers. >> Can you kindly help to give me some insight of how to debug this kind >> of failure? >> Bellow is xfs filesystem crash messages: >> server1: >> Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_iunlink_remove: >> xfs_inotobp() returned error 22. >> Dec 28 16:55:01 localhost kernel: XFS (dm-0): xfs_inactive: xfs_ifree >> returned error 22 > > That's a sign of a corrupt inode unlinked list. It's also an oldish > kernel - xfs_inotobp() doesn't exist anymore in the mainline > kernel... > > What does 'xfs_repair -n /dev/dm-0' tell you about the unlinked > lists? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --=20 =B7=FB=D3=C0=CC=CE From jeff.liu@oracle.com Sat Jan 5 21:47:26 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_91 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r063lQ7j092148 for ; Sat, 5 Jan 2013 21:47:26 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2EB4304032 for ; Sat, 5 Jan 2013 19:50:17 -0800 (PST) X-ASG-Debug-ID: 1357444216-04bdf04310509c10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id t3NsxoAzFQZzH6iT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 05 Jan 2013 19:50:16 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r063oFPh003877 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 6 Jan 2013 03:50:15 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r063oEZo003919 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 6 Jan 2013 03:50:14 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r063oEsb031064 for ; Sat, 5 Jan 2013 21:50:14 -0600 Received: from [192.168.1.103] (/123.119.103.23) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sat, 05 Jan 2013 19:50:14 -0800 Message-ID: <50E8F470.5020305@oracle.com> Date: Sun, 06 Jan 2013 11:50:08 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfs: stop using simple_strtoul() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: stop using simple_strtoul() 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: 1357444216 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-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.2.119059 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, This small patch convert xfs_parseargs() and suffix_strtoul() to use kstrtoint() instead of simple_strtoul() which is deprecated. Thanks, -Jeff Signed-off-by: Jie Liu --- fs/xfs/xfs_super.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 26a09bd..f73235f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -137,12 +137,14 @@ static const match_table_t tokens = { {Opt_err, NULL} }; - -STATIC unsigned long -suffix_strtoul(char *s, char **endp, unsigned int base) +STATIC int +suffix_kstrtoint( + char *s, + unsigned int base) { - int last, shift_left_factor = 0; - char *value = s; + char *value = s; + int shift_left_factor = 0; + int last, res; last = strlen(value) - 1; if (value[last] == 'K' || value[last] == 'k') { @@ -158,7 +160,8 @@ suffix_strtoul(char *s, char **endp, unsigned int base) value[last] = '\0'; } - return simple_strtoul((const char *)s, endp, base) << shift_left_factor; + kstrtoint(s, base, &res); + return res << shift_left_factor; } /* @@ -174,7 +177,7 @@ xfs_parseargs( char *options) { struct super_block *sb = mp->m_super; - char *this_char, *value, *eov; + char *this_char, *value; int dsunit = 0; int dswidth = 0; int iosize = 0; @@ -230,14 +233,14 @@ xfs_parseargs( this_char); return EINVAL; } - mp->m_logbufs = simple_strtoul(value, &eov, 10); + kstrtoint(value, 10, &mp->m_logbufs); } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } - mp->m_logbsize = suffix_strtoul(value, &eov, 10); + mp->m_logbsize = suffix_kstrtoint(value, 10); } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", @@ -266,7 +269,7 @@ xfs_parseargs( this_char); return EINVAL; } - iosize = simple_strtoul(value, &eov, 10); + kstrtoint(value, 10, &iosize); iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { if (!value || !*value) { @@ -274,7 +277,7 @@ xfs_parseargs( this_char); return EINVAL; } - iosize = suffix_strtoul(value, &eov, 10); + iosize = suffix_kstrtoint(value, 10); iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_GRPID) || !strcmp(this_char, MNTOPT_BSDGROUPS)) { @@ -296,14 +299,14 @@ xfs_parseargs( this_char); return EINVAL; } - dsunit = simple_strtoul(value, &eov, 10); + kstrtoint(value, 10, &dsunit); } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } - dswidth = simple_strtoul(value, &eov, 10); + kstrtoint(value, 10, &dswidth); } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { -- 1.7.9.5 From sandeen@sandeen.net Sat Jan 5 23:19:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r065Jjp0105034 for ; Sat, 5 Jan 2013 23:19:45 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 822938F8039 for ; Sat, 5 Jan 2013 21:22:36 -0800 (PST) X-ASG-Debug-ID: 1357449751-04bdf07fae47d940001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id hCtZGZvokpE0lSG6 for ; Sat, 05 Jan 2013 21:22:32 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8EFD363C605D; Sat, 5 Jan 2013 23:22:31 -0600 (CST) Message-ID: <50E90A16.8060302@sandeen.net> Date: Sat, 05 Jan 2013 23:22:30 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: "Bradley C. Kuszmaul" CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: Fragmentation and hole punching References: X-ASG-Orig-Subj: Re: Fragmentation and hole punching In-Reply-To: X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357449752 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119063 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 1/5/13 6:52 PM, Bradley C. Kuszmaul wrote: > I'm using hole punching now in my code. Should I have any concerns about fragmentation? > > Here's how I use it: > I perform pwrite() operations of various sizes. These are "blocks" in > my application. These blocks are always 4KB-aligned, but they are of > many different sizes. Most writes are near a megabyte in size, but > hardly ever exactly a megabyte. > I also punch holes. The holes always correspond exactly to a previously written pwrite(). > A pwrite() always writes into a hole. (It never overwrites current data). Just out of curiosity - what is the end goal here, why all the punching-and-rewriting? > For example I might write > 1MB at offset 1MB > then write 3MB at offset 2MB > then punch a hole of size 1MB at offset 1MB > then do some more activity elsewhere in the file > then write 512K at an offset of 1MB (partially filling the hole that I had punched) > > I have a lot of experience running this code on xfs without the hole > punching. The pattern of the pwrite()'s are the same with or without > hole punching. So I'd hope that the hole punching didn't make things > any worse, and maybe made things better. Once you free up blocks, there is always a chance that some other file will end up claiming them, so I can see fragmentation downsides; not sure I see any upside there. OTOH, fragmentation may not matter at all, depending on your access patterns etc. My first guess for the hole-punching reason is to maximize available space; that makes me think you are really utilizing all available space; that makes me think you might really get files intermingled on disk if you're running things this way. But if you're seeking around in files to read at random offsets anyway, it might not matter. -Eric > Can I expect that this will work reasonably well? > > By the way, all of your help has been outstanding. > > -Bradley > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From liub.liubo@gmail.com Sun Jan 6 08:30:10 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r06EUAS0172123 for ; Sun, 6 Jan 2013 08:30:10 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A70CAC002 for ; Sun, 6 Jan 2013 06:33:01 -0800 (PST) X-ASG-Debug-ID: 1357482777-04bdf04312516fa0001-NocioJ Received: from mail-pa0-f47.google.com (mail-pa0-f47.google.com [209.85.220.47]) by cuda.sgi.com with ESMTP id XVoXqrnArksbwrpF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 06 Jan 2013 06:32:57 -0800 (PST) X-Barracuda-Envelope-From: liub.liubo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.47 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.47] Received: by mail-pa0-f47.google.com with SMTP id fa10so10161887pad.34 for ; Sun, 06 Jan 2013 06:32:57 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.47] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.47] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer; bh=guhVtzY/jUZmZZnPP+86DPmnFki70pzK+8GzHw4gt1k=; b=WDOZFf4t+vVqn5ilNueN6qKoWfdpzx+aIBV62QjPjSWOZ/Az4vpx3uS/VIq705h3Kz j8kngqQpQbLYerElbrwxr/opCfAh3II7sjRxn/Y1GuqgM2flUZsjTtaOrYjo2RNxE1W2 vdRPEXTMnU+eyG6SC6juNIM9o+66xYJ0tkU3Br/IhB8ERlqqj6b0VyPI1siYrgM0N4eC UJewx+OyT5rvZbzZ/j5WFVu3iKUkhwsQx8P5oYCuU+MEzzqRG7hYTmMmOhO9kx2r4mWe 7CKlz3tkWTS3FqvLEhcmFu8PmPUYDn03+Jtsjkj+VJ9yg1j+bqtRKVwFo9bLu4EEwNPb E5aw== X-Received: by 10.68.231.10 with SMTP id tc10mr176592687pbc.81.1357482777023; Sun, 06 Jan 2013 06:32:57 -0800 (PST) Received: from liubo.localdomain ([117.22.57.224]) by mx.google.com with ESMTPS id sk1sm35884267pbc.0.2013.01.06.06.32.53 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 06 Jan 2013 06:32:56 -0800 (PST) From: Liu Bo To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Subject: [PATCH] xfstests: fix 284 ENOENT error Date: Sun, 6 Jan 2013 22:30:38 +0800 X-ASG-Orig-Subj: [PATCH] xfstests: fix 284 ENOENT error Message-Id: <1357482638-27129-1-git-send-email-liub.liubo@gmail.com> X-Mailer: git-send-email 1.7.7.6 X-Barracuda-Connect: mail-pa0-f47.google.com[209.85.220.47] X-Barracuda-Start-Time: 1357482777 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-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.2.119095 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 284 misses a 'mkdir' operation. Signed-off-by: Liu Bo --- 284 | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/284 b/284 index c00e6f1..7f4a630 100644 --- a/284 +++ b/284 @@ -44,6 +44,7 @@ _create_file() if [ $1 -ne 2 ]; then tmpfile="$SCRATCH_MNT/tmp_file" else + mkdir -p $SCRATCH_MNT/tmp_dir tmpfile="$SCRATCH_MNT/tmp_dir/tmp_file" fi -- 1.7.7.6 From david@fromorbit.com Sun Jan 6 13:51:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER, T_FRT_BELOW2 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r06Jp7OV224380 for ; Sun, 6 Jan 2013 13:51:07 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC145AC002 for ; Sun, 6 Jan 2013 11:53:58 -0800 (PST) X-ASG-Debug-ID: 1357502036-04cb6c05a6aa6780001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id yQdLhUGQaOBj6wXE for ; Sun, 06 Jan 2013 11:53:56 -0800 (PST) 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: AiwOALnV6VB5LJFt/2dsb2JhbAArGoVQabEXhgQXc4IeAQEFIw8BIxwHEAgBAhgCAgUhAgIPBSUDIROIFg0sizmad48GFIEOjmCBEwOWCpBKgwg Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail05.adl6.internode.on.net with ESMTP; 07 Jan 2013 06:23:55 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TrwI5-0005GL-Sl; Mon, 07 Jan 2013 06:53:53 +1100 Date: Mon, 7 Jan 2013 06:53:53 +1100 From: Dave Chinner To: =?utf-8?B?56ym5rC45rab?= Cc: xfs@oss.sgi.com Subject: Re: help xfs filesystem crash Message-ID: <20130106195353.GP3120@dastard> X-ASG-Orig-Subj: Re: help xfs filesystem crash References: <20130106001840.GN3120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1357502036 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Sun, Jan 06, 2013 at 11:37:23AM +0800, 符永涛 wrote: > Hi david, > Thank you for your help. > One of our machine is still online so I can only run xfs_repair on one machine. > Bellow is the output: > xfs_repair -n /dev/sdb |tee xfs_repair.logPhase 1 - find and verify superblock… > > Phase 2 - using internal log > > - scan filesystem freespace and inode maps… > > agi unlinked bucket 1 is 4293569 in ag 0 (inode=4293569) > agi unlinked bucket 3 is 4455043 in ag 0 (inode=4455043) > agi unlinked bucket 22 is 3949334 in ag 0 (inode=3949334) > agi unlinked bucket 24 is 3960984 in ag 0 (inode=3960984) > agi unlinked bucket 28 is 4193564 in ag 0 (inode=4193564) > agi unlinked bucket 38 is 4722982 in ag 0 (inode=4722982) OK, so there are inodes on the unlinked list, though the lists don't appear to be corrupt... > - found root in ode chunk > Phase 3 - for each AG… > - scan (but don't clear) agi unlinked lists… > - process known inodes and perform inode discovery… > - agno = 0 > 7f2631b97700: Badness in key lookup (length) > bp=(bno 1974656, len 16384 bytes) key=(bno 1974656, len 8192 bytes) > 7f2631b97700: Badness in key lookup (length) > bp=(bno 1980464, len 16384 bytes) key=(bno 1980464, len 8192 bytes) > 7f2631b97700: Badness in key lookup (length) > bp=(bno 2096752, len 16384 bytes) key=(bno 2096752, len 8192 bytes) > 7f2631b97700: Badness in key lookup (length) > bp=(bno 2146768, len 16384 bytes) key=(bno 2146768, len 8192 bytes) > 7f2631b97700: Badness in key lookup (length) > bp=(bno 2227504, len 16384 bytes) key=(bno 2227504, len 8192 bytes) > 7f2631b97700: Badness in key lookup (length) > bp=(bno 2361472, len 16384 bytes) key=(bno 2361472, len 8192 bytes) But it looks like the inodes (and their index records) might have already been freed. Can you provide the rest of the information that Eric asked for? i.e: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F that will help me calculate the inode number/block number relationship to determine is this is the case or not. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Jan 6 13:55:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r06Jt0AG224814 for ; Sun, 6 Jan 2013 13:55:00 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CFA4304048 for ; Sun, 6 Jan 2013 11:57:52 -0800 (PST) X-ASG-Debug-ID: 1357502269-04bdf0430f51f0d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 4GrLshqVBHAxABud for ; Sun, 06 Jan 2013 11:57:50 -0800 (PST) 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: AiYOALnV6VB5LJFt/2dsb2JhbABFhVCyAIYEF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWtW8UkQEDlgqQSoMI Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail05.adl6.internode.on.net with ESMTP; 07 Jan 2013 06:27:49 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TrwLs-0005Gs-Sd; Mon, 07 Jan 2013 06:57:48 +1100 Date: Mon, 7 Jan 2013 06:57:48 +1100 From: Dave Chinner To: Eric Sandeen Cc: "Bradley C. Kuszmaul" , xfs@oss.sgi.com Subject: Re: Fragmentation and hole punching Message-ID: <20130106195748.GQ3120@dastard> X-ASG-Orig-Subj: Re: Fragmentation and hole punching References: <50E90A16.8060302@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50E90A16.8060302@sandeen.net> 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: 1357502269 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 05, 2013 at 11:22:30PM -0600, Eric Sandeen wrote: > On 1/5/13 6:52 PM, Bradley C. Kuszmaul wrote: > > I'm using hole punching now in my code. Should I have any > > concerns about fragmentation? > > > > Here's how I use it: I perform pwrite() operations of various > > sizes. These are "blocks" in my application. These blocks are > > always 4KB-aligned, but they are of many different sizes. Most > > writes are near a megabyte in size, but hardly ever exactly a > > megabyte. I also punch holes. The holes always correspond > > exactly to a previously written pwrite(). A pwrite() always > > writes into a hole. (It never overwrites current data). > > Just out of curiosity - what is the end goal here, why all the > punching-and-rewriting? > > > For example I might write 1MB at offset 1MB then write 3MB at > > offset 2MB then punch a hole of size 1MB at offset 1MB then do > > some more activity elsewhere in the file then write 512K at an > > offset of 1MB (partially filling the hole that I had punched) > > > > I have a lot of experience running this code on xfs without the > > hole punching. The pattern of the pwrite()'s are the same with > > or without hole punching. So I'd hope that the hole punching > > didn't make things any worse, and maybe made things better. > > Once you free up blocks, there is always a chance that some other > file will end up claiming them, so I can see fragmentation > downsides; not sure I see any upside there. > > OTOH, fragmentation may not matter at all, depending on your > access patterns etc. > > My first guess for the hole-punching reason is to maximize > available space; that makes me think you are really utilizing all > available space; that makes me think you might really get files > intermingled on disk if you're running things this way. > > But if you're seeking around in files to read at random offsets > anyway, it might not matter. That's the determine factor, really. If read/write is random and is aligned to the holes being punched, then fragmentation may not affect performance in any way. There will be increased fragmentation as a result of punching holes and rewriting like this, and if you then read or rewrite the data sequentially the fragmentation is likely to have significant impact on performance as the filesystem ages. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Jan 6 14:13:39 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r06KDd8c226937 for ; Sun, 6 Jan 2013 14:13:39 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03929304053 for ; Sun, 6 Jan 2013 12:16:33 -0800 (PST) X-ASG-Debug-ID: 1357503392-04cbb035a7a677b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id BII1vlRSIvEF5EZN for ; Sun, 06 Jan 2013 12:16:32 -0800 (PST) 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: AicOAFHa6VB5LJFt/2dsb2JhbABFhVCyAIYEF3OCHgEBBAE6HCMFCwgDGAklDwUlAyETiBEFtXcUjGaEGwOWColOhnyDCIFW Received: from ppp121-44-145-109.lns20.syd7.internode.on.net (HELO dastard) ([121.44.145.109]) by ipmail05.adl6.internode.on.net with ESMTP; 07 Jan 2013 06:46:31 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Trwdt-0005JV-VA; Mon, 07 Jan 2013 07:16:26 +1100 Date: Mon, 7 Jan 2013 07:16:25 +1100 From: Dave Chinner To: "Michael L. Semon" Cc: xfs@oss.sgi.com Subject: Re: Is xfs_fsr broken for Linux 3.8-rc? Message-ID: <20130106201625.GR3120@dastard> X-ASG-Orig-Subj: Re: Is xfs_fsr broken for Linux 3.8-rc? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1357503392 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Jan 04, 2013 at 01:08:06AM -0500, Michael L. Semon wrote: > Hi! I upgraded the Linux kernel, glibc (to 2.17), and xfsprogs (to > 3.1.9) on three 32-bit x86 PCs. Only one of them was upgraded to > Linux 3.8-rc2, and I get xfs_fsr output like this, regardless of which > XFS filesystem on which xfs_fsr is used: > > XFS_IOC_SWAPEXT failed: ino=1048813: Invalid argument That's the kernel telling you that it couldn't swap the extents on a file that xfs-fsr was tryng to defrag. Newer kernels are much more strict about swapping extents to avoid filesystem corruptions that can occur as a result inode fork offset mismatchs. If you trace the fsr run with: # trace-cmd record -e xfs_swap\* xfs_fsr ..... And then dump the trace to a file via: # trace-cmd report > some_output_file.txt and attach some_output_file.txt then I can probably tell you exactly why the request to swap extents is failing. > If you can reproduce this problem, could you tell me by which kernel > or xfsprogs version this will be fixed? Really, a fix isn't really > needed, merely an assurance that XFS will still be production-ready > when kernel 3.8 has its main release. I think you've got that the wrong way around - it's the older versions of XFS that are unsafe as they can silently corrupt files, not the newer kernels that issue a warning after detecting this problem and hence return an error... Cheers, Dave. -- Dave Chinner david@fromorbit.com From takeuchi_satoru@jp.fujitsu.com Mon Jan 7 01:50:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_44, J_CHICKENPOX_48,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r077ov3Q049386 for ; Mon, 7 Jan 2013 01:50:57 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9AF628F8050 for ; Sun, 6 Jan 2013 23:53:52 -0800 (PST) X-ASG-Debug-ID: 1357545230-04cb6c05a8abb870001-NocioJ Received: from fgwmail6.fujitsu.co.jp (fgwmail6.fujitsu.co.jp [192.51.44.36]) by cuda.sgi.com with ESMTP id jluDsbPz7c1B5gVD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 06 Jan 2013 23:53:51 -0800 (PST) X-Barracuda-Envelope-From: takeuchi_satoru@jp.fujitsu.com X-Barracuda-Apparent-Source-IP: 192.51.44.36 Received: from m4.gw.fujitsu.co.jp (unknown [10.0.50.74]) by fgwmail6.fujitsu.co.jp (Postfix) with ESMTP id 641343EE0B6 for ; Mon, 7 Jan 2013 16:53:49 +0900 (JST) Received: from smail (m4 [127.0.0.1]) by outgoing.m4.gw.fujitsu.co.jp (Postfix) with ESMTP id 4870545DE52 for ; Mon, 7 Jan 2013 16:53:49 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (s4.gw.fujitsu.co.jp [10.0.50.94]) by m4.gw.fujitsu.co.jp (Postfix) with ESMTP id 238E145DE4D for ; Mon, 7 Jan 2013 16:53:49 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id 187C71DB8041 for ; Mon, 7 Jan 2013 16:53:49 +0900 (JST) Received: from g01jpexchkw12.g01.fujitsu.local (g01jpexchkw12.g01.fujitsu.local [10.0.194.51]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id C83E31DB803B for ; Mon, 7 Jan 2013 16:53:48 +0900 (JST) Received: from [127.0.0.1] (10.124.101.217) by g01jpexchkw12.g01.fujitsu.local (10.0.194.51) with Microsoft SMTP Server id 14.2.309.2; Mon, 7 Jan 2013 16:53:48 +0900 X-SecurityPolicyCheck: OK by SHieldMailChecker v1.7.4 Message-ID: <50EA7EF8.2000501@jp.fujitsu.com> Date: Mon, 7 Jan 2013 16:53:28 +0900 From: Satoru Takeuchi User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Satoru Takeuchi CC: Dave Chinner , xfs ML Subject: Re: [BUG] xfs_quota: can't handle the users managed by LDAP References: <50ADB27F.8070806@jp.fujitsu.com> <20121122233757.GY2591@dastard> <50B32CC1.3020907@jp.fujitsu.com> <50B4198E.7080408@jp.fujitsu.com> <20121127025728.GU32450@dastard> <50B46B66.2040908@jp.fujitsu.com> <20121127210518.GN6434@dastard> <50B6AD80.4090900@jp.fujitsu.com> X-ASG-Orig-Subj: Re: [BUG] xfs_quota: can't handle the users managed by LDAP In-Reply-To: <50B6AD80.4090900@jp.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: fgwmail6.fujitsu.co.jp[192.51.44.36] X-Barracuda-Start-Time: 1357545231 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-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_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119162 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address (2012/11/29 9:34), Satoru Takeuchi wrote: > (2012/11/28 6:05), Dave Chinner wrote: >> On Tue, Nov 27, 2012 at 04:27:34PM +0900, Satoru Takeuchi wrote: >>>>>>>> Current xfs_quota (I pulled xfsprogs today) seems not be able to the users >>>>>>>> managed by LDAP. There is no patch since I'm not good at LDAP and don't know >>>>>>>> the root cause yet ;-( >>>>>>>> >>>>>>>> Step to reproduce(in this case, "sat" is the user managed by LDAP): >>>>>>>> =============================================================================== >>>>>>>> # uname -r >>>>>>>> 3.7.0-rc5 >>>>>>>> # mount -o loop,usrquota xfs.img mnt >>>>>>>> # xfsprogs/quota/xfs_quota -xc "limit bsoft=10M bhard=10M sat" /dev/loop0 >>>>>>>> xfs_quota: invalid user name: sat # denied >>>>>>>> # su sat >>>>>>>> $ # But this user acutally exists. >>>>>>>> =============================================================================== >> ..... >> >>> So there is a problem in "report" subcommand. Refer to report_without_U.log, >>> I found "quotactl(Q_XGETQUOTA|GRPQUOTA, ...) is only called for local users >>> and it's because that getpwent() only returned only local users. >> >> Yes, it appears from the strace that glibc is only reading >> /etc/passwd and not querying the ldap server. >> >>> open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3 >>> fstat(3, {st_mode=S_IFREG|0644, st_size=1724, ...}) = 0 >>> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f851afee000 >>> read(3, "#n# /etc/nsswitch.confn#n# An ex"..., 4096) = 1724 >>> read(3, "", 4096) = 0 >>> close(3) = 0 >> ... >>> open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3 >> ... >>> open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3 >>> fstat(3, {st_mode=S_IFREG|0644, st_size=2005, ...}) = 0 >>> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f851afee000 >>> lseek(3, 0, SEEK_CUR) = 0 >>> read(3, "root:x:0:0:root:/root:/bin/bashn"..., 4096) = 2005 >>> quotactl(Q_XGETQUOTA|USRQUOTA, "/dev/loop0", 0, {version=1, flags=XFS_USER_QUOTA, fieldmask=0, id=0, blk_hardlimit=0, blk_softlimit=0, ino_hardlimit=0, ino_softlimit=0, bcount=0, icount=3, ...}) = 0 >> >> As you can see, it only dynamically loads the local files name >> service library, not the ones that do ldap lookups. >> >> Can you run ldd on the test binary you had and on xfs_quota to see >> if they are linked against the same libraries? > > I ran ldd on the test binary and found that I built it on i686 > machine and the test machine is x86_64. So the test binary > couldn't find the suitable 32 bit nss library on the test machine. > I found the test binary built on the test machine works the same > as xfs_quota. > > | build machine | getpwnam | getpwent > =============+===============+===========+========== > test binary | 32 bit | NG | NG > | 64 bit | OK | NG > -------------+---------------+-----------+---------- > xfs_quota | 64 bit | OK | NG > -------------+---------------+-----------+---------- > > Since the test binary(64bit) and xfs_quota load the same > nss library and have the same behavior, it's apparently > not the xfs_quota problem but the LDAP/libnss related problem. > > I will dig this problem more as the LDAP/libnss perspective. > > Thank you very much for helping me, Dave. Just FYI, I finally found that this problem happened because I forgot to add the following line to /etc/sssd/sssd.conf. =============================================================================== ... enumerate = True ... =============================================================================== So getpwent() skipped LDAP users and xfs_quota didn't work correctly. Thanks, Satoru. From tinguely@sgi.com Mon Jan 7 09:07:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07F7JX3084079 for ; Mon, 7 Jan 2013 09:07:19 -0600 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id B7F4D304048; Mon, 7 Jan 2013 07:10:11 -0800 (PST) Message-ID: <50EAE554.5020504@sgi.com> Date: Mon, 07 Jan 2013 09:10:12 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end References: <1355870625-26638-1-git-send-email-david@fromorbit.com> <20130103212222.GJ27055@sgi.com> <20130103220244.GH3120@dastard> In-Reply-To: <20130103220244.GH3120@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/03/13 16:02, Dave Chinner wrote: > On Thu, Jan 03, 2013 at 03:22:22PM -0600, Ben Myers wrote: >> Dave, >> >> On Wed, Dec 19, 2012 at 09:43:45AM +1100, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> When _xfs_buf_find is passed an out of range address, it will fail >>> to find a relevant struct xfs_perag and oops with a null >>> dereference. This can happen when trying to walk a filesystem with a >>> metadata inode that has a partially corrupted extent map (i.e. the >>> block number returned is corrupt, but is otherwise intact) and we >>> try to read from the corrupted block address. >>> >>> In this case, just fail the lookup. If it is readahead being issued, >>> it will simply not be done, but if it is real read that fails we >>> will get an error being reported. Ideally this case should result >>> in an EFSCORRUPTED error being reported, but we cannot return an >>> error through xfs_buf_read() or xfs_buf_get() so this lookup failure >>> may result in ENOMEM or EIO errors being reported instead. >>> >>> Signed-off-by: Dave Chinner >>> --- >>> fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ >>> 1 file changed, 18 insertions(+) >>> >>> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c >>> index a80195b..16249d9 100644 >>> --- a/fs/xfs/xfs_buf.c >>> +++ b/fs/xfs/xfs_buf.c >>> @@ -487,6 +487,7 @@ _xfs_buf_find( >>> struct rb_node *parent; >>> xfs_buf_t *bp; >>> xfs_daddr_t blkno = map[0].bm_bn; >>> + xfs_daddr_t eofs; >>> int numblks = 0; >>> int i; >>> >>> @@ -498,6 +499,23 @@ _xfs_buf_find( >>> ASSERT(!(numbytes< (1<< btp->bt_sshift))); >>> ASSERT(!(BBTOB(blkno)& (xfs_off_t)btp->bt_smask)); >>> >>> + /* >>> + * Corrupted block numbers can get through to here, unfortunately, so we >>> + * have to check that the buffer falls within the filesystem bounds. >>> + */ >>> + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); >>> + if (blkno>= eofs || blkno + numblks> eofs) { >> ^^^^^^^^^^^^^^^^^^^^^^ >> >> That looks suspect to me. I think you need to go over each buffer >> individually. > > I'm not trying to validate every single part of a buffer here - > there is no need to do that as the block numbers are validated > against device overruns during IO. i.e. we'll get an EIO and a log > message telling us an attempt to access beyond the end of the device > occurring during IO. > > I.e. we aren't doing validity checks on whether a buffer has a sane > block number or not (that's up to the caller), what we are > avoiding is attempting to look up a buffer that is outside of the > range of the cache indexing. i.e. it's validating the cache index we > are about to use, not passing judgement on whether the caller has > asked for a valid set of blocks or not. I did not like the second part of the if statement because first block number in a "discontiguous" buffer does not have to be the lowest block number. The first half of the if statement alone would prevent the oops. It seems to me that if a length check is desired to see if the first segment is valid, then the correct thing is to use the first segment length; something like: if (blkno >= eofs || blkno + map[0].bm_len >= eofs) ... > >> I bounced it off Mark and this was his suggestion: >> >> for (i = 0; i< nmaps; i++) { >> if (map[i].bm_bn>= eofs || >> map[i].bm_bn + map[i].bm_len>= eofs) >> ... > > Sure, that would work, but we really don't care about the secondary > block numbers here - there are completely unused by the buffer cache > except for when IO is issued. And given that _xfs_buf_find is > probably the hottest function in the XFS code base, avoiding > unnecessary checks is somewhat important... > > Cheers, > > Dave. --Mark. From sandeen@redhat.com Mon Jan 7 09:55:22 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07FtMnr086652 for ; Mon, 7 Jan 2013 09:55:22 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA2BB8F8052 for ; Mon, 7 Jan 2013 07:58:14 -0800 (PST) X-ASG-Debug-ID: 1357574294-04bdf0430f543310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yDFCecfuJT6x7QXJ for ; Mon, 07 Jan 2013 07:58:14 -0800 (PST) X-Barracuda-Envelope-From: sandeen@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 r07FwBji020863 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Jan 2013 10:58:12 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r07FwANX028271 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 7 Jan 2013 10:58:11 -0500 Message-ID: <50EAF092.20907@redhat.com> Date: Mon, 07 Jan 2013 09:58:10 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Kiran Patil CC: linux-btrfs@vger.kernel.org, bo.li.liu@oracle.com, xfs-oss Subject: Re: Open for contribution towards xfstests for btrfs References: X-ASG-Orig-Subj: Re: Open for contribution towards xfstests for btrfs In-Reply-To: X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1357574294 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/7/13 4:18 AM, Kiran Patil wrote: > Hello, > > We have a team of 5 students who would like to contribute to btrfs > filesystem testing using xfstests. > > Is there space for them to contribute? > > If yes, to whom do they need to keep in touch for guidance. (cc: xfs list) Are you thinking of writing new tests, or doing more formal testing with the existing testsuite? Both would be useful. In particular, any time there's a bugfix, a regression test is helpful. Generic new tests of btrfs functionality would be good, too. I would suggest starting with a couple new tests, and cc: the xfs list for review. In the course of the review you'll get a sense of the various conventions used in xfstests, etc. Simply running xfstests over various btrfs configurations would also be useful, to be sure any regressions caught by existing tests don't go unnoticed. thanks, -Eric > Thank you, > Kiran Patil (Director) > Green Turtles Technologies, INDIA. From kirantpatil@gmail.com Mon Jan 7 10:58:32 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07GwWng089252 for ; Mon, 7 Jan 2013 10:58:32 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2268C8F8052 for ; Mon, 7 Jan 2013 09:01:25 -0800 (PST) X-ASG-Debug-ID: 1357578080-04cb6c05a7ad0bb0001-NocioJ Received: from mail-we0-f170.google.com (mail-we0-f170.google.com [74.125.82.170]) by cuda.sgi.com with ESMTP id 2gxUZk5TrmFVdf66 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Jan 2013 09:01:21 -0800 (PST) X-Barracuda-Envelope-From: kirantpatil@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.170 Received: by mail-we0-f170.google.com with SMTP id r1so10225727wey.15 for ; Mon, 07 Jan 2013 09:01:20 -0800 (PST) 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=IUCU/WiYXTw6ZyYTEvUOaxCcZAzzkt+th9jZFfyi1sU=; b=zayOXLJ5+BvAQs1S72c8oJ422OsEipKxCCKC8HVdWz+8kvNJGgVGU96Goi+i73H9eH qDqfu71fmoVi5QlL5D6j/w5y8Oh6lhpls9tTegLMd9y5ZoHumiA5lQHm7eAt1T/595RK yLaIaOmlyhONG3l0u+0h3Eom0JfPYB9eVWp3Ip+T0PnbZ2dW4l76GiODxaPvRL05VdeJ d/iOsFubhTgRuCFeSYlZ1PKqA1Xp/FdPKFJVJhqlomi1a3yokJKzSUWtNsjlzkfs+c7+ F8peZGOexeQVGdhkO7gdujd03/0ysJrQ3d1dlxvELfNvoNOFvxHBHCg/1roz8cjE2zGR LcUQ== MIME-Version: 1.0 Received: by 10.194.119.33 with SMTP id kr1mr97604678wjb.4.1357578080090; Mon, 07 Jan 2013 09:01:20 -0800 (PST) Received: by 10.217.48.130 with HTTP; Mon, 7 Jan 2013 09:01:19 -0800 (PST) In-Reply-To: <50EAF092.20907@redhat.com> References: <50EAF092.20907@redhat.com> Date: Mon, 7 Jan 2013 22:31:19 +0530 Message-ID: Subject: Re: Open for contribution towards xfstests for btrfs From: Kiran Patil X-ASG-Orig-Subj: Re: Open for contribution towards xfstests for btrfs To: Eric Sandeen Cc: linux-btrfs@vger.kernel.org, bo.li.liu@oracle.com, xfs-oss Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-we0-f170.google.com[74.125.82.170] X-Barracuda-Start-Time: 1357578080 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-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.2.119195 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, Jan 7, 2013 at 9:28 PM, Eric Sandeen wrote: > On 1/7/13 4:18 AM, Kiran Patil wrote: >> Hello, >> >> We have a team of 5 students who would like to contribute to btrfs >> filesystem testing using xfstests. >> >> Is there space for them to contribute? >> >> If yes, to whom do they need to keep in touch for guidance. > > (cc: xfs list) > > Are you thinking of writing new tests, or doing more formal testing > with the existing testsuite? Both would be useful. > > In particular, any time there's a bugfix, a regression test is helpful. > Generic new tests of btrfs functionality would be good, too. > > I would suggest starting with a couple new tests, and cc: the xfs list > for review. In the course of the review you'll get a sense of the various > conventions used in xfstests, etc. > > Simply running xfstests over various btrfs configurations would also > be useful, to be sure any regressions caught by existing tests don't go > unnoticed. > > thanks, > -Eric > Dear Eric and David, Thanks a lot for your inputs. We will work on them and soon we will start our work. Thank you, -Kiran From kirantpatil@gmail.com Mon Jan 7 11:06:30 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07H6UiT089634 for ; Mon, 7 Jan 2013 11:06:30 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B46EB304053 for ; Mon, 7 Jan 2013 09:09:22 -0800 (PST) X-ASG-Debug-ID: 1357578560-04cbb035a7a8f970001-NocioJ Received: from mail-we0-f173.google.com (mail-we0-f173.google.com [74.125.82.173]) by cuda.sgi.com with ESMTP id A9O7tfQf9Uz9tCqM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Jan 2013 09:09:21 -0800 (PST) X-Barracuda-Envelope-From: kirantpatil@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.173 Received: by mail-we0-f173.google.com with SMTP id z2so9928550wey.4 for ; Mon, 07 Jan 2013 09:09:20 -0800 (PST) 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=+QRK7wn0BDJ2LPQd+utuZO6p9jF5cWSYQPb0ZYRtvzI=; b=mM7xZ5hECb0gZO17bdTHVPigEaSUkEEzOHAkK0LXJj4+M8Y9RqUiEaKsQBLAp4KiEj 7Fk4UZnoruz3DEluLL8aWDRXdqwSwG1PbQ4J0SLjBnu7YXFy9y5V1oDEQFVwVc1JgeJK sJFf9g0dKC0JdhU2nN5jNfX/ECh42B++9RWp2aFZhrfO2jcw7rbZfnJTYfDlpuyMQ5hG q3hwLRHCIypJhX5AVPJYpCzMzuqQDFAKM9pvwKMqzwXqR1fweVDBlM+xdFS7+L+SsZon mHfFzIWYmCCmDHpC/uwlw5RrBoYLi5DhFMRiSY3KoYUe2FiTfkLL4Bs6o/BiBGRIONuh iQcg== MIME-Version: 1.0 Received: by 10.180.39.143 with SMTP id p15mr10242948wik.14.1357578560579; Mon, 07 Jan 2013 09:09:20 -0800 (PST) Received: by 10.217.48.130 with HTTP; Mon, 7 Jan 2013 09:09:20 -0800 (PST) In-Reply-To: References: <50EAF092.20907@redhat.com> Date: Mon, 7 Jan 2013 22:39:20 +0530 Message-ID: Subject: Re: Open for contribution towards xfstests for btrfs From: Kiran Patil X-ASG-Orig-Subj: Re: Open for contribution towards xfstests for btrfs To: Eric Sandeen Cc: linux-btrfs@vger.kernel.org, bo.li.liu@oracle.com, xfs-oss Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-we0-f173.google.com[74.125.82.173] X-Barracuda-Start-Time: 1357578561 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-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.2.119195 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, Jan 7, 2013 at 10:31 PM, Kiran Patil wrote: > On Mon, Jan 7, 2013 at 9:28 PM, Eric Sandeen wrote: >> On 1/7/13 4:18 AM, Kiran Patil wrote: >>> Hello, >>> >>> We have a team of 5 students who would like to contribute to btrfs >>> filesystem testing using xfstests. >>> >>> Is there space for them to contribute? >>> >>> If yes, to whom do they need to keep in touch for guidance. >> >> (cc: xfs list) >> >> Are you thinking of writing new tests, or doing more formal testing >> with the existing testsuite? Both would be useful. >> >> In particular, any time there's a bugfix, a regression test is helpful. >> Generic new tests of btrfs functionality would be good, too. >> >> I would suggest starting with a couple new tests, and cc: the xfs list >> for review. In the course of the review you'll get a sense of the various >> conventions used in xfstests, etc. >> >> Simply running xfstests over various btrfs configurations would also >> be useful, to be sure any regressions caught by existing tests don't go >> unnoticed. >> >> thanks, >> -Eric >> > Dear Eric and David, > > Thanks a lot for your inputs. > > We will work on them and soon we will start our work. > > Thank you, > > -Kiran Sorry, I forgot to say thanks to Liu and Arne. Thank you Liu and Arne for your suggestions. -Kiran From info@linos.es Mon Jan 7 11:10:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_28 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07HA76T089756 for ; Mon, 7 Jan 2013 11:10:07 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9638F304053 for ; Mon, 7 Jan 2013 09:13:02 -0800 (PST) X-ASG-Debug-ID: 1357578776-04bdf04312548860001-NocioJ Received: from ns210619.ovh.net (dedip1.linos.es [178.32.77.184]) by cuda.sgi.com with ESMTP id zYK6DA0PEYgP5MWD for ; Mon, 07 Jan 2013 09:12:56 -0800 (PST) X-Barracuda-Envelope-From: info@linos.es X-Barracuda-Apparent-Source-IP: 178.32.77.184 Received: from localhost (localhost.localdomain [127.0.0.1]) by ns210619.ovh.net (Postfix) with ESMTP id 6CDC03D1E6E4 for ; Mon, 7 Jan 2013 18:13:07 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at ns210619.ovh.net Received: from ns210619.ovh.net ([178.32.77.184]) by localhost (ns210619.ovh.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fnflP1lqufqf for ; Mon, 7 Jan 2013 18:12:57 +0100 (CET) Received: from [192.168.254.4] (unknown [95.22.23.255]) by ns210619.ovh.net (Postfix) with ESMTPSA id 47B9E3D1E6E2 for ; Mon, 7 Jan 2013 18:12:57 +0100 (CET) Message-ID: <50EB020D.9050006@linos.es> Date: Mon, 07 Jan 2013 18:12:45 +0100 From: Linos User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs bug? Content-Type: multipart/mixed; boundary="------------020802070404050604010600" X-ASG-Orig-Subj: xfs bug? X-Barracuda-Connect: dedip1.linos.es[178.32.77.184] X-Barracuda-Start-Time: 1357578776 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119195 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. --------------020802070404050604010600 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit I am hitting what seems to be a bug in one of my Linux storage layers, this is my system: distro: Arch Linux x86_64 cpu: Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz (4 cores) skuda@skuda ~/Desktop $ uname -a Linux skuda 3.7.1-426-bfs #1 SMP PREEMPT Wed Dec 26 09:56:18 CET 2012 x86_64 GNU/Linux skuda@skuda ~/Desktop $ xfs_repair -V xfs_repair version 3.1.8 skuda@skuda ~/Desktop $ cat /proc/mounts rootfs / rootfs rw 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 sys /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 dev /dev devtmpfs rw,nosuid,relatime,size=8200368k,nr_inodes=2050092,mode=755 0 0 run /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0 /dev/sda3 / ext4 rw,relatime,discard,stripe=128,data=ordered 0 0 devpts /dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0 shm /dev/shm tmpfs rw,nosuid,nodev,relatime 0 0 /dev/sda1 /boot ext4 rw,relatime,stripe=128,data=ordered 0 0 /dev/md1 /mnt/datos xfs rw,relatime,attr2,nobarrier,inode64,logbsize=256k,sunit=512,swidth=1024,noquota 0 0 tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0 binfmt /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 skuda@skuda ~/Desktop $ mdadm --detail /dev/md1 /dev/md1: Version : 1.2 Creation Time : Sat Apr 2 15:14:11 2011 Raid Level : raid5 Array Size : 1953522688 (1863.02 GiB 2000.41 GB) Used Dev Size : 976761344 (931.51 GiB 1000.20 GB) Raid Devices : 3 Total Devices : 3 Persistence : Superblock is persistent Update Time : Mon Jan 7 17:44:38 2013 State : clean Active Devices : 3 Working Devices : 3 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 256K Name : sysresccd:1 UUID : 47dddb83:9fdb7858:1d71bb15:9b35a1e0 Events : 12873 Number Major Minor RaidDevice State 0 8 32 0 active sync /dev/sdc 1 8 48 1 active sync /dev/sdd 3 8 16 2 active sync /dev/sdb skuda@skuda ~/Desktop $ mdadm -V mdadm - v3.2.6 - 25th October 2012 The three hard drives in raid are Western Digital RE4 WDC WD1003FBYX with write cache enabled (yes i know i have write barries disabled in fstab). I use this raid to backup my machine with rsnapshot than uses internally rsync, it seems that, given sufficient pressure, i can almost always crash xfs filesystem and my machine with it, i have attached what it's logged in /var/log/messages. Regards, Miguel Angel. --------------020802070404050604010600 Content-Type: text/plain; charset=UTF-8; name="xfs_bug.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xfs_bug.txt" SmFuICA2IDIxOjUzOjAxIHNrdWRhIGtlcm5lbDogWzc0MjY2LjgwNDkzOF0gLS0tLS0tLS0t LS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tCkphbiAgNiAyMTo1MzowMSBza3VkYSBrZXJu ZWw6IFs3NDI2Ni44MDQ5NDhdIFdBUk5JTkc6IGF0IGtlcm5lbC93b3JrcXVldWUuYzoxNTUw IHdvcmtlcl9lbnRlcl9pZGxlKzB4ZDUvMHgxMzAoKQpKYW4gIDYgMjE6NTM6MDEgc2t1ZGEg a2VybmVsOiBbNzQyNjYuODA0OTUwXSBIYXJkd2FyZSBuYW1lOiBTeXN0ZW0gUHJvZHVjdCBO YW1lCkphbiAgNiAyMTo1MzowMSBza3VkYSBrZXJuZWw6IFs3NDI2Ni44MDQ5NTFdIE1vZHVs ZXMgbGlua2VkIGluOiB0dW4gcGNpX3N0dWIgdmJveHBjaShPKSB2Ym94bmV0Zmx0KE8pIHZi b3huZXRhZHAoTykgdmJveGRydihPKSBpcHRfTUFTUVVFUkFERSBpcHRhYmxlX25hdCBuZl9j b25udHJhY2tfaXB2NCBuZl9kZWZyYWdfaXB2NCBuZl9uYXRfaXB2NCBpcF90YWJsZXMgeF90 YWJsZXMgeGZzIHNuZF9oZGFfY29kZWNfaGRtaSByYWlkNDU2IGFzeW5jX3JhaWQ2X3JlY292 IGFzeW5jX21lbWNweSBhc3luY19wcSBpVENPX3dkdCBpVENPX3ZlbmRvcl9zdXBwb3J0IHNu ZF9oZGFfY29kZWNfcmVhbHRlayByYWlkNl9wcSBhc3luY194b3Iga3ZtX2ludGVsIGt2bSBj cmMzMmNfaW50ZWwgZ2hhc2hfY2xtdWxuaV9pbnRlbCBhZXNuaV9pbnRlbCBhZXNfeDg2XzY0 IGFibGtfaGVscGVyIGNyeXB0ZCB4b3IgeHRzIGFzeW5jX3R4IGxydyBnZjEyOG11bCB1dmN2 aWRlbyB2aWRlb2J1ZjJfdm1hbGxvYyB2aWRlb2J1ZjJfbWVtb3BzIHZpZGVvYnVmMl9jb3Jl IHNuZF91c2JfYXVkaW8gdmlkZW9kZXYgc25kX3VzYm1pZGlfbGliIHNuZF9yYXdtaWRpIGVl ZXBjX3dtaSBhc3VzX3dtaSBzbmRfc2VxX2RldmljZSBzcGFyc2Vfa2V5bWFwIHBjaV9ob3Rw bHVnIG1kX21vZCBtZWRpYSBteG1fd21pIGV2ZGV2IGpveWRldiBidHVzYiBibHVldG9vdGgg bnZpZGlhKFBPKSByZmtpbGwgcHNtb3VzZSBtaWNyb2NvZGUgc2VyaW9fcmF3IHBjc3BrciBs cGNfaWNoIHNuZF9oZGFfaW50ZWwgc25kX2hkYV9jb2RlYyBzbmRfaHdkZXAgc25kX3BjbSBz bmRfcGFnZV9hbGxvYyBzbmRfdGltZXIgc25kIGkyY19jb3JlIGUxMDAwZSBzb3VuZGNvcmUg dmlkZW8gdGhlcm1hbCBmYW4gbXNyIHdtaSBtZWkgYWNwaV9jcHVmcmVxIG1wZXJmIGJ1dHRv biBwcm9jZXNzb3IgY29yZXRlbXAgcHBwb2UgcHBwb3ggcHBwX2dlbmVyaWMgc2xoYyBuZl9u YXRfc25tcF9iYXNpYyBuZl9jb25udHJhY2tfc25tcCBuZl9jb25udHJhY2tfYnJvYWRjYXN0 IApuZl9uYXRfcHJvdG9fc2N0cCBjcmMzMmMgbGliY3JjMzJjIG5mX25hdF9wcm90b19kY2Nw IG5mX25hdF9wcm90b191ZHBsaXRlIG5mX25hdF9hbWFuZGEgdHNfa21wIG5mX2Nvbm50cmFj a19hbWFuZGEgbmZfbmF0X2lyYyBuZl9jb25udHJhY2tfaXJjIG5mX25hdF9zaXAgbmZfY29u bnRyYWNrX3NpcCBuZl9uYXRfdGZ0cCBuZl9jb25udHJhY2tfdGZ0cCBuZl9uYXRfaDMyMyBu Zl9jb25udHJhY2tfaDMyMyBuZl9uYXRfcHB0cCBuZl9uYXRfcHJvdG9fZ3JlIG5mX2Nvbm50 cmFja19wcHRwIG5mX2Nvbm50cmFja19wcm90b19ncmUgbmZfbmF0X2Z0cCBuZl9jb25udHJh Y2tfZnRwIG5mX25hdCBuZl9jb25udHJhY2sgZnVzZSBsb29wIGV4dDQgY3JjMTYgamJkMiBt YmNhY2hlIHVzYl9zdG9yYWdlIGhpZF9nZW5lcmljIHVzYmhpZCBoaWQgc3JfbW9kIGNkcm9t IHNkX21vZCBlaGNpX2hjZCBhaGNpIGxpYmFoY2kgbGliYXRhIHhoY2lfaGNkIHNjc2lfbW9k IHVzYmNvcmUgdXNiX2NvbW1vbgpKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQy NjYuODA1MDU4XSBQaWQ6IDI3NzcxLCBjb21tOiBrd29ya2VyLzA6MiBUYWludGVkOiBQICAg ICAgICAgICBPIDMuNy4xLTQyNi1iZnMgIzEKSmFuICA2IDIxOjUzOjAxIHNrdWRhIGtlcm5l bDogWzc0MjY2LjgwNTA2MF0gQ2FsbCBUcmFjZToKSmFuICA2IDIxOjUzOjAxIHNrdWRhIGtl cm5lbDogWzc0MjY2LjgwNTA2Nl0gIFs8ZmZmZmZmZmY4MTA1NzQwZj5dIHdhcm5fc2xvd3Bh dGhfY29tbW9uKzB4N2YvMHhjMApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQy NjYuODA1MDcwXSAgWzxmZmZmZmZmZjgxMDcyOGQwPl0gPyBjd3FfYWN0aXZhdGVfZGVsYXll ZF93b3JrKzB4YzAvMHhjMApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQyNjYu ODA1MDczXSAgWzxmZmZmZmZmZjgxMDU3NDZhPl0gd2Fybl9zbG93cGF0aF9udWxsKzB4MWEv MHgyMApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQyNjYuODA1MDc2XSAgWzxm ZmZmZmZmZjgxMDcyOWM1Pl0gd29ya2VyX2VudGVyX2lkbGUrMHhkNS8weDEzMApKYW4gIDYg MjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQyNjYuODA1MDgwXSAgWzxmZmZmZmZmZjgxMDc2 NDgxPl0gd29ya2VyX3RocmVhZCsweDFmMS8weDQwMApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEg a2VybmVsOiBbNzQyNjYuODA1MDg1XSAgWzxmZmZmZmZmZjgxNDkyZmQ5Pl0gPyBwcmVlbXB0 X3NjaGVkdWxlKzB4NDkvMHg3MApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQy NjYuODA1MDg4XSAgWzxmZmZmZmZmZjgxMDc2MjkwPl0gPyByZXNjdWVyX3RocmVhZCsweDI0 MC8weDI0MApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVsOiBbNzQyNjYuODA1MDkzXSAg WzxmZmZmZmZmZjgxMDdhZWMwPl0ga3RocmVhZCsweGMwLzB4ZDAKSmFuICA2IDIxOjUzOjAx IHNrdWRhIGtlcm5lbDogWzc0MjY2LjgwNTA5N10gIFs8ZmZmZmZmZmY4MTAxMDAwMD5dID8g cGVyZl90cmFjZV94ZW5fbW11X3NldF9wdGVfYXQrMHhiMC8weDEwMApKYW4gIDYgMjE6NTM6 MDEgc2t1ZGEga2VybmVsOiBbNzQyNjYuODA1MTAyXSAgWzxmZmZmZmZmZjgxMDdhZTAwPl0g PyBrdGhyZWFkX2ZyZWV6YWJsZV9zaG91bGRfc3RvcCsweDcwLzB4NzAKSmFuICA2IDIxOjUz OjAxIHNrdWRhIGtlcm5lbDogWzc0MjY2LjgwNTEwNl0gIFs8ZmZmZmZmZmY4MTQ5Yjc2Yz5d IHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwCkphbiAgNiAyMTo1MzowMSBza3VkYSBrZXJuZWw6 IFs3NDI2Ni44MDUxMTBdICBbPGZmZmZmZmZmODEwN2FlMDA+XSA/IGt0aHJlYWRfZnJlZXph YmxlX3Nob3VsZF9zdG9wKzB4NzAvMHg3MApKYW4gIDYgMjE6NTM6MDEgc2t1ZGEga2VybmVs OiBbNzQyNjYuODA1MTEzXSAtLS1bIGVuZCB0cmFjZSBiMGQzM2M0YTAyNzIzZWEzIF0tLS0K SmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzU0MF0geGZzYWlsZC9t ZDEgICAgIEQgMDAwMDAwMDAwMDAwMDAwMSAgICAgMCAgIDUwMCAgICAgIDIgMHgwMDAwMDAw MApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNTQ1XSAgZmZmZjg4 MDNmZDdmZGFmOCAwMDAwMDAwMDAwMDAwMDQ2IDAwMDAwMDAyYTBlMjY3NzAgZmZmZjg4MDNm ZDdmZGZkOApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNTQ5XSAg ZmZmZjg4MDQwNjFkMTgwMCBmZmZmODgwM2ZkN2ZkZmQ4IGZmZmY4ODAzZmQ3ZmRmZDggZmZm Zjg4MDNmZDdmZGZkOApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMz NTUzXSAgZmZmZmZmZmY4MTgxNDQyMCBmZmZmODgwNDA0ODM1MTAwIDAwMDAwMDAwMDAwMDAw MDEgZmZmZjg4MDQwNmZjZDQwMApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1 NjguODMzNTU3XSBDYWxsIFRyYWNlOgpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBb NzQ1NjguODMzNTY5XSAgWzxmZmZmZmZmZmEwZTI2NmU1Pl0gPyByZWxlYXNlX3N0cmlwZV9w bHVnKzB4MjUvMHg4MCBbcmFpZDQ1Nl0KSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDog Wzc0NTY4LjgzMzU3NF0gIFs8ZmZmZmZmZmZhMGUyY2Y3Nz5dID8gbWFrZV9yZXF1ZXN0KzB4 MmI3LzB4NmMwIFtyYWlkNDU2XQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1 NjguODMzNTgxXSAgWzxmZmZmZmZmZjgxMDdiYmIwPl0gPyBhYm9ydF9leGNsdXNpdmVfd2Fp dCsweGIwLzB4YjAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzU4 Nl0gIFs8ZmZmZmZmZmY4MTQ5MDI1ND5dIHNjaGVkdWxlX3RpbWVvdXQrMHgxZjQvMHgyNjAK SmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzU5MV0gIFs8ZmZmZmZm ZmY4MTExM2FiNT5dID8gbWVtcG9vbF9hbGxvY19zbGFiKzB4MTUvMHgyMApKYW4gIDYgMjE6 NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNTk1XSAgWzxmZmZmZmZmZjgxNDkxYjNi Pl0gd2FpdF9mb3JfY29tbW9uKzB4Y2IvMHgxNjAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtl cm5lbDogWzc0NTY4LjgzMzYwMF0gIFs8ZmZmZmZmZmY4MTA4YjA1MD5dID8gdHJ5X3RvX3dh a2VfdXArMHgxZjAvMHgxZjAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4 LjgzMzYwNF0gIFs8ZmZmZmZmZmY4MTQ5MWJlZD5dIHdhaXRfZm9yX2NvbXBsZXRpb24rMHgx ZC8weDIwCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM2MDddICBb PGZmZmZmZmZmODEwNzQ2MGI+XSBmbHVzaF93b3JrKzB4ZWIvMHgxNzAKSmFuICA2IDIxOjU4 OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzYxMF0gIFs8ZmZmZmZmZmY4MTA3MjhkMD5d ID8gY3dxX2FjdGl2YXRlX2RlbGF5ZWRfd29yaysweGMwLzB4YzAKSmFuICA2IDIxOjU4OjAz IHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzYyNV0gIFs8ZmZmZmZmZmZhMGU5YjlhOT5dIHhs b2dfY2lsX2ZvcmNlX2xzbisweDM5LzB4MTYwIFt4ZnNdCkphbiAgNiAyMTo1ODowMyBza3Vk YSBrZXJuZWw6IFs3NDU2OC44MzM2MjldICBbPGZmZmZmZmZmODEwNjdmZjg+XSA/IGxvY2tf dGltZXJfYmFzZS5pc3JhLjM3KzB4MzgvMHg3MApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODMzNjMyXSAgWzxmZmZmZmZmZjgxMDY4MDdmPl0gPyB0cnlfdG9fZGVs X3RpbWVyX3N5bmMrMHg0Zi8weDcwCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3 NDU2OC44MzM2NDVdICBbPGZmZmZmZmZmYTBlOTljZTk+XSBfeGZzX2xvZ19mb3JjZSsweDY5 LzB4MjgwIFt4ZnNdCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM2 NDhdICBbPGZmZmZmZmZmODE0OTAxODc+XSA/IHNjaGVkdWxlX3RpbWVvdXQrMHgxMjcvMHgy NjAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzY1OF0gIFs8ZmZm ZmZmZmZhMGU0MjJjMD5dID8geGZzX2J1Zl9kZWx3cmlfc3VibWl0X25vd2FpdCsweDIwLzB4 MzAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzY2OV0g IFs8ZmZmZmZmZmZhMGU5OWYyYT5dIHhmc19sb2dfZm9yY2UrMHgyYS8weGMwIFt4ZnNdCkph biAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM2ODBdICBbPGZmZmZmZmZm YTBlOWU4MTQ+XSB4ZnNhaWxkKzB4MTQ0LzB4NzAwIFt4ZnNdCkphbiAgNiAyMTo1ODowMyBz a3VkYSBrZXJuZWw6IFs3NDU2OC44MzM2ODVdICBbPGZmZmZmZmZmODEwODQ2ZmY+XSA/IF9f d2FrZV91cF9jb21tb24rMHg0Zi8weDgwCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6 IFs3NDU2OC44MzM2OTZdICBbPGZmZmZmZmZmYTBlOWU2ZDA+XSA/IHhmc190cmFuc19haWxf Y3Vyc29yX2ZpcnN0KzB4OTAvMHg5MCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODMzNzAwXSAgWzxmZmZmZmZmZjgxMDdhZWMwPl0ga3RocmVhZCsweGMw LzB4ZDAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzcwNF0gIFs8 ZmZmZmZmZmY4MTAxMDAwMD5dID8gcGVyZl90cmFjZV94ZW5fbW11X3NldF9wdGVfYXQrMHhi MC8weDEwMApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNzA5XSAg WzxmZmZmZmZmZjgxMDdhZTAwPl0gPyBrdGhyZWFkX2ZyZWV6YWJsZV9zaG91bGRfc3RvcCsw eDcwLzB4NzAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzcxM10g IFs8ZmZmZmZmZmY4MTQ5Yjc2Yz5dIHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwCkphbiAgNiAy MTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM3MTddICBbPGZmZmZmZmZmODEwN2Fl MDA+XSA/IGt0aHJlYWRfZnJlZXphYmxlX3Nob3VsZF9zdG9wKzB4NzAvMHg3MApKYW4gIDYg MjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNzYxXSByc3luYyAgICAgICAgICAg RCAwMDAwMDAwMDAwMDAwMDAxICAgICAwIDIwMzQ4ICAgMjgzMCAweDAwMDAwMDAwCkphbiAg NiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM3NjVdICBmZmZmODgwMTc1M2Fm Y2I4IDAwMDAwMDAwMDAwMDAwODYgZmZmZjg4MDAwMDAwMDBjOCBmZmZmODgwMTc1M2FmZmQ4 CkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM3NjhdICAwMDAwMDAw MDM0MDY0M2U4IGZmZmY4ODAxNzUzYWZmZDggZmZmZjg4MDE3NTNhZmZkOCBmZmZmODgwMTc1 M2FmZmQ4CkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM3NzJdICBm ZmZmZmZmZjgxODE0NDIwIGZmZmY4ODAyYWQyNmRlODAgZmZmZjg4MDE3NTNhZmNlOCBmZmZm ZmZmZjgxNDk3NjE0CkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM3 NzVdIENhbGwgVHJhY2U6CkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44 MzM3NzldICBbPGZmZmZmZmZmODE0OTc2MTQ+XSA/IF9fZG9fcGFnZV9mYXVsdCsweDJkNC8w eDU5MApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNzg4XSAgWzxm ZmZmZmZmZmEwZTQwYzM1Pl0gPyB4ZnNfYnVmX2dldF9tYXArMHgzNS8weDFkMCBbeGZzXQpK YW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzNzk3XSAgWzxmZmZmZmZm ZmEwZTQxYzIzPl0gPyB4ZnNfYnVmX3JlYWRfbWFwKzB4MzMvMHgxNDAgW3hmc10KSmFuICA2 IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzgwOF0gIFs8ZmZmZmZmZmZhMGU5 ZmM1ZD5dID8geGZzX3RyYW5zX3JlYWRfYnVmX21hcCsweDI5ZC8weDRmMCBbeGZzXQpKYW4g IDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzODE5XSAgWzxmZmZmZmZmZmEw ZTk3NmZmPl0geGxvZ19ncmFudF9oZWFkX3dhaXQrMHhhZi8weDIxMCBbeGZzXQpKYW4gIDYg MjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzODI5XSAgWzxmZmZmZmZmZmEwZTk3 OGVlPl0geGxvZ19ncmFudF9oZWFkX2NoZWNrKzB4OGUvMHhmMCBbeGZzXQpKYW4gIDYgMjE6 NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzODM5XSAgWzxmZmZmZmZmZmEwZTlhNzk1 Pl0geGZzX2xvZ19yZXNlcnZlKzB4YzUvMHgxZjAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNr dWRhIGtlcm5lbDogWzc0NTY4LjgzMzg1MV0gIFs8ZmZmZmZmZmZhMGU1ODdmNz5dID8ga21l bV96b25lX2FsbG9jKzB4NjcvMHhlMCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODMzODYyXSAgWzxmZmZmZmZmZmEwZTk1YzczPl0geGZzX3RyYW5zX3Jl c2VydmUrMHgyMjMvMHgyMzAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDog Wzc0NTY4LjgzMzg3M10gIFs8ZmZmZmZmZmZhMGU5NThiNz5dID8gX3hmc190cmFuc19hbGxv YysweDM3LzB4YTAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4 LjgzMzg4M10gIFs8ZmZmZmZmZmZhMGU0ZDdlYj5dIHhmc192bl91cGRhdGVfdGltZSsweDVi LzB4MWMwIFt4ZnNdCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM4 ODddICBbPGZmZmZmZmZmODExODY3MjA+XSA/IHN5c19pb2N0bCsweGIwLzB4YjAKSmFuICA2 IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzg5Ml0gIFs8ZmZmZmZmZmY4MTE4 ZTEzNT5dIHVwZGF0ZV90aW1lKzB4MjUvMHhjMApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODMzODk1XSAgWzxmZmZmZmZmZjgxMThlM2IyPl0gdG91Y2hfYXRpbWUr MHhmMi8weDE0MApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzODk5 XSAgWzxmZmZmZmZmZjgxMTg2YWRhPl0gdmZzX3JlYWRkaXIrMHhjYS8weGUwCkphbiAgNiAy MTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzM5MDJdICBbPGZmZmZmZmZmODExODZj MGY+XSBzeXNfZ2V0ZGVudHMrMHg4Zi8weDExMApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODMzOTA2XSAgWzxmZmZmZmZmZjgxNDliODFkPl0gc3lzdGVtX2NhbGxf ZmFzdHBhdGgrMHgxYS8weDFmCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2 OC44MzM5MTJdIHJzeW5jICAgICAgICAgICBEIDAwMDAwMDAwMDAwMDAwMDEgICAgIDAgMjAz NDkgIDIwMzQ4IDB4MDAwMDAwMDAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0 NTY4LjgzMzkxNV0gIGZmZmY4ODAxYzBkNzFjMzggMDAwMDAwMDAwMDAwMDA4NiAwMDAwMDAw MDY0OGJkZjE3IGZmZmY4ODAxYzBkNzFmZDgKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5l bDogWzc0NTY4LjgzMzkxOF0gIGZmZmY4ODAwNDkzY2VjODAgZmZmZjg4MDFjMGQ3MWZkOCBm ZmZmODgwMWMwZDcxZmQ4IGZmZmY4ODAxYzBkNzFmZDgKSmFuICA2IDIxOjU4OjAzIHNrdWRh IGtlcm5lbDogWzc0NTY4LjgzMzkyMl0gIGZmZmZmZmZmODE4MTQ0MjAgZmZmZjg4MDJhZDI2 OWIwMCAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAKSmFuICA2IDIxOjU4OjAz IHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzkyNV0gQ2FsbCBUcmFjZToKSmFuICA2IDIxOjU4 OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzkzNV0gIFs8ZmZmZmZmZmZhMGU0OGNmYz5d ID8geGZzX2l1bmxvY2srMHgxMGMvMHgxMzAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNrdWRh IGtlcm5lbDogWzc0NTY4LjgzMzk0NV0gIFs8ZmZmZmZmZmZhMGU0OGQyZT5dID8geGZzX2l1 bmxvY2tfbWFwX3NoYXJlZCsweGUvMHgxMCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEg a2VybmVsOiBbNzQ1NjguODMzOTQ5XSAgWzxmZmZmZmZmZjgxMTg5OThhPl0gPyBfX2RfaW5z dGFudGlhdGUrMHg4YS8weDEwMApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1 NjguODMzOTUzXSAgWzxmZmZmZmZmZjgxMDgzOTkxPl0gPyBpbl9ncm91cF9wKzB4MzEvMHg0 MApKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODMzOTU2XSAgWzxmZmZm ZmZmZjgxMTdmYTI2Pl0gPyBnZW5lcmljX3Blcm1pc3Npb24rMHgxNzYvMHgyODAKSmFuICA2 IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzk2N10gIFs8ZmZmZmZmZmZhMGU5 NzZmZj5dIHhsb2dfZ3JhbnRfaGVhZF93YWl0KzB4YWYvMHgyMTAgW3hmc10KSmFuICA2IDIx OjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzk3N10gIFs8ZmZmZmZmZmZhMGU5Nzk0 OT5dIHhsb2dfZ3JhbnRfaGVhZF9jaGVjaysweGU5LzB4ZjAgW3hmc10KSmFuICA2IDIxOjU4 OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzMzk4N10gIFs8ZmZmZmZmZmZhMGU5YTc5NT5d IHhmc19sb2dfcmVzZXJ2ZSsweGM1LzB4MWYwIFt4ZnNdCkphbiAgNiAyMTo1ODowMyBza3Vk YSBrZXJuZWw6IFs3NDU2OC44MzM5OTddICBbPGZmZmZmZmZmYTBlOTVjNzM+XSB4ZnNfdHJh bnNfcmVzZXJ2ZSsweDIyMy8weDIzMCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ1NjguODM0MDA3XSAgWzxmZmZmZmZmZmEwZTk1OGI3Pl0gPyBfeGZzX3RyYW5z X2FsbG9jKzB4MzcvMHhhMCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBb NzQ1NjguODM0MDE5XSAgWzxmZmZmZmZmZmEwZTU2OTFiPl0geGZzX2NyZWF0ZSsweDFlYi8w eDY5MCBbeGZzXQpKYW4gIDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODM0MDIy XSAgWzxmZmZmZmZmZjgxMTdlZGFiPl0gPyBsb29rdXBfZGNhY2hlKzB4M2IvMHhkMApKYW4g IDYgMjE6NTg6MDMgc2t1ZGEga2VybmVsOiBbNzQ1NjguODM0MDMyXSAgWzxmZmZmZmZmZmEw ZTRkMzg2Pl0geGZzX3ZuX21rbm9kKzB4YTYvMHgxYjAgW3hmc10KSmFuICA2IDIxOjU4OjAz IHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzNDA0Ml0gIFs8ZmZmZmZmZmZhMGU0ZDRhNj5dIHhm c192bl9ta2RpcisweDE2LzB4MjAgW3hmc10KSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5l bDogWzc0NTY4LjgzNDA0NV0gIFs8ZmZmZmZmZmY4MTE4MGM3Mj5dIHZmc19ta2RpcisweGMy LzB4MTQwCkphbiAgNiAyMTo1ODowMyBza3VkYSBrZXJuZWw6IFs3NDU2OC44MzQwNDhdICBb PGZmZmZmZmZmODExODQ3OTM+XSBzeXNfbWtkaXJhdCsweGEzLzB4YjAKSmFuICA2IDIxOjU4 OjAzIHNrdWRhIGtlcm5lbDogWzc0NTY4LjgzNDA1MV0gIFs8ZmZmZmZmZmY4MTE4NDdiOT5d IHN5c19ta2RpcisweDE5LzB4MjAKSmFuICA2IDIxOjU4OjAzIHNrdWRhIGtlcm5lbDogWzc0 NTY4LjgzNDA1NV0gIFs8ZmZmZmZmZmY4MTQ5YjgxZD5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRo KzB4MWEvMHgxZgpKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4NTYw XSB4ZnNhaWxkL21kMSAgICAgRCAwMDAwMDAwMDAwMDAwMDAxICAgICAwICAgNTAwICAgICAg MiAweDAwMDAwMDAwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg1 NjVdICBmZmZmODgwM2ZkN2ZkYWY4IDAwMDAwMDAwMDAwMDAwNDYgMDAwMDAwMDJhMGUyNjc3 MCBmZmZmODgwM2ZkN2ZkZmQ4CkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4 OC43MTg1NjldICBmZmZmODgwNDA2MWQxODAwIGZmZmY4ODAzZmQ3ZmRmZDggZmZmZjg4MDNm ZDdmZGZkOCBmZmZmODgwM2ZkN2ZkZmQ4CkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6 IFs3NDY4OC43MTg1NzNdICBmZmZmZmZmZjgxODE0NDIwIGZmZmY4ODA0MDQ4MzUxMDAgMDAw MDAwMDAwMDAwMDAwMSBmZmZmODgwNDA2ZmNkNDAwCkphbiAgNiAyMjowMDowMyBza3VkYSBr ZXJuZWw6IFs3NDY4OC43MTg1NzZdIENhbGwgVHJhY2U6CkphbiAgNiAyMjowMDowMyBza3Vk YSBrZXJuZWw6IFs3NDY4OC43MTg1ODhdICBbPGZmZmZmZmZmYTBlMjY2ZTU+XSA/IHJlbGVh c2Vfc3RyaXBlX3BsdWcrMHgyNS8weDgwIFtyYWlkNDU2XQpKYW4gIDYgMjI6MDA6MDMgc2t1 ZGEga2VybmVsOiBbNzQ2ODguNzE4NTkzXSAgWzxmZmZmZmZmZmEwZTJjZjc3Pl0gPyBtYWtl X3JlcXVlc3QrMHgyYjcvMHg2YzAgW3JhaWQ0NTZdCkphbiAgNiAyMjowMDowMyBza3VkYSBr ZXJuZWw6IFs3NDY4OC43MTg2MDBdICBbPGZmZmZmZmZmODEwN2JiYjA+XSA/IGFib3J0X2V4 Y2x1c2l2ZV93YWl0KzB4YjAvMHhiMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBb NzQ2ODguNzE4NjA1XSAgWzxmZmZmZmZmZjgxNDkwMjU0Pl0gc2NoZWR1bGVfdGltZW91dCsw eDFmNC8weDI2MApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4NjEw XSAgWzxmZmZmZmZmZjgxMTEzYWI1Pl0gPyBtZW1wb29sX2FsbG9jX3NsYWIrMHgxNS8weDIw CkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg2MTRdICBbPGZmZmZm ZmZmODE0OTFiM2I+XSB3YWl0X2Zvcl9jb21tb24rMHhjYi8weDE2MApKYW4gIDYgMjI6MDA6 MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4NjE4XSAgWzxmZmZmZmZmZjgxMDhiMDUwPl0g PyB0cnlfdG9fd2FrZV91cCsweDFmMC8weDFmMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ2ODguNzE4NjIyXSAgWzxmZmZmZmZmZjgxNDkxYmVkPl0gd2FpdF9mb3JfY29t cGxldGlvbisweDFkLzB4MjAKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4 LjcxODYyNl0gIFs8ZmZmZmZmZmY4MTA3NDYwYj5dIGZsdXNoX3dvcmsrMHhlYi8weDE3MApK YW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4NjI5XSAgWzxmZmZmZmZm ZjgxMDcyOGQwPl0gPyBjd3FfYWN0aXZhdGVfZGVsYXllZF93b3JrKzB4YzAvMHhjMApKYW4g IDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4NjQ0XSAgWzxmZmZmZmZmZmEw ZTliOWE5Pl0geGxvZ19jaWxfZm9yY2VfbHNuKzB4MzkvMHgxNjAgW3hmc10KSmFuICA2IDIy OjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODY0OF0gIFs8ZmZmZmZmZmY4MTA2N2Zm OD5dID8gbG9ja190aW1lcl9iYXNlLmlzcmEuMzcrMHgzOC8weDcwCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg2NTFdICBbPGZmZmZmZmZmODEwNjgwN2Y+XSA/ IHRyeV90b19kZWxfdGltZXJfc3luYysweDRmLzB4NzAKSmFuICA2IDIyOjAwOjAzIHNrdWRh IGtlcm5lbDogWzc0Njg4LjcxODY2M10gIFs8ZmZmZmZmZmZhMGU5OWNlOT5dIF94ZnNfbG9n X2ZvcmNlKzB4NjkvMHgyODAgW3hmc10KSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDog Wzc0Njg4LjcxODY2N10gIFs8ZmZmZmZmZmY4MTQ5MDE4Nz5dID8gc2NoZWR1bGVfdGltZW91 dCsweDEyNy8weDI2MApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4 Njc2XSAgWzxmZmZmZmZmZmEwZTQyMmMwPl0gPyB4ZnNfYnVmX2RlbHdyaV9zdWJtaXRfbm93 YWl0KzB4MjAvMHgzMCBbeGZzXQpKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2 ODguNzE4Njg3XSAgWzxmZmZmZmZmZmEwZTk5ZjJhPl0geGZzX2xvZ19mb3JjZSsweDJhLzB4 YzAgW3hmc10KSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODY5OF0g IFs8ZmZmZmZmZmZhMGU5ZTgxND5dIHhmc2FpbGQrMHgxNDQvMHg3MDAgW3hmc10KSmFuICA2 IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODcwM10gIFs8ZmZmZmZmZmY4MTA4 NDZmZj5dID8gX193YWtlX3VwX2NvbW1vbisweDRmLzB4ODAKSmFuICA2IDIyOjAwOjAzIHNr dWRhIGtlcm5lbDogWzc0Njg4LjcxODcxM10gIFs8ZmZmZmZmZmZhMGU5ZTZkMD5dID8geGZz X3RyYW5zX2FpbF9jdXJzb3JfZmlyc3QrMHg5MC8weDkwIFt4ZnNdCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg3MTddICBbPGZmZmZmZmZmODEwN2FlYzA+XSBr dGhyZWFkKzB4YzAvMHhkMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODgu NzE4NzIyXSAgWzxmZmZmZmZmZjgxMDEwMDAwPl0gPyBwZXJmX3RyYWNlX3hlbl9tbXVfc2V0 X3B0ZV9hdCsweGIwLzB4MTAwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4 OC43MTg3MjZdICBbPGZmZmZmZmZmODEwN2FlMDA+XSA/IGt0aHJlYWRfZnJlZXphYmxlX3No b3VsZF9zdG9wKzB4NzAvMHg3MApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2 ODguNzE4NzMxXSAgWzxmZmZmZmZmZjgxNDliNzZjPl0gcmV0X2Zyb21fZm9yaysweDdjLzB4 YjAKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODczNV0gIFs8ZmZm ZmZmZmY4MTA3YWUwMD5dID8ga3RocmVhZF9mcmVlemFibGVfc2hvdWxkX3N0b3ArMHg3MC8w eDcwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg3NzldIHJzeW5j ICAgICAgICAgICBEIDAwMDAwMDAwMDAwMDAwMDEgICAgIDAgMjAzNDggICAyODMwIDB4MDAw MDAwMDAKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODc4M10gIGZm ZmY4ODAxNzUzYWZjYjggMDAwMDAwMDAwMDAwMDA4NiBmZmZmODgwMDAwMDAwMGM4IGZmZmY4 ODAxNzUzYWZmZDgKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODc4 Nl0gIDAwMDAwMDAwMzQwNjQzZTggZmZmZjg4MDE3NTNhZmZkOCBmZmZmODgwMTc1M2FmZmQ4 IGZmZmY4ODAxNzUzYWZmZDgKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4 LjcxODc5MF0gIGZmZmZmZmZmODE4MTQ0MjAgZmZmZjg4MDJhZDI2ZGU4MCBmZmZmODgwMTc1 M2FmY2U4IGZmZmZmZmZmODE0OTc2MTQKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDog Wzc0Njg4LjcxODc5M10gQ2FsbCBUcmFjZToKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5l bDogWzc0Njg4LjcxODc5N10gIFs8ZmZmZmZmZmY4MTQ5NzYxND5dID8gX19kb19wYWdlX2Zh dWx0KzB4MmQ0LzB4NTkwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43 MTg4MDZdICBbPGZmZmZmZmZmYTBlNDBjMzU+XSA/IHhmc19idWZfZ2V0X21hcCsweDM1LzB4 MWQwIFt4ZnNdCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg4MTVd ICBbPGZmZmZmZmZmYTBlNDFjMjM+XSA/IHhmc19idWZfcmVhZF9tYXArMHgzMy8weDE0MCBb eGZzXQpKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4ODI2XSAgWzxm ZmZmZmZmZmEwZTlmYzVkPl0gPyB4ZnNfdHJhbnNfcmVhZF9idWZfbWFwKzB4MjlkLzB4NGYw IFt4ZnNdCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg4MzddICBb PGZmZmZmZmZmYTBlOTc2ZmY+XSB4bG9nX2dyYW50X2hlYWRfd2FpdCsweGFmLzB4MjEwIFt4 ZnNdCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg4NDddICBbPGZm ZmZmZmZmYTBlOTc4ZWU+XSB4bG9nX2dyYW50X2hlYWRfY2hlY2srMHg4ZS8weGYwIFt4ZnNd CkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg4NTddICBbPGZmZmZm ZmZmYTBlOWE3OTU+XSB4ZnNfbG9nX3Jlc2VydmUrMHhjNS8weDFmMCBbeGZzXQpKYW4gIDYg MjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4ODcwXSAgWzxmZmZmZmZmZmEwZTU4 N2Y3Pl0gPyBrbWVtX3pvbmVfYWxsb2MrMHg2Ny8weGUwIFt4ZnNdCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg4ODFdICBbPGZmZmZmZmZmYTBlOTVjNzM+XSB4 ZnNfdHJhbnNfcmVzZXJ2ZSsweDIyMy8weDIzMCBbeGZzXQpKYW4gIDYgMjI6MDA6MDMgc2t1 ZGEga2VybmVsOiBbNzQ2ODguNzE4ODkxXSAgWzxmZmZmZmZmZmEwZTk1OGI3Pl0gPyBfeGZz X3RyYW5zX2FsbG9jKzB4MzcvMHhhMCBbeGZzXQpKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ2ODguNzE4OTAxXSAgWzxmZmZmZmZmZmEwZTRkN2ViPl0geGZzX3ZuX3VwZGF0 ZV90aW1lKzB4NWIvMHgxYzAgW3hmc10KSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDog Wzc0Njg4LjcxODkwNV0gIFs8ZmZmZmZmZmY4MTE4NjcyMD5dID8gc3lzX2lvY3RsKzB4YjAv MHhiMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTEwXSAgWzxm ZmZmZmZmZjgxMThlMTM1Pl0gdXBkYXRlX3RpbWUrMHgyNS8weGMwCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg5MTRdICBbPGZmZmZmZmZmODExOGUzYjI+XSB0 b3VjaF9hdGltZSsweGYyLzB4MTQwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3 NDY4OC43MTg5MTddICBbPGZmZmZmZmZmODExODZhZGE+XSB2ZnNfcmVhZGRpcisweGNhLzB4 ZTAKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxODkyMF0gIFs8ZmZm ZmZmZmY4MTE4NmMwZj5dIHN5c19nZXRkZW50cysweDhmLzB4MTEwCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg5MjRdICBbPGZmZmZmZmZmODE0OWI4MWQ+XSBz eXN0ZW1fY2FsbF9mYXN0cGF0aCsweDFhLzB4MWYKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtl cm5lbDogWzc0Njg4LjcxODkyOV0gcnN5bmMgICAgICAgICAgIEQgMDAwMDAwMDAwMDAwMDAw MSAgICAgMCAyMDM0OSAgMjAzNDggMHgwMDAwMDAwMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEg a2VybmVsOiBbNzQ2ODguNzE4OTMyXSAgZmZmZjg4MDFjMGQ3MWMzOCAwMDAwMDAwMDAwMDAw MDg2IDAwMDAwMDAwNjQ4YmRmMTcgZmZmZjg4MDFjMGQ3MWZkOApKYW4gIDYgMjI6MDA6MDMg c2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTM2XSAgZmZmZjg4MDA0OTNjZWM4MCBmZmZmODgw MWMwZDcxZmQ4IGZmZmY4ODAxYzBkNzFmZDggZmZmZjg4MDFjMGQ3MWZkOApKYW4gIDYgMjI6 MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTM5XSAgZmZmZmZmZmY4MTgxNDQyMCBm ZmZmODgwMmFkMjY5YjAwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMApKYW4g IDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTQzXSBDYWxsIFRyYWNlOgpK YW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTUzXSAgWzxmZmZmZmZm ZmEwZTQ4Y2ZjPl0gPyB4ZnNfaXVubG9jaysweDEwYy8weDEzMCBbeGZzXQpKYW4gIDYgMjI6 MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTYzXSAgWzxmZmZmZmZmZmEwZTQ4ZDJl Pl0gPyB4ZnNfaXVubG9ja19tYXBfc2hhcmVkKzB4ZS8weDEwIFt4ZnNdCkphbiAgNiAyMjow MDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg5NjddICBbPGZmZmZmZmZmODExODk5OGE+ XSA/IF9fZF9pbnN0YW50aWF0ZSsweDhhLzB4MTAwCkphbiAgNiAyMjowMDowMyBza3VkYSBr ZXJuZWw6IFs3NDY4OC43MTg5NzFdICBbPGZmZmZmZmZmODEwODM5OTE+XSA/IGluX2dyb3Vw X3ArMHgzMS8weDQwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTg5 NzRdICBbPGZmZmZmZmZmODExN2ZhMjY+XSA/IGdlbmVyaWNfcGVybWlzc2lvbisweDE3Ni8w eDI4MApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTg1XSAgWzxm ZmZmZmZmZmEwZTk3NmZmPl0geGxvZ19ncmFudF9oZWFkX3dhaXQrMHhhZi8weDIxMCBbeGZz XQpKYW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE4OTk1XSAgWzxmZmZm ZmZmZmEwZTk3OTQ5Pl0geGxvZ19ncmFudF9oZWFkX2NoZWNrKzB4ZTkvMHhmMCBbeGZzXQpK YW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE5MDA1XSAgWzxmZmZmZmZm ZmEwZTlhNzk1Pl0geGZzX2xvZ19yZXNlcnZlKzB4YzUvMHgxZjAgW3hmc10KSmFuICA2IDIy OjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4LjcxOTAxNV0gIFs8ZmZmZmZmZmZhMGU5NWM3 Mz5dIHhmc190cmFuc19yZXNlcnZlKzB4MjIzLzB4MjMwIFt4ZnNdCkphbiAgNiAyMjowMDow MyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTkwMjVdICBbPGZmZmZmZmZmYTBlOTU4Yjc+XSA/ IF94ZnNfdHJhbnNfYWxsb2MrMHgzNy8weGEwIFt4ZnNdCkphbiAgNiAyMjowMDowMyBza3Vk YSBrZXJuZWw6IFs3NDY4OC43MTkwMzddICBbPGZmZmZmZmZmYTBlNTY5MWI+XSB4ZnNfY3Jl YXRlKzB4MWViLzB4NjkwIFt4ZnNdCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3 NDY4OC43MTkwNDBdICBbPGZmZmZmZmZmODExN2VkYWI+XSA/IGxvb2t1cF9kY2FjaGUrMHgz Yi8weGQwCkphbiAgNiAyMjowMDowMyBza3VkYSBrZXJuZWw6IFs3NDY4OC43MTkwNTBdICBb PGZmZmZmZmZmYTBlNGQzODY+XSB4ZnNfdm5fbWtub2QrMHhhNi8weDFiMCBbeGZzXQpKYW4g IDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE5MDYwXSAgWzxmZmZmZmZmZmEw ZTRkNGE2Pl0geGZzX3ZuX21rZGlyKzB4MTYvMHgyMCBbeGZzXQpKYW4gIDYgMjI6MDA6MDMg c2t1ZGEga2VybmVsOiBbNzQ2ODguNzE5MDYzXSAgWzxmZmZmZmZmZjgxMTgwYzcyPl0gdmZz X21rZGlyKzB4YzIvMHgxNDAKSmFuICA2IDIyOjAwOjAzIHNrdWRhIGtlcm5lbDogWzc0Njg4 LjcxOTA2Nl0gIFs8ZmZmZmZmZmY4MTE4NDc5Mz5dIHN5c19ta2RpcmF0KzB4YTMvMHhiMApK YW4gIDYgMjI6MDA6MDMgc2t1ZGEga2VybmVsOiBbNzQ2ODguNzE5MDY5XSAgWzxmZmZmZmZm ZjgxMTg0N2I5Pl0gc3lzX21rZGlyKzB4MTkvMHgyMApKYW4gIDYgMjI6MDA6MDMgc2t1ZGEg a2VybmVsOiBbNzQ2ODguNzE5MDczXSAgWzxmZmZmZmZmZjgxNDliODFkPl0gc3lzdGVtX2Nh bGxfZmFzdHBhdGgrMHgxYS8weDFmCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3 NDgwOC42MDM1ODRdIHhmc2FpbGQvbWQxICAgICBEIDAwMDAwMDAwMDAwMDAwMDEgICAgIDAg ICA1MDAgICAgICAyIDB4MDAwMDAwMDAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDog Wzc0ODA4LjYwMzU4OV0gIGZmZmY4ODAzZmQ3ZmRhZjggMDAwMDAwMDAwMDAwMDA0NiAwMDAw MDAwMmEwZTI2NzcwIGZmZmY4ODAzZmQ3ZmRmZDgKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtl cm5lbDogWzc0ODA4LjYwMzU5M10gIGZmZmY4ODA0MDYxZDE4MDAgZmZmZjg4MDNmZDdmZGZk OCBmZmZmODgwM2ZkN2ZkZmQ4IGZmZmY4ODAzZmQ3ZmRmZDgKSmFuICA2IDIyOjAyOjAzIHNr dWRhIGtlcm5lbDogWzc0ODA4LjYwMzU5N10gIGZmZmZmZmZmODE4MTQ0MjAgZmZmZjg4MDQw NDgzNTEwMCAwMDAwMDAwMDAwMDAwMDAxIGZmZmY4ODA0MDZmY2Q0MDAKSmFuICA2IDIyOjAy OjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzYwMV0gQ2FsbCBUcmFjZToKSmFuICA2IDIy OjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzYxM10gIFs8ZmZmZmZmZmZhMGUyNjZl NT5dID8gcmVsZWFzZV9zdHJpcGVfcGx1ZysweDI1LzB4ODAgW3JhaWQ0NTZdCkphbiAgNiAy MjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM2MTddICBbPGZmZmZmZmZmYTBlMmNm Nzc+XSA/IG1ha2VfcmVxdWVzdCsweDJiNy8weDZjMCBbcmFpZDQ1Nl0KSmFuICA2IDIyOjAy OjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzYyNF0gIFs8ZmZmZmZmZmY4MTA3YmJiMD5d ID8gYWJvcnRfZXhjbHVzaXZlX3dhaXQrMHhiMC8weGIwCkphbiAgNiAyMjowMjowMyBza3Vk YSBrZXJuZWw6IFs3NDgwOC42MDM2MzBdICBbPGZmZmZmZmZmODE0OTAyNTQ+XSBzY2hlZHVs ZV90aW1lb3V0KzB4MWY0LzB4MjYwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3 NDgwOC42MDM2MzVdICBbPGZmZmZmZmZmODExMTNhYjU+XSA/IG1lbXBvb2xfYWxsb2Nfc2xh YisweDE1LzB4MjAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzYz OV0gIFs8ZmZmZmZmZmY4MTQ5MWIzYj5dIHdhaXRfZm9yX2NvbW1vbisweGNiLzB4MTYwCkph biAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM2NDNdICBbPGZmZmZmZmZm ODEwOGIwNTA+XSA/IHRyeV90b193YWtlX3VwKzB4MWYwLzB4MWYwCkphbiAgNiAyMjowMjow MyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM2NDddICBbPGZmZmZmZmZmODE0OTFiZWQ+XSB3 YWl0X2Zvcl9jb21wbGV0aW9uKzB4MWQvMHgyMApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ4MDguNjAzNjUxXSAgWzxmZmZmZmZmZjgxMDc0NjBiPl0gZmx1c2hfd29yaysw eGViLzB4MTcwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM2NTRd ICBbPGZmZmZmZmZmODEwNzI4ZDA+XSA/IGN3cV9hY3RpdmF0ZV9kZWxheWVkX3dvcmsrMHhj MC8weGMwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM2NjhdICBb PGZmZmZmZmZmYTBlOWI5YTk+XSB4bG9nX2NpbF9mb3JjZV9sc24rMHgzOS8weDE2MCBbeGZz XQpKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzNjcyXSAgWzxmZmZm ZmZmZjgxMDY3ZmY4Pl0gPyBsb2NrX3RpbWVyX2Jhc2UuaXNyYS4zNysweDM4LzB4NzAKSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzY3Nl0gIFs8ZmZmZmZmZmY4 MTA2ODA3Zj5dID8gdHJ5X3RvX2RlbF90aW1lcl9zeW5jKzB4NGYvMHg3MApKYW4gIDYgMjI6 MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzNjg3XSAgWzxmZmZmZmZmZmEwZTk5Y2U5 Pl0gX3hmc19sb2dfZm9yY2UrMHg2OS8weDI4MCBbeGZzXQpKYW4gIDYgMjI6MDI6MDMgc2t1 ZGEga2VybmVsOiBbNzQ4MDguNjAzNjkxXSAgWzxmZmZmZmZmZjgxNDkwMTg3Pl0gPyBzY2hl ZHVsZV90aW1lb3V0KzB4MTI3LzB4MjYwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6 IFs3NDgwOC42MDM3MDFdICBbPGZmZmZmZmZmYTBlNDIyYzA+XSA/IHhmc19idWZfZGVsd3Jp X3N1Ym1pdF9ub3dhaXQrMHgyMC8weDMwIFt4ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBr ZXJuZWw6IFs3NDgwOC42MDM3MTFdICBbPGZmZmZmZmZmYTBlOTlmMmE+XSB4ZnNfbG9nX2Zv cmNlKzB4MmEvMHhjMCBbeGZzXQpKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4 MDguNjAzNzIyXSAgWzxmZmZmZmZmZmEwZTllODE0Pl0geGZzYWlsZCsweDE0NC8weDcwMCBb eGZzXQpKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzNzI3XSAgWzxm ZmZmZmZmZjgxMDg0NmZmPl0gPyBfX3dha2VfdXBfY29tbW9uKzB4NGYvMHg4MApKYW4gIDYg MjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzNzM4XSAgWzxmZmZmZmZmZmEwZTll NmQwPl0gPyB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9maXJzdCsweDkwLzB4OTAgW3hmc10KSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzc0Ml0gIFs8ZmZmZmZmZmY4 MTA3YWVjMD5dIGt0aHJlYWQrMHhjMC8weGQwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJu ZWw6IFs3NDgwOC42MDM3NDddICBbPGZmZmZmZmZmODEwMTAwMDA+XSA/IHBlcmZfdHJhY2Vf eGVuX21tdV9zZXRfcHRlX2F0KzB4YjAvMHgxMDAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtl cm5lbDogWzc0ODA4LjYwMzc1MV0gIFs8ZmZmZmZmZmY4MTA3YWUwMD5dID8ga3RocmVhZF9m cmVlemFibGVfc2hvdWxkX3N0b3ArMHg3MC8weDcwCkphbiAgNiAyMjowMjowMyBza3VkYSBr ZXJuZWw6IFs3NDgwOC42MDM3NTZdICBbPGZmZmZmZmZmODE0OWI3NmM+XSByZXRfZnJvbV9m b3JrKzB4N2MvMHhiMApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAz NzYwXSAgWzxmZmZmZmZmZjgxMDdhZTAwPl0gPyBrdGhyZWFkX2ZyZWV6YWJsZV9zaG91bGRf c3RvcCsweDcwLzB4NzAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYw MzgwNF0gcnN5bmMgICAgICAgICAgIEQgMDAwMDAwMDAwMDAwMDAwMSAgICAgMCAyMDM0OCAg IDI4MzAgMHgwMDAwMDAwMApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDgu NjAzODA4XSAgZmZmZjg4MDE3NTNhZmNiOCAwMDAwMDAwMDAwMDAwMDg2IGZmZmY4ODAwMDAw MDAwYzggZmZmZjg4MDE3NTNhZmZkOApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBb NzQ4MDguNjAzODExXSAgMDAwMDAwMDAzNDA2NDNlOCBmZmZmODgwMTc1M2FmZmQ4IGZmZmY4 ODAxNzUzYWZmZDggZmZmZjg4MDE3NTNhZmZkOApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ4MDguNjAzODE1XSAgZmZmZmZmZmY4MTgxNDQyMCBmZmZmODgwMmFkMjZkZTgw IGZmZmY4ODAxNzUzYWZjZTggZmZmZmZmZmY4MTQ5NzYxNApKYW4gIDYgMjI6MDI6MDMgc2t1 ZGEga2VybmVsOiBbNzQ4MDguNjAzODE4XSBDYWxsIFRyYWNlOgpKYW4gIDYgMjI6MDI6MDMg c2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzODIyXSAgWzxmZmZmZmZmZjgxNDk3NjE0Pl0gPyBf X2RvX3BhZ2VfZmF1bHQrMHgyZDQvMHg1OTAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5l bDogWzc0ODA4LjYwMzgzMV0gIFs8ZmZmZmZmZmZhMGU0MGMzNT5dID8geGZzX2J1Zl9nZXRf bWFwKzB4MzUvMHgxZDAgW3hmc10KSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0 ODA4LjYwMzg0MF0gIFs8ZmZmZmZmZmZhMGU0MWMyMz5dID8geGZzX2J1Zl9yZWFkX21hcCsw eDMzLzB4MTQwIFt4ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42 MDM4NTFdICBbPGZmZmZmZmZmYTBlOWZjNWQ+XSA/IHhmc190cmFuc19yZWFkX2J1Zl9tYXAr MHgyOWQvMHg0ZjAgW3hmc10KSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4 LjYwMzg2Ml0gIFs8ZmZmZmZmZmZhMGU5NzZmZj5dIHhsb2dfZ3JhbnRfaGVhZF93YWl0KzB4 YWYvMHgyMTAgW3hmc10KSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYw Mzg3Ml0gIFs8ZmZmZmZmZmZhMGU5NzhlZT5dIHhsb2dfZ3JhbnRfaGVhZF9jaGVjaysweDhl LzB4ZjAgW3hmc10KSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzg4 M10gIFs8ZmZmZmZmZmZhMGU5YTc5NT5dIHhmc19sb2dfcmVzZXJ2ZSsweGM1LzB4MWYwIFt4 ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM4OTVdICBbPGZm ZmZmZmZmYTBlNTg3Zjc+XSA/IGttZW1fem9uZV9hbGxvYysweDY3LzB4ZTAgW3hmc10KSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzkwNl0gIFs8ZmZmZmZmZmZh MGU5NWM3Mz5dIHhmc190cmFuc19yZXNlcnZlKzB4MjIzLzB4MjMwIFt4ZnNdCkphbiAgNiAy MjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5MTZdICBbPGZmZmZmZmZmYTBlOTU4 Yjc+XSA/IF94ZnNfdHJhbnNfYWxsb2MrMHgzNy8weGEwIFt4ZnNdCkphbiAgNiAyMjowMjow MyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5MjddICBbPGZmZmZmZmZmYTBlNGQ3ZWI+XSB4 ZnNfdm5fdXBkYXRlX3RpbWUrMHg1Yi8weDFjMCBbeGZzXQpKYW4gIDYgMjI6MDI6MDMgc2t1 ZGEga2VybmVsOiBbNzQ4MDguNjAzOTMxXSAgWzxmZmZmZmZmZjgxMTg2NzIwPl0gPyBzeXNf aW9jdGwrMHhiMC8weGIwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42 MDM5MzVdICBbPGZmZmZmZmZmODExOGUxMzU+XSB1cGRhdGVfdGltZSsweDI1LzB4YzAKSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzkzOV0gIFs8ZmZmZmZmZmY4 MTE4ZTNiMj5dIHRvdWNoX2F0aW1lKzB4ZjIvMHgxNDAKSmFuICA2IDIyOjAyOjAzIHNrdWRh IGtlcm5lbDogWzc0ODA4LjYwMzk0M10gIFs8ZmZmZmZmZmY4MTE4NmFkYT5dIHZmc19yZWFk ZGlyKzB4Y2EvMHhlMApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAz OTQ2XSAgWzxmZmZmZmZmZjgxMTg2YzBmPl0gc3lzX2dldGRlbnRzKzB4OGYvMHgxMTAKSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzk1MF0gIFs8ZmZmZmZmZmY4 MTQ5YjgxZD5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MWEvMHgxZgpKYW4gIDYgMjI6MDI6 MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjAzOTU1XSByc3luYyAgICAgICAgICAgRCAwMDAw MDAwMDAwMDAwMDAxICAgICAwIDIwMzQ5ICAyMDM0OCAweDAwMDAwMDAwCkphbiAgNiAyMjow MjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5NThdICBmZmZmODgwMWMwZDcxYzM4IDAw MDAwMDAwMDAwMDAwODYgMDAwMDAwMDA2NDhiZGYxNyBmZmZmODgwMWMwZDcxZmQ4CkphbiAg NiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5NjJdICBmZmZmODgwMDQ5M2Nl YzgwIGZmZmY4ODAxYzBkNzFmZDggZmZmZjg4MDFjMGQ3MWZkOCBmZmZmODgwMWMwZDcxZmQ4 CkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5NjVdICBmZmZmZmZm ZjgxODE0NDIwIGZmZmY4ODAyYWQyNjliMDAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAw MDAwMDAwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5NjldIENh bGwgVHJhY2U6CkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5Nzld ICBbPGZmZmZmZmZmYTBlNDhjZmM+XSA/IHhmc19pdW5sb2NrKzB4MTBjLzB4MTMwIFt4ZnNd CkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDM5ODldICBbPGZmZmZm ZmZmYTBlNDhkMmU+XSA/IHhmc19pdW5sb2NrX21hcF9zaGFyZWQrMHhlLzB4MTAgW3hmc10K SmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzk5M10gIFs8ZmZmZmZm ZmY4MTE4OTk4YT5dID8gX19kX2luc3RhbnRpYXRlKzB4OGEvMHgxMDAKSmFuICA2IDIyOjAy OjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwMzk5N10gIFs8ZmZmZmZmZmY4MTA4Mzk5MT5d ID8gaW5fZ3JvdXBfcCsweDMxLzB4NDAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDog Wzc0ODA4LjYwNDAwMF0gIFs8ZmZmZmZmZmY4MTE3ZmEyNj5dID8gZ2VuZXJpY19wZXJtaXNz aW9uKzB4MTc2LzB4MjgwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42 MDQwMTFdICBbPGZmZmZmZmZmYTBlOTc2ZmY+XSB4bG9nX2dyYW50X2hlYWRfd2FpdCsweGFm LzB4MjEwIFt4ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQw MjBdICBbPGZmZmZmZmZmYTBlOTc5NDk+XSB4bG9nX2dyYW50X2hlYWRfY2hlY2srMHhlOS8w eGYwIFt4ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQwMzFd ICBbPGZmZmZmZmZmYTBlOWE3OTU+XSB4ZnNfbG9nX3Jlc2VydmUrMHhjNS8weDFmMCBbeGZz XQpKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2VybmVsOiBbNzQ4MDguNjA0MDQxXSAgWzxmZmZm ZmZmZmEwZTk1YzczPl0geGZzX3RyYW5zX3Jlc2VydmUrMHgyMjMvMHgyMzAgW3hmc10KSmFu ICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwNDA1MF0gIFs8ZmZmZmZmZmZh MGU5NThiNz5dID8gX3hmc190cmFuc19hbGxvYysweDM3LzB4YTAgW3hmc10KSmFuICA2IDIy OjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4LjYwNDA2Ml0gIFs8ZmZmZmZmZmZhMGU1Njkx Yj5dIHhmc19jcmVhdGUrMHgxZWIvMHg2OTAgW3hmc10KSmFuICA2IDIyOjAyOjAzIHNrdWRh IGtlcm5lbDogWzc0ODA4LjYwNDA2NV0gIFs8ZmZmZmZmZmY4MTE3ZWRhYj5dID8gbG9va3Vw X2RjYWNoZSsweDNiLzB4ZDAKSmFuICA2IDIyOjAyOjAzIHNrdWRhIGtlcm5lbDogWzc0ODA4 LjYwNDA3NV0gIFs8ZmZmZmZmZmZhMGU0ZDM4Nj5dIHhmc192bl9ta25vZCsweGE2LzB4MWIw IFt4ZnNdCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQwODVdICBb PGZmZmZmZmZmYTBlNGQ0YTY+XSB4ZnNfdm5fbWtkaXIrMHgxNi8weDIwIFt4ZnNdCkphbiAg NiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQwODhdICBbPGZmZmZmZmZmODEx ODBjNzI+XSB2ZnNfbWtkaXIrMHhjMi8weDE0MApKYW4gIDYgMjI6MDI6MDMgc2t1ZGEga2Vy bmVsOiBbNzQ4MDguNjA0MDkxXSAgWzxmZmZmZmZmZjgxMTg0NzkzPl0gc3lzX21rZGlyYXQr MHhhMy8weGIwCkphbiAgNiAyMjowMjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQwOTRd ICBbPGZmZmZmZmZmODExODQ3Yjk+XSBzeXNfbWtkaXIrMHgxOS8weDIwCkphbiAgNiAyMjow MjowMyBza3VkYSBrZXJuZWw6IFs3NDgwOC42MDQwOThdICBbPGZmZmZmZmZmODE0OWI4MWQ+ XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDFhLzB4MWYKSmFuICA2IDIyOjA0OjAzIHNrdWRh IGtlcm5lbDogWzc0OTI4LjQ4ODYwMV0geGZzYWlsZC9tZDEgICAgIEQgMDAwMDAwMDAwMDAw MDAwMSAgICAgMCAgIDUwMCAgICAgIDIgMHgwMDAwMDAwMApKYW4gIDYgMjI6MDQ6MDMgc2t1 ZGEga2VybmVsOiBbNzQ5MjguNDg4NjA2XSAgZmZmZjg4MDNmZDdmZGFmOCAwMDAwMDAwMDAw MDAwMDQ2IDAwMDAwMDAyYTBlMjY3NzAgZmZmZjg4MDNmZDdmZGZkOApKYW4gIDYgMjI6MDQ6 MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjExXSAgZmZmZjg4MDQwNjFkMTgwMCBmZmZm ODgwM2ZkN2ZkZmQ4IGZmZmY4ODAzZmQ3ZmRmZDggZmZmZjg4MDNmZDdmZGZkOApKYW4gIDYg MjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjE0XSAgZmZmZmZmZmY4MTgxNDQy MCBmZmZmODgwNDA0ODM1MTAwIDAwMDAwMDAwMDAwMDAwMDEgZmZmZjg4MDQwNmZjZDQwMApK YW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjE4XSBDYWxsIFRyYWNl OgpKYW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjMwXSAgWzxmZmZm ZmZmZmEwZTI2NmU1Pl0gPyByZWxlYXNlX3N0cmlwZV9wbHVnKzB4MjUvMHg4MCBbcmFpZDQ1 Nl0KSmFuICA2IDIyOjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODYzNV0gIFs8ZmZm ZmZmZmZhMGUyY2Y3Nz5dID8gbWFrZV9yZXF1ZXN0KzB4MmI3LzB4NmMwIFtyYWlkNDU2XQpK YW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjQyXSAgWzxmZmZmZmZm ZjgxMDdiYmIwPl0gPyBhYm9ydF9leGNsdXNpdmVfd2FpdCsweGIwLzB4YjAKSmFuICA2IDIy OjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODY0N10gIFs8ZmZmZmZmZmY4MTQ5MDI1 ND5dIHNjaGVkdWxlX3RpbWVvdXQrMHgxZjQvMHgyNjAKSmFuICA2IDIyOjA0OjAzIHNrdWRh IGtlcm5lbDogWzc0OTI4LjQ4ODY1Ml0gIFs8ZmZmZmZmZmY4MTExM2FiNT5dID8gbWVtcG9v bF9hbGxvY19zbGFiKzB4MTUvMHgyMApKYW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBb NzQ5MjguNDg4NjU2XSAgWzxmZmZmZmZmZjgxNDkxYjNiPl0gd2FpdF9mb3JfY29tbW9uKzB4 Y2IvMHgxNjAKSmFuICA2IDIyOjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODY2MV0g IFs8ZmZmZmZmZmY4MTA4YjA1MD5dID8gdHJ5X3RvX3dha2VfdXArMHgxZjAvMHgxZjAKSmFu ICA2IDIyOjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODY2NV0gIFs8ZmZmZmZmZmY4 MTQ5MWJlZD5dIHdhaXRfZm9yX2NvbXBsZXRpb24rMHgxZC8weDIwCkphbiAgNiAyMjowNDow MyBza3VkYSBrZXJuZWw6IFs3NDkyOC40ODg2NjhdICBbPGZmZmZmZmZmODEwNzQ2MGI+XSBm bHVzaF93b3JrKzB4ZWIvMHgxNzAKSmFuICA2IDIyOjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0 OTI4LjQ4ODY3MV0gIFs8ZmZmZmZmZmY4MTA3MjhkMD5dID8gY3dxX2FjdGl2YXRlX2RlbGF5 ZWRfd29yaysweGMwLzB4YzAKSmFuICA2IDIyOjA0OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4 LjQ4ODY4Nl0gIFs8ZmZmZmZmZmZhMGU5YjlhOT5dIHhsb2dfY2lsX2ZvcmNlX2xzbisweDM5 LzB4MTYwIFt4ZnNdCkphbiAgNiAyMjowNDowMyBza3VkYSBrZXJuZWw6IFs3NDkyOC40ODg2 OTBdICBbPGZmZmZmZmZmODEwNjdmZjg+XSA/IGxvY2tfdGltZXJfYmFzZS5pc3JhLjM3KzB4 MzgvMHg3MApKYW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NjkzXSAg WzxmZmZmZmZmZjgxMDY4MDdmPl0gPyB0cnlfdG9fZGVsX3RpbWVyX3N5bmMrMHg0Zi8weDcw CkphbiAgNiAyMjowNDowMyBza3VkYSBrZXJuZWw6IFs3NDkyOC40ODg3MDVdICBbPGZmZmZm ZmZmYTBlOTljZTk+XSBfeGZzX2xvZ19mb3JjZSsweDY5LzB4MjgwIFt4ZnNdCkphbiAgNiAy MjowNDowMyBza3VkYSBrZXJuZWw6IFs3NDkyOC40ODg3MDldICBbPGZmZmZmZmZmODE0OTAx ODc+XSA/IHNjaGVkdWxlX3RpbWVvdXQrMHgxMjcvMHgyNjAKSmFuICA2IDIyOjA0OjAzIHNr dWRhIGtlcm5lbDogWzc0OTI4LjQ4ODcxOV0gIFs8ZmZmZmZmZmZhMGU0MjJjMD5dID8geGZz X2J1Zl9kZWx3cmlfc3VibWl0X25vd2FpdCsweDIwLzB4MzAgW3hmc10KSmFuICA2IDIyOjA0 OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODcyOV0gIFs8ZmZmZmZmZmZhMGU5OWYyYT5d IHhmc19sb2dfZm9yY2UrMHgyYS8weGMwIFt4ZnNdCkphbiAgNiAyMjowNDowMyBza3VkYSBr ZXJuZWw6IFs3NDkyOC40ODg3NDBdICBbPGZmZmZmZmZmYTBlOWU4MTQ+XSB4ZnNhaWxkKzB4 MTQ0LzB4NzAwIFt4ZnNdCkphbiAgNiAyMjowNDowMyBza3VkYSBrZXJuZWw6IFs3NDkyOC40 ODg3NDVdICBbPGZmZmZmZmZmODEwODQ2ZmY+XSA/IF9fd2FrZV91cF9jb21tb24rMHg0Zi8w eDgwCkphbiAgNiAyMjowNDowMyBza3VkYSBrZXJuZWw6IFs3NDkyOC40ODg3NTZdICBbPGZm ZmZmZmZmYTBlOWU2ZDA+XSA/IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KzB4OTAvMHg5 MCBbeGZzXQpKYW4gIDYgMjI6MDQ6MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NzYwXSAg WzxmZmZmZmZmZjgxMDdhZWMwPl0ga3RocmVhZCsweGMwLzB4ZDAKSmFuICA2IDIyOjA0OjAz IHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODc2NF0gIFs8ZmZmZmZmZmY4MTAxMDAwMD5dID8g cGVyZl90cmFjZV94ZW5fbW11X3NldF9wdGVfYXQrMHhiMC8weDEwMApKYW4gIDYgMjI6MDQ6 MDMgc2t1ZGEga2VybmVsOiBbNzQ5MjguNDg4NzY5XSAgWzxmZmZmZmZmZjgxMDdhZTAwPl0g PyBrdGhyZWFkX2ZyZWV6YWJsZV9zaG91bGRfc3RvcCsweDcwLzB4NzAKSmFuICA2IDIyOjA0 OjAzIHNrdWRhIGtlcm5lbDogWzc0OTI4LjQ4ODc3M10gIFs8ZmZmZmZmZmY4MTQ5Yjc2Yz5d IHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwCkphbiAgNiAyMjowNDowMyBza3VkYSBrZXJuZWw6 IFs3NDkyOC40ODg3NzhdICBbPGZmZmZmZmZmODEwN2FlMDA+XSA/IGt0aHJlYWRfZnJlZXph YmxlX3Nob3VsZF9zdG9wKzB4NzAvMHg3MA== --------------020802070404050604010600-- From tinguely@sgi.com Mon Jan 7 12:00:29 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07I0TQ9091474 for ; Mon, 7 Jan 2013 12:00:29 -0600 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 855B88F8065; Mon, 7 Jan 2013 10:03:21 -0800 (PST) Message-ID: <50EB0DE9.70808@sgi.com> Date: Mon, 07 Jan 2013 12:03:21 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push References: <20130105213420.307598929@sgi.com> <20130106000834.GM3120@dastard> In-Reply-To: <20130106000834.GM3120@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/05/13 18:08, Dave Chinner wrote: > On Sat, Jan 05, 2013 at 02:34:15PM -0600, Mark Tinguely wrote: >> The back-end of xlog_cil_push() allows multiple push sequences >> to write to the xlog at the same time. > > It does this by design, and has since day zero. > >> This will cause problems >> for recovery and also could cause the xlog_cil_committed() callback >> to be called out of sequence. > > Log recovery is supposed to be able to handle it just fine in that > recovery only replays up to the last checkpoint with a valid commit > record. Checkpoints that don't have valid commit records - no matter > the order they are written - will terminate recovery at the LSN of > the lowest entire commit. > >> This was discovered with an EFI/EFD misorder. There are several (5) active >> sequence pushes and 3 completed pushes. The callback for the sequence (2) >> holding the EFD is being processed but the callback for the sequence (1) >> holding the EFI has not yet been processed. > > What are the symptoms shown when this problem is hit? AFAICT, there > is no problem here - this comment above __xfs_efi_release() explains > that EFI/EFD misordering is expected: > > /* > * Freeing the efi requires that we remove it from the AIL if it has already > * been placed there. However, the EFI may not yet have been placed in the AIL > * when called by xfs_efi_release() from EFD processing due to the ordering of > * committed vs unpin operations in bulk insert operations. Hence the > * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees > * the EFI. > */ > > This was introduced in this commit: > > $ gl -n 1 b199c8a4 > commit b199c8a4ba11879df87daad496ceee41fdc6aa82 > Author: Dave Chinner > Date: Mon Dec 20 11:59:49 2010 +1100 > > xfs: Pull EFI/EFD handling out from under the AIL lock > > EFI/EFD interactions are protected from races by the AIL lock. They > are the only type of log items that require the the AIL lock to > serialise internal state, so they need to be separated from the AIL > lock before we can do bulk insert operations on the AIL. > > To acheive this, convert the counter of the number of extents in the > EFI to an atomic so it can be safely manipulated by EFD processing > without locks. Also, convert the EFI state flag manipulations to use > atomic bit operations so no locks are needed to record state > changes. Finally, use the state bits to determine when it is safe to > free the EFI and clean up the code to do this neatly. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > > Hence if there is some problem being seen as a result of allowing this > behaviour, I'd like to know what that problem actually is.... > The filesystem is in forced shutdown with the following error: xfs_trans_ail_delete_bulk: attempting to delete a log item that is not in the AIL. The EFI is in the CIL sequence #1, the EFD is in sequence #2. Sequence #2 is running the cil callback but sequence #1 has not yet run its callback. Normally, xfs_efi_item_committed() sets the XFS_EFI_COMMITTED bit. Either the xfs_efi_item_unpin() or the xfs_efi_release() could happen first and the comparison in __xfs_efi_release() compensates for that. But if the xfs_efi_item_committed() is not called before the xfs_efi_release() is called from the xfs_efd_item_committed(), then we will get the "not in the AIL" shutdown. >> The xlog_cil_committed() callback misorder happens because the buffer that >> contains the sequence ticket is filled by another sequence push and the >> callback for the buffer write happens before the callback is placed onto >> that buffer. > > I'm not sure I follow you here. xfs_log_done() takes a reference to > the iclog that the commit record is added to, and I/O cannot be > issued on that iclog until the reference count drops to zero. Hence > the sequence of writing the commit record, obtaining the commit_lsn, > adding the callbacks to the iclog and releasing the iclog are atomic > from an I/O perspective, and IO is only issued when the reference > count falls to zero. > > And given that xlog_write() uses the same reference counting to > provide the same guarantees, I cannot see how concurrent in-memory > writes to the same iclog could cause IO completion callbacks to be > issued out of order. I will look again at the ic_refcnt but it the callback from cil push sequence #2 has jumped in front of cil push #1. > >> This patch serializes the xlog_write() so that only one sequence (the lowest) >> is written at a time. This will also stop the race between xlog_commit_record() >> and the adding of the callback onto the buffer containing the sequence commit >> record. > > The point of the separation of the commit record from the > commit "data" is to allow interleaving of multiple transaction > commits without serialising the transaction commit process. It's > actually a significant performance win when dealing with synchronous > transaction heavy workloads as it allows multiple concurrent > synchronous transactions to aggregate into a single log buffer. From > that perspective alone, that's a NACK from me to to this patch... > > Without knowing what the problem you are actually seeing is, I can't > make any further suggestions or comments about whether there is a > real issue here. > > Cheers, > > Dave. --Mark. From fugazzi99@gmail.com Mon Jan 7 13:18:38 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07JIcKI095536 for ; Mon, 7 Jan 2013 13:18:38 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A43838F804C for ; Mon, 7 Jan 2013 11:21:33 -0800 (PST) X-ASG-Debug-ID: 1357586491-04bdf04312550f60001-NocioJ Received: from mail-bk0-f44.google.com (mail-bk0-f44.google.com [209.85.214.44]) by cuda.sgi.com with ESMTP id CoTXZRQxj8zLIbAV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Jan 2013 11:21:32 -0800 (PST) X-Barracuda-Envelope-From: fugazzi99@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.44 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.44] Received: by mail-bk0-f44.google.com with SMTP id w11so8621776bku.17 for ; Mon, 07 Jan 2013 11:21:31 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.44] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.44] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=2/vpC8WdK9KPln8kHYTkl3Z19QY3JrZtOAUZ/+RDahY=; b=MXMtWbUl6jdDh8vm+2HIPXScJrw0zlyfKICmmNdhaWNGvTsbbNBp1BGUi+jted2eJd dAG2Rvk6ulD2iSo+VEK/QUvgItyLqb5Z2eeJ1cTyE3T701WGCRHgKrJ/H6NEsp/itot0 3Bp/vUCSnJBWGfKeccrC2qta3NRF7vRuBltu2Az6A2P1x6JVehF8SjRwP+TugExbEkR+ mejb+ZVA57CLeA7pwyhPq6rN5BQWXRgAPemhbTL9HOudJj/HcaJhVt8rAmtzyzByxIQW WozMweHxqACg1dZvLvlJ5S6lvVo0aN8v2JU70pD2SPDa70rIE2xzVtrNh9JfZaB8r3xJ JA0Q== X-Received: by 10.204.127.11 with SMTP id e11mr31333680bks.0.1357586490957; Mon, 07 Jan 2013 11:21:30 -0800 (PST) Received: from [192.168.1.14] (116.Red-2-142-148.dynamicIP.rima-tde.net. [2.142.148.116]) by mx.google.com with ESMTPS id o7sm43574411bkv.13.2013.01.07.11.21.28 (version=SSLv3 cipher=OTHER); Mon, 07 Jan 2013 11:21:30 -0800 (PST) Message-ID: <50EB2073.1040609@gmail.com> Date: Mon, 07 Jan 2013 19:22:27 +0000 From: Fugazzi99 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: XFS restore don't restore Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: XFS restore don't restore Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-bk0-f44.google.com[209.85.214.44] X-Barracuda-Start-Time: 1357586491 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-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=DKIM_SIGNED, DKIM_VERIFIED, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi everyone, I think I hit a problem of xfsrestore again. I had some problems with my HD so I had to change it, after that I tried to restore from the last dump of yesterday. I made it with the last xfsrestore/dump 3.1.2 but when I try to restore it with xfsrestore 3.1.0 from sysrescuecd I got for the root filesystem: xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control xfsrestore: searching media for dump xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: hostname: orione xfsrestore: mount point: / xfsrestore: volume: /dev/sda2 xfsrestore: session time: Thu Jan 6 13:01:53 2013 xfsrestore: level: 0 xfsrestore: session label: "root" xfsrestore: media label: "root" xfsrestore: file system id: 4af7e15f-17b4-4b4e-9c2a-f57ec2d43385 xfsrestore: session id: 8981d37f-4c20-4723-b3bb-75465b833ea5 xfsrestore: media id: 904ce393-451d-4dc5-ba3a-1ea9a4d28687 xfsrestore: searching media for directory dump xfsrestore: reading directories xfsrestore: 25530 directories and 356365 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files xfsrestore: WARNING: bad file header checksum xfsrestore: WARNING: unable to resync media file: some portion of dump will NOT be restored xfsrestore: restore complete: 4 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/sdb/dump/old/backup/dump/root.dump OK (success) xfsrestore: Restore Status: SUCCESS It restored only the directory tree and nothing else, also for the home directory I got this messages and nothing got restored. I had 6 backups on different drives but they were all made with the last dump 3.1.2 and so they are all unaccessible now. Basically I'm a little fucked if I will not be able to restore one of them I have lost all. Is it a know incompatibility with different restore versions or I'm lost? Thanks for the help, Fugazzi From sandeen@sandeen.net Mon Jan 7 13:52:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07Jq71t096967 for ; Mon, 7 Jan 2013 13:52:07 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1AF4A8F8050 for ; Mon, 7 Jan 2013 11:55:02 -0800 (PST) X-ASG-Debug-ID: 1357588501-04bdf04310553240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id tg3tH6AwEpKSzTms for ; Mon, 07 Jan 2013 11:55:01 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2A7C560003D6; Mon, 7 Jan 2013 13:55:01 -0600 (CST) Message-ID: <50EB2814.2090500@sandeen.net> Date: Mon, 07 Jan 2013 13:55:00 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Fugazzi99 CC: xfs@oss.sgi.com Subject: Re: XFS restore don't restore References: <50EB2073.1040609@gmail.com> X-ASG-Orig-Subj: Re: XFS restore don't restore In-Reply-To: <50EB2073.1040609@gmail.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357588501 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA081 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.10 BSF_SC0_SA081 Custom Rule SA081 On 1/7/13 1:22 PM, Fugazzi99 wrote: > Hi everyone, > I think I hit a problem of xfsrestore again. > I had some problems with my HD so I had to change it, after that I tried to restore from the last dump of yesterday. > I made it with the last xfsrestore/dump 3.1.2 but when I try to restore it with xfsrestore 3.1.0 from sysrescuecd I got for the root filesystem: > > xfsrestore: using file dump (drive_simple) strategy > xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control > xfsrestore: searching media for dump > xfsrestore: examining media file 0 > xfsrestore: dump description: > xfsrestore: hostname: orione > xfsrestore: mount point: / > xfsrestore: volume: /dev/sda2 > xfsrestore: session time: Thu Jan 6 13:01:53 2013 > xfsrestore: level: 0 > xfsrestore: session label: "root" > xfsrestore: media label: "root" > xfsrestore: file system id: 4af7e15f-17b4-4b4e-9c2a-f57ec2d43385 > xfsrestore: session id: 8981d37f-4c20-4723-b3bb-75465b833ea5 > xfsrestore: media id: 904ce393-451d-4dc5-ba3a-1ea9a4d28687 > xfsrestore: searching media for directory dump > xfsrestore: reading directories > xfsrestore: 25530 directories and 356365 entries processed > xfsrestore: directory post-processing > xfsrestore: restoring non-directory files > xfsrestore: WARNING: bad file header checksum > xfsrestore: WARNING: unable to resync media file: some portion of dump will NOT be restored ok, that doesn't look too good > xfsrestore: restore complete: 4 seconds elapsed > xfsrestore: Restore Summary: > xfsrestore: stream 0 /root/sdb/dump/old/backup/dump/root.dump OK (success) > xfsrestore: Restore Status: SUCCESS > > It restored only the directory tree and nothing else, also for the home directory I got this messages and nothing got restored. > I had 6 backups on different drives but they were all made with the last dump 3.1.2 and so they are all unaccessible now. > Basically I'm a little fucked if I will not be able to restore one of them I have lost all. > Is it a know incompatibility with different restore versions or I'm lost? Shouldn't be incompatible, but just in case, maybe you can try restoring w/ the same version as created the dump (to some spare directory, so you don't overwrite anything?) -Eric > Thanks for the help, > Fugazzi > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Mon Jan 7 14:36:14 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07KaDBC098063 for ; Mon, 7 Jan 2013 14:36:14 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73BB0AC003 for ; Mon, 7 Jan 2013 12:39:06 -0800 (PST) X-ASG-Debug-ID: 1357591144-04bdf04310555ea0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UPuxGnLpv1qM2GAr for ; Mon, 07 Jan 2013 12:39:05 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BE6EF63C58F6; Mon, 7 Jan 2013 14:39:04 -0600 (CST) Message-ID: <50EB3268.2080004@sandeen.net> Date: Mon, 07 Jan 2013 14:39:04 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Fugazzi99 CC: xfs@oss.sgi.com Subject: Re: XFS restore don't restore References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> X-ASG-Orig-Subj: Re: XFS restore don't restore In-Reply-To: <50EB2814.2090500@sandeen.net> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357591144 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/7/13 1:55 PM, Eric Sandeen wrote: > On 1/7/13 1:22 PM, Fugazzi99 wrote: >> Hi everyone, >> I think I hit a problem of xfsrestore again. >> I had some problems with my HD so I had to change it, after that I tried to restore from the last dump of yesterday. >> I made it with the last xfsrestore/dump 3.1.2 but when I try to restore it with xfsrestore 3.1.0 from sysrescuecd I got for the root filesystem: >> >> xfsrestore: using file dump (drive_simple) strategy >> xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control >> xfsrestore: searching media for dump >> xfsrestore: examining media file 0 >> xfsrestore: dump description: >> xfsrestore: hostname: orione >> xfsrestore: mount point: / >> xfsrestore: volume: /dev/sda2 >> xfsrestore: session time: Thu Jan 6 13:01:53 2013 >> xfsrestore: level: 0 >> xfsrestore: session label: "root" >> xfsrestore: media label: "root" >> xfsrestore: file system id: 4af7e15f-17b4-4b4e-9c2a-f57ec2d43385 >> xfsrestore: session id: 8981d37f-4c20-4723-b3bb-75465b833ea5 >> xfsrestore: media id: 904ce393-451d-4dc5-ba3a-1ea9a4d28687 >> xfsrestore: searching media for directory dump >> xfsrestore: reading directories >> xfsrestore: 25530 directories and 356365 entries processed >> xfsrestore: directory post-processing >> xfsrestore: restoring non-directory files >> xfsrestore: WARNING: bad file header checksum >> xfsrestore: WARNING: unable to resync media file: some portion of dump will NOT be restored > > ok, that doesn't look too good > >> xfsrestore: restore complete: 4 seconds elapsed >> xfsrestore: Restore Summary: >> xfsrestore: stream 0 /root/sdb/dump/old/backup/dump/root.dump OK (success) >> xfsrestore: Restore Status: SUCCESS >> >> It restored only the directory tree and nothing else, also for the home directory I got this messages and nothing got restored. >> I had 6 backups on different drives but they were all made with the last dump 3.1.2 and so they are all unaccessible now. >> Basically I'm a little fucked if I will not be able to restore one of them I have lost all. >> Is it a know incompatibility with different restore versions or I'm lost? > > Shouldn't be incompatible, but just in case, maybe you can try restoring w/ the same version as created the dump (to some spare directory, so you don't overwrite anything?) > FWIW, I just tested xfsdump 3.1.0 from the git tree: # ../xfsdump-3.1.0 -f dumpfile /mnt/test /root/git/xfsdump/.libs/lt-xfsdump: using file dump (drive_simple) strategy /root/git/xfsdump/.libs/lt-xfsdump: version 3.1.0 (dump format 3.0) - type ^C for status and control ... /root/git/xfsdump/.libs/lt-xfsdump: stream 0 /root/git/xfsdump/dumpfile OK (success) /root/git/xfsdump/.libs/lt-xfsdump: Dump Status: SUCCESS and xfsrestore 3.1.2 from the git tree as well: # ./xfsrestore-3.1.2 -f dumpfile /mnt/test/restore/ /root/git/xfsdump/.libs/lt-xfsrestore: using file dump (drive_simple) strategy /root/git/xfsdump/.libs/lt-xfsrestore: version 3.1.2 (dump format 3.0) - type ^C for status and control ... /root/git/xfsdump/.libs/lt-xfsrestore: restoring non-directory files /root/git/xfsdump/.libs/lt-xfsrestore: restore complete: 5 seconds elapsed /root/git/xfsdump/.libs/lt-xfsrestore: Restore Summary: /root/git/xfsdump/.libs/lt-xfsrestore: stream 0 /root/git/xfsdump/dumpfile OK (success) /root/git/xfsdump/.libs/lt-xfsrestore: Restore Status: SUCCESS so it all seems ok here ... I did make some changes in between those versions, and at one point forgot to translate some unused bits IIRC: commit b7af332bfdd208a563186f847dfce2eeb1e75669 Author: Eric Sandeen Date: Thu Oct 18 23:02:05 2012 -0500 xfsdump: fill in bs_forkoff Upstream, the structure containing bs_forkoff is actually zeroed prior to these functions, but when pulling the patch back to an older xfsdump, we got checksum errors due to an uninitialized bs_forkoff not matching in dump vs. restore. So even though forkoff won't be explicitly restored from a dump, do explicitly set it in these routines to keep checksums happy. This fixes 'bad header checksum' errors in xfsrestore, which were introduced by commit 1e309da7. so I don't know if maybe your distro version has those same issues, maybe it's related... -Eric From bpm@sgi.com Mon Jan 7 14:47:02 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07Kl2Qp098608 for ; Mon, 7 Jan 2013 14:47:02 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC5ABAC003; Mon, 7 Jan 2013 12:49:57 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 831594266DC; Mon, 7 Jan 2013 14:49:57 -0600 (CST) Date: Mon, 7 Jan 2013 14:49:57 -0600 From: Ben Myers To: Jeff Liu , Abhijit Pawar Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() Message-ID: <20130107204957.GT27055@sgi.com> References: <50E8F470.5020305@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50E8F470.5020305@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Jeff & Abhijit, On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: > This small patch convert xfs_parseargs() and suffix_strtoul() to > use kstrtoint() instead of simple_strtoul() which is deprecated. It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: remove obsolete simple_strto' which we saw Dec 7. You guys went after the same thing and came up with slightly differing results. If Abhijit would prefer to factor out the xfs changes I'd be happy to take either that, or Jeff's patch, but it would be better if they didn't conflict. Can y'all come to an agreement as to what the xfs changes should be? Thanks, Ben From stan@hardwarefreak.com Mon Jan 7 15:25:43 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07LPhSI100712 for ; Mon, 7 Jan 2013 15:25:43 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D06DAC003 for ; Mon, 7 Jan 2013 13:28:35 -0800 (PST) X-ASG-Debug-ID: 1357594111-04bdf0430f558930001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id ANb8gaRtoTvSJpTv for ; Mon, 07 Jan 2013 13:28:31 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E17D76C105; Mon, 7 Jan 2013 15:28:30 -0600 (CST) Message-ID: <50EB3DF7.3010100@hardwarefreak.com> Date: Mon, 07 Jan 2013 15:28:23 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: Fugazzi99 , xfs@oss.sgi.com Subject: Re: XFS restore don't restore References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> X-ASG-Orig-Subj: Re: XFS restore don't restore In-Reply-To: <50EB3268.2080004@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1357594111 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/7/2013 2:39 PM, Eric Sandeen wrote: > On 1/7/13 1:55 PM, Eric Sandeen wrote: >> On 1/7/13 1:22 PM, Fugazzi99 wrote: >>> Hi everyone, >>> I think I hit a problem of xfsrestore again. >>> I had some problems with my HD so I had to change it, after that I tried to restore from the last dump of yesterday. >>> I made it with the last xfsrestore/dump 3.1.2 but when I try to restore it with xfsrestore 3.1.0 from sysrescuecd I got for the root filesystem: ... > FWIW, I just tested xfsdump 3.1.0 from the git tree: ... > and xfsrestore 3.1.2 from the git tree as well: Eric, it looks like he went the opposite direction, dump 3.1.2 and restore 3.1.0. He's restoring with the older version. -- Stan From kuszmaul@gmail.com Mon Jan 7 15:30:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_40,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07LUj6d100942 for ; Mon, 7 Jan 2013 15:30:45 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AA8FAC003 for ; Mon, 7 Jan 2013 13:33:41 -0800 (PST) X-ASG-Debug-ID: 1357594419-04cb6c05a7ae1440001-NocioJ Received: from mail-ia0-f173.google.com (mail-ia0-f173.google.com [209.85.210.173]) by cuda.sgi.com with ESMTP id YG0MIT5B8IkuIz8b (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Jan 2013 13:33:40 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] Received: by mail-ia0-f173.google.com with SMTP id w21so16969980iac.32 for ; Mon, 07 Jan 2013 13:33:39 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=DlfLF/2Kxv2mxJlUJTZlu1SWktSCEXQNRXYK95u8Vao=; b=MW62FJdXgdcGLU6z+jxeq0sgpBkdbOD8bYzSEYLBQ8DsKrpo1aYI05jMkJCYOOX/p0 LCKyhj8WprRGEqG32MCptoD+doCTQem+XWxVuBGKLNLxxf8PLmd+2i0PK9X3D36papch CTnaoyRCzCvkKIFrg3pCWX4iD5SjjDc24lPPGViIOVB2b43PFf6J4rxxze0Z5aHbH1v7 oCmwFrDcqx6mleiNJ9mJkOnt5BxDWSCTWpKKloq/5RxIkYNZ3FAjlXZIcSEBrKrzlLoi 3BTbrisqjoYLVW4r5Ou1EFoA008tY8vjViMBV6HnzDs0nNVxiZBdNKLqcsmvG1NUUz+l I80g== Received: by 10.50.190.234 with SMTP id gt10mr7014531igc.73.1357594419649; Mon, 07 Jan 2013 13:33:39 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Mon, 7 Jan 2013 13:33:18 -0800 (PST) From: "Bradley C. Kuszmaul" Date: Mon, 7 Jan 2013 16:33:18 -0500 Message-ID: Subject: block alignment To: xfs@oss.sgi.com X-ASG-Orig-Subj: block alignment Content-Type: multipart/alternative; boundary=14dae93408dd21dbde04d2b995f3 X-Barracuda-Connect: mail-ia0-f173.google.com[209.85.210.173] X-Barracuda-Start-Time: 1357594420 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-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.2.119212 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 --14dae93408dd21dbde04d2b995f3 Content-Type: text/plain; charset=ISO-8859-1 What is the largest data block size that I'm likely to run into with xfs? I ask, since I'm doing hole punching, and I don't want to incur the I/O required to zero unaligned boundaries. So I want to keep the holes I punch sufficiently well aligned. -Bradley --14dae93408dd21dbde04d2b995f3 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable What is the largest data block size that I'm likely to run into with xf= s?

I ask, since I'm doing hole punching, and I don&#= 39;t want to incur the I/O required to zero unaligned boundaries. =A0So I w= ant to keep the holes I punch sufficiently well aligned.

-Bradley

--14dae93408dd21dbde04d2b995f3-- From bpm@sgi.com Mon Jan 7 15:34:44 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07LYiPq101177 for ; Mon, 7 Jan 2013 15:34:44 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF992304032; Mon, 7 Jan 2013 13:37:39 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A4F614266DC; Mon, 7 Jan 2013 15:37:39 -0600 (CST) Date: Mon, 7 Jan 2013 15:37:39 -0600 From: Ben Myers To: Stan Hoeppner , Eric Sandeen , Fugazzi99 Cc: xfs@oss.sgi.com Subject: Re: XFS restore don't restore Message-ID: <20130107213739.GU27055@sgi.com> References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> <50EB3DF7.3010100@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EB3DF7.3010100@hardwarefreak.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Mon, Jan 07, 2013 at 03:28:23PM -0600, Stan Hoeppner wrote: > On 1/7/2013 2:39 PM, Eric Sandeen wrote: > > On 1/7/13 1:55 PM, Eric Sandeen wrote: > >> On 1/7/13 1:22 PM, Fugazzi99 wrote: > >>> Hi everyone, > >>> I think I hit a problem of xfsrestore again. > >>> I had some problems with my HD so I had to change it, after that I tried to restore from the last dump of yesterday. > >>> I made it with the last xfsrestore/dump 3.1.2 but when I try to restore it with xfsrestore 3.1.0 from sysrescuecd I got for the root filesystem: > ... > > > FWIW, I just tested xfsdump 3.1.0 from the git tree: > ... > > and xfsrestore 3.1.2 from the git tree as well: > > Eric, it looks like he went the opposite direction, dump 3.1.2 and > restore 3.1.0. He's restoring with the older version. I just gave that a try. With xfsdump version 3.1.2 and xfsrestore version 3.1.0 it fails with a bad file header checksum: ~/xfsdump # xfsrestore -f dumpfile-with-3.1.2 /mnt/test/k xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control xfsrestore: searching media for dump xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: mount point: /mnt/test xfsrestore: volume: /dev/sda6 xfsrestore: session time: Mon Jan 7 15:26:55 2013 xfsrestore: level: 0 xfsrestore: file system id: 547ee7b8-f086-4e47-b88e-ef2d07866147 xfsrestore: session id: 6a7fd2ca-f5c2-4e3e-b45f-91ccb9e87789 xfsrestore: media id: 3f6dd30f-1542-4151-835c-d3120e716e51 xfsrestore: using online session inventory xfsrestore: searching media for directory dump xfsrestore: reading directories xfsrestore: WARNING: bad file header checksum xfsrestore: NOTE: restore interrupted: 0 seconds elapsed: may resume later using -R option xfsrestore: Restore Summary: xfsrestore: stream 0 /root/xfsdump/dumpfile-with-3.1.2 OK (success) xfsrestore: Restore Status: INCOMPLETE Hmm. I agree with Eric that it is likely related to 'xfsdump: fill in bs_forkoff', commit b7af332b. Maybe bumping the dump version was the right thing to do back then. 3.1.2 should work fine though. Regards, Ben From bpm@sgi.com Mon Jan 7 15:39:05 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_35, J_CHICKENPOX_43,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07Ld4sx101461 for ; Mon, 7 Jan 2013 15:39:04 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 59600AC00C; Mon, 7 Jan 2013 13:42:00 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 122014266DC; Mon, 7 Jan 2013 15:42:00 -0600 (CST) Date: Mon, 7 Jan 2013 15:42:00 -0600 From: Ben Myers To: "Bradley C. Kuszmaul" Cc: xfs@oss.sgi.com Subject: Re: block alignment Message-ID: <20130107214159.GV27055@sgi.com> References: 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.20 (2009-06-14) Hey Bradley, On Mon, Jan 07, 2013 at 04:33:18PM -0500, Bradley C. Kuszmaul wrote: > What is the largest data block size that I'm likely to run into with xfs? 4k blocks is what to expect unless you are using larger pages. >From mkfs.xfs manpage: " -b block_size_options This option specifies the fundamental block size of the filesys‐ tem. The valid block_size_options are: log=value or size=value and only one can be supplied. The block size is specified either as a base two logarithm value with log=, or in bytes with size=. The default value is 4096 bytes (4 KiB), the minimum is 512, and the maximum is 65536 (64 KiB). XFS on Linux currently only supports pagesize or smaller blocks." Regards, Ben From rwheeler@redhat.com Mon Jan 7 15:44:36 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07LiaQr102211 for ; Mon, 7 Jan 2013 15:44:36 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38F98304043 for ; Mon, 7 Jan 2013 13:47:32 -0800 (PST) X-ASG-Debug-ID: 1357595251-04cbb035a7aa04d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pwaBQa7j6NFfU4nf for ; Mon, 07 Jan 2013 13:47:31 -0800 (PST) X-Barracuda-Envelope-From: rwheeler@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 r07LlVH8026281 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 7 Jan 2013 16:47:31 -0500 Received: from [10.3.113.130] (ovpn-113-130.phx2.redhat.com [10.3.113.130]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r07LlUw5032651 for ; Mon, 7 Jan 2013 16:47:30 -0500 Message-ID: <50EB4271.1030607@redhat.com> Date: Mon, 07 Jan 2013 16:47:29 -0500 From: Ric Wheeler User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: block alignment References: X-ASG-Orig-Subj: Re: block alignment In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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: 1357595251 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 01/07/2013 04:33 PM, Bradley C. Kuszmaul wrote: > What is the largest data block size that I'm likely to run into with xfs? > > I ask, since I'm doing hole punching, and I don't want to incur the I/O > required to zero unaligned boundaries. So I want to keep the holes I punch > sufficiently well aligned. > > -Bradley > I think that you really need to worry about the block sizes below XFS - the storage block size specifically. Upstream (and modern distros like RHEL/SLES/etc) do work to export out alignment requirements and optimal IO sizes. You can find them in /sys/block/sda/. Martin Peterson wrote up a good overview of what we have in there: https://oss.oracle.com/~mkp/ Ric From david@fromorbit.com Mon Jan 7 16:19:53 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07MJrHu103926 for ; Mon, 7 Jan 2013 16:19:53 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D638304043 for ; Mon, 7 Jan 2013 14:22:46 -0800 (PST) X-ASG-Debug-ID: 1357597364-04cbb035a5aa2010001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id r8hWBGsakF4EURtA for ; Mon, 07 Jan 2013 14:22:44 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjoPAHVK61B5LIyU/2dsb2JhbABFhVCxboYPF3OCHgEBBAE6HCMFCwgDFAQJJQ8FJQMhE4gRBalKjQAUkQEDi1KHBoMyhl+Cb4Z8gwg Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Jan 2013 08:52:40 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsL5a-00086g-LD; Tue, 08 Jan 2013 09:22:38 +1100 Date: Tue, 8 Jan 2013 09:22:38 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push Message-ID: <20130107222238.GS3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push References: <20130105213420.307598929@sgi.com> <20130106000834.GM3120@dastard> <50EB0DE9.70808@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EB0DE9.70808@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357597364 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 07, 2013 at 12:03:21PM -0600, Mark Tinguely wrote: > On 01/05/13 18:08, Dave Chinner wrote: > >On Sat, Jan 05, 2013 at 02:34:15PM -0600, Mark Tinguely wrote: > >>The back-end of xlog_cil_push() allows multiple push sequences > >>to write to the xlog at the same time. > > > >It does this by design, and has since day zero. > > > >>This will cause problems > >>for recovery and also could cause the xlog_cil_committed() callback > >>to be called out of sequence. > > > >Log recovery is supposed to be able to handle it just fine in that > >recovery only replays up to the last checkpoint with a valid commit > >record. Checkpoints that don't have valid commit records - no matter > >the order they are written - will terminate recovery at the LSN of > >the lowest entire commit. > > > >>This was discovered with an EFI/EFD misorder. There are several (5) active > >>sequence pushes and 3 completed pushes. The callback for the sequence (2) > >>holding the EFD is being processed but the callback for the sequence (1) > >>holding the EFI has not yet been processed. > > > >What are the symptoms shown when this problem is hit? AFAICT, there > >is no problem here - this comment above __xfs_efi_release() explains > >that EFI/EFD misordering is expected: > > > >/* > > * Freeing the efi requires that we remove it from the AIL if it has already > > * been placed there. However, the EFI may not yet have been placed in the AIL > > * when called by xfs_efi_release() from EFD processing due to the ordering of > > * committed vs unpin operations in bulk insert operations. Hence the > > * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees > > * the EFI. > > */ > > > >This was introduced in this commit: > > > >$ gl -n 1 b199c8a4 > >commit b199c8a4ba11879df87daad496ceee41fdc6aa82 > >Author: Dave Chinner > >Date: Mon Dec 20 11:59:49 2010 +1100 > > > > xfs: Pull EFI/EFD handling out from under the AIL lock > > > > EFI/EFD interactions are protected from races by the AIL lock. They > > are the only type of log items that require the the AIL lock to > > serialise internal state, so they need to be separated from the AIL > > lock before we can do bulk insert operations on the AIL. > > > > To acheive this, convert the counter of the number of extents in the > > EFI to an atomic so it can be safely manipulated by EFD processing > > without locks. Also, convert the EFI state flag manipulations to use > > atomic bit operations so no locks are needed to record state > > changes. Finally, use the state bits to determine when it is safe to > > free the EFI and clean up the code to do this neatly. > > > > Signed-off-by: Dave Chinner > > Reviewed-by: Christoph Hellwig > > > >Hence if there is some problem being seen as a result of allowing this > >behaviour, I'd like to know what that problem actually is.... > > > > The filesystem is in forced shutdown with the following error: > xfs_trans_ail_delete_bulk: attempting to delete a log item that is > not in the AIL. That's something that should be in the commit message. But knowing this fact, it took me less than a minute to find the bug. That tells me you are seeing this: EFI EFD commit commit EFD .... ..... committed xfs_efi_release efi refcount drops to zero __xfs_efi_release xfs_trans_ail_delete shutdown! > The EFI is in the CIL sequence #1, the EFD is in sequence #2. > > Sequence #2 is running the cil callback but sequence #1 has not yet > run its callback. > > Normally, xfs_efi_item_committed() sets the XFS_EFI_COMMITTED bit. > Either the xfs_efi_item_unpin() or the xfs_efi_release() could > happen first and the comparison in __xfs_efi_release() compensates > for that. > > But if the xfs_efi_item_committed() is not called before the > xfs_efi_release() is called from the xfs_efd_item_committed(), then > we will get the "not in the AIL" shutdown. Doesn't that point directly to the root cause of the problem you tripped over? If xfs_efi_item_committed() has not been called, then XFS_EFI_COMMITTED is not set and the item is not in the AIL so we shouldn't ever be trying to remove it from the AIL. So why are we trying to remove the EFI from the AIL when XFS_EFI_COMMITTED is not actually set? That is, what is supposed to happen is this when they are out of order is this: EFI EFD commit commit EFD .... ..... committed xfs_efi_release efi refcount drops to zero __xfs_efi_release XFS_EFI_COMMITTED is not set, does nothing free EFD .... committed set XFS_EFI_COMMITTED insert into AIL unpin __xfs_efi_release clear XFS_EFI_COMMITTED remove from AIL free EFI. >From this, it now should be pretty obvious where the bug is..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Jan 7 16:23:39 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07MNdWR104124 for ; Mon, 7 Jan 2013 16:23:39 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA6AE304039 for ; Mon, 7 Jan 2013 14:26:35 -0800 (PST) X-ASG-Debug-ID: 1357597591-04cb6c05a8ae4100001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bTKwLC2ULPUBhh8o for ; Mon, 07 Jan 2013 14:26:31 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 30B1263C58F6; Mon, 7 Jan 2013 16:26:31 -0600 (CST) Message-ID: <50EB4B96.7050900@sandeen.net> Date: Mon, 07 Jan 2013 16:26:30 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: Stan Hoeppner , Fugazzi99 , xfs@oss.sgi.com Subject: Re: XFS restore don't restore References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> <50EB3DF7.3010100@hardwarefreak.com> <20130107213739.GU27055@sgi.com> X-ASG-Orig-Subj: Re: XFS restore don't restore In-Reply-To: <20130107213739.GU27055@sgi.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357597591 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/7/13 3:37 PM, Ben Myers wrote: > Hey, > > On Mon, Jan 07, 2013 at 03:28:23PM -0600, Stan Hoeppner wrote: >> On 1/7/2013 2:39 PM, Eric Sandeen wrote: ... >>> FWIW, I just tested xfsdump 3.1.0 from the git tree: >> ... >>> and xfsrestore 3.1.2 from the git tree as well: >> >> Eric, it looks like he went the opposite direction, dump 3.1.2 and >> restore 3.1.0. He's restoring with the older version. > > I just gave that a try. With xfsdump version 3.1.2 and xfsrestore version > 3.1.0 it fails with a bad file header checksum: ... > Hmm. I agree with Eric that it is likely related to 'xfsdump: fill in > bs_forkoff', commit b7af332b. Maybe bumping the dump version was the right > thing to do back then. 3.1.2 should work fine though. Argh. Grr. Crud. > Regards, > Ben > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Mon Jan 7 16:28:01 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07MS1fU105115 for ; Mon, 7 Jan 2013 16:28:01 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E8DD304039 for ; Mon, 7 Jan 2013 14:30:57 -0800 (PST) X-ASG-Debug-ID: 1357597855-04cbb035a7aa2810001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ss9yChYXcOwypGbK for ; Mon, 07 Jan 2013 14:30:55 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjoPAMZL61B5LIyU/2dsb2JhbABFhVCxboYPF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWqUyNARSMX4QiA5YKkEqDCIFV Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Jan 2013 09:00:54 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsLDa-00087v-Ca; Tue, 08 Jan 2013 09:30:54 +1100 Date: Tue, 8 Jan 2013 09:30:54 +1100 From: Dave Chinner To: Linos Cc: xfs@oss.sgi.com Subject: Re: xfs bug? Message-ID: <20130107223054.GT3120@dastard> X-ASG-Orig-Subj: Re: xfs bug? References: <50EB020D.9050006@linos.es> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <50EB020D.9050006@linos.es> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357597855 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 07, 2013 at 06:12:45PM +0100, Linos wrote: > I am hitting what seems to be a bug in one of my Linux storage layers, th= is is > my system: Something is corrupting the workqueue infrastructure. It's not an XFS problem, XFs just uses workqueues and it's hung waiting for workqueues to be scehduled to run, which is not happening due to the initial ooops. > ------------[ cut here ]------------ > WARNING: at kernel/workqueue.c:1550 worker_enter_idle+0xd5/0x130() > Hardware name: System Product Name > Modules linked in: tun pci_stub vboxpci(O) vboxnetflt(O) vboxnetadp(O) v= boxdrv(O) ipt_MASQUERADE iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_na= t_ipv4 ip_tables x_tables xfs snd_hda_codec_hdmi raid456 async_raid6_recov = async_memcpy async_pq iTCO_wdt iTCO_vendor_support snd_hda_codec_realtek ra= id6_pq async_xor kvm_intel kvm crc32c_intel ghash_clmulni_intel aesni_intel= aes_x86_64 ablk_helper cryptd xor xts async_tx lrw gf128mul uvcvideo video= buf2_vmalloc videobuf2_memops videobuf2_core snd_usb_audio videodev snd_usb= midi_lib snd_rawmidi eeepc_wmi asus_wmi snd_seq_device sparse_keymap pci_ho= tplug md_mod media mxm_wmi evdev joydev btusb bluetooth nvidia(PO) rfkill p= smouse microcode serio_raw pcspkr lpc_ich snd_hda_intel snd_hda_codec snd_h= wdep snd_pcm snd_page_alloc snd_timer snd i2c_core e1000e soundcore video t= hermal fan msr wmi mei acpi_cpufreq mperf button processor coretemp pppoe p= ppox ppp_generic slhc nf_nat_snmp_basic nf_conntrack_snmp nf_conntrack_broa= dcast nf_nat_proto_sctp crc32c libcrc32c nf_nat_proto_dccp nf_nat_proto_udp= lite nf_nat_amanda ts_kmp nf_conntrack_amanda nf_nat_irc nf_conntrack_irc n= f_nat_sip nf_conntrack_sip nf_nat_tftp nf_conntrack_tftp nf_nat_h323 nf_con= ntrack_h323 nf_nat_pptp nf_nat_proto_gre nf_conntrack_pptp nf_conntrack_pro= to_gre nf_nat_ftp nf_conntrack_ftp nf_nat nf_conntrack fuse loop ext4 crc16= jbd2 mbcache usb_storage hid_generic usbhid hid sr_mod cdrom sd_mod ehci_h= cd ahci libahci libata xhci_hcd scsi_mod usbcore usb_common > Pid: 27771, comm: kworker/0:2 Tainted: P O 3.7.1-426-bfs #1 > Call Trace: > [] warn_slowpath_common+0x7f/0xc0 > [] ? cwq_activate_delayed_work+0xc0/0xc0 > [] warn_slowpath_null+0x1a/0x20 > [] worker_enter_idle+0xd5/0x130 > [] worker_thread+0x1f1/0x400 > [] ? preempt_schedule+0x49/0x70 > [] ? rescuer_thread+0x240/0x240 > [] kthread+0xc0/0xd0 > [] ? perf_trace_xen_mmu_set_pte_at+0xb0/0x100 > [] ? kthread_freezable_should_stop+0x70/0x70 > [] ret_from_fork+0x7c/0xb0 > [] ? kthread_freezable_should_stop+0x70/0x70 > ---[ end trace b0d33c4a02723ea3 ]--- i.e. this one. But, quite frankly - you've got a tainted kernel: vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) nvidia(PO) and you are using an out of tree scheduler patch (bfs). Hence I don't think anyone is going to waste time trying to track this down as it stands. If you can reproduce it on an untainted, unpatched kernel then you'll have somethign we might be able to debug.... Cheers, Dave. --=20 Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 7 16:39:02 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07Md13i108757 for ; Mon, 7 Jan 2013 16:39:01 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A397A8F8039 for ; Mon, 7 Jan 2013 14:41:57 -0800 (PST) X-ASG-Debug-ID: 1357598515-04bdf07fae4cec80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Z2Y81SaDcuSrqBbz for ; Mon, 07 Jan 2013 14:41:56 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAH1O61B5LIyU/2dsb2JhbABFhVCxboYPF3OCHgEBBAEnExwjBQsIAxUDCSUPBSUDIROIEQWpVI0GFIw+hEMDlgqJToZ8gwiBViQ Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Jan 2013 09:11:55 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsLOE-00089U-J5; Tue, 08 Jan 2013 09:41:54 +1100 Date: Tue, 8 Jan 2013 09:41:54 +1100 From: Dave Chinner To: Mark Tinguely Cc: Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Message-ID: <20130107224154.GU3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end References: <1355870625-26638-1-git-send-email-david@fromorbit.com> <20130103212222.GJ27055@sgi.com> <20130103220244.GH3120@dastard> <50EAE554.5020504@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EAE554.5020504@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357598515 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 07, 2013 at 09:10:12AM -0600, Mark Tinguely wrote: > On 01/03/13 16:02, Dave Chinner wrote: > >On Thu, Jan 03, 2013 at 03:22:22PM -0600, Ben Myers wrote: > >>Dave, > >> > >>On Wed, Dec 19, 2012 at 09:43:45AM +1100, Dave Chinner wrote: > >>>From: Dave Chinner > >>> > >>>When _xfs_buf_find is passed an out of range address, it will fail > >>>to find a relevant struct xfs_perag and oops with a null > >>>dereference. This can happen when trying to walk a filesystem with a > >>>metadata inode that has a partially corrupted extent map (i.e. the > >>>block number returned is corrupt, but is otherwise intact) and we > >>>try to read from the corrupted block address. > >>> > >>>In this case, just fail the lookup. If it is readahead being issued, > >>>it will simply not be done, but if it is real read that fails we > >>>will get an error being reported. Ideally this case should result > >>>in an EFSCORRUPTED error being reported, but we cannot return an > >>>error through xfs_buf_read() or xfs_buf_get() so this lookup failure > >>>may result in ENOMEM or EIO errors being reported instead. > >>> > >>>Signed-off-by: Dave Chinner > >>>--- > >>> fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ > >>> 1 file changed, 18 insertions(+) > >>> > >>>diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > >>>index a80195b..16249d9 100644 > >>>--- a/fs/xfs/xfs_buf.c > >>>+++ b/fs/xfs/xfs_buf.c > >>>@@ -487,6 +487,7 @@ _xfs_buf_find( > >>> struct rb_node *parent; > >>> xfs_buf_t *bp; > >>> xfs_daddr_t blkno = map[0].bm_bn; > >>>+ xfs_daddr_t eofs; > >>> int numblks = 0; > >>> int i; > >>> > >>>@@ -498,6 +499,23 @@ _xfs_buf_find( > >>> ASSERT(!(numbytes< (1<< btp->bt_sshift))); > >>> ASSERT(!(BBTOB(blkno)& (xfs_off_t)btp->bt_smask)); > >>> > >>>+ /* > >>>+ * Corrupted block numbers can get through to here, unfortunately, so we > >>>+ * have to check that the buffer falls within the filesystem bounds. > >>>+ */ > >>>+ eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > >>>+ if (blkno>= eofs || blkno + numblks> eofs) { > >> ^^^^^^^^^^^^^^^^^^^^^^ > >> > >>That looks suspect to me. I think you need to go over each buffer > >>individually. > > > >I'm not trying to validate every single part of a buffer here - > >there is no need to do that as the block numbers are validated > >against device overruns during IO. i.e. we'll get an EIO and a log > >message telling us an attempt to access beyond the end of the device > >occurring during IO. > > > >I.e. we aren't doing validity checks on whether a buffer has a sane > >block number or not (that's up to the caller), what we are > >avoiding is attempting to look up a buffer that is outside of the > >range of the cache indexing. i.e. it's validating the cache index we > >are about to use, not passing judgement on whether the caller has > >asked for a valid set of blocks or not. > > I did not like the second part of the if statement because first > block number in a "discontiguous" buffer does not have to be the > lowest block number. Again, _xfs_buf_find() does not care about secondary blocks in discontiguous buffers. It cares about the parameters of the cached items - which are described by the {blkno, numblks} tuple - and doesn't care about sub-block ranges in discontiguous buffers at all. > The first half of the if statement alone would prevent the oops. Right, that fixes the initial cache index lookup problem - I wanted to validate the entire tuple. But you're right in that discontigous buffers could have blkno + numblks beyond EOFS so validating cache item ranges like this is wrong. I'll drop that check. Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@linos.es Mon Jan 7 16:40:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07MeBwk108972 for ; Mon, 7 Jan 2013 16:40:11 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD5C3AC004 for ; Mon, 7 Jan 2013 14:43:03 -0800 (PST) X-ASG-Debug-ID: 1357598581-04cbb035a5aa3370001-NocioJ Received: from ns210619.ovh.net (dedip1.linos.es [178.32.77.184]) by cuda.sgi.com with ESMTP id RUVGqLh7Dt5A0C3C for ; Mon, 07 Jan 2013 14:43:01 -0800 (PST) X-Barracuda-Envelope-From: info@linos.es X-Barracuda-Apparent-Source-IP: 178.32.77.184 Received: from localhost (localhost.localdomain [127.0.0.1]) by ns210619.ovh.net (Postfix) with ESMTP id 9E9E13D1E6DE; Mon, 7 Jan 2013 23:43:11 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at ns210619.ovh.net Received: from ns210619.ovh.net ([178.32.77.184]) by localhost (ns210619.ovh.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ByAVIseK3poi; Mon, 7 Jan 2013 23:43:09 +0100 (CET) Received: from [192.168.254.4] (unknown [95.22.23.255]) by ns210619.ovh.net (Postfix) with ESMTPSA id 630133D1E002; Mon, 7 Jan 2013 23:43:07 +0100 (CET) Message-ID: <50EB4F6E.9010700@linos.es> Date: Mon, 07 Jan 2013 23:42:54 +0100 From: Linos User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs bug? References: <50EB020D.9050006@linos.es> <20130107223054.GT3120@dastard> X-ASG-Orig-Subj: Re: xfs bug? In-Reply-To: <20130107223054.GT3120@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: dedip1.linos.es[178.32.77.184] X-Barracuda-Start-Time: 1357598581 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 07/01/13 23:30, Dave Chinner wrote: > On Mon, Jan 07, 2013 at 06:12:45PM +0100, Linos wrote: >> I am hitting what seems to be a bug in one of my Linux storage layers, this is >> my system: > > Something is corrupting the workqueue infrastructure. It's not an > XFS problem, XFs just uses workqueues and it's hung waiting for > workqueues to be scehduled to run, which is not happening due to the > initial ooops. > >> ------------[ cut here ]------------ >> WARNING: at kernel/workqueue.c:1550 worker_enter_idle+0xd5/0x130() >> Hardware name: System Product Name >> Modules linked in: tun pci_stub vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) ipt_MASQUERADE iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 ip_tables x_tables xfs snd_hda_codec_hdmi raid456 async_raid6_recov async_memcpy async_pq iTCO_wdt iTCO_vendor_support snd_hda_codec_realtek raid6_pq async_xor kvm_intel kvm crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 ablk_helper cryptd xor xts async_tx lrw gf128mul uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_core snd_usb_audio videodev snd_usbmidi_lib snd_rawmidi eeepc_wmi asus_wmi snd_seq_device sparse_keymap pci_hotplug md_mod media mxm_wmi evdev joydev btusb bluetooth nvidia(PO) rfkill psmouse microcode serio_raw pcspkr lpc_ich snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_page_alloc snd_timer snd i2c_core e1000e soundcore video thermal fan msr wmi mei acpi_cpufreq mperf button processor coretemp pppoe pppox ppp_generic slhc nf_nat_snmp_basic nf_conntrack_snmp nf_conntrack_broadcast nf_nat_p ! > roto_sctp crc32c libcrc32c nf_nat_proto_dccp nf_nat_proto_udplite nf_nat_amanda ts_kmp nf_conntrack_amanda nf_nat_irc nf_conntrack_irc nf_nat_sip nf_conntrack_sip nf_nat_tftp nf_conntrack_tftp nf_nat_h323 nf_conntrack_h323 nf_nat_pptp nf_nat_proto_gre nf_conntrack_pptp nf_conntrack_proto_gre nf_nat_ftp nf_conntrack_ftp nf_nat nf_conntrack fuse loop ext4 crc16 jbd2 mbcache usb_storage hid_generic usbhid hid sr_mod cdrom sd_mod ehci_hcd ahci libahci libata xhci_hcd scsi_mod usbcore usb_common >> Pid: 27771, comm: kworker/0:2 Tainted: P O 3.7.1-426-bfs #1 >> Call Trace: >> [] warn_slowpath_common+0x7f/0xc0 >> [] ? cwq_activate_delayed_work+0xc0/0xc0 >> [] warn_slowpath_null+0x1a/0x20 >> [] worker_enter_idle+0xd5/0x130 >> [] worker_thread+0x1f1/0x400 >> [] ? preempt_schedule+0x49/0x70 >> [] ? rescuer_thread+0x240/0x240 >> [] kthread+0xc0/0xd0 >> [] ? perf_trace_xen_mmu_set_pte_at+0xb0/0x100 >> [] ? kthread_freezable_should_stop+0x70/0x70 >> [] ret_from_fork+0x7c/0xb0 >> [] ? kthread_freezable_should_stop+0x70/0x70 >> ---[ end trace b0d33c4a02723ea3 ]--- > > i.e. this one. > > But, quite frankly - you've got a tainted kernel: > > vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) nvidia(PO) > > and you are using an out of tree scheduler patch (bfs). Hence I > don't think anyone is going to waste time trying to track this down > as it stands. If you can reproduce it on an untainted, unpatched > kernel then you'll have somethign we might be able to debug.... > > Cheers, > > Dave. > I can try with an unpatched kernel without VirtualBox modules but i need nvidia propietary module in this computer to use my multi-monitor setup, would suffice that? Regards, Miguel Angel. From david@fromorbit.com Mon Jan 7 16:52:51 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07MqpYB110085 for ; Mon, 7 Jan 2013 16:52:51 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E997E8F8052 for ; Mon, 7 Jan 2013 14:55:46 -0800 (PST) X-ASG-Debug-ID: 1357599345-04cbb035a5aa3f60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uxnY7F9zEDeSkfZr for ; Mon, 07 Jan 2013 14:55:45 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjoPABdS61B5LIyU/2dsb2JhbABFhVCxboYPF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWqWSNBxSMY4QeA5JYgzKJToZ8gwg Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Jan 2013 09:25:25 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsLbJ-0008BH-15; Tue, 08 Jan 2013 09:55:25 +1100 Date: Tue, 8 Jan 2013 09:55:24 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push Message-ID: <20130107225524.GV3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: serialize iclog write of xlog_cil_push References: <20130105213420.307598929@sgi.com> <20130106000834.GM3120@dastard> <50EB0DE9.70808@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EB0DE9.70808@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357599345 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119218 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 07, 2013 at 12:03:21PM -0600, Mark Tinguely wrote: > On 01/05/13 18:08, Dave Chinner wrote: > >On Sat, Jan 05, 2013 at 02:34:15PM -0600, Mark Tinguely wrote: > >>The back-end of xlog_cil_push() allows multiple push sequences > >>to write to the xlog at the same time. > > > >It does this by design, and has since day zero. > > > >>This will cause problems > >>for recovery and also could cause the xlog_cil_committed() callback > >>to be called out of sequence. > > > >Log recovery is supposed to be able to handle it just fine in that > >recovery only replays up to the last checkpoint with a valid commit > >record. Checkpoints that don't have valid commit records - no matter > >the order they are written - will terminate recovery at the LSN of > >the lowest entire commit. ..... > > >>The xlog_cil_committed() callback misorder happens because the buffer that > >>contains the sequence ticket is filled by another sequence push and the > >>callback for the buffer write happens before the callback is placed onto > >>that buffer. > > > >I'm not sure I follow you here. xfs_log_done() takes a reference to > >the iclog that the commit record is added to, and I/O cannot be > >issued on that iclog until the reference count drops to zero. Hence > >the sequence of writing the commit record, obtaining the commit_lsn, > >adding the callbacks to the iclog and releasing the iclog are atomic > >from an I/O perspective, and IO is only issued when the reference > >count falls to zero. > > > >And given that xlog_write() uses the same reference counting to > >provide the same guarantees, I cannot see how concurrent in-memory > >writes to the same iclog could cause IO completion callbacks to be > >issued out of order. > > I will look again at the ic_refcnt but it the callback from cil push > sequence #2 has jumped in front of cil push #1. Look at the order of the callbacks on the iclog. iclog completion is done in iclog ring order (see xlog_iodone/xlog_state_done_syncing/ xlog_state_do_callback), and we shouldn't be getting commit records out of order into the iclogs as we serialise writing them. Hence we should have with both in-order writing and in-order completion, and AFAICT, the callbacks on an iclog should be run oldest to newest so should also be in order. If you can track down where the callbacks are getting out of order, or find some way to reproduce such behaviour, I'm all ears because it should not be happening. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 7 17:31:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r07NVBd4117361 for ; Mon, 7 Jan 2013 17:31:11 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4856B8F804C for ; Mon, 7 Jan 2013 15:34:06 -0800 (PST) X-ASG-Debug-ID: 1357601644-04cb6c05a7ae7ac0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id zuOkCy4gVTMw4Rd9 for ; Mon, 07 Jan 2013 15:34:05 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjoPAKpa61B5LIyU/2dsb2JhbABFhVCxboYQF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gWqW+NDxSRAQOWCpBKgwg Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Jan 2013 10:04:04 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsMCh-0008FO-5y; Tue, 08 Jan 2013 10:34:03 +1100 Date: Tue, 8 Jan 2013 10:34:03 +1100 From: Dave Chinner To: Linos Cc: xfs@oss.sgi.com Subject: Re: xfs bug? Message-ID: <20130107233403.GW3120@dastard> X-ASG-Orig-Subj: Re: xfs bug? References: <50EB020D.9050006@linos.es> <20130107223054.GT3120@dastard> <50EB4F6E.9010700@linos.es> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EB4F6E.9010700@linos.es> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357601644 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119220 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 07, 2013 at 11:42:54PM +0100, Linos wrote: > On 07/01/13 23:30, Dave Chinner wrote: > > But, quite frankly - you've got a tainted kernel: > > > > vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) nvidia(PO) > > > > and you are using an out of tree scheduler patch (bfs). Hence I > > don't think anyone is going to waste time trying to track this down > > as it stands. If you can reproduce it on an untainted, unpatched > > kernel then you'll have somethign we might be able to debug.... > > I can try with an unpatched kernel without VirtualBox modules but i need nvidia > propietary module in this computer to use my multi-monitor setup, would suffice > that? That would at least rule out 2 of the 3 potential problems. Note that if you do get another workqueue oops like this one you probably should report it to lkml rather than here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@linos.es Tue Jan 8 00:41:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r086fJtw142968 for ; Tue, 8 Jan 2013 00:41:19 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69AA8304032 for ; Mon, 7 Jan 2013 22:44:12 -0800 (PST) X-ASG-Debug-ID: 1357627450-04bdf0430f5732a0001-NocioJ Received: from ns210619.ovh.net (dedip1.linos.es [178.32.77.184]) by cuda.sgi.com with ESMTP id dSFCSFarHgO68Dpw for ; Mon, 07 Jan 2013 22:44:10 -0800 (PST) X-Barracuda-Envelope-From: info@linos.es X-Barracuda-Apparent-Source-IP: 178.32.77.184 Received: from localhost (localhost.localdomain [127.0.0.1]) by ns210619.ovh.net (Postfix) with ESMTP id 4FE213D1E6E7; Tue, 8 Jan 2013 07:44:21 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at ns210619.ovh.net Received: from ns210619.ovh.net ([178.32.77.184]) by localhost (ns210619.ovh.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4E63JWvdzHCD; Tue, 8 Jan 2013 07:44:19 +0100 (CET) Received: from [192.168.254.4] (unknown [95.22.23.255]) by ns210619.ovh.net (Postfix) with ESMTPSA id 667FB3D1E002; Tue, 8 Jan 2013 07:44:19 +0100 (CET) Message-ID: <50EBC035.9040801@linos.es> Date: Tue, 08 Jan 2013 07:44:05 +0100 From: Linos User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs bug? References: <50EB020D.9050006@linos.es> <20130107223054.GT3120@dastard> <50EB4F6E.9010700@linos.es> <20130107233403.GW3120@dastard> X-ASG-Orig-Subj: Re: xfs bug? In-Reply-To: <20130107233403.GW3120@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: dedip1.linos.es[178.32.77.184] X-Barracuda-Start-Time: 1357627450 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/01/13 00:34, Dave Chinner wrote: > On Mon, Jan 07, 2013 at 11:42:54PM +0100, Linos wrote: >> On 07/01/13 23:30, Dave Chinner wrote: >>> But, quite frankly - you've got a tainted kernel: >>> >>> vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) nvidia(PO) >>> >>> and you are using an out of tree scheduler patch (bfs). Hence I >>> don't think anyone is going to waste time trying to track this down >>> as it stands. If you can reproduce it on an untainted, unpatched >>> kernel then you'll have somethign we might be able to debug.... >> >> I can try with an unpatched kernel without VirtualBox modules but i need nvidia >> propietary module in this computer to use my multi-monitor setup, would suffice >> that? > > That would at least rule out 2 of the 3 potential problems. Note > that if you do get another workqueue oops like this one you probably > should report it to lkml rather than here.... > > Cheers, > > Dave. > ok, i will try and report the problem to lkml if needed, thanks! Regards, Miguel Angel. From jeff.liu@oracle.com Tue Jan 8 01:18:34 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r087IY33144908 for ; Tue, 8 Jan 2013 01:18:34 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FA448F8039 for ; Mon, 7 Jan 2013 23:21:27 -0800 (PST) X-ASG-Debug-ID: 1357629685-04cbb035a5aba970001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id FhG65ChaYDlxc2q7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 07 Jan 2013 23:21:25 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r087LNha022896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Jan 2013 07:21:24 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r087LN95023596 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 8 Jan 2013 07:21:23 GMT Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r087LMJo032190; Tue, 8 Jan 2013 01:21:22 -0600 Received: from [192.168.1.103] (/114.248.203.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 Jan 2013 23:21:22 -0800 Message-ID: <50EBC8E5.9080200@oracle.com> Date: Tue, 08 Jan 2013 15:21:09 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Ben Myers CC: Abhijit Pawar , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop using simple_strtoul() In-Reply-To: <20130107204957.GT27055@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1357629685 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-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.2.119250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben and Abhijit, On 01/08/2013 04:49 AM, Ben Myers wrote: > Hey Jeff & Abhijit, > > On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: >> This small patch convert xfs_parseargs() and suffix_strtoul() to >> use kstrtoint() instead of simple_strtoul() which is deprecated. > > It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: > remove obsolete simple_strto' which we saw Dec 7. You guys went after the > same thing and came up with slightly differing results. If Abhijit would > prefer to factor out the xfs changes I'd be happy to take either that, or > Jeff's patch, but it would be better if they didn't conflict. Can y'all come > to an agreement as to what the xfs changes should be? Sorry, I missed that patch from Abhijit. Looks the previous patch did not replaced the simple_strtoul() with kstrtoint() in suffix_strtoul(). Abhijit, would you like to fix it as well? Thanks, -Jeff From xfs-owner@oss.sgi.com Tue Jan 8 02:39:13 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_80,LOTS_OF_MONEY autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r088dDJX149658 for ; Tue, 8 Jan 2013 02:39:13 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 43957AC004 for ; Tue, 8 Jan 2013 00:42:09 -0800 (PST) X-ASG-Debug-ID: 1357634520-04bdf07fae4ea080001-w1Z2WR Received: from mailscan.culinary.edu (mailscan.culinary.edu [209.203.176.37]) by cuda.sgi.com with ESMTP id YCCnMe7SK1R7LUWW; Tue, 08 Jan 2013 00:42:01 -0800 (PST) X-Barracuda-Envelope-From: SH683449@mycia.net X-Barracuda-Apparent-Source-IP: 209.203.176.37 X-AuditID: c0a8140a-b7f0a6d000001084-61-50ebdbd9397a Received: from mycia.net (mycia.net [209.203.176.60]) by mailscan.culinary.edu (mailscan1.culinary.edu) with SMTP id 87.5E.04228.9DBDBE05; Tue, 8 Jan 2013 03:42:01 -0500 (EST) To: undisclosed-recipients:; Received: from SH683449 [182.62.6.194] by mycia.net with NetMail ModWeb Module; Tue, 08 Jan 2013 03:43:09 -0500 Subject: Reply to claim Funds from UN !!! Reply-To: dpt0013@aim.com X-ASG-Orig-Subj: Reply to claim Funds from UN !!! From: "Sarah Horne" Date: Tue, 08 Jan 2013 03:43:09 -0500 X-Mailer: NetMail ModWeb Module X-Sender: SH683449 MIME-Version: 1.0 Message-ID: <1357634589.966fc64SH683449@mycia.net> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsVy8fQGG92bt18HGDRfNrG4+moaq8W3Nb1s Frt3HGd1YPZYfWErYwBjFJdNSmpOZllqkb5dAlfGjhnPWQouMFXc+9/B3sDYzdTFyMkhIWAi sXDNBjYIW0ziwr31QDYXh5DAJkaJB4s6GEESIgIyEnNnP2btYuQAShRKPHqiARIWFtCUuHRy PguILSQgKXH7xEuwcjYBDYnmy1fAZrIIqEqcPTCLFWK+vMSlZ/3MELaQxJENzWA2r4CgxMmZ T1hAxvMKGEncnpkIEmYGGt+6/Tc7hK0tsWzha+YJjPyzkHTMQlI2C0nZAkbmVYyiuYmZOcXJ iXl6yaU5mXmJRZV6qSmlmxiBoXdghQjXDsbFu/UPMQpwMCrx8F6MeR0gxJpYVlyZe4hRgoNZ SYTXfh9QiDclsbIqtSg/vqg0J7X4EKM0B4uSOK/fhVcBQgLpiSWp2ampBalFMFkmDk6pBkbr wt31QU1vVJUv94goS2RXVSoKG83f9qJDIG4Gg9gr3tAC1/O1DU82K/2fUHAsSoDPa/ktbn/m dgMeX9tHCx+9eDXpZ65RWujKoibudxsENv977fTscLFZrqBZ7iHTGr9/QsGXV2VoGu17vmJp f//ctC9LJnz7J1Ct4+m7XFVp3qHZVl+/NymxFGckGmoxFxUnAgAjE7c8OQIAAA== X-Barracuda-Connect: mailscan.culinary.edu[209.203.176.37] X-Barracuda-Start-Time: 1357634520 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, BSF_SC0_SA620b, BSF_SC7_SA298e, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119254 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.50 BSF_SC0_SA620a Custom Rule SA620a 0.50 BSF_SC0_SA620b Custom Rule SA620b 0.20 BSF_SC7_SA298e Custom Rule SA298e kindly send your information along with your pin number to this email : dpt= 0013@aim.com YOU HAVE WON ($650,500.00USD) FROM UN HERE IS YOUR PIN NUMBER (UNO-154/4456/011) Contact person: Dr.Benjamin Jones. Telephone No: : 006016 648 2715 E-mail : dpt0013@aim.com Regards, Mrs. Susan Philip. UNITED NATIONS GENERAL From mjohnthomas286@gmail.com Tue Jan 8 07:15:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08DFJvZ171890 for ; Tue, 8 Jan 2013 07:15:19 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B52448F804C for ; Tue, 8 Jan 2013 05:18:12 -0800 (PST) X-ASG-Debug-ID: 1357651090-04bdf04310587420001-NocioJ Received: from mail-ob0-f194.google.com (mail-ob0-f194.google.com [209.85.214.194]) by cuda.sgi.com with ESMTP id 5rM7RxZJR4mVTTOL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Jan 2013 05:18:11 -0800 (PST) X-Barracuda-Envelope-From: mjohnthomas286@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 16so55173obc.9 for ; Tue, 08 Jan 2013 05:18:10 -0800 (PST) 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=YtDDFBX85zMgm5v+xzVCeTdLREjXx/aGJFVxV/3xwpc=; b=ZAfR3r0UN+sSXZlOfxPY54qODHrlQiSTAW4Zu6LVleTS0iuWnzEM5fF6WhceNJdcfl fNl9e8fck/34Vx0UK4bkxUkra3I2FlUxMfNJtzxfeUjHvOgWQgcQqJNsgP22GfnNJbKj hk1QCw+kNCfxLOwlRCL/Zzl72+LLuKgA+78/lXBj3Schnx9NgMi2EulTqpa473t0aDNo XDev2EBGEEifNhPDNwrsUZiWxFJhp+a/+7Zs6c0fbPMcgZPU6Qqc0xhD+uvSwqh2o8z/ /3KjWhJS6iyLT1A5cZFlsZ+CJYZbjupVB2PijenbT4Jg2Ml1n6zg6tYe+Rh+3+FlLwTC 4ZEQ== MIME-Version: 1.0 Received: by 10.60.29.70 with SMTP id i6mr36813442oeh.38.1357651090233; Tue, 08 Jan 2013 05:18:10 -0800 (PST) Received: by 10.76.75.200 with HTTP; Tue, 8 Jan 2013 05:18:10 -0800 (PST) Date: Tue, 8 Jan 2013 18:48:10 +0530 Message-ID: Subject: ShoesForCrews.com all sales best offers From: M john Thomas X-ASG-Orig-Subj: ShoesForCrews.com all sales best offers To: insideblackberry@blackberry.com, qnxcar@qnx.com, 47808661@N07.jpg, support@SparkPeople.com, blackberryfeedback@myfitnesspal.com, support@pacemobi.com, kristen@nifplay.org, steve@caspan.com, BuiltforBlackBerry@rim.com, sales@blackberry.com, certification@blackberry.com, blackberrytraining@rim.com, 46318435@N02.jpg, ushigiale@visafone.com.ng, rimwa@africapractice.com, legalinfo@rim.com, ipcomplaints@rim.com, brand@rim.com, legal@rim.com, MichellePhanBusiness@gmail.com, kandeejohnson@hotmail.com, assistant@RayWJ.com, Affiliates@scotthermanfitness.com, thecreatures@thecreaturehub.com, gdp@gmail.com, worldscities@gmail.com, Mr_LloydMarcus@hotmail.com, Kevin@Vsauce.com, mumuh958@yahoo.co.id, partner-support@youtube.com, adsense-noreply@google.com, broadcast@adobe.com, dpsales@adobe.com, ats@adobe.com, ir@adobe.com, adobe@kpcorp.com, dklyuchn@adobe.com, name@emailaddress.com, complianceprep@adobe.com, copyright@adobe.com, katerose@google.com, dale6026@gmail.com, copyright@youtube.com, incopyright@youtube.com, parishblevins3972@live.com, person@example.com, infodvlz@gmail.com, Jessewelle@gmail.com, Michael@Vsauce.com, badlipreader@gmail.com, booking@hahahaproduction.com, domingos0@gmail.com, iuri_tt1@hotmail.com, temsa7show@gmail.com, iijjjii@hotmail.com, booking@deepcentral.ro, bogdan@musicexpert.ro, amigosdejosejose@gmail.com, ss4as@hotmail.com, fahd1u3@hotmail.com, bookhodgetwins@gmail.com, matt@unionlabelgroup.com, BananaNeil@gmail.com, contato@galofrito.com.br, info@lncproductions.com, gaddis@yahoo.com, gewajega@yahoo.com, armanistayle@live.com, BigAlloosh@hotmail.com, srparakh26@gmail.com, The_Mehdi@yahoo.com, michel@colormedifferent.org, key@aol.com, contactdylan@ymail.com, justin@nexusartists.com, Kenn@Buyaustin.com, jacobozab@gmail.com, VIKASKUMRAI@gmail.com, BronyBreakdown@gmail.com, hpaduateam@gmail.com, jennamarblesbusiness@gmail.com, ohgodtheaftermath_@hotmail.com, dchitoo88@gmail.com, zartinaw@yahoo.com, cubbyradio@yahoo.com, nHV7777@gmail.com, oceanicrecordsllc@gmail.com, EvanEdinger@gmail.com, sanchez4@gmail.com, havardrugland@gmail.com, joshbmx40@hotmail.com, alanchan1024@hotmail.com, bisognin@libero.it, contato@portadosfundos.com.br, gaoshanyinyue@gmail.com, contacto@charlieparra.com, fatcraft@gmail.com, info@bluescafe.nl, super_starr_1120@yahoo.com, savaril@hotmail.com, adam@adamvstheman.com, bookingdaym@yahoo.com, SKWEEZYJIBBS@gmail.com, privacy@chromium.org, webmaster@pixmania.com, partenariat@pixmania.com, achat@pixmania.com, promofr@pixmania.com, mdirdj@yahoo.com, taunk18@gmail.com, ian@hixie.ch, whatwg@whatwg.org, nikunj@o-micron.com, jonas@sicking.cc, eliotgra@microsoft.com, andreip@google.com, jorlow@google.com, info@tonec.com, tkent@chromium.org, bugdroid1@gmail.com, skerner@google.com, joshgr@gmail.com, skerner@chromium.org, witty@gmail.com, Matsuzaki@gmail.com, asargent@chromium.org, mkwst@chromium.org, cvs-admin@insert.your.domain.here, leviw@chromium.org, brettw@chromium.org, rsimha@chromium.org, kerz@chromium.org, thakis@chromium.org, rsesek@chromium.org, nkostylev@chromium.org, oshima@chromium.org, sadrul@chromium.org, backer@chromium.org, gspencer@chromium.org, sail@chromium.org, vangelis@chromium.org, jchaffraix@chromium.org, pdr@chromium.org, willchan@chromium.org, tommi@chromium.org, dbeam@chromium.org, koz@chromium.org, chromium-extensions@googlegroups.com, unsubscribe@googlegroups.com, bscribe@googlegroups.com, annevk@annevk.nl, arun@mozilla.com, chromium-extensions@chromium.org, security@chromium.org, chromium-dev@chromium.org, dglazkov@chromium.org, dominicc@google.com, logov7@4x-hover.png, git@github.com, web-ui@dartlang.org, jmesserly@google.com, sigmund@google.com, dgrove@google.com, aa@chromium.org, erikkay@chromium.org, miket@chromium.org, mihaip@chromium.org, ghochmuth@chromium.org, gq45348t-g@mail.gmail.com, onTQ@mail.gmail.com, HUZ4_LpedoQacG1H6Ug@mail.gmail.com, EaOU1S8Re8CqWw@mail.gmail.com, SxkeBHJjW9-bTh21yQ@mail.gmail.com, 7X4ar3wQ@mail.gmail.com, ZZK7TN0A@mail.gmail.com, YGu644kA@mail.gmail.com, 1OQgYZtvbBQEQ-3Q@mail.gmail.com, 1U08aQ@mail.gmail.com, XhjXfn6FXw@mail.gmail.com, 16bL3oXNPBtw@mail.gmail.com, iAJvD5hLtQQP48ggbg@mail.gmail.com, cM6S_TUTmn6UCdR0g@mail.gmail.com, TxgekOrQ@mail.gmail.com, P44fM3F1-CrUCFw@mail.gmail.com, 4yroK8btmKUnA@mail.gmail.com, WaK9w@mail.gmail.com, 6ASm7JmU1Q@mail.gmail.com, v6-7q_3pRtYMd7djA@mail.gmail.com, DdwUg@mail.gmail.com, VHhvThQ@mail.gmail.com, Sd6bdEHc7QbQ@mail.gmail.com, 7DatjbNOQ772rkLigDOA@mail.gmail.com, Z6RgXPyyg@mail.gmail.com, jq3APUog@mail.gmail.com, vdw@mail.gmail.com, kE_4W8afg@mail.gmail.com, ADaQ@mail.gmail.com, NhLoo_hcXOnLs6tTQ@mail.gmail.com, shortfc@gmail.com, gordeon@gmail.com, techtonik@gmail.com, darin@chromium.org, sethladd@google.com, annevk@opera.com, stevenjb@chromium.org, chrome-release@google.com, msw@google.com, maruel@chromium.org, jam@chromium.org, joi@chromium.org, filcab@gmail.com, org@gtempaccount.com, jonatan@bylinebreak.com, gregsimon@chromium.org, yfriedman@chromium.org, chu@gmail.com, cowboymiler78@gmail.com, mathp@chromium.org, chromium-discuss@chromium.org, google-chrome-frame@googlegroups.com, chromium-html5@chromium.org, chromium-discuss@googlegroups.com, chromium-os-discuss@googlegroups.com, info@creativecommons.org, tbroch@chromium.org, dianders@chromium.org, vapier@chromium.org, quiche@chromium.org, pstew@chromium.org, committers@chromium.org, oscommitters@chromium.org, info@DisklessWorkstations.com, wason_shyu@acer.com.tw, noxx2cz@gmail.com, rminnich@chromium.org, enrica@apple.com, bbudge@chromium.org, benm@chromium.org, jr@chromium.org, craigdh@chromium.org, shawnsingh@google.com, rlp@chromium.org, chromeos-lkgm@google.com, hashimoto@chromium.org, kaiwang@chromium.org, jhawkins@chromium.org, wtc@chromium.org, kmadhusu@chromium.org, joaodasilva@chromium.org, erikwright@chromium.org, dsinclair@chromium.org, viettrungluu@chromium.org, wjia@chromium.org, noelallen@chromium.org, ivankr@chromium.org, jschuh@chromium.org, rohitrao@chromium.org, robertphillips@google.com, shess@chromium.org, haitaol@chromium.org, lliabraa@chromium.org, nduca@chromium.org, cpu@chromium.org, chrome-admin@google.com, torne@chromium.org, steveblock@chromium.org, ilevy@chromium.org, marja@chromium.org, danakj@chromium.org, googletestframework@googlegroups.com, cla-submissions@google.com, patchauthor@domain.com, evan@chromium.org, scottbyer@chromium.org, mal@chromium.org, gvanrossum@gmail.com, guido@google.com, chromium-reviews@chromium.org, chromium-os-reviews@chromium.org, creis@chromium.org, tonyg@chromium.org, ahutter@chromium.org, apatrick@chromium.org, nirnimesh@chromium.org, dank@chromium.org, jrg@chromium.org, webkit-gardening@chromium.org, foo@chromium.org, cmp@chromium.org, olofj@google.com, scottz@chromium.org, mtennant@chromium.org, TheQBot@CServe.quakenet.org, c-compiler-chrome@google.com, bradnelson@google.com, cmasone@chromium.org, davidjames@google.com, sievers@vrfy.org, bdavirro@chromium.org, okajima@digitalinfra.co.jp, p8w@mail.gmail.com, GpAQ@mail.gmail.com, VXw@mail.gmail.com, P_VHRTvz3qQiOWVyQ@mail.gmail.com, iA@mail.gmail.com, jWrRnOA@mail.gmail.com, PkQ@mail.gmail.com, MOBXVxaG_Oc60yshLw@mail.gmail.com, xRA@mail.gmail.com, 6ErGACNoMdJmVA@mail.gmail.com, YdLHCg@mail.gmail.com, Av8g@mail.gmail.com, LvR5gigA@mail.gmail.com, cMZ7npShiE1Ucw@mail.gmail.com, qjrGhcFjtpnwTBiA@mail.gmail.com, HNW4g@mail.gmail.com, scherkus@chromium.org, sque@chromium.org, piman@chromium.org, petermayo@google.com, asharif@chromium.org, dhw@chromium.org, micahc@chromium.org, dgreid@chromium.org, hychao@chromium.org, chihchung@chromium.org, derat@chromium.org, keescook@chromium.org, dmazzoni@chromium.org, dennisjeffrey@chromium.org, saintlou@chromium.org, bleung@chromium.org, charliemooney@chromium.org, rcui@chromium.org, ferringb@chromium.org, marcheu@chromium.org, glen@chromium.org, jamescook@chromium.org, mnissler@chromium.org, petkov@chromium.org, gauravsh@chromium.org, pimanttr3@gmail.com, sleffler@chromium.org, mdhayter@chromium.org, seanpaul@chromium.org, jean@google.com, jwerner@chromium.org, fischman@chromium.org, fischman@google.com, hungte@chromium.org, dparker@chromium.org, abarth@chromium.org, sonnyrao@chromium.org, eblake@chromium.org, bdavirro@google.com, dpolukhin@chromium.org, dparker@google.com, tammo@google.com, sky@chromium.org, tlambert@chromium.org, davemoore@chromium.org, olofj@chromium.org, jrbarnette@chromium.org, semenzato@chromium.org, -sleffler@chromium.org, yusukes@chromium.org, royans@chromium.org, kerz@google.com, tim@chromium.org, nick@chromium.org, zea@chromium.org, akalin@chromium.org, madmax@managedchrome.com, badben@managedchrome.com, bryanchiou@chromium.org, srabbelier@google.com, enne@chromium.org, cywang@chromium.org, josephsih@chromium.org, augie@google.com, dbentley@google.com, jacobly@google.com, jasonhall@google.com, jrobbins@google.com, jwall@google.com, nathaniel@google.com, slb@google.com, ljv@google.com, chrsmith@google.com, erg@google.com, mshields@google.com, tunes@google.com, kl@gmail.com, psf-donations@python.org, pep-divmod@lysator.liu.se, python@benfinney.id.au, guido@python.org, barry@python.org, CamelCase@Everything2.com, info@timparkin.co.uk, blairkutz@gmail.com, mario_limonciello@dell.com, flameeyes@chromium.org, chromium-os@googlecode.com, webmasters@gnu.org, richard@example.com, gnu@gnu.org, poYhpX3@mail.gmail.com, KezXz0@mail.gmail.com, ei@mail.gmail.com, d92ryYcqHsGSP@mail.gmail.com, aTV@mail.gmail.com, MFTWieZsiMgAU@mail.gmail.com, VgjkObLhTNvkKoVy@mail.gmail.com, 2k2Yfr4i4_aim64Vs@mail.gmail.com, GtuPQK02sSYDh8@mail.gmail.com, oiB@mail.gmail.com, 6KayxDvPEjcMHh_0A@mail.gmail.com, nickname@gentoo.org, pms-bugs@gentoo.org, gentoo@gmail.com, ferdy@ferdyx.org, fauli@gentoo.org, ulm@gentoo.org, paypal@gentoo.org, vapier@gentoo.org, solar@gentoo.org, robbat2@gentoo.org, alextarkovsky@gmail.com, alexxy@gentoo.org, armin76@gentoo.org, nightmorph@gentoo.org, torvalds@ppc970.osdl.org, you@yourdomain.example.com, dwatson@mimvista.com, gitster@pobox.com, junkio@cox.net, repo-discuss@googlegroups.com, user@domain.com, author@example.net, committer@example.net, approver@example.net, SitesStories@gmail.com, chronos@192.168.2.3, achew@nvidia.com, rmanohar@qca.qualcomm.com, linux-arm-kernel@lists.infradead.org, kerndev@chromium.org, yelin@nvidia.com, sergiu@chromium.org, iordache@gmail.com, md@google.com, webmaster@kernel.org, ftpadmin@kernel.org, thockin@hockin.org, xfs@oss.sgi.com, xorg@freedesktop.org, weinholt@debian.org, sasha@aftercode.net, anonymous@aftercode.net, bug-bash@gnu.org, help-bash@gnu.org, bash-maintainers@gnu.org, ramey@case.edu, julian@bzip.org, gpl@busybox.net, cjwatson@ubuntu.com, linux@googlemail.com, webmaster@debian.org, michael@pbandjelly.org, geissert@debian.org, thijs@debian.org, bubulle@debian.org, debian-www@lists.debian.org, gray@gnu.org, bug-cpio@gnu.org, coreutils-request@gnu.org, coreutils-announce@gnu.org, info-gnu@gnu.org, coreutils@gnu.org, bug-coreutils@gnu.org, jim@meyering.net, ebb9@byu.net, web-translators@gnu.org, tampakrap@gentoo.org, webmaster@cups.org, dash@vger.kernel.org, majordomo@vger.kernel.org, ConsoleKit@lists.freedesktop.org, dbus@lists.freedesktop.org, dbus@matthew.ath.cx, krammer@gmx.at, bug-diffutils@gnu.org, info-gnu-request@gnu.org, dickey@invisible-island.net, bug-ncurses@gnu.org, tranter@pobox.com, taken@gmail.com Content-Type: multipart/alternative; boundary=e89a8ff25644f6703d04d2c6c695 X-Barracuda-Connect: mail-ob0-f194.google.com[209.85.214.194] X-Barracuda-Start-Time: 1357651091 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-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HEAD_LONG, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 HEAD_LONG Message headers are very long 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --e89a8ff25644f6703d04d2c6c695 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Shoes For Crews=AE began producing slip-resistant footwear in 1984 and through superior technology quickly became the industry leader. Over the years we=92ve stayed on top by working hard to deliver you an unbeatable product at a great price. Of course your safety and satisfaction is our ultimate goal and we look forward to delivering you the world's best slip-resistant footwear in the years to come. SHOES FOR CREWS=AE is the global leader in slip-resistant footwear. With distribution centers in California, Canada and Ireland, we protect over 100,000 workplaces worldwide. The Most Popular Brand of Slip-Resistant Footwear. You=92ll find our footwe= ar in the finest restaurants, the greasiest kitchens, hospitals and medical facilities, and in industrial and manufacturing operations with slippery floor hazards. Wherever you work, SHOES FOR CREWS=AE can make your job easier and safer as you walk with confidence and comfort. Stay safe on your feet with SHOES FOR CREWS=AE. *click here 3D"Shop * --e89a8ff25644f6703d04d2c6c695 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Shoes For Crews=AE began producing slip-resistant footwear in 1984 and thro= ugh superior technology quickly became the industry leader. Over the years = we=92ve stayed on top by working hard to deliver you an unbeatable product = at a great price. Of course your safety and satisfaction is our ultimate go= al and we look forward to delivering you the world's best slip-resistan= t footwear in the years to come.

SHOES FOR CREWS=AE is the global leader in slip-resistant footwear. Wit= h distribution centers in California, Canada and Ireland, we protect over 1= 00,000 workplaces worldwide.

The Most Popular Brand of Slip-Resistan= t Footwear. You=92ll find our footwear in the finest restaurants, the greas= iest kitchens, hospitals and medical facilities, and in industrial and manu= facturing operations with slippery floor hazards.
Wherever you work, SHOES FOR CREWS=AE can make your job easier and safer as= you walk with confidence and comfort. Stay safe on your feet with SHOES FO= R CREWS=AE.

click here
<a href=3D"http://www.anrdoezrs.net/click-6743= 097-10700946" target=3D"_top">
<img src=3D"http://www.awltovhc.com/image-6743097-10700946" width=3D"= 250" height=3D"250" alt=3D"Shop ShoesforCrews.com!"= ; border=3D"0"/></a>
--e89a8ff25644f6703d04d2c6c695-- From abhi.c.pawar@gmail.com Tue Jan 8 09:12:37 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_32,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08FCbNE176038 for ; Tue, 8 Jan 2013 09:12:37 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 64EB1AC00C for ; Tue, 8 Jan 2013 07:15:30 -0800 (PST) X-ASG-Debug-ID: 1357658129-04bdf0430f5903d0001-NocioJ Received: from mail-da0-f43.google.com (mail-da0-f43.google.com [209.85.210.43]) by cuda.sgi.com with ESMTP id pdfPH6qYupBd4PYm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Jan 2013 07:15:29 -0800 (PST) X-Barracuda-Envelope-From: abhi.c.pawar@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] Received: by mail-da0-f43.google.com with SMTP id u36so237746dak.2 for ; Tue, 08 Jan 2013 07:15:29 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=6G1cYMVYlP2tFZmwWj62zYaSLScfs/qdSjOHdLbW/H4=; b=q0jzF4pLsmBivreGbYZGTKYXSts1PWXyucVdvpoMB2lkfSfbvgjQ3wEyu9lLdqNAHp v3/lvVioqQPLt/KQbdBJKA1gZ+Ek3z8WCS+5ewFmId7eEPwR9tJcii7pDUczhV5vD0qk USvKQ4WxKTP9XMxOQUJGpVncT6vhs5yEnjbWgM5/pLPvk9hTRKBeoJiVCYoxlVSMQK7l gp2f44LZfXyCt/OCq1s06zgwLIU4Wmx8h/aC1wNNZwidzXqXJQazpgNnQyOtYipk6XW3 7fYaIb4uKf5oAGJ1COJlQpZw61UGQ9PEx/wsFdAZcGnQgqGjCAJ7nJiwCQ0kGvf8H512 9H8w== X-Received: by 10.68.253.137 with SMTP id aa9mr200528682pbd.102.1357658128982; Tue, 08 Jan 2013 07:15:28 -0800 (PST) Received: from [172.27.56.83] ([121.242.40.10]) by mx.google.com with ESMTPS id ol4sm39779566pbb.58.2013.01.08.07.15.25 (version=SSLv3 cipher=OTHER); Tue, 08 Jan 2013 07:15:27 -0800 (PST) Message-ID: <50EC37FE.4010009@gmail.com> Date: Tue, 08 Jan 2013 20:45:10 +0530 From: Abhijit Pawar User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Jeff Liu CC: Ben Myers , Abhijit Pawar , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> <50EBC8E5.9080200@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop using simple_strtoul() In-Reply-To: <50EBC8E5.9080200@oracle.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-da0-f43.google.com[209.85.210.43] X-Barracuda-Start-Time: 1357658129 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-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.2.119280 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 Hi Jeff, On 01/08/2013 12:51 PM, Jeff Liu wrote: > Hi Ben and Abhijit, > > On 01/08/2013 04:49 AM, Ben Myers wrote: >> Hey Jeff & Abhijit, >> >> On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: >>> This small patch convert xfs_parseargs() and suffix_strtoul() to >>> use kstrtoint() instead of simple_strtoul() which is deprecated. >> >> It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: >> remove obsolete simple_strto' which we saw Dec 7. You guys went after the >> same thing and came up with slightly differing results. If Abhijit would >> prefer to factor out the xfs changes I'd be happy to take either that, or >> Jeff's patch, but it would be better if they didn't conflict. Can y'all come >> to an agreement as to what the xfs changes should be? > Sorry, I missed that patch from Abhijit. > > Looks the previous patch did not replaced the simple_strtoul() with > kstrtoint() in suffix_strtoul(). > > Abhijit, would you like to fix it as well? Yes,it did not replace the call. Looks like I have missed that piece of code. Once Ben applies my original patch, I will send another patch for this on top of that. > > Thanks, > -Jeff > -- - Abhijit From bpm@sgi.com Tue Jan 8 09:30:10 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_32 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08FUAh4176986 for ; Tue, 8 Jan 2013 09:30:10 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FBCB8F8054; Tue, 8 Jan 2013 07:33:04 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 067CF4266DC; Tue, 8 Jan 2013 09:33:04 -0600 (CST) Date: Tue, 8 Jan 2013 09:33:03 -0600 From: Ben Myers To: Abhijit Pawar Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() Message-ID: <20130108153303.GO30652@sgi.com> References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> <50EBC8E5.9080200@oracle.com> <50EC37FE.4010009@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EC37FE.4010009@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Abhijit, On Tue, Jan 08, 2013 at 08:45:10PM +0530, Abhijit Pawar wrote: > On 01/08/2013 12:51 PM, Jeff Liu wrote: > > On 01/08/2013 04:49 AM, Ben Myers wrote: > >> On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: > >>> This small patch convert xfs_parseargs() and suffix_strtoul() to > >>> use kstrtoint() instead of simple_strtoul() which is deprecated. > >> > >> It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: > >> remove obsolete simple_strto' which we saw Dec 7. You guys went after the > >> same thing and came up with slightly differing results. If Abhijit would > >> prefer to factor out the xfs changes I'd be happy to take either that, or > >> Jeff's patch, but it would be better if they didn't conflict. Can y'all come > >> to an agreement as to what the xfs changes should be? > > > > Sorry, I missed that patch from Abhijit. > > > > Looks the previous patch did not replaced the simple_strtoul() with > > kstrtoint() in suffix_strtoul(). > > > > Abhijit, would you like to fix it as well? > > Yes,it did not replace the call. Looks like I have missed that piece of > code. Once Ben applies my original patch, I will send another patch for > this on top of that. I believe that your original patch contains changes for other filesystems too. I'd prefer to pull only xfs changes into the xfs branch. Are you willing to factor out the xfs changes, add the suffix_strtoul, and resend? That way we can get it done in one go. Regards, Ben From abhi.c.pawar@gmail.com Tue Jan 8 09:34:52 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_32,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08FYqCi177319 for ; Tue, 8 Jan 2013 09:34:52 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE3CD8F8064 for ; Tue, 8 Jan 2013 07:37:48 -0800 (PST) X-ASG-Debug-ID: 1357659467-04bdf0430f591ee0001-NocioJ Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by cuda.sgi.com with ESMTP id nbW6GBG8KTFE44Bu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Jan 2013 07:37:48 -0800 (PST) X-Barracuda-Envelope-From: abhi.c.pawar@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.48 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] Received: by mail-pa0-f48.google.com with SMTP id fa1so402257pad.7 for ; Tue, 08 Jan 2013 07:37:47 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.48] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=E66/YkdZu5HG25+GdH7ob3m5VEF7Bz6gMyBAKOW1/LI=; b=c5unZjJMeVCKhGERMB0o/KNPW7zGQAY8rBynFS4uW8cWNsEpBnsJj439OYyAOCv2be hT9zRxqmYj/6vxR5uX5d2Scc7W1ZlshONgWStbp4qpfOMY1e3wIakTXEMyfakeJGjBKR g16CeLoc5ugvoleKhE26oonAfM9C1W4uigcpDeEkFVPSRTXuZhuTbmtZQGQo9HrJDqdq DvDv+S2TEg+NrcknPtNyXo64Iw17iwE6SsRGTV/YP+kycBXbgiFbcmGOKasc7ICpoi3T hCnBAPVHZ1GJaYW2ygNdwBdBWP4JFdyKHqcGxqgf7+xpog1ADBMRTartLtt4I9gW/tcX R3jg== X-Received: by 10.68.232.42 with SMTP id tl10mr202216892pbc.108.1357659467334; Tue, 08 Jan 2013 07:37:47 -0800 (PST) Received: from [172.27.56.83] ([121.242.40.10]) by mx.google.com with ESMTPS id bh9sm40941234pab.12.2013.01.08.07.37.44 (version=SSLv3 cipher=OTHER); Tue, 08 Jan 2013 07:37:45 -0800 (PST) Message-ID: <50EC3D42.1010705@gmail.com> Date: Tue, 08 Jan 2013 21:07:38 +0530 From: Abhijit Pawar User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: Abhijit Pawar , Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> <50EBC8E5.9080200@oracle.com> <50EC37FE.4010009@gmail.com> <20130108153303.GO30652@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop using simple_strtoul() In-Reply-To: <20130108153303.GO30652@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f48.google.com[209.85.220.48] X-Barracuda-Start-Time: 1357659468 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-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.2.119282 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 Hi Ben, On 01/08/2013 09:03 PM, Ben Myers wrote: > Hey Abhijit, > > On Tue, Jan 08, 2013 at 08:45:10PM +0530, Abhijit Pawar wrote: >> On 01/08/2013 12:51 PM, Jeff Liu wrote: >>> On 01/08/2013 04:49 AM, Ben Myers wrote: >>>> On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: >>>>> This small patch convert xfs_parseargs() and suffix_strtoul() to >>>>> use kstrtoint() instead of simple_strtoul() which is deprecated. >>>> >>>> It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: >>>> remove obsolete simple_strto' which we saw Dec 7. You guys went after the >>>> same thing and came up with slightly differing results. If Abhijit would >>>> prefer to factor out the xfs changes I'd be happy to take either that, or >>>> Jeff's patch, but it would be better if they didn't conflict. Can y'all come >>>> to an agreement as to what the xfs changes should be? >>> >>> Sorry, I missed that patch from Abhijit. >>> >>> Looks the previous patch did not replaced the simple_strtoul() with >>> kstrtoint() in suffix_strtoul(). >>> >>> Abhijit, would you like to fix it as well? >> >> Yes,it did not replace the call. Looks like I have missed that piece of >> code. Once Ben applies my original patch, I will send another patch for >> this on top of that. > > I believe that your original patch contains changes for other > filesystems too. I'd prefer to pull only xfs changes into the xfs branch. Are > you willing to factor out the xfs changes, add the suffix_strtoul, and resend? > That way we can get it done in one go. Yes. the patch contains changes to other filesystems as well. I will separate out the xfs changes in a new patch and will also fix the suffix_strtoul. I will send the patch soon. > > Regards, > Ben > -- - Abhijit From xfs-owner@oss.sgi.com Tue Jan 8 10:41:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08GfSEA181188 for ; Tue, 8 Jan 2013 10:41:28 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC2E6304067 for ; Tue, 8 Jan 2013 08:44:21 -0800 (PST) X-ASG-Debug-ID: 1357663457-04bdf0430f597700001-w1Z2WR Received: from mx1.indecomm.net (mx1.indecomm.net [1.186.34.134]) by cuda.sgi.com with ESMTP id mdpg92HcHEjiE2WP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 08 Jan 2013 08:44:20 -0800 (PST) X-Barracuda-Envelope-From: X-Barracuda-Apparent-Source-IP: 1.186.34.134 Received: from INBLRCHT001.INDECOMM.LOCAL (inblrcht001.indecomm.local [172.16.32.63]) by mx1.indecomm.net with ESMTP id QejPZ2tMOaHtLCXe (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 08 Jan 2013 22:14:16 +0530 (IST) Received: from INBLRCHT001.INDECOMM.LOCAL ([10.10.1.3]) by INBLRCHT001.INDECOMM.LOCAL ([10.10.1.3]) with Microsoft SMTP Server id 14.01.0289.001; Tue, 8 Jan 2013 22:14:12 +0530 From: Tony J Tom To: "linux-xfs@oss.sgi.com" Subject: Automatic reply: delivery failed Thread-Topic: delivery failed X-ASG-Orig-Subj: Automatic reply: delivery failed Thread-Index: AQHN7b9jvJdIQJ/UcEqYepRVW23KVw== Date: Tue, 8 Jan 2013 16:44:12 +0000 Message-ID: References: In-Reply-To: X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Inbox-Rules-Loop: tony.tom@indecomm.net X-MS-TNEF-Correlator: Content-Type: multipart/alternative; boundary="_000_d1644b0009894cc6a9ccaa6f42f62d1cINBLRCHT001INDECOMMLOCA_" MIME-Version: 1.0 X-Virus-Scanned: by bsmtpd at indecomm.net X-Barracuda-Connect: mx1.indecomm.net[1.186.34.134] X-Barracuda-Start-Time: 1357663459 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-Spam-Score: 0.26 X-Barracuda-Spam-Status: No, SCORE=0.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=EMPTY_ENV_FROM, HTML_MESSAGE, OOBOUNCE_MESSAGE, RCVD_ILLEGAL_IP, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 OOBOUNCE_MESSAGE Out-of-Office bounce message --_000_d1644b0009894cc6a9ccaa6f42f62d1cINBLRCHT001INDECOMMLOCA_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, I am out of the office from Monday, December 31st 2012 through Friday, Janu= ary 25th 2013. Incase of any urgency please contact my Manager at rony.daniel@indecomm.net= or +1 (412) 561-3430 Thanks & Regards, Tony J Tom --_000_d1644b0009894cc6a9ccaa6f42f62d1cINBLRCHT001INDECOMMLOCA_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

I am out of the office= from Monday, December 31st 2012 through Friday, January 25th 2013.

 

Incase of any urgency = please contact my Manager at rony.daniel@indecomm.net or +1 (412) = 561-3430

 

 

Thanks & Regards,<= o:p>

Tony J Tom<= /p>

 

--_000_d1644b0009894cc6a9ccaa6f42f62d1cINBLRCHT001INDECOMMLOCA_-- From sandeen@sandeen.net Tue Jan 8 11:22:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08HMS7i183654 for ; Tue, 8 Jan 2013 11:22:28 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED657AC00B for ; Tue, 8 Jan 2013 09:25:21 -0800 (PST) X-ASG-Debug-ID: 1357665917-04cb6c05a5b25710001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AaNCpJVzrGgykHgU for ; Tue, 08 Jan 2013 09:25:17 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 738BA65AFC8B; Tue, 8 Jan 2013 11:25:17 -0600 (CST) Message-ID: <50EC567E.2020607@sandeen.net> Date: Tue, 08 Jan 2013 11:25:18 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: Stan Hoeppner , Fugazzi99 , xfs@oss.sgi.com Subject: Re: XFS restore don't restore References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> <50EB3DF7.3010100@hardwarefreak.com> <20130107213739.GU27055@sgi.com> X-ASG-Orig-Subj: Re: XFS restore don't restore In-Reply-To: <20130107213739.GU27055@sgi.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357665917 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b On 1/7/13 3:37 PM, Ben Myers wrote: ... > Hmm. I agree with Eric that it is likely related to 'xfsdump: fill in > bs_forkoff', commit b7af332b. Maybe bumping the dump version was the right > thing to do back then. 3.1.2 should work fine though. This should fix it, so future dumps are still compatible w/ earlier restores. At this point I don't know WTF to do w/ versioning etc to best contain the damage ... [PATCH] xfsdump: zero bs_forkoff, don't fill in the value In xfsdump 3.1.2 I explicitly added the bs_forkoff member to this structure; I tried to be good and explicitly fill in a value. However, previously it was initialized to zero, and now we're giving it a value (which is ignored by restore, other than to checksum it). By putting in a non-zero value, I broke checksumming when an xfsdump with a non-zero forkoff was restored by an older xfsrestore that doesn't know about the field. Fill in 0 to fix backwards compatibility. Signed-off-by: Eric Sandeen Reported-by: Fugazzi99 --- diff --git a/dump/content.c b/dump/content.c index 9a36fe1..ac19021 100644 --- a/dump/content.c +++ b/dump/content.c @@ -4928,7 +4928,7 @@ copy_xfs_bstat(bstat_t *dst, xfs_bstat_t *src) dst->bs_extents = src->bs_extents; dst->bs_gen = src->bs_gen; dst->bs_projid_lo = src->bs_projid_lo; - dst->bs_forkoff = src->bs_forkoff; + dst->bs_forkoff = 0; dst->bs_projid_hi = src->bs_projid_hi; dst->bs_dmevmask = src->bs_dmevmask; dst->bs_dmstate = src->bs_dmstate; From sandeen@sandeen.net Tue Jan 8 11:28:47 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08HSlNE184054 for ; Tue, 8 Jan 2013 11:28:47 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 31F49304032 for ; Tue, 8 Jan 2013 09:31:41 -0800 (PST) X-ASG-Debug-ID: 1357666299-04bdf0430f59c400001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Ybl5vCQyJ6JUnXoB for ; Tue, 08 Jan 2013 09:31:40 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A5DA465AFC8B; Tue, 8 Jan 2013 11:31:39 -0600 (CST) Message-ID: <50EC57FD.9040601@sandeen.net> Date: Tue, 08 Jan 2013 11:31:41 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: Fugazzi99 , Stan Hoeppner , xfs@oss.sgi.com Subject: [PATCH] xfsdump: zero bs_forkoff, don't fill in the value References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> <50EB3DF7.3010100@hardwarefreak.com> <20130107213739.GU27055@sgi.com> <50EC567E.2020607@sandeen.net> X-ASG-Orig-Subj: [PATCH] xfsdump: zero bs_forkoff, don't fill in the value In-Reply-To: <50EC567E.2020607@sandeen.net> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357666299 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b In xfsdump 3.1.2 I explicitly added the bs_forkoff member to this structure; I tried to be good and explicitly fill in a value. However, previously it was initialized to zero, (by virtue of being missing) and now we're giving it a value (which is ignored by restore, other than to checksum it). By putting in a non-zero value, I broke checksumming when an xfsdump with a non-zero forkoff was restored by an older xfsrestore that doesn't know about the field. Fill in 0 to fix backwards compatibility. Signed-off-by: Eric Sandeen Reported-by: Fugazzi99 --- diff --git a/dump/content.c b/dump/content.c index 9a36fe1..ac19021 100644 --- a/dump/content.c +++ b/dump/content.c @@ -4928,7 +4928,7 @@ copy_xfs_bstat(bstat_t *dst, xfs_bstat_t *src) dst->bs_extents = src->bs_extents; dst->bs_gen = src->bs_gen; dst->bs_projid_lo = src->bs_projid_lo; - dst->bs_forkoff = src->bs_forkoff; + dst->bs_forkoff = 0; dst->bs_projid_hi = src->bs_projid_hi; dst->bs_dmevmask = src->bs_dmevmask; dst->bs_dmstate = src->bs_dmstate; From adahl@sgi.com Tue Jan 8 12:19:37 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08IJbIw186221 for ; Tue, 8 Jan 2013 12:19:37 -0600 Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay1.corp.sgi.com (Postfix) with ESMTP id 086478F8033; Tue, 8 Jan 2013 10:22:31 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 8 Jan 2013 12:22:30 -0600 Message-ID: <50EC63E6.6090903@sgi.com> Date: Tue, 8 Jan 2013 12:22:30 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Satoru Takeuchi CC: Subject: Re: [PATCH] xfstests: SGI license update References: <50E47A64.3020003@sgi.com> <50E66FFA.8010309@jp.fujitsu.com> In-Reply-To: <50E66FFA.8010309@jp.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.232.133] On 01/04/2013 12:00 AM, Satoru Takeuchi wrote: > Hi Andrew, > >> + * Copyright (c) 2012 SGI. All Rights Reserved. > > Just a trivial comment, "2013 SGI"? You would be correct... silly mistake on my part. :-) -Andrew From adahl@sgi.com Tue Jan 8 12:20:17 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08IKGNd186302 for ; Tue, 8 Jan 2013 12:20:16 -0600 Received: from xmail.sgi.com (pv-excas3-dc21.corp.sgi.com [137.38.102.206]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1638AAC004 for ; Tue, 8 Jan 2013 10:23:10 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 8 Jan 2013 12:23:09 -0600 Message-ID: <50EC640C.7020106@sgi.com> Date: Tue, 8 Jan 2013 12:23:08 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: Re: [PATCH V2] xfstests: SGI license update References: <50E47A64.3020003@sgi.com> In-Reply-To: <50E47A64.3020003@sgi.com> Content-Type: multipart/mixed; boundary="------------050502020206030304090509" X-Originating-IP: [128.162.232.133] --------------050502020206030304090509 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------050502020206030304090509 Content-Type: text/x-patch; name="update-looptest-sgi-license.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="update-looptest-sgi-license.patch" Updated SGI license in looptest.c Signed-off-by: Andrew Dahl --- src/looptest.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) Index: xfstests/src/looptest.c =================================================================== --- xfstests.orig/src/looptest.c +++ xfstests/src/looptest.c @@ -1,29 +1,18 @@ /* - * Copyright 2002 Silicon Graphics, Inc. ALL RIGHTS RESERVED - * - * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND - * - * Use, duplication or disclosure by the Government is subject to restrictions - * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the - * Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 - * and/or in similar or successor clauses in the FAR, or the DOD or NASA FAR - * Supplement. Unpublished -- rights reserved under the Copyright Laws - * of the United States. Contractor/manufacturer is Silicon Graphics, Inc., - * 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. - * - * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI - * - * The copyright notice above does not evidence any actual or intended - * publication or disclosure of this source code, which includes information - * that is the confidential and/or proprietary, and is a trade secret, - * of Silicon Graphics, Inc. Any use, duplication or disclosure not - * specifically authorized in writing by Silicon Graphics is strictly - * prohibited. ANY DUPLICATION, MODIFICATION, DISTRIBUTION,PUBLIC PERFORMANCE, - * OR PUBLIC DISPLAY OF THIS SOURCE CODE WITHOUT THE EXPRESS WRITTEN CONSENT - * OF SILICON GRAPHICS, INC. IS STRICTLY PROHIBITED. THE RECEIPT OR POSSESSION - * OF THIS SOURCE CODE AND/OR INFORMATION DOES NOT CONVEY ANY RIGHTS - * TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, OR TO MANUFACTURE, USE, - * OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. + * Copyright (c) 2013 SGI. 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 */ /* dxm - 28/2/2 */ --------------050502020206030304090509-- From bpm@sgi.com Tue Jan 8 13:12:16 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08JCGvY198799 for ; Tue, 8 Jan 2013 13:12:16 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id E050FAC001; Tue, 8 Jan 2013 11:15:09 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A688E4266DC; Tue, 8 Jan 2013 13:15:09 -0600 (CST) Date: Tue, 8 Jan 2013 13:15:09 -0600 From: Ben Myers To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem Message-ID: <20130108191509.GX27055@sgi.com> References: <50B52DB7.3030506@redhat.com> <50B582B0.4050305@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50B582B0.4050305@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Tue, Nov 27, 2012 at 09:19:12PM -0600, Eric Sandeen wrote: > TBH, I don't know if this is posix-specified, but I found out the > hard way that when trying to re-create existing files on a readonly > filesystem, some apps expect/handle EEXIST, but fail on EROFS. > > This will test mkdir, mknod, and symlinks for that behavior. > > Signed-off-by: Eric Sandeen > --- > > V2: Change test dir var name, do scratch mkfs, drop _fail This looked fine to me except that... > diff --git a/292.out b/292.out > new file mode 100644 > index 0000000..485c567 > --- /dev/null > +++ b/292.out > @@ -0,0 +1,5 @@ > +QA output created by 292 > +mknod: `SCRATCH_MNT/292.test/testnode': File exists > +mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists > +touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system > +ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists ln output is different on my distro: ~/xfstests # diff 293.out 293.out.bad 5c5 < ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists --- > ln: failed to create symbolic link `SCRATCH_MNT/293.test/testlink': File exists ~/xfstests # rpm -qf `which ln` coreutils-8.14-3.4.1.i586 Regards, Ben From sandeen@sandeen.net Tue Jan 8 13:39:55 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08JdsRx199994 for ; Tue, 8 Jan 2013 13:39:54 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 201CBAC001 for ; Tue, 8 Jan 2013 11:42:51 -0800 (PST) X-ASG-Debug-ID: 1357674167-04cb6c05a6b309a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YCQOaeOjUx3sUsL3 for ; Tue, 08 Jan 2013 11:42:47 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D162061F895A; Tue, 8 Jan 2013 13:42:46 -0600 (CST) Message-ID: <50EC76B6.7040609@sandeen.net> Date: Tue, 08 Jan 2013 13:42:46 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50B582B0.4050305@sandeen.net> <20130108191509.GX27055@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem In-Reply-To: <20130108191509.GX27055@sgi.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357674167 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/8/13 1:15 PM, Ben Myers wrote: > Hey Eric, > > On Tue, Nov 27, 2012 at 09:19:12PM -0600, Eric Sandeen wrote: >> TBH, I don't know if this is posix-specified, but I found out the >> hard way that when trying to re-create existing files on a readonly >> filesystem, some apps expect/handle EEXIST, but fail on EROFS. >> >> This will test mkdir, mknod, and symlinks for that behavior. >> >> Signed-off-by: Eric Sandeen >> --- >> >> V2: Change test dir var name, do scratch mkfs, drop _fail > > This looked fine to me except that... > >> diff --git a/292.out b/292.out >> new file mode 100644 >> index 0000000..485c567 >> --- /dev/null >> +++ b/292.out >> @@ -0,0 +1,5 @@ >> +QA output created by 292 >> +mknod: `SCRATCH_MNT/292.test/testnode': File exists >> +mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists >> +touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system >> +ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists > > ln output is different on my distro: > > ~/xfstests # diff 293.out 293.out.bad > 5c5 > < ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists > --- > > ln: failed to create symbolic link `SCRATCH_MNT/293.test/testlink': File exists clearly using the wrong distro ;) How about something like: +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch +_scratch_mount -o remount,ro +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch -Eric > ~/xfstests # rpm -qf `which ln` > coreutils-8.14-3.4.1.i586 > > Regards, > Ben > From bpm@sgi.com Tue Jan 8 13:45:40 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08Jje6o200328 for ; Tue, 8 Jan 2013 13:45:40 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD2A08F8052; Tue, 8 Jan 2013 11:48:33 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 790A64266DC; Tue, 8 Jan 2013 13:48:33 -0600 (CST) Date: Tue, 8 Jan 2013 13:48:33 -0600 From: Ben Myers To: Christoph Hellwig Cc: Sergei Trofimovich , Alex Elder , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Phil White Subject: Re: [PATCH] xfs: return -EINVAL instead of -EUCLEAN when mounting non-xfs Message-ID: <20130108194833.GY27055@sgi.com> References: <20121230015615.6cc9e03c@sf> <1356823010-29768-1-git-send-email-slyfox@gentoo.org> <20130103181929.GA23049@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130103181929.GA23049@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Thu, Jan 03, 2013 at 01:19:29PM -0500, Christoph Hellwig wrote: > On Sun, Dec 30, 2012 at 02:16:50AM +0300, Sergei Trofimovich wrote: > > It fixes boot panic when trying to boot from btrfs filesystem. > > kernel tries to mount as xfs and gets fatal -EUCLEAN: > > > > [ 0.170000] VFS: Cannot open root device "ubda" or unknown-block(98,0): error -117 > > [ 0.170000] Please append a correct "root=" boot option; here are the available partitions: > > [ 0.170000] 6200 1048576 ubda driver: uml-blkdev > > [ 0.170000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(98,0) > > > > init/do_mounts.c expects only -EINVAL as 'retry another' option. > > Fixes regression introduced by commit 98021821a502db347bd9c7671beeee6e8ce07ea6 > > Looks reasonable, but think xfs_readsb should simply be changed to > turn all EFSCORRUPTED returns into EINVAL if loud is not set. I think there are some EFSCORRUPTED returns that should not result in 'retry another' behavior. E.g. mounting an xfs filesystem where super block magic is good but you have a corrupted log probably shouldn't result in a retry with ext3. It is useful to be able to distinguish between that special case of sb->sb_magic != XFS_SB_MAGIC and a truly corrupted filesystem. Here EWRONGFS (EINVAL) in the quiet case is better than EFSCORRUPTED, but unfortunately we still can't tell EWRONGFS from other EINVAL returns in b_error. Adding a new errno as Ted suggested might make some sense. Regards, Ben From david@fromorbit.com Tue Jan 8 14:46:08 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08Kk8Ai208630 for ; Tue, 8 Jan 2013 14:46:08 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BE8FF304039 for ; Tue, 8 Jan 2013 12:49:04 -0800 (PST) X-ASG-Debug-ID: 1357678141-04cbb035a4af0340001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id t0AVk1zwE4sHQnyn for ; Tue, 08 Jan 2013 12:49:02 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AswPAMuE7FB5LIyU/2dsb2JhbABEt0uGEhdzgh4BAQU6HCMQCAMYCSUPBSUDIROIFrcqFIw+hEMDlguQSoMI Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Jan 2013 07:19:00 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tsg6V-00022X-7D; Wed, 09 Jan 2013 07:48:59 +1100 Date: Wed, 9 Jan 2013 07:48:59 +1100 From: Dave Chinner To: Eric Sandeen Cc: Ben Myers , Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem Message-ID: <20130108204859.GZ3120@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50B582B0.4050305@sandeen.net> <20130108191509.GX27055@sgi.com> <50EC76B6.7040609@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EC76B6.7040609@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1357678141 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 08, 2013 at 01:42:46PM -0600, Eric Sandeen wrote: > On 1/8/13 1:15 PM, Ben Myers wrote: > > Hey Eric, > > > > On Tue, Nov 27, 2012 at 09:19:12PM -0600, Eric Sandeen wrote: > >> TBH, I don't know if this is posix-specified, but I found out the > >> hard way that when trying to re-create existing files on a readonly > >> filesystem, some apps expect/handle EEXIST, but fail on EROFS. > >> > >> This will test mkdir, mknod, and symlinks for that behavior. > >> > >> Signed-off-by: Eric Sandeen > >> --- > >> > >> V2: Change test dir var name, do scratch mkfs, drop _fail > > > > This looked fine to me except that... > > > >> diff --git a/292.out b/292.out > >> new file mode 100644 > >> index 0000000..485c567 > >> --- /dev/null > >> +++ b/292.out > >> @@ -0,0 +1,5 @@ > >> +QA output created by 292 > >> +mknod: `SCRATCH_MNT/292.test/testnode': File exists > >> +mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists > >> +touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system > >> +ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists > > > > ln output is different on my distro: > > > > ~/xfstests # diff 293.out 293.out.bad > > 5c5 > > < ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists > > --- > > > ln: failed to create symbolic link `SCRATCH_MNT/293.test/testlink': File exists > > clearly using the wrong distro ;) > > How about something like: > > +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch > +_scratch_mount -o remount,ro > +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch There should already be a ln filter that handles this. Check test 103 - filter_ln. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Jan 8 15:09:00 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08L90c1209781 for ; Tue, 8 Jan 2013 15:09:00 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7290F8F8035 for ; Tue, 8 Jan 2013 13:11:54 -0800 (PST) X-ASG-Debug-ID: 1357679513-04cbb035a7af1ba0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id De3g3LQc5qirmhiw for ; Tue, 08 Jan 2013 13:11:53 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 07C0865AFC8B; Tue, 8 Jan 2013 15:11:52 -0600 (CST) Message-ID: <50EC8B98.1020004@sandeen.net> Date: Tue, 08 Jan 2013 15:11:52 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , Ben Myers , xfs-oss Subject: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50B582B0.4050305@sandeen.net> <20130108191509.GX27055@sgi.com> <50EC76B6.7040609@sandeen.net> <20130108204859.GZ3120@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem In-Reply-To: <20130108204859.GZ3120@dastard> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357679513 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/8/13 2:48 PM, Dave Chinner wrote: > On Tue, Jan 08, 2013 at 01:42:46PM -0600, Eric Sandeen wrote: >> On 1/8/13 1:15 PM, Ben Myers wrote: >>> Hey Eric, >>> >>> On Tue, Nov 27, 2012 at 09:19:12PM -0600, Eric Sandeen wrote: >>>> TBH, I don't know if this is posix-specified, but I found out the >>>> hard way that when trying to re-create existing files on a readonly >>>> filesystem, some apps expect/handle EEXIST, but fail on EROFS. >>>> >>>> This will test mkdir, mknod, and symlinks for that behavior. >>>> >>>> Signed-off-by: Eric Sandeen >>>> --- >>>> >>>> V2: Change test dir var name, do scratch mkfs, drop _fail >>> >>> This looked fine to me except that... >>> >>>> diff --git a/292.out b/292.out >>>> new file mode 100644 >>>> index 0000000..485c567 >>>> --- /dev/null >>>> +++ b/292.out >>>> @@ -0,0 +1,5 @@ >>>> +QA output created by 292 >>>> +mknod: `SCRATCH_MNT/292.test/testnode': File exists >>>> +mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists >>>> +touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system >>>> +ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists >>> >>> ln output is different on my distro: >>> >>> ~/xfstests # diff 293.out 293.out.bad >>> 5c5 >>> < ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists >>> --- >>>> ln: failed to create symbolic link `SCRATCH_MNT/293.test/testlink': File exists >> >> clearly using the wrong distro ;) >> >> How about something like: >> >> +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch >> +_scratch_mount -o remount,ro >> +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch > > There should already be a ln filter that handles this. > > Check test 103 - filter_ln. yeah, it has: -e "s,failed to create,creating," so I guess it could be moved to common ... -Eric > Cheers, > > Dave. > From david@fromorbit.com Tue Jan 8 15:28:10 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08LSApv210463 for ; Tue, 8 Jan 2013 15:28:10 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E906304032 for ; Tue, 8 Jan 2013 13:31:04 -0800 (PST) X-ASG-Debug-ID: 1357680662-04bdf07fae521310001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Bz0dGbMN4VxdvNsk for ; Tue, 08 Jan 2013 13:31:02 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0eAD+P7FB5LIyU/2dsb2JhbABEt0uFCwKBBRdzgh4BAQU6HCMQCAMYCSUPBSUDIROIFrckFIw+Y4J/YQOWC5BKgwg Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Jan 2013 08:01:01 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TsglA-00028Q-KL; Wed, 09 Jan 2013 08:31:00 +1100 Date: Wed, 9 Jan 2013 08:31:00 +1100 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , Ben Myers , xfs-oss Subject: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem Message-ID: <20130108213100.GA3120@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50B582B0.4050305@sandeen.net> <20130108191509.GX27055@sgi.com> <50EC76B6.7040609@sandeen.net> <20130108204859.GZ3120@dastard> <50EC8B98.1020004@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EC8B98.1020004@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1357680662 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 08, 2013 at 03:11:52PM -0600, Eric Sandeen wrote: > On 1/8/13 2:48 PM, Dave Chinner wrote: > > On Tue, Jan 08, 2013 at 01:42:46PM -0600, Eric Sandeen wrote: > >> On 1/8/13 1:15 PM, Ben Myers wrote: > >>> Hey Eric, > >>> > >>> On Tue, Nov 27, 2012 at 09:19:12PM -0600, Eric Sandeen wrote: > >>>> TBH, I don't know if this is posix-specified, but I found out the > >>>> hard way that when trying to re-create existing files on a readonly > >>>> filesystem, some apps expect/handle EEXIST, but fail on EROFS. > >>>> > >>>> This will test mkdir, mknod, and symlinks for that behavior. > >>>> > >>>> Signed-off-by: Eric Sandeen > >>>> --- > >>>> > >>>> V2: Change test dir var name, do scratch mkfs, drop _fail > >>> > >>> This looked fine to me except that... > >>> > >>>> diff --git a/292.out b/292.out > >>>> new file mode 100644 > >>>> index 0000000..485c567 > >>>> --- /dev/null > >>>> +++ b/292.out > >>>> @@ -0,0 +1,5 @@ > >>>> +QA output created by 292 > >>>> +mknod: `SCRATCH_MNT/292.test/testnode': File exists > >>>> +mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists > >>>> +touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system > >>>> +ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists > >>> > >>> ln output is different on my distro: > >>> > >>> ~/xfstests # diff 293.out 293.out.bad > >>> 5c5 > >>> < ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists > >>> --- > >>>> ln: failed to create symbolic link `SCRATCH_MNT/293.test/testlink': File exists > >> > >> clearly using the wrong distro ;) > >> > >> How about something like: > >> > >> +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch > >> +_scratch_mount -o remount,ro > >> +_create_files 2>&1 | sed -e "s/failed to create/creating/" | _filter_scratch > > > > There should already be a ln filter that handles this. > > > > Check test 103 - filter_ln. > > yeah, it has: -e "s,failed to create,creating," > so I guess it could be moved to common ... *nod* Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Jan 8 15:28:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08LSjxP210491 for ; Tue, 8 Jan 2013 15:28:45 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id D2C9FAC001; Tue, 8 Jan 2013 13:31:38 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 89D994266DC; Tue, 8 Jan 2013 15:31:38 -0600 (CST) Date: Tue, 8 Jan 2013 15:31:38 -0600 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH, -stable RFC] xfs: fix periodic log flushing Message-ID: <20130108213138.GZ27055@sgi.com> References: <20121218221616.GH15182@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121218221616.GH15182@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Dec 19, 2012 at 09:16:16AM +1100, Dave Chinner wrote: > > From: Dave Chinner > > There is a logic inversion in xfssyncd_worker() which means that the > log is not periodically forced or idled correctly. This means that > metadata changes aggregated in memory do not get flushed in a timely > manner, and hence if filesystem is not cleanly unmounted those > changes can be lost. This loss can manifest itself even hours after > the changes were made if the filesystem is left to idle without a > sync() occurring between the last modification and the > crash/shutdown occuring. > > cc: # 3.7, 3.6, 3.5 I agree that this is important for stable kernels 3.5 - 3.7. It looks good to me. Reviewed-by: Ben Myers Regards, Ben > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_sync.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > If people agree the fix is correct, I'll post it to the -stable > list for inclusion... > > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index 9500caf..7bf85e8 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -400,7 +400,7 @@ xfs_sync_worker( > * cancel_delayed_work_sync on this work queue before tearing down > * the ail and the log in xfs_log_unmount. > */ > - if (!(mp->m_super->s_flags & MS_ACTIVE) && > + if ((mp->m_super->s_flags & MS_ACTIVE) && > !(mp->m_flags & XFS_MOUNT_RDONLY)) { > /* dgc: errors ignored here */ > if (mp->m_super->s_writers.frozen == SB_UNFROZEN && > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Jan 8 15:45:45 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r08LjjTB211009 for ; Tue, 8 Jan 2013 15:45:45 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E56428F8064 for ; Tue, 8 Jan 2013 13:48:41 -0800 (PST) X-ASG-Debug-ID: 1357681719-04cb6c05a6b39f50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Adp2pzbXXS9g5Bq1 for ; Tue, 08 Jan 2013 13:48:40 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAfAKyT7FB5LIyU/2dsb2JhbABEt0uFCwKBBRdzgh4BAQQBJxMcIwULCAMUBAklDwUlAyETiBEFtyUUjSGCf2EDlguQSoMI Received: from ppp121-44-140-148.lns20.syd7.internode.on.net (HELO dastard) ([121.44.140.148]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Jan 2013 08:18:39 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tsh2E-0002Av-R1; Wed, 09 Jan 2013 08:48:38 +1100 Date: Wed, 9 Jan 2013 08:48:38 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3.0-stable] xfs: fix xfstest 273 in Linux 3.0-stable Message-ID: <20130108214838.GB3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 3.0-stable] xfs: fix xfstest 273 in Linux 3.0-stable References: <20130104171304.536607409@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130104171304.536607409@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1357681719 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 04, 2013 at 11:13:00AM -0600, Mark Tinguely wrote: > upstream commit: b64dfe4e180ab5047c59bcbe379538eb23be4d8e > Author: Christoph Hellwig > Date: Sun Sep 18 20:40:47 2011 +0000 > > xfs: factor delalloc reservations out of xfs_bmapi > > Move the reservation of delayed allocations, and addition of delalloc > regions to the extent trees into a new helper function. For now > this adds some twisted goto logic to xfs_bmapi, but that will be > cleaned up in the following patches. > > Signed-off-by: Christoph Hellwig > Signed-off-by: Alex Elder > > Ported to Linux 3.0-stable > Signed-off-by: Mark Tinguely > --- > xfstest 273 creates a directory of files created from /dev/zero. It then > creates many threads, and each thread uses /bin/cp to recursively copy the > original directory. > > xfstest 273 has been broken from Linux 2.6.39 commit fd0748 to Linux 3.1 rc1+ > commit b64dfe. The copy fails and leaves an empty file. Changing the original > files from zeros to random values, improves the success rate of the copy. Why? The contents of the files should make no difference to the result as it is opaque. > This patch is a port of patch b64dfe. b64dfe is intended to be refactor patch. > As best that I can tell, the only difference from the original code is the > following if statement is not in the refactor code: > > /* > * Determine state of extent, and the filesystem. > * A wasdelay extent has been initialized, so > * shouldn't be flagged as unwritten. > */ > if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { > if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) > got.br_state = XFS_EXT_UNWRITTEN; > } That code isn't touched by the patch at all - maybe you mean the factored code jumps over it now? However, test 273 doesn't use unwritten extents, so XFS_BMAPI_PREALLOC will never be set and hence this code won't affect the test behaviour, anyway. Hence that doesn't explain whatever problem you are seeing.... > With this patch, xfstest 273 has been working overnight without failure. That may be so, but AFAICT you haven't discovered the root cause of the test failure nor iexplained why this factoring patch seems to fix it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Jan 8 20:52:50 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_32 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r092qo0H223771 for ; Tue, 8 Jan 2013 20:52:50 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC0698F8033 for ; Tue, 8 Jan 2013 18:55:43 -0800 (PST) X-ASG-Debug-ID: 1357700142-04bdf07fae5340e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id CPrlAPY1UqQq6Nnd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 08 Jan 2013 18:55:42 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r092teH7002077 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 9 Jan 2013 02:55:41 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r092te1E007893 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Jan 2013 02:55:40 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r092te3A031658; Tue, 8 Jan 2013 20:55:40 -0600 Received: from [192.168.1.103] (/221.223.99.17) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 08 Jan 2013 18:55:39 -0800 Message-ID: <50ECDC26.1030108@oracle.com> Date: Wed, 09 Jan 2013 10:55:34 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Abhijit Pawar CC: Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> <50EBC8E5.9080200@oracle.com> <50EC37FE.4010009@gmail.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop using simple_strtoul() In-Reply-To: <50EC37FE.4010009@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1357700142 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-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.2.119328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/08/2013 11:15 PM, Abhijit Pawar wrote: > Hi Jeff, > On 01/08/2013 12:51 PM, Jeff Liu wrote: >> Hi Ben and Abhijit, >> >> On 01/08/2013 04:49 AM, Ben Myers wrote: >>> Hey Jeff & Abhijit, >>> >>> On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: >>>> This small patch convert xfs_parseargs() and suffix_strtoul() to >>>> use kstrtoint() instead of simple_strtoul() which is deprecated. >>> >>> It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: >>> remove obsolete simple_strto' which we saw Dec 7. You guys went after the >>> same thing and came up with slightly differing results. If Abhijit would >>> prefer to factor out the xfs changes I'd be happy to take either that, or >>> Jeff's patch, but it would be better if they didn't conflict. Can y'all come >>> to an agreement as to what the xfs changes should be? >> Sorry, I missed that patch from Abhijit. >> >> Looks the previous patch did not replaced the simple_strtoul() with >> kstrtoint() in suffix_strtoul(). >> >> Abhijit, would you like to fix it as well? > Yes,it did not replace the call. Looks like I have missed that piece of > code. Once Ben applies my original patch, I will send another patch for > this on top of that. Btw, on the original patch for XFS, you return a negative value per failure for all those changes in xfs_parseargs(), + rc = kstrtoint(value, 10, &dswidth); + if (rc) + return -EINVAL; However, it should be EINVAL because xfs_fs_fill_super() will end up convert it to be negative. FYI, if we make it to "return EINVAL", checkpatch.pl will show warning message. That's why I didn't check up if kstrtoint() failed or not at this stage on my post, but just proceed to...and those values will be verified at the end of xfs_parseargs(). Thanks, -Jeff From abhi.c.pawar@gmail.com Wed Jan 9 08:02:23 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09E2NHV258906 for ; Wed, 9 Jan 2013 08:02:23 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 887A18F8039 for ; Wed, 9 Jan 2013 06:05:17 -0800 (PST) X-ASG-Debug-ID: 1357740315-04cb6c05a6b6b2a0001-NocioJ Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by cuda.sgi.com with ESMTP id 5gfH4fkEJq45gGQe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 09 Jan 2013 06:05:16 -0800 (PST) X-Barracuda-Envelope-From: abhi.c.pawar@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.41 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] Received: by mail-pa0-f41.google.com with SMTP id bj3so1064647pad.28 for ; Wed, 09 Jan 2013 06:05:15 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer; bh=au1YdFpaUK8ySvChZzjIKS2y68g6yGgfMxlU3acMCx4=; b=Uh45c+WagaVb5q6kF5NoFBmgMfP62TRDiZOtOyd5U6Hw2cTb6G+bxVKtr90i4GhvGV aChAmcHtLyclDhyrjHHx/FztV7R8ZVqe4MYpP0pgIQlAGD4MKCNcwXKmYMsidac7ZZSO 5fjSTDuRIwRLgEPVAFD8Tj3EJD34aCja1F+Lh55X4OJ035vdm5V802jBItr83zpJUmS+ LZIU346FbGXfowubnoHO50ZqIbydLw90AlZ0pbEhXRjo9qq1bawYedJ552BMjSSJfALU EvGEGjbIW57KKIT4NKHQzF8B0y5gZ2fznRQWZ2tjbHcMp2Ugyfb/St60Jh4vtOFK51YR XvPw== X-Received: by 10.68.136.73 with SMTP id py9mr35611577pbb.43.1357740315643; Wed, 09 Jan 2013 06:05:15 -0800 (PST) Received: from apawar-f16.cybage.com ([121.242.40.10]) by mx.google.com with ESMTPS id t6sm8447853paz.11.2013.01.09.06.05.12 (version=SSLv3 cipher=OTHER); Wed, 09 Jan 2013 06:05:14 -0800 (PST) From: Abhijit Pawar To: Ben Myers , jeff.liu@oracle.com Cc: Alex Elder , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, david@fromorbit.com, Abhijit Pawar Subject: [PATCH 1/1] fs/xfs remove obsolete simple_strto Date: Wed, 9 Jan 2013 19:34:42 +0530 X-ASG-Orig-Subj: [PATCH 1/1] fs/xfs remove obsolete simple_strto Message-Id: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> X-Mailer: git-send-email 1.7.7.6 X-Barracuda-Connect: mail-pa0-f41.google.com[209.85.220.41] X-Barracuda-Start-Time: 1357740316 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-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.2.119367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. Signed-off-by: Abhijit Pawar --- fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- 1 files changed, 19 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ab8839b..c407121 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -139,9 +139,9 @@ static const match_table_t tokens = { STATIC unsigned long -suffix_strtoul(char *s, char **endp, unsigned int base) +suffix_kstrtoint(char *s, unsigned int base, int *res) { - int last, shift_left_factor = 0; + int last, shift_left_factor = 0, _res; char *value = s; last = strlen(value) - 1; @@ -158,7 +158,10 @@ suffix_strtoul(char *s, char **endp, unsigned int base) value[last] = '\0'; } - return simple_strtoul((const char *)s, endp, base) << shift_left_factor; + if (kstrtoint(s, base, &_res)) + return -EINVAL; + *res = _res << shift_left_factor; + return 0; } /* @@ -174,7 +177,7 @@ xfs_parseargs( char *options) { struct super_block *sb = mp->m_super; - char *this_char, *value, *eov; + char *this_char, *value; int dsunit = 0; int dswidth = 0; int iosize = 0; @@ -230,14 +233,16 @@ xfs_parseargs( this_char); return EINVAL; } - mp->m_logbufs = simple_strtoul(value, &eov, 10); + if (kstrtoint(value, 10, &mp->m_logbufs)) + return EINVAL; } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } - mp->m_logbsize = suffix_strtoul(value, &eov, 10); + if (suffix_kstrtoint(value, 10, &mp->m_logbsize)) + return EINVAL; } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", @@ -266,7 +271,8 @@ xfs_parseargs( this_char); return EINVAL; } - iosize = simple_strtoul(value, &eov, 10); + if (kstrtoint(value, 10, &iosize)) + return EINVAL; iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { if (!value || !*value) { @@ -274,7 +280,8 @@ xfs_parseargs( this_char); return EINVAL; } - iosize = suffix_strtoul(value, &eov, 10); + if (suffix_kstrtoint(value, 10, &iosize)) + return EINVAL; iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_GRPID) || !strcmp(this_char, MNTOPT_BSDGROUPS)) { @@ -296,14 +303,16 @@ xfs_parseargs( this_char); return EINVAL; } - dsunit = simple_strtoul(value, &eov, 10); + if (kstrtoint(value, 10, &dsunit)) + return EINVAL; } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } - dswidth = simple_strtoul(value, &eov, 10); + if (kstrtoint(value, 10, &dswidth)) + return EINVAL; } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { -- 1.7.7.6 From abhi.c.pawar@gmail.com Wed Jan 9 08:06:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_32,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09E6B9E259131 for ; Wed, 9 Jan 2013 08:06:11 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3F89304039 for ; Wed, 9 Jan 2013 06:09:05 -0800 (PST) X-ASG-Debug-ID: 1357740541-04bdf043105e3f60001-NocioJ Received: from mail-pb0-f47.google.com (mail-pb0-f47.google.com [209.85.160.47]) by cuda.sgi.com with ESMTP id jP9CB35pvJzEMj5b (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 09 Jan 2013 06:09:01 -0800 (PST) X-Barracuda-Envelope-From: abhi.c.pawar@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.47 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.47] Received: by mail-pb0-f47.google.com with SMTP id un1so972754pbc.34 for ; Wed, 09 Jan 2013 06:09:01 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.47] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.47] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=vvFy8xKogUBsh5+J14+Mq+chEA4Ef/w1wKRSJE+ffiQ=; b=WGSTYRM4mowYa9S6xYauEiDZH6LEA/R+26Q4l54E1c8vF3xUTHSbYOt7/+ahrrQ2HI b4o+maeIxeDifqACgpqH2AaS+hRmPf/rQxApbPdv7qmgV3ECdvd1Y87G3PGsq3qt4wrK WHA2VcGPmcG/V0Zr+Gh45bAaNHnnryTulxO6vJvPLHxl3xRfXl0Nm2wW27EOfsVAinl4 0ALYTuY/h166WxKUyHh5oXfGC79jWPeeJex4Vq0L8tajqOw7+0PukOEbrUBJrlyE5RF7 eM5LIIPqKdc5GVQ44PWBQ+nh+OCjyPIaj6KBUUwTKhDrfS3BIMt78FTolM8B5ids5l7I kGdA== X-Received: by 10.66.88.37 with SMTP id bd5mr189860858pab.75.1357740541140; Wed, 09 Jan 2013 06:09:01 -0800 (PST) Received: from [172.27.56.83] ([121.242.40.10]) by mx.google.com with ESMTPS id a9sm7160266pav.24.2013.01.09.06.08.57 (version=SSLv3 cipher=OTHER); Wed, 09 Jan 2013 06:09:00 -0800 (PST) Message-ID: <50ED79EE.7020207@gmail.com> Date: Wed, 09 Jan 2013 19:38:46 +0530 From: Abhijit Pawar User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Jeff Liu CC: Abhijit Pawar , Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop using simple_strtoul() References: <50E8F470.5020305@oracle.com> <20130107204957.GT27055@sgi.com> <50EBC8E5.9080200@oracle.com> <50EC37FE.4010009@gmail.com> <50ECDC26.1030108@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop using simple_strtoul() In-Reply-To: <50ECDC26.1030108@oracle.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pb0-f47.google.com[209.85.160.47] X-Barracuda-Start-Time: 1357740541 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-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.2.119367 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 Hi Jeff, Ben, On 01/09/2013 08:25 AM, Jeff Liu wrote: > On 01/08/2013 11:15 PM, Abhijit Pawar wrote: >> Hi Jeff, >> On 01/08/2013 12:51 PM, Jeff Liu wrote: >>> Hi Ben and Abhijit, >>> >>> On 01/08/2013 04:49 AM, Ben Myers wrote: >>>> Hey Jeff & Abhijit, >>>> >>>> On Sun, Jan 06, 2013 at 11:50:08AM +0800, Jeff Liu wrote: >>>>> This small patch convert xfs_parseargs() and suffix_strtoul() to >>>>> use kstrtoint() instead of simple_strtoul() which is deprecated. >>>> >>>> It looks like Jeff's patch will conflict with a patch from Abhijit Pawar, 'fs: >>>> remove obsolete simple_strto' which we saw Dec 7. You guys went after the >>>> same thing and came up with slightly differing results. If Abhijit would >>>> prefer to factor out the xfs changes I'd be happy to take either that, or >>>> Jeff's patch, but it would be better if they didn't conflict. Can y'all come >>>> to an agreement as to what the xfs changes should be? >>> Sorry, I missed that patch from Abhijit. >>> >>> Looks the previous patch did not replaced the simple_strtoul() with >>> kstrtoint() in suffix_strtoul(). >>> >>> Abhijit, would you like to fix it as well? >> Yes,it did not replace the call. Looks like I have missed that piece of >> code. Once Ben applies my original patch, I will send another patch for >> this on top of that. > Btw, on the original patch for XFS, you return a negative value per > failure for all those changes in xfs_parseargs(), > > + rc = kstrtoint(value, 10, &dswidth); > + if (rc) > + return -EINVAL; > > However, it should be EINVAL because xfs_fs_fill_super() will end up > convert it to be negative. > > FYI, if we make it to "return EINVAL", checkpatch.pl will show warning > message. That's why I didn't check up if kstrtoint() failed or not at > this stage on my post, but just proceed to...and those values will be > verified at the end of xfs_parseargs(). I have posted the patch with addition of the above comments. The email subject says, "[PATCH 1/1] fs/xfs remove obsolete simple_strto". > > > Thanks, > -Jeff > -- - Abhijit From sandeen@sandeen.net Wed Jan 9 10:10:30 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09GAUar002172 for ; Wed, 9 Jan 2013 10:10:30 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 156D98F804C for ; Wed, 9 Jan 2013 08:13:24 -0800 (PST) X-ASG-Debug-ID: 1357748003-04cb6c768a020e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TfmYQ6PKvzrnrMux for ; Wed, 09 Jan 2013 08:13:23 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 954FE65AFC8D; Wed, 9 Jan 2013 10:13:23 -0600 (CST) Message-ID: <50ED9726.4030008@sandeen.net> Date: Wed, 09 Jan 2013 10:13:26 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss CC: Ben Myers Subject: [PATCH] xfstests: move _filter_ln to common.filter References: <50B52DB7.3030506@redhat.com> X-ASG-Orig-Subj: [PATCH] xfstests: move _filter_ln to common.filter In-Reply-To: <50B52DB7.3030506@redhat.com> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357748003 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Move test 103's _filter_ln to common.filter and make it more generic (not depending on 103's pathnames). TBH I've lost my children's treasury of ln failure messages, so I'm not sure this catches all variants; it's hard to work backwards from the existing sed script to what the various outputs were. This works for me but might need more tweaking on other systems. Signed-off-by: Eric Sandeen --- diff --git a/103 b/103 index e383991..a390739 100755 --- a/103 +++ b/103 @@ -54,13 +54,6 @@ _create_scratch() fi } -_filter_ln() -{ - sed -e "s,SCRATCH_MNT/nosymlink/target - Operation not permitted,ln: creating symbolic link \`SCRATCH_MNT/nosymlink/target\' to \`SCRATCH_MNT/nosymlink/source\': Operation not permitted,g" \ - -e "/SCRATCH_MNT.*to.*SCRATCH_MNT/! s,: Operation not permitted, to \`SCRATCH_MNT/nosymlink/source\': Operation not permitted,g" \ - -e "s,failed to create,creating," -} - _filter_noymlinks_flag() { _test_inode_flag nosymlinks $SCRATCH_MNT/nosymlink diff --git a/103.out b/103.out index 45c0aa8..f939bcd 100644 --- a/103.out +++ b/103.out @@ -4,7 +4,7 @@ QA output created by 103 *** testing nosymlinks directories *** setting nosymlinks bit --n-- SCRATCH_MNT/nosymlink -ln: creating symbolic link `SCRATCH_MNT/nosymlink/target' to `SCRATCH_MNT/nosymlink/source': Operation not permitted +ln: creating symbolic link `SCRATCH_MNT/nosymlink/target': Operation not permitted *** 1st listing... SCRATCH_MNT SCRATCH_MNT/nosymlink diff --git a/common.filter b/common.filter index f0f6076..9e4c90c 100644 --- a/common.filter +++ b/common.filter @@ -229,5 +229,12 @@ _filter_spaces() sed -e 's/ [ ]*/ /g' } +# Account for different "ln" failure messages +_filter_ln() +{ + sed -e "s,\(creating symbolic link .*\) to .*: ,\1," \ + -e "s,failed to create,creating," +} + # make sure this script returns success /bin/true From sandeen@sandeen.net Wed Jan 9 10:15:05 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09GF5Oh002453 for ; Wed, 9 Jan 2013 10:15:05 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A992AC008 for ; Wed, 9 Jan 2013 08:17:59 -0800 (PST) X-ASG-Debug-ID: 1357748277-04bdf043125ecd30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id udQcIv9SwuC3ewEP for ; Wed, 09 Jan 2013 08:17:57 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9B1DE65AFC8D; Wed, 9 Jan 2013 10:17:57 -0600 (CST) Message-ID: <50ED9837.8040301@sandeen.net> Date: Wed, 09 Jan 2013 10:17:59 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss CC: Ben Myers Subject: [PATCH 2/2 V3] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50ED9726.4030008@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/2 V3] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem In-Reply-To: <50ED9726.4030008@sandeen.net> X-Enigmail-Version: 1.4.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357748277 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS. This will test mkdir, mknod, and symlinks for that behavior. Signed-off-by: Eric Sandeen --- V2: Change test dir var name, do scratch mkfs, drop _fail V3: Use common _filter_ln diff --git a/293 b/293 new file mode 100755 index 0000000..9013f9a --- /dev/null +++ b/293 @@ -0,0 +1,73 @@ +#! /bin/bash +# FS QA Test No. 293 +# +# Tests for EEXIST (not EROFS) for inode creations, if +# we ask to create an already-existing entity on an RO filesystem +# +#----------------------------------------------------------------------- +# Copyright (c) 2012 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 +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux +_require_scratch + +THIS_TEST_DIR=$SCRATCH_MNT/$seq.test + +_create_files() +{ + mknod $THIS_TEST_DIR/testnode c 1 3 + mkdir $THIS_TEST_DIR/testdir + touch $THIS_TEST_DIR/testtarget + ln -s $THIS_TEST_DIR/testtarget $THIS_TEST_DIR/testlink | _filter_ln +} + +_scratch_mount + +rm -rf $THIS_TEST_DIR +mkdir $THIS_TEST_DIR || _fail "Could not create dir for test" + +_create_files 2>&1 | _filter_scratch +_scratch_mount -o remount,ro || _fail "Could not remount scratch readonly" +_create_files 2>&1 | _filter_scratch + +# success, all done +status=0 +exit diff --git a/293.out b/293.out new file mode 100644 index 0000000..9075d3c --- /dev/null +++ b/293.out @@ -0,0 +1,5 @@ +QA output created by 293 +mknod: `SCRATCH_MNT/293.test/testnode': File exists +mkdir: cannot create directory `SCRATCH_MNT/293.test/testdir': File exists +touch: cannot touch `SCRATCH_MNT/293.test/testtarget': Read-only file system +ln: creating symbolic link `SCRATCH_MNT/293.test/testlink': File exists diff --git a/group b/group index c32839b..1fdae31 100644 --- a/group +++ b/group @@ -411,3 +411,4 @@ deprecated 290 auto rw prealloc quick ioctl 291 repair 292 auto mkfs quick +293 auto quick From putri.trapsiloningrum@studierende.uni-flensburg.de Wed Jan 9 10:37:25 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_60 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09GbO2R003347 for ; Wed, 9 Jan 2013 10:37:25 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36FFAAC006 for ; Wed, 9 Jan 2013 08:40:21 -0800 (PST) X-ASG-Debug-ID: 1357749619-04bdf043105ee2c0001-NocioJ Received: from mx1-ext.campus-flensburg.de (mx1-ext.campus-flensburg.de [193.174.11.243]) by cuda.sgi.com with ESMTP id xvRufwDc4ASE4yI2 for ; Wed, 09 Jan 2013 08:40:20 -0800 (PST) X-Barracuda-Envelope-From: putri.trapsiloningrum@studierende.uni-flensburg.de X-Barracuda-Apparent-Source-IP: 193.174.11.243 Received: from unknown (HELO milkeyway.uni-flensburg.de) ([192.168.153.60]) by mx1-int.campus-flensburg.de with SMTP; 09 Jan 2013 17:40:19 +0100 Received: from smail.uni-flensburg.de ([193.174.11.116]) by milkeyway.uni-flensburg.de ; Wed, 9 Jan 2013 17:19:19 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 09 Jan 2013 17:19:00 +0100 From: Li Hoa To: undisclosed-recipients:; Subject: Partnership Reply-To: X-ASG-Orig-Subj: Partnership Mail-Reply-To: Message-ID: <106fa9260a11c248613ff76207f7e8a4@studierende.uni-flensburg.de> X-Sender: putri.trapsiloningrum@studierende.uni-flensburg.de User-Agent: Roundcube Webmail/0.6 X-Barracuda-Connect: mx1-ext.campus-flensburg.de[193.174.11.243] X-Barracuda-Start-Time: 1357749619 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.20 BSF_SC7_SA298e Custom Rule SA298e -- Greetings, I am Mr. Li Hao, CFO of China Merchants Bank, P.R.C. I have a discreet proposal for you in the tune of 105 Million EUR, after successful transfer, we shall share in the ratio of forty for you and sixty for me. Please reply for specifics. Warmest Li Hao From dave.kleikamp@oracle.com Wed Jan 9 13:56:13 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09JuD7J020517 for ; Wed, 9 Jan 2013 13:56:13 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CAEA3AC005 for ; Wed, 9 Jan 2013 11:59:10 -0800 (PST) X-ASG-Debug-ID: 1357761549-04cbb035a4b37960001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Gt7MRWtkAQLh3dcf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 09 Jan 2013 11:59:09 -0800 (PST) X-Barracuda-Envelope-From: dave.kleikamp@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r09Jx3s7005168 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 9 Jan 2013 19:59:06 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r09Jx2Hj026097 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Jan 2013 19:59:02 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r09Jx1dn010973; Wed, 9 Jan 2013 13:59:01 -0600 Received: from shaggy-t410.oracle.com (/99.156.91.244) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 09 Jan 2013 11:59:01 -0800 Received: by shaggy-t410.oracle.com (Postfix, from userid 1000) id EA1CE24306E; Wed, 9 Jan 2013 13:58:59 -0600 (CST) From: Dave Kleikamp To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Zach Brown , "Maxim V. Patlasov" , Dave Kleikamp , Ben Myers , Alex Elder , xfs@oss.sgi.com Subject: [PATCH V5 25/30] xfs: add support for read_iter and write_iter Date: Wed, 9 Jan 2013 13:58:40 -0600 X-ASG-Orig-Subj: [PATCH V5 25/30] xfs: add support for read_iter and write_iter Message-Id: <1357761525-22718-26-git-send-email-dave.kleikamp@oracle.com> X-Mailer: git-send-email 1.8.1 In-Reply-To: <1357761525-22718-1-git-send-email-dave.kleikamp@oracle.com> References: <1357761525-22718-1-git-send-email-dave.kleikamp@oracle.com> X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1357761549 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-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Dave Kleikamp Cc: Ben Myers Cc: Alex Elder Cc: xfs@oss.sgi.com --- fs/xfs/xfs_file.c | 51 ++++++++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 67284ed..c5d74e8 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -225,10 +225,9 @@ xfs_file_fsync( } STATIC ssize_t -xfs_file_aio_read( +xfs_file_read_iter( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos) { struct file *file = iocb->ki_filp; @@ -249,9 +248,7 @@ xfs_file_aio_read( if (file->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - ret = generic_segment_checks(iovp, &nr_segs, &size, VERIFY_WRITE); - if (ret < 0) - return ret; + size = iov_iter_count(iter); if (unlikely(ioflags & IO_ISDIRECT)) { xfs_buftarg_t *target = @@ -304,7 +301,7 @@ xfs_file_aio_read( trace_xfs_file_read(ip, size, pos, ioflags); - ret = generic_file_aio_read(iocb, iovp, nr_segs, pos); + ret = generic_file_read_iter(iocb, iter, pos); if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); @@ -620,10 +617,9 @@ restart: STATIC ssize_t xfs_file_dio_aio_write( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos, - size_t ocount) + size_t count) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -631,7 +627,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; - size_t count = ocount; int unaligned_io = 0; int iolock; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? @@ -691,8 +686,8 @@ xfs_file_dio_aio_write( } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); - ret = generic_file_direct_write(iocb, iovp, - &nr_segs, pos, &iocb->ki_pos, count, ocount); + ret = generic_file_direct_write_iter(iocb, iter, + pos, &iocb->ki_pos, count); out: xfs_rw_iunlock(ip, iolock); @@ -705,10 +700,9 @@ out: STATIC ssize_t xfs_file_buffered_aio_write( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos, - size_t ocount) + size_t count) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -717,7 +711,6 @@ xfs_file_buffered_aio_write( ssize_t ret; int enospc = 0; int iolock = XFS_IOLOCK_EXCL; - size_t count = ocount; xfs_rw_ilock(ip, iolock); @@ -730,7 +723,7 @@ xfs_file_buffered_aio_write( write_retry: trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); - ret = generic_file_buffered_write(iocb, iovp, nr_segs, + ret = generic_file_buffered_write_iter(iocb, iter, pos, &iocb->ki_pos, count, 0); /* @@ -751,10 +744,9 @@ out: } STATIC ssize_t -xfs_file_aio_write( +xfs_file_write_iter( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos) { struct file *file = iocb->ki_filp; @@ -762,17 +754,15 @@ xfs_file_aio_write( struct inode *inode = mapping->host; struct xfs_inode *ip = XFS_I(inode); ssize_t ret; - size_t ocount = 0; + size_t count = 0; XFS_STATS_INC(xs_write_calls); BUG_ON(iocb->ki_pos != pos); - ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (ret) - return ret; + count = iov_iter_count(iter); - if (ocount == 0) + if (count == 0) return 0; sb_start_write(inode->i_sb); @@ -783,10 +773,9 @@ xfs_file_aio_write( } if (unlikely(file->f_flags & O_DIRECT)) - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, ocount); + ret = xfs_file_dio_aio_write(iocb, iter, pos, count); else - ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, - ocount); + ret = xfs_file_buffered_aio_write(iocb, iter, pos, count); if (ret > 0) { ssize_t err; @@ -1416,8 +1405,8 @@ const struct file_operations xfs_file_operations = { .llseek = xfs_file_llseek, .read = do_sync_read, .write = do_sync_write, - .aio_read = xfs_file_aio_read, - .aio_write = xfs_file_aio_write, + .read_iter = xfs_file_read_iter, + .write_iter = xfs_file_write_iter, .splice_read = xfs_file_splice_read, .splice_write = xfs_file_splice_write, .unlocked_ioctl = xfs_file_ioctl, -- 1.8.1 From MAILER-DAEMON@oss.sgi.com Wed Jan 9 17:25:08 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09NP8Sp033685 for ; Wed, 9 Jan 2013 17:25:08 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 656D38F804C for ; Wed, 9 Jan 2013 15:28:03 -0800 (PST) X-ASG-Debug-ID: 1357774080-04cb6c05a8b85520001-NocioJ Received: from aha.ru (backend28.aha.ru [62.113.86.217]) by cuda.sgi.com with ESMTP id VHiZ3jSpKEM1lOQi for ; Wed, 09 Jan 2013 15:28:01 -0800 (PST) X-Barracuda-Envelope-From: X-Barracuda-Apparent-Source-IP: 62.113.86.217 Subject: Undeliverable mail: Returned mail: Data format error From: X-ASG-Orig-Subj: Undeliverable mail: Returned mail: Data format error To: Date: Thu, 10 Jan 2013 03:27:59 +0400 Message-ID: X-MAPI-Message-Class: REPORT.IPM.Note.NDR MIME-Version: 1.0 Content-Type: multipart/report; report-type="delivery-status"; boundary="_===386529418====backend28.aha.ru===_" X-Barracuda-Connect: backend28.aha.ru[62.113.86.217] X-Barracuda-Start-Time: 1357774080 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com 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=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_SA590, EMPTY_ENV_FROM, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119405 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.00 NO_REAL_NAME From: does not include a real name 0.20 BSF_SC0_SA590 Custom Rule SA590 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message --_===386529418====backend28.aha.ru===_ Content-Type: text/plain; charset="utf-8" Failed to deliver to 'in@mirm.ru' 5.9.9 REJECTED: /export/CGATE/Queue/386529417.msg: Worm.Mydoom-27 FOUND --_===386529418====backend28.aha.ru===_ Content-Type: message/delivery-status Reporting-MTA: dns; backend28.aha.ru Original-Recipient: rfc822; Final-Recipient: system; Action: failed Status: 5.0.0 --_===386529418====backend28.aha.ru===_ Content-Type: text/rfc822-headers Received: from [62.113.100.79] (HELO izenguard-mail-1.zenon.net) by backend28.aha.ru (CommuniGate Pro SMTP 4.3.11) with ESMTP id 386529417 for in@mirm.ru; Thu, 10 Jan 2013 03:27:59 +0400 X-iZenGuard-Host: izenguard-mail-1.zenon.net Received: from izenguard-mail-1.zenon.net (localhost [127.0.0.1]) by izenguard-mail-1.zenon.net (Postfix) with SMTP id 9D2BF1B69 for ; Thu, 10 Jan 2013 03:27:59 +0400 (MSK) Received: from fr42.aha.ru (fr42.aha.ru [62.113.100.42]) by izenguard-mail-1.zenon.net (Postfix) with ESMTP id 9571037789 for ; Thu, 10 Jan 2013 03:27:59 +0400 (MSK) Received: from oss.sgi.com (unknown [202.65.144.114]) by fr42.aha.ru (Postfix) with ESMTP id 176FC171D for ; Thu, 10 Jan 2013 03:27:56 +0400 (MSK) From: xfs@oss.sgi.com To: in@mirm.ru Subject: Returned mail: Data format error Date: Wed, 9 Jan 2013 17:27:49 -0600 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0010_EDB94DF6.B4A135EC" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-Spam-Flag: NO X-DSPAM-Result: Innocent X-DSPAM-Processed: Thu Jan 10 03:27:59 2013 X-DSPAM-Confidence: 0.8395 X-DSPAM-Probability: 0.0000 X-DSPAM-Signature: 2826251,50edfcff5521838126917 Message-ID: --_===386529418====backend28.aha.ru===_-- From david@fromorbit.com Wed Jan 9 17:47:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09NlBtS038241 for ; Wed, 9 Jan 2013 17:47:11 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08FBA304032 for ; Wed, 9 Jan 2013 15:50:05 -0800 (PST) X-ASG-Debug-ID: 1357775403-04bdf043125ffc80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Agdg1y5rBBiqNrvw for ; Wed, 09 Jan 2013 15:50:04 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsUeALsB7lB5LLk3/2dsb2JhbABEhVCxeYUSAoEAF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gYthYUjSaCf2EDlguJToZ8gwg Received: from ppp121-44-185-55.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.55]) by ipmail04.adl6.internode.on.net with ESMTP; 10 Jan 2013 10:20:02 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tt5PF-0005GV-8Z; Thu, 10 Jan 2013 10:50:01 +1100 Date: Thu, 10 Jan 2013 10:50:01 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss , Ben Myers Subject: Re: [PATCH] xfstests: move _filter_ln to common.filter Message-ID: <20130109235001.GD3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: move _filter_ln to common.filter References: <50B52DB7.3030506@redhat.com> <50ED9726.4030008@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50ED9726.4030008@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357775403 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119407 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 09, 2013 at 10:13:26AM -0600, Eric Sandeen wrote: > Move test 103's _filter_ln to common.filter and make > it more generic (not depending on 103's pathnames). > > TBH I've lost my children's treasury of ln failure > messages, so I'm not sure this catches all variants; > it's hard to work backwards from the existing sed script > to what the various outputs were. This works for me > but might need more tweaking on other systems. > > Signed-off-by: Eric Sandeen Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 9 17:47:35 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r09NlZVd038312 for ; Wed, 9 Jan 2013 17:47:35 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06C43AC007 for ; Wed, 9 Jan 2013 15:50:29 -0800 (PST) X-ASG-Debug-ID: 1357775427-04cb6c768a14340001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZLmOHARNRmhEV7k2 for ; Wed, 09 Jan 2013 15:50:28 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsUeALsB7lB5LLk3/2dsb2JhbABEhVCxeYUSAoEAF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gYthYUjSaCf2EDlguQSoMI Received: from ppp121-44-185-55.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.55]) by ipmail04.adl6.internode.on.net with ESMTP; 10 Jan 2013 10:20:27 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tt5Pe-0005Gc-Qt; Thu, 10 Jan 2013 10:50:26 +1100 Date: Thu, 10 Jan 2013 10:50:26 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss , Ben Myers Subject: Re: [PATCH 2/2 V3] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem Message-ID: <20130109235026.GE3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2 V3] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem References: <50B52DB7.3030506@redhat.com> <50ED9726.4030008@sandeen.net> <50ED9837.8040301@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50ED9837.8040301@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357775427 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119407 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 09, 2013 at 10:17:59AM -0600, Eric Sandeen wrote: > TBH, I don't know if this is posix-specified, but I found out the > hard way that when trying to re-create existing files on a readonly > filesystem, some apps expect/handle EEXIST, but fail on EROFS. > > This will test mkdir, mknod, and symlinks for that behavior. > > Signed-off-by: Eric Sandeen > --- Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From Info@mail.org Wed Jan 9 18:30:48 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=BAYES_20,TVD_SPACE_RATIO, TVD_SPACE_RATIO_MINFP autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A0UmKN040342 for ; Wed, 9 Jan 2013 18:30:48 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9FE0AC009 for ; Wed, 9 Jan 2013 16:33:42 -0800 (PST) X-ASG-Debug-ID: 1357778017-04bdf043106010e0001-NocioJ Received: from bic.boseinst.ernet.in (bic.boseinst.ernet.in [14.139.199.26]) by cuda.sgi.com with ESMTP id MiBOT1D6WvPlD8iX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 09 Jan 2013 16:33:40 -0800 (PST) X-Barracuda-Envelope-From: Info@mail.org X-Barracuda-Apparent-Source-IP: 14.139.199.26 Received: from bic.boseinst.ernet.in (localhost [127.0.0.1]) by bic.boseinst.ernet.in (8.12.10/8.12.10) with ESMTP id r0A0i0sM024318; Thu, 10 Jan 2013 06:14:00 +0530 From: "Account" To: undisclosed-recipients: ; Subject: Upgrade Date: Thu, 10 Jan 2013 06:14:00 +0530 X-ASG-Orig-Subj: Upgrade Message-Id: <20130110004400.M87794@mail.org> X-Mailer: Open WebMail 1.81 20030107 X-OriginatingIP: 116.203.98.234 (prerna) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Barracuda-Connect: bic.boseinst.ernet.in[14.139.199.26] X-Barracuda-Start-Time: 1357778019 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-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.2.119409 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- click here https://docs.google.com/spreadsheet/viewform?formkey=dGxIR3NwNnY0aFRTSHBtaDhtQlI4RWc6MQ From alexeyzilber@gmail.com Wed Jan 9 19:21:15 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_43,J_CHICKENPOX_56,T_DKIM_INVALID, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A1LFn9042017 for ; Wed, 9 Jan 2013 19:21:15 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27434304043 for ; Wed, 9 Jan 2013 17:24:10 -0800 (PST) X-ASG-Debug-ID: 1357781045-04cb6c05a5b888f0001-NocioJ Received: from mail-bk0-f45.google.com (mail-bk0-f45.google.com [209.85.214.45]) by cuda.sgi.com with ESMTP id wvPE6RuvnHG7idPv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 09 Jan 2013 17:24:06 -0800 (PST) X-Barracuda-Envelope-From: alexeyzilber@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] Received: by mail-bk0-f45.google.com with SMTP id jk13so6205bkc.32 for ; Wed, 09 Jan 2013 17:24:05 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=z8h136p5VT1RPhOcYaFFAHfo1zeDyO7/9h6Cg7+QZAA=; b=NRwG3tIatYN1o4mpdhtYPjM2014mSSMYASatdcR92cThBhu8CAWaD4pP5g58+BjOvl pcqjyMMF8m/2w8755rV+C6h5c70XBM7gCqmQFr8KkFECUymPTmvIEBzKQnJ0Ugm4VTZZ DrPOHRpq9NjBZQKbzKr2UCeZQndqWP8u/GeICmR6aYGKGCAwxk7VlCqqTh3FYNnTPURe bG6gBng+416q5l6fW0WLo1HEKT9XPc2eigwFQZpXCtF3hItvm4CqQKvI/IIeAMY/mq+a aXZgvcKlW1pJAKGotJEAzW3JSTa4ws32oZeekMvvfKZ9+qA0Bax3jZIBz2QN/LlSDvf8 Lo1g== Received: by 10.204.147.196 with SMTP id m4mr33724934bkv.121.1357781045303; Wed, 09 Jan 2013 17:24:05 -0800 (PST) MIME-Version: 1.0 Received: by 10.204.63.70 with HTTP; Wed, 9 Jan 2013 17:23:45 -0800 (PST) From: Alexey Zilber Date: Thu, 10 Jan 2013 09:23:45 +0800 Message-ID: Subject: Using xfs_growfs on SSD raid-10 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Using xfs_growfs on SSD raid-10 Content-Type: multipart/alternative; boundary=0015174c1bf6e3598e04d2e50842 X-Barracuda-Connect: mail-bk0-f45.google.com[209.85.214.45] X-Barracuda-Start-Time: 1357781046 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-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.2.119413 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 --0015174c1bf6e3598e04d2e50842 Content-Type: text/plain; charset=ISO-8859-1 Hi All, I've read the FAQ on 'How to calculate the correct sunit,swidth values for optimal performance' when setting up xfs on a RAID. Thing is, I'm using LVM, and with the colo company we use, the easiest thing I've found, when adding more space, is to have another RAID added to the system, then I'll just pvcreate, expand the vgroup over it, lvextend and xfs_growfs and I'm done. That is probably sub-optimal on an SSD raid. Here's the example situation. I start off with a 6 (400GB) raid-10. It's got 1M stripe sizes. So I would start with pvcreate --dataalignment 1M /dev/sdb after all the lvm stuff I would do: mkfs.xfs -L mysql -d su=1m,sw=3 /dev/mapper/db-mysql (so the above reflects the 3 active drives, and 1m stripe. So far so good?) Now, I need more space. We have a second raid-10 added, that's 4 (400gb) drives. So I do the same pvcreate --dataalignment 1M /dev/sdc then vgextend and lvextend, and finally; with xfs_growfs, there's no way to specify, change su/sw values. So how do I do this? I'd rather not use mount options, but is that the only way, and would that work? Thanks! Alexey --0015174c1bf6e3598e04d2e50842 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi All,

=A0 I've read the FAQ on 'How to calculate the corre= ct sunit,swidth values for optimal performance' when setting up xfs on = a RAID. =A0Thing is, I'm using LVM, and with the colo company we use, t= he easiest thing I've found, when adding more space, is to have another= RAID added to the system, then I'll just pvcreate, expand the vgroup o= ver it, lvextend and xfs_growfs and I'm done. =A0That is probably sub-o= ptimal on an SSD raid.

Here's the example situation. =A0I start off with a 6 (400GB)= raid-10. =A0It's got 1M stripe sizes. =A0So I would start with pvcreat= e --dataalignment 1M /dev/sdb
after all the lvm stuff I would do:=A0mkfs.xfs -L mysql -d su=3D1m,sw=3D3 /dev/mapper/db-mysql
(so the above reflects the 3 active drives, and 1m = stripe. So far so good?)

Now, I need more space. We have a sec= ond raid-10 added, that's 4 (400gb) drives. So I do the same pv= create --dataalignment 1M /dev/sdc
then vgextend and lvextend, and finally; with xfs_growfs, there's = no way to specify, change su/sw values. =A0So how do I do this? =A0I'd = rather not use mount options, but is that the only way, and would that work= ?

Thanks!
Alexey
--0015174c1bf6e3598e04d2e50842-- From stan@hardwarefreak.com Wed Jan 9 21:18:41 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A3IeEa049423 for ; Wed, 9 Jan 2013 21:18:40 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B947B304032 for ; Wed, 9 Jan 2013 19:21:35 -0800 (PST) X-ASG-Debug-ID: 1357788094-04bdf04310606d00001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id h5Hq9FANH8mslsV6 for ; Wed, 09 Jan 2013 19:21:34 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 2E4B86C0CE; Wed, 9 Jan 2013 21:21:34 -0600 (CST) Message-ID: <50EE33BC.8010403@hardwarefreak.com> Date: Wed, 09 Jan 2013 21:21:32 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Alexey Zilber CC: xfs@oss.sgi.com Subject: Re: Using xfs_growfs on SSD raid-10 References: X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1357788094 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/9/2013 7:23 PM, Alexey Zilber wrote: > Hi All, > > I've read the FAQ on 'How to calculate the correct sunit,swidth values > for optimal performance' when setting up xfs on a RAID. Thing is, I'm > using LVM, and with the colo company we use, the easiest thing I've found, > when adding more space, is to have another RAID added to the system, then > I'll just pvcreate, expand the vgroup over it, lvextend and xfs_growfs and > I'm done. That is probably sub-optimal on an SSD raid. > > Here's the example situation. I start off with a 6 (400GB) raid-10. It's > got 1M stripe sizes. So I would start with pvcreate --dataalignment 1M > /dev/sdb > after all the lvm stuff I would do: mkfs.xfs -L mysql -d su=1m,sw=3 > /dev/mapper/db-mysql > (so the above reflects the 3 active drives, and 1m stripe. So far so good?) > > Now, I need more space. We have a second raid-10 added, that's 4 (400gb) > drives. So I do the same pvcreate --dataalignment 1M /dev/sdc > then vgextend and lvextend, and finally; with xfs_growfs, there's no way to > specify, change su/sw values. So how do I do this? I'd rather not use > mount options, but is that the only way, and would that work? It's now impossible to align the second array. You have a couple of options: 1. Mount with "noalign", but that only affects data, not journal writes 2. Forget LVM and use the old tried and true UNIX method of expansion: create a new XFS on the new array and simply mount it at a suitable place in the tree. 3. Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to match the current array. This would be the obvious and preferred path, assuming you actually mean 1MB STRIP above, not 1MB stripe. If you actually mean 1MB hardware RAID stripe, then the controller would have most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisible by 3. Thus you've told LVM to ship 1MB writes to a device expecting 256KB writes. In that case you've already horribly misaligned your LVM volumes to the hardware stripe, and everything is FUBAR already. You probably want to verify all of your strip/stripe configuration before moving forward. -- Stan From alexeyzilber@gmail.com Wed Jan 9 21:48:12 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_43,J_CHICKENPOX_56,T_DKIM_INVALID, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A3mB3c058787 for ; Wed, 9 Jan 2013 21:48:11 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6113FAC009 for ; Wed, 9 Jan 2013 19:51:09 -0800 (PST) X-ASG-Debug-ID: 1357789863-04cbb035a4b448e0001-NocioJ Received: from mail-bk0-f41.google.com (mail-bk0-f41.google.com [209.85.214.41]) by cuda.sgi.com with ESMTP id g70IHd0V2Z1klP9L (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 09 Jan 2013 19:51:04 -0800 (PST) X-Barracuda-Envelope-From: alexeyzilber@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.41 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] Received: by mail-bk0-f41.google.com with SMTP id jg9so40053bkc.14 for ; Wed, 09 Jan 2013 19:51:03 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=HAYdX2OHBoSBtlBboXU4ackbWtcYx8syr8zlnxBRoTA=; b=ogCyy0IUkRKU0hbirwe5YMQbbx2war8k4GOFeADPGoclWtl8vepPAh55fbtoNYxX6i JI/f2bQUI9LFllKQxfIoUjZNcmYkgcLDcLpZj4haSj9ipZYhbOlonkl/MTFNioggi0jD M21zyluVThBaEv5FoNQ6lfApW2qIQrGel0IjDxQhM0SLb0w62DFYO9SdnbJX8f7UzwnB PNQfr118J26bkph1DcoB9tO7cXXXC2yxGj+DT8qf5Vbg0pMO6HUqwqqV1d26OyVh2w1R HY+bk43nvJvBnIYJbCh7U+N72wp1EODQBRieeSF+0BF2JU3LLYpAnM8NxUqQRxbHTx2k 2OgQ== Received: by 10.204.147.196 with SMTP id m4mr33806774bkv.121.1357789863266; Wed, 09 Jan 2013 19:51:03 -0800 (PST) MIME-Version: 1.0 Received: by 10.204.63.70 with HTTP; Wed, 9 Jan 2013 19:50:42 -0800 (PST) In-Reply-To: <50EE33BC.8010403@hardwarefreak.com> References: <50EE33BC.8010403@hardwarefreak.com> From: Alexey Zilber Date: Thu, 10 Jan 2013 11:50:42 +0800 Message-ID: Subject: Re: Using xfs_growfs on SSD raid-10 To: stan@hardwarefreak.com X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015174c1bf67acc9404d2e7169d X-Barracuda-Connect: mail-bk0-f41.google.com[209.85.214.41] X-Barracuda-Start-Time: 1357789864 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-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119423 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --0015174c1bf67acc9404d2e7169d Content-Type: text/plain; charset=ISO-8859-1 Hi Stan, Please see in-line: On Thu, Jan 10, 2013 at 11:21 AM, Stan Hoeppner wrote: > On 1/9/2013 7:23 PM, Alexey Zilber wrote: > > Hi All, > > > > I've read the FAQ on 'How to calculate the correct sunit,swidth values > > for optimal performance' when setting up xfs on a RAID. Thing is, I'm > > using LVM, and with the colo company we use, the easiest thing I've > found, > > when adding more space, is to have another RAID added to the system, then > > I'll just pvcreate, expand the vgroup over it, lvextend and xfs_growfs > and > > I'm done. That is probably sub-optimal on an SSD raid. > > > > Here's the example situation. I start off with a 6 (400GB) raid-10. > It's > > got 1M stripe sizes. So I would start with pvcreate --dataalignment 1M > > /dev/sdb > > after all the lvm stuff I would do: mkfs.xfs -L mysql -d su=1m,sw=3 > > /dev/mapper/db-mysql > > (so the above reflects the 3 active drives, and 1m stripe. So far so > good?) > > > > Now, I need more space. We have a second raid-10 added, that's 4 (400gb) > > drives. So I do the same pvcreate --dataalignment 1M /dev/sdc > > then vgextend and lvextend, and finally; with xfs_growfs, there's no way > to > > specify, change su/sw values. So how do I do this? I'd rather not use > > mount options, but is that the only way, and would that work? > > It's now impossible to align the second array. You have a couple of > options: > > Only the sw=3 is no longer valid, correct? There's no way to add sw=5? > 1. Mount with "noalign", but that only affects data, not journal writes > Is "noalign" the default when no sw/su option is specified at all? > > 2. Forget LVM and use the old tried and true UNIX method of expansion: > create a new XFS on the new array and simply mount it at a suitable > place in the tree. > > Not a possible solution. The space is for a database and must be contiguous. > 3. Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to > match the current array. This would be the obvious and preferred path, > How is this the obvious and preferred path when I still can't modify the sw value? Same problem. Data loss or reformatting is not the preferred path, it defeats the purpose of using LVM. Also, the potential for data loss by enlarging the raid array is huge. > assuming you actually mean 1MB STRIP above, not 1MB stripe. If you > Stripesize 1MB > actually mean 1MB hardware RAID stripe, then the controller would have > most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisible > by 3. Thus you've told LVM to ship 1MB writes to a device expecting > 256KB writes. In that case you've already horribly misaligned your LVM > volumes to the hardware stripe, and everything is FUBAR already. You > probably want to verify all of your strip/stripe configuration before > moving forward. > I don't believe you're correct here. The SSD Erase Block size for the drives we're using is 1MB. Why does being divisible by 3 matter? Because of the number of drives? Nowhere online have a seen anything about a 768MB+256MB stripe. All the performance info I've seen point to it being the fastest. I'm sure that wouldn't be the case if the controller had to deal with two stripes. So essentially, my take-away here is that xfs_growfs doesn't work properly when adding more logical raid drives? What kind of a performance hit am I looking at if sw is wrong? How about this. If I know that the maximum number of drives I can add is say 20 in a RAID-10. Can I format with sw=10 (even though sw should be 3) in the eventual expectation of expanding it? What would be the downside of doing that? Thanks! > > -- > Stan > > > --0015174c1bf67acc9404d2e7169d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi Stan,

=A0 Please see in-line:

On Thu, Jan 10, 2013 at 11:21 AM, Stan Hoeppner <stan@hard= warefreak.com> wrote:
On 1= /9/2013 7:23 PM, Alexey Zilber wrote:
> Hi All,
>
> =A0 I've read the FAQ on 'How to calculate the correct sunit,s= width values
> for optimal performance' when setting up xfs on a RAID. =A0Thing i= s, I'm
> using LVM, and with the colo company we use, the easiest thing I'v= e found,
> when adding more space, is to have another RAID added to the system, t= hen
> I'll just pvcreate, expand the vgroup over it, lvextend and xfs_gr= owfs and
> I'm done. =A0That is probably sub-optimal on an SSD raid.
>
> Here's the example situation. =A0I start off with a 6 (400GB) raid= -10. =A0It's
> got 1M stripe sizes. =A0So I would start with pvcreate --dataalignment= 1M
> /dev/sdb
> after all the lvm stuff I would do: mkfs.xfs -L mysql -d su=3D1m,sw=3D= 3
> /dev/mapper/db-mysql
> (so the above reflects the 3 active drives, and 1m stripe. So far so g= ood?)
>
> Now, I need more space. We have a second raid-10 added, that's 4 (= 400gb)
> drives. So I do the same pvcreate --dataalignment 1M /dev/sdc
> then vgextend and lvextend, and finally; with xfs_growfs, there's = no way to
> specify, change su/sw values. =A0So how do I do this? =A0I'd rathe= r not use
> mount options, but is that the only way, and would that work?

It's now impossible to align the second array. =A0You have = a couple of
options:


Only the sw=3D3 is no longer valid, co= rrect? =A0There's no way to add sw=3D5?
=A0
1. =A0Mount with "noalign", but that only affects data, not journ= al writes

Is "noalign" the de= fault when no sw/su option is specified at all?
=A0

2. =A0Forget LVM and use the old tried and true UNIX method of expansion: =A0create a new XFS on the new array and simply mount it at a suitable
place in the tree.

Not a possible solution. =A0The space is for a databa= se and must be contiguous.

=A0
3. =A0Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to
match the current array. =A0This would be the obvious and preferred path,

How is this the obvious and preferred pa= th when I still can't modify the sw value? =A0Same problem. =A0Data los= s or reformatting is not the preferred path, it defeats the purpose of usin= g LVM. =A0Also, the potential for data loss by enlarging the raid array is = huge.

=A0
assuming you actually mean 1MB STRIP above, not 1MB stripe. =A0If you

Stripesize 1MB
=A0
actually mean 1MB hardware RAID stripe, then the controller would have
most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisibl= e
by 3. =A0Thus you've told LVM to ship 1MB writes to a device expecting<= br> 256KB writes. =A0In that case you've already horribly misaligned your L= VM
volumes to the hardware stripe, and everything is FUBAR already. =A0You
probably want to verify all of your strip/stripe configuration before
moving forward.

I don't believe you= 're correct here. =A0The SSD Erase Block size for the drives we're = using is 1MB. =A0 Why does being divisible by 3 matter? =A0Because of the n= umber of drives? =A0Nowhere online have a seen anything about a 768MB+256MB= stripe. =A0All the performance info I've seen point to it being the fa= stest. =A0I'm sure that wouldn't be the case if the controller had = to deal with two stripes.


So essentially, my take-away here is tha= t xfs_growfs doesn't work properly when adding more logical raid drives= ? =A0 What kind of a performance hit am I looking at if sw is wrong? =A0How= about this. =A0If I know that the maximum number of drives I can add is sa= y 20 in a RAID-10. =A0Can I format with sw=3D10 (even though sw should be 3= ) in the eventual expectation of expanding it? =A0What would be the downsid= e of doing that?

Thanks!
=A0

--
Stan



--0015174c1bf67acc9404d2e7169d-- From stan@hardwarefreak.com Wed Jan 9 23:46:05 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_41, J_CHICKENPOX_43,J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A5k4DG066146 for ; Wed, 9 Jan 2013 23:46:05 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E59518F8033 for ; Wed, 9 Jan 2013 21:48:59 -0800 (PST) X-ASG-Debug-ID: 1357796939-04cbb035a4b47870001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id XrGCM37mkP6B7XSL for ; Wed, 09 Jan 2013 21:48:59 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id AFCAF6C0B9; Wed, 9 Jan 2013 23:48:58 -0600 (CST) Message-ID: <50EE5649.60608@hardwarefreak.com> Date: Wed, 09 Jan 2013 23:48:57 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Alexey Zilber CC: xfs@oss.sgi.com Subject: Re: Using xfs_growfs on SSD raid-10 References: <50EE33BC.8010403@hardwarefreak.com> X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1357796939 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/9/2013 9:50 PM, Alexey Zilber wrote: > Hi Stan, > > Please see in-line: > > On Thu, Jan 10, 2013 at 11:21 AM, Stan Hoeppner wrote: > >> On 1/9/2013 7:23 PM, Alexey Zilber wrote: >>> Hi All, >>> >>> I've read the FAQ on 'How to calculate the correct sunit,swidth values >>> for optimal performance' when setting up xfs on a RAID. Thing is, I'm >>> using LVM, and with the colo company we use, the easiest thing I've >> found, >>> when adding more space, is to have another RAID added to the system, then >>> I'll just pvcreate, expand the vgroup over it, lvextend and xfs_growfs >> and >>> I'm done. That is probably sub-optimal on an SSD raid. >>> >>> Here's the example situation. I start off with a 6 (400GB) raid-10. >> It's >>> got 1M stripe sizes. So I would start with pvcreate --dataalignment 1M >>> /dev/sdb >>> after all the lvm stuff I would do: mkfs.xfs -L mysql -d su=1m,sw=3 >>> /dev/mapper/db-mysql >>> (so the above reflects the 3 active drives, and 1m stripe. So far so >> good?) >>> >>> Now, I need more space. We have a second raid-10 added, that's 4 (400gb) >>> drives. So I do the same pvcreate --dataalignment 1M /dev/sdc >>> then vgextend and lvextend, and finally; with xfs_growfs, there's no way >> to >>> specify, change su/sw values. So how do I do this? I'd rather not use >>> mount options, but is that the only way, and would that work? >> >> It's now impossible to align the second array. You have a couple of >> options: >> >> > Only the sw=3 is no longer valid, correct? There's no way to add sw=5? You don't have a 5 spindle array. You have a 3 spindle array and a 2 spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. >> 1. Mount with "noalign", but that only affects data, not journal writes > > Is "noalign" the default when no sw/su option is specified at all? No. When no alignment options are specified during creation, neither journal nor data writes are aligned. This mount option acts only on data writes. >> 2. Forget LVM and use the old tried and true UNIX method of expansion: >> create a new XFS on the new array and simply mount it at a suitable >> place in the tree. >> >> Not a possible solution. The space is for a database and must be > contiguous. So you have a single file that is many hundreds of GBs in size, is that correct? If this is the case then XFS alignment does not matter. Writes to existing files are unaligned. Alignment is used during allocation only. And since you're working with a single large file you will likely have few journal writes, so again, alignment isn't a problem. *** Thus, you're fretting over nothing, as alignment doesn't matter for your workload. *** Since we've established this, everything below is for your education, and doesn't necessarily pertain to your expansion project. >> 3. Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to >> match the current array. This would be the obvious and preferred path, > > How is this the obvious and preferred path when I still can't modify the sw > value? It is precisely because you don't specify new su/sw values in this situation, because they haven't changed: you now have two identical arrays glued together with LVM. XFS writes to its allocation groups. Each AG exists on only one RAID array or the other (when setup properly). It is the allocation group that is aligned to the RAID, not the "entire XFS filesystem" as you might see it. Thus, since both arrays have identical su/sw, nothing changes. When you grow the XFS, it simply creates new AGs in the space on the new RAID, and the new AGs are properly aligned automatically, as both arrays are identical. >> assuming you actually mean 1MB STRIP above, not 1MB stripe. If you > > Stripesize 1MB You're telling us something you have not verified, which cannot possibly be correct. Log into the RAID controller firmware and confirm this, or do an mdadm --examine /dev/mdX. It's simply not possible to have a 1MB stripe with 3 devices, because 1,048,576 / 3 = 349,525.3 >> actually mean 1MB hardware RAID stripe, then the controller would have >> most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisible >> by 3. Thus you've told LVM to ship 1MB writes to a device expecting >> 256KB writes. In that case you've already horribly misaligned your LVM >> volumes to the hardware stripe, and everything is FUBAR already. You >> probably want to verify all of your strip/stripe configuration before >> moving forward. > I don't believe you're correct here. This is due to your current lack of knowledge of the technology. > The SSD Erase Block size for the > drives we're using is 1MB. The erase block size of the SSD device is irrelevant. What is relevant is how the RAID controller (or mdraid) is configured. > Why does being divisible by 3 matter? Because > of the number of drives? Because the data is written in strips, one device at a time. Those strips must be divisible by 512 (hardware sector size) and/or 4,096 (filesystem block size). 349,525.3 is not divisible by either. > Nowhere online have a seen anything about a > 768MB+256MB stripe. All the performance info I've seen point to it being > the fastest. I'm sure that wouldn't be the case if the controller had to > deal with two stripes. Maybe you've not explained things correctly. You said you had a 6 drive RAID10, and then added a 4 drive RAID10. That means the controller is most definitely dealing with two stripes. And, from a performance perspective, to a modern controller, two RAID sets is actually better than one, as multiple cores in the RAID ASIC come into play. > So essentially, my take-away here is that xfs_growfs doesn't work properly > when adding more logical raid drives? What kind of a performance hit am I > looking at if sw is wrong? How about this. If I know that the maximum > number of drives I can add is say 20 in a RAID-10. Can I format with sw=10 > (even though sw should be 3) in the eventual expectation of expanding it? > What would be the downside of doing that? xfs_growfs works properly and gives the performance one seeks when the underlying storage layers have been designed and configured properly. Yours hasn't, though it'll probably work well enough given your workload. In your situation, your storage devices are SSDs, with 20-50K+ IOPS and 300-500MB/s throughput, and your application is a large database, which means random unaligned writes and random reads, a workload that doesn't require striping for performance with SSDs. So you might have designed the storage more optimally for your workload, something like this: 1. Create 3 hardware RAID1 mirrors in the controller then concatenate 2. Create your XFS filesystem atop the device with no alignment There is no need for LVM unless you need snapshot capability. This works fine and now you need to expand storage space. So you simply add your 4 SSDs to the controller, creating two more RAID1s and add them to the concatenation. Since you've simply made the disk device bigger from Linux' point of view, all you do now is xfs_growfs and you're done. No alignment issues to fret over, and your performance will be no worse than before, maybe better, as you'll get all the cores in the RAID ASIC into play with so many RAID1s. Now, I'm going to guess that since you mentioned "colo provider" that you may not actually have access to the actual RAID configuration, or that possibly they are giving you "cloud" storage, not direct attached SSDs. In this case you absolutely want to avoid specifying alignment, because the RAID information they are providing you is probably not accurate. Which is probably why you told me "1MB stripe" twice, when we all know for a fact that's impossible. -- Stan From alexeyzilber@gmail.com Thu Jan 10 01:16:41 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_41,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0A7Gfj2072582 for ; Thu, 10 Jan 2013 01:16:41 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 391928F8033 for ; Wed, 9 Jan 2013 23:19:36 -0800 (PST) X-ASG-Debug-ID: 1357802372-04cbb035a7b4adc0001-NocioJ Received: from mail-bk0-f52.google.com (mail-bk0-f52.google.com [209.85.214.52]) by cuda.sgi.com with ESMTP id feNFGqkJH8J8A9D0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 09 Jan 2013 23:19:33 -0800 (PST) X-Barracuda-Envelope-From: alexeyzilber@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.52 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.52] Received: by mail-bk0-f52.google.com with SMTP id w5so89425bku.11 for ; Wed, 09 Jan 2013 23:19:32 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.52] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.52] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=izuB1wmYsymXP/Td7mYT2RGOtVX4v8sr3qSplSFnCXM=; b=C2ngrQcymqkLbb4k/9tsWa932QHzhbt2ngSb8rUkRXen3pLtb/obInphH2nmzxm6aE 2xdv913jfuMzvcQzylCJ9lMvwhFl4Yg/NN8bpJ0Y79XYYQctLKj5H3oTDRQ4NnledEwX gtIWsZ59Tsg5Gmh6OL5XHSK/sUAeAjydCW/Fx2+PCrYP3cils/GVeuAwwesXW39ylmQY 30/b4hoCeF8aqdYE7JEBG381j1Jlq48+WK6RyKcvIrHsORGBnDtb+pXo2eC9W/JL87OZ drXOMg52S5VM7F8WJGLrzh29V2qLJxQNMv26zGJrzpkFC2Uz/DBLrBe8sHe5YCk1aY/X iwkw== Received: by 10.204.12.206 with SMTP id y14mr33882880bky.132.1357802372160; Wed, 09 Jan 2013 23:19:32 -0800 (PST) MIME-Version: 1.0 Received: by 10.204.63.70 with HTTP; Wed, 9 Jan 2013 23:19:12 -0800 (PST) In-Reply-To: <50EE5649.60608@hardwarefreak.com> References: <50EE33BC.8010403@hardwarefreak.com> <50EE5649.60608@hardwarefreak.com> From: Alexey Zilber Date: Thu, 10 Jan 2013 15:19:12 +0800 Message-ID: Subject: Re: Using xfs_growfs on SSD raid-10 To: stan@hardwarefreak.com X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015174c1d14115e1304d2ea0047 X-Barracuda-Connect: mail-bk0-f52.google.com[209.85.214.52] X-Barracuda-Start-Time: 1357802373 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-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119436 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --0015174c1d14115e1304d2ea0047 Content-Type: text/plain; charset=ISO-8859-1 Hi Stan, Thanks for the details btw, really appreciate it. Responses inline below: >> > > Only the sw=3 is no longer valid, correct? There's no way to add sw=5? > > You don't have a 5 spindle array. You have a 3 spindle array and a 2 > spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. > That's correct, but I was going with the description of the sw option as "number of data disks" which is constantly increasing as you're adding disks. I realize that block striping occurs independently within each array, but I do not know how that translates into parity with the way xfs works with the logical disks. How badly does alignment get messed up with you have sw=3 but you have 6 disks? Or vice/versa, if you specify sw=6, but you only have 3 disks? > > >> 1. Mount with "noalign", but that only affects data, not journal writes > > > > Is "noalign" the default when no sw/su option is specified at all? > > No. When no alignment options are specified during creation, neither > journal nor data writes are aligned. This mount option acts only on > data writes. > > >> 2. Forget LVM and use the old tried and true UNIX method of expansion: > >> create a new XFS on the new array and simply mount it at a suitable > >> place in the tree. > >> > >> Not a possible solution. The space is for a database and must be > > contiguous. > > So you have a single file that is many hundreds of GBs in size, is that > correct? If this is the case then XFS alignment does not matter. > Writes to existing files are unaligned. Alignment is used during > allocation only. And since you're working with a single large file you > will likely have few journal writes, so again, alignment isn't a problem. > > *** Thus, you're fretting over nothing, as alignment doesn't matter for > your workload. *** > > Since we've established this, everything below is for your education, > and doesn't necessarily pertain to your expansion project. > It's mostly correct. We're using mysql with innodb_file_per_table, so there's maybe a hundred files or so in a few directories, some quite big. I'm guessing though that that's still not going to be a huge issue. I've actually been using both LVM and XFS on ssd raid without aligning for a while on a few other databases and the performance has been exceptional. I've decided for this round to go deeper into actual alignment to see if I can get extra performance/life out of the drives. > > >> 3. Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to > >> match the current array. This would be the obvious and preferred path, > > > > How is this the obvious and preferred path when I still can't modify the > sw > > value? > > It is precisely because you don't specify new su/sw values in this > situation, because they haven't changed: you now have two identical > arrays glued together with LVM. XFS writes to its allocation groups. > Each AG exists on only one RAID array or the other (when setup > properly). It is the allocation group that is aligned to the RAID, not > the "entire XFS filesystem" as you might see it. Thus, since both > arrays have identical su/sw, nothing changes. When you grow the XFS, it > simply creates new AGs in the space on the new RAID, and the new AGs are > properly aligned automatically, as both arrays are identical. > But both arrays are not identical, ie. the second array has less (or more) drives for example. How does the sw value affect it then? > > >> assuming you actually mean 1MB STRIP above, not 1MB stripe. If you > > > > Stripesize 1MB > > You're telling us something you have not verified, which cannot possibly > be correct. Log into the RAID controller firmware and confirm this, or > do an mdadm --examine /dev/mdX. It's simply not possible to have a 1MB > stripe with 3 devices, because 1,048,576 / 3 = 349,525.3 > # /usr/StorMan/arcconf getconfig 1 LD Logical device number 1 Logical device name : RAID10-B RAID level : 10 Status of logical device : Optimal Size : 1142774 MB Stripe-unit size : 1024 KB Read-cache mode : Enabled MaxCache preferred read cache setting : Disabled MaxCache read cache setting : Disabled Write-cache mode : Enabled (write-back) Write-cache setting : Enabled (write-back) when protected by battery/ZMM Partitioned : No Protected by Hot-Spare : No Bootable : No Failed stripes : No Power settings : Disabled -------------------------------------------------------- Logical device segment information -------------------------------------------------------- Group 0, Segment 0 : Present (Controller:1,Enclosure:0,Slot:2) FG001MMV Group 0, Segment 1 : Present (Controller:1,Enclosure:0,Slot:3) FG001MNW Group 1, Segment 0 : Present (Controller:1,Enclosure:0,Slot:4) FG001MMT Group 1, Segment 1 : Present (Controller:1,Enclosure:0,Slot:5) FG001MNY Group 2, Segment 0 : Present (Controller:1,Enclosure:0,Slot:6) FG001DH8 Group 2, Segment 1 : Present (Controller:1,Enclosure:0,Slot:7) FG001DKK The controller itself is: Adaptec 5805Z According to this article: http://www.pcguide.com/ref/hdd/perf/raid/concepts/perfStripe-c.html "The second important parameter is the *stripe size* of the array, sometimes also referred to by terms such as *block size*, *chunk size*, *stripe length *or *granularity*. This term refers to the size of the stripes written to each disk. RAID arrays that stripe in blocks typically allow the selection of block sizes in kiB ranging from 2 kiB to 512 kiB (or even higher) in powers of two (meaning 2 kiB, 4 kiB, 8 kiB and so on.) Byte-level striping (as in RAID 3) uses a stripe size of one byte or perhaps a small number like 512, usually not selectable by the user." So they're talking about powers of 2, not powers of 3. 1MB would definitely work then. > >> actually mean 1MB hardware RAID stripe, then the controller would have > >> most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisible > >> by 3. Thus you've told LVM to ship 1MB writes to a device expecting > >> 256KB writes. In that case you've already horribly misaligned your LVM > >> volumes to the hardware stripe, and everything is FUBAR already. You > >> probably want to verify all of your strip/stripe configuration before > >> moving forward. > > > I don't believe you're correct here. > > This is due to your current lack of knowledge of the technology. > Please educate me then. Where can I find more information that stripes are calculated by a power of 3? The article above references power of 2. > > > The SSD Erase Block size for the > > drives we're using is 1MB. > > The erase block size of the SSD device is irrelevant. What is relevant > is how the RAID controller (or mdraid) is configured. > Right, but say that 1MB stripe is a single stripe. I'm guessing it would fit within a single erase block? Or should I just use 512k stripes to be safe? > > > Why does being divisible by 3 matter? Because > > of the number of drives? > > Because the data is written in strips, one device at a time. Those > strips must be divisible by 512 (hardware sector size) and/or 4,096 > (filesystem block size). 349,525.3 is not divisible by either. > > > Nowhere online have a seen anything about a > > 768MB+256MB stripe. All the performance info I've seen point to it being > > the fastest. I'm sure that wouldn't be the case if the controller had to > > deal with two stripes. > > Maybe you've not explained things correctly. You said you had a 6 drive > RAID10, and then added a 4 drive RAID10. That means the controller is > most definitely dealing with two stripes. And, from a performance > perspective, to a modern controller, two RAID sets is actually better > than one, as multiple cores in the RAID ASIC come into play. > Ok, so with the original 6 drives, if it's a raid 10, that would give 3 mirrors to stripe into 1 logical drive. Is this where the power of 3 comes from? > > > So essentially, my take-away here is that xfs_growfs doesn't work > properly > > when adding more logical raid drives? What kind of a performance hit > am I > > looking at if sw is wrong? How about this. If I know that the maximum > > number of drives I can add is say 20 in a RAID-10. Can I format with > sw=10 > > (even though sw should be 3) in the eventual expectation of expanding it? > > What would be the downside of doing that? > > xfs_growfs works properly and gives the performance one seeks when the > underlying storage layers have been designed and configured properly. > Yours hasn't, though it'll probably work well enough given your > workload. In your situation, your storage devices are SSDs, with > 20-50K+ IOPS and 300-500MB/s throughput, and your application is a large > database, which means random unaligned writes and random reads, a > workload that doesn't require striping for performance with SSDs. So > you might have designed the storage more optimally for your workload, > something like this: > > 1. Create 3 hardware RAID1 mirrors in the controller then concatenate > 2. Create your XFS filesystem atop the device with no alignment > > There is no need for LVM unless you need snapshot capability. This > works fine and now you need to expand storage space. So you simply add > your 4 SSDs to the controller, creating two more RAID1s and add them to > the concatenation. Since you've simply made the disk device bigger from > Linux' point of view, all you do now is xfs_growfs and you're done. No > alignment issues to fret over, and your performance will be no worse > than before, maybe better, as you'll get all the cores in the RAID ASIC > into play with so many RAID1s. > > Now, I'm going to guess that since you mentioned "colo provider" that > you may not actually have access to the actual RAID configuration, or > that possibly they are giving you "cloud" storage, not direct attached > SSDs. In this case you absolutely want to avoid specifying alignment, > because the RAID information they are providing you is probably not > accurate. Which is probably why you told me "1MB stripe" twice, when we > all know for a fact that's impossible. > > That's a good idea, though I would use LVM for the concatenation. I just don't trust the hardware to concatenate existing disks to more disks, I'd rather leave that up to LVM to handle, AND be able to take snapshots, etc. Thanks Stan, very informative! -Alex -- > Stan > > --0015174c1d14115e1304d2ea0047 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi Stan,

=A0 =A0Thanks for the details btw, r= eally appreciate it. =A0Responses inline below:

>>
> Only the sw=3D3 is no longer valid, correct? =A0There's no way to = add sw=3D5?

You don't have a 5 spindle array. =A0You have a 3 spindle a= rray and a 2
spindle array. =A0Block striping occurs WITHIN an array, not ACROSS arrays.=

That's correct, but I was going wi= th the description of the sw option as "number of data disks" whi= ch is constantly increasing as you're adding disks. =A0I realize that b= lock striping occurs independently within each array, but I do not know how= that translates into parity with the way xfs works with the logical disks.= =A0How badly does alignment get messed up with you have sw=3D3 but you hav= e 6 disks? =A0Or vice/versa, if you specify sw=3D6, but you only have 3 dis= ks?
=A0

>> 1. =A0Mount with "noalign", but that only affects data, = not journal writes
>
> Is "noalign" the default when no sw/su option is specified a= t all?

No. =A0When no alignment options are specified during creation, neith= er
journal nor data writes are aligned. =A0This mount option acts only on
data writes.

>> 2. =A0Forget LVM and use the old tried and true UNIX method of exp= ansion:
>> =A0create a new XFS on the new array and simply mount it at a suit= able
>> place in the tree.
>>
>> Not a possible solution. =A0The space is for a database and must b= e
> contiguous.

So you have a single file that is many hundreds of GBs in size, is th= at
correct? =A0If this is the case then XFS alignment does not matter.
Writes to existing files are unaligned. =A0Alignment is used during
allocation only. =A0And since you're working with a single large file y= ou
will likely have few journal writes, so again, alignment isn't a proble= m.

*** Thus, you're fretting over nothing, as alignment doesn't matter= for
your workload. ***

Since we've established this, everything below is for your education, and doesn't necessarily pertain to your expansion project.

It's mostly correct. =A0We're using mysql w= ith innodb_file_per_table, so there's maybe a hundred files or so in a = few directories, some quite big.
I'm guessing though that that's still not going to be a huge i= ssue. =A0I've actually been using both LVM and XFS on ssd raid without = aligning for a while on a few other databases and the performance has been = exceptional. =A0I've decided for this round to go deeper into actual al= ignment to see if I can get extra performance/life out of the drives.
=A0

>> 3. =A0Add 2 SSDs to the new array and rebuild it as a 6 drive RAID= 10 to
>> match the current array. =A0This would be the obvious and preferre= d path,
>
> How is this the obvious and preferred path when I still can't modi= fy the sw
> value?

It is precisely because you don't specify new su/sw values in thi= s
situation, because they haven't changed: =A0you now have two identical<= br> arrays glued together with LVM. =A0XFS writes to its allocation groups.
Each AG exists on only one RAID array or the other (when setup
properly). =A0It is the allocation group that is aligned to the RAID, not the "entire XFS filesystem" as you might see it. =A0Thus, since b= oth
arrays have identical su/sw, nothing changes. =A0When you grow the XFS, it<= br> simply creates new AGs in the space on the new RAID, and the new AGs are properly aligned automatically, as both arrays are identical.

But both arrays are not identical, ie. the second ar= ray has less (or more) drives for example. =A0How does the sw value affect = it then?

=A0

>> assuming you actually mean 1MB STRIP above, not 1MB stripe. =A0If = you
>
> Stripesize 1MB

You're telling us something you have not verified, which cannot p= ossibly
be correct. =A0Log into the RAID controller firmware and confirm this, or do an mdadm --examine /dev/mdX. =A0It's simply not possible to have a 1= MB
stripe with 3 devices, because 1,048,576 / 3 =3D 349,525.3
=

# /usr/StorMan/arcconf getconfig 1 LD
Lo= gical device number 1
=A0 =A0Logical device name =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0: RAID10-B
=A0 =A0RAID level =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 : 10
=A0 =A0Status of logical device =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 : Optimal
=A0 =A0Size =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 : 1142774 MB
=A0 =A0Stri= pe-unit size =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 : 1024 KB
=A0 =A0Read-cache mode =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0: Enabled
=A0 =A0MaxCache preferred read cache setting =A0 = =A0: Disabled
=A0 =A0MaxCache read cache setting =A0 =A0 =A0 =A0 = =A0 =A0 =A0: Disabled
=A0 =A0Write-cache mode =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 : Enabled (write-back)
=A0 =A0Write-cache setting =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= : Enabled (write-back) when protected by battery/ZMM
=A0 =A0Parti= tioned =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0: No
=A0 =A0Protected by Hot-Spare =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 : N= o
=A0 =A0Bootable =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 : No
=A0 =A0Failed stripes =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 : No
=A0 =A0Power settings =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 : Disabled
=A0 =A0---= -----------------------------------------------------
=A0 =A0Logical device segment information
=A0 =A0-----------= ---------------------------------------------
=A0 =A0Group 0, Seg= ment 0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 : Present (Controller:1,= Enclosure:0,Slot:2) =A0 =A0 =A0 =A0 =A0 =A0 FG001MMV
=A0 =A0Group 0, Segment 1 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = : Present (Controller:1,Enclosure:0,Slot:3) =A0 =A0 =A0 =A0 =A0 =A0 FG001MN= W
=A0 =A0Group 1, Segment 0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 : Present (Controller:1,Enclosure:0,Slot:4) =A0 =A0 =A0 =A0 =A0 =A0= FG001MMT
=A0 =A0Group 1, Segment 1 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = : Present (Controller:1,Enclosure:0,Slot:5) =A0 =A0 =A0 =A0 =A0 =A0 FG001MN= Y
=A0 =A0Group 2, Segment 0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 : Present (Controller:1,Enclosure:0,Slot:6) =A0 =A0 =A0 =A0 =A0 =A0= FG001DH8
=A0 =A0Group 2, Segment 1 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = : Present (Controller:1,Enclosure:0,Slot:7) =A0 =A0 =A0 =A0 =A0 =A0 FG001DK= K


The controller itself is: A= daptec 5805Z


"The second importan= t parameter is the=A0stripe size=A0of the array, sometimes also referred = to by terms such as=A0block size,=A0chunk size,=A0stripe length=A0or= =A0granularity. This term refers to the size of the stripes written to ea= ch disk. RAID arrays that stripe in blocks typically allow the selection of= block sizes in=A0kiB<= /a>= =A0ranging from 2 kiB to 512 kiB (or even higher) in powers of two (meaning= 2 kiB, 4 kiB, 8 kiB and so on.) Byte-level striping (as in=A0RAID 3) uses = a stripe size of one byte or perhaps a small number like 512, usually not s= electable by the user."

So they're talking about powers of 2, not powers of= 3. 1MB would definitely work then. =A0=A0



>> actually mean 1MB hardware RAID stripe, then the controller would = have
>> most likely made a 768KB stripe with 256KB strip, as 1MB isn't= divisible
>> by 3. =A0Thus you've told LVM to ship 1MB writes to a device e= xpecting
>> 256KB writes. =A0In that case you've already horribly misalign= ed your LVM
>> volumes to the hardware stripe, and everything is FUBAR already. = =A0You
>> probably want to verify all of your strip/stripe configuration bef= ore
>> moving forward.

> I don't believe you're correct here.

This is due to your current lack of knowledge of the technology.
<= /blockquote>

Please educate me then. =A0Where can I find= more information that stripes are calculated by a power of 3? The article = above references power of 2.
=A0

> The SSD Erase Block size for the
> drives we're using is 1MB.

The erase block size of the SSD device is irrelevant. =A0What is rele= vant
is how the RAID controller (or mdraid) is configured.
=
Right, but say that 1MB stripe is a single stripe. =A0I'= m guessing it would fit within a single erase block? =A0Or should I just us= e 512k stripes to be safe?

=A0

> Why does being divisible by 3 matter? =A0Because
> of the number of drives?

Because the data is written in strips, one device at a time. =A0Those=
strips must be divisible by 512 (hardware sector size) and/or 4,096
(filesystem block size). =A0349,525.3 is not divisible by either.

> Nowhere online have a seen anything about a
> 768MB+256MB stripe. =A0All the performance info I've seen point to= it being
> the fastest. =A0I'm sure that wouldn't be the case if the cont= roller had to
> deal with two stripes.

Maybe you've not explained things correctly. =A0You said you had = a 6 drive
RAID10, and then added a 4 drive RAID10. =A0That means the controller is most definitely dealing with two stripes. =A0And, from a performance
perspective, to a modern controller, two RAID sets is actually better
than one, as multiple cores in the RAID ASIC come into play.

Ok, so with the original 6 drives, if it's a raid= 10, that would give 3 mirrors to stripe into 1 logical drive.
Is this where the power of 3 comes from?
=A0

> So essentially, my take-away here is that xfs_growfs doesn't work = properly
> when adding more logical raid drives? =A0 What kind of a performance h= it am I
> looking at if sw is wrong? =A0How about this. =A0If I know that the ma= ximum
> number of drives I can add is say 20 in a RAID-10. =A0Can I format wit= h sw=3D10
> (even though sw should be 3) in the eventual expectation of expanding = it?
> =A0What would be the downside of doing that?

xfs_growfs works properly and gives the performance one seeks when th= e
underlying storage layers have been designed and configured properly.
Yours hasn't, though it'll probably work well enough given your
workload. =A0In your situation, your storage devices are SSDs, with
20-50K+ IOPS and 300-500MB/s throughput, and your application is a large database, which means random unaligned writes and random reads, a
workload that doesn't require striping for performance with SSDs. =A0So=
you might have designed the storage more optimally for your workload,
something like this:

1. =A0Create 3 hardware RAID1 mirrors in the controller then concatenate 2. =A0Create your XFS filesystem atop the device with no alignment

There is no need for LVM unless you need snapshot capability. =A0This
works fine and now you need to expand storage space. =A0So you simply add your 4 SSDs to the controller, creating two more RAID1s and add them to
the concatenation. =A0Since you've simply made the disk device bigger f= rom
Linux' point of view, all you do now is xfs_growfs and you're done.= =A0No
alignment issues to fret over, and your performance will be no worse
than before, maybe better, as you'll get all the cores in the RAID ASIC=
into play with so many RAID1s.

Now, I'm going to guess that since you mentioned "colo provider&qu= ot; that
you may not actually have access to the actual RAID configuration, or
that possibly they are giving you "cloud" storage, not direct att= ached
SSDs. =A0In this case you absolutely want to avoid specifying alignment, because the RAID information they are providing you is probably not
accurate. =A0Which is probably why you told me "1MB stripe" twice= , when we
all know for a fact that's impossible.


That's a good idea, though I would use LVM for t= he concatenation. =A0I just don't trust the hardware to concatenate exi= sting disks to more disks, I'd rather leave that up to LVM to handle, A= ND be able to take snapshots, etc.

Thanks Stan, very informative!

-Alex=A0


--
Stan


--0015174c1d14115e1304d2ea0047-- From dsterba@suse.cz Thu Jan 10 07:12:37 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADCbDs092422 for ; Thu, 10 Jan 2013 07:12:37 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 132C9AC007 for ; Thu, 10 Jan 2013 05:15:31 -0800 (PST) X-ASG-Debug-ID: 1357823726-04cbb035a7b5c340001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id sdm552YGBASdY2SF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:15:27 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 1D320A3DDF; Thu, 10 Jan 2013 14:15:26 +0100 (CET) Received: by ds.suse.cz (Postfix, from userid 10065) id AB75ADA7F6; Thu, 10 Jan 2013 14:15:25 +0100 (CET) Date: Thu, 10 Jan 2013 14:15:25 +0100 From: David Sterba To: Koen De Wit Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test for file clone functionality of btrfs ("reflinks") Message-ID: <20130110131525.GE20089@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test for file clone functionality of btrfs ("reflinks") Reply-To: dsterba@suse.cz References: <50C762DA.2090907@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C762DA.2090907@oracle.com> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1357823727 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-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.2.119458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, On Tue, Dec 11, 2012 at 05:44:10PM +0100, Koen De Wit wrote: > Tests included: > - Creating a reflink and overwriting the original contents > - Reflinking a directory tree > - Moving/deleting reflinks > - Diskspace consumption checks > - Cross-filesystem copies (should fail) > - Cross-subvolume copies David did a review and I agree with all of his comments. I have a few suggestions to extend test scope: * check if reflink expectedly fails when it's done on the same filesystem but mounted to 2 different directories (for example bind mount the TEST partition to SCRATCH dir and do the reflinks) * most of the files are very small and will get inlined, this covers only a small range of problems that could arise from reflinks. I'd like to see this included in the initial test version so the test covers majority of the cases and we can add specific corner cases later * larger files allow to test reflinks on files that comprise of interesting mix of holes and data (eg. what happens if I reflink half of hole and data extent at once?), reflink beginning or end of a file to another file david From jeff.liu@oracle.com Thu Jan 10 07:44:58 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADiwre093832 for ; Thu, 10 Jan 2013 07:44:58 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E7F6304043 for ; Thu, 10 Jan 2013 05:47:53 -0800 (PST) X-ASG-Debug-ID: 1357825671-04cbb035a5b5dc80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id GoKKPcftMwaf8MCD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:47:52 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADlpwS017570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:47:51 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADloNd022035 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:47:50 GMT Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADloQq021357 for ; Thu, 10 Jan 2013 07:47:50 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:47:50 -0800 Message-ID: <50EEC680.9040903@oracle.com> Date: Thu, 10 Jan 2013 21:47:44 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation 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: 1357825672 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-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.2.119460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, Here is the v2 patch set of killing hard-coded number 128 which is used to indicate the extra log space reservation for almost all of those transactions. In this round, I also tried to convert some transactions to pre-calculate out the space log reservation from runtime to mount time so that we can make the code related to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically can be ignored. :)) IMHO, which were includes: super block quota flags changes, quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, log super block counters, log super block units/fields, as well as set attributes. Changes of v2 to v1: - use xfs_calc_buf_res() to calulate out the space log reservation per item. Old patches: v1: http://www.spinics.net/lists/xfs/msg15499.html Thanks, -Jeff From jeff.liu@oracle.com Thu Jan 10 07:45:04 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADj4bJ093867 for ; Thu, 10 Jan 2013 07:45:04 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 95BD2304039 for ; Thu, 10 Jan 2013 05:48:02 -0800 (PST) X-ASG-Debug-ID: 1357825680-04bdf04312623c80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 43SCdAjDOTdIvG5Q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:48:01 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADlxKE017668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:48:00 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADlxds007868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:47:59 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADlwCB021428 for ; Thu, 10 Jan 2013 07:47:58 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:47:58 -0800 Message-ID: <50EEC68A.1030306@oracle.com> Date: Thu, 10 Jan 2013 21:47:54 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1357825681 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-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.2.119460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add a helper xfs_calc_buf_res() to calcuate out the space log reservations per item which were got involved in a transaction. It will call the xfs_buf_log_overhead() to figure out the extra space for the struct xfs_buf_log_format that gets written into the log for every buffer as well as a little bit of extra space because there also needs a log opheader, i.e. struct xlog_op_header. Signed-off-by: Jie Liu --- fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06ed520..6c601ea 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -37,14 +37,45 @@ #include "xfs_extent_busy.h" #include "xfs_bmap.h" #include "xfs_quota.h" +#include "xfs_qm.h" #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_log_priv.h" +#include "xfs_buf_item.h" #include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer. Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ + return round_up(sizeof(struct xlog_op_header) + + sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction. size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( + uint nbufs, + uint size) +{ + return nbufs * (size + xfs_buf_log_overhead()); +} /* * Various log reservation values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:45:12 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADjCQW093882 for ; Thu, 10 Jan 2013 07:45:12 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BD0F1304043 for ; Thu, 10 Jan 2013 05:48:10 -0800 (PST) X-ASG-Debug-ID: 1357825688-04cb6c768a37240001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id MvB5cmyzW6moqnUb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:48:09 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADm7wt003495 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:48:08 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADm7Ym028248 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:48:07 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADm7d3008119 for ; Thu, 10 Jan 2013 07:48:07 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:48:06 -0800 Message-ID: <50EEC68F.6070309@oracle.com> Date: Thu, 10 Jan 2013 21:47:59 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c 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: 1357825689 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Start to make use of the new helper to figure out space log reservations for those transactions which are pre-calculated at mount time in xfs_trans.c. Signed-off-by: Jie Liu --- fs/xfs/xfs_trans.c | 244 ++++++++++++++++++++++++---------------------------- 1 file changed, 113 insertions(+), 131 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 6c601ea..0c48fa8 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -116,18 +116,15 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 2))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)))); } /* @@ -179,14 +176,12 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((4 * mp->m_sb.sb_inodesize + - 2 * XFS_DIROP_LOG_RES(mp) + - 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - 3 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 3) + - 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -206,15 +201,12 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize), + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -234,15 +226,12 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize), + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -264,18 +253,18 @@ xfs_calc_symlink_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 1024 + - 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, 1024)), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -298,18 +287,18 @@ xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(0, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -337,16 +326,15 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), - XFS_INODE_CLUSTER_SIZE(mp)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + MAX(xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)), + XFS_INODE_CLUSTER_SIZE(mp) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1))); } /* @@ -374,9 +362,9 @@ STATIC uint xfs_calc_growdata_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize * 3 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -393,12 +381,12 @@ STATIC uint xfs_calc_growrtalloc_reservation( struct xfs_mount *mp) { - return 2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - mp->m_sb.sb_inodesize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -410,7 +398,7 @@ STATIC uint xfs_calc_growrtzero_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_blocksize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); } /* @@ -427,11 +415,10 @@ STATIC uint xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_inodesize + - mp->m_sb.sb_blocksize + - mp->m_rsumsize + - 128 * 5; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); } /* @@ -442,7 +429,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -452,7 +439,7 @@ xfs_calc_swrite_reservation( STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -468,13 +455,13 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize * 2 + - mp->m_dirblksize + - XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -492,14 +479,12 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -517,10 +502,9 @@ xfs_calc_attrset_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - 128 * (2 + XFS_DA_NODE_MAXDEPTH); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); } /* @@ -539,16 +523,14 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_DA_NODE_MAXDEPTH + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -558,7 +540,7 @@ STATIC uint xfs_calc_clear_agi_bucket_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } /* -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:45:20 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADjKJr093900 for ; Thu, 10 Jan 2013 07:45:20 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD954304048 for ; Thu, 10 Jan 2013 05:48:18 -0800 (PST) X-ASG-Debug-ID: 1357825697-04cb6c05a7ba8bb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HQIoHzXWFjukGExv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:48:18 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADmGlQ018097 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:48:17 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADmGSH008527 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:48:16 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADmFbK012086 for ; Thu, 10 Jan 2013 07:48:15 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:48:15 -0800 Message-ID: <50EEC69B.5090708@oracle.com> Date: Thu, 10 Jan 2013 21:48:11 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 03/12] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 03/12] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1357825697 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The transaction log space for clearing/reseting the quota flags is calculated out at runtime. This patch can figure it out at mount time just like some other transactions. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b2bd3a0..b39fa96 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1056,8 +1056,8 @@ xfs_mount_reset_sbqflags( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); xfs_alert(mp, "%s: Superblock update failed!", __func__); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..9e3a03b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -40,6 +40,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtalloc; /* grow realtime allocations */ uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ + uint tr_qm_sbchange; /* change quota flags */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 0c48fa8..ae7b678 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -544,6 +544,17 @@ xfs_calc_clear_agi_bucket_reservation( } /* + * Clearing the quotaflags in the superblock. + * the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -574,6 +585,7 @@ xfs_trans_init( resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); + resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index db05654..4eb1140 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -262,7 +262,7 @@ struct xfs_log_item_desc { (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) - +#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:45:42 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADjgjU094019 for ; Thu, 10 Jan 2013 07:45:42 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC7AB304039 for ; Thu, 10 Jan 2013 05:48:40 -0800 (PST) X-ASG-Debug-ID: 1357825719-04cbb035a7b5dd20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id dcI2KxgUsQq2PJI4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:48:40 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADmdB2018423 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:48:39 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADmcoQ029273 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:48:39 GMT Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADmcmW012422 for ; Thu, 10 Jan 2013 07:48:38 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:48:38 -0800 Message-ID: <50EEC6B2.10801@oracle.com> Date: Thu, 10 Jan 2013 21:48:34 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 04/12] xfs: calculate XFS_QM_SBCHANGE space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 04/12] xfs: calculate XFS_QM_SBCHANGE space log reservation at mount time 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: 1357825719 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For the transaction that write the incore super block quota flags to disk, it reserve the same log space to reset quota flags transaction, so we can use XFS_TRANS_SBCHANGE_LOG_RES() for it as well. Signed-off-by: Jie Liu --- fs/xfs/xfs_qm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 2e86fa0..5745189 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1582,10 +1582,9 @@ xfs_qm_write_sb_changes( int error; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - if ((error = xfs_trans_reserve(tp, 0, - mp->m_sb.sb_sectsize + 128, 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return error; } -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:45:50 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADjoA4094034 for ; Thu, 10 Jan 2013 07:45:50 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 683E3304039 for ; Thu, 10 Jan 2013 05:48:48 -0800 (PST) X-ASG-Debug-ID: 1357825727-04bdf07fae595ca0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FcWRpEpCjdjVglvw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:48:47 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADmkqp018509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:48:46 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADmjYK023658 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:48:46 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADmjfK008576 for ; Thu, 10 Jan 2013 07:48:45 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:48:45 -0800 Message-ID: <50EEC6B9.1090802@oracle.com> Date: Thu, 10 Jan 2013 21:48:41 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 05/12] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 05/12] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time 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: 1357825727 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-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.2.119460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For adjusting quota limits transactions, we calculate out the log space reservation at runtime, this patch make it at mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9e3a03b..cebcb7f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -41,6 +41,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ + uint tr_qm_setqlim; /* adjust quota limits */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..9b25992 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -489,8 +489,9 @@ xfs_qm_scall_setqlim( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_disk_dquot_t) + 128, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index ae7b678..77a45be 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -555,6 +555,17 @@ xfs_calc_qm_sbchange_reservation( } /* + * Adjusting quota limits. + * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -586,6 +597,7 @@ xfs_trans_init( resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); + resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 4eb1140..8f0645a 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -263,6 +263,7 @@ struct xfs_log_item_desc { #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) +#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:09 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADk9SA094053 for ; Thu, 10 Jan 2013 07:46:09 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4D46304039 for ; Thu, 10 Jan 2013 05:49:07 -0800 (PST) X-ASG-Debug-ID: 1357825746-04cbb035a4b5dd60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id MQOVKrkd5t1sdhaa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:06 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADn5Kq004543 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:06 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADn4Z9010031 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:05 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADn4tk008810 for ; Thu, 10 Jan 2013 07:49:04 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:04 -0800 Message-ID: <50EEC6CC.6010603@oracle.com> Date: Thu, 10 Jan 2013 21:49:00 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 06/12] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 06/12] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time 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: 1357825746 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The disk quota allocation log space reservation is calcuated at runtime, this patch change it to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_dquot.c | 12 +++--------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 15 +++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index bf27fcc..96d9aae 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -524,15 +524,9 @@ xfs_qm_dqread( if (flags & XFS_QMOPT_DQALLOC) { tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC); error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp), - XFS_WRITE_LOG_RES(mp) + - /* - * Round the chunklen up to the next multiple - * of 128 (buf log item chunk size)). - */ - BBTOB(mp->m_quotainfo->qi_dqchunklen) - 1 + 128, - 0, - XFS_TRANS_PERM_LOG_RES, - XFS_WRITE_LOG_COUNT); + XFS_QM_DQALLOC_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, + XFS_WRITE_LOG_COUNT); if (error) goto error1; cancelflags = XFS_TRANS_RELEASE_LOG_RES; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index cebcb7f..a52f34c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -42,6 +42,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ + uint tr_qm_dqalloc; /* allocate quota on disk */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 77a45be..d38c3c1 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -566,6 +566,20 @@ xfs_calc_qm_setqlim_reservation( } /* + * Allocating quota on disk if needed. + * the write transaction log space: XFS_WRITE_LOG_RES(mp) + * the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( + struct xfs_mount *mp) +{ + return XFS_WRITE_LOG_RES(mp) + + xfs_calc_buf_res(1, + XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -598,6 +612,7 @@ xfs_trans_init( resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); + resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 8f0645a..3ab1fe6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -264,6 +264,7 @@ struct xfs_log_item_desc { #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) +#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADkINS094076 for ; Thu, 10 Jan 2013 07:46:18 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC37BAC003 for ; Thu, 10 Jan 2013 05:49:16 -0800 (PST) X-ASG-Debug-ID: 1357825755-04bdf0430f623d90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id i7N6jYSKvxmFQxGL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:15 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnEOh004728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:15 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADnEjg017361 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:14 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADnDT7022269 for ; Thu, 10 Jan 2013 07:49:13 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:13 -0800 Message-ID: <50EEC6D5.6050301@oracle.com> Date: Thu, 10 Jan 2013 21:49:09 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 07/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 07/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time 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: 1357825755 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-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.2.119460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of quota off transaction log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 10 +++------- fs/xfs/xfs_trans.c | 14 ++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a52f34c..66b5449 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -43,6 +43,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 9b25992..e4204be 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -671,14 +671,10 @@ xfs_qm_log_quotaoff( uint oldsbqflag=0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); - if ((error = xfs_trans_reserve(tp, 0, - sizeof(xfs_qoff_logitem_t) * 2 + - mp->m_sb.sb_sectsize + 128, - 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) goto error0; - } qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); xfs_trans_log_quotaoff_item(tp, qoffi); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index d38c3c1..16db547 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -580,6 +580,19 @@ xfs_calc_qm_dqalloc_reservation( } /* + * Turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + * the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2 + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -613,6 +626,7 @@ xfs_trans_init( resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3ab1fe6..747e7d8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -265,6 +265,7 @@ struct xfs_log_item_desc { #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:42 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADkfJW094219 for ; Thu, 10 Jan 2013 07:46:41 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45E448F8033 for ; Thu, 10 Jan 2013 05:49:40 -0800 (PST) X-ASG-Debug-ID: 1357825778-04cb6c768a37350001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id DAZf9F57aH6LBkz4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:39 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnc9S019399 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:38 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADnbOF000681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:38 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADnbbA009177 for ; Thu, 10 Jan 2013 07:49:37 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:37 -0800 Message-ID: <50EEC6E5.2020601@oracle.com> Date: Thu, 10 Jan 2013 21:49:25 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 07/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 07/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time 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: 1357825779 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of quota off transaction log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 10 +++------- fs/xfs/xfs_trans.c | 14 ++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a52f34c..66b5449 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -43,6 +43,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 9b25992..e4204be 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -671,14 +671,10 @@ xfs_qm_log_quotaoff( uint oldsbqflag=0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); - if ((error = xfs_trans_reserve(tp, 0, - sizeof(xfs_qoff_logitem_t) * 2 + - mp->m_sb.sb_sectsize + 128, - 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) goto error0; - } qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); xfs_trans_log_quotaoff_item(tp, qoffi); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index d38c3c1..16db547 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -580,6 +580,19 @@ xfs_calc_qm_dqalloc_reservation( } /* + * Turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + * the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2 + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -613,6 +626,7 @@ xfs_trans_init( resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3ab1fe6..747e7d8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -265,6 +265,7 @@ struct xfs_log_item_desc { #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:42 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADkgLB094229 for ; Thu, 10 Jan 2013 07:46:42 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F0754304048 for ; Thu, 10 Jan 2013 05:49:40 -0800 (PST) X-ASG-Debug-ID: 1357825779-04cbb035a4b5de00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2C5n1dZYSW0B4APA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:39 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnciJ019404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:39 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADncq6010908 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:38 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADnbKd013035 for ; Thu, 10 Jan 2013 07:49:37 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:37 -0800 Message-ID: <50EEC6E9.50704@oracle.com> Date: Thu, 10 Jan 2013 21:49:29 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 08/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 08/12] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1357825779 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of end of quotaoff log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 66b5449..c5abd86 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -44,6 +44,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ + uint tr_qm_equotaoff;/* end of turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index e4204be..2b25980 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -638,8 +638,9 @@ xfs_qm_log_quotaoff_end( tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_qoff_logitem_t) * 2, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_END_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 16db547..eb1e9ea 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -593,6 +593,17 @@ xfs_calc_qm_quotaoff_reservation( } /* + * End of turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -627,6 +638,7 @@ xfs_trans_init( resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); + resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 747e7d8..77ccc36 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -266,6 +266,7 @@ struct xfs_log_item_desc { #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:52 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADkqAA094259 for ; Thu, 10 Jan 2013 07:46:52 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B3648F8035 for ; Thu, 10 Jan 2013 05:49:50 -0800 (PST) X-ASG-Debug-ID: 1357825789-04cb6c05a5ba8cc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id k65G2EHz4GyaoqeR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:49 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnmgC019510 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:49 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADnlGJ018314 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:48 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADnl8b013149 for ; Thu, 10 Jan 2013 07:49:47 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:47 -0800 Message-ID: <50EEC6F7.9050904@oracle.com> Date: Thu, 10 Jan 2013 21:49:43 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 10/12] xfs: calculate XFS_TRANS_SB_UNIT space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 10/12] xfs: calculate XFS_TRANS_SB_UNIT space log reservation at mount time 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: 1357825789 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of sync incore superblock units transaction log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index a596705..ac3405e 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1912,8 +1912,8 @@ xfs_mount_log_sb( XFS_SB_VERSIONNUM)); tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SYNC_ICSBUNIT_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index d119a56..7739e24 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -46,6 +46,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_quotaoff; /* turn quota off */ uint tr_qm_equotaoff;/* end of turn quota off */ uint tr_sicsbcount; /* sync incore super block counters */ + uint tr_sicsbunit; /* sync incore super block units */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index ae48a8d..079ded8 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -616,6 +616,17 @@ xfs_calc_sync_icsbcount_reservation( } /* + * Logging changes to the superblock unit and width fields. + * the first super block to reflected the changes: sector size + */ +STATIC uint +xfs_calc_sync_icsbunit_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -652,6 +663,7 @@ xfs_trans_init( resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); resp->tr_sicsbcount = xfs_calc_sync_icsbcount_reservation(mp); + resp->tr_sicsbunit = xfs_calc_sync_icsbunit_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 637f59b..d2f0007 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -268,6 +268,7 @@ struct xfs_log_item_desc { #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) #define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) #define XFS_SYNC_ICSBCOUNT_LOG_RES(mp) ((mp)->m_reservations.tr_sicsbcount) +#define XFS_SYNC_ICSBUNIT_LOG_RES(mp) ((mp)->m_reservations.tr_sicsbunit) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADku51094273 for ; Thu, 10 Jan 2013 07:46:56 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0A1A08F8033 for ; Thu, 10 Jan 2013 05:49:55 -0800 (PST) X-ASG-Debug-ID: 1357825786-04bdf04312623e30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4DAsnhTrRLtIC5pD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:46 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnj27019469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:46 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADnih3011090 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:45 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADnie7022580 for ; Thu, 10 Jan 2013 07:49:44 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:44 -0800 Message-ID: <50EEC6F3.5090303@oracle.com> Date: Thu, 10 Jan 2013 21:49:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 09/12] xfs: calculate XFS_TRNAS_SB_COUNT space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 09/12] xfs: calculate XFS_TRNAS_SB_COUNT space log reservation at mount time Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1357825786 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of sync incore superblock counters transaction log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 13 +++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b39fa96..a596705 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1550,8 +1550,8 @@ xfs_log_sbcount(xfs_mount_t *mp) return 0; tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SYNC_ICSBCOUNT_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index c5abd86..d119a56 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -45,6 +45,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ uint tr_qm_equotaoff;/* end of turn quota off */ + uint tr_sicsbcount; /* sync incore super block counters */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index eb1e9ea..ae48a8d 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -604,6 +604,18 @@ xfs_calc_qm_quotaoff_end_reservation( } /* + * Syncing the incore super block counters to disk. + * the super block to reflect the allocated inodes, + * free inodes/free data blocks: sector size + */ +STATIC uint +xfs_calc_sync_icsbcount_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -639,6 +651,7 @@ xfs_trans_init( resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); + resp->tr_sicsbcount = xfs_calc_sync_icsbcount_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 77ccc36..637f59b 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -267,6 +267,7 @@ struct xfs_log_item_desc { #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) #define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) +#define XFS_SYNC_ICSBCOUNT_LOG_RES(mp) ((mp)->m_reservations.tr_sicsbcount) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:46:59 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADkxV2094289 for ; Thu, 10 Jan 2013 07:46:59 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB9888F8033 for ; Thu, 10 Jan 2013 05:49:57 -0800 (PST) X-ASG-Debug-ID: 1357825796-04cbb035a5b5de40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HLjJEJSGxfxp5oEr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:49:56 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADnt9x019670 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:49:56 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADntWL001166 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:49:55 GMT Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADntZh009376 for ; Thu, 10 Jan 2013 07:49:55 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:49:55 -0800 Message-ID: <50EEC6FE.4010702@oracle.com> Date: Thu, 10 Jan 2013 21:49:50 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 11/12] xfs: calculate XFS_TRANS_DUMMY1 space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 11/12] xfs: calculate XFS_TRANS_DUMMY1 space log reservation at mount time 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: 1357825796 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of log dummy1 transaction space log reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_fsops.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 4beaede..7649d26 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -662,8 +662,8 @@ xfs_fs_log_dummy( int error; tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_LOG_DUMMY1_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7739e24..97f7962 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -47,6 +47,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_equotaoff;/* end of turn quota off */ uint tr_sicsbcount; /* sync incore super block counters */ uint tr_sicsbunit; /* sync incore super block units */ + uint tr_logdummy1; /* log a dummy trans */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 079ded8..398c2a0 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -627,6 +627,17 @@ xfs_calc_sync_icsbunit_reservation( } /* + * Dumping a transaction into the log that contains no real change. + * sector size + */ +STATIC uint +xfs_calc_logdummy1_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -664,6 +675,7 @@ xfs_trans_init( resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); resp->tr_sicsbcount = xfs_calc_sync_icsbcount_reservation(mp); resp->tr_sicsbunit = xfs_calc_sync_icsbunit_reservation(mp); + resp->tr_logdummy1 = xfs_calc_logdummy1_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index d2f0007..69a05a2 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -269,6 +269,7 @@ struct xfs_log_item_desc { #define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) #define XFS_SYNC_ICSBCOUNT_LOG_RES(mp) ((mp)->m_reservations.tr_sicsbcount) #define XFS_SYNC_ICSBUNIT_LOG_RES(mp) ((mp)->m_reservations.tr_sicsbunit) +#define XFS_LOG_DUMMY1_LOG_RES(mp) ((mp)->m_reservations.tr_logdummy1) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 10 07:47:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_73,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ADl7Qd094308 for ; Thu, 10 Jan 2013 07:47:07 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91932304043 for ; Thu, 10 Jan 2013 05:50:05 -0800 (PST) X-ASG-Debug-ID: 1357825803-04bdf0430f623e60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id SspQPurezSKHTH8l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 05:50:04 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ADo2Ss020027 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 13:50:03 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ADo2KD018670 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 13:50:02 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ADo2Au022857 for ; Thu, 10 Jan 2013 07:50:02 -0600 Received: from [192.168.1.103] (/114.248.194.225) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 05:50:01 -0800 Message-ID: <50EEC705.5050407@oracle.com> Date: Thu, 10 Jan 2013 21:49:57 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 12/12] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 12/12] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET 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: 1357825804 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-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.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently, we calculate the attribute set transaction log space reservation at runtime in two parts: 1) XFS_ATTRSET_LOG_RES() which is calcuated out at mount time. 2) ((ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))) which is calculated out at runtime since it depend on the extent length in blocks. This patch change the XFS_ATTRSET_LOG_RES(mp) to XFS_ATTRSETM_LOG_RES(mp) that it is still figured out at mount time, and introduce a new XFS_ATTRSETRT_LOG_RES(mp) which would be used to calculate out the unit of the log space reservation for one block. Then we can get the runtime spaces via: XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * ext, so that we don't need to export the xfs_calc_buf_res() function. Signed-off-by: Jie Liu --- fs/xfs/xfs_attr.c | 9 ++++++--- fs/xfs/xfs_mount.h | 3 ++- fs/xfs/xfs_trans.c | 28 ++++++++++++++++++++++++---- fs/xfs/xfs_trans.h | 11 ++++------- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 0ca1f0b..20d114e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -300,9 +300,12 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(args.trans, args.total, - XFS_ATTRSET_LOG_RES(mp, args.total), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) { + error = xfs_trans_reserve(args.trans, args.total, + XFS_ATTRSETM_LOG_RES(mp) + + XFS_ATTRSETRT_LOG_RES(mp) * args.total, + 0, XFS_TRANS_PERM_LOG_RES, + XFS_ATTRSET_LOG_COUNT); + if (error) { xfs_trans_cancel(args.trans, 0); return(error); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 97f7962..5727b37 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -34,7 +34,8 @@ typedef struct xfs_trans_reservations { uint tr_addafork; /* cvt inode to attributed trans */ uint tr_writeid; /* write setuid/setgid file */ uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrset; /* set/create an attribute */ + uint tr_attrsetm; /* set/create an attribute at mount time */ + uint tr_attrsetrt; /* set/create an attribute at runtime */ uint tr_attrrm; /* remove an attribute */ uint tr_clearagi; /* clear bad agi unlinked ino bucket */ uint tr_growrtalloc; /* grow realtime allocations */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 398c2a0..4e9e2d3 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -488,17 +488,18 @@ xfs_calc_attrinval_reservation( } /* - * Setting an attribute. + * Setting an attribute at mount time. * the inode getting the attribute * the superblock for allocations * the agfs extents are allocated from * the attribute btree * max depth * the inode allocation btree * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below). */ STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + @@ -508,6 +509,24 @@ xfs_calc_attrset_reservation( } /* + * Setting an attribute at runtime, transaction space unit per block. + * the superblock for allocations: sector size + * the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1)); +} + +/* * Removing an attribute. * the inode: inode size * the attribute btree could join: max depth * block size @@ -662,7 +681,8 @@ xfs_trans_init( resp->tr_writeid = xfs_calc_writeid_reservation(mp); resp->tr_addafork = xfs_calc_addafork_reservation(mp); resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrset = xfs_calc_attrset_reservation(mp); + resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 69a05a2..466c6f7 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -252,15 +252,12 @@ struct xfs_log_item_desc { * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSET_LOG_RES(mp, ext) \ - ((mp)->m_reservations.tr_attrset + \ - (ext * (mp)->m_sb.sb_sectsize) + \ - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) -- 1.7.9.5 From dsterba@suse.cz Thu Jan 10 08:09:47 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AE9lom095291 for ; Thu, 10 Jan 2013 08:09:47 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93EB1304039 for ; Thu, 10 Jan 2013 06:12:42 -0800 (PST) X-ASG-Debug-ID: 1357827160-04bdf07fae5971a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id jd6whQFCEfURMWNd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Jan 2013 06:12:41 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id AF024A3CEE; Thu, 10 Jan 2013 15:12:39 +0100 (CET) Received: by ds.suse.cz (Postfix, from userid 10065) id 52874DA7F6; Thu, 10 Jan 2013 15:12:39 +0100 (CET) Date: Thu, 10 Jan 2013 15:12:39 +0100 From: David Sterba To: Liu Bo Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: fix 284 ENOENT error Message-ID: <20130110141239.GF20089@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix 284 ENOENT error Reply-To: dsterba@suse.cz References: <1357482638-27129-1-git-send-email-liub.liubo@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357482638-27129-1-git-send-email-liub.liubo@gmail.com> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1357827160 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-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_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC7_SA298e Custom Rule SA298e On Sun, Jan 06, 2013 at 10:30:38PM +0800, Liu Bo wrote: > 284 misses a 'mkdir' operation. > > Signed-off-by: Liu Bo Tested-by: David Sterba From eguan@redhat.com Thu Jan 10 10:32:01 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AGW1Tr100330 for ; Thu, 10 Jan 2013 10:32:01 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15CA3304064 for ; Thu, 10 Jan 2013 08:34:56 -0800 (PST) X-ASG-Debug-ID: 1357835696-04cbb035a6b672f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Q2VWsedrX6cBgcIY for ; Thu, 10 Jan 2013 08:34:56 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0AGYtQm017018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 11:34:55 -0500 Received: from localhost (dhcp12-106.nay.redhat.com [10.66.12.106] (may be forged)) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0AGYsbB018189; Thu, 10 Jan 2013 11:34:55 -0500 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress Date: Fri, 11 Jan 2013 00:34:24 +0800 X-ASG-Orig-Subj: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress Message-Id: <1357835665-15621-1-git-send-email-eguan@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: 1357835696 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Run 1000 fsstress processes and freeze/unfreeze file system randomly. Signed-off-by: Eryu Guan --- 293 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 293.out | 4 +++ group | 1 + 3 files changed, 93 insertions(+) create mode 100755 293 create mode 100644 293.out diff --git a/293 b/293 new file mode 100755 index 0000000..a360e9c --- /dev/null +++ b/293 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 293 +# +# Test freeze/unfreeze file system randomly under fsstress +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=eguan@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os IRIX Linux + +_require_scratch +_require_freeze + +_scratch_unmount >/dev/null 2>&1 +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount >/dev/null 2>&1 + +TESTDIR="$SCRATCH_MNT/testdir" +mkdir -p $TESTDIR +rm -f $seq.full + +echo "Start fsstress" | tee -a $seq.full +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & +FSSTRESS_PID=$! +sleep 1 + +# Freeze/unfreeze file system randomly +NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` +echo "Start freeze/unfreeze randomly" | tee -a $seq.full +while [ $NR_FSSTRESS -gt 0 ];do + TIMEOUT=`expr $RANDOM % 5` + sleep $TIMEOUT + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -f $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: freeze filesystem failed" + fi + TIMEOUT=`expr $RANDOM % 3` + sleep $TIMEOUT + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -u $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: unfreeze filesystem failed" + fi + NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` +done +echo "Test done" | tee -a $seq.full + +_check_scratch_fs +status=0 +exit diff --git a/293.out b/293.out new file mode 100644 index 0000000..2a60ab7 --- /dev/null +++ b/293.out @@ -0,0 +1,4 @@ +QA output created by 293 +Start fsstress +Start freeze/unfreeze randomly +Test done diff --git a/group b/group index c32839b..f9c697a 100644 --- a/group +++ b/group @@ -411,3 +411,4 @@ deprecated 290 auto rw prealloc quick ioctl 291 repair 292 auto mkfs quick +293 auto freeze dangerous -- 1.7.11.7 From eguan@redhat.com Thu Jan 10 10:32:03 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AGW3Qr100337 for ; Thu, 10 Jan 2013 10:32:03 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CFAA304064 for ; Thu, 10 Jan 2013 08:35:01 -0800 (PST) X-ASG-Debug-ID: 1357835700-04cb6c05a8bb2750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hZXZ8z8e8IFWmLEx for ; Thu, 10 Jan 2013 08:35:01 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0AGZ0VW017051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 11:35:00 -0500 Received: from localhost (dhcp12-106.nay.redhat.com [10.66.12.106] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0AGYxth020767; Thu, 10 Jan 2013 11:34:59 -0500 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock Date: Fri, 11 Jan 2013 00:34:25 +0800 X-ASG-Orig-Subj: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock Message-Id: <1357835665-15621-2-git-send-email-eguan@redhat.com> In-Reply-To: <1357835665-15621-1-git-send-email-eguan@redhat.com> References: <1357835665-15621-1-git-send-email-eguan@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: 1357835700 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Test case is based on 293 and make xfs with mkfs command mkfs.xfs -f -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b $SCRATCH_DEV Regression test case for commit 437a255 xfs: fix direct IO nested transaction deadlock. Signed-off-by: Eryu Guan --- 294 | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 294.out | 4 +++ group | 1 + 3 files changed, 95 insertions(+) create mode 100755 294 create mode 100644 294.out diff --git a/294 b/294 new file mode 100755 index 0000000..817b877 --- /dev/null +++ b/294 @@ -0,0 +1,90 @@ +#! /bin/bash +# FS QA Test No. 294 +# +# Test freeze/unfreeze file system randomly under fsstress +# Based on 293, regression test for commit: +# 437a255 xfs: fix direct IO nested transaction deadlock. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=eguan@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os IRIX Linux + +_require_scratch +_require_freeze + +_scratch_unmount >/dev/null 2>&1 +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 +_scratch_mount >/dev/null 2>&1 + +TESTDIR="$SCRATCH_MNT/testdir" +mkdir -p $TESTDIR +rm -f $seq.full + +echo "Start fsstress" | tee -a $seq.full +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & +FSSTRESS_PID=$! +sleep 1 + +# Freeze/unfreeze file system randomly +NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` +echo "Start freeze/unfreeze randomly" | tee -a $seq.full +while [ $NR_FSSTRESS -gt 0 ];do + TIMEOUT=`expr $RANDOM % 5` + sleep $TIMEOUT + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -f $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: freeze filesystem failed" + fi + TIMEOUT=`expr $RANDOM % 3` + sleep $TIMEOUT + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -u $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: unfreeze filesystem failed" + fi + NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` +done +echo "Test done" | tee -a $seq.full + +_check_scratch_fs +status=0 +exit diff --git a/294.out b/294.out new file mode 100644 index 0000000..2ccaa6e --- /dev/null +++ b/294.out @@ -0,0 +1,4 @@ +QA output created by 294 +Start fsstress +Start freeze/unfreeze randomly +Test done diff --git a/group b/group index f9c697a..0c6d158 100644 --- a/group +++ b/group @@ -412,3 +412,4 @@ deprecated 291 repair 292 auto mkfs quick 293 auto freeze dangerous +294 auto freeze dangerous -- 1.7.11.7 From sandeen@redhat.com Thu Jan 10 10:38:55 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AGctpD100682 for ; Thu, 10 Jan 2013 10:38:55 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 282A58F8064 for ; Thu, 10 Jan 2013 08:41:51 -0800 (PST) X-ASG-Debug-ID: 1357836110-04cbb035a6b67a10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0Lre085irnbkK5jm for ; Thu, 10 Jan 2013 08:41:50 -0800 (PST) X-Barracuda-Envelope-From: sandeen@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 r0AGfnIh015843 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Jan 2013 11:41:50 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0AGfmpm020944 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 10 Jan 2013 11:41:49 -0500 Message-ID: <50EEEF4C.8040801@redhat.com> Date: Thu, 10 Jan 2013 10:41:48 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs-oss CC: Dave Chinner , Dave Jones Subject: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block X-Enigmail-Version: 1.4.6 X-ASG-Orig-Subj: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1357836110 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Dave Jones hit this assert when doing a compile on recent git, with CONFIG_XFS_DEBUG enabled: XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) contained "2" and not the proper offset, and I found that this value was changed after the memmoves under "Use a stale leaf for our new entry." in xfs_dir2_block_addname(), i.e. memmove(&blp[mid + 1], &blp[mid], (highstale - mid) * sizeof(*blp)); overwrote it. What has happened is that the previous call to xfs_dir2_block_compact() has rearranged things; it changes btp->count as well as the blp array. So after we make that call, we must recalculate the proper pointer to the leaf entries by making another call to xfs_dir2_block_leaf_p(). Dave provided a metadump image which led to a simple reproducer (create a particular filename in the affected directory) and this resolves the testcase as well as the bug on his live system. Thanks also to dchinner for looking at this one with me. Signed-off-by: Eric Sandeen Tested-by: Dave Jones --- diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7536faa..12afe07 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -355,10 +355,12 @@ xfs_dir2_block_addname( /* * If need to compact the leaf entries, do it now. */ - if (compact) + if (compact) { xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); - else if (btp->stale) { + /* recalculate blp post-compaction */ + blp = xfs_dir2_block_leaf_p(btp); + } else if (btp->stale) { /* * Set leaf logging boundaries to impossible state. * For the no-stale case they're set explicitly. From stan@hardwarefreak.com Thu Jan 10 15:26:38 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_41 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0ALQcFn109308 for ; Thu, 10 Jan 2013 15:26:38 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 647A8AC00F for ; Thu, 10 Jan 2013 13:29:35 -0800 (PST) X-ASG-Debug-ID: 1357853370-04cb6c05a7bc98a0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id lcaiMVsjdMzd9L8Q for ; Thu, 10 Jan 2013 13:29:31 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id CC0C66C0B9; Thu, 10 Jan 2013 15:29:30 -0600 (CST) Message-ID: <50EF32B9.1040608@hardwarefreak.com> Date: Thu, 10 Jan 2013 15:29:29 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Alexey Zilber CC: xfs@oss.sgi.com Subject: Re: Using xfs_growfs on SSD raid-10 References: <50EE33BC.8010403@hardwarefreak.com> <50EE5649.60608@hardwarefreak.com> X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1357853371 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/10/2013 1:19 AM, Alexey Zilber wrote: > Hi Stan, > > Thanks for the details btw, really appreciate it. Responses inline > below: > > >> >>> Only the sw=3 is no longer valid, correct? There's no way to add sw=5? >> >> You don't have a 5 spindle array. You have a 3 spindle array and a 2 >> spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. >> > > That's correct, but I was going with the description of the sw option as > "number of data disks" which is constantly increasing as you're adding That is correct. But "data disks" is in the context of a single striped array. Remember, what you're doing here is aligning XFS write out to the stripe size of the array. > disks. I realize that block striping occurs independently within each > array, but I do not know how that translates into parity with the way xfs > works with the logical disks. The takeaway here is this: If you concatenate two or more striped arrays together with a single XFS atop, you must use identical arrays, or at least arrays with the same overall stripe size. Otherwise you cannot achieve or maintain alignment with XFS. > How badly does alignment get messed up with > you have sw=3 but you have 6 disks? Or vice/versa, if you specify sw=6, > but you only have 3 disks? Instead of attempting to figure out how bad a wrong configuration is, which is impossible, let's concentrate on how to do proper configurations. > It's mostly correct. We're using mysql with innodb_file_per_table, so > there's maybe a hundred files or so in a few directories, some quite big. > I'm guessing though that that's still not going to be a huge issue. I've > actually been using both LVM and XFS on ssd raid without aligning for a > while on a few other databases and the performance has been exceptional. With a database workload it's probably best to not align the XFS, especially if you intend to expand storage the way you have been. > I've decided for this round to go deeper into actual alignment to see if I > can get extra performance/life out of the drives. But you made this decision before knowing that XFS only does alignment during allocation or writing to the journal. And your workload does no aligned writes. So not only did you gain nothing by aligning here, but you've caused yourself some grief. On the plus side, you're learning much valuable information about RAID and XFS. >>>> 3. Add 2 SSDs to the new array and rebuild it as a 6 drive RAID10 to >>>> match the current array. This would be the obvious and preferred path, >>> >>> How is this the obvious and preferred path when I still can't modify the >> sw >>> value? >> >> It is precisely because you don't specify new su/sw values in this >> situation, because they haven't changed: you now have two identical >> arrays glued together with LVM. XFS writes to its allocation groups. >> Each AG exists on only one RAID array or the other (when setup >> properly). It is the allocation group that is aligned to the RAID, not >> the "entire XFS filesystem" as you might see it. Thus, since both >> arrays have identical su/sw, nothing changes. When you grow the XFS, it >> simply creates new AGs in the space on the new RAID, and the new AGs are >> properly aligned automatically, as both arrays are identical. >> > > But both arrays are not identical, ie. the second array has less (or more) > drives for example. How does the sw value affect it then? Note my comments in [3] at the start above. What I'm doing here is telling you how to do it correctly and fix the alignment problem you have with your 3x and 2x spindle arrays. Again, I'm not going to attempt to explain the negative effects of a wrong configuration, especially given that it won't affect your non-allocation workload. >>>> assuming you actually mean 1MB STRIP above, not 1MB stripe. If you >>> >>> Stripesize 1MB >> >> You're telling us something you have not verified, which cannot possibly >> be correct. Log into the RAID controller firmware and confirm this, or >> do an mdadm --examine /dev/mdX. It's simply not possible to have a 1MB >> stripe with 3 devices, because 1,048,576 / 3 = 349,525.3 > Stripe-unit size : 1024 KB http://www.pcguide.com/ref/hdd/perf/raid/concepts/perfStripe-c.html The problem here is a lack of understanding/use of terminology, and this article you reference explains your misunderstanding. The author doesn't understand the terminology himself. He's misusing "stripe size" and I've never heard of "stripe length". He's probably using "stripe length" for "stripe width". Obviously the author is not versed in the SNIA RAID specifications, or those generally accepted/used by the storage community. To clarify: "Stripe unit" or "strip" or "chunk" is the portion that resides on a single spindle. "Stripe" or "Stripe size" is (stripe unit * spindle count), or in XFS terminology, (su * sw), or (stripe unit * stripe width). You've apparently created your XFS correctly, but you used the wrong terminology in your post, which is confusing. You keep saying your "stripe size" is 1MB, when in fact it is 3MB. It is your "stripe unit" that is 1MB. But again, for a database workload, it makes no difference WRT performance. > So they're talking about powers of 2, not powers of 3. 1MB would definitely > work then. Digest the explanation above and this should all be clear. Again, a 1MB stripe size with 3 spindles is not possible. You have a 3MB stripe size with 3 spindles, which is possible. "Stripe unit" and "stripe size" are two different quantities/parameters, one being wholly contained within the other. >>>> actually mean 1MB hardware RAID stripe, then the controller would have >>>> most likely made a 768KB stripe with 256KB strip, as 1MB isn't divisible >>>> by 3. Thus you've told LVM to ship 1MB writes to a device expecting >>>> 256KB writes. In that case you've already horribly misaligned your LVM >>>> volumes to the hardware stripe, and everything is FUBAR already. You >>>> probably want to verify all of your strip/stripe configuration before >>>> moving forward. >> >>> I don't believe you're correct here. >> >> This is due to your current lack of knowledge of the technology. > > Please educate me then. See above. > Where can I find more information that stripes are > calculated by a power of 3? The article above references power of 2. It seems you confused "divisible by 3" and "power of 3". >>> The SSD Erase Block size for the >>> drives we're using is 1MB. >> >> The erase block size of the SSD device is irrelevant. What is relevant >> is how the RAID controller (or mdraid) is configured. > Right, but say that 1MB stripe is a single stripe. I'm guessing it would > fit within a single erase block? Or should I just use 512k stripes to be > safe? Again you're saying "stripe size" when you actually mean "stripe unit". With some workloads there can be an advantage to using a stripe unit the same size as the erase block. But with a random write database workload, where small records, far less than 1MB, are being rewritten in place, or appended, then making your stripe unit the size of the erase block gains you nothing. > Ok, so with the original 6 drives, if it's a raid 10, that would give 3 > mirrors to stripe into 1 logical drive. > Is this where the power of 3 comes from? Again, not power of 3, but divisible by 3. This should be obvious. >>> So essentially, my take-away here is that xfs_growfs doesn't work >> properly >>> when adding more logical raid drives? What kind of a performance hit >> am I >>> looking at if sw is wrong? How about this. If I know that the maximum >>> number of drives I can add is say 20 in a RAID-10. Can I format with >> sw=10 >>> (even though sw should be 3) in the eventual expectation of expanding it? >>> What would be the downside of doing that? >> >> xfs_growfs works properly and gives the performance one seeks when the >> underlying storage layers have been designed and configured properly. >> Yours hasn't, though it'll probably work well enough given your >> workload. In your situation, your storage devices are SSDs, with >> 20-50K+ IOPS and 300-500MB/s throughput, and your application is a large >> database, which means random unaligned writes and random reads, a >> workload that doesn't require striping for performance with SSDs. So >> you might have designed the storage more optimally for your workload, >> something like this: >> >> 1. Create 3 hardware RAID1 mirrors in the controller then concatenate >> 2. Create your XFS filesystem atop the device with no alignment >> >> There is no need for LVM unless you need snapshot capability. This >> works fine and now you need to expand storage space. So you simply add >> your 4 SSDs to the controller, creating two more RAID1s and add them to >> the concatenation. Since you've simply made the disk device bigger from >> Linux' point of view, all you do now is xfs_growfs and you're done. No >> alignment issues to fret over, and your performance will be no worse >> than before, maybe better, as you'll get all the cores in the RAID ASIC >> into play with so many RAID1s. >> >> Now, I'm going to guess that since you mentioned "colo provider" that >> you may not actually have access to the actual RAID configuration, or >> that possibly they are giving you "cloud" storage, not direct attached >> SSDs. In this case you absolutely want to avoid specifying alignment, >> because the RAID information they are providing you is probably not >> accurate. Which is probably why you told me "1MB stripe" twice, when we >> all know for a fact that's impossible. >> >> > That's a good idea, though I would use LVM for the concatenation. I just > don't trust the hardware to concatenate existing disks to more disks, I'd But you trust it to do striped RAID, which is far more complicated? And your description is inaccurate. It works identically to md linear and LVM concatenation. You make your RAID1 pairs, then add them to a volume group. That volume group becomes your disk device. When you want to expand, you simply add a new RAID1 pair to the volume group. I'm using generic terminology here. Different RAID vendors use different terms. Also, you do understand I'm talking about a fresh architecture here. I'm not talking about concatenating anything onto arrays you already have. With this you start from scratch. > rather leave that up to LVM to handle, AND be able to take snapshots, etc. Just remember this is a concatenation. There is no striping, no special block size, nothing. You're simply increasing the available LBA numbers in a block device. There is nothing to tune nor optimize, no alignment, WRT the disks, middle layers, or XFS. For maximum potential database performance all you need to do is put the most frequently accessed files in different directories. Once you understand the XFS allocation group architecture and allocators you'll understand why. Start here: http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide//tmp/en-US/html/index.html > Thanks Stan, very informative! You're welcome. I am a bit curious as to why you didn't simply grow the original 6 disk RAID10 array into a 10 disk RAID10 array. Then all you'd need to do is mount with the new alignment. The 5805 supports only 8 disks without expanders. Do you have an expander, or do you have multiple RAID cards in the box? -- Stan From david@fromorbit.com Thu Jan 10 16:09:10 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AM99DA110392 for ; Thu, 10 Jan 2013 16:09:10 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61F15AC00B for ; Thu, 10 Jan 2013 14:12:05 -0800 (PST) X-ASG-Debug-ID: 1357855923-04cb6c768a5a790001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JLHQyJvzizqwPEgL for ; Thu, 10 Jan 2013 14:12:03 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An4NAC8771B5Labi/2dsb2JhbABEhVCyCYYYF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gYtFcUkQsDlgmJToZ8gwk Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Jan 2013 08:42:02 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtQLx-0007nz-Mh; Fri, 11 Jan 2013 09:12:01 +1100 Date: Fri, 11 Jan 2013 09:12:01 +1100 From: Dave Chinner To: Stan Hoeppner Cc: Alexey Zilber , xfs@oss.sgi.com Subject: Re: Using xfs_growfs on SSD raid-10 Message-ID: <20130110221201.GI3120@dastard> X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 References: <50EE33BC.8010403@hardwarefreak.com> <50EE5649.60608@hardwarefreak.com> <50EF32B9.1040608@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EF32B9.1040608@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357855923 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119494 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 10, 2013 at 03:29:29PM -0600, Stan Hoeppner wrote: > On 1/10/2013 1:19 AM, Alexey Zilber wrote: > > Hi Stan, > > > > Thanks for the details btw, really appreciate it. Responses inline > > below: > > > > >> > >>> Only the sw=3 is no longer valid, correct? There's no way to add sw=5? > >> > >> You don't have a 5 spindle array. You have a 3 spindle array and a 2 > >> spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. > >> > > > > That's correct, but I was going with the description of the sw option as > > "number of data disks" which is constantly increasing as you're adding > > That is correct. But "data disks" is in the context of a single striped > array. Remember, what you're doing here is aligning XFS write out to > the stripe size of the array. > > > disks. I realize that block striping occurs independently within each > > array, but I do not know how that translates into parity with the way xfs > > works with the logical disks. > > The takeaway here is this: If you concatenate two or more striped > arrays together with a single XFS atop, you must use identical arrays, > or at least arrays with the same overall stripe size. Otherwise you > cannot achieve or maintain alignment with XFS. Hi Stan - excellent information dump, but there's one important aspect of growing filesystems like this that you missed - the _end_ of each volume must also be stripe aligned so that when you concatenate the new one it starts at an aligned address. If the end of the existing volume is not aligned, then it's very hard to align the new volume correctly.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 10 16:24:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AMOBp8110819 for ; Thu, 10 Jan 2013 16:24:11 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C95330407E for ; Thu, 10 Jan 2013 14:27:07 -0800 (PST) X-ASG-Debug-ID: 1357856824-04cbb035a5b80fa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6Azqb0I8QDV33va8 for ; Thu, 10 Jan 2013 14:27:05 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An4NAM0+71B5Labi/2dsb2JhbABEhVCyDIYYF3OCHgEBBTocIxAIAw4KCSUPBSUDIROIGLRYFJELA5YJkEqDCQ Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Jan 2013 08:57:03 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtQaV-0007pK-1p; Fri, 11 Jan 2013 09:27:03 +1100 Date: Fri, 11 Jan 2013 09:27:03 +1100 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock Message-ID: <20130110222702.GJ3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock References: <1357835665-15621-1-git-send-email-eguan@redhat.com> <1357835665-15621-2-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357835665-15621-2-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357856824 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 11, 2013 at 12:34:25AM +0800, Eryu Guan wrote: > Test case is based on 293 and make xfs with mkfs command > > mkfs.xfs -f -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b > $SCRATCH_DEV > > Regression test case for commit > > 437a255 xfs: fix direct IO nested transaction deadlock. > > Signed-off-by: Eryu Guan > --- > 294 | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 294.out | 4 +++ > group | 1 + > 3 files changed, 95 insertions(+) > create mode 100755 294 > create mode 100644 294.out > > diff --git a/294 b/294 > new file mode 100755 > index 0000000..817b877 > --- /dev/null > +++ b/294 > @@ -0,0 +1,90 @@ > +#! /bin/bash > +# FS QA Test No. 294 > +# > +# Test freeze/unfreeze file system randomly under fsstress > +# Based on 293, regression test for commit: > +# 437a255 xfs: fix direct IO nested transaction deadlock. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 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 > +#----------------------------------------------------------------------- > +# > +# creator > +owner=eguan@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > +_supported_fs xfs > +_supported_os IRIX Linux > + > +_require_scratch > +_require_freeze > + > +_scratch_unmount >/dev/null 2>&1 SCRATCH_DEV is already unmounted at this point - it it was mounted the _require_scratch unmounts it.... > +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 > +_scratch_mount >/dev/null 2>&1 > + > +TESTDIR="$SCRATCH_MNT/testdir" > +mkdir -p $TESTDIR > +rm -f $seq.full YOu need to do this before making the filesystem - scratch_mkfs writes the mkfs output to $seq.full. > + > +echo "Start fsstress" | tee -a $seq.full No need to echo stuff like this to the output files. > +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & > +FSSTRESS_PID=$! > +sleep 1 Why the sleep? > + > +# Freeze/unfreeze file system randomly > +NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` Is the sleep there so that fsstress has created some of it's threads by this point? > +echo "Start freeze/unfreeze randomly" | tee -a $seq.full > +while [ $NR_FSSTRESS -gt 0 ];do > + TIMEOUT=`expr $RANDOM % 5` > + sleep $TIMEOUT > + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -f $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: freeze filesystem failed" > + fi > + TIMEOUT=`expr $RANDOM % 3` > + sleep $TIMEOUT > + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -u $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: unfreeze filesystem failed" > + fi > + NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` > +done > +echo "Test done" | tee -a $seq.full > + > +_check_scratch_fs > +status=0 > +exit > diff --git a/294.out b/294.out > new file mode 100644 > index 0000000..2ccaa6e > --- /dev/null > +++ b/294.out > @@ -0,0 +1,4 @@ > +QA output created by 294 > +Start fsstress > +Start freeze/unfreeze randomly > +Test done > diff --git a/group b/group > index f9c697a..0c6d158 100644 > --- a/group > +++ b/group > @@ -412,3 +412,4 @@ deprecated > 291 repair > 292 auto mkfs quick > 293 auto freeze dangerous > +294 auto freeze dangerous It's not a dangerous test - most kernels will not hang on it. I suspect that auto is also questionable - what's the run time of the test? If it's anything more than 5 minutes, then it's too long for the auto group. Given that the bug it showed up triggered in a few seconds on the first 2-3 freezes, perhaps you should run a fixed number of freeze/unfreeze cycles rather than waiting for fsstress processes to do all their ops? e.g. run 10-20 freeze/thaw cycles, then kill all the fsstress processes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 10 16:44:15 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AMiFvt111351 for ; Thu, 10 Jan 2013 16:44:15 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C41F9AC007 for ; Thu, 10 Jan 2013 14:47:13 -0800 (PST) X-ASG-Debug-ID: 1357858031-04cbb035a6b81e40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id IjuKtBvzWXWiiHqP for ; Thu, 10 Jan 2013 14:47:11 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An8NAOxD71B5Labi/2dsb2JhbABEhVCyDIYYF3OCHgEBBAEnExwjBQsIAxgJJQ8FJQMhE4gTBbRkFJELA5YJkEqDCQ Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Jan 2013 09:17:10 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtQty-0007rS-0X; Fri, 11 Jan 2013 09:47:10 +1100 Date: Fri, 11 Jan 2013 09:47:09 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss , Dave Jones , Dave Chinner Subject: Re: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block Message-ID: <20130110224709.GK3120@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block References: <50EEEF4C.8040801@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EEEF4C.8040801@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357858031 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 10, 2013 at 10:41:48AM -0600, Eric Sandeen wrote: > Dave Jones hit this assert when doing a compile on recent git, with > CONFIG_XFS_DEBUG enabled: > > XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 > > Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) > contained "2" and not the proper offset, and I found that this value was > changed after the memmoves under "Use a stale leaf for our new entry." > in xfs_dir2_block_addname(), i.e. > > memmove(&blp[mid + 1], &blp[mid], > (highstale - mid) * sizeof(*blp)); > > overwrote it. > > What has happened is that the previous call to xfs_dir2_block_compact() > has rearranged things; it changes btp->count as well as the > blp array. So after we make that call, we must recalculate the > proper pointer to the leaf entries by making another call to > xfs_dir2_block_leaf_p(). Perhaps a bit of ascii art to explain it for other reviewers to save them having to spend a long time trying to understand the dir2 code? Pre-compact: dup + unused data pointer - size 72 bytes at offset 3560 | | blp + leaf entry [0] - good - at offset 3632 + leaf entry [1] - good + leaf entry [2] - stale + leaf entry [3] - good + leaf entry [4] - good + leaf entry [5] - stale + leaf entry [6] - good ..... + leaf entry [n] - stale + leaf entry [n+1] - good + block tail - points to offset 3632 Post compact (removes all but the highest stale leaf entry, adds the free space to the last unused data region): dup + unused data pointer - size 112 bytes at offset 3560 | | blp | points into unused region, not to start of leaf array | | + leaf entry [0] - good - at offset 3672 + leaf entry [1] - good + leaf entry [2] - good + leaf entry [3] - good ..... + leaf entry [n] - stale + leaf entry [n+1] - good + block tail - points to offset 3672 So as you can see, blp needs to be updated to point at offset 3672... > Dave provided a metadump image which led to a simple reproducer > (create a particular filename in the affected directory) and this > resolves the testcase as well as the bug on his live system. Thanks to Dave for making this easy to find :) > Thanks also to dchinner for looking at this one with me. > > Signed-off-by: Eric Sandeen > Tested-by: Dave Jones A simple fix for a complex problem. Nice work, Eric. Reviewed-by: Dave Chinner FWIW, it's worth mentioning that the dir2 block verifier initially detected this tag corruption on Dave Jones' machine. The verifier didn't pinpoint the cause of the problem, but they definitely caught the result (corrupt tags) when the buffer was being submitted to disk and so that gave us the initial heads-up there was something wrong in this code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 10 16:48:27 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0AMmRhC111537 for ; Thu, 10 Jan 2013 16:48:27 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81E58AC00D for ; Thu, 10 Jan 2013 14:51:25 -0800 (PST) X-ASG-Debug-ID: 1357858283-04bdf04312649630001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VfQWoG4dDxscdk0a for ; Thu, 10 Jan 2013 14:51:24 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An4NAEZF71B5Labi/2dsb2JhbABEhVCyDIYYF3OCHgEBBTocIxAIAw4KCSUPBSUDIROIGLRlFJELA5YJkEqDCQ Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Jan 2013 09:21:23 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtQy2-0007s2-Ix; Fri, 11 Jan 2013 09:51:22 +1100 Date: Fri, 11 Jan 2013 09:51:22 +1100 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress Message-ID: <20130110225122.GL3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress References: <1357835665-15621-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357835665-15621-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357858283 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119498 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 11, 2013 at 12:34:24AM +0800, Eryu Guan wrote: > Run 1000 fsstress processes and freeze/unfreeze file system randomly. > > Signed-off-by: Eryu Guan > --- > 293 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 293.out | 4 +++ > group | 1 + > 3 files changed, 93 insertions(+) > create mode 100755 293 > create mode 100644 293.out > > diff --git a/293 b/293 > new file mode 100755 > index 0000000..a360e9c > --- /dev/null > +++ b/293 > @@ -0,0 +1,88 @@ > +#! /bin/bash > +# FS QA Test No. 293 > +# > +# Test freeze/unfreeze file system randomly under fsstress What does this test do differently to 068? i.e. why do we need two generic fsstress vs freeze tests? Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Jan 10 18:52:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B0qSKN121996 for ; Thu, 10 Jan 2013 18:52:28 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 444E18F8033 for ; Thu, 10 Jan 2013 16:55:24 -0800 (PST) X-ASG-Debug-ID: 1357865723-04cb6c768a61840001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id yh6q1rLpoAJNILsc for ; Thu, 10 Jan 2013 16:55:23 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 605386C0B9; Thu, 10 Jan 2013 18:55:23 -0600 (CST) Message-ID: <50EF62FA.60004@hardwarefreak.com> Date: Thu, 10 Jan 2013 18:55:22 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com, Alexey Zilber Subject: Re: Using xfs_growfs on SSD raid-10 References: <50EE33BC.8010403@hardwarefreak.com> <50EE5649.60608@hardwarefreak.com> <50EF32B9.1040608@hardwarefreak.com> <20130110221201.GI3120@dastard> X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 In-Reply-To: <20130110221201.GI3120@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1357865723 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 1/10/2013 4:12 PM, Dave Chinner wrote: > On Thu, Jan 10, 2013 at 03:29:29PM -0600, Stan Hoeppner wrote: >> On 1/10/2013 1:19 AM, Alexey Zilber wrote: >>> Hi Stan, >>> >>> Thanks for the details btw, really appreciate it. Responses inline >>> below: >>> >>> >> >>>>> Only the sw=3 is no longer valid, correct? There's no way to add sw=5? >>>> >>>> You don't have a 5 spindle array. You have a 3 spindle array and a 2 >>>> spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. >>>> >>> >>> That's correct, but I was going with the description of the sw option as >>> "number of data disks" which is constantly increasing as you're adding >> >> That is correct. But "data disks" is in the context of a single striped >> array. Remember, what you're doing here is aligning XFS write out to >> the stripe size of the array. >> >>> disks. I realize that block striping occurs independently within each >>> array, but I do not know how that translates into parity with the way xfs >>> works with the logical disks. >> >> The takeaway here is this: If you concatenate two or more striped >> arrays together with a single XFS atop, you must use identical arrays, >> or at least arrays with the same overall stripe size. Otherwise you >> cannot achieve or maintain alignment with XFS. > > Hi Stan - excellent information dump, Thanks Dave. > but there's one important > aspect of growing filesystems like this that you missed - Yes, I most certainly did. Which is why I like knowing you're always standing over my shoulder. ;) > the _end_ of > each volume must also be stripe aligned so that when you concatenate > the new one it starts at an aligned address. If the end of the > existing volume is not aligned, then it's very hard to align the new > volume correctly.... So the obvious followup question is: How does one determine if the end of an XFS volume is still aligned at the end of the underlying device? Considering I've been trying to steer Alexey away from this configuration, I should have remembered this aspect, as it's one more reason why one may not want to expand this way. I've attempted to concentrate more on explaining the "right way", while also explaining that even the "wrong way" may still work well for his workload. -- Stan From david@fromorbit.com Thu Jan 10 20:14:26 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B2EQJ0135900 for ; Thu, 10 Jan 2013 20:14:26 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BF0E304043 for ; Thu, 10 Jan 2013 18:17:22 -0800 (PST) X-ASG-Debug-ID: 1357870636-04cbb035a7b8a560001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XY7GMQP47k7ZBET6 for ; Thu, 10 Jan 2013 18:17:17 -0800 (PST) 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: An4NAHx171B5Labi/2dsb2JhbABEhVCyDIYaF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gYtH8UkQsDlgmJToZ8gwk Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail06.adl6.internode.on.net with ESMTP; 11 Jan 2013 12:47:16 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtUBH-0008FK-1d; Fri, 11 Jan 2013 13:17:15 +1100 Date: Fri, 11 Jan 2013 13:17:15 +1100 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com, Alexey Zilber Subject: Re: Using xfs_growfs on SSD raid-10 Message-ID: <20130111021714.GM3120@dastard> X-ASG-Orig-Subj: Re: Using xfs_growfs on SSD raid-10 References: <50EE33BC.8010403@hardwarefreak.com> <50EE5649.60608@hardwarefreak.com> <50EF32B9.1040608@hardwarefreak.com> <20130110221201.GI3120@dastard> <50EF62FA.60004@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EF62FA.60004@hardwarefreak.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: 1357870637 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.119510 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 10, 2013 at 06:55:22PM -0600, Stan Hoeppner wrote: > On 1/10/2013 4:12 PM, Dave Chinner wrote: > > On Thu, Jan 10, 2013 at 03:29:29PM -0600, Stan Hoeppner wrote: > >> On 1/10/2013 1:19 AM, Alexey Zilber wrote: > >>> Hi Stan, > >>> > >>> Thanks for the details btw, really appreciate it. Responses inline > >>> below: > >>> > >>> >> > >>>>> Only the sw=3 is no longer valid, correct? There's no way to add sw=5? > >>>> > >>>> You don't have a 5 spindle array. You have a 3 spindle array and a 2 > >>>> spindle array. Block striping occurs WITHIN an array, not ACROSS arrays. > >>>> > >>> > >>> That's correct, but I was going with the description of the sw option as > >>> "number of data disks" which is constantly increasing as you're adding > >> > >> That is correct. But "data disks" is in the context of a single striped > >> array. Remember, what you're doing here is aligning XFS write out to > >> the stripe size of the array. > >> > >>> disks. I realize that block striping occurs independently within each > >>> array, but I do not know how that translates into parity with the way xfs > >>> works with the logical disks. > >> > >> The takeaway here is this: If you concatenate two or more striped > >> arrays together with a single XFS atop, you must use identical arrays, > >> or at least arrays with the same overall stripe size. Otherwise you > >> cannot achieve or maintain alignment with XFS. > > > > Hi Stan - excellent information dump, > > Thanks Dave. > > > but there's one important > > aspect of growing filesystems like this that you missed - > > Yes, I most certainly did. Which is why I like knowing you're always > standing over my shoulder. ;) > > > the _end_ of > > each volume must also be stripe aligned so that when you concatenate > > the new one it starts at an aligned address. If the end of the > > existing volume is not aligned, then it's very hard to align the new > > volume correctly.... > > So the obvious followup question is: How does one determine if the end > of an XFS volume is still aligned at the end of the underlying device? Make sure the size of the volume reported by /proc/partitions is a multiple of the stripe width. Then when you add the new device, it starts aligned to the existing volume. i.e. you have to size the device correctly initially with lvm or whatever partitioning program you use..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Thu Jan 10 23:22:27 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B5MRgl144249 for ; Thu, 10 Jan 2013 23:22:27 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F3B8AC003 for ; Thu, 10 Jan 2013 21:25:23 -0800 (PST) X-ASG-Debug-ID: 1357881922-04bdf07fae5cc800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GHnyLThhaSvxlZ3T for ; Thu, 10 Jan 2013 21:25:22 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0B5PDew021396 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jan 2013 00:25:14 -0500 Received: from localhost ([10.66.13.231]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0B5P7pa014979; Fri, 11 Jan 2013 00:25:12 -0500 Date: Fri, 11 Jan 2013 13:25:06 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock Message-ID: <20130111052506.GV2551@eguan-t400.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfstests 294: test xfs direct IO nested transaction deadlock References: <1357835665-15621-1-git-send-email-eguan@redhat.com> <1357835665-15621-2-git-send-email-eguan@redhat.com> <20130110222702.GJ3120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130110222702.GJ3120@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1357881922 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Jan 11, 2013 at 09:27:03AM +1100, Dave Chinner wrote: > On Fri, Jan 11, 2013 at 12:34:25AM +0800, Eryu Guan wrote: > > Test case is based on 293 and make xfs with mkfs command > > > > mkfs.xfs -f -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b > > $SCRATCH_DEV > > > > Regression test case for commit > > > > 437a255 xfs: fix direct IO nested transaction deadlock. > > > > Signed-off-by: Eryu Guan > > --- > > 294 | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 294.out | 4 +++ > > group | 1 + > > 3 files changed, 95 insertions(+) > > create mode 100755 294 > > create mode 100644 294.out > > > > diff --git a/294 b/294 > > new file mode 100755 > > index 0000000..817b877 > > --- /dev/null > > +++ b/294 > > @@ -0,0 +1,90 @@ > > +#! /bin/bash > > +# FS QA Test No. 294 > > +# > > +# Test freeze/unfreeze file system randomly under fsstress > > +# Based on 293, regression test for commit: > > +# 437a255 xfs: fix direct IO nested transaction deadlock. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2013 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 > > +#----------------------------------------------------------------------- > > +# > > +# creator > > +owner=eguan@redhat.com > > + > > +seq=`basename $0` > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -f $tmp.* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common.rc > > +. ./common.filter > > + > > +# real QA test starts here > > +_supported_fs xfs > > +_supported_os IRIX Linux > > + > > +_require_scratch > > +_require_freeze > > + > > +_scratch_unmount >/dev/null 2>&1 > > SCRATCH_DEV is already unmounted at this point - it it was mounted > the _require_scratch unmounts it.... > > > +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 > > +_scratch_mount >/dev/null 2>&1 > > + > > +TESTDIR="$SCRATCH_MNT/testdir" > > +mkdir -p $TESTDIR > > +rm -f $seq.full > > YOu need to do this before making the filesystem - scratch_mkfs > writes the mkfs output to $seq.full. > > > + > > +echo "Start fsstress" | tee -a $seq.full > > No need to echo stuff like this to the output files. Thanks for the review! I'll update in next version. > > > +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & > > +FSSTRESS_PID=$! > > +sleep 1 > > Why the sleep? > > > + > > +# Freeze/unfreeze file system randomly > > +NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` > > Is the sleep there so that fsstress has created some of it's threads > by this point? The sleep seems redundant, I'll remove it. > > > +echo "Start freeze/unfreeze randomly" | tee -a $seq.full > > +while [ $NR_FSSTRESS -gt 0 ];do > > + TIMEOUT=`expr $RANDOM % 5` > > + sleep $TIMEOUT > > + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full > > + xfs_freeze -f $SCRATCH_MNT > > + if [ $? -ne 0 ];then > > + echo " - Error: freeze filesystem failed" > > + fi > > + TIMEOUT=`expr $RANDOM % 3` > > + sleep $TIMEOUT > > + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full > > + xfs_freeze -u $SCRATCH_MNT > > + if [ $? -ne 0 ];then > > + echo " - Error: unfreeze filesystem failed" > > + fi > > + NR_FSSTRESS=`ps -eo ppid | grep -c $FSSTRESS_PID` > > +done > > +echo "Test done" | tee -a $seq.full > > + > > +_check_scratch_fs > > +status=0 > > +exit > > diff --git a/294.out b/294.out > > new file mode 100644 > > index 0000000..2ccaa6e > > --- /dev/null > > +++ b/294.out > > @@ -0,0 +1,4 @@ > > +QA output created by 294 > > +Start fsstress > > +Start freeze/unfreeze randomly > > +Test done > > diff --git a/group b/group > > index f9c697a..0c6d158 100644 > > --- a/group > > +++ b/group > > @@ -412,3 +412,4 @@ deprecated > > 291 repair > > 292 auto mkfs quick > > 293 auto freeze dangerous > > +294 auto freeze dangerous > > It's not a dangerous test - most kernels will not hang on it. I see the description for dangerous group is "Tests which may oops or hang", so I put it in the group. If you think it's not proper here I can remove the dangerous group. > > I suspect that auto is also questionable - what's the run time of > the test? If it's anything more than 5 minutes, then it's too long > for the auto group. Given that the bug it showed up triggered in a > few seconds on the first 2-3 freezes, perhaps you should run a fixed > number of freeze/unfreeze cycles rather than waiting for fsstress > processes to do all their ops? e.g. run 10-20 freeze/thaw cycles, > then kill all the fsstress processes... I think auto group is for tests that can be run automatically, it's not about time - I guess that's what the quick group is for. The description for auto is "tests to be run as part of nightly qa". So I think it's proper here. I tested it on two hosts: A - Intel Xeon E5-2630 CPU, 12 logical processors, 32G memory B - Intel Core2 Quand CPU, 4 logical processors, 4G memory And the run time and run cycles are: A - 70 ~ 75 seconds, 19 ~ 21 iterations B - about 380 seconds, 17 interations Not too many interations, so I'd like to leave fsstress running to end. Thanks again for the intensive review! Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From eguan@redhat.com Thu Jan 10 23:34:55 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B5Yt78144987 for ; Thu, 10 Jan 2013 23:34:55 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40E8D304039 for ; Thu, 10 Jan 2013 21:37:51 -0800 (PST) X-ASG-Debug-ID: 1357882670-04cbb035a6b927f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OaqgSn5QaTFdIAsL for ; Thu, 10 Jan 2013 21:37:50 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0B5bnUW012246 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jan 2013 00:37:49 -0500 Received: from localhost ([10.66.13.231]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0B5blri010161; Fri, 11 Jan 2013 00:37:48 -0500 Date: Fri, 11 Jan 2013 13:37:46 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress Message-ID: <20130111053746.GW2551@eguan-t400.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfstests 293: freeze/unfreeze file system randomly under fsstress References: <1357835665-15621-1-git-send-email-eguan@redhat.com> <20130110225122.GL3120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130110225122.GL3120@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1357882670 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Jan 11, 2013 at 09:51:22AM +1100, Dave Chinner wrote: > On Fri, Jan 11, 2013 at 12:34:24AM +0800, Eryu Guan wrote: > > Run 1000 fsstress processes and freeze/unfreeze file system randomly. > > > > Signed-off-by: Eryu Guan > > --- > > 293 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 293.out | 4 +++ > > group | 1 + > > 3 files changed, 93 insertions(+) > > create mode 100755 293 > > create mode 100644 293.out > > > > diff --git a/293 b/293 > > new file mode 100755 > > index 0000000..a360e9c > > --- /dev/null > > +++ b/293 > > @@ -0,0 +1,88 @@ > > +#! /bin/bash > > +# FS QA Test No. 293 > > +# > > +# Test freeze/unfreeze file system randomly under fsstress > > What does this test do differently to 068? i.e. why do we need two > generic fsstress vs freeze tests? 068 does fixed number of iterations and sleep 2 seconds between each iteration and freeze/unfreeze operation. Also 068 only forks 2 fsstress processes, the load is relatively low. This test forks 1000 fsstress processes and does random freeze/unfreeze operations until all fsstress processes have done their jobs. Basically it's low stress with fixed ops vs relatively high stress with random ops. I agree that this test is a bit redundant, but I still perfer sending it out for review, if it's not needed I can drop it in next version. Thanks! Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From jeff.liu@oracle.com Fri Jan 11 00:34:08 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B6Y8cR151649 for ; Fri, 11 Jan 2013 00:34:08 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 08CBFAC007 for ; Thu, 10 Jan 2013 22:37:03 -0800 (PST) X-ASG-Debug-ID: 1357886221-04cbb035a7b944f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KTjw21W7HrHAjqwW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 10 Jan 2013 22:37:02 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0B6aviX003442 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jan 2013 06:36:58 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0B6aujD029820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 11 Jan 2013 06:36:57 GMT Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0B6auVj027723; Fri, 11 Jan 2013 00:36:56 -0600 Received: from [192.168.1.103] (/221.223.105.121) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jan 2013 22:36:56 -0800 Message-ID: <50EFB2FE.2000307@oracle.com> Date: Fri, 11 Jan 2013 14:36:46 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Abhijit Pawar CC: Ben Myers , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> X-ASG-Orig-Subj: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto In-Reply-To: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1357886222 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-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.2.119526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/09/2013 10:04 PM, Abhijit Pawar wrote: > This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. > > Signed-off-by: Abhijit Pawar > --- > fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- > 1 files changed, 19 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index ab8839b..c407121 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -139,9 +139,9 @@ static const match_table_t tokens = { > > > STATIC unsigned long > -suffix_strtoul(char *s, char **endp, unsigned int base) > +suffix_kstrtoint(char *s, unsigned int base, int *res) > { > - int last, shift_left_factor = 0; > + int last, shift_left_factor = 0, _res; > char *value = s; > > last = strlen(value) - 1; > @@ -158,7 +158,10 @@ suffix_strtoul(char *s, char **endp, unsigned int base) > value[last] = '\0'; > } > > - return simple_strtoul((const char *)s, endp, base) << shift_left_factor; > + if (kstrtoint(s, base, &_res)) > + return -EINVAL; > + *res = _res << shift_left_factor; > + return 0; > } > > /* > @@ -174,7 +177,7 @@ xfs_parseargs( > char *options) > { > struct super_block *sb = mp->m_super; > - char *this_char, *value, *eov; > + char *this_char, *value; > int dsunit = 0; > int dswidth = 0; > int iosize = 0; > @@ -230,14 +233,16 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - mp->m_logbufs = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &mp->m_logbufs)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > this_char); > return EINVAL; > } > - mp->m_logbsize = suffix_strtoul(value, &eov, 10); > + if (suffix_kstrtoint(value, 10, &mp->m_logbsize)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > @@ -266,7 +271,8 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - iosize = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &iosize)) > + return EINVAL; > iosizelog = ffs(iosize) - 1; > } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { > if (!value || !*value) { > @@ -274,7 +280,8 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - iosize = suffix_strtoul(value, &eov, 10); > + if (suffix_kstrtoint(value, 10, &iosize)) > + return EINVAL; > iosizelog = ffs(iosize) - 1; > } else if (!strcmp(this_char, MNTOPT_GRPID) || > !strcmp(this_char, MNTOPT_BSDGROUPS)) { > @@ -296,14 +303,16 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - dsunit = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &dsunit)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > this_char); > return EINVAL; > } > - dswidth = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &dswidth)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { > mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { > checkpatch.pl show warning if we return EINVAL as below: WARNING: return of an errno should typically be -ve (return -EINVAL) Can we just ignore such code style issue? Thanks, -Jeff From abhi.c.pawar@gmail.com Fri Jan 11 01:43:52 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B7hqbs156677 for ; Fri, 11 Jan 2013 01:43:52 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 262D1304048 for ; Thu, 10 Jan 2013 23:46:48 -0800 (PST) X-ASG-Debug-ID: 1357890406-04cb6c05a5be3ac0001-NocioJ Received: from mail-da0-f49.google.com (mail-da0-f49.google.com [209.85.210.49]) by cuda.sgi.com with ESMTP id 2Fs8lEKU86udw3s3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 10 Jan 2013 23:46:47 -0800 (PST) X-Barracuda-Envelope-From: abhi.c.pawar@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.49] Received: by mail-da0-f49.google.com with SMTP id v40so655597dad.36 for ; Thu, 10 Jan 2013 23:46:46 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=6JQbElsLSSbnObIppzpBJaY67vH6qN47ZMJ/V8n9Wn4=; b=xhuQ6+n5cSHDtCX6c0D6XSp2omPnkF5uzZM28S3HIk8C0s6+nglZI3SDakNPsGNqja roBOrRJ/Vd3wS2eXd0S7W16IFsMlDF5Yq6NxAxRY1OjtcDDVOCfFo/G604Zv01Sf8zpy cxBKuihPLcpu5f0lb0GeHeMC5kQcCqcEtXHojEzyxtyepUsTzLgelHhEpVgsYeaRoMln +v6oRd04PYhVrdBdYEmYzuU8yNPcISP/wLrTldrF5G09WBssNiQZOlOkfdkJbL2xATVb 8gRktnbkN6FpFgAdjKTaqfh8bRhoxNg9dy/pvOdaAJaQtxybOYupWFKp6+gakU7abWGi FkXw== X-Received: by 10.68.125.195 with SMTP id ms3mr225274804pbb.149.1357890406166; Thu, 10 Jan 2013 23:46:46 -0800 (PST) Received: from [172.27.56.83] ([121.242.40.10]) by mx.google.com with ESMTPS id qw8sm2334411pbc.39.2013.01.10.23.46.42 (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 10 Jan 2013 23:46:45 -0800 (PST) Message-ID: <50EFC356.10908@gmail.com> Date: Fri, 11 Jan 2013 13:16:30 +0530 From: Abhijit Pawar User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Jeff Liu CC: Abhijit Pawar , Ben Myers , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> <50EFB2FE.2000307@oracle.com> X-ASG-Orig-Subj: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto In-Reply-To: <50EFB2FE.2000307@oracle.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-da0-f49.google.com[209.85.210.49] X-Barracuda-Start-Time: 1357890406 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-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.2.119530 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 01/11/2013 12:06 PM, Jeff Liu wrote: > On 01/09/2013 10:04 PM, Abhijit Pawar wrote: >> This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. >> >> Signed-off-by: Abhijit Pawar >> --- >> fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- >> 1 files changed, 19 insertions(+), 10 deletions(-) >> >> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c >> index ab8839b..c407121 100644 >> --- a/fs/xfs/xfs_super.c >> +++ b/fs/xfs/xfs_super.c >> @@ -139,9 +139,9 @@ static const match_table_t tokens = { >> >> >> STATIC unsigned long >> -suffix_strtoul(char *s, char **endp, unsigned int base) >> +suffix_kstrtoint(char *s, unsigned int base, int *res) >> { >> - int last, shift_left_factor = 0; >> + int last, shift_left_factor = 0, _res; >> char *value = s; >> >> last = strlen(value) - 1; >> @@ -158,7 +158,10 @@ suffix_strtoul(char *s, char **endp, unsigned int base) >> value[last] = '\0'; >> } >> >> - return simple_strtoul((const char *)s, endp, base) << shift_left_factor; >> + if (kstrtoint(s, base, &_res)) >> + return -EINVAL; >> + *res = _res << shift_left_factor; >> + return 0; >> } >> >> /* >> @@ -174,7 +177,7 @@ xfs_parseargs( >> char *options) >> { >> struct super_block *sb = mp->m_super; >> - char *this_char, *value, *eov; >> + char *this_char, *value; >> int dsunit = 0; >> int dswidth = 0; >> int iosize = 0; >> @@ -230,14 +233,16 @@ xfs_parseargs( >> this_char); >> return EINVAL; >> } >> - mp->m_logbufs = simple_strtoul(value, &eov, 10); >> + if (kstrtoint(value, 10, &mp->m_logbufs)) >> + return EINVAL; >> } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { >> if (!value || !*value) { >> xfs_warn(mp, "%s option requires an argument", >> this_char); >> return EINVAL; >> } >> - mp->m_logbsize = suffix_strtoul(value, &eov, 10); >> + if (suffix_kstrtoint(value, 10, &mp->m_logbsize)) >> + return EINVAL; >> } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { >> if (!value || !*value) { >> xfs_warn(mp, "%s option requires an argument", >> @@ -266,7 +271,8 @@ xfs_parseargs( >> this_char); >> return EINVAL; >> } >> - iosize = simple_strtoul(value, &eov, 10); >> + if (kstrtoint(value, 10, &iosize)) >> + return EINVAL; >> iosizelog = ffs(iosize) - 1; >> } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { >> if (!value || !*value) { >> @@ -274,7 +280,8 @@ xfs_parseargs( >> this_char); >> return EINVAL; >> } >> - iosize = suffix_strtoul(value, &eov, 10); >> + if (suffix_kstrtoint(value, 10, &iosize)) >> + return EINVAL; >> iosizelog = ffs(iosize) - 1; >> } else if (!strcmp(this_char, MNTOPT_GRPID) || >> !strcmp(this_char, MNTOPT_BSDGROUPS)) { >> @@ -296,14 +303,16 @@ xfs_parseargs( >> this_char); >> return EINVAL; >> } >> - dsunit = simple_strtoul(value, &eov, 10); >> + if (kstrtoint(value, 10, &dsunit)) >> + return EINVAL; >> } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { >> if (!value || !*value) { >> xfs_warn(mp, "%s option requires an argument", >> this_char); >> return EINVAL; >> } >> - dswidth = simple_strtoul(value, &eov, 10); >> + if (kstrtoint(value, 10, &dswidth)) >> + return EINVAL; >> } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { >> mp->m_flags |= XFS_MOUNT_SMALL_INUMS; >> } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { >> > checkpatch.pl show warning if we return EINVAL as below: > WARNING: return of an errno should typically be -ve (return -EINVAL) > > Can we just ignore such code style issue? I think we can. Ben? > > Thanks, > -Jeff > -- - Abhijit From xfs-owner@oss.sgi.com Fri Jan 11 03:11:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_80,MIME_QP_LONG_LINE, RCVD_IN_SBL,RCVD_IN_SORBS_WEB autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0B9BvCb162694 for ; Fri, 11 Jan 2013 03:11:57 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE66C304043 for ; Fri, 11 Jan 2013 01:14:53 -0800 (PST) X-ASG-Debug-ID: 1357895688-04cb6c05a8be7270001-w1Z2WR Received: from dlw.com.ar (dlw.com.ar [72.47.207.113]) by cuda.sgi.com with ESMTP id q4pH1Vde4cpKDAxD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 11 Jan 2013 01:14:49 -0800 (PST) X-Barracuda-Envelope-From: hsouto@viviendasparaiso.com X-Barracuda-Apparent-Source-IP: 72.47.207.113 Received: (qmail 28354 invoked by uid 48); 10 Jan 2013 23:38:27 -0300 Received: from 41.190.3.142 ([41.190.3.142]) by webmail.viviendasparaiso.com (Horde MIME library) with HTTP; Thu, 10 Jan 2013 23:38:26 -0300 Message-ID: <20130110233826.v4hxnbmr4so0848o@webmail.viviendasparaiso.com> Date: Thu, 10 Jan 2013 23:38:26 -0300 From: WEBMAIL ADINISTRATOR To: undisclosed-recipients: ; Subject: Erneut validieren Ihr Konto Mailbox MIME-Version: 1.0 X-ASG-Orig-Subj: Erneut validieren Ihr Konto Mailbox Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable User-Agent: Internet Messaging Program (IMP) H3 (4.1.4) X-Barracuda-Connect: dlw.com.ar[72.47.207.113] X-Barracuda-Start-Time: 1357895688 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-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars Hiermit m=F6chten wir Sie dar=FCber informieren, dass Sie Ihre =20 E-Mail-Kontingent von 325MB =FCberschritten hat und Sie brauchen, um Ihre E-Mail Quote oder Speicher-Limit zu erh=F6hen, da in weniger als 24 Stunden Ihr Konto deaktivi= eren sein wird. Steigern Sie Ihre E-Mail-Kontingent und fahren Sie mit Ihrem Webmail-Konto. Klicken Sie auf diesen Link, um Ihr Konto zu aktualisieren: http://hvgsgs.phpforms.net/view_forms/view/573d3d346f#top System Administrator Webmail Admin Help Desk From iha@euronet.nl Fri Jan 11 08:37:28 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=BAYES_50,TVD_SPACE_RATIO, TVD_SPACE_RATIO_MINFP autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BEbR3D190754 for ; Fri, 11 Jan 2013 08:37:28 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C3698F8033 for ; Fri, 11 Jan 2013 06:40:26 -0800 (PST) X-ASG-Debug-ID: 1357915223-04bdf04312676970001-NocioJ Received: from fe01.em.euronet.nl (fe01.em.euronet.nl [194.134.4.232]) by cuda.sgi.com with ESMTP id hY5qkJZS7A6EZ1fj for ; Fri, 11 Jan 2013 06:40:24 -0800 (PST) X-Barracuda-Envelope-From: iha@euronet.nl X-Barracuda-Apparent-Source-IP: 194.134.4.232 Received: from mbox04.em.euronet.nl (mbox04.em.euronet.nl [194.134.4.154]) by fe01.em.euronet.nl (Postfix) with ESMTP id 6CD85C6904; Fri, 11 Jan 2013 15:40:23 +0100 (CET) Date: Fri, 11 Jan 2013 15:40:23 +0100 (CET) From: Account Message-ID: <9581393.2261031357915223393.JavaMail.root@mbox04.em.euronet.nl> Subject: Verify MIME-Version: 1.0 X-ASG-Orig-Subj: Verify Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [180.215.137.244] X-Mailer: Zimbra 6.0.1_GA_1816.DEBIAN5_64 (ZimbraWebClient - FF3.0 (Win)/6.0.1_GA_1816.DEBIAN5_64) To: undisclosed-recipients:; X-Barracuda-Connect: fe01.em.euronet.nl[194.134.4.232] X-Barracuda-Start-Time: 1357915223 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119558 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- click here https://docs.google.com/spreadsheet/viewform?formkey=dEtXVFJBc0w3c3dUY3UtWEhJa0tJbHc6MQ From xfs-owner@oss.sgi.com Fri Jan 11 08:59:23 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=BAYES_50,REPLYTO_WITHOUT_TO_CC autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BExNUU192379 for ; Fri, 11 Jan 2013 08:59:23 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9C776304059 for ; Fri, 11 Jan 2013 07:02:19 -0800 (PST) X-ASG-Debug-ID: 1357916537-04bdf043126781c0001-w1Z2WR Received: from chestnut.phpwebhosting.com (3.88.5446.static.theplanet.com [70.84.136.3]) by cuda.sgi.com with SMTP id VDOoTTGXy0qMDol5 for ; Fri, 11 Jan 2013 07:02:18 -0800 (PST) X-Barracuda-Envelope-From: webmail@kimo.com X-Barracuda-Apparent-Source-IP: 70.84.136.3 Received: (qmail 8547 invoked by uid 666); 11 Jan 2013 14:52:34 -0000 To: Subject: VALIDATE Ihr Konto .. Date: Fri, 11 Jan 2013 09:52:34 -0500 X-ASG-Orig-Subj: VALIDATE Ihr Konto .. From: WEBMAIL ACCOUNT ADMINISTRATOR Reply-To: WEBMAIL ACCOUNT ADMINISTRATOR Message-ID: <9ebc9e8e990344ba80f4d8a475a498bd@correo2.fundacionloyola.org> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Originating-IP: 46.249.35.124 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-Barracuda-Connect: 3.88.5446.static.theplanet.com[70.84.136.3] X-Barracuda-Start-Time: 1357916537 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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=TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 TO_CC_NONE No To: or Cc: header ---- Ihre Mailbox Konto haben die Speichergrenze die 100GB als gesetzt durch den Administrator sind Sie derzeit auf 23DE berschritten wird, knnen Sie nicht in der Lage zu senden oder zu empfangen neue E-Mails, bis Sie wieder validieren Ihre Mailbox. Klicken Sie hier, um Re-Validierung:http://hvgsgs.phpforms.net/view_forms/view/573d3d346f#top System Administrator Webmail Admin ________________________________________________________________ Visite nuestro portal en http://www.fundacionloyola.org From xfs-owner@oss.sgi.com Fri Jan 11 11:26:11 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=BAYES_50,REPLYTO_WITHOUT_TO_CC autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BHQBum207908 for ; Fri, 11 Jan 2013 11:26:11 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1232D304048 for ; Fri, 11 Jan 2013 09:29:08 -0800 (PST) X-ASG-Debug-ID: 1357925346-04bdf07fae5f1a90001-w1Z2WR Received: from chestnut.phpwebhosting.com (3.88.5446.static.theplanet.com [70.84.136.3]) by cuda.sgi.com with SMTP id cgme5ucjA24QWQMb for ; Fri, 11 Jan 2013 09:29:07 -0800 (PST) X-Barracuda-Envelope-From: webmail@kimo.com X-Barracuda-Apparent-Source-IP: 70.84.136.3 Received: (qmail 10784 invoked by uid 666); 11 Jan 2013 14:57:21 -0000 To: Subject: VALIDATE Ihr Konto .. Date: Fri, 11 Jan 2013 09:57:21 -0500 X-ASG-Orig-Subj: VALIDATE Ihr Konto .. From: WEBMAIL ACCOUNT ADMINISTRATOR Reply-To: WEBMAIL ACCOUNT ADMINISTRATOR Message-ID: X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Originating-IP: 46.249.35.124 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-Barracuda-Connect: 3.88.5446.static.theplanet.com[70.84.136.3] X-Barracuda-Start-Time: 1357925346 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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=TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119570 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 TO_CC_NONE No To: or Cc: header ---- Ihre Mailbox Konto haben die Speichergrenze die 100GB als gesetzt durch den Administrator sind Sie derzeit auf 23DE berschritten wird, knnen Sie nicht in der Lage zu senden oder zu empfangen neue E-Mails, bis Sie wieder validieren Ihre Mailbox. Klicken Sie hier, um Re-Validierung: http://hvgsgs.phpforms.net/view_forms/view/573d3d346f#top System Administrator Webmail Admin ________________________________________________________________ Visite nuestro portal en http://www.fundacionloyola.org From bpm@sgi.com Fri Jan 11 13:06:04 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BJ64In217731 for ; Fri, 11 Jan 2013 13:06:04 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 094F48F8035; Fri, 11 Jan 2013 11:09:00 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id CF48E4266DC; Fri, 11 Jan 2013 13:09:00 -0600 (CST) Date: Fri, 11 Jan 2013 13:09:00 -0600 From: Ben Myers To: Abhijit Pawar Cc: Jeff Liu , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto Message-ID: <20130111190900.GA27055@sgi.com> References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> <50EFB2FE.2000307@oracle.com> <50EFC356.10908@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EFC356.10908@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Fri, Jan 11, 2013 at 01:16:30PM +0530, Abhijit Pawar wrote: > On 01/11/2013 12:06 PM, Jeff Liu wrote: > > On 01/09/2013 10:04 PM, Abhijit Pawar wrote: > >> This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. > >> > >> Signed-off-by: Abhijit Pawar > > checkpatch.pl show warning if we return EINVAL as below: > > WARNING: return of an errno should typically be -ve (return -EINVAL) > > > > Can we just ignore such code style issue? > I think we can. > Ben? Yep, no worries. Regards, Ben From arekm@maven.pl Fri Jan 11 13:15:49 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=BAYES_00,HEADER_ESQ, MIME_8BIT_HEADER,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BJFnoP218072 for ; Fri, 11 Jan 2013 13:15:49 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1AE5AC009 for ; Fri, 11 Jan 2013 11:18:45 -0800 (PST) X-ASG-Debug-ID: 1357931923-04bdf043106843a0001-NocioJ Received: from mail-ea0-f173.google.com (mail-ea0-f173.google.com [209.85.215.173]) by cuda.sgi.com with ESMTP id kMK9bdRhUrzYzRGV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Jan 2013 11:18:44 -0800 (PST) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 209.85.215.173 Received: by mail-ea0-f173.google.com with SMTP id i13so866597eaa.32 for ; Fri, 11 Jan 2013 11:18:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=x-received:from:to:subject:date:user-agent:cc:mime-version :content-type:content-transfer-encoding:message-id; bh=vjooqI/EG0DOfrZ0J++TdcYAsJnEB4Yt3GM2Wi3mk48=; b=oAP4Xd1jkGpyV6Qv/1MUO8L6bc8XlXFriB2szxCFzb/ukqX94/7TwTEKJCgfjxZ5WN tsKO5mB0JAAy3XKfQXAeSQ9Oxi6g+Q28SR+tNbM5Rgl4HqiBzhTxZJbZzGNG8EiNLAby +zUjbaTvJ8kVq7ZDhcex9p7JhzO5BAcqOQQRY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:subject:date:user-agent:cc:mime-version :content-type:content-transfer-encoding:message-id :x-gm-message-state; bh=vjooqI/EG0DOfrZ0J++TdcYAsJnEB4Yt3GM2Wi3mk48=; b=JXrLxucIfTr4PBvFefWZDoIH8THz1u3zyEcQOU4dS7ire7uUq/4ixKD1gF+8SFaZSX 62DOcqy8N+4aIoF3hY1w6SQLup+FwLJ4zmWHD8L7+4V9lwfytaKT+BqQ8gSxzIIM2fuT v0TOomnjfOi9jBnqnrd8zZPvOczxkQmI0lLRL1SM9jcZ4sqjJNn7WWN3OzzlkAGatFi2 T+JcQCIs18FR1T2roL0b1RloL311kXq1ctlDfwMTzSzYS7GHl4XslDxuXjaDQGSu5Z1R UGMH2Qevgo+8t5ps7NbrTtTmIYc/HhYwa/R72ve+ulQ1W2uCIyKwJNZLsk8osb+hO+dh WqRQ== X-Received: by 10.14.177.1 with SMTP id c1mr202909187eem.8.1357931922567; Fri, 11 Jan 2013 11:18:42 -0800 (PST) Received: from t400.localnet (89-69-21-174.dynamic.chello.pl. [89.69.21.174]) by mx.google.com with ESMTPS id v46sm9674050eep.1.2013.01.11.11.18.41 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 11 Jan 2013 11:18:41 -0800 (PST) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: Chandra Seetharaman Subject: pquota and gquota to be used together Date: Fri, 11 Jan 2013 20:18:39 +0100 X-ASG-Orig-Subj: pquota and gquota to be used together User-Agent: KMail/1.13.7 (Linux/3.7.1; KDE/4.9.5; x86_64; ; ) Cc: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201301112018.39599.arekm@maven.pl> X-Gm-Message-State: ALoCoQkSNnhp4+RWxPu+XpZgM59+NUYCyeuIh/mCCSER3R1GHZ7qjIj7LoB6stT701KrPYs4tyx/ X-Barracuda-Connect: mail-ea0-f173.google.com[209.85.215.173] X-Barracuda-Start-Time: 1357931923 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-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.2.119576 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 Hi Chandra. Pinging about the "pquota and gquota to be used together" patchset. It was= =20 almost close to be merged. It's over half year after last iteration I guess. Do you have any plans to finish this and get merged? Thanks, =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / maven.pl From sekharan@us.ibm.com Fri Jan 11 14:24:32 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BKOWi1220246 for ; Fri, 11 Jan 2013 14:24:32 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91D8DAC001 for ; Fri, 11 Jan 2013 12:27:28 -0800 (PST) X-ASG-Debug-ID: 1357936046-04cb6c768a99560001-NocioJ Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id bh0oVDupsfb2HANp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 11 Jan 2013 12:27:27 -0800 (PST) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.137 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 11 Jan 2013 15:27:26 -0500 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from d01dlp01.pok.ibm.com (9.56.250.166) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 11 Jan 2013 15:27:22 -0500 Received: from d01relay06.pok.ibm.com (d01relay06.pok.ibm.com [9.56.227.116]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 9CC4138C8039 for ; Fri, 11 Jan 2013 15:27:21 -0500 (EST) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay06.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r0BKRL9l29098196 for ; Fri, 11 Jan 2013 15:27:21 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r0BKRKFD026001 for ; Fri, 11 Jan 2013 18:27:21 -0200 Received: from [9.41.106.238] (chandra-desktop.austin.ibm.com [9.41.106.238]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r0BKRKaq025939; Fri, 11 Jan 2013 18:27:20 -0200 Subject: Re: pquota and gquota to be used together From: Chandra Seetharaman X-ASG-Orig-Subj: Re: pquota and gquota to be used together Reply-To: sekharan@us.ibm.com To: Arkadiusz =?UTF-8?Q?Mi=C5=9Bkiewicz?= Cc: xfs@oss.sgi.com In-Reply-To: <201301112018.39599.arekm@maven.pl> References: <201301112018.39599.arekm@maven.pl> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Fri, 11 Jan 2013 14:27:18 -0600 Message-ID: <1357936038.7361.2.camel@chandra-desktop.austin.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-24.el6) Content-Transfer-Encoding: 8bit X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13011120-5806-0000-0000-00001E20FB86 X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1357936047 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 Sorry. Priority changes and (lack of) access to the test systems delayed it and then it got out of my radar. Thanks for the reminder. Will get back to it and try to post it in the next couple of weeks. Regards, Chandra On Fri, 2013-01-11 at 20:18 +0100, Arkadiusz Miśkiewicz wrote: > Hi Chandra. > > Pinging about the "pquota and gquota to be used together" patchset. It was > almost close to be merged. It's over half year after last iteration I guess. > > Do you have any plans to finish this and get merged? > > Thanks, From tinguely@sgi.com Fri Jan 11 16:08:53 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BM8rbZ223290 for ; Fri, 11 Jan 2013 16:08:53 -0600 Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3F79304039; Fri, 11 Jan 2013 14:11:49 -0800 (PST) Message-ID: <50F08E26.1040306@sgi.com> Date: Fri, 11 Jan 2013 16:11:50 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: Dave Jones , Dave Chinner , xfs-oss Subject: Re: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block References: <50EEEF4C.8040801@redhat.com> <20130110224709.GK3120@dastard> In-Reply-To: <20130110224709.GK3120@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/10/13 16:47, Dave Chinner wrote: > On Thu, Jan 10, 2013 at 10:41:48AM -0600, Eric Sandeen wrote: >> Dave Jones hit this assert when doing a compile on recent git, with >> CONFIG_XFS_DEBUG enabled: >> >> XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 >> >> Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) >> contained "2" and not the proper offset, and I found that this value was >> changed after the memmoves under "Use a stale leaf for our new entry." >> in xfs_dir2_block_addname(), i.e. >> >> memmove(&blp[mid + 1],&blp[mid], >> (highstale - mid) * sizeof(*blp)); >> >> overwrote it. >> >> What has happened is that the previous call to xfs_dir2_block_compact() >> has rearranged things; it changes btp->count as well as the >> blp array. So after we make that call, we must recalculate the >> proper pointer to the leaf entries by making another call to >> xfs_dir2_block_leaf_p(). > > Perhaps a bit of ascii art to explain it for other reviewers to save > them having to spend a long time trying to understand the dir2 code? > > Pre-compact: > > dup + unused data pointer - size 72 bytes at offset 3560 > | > | > blp + leaf entry [0] - good - at offset 3632 > + leaf entry [1] - good > + leaf entry [2] - stale > + leaf entry [3] - good > + leaf entry [4] - good > + leaf entry [5] - stale > + leaf entry [6] - good > ..... > + leaf entry [n] - stale > + leaf entry [n+1] - good > + block tail - points to offset 3632 > > Post compact (removes all but the highest stale leaf entry, adds the > free space to the last unused data region): > > dup + unused data pointer - size 112 bytes at offset 3560 > | > | > blp | points into unused region, not to start of leaf array > | > | > + leaf entry [0] - good - at offset 3672 > + leaf entry [1] - good > + leaf entry [2] - good > + leaf entry [3] - good > ..... > + leaf entry [n] - stale > + leaf entry [n+1] - good > + block tail - points to offset 3672 > > So as you can see, blp needs to be updated to point at offset 3672... Thanks for the study aid - it did help explain the xfs_dir2_block_compact() code. Reviewed-by: Mark Tinguely From david@fromorbit.com Fri Jan 11 16:49:52 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0BMnqdd224768 for ; Fri, 11 Jan 2013 16:49:52 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04DBD304039 for ; Fri, 11 Jan 2013 14:52:51 -0800 (PST) X-ASG-Debug-ID: 1357944769-04bdf0430f68bc30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id J0ig7v0LIdvWanRY for ; Fri, 11 Jan 2013 14:52:50 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMNAOSW8FB5Labi/2dsb2JhbABEhVCyFIYeF3OCHgEBBScTHCMQCAMYCSUPBQ0YAyETiAcDDq5/DYdWFYtjhS4DlDWBVYEdiDGBaoUSgwk Received: from ppp121-45-166-226.lns20.syd6.internode.on.net (HELO dastard) ([121.45.166.226]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Jan 2013 09:22:48 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TtnSx-00026u-1C; Sat, 12 Jan 2013 09:52:47 +1100 Date: Sat, 12 Jan 2013 09:52:47 +1100 From: Dave Chinner To: Jeff Liu Cc: Abhijit Pawar , Ben Myers , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto Message-ID: <20130111225246.GO3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> <50EFB2FE.2000307@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EFB2FE.2000307@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1357944769 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119591 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 11, 2013 at 02:36:46PM +0800, Jeff Liu wrote: > On 01/09/2013 10:04 PM, Abhijit Pawar wrote: > > This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. > > > > Signed-off-by: Abhijit Pawar > > --- > > + if (kstrtoint(value, 10, &dswidth)) > > + return EINVAL; > > } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { > > mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > > } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { > > > checkpatch.pl show warning if we return EINVAL as below: > WARNING: return of an errno should typically be -ve (return -EINVAL) > > Can we just ignore such code style issue? Returning a positive error is not a code style issue. It's a correctness issue. the core of the XFS code returns positive error numbers as that's the way it was done on Irix (where the XFs code comes from). The rest of the Linux code tends to use negative values for error returns, and we've never converted the XFS code base to negative errors. You should always feel free to ignore checkpatch warnings that make no sense. I haven't used checkpatch now for several years - I stopped using it when it got too noisy warning about uselesss, trivial things in the XFS code base.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From trev@sgi.com Fri Jan 11 19:12:29 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0C1CTcQ230713 for ; Fri, 11 Jan 2013 19:12:29 -0600 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C627304059 for ; Fri, 11 Jan 2013 17:15:26 -0800 (PST) Received: from [134.15.129.55] (ca-sslvpn-129-55.corp.sgi.com [134.15.129.55]) by estes.americas.sgi.com (Postfix) with ESMTP id CCA9C7001E77 for ; Fri, 11 Jan 2013 19:15:25 -0600 (CST) Message-ID: <50F0B92A.9000500@sgi.com> Date: Fri, 11 Jan 2013 17:15:22 -0800 From: Trevor Hurst User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: oss.sgi.com migration Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Greetings, This is to inform you that oss.sgi.com will be unavailable on Sunday, January 13th between 4:00pm and 6:00pm PST for a migration. We are migrating the server to a virtual environment and adding some new tools and features. Please plan accordingly and sorry for the inconvenience. Regards, -- Trev -- Trevor Hurst Engineering Services Administration Silicon Graphics, Int. From jeff.liu@oracle.com Fri Jan 11 20:46:19 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0C2kJhK237408 for ; Fri, 11 Jan 2013 20:46:19 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8AD6D8F8033 for ; Fri, 11 Jan 2013 18:49:16 -0800 (PST) X-ASG-Debug-ID: 1357958951-04cbb035a5bc93c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 18T0PNaShdEsAYrY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Fri, 11 Jan 2013 18:49:11 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0C2mxUj003234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 12 Jan 2013 02:49:00 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0C2mwbM018424 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 12 Jan 2013 02:48:59 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0C2mwwM010141; Fri, 11 Jan 2013 20:48:58 -0600 Received: from [192.168.1.103] (/123.119.105.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 11 Jan 2013 18:48:58 -0800 Message-ID: <50F0CF13.9000106@oracle.com> Date: Sat, 12 Jan 2013 10:48:51 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Dave Chinner CC: Abhijit Pawar , Ben Myers , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> <50EFB2FE.2000307@oracle.com> <20130111225246.GO3120@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto In-Reply-To: <20130111225246.GO3120@dastard> Content-Type: text/plain; charset=ISO-8859-1 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: 1357958951 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-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.2.119606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/12/2013 06:52 AM, Dave Chinner wrote: > On Fri, Jan 11, 2013 at 02:36:46PM +0800, Jeff Liu wrote: >> On 01/09/2013 10:04 PM, Abhijit Pawar wrote: >>> This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. >>> >>> Signed-off-by: Abhijit Pawar >>> --- >>> + if (kstrtoint(value, 10, &dswidth)) >>> + return EINVAL; >>> } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { >>> mp->m_flags |= XFS_MOUNT_SMALL_INUMS; >>> } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { >>> >> checkpatch.pl show warning if we return EINVAL as below: >> WARNING: return of an errno should typically be -ve (return -EINVAL) >> >> Can we just ignore such code style issue? > > Returning a positive error is not a code style issue. It's a > correctness issue. the core of the XFS code returns positive error > numbers as that's the way it was done on Irix (where the XFs code > comes from). The rest of the Linux code tends to use negative values > for error returns, and we've never converted the XFS code base to > negative errors. > > You should always feel free to ignore checkpatch warnings that make > no sense. I haven't used checkpatch now for several years - I > stopped using it when it got too noisy warning about uselesss, > trivial things in the XFS code base.... Thanks for the clarification, that would save me time to handle checkpatch warnings against XFS in the future. :) Cheers, -Jeff From jeff.liu@oracle.com Fri Jan 11 20:51:40 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0C2peX8238159 for ; Fri, 11 Jan 2013 20:51:40 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1342030405F for ; Fri, 11 Jan 2013 18:54:37 -0800 (PST) X-ASG-Debug-ID: 1357959275-04cbb035a4bc9510001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id U3LfBlg7LBJxmAPC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Fri, 11 Jan 2013 18:54:35 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0C2sWgp006467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 12 Jan 2013 02:54:33 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0C2sVTp029601 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 12 Jan 2013 02:54:32 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0C2sVRn002287; Fri, 11 Jan 2013 20:54:31 -0600 Received: from [192.168.1.103] (/123.119.105.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 11 Jan 2013 18:54:31 -0800 Message-ID: <50F0D05B.5030507@oracle.com> Date: Sat, 12 Jan 2013 10:54:19 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Abhijit Pawar CC: Ben Myers , Alex Elder , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto References: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> X-ASG-Orig-Subj: Re: [PATCH 1/1] fs/xfs remove obsolete simple_strto In-Reply-To: <1357740282-2377-1-git-send-email-abhi.c.pawar@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1357959275 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-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.2.119606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/09/2013 10:04 PM, Abhijit Pawar wrote: > This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. > > Signed-off-by: Abhijit Pawar > --- > fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- > 1 files changed, 19 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index ab8839b..c407121 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -139,9 +139,9 @@ static const match_table_t tokens = { > > > STATIC unsigned long > -suffix_strtoul(char *s, char **endp, unsigned int base) > +suffix_kstrtoint(char *s, unsigned int base, int *res) > { > - int last, shift_left_factor = 0; > + int last, shift_left_factor = 0, _res; > char *value = s; > > last = strlen(value) - 1; > @@ -158,7 +158,10 @@ suffix_strtoul(char *s, char **endp, unsigned int base) > value[last] = '\0'; > } > > - return simple_strtoul((const char *)s, endp, base) << shift_left_factor; > + if (kstrtoint(s, base, &_res)) > + return -EINVAL; > + *res = _res << shift_left_factor; > + return 0; > } > > /* > @@ -174,7 +177,7 @@ xfs_parseargs( > char *options) > { > struct super_block *sb = mp->m_super; > - char *this_char, *value, *eov; > + char *this_char, *value; > int dsunit = 0; > int dswidth = 0; > int iosize = 0; > @@ -230,14 +233,16 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - mp->m_logbufs = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &mp->m_logbufs)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > this_char); > return EINVAL; > } > - mp->m_logbsize = suffix_strtoul(value, &eov, 10); > + if (suffix_kstrtoint(value, 10, &mp->m_logbsize)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > @@ -266,7 +271,8 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - iosize = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &iosize)) > + return EINVAL; > iosizelog = ffs(iosize) - 1; > } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { > if (!value || !*value) { > @@ -274,7 +280,8 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - iosize = suffix_strtoul(value, &eov, 10); > + if (suffix_kstrtoint(value, 10, &iosize)) > + return EINVAL; > iosizelog = ffs(iosize) - 1; > } else if (!strcmp(this_char, MNTOPT_GRPID) || > !strcmp(this_char, MNTOPT_BSDGROUPS)) { > @@ -296,14 +303,16 @@ xfs_parseargs( > this_char); > return EINVAL; > } > - dsunit = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &dsunit)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > this_char); > return EINVAL; > } > - dswidth = simple_strtoul(value, &eov, 10); > + if (kstrtoint(value, 10, &dswidth)) > + return EINVAL; > } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { > mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { > Reviewed-by: Jie Liu From sandeen@sandeen.net Fri Jan 11 20:55:12 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0C2tCgv238343 for ; Fri, 11 Jan 2013 20:55:12 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30167AC002 for ; Fri, 11 Jan 2013 18:58:11 -0800 (PST) X-ASG-Debug-ID: 1357959490-04bdf04312691640001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fLtUGiGrRQSyi011 for ; Fri, 11 Jan 2013 18:58:10 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (c-98-240-249-49.hsd1.mn.comcast.net [98.240.249.49]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C21BB6000454; Fri, 11 Jan 2013 20:58:09 -0600 (CST) Message-ID: <50F0D140.5060005@sandeen.net> Date: Fri, 11 Jan 2013 20:58:08 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , Dave Jones , xfs-oss , Dave Chinner Subject: Re: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block References: <50EEEF4C.8040801@redhat.com> <20130110224709.GK3120@dastard> <50F08E26.1040306@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: recalculate leaf entry pointer after compacting a dir2 block In-Reply-To: <50F08E26.1040306@sgi.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357959490 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/11/13 4:11 PM, Mark Tinguely wrote: > On 01/10/13 16:47, Dave Chinner wrote: >> On Thu, Jan 10, 2013 at 10:41:48AM -0600, Eric Sandeen wrote: >>> Dave Jones hit this assert when doing a compile on recent git, with >>> CONFIG_XFS_DEBUG enabled: >>> >>> XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 >>> >>> Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) >>> contained "2" and not the proper offset, and I found that this value was >>> changed after the memmoves under "Use a stale leaf for our new entry." >>> in xfs_dir2_block_addname(), i.e. >>> >>> memmove(&blp[mid + 1],&blp[mid], >>> (highstale - mid) * sizeof(*blp)); >>> >>> overwrote it. >>> >>> What has happened is that the previous call to xfs_dir2_block_compact() >>> has rearranged things; it changes btp->count as well as the >>> blp array. So after we make that call, we must recalculate the >>> proper pointer to the leaf entries by making another call to >>> xfs_dir2_block_leaf_p(). >> >> Perhaps a bit of ascii art to explain it for other reviewers to save >> them having to spend a long time trying to understand the dir2 code? >> >> Pre-compact: >> >> dup + unused data pointer - size 72 bytes at offset 3560 >> | >> | >> blp + leaf entry [0] - good - at offset 3632 >> + leaf entry [1] - good >> + leaf entry [2] - stale >> + leaf entry [3] - good >> + leaf entry [4] - good >> + leaf entry [5] - stale >> + leaf entry [6] - good >> ..... >> + leaf entry [n] - stale >> + leaf entry [n+1] - good >> + block tail - points to offset 3632 >> >> Post compact (removes all but the highest stale leaf entry, adds the >> free space to the last unused data region): >> >> dup + unused data pointer - size 112 bytes at offset 3560 >> | >> | >> blp | points into unused region, not to start of leaf array >> | >> | >> + leaf entry [0] - good - at offset 3672 >> + leaf entry [1] - good >> + leaf entry [2] - good >> + leaf entry [3] - good >> ..... >> + leaf entry [n] - stale >> + leaf entry [n+1] - good >> + block tail - points to offset 3672 >> >> So as you can see, blp needs to be updated to point at offset 3672... > > Thanks for the study aid - it did help explain the xfs_dir2_block_compact() code. Feel free to add that to the commit . . . Thanks, -Eric > Reviewed-by: Mark Tinguely > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Jan 11 21:10:34 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0C3AYMp239048 for ; Fri, 11 Jan 2013 21:10:34 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16DC28F8033 for ; Fri, 11 Jan 2013 19:13:31 -0800 (PST) X-ASG-Debug-ID: 1357960409-04bdf04310691a60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sBU7wkjt3w6XH4mm for ; Fri, 11 Jan 2013 19:13:29 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (c-98-240-249-49.hsd1.mn.comcast.net [98.240.249.49]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 68F936000620 for ; Fri, 11 Jan 2013 21:13:29 -0600 (CST) Message-ID: <50F0D4D8.6030109@sandeen.net> Date: Fri, 11 Jan 2013 21:13:28 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs-oss Subject: Re: [PATCH] xfsprogs: document fpunch command in xfs_io References: <50C39123.6050303@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: document fpunch command in xfs_io In-Reply-To: <50C39123.6050303@sandeen.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1357960409 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.119606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 12/8/12 1:12 PM, Eric Sandeen wrote: > Add manpage documentation for the new fpunch command in xfs_io. > > Also fix references to the fallocate manpage, which is (now?) > in section 2, not section 3 of the man pages. (Since it's > a syscall, not a library function). Ping on these patches? Pretty much just doc changes. -Eric > Signed-off-by: Eric Sandeen > --- > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index f7c6935..9b9ece8 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -355,17 +355,23 @@ manual page. > .BI "falloc [ \-k ]" " offset length" > Allocates reserved, unwritten space for part of a file using the > fallocate routine as described in the > -.BR fallocate (3) > +.BR fallocate (2) > manual page. > .RS 1.0i > .PD 0 > .TP 0.4i > .B \-k > will set the FALLOC_FL_KEEP_SIZE flag as described in > -.BR fallocate (3). > +.BR fallocate (2). > .PD > .RE > .TP > +.BI fpunch " offset length" > +Punches (de-allocates) blocks in the file by calling fallocate with > +the FALLOC_FL_PUNCH_HOLE flag as described in the > +.BR fallocate (2) > +manual page. > +.TP > .BI truncate " offset" > Truncates the current file at the given offset using > .BR ftruncate (2). > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Sat Jan 12 13:49:05 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0CJn5of026098 for ; Sat, 12 Jan 2013 13:49:05 -0600 Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBDAB8F8033; Sat, 12 Jan 2013 11:52:02 -0800 (PST) Message-ID: <50F1BEE3.6020906@sgi.com> Date: Sat, 12 Jan 2013 13:52:03 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: document fpunch command in xfs_io References: <50C39123.6050303@sandeen.net> <50F0D4D8.6030109@sandeen.net> In-Reply-To: <50F0D4D8.6030109@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/11/13 21:13, Eric Sandeen wrote: > On 12/8/12 1:12 PM, Eric Sandeen wrote: >> Add manpage documentation for the new fpunch command in xfs_io. >> >> Also fix references to the fallocate manpage, which is (now?) >> in section 2, not section 3 of the man pages. (Since it's >> a syscall, not a library function). > > Ping on these patches? Pretty much just doc changes. > > -Eric ... I will look at it on Monday. "V2-xfsprogs-document-all-commands-in-xfs_io.patch" has an error in chunk 2. "xfstests: ensure all xfs_io commands are documented in the manpage" has a minor problem with the group patch. --Mark. From xfs-owner@oss.sgi.com Sun Jan 13 02:16:23 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.7 required=5.0 tests=BAYES_50,MIME_QP_LONG_LINE, RCVD_IN_SBL,RCVD_IN_SORBS_WEB autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0D8GMoY088124 for ; Sun, 13 Jan 2013 02:16:23 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C352AC001 for ; Sun, 13 Jan 2013 00:19:20 -0800 (PST) X-ASG-Debug-ID: 1358065156-04cbb035a4c14500001-w1Z2WR Received: from venus.urjc.es (venus.urjc.es [193.147.184.9]) by cuda.sgi.com with ESMTP id eJbL61CFztBuMBDI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 13 Jan 2013 00:19:17 -0800 (PST) X-Barracuda-Envelope-From: joseantonio.monterrubio@urjc.es X-Barracuda-Apparent-Source-IP: 193.147.184.9 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArUnAMNt8lDBk7gH/2dsb2JhbABBBA+DLx2CGIZqnFcihyuHM4VTFnIBcYETEjuBCTQQKRgDAYVVByaCIQYIlmmXXgGGSYcJhXgEBwuEFwOBIYwZQ4gNAYEcjWKBS4E9QD8COIFmCBc X-IronPort-AV: E=Sophos;i="4.84,461,1355094000"; d="scan'208";a="25611654" Received: from urano.urjc.es ([193.147.184.7]) by venus.urjc.es with ESMTP; 13 Jan 2013 09:19:16 +0100 Received: from urano.urjc.es (localhost [127.0.0.1]) by urano.urjc.es (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id r0D8JA9c019196; Sun, 13 Jan 2013 09:19:13 +0100 Received: (from www-data@localhost) by urano.urjc.es (8.14.3/8.14.3/Submit) id r0D8IqRl019190; Sun, 13 Jan 2013 09:18:52 +0100 X-Authentication-Warning: urano.urjc.es: www-data set sender to joseantonio.monterrubio@urjc.es using -f Received: from 41.190.3.19 ([41.190.3.19]) by urano.urjc.es (Horde Framework) with HTTP; Sun, 13 Jan 2013 09:18:51 +0100 Message-ID: <20130113091851.99397g44ppqz6ry8@urano.urjc.es> Date: Sun, 13 Jan 2013 09:18:51 +0100 From: "WEBMAIL ADINISTRATOR" To: undisclosed-recipients:; Subject: Konto Warnung MIME-Version: 1.0 X-ASG-Orig-Subj: Konto Warnung Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable User-Agent: Internet Messaging Program (IMP) H3 (4.2) X-Barracuda-Connect: venus.urjc.es[193.147.184.9] X-Barracuda-Start-Time: 1358065157 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-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119721 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars Ihre Mailbox =FCberschritten Es Storage Limit, wie von Ihrem =20 Administrator Set, Und Sie werden nicht in der Lage, neue Mails =20 empfangen, bis Sie-Re validieren. Klicken Sie: http: http://shusics.phpforms.net/view_forms/view/b1dd5192ce#to= p System Administrator Webmail Admin From fw@deneb.enyo.de Sun Jan 13 03:23:21 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0D9NKtW093914 for ; Sun, 13 Jan 2013 03:23:21 -0600 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CF7E30405F for ; Sun, 13 Jan 2013 01:26:18 -0800 (PST) X-ASG-Debug-ID: 1358069175-04bdf043126df6b0001-NocioJ Received: from ka.mail.enyo.de (ka.mail.enyo.de [87.106.162.201]) by cuda.sgi.com with ESMTP id iLG1Q6ep2CIDUqd4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 13 Jan 2013 01:26:17 -0800 (PST) X-Barracuda-Envelope-From: fw@deneb.enyo.de X-Barracuda-Apparent-Source-IP: 87.106.162.201 Received: from [172.17.135.4] (helo=deneb.enyo.de) by ka.mail.enyo.de with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) id 1TuJpW-0006Y2-29; Sun, 13 Jan 2013 10:26:14 +0100 Received: from fw by deneb.enyo.de with local (Exim 4.80) (envelope-from ) id 1TuJpV-00052g-Qd; Sun, 13 Jan 2013 10:26:13 +0100 From: Florian Weimer To: "Bradley C. Kuszmaul" Cc: xfs@oss.sgi.com Subject: Re: hole punching performance References: X-ASG-Orig-Subj: Re: hole punching performance Date: Sun, 13 Jan 2013 10:26:13 +0100 In-Reply-To: (Bradley C. Kuszmaul's message of "Wed, 2 Jan 2013 16:51:07 -0500") Message-ID: <87pq195t8q.fsf@mid.deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: ka.mail.enyo.de[87.106.162.201] X-Barracuda-Start-Time: 1358069176 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-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.2.119725 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header * Bradley C. Kuszmaul: > The question I have: What will happen to the performance of other > threads doing read() and write() operations? Will hole-punching slow > down the other read() and write() operations running in other threads? Assuming that hole-punching creates extents (not sure if it does, you can check with filefrag or other tools), you might experience a slowdown during open(), when the entire list of extents is read from disk. I once was a heavy Berkeley DB user and had files with dozens of gigabytes containing hundreds of thousands of extents, and open() times in the order of minutes were not unusual with a cold cache and other concurrent read activities from the same RAID device. But these files grew over time=E2=80=94perhaps hole punching results in better locali= ty of the extent data, so that reading it doesn't take so much time in your case. From xfs-owner@oss.sgi.com Sun Jan 13 09:48:07 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_50,HTML_FONT_SIZE_LARGE, HTML_MESSAGE,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0DFm7j3112122 for ; Sun, 13 Jan 2013 09:48:07 -0600 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A105A8F8039 for ; Sun, 13 Jan 2013 07:51:08 -0800 (PST) X-ASG-Debug-ID: 1358092265-04cbb035a5c24800001-w1Z2WR Received: from mail-ob0-f200.google.com (mail-ob0-f200.google.com [209.85.214.200]) by cuda.sgi.com with ESMTP id yrdghMTTz7iIfGXL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 13 Jan 2013 07:51:05 -0800 (PST) X-Barracuda-Envelope-From: l-i+bncBCKPXIXORUCRBYVPZODQKGQEMICMY5Y@peterwfh1.net X-Barracuda-Apparent-Source-IP: 209.85.214.200 Received: by mail-ob0-f200.google.com with SMTP id wd20sf15629298obb.11 for ; Sun, 13 Jan 2013 07:51:05 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-beenthere:x-received:x-received:received-spf :mime-version:x-originating-ip:date:message-id:subject:from:to :x-gm-message-state:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-google-group-id:list-post:list-help:list-archive :list-unsubscribe:content-type; bh=5PtATTd1XCaWm2js/ygEUhONsrGv+nZPP8FDfQqmRmo=; b=jXbWuy26D/7XuKMVYtZYG9LYSFC4M1wSJsMFPJhyFe38ZTT/MtATYC/pTa+mbznepn ova67xv4JymXHMbkN1gxZz3CMiK0PDAgoyJXa/ouEADaC9W/a6UFcuk/vGjBqlIHRUha 8dLHqoCAmwRPCmlal5H7X70It6Ef/wm3rnhppgGwjghpntTehZzkK0WbbWM5uYa62KXh btVwDzBKvg4/UpIun3B1oDV3BSrRQUXGXwth3p5iCNoZuio20KhbLKxOfVqk0fUEpnoD 4cSGKDKykpDks7mugvawl6gAbYZgIAtZXx6ywWVE+UG5STrKZLTUtGvbM5i/VyWxyvMP CKWg== X-Received: by 10.50.191.195 with SMTP id ha3mr2076749igc.7.1358092264761; Sun, 13 Jan 2013 07:51:04 -0800 (PST) X-BeenThere: l-i@peterwfh1.net Received: by 10.50.214.7 with SMTP id nw7ls1665260igc.18.canary; Sun, 13 Jan 2013 07:50:56 -0800 (PST) X-Received: by 10.66.76.198 with SMTP id m6mr224355336paw.32.1358092256277; Sun, 13 Jan 2013 07:50:56 -0800 (PST) X-Received: by 10.66.76.198 with SMTP id m6mr224355335paw.32.1358092256256; Sun, 13 Jan 2013 07:50:56 -0800 (PST) Received: from mail-da0-f49.google.com (mail-da0-f49.google.com [209.85.210.49]) by mx.google.com with ESMTPS id tp3si11358110pbc.265.2013.01.13.07.50.56 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 13 Jan 2013 07:50:56 -0800 (PST) Received-SPF: pass (google.com: domain of peter@peterwfh1.net designates 209.85.210.49 as permitted sender) client-ip=209.85.210.49; Received: by mail-da0-f49.google.com with SMTP id v40so1460338dad.36 for ; Sun, 13 Jan 2013 07:50:56 -0800 (PST) MIME-Version: 1.0 Received: by 10.69.0.40 with SMTP id av8mr247683816pbd.117.1358092256066; Sun, 13 Jan 2013 07:50:56 -0800 (PST) Received: by 10.68.25.5 with HTTP; Sun, 13 Jan 2013 07:50:55 -0800 (PST) X-Originating-IP: [92.98.172.85] Date: Sun, 13 Jan 2013 19:50:55 +0400 Message-ID: Subject: Lower price / Dubai / Tecom / Madison Residency / 1 Bedroom / 050-8320722 From: Peter Wong X-ASG-Orig-Subj: Lower price / Dubai / Tecom / Madison Residency / 1 Bedroom / 050-8320722 To: l-i X-Gm-Message-State: ALoCoQmWQqtMDb/F945TVuNa5W0FyfN7GeXGxsDnoybZjXAFy1+r3SSBoiyR2Uf6JLNUw+lrW8Dx X-Original-Sender: peter@peterwfh1.net X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of peter@peterwfh1.net designates 209.85.210.49 as permitted sender) smtp.mail=peter@peterwfh1.net Reply-To: peter@peterwfh1.net Precedence: list Mailing-list: list l-i@peterwfh1.net; contact l-i+owners@peterwfh1.net List-ID: X-Google-Group-Id: 936336407204 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Content-Type: multipart/alternative; boundary=047d7b2e13017ebd8804d32d7e87 X-Barracuda-Connect: mail-ob0-f200.google.com[209.85.214.200] X-Barracuda-Start-Time: 1358092265 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-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, HTML_FONT_SIZE_LARGE, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119751 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --047d7b2e13017ebd8804d32d7e87 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Dear * * * Lower price / Dubai / Tecom / Madison Residency / 1 Bedroom / 050-8320722 ( 3 unit sale) Located : Madison Residency at Dubai Tecom raises the standards of luxury living to new heights. Property Type : Apartment Tenure : Freehold property Title Type : Madison Residency offers a freehold facility for UAE nationals and expatriates Price : Net price+ Transfer Fee 2 % + Broker Fee 2% Bedrooms : 1Bedroom Apartment Bathrooms : 1barthrooms Unit type : Freehold apartment Parking lot : 1 parking Furnishing : Built-in Wardrobe Facilities : World-class recreational facilities Maintenance Fee : AED8,500.00 per/year Rent : AED56,000.00yearly Yield : 7% - Water park - Banquet hall and meeting room facility - Children's play area - Waterfront apartments - Health club and Gymnasium - 24hr Door Man - Built-in Wardrobes - Central A/C - Balcony Floor Sq.m View Parking Price 3 68.13 Road Nil AED600,000.00 6 68.13 Road 1 AED630,000.00 16 68.13 Road 1 AED690,000.00 The Best* * =E7=8E=8B=E7=A6=8F=E5=85=B4 Peter Wong F H*( RERA BRN:24932) Mob : +971 50 8320722 Fax : +971 4 4473880 email : peter@peterwfh1.net Add : Sky Land Realty ( RERA ORN :196 ) Suite 1609, Prism Tower, Business Bay P.O.Box 358676 Dubai. UAE * Remove me from your mailing list The content of this email is only a guide.The information,prices and availability of the properties may change without prior notice,Thank !* --=20 To unsubscribe, send email to l-i+unsubscribe@peterwfh1.net --047d7b2e13017ebd8804d32d7e87 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear


Lower price / Dubai /=C2=A0Tecom /=C2=A0Madison=C2=A0Residency=C2=A0/=C2=A01 Bedroom=C2=A0/ 050-8320722

(= 3 unit sale)

=C2=A0<= /span>

Located= =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :=C2=A0 Madison Residency at Dubai=C2=A0Tecom raises the standards of luxury living to new heights.

Propert= y Type=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0:=C2=A0 Apartment

Tenure= =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=C2=A0 :=C2=A0 Freehold=C2=A0property

Title T= ype=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0 =C2=A0 :=C2=A0 Madison Residency offers a freehold facility for UA= E nationals and expatriates

Price= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 :=C2=A0 Net price+ Transfer Fee 2 % + Broker Fee 2%

Bedroom= s=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 :=C2=A0=C2=A01Bedroom Apartment

Bathroo= ms=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0 :=C2=A0 1barthrooms

Unit ty= pe=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 :=C2=A0 Freehold apartment

Parking lot=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 1 parking =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0

Furnish= ing=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0:=C2=A0 Built-in Wardrobe

Facilit= ies=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 World-class recreational facilities

Mainten= ance Fee=C2=A0 =C2=A0:=C2=A0 AED8,500.00 per/year

Rent=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=C2=A0=C2=A0=C2=A0=C2=A0 :=C2=A0=C2=A0 AED56,000.00yearly

Yield= =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=C2=A0=C2=A0=C2=A0=C2=A0 :=C2=A0=C2=A0 7%

=C2=A0<= /span>

=C2=A0<= /span>

  • Water park
  • Banquet hall and meeting room facility
  • Children'= s play area
  • Waterfront apartments
  • Health club and Gymnasium
  • 24hr Door Man
  • Built-in Wardrobes
  • Central A/C
  • Balcony

Floor=

Sq.m<= /span>

View<= /span>

Parki= ng

Price=

3

68.13=

Road<= /span>

Nil

AED60= 0,000.00

6

68.13=

Road<= /span>

1

AED63= 0,000.00

16

68.13=

Road<= /span>

1

AED69= 0,000.00

=C2=A0<= /span>



The Best


=E7=8E=8B=E7=A6=8F=E5=85=B4
Peter Wong F H
( RERA BRN:2= 4932)


Mob=C2=A0=C2=A0 : +971 50 8320722
Fax=C2=A0=C2=A0=C2=A0 : +971 4 447= 3880
email=C2=A0 :=C2=A0 peter@peterwfh1.net

Add=C2=A0=C2=A0=C2=A0 : Sky Land= Realty ( RERA ORN :196 )
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Suite 1609, Prism Tower,
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Business= Bay
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = P.O.Box 358676 Dubai. UAE

Remove me from your mailing list =

The content of this email is only a guide.The information,prices and=20 availability of the properties may change without prior notice,Thank !
<= /i>

--
To unsubscribe, send email to l-i+unsubscribe@peterwfh1.net
 
 
--047d7b2e13017ebd8804d32d7e87-- From kuszmaul@gmail.com Sun Jan 13 10:33:50 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0DGXofw114585 for ; Sun, 13 Jan 2013 10:33:50 -0600 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DD6B30405F for ; Sun, 13 Jan 2013 08:36:51 -0800 (PST) X-ASG-Debug-ID: 1358095007-04cb6c05a7c73730001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id 722onQRglZ3NOjrY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 13 Jan 2013 08:36:47 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id qd14so4057179ieb.6 for ; Sun, 13 Jan 2013 08:36:47 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=+i91A6LvA01zV3rr2+Ouh/i0MDzI8YJYUwDn6gQ+h18=; b=uKgGPeI2c2vZFzvzvvAVsg0L1nUV6CUdrZfgvYj24Y4oxUlqKOPKubHsHAgl2NeWlu XLqEMGItdP09GV7BMHzkCX4ug38OhrOR3FOAd6z8c31nA7vXiI6nWXtnfQq4nhJD0u4k j+YPUynhmB0ApL2FvbmHUZ/5bduZqMLHU6Zhee1Ah2WK0PqV+rsh2LUZT3zYyYRoNUTP Anesd68L0UVWoRoT7tnVc8su8wMYRZ0MSOTKHZJEdj6ef/uHj2MCvZUg+Y0pmDMt3uGz cxuNj47F5BhscN5hLxS4eonDTI13QxQdCOBhi6FvtaQRa9e1IQT7V2FLtE3H8iJvNfW/ jXSA== Received: by 10.50.16.144 with SMTP id g16mr4799395igd.2.1358095007605; Sun, 13 Jan 2013 08:36:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.58.106 with HTTP; Sun, 13 Jan 2013 08:36:27 -0800 (PST) In-Reply-To: <87pq195t8q.fsf@mid.deneb.enyo.de> References: <87pq195t8q.fsf@mid.deneb.enyo.de> From: "Bradley C. Kuszmaul" Date: Sun, 13 Jan 2013 11:36:27 -0500 Message-ID: Subject: Re: hole punching performance To: Florian Weimer X-ASG-Orig-Subj: Re: hole punching performance Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=f46d044305ce7fe34204d32e22a5 X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1358095007 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-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.2.119753 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 --f46d044305ce7fe34204d32e22a5 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Where can I read about extents and xfs? On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer wrote: > * Bradley C. Kuszmaul: > > > The question I have: What will happen to the performance of other > > threads doing read() and write() operations? Will hole-punching slow > > down the other read() and write() operations running in other threads? > > Assuming that hole-punching creates extents (not sure if it does, you > can check with filefrag or other tools), you might experience a > slowdown during open(), when the entire list of extents is read from > disk. > > I once was a heavy Berkeley DB user and had files with dozens of > gigabytes containing hundreds of thousands of extents, and open() > times in the order of minutes were not unusual with a cold cache and > other concurrent read activities from the same RAID device. But these > files grew over time=97perhaps hole punching results in better locality > of the extent data, so that reading it doesn't take so much time in > your case. > --f46d044305ce7fe34204d32e22a5 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Where can I read about extents and xfs?=A0

On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer <fw@deneb.enyo.de>= ; wrote:
* Bradley C. Kuszmaul:

> The question I have: =A0What will happen to the performance of other > threads doing read() and write() operations? =A0Will hole-punching slo= w
> down the other read() and write() operations running in other threads?=

Assuming that hole-punching creates extents (not sure if it does, you=
can check with filefrag or other tools), you might experience a
slowdown during open(), when the entire list of extents is read from
disk.

I once was a heavy Berkeley DB user and had files with dozens of
gigabytes containing hundreds of thousands of extents, and open()
times in the order of minutes were not unusual with a cold cache and
other concurrent read activities from the same RAID device. =A0But these files grew over time=97perhaps hole punching results in better locality
of the extent data, so that reading it doesn't take so much time in
your case.

--f46d044305ce7fe34204d32e22a5-- From bpm@sgi.com Sun Jan 13 13:46:43 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0DJkhkF120835 for ; Sun, 13 Jan 2013 13:46:43 -0600 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF24C8F804C; Sun, 13 Jan 2013 11:49:41 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 656BD4266DC; Sun, 13 Jan 2013 13:49:41 -0600 (CST) Date: Sun, 13 Jan 2013 13:49:41 -0600 From: Ben Myers To: "Bradley C. Kuszmaul" Cc: Florian Weimer , xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130113194941.GB27055@sgi.com> References: <87pq195t8q.fsf@mid.deneb.enyo.de> 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.20 (2009-06-14) Hey Florian & Bradley, On Sun, Jan 13, 2013 at 11:36:27AM -0500, Bradley C. Kuszmaul wrote: > Where can I read about extents and xfs? Look here: http://xfs.org/index.php/XFS_Papers_and_Documentation > On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer wrote: > > > * Bradley C. Kuszmaul: > > > > > The question I have: What will happen to the performance of other > > > threads doing read() and write() operations? Will hole-punching slow > > > down the other read() and write() operations running in other threads? > > > > Assuming that hole-punching creates extents (not sure if it does, you > > can check with filefrag or other tools), Yep, it can. For example, if you have one large extent and punch out the middle you end up with two in the block map. Use xfs_bmap to look at the extent list. > you might experience a > > slowdown during open(), when the entire list of extents is read from disk. The docs probably describe this better than I can, see the data extents section of the filesystem structure doc. Inline extent lists would already have been read in with the inode, so it's not more expensive than reading the inode itself because it's in the same block. If you have a large extent list in a btree you can expect it to be read in as you access the data. > > I once was a heavy Berkeley DB user and had files with dozens of gigabytes > > containing hundreds of thousands of extents, and open() times in the order > > of minutes were not unusual with a cold cache and other concurrent read > > activities from the same RAID device. Ouch. I would not have expected open times that bad. > > But these files grew over > > time—perhaps hole punching results in better locality of the extent data, > > so that reading it doesn't take so much time in your case. xfs_bmap could help answer that question... ;) Regards, Ben From bpm@oss.sgi.com Sun Jan 13 14:45:42 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0DKjgjv123676 for ; Sun, 13 Jan 2013 14:45:42 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r0DKjfLE123639; Sun, 13 Jan 2013 14:45:41 -0600 Date: Sun, 13 Jan 2013 14:45:41 -0600 Message-Id: <201301132045.r0DKjfLE123639@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-10-ga17164e X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 83a9ba00573904953c58565226f1d3bab9f10983 X-Git-Newrev: a17164e54bf0e3c2cbc72c35b9f67c2873a122dd This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated a17164e fs/xfs remove obsolete simple_strto d460863 xfs: recalculate leaf entry pointer after compacting a dir2 block from 83a9ba00573904953c58565226f1d3bab9f10983 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a17164e54bf0e3c2cbc72c35b9f67c2873a122dd Author: Abhijit Pawar Date: Wed Jan 9 19:34:42 2013 +0530 fs/xfs remove obsolete simple_strto This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. Signed-off-by: Abhijit Pawar Reviewed-by: Jie Liu Signed-off-by: Ben Myers commit d4608632ec8f4ae3ffecdd343ede34e60eabc64f Author: Eric Sandeen Date: Thu Jan 10 10:41:48 2013 -0600 xfs: recalculate leaf entry pointer after compacting a dir2 block Dave Jones hit this assert when doing a compile on recent git, with CONFIG_XFS_DEBUG enabled: XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) contained "2" and not the proper offset, and I found that this value was changed after the memmoves under "Use a stale leaf for our new entry." in xfs_dir2_block_addname(), i.e. memmove(&blp[mid + 1], &blp[mid], (highstale - mid) * sizeof(*blp)); overwrote it. What has happened is that the previous call to xfs_dir2_block_compact() has rearranged things; it changes btp->count as well as the blp array. So after we make that call, we must recalculate the proper pointer to the leaf entries by making another call to xfs_dir2_block_leaf_p(). Dave provided a metadump image which led to a simple reproducer (create a particular filename in the affected directory) and this resolves the testcase as well as the bug on his live system. Thanks also to dchinner for looking at this one with me. Signed-off-by: Eric Sandeen Tested-by: Dave Jones Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2_block.c | 6 ++++-- fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- 2 files changed, 23 insertions(+), 12 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Sun Jan 13 14:45:57 2013 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id r0DKjvNv123826 for ; Sun, 13 Jan 2013 14:45:57 -0600 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id r0DKjuI3123792; Sun, 13 Jan 2013 14:45:56 -0600 Date: Sun, 13 Jan 2013 14:45:56 -0600 Message-Id: <201301132045.r0DKjuI3123792@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-10-ga17164e X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 83a9ba00573904953c58565226f1d3bab9f10983 X-Git-Newrev: a17164e54bf0e3c2cbc72c35b9f67c2873a122dd This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated a17164e fs/xfs remove obsolete simple_strto d460863 xfs: recalculate leaf entry pointer after compacting a dir2 block from 83a9ba00573904953c58565226f1d3bab9f10983 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a17164e54bf0e3c2cbc72c35b9f67c2873a122dd Author: Abhijit Pawar Date: Wed Jan 9 19:34:42 2013 +0530 fs/xfs remove obsolete simple_strto This patch replaces usages of obsolete simple_strtoul with kstrtoint in xfs_args and suffix_strtoul. Signed-off-by: Abhijit Pawar Reviewed-by: Jie Liu Signed-off-by: Ben Myers commit d4608632ec8f4ae3ffecdd343ede34e60eabc64f Author: Eric Sandeen Date: Thu Jan 10 10:41:48 2013 -0600 xfs: recalculate leaf entry pointer after compacting a dir2 block Dave Jones hit this assert when doing a compile on recent git, with CONFIG_XFS_DEBUG enabled: XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) contained "2" and not the proper offset, and I found that this value was changed after the memmoves under "Use a stale leaf for our new entry." in xfs_dir2_block_addname(), i.e. memmove(&blp[mid + 1], &blp[mid], (highstale - mid) * sizeof(*blp)); overwrote it. What has happened is that the previous call to xfs_dir2_block_compact() has rearranged things; it changes btp->count as well as the blp array. So after we make that call, we must recalculate the proper pointer to the leaf entries by making another call to xfs_dir2_block_leaf_p(). Dave provided a metadump image which led to a simple reproducer (create a particular filename in the affected directory) and this resolves the testcase as well as the bug on his live system. Thanks also to dchinner for looking at this one with me. Signed-off-by: Eric Sandeen Tested-by: Dave Jones Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2_block.c | 6 ++++-- fs/xfs/xfs_super.c | 29 +++++++++++++++++++---------- 2 files changed, 23 insertions(+), 12 deletions(-) hooks/post-receive -- XFS development tree From cattelan@thebarn.com Sun Jan 13 22:27:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EFA427F36 for ; Sun, 13 Jan 2013 22:27:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D1BF1304032 for ; Sun, 13 Jan 2013 20:27:04 -0800 (PST) X-ASG-Debug-ID: 1358137620-04cb6c05a8c9be50001-NocioJ Received: from x.digitalelves.com (x.digitalelves.com [209.98.77.55]) by cuda.sgi.com with ESMTP id SSoYVbrgSwSXeazH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 13 Jan 2013 20:27:00 -0800 (PST) X-Barracuda-Envelope-From: cattelan@thebarn.com X-Barracuda-Apparent-Source-IP: 209.98.77.55 Received: from smoke.x.thebarn.com (c-66-41-26-220.hsd1.mn.comcast.net [66.41.26.220]) (authenticated bits=0) by x.digitalelves.com (8.14.5/8.14.5) with ESMTP id r0E4QNF4086740 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Sun, 13 Jan 2013 22:26:59 -0600 (CST) (envelope-from cattelan@thebarn.com) Message-ID: <50F388EE.6060603@thebarn.com> Date: Sun, 13 Jan 2013 22:26:22 -0600 From: Russell Cattelan User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: oss.sgi.com migration References: <50F0B92A.9000500@sgi.com> <20130113230247.GB19173@dastard> X-ASG-Orig-Subj: Re: oss.sgi.com migration In-Reply-To: <20130113230247.GB19173@dastard> X-Enigmail-Version: 1.4.6 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigD21A8947F8EB34EF19F1CE16" X-Barracuda-Connect: x.digitalelves.com[209.98.77.55] X-Barracuda-Start-Time: 1358137620 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-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.2.119799 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigD21A8947F8EB34EF19F1CE16 Content-Type: multipart/mixed; boundary="------------060006030703030501060801" This is a multi-part message in MIME format. --------------060006030703030501060801 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 1/13/13 5:02 PM, Dave Chinner wrote: > On Fri, Jan 11, 2013 at 05:15:22PM -0800, Trevor Hurst wrote: >> >> Greetings, >> >> This is to inform you that oss.sgi.com will be unavailable on >> Sunday, January 13th between 4:00pm and 6:00pm PST for a >> migration. We are migrating the server to a virtual environment and >> adding some new tools and features. >> >> Please plan accordingly and sorry for the inconvenience. >=20 > git fetches from oss.sgi.com seem to be hanging. The connection gets > established, but no data comes down the pipe from the server. As > such, my hourly cron job that pulls from oss.sgi.com trees has been > failing for the last 12 hours.... So I'll use this as a test to the list. I'm still working on getting the daemon online. Sorry about this ... this is one thing that we didn't verify was operational before the switch. -Russell >=20 > Perhaps a problem related to the migration? >=20 > Cheers, >=20 > Dave. >=20 --------------060006030703030501060801 Content-Type: text/x-vcard; charset=utf-8; name="cattelan.vcf" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="cattelan.vcf" begin:vcard fn:Russell Cattelan n:Cattelan;Russell org:Digital Elves Inc adr:;;2824 Lakeview Ave;Roseville;MN;55113;usa email;internet:cattelan@digitalelves.com tel;work:612 293 6009 tel;cell:612 805 3144 x-mozilla-html:FALSE url:http://digitalelves.com version:2.1 end:vcard --------------060006030703030501060801-- --------------enigD21A8947F8EB34EF19F1CE16 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (Darwin) Comment: Using GnuPG with undefined - http://www.enigmail.net/ iEYEARECAAYFAlDziO4ACgkQNRmM+OaGhBj0NQCghYiHNv7oMf5tAaVRNiY5Xdyd UPYAnik/6RyYz7yDY/n8NbUecqE7gaZv =zipU -----END PGP SIGNATURE----- --------------enigD21A8947F8EB34EF19F1CE16-- From david@fromorbit.com Mon Jan 14 01:17:53 2013 Return-Path: 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 C36907F37 for ; Mon, 14 Jan 2013 01:17:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DD70304039 for ; Sun, 13 Jan 2013 23:17:51 -0800 (PST) X-ASG-Debug-ID: 1358147844-04bdf043107203a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Y2GUhOY57tUpJbEG for ; Sun, 13 Jan 2013 23:17:24 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-NotFiltered: toobig X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApsEAFyw81B5Layw/2dsb2JhbAC+Xw Received: from ppp121-45-172-176.lns20.syd6.internode.on.net (HELO dastard) ([121.45.172.176]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Jan 2013 17:47:00 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TueHy-00076T-PS for xfs@oss.sgi.com; Mon, 14 Jan 2013 18:16:58 +1100 Date: Mon, 14 Jan 2013 18:16:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code Message-ID: <20130114071658.GF19173@dastard> X-ASG-Orig-Subj: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1358147844 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 Hi folks, Here's a first cut at bringing the userspace code in sync with the current kernel code. This patch addresses libxfs and getting everything to work with that update. This is currently one titanic patch because this sync has been an utter nightmare to get done, and I've been working on it since before christmas just to get it this far. The diffstat should give some context to the size of the sync: 83 files changed, 8142 insertions(+), 7092 deletions(-) Firstly, next time *anyone* rearranges kernel code to "make it easier to sync with userspace" must also change the userspace code at the same time. The mess that the dir2 header re-arrangement made of this sync was terrible, and it appears to be far from optimal to minimise userspace sync issues. Hint: xfs_db, xfs_repair and metadump use lots of the kernel code to parse and modify directory structures. Given that the dir2 code was also turned upside down by the removal of the dabuf infrastructure and replacement with discontiguous xfs_bufs, this made for a real nightmare. Secondly, I've brought across the verifiers into the userspace code, but they are not yet hooked up to the IO infrastructure. I'll need to do that as part of introducing the CRC infrastructure to userspace, as we'll still need all that sort of checking to be done regardless of how the metadta is read or written... Finally, some notes on things that would make it easier to do syncs in future by making the contents of the files shared between user and kernel space contain less kernel only code: - readdir/getdents is not used in userspace. Move all the kernel readdir code to xfs_dir2_readdir.c out of the core xfs_dir2_{sf,block,node,data}.c files - sync regularly. i.e. at the end of every kernel cycle. - removal of attributes is not done in userspace. Move all of the attr removal code to a kernel only file. - listing of attributes is not done in userspace. Move all of the attr listing code to a kernel only file. - move all the non-mount related code out of xfs_mount.c as very little of the kernel mount.c is used in userspace - in-core superblock code into own file - other superblock stuff into own file - per-ag infrastructure into own file - sync regularly. i.e. at the end of every kernel cycle. - move extent tree stuff in xfs_inode.c into own file as it is not used in userspace - move inode flushing into own file - userspace has it's won versions - move inode locking into own file - userspace doesn't use locking. - sync regularly. i.e. at the end of every kernel cycle. - work out how to handle static inline functions more cleanly as userspace has need of inline functions inside __KERNEL__ regions but they can't be included from the header files because the structure definition in libxfs.h requires definitions from the header file which includes the static inline function which then fails to compile because the structure is not defined. e.g. xfs_inode and xfs_get/set_projid. - make sure kernel/user functions pass the same parameters. e.g. xfs_get/set_projid require xfs_icdinode to be passed because they are called from xfs_db/xfs_repair which don't have a struct xfs_inode context, while the kernel versions pass struct xfs_inode.... - kernel infrastructure changes tend to have major impact on the userspace code - changes to the userspace code should be done at the same time. - sync regularly. i.e. at the end of every kernel cycle. This patch, despite it's size and complexity, seems to run through xfstests without any obvious regressions. I've run with standard 4k block sizes, 4k block/64k dirblock size and 512byte block/32k directory block sizes without unexpected issues on a 3.8-rc2 kernel. I could probably split this huge patch up into a couple of patches (one to do all the discontiguous buffer support, one for all the dir2 header changes and fixing the fallout, and one for the rest), but right now I don't have time for that so I figured I just make people aware that they are going to nee dto put some time aside for review in the not too distant future... The next step in this work is bring across the kernel CRC infrastructure so libxlog can be updated to match the kernel code. Once that is in place, I'll then add all the CRC on-disk format changes and I can start to test the kernel changes I have. I'm hoping to have all the kernel changes ready for review by the end of next week in the hope that we can get the kernel changes reviewd for the 3.9 merge cycle... Anyway, patch is below. Feedback and testing welcome. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfsprogs: sync libxfs code to 3.8-rc2 kernel code From: Dave Chinner Update code base to match kernel 3.8-rc2 code base and make it work. Signed-off-by: Dave Chinner --- db/check.c | 20 +- db/dir.h | 6 + db/dir2.c | 10 +- db/dir2.h | 32 + db/dir2sf.c | 15 +- db/dirshort.c | 1 + db/metadump.c | 20 +- estimate/xfs_estimate.c | 3 + fsr/xfs_fsr.c | 2 +- include/Makefile | 3 +- include/libxfs.h | 143 +- include/linux.h | 1 + include/platform_defs.h.in | 5 + include/swab.h | 38 + include/xfs.h | 1 + include/xfs_ag.h | 29 +- include/xfs_alloc.h | 57 +- include/xfs_alloc_btree.h | 16 +- include/xfs_attr_leaf.h | 27 +- include/xfs_bmap.h | 325 +---- include/xfs_bmap_btree.h | 1 + include/xfs_btree.h | 24 +- include/xfs_buf_item.h | 55 +- include/xfs_da_btree.h | 59 +- include/xfs_dinode.h | 4 +- include/xfs_dir1.h | 13 + include/xfs_dir2.h | 87 +- include/xfs_dir2_block.h | 92 -- include/xfs_dir2_data.h | 184 --- include/xfs_dir2_format.h | 597 +++++++++ include/xfs_dir2_leaf.h | 253 ---- include/xfs_dir2_node.h | 100 -- include/xfs_dir2_sf.h | 171 --- include/xfs_fs.h | 38 +- include/xfs_ialloc.h | 17 +- include/xfs_ialloc_btree.h | 2 + include/xfs_inode.h | 231 ++-- include/xfs_inode_item.h | 22 +- include/xfs_inum.h | 16 - include/xfs_log.h | 31 +- include/xfs_log_priv.h | 101 +- include/xfs_mount.h | 40 +- include/xfs_quota.h | 47 +- include/xfs_rtalloc.h | 4 +- include/xfs_sb.h | 10 +- include/xfs_trace.h | 69 +- include/xfs_trans.h | 88 +- include/xfs_types.h | 24 +- libxfs/Makefile | 2 +- libxfs/init.c | 3 - libxfs/logitem.c | 20 +- libxfs/rdwr.c | 409 ++++-- libxfs/trans.c | 50 +- libxfs/util.c | 202 +-- libxfs/xfs.h | 107 +- libxfs/xfs_alloc.c | 590 +++++--- libxfs/xfs_alloc_btree.c | 105 +- libxfs/xfs_attr.c | 259 ++-- libxfs/xfs_attr_leaf.c | 495 ++++--- libxfs/xfs_bmap.c | 3199 ++++++++++++++++++++++++-------------------- libxfs/xfs_bmap_btree.c | 71 +- libxfs/xfs_btree.c | 188 ++- libxfs/xfs_da_btree.c | 1278 +++++++++--------- libxfs/xfs_dir2.c | 149 +-- libxfs/xfs_dir2_block.c | 709 +++++----- libxfs/xfs_dir2_data.c | 506 ++++--- libxfs/xfs_dir2_leaf.c | 720 +++++----- libxfs/xfs_dir2_node.c | 722 +++++----- libxfs/xfs_dir2_priv.h | 152 +++ libxfs/xfs_dir2_sf.c | 320 +++-- libxfs/xfs_ialloc.c | 586 ++++---- libxfs/xfs_ialloc_btree.c | 55 +- libxfs/xfs_inode.c | 408 +++--- libxfs/xfs_mount.c | 176 ++- libxfs/xfs_rtalloc.c | 77 +- libxfs/xfs_trans.c | 9 +- logprint/log_misc.c | 3 +- logprint/log_print_all.c | 2 +- mkfs/proto.c | 10 +- repair/dir.c | 1 + repair/dir2.c | 334 ++--- repair/dir2.h | 28 +- repair/phase6.c | 155 +-- 83 files changed, 8142 insertions(+), 7092 deletions(-) diff --git a/db/check.c b/db/check.c index e601e0a..5921779 100644 --- a/db/check.c +++ b/db/check.c @@ -31,6 +31,8 @@ #include "output.h" #include "init.h" #include "malloc.h" +#include "dir.h" +#include "dir2.h" typedef enum { IS_USER_QUOTA, IS_PROJECT_QUOTA, IS_GROUP_QUOTA, @@ -2223,7 +2225,7 @@ process_data_dir_v2( bf = data->hdr.bestfree; ptr = (char *)data->u; if (be32_to_cpu(block->hdr.magic) == XFS_DIR2_BLOCK_MAGIC) { - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); lep = xfs_dir2_block_leaf_p(btp); endptr = (char *)lep; if (endptr <= ptr || endptr > (char *)btp) { @@ -2840,7 +2842,7 @@ process_inode( break; } if (ic) { - dqprid = xfs_get_projid(idic); /* dquot ID is u32 */ + dqprid = xfs_get_projid(&idic); /* dquot ID is u32 */ quota_add(&dqprid, &idic.di_gid, &idic.di_uid, 0, bc, ic, rc); } @@ -3166,7 +3168,7 @@ process_leaf_node_dir_v2_free( error++; return; } - maxent = XFS_DIR2_MAX_FREE_BESTS(mp); + maxent = xfs_dir2_free_max_bests(mp); if (be32_to_cpu(free->hdr.firstdb) != xfs_dir2_da_to_db(mp, dabno - mp->m_dirfreeblk) * maxent) { if (!sflag || v) @@ -3643,10 +3645,10 @@ process_sf_dir_v2( if (v) dbprintf(_("dir %lld entry . %lld\n"), id->ino, id->ino); (*dot)++; - sfe = xfs_dir2_sf_firstentry(sf); + sfe = xfs_dir2_sf_firstentry(&sf->hdr); offset = XFS_DIR2_DATA_FIRST_OFFSET; for (i = sf->hdr.count - 1, i8 = 0; i >= 0; i--) { - if ((__psint_t)sfe + xfs_dir2_sf_entsize_byentry(sf, sfe) - + if ((__psint_t)sfe + xfs_dir2_sf_entsize(&sf->hdr,sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), @@ -3655,7 +3657,7 @@ process_sf_dir_v2( error++; break; } - lino = xfs_dir2_sf_get_inumber(sf, xfs_dir2_sf_inumberp(sfe)); + lino = xfs_dir2_sfe_get_ino(&sf->hdr, sfe); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid = find_inode(lino, 1); @@ -3685,8 +3687,8 @@ process_sf_dir_v2( } offset = xfs_dir2_sf_get_offset(sfe) + - xfs_dir2_data_entsize(sfe->namelen); - sfe = xfs_dir2_sf_nextentry(sf, sfe); + xfs_dir2_sf_entsize(&sf->hdr, sfe->namelen); + sfe = xfs_dir2_sf_nextentry(&sf->hdr, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_size)) { @@ -3702,7 +3704,7 @@ process_sf_dir_v2( dbprintf(_("dir %llu offsets too high\n"), id->ino); error++; } - lino = xfs_dir2_sf_get_inumber(sf, &sf->hdr.parent); + lino = xfs_dir2_sf_get_parent_ino(&sf->hdr); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid = find_inode(lino, 1); diff --git a/db/dir.h b/db/dir.h index 67e6689..5be82bf 100644 --- a/db/dir.h +++ b/db/dir.h @@ -16,6 +16,12 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +/* + * only db understands v1 directory format, so include them + * directly here + */ +#include + extern const field_t dir_flds[]; extern const field_t dir_hfld[]; extern const field_t dir_blkinfo_flds[]; diff --git a/db/dir2.c b/db/dir2.c index 51c598b..be58639 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -192,7 +192,7 @@ dir2_block_leaf_count( block = obj; if (be32_to_cpu(block->hdr.magic) != XFS_DIR2_BLOCK_MAGIC) return 0; - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); return be32_to_cpu(btp->count); } @@ -210,7 +210,7 @@ dir2_block_leaf_offset( ASSERT(startoff == 0); block = obj; ASSERT(be32_to_cpu(block->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); lep = xfs_dir2_block_leaf_p(btp) + idx; return bitize((int)((char *)lep - (char *)block)); } @@ -242,7 +242,7 @@ dir2_block_tail_offset( ASSERT(idx == 0); block = obj; ASSERT(be32_to_cpu(block->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); return bitize((int)((char *)btp - (char *)block)); } @@ -264,7 +264,7 @@ dir2_block_u_count( block = obj; if (be32_to_cpu(block->hdr.magic) != XFS_DIR2_BLOCK_MAGIC) return 0; - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); ptr = (char *)block->u; endptr = (char *)xfs_dir2_block_leaf_p(btp); for (i = 0; ptr < endptr; i++) { @@ -297,7 +297,7 @@ dir2_block_u_offset( ASSERT(startoff == 0); block = obj; ASSERT(be32_to_cpu(block->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); ptr = (char *)block->u; endptr = (char *)xfs_dir2_block_leaf_p(btp); for (i = 0; i < idx; i++) { diff --git a/db/dir2.h b/db/dir2.h index dcf4787..4c2847b 100644 --- a/db/dir2.h +++ b/db/dir2.h @@ -27,5 +27,37 @@ extern const field_t dir2_leaf_entry_flds[]; extern const field_t dir2_leaf_hdr_flds[]; extern const field_t dir2_leaf_tail_flds[]; +/* + * generic dir2 structures used by xfs_db + */ +typedef union { + xfs_dir2_data_entry_t entry; + xfs_dir2_data_unused_t unused; +} xfs_dir2_data_union_t; + +typedef struct xfs_dir2_data { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ + xfs_dir2_data_union_t u[1]; +} xfs_dir2_data_t; + +typedef struct xfs_dir2_block { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_union_t u[1]; + xfs_dir2_leaf_entry_t leaf[1]; + xfs_dir2_block_tail_t tail; +} xfs_dir2_block_t; + +typedef struct xfs_dir2_sf { + xfs_dir2_sf_hdr_t hdr; /* shortform header */ + xfs_dir2_sf_entry_t list[1]; /* shortform entries */ +} xfs_dir2_sf_t; + +static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep) +{ + return (xfs_dir2_inou_t *)&(sfep)->name[(sfep)->namelen]; +} + extern int dir2_data_union_size(void *obj, int startoff, int idx); extern int dir2_size(void *obj, int startoff, int idx); + + diff --git a/db/dir2sf.c b/db/dir2sf.c index b2db088..92f8a66 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -22,6 +22,7 @@ #include "fprint.h" #include "field.h" #include "bit.h" +#include "dir2.h" #include "dir2sf.h" static int dir2_inou_i4_count(void *obj, int startoff); @@ -149,10 +150,10 @@ dir2_sf_entry_size( ASSERT(bitoffs(startoff) == 0); sf = (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e = xfs_dir2_sf_firstentry(sf); + e = xfs_dir2_sf_firstentry(&sf->hdr); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); - return bitize((int)xfs_dir2_sf_entsize_byentry(sf, e)); + e = xfs_dir2_sf_nextentry(&sf->hdr, e); + return bitize((int)xfs_dir2_sf_entsize(&sf->hdr, e->namelen)); } /*ARGSUSED*/ @@ -194,9 +195,9 @@ dir2_sf_list_offset( ASSERT(bitoffs(startoff) == 0); sf = (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e = xfs_dir2_sf_firstentry(sf); + e = xfs_dir2_sf_firstentry(&sf->hdr); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir2_sf_nextentry(&sf->hdr, e); return bitize((int)((char *)e - (char *)sf)); } @@ -214,8 +215,8 @@ dir2sf_size( ASSERT(bitoffs(startoff) == 0); ASSERT(idx == 0); sf = (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e = xfs_dir2_sf_firstentry(sf); + e = xfs_dir2_sf_firstentry(&sf->hdr); for (i = 0; i < sf->hdr.count; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir2_sf_nextentry(&sf->hdr, e); return bitize((int)((char *)e - (char *)sf)); } diff --git a/db/dirshort.c b/db/dirshort.c index b0d3b6b..2b23c28 100644 --- a/db/dirshort.c +++ b/db/dirshort.c @@ -22,6 +22,7 @@ #include "fprint.h" #include "field.h" #include "bit.h" +#include "dir.h" #include "dirshort.h" static int dir_sf_entry_name_count(void *obj, int startoff); diff --git a/db/metadump.c b/db/metadump.c index c5ffddb..ff534fa 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -26,6 +26,10 @@ #include "init.h" #include "sig.h" #include "xfs_metadump.h" +#include "fprint.h" +#include "faddr.h" +#include "field.h" +#include "dir2.h" #define DEFAULT_MAX_EXT_SIZE 1000 @@ -916,7 +920,7 @@ obfuscate_sf_dir( (long long)cur_ino); } - sfep = xfs_dir2_sf_firstentry(sfp); + sfep = xfs_dir2_sf_firstentry(&sfp->hdr); for (i = 0; (i < sfp->hdr.count) && ((char *)sfep - (char *)sfp < ino_dir_size); i++) { @@ -935,7 +939,7 @@ obfuscate_sf_dir( namelen = ino_dir_size - ((char *)&sfep->name[0] - (char *)sfp); } else if ((char *)sfep - (char *)sfp + - xfs_dir2_sf_entsize_byentry(sfp, sfep) > + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ino_dir_size) { if (show_warnings) print_warning("entry length in dir inode %llu " @@ -946,12 +950,11 @@ obfuscate_sf_dir( (char *)sfp); } - generate_obfuscated_name(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)), namelen, - &sfep->name[0]); + generate_obfuscated_name(xfs_dir2_sfe_get_ino(&sfp->hdr, sfep), + namelen, &sfep->name[0]); sfep = (xfs_dir2_sf_entry_t *)((char *)sfep + - xfs_dir2_sf_entsize_byname(sfp, namelen)); + xfs_dir2_sf_entsize(&sfp->hdr, namelen)); } } @@ -1074,9 +1077,10 @@ obfuscate_dir_data_blocks( if (is_block_format) { xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; + xfs_dir2_block_t *blk; - btp = xfs_dir2_block_tail_p(mp, - (xfs_dir2_block_t *)block); + blk = (xfs_dir2_block_t *)block; + btp = xfs_dir2_block_tail_p(mp, &blk->hdr); blp = xfs_dir2_block_leaf_p(btp); if ((char *)blp > (char *)btp) blp = (xfs_dir2_leaf_entry_t *)btp; diff --git a/estimate/xfs_estimate.c b/estimate/xfs_estimate.c index 54a72e9..a8a3b99 100644 --- a/estimate/xfs_estimate.c +++ b/estimate/xfs_estimate.c @@ -18,8 +18,11 @@ /* * Estimate space of an XFS filesystem + * + * XXX: assumes dirv1 format. */ #include +#include #include #include diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 2db2224..aea20ed 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -16,8 +16,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include +#include #include #include #include diff --git a/include/Makefile b/include/Makefile index 7ad6ddb..de2c4f0 100644 --- a/include/Makefile +++ b/include/Makefile @@ -24,8 +24,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ - xfs_dir2.h xfs_dir2_block.h xfs_dir2_data.h xfs_dir2_leaf.h \ - xfs_dir2_node.h xfs_dir2_sf.h xfs_dir_leaf.h xfs_dir_sf.h \ + xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h xfs_dir_sf.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 9574f0b..0e2fc5f 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -33,8 +33,8 @@ #include #include -#include #include +#include #include #include #include @@ -46,8 +46,6 @@ #include #include #include -#include -#include #include #include #include @@ -136,7 +134,6 @@ extern int libxfs_log_clear (dev_t, xfs_daddr_t, uint, uuid_t *, extern int libxfs_log_header (xfs_caddr_t, uuid_t *, int, int, int, libxfs_get_block_t *, void *); - /* * Define a user-level mount structure with all we need * in order to make use of the numerous XFS_* macros. @@ -200,6 +197,7 @@ typedef struct xfs_mount { xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ } xfs_mount_t; + #define LIBXFS_MOUNT_ROOTINOS 0x0001 #define LIBXFS_MOUNT_DEBUGGER 0x0002 #define LIBXFS_MOUNT_32BITINODES 0x0004 @@ -219,11 +217,32 @@ extern void libxfs_rtmount_destroy (xfs_mount_t *); /* * Simple I/O interface */ +typedef struct xfs_buftarg { + struct xfs_mount *bt_mount; + dev_t dev; +} xfs_buftarg_t; + +#define XB_PAGES 2 + +struct xfs_buf_map { + xfs_daddr_t bm_bn; /* block number for I/O */ + int bm_len; /* size of I/O */ +}; + +#define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \ + struct xfs_buf_map (map) = { .bm_bn = (blkno), .bm_len = (numblk) }; + +struct xfs_buf_ops { + void (*verify_read)(struct xfs_buf *); + void (*verify_write)(struct xfs_buf *); +}; + typedef struct xfs_buf { struct cache_node b_node; unsigned int b_flags; xfs_daddr_t b_blkno; unsigned b_bcount; + unsigned int b_length; dev_t b_dev; pthread_mutex_t b_lock; pthread_t b_holder; @@ -231,8 +250,13 @@ typedef struct xfs_buf { void *b_fsprivate; void *b_fsprivate2; void *b_fsprivate3; - char *b_addr; + void *b_addr; int b_error; + const struct xfs_buf_ops *b_ops; + struct xfs_buftarg *b_target; + struct xfs_perag *b_pag; + struct xfs_buf_map *b_map; + int b_nmaps; #ifdef XFS_BUF_TRACING struct list_head b_lock_list; const char *b_func; @@ -245,10 +269,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_EXIT = 0x0001, /* ==LIBXFS_EXIT_ON_FAILURE */ LIBXFS_B_DIRTY = 0x0002, /* buffer has been modified */ LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ - LIBXFS_B_UPTODATE = 0x0008 /* buffer is sync'd to disk */ + LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ + LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ }; -#define XFS_BUF_PTR(bp) ((bp)->b_addr) +#define XFS_BUF_PTR(bp) ((char *)(bp)->b_addr) #define xfs_buf_offset(bp, offset) (XFS_BUF_PTR(bp) + (offset)) #define XFS_BUF_ADDR(bp) ((bp)->b_blkno) #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) @@ -275,6 +300,8 @@ enum xfs_buf_flags_t { /* b_flags bits */ (pri)) #define XFS_BUF_PRIORITY(bp) (cache_node_get_priority( \ (struct cache_node *)(bp))) +#define xfs_buf_set_ref(bp,ref) ((void) 0) +#define xfs_buf_ioerror(bp,err) (bp)->b_error = (err); /* Buffer Cache Interfaces */ @@ -288,23 +315,34 @@ extern struct cache_operations libxfs_bcache_operations; #define libxfs_readbuf(dev, daddr, len, flags) \ libxfs_trace_readbuf(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len), (flags)) +#define libxfs_readbuf_map(dev, map, nmaps, flags) \ + libxfs_trace_readbuf_map(__FUNCTION__, __FILE__, __LINE__, \ + (dev), (map), (nmaps), (flags)) #define libxfs_writebuf(buf, flags) \ libxfs_trace_writebuf(__FUNCTION__, __FILE__, __LINE__, \ (buf), (flags)) #define libxfs_getbuf(dev, daddr, len) \ libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len)) +#define libxfs_getbuf_map(dev, map, nmaps) \ + libxfs_trace_getbuf_map(__FUNCTION__, __FILE__, __LINE__, \ + (dev), (map), (nmaps)) #define libxfs_getbuf_flags(dev, daddr, len, flags) \ - libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \ + libxfs_trace_getbuf_flags(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len), (flags)) #define libxfs_putbuf(buf) \ libxfs_trace_putbuf(__FUNCTION__, __FILE__, __LINE__, (buf)) extern xfs_buf_t *libxfs_trace_readbuf(const char *, const char *, int, dev_t, xfs_daddr_t, int, int); +extern xfs_buf_t *libxfs_trace_readbuf_map(const char *, const char *, int, + dev_t, struct xfs_buf_map *, int, int); extern int libxfs_trace_writebuf(const char *, const char *, int, xfs_buf_t *, int); -extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, + dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_trace_getbuf_map(const char *, const char *, int, + dev_t, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_trace_getbuf_flags(const char *, const char *, int, dev_t, xfs_daddr_t, int, unsigned int); extern void libxfs_trace_putbuf (const char *, const char *, int, @@ -313,8 +351,10 @@ extern void libxfs_trace_putbuf (const char *, const char *, int, #else extern xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +extern xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); extern int libxfs_writebuf(xfs_buf_t *, int); extern xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); extern void libxfs_putbuf (xfs_buf_t *); @@ -358,6 +398,7 @@ typedef struct xfs_inode_log_item { xfs_log_item_t ili_item; /* common portion */ struct xfs_inode *ili_inode; /* inode pointer */ unsigned short ili_flags; /* misc flags */ + unsigned int ili_fields; /* fields to be logged */ unsigned int ili_last_fields; /* fields when flushed*/ xfs_inode_log_format_t ili_format; /* logged structure */ int ili_lock_flags; @@ -409,11 +450,50 @@ extern void libxfs_trans_bjoin (xfs_trans_t *, struct xfs_buf *); extern void libxfs_trans_bhold (xfs_trans_t *, struct xfs_buf *); extern void libxfs_trans_log_buf (xfs_trans_t *, struct xfs_buf *, uint, uint); +/* extern xfs_buf_t *libxfs_trans_get_buf (xfs_trans_t *, dev_t, xfs_daddr_t, int, uint); extern int libxfs_trans_read_buf (xfs_mount_t *, xfs_trans_t *, dev_t, xfs_daddr_t, int, uint, struct xfs_buf **); - +*/ + +struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, dev_t dev, + struct xfs_buf_map *map, int nmaps, + uint flags); + +static inline struct xfs_buf * +libxfs_trans_get_buf( + struct xfs_trans *tp, + dev_t dev, + xfs_daddr_t blkno, + int numblks, + uint flags) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return libxfs_trans_get_buf_map(tp, dev, &map, 1, flags); +} + +int libxfs_trans_read_buf_map(struct xfs_mount *mp, + struct xfs_trans *tp, dev_t dev, + struct xfs_buf_map *map, int nmaps, + uint flags, struct xfs_buf **bpp, + const struct xfs_buf_ops *ops); + +static inline int +libxfs_trans_read_buf( + struct xfs_mount *mp, + struct xfs_trans *tp, + dev_t dev, + xfs_daddr_t blkno, + int numblks, + uint flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return libxfs_trans_read_buf_map(mp, tp, dev, &map, 1, + flags, bpp, ops); +} /* * Inode interface @@ -438,6 +518,27 @@ typedef struct xfs_inode { #define LIBXFS_ATTR_CREATE 0x0010 /* create, but fail if attr exists */ #define LIBXFS_ATTR_REPLACE 0x0020 /* set, but fail if attr not exists */ +/* + * Project quota id helpers (previously projid was 16bit only and using two + * 16bit values to hold new 32bit projid was chosen to retain compatibility with + * "old" filesystems). + * + * Copied here from xfs_inode.h because it has to be defined after the struct + * xfs_inode... + */ +static inline prid_t +xfs_get_projid(struct xfs_icdinode *id) +{ + return (prid_t)id->di_projid_hi << 16 | id->di_projid_lo; +} + +static inline void +xfs_set_projid(struct xfs_icdinode *id, prid_t projid) +{ + id->di_projid_hi = (__uint16_t) (projid >> 16); + id->di_projid_lo = (__uint16_t) (projid & 0xffff); +} + typedef struct cred { uid_t cr_uid; gid_t cr_gid; @@ -451,8 +552,6 @@ extern void libxfs_trans_inode_alloc_buf (xfs_trans_t *, xfs_buf_t *); extern void libxfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); extern int libxfs_iflush_int (xfs_inode_t *, xfs_buf_t *); -extern int libxfs_iread (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, - xfs_inode_t *, xfs_daddr_t); /* Inode Cache Interfaces */ extern struct cache *libxfs_icache; @@ -462,14 +561,7 @@ extern int libxfs_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, uint, xfs_inode_t **, xfs_daddr_t); extern void libxfs_iput (xfs_inode_t *, uint); -extern int xfs_imap_to_bp(xfs_mount_t *mp, xfs_trans_t *tp, struct xfs_imap *imap, - xfs_buf_t **bpp, uint buf_flags, uint iget_flags); - -#include /* dirv1 support in db & repair */ -#include -#include -#include -#include +#include /* Shared utility routines */ extern unsigned int libxfs_log2_roundup(unsigned int i); @@ -478,11 +570,6 @@ extern int libxfs_alloc_file_space (xfs_inode_t *, xfs_off_t, xfs_off_t, int, int); extern int libxfs_bmap_finish(xfs_trans_t **, xfs_bmap_free_t *, int *); -extern void libxfs_da_bjoin (xfs_trans_t *, xfs_dabuf_t *); -extern void libxfs_da_bhold (xfs_trans_t *, xfs_dabuf_t *); -extern int libxfs_da_read_bufr(xfs_trans_t *, xfs_inode_t *, xfs_dablk_t, - xfs_daddr_t, xfs_dabuf_t **, int); - extern void libxfs_fs_repair_cmn_err(int, struct xfs_mount *, char *, ...); extern void libxfs_fs_cmn_err(int, struct xfs_mount *, char *, ...); @@ -536,7 +623,8 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); /* xfs_bmap.h */ #define libxfs_bmap_cancel xfs_bmap_cancel #define libxfs_bmap_last_offset xfs_bmap_last_offset -#define libxfs_bmapi xfs_bmapi +#define libxfs_bmapi_write xfs_bmapi_write +#define libxfs_bmapi_read xfs_bmapi_read #define libxfs_bunmapi xfs_bunmapi /* xfs_bmap_btree.h */ @@ -546,6 +634,7 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); #define libxfs_da_brelse xfs_da_brelse #define libxfs_da_hashname xfs_da_hashname #define libxfs_da_shrink_inode xfs_da_shrink_inode +#define libxfs_da_read_buf xfs_da_read_buf /* xfs_dir2.h */ #define libxfs_dir_createname xfs_dir_createname @@ -566,6 +655,8 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); /* xfs_inode.h */ #define libxfs_dinode_from_disk xfs_dinode_from_disk #define libxfs_dinode_to_disk xfs_dinode_to_disk +void xfs_dinode_from_disk(struct xfs_icdinode *, + struct xfs_dinode *); #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork diff --git a/include/linux.h b/include/linux.h index e0bcba2..5bb91cd 100644 --- a/include/linux.h +++ b/include/linux.h @@ -27,6 +27,7 @@ #include #include #include +#include static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) { diff --git a/include/platform_defs.h.in b/include/platform_defs.h.in index 4e1e0c4..217d6c0 100644 --- a/include/platform_defs.h.in +++ b/include/platform_defs.h.in @@ -34,6 +34,7 @@ #include #include #include +#include #undef HAVE___U32 #ifdef HAVE___U32 @@ -57,6 +58,10 @@ typedef signed long long int __s64; #define __force #endif +typedef __u16 __bitwise __le16; +typedef __u32 __bitwise __le32; +typedef __u64 __bitwise __le64; + typedef __u16 __bitwise __be16; typedef __u32 __bitwise __be32; typedef __u64 __bitwise __be64; diff --git a/include/swab.h b/include/swab.h index 2684aa7..3de44d8 100644 --- a/include/swab.h +++ b/include/swab.h @@ -153,4 +153,42 @@ static __inline__ void __swab64s(__u64 *addr) (__extension__ ({__arch__swab64s(addr);})); } +static inline __uint16_t get_unaligned_be16(void *p) +{ + __uint8_t *__p = p; + return __p[0] << 8 | __p[1]; +} + +static inline __uint32_t get_unaligned_be32(void *p) +{ + __uint8_t *__p = p; + return __p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3]; +} + +static inline __uint64_t get_unaligned_be64(void *p) +{ + return (__uint64_t)get_unaligned_be32(p) << 32 | + get_unaligned_be32(p + 4); +} + +static inline void put_unaligned_be16(__uint16_t val, void *p) +{ + __uint8_t *__p = p; + *__p++ = val >> 8; + *__p++ = val; +} + +static inline void put_unaligned_be32(__uint32_t val, void *p) +{ + __uint8_t *__p = p; + put_unaligned_be16(val >> 16, __p); + put_unaligned_be16(val, __p + 2); +} + +static inline void put_unaligned_be64(__uint64_t val, void *p) +{ + put_unaligned_be32(val >> 32, p); + put_unaligned_be32(val, p + 4); +} + #endif /* SWAB_H */ diff --git a/include/xfs.h b/include/xfs.h index 147a5a0..e32c4a8 100644 --- a/include/xfs.h +++ b/include/xfs.h @@ -34,6 +34,7 @@ #define __XFS_H__ #include +#include #include #endif /* __XFS_H__ */ diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 5adce91..f2aeedb 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -103,11 +103,13 @@ typedef struct xfs_agf { /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) -#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)((bp)->b_addr)) extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); +extern const struct xfs_buf_ops xfs_agf_buf_ops; + /* * Size of the unlinked inode hash table in the agi. */ @@ -156,11 +158,13 @@ typedef struct xfs_agi { /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) #define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) -#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)((bp)->b_addr)) extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); +extern const struct xfs_buf_ops xfs_agi_buf_ops; + /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. @@ -168,31 +172,13 @@ extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) #define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) -#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) typedef struct xfs_agfl { __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; /* - * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that - * have been freed but whose transactions aren't committed to disk yet. - * - * Note that we use the transaction ID to record the transaction, not the - * transaction structure itself. See xfs_alloc_busy_insert() for details. - */ -struct xfs_busy_extent { -#ifdef __KERNEL__ - struct rb_node rb_node; /* ag by-bno indexed search tree */ -#endif - struct list_head list; /* transaction busy extent list */ - xfs_agnumber_t agno; - xfs_agblock_t bno; - xfs_extlen_t length; - xlog_tid_t tid; /* transaction that created this */ -}; - -/* * Per-ag incore structure, copies of information in agf and agi, * to improve the performance of allocation group selection. */ @@ -251,6 +237,7 @@ typedef struct xfs_perag { #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 895009a..99d0a61 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -19,10 +19,12 @@ #define __XFS_ALLOC_H__ struct xfs_buf; +struct xfs_btree_cur; struct xfs_mount; struct xfs_perag; struct xfs_trans; -struct xfs_busy_extent; + +extern struct workqueue_struct *xfs_alloc_wq; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. @@ -74,6 +76,22 @@ typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) /* + * When deciding how much space to allocate out of an AG, we limit the + * allocation maximum size to the size the AG. However, we cannot use all the + * blocks in the AG - some are permanently used by metadata. These + * blocks are generally: + * - the AG superblock, AGF, AGI and AGFL + * - the AGF (bno and cnt) and AGI btree root blocks + * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits + * + * The AG headers are sector sized, so the amount of space they take up is + * dependent on filesystem geometry. The others are all single blocks. + */ +#define XFS_ALLOC_AG_MAX_USABLE(mp) \ + ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) - 7) + + +/* * Argument structure for xfs_alloc routines. * This is turned into a structure to avoid having 20 arguments passed * down several levels of the stack. @@ -117,19 +135,6 @@ xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp, struct xfs_perag *pag); -#ifdef __KERNEL__ - -void -xfs_alloc_busy_insert(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); - -void -xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); - -#endif /* __KERNEL__ */ - /* * Compute and fill in value of m_ag_maxlevels. */ @@ -205,4 +210,28 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len); /* length of extent */ +int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_lookup_ge( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t *bno, /* output: starting block of extent */ + xfs_extlen_t *len, /* output: length of extent */ + int *stat); /* output: success/failure */ + +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; + #endif /* __XFS_ALLOC_H__ */ diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index a6caa00..7e89a2b 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -51,20 +51,6 @@ typedef struct xfs_alloc_rec_incore { typedef __be32 xfs_alloc_ptr_t; /* - * Minimum and maximum blocksize and sectorsize. - * The blocksize upper limit is pretty much arbitrary. - * The sectorsize upper limit is due to sizeof(sb_sectsize). - */ -#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */ -#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */ -#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) -#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) -#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */ -#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */ -#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) -#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) - -/* * Block numbers in the AG: * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. */ @@ -107,4 +93,6 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; + #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index 9c7d22f..77de139 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -31,7 +31,6 @@ struct attrlist; struct attrlist_cursor_kern; struct xfs_attr_list_context; -struct xfs_dabuf; struct xfs_da_args; struct xfs_da_state; struct xfs_da_state_blk; @@ -215,7 +214,7 @@ int xfs_attr_shortform_getvalue(struct xfs_da_args *args); int xfs_attr_shortform_to_leaf(struct xfs_da_args *args); int xfs_attr_shortform_remove(struct xfs_da_args *args); int xfs_attr_shortform_list(struct xfs_attr_list_context *context); -int xfs_attr_shortform_allfit(struct xfs_dabuf *bp, struct xfs_inode *dp); +int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); @@ -223,7 +222,7 @@ int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); * Internal routines when attribute fork size == XFS_LBSIZE(mp). */ int xfs_attr_leaf_to_node(struct xfs_da_args *args); -int xfs_attr_leaf_to_shortform(struct xfs_dabuf *bp, +int xfs_attr_leaf_to_shortform(struct xfs_buf *bp, struct xfs_da_args *args, int forkoff); int xfs_attr_leaf_clearflag(struct xfs_da_args *args); int xfs_attr_leaf_setflag(struct xfs_da_args *args); @@ -235,14 +234,14 @@ int xfs_attr_leaf_flipflags(xfs_da_args_t *args); int xfs_attr_leaf_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -int xfs_attr_leaf_lookup_int(struct xfs_dabuf *leaf, +int xfs_attr_leaf_lookup_int(struct xfs_buf *leaf, struct xfs_da_args *args); -int xfs_attr_leaf_getvalue(struct xfs_dabuf *bp, struct xfs_da_args *args); -int xfs_attr_leaf_add(struct xfs_dabuf *leaf_buffer, +int xfs_attr_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); +int xfs_attr_leaf_add(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_remove(struct xfs_dabuf *leaf_buffer, +int xfs_attr_leaf_remove(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_list_int(struct xfs_dabuf *bp, +int xfs_attr_leaf_list_int(struct xfs_buf *bp, struct xfs_attr_list_context *context); /* @@ -257,9 +256,15 @@ int xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); /* * Utility routines. */ -xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_dabuf *bp, int *count); -int xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp, - struct xfs_dabuf *leaf2_bp); +xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); +int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp); int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local); +int xfs_attr_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mappedbno, + struct xfs_buf **bpp); + +extern const struct xfs_buf_ops xfs_attr_leaf_buf_ops; + #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index 3651191..de451a2 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -62,36 +62,32 @@ typedef struct xfs_bmap_free #define XFS_BMAP_MAX_NMAP 4 /* - * Flags for xfs_bmapi + * Flags for xfs_bmapi_* */ -#define XFS_BMAPI_WRITE 0x001 /* write operation: allocate space */ -#define XFS_BMAPI_DELAY 0x002 /* delayed write operation */ -#define XFS_BMAPI_ENTIRE 0x004 /* return entire extent, not trimmed */ -#define XFS_BMAPI_METADATA 0x008 /* mapping metadata not user data */ -#define XFS_BMAPI_ATTRFORK 0x010 /* use attribute fork not data */ -#define XFS_BMAPI_RSVBLOCKS 0x020 /* OK to alloc. reserved data blocks */ -#define XFS_BMAPI_PREALLOC 0x040 /* preallocation op: unwritten space */ -#define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ +#define XFS_BMAPI_ENTIRE 0x001 /* return entire extent, not trimmed */ +#define XFS_BMAPI_METADATA 0x002 /* mapping metadata not user data */ +#define XFS_BMAPI_ATTRFORK 0x004 /* use attribute fork not data */ +#define XFS_BMAPI_PREALLOC 0x008 /* preallocation op: unwritten space */ +#define XFS_BMAPI_IGSTATE 0x010 /* Ignore state - */ /* combine contig. space */ -#define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ +#define XFS_BMAPI_CONTIG 0x020 /* must allocate only one extent */ /* * unwritten extent conversion - this needs write cache flushing and no additional * allocation alignments. When specified with XFS_BMAPI_PREALLOC it converts * from written to unwritten, otherwise convert from unwritten to written. */ -#define XFS_BMAPI_CONVERT 0x200 +#define XFS_BMAPI_CONVERT 0x040 +#define XFS_BMAPI_STACK_SWITCH 0x080 #define XFS_BMAPI_FLAGS \ - { XFS_BMAPI_WRITE, "WRITE" }, \ - { XFS_BMAPI_DELAY, "DELAY" }, \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ { XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \ - { XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \ { XFS_BMAPI_PREALLOC, "PREALLOC" }, \ { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ { XFS_BMAPI_CONTIG, "CONTIG" }, \ - { XFS_BMAPI_CONVERT, "CONVERT" } + { XFS_BMAPI_CONVERT, "CONVERT" }, \ + { XFS_BMAPI_STACK_SWITCH, "STACK_SWITCH" } static inline int xfs_bmapi_aflag(int w) @@ -115,23 +111,32 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) * Argument structure for xfs_bmap_alloc. */ typedef struct xfs_bmalloca { - xfs_fsblock_t firstblock; /* i/o first block allocated */ - xfs_fsblock_t rval; /* starting block of new extent */ - xfs_fileoff_t off; /* offset in file filling in */ + xfs_fsblock_t *firstblock; /* i/o first block allocated */ + struct xfs_bmap_free *flist; /* bmap freelist */ struct xfs_trans *tp; /* transaction pointer */ struct xfs_inode *ip; /* incore inode pointer */ - struct xfs_bmbt_irec *prevp; /* extent before the new one */ - struct xfs_bmbt_irec *gotp; /* extent after, or delayed */ - xfs_extlen_t alen; /* i/o length asked/allocated */ + struct xfs_bmbt_irec prev; /* extent before the new one */ + struct xfs_bmbt_irec got; /* extent after, or delayed */ + + xfs_fileoff_t offset; /* offset in file filling in */ + xfs_extlen_t length; /* i/o length asked/allocated */ + xfs_fsblock_t blkno; /* starting block of new extent */ + + struct xfs_btree_cur *cur; /* btree cursor */ + xfs_extnum_t idx; /* current extent index */ + int nallocs;/* number of extents alloc'd */ + int logflags;/* flags for transaction logging */ + xfs_extlen_t total; /* total blocks needed for xaction */ xfs_extlen_t minlen; /* minimum allocation size (blocks) */ xfs_extlen_t minleft; /* amount must be left after alloc */ char eof; /* set if allocating past last extent */ char wasdel; /* replacing a delayed allocation */ char userdata;/* set if is user data */ - char low; /* low on space, using seq'l ags */ char aeof; /* allocated space at eof */ char conv; /* overwriting unwritten extents */ + int flags; + int stack_switch; } xfs_bmalloca_t; /* @@ -154,251 +159,65 @@ typedef struct xfs_bmalloca { { BMAP_RIGHT_FILLING, "RF" }, \ { BMAP_ATTRFORK, "ATTR" } -/* - * Add bmap trace insert entries for all the contents of the extent list. - * - * Quite excessive tracing. Only do this for debug builds. - */ #if defined(__KERNEL) && defined(DEBUG) -void -xfs_bmap_trace_exlist( - struct xfs_inode *ip, /* incore inode pointer */ - xfs_extnum_t cnt, /* count of entries in list */ - int whichfork, - unsigned long caller_ip); /* data or attr fork */ +void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, + int whichfork, unsigned long caller_ip); #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_) #else #define XFS_BMAP_TRACE_EXLIST(ip,c,w) #endif -/* - * Convert inode from non-attributed to attributed. - * Must not be in a transaction, ip must not be locked. - */ -int /* error code */ -xfs_bmap_add_attrfork( - struct xfs_inode *ip, /* incore inode pointer */ - int size, /* space needed for new attribute */ - int rsvd); /* flag for reserved block allocation */ - -/* - * Add the extent to the list of extents to be free at transaction end. - * The list is maintained sorted (by block number). - */ -void -xfs_bmap_add_free( - xfs_fsblock_t bno, /* fs block number of extent */ - xfs_filblks_t len, /* length of extent */ - xfs_bmap_free_t *flist, /* list of extents */ - struct xfs_mount *mp); /* mount point structure */ - -/* - * Routine to clean up the free list data structure when - * an error occurs during a transaction. - */ -void -xfs_bmap_cancel( - xfs_bmap_free_t *flist); /* free list to clean up */ - -/* - * Compute and fill in the value of the maximum depth of a bmap btree - * in this filesystem. Done once, during mount. - */ -void -xfs_bmap_compute_maxlevels( - struct xfs_mount *mp, /* file system mount structure */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the first unused block in the file. - * This is the lowest-address hole if the file has holes, else the first block - * past the end of file. - */ -int /* error */ -xfs_bmap_first_unused( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_extlen_t len, /* size of hole to find */ - xfs_fileoff_t *unused, /* unused block num */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the last block + 1 before - * last_block (input value) in the file. - * This is not based on i_size, it is based on the extent list. - * Returns 0 for local files, as they do not have an extent list. - */ -int /* error */ -xfs_bmap_last_before( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t *last_block, /* last block */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the first block past eof in - * the file. This is not based on i_size, it is based on the extent list. - * Returns 0 for local files, as they do not have an extent list. - */ -int /* error */ -xfs_bmap_last_offset( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t *unused, /* last block num */ - int whichfork); /* data or attr fork */ - -/* - * Returns whether the selected fork of the inode has exactly one - * block or not. For the data fork we check this matches di_size, - * implying the file's range is 0..bsize-1. - */ -int -xfs_bmap_one_block( - struct xfs_inode *ip, /* incore inode */ - int whichfork); /* data or attr fork */ - -/* - * Read in the extents to iu_extents. - * All inode fields are set up by caller, we just traverse the btree - * and copy the records in. - */ -int /* error */ -xfs_bmap_read_extents( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - int whichfork); /* data or attr fork */ - -/* - * Map file blocks to filesystem blocks. - * File range is given by the bno/len pair. - * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set) - * into a hole or past eof. - * Only allocates blocks from a single allocation group, - * to avoid locking problems. - * The returned value in "firstblock" from the first call in a transaction - * must be remembered and presented to subsequent calls in "firstblock". - * An upper bound for the number of blocks to be allocated is supplied to - * the first call in "total"; if no allocation group has that many free - * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). - */ -int /* error */ -xfs_bmapi( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting file offs. mapped */ - xfs_filblks_t len, /* length to map in file */ - int flags, /* XFS_BMAPI_... */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_extlen_t total, /* total blocks needed */ - struct xfs_bmbt_irec *mval, /* output: map values */ - int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist); /* i/o: list extents to free */ - -/* - * Map file blocks to filesystem blocks, simple version. - * One block only, read-only. - * For flags, only the XFS_BMAPI_ATTRFORK flag is examined. - * For the other flag values, the effect is as if XFS_BMAPI_METADATA - * was set and all the others were clear. - */ -int /* error */ -xfs_bmapi_single( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - xfs_fsblock_t *fsb, /* output: mapped block */ - xfs_fileoff_t bno); /* starting file offs. mapped */ - -/* - * Unmap (remove) blocks from a file. - * If nexts is nonzero then the number of extents to remove is limited to - * that value. If not all extents in the block range can be removed then - * *done is set. - */ -int /* error */ -xfs_bunmapi( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting offset to unmap */ - xfs_filblks_t len, /* length to unmap in file */ - int flags, /* XFS_BMAPI_... */ - xfs_extnum_t nexts, /* number of extents max */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *done); /* set if not done yet */ - -/* - * Check an extent list, which has just been read, for - * any bit in the extent flag field. - */ -int -xfs_check_nostate_extents( - struct xfs_ifork *ifp, - xfs_extnum_t idx, - xfs_extnum_t num); - -uint -xfs_default_attroffset( - struct xfs_inode *ip); +int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); +void xfs_bmap_add_free(xfs_fsblock_t bno, xfs_filblks_t len, + struct xfs_bmap_free *flist, struct xfs_mount *mp); +void xfs_bmap_cancel(struct xfs_bmap_free *flist); +void xfs_bmap_compute_maxlevels(struct xfs_mount *mp, int whichfork); +int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); +int xfs_bmap_last_before(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t *last_block, int whichfork); +int xfs_bmap_last_offset(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t *unused, int whichfork); +int xfs_bmap_one_block(struct xfs_inode *ip, int whichfork); +int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, + int whichfork); +int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, + xfs_filblks_t len, struct xfs_bmbt_irec *mval, + int *nmap, int flags); +int xfs_bmapi_delay(struct xfs_inode *ip, xfs_fileoff_t bno, + xfs_filblks_t len, struct xfs_bmbt_irec *mval, + int *nmap, int flags); +int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t len, int flags, + xfs_fsblock_t *firstblock, xfs_extlen_t total, + struct xfs_bmbt_irec *mval, int *nmap, + struct xfs_bmap_free *flist); +int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t len, int flags, + xfs_extnum_t nexts, xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, int *done); +int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, + xfs_extnum_t num); +uint xfs_default_attroffset(struct xfs_inode *ip); #ifdef __KERNEL__ - -/* - * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi - * caller. Frees all the extents that need freeing, which must be done - * last due to locking considerations. - * - * Return 1 if the given transaction was committed and a new one allocated, - * and 0 otherwise. - */ -int /* error */ -xfs_bmap_finish( - struct xfs_trans **tp, /* transaction pointer addr */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *committed); /* xact committed or not */ - /* bmap to userspace formatter - copy to user & advance pointer */ typedef int (*xfs_bmap_format_t)(void **, struct getbmapx *, int *); -/* - * Get inode's extents as described in bmv, and format for output. - */ -int /* error code */ -xfs_getbmap( - xfs_inode_t *ip, - struct getbmapx *bmv, /* user bmap structure */ - xfs_bmap_format_t formatter, /* format to user */ - void *arg); /* formatter arg */ +int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, + int *committed); +int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, + xfs_bmap_format_t formatter, void *arg); +int xfs_bmap_eof(struct xfs_inode *ip, xfs_fileoff_t endoff, + int whichfork, int *eof); +int xfs_bmap_count_blocks(struct xfs_trans *tp, struct xfs_inode *ip, + int whichfork, int *count); +int xfs_bmap_punch_delalloc_range(struct xfs_inode *ip, + xfs_fileoff_t start_fsb, xfs_fileoff_t length); -/* - * Check if the endoff is outside the last extent. If so the caller will grow - * the allocation to a stripe unit boundary - */ -int -xfs_bmap_eof( - struct xfs_inode *ip, - xfs_fileoff_t endoff, - int whichfork, - int *eof); - -/* - * Count fsblocks of the given fork. - */ -int -xfs_bmap_count_blocks( - xfs_trans_t *tp, - struct xfs_inode *ip, - int whichfork, - int *count); +xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb); -int -xfs_bmap_punch_delalloc_range( - struct xfs_inode *ip, - xfs_fileoff_t start_fsb, - xfs_fileoff_t length); #endif /* __KERNEL__ */ #endif /* __XFS_BMAP_H__ */ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 0e66c4e..88469ca 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -236,5 +236,6 @@ extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 82fafc6..be1eb23 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -188,6 +188,8 @@ struct xfs_btree_ops { __int64_t (*key_diff)(struct xfs_btree_cur *cur, union xfs_btree_key *key); + const struct xfs_buf_ops *buf_ops; + #ifdef DEBUG /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, @@ -281,7 +283,7 @@ typedef struct xfs_btree_cur /* * Convert from buffer to btree block header. */ -#define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)((bp)->b_addr)) /* @@ -374,7 +376,8 @@ xfs_btree_read_bufl( xfs_fsblock_t fsbno, /* file system block number */ uint lock, /* lock flags for read_buf */ struct xfs_buf **bpp, /* buffer for fsbno */ - int refval);/* ref count value for buffer */ + int refval, /* ref count value for buffer */ + const struct xfs_buf_ops *ops); /* * Read-ahead the block, don't wait for it, don't return a buffer. @@ -384,7 +387,8 @@ void /* error */ xfs_btree_reada_bufl( struct xfs_mount *mp, /* file system mount point */ xfs_fsblock_t fsbno, /* file system block number */ - xfs_extlen_t count); /* count of filesystem blocks */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops); /* * Read-ahead the block, don't wait for it, don't return a buffer. @@ -395,8 +399,20 @@ xfs_btree_reada_bufs( struct xfs_mount *mp, /* file system mount point */ xfs_agnumber_t agno, /* allocation group number */ xfs_agblock_t agbno, /* allocation group block number */ - xfs_extlen_t count); /* count of filesystem blocks */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops); +/* + * Initialise a new btree block header + */ +void +xfs_btree_init_block( + struct xfs_mount *mp, + struct xfs_buf *bp, + __u32 magic, + __u16 level, + __u16 numrecs, + unsigned int flags); /* * Common btree core entry points. diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index a5efba9..ee36c88 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -21,23 +21,6 @@ extern kmem_zone_t *xfs_buf_item_zone; /* - * This is the structure used to lay out a buf log item in the - * log. The data map describes which 128 byte chunks of the buffer - * have been logged. - * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. - */ -typedef struct xfs_buf_log_format { - unsigned short blf_type; /* buf log item type indicator */ - unsigned short blf_size; /* size of this item */ - ushort blf_flags; /* misc state */ - ushort blf_len; /* number of blocks in this buf */ - __int64_t blf_blkno; /* starting blkno of this buf */ - unsigned int blf_map_size; /* size of data bitmap in words */ - unsigned int blf_data_map[1];/* variable size bitmap of */ - /* regions of buffer in this item */ -} xfs_buf_log_format_t; - -/* * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ @@ -61,6 +44,23 @@ typedef struct xfs_buf_log_format { #define NBWORD (NBBY * sizeof(unsigned int)) /* + * This is the structure used to lay out a buf log item in the + * log. The data map describes which 128 byte chunks of the buffer + * have been logged. + */ +#define XFS_BLF_DATAMAP_SIZE ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) + +typedef struct xfs_buf_log_format { + unsigned short blf_type; /* buf log item type indicator */ + unsigned short blf_size; /* size of this item */ + ushort blf_flags; /* misc state */ + ushort blf_len; /* number of blocks in this buf */ + __int64_t blf_blkno; /* starting blkno of this buf */ + unsigned int blf_map_size; /* used size of data bitmap in words */ + unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */ +} xfs_buf_log_format_t; + +/* * buf log item flags */ #define XFS_BLI_HOLD 0x01 @@ -69,7 +69,7 @@ typedef struct xfs_buf_log_format { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 -#define XFS_BLI_INODE_BUF 0x40 +#define XFS_BLI_INODE_BUF 0x40 #define XFS_BLI_FLAGS \ { XFS_BLI_HOLD, "HOLD" }, \ @@ -80,6 +80,7 @@ typedef struct xfs_buf_log_format { { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ { XFS_BLI_INODE_BUF, "INODE_BUF" } + #ifdef __KERNEL__ struct xfs_buf; @@ -97,11 +98,9 @@ typedef struct xfs_buf_log_item { unsigned int bli_flags; /* misc flags */ unsigned int bli_recur; /* lock recursion count */ atomic_t bli_refcount; /* cnt of tp refs */ -#ifdef XFS_TRANS_DEBUG - char *bli_orig; /* original buffer copy */ - char *bli_logged; /* bytes logged (bitmap) */ -#endif - xfs_buf_log_format_t bli_format; /* in-log header */ + int bli_format_count; /* count of headers */ + struct xfs_buf_log_format *bli_formats; /* array of in-log header ptrs */ + struct xfs_buf_log_format __bli_format; /* embedded in-log header */ } xfs_buf_log_item_t; void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); @@ -114,16 +113,6 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void xfs_buf_iodone_callbacks(struct xfs_buf *); void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); -#ifdef XFS_TRANS_DEBUG -void -xfs_buf_item_flush_log_debug( - struct xfs_buf *bp, - uint first, - uint last); -#else -#define xfs_buf_item_flush_log_debug(bp, first, last) -#endif - #endif /* __KERNEL__ */ #endif /* __XFS_BUF_ITEM_H__ */ diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index fe9f5a8..ee5170c 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -18,7 +18,6 @@ #ifndef __XFS_DA_BTREE_H__ #define __XFS_DA_BTREE_H__ -struct xfs_buf; struct xfs_bmap_free; struct xfs_inode; struct xfs_mount; @@ -32,7 +31,7 @@ struct zone; /* * This structure is common to both leaf nodes and non-leaf nodes in the Btree. * - * Is is used to manage a doubly linked list of all blocks at the same + * It is used to manage a doubly linked list of all blocks at the same * level in the Btree, and to identify which type of block this is. */ #define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ @@ -133,35 +132,6 @@ typedef struct xfs_da_args { { XFS_DA_OP_CILOOKUP, "CILOOKUP" } /* - * Structure to describe buffer(s) for a block. - * This is needed in the directory version 2 format case, when - * multiple non-contiguous fsblocks might be needed to cover one - * logical directory block. - * If the buffer count is 1 then the data pointer points to the - * same place as the b_addr field for the buffer, else to kmem_alloced memory. - */ -typedef struct xfs_dabuf { - int nbuf; /* number of buffer pointers present */ - short dirty; /* data needs to be copied back */ - short bbcount; /* how large is data in bbs */ - void *data; /* pointer for buffers' data */ -#ifdef XFS_DABUF_DEBUG - inst_t *ra; /* return address of caller to make */ - struct xfs_dabuf *next; /* next in global chain */ - struct xfs_dabuf *prev; /* previous in global chain */ - struct xfs_buftarg *target; /* device for buffer */ - xfs_daddr_t blkno; /* daddr first in bps[0] */ -#endif - struct xfs_buf *bps[1]; /* actually nbuf of these */ -} xfs_dabuf_t; -#define XFS_DA_BUF_SIZE(n) \ - (sizeof(xfs_dabuf_t) + sizeof(struct xfs_buf *) * ((n) - 1)) - -#ifdef XFS_DABUF_DEBUG -extern xfs_dabuf_t *xfs_dabuf_global_list; -#endif - -/* * Storage for holding state during Btree searches and split/join ops. * * Only need space for 5 intermediate nodes. With a minimum of 62-way @@ -169,7 +139,7 @@ extern xfs_dabuf_t *xfs_dabuf_global_list; * which is slightly more than enough. */ typedef struct xfs_da_state_blk { - xfs_dabuf_t *bp; /* buffer containing block */ + struct xfs_buf *bp; /* buffer containing block */ xfs_dablk_t blkno; /* filesystem blkno of buffer */ xfs_daddr_t disk_blkno; /* on-disk blkno (in BBs) of buffer */ int index; /* relevant index into block */ @@ -222,7 +192,7 @@ struct xfs_nameops { * Routines used for growing the Btree. */ int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - xfs_dabuf_t **bpp, int whichfork); + struct xfs_buf **bpp, int whichfork); int xfs_da_split(xfs_da_state_t *state); /* @@ -243,21 +213,28 @@ int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, */ int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_state_blk_t *new_blk); +int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mappedbno, + struct xfs_buf **bpp, int which_fork); /* * Utility routines. */ int xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno); +int xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno, + int count); int xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, - xfs_dabuf_t **bp, int whichfork); + struct xfs_buf **bp, int whichfork); int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, int whichfork); + struct xfs_buf **bpp, int whichfork, + const struct xfs_buf_ops *ops); xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp, - xfs_dablk_t bno, int whichfork); + xfs_dablk_t bno, xfs_daddr_t mapped_bno, + int whichfork, const struct xfs_buf_ops *ops); int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, - xfs_dabuf_t *dead_buf); + struct xfs_buf *dead_buf); uint xfs_da_hashname(const __uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, @@ -267,15 +244,7 @@ enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, xfs_da_state_t *xfs_da_state_alloc(void); void xfs_da_state_free(xfs_da_state_t *state); -void xfs_da_buf_done(xfs_dabuf_t *dabuf); -void xfs_da_log_buf(struct xfs_trans *tp, xfs_dabuf_t *dabuf, uint first, - uint last); -void xfs_da_brelse(struct xfs_trans *tp, xfs_dabuf_t *dabuf); -void xfs_da_binval(struct xfs_trans *tp, xfs_dabuf_t *dabuf); -xfs_daddr_t xfs_da_blkno(xfs_dabuf_t *dabuf); - extern struct kmem_zone *xfs_da_state_zone; -extern struct kmem_zone *xfs_dabuf_zone; extern const struct xfs_nameops xfs_default_nameops; #endif /* __XFS_DA_BTREE_H__ */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index dffba9b..1d9643b 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -33,7 +33,7 @@ typedef struct xfs_timestamp { * variable size the leftover area split into a data and an attribute fork. * The format of the data and attribute fork depends on the format of the * inode as indicated by di_format and di_aformat. To access the data and - * attribute use the XFS_DFORK_PTR, XFS_DFORK_DPTR, and XFS_DFORK_PTR macros + * attribute use the XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR macros * below. * * There is a very similar struct icdinode in xfs_inode which matches the @@ -148,7 +148,7 @@ typedef enum xfs_dinode_fmt { be32_to_cpu((dip)->di_nextents) : \ be16_to_cpu((dip)->di_anextents)) -#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)((bp)->b_addr)) /* * For block and character special files the 32bit dev_t is stored at the diff --git a/include/xfs_dir1.h b/include/xfs_dir1.h new file mode 100644 index 0000000..d83537c --- /dev/null +++ b/include/xfs_dir1.h @@ -0,0 +1,13 @@ +#ifndef __XFS_DIRV1_H +#define __XFS_DIRV1_H 1 + +#if XFS_BIG_INUMS +typedef xfs_ino_t xfs_intino_t; +#else +typedef __uint32_t xfs_intino_t; +#endif + +#include +#include + +#endif /* __XFS_DIRV1_H */ diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 74a3b10..2dd0cc0 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -16,49 +16,23 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_DIR2_H__ -#define __XFS_DIR2_H__ +#define __XFS_DIR2_H__ -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_put_args; struct xfs_bmap_free; +struct xfs_da_args; struct xfs_inode; struct xfs_mount; struct xfs_trans; +struct xfs_dir2_sf_hdr; +struct xfs_dir2_sf_entry; +struct xfs_dir2_data_hdr; +struct xfs_dir2_data_entry; +struct xfs_dir2_data_unused; +struct xfs_dir2_data_free; -/* - * Directory version 2. - * There are 4 possible formats: - * shortform - * single block - data with embedded leaf at the end - * multiple data blocks, single leaf+freeindex block - * data blocks, node&leaf blocks (btree), freeindex blocks - * - * The shortform format is in xfs_dir2_sf.h. - * The single block format is in xfs_dir2_block.h. - * The data block format is in xfs_dir2_data.h. - * The leaf and freeindex block formats are in xfs_dir2_leaf.h. - * Node blocks are the same as the other version, in xfs_da_btree.h. - */ - -/* - * Byte offset in data block and shortform entry. - */ -typedef __uint16_t xfs_dir2_data_off_t; -#define NULLDATAOFF 0xffffU typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Directory block number (logical dirblk in file) - */ typedef __uint32_t xfs_dir2_db_t; -/* - * Byte offset in a directory. - */ -typedef xfs_off_t xfs_dir2_off_t; - extern struct xfs_name xfs_name_dotdot; /* @@ -86,21 +60,44 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_bmap_free *flist, xfs_extlen_t tot); extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_name *name, uint resblks); -extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); /* - * Utility routines for v2 directories. + * Direct call from the bmap code, bypassing the generic directory layer. */ -extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, - xfs_dir2_db_t *dbp); -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, - int *vp); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, - int *vp); +extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); + +/* + * used by db + */ +extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); +extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, + xfs_ino_t ino); +extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, + struct xfs_dir2_sf_entry *sfep); +extern void xfs_dir2_sfe_put_ino( struct xfs_dir2_sf_hdr *, + struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino); + +extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); +extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, - struct xfs_dabuf *bp); + struct xfs_buf *bp); + +extern void xfs_dir2_data_freescan(struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr, int *loghead); +extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_entry *dep); +extern void xfs_dir2_data_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *bp, + xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, + int *needlogp, int *needscanp); +extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, + xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); -extern int xfs_dir_cilookup_result(struct xfs_da_args *args, - const unsigned char *name, int len); +extern struct xfs_dir2_data_free *xfs_dir2_data_freefind( + struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup); #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_dir2_block.h b/include/xfs_dir2_block.h deleted file mode 100644 index 10e6896..0000000 --- a/include/xfs_dir2_block.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, 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 - */ -#ifndef __XFS_DIR2_BLOCK_H__ -#define __XFS_DIR2_BLOCK_H__ - -/* - * xfs_dir2_block.h - * Directory version 2, single block format structures - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_data_hdr; -struct xfs_dir2_leaf_entry; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * The single block format is as follows: - * xfs_dir2_data_hdr_t structure - * xfs_dir2_data_entry_t and xfs_dir2_data_unused_t structures - * xfs_dir2_leaf_entry_t structures - * xfs_dir2_block_tail_t structure - */ - -#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: for one block dirs */ - -typedef struct xfs_dir2_block_tail { - __be32 count; /* count of leaf entries */ - __be32 stale; /* count of stale lf entries */ -} xfs_dir2_block_tail_t; - -/* - * Generic single-block structure, for xfs_db. - */ -typedef struct xfs_dir2_block { - xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_union_t u[1]; - xfs_dir2_leaf_entry_t leaf[1]; - xfs_dir2_block_tail_t tail; -} xfs_dir2_block_t; - -/* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline xfs_dir2_block_tail_t * -xfs_dir2_block_tail_p(struct xfs_mount *mp, xfs_dir2_block_t *block) -{ - return (((xfs_dir2_block_tail_t *) - ((char *)(block) + (mp)->m_dirblksize)) - 1); -} - -/* - * Pointer to the leaf entries embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir2_block_leaf_p(xfs_dir2_block_tail_t *btp) -{ - return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); -} - -/* - * Function declarations. - */ -extern int xfs_dir2_block_addname(struct xfs_da_args *args); -extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_block_lookup(struct xfs_da_args *args); -extern int xfs_dir2_block_removename(struct xfs_da_args *args); -extern int xfs_dir2_block_replace(struct xfs_da_args *args); -extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, - struct xfs_dabuf *lbp, struct xfs_dabuf *dbp); -extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); - -#endif /* __XFS_DIR2_BLOCK_H__ */ diff --git a/include/xfs_dir2_data.h b/include/xfs_dir2_data.h deleted file mode 100644 index efbc290..0000000 --- a/include/xfs_dir2_data.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, 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 - */ -#ifndef __XFS_DIR2_DATA_H__ -#define __XFS_DIR2_DATA_H__ - -/* - * Directory format 2, data block structures. - */ - -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_inode; -struct xfs_trans; - -/* - * Constants. - */ -#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: for multiblock dirs */ -#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ -#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) -#define XFS_DIR2_DATA_FREE_TAG 0xffff -#define XFS_DIR2_DATA_FD_COUNT 3 - -/* - * Directory address space divided into sections, - * spaces separated by 32GB. - */ -#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) -#define XFS_DIR2_DATA_SPACE 0 -#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) - -/* - * Offsets of . and .. in data space (always block 0) - */ -#define XFS_DIR2_DATA_DOT_OFFSET \ - ((xfs_dir2_data_aoff_t)sizeof(xfs_dir2_data_hdr_t)) -#define XFS_DIR2_DATA_DOTDOT_OFFSET \ - (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) -#define XFS_DIR2_DATA_FIRST_OFFSET \ - (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) - -/* - * Structures. - */ - -/* - * Describe a free area in the data block. - * The freespace will be formatted as a xfs_dir2_data_unused_t. - */ -typedef struct xfs_dir2_data_free { - __be16 offset; /* start of freespace */ - __be16 length; /* length of freespace */ -} xfs_dir2_data_free_t; - -/* - * Header for the data blocks. - * Always at the beginning of a directory-sized block. - * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. - */ -typedef struct xfs_dir2_data_hdr { - __be32 magic; /* XFS_DIR2_DATA_MAGIC */ - /* or XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; -} xfs_dir2_data_hdr_t; - -/* - * Active entry in a data block. Aligned to 8 bytes. - * Tag appears as the last 2 bytes. - */ -typedef struct xfs_dir2_data_entry { - __be64 inumber; /* inode number */ - __u8 namelen; /* name length */ - __u8 name[1]; /* name bytes, no null */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_entry_t; - -/* - * Unused entry in a data block. Aligned to 8 bytes. - * Tag appears as the last 2 bytes. - */ -typedef struct xfs_dir2_data_unused { - __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ - __be16 length; /* total free length */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_unused_t; - -typedef union { - xfs_dir2_data_entry_t entry; - xfs_dir2_data_unused_t unused; -} xfs_dir2_data_union_t; - -/* - * Generic data block structure, for xfs_db. - */ -typedef struct xfs_dir2_data { - xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ - xfs_dir2_data_union_t u[1]; -} xfs_dir2_data_t; - -/* - * Macros. - */ - -/* - * Size of a data entry. - */ -static inline int xfs_dir2_data_entsize(int n) -{ - return (int)roundup(offsetof(xfs_dir2_data_entry_t, name[0]) + (n) + \ - (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir2_data_entry_tag_p(xfs_dir2_data_entry_t *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); -} - -/* - * Pointer to a freespace's tag word. - */ -static inline __be16 * -xfs_dir2_data_unused_tag_p(xfs_dir2_data_unused_t *dup) -{ - return (__be16 *)((char *)dup + - be16_to_cpu(dup->length) - sizeof(__be16)); -} - -/* - * Function declarations. - */ -#ifdef DEBUG -extern void xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_dabuf *bp); -#else -#define xfs_dir2_data_check(dp,bp) -#endif -extern xfs_dir2_data_free_t *xfs_dir2_data_freefind(xfs_dir2_data_t *d, - xfs_dir2_data_unused_t *dup); -extern xfs_dir2_data_free_t *xfs_dir2_data_freeinsert(xfs_dir2_data_t *d, - xfs_dir2_data_unused_t *dup, int *loghead); -extern void xfs_dir2_data_freescan(struct xfs_mount *mp, xfs_dir2_data_t *d, - int *loghead); -extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, - struct xfs_dabuf **bpp); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_dabuf *bp, - xfs_dir2_data_entry_t *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, - struct xfs_dabuf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_dabuf *bp, - xfs_dir2_data_unused_t *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_dabuf *bp, - xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, - int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_dabuf *bp, - xfs_dir2_data_unused_t *dup, - xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, - int *needscanp); - -#endif /* __XFS_DIR2_DATA_H__ */ diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h new file mode 100644 index 0000000..0727098 --- /dev/null +++ b/include/xfs_dir2_format.h @@ -0,0 +1,597 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, 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 + */ +#ifndef __XFS_DIR2_FORMAT_H__ +#define __XFS_DIR2_FORMAT_H__ + +/* + * Directory version 2. + * + * There are 4 possible formats: + * - shortform - embedded into the inode + * - single block - data with embedded leaf at the end + * - multiple data blocks, single leaf+freeindex block + * - data blocks, node and leaf blocks (btree), freeindex blocks + * + * Note: many node blocks structures and constants are shared with the attr + * code and defined in xfs_da_btree.h. + */ + +#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ +#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ +#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ + +/* + * Byte offset in data block and shortform entry. + */ +typedef __uint16_t xfs_dir2_data_off_t; +#define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +/* + * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. + * Only need 16 bits, this is the byte offset into the single block form. + */ +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; + +/* + * Offset in data space of a data entry. + */ +typedef __uint32_t xfs_dir2_dataptr_t; +#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) +#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +/* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* + * Inode number stored as 8 8-bit values. + */ +typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; + +/* + * Inode number stored as 4 8-bit values. + * Works a lot of the time, when all the inode numbers in a directory + * fit in 32 bits. + */ +typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; + +typedef union { + xfs_dir2_ino8_t i8; + xfs_dir2_ino4_t i4; +} xfs_dir2_inou_t; +#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) + +/* + * Directory layout when stored internal to an inode. + * + * Small directories are packed as tightly as possible so as to fit into the + * literal area of the inode. These "shortform" directories consist of a + * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry + * structures. Due the different inode number storage size and the variable + * length name field in the xfs_dir2_sf_entry all these structure are + * variable length, and the accessors in this file should be used to iterate + * over them. + */ +typedef struct xfs_dir2_sf_hdr { + __uint8_t count; /* count of entries */ + __uint8_t i8count; /* count of 8-byte inode #s */ + xfs_dir2_inou_t parent; /* parent dir inode number */ +} __arch_pack xfs_dir2_sf_hdr_t; + +typedef struct xfs_dir2_sf_entry { + __u8 namelen; /* actual name length */ + xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 name[]; /* name, variable size */ + /* + * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a + * variable offset after the name. + */ +} __arch_pack xfs_dir2_sf_entry_t; + +static inline int xfs_dir2_sf_hdr_size(int i8count) +{ + return sizeof(struct xfs_dir2_sf_hdr) - + (i8count == 0) * + (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(&sfep->offset.i); +} + +static inline void +xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) +{ + put_unaligned_be16(off, &sfep->offset.i); +} + +static inline int +xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) +{ + return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ + len + /* name */ + (hdr->i8count ? /* ino */ + sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t)); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); +} + + +/* + * Data block structures. + * + * A pure data block looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + * + * In addition to the pure data blocks for the data and node formats, + * most structures are also used for the combined data/freespace "block" + * format below. + */ + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) +#define XFS_DIR2_DATA_FREE_TAG 0xffff +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * Directory address space divided into sections, + * spaces separated by 32GB. + */ +#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) +#define XFS_DIR2_DATA_SPACE 0 +#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_DATA_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) + +/* + * Offsets of . and .. in data space (always block 0) + */ +#define XFS_DIR2_DATA_DOT_OFFSET \ + ((xfs_dir2_data_aoff_t)sizeof(struct xfs_dir2_data_hdr)) +#define XFS_DIR2_DATA_DOTDOT_OFFSET \ + (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) +#define XFS_DIR2_DATA_FIRST_OFFSET \ + (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) + +/* + * Describe a free area in the data block. + * + * The freespace will be formatted as a xfs_dir2_data_unused_t. + */ +typedef struct xfs_dir2_data_free { + __be16 offset; /* start of freespace */ + __be16 length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + * Header for the data blocks. + * + * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. + */ +typedef struct xfs_dir2_data_hdr { + __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + * Active entry in a data block. + * + * Aligned to 8 bytes. After the variable length name field there is a + * 2 byte tag field, which can be accessed using xfs_dir2_data_entry_tag_p. + */ +typedef struct xfs_dir2_data_entry { + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[]; /* name bytes, no null */ + /* __be16 tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + * Unused entry in a data block. + * + * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed + * using xfs_dir2_data_unused_tag_p. + */ +typedef struct xfs_dir2_data_unused { + __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ + __be16 length; /* total free length */ + /* variable offset */ + __be16 tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Size of a data entry. + */ +static inline int xfs_dir2_data_entsize(int n) +{ + return (int)roundup(offsetof(struct xfs_dir2_data_entry, name[0]) + n + + (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); +} + +/* + * Pointer to an entry's tag word. + */ +static inline __be16 * +xfs_dir2_data_entry_tag_p(struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); +} + +/* + * Pointer to a freespace's tag word. + */ +static inline __be16 * +xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) +{ + return (__be16 *)((char *)dup + + be16_to_cpu(dup->length) - sizeof(__be16)); +} + +/* + * Leaf block structures. + * + * A pure leaf block looks like the following drawing on disk: + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ + * + * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block + * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present + * for directories with separate leaf nodes and free space blocks + * (magic = XFS_DIR2_LEAFN_MAGIC). + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +/* + * Offset of the leaf/node space. First block in this space + * is the btree root. + */ +#define XFS_DIR2_LEAF_SPACE 1 +#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_LEAF_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) + +/* + * Leaf block header. + */ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +/* + * Leaf block entry. + */ +typedef struct xfs_dir2_leaf_entry { + __be32 hashval; /* hash value of name */ + __be32 address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + * Leaf block tail. + */ +typedef struct xfs_dir2_leaf_tail { + __be32 bestcount; +} xfs_dir2_leaf_tail_t; + +/* + * Leaf block. + */ +typedef struct xfs_dir2_leaf { + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t ents[]; /* entries */ +} xfs_dir2_leaf_t; + +/* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - (uint)sizeof(struct xfs_dir2_leaf_hdr)) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + +/* + * Get address of the bests array in the single-leaf block. + */ +static inline __be16 * +xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) +{ + return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); +} + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Free space block defintions for the node format. + */ + +/* + * Offset of the freespace index. + */ +#define XFS_DIR2_FREE_SPACE 2 +#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_FREE_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + +typedef struct xfs_dir2_free_hdr { + __be32 magic; /* XFS_DIR2_FREE_MAGIC */ + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +static inline int xfs_dir2_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + sizeof(xfs_dir2_data_off_t); +} + +/* + * Convert data space db to the corresponding free db. + */ +static inline xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static inline int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir2_free_max_bests(mp); +} + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +typedef struct xfs_dir2_block_tail { + __be32 count; /* count of leaf entries */ + __be32 stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + * Pointer to the leaf header embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) +{ + return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); +} + +#endif /* __XFS_DIR2_FORMAT_H__ */ diff --git a/include/xfs_dir2_leaf.h b/include/xfs_dir2_leaf.h deleted file mode 100644 index 6c9539f..0000000 --- a/include/xfs_dir2_leaf.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, 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 - */ -#ifndef __XFS_DIR2_LEAF_H__ -#define __XFS_DIR2_LEAF_H__ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * Offset of the leaf/node space. First block in this space - * is the btree root. - */ -#define XFS_DIR2_LEAF_SPACE 1 -#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) - -/* - * Offset in data space of a data entry. - */ -typedef __uint32_t xfs_dir2_dataptr_t; -#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) -#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) - -/* - * Leaf block header. - */ -typedef struct xfs_dir2_leaf_hdr { - xfs_da_blkinfo_t info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ -} xfs_dir2_leaf_hdr_t; - -/* - * Leaf block entry. - */ -typedef struct xfs_dir2_leaf_entry { - __be32 hashval; /* hash value of name */ - __be32 address; /* address of data entry */ -} xfs_dir2_leaf_entry_t; - -/* - * Leaf block tail. - */ -typedef struct xfs_dir2_leaf_tail { - __be32 bestcount; -} xfs_dir2_leaf_tail_t; - -/* - * Leaf block. - * bests and tail are at the end of the block for single-leaf only - * (magic = XFS_DIR2_LEAF1_MAGIC not XFS_DIR2_LEAFN_MAGIC). - */ -typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t ents[1]; /* entries */ - /* ... */ - xfs_dir2_data_off_t bests[1]; /* best free counts */ - xfs_dir2_leaf_tail_t tail; /* leaf tail */ -} xfs_dir2_leaf_t; - -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) -{ - return (int)(((mp)->m_dirblksize - (uint)sizeof(xfs_dir2_leaf_hdr_t)) / - (uint)sizeof(xfs_dir2_leaf_entry_t)); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline xfs_dir2_leaf_tail_t * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, xfs_dir2_leaf_t *lp) -{ - return (xfs_dir2_leaf_tail_t *) - ((char *)(lp) + (mp)->m_dirblksize - - (uint)sizeof(xfs_dir2_leaf_tail_t)); -} - -/* - * Get address of the bests array in the single-leaf block. - */ -static inline __be16 * -xfs_dir2_leaf_bests_p(xfs_dir2_leaf_tail_t *ltp) -{ - return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); -} - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)(dp) << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)((by) >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t)((by) >> \ - ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)((by) & \ - ((1 << ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)(db) << \ - ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)) + (o); -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)((db) << (mp)->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)((da) >> (mp)->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* - * Function declarations. - */ -extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, - struct xfs_dabuf *dbp); -extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); -extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, - struct xfs_dabuf *bp); -extern void xfs_dir2_leaf_compact_x1(struct xfs_dabuf *bp, int *indexp, - int *lowstalep, int *highstalep, - int *lowlogp, int *highlogp); -extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, - size_t bufsize, xfs_off_t *offset, - filldir_t filldir); -extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_dabuf **bpp, int magic); -extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_dabuf *bp, - int first, int last); -extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, - struct xfs_dabuf *bp); -extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); -extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); -extern int xfs_dir2_leaf_replace(struct xfs_da_args *args); -extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, - struct xfs_dabuf *lbp); -extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, - struct xfs_dabuf *lbp, xfs_dir2_db_t db); -extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); - -#endif /* __XFS_DIR2_LEAF_H__ */ diff --git a/include/xfs_dir2_node.h b/include/xfs_dir2_node.h deleted file mode 100644 index 82dfe71..0000000 --- a/include/xfs_dir2_node.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, 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 - */ -#ifndef __XFS_DIR2_NODE_H__ -#define __XFS_DIR2_NODE_H__ - -/* - * Directory version 2, btree node format structures - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_da_state; -struct xfs_da_state_blk; -struct xfs_inode; -struct xfs_trans; - -/* - * Offset of the freespace index. - */ -#define XFS_DIR2_FREE_SPACE 2 -#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) - -#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F */ - -typedef struct xfs_dir2_free_hdr { - __be32 magic; /* XFS_DIR2_FREE_MAGIC */ - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ -} xfs_dir2_free_hdr_t; - -typedef struct xfs_dir2_free { - xfs_dir2_free_hdr_t hdr; /* block header */ - __be16 bests[1]; /* best free counts */ - /* unused entries are -1 */ -} xfs_dir2_free_t; - -#define XFS_DIR2_MAX_FREE_BESTS(mp) \ - (((mp)->m_dirblksize - (uint)sizeof(xfs_dir2_free_hdr_t)) / \ - (uint)sizeof(xfs_dir2_data_off_t)) - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (XFS_DIR2_FREE_FIRSTDB(mp) + (db) / XFS_DIR2_MAX_FREE_BESTS(mp)); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); -} - -extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, - struct xfs_dabuf *lbp); -extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *count); -extern int xfs_dir2_leafn_lookup_int(struct xfs_dabuf *bp, - struct xfs_da_args *args, int *indexp, - struct xfs_da_state *state); -extern int xfs_dir2_leafn_order(struct xfs_dabuf *leaf1_bp, - struct xfs_dabuf *leaf2_bp); -extern int xfs_dir2_leafn_split(struct xfs_da_state *state, - struct xfs_da_state_blk *oldblk, - struct xfs_da_state_blk *newblk); -extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action); -extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, - struct xfs_da_state_blk *drop_blk, - struct xfs_da_state_blk *save_blk); -extern int xfs_dir2_node_addname(struct xfs_da_args *args); -extern int xfs_dir2_node_lookup(struct xfs_da_args *args); -extern int xfs_dir2_node_removename(struct xfs_da_args *args); -extern int xfs_dir2_node_replace(struct xfs_da_args *args); -extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t fo, - int *rvalp); - -#endif /* __XFS_DIR2_NODE_H__ */ diff --git a/include/xfs_dir2_sf.h b/include/xfs_dir2_sf.h deleted file mode 100644 index 6ac44b5..0000000 --- a/include/xfs_dir2_sf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, 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 - */ -#ifndef __XFS_DIR2_SF_H__ -#define __XFS_DIR2_SF_H__ - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to - * fit into the literal area of the inode. - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_block; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * Inode number stored as 8 8-bit values. - */ -typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; - -/* - * Inode number stored as 4 8-bit values. - * Works a lot of the time, when all the inode numbers in a directory - * fit in 32 bits. - */ -typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; - -typedef union { - xfs_dir2_ino8_t i8; - xfs_dir2_ino4_t i4; -} xfs_dir2_inou_t; -#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) - -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - -/* - * The parent directory has a dedicated field, and the self-pointer must - * be calculated on the fly. - * - * Entries are packed toward the top as tightly as possible. The header - * and the elements must be memcpy'd out into a work area to get correct - * alignment for the inode number fields. - */ -typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - xfs_dir2_inou_t parent; /* parent dir inode number */ -} __arch_pack xfs_dir2_sf_hdr_t; - -typedef struct xfs_dir2_sf_entry { - __uint8_t namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ - __uint8_t name[1]; /* name, variable size */ - xfs_dir2_inou_t inumber; /* inode number, var. offset */ -} __arch_pack xfs_dir2_sf_entry_t; - -typedef struct xfs_dir2_sf { - xfs_dir2_sf_hdr_t hdr; /* shortform header */ - xfs_dir2_sf_entry_t list[1]; /* shortform entries */ -} xfs_dir2_sf_t; - -static inline int xfs_dir2_sf_hdr_size(int i8count) -{ - return ((uint)sizeof(xfs_dir2_sf_hdr_t) - \ - ((i8count) == 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep) -{ - return (xfs_dir2_inou_t *)&(sfep)->name[(sfep)->namelen]; -} - -static inline xfs_intino_t -xfs_dir2_sf_get_inumber(xfs_dir2_sf_t *sfp, xfs_dir2_inou_t *from) -{ - return ((sfp)->hdr.i8count == 0 ? \ - (xfs_intino_t)XFS_GET_DIR_INO4((from)->i4) : \ - (xfs_intino_t)XFS_GET_DIR_INO8((from)->i8)); -} - -static inline void xfs_dir2_sf_put_inumber(xfs_dir2_sf_t *sfp, xfs_ino_t *from, - xfs_dir2_inou_t *to) -{ - if ((sfp)->hdr.i8count == 0) - XFS_PUT_DIR_INO4(*(from), (to)->i4); - else - XFS_PUT_DIR_INO8(*(from), (to)->i8); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) -{ - return INT_GET_UNALIGNED_16_BE(&(sfep)->offset.i); -} - -static inline void -xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) -{ - INT_SET_UNALIGNED_16_BE(&(sfep)->offset.i, off); -} - -static inline int xfs_dir2_sf_entsize_byname(xfs_dir2_sf_t *sfp, int len) -{ - return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (len) - \ - ((sfp)->hdr.i8count == 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline int -xfs_dir2_sf_entsize_byentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep) -{ - return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (sfep)->namelen - \ - ((sfp)->hdr.i8count == 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline xfs_dir2_sf_entry_t *xfs_dir2_sf_firstentry(xfs_dir2_sf_t *sfp) -{ - return ((xfs_dir2_sf_entry_t *) \ - ((char *)(sfp) + xfs_dir2_sf_hdr_size(sfp->hdr.i8count))); -} - -static inline xfs_dir2_sf_entry_t * -xfs_dir2_sf_nextentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep) -{ - return ((xfs_dir2_sf_entry_t *) \ - ((char *)(sfep) + xfs_dir2_sf_entsize_byentry(sfp,sfep))); -} - -/* - * Functions. - */ -extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, - struct xfs_dir2_block *block, - xfs_dir2_sf_hdr_t *sfhp); -extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_dabuf *bp, - int size, xfs_dir2_sf_hdr_t *sfhp); -extern int xfs_dir2_sf_addname(struct xfs_da_args *args); -extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); -extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); -extern int xfs_dir2_sf_removename(struct xfs_da_args *args); -extern int xfs_dir2_sf_replace(struct xfs_da_args *args); - -#endif /* __XFS_DIR2_SF_H__ */ diff --git a/include/xfs_fs.h b/include/xfs_fs.h index faac5af..1cc1aa0 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -233,7 +233,8 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ #define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ #define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ +#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x0800 /* 32-bit project IDs */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ @@ -249,6 +250,11 @@ typedef struct xfs_fsop_resblks { #define XFS_MAX_LOG_BYTES \ ((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES) +/* Used for sanity checks on superblock */ +#define XFS_MAX_DBLOCKS(s) ((xfs_drfsbno_t)(s)->sb_agcount * (s)->sb_agblocks) +#define XFS_MIN_DBLOCKS(s) ((xfs_drfsbno_t)((s)->sb_agcount - 1) * \ + (s)->sb_agblocks + XFS_MIN_AG_BLOCKS) + /* * Structures for XFS_IOC_FSGROWFSDATA, XFS_IOC_FSGROWFSLOG & XFS_IOC_FSGROWFSRT */ @@ -334,6 +340,35 @@ typedef struct xfs_error_injection { /* + * Speculative preallocation trimming. + */ +#define XFS_EOFBLOCKS_VERSION 1 +struct xfs_eofblocks { + __u32 eof_version; + __u32 eof_flags; + uid_t eof_uid; + gid_t eof_gid; + prid_t eof_prid; + __u32 pad32; + __u64 eof_min_file_size; + __u64 pad64[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_SYNC (1 << 0) /* sync/wait mode scan */ +#define XFS_EOF_FLAGS_UID (1 << 1) /* filter by uid */ +#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_VALID \ + (XFS_EOF_FLAGS_SYNC | \ + XFS_EOF_FLAGS_UID | \ + XFS_EOF_FLAGS_GID | \ + XFS_EOF_FLAGS_PRID | \ + XFS_EOF_FLAGS_MINFILESIZE) + + +/* * The user-level Handle Request interface structure. */ typedef struct xfs_fsop_handlereq { @@ -451,6 +486,7 @@ typedef struct xfs_handle { /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index bb53854..c8da3df 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -47,15 +47,6 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) } /* - * Find a free (set) bit in the inode bitmask. - */ -static inline int xfs_ialloc_find_free(xfs_inofree_t *fp) -{ - return xfs_lowbit64(*fp); -} - - -/* * Allocate an inode on disk. * Mode is used to tell whether the new inode will need space, and whether * it is a directory. @@ -81,11 +72,9 @@ int /* error */ xfs_dialloc( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t parent, /* parent inode (directory) */ - mode_t mode, /* mode bits for new inode */ + umode_t mode, /* mode bits for new inode */ int okalloc, /* ok to allocate more space */ struct xfs_buf **agbp, /* buf for a.g. inode header */ - boolean_t *alloc_done, /* an allocation was done to replenish - the free inodes */ xfs_ino_t *inop); /* inode number allocated */ /* @@ -158,7 +147,9 @@ int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino, /* * Get the data from the pointed-to record. */ -extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, +int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_inobt_rec_incore_t *rec, int *stat); +extern const struct xfs_buf_ops xfs_agi_buf_ops; + #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index f782ad0..25c0239 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -109,4 +109,6 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); +extern const struct xfs_buf_ops xfs_inobt_buf_ops; + #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index ca56544..437b3af 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -66,8 +66,6 @@ typedef struct xfs_ifork { struct xfs_btree_block *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ - unsigned char if_ext_max; /* max # of extent records */ - xfs_extnum_t if_lastex; /* last if_extents used */ union { xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ @@ -111,7 +109,7 @@ struct xfs_imap { * Generally, we do not want to hold the i_rlock while holding the * i_ilock. Hierarchy is i_iolock followed by i_rlock. * - * xfs_iptr_t contains all the inode fields upto and including the + * xfs_iptr_t contains all the inode fields up to and including the * i_mnext and i_mprev fields, it is used as a marker in the inode * chain off the mount structure by xfs_sync calls. */ @@ -207,29 +205,12 @@ typedef struct xfs_icdinode { ((w) == XFS_DATA_FORK ? \ ((ip)->i_d.di_nextents = (n)) : \ ((ip)->i_d.di_anextents = (n))) +#define XFS_IFORK_MAXEXT(ip, w) \ + (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) -/* - * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen - * to retain compatibility with "old" filesystems). - */ -static inline __uint32_t -xfs_get_projid(struct xfs_icdinode i_d) -{ - return (__uint32_t)i_d.di_projid_hi << 16 | i_d.di_projid_lo; -} - -static inline void -xfs_set_projid(struct xfs_icdinode *i_d, - __uint32_t projid) -{ - i_d->di_projid_hi = (__uint16_t) (projid >> 16); - i_d->di_projid_lo = (__uint16_t) (projid & 0xffff); -} #ifdef __KERNEL__ -struct bhv_desc; struct xfs_buf; struct xfs_bmap_free; struct xfs_bmbt_irec; @@ -238,12 +219,6 @@ struct xfs_mount; struct xfs_trans; struct xfs_dquot; -typedef struct dm_attrs_s { - __uint32_t da_dmevmask; /* DMIG event mask */ - __uint16_t da_dmstate; /* DMIG state info */ - __uint16_t da_pad; /* DMIG extra padding */ -} dm_attrs_t; - typedef struct xfs_inode { /* Inode linking and identification information. */ struct xfs_mount *i_mount; /* fs mount struct ptr */ @@ -259,32 +234,21 @@ typedef struct xfs_inode { xfs_ifork_t i_df; /* data fork */ /* Transaction and locking information. */ - struct xfs_trans *i_transp; /* ptr to owning transaction*/ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ mrlock_t i_iolock; /* inode IO lock */ - struct completion i_flush; /* inode flush completion q */ atomic_t i_pincount; /* inode pin count */ - wait_queue_head_t i_ipin_wait; /* inode pinning wait queue */ spinlock_t i_flags_lock; /* inode i_flags lock */ /* Miscellaneous state. */ - unsigned short i_flags; /* see defined flags below */ - unsigned char i_update_core; /* timestamps/size is dirty */ + unsigned long i_flags; /* see defined flags below */ unsigned int i_delayed_blks; /* count of delay alloc blks */ xfs_icdinode_t i_d; /* most of ondisk inode */ - xfs_fsize_t i_size; /* in-memory size */ - xfs_fsize_t i_new_size; /* size when write completes */ - atomic_t i_iocount; /* outstanding I/O count */ - /* VFS inode */ struct inode i_vnode; /* embedded VFS inode */ } xfs_inode_t; -#define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ - (ip)->i_size : (ip)->i_d.di_size; - /* Convert from vfs inode to xfs inode */ static inline struct xfs_inode *XFS_I(struct inode *inode) { @@ -298,6 +262,32 @@ static inline struct inode *VFS_I(struct xfs_inode *ip) } /* + * For regular files we only update the on-disk filesize when actually + * writing data back to disk. Until then only the copy in the VFS inode + * is uptodate. + */ +static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) +{ + if (S_ISREG(ip->i_d.di_mode)) + return i_size_read(VFS_I(ip)); + return ip->i_d.di_size; +} + +/* + * If this I/O goes past the on-disk inode size update it unless it would + * be past the current in-core inode size. + */ +static inline xfs_fsize_t +xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size) +{ + xfs_fsize_t i_size = i_size_read(VFS_I(ip)); + + if (new_size > i_size) + new_size = i_size; + return new_size > ip->i_d.di_size ? new_size : 0; +} + +/* * i_flags helper functions */ static inline void @@ -351,9 +341,22 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) return ret; } +static inline int +xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags) +{ + int ret; + + spin_lock(&ip->i_flags_lock); + ret = ip->i_flags & flags; + if (!ret) + ip->i_flags |= flags; + spin_unlock(&ip->i_flags_lock); + return ret; +} + /* * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen + * and using two 16bit values to hold new 32bit projid was chosen * to retain compatibility with "old" filesystems). */ static inline prid_t @@ -371,35 +374,58 @@ xfs_set_projid(struct xfs_inode *ip, } /* - * Manage the i_flush queue embedded in the inode. This completion - * queue synchronizes processes attempting to flush the in-core - * inode back to disk. + * In-core inode flags. + */ +#define XFS_IRECLAIM (1 << 0) /* started reclaiming this inode */ +#define XFS_ISTALE (1 << 1) /* inode has been staled */ +#define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */ +#define XFS_INEW (1 << 3) /* inode has just been allocated */ +#define XFS_IFILESTREAM (1 << 4) /* inode is in a filestream dir. */ +#define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */ +#define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */ +#define __XFS_IFLOCK_BIT 7 /* inode is being flushed right now */ +#define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT) +#define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ +#define XFS_IPINNED (1 << __XFS_IPINNED_BIT) +#define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ + +/* + * Per-lifetime flags need to be reset when re-using a reclaimable inode during + * inode lookup. This prevents unintended behaviour on the new inode from + * ocurring. */ -static inline void xfs_iflock(xfs_inode_t *ip) +#define XFS_IRECLAIM_RESET_FLAGS \ + (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ + XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \ + XFS_IFILESTREAM); + +/* + * Synchronize processes attempting to flush the in-core inode back to disk. + */ + +extern void __xfs_iflock(struct xfs_inode *ip); + +static inline int xfs_iflock_nowait(struct xfs_inode *ip) { - wait_for_completion(&ip->i_flush); + return !xfs_iflags_test_and_set(ip, XFS_IFLOCK); } -static inline int xfs_iflock_nowait(xfs_inode_t *ip) +static inline void xfs_iflock(struct xfs_inode *ip) { - return try_wait_for_completion(&ip->i_flush); + if (!xfs_iflock_nowait(ip)) + __xfs_iflock(ip); } -static inline void xfs_ifunlock(xfs_inode_t *ip) +static inline void xfs_ifunlock(struct xfs_inode *ip) { - complete(&ip->i_flush); + xfs_iflags_clear(ip, XFS_IFLOCK); + wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT); } -/* - * In-core inode flags. - */ -#define XFS_IRECLAIM 0x0001 /* started reclaiming this inode */ -#define XFS_ISTALE 0x0002 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ -#define XFS_INEW 0x0008 /* inode has just been allocated */ -#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ -#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ -#define XFS_IDIRTY_RELEASE 0x0040 /* dirty release already seen */ +static inline int xfs_isiflocked(struct xfs_inode *ip) +{ + return xfs_iflags_test(ip, XFS_IFLOCK); +} /* * Flags for inode locking. @@ -410,7 +436,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_SHARED (1<<1) #define XFS_ILOCK_EXCL (1<<2) #define XFS_ILOCK_SHARED (1<<3) -#define XFS_IUNLOCK_NONOTIFY (1<<4) #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) @@ -419,35 +444,41 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ - { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ - { XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" } + { XFS_ILOCK_SHARED, "ILOCK_SHARED" } /* * Flags for lockdep annotations. * - * XFS_I[O]LOCK_PARENT - for operations that require locking two inodes - * (ie directory operations that require locking a directory inode and - * an entry inode). The first inode gets locked with this flag so it - * gets a lockdep subclass of 1 and the second lock will have a lockdep - * subclass of 0. + * XFS_LOCK_PARENT - for directory operations that require locking a + * parent directory inode and a child entry inode. The parent gets locked + * with this flag so it gets a lockdep subclass of 1 and the child entry + * lock will have a lockdep subclass of 0. + * + * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary + * inodes do not participate in the normal lock order, and thus have their + * own subclasses. * * XFS_LOCK_INUMORDER - for locking several inodes at the some time * with xfs_lock_inodes(). This flag is used as the starting subclass * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 2, the - * second lock will have a lockdep subclass of 3, and so on. It is + * So the first lock acquired will have a lockdep subclass of 4, the + * second lock will have a lockdep subclass of 5, and so on. It is * the responsibility of the class builder to shift this to the correct * portion of the lock_mode lockdep mask. */ #define XFS_LOCK_PARENT 1 -#define XFS_LOCK_INUMORDER 2 +#define XFS_LOCK_RTBITMAP 2 +#define XFS_LOCK_RTSUM 3 +#define XFS_LOCK_INUMORDER 4 #define XFS_IOLOCK_SHIFT 16 #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) #define XFS_ILOCK_SHIFT 24 #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) #define XFS_IOLOCK_DEP_MASK 0x00ff0000 #define XFS_ILOCK_DEP_MASK 0xff000000 @@ -456,18 +487,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) -extern struct lock_class_key xfs_iolock_reclaimable; - -/* - * Flags for xfs_itruncate_start(). - */ -#define XFS_ITRUNC_DEFINITE 0x1 -#define XFS_ITRUNC_MAYBE 0x2 - -#define XFS_ITRUNC_FLAGS \ - { XFS_ITRUNC_DEFINITE, "DEFINITE" }, \ - { XFS_ITRUNC_MAYBE, "MAYBE" } - /* * For multiple groups support: if S_ISGID bit is set in the parent * directory, group of new file is set to that of the parent, and @@ -477,11 +496,10 @@ extern struct lock_class_key xfs_iolock_reclaimable; (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ ((pip)->i_d.di_mode & S_ISGID)) + /* - * xfs_iget.c prototypes. + * xfs_inode.c prototypes. */ -int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); @@ -489,33 +507,25 @@ void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); uint xfs_ilock_map_shared(xfs_inode_t *); void xfs_iunlock_map_shared(xfs_inode_t *, uint); -void xfs_inode_free(struct xfs_inode *ip); - -/* - * xfs_inode.c prototypes. - */ -int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, +int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t, xfs_nlink_t, xfs_dev_t, prid_t, int, - struct xfs_buf **, boolean_t *, xfs_inode_t **); + struct xfs_buf **, xfs_inode_t **); uint xfs_ip2xflags(struct xfs_inode *); uint xfs_dic2xflags(struct xfs_dinode *); int xfs_ifree(struct xfs_trans *, xfs_inode_t *, struct xfs_bmap_free *); -int xfs_itruncate_start(xfs_inode_t *, uint, xfs_fsize_t); -int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *, - xfs_fsize_t, int, int); +int xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *, + int, xfs_fsize_t); int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); void xfs_iunpin_wait(xfs_inode_t *); -int xfs_iflush(xfs_inode_t *, uint); +int xfs_iflush(struct xfs_inode *, struct xfs_buf **); void xfs_lock_inodes(xfs_inode_t **, int, uint); void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); -void xfs_synchronize_times(xfs_inode_t *); -void xfs_mark_inode_dirty(xfs_inode_t *); -void xfs_mark_inode_dirty_sync(xfs_inode_t *); +xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); #define IHOLD(ip) \ do { \ @@ -537,19 +547,15 @@ do { \ */ #define XFS_IGET_CREATE 0x1 #define XFS_IGET_UNTRUSTED 0x2 +#define XFS_IGET_DONTCACHE 0x4 -int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, - xfs_ino_t, struct xfs_dinode **, - struct xfs_buf **, int *, uint); -int xfs_itobp(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, struct xfs_dinode **, - struct xfs_buf **, uint); +int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, + struct xfs_imap *, struct xfs_dinode **, + struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); -void xfs_dinode_from_disk(struct xfs_icdinode *, - struct xfs_dinode *); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); void xfs_iroot_realloc(struct xfs_inode *, int, int); @@ -579,16 +585,10 @@ void xfs_iext_irec_compact(xfs_ifork_t *); void xfs_iext_irec_compact_pages(xfs_ifork_t *); void xfs_iext_irec_compact_full(xfs_ifork_t *); void xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int); +bool xfs_can_free_eofblocks(struct xfs_inode *, bool); #define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount)) -#ifdef DEBUG -void xfs_isize_check(struct xfs_mount *, struct xfs_inode *, - xfs_fsize_t); -#else /* DEBUG */ -#define xfs_isize_check(mp, ip, isize) -#endif /* DEBUG */ - #if defined(DEBUG) void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #else @@ -598,5 +598,6 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); extern struct kmem_zone *xfs_ifork_zone; extern struct kmem_zone *xfs_inode_zone; extern struct kmem_zone *xfs_ili_zone; +extern const struct xfs_buf_ops xfs_inode_buf_ops; #endif /* __XFS_INODE_H__ */ diff --git a/include/xfs_inode_item.h b/include/xfs_inode_item.h index d3dee61..779812f 100644 --- a/include/xfs_inode_item.h +++ b/include/xfs_inode_item.h @@ -86,6 +86,15 @@ typedef struct xfs_inode_log_format_64 { #define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ #define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ + +/* + * The timestamps are dirty, but not necessarily anything else in the inode + * core. Unlike the other fields above this one must never make it to disk + * in the ilf_fields of the inode_log_format, but is purely store in-memory in + * ili_fields in the inode_log_item. + */ +#define XFS_ILOG_TIMESTAMP 0x4000 + #define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ XFS_ILOG_UUID | XFS_ILOG_ADATA | \ @@ -101,7 +110,7 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ XFS_ILOG_DEV | XFS_ILOG_UUID | \ XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ - XFS_ILOG_ABROOT) + XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) static inline int xfs_ilog_fbroot(int w) { @@ -134,30 +143,25 @@ typedef struct xfs_inode_log_item { unsigned short ili_lock_flags; /* lock flags */ unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ + unsigned int ili_fields; /* fields to be logged */ struct xfs_bmbt_rec *ili_extents_buf; /* array of logged data exts */ struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ -#ifdef XFS_TRANS_DEBUG - int ili_root_size; - char *ili_orig_root; -#endif xfs_inode_log_format_t ili_format; /* logged structure */ } xfs_inode_log_item_t; static inline int xfs_inode_clean(xfs_inode_t *ip) { - return (!ip->i_itemp || - !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) && - !ip->i_update_core; + return !ip->i_itemp || !(ip->i_itemp->ili_fields & XFS_ILOG_ALL); } extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); extern void xfs_inode_item_destroy(struct xfs_inode *); extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); -extern void xfs_iflush_abort(struct xfs_inode *); +extern void xfs_iflush_abort(struct xfs_inode *, bool); extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, xfs_inode_log_format_t *); diff --git a/include/xfs_inum.h b/include/xfs_inum.h index b8e4ee4..90efdaf 100644 --- a/include/xfs_inum.h +++ b/include/xfs_inum.h @@ -26,22 +26,6 @@ * high agno_log-agblklog-inopblog bits - 0 */ -typedef __uint32_t xfs_agino_t; /* within allocation grp inode number */ - -/* - * Useful inode bits for this kernel. - * Used in some places where having 64-bits in the 32-bit kernels - * costs too much. - */ -#if XFS_BIG_INUMS -typedef xfs_ino_t xfs_intino_t; -#else -typedef __uint32_t xfs_intino_t; -#endif - -#define NULLFSINO ((xfs_ino_t)-1) -#define NULLAGINO ((xfs_agino_t)-1) - struct xfs_mount; #define XFS_INO_MASK(k) (__uint32_t)((1ULL << (k)) - 1) diff --git a/include/xfs_log.h b/include/xfs_log.h index 916eb7d..5caee96 100644 --- a/include/xfs_log.h +++ b/include/xfs_log.h @@ -53,15 +53,6 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) #define XFS_LOG_REL_PERM_RESERV 0x1 /* - * Flags to xfs_log_reserve() - * - * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are - * performed against this type of reservation, the reservation - * is not decreased. Long running transactions should use this. - */ -#define XFS_LOG_PERM_RESERV 0x2 - -/* * Flags to xfs_log_force() * * XFS_LOG_SYNC: Synchronous force in-core log to disk @@ -137,7 +128,7 @@ struct xfs_trans; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, int type, - struct xfs_item_ops *ops); + const struct xfs_item_ops *ops); xfs_lsn_t xfs_log_done(struct xfs_mount *mp, struct xlog_ticket *ticket, @@ -160,8 +151,9 @@ int xfs_log_mount(struct xfs_mount *mp, xfs_daddr_t start_block, int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp); -void xfs_log_move_tail(struct xfs_mount *mp, - xfs_lsn_t tail_lsn); +xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); +xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); +void xfs_log_space_wake(struct xfs_mount *mp); int xfs_log_notify(struct xfs_mount *mp, struct xlog_in_core *iclog, xfs_log_callback_t *callback_entry); @@ -172,13 +164,9 @@ int xfs_log_reserve(struct xfs_mount *mp, int count, struct xlog_ticket **ticket, __uint8_t clientid, - uint flags, + bool permanent, uint t_type); -int xfs_log_write(struct xfs_mount *mp, - xfs_log_iovec_t region[], - int nentries, - struct xlog_ticket *ticket, - xfs_lsn_t *start_lsn); +int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic); int xfs_log_unmount_write(struct xfs_mount *mp); void xfs_log_unmount(struct xfs_mount *mp); int xfs_log_force_umount(struct xfs_mount *mp, int logerror); @@ -189,12 +177,13 @@ void xlog_iodone(struct xfs_buf *); struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); -xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); - int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, - struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); +void xfs_log_work_queue(struct xfs_mount *mp); +void xfs_log_worker(struct work_struct *work); +void xfs_log_quiesce(struct xfs_mount *mp); + #endif #endif /* __XFS_LOG_H__ */ diff --git a/include/xfs_log_priv.h b/include/xfs_log_priv.h index d5f8be8..16d8d12 100644 --- a/include/xfs_log_priv.h +++ b/include/xfs_log_priv.h @@ -19,7 +19,7 @@ #define __XFS_LOG_PRIV_H__ struct xfs_buf; -struct log; +struct xlog; struct xlog_ticket; struct xfs_mount; @@ -87,10 +87,6 @@ static inline uint xlog_get_client_id(__be32 i) return be32_to_cpu(i) >> 24; } -#define xlog_panic(args...) cmn_err(CE_PANIC, ## args) -#define xlog_exit(args...) cmn_err(CE_PANIC, ## args) -#define xlog_warn(args...) cmn_err(CE_WARN, ## args) - /* * In core log state */ @@ -143,11 +139,13 @@ static inline uint xlog_get_client_id(__be32 i) /* * Flags for log structure */ -#define XLOG_CHKSUM_MISMATCH 0x1 /* used only during recovery */ #define XLOG_ACTIVE_RECOVERY 0x2 /* in the middle of recovery */ #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ +#define XLOG_TAIL_WARN 0x10 /* log tail verify warning issued */ + +typedef __uint32_t xlog_tid_t; #ifdef __KERNEL__ /* @@ -240,8 +238,8 @@ typedef struct xlog_res { } xlog_res_t; typedef struct xlog_ticket { - wait_queue_head_t t_wait; /* ticket wait queue */ struct list_head t_queue; /* reserve/write queue */ + struct task_struct *t_task; /* task that owns this ticket */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ int t_curr_res; /* current reservation in bytes : 4 */ @@ -292,7 +290,7 @@ typedef struct xlog_rec_header { __be32 h_len; /* len in bytes; should be 64-bit aligned: 4 */ __be64 h_lsn; /* lsn of this LR : 8 */ __be64 h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */ - __be32 h_chksum; /* may not be used; non-zero if used : 4 */ + __le32 h_crc; /* crc of log record : 4 */ __be32 h_prev_block; /* block number to previous LR : 4 */ __be32 h_num_logops; /* number of log operations in this LR : 4 */ __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; @@ -353,7 +351,7 @@ typedef struct xlog_in_core { struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; - struct log *ic_log; + struct xlog *ic_log; int ic_size; int ic_offset; int ic_bwritecnt; @@ -410,7 +408,7 @@ struct xfs_cil_ctx { * operations almost as efficient as the old logging methods. */ struct xfs_cil { - struct log *xc_log; + struct xlog *xc_log; struct list_head xc_cil; spinlock_t xc_cil_lock; struct xfs_cil_ctx *xc_ctx; @@ -418,6 +416,8 @@ struct xfs_cil { struct list_head xc_committing; wait_queue_head_t xc_commit_wait; xfs_lsn_t xc_current_sequence; + struct work_struct xc_push_work; + xfs_lsn_t xc_push_seq; }; /* @@ -471,12 +471,22 @@ struct xfs_cil { #define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) /* + * ticket grant locks, queues and accounting have their own cachlines + * as these are quite hot and can be operated on concurrently. + */ +struct xlog_grant_head { + spinlock_t lock ____cacheline_aligned_in_smp; + struct list_head waiters; + atomic64_t grant; +}; + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean * that round off problems won't occur when releasing partial reservations. */ -typedef struct log { +struct xlog { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ @@ -484,6 +494,7 @@ typedef struct log { struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ + struct delayed_work l_work; /* background flush work */ uint l_flags; uint l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */ struct list_head *l_buf_cancel_table; @@ -521,24 +532,15 @@ typedef struct log { /* lsn of 1st LR with unflushed * buffers */ atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; - /* - * ticket grant locks, queues and accounting have their own cachlines - * as these are quite hot and can be operated on concurrently. - */ - spinlock_t l_grant_reserve_lock ____cacheline_aligned_in_smp; - struct list_head l_reserveq; - atomic64_t l_grant_reserve_head; - - spinlock_t l_grant_write_lock ____cacheline_aligned_in_smp; - struct list_head l_writeq; - atomic64_t l_grant_write_head; + struct xlog_grant_head l_reserve_head; + struct xlog_grant_head l_write_head; /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; #endif -} xlog_t; +}; #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) @@ -546,15 +548,25 @@ typedef struct log { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ -extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); -extern int xlog_recover(xlog_t *log); -extern int xlog_recover_finish(xlog_t *log); -extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); +extern int +xlog_recover( + struct xlog *log); +extern int +xlog_recover_finish( + struct xlog *log); + +extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, + char *dp, int size); extern kmem_zone_t *xfs_log_ticket_zone; -struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, - int count, char client, uint xflags, - int alloc_flags); +struct xlog_ticket * +xlog_ticket_alloc( + struct xlog *log, + int unit_bytes, + int count, + char client, + bool permanent, + xfs_km_flags_t alloc_flags); static inline void @@ -566,15 +578,20 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) } void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); -int xlog_write(struct log *log, struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, uint flags); +int +xlog_write( + struct xlog *log, + struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, + xfs_lsn_t *start_lsn, + struct xlog_in_core **commit_iclog, + uint flags); /* * When we crack an atomic LSN, we sample it first so that the value will not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. This should always - * be used to smaple and crack LSNs taht are stored and updated in atomic + * be used to sample and crack LSNs that are stored and updated in atomic * variables. */ static inline void @@ -628,17 +645,23 @@ xlog_assign_grant_head(atomic64_t *head, int cycle, int space) /* * Committed Item List interfaces */ -int xlog_cil_init(struct log *log); -void xlog_cil_init_post_recovery(struct log *log); -void xlog_cil_destroy(struct log *log); +int +xlog_cil_init(struct xlog *log); +void +xlog_cil_init_post_recovery(struct xlog *log); +void +xlog_cil_destroy(struct xlog *log); /* * CIL force routines */ -xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); +xfs_lsn_t +xlog_cil_force_lsn( + struct xlog *log, + xfs_lsn_t sequence); static inline void -xlog_cil_force(struct log *log) +xlog_cil_force(struct xlog *log) { xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); } diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 94a02e1..655866e 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -51,15 +51,8 @@ typedef struct xfs_trans_reservations { #else /* __KERNEL__ */ -#include "xfs_sync.h" - -struct log; -struct xfs_mount_args; +struct xlog; struct xfs_inode; -struct xfs_bmbt_irec; -struct xfs_bmap_free; -struct xfs_extdelta; -struct xfs_swapext; struct xfs_mru_cache; struct xfs_nameops; struct xfs_ail; @@ -133,7 +126,7 @@ typedef struct xfs_mount { uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ uint m_writeio_blocks; /* min write size blocks */ - struct log *m_log; /* log specific stuff */ + struct xlog *m_log; /* log specific stuff */ int m_logbufs; /* number of log buffers */ int m_logbsize; /* size of each log buffer */ uint m_rsumlevels; /* rt summary levels */ @@ -176,7 +169,6 @@ typedef struct xfs_mount { uint m_qflags; /* quota status flags */ xfs_trans_reservations_t m_reservations;/* precomputed res values */ __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_maxioffset; /* maximum inode offset */ __uint64_t m_resblks; /* total reserved blocks */ __uint64_t m_resblks_avail;/* available reserved blocks */ __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ @@ -203,17 +195,21 @@ typedef struct xfs_mount { struct mutex m_icsb_mutex; /* balancer sync lock */ #endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct task_struct *m_sync_task; /* generalised sync thread */ - xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ - struct list_head m_sync_list; /* sync thread work item list */ - spinlock_t m_sync_lock; /* work item list lock */ - int m_sync_seq; /* sync thread generation no. */ - wait_queue_head_t m_wait_single_sync_task; + struct delayed_work m_reclaim_work; /* background inode reclaim */ + struct delayed_work m_eofblocks_work; /* background eof blocks + trimming */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ + + struct workqueue_struct *m_data_workqueue; + struct workqueue_struct *m_unwritten_workqueue; + struct workqueue_struct *m_cil_workqueue; + struct workqueue_struct *m_reclaim_workqueue; + struct workqueue_struct *m_log_workqueue; + struct workqueue_struct *m_eofblocks_workqueue; } xfs_mount_t; /* @@ -222,11 +218,11 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ -#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for disk errors in metadata */ +#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ #define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to user */ #define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment @@ -296,8 +292,6 @@ xfs_preferred_iosize(xfs_mount_t *mp) PAGE_CACHE_SIZE)); } -#define XFS_MAXIOFFSET(mp) ((mp)->m_maxioffset) - #define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) #define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) @@ -313,9 +307,6 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, #define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ #define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ -#define xfs_test_for_freeze(mp) ((mp)->m_super->s_frozen) -#define xfs_wait_for_freeze(mp,l) vfs_check_frozen((mp)->m_super, (l)) - /* * Flags for xfs_mountfs */ @@ -365,12 +356,11 @@ typedef struct xfs_mod_sb { int64_t msb_delta; /* Change to make to specified field */ } xfs_mod_sb_t; -extern int xfs_log_sbcount(xfs_mount_t *, uint); +extern int xfs_log_sbcount(xfs_mount_t *); extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_unmountfs_writesb(xfs_mount_t *); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); @@ -401,4 +391,6 @@ extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); +extern const struct xfs_buf_ops xfs_sb_buf_ops; + #endif /* __XFS_MOUNT_H__ */ diff --git a/include/xfs_quota.h b/include/xfs_quota.h index 5d1f57d..b50ec5b 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -87,8 +87,7 @@ typedef struct xfs_dqblk { #define XFS_DQ_PROJ 0x0002 /* project quota */ #define XFS_DQ_GROUP 0x0004 /* a group quota */ #define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ -#define XFS_DQ_WANT 0x0010 /* for lookup/reclaim race */ -#define XFS_DQ_INACTIVE 0x0020 /* dq off mplist & hashlist */ +#define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */ #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) @@ -97,8 +96,7 @@ typedef struct xfs_dqblk { { XFS_DQ_PROJ, "PROJ" }, \ { XFS_DQ_GROUP, "GROUP" }, \ { XFS_DQ_DIRTY, "DIRTY" }, \ - { XFS_DQ_WANT, "WANT" }, \ - { XFS_DQ_INACTIVE, "INACTIVE" } + { XFS_DQ_FREEING, "FREEING" } /* * In the worst case, when both user and group quotas are on, @@ -176,6 +174,8 @@ typedef struct xfs_qoff_logformat { #define XFS_UQUOTA_ACTIVE 0x0100 /* uquotas are being turned off */ #define XFS_PQUOTA_ACTIVE 0x0200 /* pquotas are being turned off */ #define XFS_GQUOTA_ACTIVE 0x0400 /* gquotas are being turned off */ +#define XFS_ALL_QUOTA_ACTIVE \ + (XFS_UQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE) /* * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees @@ -199,7 +199,6 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ -#define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ @@ -299,11 +298,6 @@ typedef struct xfs_dqtrx { long qt_delrtb_delta; /* delayed RT blk count changes */ } xfs_dqtrx_t; -extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); -extern int xfs_mount_reset_sbqflags(struct xfs_mount *); - -#endif /* __KERNEL__ */ - #ifdef CONFIG_XFS_QUOTA extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); extern void xfs_trans_free_dqinfo(struct xfs_trans *); @@ -331,25 +325,36 @@ extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); extern void xfs_qm_dqdetach(struct xfs_inode *); extern void xfs_qm_dqrele(struct xfs_dquot *); extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); -extern int xfs_qm_sync(struct xfs_mount *, int); extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); extern void xfs_qm_mount_quotas(struct xfs_mount *); extern void xfs_qm_unmount(struct xfs_mount *); extern void xfs_qm_unmount_quotas(struct xfs_mount *); #else -#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, flags, udqp, gdqp) ({ \ - *(udqp) = NULL; \ - *(gdqp) = NULL; \ - 0; \ -}) +static inline int +xfs_qm_vop_dqalloc(struct xfs_inode *ip, uid_t uid, gid_t gid, prid_t prid, + uint flags, struct xfs_dquot **udqp, struct xfs_dquot **gdqp) +{ + *udqp = NULL; + *gdqp = NULL; + return 0; +} #define xfs_trans_dup_dqinfo(tp, tp2) #define xfs_trans_free_dqinfo(tp) #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) #define xfs_trans_apply_dquot_deltas(tp) #define xfs_trans_unreserve_and_mod_dquots(tp) -#define xfs_trans_reserve_quota_nblks(tp, ip, blks, inos, flg) (0) -#define xfs_trans_reserve_quota_bydquots(tp, mp, uqp, gqp, blks, inos, flg) (0) +static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, + struct xfs_inode *ip, long nblks, long ninos, uint flags) +{ + return 0; +} +static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, + struct xfs_mount *mp, struct xfs_dquot *udqp, + struct xfs_dquot *gdqp, long nblks, long nions, uint flags) +{ + return 0; +} #define xfs_qm_vop_create_dqattach(tp, ip, u, g) #define xfs_qm_vop_rename_dqattach(it) (0) #define xfs_qm_vop_chown(tp, ip, old, new) (NULL) @@ -359,7 +364,6 @@ extern void xfs_qm_unmount_quotas(struct xfs_mount *); #define xfs_qm_dqdetach(ip) #define xfs_qm_dqrele(d) #define xfs_qm_statvfs(ip, s) -#define xfs_qm_sync(mp, flags) (0) #define xfs_qm_newmount(mp, a, b) (0) #define xfs_qm_mount_quotas(mp) #define xfs_qm_unmount(mp) @@ -372,4 +376,9 @@ extern void xfs_qm_unmount_quotas(struct xfs_mount *); xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) +extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, + xfs_dqid_t, uint, uint, char *); +extern int xfs_mount_reset_sbqflags(struct xfs_mount *); + +#endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ diff --git a/include/xfs_rtalloc.h b/include/xfs_rtalloc.h index ff614c2..f7f3a35 100644 --- a/include/xfs_rtalloc.h +++ b/include/xfs_rtalloc.h @@ -47,7 +47,7 @@ struct xfs_trans; #define XFS_SUMOFFSTOBLOCK(mp,s) \ (((s) * (uint)sizeof(xfs_suminfo_t)) >> (mp)->m_sb.sb_blocklog) #define XFS_SUMPTR(mp,bp,so) \ - ((xfs_suminfo_t *)((char *)XFS_BUF_PTR(bp) + \ + ((xfs_suminfo_t *)((bp)->b_addr + \ (((so) * (uint)sizeof(xfs_suminfo_t)) & XFS_BLOCKMASK(mp)))) #define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log) @@ -154,7 +154,7 @@ xfs_rtmount_init( if (mp->m_sb.sb_rblocks == 0) return 0; - cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT"); + xfs_warn(mp, "Not built with CONFIG_XFS_RT"); return ENOSYS; } # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 5dcc2d7..6a7f8b0 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -81,6 +81,7 @@ struct xfs_mount; #define XFS_SB_VERSION2_ATTR2BIT 0x00000008 /* Inline attr rework */ #define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ #define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ +#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ #define XFS_SB_VERSION2_OKREALFBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ @@ -510,13 +511,19 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT; } +static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) +{ + return (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); +} + /* * end of superblock version macros */ #define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) -#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ @@ -536,7 +543,6 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) #define XFS_BB_TO_FSB(mp,bb) \ (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log) #define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log) -#define XFS_BB_FSB_OFFSET(mp,bb) ((bb) & ((mp)->m_bsize - 1)) /* * File system block to byte conversions. diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 1abcf28..5f32097 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -26,11 +26,14 @@ #define trace_xfs_alloc_near_greater(a) ((void) 0) #define trace_xfs_alloc_near_lesser(a) ((void) 0) #define trace_xfs_alloc_near_error(a) ((void) 0) +#define trace_xfs_alloc_near_noentry(a) ((void) 0) +#define trace_xfs_alloc_near_busy(a) ((void) 0) #define trace_xfs_alloc_size_neither(a) ((void) 0) #define trace_xfs_alloc_size_noentry(a) ((void) 0) #define trace_xfs_alloc_size_nominleft(a) ((void) 0) #define trace_xfs_alloc_size_done(a) ((void) 0) #define trace_xfs_alloc_size_error(a) ((void) 0) +#define trace_xfs_alloc_size_busy(a) ((void) 0) #define trace_xfs_alloc_small_freelist(a) ((void) 0) #define trace_xfs_alloc_small_notenough(a) ((void) 0) #define trace_xfs_alloc_small_done(a) ((void) 0) @@ -91,12 +94,74 @@ #define trace_xfs_dir2_sf_toino4(a) ((void) 0) #define trace_xfs_dir2_sf_toino8(a) ((void) 0) +#define trace_xfs_da_node_create(a) ((void) 0) +#define trace_xfs_da_split(a) ((void) 0) +#define trace_xfs_attr_leaf_split_before(a) ((void) 0) +#define trace_xfs_attr_leaf_split_after(a) ((void) 0) +#define trace_xfs_da_root_split(a) ((void) 0) +#define trace_xfs_da_node_split(a) ((void) 0) +#define trace_xfs_da_node_rebalance(a) ((void) 0) +#define trace_xfs_da_node_add(a) ((void) 0) +#define trace_xfs_da_join(a) ((void) 0) +#define trace_xfs_da_root_join(a) ((void) 0) +#define trace_xfs_da_node_toosmall(a) ((void) 0) +#define trace_xfs_da_fixhashpath(a) ((void) 0) +#define trace_xfs_da_node_remove(a) ((void) 0) +#define trace_xfs_da_node_unbalance(a) ((void) 0) +#define trace_xfs_da_link_before(a) ((void) 0) +#define trace_xfs_da_link_after(a) ((void) 0) +#define trace_xfs_da_unlink_back(a) ((void) 0) +#define trace_xfs_da_unlink_forward(a) ((void) 0) +#define trace_xfs_da_path_shift(a) ((void) 0) +#define trace_xfs_da_grow_inode(a) ((void) 0) +#define trace_xfs_da_swap_lastblock(a) ((void) 0) +#define trace_xfs_da_shrink_inode(a) ((void) 0) + +#define trace_xfs_attr_sf_create(a) ((void) 0) +#define trace_xfs_attr_sf_add(a) ((void) 0) +#define trace_xfs_attr_sf_remove(a) ((void) 0) +#define trace_xfs_attr_sf_lookup(a) ((void) 0) +#define trace_xfs_attr_sf_to_leaf(a) ((void) 0) +#define trace_xfs_attr_leaf_to_sf(a) ((void) 0) +#define trace_xfs_attr_leaf_to_node(a) ((void) 0) +#define trace_xfs_attr_leaf_create(a) ((void) 0) +#define trace_xfs_attr_leaf_split(a) ((void) 0) +#define trace_xfs_attr_leaf_add_old(a) ((void) 0) +#define trace_xfs_attr_leaf_add_new(a) ((void) 0) +#define trace_xfs_attr_leaf_add(a) ((void) 0) +#define trace_xfs_attr_leaf_add_work(a) ((void) 0) +#define trace_xfs_attr_leaf_compact(a) ((void) 0) +#define trace_xfs_attr_leaf_rebalance(a) ((void) 0) +#define trace_xfs_attr_leaf_toosmall(a) ((void) 0) +#define trace_xfs_attr_leaf_remove(a) ((void) 0) +#define trace_xfs_attr_leaf_unbalance(a) ((void) 0) +#define trace_xfs_attr_leaf_lookup(a) ((void) 0) +#define trace_xfs_attr_leaf_clearflag(a) ((void) 0) +#define trace_xfs_attr_leaf_setflag(a) ((void) 0) +#define trace_xfs_attr_leaf_flipflags(a) ((void) 0) + +#define trace_xfs_attr_sf_addname(a) ((void) 0) +#define trace_xfs_attr_leaf_addname(a) ((void) 0) +#define trace_xfs_attr_leaf_replace(a) ((void) 0) +#define trace_xfs_attr_leaf_removename(a) ((void) 0) +#define trace_xfs_attr_leaf_get(a) ((void) 0) +#define trace_xfs_attr_node_addname(a) ((void) 0) +#define trace_xfs_attr_node_replace(a) ((void) 0) +#define trace_xfs_attr_node_removename(a) ((void) 0) +#define trace_xfs_attr_fillstate(a) ((void) 0) +#define trace_xfs_attr_refillstate(a) ((void) 0) +#define trace_xfs_attr_node_get(a) ((void) 0) +#define trace_xfs_attr_rmtval_get(a) ((void) 0) +#define trace_xfs_attr_rmtval_set(a) ((void) 0) +#define trace_xfs_attr_rmtval_remove(a) ((void) 0) + #define trace_xfs_bmap_pre_update(a,b,c,d) ((void) 0) #define trace_xfs_bmap_post_update(a,b,c,d) ((void) 0) #define trace_xfs_extlist(a,b,c,d) ((void) 0) #define trace_xfs_bunmap(a,b,c,d,e) ((void) 0) -#define trace_xfs_perag_get(a,b,c,d) ((void) 0) -#define trace_xfs_perag_put(a,b,c,d) ((void) 0) +/* set c = c to avoid unused var warnings */ +#define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_put(a,b,c,d) ((c) = (c)) #endif /* __TRACE_H__ */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index c2042b7..c6c0601 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -163,9 +163,8 @@ typedef struct xfs_trans_header { */ struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; struct list_head lid_trans; + unsigned char lid_flags; }; #define XFS_LID_DIRTY 0x1 @@ -180,6 +179,8 @@ struct xfs_log_item_desc { #define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ #define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ #define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ +#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer + count in superblock */ /* * Values for call flags parameter. @@ -326,7 +327,7 @@ typedef struct xfs_log_item { struct xfs_log_item *); /* buffer item iodone */ /* callback func */ - struct xfs_item_ops *li_ops; /* function list */ + const struct xfs_item_ops *li_ops; /* function list */ /* delayed logging */ struct list_head li_cil; /* CIL pointers */ @@ -341,37 +342,33 @@ typedef struct xfs_log_item { { XFS_LI_IN_AIL, "IN_AIL" }, \ { XFS_LI_ABORTED, "ABORTED" } -typedef struct xfs_item_ops { +struct xfs_item_ops { uint (*iop_size)(xfs_log_item_t *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_pin)(xfs_log_item_t *); void (*iop_unpin)(xfs_log_item_t *, int remove); - uint (*iop_trylock)(xfs_log_item_t *); + uint (*iop_push)(struct xfs_log_item *, struct list_head *); void (*iop_unlock)(xfs_log_item_t *); xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); - void (*iop_push)(xfs_log_item_t *); - void (*iop_pushbuf)(xfs_log_item_t *); void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t); -} xfs_item_ops_t; +}; #define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) #define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) #define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) #define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) -#define IOP_TRYLOCK(ip) (*(ip)->li_ops->iop_trylock)(ip) +#define IOP_PUSH(ip, list) (*(ip)->li_ops->iop_push)(ip, list) #define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) #define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) -#define IOP_PUSH(ip) (*(ip)->li_ops->iop_push)(ip) -#define IOP_PUSHBUF(ip) (*(ip)->li_ops->iop_pushbuf)(ip) #define IOP_COMMITTING(ip, lsn) (*(ip)->li_ops->iop_committing)(ip, lsn) /* - * Return values for the IOP_TRYLOCK() routines. + * Return values for the IOP_PUSH() routines. */ -#define XFS_ITEM_SUCCESS 0 -#define XFS_ITEM_PINNED 1 -#define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_PUSHBUF 3 +#define XFS_ITEM_SUCCESS 0 +#define XFS_ITEM_PINNED 1 +#define XFS_ITEM_LOCKED 2 +#define XFS_ITEM_FLUSHING 3 /* * This is the type of function which can be given to xfs_trans_callback() @@ -448,16 +445,53 @@ typedef struct xfs_trans { * XFS transaction mechanism exported interfaces. */ xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint); -xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, uint); +xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, xfs_km_flags_t); xfs_trans_t *xfs_trans_dup(xfs_trans_t *); int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, uint, uint); void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t); -struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs_daddr_t, - int, uint); -int xfs_trans_read_buf(struct xfs_mount *, xfs_trans_t *, - struct xfs_buftarg *, xfs_daddr_t, int, uint, - struct xfs_buf **); + +struct xfs_buf *xfs_trans_get_buf_map(struct xfs_trans *tp, + struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, + uint flags); + +static inline struct xfs_buf * +xfs_trans_get_buf( + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + uint flags) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_get_buf_map(tp, target, &map, 1, flags); +} + +int xfs_trans_read_buf_map(struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops); + +static inline int +xfs_trans_read_buf( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_read_buf_map(mp, tp, target, &map, 1, + flags, bpp, ops); +} + struct xfs_buf *xfs_trans_getsb(xfs_trans_t *, struct xfs_mount *, int); void xfs_trans_brelse(xfs_trans_t *, struct xfs_buf *); @@ -469,11 +503,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); -int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, - xfs_ino_t , uint, uint, struct xfs_inode **); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); -void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint); -void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); @@ -489,10 +520,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, struct xfs_efd_log_item *, xfs_fsblock_t, xfs_extlen_t); -int _xfs_trans_commit(xfs_trans_t *, - uint flags, - int *); -#define xfs_trans_commit(tp, flags) _xfs_trans_commit(tp, flags, NULL) +int xfs_trans_commit(xfs_trans_t *, uint flags); void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); diff --git a/include/xfs_types.h b/include/xfs_types.h index 26d1867..e9bd5c3 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -33,7 +33,6 @@ typedef signed long long int __int64_t; typedef unsigned long long int __uint64_t; typedef enum { B_FALSE,B_TRUE } boolean_t; -typedef __uint32_t prid_t; /* project ID */ typedef __uint32_t inst_t; /* an instruction */ typedef __s64 xfs_off_t; /* type */ @@ -56,7 +55,10 @@ typedef __uint64_t __psunsigned_t; #endif /* __KERNEL__ */ +typedef __uint32_t prid_t; /* project ID */ + typedef __uint32_t xfs_agblock_t; /* blockno in alloc. group */ +typedef __uint32_t xfs_agino_t; /* inode # within allocation grp */ typedef __uint32_t xfs_extlen_t; /* extent length in blocks */ typedef __uint32_t xfs_agnumber_t; /* allocation group number */ typedef __int32_t xfs_extnum_t; /* # of extents in a file */ @@ -73,8 +75,6 @@ typedef __int32_t xfs_tid_t; /* transaction identifier */ typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ -typedef __uint32_t xlog_tid_t; /* transaction ID type */ - /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: @@ -103,6 +103,7 @@ typedef __uint64_t xfs_fileoff_t; /* block number in a file */ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ + /* * Null values for the types. */ @@ -122,6 +123,9 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ #define NULLCOMMITLSN ((xfs_lsn_t)-1) +#define NULLFSINO ((xfs_ino_t)-1) +#define NULLAGINO ((xfs_agino_t)-1) + /* * Max values for extlen, extnum, aextnum. */ @@ -130,6 +134,20 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ #define MAXAEXTNUM ((xfs_aextnum_t)0x7fff) /* signed short */ /* + * Minimum and maximum blocksize and sectorsize. + * The blocksize upper limit is pretty much arbitrary. + * The sectorsize upper limit is due to sizeof(sb_sectsize). + */ +#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */ +#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) +#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) +#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */ +#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) +#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) + +/* * Min numbers of data/attr fork btree root pointers. */ #define MINDBTPTRS 3 diff --git a/libxfs/Makefile b/libxfs/Makefile index b3fd85c..dc9b22c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -10,7 +10,7 @@ LT_CURRENT = 0 LT_REVISION = 0 LT_AGE = 0 -HFILES = xfs.h init.h +HFILES = xfs.h init.h xfs_dir2_priv.h CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ diff --git a/libxfs/init.c b/libxfs/init.c index 08fc584..1b11fb0 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -371,7 +371,6 @@ manage_zones(int release) extern kmem_zone_t *xfs_ili_zone; extern kmem_zone_t *xfs_inode_zone; extern kmem_zone_t *xfs_ifork_zone; - extern kmem_zone_t *xfs_dabuf_zone; extern kmem_zone_t *xfs_buf_item_zone; extern kmem_zone_t *xfs_da_state_zone; extern kmem_zone_t *xfs_btree_cur_zone; @@ -383,7 +382,6 @@ manage_zones(int release) kmem_free(xfs_buf_zone); kmem_free(xfs_inode_zone); kmem_free(xfs_ifork_zone); - kmem_free(xfs_dabuf_zone); kmem_free(xfs_buf_item_zone); kmem_free(xfs_da_state_zone); kmem_free(xfs_btree_cur_zone); @@ -395,7 +393,6 @@ manage_zones(int release) xfs_buf_zone = kmem_zone_init(sizeof(xfs_buf_t), "xfs_buffer"); xfs_inode_zone = kmem_zone_init(sizeof(xfs_inode_t), "xfs_inode"); xfs_ifork_zone = kmem_zone_init(sizeof(xfs_ifork_t), "xfs_ifork"); - xfs_dabuf_zone = kmem_zone_init(sizeof(xfs_dabuf_t), "xfs_dabuf"); xfs_ili_zone = kmem_zone_init( sizeof(xfs_inode_log_item_t), "xfs_inode_log_item"); xfs_buf_item_zone = kmem_zone_init( diff --git a/libxfs/logitem.c b/libxfs/logitem.c index 116d3ed..84e4c14 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -32,21 +32,27 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ xfs_buf_t * xfs_trans_buf_item_match( xfs_trans_t *tp, - xfs_buftarg_t *target, - xfs_daddr_t blkno, - int len) + dev_t dev, + struct xfs_buf_map *map, + int nmaps) { struct xfs_log_item_desc *lidp; struct xfs_buf_log_item *blip; + int len = 0; + int i; + + for (i = 0; i < nmaps; i++) + len += map[i].bm_len; - len = BBTOB(len); list_for_each_entry(lidp, &tp->t_items, lid_trans) { blip = (struct xfs_buf_log_item *)lidp->lid_item; if (blip->bli_item.li_type == XFS_LI_BUF && - XFS_BUF_TARGET(blip->bli_buf) == target->dev && - XFS_BUF_ADDR(blip->bli_buf) == blkno && - XFS_BUF_COUNT(blip->bli_buf) == len) + blip->bli_buf->b_dev == dev && + XFS_BUF_ADDR(blip->bli_buf) == map[0].bm_bn && + blip->bli_buf->b_bcount == BBTOB(len)) { + ASSERT(blip->bli_buf->b_map_count == nmaps); return blip->bli_buf; + } } return NULL; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 432a1af..595538e 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -159,7 +159,7 @@ libxfs_log_header( head->h_len = cpu_to_be32(sunit - BBSIZE); else head->h_len = cpu_to_be32(20); - head->h_chksum = cpu_to_be32(0); + head->h_crc = cpu_to_be32(0); head->h_prev_block = cpu_to_be32(-1); head->h_num_logops = cpu_to_be32(1); head->h_cycle_data[0] = cpu_to_be32(0xb0c0d0d0); @@ -193,72 +193,86 @@ libxfs_log_header( #ifdef XFS_BUF_TRACING #undef libxfs_readbuf +#undef libxfs_readbuf_map #undef libxfs_writebuf #undef libxfs_getbuf +#undef libxfs_getbuf_map #undef libxfs_getbuf_flags #undef libxfs_putbuf -xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); int libxfs_writebuf(xfs_buf_t *, int); -xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); +xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); void libxfs_putbuf (xfs_buf_t *); +#define __add_trace(bp, func, file, line) \ +do { \ + if (bp) { \ + (bp)->b_func = (func); \ + (bp)->b_file = (file); \ + (bp)->b_line = (line); \ + } \ +} while (0) + xfs_buf_t * -libxfs_trace_readbuf(const char *func, const char *file, int line, dev_t dev, xfs_daddr_t blkno, int len, int flags) +libxfs_trace_readbuf(const char *func, const char *file, int line, + dev_t dev, xfs_daddr_t blkno, int len, int flags) { xfs_buf_t *bp = libxfs_readbuf(dev, blkno, len, flags); + __add_trace(bp, func, file, line); + return bp; +} - if (bp){ - bp->b_func = func; - bp->b_file = file; - bp->b_line = line; - } - +xfs_buf_t * +libxfs_trace_readbuf_map(const char *func, const char *file, int line, + dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) +{ + xfs_buf_t *bp = libxfs_readbuf_map(dev, map, nmaps, flags); + __add_trace(bp, func, file, line); return bp; } int libxfs_trace_writebuf(const char *func, const char *file, int line, xfs_buf_t *bp, int flags) { - bp->b_func = func; - bp->b_file = file; - bp->b_line = line; - + __add_trace(bp, func, file, line); return libxfs_writebuf(bp, flags); } xfs_buf_t * -libxfs_trace_getbuf(const char *func, const char *file, int line, dev_t device, xfs_daddr_t blkno, int len) +libxfs_trace_getbuf(const char *func, const char *file, int line, + dev_t device, xfs_daddr_t blkno, int len) { xfs_buf_t *bp = libxfs_getbuf(device, blkno, len); + __add_trace(bp, func, file, line); + return bp; +} - bp->b_func = func; - bp->b_file = file; - bp->b_line = line; - +xfs_buf_t * +libxfs_trace_getbuf_map(const char *func, const char *file, int line, + dev_t device, struct xfs_buf_map *map, int nmaps) +{ + xfs_buf_t *bp = libxfs_getbuf_map(device, map, nmaps); + __add_trace(bp, func, file, line); return bp; } xfs_buf_t * libxfs_trace_getbuf_flags(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len, unsigned long flags) + dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) { - xfs_buf_t *bp = libxfs_getbuf(device, blkno, len, flags); - - bp->b_func = func; - bp->b_file = file; - bp->b_line = line; - + xfs_buf_t *bp = libxfs_getbuf_flags(device, blkno, len, flags); + __add_trace(bp, func, file, line); return bp; } void libxfs_trace_putbuf(const char *func, const char *file, int line, xfs_buf_t *bp) { - bp->b_func = func; - bp->b_file = file; - bp->b_line = line; - + __add_trace(bp, func, file, line); libxfs_putbuf(bp); } @@ -279,30 +293,40 @@ static struct cache_mru xfs_buf_freelist = {{&xfs_buf_freelist.cm_list, &xfs_buf_freelist.cm_list}, 0, PTHREAD_MUTEX_INITIALIZER }; -typedef struct { - dev_t device; - xfs_daddr_t blkno; - unsigned int bblen; -} xfs_bufkey_t; +/* + * The bufkey is used to pass the new buffer information to the cache object + * allocation routine. Because discontiguous buffers need to pass different + * information, we need fields to pass that information. However, because the + * blkno and bblen is needed for the initial cache entry lookup (i.e. for + * bcompare) the fact that the map/nmaps is non-null to switch to discontiguous + * buffer initialisation instead of a contiguous buffer. + */ +struct xfs_bufkey { + dev_t device; + xfs_daddr_t blkno; + unsigned int bblen; + struct xfs_buf_map *map; + int nmaps; +}; static unsigned int libxfs_bhash(cache_key_t key, unsigned int hashsize) { - return (((unsigned int)((xfs_bufkey_t *)key)->blkno) >> 5) % hashsize; + return (((unsigned int)((struct xfs_bufkey *)key)->blkno) >> 5) % hashsize; } static int libxfs_bcompare(struct cache_node *node, cache_key_t key) { - xfs_buf_t *bp = (xfs_buf_t *)node; - xfs_bufkey_t *bkey = (xfs_bufkey_t *)key; + struct xfs_buf *bp = (struct xfs_buf *)node; + struct xfs_bufkey *bkey = (struct xfs_bufkey *)key; #ifdef IO_BCOMPARE_CHECK if (bp->b_dev == bkey->device && bp->b_blkno == bkey->blkno && bp->b_bcount != BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" - "bp=(bno %llu, len %u bytes) key=(bno %llu, len %u bytes)\n", + "bp=(bno 0x%llx, len %u bytes) key=(bno 0x%llx, len %u bytes)\n", pthread_self(), (unsigned long long)bp->b_blkno, (int)bp->b_bcount, (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); @@ -322,11 +346,12 @@ libxfs_bprint(xfs_buf_t *bp) } static void -libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) +__initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) { bp->b_flags = 0; bp->b_blkno = bno; bp->b_bcount = bytes; + bp->b_length = BTOBB(bytes); bp->b_dev = device; bp->b_error = 0; if (!bp->b_addr) @@ -346,11 +371,44 @@ libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) bp->b_recur = 0; } +static void +libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) +{ + __initbuf(bp, device, bno, bytes); +} + +static void +libxfs_initbuf_map(xfs_buf_t *bp, dev_t device, struct xfs_buf_map *map, int nmaps) +{ + unsigned int bytes = 0; + int i; + + bytes = sizeof(struct xfs_buf_map) * nmaps; + bp->b_map = malloc(bytes); + if (!bp->b_map) { + fprintf(stderr, + _("%s: %s can't malloc %u bytes: %s\n"), + progname, __FUNCTION__, bytes, + strerror(errno)); + exit(1); + } + bp->b_nmaps = nmaps; + + bytes = 0; + for ( i = 0; i < nmaps; i++) { + bp->b_map[i].bm_bn = map[i].bm_bn; + bp->b_map[i].bm_len = map[i].bm_len; + bytes += BBTOB(map[i].bm_len); + } + + __initbuf(bp, device, map[0].bm_bn, bytes); + bp->b_flags |= LIBXFS_B_DISCONTIG; +} + xfs_buf_t * -libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +__libxfs_getbufr(int blen) { xfs_buf_t *bp; - int blen = BBTOB(bblen); /* * first look for a buffer that can be used as-is, @@ -372,15 +430,27 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) list_del_init(&bp->b_node.cn_mru); free(bp->b_addr); bp->b_addr = NULL; + free(bp->b_map); + bp->b_map = NULL; } } else bp = kmem_zone_zalloc(xfs_buf_zone, 0); pthread_mutex_unlock(&xfs_buf_freelist.cm_mutex); - if (bp != NULL) + return bp; +} + +xfs_buf_t * +libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +{ + xfs_buf_t *bp; + int blen = BBTOB(bblen); + + bp =__libxfs_getbufr(blen); + if (bp) libxfs_initbuf(bp, device, blkno, blen); #ifdef IO_DEBUG - printf("%lx: %s: allocated %u bytes buffer, key=%llu(%llu), %p\n", + printf("%lx: %s: allocated %u bytes buffer, key=0x%llx(0x%llx), %p\n", pthread_self(), __FUNCTION__, blen, (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); #endif @@ -388,6 +458,38 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) return bp; } +xfs_buf_t * +libxfs_getbufr_map(dev_t device, xfs_daddr_t blkno, int bblen, + struct xfs_buf_map *map, int nmaps) +{ + xfs_buf_t *bp; + int blen = BBTOB(bblen); + + if (!map || !nmaps) { + fprintf(stderr, + _("%s: %s invalid map %p or nmaps %d\n"), + progname, __FUNCTION__, map, nmaps); + exit(1); + } + + if (blkno != map[0].bm_bn) { + fprintf(stderr, + _("%s: %s map blkno %lx doesn't match key %lx\n"), + progname, __FUNCTION__, map[0].bm_bn, blkno); + exit(1); + } + + bp =__libxfs_getbufr(blen); + if (bp) + libxfs_initbuf_map(bp, device, map, nmaps); +#ifdef IO_DEBUG + printf("%lx: %s: allocated %u bytes buffer, key=0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, blen, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + + return bp; +} #ifdef XFS_BUF_TRACING struct list_head lock_buf_list = {&lock_buf_list, &lock_buf_list}; @@ -396,18 +498,12 @@ int lock_buf_count = 0; extern int use_xfs_buf_lock; -struct xfs_buf * -libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) +static struct xfs_buf * +__cache_lookup(struct xfs_bufkey *key, unsigned int flags) { - xfs_buf_t *bp; - xfs_bufkey_t key; - int miss; - - key.device = device; - key.blkno = blkno; - key.bblen = len; + struct xfs_buf *bp; - miss = cache_node_get(libxfs_bcache, &key, (struct cache_node **)&bp); + cache_node_get(libxfs_bcache, key, (struct cache_node **)&bp); if (!bp) return NULL; @@ -423,7 +519,7 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags if (pthread_equal(bp->b_holder, pthread_self())) { fprintf(stderr, _("Warning: recursive buffer locking at block %" PRIu64 " detected\n"), - blkno); + key->blkno); bp->b_recur++; return bp; } else { @@ -444,9 +540,9 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags pthread_mutex_unlock(&libxfs_bcache->c_mutex); #endif #ifdef IO_DEBUG - printf("%lx %s: %s buffer %p for bno = %llu\n", - pthread_self(), __FUNCTION__, miss ? "miss" : "hit", - bp, (long long)LIBXFS_BBTOOFF64(blkno)); + printf("%lx %s: hit buffer %p for bno = 0x%llx\n", + pthread_self(), __FUNCTION__, + bp, (long long)LIBXFS_BBTOOFF64(key->blkno)); #endif return bp; @@ -456,11 +552,40 @@ out_put: } struct xfs_buf * +libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) +{ + struct xfs_bufkey key = {0}; + + key.device = device; + key.blkno = blkno; + key.bblen = len; + + return __cache_lookup(&key, flags); +} + +struct xfs_buf * libxfs_getbuf(dev_t device, xfs_daddr_t blkno, int len) { return libxfs_getbuf_flags(device, blkno, len, 0); } +struct xfs_buf * +libxfs_getbuf_map(dev_t device, struct xfs_buf_map *map, int nmaps) +{ + struct xfs_bufkey key = {0}; + int i; + + key.device = device; + key.blkno = map[0].bm_bn; + for (i = 0; i < nmaps; i++) { + key.bblen += map[i].bm_len; + } + key.map = map; + key.nmaps = nmaps; + + return __cache_lookup(&key, 0); +} + void libxfs_putbuf(xfs_buf_t *bp) { @@ -485,7 +610,7 @@ libxfs_putbuf(xfs_buf_t *bp) void libxfs_purgebuf(xfs_buf_t *bp) { - xfs_bufkey_t key; + struct xfs_bufkey key = {0}; key.device = bp->b_dev; key.blkno = bp->b_blkno; @@ -497,47 +622,62 @@ libxfs_purgebuf(xfs_buf_t *bp) static struct cache_node * libxfs_balloc(cache_key_t key) { - xfs_bufkey_t *bufkey = (xfs_bufkey_t *)key; + struct xfs_bufkey *bufkey = (struct xfs_bufkey *)key; + if (bufkey->map) + return (struct cache_node *) + libxfs_getbufr_map(bufkey->device, + bufkey->blkno, bufkey->bblen, + bufkey->map, bufkey->nmaps); return (struct cache_node *)libxfs_getbufr(bufkey->device, - bufkey->blkno, bufkey->bblen); + bufkey->blkno, bufkey->bblen); } -int -libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) + +static int +__read_buf(int fd, void *buf, int len, off64_t offset, int flags) { - int fd = libxfs_device_to_fd(dev); - int bytes = BBTOB(len); - int error; int sts; - ASSERT(BBTOB(len) <= bp->b_bcount); - - sts = pread64(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno)); + sts = pread64(fd, buf, len, offset); if (sts < 0) { - error = errno; + int error = errno; fprintf(stderr, _("%s: read failed: %s\n"), progname, strerror(error)); if (flags & LIBXFS_EXIT_ON_FAILURE) exit(1); return error; - } else if (sts != bytes) { + } else if (sts != len) { fprintf(stderr, _("%s: error - read only %d of %d bytes\n"), - progname, sts, bytes); + progname, sts, len); if (flags & LIBXFS_EXIT_ON_FAILURE) exit(1); return EIO; } -#ifdef IO_DEBUG - printf("%lx: %s: read %u bytes, blkno=%llu(%llu), %p\n", - pthread_self(), __FUNCTION__, bytes, - (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); -#endif - if (bp->b_dev == dev && + return 0; +} + +int +libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) +{ + int fd = libxfs_device_to_fd(dev); + int bytes = BBTOB(len); + int error; + + ASSERT(BBTOB(len) <= bp->b_bcount); + + error = __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flags); + if (!error && + bp->b_dev == dev && bp->b_blkno == blkno && bp->b_bcount == bytes) bp->b_flags |= LIBXFS_B_UPTODATE; - return 0; +#ifdef IO_DEBUG + printf("%lx: %s: read %u bytes, error %d, blkno=0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, bytes, error, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + return error; } xfs_buf_t * @@ -555,37 +695,113 @@ libxfs_readbuf(dev_t dev, xfs_daddr_t blkno, int len, int flags) return bp; } -int -libxfs_writebufr(xfs_buf_t *bp) +struct xfs_buf * +libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) +{ + xfs_buf_t *bp; + int error = 0; + int fd; + int i; + char *buf; + + if (nmaps == 1) + return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, flags); + + bp = libxfs_getbuf_map(dev, map, nmaps); + if (!bp || (bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + ASSERT(bp->b_nmaps = nmaps); + + fd = libxfs_device_to_fd(dev); + buf = bp->b_addr; + for (i = 0; i < bp->b_nmaps; i++) { + off64_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + int len = BBTOB(bp->b_map[i].bm_len); + + ASSERT(bp->b_map[i].bm_bn == map[i].bm_bn); + ASSERT(bp->b_map[i].bm_len == map[i].bm_len); + + error = __read_buf(fd, buf, len, offset, flags); + if (error) { + bp->b_error = error; + break; + } + buf += len; + offset += len; + } + + if (!error) + bp->b_flags |= LIBXFS_B_UPTODATE; +#ifdef IO_DEBUG + printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", + pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, + (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); +#endif + return bp; +} + +static int +__write_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - int fd = libxfs_device_to_fd(bp->b_dev); - int error; - sts = pwrite64(fd, bp->b_addr, bp->b_bcount, LIBXFS_BBTOOFF64(bp->b_blkno)); + sts = pwrite64(fd, buf, len, offset); if (sts < 0) { - error = errno; + int error = errno; fprintf(stderr, _("%s: pwrite64 failed: %s\n"), progname, strerror(error)); - if (bp->b_flags & LIBXFS_B_EXIT) + if (flags & LIBXFS_B_EXIT) exit(1); return error; - } else if (sts != bp->b_bcount) { - fprintf(stderr, _("%s: error - wrote only %d of %d bytes\n"), - progname, sts, bp->b_bcount); - if (bp->b_flags & LIBXFS_B_EXIT) + } else if (sts != len) { + fprintf(stderr, _("%s: error - pwrite64 only %d of %d bytes\n"), + progname, sts, len); + if (flags & LIBXFS_B_EXIT) exit(1); return EIO; } + return 0; +} + +int +libxfs_writebufr(xfs_buf_t *bp) +{ + int fd = libxfs_device_to_fd(bp->b_dev); + int error = 0; + + if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { + error = __write_buf(fd, bp->b_addr, bp->b_bcount, + LIBXFS_BBTOOFF64(bp->b_blkno), bp->b_flags); + } else { + int i; + char *buf = bp->b_addr; + + for (i = 0; i < bp->b_nmaps; i++) { + off64_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + int len = BBTOB(bp->b_map[i].bm_len); + + error = __write_buf(fd, buf, len, offset, bp->b_flags); + if (error) { + bp->b_error = error; + break; + } + buf += len; + offset += len; + } + } + #ifdef IO_DEBUG printf("%lx: %s: wrote %u bytes, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, bp->b_bcount, (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); #endif - bp->b_flags |= LIBXFS_B_UPTODATE; - bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); - return 0; + if (!error) { + bp->b_flags |= LIBXFS_B_UPTODATE; + bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); + } + return error; } int @@ -609,7 +825,7 @@ libxfs_iomove(xfs_buf_t *bp, uint boff, int len, void *data, int flags) #ifdef IO_DEBUG if (boff + len > bp->b_bcount) { printf("Badness, iomove out of range!\n" - "bp=(bno %llu, bytes %u) range=(boff %u, bytes %u)\n", + "bp=(bno 0x%llx, bytes %u) range=(boff %u, bytes %u)\n", (long long)bp->b_blkno, bp->b_bcount, boff, len); abort(); } @@ -742,7 +958,10 @@ libxfs_iget(xfs_mount_t *mp, xfs_trans_t *tp, xfs_ino_t ino, uint lock_flags, fprintf(stderr, "%s: allocated inode, ino=%llu(%llu), %p\n", __FUNCTION__, (unsigned long long)ino, bno, ip); #endif - if ((error = libxfs_iread(mp, tp, ino, ip, bno))) { + ip->i_ino = ino; + ip->i_mount = mp; + error = xfs_iread(mp, tp, ip, bno); + if (error) { cache_node_purge(libxfs_icache, &ino, (struct cache_node *)ip); ip = NULL; diff --git a/libxfs/trans.c b/libxfs/trans.c index a745d51..7cb3c8c 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -252,7 +252,7 @@ xfs_trans_log_inode( * this coordination mechanism. */ flags |= ip->i_itemp->ili_last_fields; - ip->i_itemp->ili_format.ilf_fields |= flags; + ip->i_itemp->ili_fields |= flags; } /* @@ -338,7 +338,7 @@ libxfs_trans_binval( if (bip->bli_flags & XFS_BLI_STALE) return; XFS_BUF_UNDELAYWRITE(bp); - XFS_BUF_STALE(bp); + xfs_buf_stale(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~XFS_BLI_DIRTY; bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; @@ -383,22 +383,20 @@ libxfs_trans_bhold( } xfs_buf_t * -libxfs_trans_get_buf( +libxfs_trans_get_buf_map( xfs_trans_t *tp, dev_t dev, - xfs_daddr_t d, - int len, + struct xfs_buf_map *map, + int nmaps, uint f) { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; if (tp == NULL) - return libxfs_getbuf(dev, d, len); + return libxfs_getbuf_map(dev, map, nmaps); - bdev.dev = dev; - bp = xfs_trans_buf_item_match(tp, &bdev, d, len); + bp = xfs_trans_buf_item_match(tp, dev, map, nmaps); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -407,7 +405,7 @@ libxfs_trans_get_buf( return bp; } - bp = libxfs_getbuf(dev, d, len); + bp = libxfs_getbuf_map(dev, map, nmaps); if (bp == NULL) return NULL; #ifdef XACT_DEBUG @@ -432,15 +430,13 @@ libxfs_trans_getsb( { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; - int len; + int len = XFS_FSS_TO_BB(mp, 1); + DEFINE_SINGLE_BUF_MAP(map, XFS_SB_DADDR, len); if (tp == NULL) return libxfs_getsb(mp, flags); - bdev.dev = mp->m_dev; - len = XFS_FSS_TO_BB(mp, 1); - bp = xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); + bp = xfs_trans_buf_item_match(tp, mp->m_dev, &map, 1); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -465,24 +461,24 @@ libxfs_trans_getsb( } int -libxfs_trans_read_buf( +libxfs_trans_read_buf_map( xfs_mount_t *mp, xfs_trans_t *tp, dev_t dev, - xfs_daddr_t blkno, - int len, + struct xfs_buf_map *map, + int nmaps, uint flags, - xfs_buf_t **bpp) + xfs_buf_t **bpp, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; int error; *bpp = NULL; if (tp == NULL) { - bp = libxfs_readbuf(dev, blkno, len, flags); + bp = libxfs_readbuf_map(dev, map, nmaps, flags); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -492,8 +488,7 @@ libxfs_trans_read_buf( goto done; } - bdev.dev = dev; - bp = xfs_trans_buf_item_match(tp, &bdev, blkno, len); + bp = xfs_trans_buf_item_match(tp, dev, map, nmaps); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -502,7 +497,7 @@ libxfs_trans_read_buf( goto done; } - bp = libxfs_readbuf(dev, blkno, len, flags); + bp = libxfs_readbuf_map(dev, map, nmaps, flags); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -588,7 +583,7 @@ inode_item_done( mp = iip->ili_item.li_mountp; ASSERT(ip != NULL); - if (!(iip->ili_format.ilf_fields & XFS_ILOG_ALL)) { + if (!(iip->ili_fields & XFS_ILOG_ALL)) { ip->i_transp = NULL; /* disassociate from transaction */ iip->ili_flags = 0; /* reset all flags */ goto ili_done; @@ -597,9 +592,9 @@ inode_item_done( /* * Get the buffer containing the on-disk inode. */ - error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0); + error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, 0, 0); if (error) { - fprintf(stderr, _("%s: warning - itobp failed (%d)\n"), + fprintf(stderr, _("%s: warning - imap_to_bp failed (%d)\n"), progname, error); goto ili_done; } @@ -674,6 +669,7 @@ trans_committed( struct xfs_log_item *lip = lidp->lid_item; xfs_trans_del_item(lip); + if (lip->li_type == XFS_LI_BUF) buf_item_done((xfs_buf_log_item_t *)lip); else if (lip->li_type == XFS_LI_INODE) diff --git a/libxfs/util.c b/libxfs/util.c index bffbac0..2ad4bfd 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -50,130 +50,6 @@ libxfs_trans_ichgtime( } /* - * Given a mount structure and an inode number, return a pointer - * to a newly allocated in-core inode coresponding to the given - * inode number. - * - * Initialize the inode's attributes and extent pointers if it - * already has them (it will not if the inode has no links). - * - * NOTE: this has slightly different behaviour to the kernel in - * that this version requires the already allocated *ip being - * passed in while the kernel version does the allocation and - * returns it in **ip. - */ -int -libxfs_iread( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_inode_t *ip, - xfs_daddr_t bno) -{ - xfs_buf_t *bp; - xfs_dinode_t *dip; - int error; - - ip->i_ino = ino; - ip->i_mount = mp; - - /* - * Fill in the location information in the in-core inode. - */ - error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0); - if (error) - return error; - - /* - * Get pointers to the on-disk inode and the buffer containing it. - */ - error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, XBF_LOCK, 0); - if (error) - return error; - dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); - - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC) { - xfs_trans_brelse(tp, bp); - return EINVAL; - } - - /* - * If the on-disk inode is already linked to a directory - * entry, copy all of the inode into the in-core inode. - * xfs_iformat() handles copying in the inode format - * specific information. - * Otherwise, just get the truly permanent information. - */ - if (dip->di_mode) { - xfs_dinode_from_disk(&ip->i_d, dip); - error = xfs_iformat(ip, dip); - if (error) { - xfs_trans_brelse(tp, bp); - return error; - } - } else { - ip->i_d.di_magic = be16_to_cpu(dip->di_magic); - ip->i_d.di_version = dip->di_version; - ip->i_d.di_gen = be32_to_cpu(dip->di_gen); - ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); - /* - * Make sure to pull in the mode here as well in - * case the inode is released without being used. - * This ensures that xfs_inactive() will see that - * the inode is already free and not try to mess - * with the uninitialized part of it. - */ - ip->i_d.di_mode = 0; - /* - * Initialize the per-fork minima and maxima for a new - * inode here. xfs_iformat will do it for old inodes. - */ - ip->i_df.if_ext_max = - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - } - - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid_lo/hi field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (ip->i_d.di_version == 1) { - ip->i_d.di_nlink = ip->i_d.di_onlink; - ip->i_d.di_onlink = 0; - xfs_set_projid(&ip->i_d, 0); - } - - ip->i_delayed_blks = 0; - ip->i_size = ip->i_d.di_size; - - /* - * Use xfs_trans_brelse() to release the buffer containing the - * on-disk inode, because it was acquired with xfs_trans_read_buf() - * in xfs_itobp() above. If tp is NULL, this is just a normal - * brelse(). If we're within a transaction, then xfs_trans_brelse() - * will only release the buffer if it is not dirty within the - * transaction. It will be OK to release the buffer in this case, - * because inodes on disk are never destroyed and we will be - * locking the new in-core inode before putting it in the hash - * table where other processes can find it. Thus we don't have - * to worry about the inode being changed just because we released - * the buffer. - */ - xfs_trans_brelse(tp, bp); - return 0; -} - -/* * Allocate an inode on disk and return a copy of its in-core version. * Set mode, nlink, and rdev appropriately within the inode. * The uid and gid for the inode are set according to the contents of @@ -193,7 +69,6 @@ libxfs_ialloc( struct fsxattr *fsx, int okalloc, xfs_buf_t **ialloc_context, - boolean_t *call_again, xfs_inode_t **ipp) { xfs_ino_t ino; @@ -206,10 +81,10 @@ libxfs_ialloc( * the on-disk inode to be allocated. */ error = xfs_dialloc(tp, pip ? pip->i_ino : 0, mode, okalloc, - ialloc_context, call_again, &ino); + ialloc_context, &ino); if (error != 0) return error; - if (*call_again || ino == NULLFSINO) { + if (*ialloc_context || ino == NULLFSINO) { *ipp = NULL; return 0; } @@ -455,7 +330,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) dip->di_onlink = 0; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); memset(&(dip->di_pad[0]), 0, sizeof(dip->di_pad)); - ASSERT(xfs_get_projid(ip->i_d) == 0); + ASSERT(xfs_get_projid(&ip->i_d) == 0); } } @@ -560,7 +435,7 @@ libxfs_alloc_file_space( error = 0; imapp = &imaps[0]; reccount = 1; - xfs_bmapi_flags = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0); + xfs_bmapi_flags = alloc_type ? XFS_BMAPI_PREALLOC : 0; mp = ip->i_mount; startoffset_fsb = XFS_B_TO_FSBT(mp, offset); allocatesize_fsb = XFS_B_TO_FSB(mp, count); @@ -578,7 +453,7 @@ libxfs_alloc_file_space( xfs_trans_ihold(tp, ip); xfs_bmap_init(&free_list, &firstfsb); - error = xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, + error = xfs_bmapi_write(tp, ip, startoffset_fsb, allocatesize_fsb, xfs_bmapi_flags, &firstfsb, 0, imapp, &reccount, &free_list); @@ -617,56 +492,6 @@ libxfs_log2_roundup(unsigned int i) } /* - * Get a buffer for the dir/attr block, fill in the contents. - * Don't check magic number, the caller will (it's xfs_repair). - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -int -libxfs_da_read_bufr( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 2, - (inst_t *)__return_address); -} - -/* - * Hold dabuf at transaction commit. - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -void -libxfs_da_bhold(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - int i; - - for (i = 0; i < dabuf->nbuf; i++) - xfs_trans_bhold(tp, dabuf->bps[i]); -} - -/* - * Join dabuf to transaction. - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -void -libxfs_da_bjoin(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - int i; - - for (i = 0; i < dabuf->nbuf; i++) - xfs_trans_bjoin(tp, dabuf->bps[i]); -} - -/* * Wrapper around call to libxfs_ialloc. Takes care of committing and * allocating a new transaction as needed. * @@ -684,21 +509,25 @@ libxfs_inode_alloc( struct fsxattr *fsx, xfs_inode_t **ipp) { - boolean_t call_again; int i; xfs_buf_t *ialloc_context; xfs_inode_t *ip; xfs_trans_t *ntp; int error; - call_again = B_FALSE; ialloc_context = (xfs_buf_t *)0; error = libxfs_ialloc(*tp, pip, mode, nlink, rdev, cr, fsx, - 1, &ialloc_context, &call_again, &ip); - if (error) + 1, &ialloc_context, &ip); + if (error) { + *ipp = NULL; return error; + } + if (!ialloc_context && !ip) { + *ipp = NULL; + return XFS_ERROR(ENOSPC); + } - if (call_again) { + if (ialloc_context) { xfs_trans_bhold(*tp, ialloc_context); ntp = xfs_trans_dup(*tp); xfs_trans_commit(*tp, 0); @@ -710,8 +539,7 @@ libxfs_inode_alloc( } xfs_trans_bjoin(*tp, ialloc_context); error = libxfs_ialloc(*tp, pip, mode, nlink, rdev, cr, - fsx, 1, &ialloc_context, - &call_again, &ip); + fsx, 1, &ialloc_context, &ip); if (!ip) error = ENOSPC; if (error) diff --git a/libxfs/xfs.h b/libxfs/xfs.h index b3f8378..4311059 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -43,14 +43,18 @@ */ #include +#include "xfs_dir2_priv.h" -typedef struct { dev_t dev; } xfs_buftarg_t; - -typedef __uint32_t uint_t; +typedef __uint32_t uint_t; typedef __uint32_t inst_t; /* an instruction */ +#ifndef EWRONGFS +#define EWRONGFS EINVAL +#endif -#define m_ddev_targp m_dev +#define m_ddev_targp m_dev +#define m_logdev_targp m_logdev +#define m_rtdev_targp m_rtdev #define xfs_error_level 0 #define STATIC static @@ -64,10 +68,11 @@ typedef __uint32_t inst_t; /* an instruction */ #define IHOLD(ip) ((void) 0) -#define XFS_CORRUPTION_ERROR(e,l,mp,m) ((void) 0) +/* stop unused var warnings by assigning mp to itself */ +#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { (mp) = (mp); } while (0) +#define XFS_ERROR_REPORT(e,l,mp) do { (mp) = (mp); } while (0) #define XFS_QM_DQATTACH(mp,ip,flags) 0 #define XFS_ERROR(e) (e) -#define XFS_ERROR_REPORT(e,l,mp) ((void) 0) #define XFS_ERRLEVEL_LOW 1 #define XFS_FORCED_SHUTDOWN(mp) 0 #define XFS_ILOCK_EXCL 0 @@ -124,35 +129,6 @@ static inline int __do_div(unsigned long long *n, unsigned base) ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; }) -static inline __uint32_t __get_unaligned_be32(const __uint8_t *p) -{ - return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; -} - -static inline __uint64_t get_unaligned_be64(void *p) -{ - return (__uint64_t)__get_unaligned_be32(p) << 32 | - __get_unaligned_be32(p + 4); -} - -static inline void __put_unaligned_be16(__uint16_t val, __uint8_t *p) -{ - *p++ = val >> 8; - *p++ = val; -} - -static inline void __put_unaligned_be32(__uint32_t val, __uint8_t *p) -{ - __put_unaligned_be16(val >> 16, p); - __put_unaligned_be16(val, p + 2); -} - -static inline void put_unaligned_be64(__uint64_t val, void *p) -{ - __put_unaligned_be32(val >> 32, p); - __put_unaligned_be32(val, p + 4); -} - static inline __attribute__((const)) int is_power_of_2(unsigned long n) @@ -191,10 +167,11 @@ roundup_pow_of_two(uint v) #define XBF_LOCK XFS_BUF_LOCK #define XBF_TRYLOCK XFS_BUF_TRYLOCK #define XBF_DONT_BLOCK 0 +#define XBF_UNMAPPED 0 #define XFS_BUF_GETERROR(bp) 0 #define XFS_BUF_DONE(bp) ((bp)->b_flags |= LIBXFS_B_UPTODATE) #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & LIBXFS_B_UPTODATE) -#define XFS_BUF_STALE(bp) ((bp)->b_flags |= LIBXFS_B_STALE) +#define xfs_buf_stale(bp) ((bp)->b_flags |= LIBXFS_B_STALE) #define XFS_BUF_UNDELAYWRITE(bp) ((bp)->b_flags &= ~LIBXFS_B_DIRTY) #define XFS_BUF_SET_VTYPE(a,b) ((void) 0) #define XFS_BUF_SET_VTYPE_REF(a,b,c) ((void) 0) @@ -260,6 +237,8 @@ roundup_pow_of_two(uint v) #define xfs_trans_log_inode libxfs_trans_log_inode #define xfs_trans_mod_sb libxfs_trans_mod_sb #define xfs_trans_read_buf libxfs_trans_read_buf +#define xfs_trans_read_buf_map libxfs_trans_read_buf_map +#define xfs_trans_get_buf_map libxfs_trans_get_buf_map #define xfs_trans_reserve libxfs_trans_reserve #define xfs_trans_get_block_res(tp) 1 @@ -268,12 +247,16 @@ roundup_pow_of_two(uint v) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) -#define xfs_buf_readahead(a,b,c) ((void) 0) /* no readahead */ -#define xfs_btree_reada_bufl(m,fsb,c) ((void) 0) -#define xfs_btree_reada_bufs(m,fsb,c,x) ((void) 0) -#define xfs_buftrace(x,y) ((void) 0) /* debug only */ +#define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ +#define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ +#define xfs_btree_reada_bufl(m,fsb,c,ops) ((void) 0) +#define xfs_btree_reada_bufs(m,fsb,c,x,ops) ((void) 0) +#define xfs_buftrace(x,y) ((void) 0) /* debug only */ #define xfs_cmn_err(tag,level,mp,fmt,args...) cmn_err(level,fmt, ## args) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_alert_tag(mp,tag,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) #define xfs_dir2_trace_args(where, args) ((void) 0) #define xfs_dir2_trace_args_b(where, args, bp) ((void) 0) @@ -289,15 +272,28 @@ roundup_pow_of_two(uint v) #define xfs_initialize_perag_icache(pag) ((void) 0) #define xfs_ilock(ip,mode) ((void) 0) +#define xfs_ilock_nowait(ip,mode) ((void) 0) +#define xfs_ilock_demote(ip,mode) ((void) 0) #define xfs_iunlock(ip,mode) ((void) 0) +#define xfs_ilock_map_shared(ip,mode) ((void) 0) +#define xfs_iunlock_map_shared(ip,mode) ((void) 0) +#define __xfs_flock(ip) ((void) 0) /* space allocation */ -#define xfs_alloc_busy_search(tp,ag,b,len) 0 +#define xfs_extent_busy_reuse(mp,ag,bno,len,user) ((void) 0) +#define xfs_extent_busy_insert(tp,ag,bno,len,flags) ((void) 0) +#define xfs_extent_busy_trim(args,fbno,flen,bno,len) \ +do { \ + *(bno) = (fbno); \ + *(len) = (flen); \ +} while (0) + /* avoid unused variable warning */ #define xfs_alloc_busy_insert(tp,ag,b,len) ({ \ xfs_agnumber_t __foo = ag; \ __foo = 0; \ }) + #define xfs_rotorstep 1 #define xfs_bmap_rtalloc(a) (ENOSYS) #define xfs_rtpick_extent(mp,tp,len,p) (ENOSYS) @@ -306,6 +302,15 @@ roundup_pow_of_two(uint v) #define xfs_filestream_lookup_ag(ip) (0) #define xfs_filestream_new_ag(ip,ag) (0) +#define xfs_log_force(mp,flags) ((void) 0) +#define XFS_LOG_SYNC 1 + +/* quota bits */ +#define xfs_trans_mod_dquot_byino(t,i,f,d) ((void) 0) +#define xfs_trans_reserve_quota_nblks(t,i,b,n,f) (0) +#define xfs_trans_unreserve_quota_nblks(t,i,b,n,f) ((void) 0) +#define xfs_qm_dqattach(i,f) (0) + /* * Prototypes for kernel static functions that are aren't in their * associated header files @@ -318,14 +323,20 @@ int xfs_attr_rmtval_get(struct xfs_da_args *); void xfs_bmap_del_free(xfs_bmap_free_t *, xfs_bmap_free_item_t *, xfs_bmap_free_item_t *); -/* xfs_da_btree.c */ -int xfs_da_do_buf(xfs_trans_t *, xfs_inode_t *, xfs_dablk_t, xfs_daddr_t *, - xfs_dabuf_t **, int, int, inst_t *); - /* xfs_inode.c */ void xfs_iflush_fork(xfs_inode_t *, xfs_dinode_t *, xfs_inode_log_item_t *, int, xfs_buf_t *); -int xfs_iformat(xfs_inode_t *, xfs_dinode_t *); +/* + * For regular files we only update the on-disk filesize when actually + * writing data back to disk. Until then only the copy in the VFS inode + * is uptodate. + */ +static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) +{ + if (S_ISREG(ip->i_d.di_mode)) + return ip->i_size; + return ip->i_d.di_size; +} /* xfs_mount.c */ int xfs_initialize_perag_data(xfs_mount_t *, xfs_agnumber_t); @@ -348,8 +359,8 @@ void xfs_buf_item_init (xfs_buf_t *, xfs_mount_t *); void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); /* xfs_trans_buf.c */ -xfs_buf_t *xfs_trans_buf_item_match (xfs_trans_t *, xfs_buftarg_t *, - xfs_daddr_t, int); +xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, dev_t, + struct xfs_buf_map *, int); /* local source files */ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index a76512d..61cdc6c 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -22,19 +22,11 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -/* - * Prototypes for per-ag allocation routines - */ - STATIC int xfs_alloc_ag_vextent_exact(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_near(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, - xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); - -/* - * Internal functions. - */ + xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); /* * Lookup the record equal to [bno, len] in the btree given by cur. @@ -55,7 +47,7 @@ xfs_alloc_lookup_eq( * Lookup the first record greater than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_ge( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -71,7 +63,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -104,7 +96,7 @@ xfs_alloc_update( /* * Get the data from the pointed-to record. */ -STATIC int /* error */ +int /* error */ xfs_alloc_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t *bno, /* output: starting block of extent */ @@ -128,27 +120,28 @@ xfs_alloc_get_rec( */ STATIC void xfs_alloc_compute_aligned( + xfs_alloc_arg_t *args, /* allocation argument structure */ xfs_agblock_t foundbno, /* starting block in found extent */ xfs_extlen_t foundlen, /* length in found extent */ - xfs_extlen_t alignment, /* alignment for allocation */ - xfs_extlen_t minlen, /* minimum length for allocation */ xfs_agblock_t *resbno, /* result block number */ xfs_extlen_t *reslen) /* result length */ { xfs_agblock_t bno; - xfs_extlen_t diff; xfs_extlen_t len; - if (alignment > 1 && foundlen >= minlen) { - bno = roundup(foundbno, alignment); - diff = bno - foundbno; - len = diff >= foundlen ? 0 : foundlen - diff; + /* Trim busy sections out of found extent */ + xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + + if (args->alignment > 1 && len >= args->minlen) { + xfs_agblock_t aligned_bno = roundup(bno, args->alignment); + xfs_extlen_t diff = aligned_bno - bno; + + *resbno = aligned_bno; + *reslen = diff >= len ? 0 : len - diff; } else { - bno = foundbno; - len = foundlen; + *resbno = bno; + *reslen = len; } - *resbno = bno; - *reslen = len; } /* @@ -262,7 +255,6 @@ xfs_alloc_fix_minleft( return 1; agf = XFS_BUF_TO_AGF(args->agbp); diff = be32_to_cpu(agf->agf_freeblks) - + be32_to_cpu(agf->agf_flcount) - args->len - args->minleft; if (diff >= 0) return 1; @@ -418,6 +410,60 @@ xfs_alloc_fixup_trees( return 0; } +static void +xfs_agfl_verify( + struct xfs_buf *bp) +{ +#ifdef WHEN_CRCS_COME_ALONG + /* + * we cannot actually do any verification of the AGFL because mkfs does + * not initialise the AGFL to zero or NULL. Hence the only valid part of + * the AGFL is what the AGF says is active. We can't get to the AGF, so + * we can't verify just those entries are valid. + * + * This problem goes away when the CRC format change comes along as that + * requires the AGFL to be initialised by mkfs. At that point, we can + * verify the blocks in the agfl -active or not- lie within the bounds + * of the AG. Until then, just leave this check ifdef'd out. + */ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); + int agfl_ok = 1; + + int i; + + for (i = 0; i < XFS_AGFL_SIZE(mp); i++) { + if (be32_to_cpu(agfl->agfl_bno[i]) == NULLAGBLOCK || + be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks) + agfl_ok = 0; + } + + if (!agfl_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +#endif +} + +static void +xfs_agfl_write_verify( + struct xfs_buf *bp) +{ + xfs_agfl_verify(bp); +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + xfs_agfl_verify(bp); +} + +const struct xfs_buf_ops xfs_agfl_buf_ops = { + .verify_read = xfs_agfl_read_verify, + .verify_write = xfs_agfl_write_verify, +}; + /* * Read in the allocation group free block array. */ @@ -435,16 +481,36 @@ xfs_alloc_read_agfl( error = xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, &bp); + XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_agfl_buf_ops); if (error) return error; - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGFL, XFS_AGFL_REF); + ASSERT(!xfs_buf_geterror(bp)); + xfs_buf_set_ref(bp, XFS_AGFL_REF); *bpp = bp; return 0; } +STATIC int +xfs_alloc_update_counters( + struct xfs_trans *tp, + struct xfs_perag *pag, + struct xfs_buf *agbp, + long len) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + + pag->pagf_freeblks += len; + be32_add_cpu(&agf->agf_freeblks, len); + + xfs_trans_agblocks_delta(tp, len); + if (unlikely(be32_to_cpu(agf->agf_freeblks) > + be32_to_cpu(agf->agf_length))) + return EFSCORRUPTED; + + xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); + return 0; +} + /* * Allocation group level functions. */ @@ -486,49 +552,36 @@ xfs_alloc_ag_vextent( ASSERT(0); /* NOTREACHED */ } - if (error) + + if (error || args->agbno == NULLAGBLOCK) return error; - /* - * If the allocation worked, need to change the agf structure - * (and log it), and the superblock. - */ - if (args->agbno != NULLAGBLOCK) { - xfs_agf_t *agf; /* allocation group freelist header */ - long slen = (long)args->len; - ASSERT(args->len >= args->minlen && args->len <= args->maxlen); - ASSERT(!(args->wasfromfl) || !args->isfl); - ASSERT(args->agbno % args->alignment == 0); - if (!(args->wasfromfl)) { - - agf = XFS_BUF_TO_AGF(args->agbp); - be32_add_cpu(&agf->agf_freeblks, -(args->len)); - xfs_trans_agblocks_delta(args->tp, - -((long)(args->len))); - args->pag->pagf_freeblks -= args->len; - ASSERT(be32_to_cpu(agf->agf_freeblks) <= - be32_to_cpu(agf->agf_length)); - xfs_alloc_log_agf(args->tp, args->agbp, - XFS_AGF_FREEBLKS); - /* - * Search the busylist for these blocks and mark the - * transaction as synchronous if blocks are found. This - * avoids the need to block due to a synchronous log - * force to ensure correct ordering as the synchronous - * transaction will guarantee that for us. - */ - if (xfs_alloc_busy_search(args->mp, args->agno, - args->agbno, args->len)) - xfs_trans_set_sync(args->tp); - } - if (!args->isfl) - xfs_trans_mod_sb(args->tp, - args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : - XFS_TRANS_SB_FDBLOCKS, -slen); - XFS_STATS_INC(xs_allocx); - XFS_STATS_ADD(xs_allocb, args->len); + ASSERT(args->len >= args->minlen); + ASSERT(args->len <= args->maxlen); + ASSERT(!args->wasfromfl || !args->isfl); + ASSERT(args->agbno % args->alignment == 0); + + if (!args->wasfromfl) { + error = xfs_alloc_update_counters(args->tp, args->pag, + args->agbp, + -((long)(args->len))); + if (error) + return error; + + ASSERT(!xfs_extent_busy_search(args->mp, args->agno, + args->agbno, args->len)); } - return 0; + + if (!args->isfl) { + xfs_trans_mod_sb(args->tp, args->wasdel ? + XFS_TRANS_SB_RES_FDBLOCKS : + XFS_TRANS_SB_FDBLOCKS, + -((long)(args->len))); + } + + XFS_STATS_INC(xs_allocx); + XFS_STATS_ADD(xs_allocb, args->len); + return error; } /* @@ -543,17 +596,16 @@ xfs_alloc_ag_vextent_exact( { xfs_btree_cur_t *bno_cur;/* by block-number btree cursor */ xfs_btree_cur_t *cnt_cur;/* by count btree cursor */ - xfs_agblock_t end; /* end of allocated extent */ int error; xfs_agblock_t fbno; /* start block of found extent */ - xfs_agblock_t fend; /* end block of found extent */ xfs_extlen_t flen; /* length of found extent */ + xfs_agblock_t tbno; /* start block of trimmed extent */ + xfs_extlen_t tlen; /* length of trimmed extent */ + xfs_agblock_t tend; /* end block of trimmed extent */ int i; /* success/failure of operation */ - xfs_agblock_t maxend; /* end of maximal extent */ - xfs_agblock_t minend; /* end of minimal extent */ - xfs_extlen_t rlen; /* length of returned extent */ ASSERT(args->alignment == 1); + /* * Allocate/initialize a cursor for the by-number freespace btree. */ @@ -579,14 +631,22 @@ xfs_alloc_ag_vextent_exact( goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); ASSERT(fbno <= args->agbno); - minend = args->agbno + args->minlen; - maxend = args->agbno + args->maxlen; - fend = fbno + flen; /* - * Give up if the freespace isn't long enough for the minimum request. + * Check for overlapping busy extents. + */ + xfs_extent_busy_trim(args, fbno, flen, &tbno, &tlen); + + /* + * Give up if the start of the extent is busy, or the freespace isn't + * long enough for the minimum request. */ - if (fend < minend) + if (tbno > args->agbno) + goto not_found; + if (tlen < args->minlen) + goto not_found; + tend = tbno + tlen; + if (tend < args->agbno + args->minlen) goto not_found; /* @@ -595,18 +655,16 @@ xfs_alloc_ag_vextent_exact( * * Fix the length according to mod and prod if given. */ - end = XFS_AGBLOCK_MIN(fend, maxend); - args->len = end - args->agbno; + args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen) + - args->agbno; xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) goto not_found; - rlen = args->len; - ASSERT(args->agbno + rlen <= fend); - end = args->agbno + rlen; + ASSERT(args->agbno + args->len <= tend); /* - * We are allocating agbno for rlen [agbno .. end] + * We are allocating agbno for args->len * Allocate/initialize a cursor for the by-size btree. */ cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, @@ -619,8 +677,10 @@ xfs_alloc_ag_vextent_exact( xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); goto error0; } + xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + args->wasfromfl = 0; trace_xfs_alloc_exact_done(args); return 0; @@ -649,11 +709,11 @@ xfs_alloc_find_best_extent( struct xfs_btree_cur **scur, /* searching cursor */ xfs_agblock_t gdiff, /* difference for search comparison */ xfs_agblock_t *sbno, /* extent found by search */ - xfs_extlen_t *slen, - xfs_extlen_t *slena, /* aligned length */ + xfs_extlen_t *slen, /* extent length */ + xfs_agblock_t *sbnoa, /* aligned extent found by search */ + xfs_extlen_t *slena, /* aligned extent length */ int dir) /* 0 = search right, 1 = search left */ { - xfs_agblock_t bno; xfs_agblock_t new; xfs_agblock_t sdiff; int error; @@ -671,17 +731,16 @@ xfs_alloc_find_best_extent( if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(*sbno, *slen, args->alignment, - args->minlen, &bno, slena); + xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); /* * The good extent is closer than this one. */ if (!dir) { - if (bno >= args->agbno + gdiff) + if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { - if (bno <= args->agbno - gdiff) + if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -693,8 +752,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); sdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbno, - *slen, &new); + args->alignment, *sbnoa, + *slena, &new); /* * Choose closer size and invalidate other cursor. @@ -744,7 +803,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t gtbnoa; /* aligned ... */ xfs_extlen_t gtdiff; /* difference to right side entry */ xfs_extlen_t gtlen; /* length of right side entry */ - xfs_extlen_t gtlena = 0; /* aligned ... */ + xfs_extlen_t gtlena; /* aligned ... */ xfs_agblock_t gtnew; /* useful start bno of right side */ int error; /* error code */ int i; /* result code, temporary */ @@ -753,9 +812,10 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ - xfs_extlen_t ltlena = 0; /* aligned ... */ + xfs_extlen_t ltlena; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ + int forced = 0; #if defined(DEBUG) && defined(__KERNEL__) /* * Randomly don't execute the first algorithm. @@ -764,13 +824,20 @@ xfs_alloc_ag_vextent_near( dofirst = random32() & 1; #endif + +restart: + bno_cur_lt = NULL; + bno_cur_gt = NULL; + ltlen = 0; + gtlena = 0; + ltlena = 0; + /* * Get a cursor for the by-size btree. */ cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); - ltlen = 0; - bno_cur_lt = bno_cur_gt = NULL; + /* * See if there are any free extents as big as maxlen. */ @@ -786,11 +853,13 @@ xfs_alloc_ag_vextent_near( goto error0; if (i == 0 || ltlen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_near_noentry(args); return 0; } ASSERT(i == 1); } args->wasfromfl = 0; + /* * First algorithm. * If the requested extent is large wrt the freespaces available @@ -844,8 +913,8 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, - args->minlen, <bnoa, <lena); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena < args->minlen) continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); @@ -854,7 +923,7 @@ xfs_alloc_ag_vextent_near( if (args->len < blen) continue; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); if (ltnew != NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff = ltdiff; @@ -965,8 +1034,8 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, - args->minlen, <bnoa, <lena); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena >= args->minlen) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) @@ -981,8 +1050,8 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(gtbno, gtlen, args->alignment, - args->minlen, >bnoa, >lena); + xfs_alloc_compute_aligned(args, gtbno, gtlen, + >bnoa, >lena); if (gtlena >= args->minlen) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) @@ -1005,13 +1074,13 @@ xfs_alloc_ag_vextent_near( */ args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); - rlen = args->len; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); error = xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, - ltdiff, >bno, >len, >lena, + ltdiff, >bno, >len, + >bnoa, >lena, 0 /* search right */); } else { ASSERT(gtlena >= args->minlen); @@ -1022,11 +1091,12 @@ xfs_alloc_ag_vextent_near( args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbno, gtlen, >new); + args->alignment, gtbnoa, gtlena, >new); error = xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, - gtdiff, <bno, <len, <lena, + gtdiff, <bno, <len, + <bnoa, <lena, 1 /* search left */); } @@ -1038,6 +1108,13 @@ xfs_alloc_ag_vextent_near( * If we couldn't get anything, give up. */ if (bno_cur_lt == NULL && bno_cur_gt == NULL) { + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + + if (!forced++) { + trace_xfs_alloc_near_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } trace_xfs_alloc_size_neither(args); args->agbno = NULLAGBLOCK; return 0; @@ -1072,12 +1149,13 @@ xfs_alloc_ag_vextent_near( return 0; } rlen = args->len; - (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, - ltlen, <new); + (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, + ltbnoa, ltlena, <new); ASSERT(ltnew >= ltbno); - ASSERT(ltnew + rlen <= ltbno + ltlen); + ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->agbno = ltnew; + if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, ltnew, rlen, XFSA_FIXUP_BNO_OK))) goto error0; @@ -1120,26 +1198,35 @@ xfs_alloc_ag_vextent_size( int i; /* temp status variable */ xfs_agblock_t rbno; /* returned block number */ xfs_extlen_t rlen; /* length of returned extent */ + int forced = 0; +restart: /* * Allocate and initialize a cursor for the by-size btree. */ cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); bno_cur = NULL; + /* * Look for an entry >= maxlen+alignment-1 blocks. */ if ((error = xfs_alloc_lookup_ge(cnt_cur, 0, args->maxlen + args->alignment - 1, &i))) goto error0; + /* - * If none, then pick up the last entry in the tree unless the - * tree is empty. + * If none or we have busy extents that we cannot allocate from, then + * we have to settle for a smaller extent. In the case that there are + * no large extents, this will return the last entry in the tree unless + * the tree is empty. In the case that there are only busy large + * extents, this will return the largest small extent unless there + * are no smaller extents available. */ - if (!i) { - if ((error = xfs_alloc_ag_vextent_small(args, cnt_cur, &fbno, - &flen, &i))) + if (!i || forced > 1) { + error = xfs_alloc_ag_vextent_small(args, cnt_cur, + &fbno, &flen, &i); + if (error) goto error0; if (i == 0 || flen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); @@ -1147,23 +1234,56 @@ xfs_alloc_ag_vextent_size( return 0; } ASSERT(i == 1); + xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); + } else { + /* + * Search for a non-busy extent that is large enough. + * If we are at low space, don't check, or if we fall of + * the end of the btree, turn off the busy check and + * restart. + */ + for (;;) { + error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); + + if (rlen >= args->maxlen) + break; + + error = xfs_btree_increment(cnt_cur, 0, &i); + if (error) + goto error0; + if (i == 0) { + /* + * Our only valid extents must have been busy. + * Make it unbusy by forcing the log out and + * retrying. If we've been here before, forcing + * the log isn't making the extents available, + * which means they have probably been freed in + * this transaction. In that case, we have to + * give up on them and we'll attempt a minlen + * allocation the next time around. + */ + xfs_btree_del_cursor(cnt_cur, + XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + if (!forced++) + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + } } - /* - * There's a freespace as big as maxlen+alignment-1, get it. - */ - else { - if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - } + /* * In the first case above, we got the last entry in the * by-size btree. Now we check to see if the space hits maxlen * once aligned; if not, we search left for something better. * This can't happen in the second case above. */ - xfs_alloc_compute_aligned(fbno, flen, args->alignment, args->minlen, - &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), error0); @@ -1188,8 +1308,8 @@ xfs_alloc_ag_vextent_size( XFS_WANT_CORRUPTED_GOTO(i == 1, error0); if (flen < bestrlen) break; - xfs_alloc_compute_aligned(fbno, flen, args->alignment, - args->minlen, &rbno, &rlen); + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), @@ -1217,13 +1337,19 @@ xfs_alloc_ag_vextent_size( * Fix up the length. */ args->len = rlen; - xfs_alloc_fix_len(args); - if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { - xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - trace_xfs_alloc_size_nominleft(args); - args->agbno = NULLAGBLOCK; - return 0; + if (rlen < args->minlen) { + if (!forced++) { + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + goto out_nominleft; } + xfs_alloc_fix_len(args); + + if (!xfs_alloc_fix_minleft(args)) + goto out_nominleft; rlen = args->len; XFS_WANT_CORRUPTED_GOTO(rlen <= flen, error0); /* @@ -1253,6 +1379,12 @@ error0: if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); return error; + +out_nominleft: + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_nominleft(args); + args->agbno = NULLAGBLOCK; + return 0; } /* @@ -1292,6 +1424,9 @@ xfs_alloc_ag_vextent_small( if (error) goto error0; if (fbno != NULLAGBLOCK) { + xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1, + args->userdata); + if (args->userdata) { xfs_buf_t *bp; @@ -1367,6 +1502,7 @@ xfs_free_ag_extent( xfs_mount_t *mp; /* mount point struct for filesystem */ xfs_agblock_t nbno; /* new starting block of freespace */ xfs_extlen_t nlen; /* new length of freespace */ + xfs_perag_t *pag; /* per allocation group data */ mp = tp->t_mountp; /* @@ -1565,45 +1701,23 @@ xfs_free_ag_extent( XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); cnt_cur = NULL; + /* * Update the freespace totals in the ag and superblock. */ - { - xfs_agf_t *agf; - xfs_perag_t *pag; /* per allocation group data */ - - pag = xfs_perag_get(mp, agno); - pag->pagf_freeblks += len; - xfs_perag_put(pag); - - agf = XFS_BUF_TO_AGF(agbp); - be32_add_cpu(&agf->agf_freeblks, len); - xfs_trans_agblocks_delta(tp, len); - XFS_WANT_CORRUPTED_GOTO( - be32_to_cpu(agf->agf_freeblks) <= - be32_to_cpu(agf->agf_length), - error0); - xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); - if (!isfl) - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); - XFS_STATS_INC(xs_freex); - XFS_STATS_ADD(xs_freeb, len); - } + pag = xfs_perag_get(mp, agno); + error = xfs_alloc_update_counters(tp, pag, agbp, len); + xfs_perag_put(pag); + if (error) + goto error0; + + if (!isfl) + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); + XFS_STATS_INC(xs_freex); + XFS_STATS_ADD(xs_freeb, len); trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); - /* - * Since blocks move to the free list without the coordination - * used in xfs_bmap_finish, we can't allow block to be available - * for reallocation and non-transaction writing (user data) - * until we know that the transaction that moved it to the free - * list is permanently on disk. We track the blocks by declaring - * these blocks as "busy"; the busy list is maintained on a per-ag - * basis and each transaction records which entries should be removed - * when the iclog commits to disk. If a busy block is allocated, - * the iclog is pushed up to the LSN that freed the block. - */ - xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: @@ -1788,12 +1902,11 @@ xfs_alloc_fix_freelist( /* * Initialize the args structure. */ + memset(&targs, 0, sizeof(targs)); targs.tp = tp; targs.mp = mp; targs.agbp = agbp; targs.agno = args->agno; - targs.mod = targs.minleft = targs.wasdel = targs.userdata = - targs.minalignslop = 0; targs.alignment = targs.minlen = targs.prod = targs.isfl = 1; targs.type = XFS_ALLOCTYPE_THIS_AG; targs.pag = pag; @@ -1900,21 +2013,6 @@ xfs_alloc_get_freelist( xfs_alloc_log_agf(tp, agbp, logflags); *bnop = bno; - /* - * As blocks are freed, they are added to the per-ag busy list and - * remain there until the freeing transaction is committed to disk. - * Now that we have allocated blocks, this list must be searched to see - * if a block is being reused. If one is, then the freeing transaction - * must be pushed to disk before this transaction. - * - * We do this by setting the current transaction to a sync transaction - * which guarantees that the freeing transaction is on disk before this - * transaction. This is done instead of a synchronous log force here so - * that we don't sit and wait with the AGF locked in the transaction - * during the log force. - */ - if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) - xfs_trans_set_sync(tp); return 0; } @@ -2027,6 +2125,63 @@ xfs_alloc_put_freelist( return 0; } +static void +xfs_agf_verify( + struct xfs_buf *bp) + { + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_agf *agf; + int agf_ok; + + agf = XFS_BUF_TO_AGF(bp); + + agf_ok = agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag) + agf_ok = agf_ok && be32_to_cpu(agf->agf_seqno) == + bp->b_pag->pag_agno; + + if (xfs_sb_version_haslazysbcount(&mp->m_sb)) + agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= + be32_to_cpu(agf->agf_length); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_agf_read_verify( + struct xfs_buf *bp) +{ + xfs_agf_verify(bp); +} + +static void +xfs_agf_write_verify( + struct xfs_buf *bp) +{ + xfs_agf_verify(bp); +} + +const struct xfs_buf_ops xfs_agf_buf_ops = { + .verify_read = xfs_agf_read_verify, + .verify_write = xfs_agf_write_verify, +}; + /* * Read in the allocation group header (free/alloc section). */ @@ -2038,45 +2193,20 @@ xfs_read_agf( int flags, /* XFS_BUF_ */ struct xfs_buf **bpp) /* buffer for the ag freelist header */ { - struct xfs_agf *agf; /* ag freelist header */ - int agf_ok; /* set if agf is consistent */ int error; ASSERT(agno != NULLAGNUMBER); error = xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), flags, bpp); + XFS_FSS_TO_BB(mp, 1), flags, bpp, &xfs_agf_buf_ops); if (error) return error; if (!*bpp) return 0; - ASSERT(!XFS_BUF_GETERROR(*bpp)); - agf = XFS_BUF_TO_AGF(*bpp); - - /* - * Validate the magic number of the agf block. - */ - agf_ok = - be32_to_cpu(agf->agf_magicnum) == XFS_AGF_MAGIC && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_seqno) == agno; - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= - be32_to_cpu(agf->agf_length); - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR("xfs_alloc_read_agf", - XFS_ERRLEVEL_LOW, mp, agf); - xfs_trans_brelse(tp, *bpp); - return XFS_ERROR(EFSCORRUPTED); - } - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGF, XFS_AGF_REF); + ASSERT(!(*bpp)->b_error); + xfs_buf_set_ref(*bpp, XFS_AGF_REF); return 0; } @@ -2104,7 +2234,7 @@ xfs_alloc_read_agf( return error; if (!*bpp) return 0; - ASSERT(!XFS_BUF_GETERROR(*bpp)); + ASSERT(!(*bpp)->b_error); agf = XFS_BUF_TO_AGF(*bpp); pag = xfs_perag_get(mp, agno); @@ -2371,18 +2501,36 @@ xfs_free_extent( memset(&args, 0, sizeof(xfs_alloc_arg_t)); args.tp = tp; args.mp = tp->t_mountp; + + /* + * validate that the block number is legal - the enables us to detect + * and handle a silent filesystem corruption rather than crashing. + */ args.agno = XFS_FSB_TO_AGNO(args.mp, bno); - ASSERT(args.agno < args.mp->m_sb.sb_agcount); + if (args.agno >= args.mp->m_sb.sb_agcount) + return EFSCORRUPTED; + args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); + if (args.agbno >= args.mp->m_sb.sb_agblocks) + return EFSCORRUPTED; + args.pag = xfs_perag_get(args.mp, args.agno); - if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) + ASSERT(args.pag); + + error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); + if (error) goto error0; -#ifdef DEBUG - ASSERT(args.agbp != NULL); - ASSERT((args.agbno + len) <= - be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)); -#endif + + /* validate the extent size is legal now we have the agf locked */ + if (args.agbno + len > + be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)) { + error = EFSCORRUPTED; + goto error0; + } + error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); + if (!error) + xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0); error0: xfs_perag_put(args.pag); return error; diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index b782d9d..dc9ed48 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -75,6 +75,8 @@ xfs_allocbt_alloc_block( return 0; } + xfs_extent_busy_reuse(cur->bc_mp, cur->bc_private.a.agno, bno, 1, false); + xfs_trans_agbtree_delta(cur->bc_tp, 1); new->s = cpu_to_be32(bno); @@ -98,19 +100,11 @@ xfs_allocbt_free_block( if (error) return error; - /* - * Since blocks move to the free list without the coordination used in - * xfs_bmap_finish, we can't allow block to be available for - * reallocation and non-transaction writing (user data) until we know - * that the transaction that moved it to the free list is permanently - * on disk. We track the blocks by declaring these blocks as "busy"; - * the busy list is maintained on a per-ag basis and each transaction - * records which entries should be removed when the iclog commits to - * disk. If a busy block is allocated, the iclog is pushed up to the - * LSN that freed the block. - */ - xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, + XFS_EXTENT_BUSY_SKIP_DISCARD); xfs_trans_agbtree_delta(cur->bc_tp, -1); + + xfs_trans_binval(cur->bc_tp, bp); return 0; } @@ -260,6 +254,82 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } +static void +xfs_allocbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; + unsigned int level; + int sblock_ok; /* block passes checks */ + + /* + * magic number and level verification + * + * During growfs operations, we can't verify the exact level as the + * perag is not fully initialised and hence not attached to the buffer. + * In this case, check against the maximum tree depth. + */ + level = be16_to_cpu(block->bb_level); + switch (cpu_to_be32(block->bb_magic)) { + case XFS_ABTB_MAGIC: + if (pag) + sblock_ok = level < pag->pagf_levels[XFS_BTNUM_BNOi]; + else + sblock_ok = level < mp->m_ag_maxlevels; + break; + case XFS_ABTC_MAGIC: + if (pag) + sblock_ok = level < pag->pagf_levels[XFS_BTNUM_CNTi]; + else + sblock_ok = level < mp->m_ag_maxlevels; + break; + default: + sblock_ok = 0; + break; + } + + /* numrecs verification */ + sblock_ok = sblock_ok && + be16_to_cpu(block->bb_numrecs) <= mp->m_alloc_mxr[level != 0]; + + /* sibling pointer verification */ + sblock_ok = sblock_ok && + (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_leftsib && + (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_rightsib; + + if (!sblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_allocbt_read_verify( + struct xfs_buf *bp) +{ + xfs_allocbt_verify(bp); +} + +static void +xfs_allocbt_write_verify( + struct xfs_buf *bp) +{ + xfs_allocbt_verify(bp); +} + +const struct xfs_buf_ops xfs_allocbt_buf_ops = { + .verify_read = xfs_allocbt_read_verify, + .verify_write = xfs_allocbt_write_verify, +}; + + #ifdef DEBUG STATIC int xfs_allocbt_keys_inorder( @@ -381,7 +451,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_rec_from_cur = xfs_allocbt_init_rec_from_cur, .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .key_diff = xfs_allocbt_key_diff, - + .buf_ops = &xfs_allocbt_buf_ops, #ifdef DEBUG .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, @@ -415,13 +485,16 @@ xfs_allocbt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; - cur->bc_nlevels = be32_to_cpu(agf->agf_levels[btnum]); cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; - cur->bc_ops = &xfs_allocbt_ops; - if (btnum == XFS_BTNUM_CNT) + + if (btnum == XFS_BTNUM_CNT) { + cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]); cur->bc_flags = XFS_BTREE_LASTREC_UPDATE; + } else { + cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]); + } cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index aaeaec4..0450dca 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -292,8 +292,7 @@ xfs_attr_set_int( return (error); } - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp, 0); /* * If the attribute list is non-existent or a shortform list, @@ -362,10 +361,8 @@ xfs_attr_set_int( * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); - } + if (committed) + xfs_trans_ijoin(args.trans, dp, 0); /* * Commit the leaf transformation. We'll need another (linked) @@ -466,6 +463,13 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) args.whichfork = XFS_ATTR_FORK; /* + * we have no control over the attribute names that userspace passes us + * to remove, so we have to allow the name lookup prior to attribute + * removal to fail. + */ + args.op_flags = XFS_DA_OP_OKNOENT; + + /* * Attach the dquots to the inode. */ error = xfs_qm_dqattach(dp, 0); @@ -506,8 +510,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) * No need to make quota reservations here. We expect to release some * blocks not allocate in the common case. */ - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp, 0); /* * Decide on what work routines to call based on the inode size. @@ -600,6 +603,8 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) { int newsize, forkoff, retval; + trace_xfs_attr_sf_addname(args); + retval = xfs_attr_shortform_lookup(args); if ((args->flags & ATTR_REPLACE) && (retval == ENOATTR)) { return(retval); @@ -640,19 +645,19 @@ STATIC int xfs_attr_leaf_addname(xfs_da_args_t *args) { xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int retval, error, committed, forkoff; + trace_xfs_attr_leaf_addname(args); + /* * Read the (only) block in the attribute list in. */ dp = args->dp; args->blkno = 0; - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); - ASSERT(bp != NULL); + return error; /* * Look up the given attribute in the leaf block. Figure out if @@ -660,13 +665,16 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ retval = xfs_attr_leaf_lookup_int(bp, args); if ((args->flags & ATTR_REPLACE) && (retval == ENOATTR)) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(retval); } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) { /* pure create op */ - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(retval); } + + trace_xfs_attr_leaf_replace(args); + args->op_flags |= XFS_DA_OP_RENAME; /* an atomic rename */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; @@ -679,7 +687,6 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * if required. */ retval = xfs_attr_leaf_add(bp, args); - xfs_da_buf_done(bp); if (retval == ENOSPC) { /* * Promote the attribute list to the Btree format, then @@ -703,10 +710,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); /* * Commit the current trans (including the inode) and start @@ -776,12 +781,12 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Read in the block containing the "old" attr, then * remove the "old" attr from that block (neat, huh!) */ - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, - &bp, XFS_ATTR_FORK); + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, + -1, &bp); if (error) - return(error); - ASSERT(bp != NULL); - (void)xfs_attr_leaf_remove(bp, args); + return error; + + xfs_attr_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. @@ -807,12 +812,9 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } - } else - xfs_da_buf_done(bp); + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + } /* * Commit the remove and start the next trans in series. @@ -838,28 +840,27 @@ STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args) { xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error, committed, forkoff; + trace_xfs_attr_leaf_removename(args); + /* * Remove the attribute. */ dp = args->dp; args->blkno = 0; - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { - return(error); - } + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) + return error; - ASSERT(bp != NULL); error = xfs_attr_leaf_lookup_int(bp, args); if (error == ENOATTR) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(error); } - (void)xfs_attr_leaf_remove(bp, args); + xfs_attr_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. @@ -883,12 +884,9 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } - } else - xfs_da_buf_done(bp); + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + } return(0); } @@ -901,23 +899,23 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) STATIC int xfs_attr_leaf_get(xfs_da_args_t *args) { - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; + trace_xfs_attr_leaf_get(args); + args->blkno = 0; - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); - ASSERT(bp != NULL); + return error; error = xfs_attr_leaf_lookup_int(bp, args); if (error != EEXIST) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(error); } error = xfs_attr_leaf_getvalue(bp, args); - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); if (!error && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { error = xfs_attr_rmtval_get(args); } @@ -947,6 +945,8 @@ xfs_attr_node_addname(xfs_da_args_t *args) xfs_mount_t *mp; int committed, retval, error; + trace_xfs_attr_node_addname(args); + /* * Fill in bucket of arguments/results/context to carry around. */ @@ -973,6 +973,9 @@ restart: } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) goto out; + + trace_xfs_attr_node_replace(args); + args->op_flags |= XFS_DA_OP_RENAME; /* atomic rename op */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; @@ -1010,10 +1013,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); /* * Commit the node conversion and start the next @@ -1049,10 +1050,8 @@ restart: * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } else { /* * Addition succeeded, update Btree hashvals. @@ -1163,10 +1162,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } /* @@ -1207,9 +1204,11 @@ xfs_attr_node_removename(xfs_da_args_t *args) xfs_da_state_t *state; xfs_da_state_blk_t *blk; xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int retval, error, committed, forkoff; + trace_xfs_attr_node_removename(args); + /* * Tie a string around our finger to remind us where we are. */ @@ -1297,10 +1296,8 @@ xfs_attr_node_removename(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); /* * Commit the Btree join operation and start a new trans. @@ -1319,16 +1316,11 @@ xfs_attr_node_removename(xfs_da_args_t *args) */ ASSERT(state->path.active == 1); ASSERT(state->path.blk[0].bp); - xfs_da_buf_done(state->path.blk[0].bp); state->path.blk[0].bp = NULL; - error = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_ATTR_FORK); + error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp); if (error) goto out; - ASSERT(be16_to_cpu(((xfs_attr_leafblock_t *) - bp->data)->hdr.info.magic) - == XFS_ATTR_LEAF_MAGIC); if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); @@ -1351,12 +1343,10 @@ xfs_attr_node_removename(xfs_da_args_t *args) * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } else - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); } error = 0; @@ -1378,6 +1368,8 @@ xfs_attr_fillstate(xfs_da_state_t *state) xfs_da_state_blk_t *blk; int level; + trace_xfs_attr_fillstate(state->args); + /* * Roll down the "path" in the state structure, storing the on-disk * block number for those buffers in the "path". @@ -1386,8 +1378,7 @@ xfs_attr_fillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->bp) { - blk->disk_blkno = xfs_da_blkno(blk->bp); - xfs_da_buf_done(blk->bp); + blk->disk_blkno = XFS_BUF_ADDR(blk->bp); blk->bp = NULL; } else { blk->disk_blkno = 0; @@ -1402,8 +1393,7 @@ xfs_attr_fillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->bp) { - blk->disk_blkno = xfs_da_blkno(blk->bp); - xfs_da_buf_done(blk->bp); + blk->disk_blkno = XFS_BUF_ADDR(blk->bp); blk->bp = NULL; } else { blk->disk_blkno = 0; @@ -1426,6 +1416,8 @@ xfs_attr_refillstate(xfs_da_state_t *state) xfs_da_state_blk_t *blk; int level, error; + trace_xfs_attr_refillstate(state->args); + /* * Roll down the "path" in the state structure, storing the on-disk * block number for those buffers in the "path". @@ -1434,7 +1426,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_read_buf(state->args->trans, + error = xfs_da_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1453,7 +1445,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_read_buf(state->args->trans, + error = xfs_da_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1482,6 +1474,8 @@ xfs_attr_node_get(xfs_da_args_t *args) int error, retval; int i; + trace_xfs_attr_node_get(args); + state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; @@ -1513,7 +1507,7 @@ xfs_attr_node_get(xfs_da_args_t *args) * If not in a transaction, we have to release all the buffers. */ for (i = 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp = NULL; } @@ -1540,6 +1534,8 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) int nmap, error, tmp, valuelen, blkcnt, i; xfs_dablk_t lblkno; + trace_xfs_attr_rmtval_get(args); + ASSERT(!(args->flags & ATTR_KERNOVAL)); mp = args->dp->i_mount; @@ -1548,10 +1544,9 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) lblkno = args->rmtblkno; while (valuelen > 0) { nmap = ATTR_RMTVALUE_MAPSIZE; - error = xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL); + error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, map, &nmap, + XFS_BMAPI_ATTRFORK); if (error) return(error); ASSERT(nmap >= 1); @@ -1561,14 +1556,12 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) (map[i].br_startblock != HOLESTARTBLOCK)); dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); - error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, - blkcnt, XBF_LOCK | XBF_DONT_BLOCK, - &bp); + error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, + dblkno, blkcnt, 0, &bp, NULL); if (error) return(error); - tmp = (valuelen < XFS_BUF_SIZE(bp)) - ? valuelen : XFS_BUF_SIZE(bp); + tmp = min_t(int, valuelen, BBTOB(bp->b_length)); xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); xfs_buf_relse(bp); dst += tmp; @@ -1598,6 +1591,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) xfs_dablk_t lblkno; int blkcnt, valuelen, nmap, error, tmp, committed; + trace_xfs_attr_rmtval_set(args); + dp = args->dp; mp = dp->i_mount; src = args->value; @@ -1625,10 +1620,9 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) */ xfs_bmap_init(args->flist, args->firstblock); nmap = 1; - error = xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno, + error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | - XFS_BMAPI_WRITE, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, args->total, &map, &nmap, args->flist); if (!error) { @@ -1646,10 +1640,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && @@ -1674,19 +1666,18 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) lblkno = args->rmtblkno; valuelen = args->valuelen; while (valuelen > 0) { + int buflen; + /* * Try to remember where we decided to put the value. */ xfs_bmap_init(args->flist, args->firstblock); nmap = 1; - error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, 0, &map, &nmap, - NULL); - if (error) { + error = xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) return(error); - } ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && (map.br_startblock != HOLESTARTBLOCK)); @@ -1694,19 +1685,20 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); - bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, - XBF_LOCK | XBF_DONT_BLOCK); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); + if (!bp) + return ENOMEM; - tmp = (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : - XFS_BUF_SIZE(bp); + buflen = BBTOB(bp->b_length); + tmp = min_t(int, valuelen, buflen); xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < XFS_BUF_SIZE(bp)) - xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); - if ((error = xfs_bwrite(mp, bp))) {/* GROT: NOTE: synchronous write */ - return (error); - } + if (tmp < buflen) + xfs_buf_zero(bp, tmp, buflen - tmp); + + error = xfs_bwrite(mp, bp); /* GROT: NOTE: synchronous write */ + xfs_buf_relse(bp); + if (error) + return error; src += tmp; valuelen -= tmp; @@ -1730,6 +1722,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) xfs_dablk_t lblkno; int valuelen, blkcnt, nmap, error, done, committed; + trace_xfs_attr_rmtval_remove(args); + mp = args->dp->i_mount; /* @@ -1742,16 +1736,12 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - xfs_bmap_init(args->flist, args->firstblock); nmap = 1; - error = xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, 0, &map, &nmap, - args->flist); - if (error) { + error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) return(error); - } ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && (map.br_startblock != HOLESTARTBLOCK)); @@ -1764,8 +1754,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) */ bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); if (bp) { - XFS_BUF_STALE(bp); - XFS_BUF_UNDELAYWRITE(bp); + xfs_buf_stale(bp); xfs_buf_relse(bp); bp = NULL; } @@ -1802,10 +1791,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, args->dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, args->dp); - } + if (committed) + xfs_trans_ijoin(args->trans, args->dp, 0); /* * Close out trans and start the next one in the chain. diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index d1f7a20..824c122 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -32,10 +32,11 @@ * Routines used for growing the Btree. */ STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_block, - xfs_dabuf_t **bpp); -STATIC int xfs_attr_leaf_add_work(xfs_dabuf_t *leaf_buffer, xfs_da_args_t *args, - int freemap_index); -STATIC void xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *leaf_buffer); + struct xfs_buf **bpp); +STATIC int xfs_attr_leaf_add_work(struct xfs_buf *leaf_buffer, + xfs_da_args_t *args, int freemap_index); +STATIC void xfs_attr_leaf_compact(struct xfs_da_args *args, + struct xfs_buf *leaf_buffer); STATIC void xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); @@ -56,6 +57,52 @@ STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t *src_leaf, xfs_mount_t *mp); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); +static void +xfs_attr_leaf_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_attr_leaf_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC); + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_attr_leaf_read_verify( + struct xfs_buf *bp) +{ + xfs_attr_leaf_verify(bp); +} + +static void +xfs_attr_leaf_write_verify( + struct xfs_buf *bp) +{ + xfs_attr_leaf_verify(bp); +} + +const struct xfs_buf_ops xfs_attr_leaf_buf_ops = { + .verify_read = xfs_attr_leaf_read_verify, + .verify_write = xfs_attr_leaf_write_verify, +}; + +int +xfs_attr_leaf_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + XFS_ATTR_FORK, &xfs_attr_leaf_buf_ops); +} + /*======================================================================== * Namespace helper routines *========================================================================*/ @@ -78,6 +125,7 @@ xfs_attr_namesp_match(int arg_flags, int ondisk_flags) /* * Query whether the requested number of additional bytes of extended * attribute space will be able to fit inline. + * * Returns zero if not, else the di_forkoff fork offset to be used in the * literal area for attribute data once the new bytes have been added. * @@ -90,7 +138,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) int offset; int minforkoff; /* lower limit on valid forkoff locations */ int maxforkoff; /* upper limit on valid forkoff locations */ - int dsize; + int dsize; xfs_mount_t *mp = dp->i_mount; offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ @@ -104,47 +152,60 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) return (offset >= minforkoff) ? minforkoff : 0; } - if (!(mp->m_flags & XFS_MOUNT_ATTR2)) { - if (bytes <= XFS_IFORK_ASIZE(dp)) - return dp->i_d.di_forkoff; + /* + * If the requested numbers of bytes is smaller or equal to the + * current attribute fork size we can always proceed. + * + * Note that if_bytes in the data fork might actually be larger than + * the current data fork size is due to delalloc extents. In that + * case either the extent count will go down when they are converted + * to real extents, or the delalloc conversion will take care of the + * literal area rebalancing. + */ + if (bytes <= XFS_IFORK_ASIZE(dp)) + return dp->i_d.di_forkoff; + + /* + * For attr2 we can try to move the forkoff if there is space in the + * literal area, but for the old format we are done if there is no + * space in the fixed attribute fork. + */ + if (!(mp->m_flags & XFS_MOUNT_ATTR2)) return 0; - } dsize = dp->i_df.if_bytes; - + switch (dp->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - /* + /* * If there is no attr fork and the data fork is extents, - * determine if creating the default attr fork will result - * in the extents form migrating to btree. If so, the - * minimum offset only needs to be the space required for + * determine if creating the default attr fork will result + * in the extents form migrating to btree. If so, the + * minimum offset only needs to be the space required for * the btree root. - */ + */ if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > xfs_default_attroffset(dp)) dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); break; - case XFS_DINODE_FMT_BTREE: /* - * If have data btree then keep forkoff if we have one, - * otherwise we are adding a new attr, so then we set - * minforkoff to where the btree root can finish so we have + * If we have a data btree then keep forkoff if we have one, + * otherwise we are adding a new attr, so then we set + * minforkoff to where the btree root can finish so we have * plenty of room for attrs */ if (dp->i_d.di_forkoff) { - if (offset < dp->i_d.di_forkoff) + if (offset < dp->i_d.di_forkoff) return 0; - else - return dp->i_d.di_forkoff; - } else - dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + return dp->i_d.di_forkoff; + } + dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); break; } - - /* - * A data fork btree root must have space for at least + + /* + * A data fork btree root must have space for at least * MINDBTPTRS key/ptr pairs if the data fork is small or empty. */ minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); @@ -154,10 +215,10 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) maxforkoff = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS); maxforkoff = maxforkoff >> 3; /* rounded down */ - if (offset >= minforkoff && offset < maxforkoff) - return offset; if (offset >= maxforkoff) return maxforkoff; + if (offset >= minforkoff) + return offset; return 0; } @@ -189,6 +250,8 @@ xfs_attr_shortform_create(xfs_da_args_t *args) xfs_inode_t *dp; xfs_ifork_t *ifp; + trace_xfs_attr_sf_create(args); + dp = args->dp; ASSERT(dp != NULL); ifp = dp->i_afp; @@ -222,13 +285,11 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) xfs_inode_t *dp; xfs_ifork_t *ifp; + trace_xfs_attr_sf_add(args); + dp = args->dp; mp = dp->i_mount; dp->i_d.di_forkoff = forkoff; - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - dp->i_afp->if_ext_max = - XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); ifp = dp->i_afp; ASSERT(ifp->if_flags & XFS_IFINLINE); @@ -280,7 +341,6 @@ xfs_attr_fork_reset( ASSERT(ip->i_d.di_anextents == 0); ASSERT(ip->i_afp == NULL); - ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); } @@ -296,6 +356,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) xfs_mount_t *mp; xfs_inode_t *dp; + trace_xfs_attr_sf_remove(args); + dp = args->dp; mp = dp->i_mount; base = sizeof(xfs_attr_sf_hdr_t); @@ -343,10 +405,6 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) (args->op_flags & XFS_DA_OP_ADDNAME) || !(mp->m_flags & XFS_MOUNT_ATTR2) || dp->i_d.di_format == XFS_DINODE_FMT_BTREE); - dp->i_afp->if_ext_max = - XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); } @@ -368,6 +426,8 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) int i; xfs_ifork_t *ifp; + trace_xfs_attr_sf_lookup(args); + ifp = args->dp->i_afp; ASSERT(ifp->if_flags & XFS_IFINLINE); sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; @@ -436,9 +496,11 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) char *tmpbuffer; int error, i, size; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_ifork_t *ifp; + trace_xfs_attr_sf_to_leaf(args); + dp = args->dp; ifp = dp->i_afp; sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; @@ -504,8 +566,6 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) error = 0; out: - if(bp) - xfs_da_buf_done(bp); kmem_free(tmpbuffer); return(error); } @@ -515,15 +575,17 @@ out: * a shortform attribute list. */ int -xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) +xfs_attr_shortform_allfit( + struct xfs_buf *bp, + struct xfs_inode *dp) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_local_t *name_loc; int bytes, i; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); entry = &leaf->entries[0]; bytes = sizeof(struct xfs_attr_sf_hdr); @@ -552,7 +614,10 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) * Convert a leaf attribute list to shortform attribute list */ int -xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) +xfs_attr_leaf_to_shortform( + struct xfs_buf *bp, + xfs_da_args_t *args, + int forkoff) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; @@ -562,15 +627,17 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) char *tmpbuffer; int error, i; + trace_xfs_attr_leaf_to_sf(args); + dp = args->dp; tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); ASSERT(tmpbuffer != NULL); ASSERT(bp != NULL); - memcpy(tmpbuffer, bp->data, XFS_LBSIZE(dp->i_mount)); + memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); leaf = (xfs_attr_leafblock_t *)tmpbuffer; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); - memset(bp->data, 0, XFS_LBSIZE(dp->i_mount)); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); /* * Clean out the prior contents of the attribute list. @@ -631,30 +698,30 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_da_intnode_t *node; xfs_inode_t *dp; - xfs_dabuf_t *bp1, *bp2; + struct xfs_buf *bp1, *bp2; xfs_dablk_t blkno; int error; + trace_xfs_attr_leaf_to_node(args); + dp = args->dp; bp1 = bp2 = NULL; error = xfs_da_grow_inode(args, &blkno); if (error) goto out; - error = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp1, - XFS_ATTR_FORK); + error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); if (error) goto out; - ASSERT(bp1 != NULL); + bp2 = NULL; error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, XFS_ATTR_FORK); if (error) goto out; - ASSERT(bp2 != NULL); - memcpy(bp2->data, bp1->data, XFS_LBSIZE(dp->i_mount)); - xfs_da_buf_done(bp1); + bp2->b_ops = bp1->b_ops; + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); bp1 = NULL; - xfs_da_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); /* * Set up the new root node. @@ -662,21 +729,17 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); if (error) goto out; - node = bp1->data; - leaf = bp2->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + node = bp1->b_addr; + leaf = bp2->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); /* both on-disk, don't endian-flip twice */ node->btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; node->btree[0].before = cpu_to_be32(blkno); node->hdr.count = cpu_to_be16(1); - xfs_da_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); error = 0; out: - if (bp1) - xfs_da_buf_done(bp1); - if (bp2) - xfs_da_buf_done(bp2); return(error); } @@ -690,22 +753,27 @@ out: * or a leaf in a node attribute list. */ STATIC int -xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t **bpp) +xfs_attr_leaf_create( + xfs_da_args_t *args, + xfs_dablk_t blkno, + struct xfs_buf **bpp) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; + trace_xfs_attr_leaf_create(args); + dp = args->dp; ASSERT(dp != NULL); error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, XFS_ATTR_FORK); if (error) return(error); - ASSERT(bp != NULL); - leaf = bp->data; + bp->b_ops = &xfs_attr_leaf_buf_ops; + leaf = bp->b_addr; memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); hdr = &leaf->hdr; hdr->info.magic = cpu_to_be16(XFS_ATTR_LEAF_MAGIC); @@ -719,7 +787,7 @@ xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t **bpp) hdr->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr->firstused) - sizeof(xfs_attr_leaf_hdr_t)); - xfs_da_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); *bpp = bp; return(0); @@ -735,6 +803,8 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, xfs_dablk_t blkno; int error; + trace_xfs_attr_leaf_split(state->args); + /* * Allocate space for a new leaf node. */ @@ -764,10 +834,13 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * * Insert the "new" entry in the correct block. */ - if (state->inleaf) + if (state->inleaf) { + trace_xfs_attr_leaf_add_old(state->args); error = xfs_attr_leaf_add(oldblk->bp, state->args); - else + } else { + trace_xfs_attr_leaf_add_new(state->args); error = xfs_attr_leaf_add(newblk->bp, state->args); + } /* * Update last hashval in each block since we added the name. @@ -781,15 +854,19 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Add a name to the leaf attribute list structure. */ int -xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_add( + struct xfs_buf *bp, + struct xfs_da_args *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; xfs_attr_leaf_map_t *map; int tablesize, entsize, sum, tmp, i; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_add(args); + + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT((args->index >= 0) && (args->index <= be16_to_cpu(leaf->hdr.count))); hdr = &leaf->hdr; @@ -833,7 +910,7 @@ xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) * Compact the entries to coalesce free space. * This may change the hdr->count via dropping INCOMPLETE entries. */ - xfs_attr_leaf_compact(args->trans, bp); + xfs_attr_leaf_compact(args, bp); /* * After compaction, the block is guaranteed to have only one @@ -850,7 +927,10 @@ xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) * Add a name to a leaf attribute list structure. */ STATIC int -xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) +xfs_attr_leaf_add_work( + struct xfs_buf *bp, + xfs_da_args_t *args, + int mapindex) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; @@ -861,8 +941,10 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) xfs_mount_t *mp; int tmp, i; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_add_work(args); + + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr = &leaf->hdr; ASSERT((mapindex >= 0) && (mapindex < XFS_ATTR_LEAF_MAPSIZE)); ASSERT((args->index >= 0) && (args->index <= be16_to_cpu(hdr->count))); @@ -875,7 +957,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) tmp = be16_to_cpu(hdr->count) - args->index; tmp *= sizeof(xfs_attr_leaf_entry_t); memmove((char *)(entry+1), (char *)entry, tmp); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); } be16_add_cpu(&hdr->count, 1); @@ -907,7 +989,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) args->index2++; } } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); ASSERT((args->index == 0) || (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval))); @@ -915,8 +997,6 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval))); /* - * Copy the attribute name and value into the new space. - * * For "remote" attribute values, simply note that we need to * allocate space for the "remote" value. We can't actually * allocate the extents in this transaction, and we can't decide @@ -941,7 +1021,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) args->rmtblkno = 1; args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); @@ -965,7 +1045,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) } } be16_add_cpu(&hdr->usedbytes, xfs_attr_leaf_entsize(leaf, args->index)); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); return(0); } @@ -974,24 +1054,28 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) * Garbage collect a leaf attribute list block by copying it to a new buffer. */ STATIC void -xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *bp) +xfs_attr_leaf_compact( + struct xfs_da_args *args, + struct xfs_buf *bp) { - xfs_attr_leafblock_t *leaf_s, *leaf_d; - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; - xfs_mount_t *mp; - char *tmpbuffer; + xfs_attr_leafblock_t *leaf_s, *leaf_d; + xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; + struct xfs_trans *trans = args->trans; + struct xfs_mount *mp = trans->t_mountp; + char *tmpbuffer; + + trace_xfs_attr_leaf_compact(args); - mp = trans->t_mountp; tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); ASSERT(tmpbuffer != NULL); - memcpy(tmpbuffer, bp->data, XFS_LBSIZE(mp)); - memset(bp->data, 0, XFS_LBSIZE(mp)); + memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); + memset(bp->b_addr, 0, XFS_LBSIZE(mp)); /* * Copy basic information */ leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; - leaf_d = bp->data; + leaf_d = bp->b_addr; hdr_s = &leaf_s->hdr; hdr_d = &leaf_d->hdr; hdr_d->info = hdr_s->info; /* struct copy */ @@ -1014,7 +1098,7 @@ xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *bp) */ xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, be16_to_cpu(hdr_s->count), mp); - xfs_da_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); kmem_free(tmpbuffer); } @@ -1046,12 +1130,15 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, */ ASSERT(blk1->magic == XFS_ATTR_LEAF_MAGIC); ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC); - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf1 = blk1->bp->b_addr; + leaf2 = blk2->bp->b_addr; + ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf2->hdr.count == 0); args = state->args; + trace_xfs_attr_leaf_rebalance(args); + /* * Check ordering of blocks, reverse if it makes things simpler. * @@ -1063,8 +1150,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, tmp_blk = blk1; blk1 = blk2; blk2 = tmp_blk; - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; + leaf1 = blk1->bp->b_addr; + leaf2 = blk2->bp->b_addr; swap = 1; } hdr1 = &leaf1->hdr; @@ -1101,9 +1188,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, max = be16_to_cpu(hdr2->firstused) - sizeof(xfs_attr_leaf_hdr_t); max -= be16_to_cpu(hdr2->count) * sizeof(xfs_attr_leaf_entry_t); - if (space > max) { - xfs_attr_leaf_compact(args->trans, blk2->bp); - } + if (space > max) + xfs_attr_leaf_compact(args, blk2->bp); /* * Move high entries from leaf1 to low end of leaf2. @@ -1111,13 +1197,14 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_attr_leaf_moveents(leaf1, be16_to_cpu(hdr1->count) - count, leaf2, 0, count, state->mp); - xfs_da_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_da_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); } else if (count > be16_to_cpu(hdr1->count)) { /* * I assert that since all callers pass in an empty * second buffer, this code should never execute. */ + ASSERT(0); /* * Figure the total bytes to be added to the destination leaf. @@ -1133,9 +1220,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, max = be16_to_cpu(hdr1->firstused) - sizeof(xfs_attr_leaf_hdr_t); max -= be16_to_cpu(hdr1->count) * sizeof(xfs_attr_leaf_entry_t); - if (space > max) { - xfs_attr_leaf_compact(args->trans, blk1->bp); - } + if (space > max) + xfs_attr_leaf_compact(args, blk1->bp); /* * Move low entries from leaf2 to high end of leaf1. @@ -1143,8 +1229,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_attr_leaf_moveents(leaf2, 0, leaf1, be16_to_cpu(hdr1->count), count, state->mp); - xfs_da_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_da_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); } /* @@ -1179,10 +1265,24 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, args->index2 = 0; args->blkno2 = blk2->blkno; } else { + /* + * On a double leaf split, the original attr location + * is already stored in blkno2/index2, so don't + * overwrite it overwise we corrupt the tree. + */ blk2->index = blk1->index - be16_to_cpu(leaf1->hdr.count); - args->index = args->index2 = blk2->index; - args->blkno = args->blkno2 = blk2->blkno; + args->index = blk2->index; + args->blkno = blk2->blkno; + if (!state->extravalid) { + /* + * set the new attr location to match the old + * one and let the higher level split code + * decide where in the leaf to place it. + */ + args->index2 = blk2->index; + args->blkno2 = blk2->blkno; + } } } else { ASSERT(state->inleaf == 1); @@ -1213,8 +1313,8 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, /* * Set up environment. */ - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; + leaf1 = blk1->bp->b_addr; + leaf2 = blk2->bp->b_addr; hdr1 = &leaf1->hdr; hdr2 = &leaf2->hdr; foundit = 0; @@ -1316,7 +1416,9 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) xfs_da_blkinfo_t *info; int count, bytes, forward, error, retval, i; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; + + trace_xfs_attr_leaf_toosmall(state->args); /* * Check for the degenerate case of the block being over 50% full. @@ -1324,8 +1426,8 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * to coalesce with a sibling. */ blk = &state->path.blk[ state->path.active-1 ]; - info = blk->bp->data; - ASSERT(be16_to_cpu(info->magic) == XFS_ATTR_LEAF_MAGIC); + info = blk->bp->b_addr; + ASSERT(info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); leaf = (xfs_attr_leafblock_t *)info; count = be16_to_cpu(leaf->hdr.count); bytes = sizeof(xfs_attr_leaf_hdr_t) + @@ -1377,23 +1479,21 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) blkno = be32_to_cpu(info->back); if (blkno == 0) continue; - error = xfs_da_read_buf(state->args->trans, state->args->dp, - blkno, -1, &bp, XFS_ATTR_FORK); + error = xfs_attr_leaf_read(state->args->trans, state->args->dp, + blkno, -1, &bp); if (error) return(error); - ASSERT(bp != NULL); leaf = (xfs_attr_leafblock_t *)info; count = be16_to_cpu(leaf->hdr.count); bytes = state->blocksize - (state->blocksize>>2); bytes -= be16_to_cpu(leaf->hdr.usedbytes); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; count += be16_to_cpu(leaf->hdr.count); bytes -= be16_to_cpu(leaf->hdr.usedbytes); bytes -= count * sizeof(xfs_attr_leaf_entry_t); bytes -= sizeof(xfs_attr_leaf_hdr_t); - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); if (bytes >= 0) break; /* fits with at least 25% to spare */ } @@ -1431,7 +1531,9 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * If two leaves are 37% full, when combined they will leave 25% free. */ int -xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_remove( + struct xfs_buf *bp, + xfs_da_args_t *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; @@ -1441,8 +1543,10 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) int tablesize, tmp, i; xfs_mount_t *mp; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_remove(args); + + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr = &leaf->hdr; mp = args->trans->t_mountp; ASSERT((be16_to_cpu(hdr->count) > 0) @@ -1534,7 +1638,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) */ memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); be16_add_cpu(&hdr->usedbytes, -entsize); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), entsize)); @@ -1542,7 +1646,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) * sizeof(xfs_attr_leaf_entry_t); memmove((char *)entry, (char *)(entry+1), tmp); be16_add_cpu(&hdr->count, -1); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); entry = &leaf->entries[be16_to_cpu(hdr->count)]; memset((char *)entry, 0, sizeof(xfs_attr_leaf_entry_t)); @@ -1572,7 +1676,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) } else { hdr->holes = 1; /* mark as needing compaction */ } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); /* @@ -1597,16 +1701,18 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_mount_t *mp; char *tmpbuffer; + trace_xfs_attr_leaf_unbalance(state->args); + /* * Set up environment. */ mp = state->mp; ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC); ASSERT(save_blk->magic == XFS_ATTR_LEAF_MAGIC); - drop_leaf = drop_blk->bp->data; - save_leaf = save_blk->bp->data; - ASSERT(be16_to_cpu(drop_leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(save_leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + drop_leaf = drop_blk->bp->b_addr; + save_leaf = save_blk->bp->b_addr; + ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); drop_hdr = &drop_leaf->hdr; save_hdr = &save_leaf->hdr; @@ -1669,7 +1775,7 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, kmem_free(tmpbuffer); } - xfs_da_log_buf(state->args->trans, save_blk->bp, 0, + xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->blocksize - 1); /* @@ -1697,7 +1803,9 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * Don't change the args->value unless we find the attribute. */ int -xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_lookup_int( + struct xfs_buf *bp, + xfs_da_args_t *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; @@ -1706,8 +1814,10 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) int probe, span; xfs_dahash_t hashval; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_lookup(args); + + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) < (XFS_LBSIZE(args->dp->i_mount)/8)); @@ -1802,7 +1912,9 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) * list structure. */ int -xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_getvalue( + struct xfs_buf *bp, + xfs_da_args_t *args) { int valuelen; xfs_attr_leafblock_t *leaf; @@ -1810,8 +1922,8 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) xfs_attr_leaf_name_local_t *name_loc; xfs_attr_leaf_name_remote_t *name_rmt; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) < (XFS_LBSIZE(args->dp->i_mount)/8)); ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); @@ -1879,8 +1991,8 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, /* * Set up environment. */ - ASSERT(be16_to_cpu(leaf_s->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf_d->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + ASSERT(leaf_s->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf_d->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr_s = &leaf_s->hdr; hdr_d = &leaf_d->hdr; ASSERT((be16_to_cpu(hdr_s->count) > 0) && @@ -2008,14 +2120,16 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, * Return 0 unless leaf2 should go before leaf1. */ int -xfs_attr_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabuf_t *leaf2_bp) +xfs_attr_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp) { xfs_attr_leafblock_t *leaf1, *leaf2; - leaf1 = leaf1_bp->data; - leaf2 = leaf2_bp->data; - ASSERT((be16_to_cpu(leaf1->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC) && - (be16_to_cpu(leaf2->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC)); + leaf1 = leaf1_bp->b_addr; + leaf2 = leaf2_bp->b_addr; + ASSERT((leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) && + (leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC))); if ((be16_to_cpu(leaf1->hdr.count) > 0) && (be16_to_cpu(leaf2->hdr.count) > 0) && ((be32_to_cpu(leaf2->entries[0].hashval) < @@ -2033,12 +2147,14 @@ xfs_attr_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabuf_t *leaf2_bp) * Pick up the last hashvalue from a leaf block. */ xfs_dahash_t -xfs_attr_leaf_lasthash(xfs_dabuf_t *bp, int *count) +xfs_attr_leaf_lasthash( + struct xfs_buf *bp, + int *count) { xfs_attr_leafblock_t *leaf; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); if (count) *count = be16_to_cpu(leaf->hdr.count); if (!leaf->hdr.count) @@ -2057,7 +2173,7 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) xfs_attr_leaf_name_remote_t *name_rmt; int size; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { name_loc = xfs_attr_leaf_name_local(leaf, index); size = xfs_attr_leaf_entsize_local(name_loc->namelen, @@ -2107,7 +2223,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; #ifdef DEBUG xfs_attr_leaf_name_local_t *name_loc; @@ -2115,18 +2231,15 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) char *name; #endif /* DEBUG */ + trace_xfs_attr_leaf_clearflag(args); /* * Set up the operation. */ - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) return(error); - } - ASSERT(bp != NULL); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); ASSERT(args->index >= 0); entry = &leaf->entries[ args->index ]; @@ -2148,7 +2261,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) #endif /* DEBUG */ entry->flags &= ~XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if (args->rmtblkno) { @@ -2156,10 +2269,9 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp); /* * Commit the flag value change and start the next trans in series. @@ -2176,37 +2288,34 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; + trace_xfs_attr_leaf_setflag(args); + /* * Set up the operation. */ - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) return(error); - } - ASSERT(bp != NULL); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf = bp->b_addr; ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); ASSERT(args->index >= 0); entry = &leaf->entries[ args->index ]; ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0); entry->flags |= XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp); /* * Commit the flag value change and start the next trans in series. @@ -2227,7 +2336,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf1, *leaf2; xfs_attr_leaf_entry_t *entry1, *entry2; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp1, *bp2; + struct xfs_buf *bp1, *bp2; int error; #ifdef DEBUG xfs_attr_leaf_name_local_t *name_loc; @@ -2235,38 +2344,33 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) char *name1, *name2; #endif /* DEBUG */ + trace_xfs_attr_leaf_flipflags(args); + /* * Read the block containing the "old" attr */ - error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp1, - XFS_ATTR_FORK); - if (error) { - return(error); - } - ASSERT(bp1 != NULL); + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); + if (error) + return error; /* * Read the block containing the "new" attr, if it is different */ if (args->blkno2 != args->blkno) { - error = xfs_da_read_buf(args->trans, args->dp, args->blkno2, - -1, &bp2, XFS_ATTR_FORK); - if (error) { - return(error); - } - ASSERT(bp2 != NULL); + error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno2, + -1, &bp2); + if (error) + return error; } else { bp2 = bp1; } - leaf1 = bp1->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf1 = bp1->b_addr; ASSERT(args->index < be16_to_cpu(leaf1->hdr.count)); ASSERT(args->index >= 0); entry1 = &leaf1->entries[ args->index ]; - leaf2 = bp2->data; - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); + leaf2 = bp2->b_addr; ASSERT(args->index2 < be16_to_cpu(leaf2->hdr.count)); ASSERT(args->index2 >= 0); entry2 = &leaf2->entries[ args->index2 ]; @@ -2299,30 +2403,27 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) ASSERT((entry2->flags & XFS_ATTR_INCOMPLETE) == 0); entry1->flags &= ~XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp1, + xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); - xfs_da_log_buf(args->trans, bp1, + xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); } entry2->flags |= XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp2, + xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; - xfs_da_log_buf(args->trans, bp2, + xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp1); - if (bp1 != bp2) - xfs_da_buf_done(bp2); /* * Commit the flag value change and start the next trans in series. diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5a626b0..b328a0b 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -18,10 +18,6 @@ #include -#ifdef DEBUG -STATIC void -xfs_bmap_check_leaf_extents(xfs_btree_cur_t *cur, xfs_inode_t *ip, int whichfork); -#endif kmem_zone_t *xfs_bmap_free_item_zone; @@ -29,6 +25,16 @@ kmem_zone_t *xfs_bmap_free_item_zone; * Prototypes for internal bmap routines. */ +#ifdef DEBUG +STATIC void +xfs_bmap_check_leaf_extents( + struct xfs_btree_cur *cur, + struct xfs_inode *ip, + int whichfork); +#else +#define xfs_bmap_check_leaf_extents(cur, ip, whichfork) do { } while (0) +#endif + /* * Called from xfs_bmap_add_attrfork to handle extents format files. @@ -53,75 +59,6 @@ xfs_bmap_add_attrfork_local( int *flags); /* inode logging flags */ /* - * Called by xfs_bmapi to update file extent records and the btree - * after allocating space (or doing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_add_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a delayed - * allocation to a real allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_delay_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_filblks_t *dnew, /* new delayed-alloc indirect blocks */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a delayed allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_hole_delay( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp,/* inode logging flags */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a real allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_hole_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int whichfork); /* data or attr fork */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting an unwritten - * allocation to a real allocation or vice versa. - */ -STATIC int /* error */ -xfs_bmap_add_extent_unwritten_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp); /* inode logging flags */ - -/* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. * It figures out where to ask the underlying allocator to put the new extent. */ @@ -144,22 +81,6 @@ xfs_bmap_btree_to_extents( int whichfork); /* data or attr fork */ /* - * Called by xfs_bmapi to update file extent records and the btree - * after removing space (or undoing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_del_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_trans_t *tp, /* current trans pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp,/* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd); /* OK to allocate reserved blocks */ - -/* * Convert an extents-format file into a btree-format file. * The new file will have a root block (in the inode) and a single child block. */ @@ -189,19 +110,6 @@ xfs_bmap_local_to_extents( int whichfork); /* data or attr fork */ /* - * Check the last inode extent to determine whether this allocation will result - * in blocks being allocated at the end of the file. When we allocate new data - * blocks at the end of the file which do not start at the previous data block, - * we will try to align the new blocks at stripe unit boundaries. - */ -STATIC int /* error */ -xfs_bmap_isaeof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t off, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - char *aeof); /* return value */ - -/* * Compute the worst-case number of indirect blocks that will be used * for ip's delayed extent of length "len". */ @@ -283,7 +191,27 @@ xfs_bmbt_lookup_ge( } /* -* Update the record referred to by cur to the value given + * Check if the inode needs to be converted to btree format. + */ +static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork) +{ + return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_NEXTENTS(ip, whichfork) > + XFS_IFORK_MAXEXT(ip, whichfork); +} + +/* + * Check if the inode should be converted to extent format. + */ +static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichfork) +{ + return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && + XFS_IFORK_NEXTENTS(ip, whichfork) <= + XFS_IFORK_MAXEXT(ip, whichfork); +} + +/* + * Update the record referred to by cur to the value given * by [off, bno, len, state]. * This either works (return 0) or gets an EFSCORRUPTED error. */ @@ -388,7 +316,7 @@ xfs_bmap_add_attrfork_local( if (ip->i_df.if_bytes <= XFS_IFORK_DSIZE(ip)) return 0; - if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { + if (S_ISDIR(ip->i_d.di_mode)) { mp = ip->i_mount; memset(&dargs, 0, sizeof(dargs)); dargs.dp = ip; @@ -405,188 +333,13 @@ xfs_bmap_add_attrfork_local( } /* - * Called by xfs_bmapi to update file extent records and the btree - * after allocating space (or doing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_add_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd) /* OK to use reserved data blocks */ -{ - xfs_btree_cur_t *cur; /* btree cursor or null */ - xfs_filblks_t da_new; /* new count del alloc blocks used */ - xfs_filblks_t da_old; /* old count del alloc blocks used */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork ptr */ - int logflags; /* returned value */ - xfs_extnum_t nextents; /* number of extents in file now */ - - XFS_STATS_INC(xs_add_exlist); - cur = *curp; - ifp = XFS_IFORK_PTR(ip, whichfork); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(idx <= nextents); - da_old = da_new = 0; - error = 0; - /* - * This is the first extent added to a new/empty file. - * Special case this one, so other routines get to assume there are - * already extents in the list. - */ - if (nextents == 0) { - xfs_iext_insert(ip, 0, 1, new, - whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); - - ASSERT(cur == NULL); - ifp->if_lastex = 0; - if (!isnullstartblock(new->br_startblock)) { - XFS_IFORK_NEXT_SET(ip, whichfork, 1); - logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); - } else - logflags = 0; - } - /* - * Any kind of new delayed allocation goes here. - */ - else if (isnullstartblock(new->br_startblock)) { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) == 0); - if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, - &logflags, rsvd))) - goto done; - } - /* - * Real allocation off the end of the file. - */ - else if (idx == nextents) { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) == 0); - if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, whichfork))) - goto done; - } else { - xfs_bmbt_irec_t prev; /* old extent at offset idx */ - - /* - * Get the record referred to by idx. - */ - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx), &prev); - /* - * If it's a real allocation record, and the new allocation ends - * after the start of the referred to record, then we're filling - * in a delayed or unwritten allocation with a real one, or - * converting real back to unwritten. - */ - if (!isnullstartblock(new->br_startblock) && - new->br_startoff + new->br_blockcount > prev.br_startoff) { - if (prev.br_state != XFS_EXT_UNWRITTEN && - isnullstartblock(prev.br_startblock)) { - da_old = startblockval(prev.br_startblock); - if (cur) - ASSERT(cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL); - if ((error = xfs_bmap_add_extent_delay_real(ip, - idx, &cur, new, &da_new, first, flist, - &logflags, rsvd))) - goto done; - } else if (new->br_state == XFS_EXT_NORM) { - ASSERT(new->br_state == XFS_EXT_NORM); - if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) - goto done; - } else { - ASSERT(new->br_state == XFS_EXT_UNWRITTEN); - if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) - goto done; - } - ASSERT(*curp == cur || *curp == NULL); - } - /* - * Otherwise we're filling in a hole with an allocation. - */ - else { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) == 0); - if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, whichfork))) - goto done; - } - } - - ASSERT(*curp == cur || *curp == NULL); - /* - * Convert to a btree if necessary. - */ - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max) { - int tmp_logflags; /* partial log flag return val */ - - ASSERT(cur == NULL); - error = xfs_bmap_extents_to_btree(ip->i_transp, ip, first, - flist, &cur, da_old > 0, &tmp_logflags, whichfork); - logflags |= tmp_logflags; - if (error) - goto done; - } - /* - * Adjust for changes in reserved delayed indirect blocks. - * Nothing to do for disk quotas here. - */ - if (da_old || da_new) { - xfs_filblks_t nblks; - - nblks = da_new; - if (cur) - nblks += cur->bc_private.b.allocated; - ASSERT(nblks <= da_old); - if (nblks < da_old) - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - nblks), rsvd); - } - /* - * Clear out the allocated field, done with it now in any case. - */ - if (cur) { - cur->bc_private.b.allocated = 0; - *curp = cur; - } -done: -#ifdef DEBUG - if (!error) - xfs_bmap_check_leaf_extents(*curp, ip, whichfork); -#endif - *logflagsp = logflags; - return error; -} - -/* - * Called by xfs_bmap_add_extent to handle cases converting a delayed - * allocation to a real allocation. + * Convert a delayed allocation to a real allocation. */ STATIC int /* error */ xfs_bmap_add_extent_delay_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_filblks_t *dnew, /* new delayed-alloc indirect blocks */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int rsvd) /* OK to use reserved data block allocation */ + struct xfs_bmalloca *bma) { - xfs_btree_cur_t *cur; /* btree cursor */ + struct xfs_bmbt_irec *new = &bma->got; int diff; /* temp value */ xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ int error; /* error return value */ @@ -597,10 +350,22 @@ xfs_bmap_add_extent_delay_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp=0; /* value for dnew calculations */ - xfs_filblks_t temp2=0;/* value for dnew calculations */ + xfs_filblks_t da_new; /* new count del alloc blocks used */ + xfs_filblks_t da_old; /* old count del alloc blocks used */ + xfs_filblks_t temp=0; /* value for da_new calculations */ + xfs_filblks_t temp2=0;/* value for da_new calculations */ int tmp_rval; /* partial logging flags */ + ifp = XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); + + ASSERT(bma->idx >= 0); + ASSERT(bma->idx <= ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + (bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + + XFS_STATS_INC(xs_add_exlist); + #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] @@ -608,14 +373,15 @@ xfs_bmap_add_extent_delay_real( /* * Set up a bunch of variables to make the tests simpler. */ - cur = *curp; - ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep = xfs_iext_get_ext(ifp, idx); + ep = xfs_iext_get_ext(ifp, bma->idx); xfs_bmbt_get_all(ep, &PREV); new_endoff = new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <= new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); + da_old = startblockval(PREV.br_startblock); + da_new = 0; + /* * Set flags determining what part of the previous delayed allocation * extent is being replaced by a real allocation. @@ -629,9 +395,9 @@ xfs_bmap_add_extent_delay_real( * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (idx > 0) { + if (bma->idx > 0) { state |= BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &LEFT); if (isnullstartblock(LEFT.br_startblock)) state |= BMAP_LEFT_DELAY; @@ -649,9 +415,9 @@ xfs_bmap_add_extent_delay_real( * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + if (bma->idx < bma->ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { state |= BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx + 1), &RIGHT); if (isnullstartblock(RIGHT.br_startblock)) state |= BMAP_RIGHT_DELAY; @@ -682,38 +448,41 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left and right neighbors are both contiguous with new. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + bma->idx--; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_iext_remove(ip, idx, 2, state); - ip->i_df.if_lastex = idx - 1; - ip->i_d.di_nextents--; - if (cur == NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); + bma->ip->i_d.di_nextents--; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_btree_delete(cur, &i))) + error = xfs_btree_delete(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_btree_decrement(cur, 0, &i))) + error = xfs_btree_decrement(bma->cur, 0, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, + error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + PREV.br_blockcount + - RIGHT.br_blockcount, LEFT.br_state))) + RIGHT.br_blockcount, LEFT.br_state); + if (error) goto done; } - *dnew = 0; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -721,29 +490,31 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left neighbor is contiguous, the right is not. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + bma->idx--; + + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx - 1; - xfs_iext_remove(ip, idx, 1, state); - if (cur == NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, LEFT.br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, + error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + - PREV.br_blockcount, LEFT.br_state))) + PREV.br_blockcount, LEFT.br_state); + if (error) goto done; } - *dnew = 0; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -751,30 +522,30 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The right neighbor is contiguous, the left is not. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx; - xfs_iext_remove(ip, idx + 1, 1, state); - if (cur == NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, PREV.br_startoff, + error = xfs_bmbt_update(bma->cur, PREV.br_startoff, new->br_startblock, PREV.br_blockcount + - RIGHT.br_blockcount, PREV.br_state))) + RIGHT.br_blockcount, PREV.br_state); + if (error) goto done; } - *dnew = 0; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -783,27 +554,27 @@ xfs_bmap_add_extent_delay_real( * Neither the left nor right neighbors are contiguous with * the new one. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx; - ip->i_d.di_nextents++; - if (cur == NULL) + bma->ip->i_d.di_nextents++; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 0, done); - cur->bc_rec.b.br_state = XFS_EXT_NORM; - if ((error = xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; + error = xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - *dnew = 0; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -811,38 +582,40 @@ xfs_bmap_add_extent_delay_real( * Filling in the first part of a previous delayed allocation. * The left neighbor is contiguous. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + trace_xfs_bmap_pre_update(bma->ip, bma->idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx - 1, state, _THIS_IP_); temp = PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - ip->i_df.if_lastex = idx - 1; - if (cur == NULL) + if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, LEFT.br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, + error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + new->br_blockcount, - LEFT.br_state))) + LEFT.br_state); + if (error) goto done; } - temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew = temp; + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx--; break; case BMAP_LEFT_FILLING: @@ -850,43 +623,43 @@ xfs_bmap_add_extent_delay_real( * Filling in the first part of a previous delayed allocation. * The left neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, new_endoff); temp = PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex = idx; - ip->i_d.di_nextents++; - if (cur == NULL) + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 0, done); - cur->bc_rec.b.br_state = XFS_EXT_NORM; - if ((error = xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; + error = xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error = xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, + &bma->cur, 1, &tmp_rval, XFS_DATA_FORK); rval |= tmp_rval; if (error) goto done; } - temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - ep = xfs_iext_get_ext(ifp, idx + 1); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); - *dnew = temp; + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep = xfs_iext_get_ext(ifp, bma->idx + 1); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); break; case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -895,36 +668,39 @@ xfs_bmap_add_extent_delay_real( * The right neighbor is contiguous with the new allocation. */ temp = PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, RIGHT.br_state); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); - ip->i_df.if_lastex = idx + 1; - if (cur == NULL) + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); + if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, new->br_startoff, + error = xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, - RIGHT.br_state))) + RIGHT.br_state); + if (error) goto done; } - temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + + da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew = temp; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; break; case BMAP_RIGHT_FILLING: @@ -933,41 +709,43 @@ xfs_bmap_add_extent_delay_real( * The right neighbor is not contiguous. */ temp = PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(ip, idx + 1, 1, new, state); - ip->i_df.if_lastex = idx + 1; - ip->i_d.di_nextents++; - if (cur == NULL) + xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 0, done); - cur->bc_rec.b.br_state = XFS_EXT_NORM; - if ((error = xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; + error = xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error = xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, 1, + &tmp_rval, XFS_DATA_FORK); rval |= tmp_rval; if (error) goto done; } - temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew = temp; + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep = xfs_iext_get_ext(ifp, bma->idx); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; break; case 0: @@ -975,82 +753,83 @@ xfs_bmap_add_extent_delay_real( * Filling in the middle part of a previous delayed allocation. * Contiguity is impossible here. * This case is avoided almost all the time. + * + * We start with a delayed allocation: + * + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ + * PREV @ idx + * + * and we are allocating: + * +rrrrrrrrrrrrrrrrr+ + * new + * + * and we set it up for insertion as: + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ + * new + * PREV @ idx LEFT RIGHT + * inserted at idx + 1 */ temp = new->br_startoff - PREV.br_startoff; - trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - r[0] = *new; - r[1].br_state = PREV.br_state; - r[1].br_startblock = 0; - r[1].br_startoff = new_endoff; temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; - r[1].br_blockcount = temp2; - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); - ip->i_df.if_lastex = idx + 1; - ip->i_d.di_nextents++; - if (cur == NULL) + trace_xfs_bmap_pre_update(bma->ip, bma->idx, 0, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ + LEFT = *new; + RIGHT.br_state = PREV.br_state; + RIGHT.br_startblock = nullstartblock( + (int)xfs_bmap_worst_indlen(bma->ip, temp2)); + RIGHT.br_startoff = new_endoff; + RIGHT.br_blockcount = temp2; + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ + xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); + bma->ip->i_d.di_nextents++; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, + error = xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 0, done); - cur->bc_rec.b.br_state = XFS_EXT_NORM; - if ((error = xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; + error = xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error = xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 1, &tmp_rval, XFS_DATA_FORK); rval |= tmp_rval; if (error) goto done; } - temp = xfs_bmap_worst_indlen(ip, temp); - temp2 = xfs_bmap_worst_indlen(ip, temp2); + temp = xfs_bmap_worst_indlen(bma->ip, temp); + temp2 = xfs_bmap_worst_indlen(bma->ip, temp2); diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - if (diff > 0 && - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) { - /* - * Ick gross gag me with a spoon. - */ - ASSERT(0); /* want to see if this ever happens! */ - while (diff > 0) { - if (temp) { - temp--; - diff--; - if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) - break; - } - if (temp2) { - temp2--; - diff--; - if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) - break; - } - } + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + if (diff > 0) { + error = xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), 0); + ASSERT(!error); + if (error) + goto done; } - ep = xfs_iext_get_ext(ifp, idx); + + ep = xfs_iext_get_ext(ifp, bma->idx); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 2, state, _THIS_IP_); + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, bma->idx + 2), nullstartblock((int)temp2)); - trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); - *dnew = temp + temp2; + trace_xfs_bmap_post_update(bma->ip, bma->idx + 2, state, _THIS_IP_); + + bma->idx++; + da_new = temp + temp2; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1065,9 +844,39 @@ xfs_bmap_add_extent_delay_real( */ ASSERT(0); } - *curp = cur; + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(bma->cur == NULL); + error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + da_old > 0, &tmp_logflags, XFS_DATA_FORK); + bma->logflags |= tmp_logflags; + if (error) + goto done; + } + + /* adjust for changes in reserved delayed indirect blocks */ + if (da_old || da_new) { + temp = da_new; + if (bma->cur) + temp += bma->cur->bc_private.b.allocated; + ASSERT(temp <= da_old); + if (temp < da_old) + xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + (int64_t)(da_old - temp), 0); + } + + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated = 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, XFS_DATA_FORK); done: - *logflagsp = rval; + bma->logflags |= rval; return error; #undef LEFT #undef RIGHT @@ -1075,15 +884,17 @@ done: } /* - * Called by xfs_bmap_add_extent to handle cases converting an unwritten - * allocation to a real allocation or vice versa. + * Convert an unwritten allocation to a real allocation or vice versa. */ STATIC int /* error */ xfs_bmap_add_extent_unwritten_real( + struct xfs_trans *tp, xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ + xfs_extnum_t *idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ + xfs_fsblock_t *first, /* pointer to firstblock variable */ + xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp) /* inode logging flags */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -1099,16 +910,26 @@ xfs_bmap_add_extent_unwritten_real( int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ + *logflagsp = 0; + + cur = *curp; + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + + ASSERT(*idx >= 0); + ASSERT(*idx <= ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + + XFS_STATS_INC(xs_add_exlist); + #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] + /* * Set up a bunch of variables to make the tests simpler. */ error = 0; - cur = *curp; - ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep = xfs_iext_get_ext(ifp, idx); + ep = xfs_iext_get_ext(ifp, *idx); xfs_bmbt_get_all(ep, &PREV); newext = new->br_state; oldext = (newext == XFS_EXT_UNWRITTEN) ? @@ -1131,9 +952,9 @@ xfs_bmap_add_extent_unwritten_real( * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (idx > 0) { + if (*idx > 0) { state |= BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &LEFT); if (isnullstartblock(LEFT.br_startblock)) state |= BMAP_LEFT_DELAY; @@ -1151,9 +972,9 @@ xfs_bmap_add_extent_unwritten_real( * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { state |= BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx + 1), &RIGHT); if (isnullstartblock(RIGHT.br_startblock)) state |= BMAP_RIGHT_DELAY; } @@ -1182,14 +1003,15 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The left and right neighbors are both contiguous with new. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - xfs_iext_remove(ip, idx, 2, state); - ip->i_df.if_lastex = idx - 1; + xfs_iext_remove(ip, *idx + 1, 2, state); ip->i_d.di_nextents -= 2; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1225,13 +1047,14 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx - 1; - xfs_iext_remove(ip, idx, 1, state); + xfs_iext_remove(ip, *idx + 1, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1261,13 +1084,12 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The right neighbor is contiguous, the left is not. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx; - xfs_iext_remove(ip, idx + 1, 1, state); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + xfs_iext_remove(ip, *idx + 1, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1298,11 +1120,10 @@ xfs_bmap_add_extent_unwritten_real( * Neither the left nor right neighbors are contiguous with * the new one. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx; if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -1324,21 +1145,22 @@ xfs_bmap_add_extent_unwritten_real( * Setting the first part of a previous oldext extent to newext. * The left neighbor is contiguous. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + trace_xfs_bmap_pre_update(ip, *idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx - 1, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + --*idx; - ip->i_df.if_lastex = idx - 1; if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -1356,10 +1178,11 @@ xfs_bmap_add_extent_unwritten_real( goto done; if ((error = xfs_btree_decrement(cur, 0, &i))) goto done; - if (xfs_bmbt_update(cur, LEFT.br_startoff, + error = xfs_bmbt_update(cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + new->br_blockcount, - LEFT.br_state)) + LEFT.br_state); + if (error) goto done; } break; @@ -1369,17 +1192,16 @@ xfs_bmap_add_extent_unwritten_real( * Setting the first part of a previous oldext extent to newext. * The left neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); ASSERT(ep && xfs_bmbt_get_state(ep) == oldext); xfs_bmbt_set_startoff(ep, new_endoff); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex = idx; + xfs_iext_insert(ip, *idx, 1, new, state); ip->i_d.di_nextents++; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1408,17 +1230,19 @@ xfs_bmap_add_extent_unwritten_real( * Setting the last part of a previous oldext extent to newext. * The right neighbor is contiguous with the new allocation. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + ++*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, newext); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - ip->i_df.if_lastex = idx + 1; if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -1448,13 +1272,14 @@ xfs_bmap_add_extent_unwritten_real( * Setting the last part of a previous oldext extent to newext. * The right neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + ++*idx; + xfs_iext_insert(ip, *idx, 1, new, state); - xfs_iext_insert(ip, idx + 1, 1, new, state); - ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1488,10 +1313,10 @@ xfs_bmap_add_extent_unwritten_real( * newext. Contiguity is impossible here. * One extent becomes three extents. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, new->br_startoff - PREV.br_startoff); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); r[0] = *new; r[1].br_startoff = new_endoff; @@ -1499,8 +1324,10 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_startblock = new->br_startblock + new->br_blockcount; r[1].br_state = oldext; - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); - ip->i_df.if_lastex = idx + 1; + + ++*idx; + xfs_iext_insert(ip, *idx, 2, &r[0], state); + ip->i_d.di_nextents += 2; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1553,9 +1380,28 @@ xfs_bmap_add_extent_unwritten_real( */ ASSERT(0); } - *curp = cur; + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, first, flist, &cur, + 0, &tmp_logflags, XFS_DATA_FORK); + *logflagsp |= tmp_logflags; + if (error) + goto done; + } + + /* clear out the allocated field, done with it now in any case. */ + if (cur) { + cur->bc_private.b.allocated = 0; + *curp = cur; + } + + xfs_bmap_check_leaf_extents(*curp, ip, XFS_DATA_FORK); done: - *logflagsp = rval; + *logflagsp |= rval; return error; #undef LEFT #undef RIGHT @@ -1563,19 +1409,14 @@ done: } /* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a delayed allocation. + * Convert a hole to a delayed allocation. */ -/*ARGSUSED*/ -STATIC int /* error */ +STATIC void xfs_bmap_add_extent_hole_delay( xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int rsvd) /* OK to allocate reserved blocks */ + xfs_extnum_t *idx, /* extent number to update/insert */ + xfs_bmbt_irec_t *new) /* new data to add to file extents */ { - xfs_bmbt_rec_host_t *ep; /* extent record for idx */ xfs_ifork_t *ifp; /* inode fork pointer */ xfs_bmbt_irec_t left; /* left neighbor extent entry */ xfs_filblks_t newlen=0; /* new indirect size */ @@ -1585,16 +1426,15 @@ xfs_bmap_add_extent_hole_delay( xfs_filblks_t temp=0; /* temp for indirect calculations */ ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep = xfs_iext_get_ext(ifp, idx); state = 0; ASSERT(isnullstartblock(new->br_startblock)); /* * Check and set flags if this segment has a left neighbor */ - if (idx > 0) { + if (*idx > 0) { state |= BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &left); if (isnullstartblock(left.br_startblock)) state |= BMAP_LEFT_DELAY; @@ -1604,9 +1444,9 @@ xfs_bmap_add_extent_hole_delay( * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |= BMAP_RIGHT_VALID; - xfs_bmbt_get_all(ep, &right); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); if (isnullstartblock(right.br_startblock)) state |= BMAP_RIGHT_DELAY; @@ -1639,21 +1479,21 @@ xfs_bmap_add_extent_hole_delay( * on the left and on the right. * Merge all three into a single extent record. */ + --*idx; temp = left.br_blockcount + new->br_blockcount + right.br_blockcount; - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); oldlen = startblockval(left.br_startblock) + startblockval(new->br_startblock) + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - xfs_iext_remove(ip, idx, 1, state); - ip->i_df.if_lastex = idx - 1; + xfs_iext_remove(ip, *idx + 1, 1, state); break; case BMAP_LEFT_CONTIG: @@ -1662,17 +1502,17 @@ xfs_bmap_add_extent_hole_delay( * on the left. * Merge the new allocation with the left neighbor. */ + --*idx; temp = left.br_blockcount + new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); oldlen = startblockval(left.br_startblock) + startblockval(new->br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); - - ip->i_df.if_lastex = idx - 1; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); break; case BMAP_RIGHT_CONTIG: @@ -1681,16 +1521,15 @@ xfs_bmap_add_extent_hole_delay( * on the right. * Merge the new allocation with the right neighbor. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); temp = new->br_blockcount + right.br_blockcount; oldlen = startblockval(new->br_startblock) + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_allf(ep, new->br_startoff, + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), + new->br_startoff, nullstartblock((int)newlen), temp, right.br_state); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - - ip->i_df.if_lastex = idx; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); break; case 0: @@ -1700,36 +1539,28 @@ xfs_bmap_add_extent_hole_delay( * Insert a new entry. */ oldlen = newlen = 0; - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex = idx; + xfs_iext_insert(ip, *idx, 1, new, state); break; } if (oldlen != newlen) { ASSERT(oldlen > newlen); xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), rsvd); + (int64_t)(oldlen - newlen), 0); /* * Nothing to do for disk quota accounting here. */ } - *logflagsp = 0; - return 0; } /* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a real allocation. + * Convert a hole to a real allocation. */ STATIC int /* error */ xfs_bmap_add_extent_hole_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ + struct xfs_bmalloca *bma, + int whichfork) { - xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ + struct xfs_bmbt_irec *new = &bma->got; int error; /* error return value */ int i; /* temp state */ xfs_ifork_t *ifp; /* inode fork pointer */ @@ -1738,20 +1569,26 @@ xfs_bmap_add_extent_hole_real( int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ - ifp = XFS_IFORK_PTR(ip, whichfork); - ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); - ep = xfs_iext_get_ext(ifp, idx); - state = 0; + ifp = XFS_IFORK_PTR(bma->ip, whichfork); + + ASSERT(bma->idx >= 0); + ASSERT(bma->idx <= ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + + XFS_STATS_INC(xs_add_exlist); + state = 0; if (whichfork == XFS_ATTR_FORK) state |= BMAP_ATTRFORK; /* * Check and set flags if this segment has a left neighbor. */ - if (idx > 0) { + if (bma->idx > 0) { state |= BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &left); if (isnullstartblock(left.br_startblock)) state |= BMAP_LEFT_DELAY; } @@ -1760,9 +1597,9 @@ xfs_bmap_add_extent_hole_real( * Check and set flags if this segment has a current value. * Not true if we're inserting into the "hole" at eof. */ - if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (bma->idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |= BMAP_RIGHT_VALID; - xfs_bmbt_get_all(ep, &right); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &right); if (isnullstartblock(right.br_startblock)) state |= BMAP_RIGHT_DELAY; } @@ -1799,38 +1636,42 @@ xfs_bmap_add_extent_hole_real( * left and on the right. * Merge all three into a single extent record. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), left.br_blockcount + new->br_blockcount + right.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_iext_remove(ip, idx, 1, state); - ifp->if_lastex = idx - 1; - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) - 1); - if (cur == NULL) { + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) - 1); + if (bma->cur == NULL) { rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, - right.br_startoff, - right.br_startblock, - right.br_blockcount, &i))) + error = xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, + right.br_startblock, right.br_blockcount, + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_btree_delete(cur, &i))) + error = xfs_btree_delete(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_btree_decrement(cur, 0, &i))) + error = xfs_btree_decrement(bma->cur, 0, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, left.br_startoff, + error = xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + new->br_blockcount + right.br_blockcount, - left.br_state))) + left.br_state); + if (error) goto done; } break; @@ -1841,27 +1682,28 @@ xfs_bmap_add_extent_hole_real( * on the left. * Merge the new allocation with the left neighbor. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), left.br_blockcount + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - ifp->if_lastex = idx - 1; - if (cur == NULL) { + if (bma->cur == NULL) { rval = xfs_ilog_fext(whichfork); } else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, - left.br_startoff, - left.br_startblock, - left.br_blockcount, &i))) + error = xfs_bmbt_lookup_eq(bma->cur, left.br_startoff, + left.br_startblock, left.br_blockcount, + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, left.br_startoff, + error = xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + new->br_blockcount, - left.br_state))) + left.br_state); + if (error) goto done; } break; @@ -1872,28 +1714,30 @@ xfs_bmap_add_extent_hole_real( * on the right. * Merge the new allocation with the right neighbor. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx), + new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, right.br_state); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - ifp->if_lastex = idx; - if (cur == NULL) { + if (bma->cur == NULL) { rval = xfs_ilog_fext(whichfork); } else { rval = 0; - if ((error = xfs_bmbt_lookup_eq(cur, + error = xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, right.br_startblock, - right.br_blockcount, &i))) + right.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); - if ((error = xfs_bmbt_update(cur, new->br_startoff, + error = xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, - right.br_state))) + right.br_state); + if (error) goto done; } break; @@ -1904,29 +1748,49 @@ xfs_bmap_add_extent_hole_real( * real allocation. * Insert a new entry. */ - xfs_iext_insert(ip, idx, 1, new, state); - ifp->if_lastex = idx; - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) + 1); - if (cur == NULL) { + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) + 1); + if (bma->cur == NULL) { rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, + error = xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, - new->br_blockcount, &i))) + new->br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 0, done); - cur->bc_rec.b.br_state = new->br_state; - if ((error = xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state = new->br_state; + error = xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } break; } + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(bma->cur == NULL); + error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 0, &tmp_logflags, whichfork); + bma->logflags |= tmp_logflags; + if (error) + goto done; + } + + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated = 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); done: - *logflagsp = rval; + bma->logflags |= rval; return error; } @@ -2113,26 +1977,26 @@ xfs_bmap_adjacent( XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks) mp = ap->ip->i_mount; - nullfb = ap->firstblock == NULLFSBLOCK; + nullfb = *ap->firstblock == NULLFSBLOCK; rt = XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata; - fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); + fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); /* * If allocating at eof, and there's a previous real block, * try to use its last block as our starting point. */ - if (ap->eof && ap->prevp->br_startoff != NULLFILEOFF && - !isnullstartblock(ap->prevp->br_startblock) && - ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount, - ap->prevp->br_startblock)) { - ap->rval = ap->prevp->br_startblock + ap->prevp->br_blockcount; + if (ap->eof && ap->prev.br_startoff != NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + ISVALID(ap->prev.br_startblock + ap->prev.br_blockcount, + ap->prev.br_startblock)) { + ap->blkno = ap->prev.br_startblock + ap->prev.br_blockcount; /* * Adjust for the gap between prevp and us. */ - adjust = ap->off - - (ap->prevp->br_startoff + ap->prevp->br_blockcount); + adjust = ap->offset - + (ap->prev.br_startoff + ap->prev.br_blockcount); if (adjust && - ISVALID(ap->rval + adjust, ap->prevp->br_startblock)) - ap->rval += adjust; + ISVALID(ap->blkno + adjust, ap->prev.br_startblock)) + ap->blkno += adjust; } /* * If not at eof, then compare the two neighbor blocks. @@ -2149,17 +2013,17 @@ xfs_bmap_adjacent( * If there's a previous (left) block, select a requested * start block based on it. */ - if (ap->prevp->br_startoff != NULLFILEOFF && - !isnullstartblock(ap->prevp->br_startblock) && - (prevbno = ap->prevp->br_startblock + - ap->prevp->br_blockcount) && - ISVALID(prevbno, ap->prevp->br_startblock)) { + if (ap->prev.br_startoff != NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + (prevbno = ap->prev.br_startblock + + ap->prev.br_blockcount) && + ISVALID(prevbno, ap->prev.br_startblock)) { /* * Calculate gap to end of previous block. */ - adjust = prevdiff = ap->off - - (ap->prevp->br_startoff + - ap->prevp->br_blockcount); + adjust = prevdiff = ap->offset - + (ap->prev.br_startoff + + ap->prev.br_blockcount); /* * Figure the startblock based on the previous block's * end and the gap size. @@ -2168,9 +2032,9 @@ xfs_bmap_adjacent( * allocating, or using it gives us an invalid block * number, then just use the end of the previous block. */ - if (prevdiff <= XFS_ALLOC_GAP_UNITS * ap->alen && + if (prevdiff <= XFS_ALLOC_GAP_UNITS * ap->length && ISVALID(prevbno + prevdiff, - ap->prevp->br_startblock)) + ap->prev.br_startblock)) prevbno += adjust; else prevdiff += adjust; @@ -2191,16 +2055,16 @@ xfs_bmap_adjacent( * If there's a following (right) block, select a requested * start block based on it. */ - if (!isnullstartblock(ap->gotp->br_startblock)) { + if (!isnullstartblock(ap->got.br_startblock)) { /* * Calculate gap to start of next block. */ - adjust = gotdiff = ap->gotp->br_startoff - ap->off; + adjust = gotdiff = ap->got.br_startoff - ap->offset; /* * Figure the startblock based on the next block's * start and the gap size. */ - gotbno = ap->gotp->br_startblock; + gotbno = ap->got.br_startblock; /* * Heuristic! * If the gap is large relative to the piece we're @@ -2208,12 +2072,12 @@ xfs_bmap_adjacent( * number, then just use the start of the next block * offset by our length. */ - if (gotdiff <= XFS_ALLOC_GAP_UNITS * ap->alen && + if (gotdiff <= XFS_ALLOC_GAP_UNITS * ap->length && ISVALID(gotbno - gotdiff, gotbno)) gotbno -= adjust; - else if (ISVALID(gotbno - ap->alen, gotbno)) { - gotbno -= ap->alen; - gotdiff += adjust - ap->alen; + else if (ISVALID(gotbno - ap->length, gotbno)) { + gotbno -= ap->length; + gotdiff += adjust - ap->length; } else gotdiff += adjust; /* @@ -2234,11 +2098,11 @@ xfs_bmap_adjacent( * one, else ap->rval is already set (to 0 or the inode block). */ if (prevbno != NULLFSBLOCK && gotbno != NULLFSBLOCK) - ap->rval = prevdiff <= gotdiff ? prevbno : gotbno; + ap->blkno = prevdiff <= gotdiff ? prevbno : gotbno; else if (prevbno != NULLFSBLOCK) - ap->rval = prevbno; + ap->blkno = prevbno; else if (gotbno != NULLFSBLOCK) - ap->rval = gotbno; + ap->blkno = gotbno; } #undef ISVALID } @@ -2271,7 +2135,7 @@ xfs_bmap_btalloc_nullfb( startag = ag = 0; pag = xfs_perag_get(mp, ag); - while (*blen < ap->alen) { + while (*blen < args->maxlen) { if (!pag->pagf_init) { error = xfs_alloc_pagf_init(mp, args->tp, ag, XFS_ALLOC_FLAG_TRYLOCK); @@ -2293,7 +2157,7 @@ xfs_bmap_btalloc_nullfb( notinit = 1; if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >= ap->alen) + if (*blen >= args->maxlen) break; if (ap->userdata) { @@ -2339,21 +2203,21 @@ xfs_bmap_btalloc_nullfb( * If the best seen length is less than the request * length, use the best as the minimum. */ - else if (*blen < ap->alen) + else if (*blen < args->maxlen) args->minlen = *blen; /* - * Otherwise we've seen an extent as big as alen, + * Otherwise we've seen an extent as big as maxlen, * use that as the minimum. */ else - args->minlen = ap->alen; + args->minlen = args->maxlen; /* * set the failure fallback case to look in the selected * AG as the stream may have moved. */ if (xfs_inode_is_filestream(ap->ip)) - ap->rval = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + ap->blkno = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); return 0; } @@ -2375,53 +2239,58 @@ xfs_bmap_btalloc( int tryagain; int error; + ASSERT(ap->length); + mp = ap->ip->i_mount; align = ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; if (unlikely(align)) { - error = xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp, + error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0, ap->eof, 0, ap->conv, - &ap->off, &ap->alen); + &ap->offset, &ap->length); ASSERT(!error); - ASSERT(ap->alen); + ASSERT(ap->length); } - nullfb = ap->firstblock == NULLFSBLOCK; - fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); + nullfb = *ap->firstblock == NULLFSBLOCK; + fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); if (nullfb) { if (ap->userdata && xfs_inode_is_filestream(ap->ip)) { ag = xfs_filestream_lookup_ag(ap->ip); ag = (ag != NULLAGNUMBER) ? ag : 0; - ap->rval = XFS_AGB_TO_FSB(mp, ag, 0); + ap->blkno = XFS_AGB_TO_FSB(mp, ag, 0); } else { - ap->rval = XFS_INO_TO_FSB(mp, ap->ip->i_ino); + ap->blkno = XFS_INO_TO_FSB(mp, ap->ip->i_ino); } } else - ap->rval = ap->firstblock; + ap->blkno = *ap->firstblock; xfs_bmap_adjacent(ap); /* - * If allowed, use ap->rval; otherwise must use firstblock since + * If allowed, use ap->blkno; otherwise must use firstblock since * it's in the right allocation group. */ - if (nullfb || XFS_FSB_TO_AGNO(mp, ap->rval) == fb_agno) + if (nullfb || XFS_FSB_TO_AGNO(mp, ap->blkno) == fb_agno) ; else - ap->rval = ap->firstblock; + ap->blkno = *ap->firstblock; /* * Normal allocation, done through xfs_alloc_vextent. */ tryagain = isaligned = 0; + memset(&args, 0, sizeof(args)); args.tp = ap->tp; args.mp = mp; - args.fsbno = ap->rval; - args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks); - args.firstblock = ap->firstblock; + args.fsbno = ap->blkno; + + /* Trim the allocation back to the maximum an AG can fit. */ + args.maxlen = MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp)); + args.firstblock = *ap->firstblock; blen = 0; if (nullfb) { error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); if (error) return error; - } else if (ap->low) { + } else if (ap->flist->xbf_low) { if (xfs_inode_is_filestream(ap->ip)) args.type = XFS_ALLOCTYPE_FIRST_AG; else @@ -2435,14 +2304,14 @@ xfs_bmap_btalloc( /* apply extent size hints if obtained earlier */ if (unlikely(align)) { args.prod = align; - if ((args.mod = (xfs_extlen_t)do_mod(ap->off, args.prod))) + if ((args.mod = (xfs_extlen_t)do_mod(ap->offset, args.prod))) args.mod = (xfs_extlen_t)(args.prod - args.mod); } else if (mp->m_sb.sb_blocksize >= PAGE_CACHE_SIZE) { args.prod = 1; args.mod = 0; } else { args.prod = PAGE_CACHE_SIZE >> mp->m_sb.sb_blocklog; - if ((args.mod = (xfs_extlen_t)(do_mod(ap->off, args.prod)))) + if ((args.mod = (xfs_extlen_t)(do_mod(ap->offset, args.prod)))) args.mod = (xfs_extlen_t)(args.prod - args.mod); } /* @@ -2454,15 +2323,15 @@ xfs_bmap_btalloc( * is >= the stripe unit and the allocation offset is * at the end of file. */ - if (!ap->low && ap->aeof) { - if (!ap->off) { + if (!ap->flist->xbf_low && ap->aeof) { + if (!ap->offset) { args.alignment = mp->m_dalign; atype = args.type; isaligned = 1; /* * Adjust for alignment */ - if (blen > args.alignment && blen <= ap->alen) + if (blen > args.alignment && blen <= args.maxlen) args.minlen = blen - args.alignment; args.minalignslop = 0; } else { @@ -2481,7 +2350,7 @@ xfs_bmap_btalloc( * of minlen+alignment+slop doesn't go up * between the calls. */ - if (blen > mp->m_dalign && blen <= ap->alen) + if (blen > mp->m_dalign && blen <= args.maxlen) nextminlen = blen - mp->m_dalign; else nextminlen = args.minlen; @@ -2508,7 +2377,7 @@ xfs_bmap_btalloc( * turned on. */ args.type = atype; - args.fsbno = ap->rval; + args.fsbno = ap->blkno; args.alignment = mp->m_dalign; args.minlen = nextminlen; args.minalignslop = 0; @@ -2522,7 +2391,7 @@ xfs_bmap_btalloc( * try again. */ args.type = atype; - args.fsbno = ap->rval; + args.fsbno = ap->blkno; args.alignment = 0; if ((error = xfs_alloc_vextent(&args))) return error; @@ -2531,7 +2400,7 @@ xfs_bmap_btalloc( args.minlen > ap->minlen) { args.minlen = ap->minlen; args.type = XFS_ALLOCTYPE_START_BNO; - args.fsbno = ap->rval; + args.fsbno = ap->blkno; if ((error = xfs_alloc_vextent(&args))) return error; } @@ -2542,13 +2411,26 @@ xfs_bmap_btalloc( args.minleft = 0; if ((error = xfs_alloc_vextent(&args))) return error; - ap->low = 1; + ap->flist->xbf_low = 1; } if (args.fsbno != NULLFSBLOCK) { - ap->firstblock = ap->rval = args.fsbno; + /* + * check the allocation happened at the same or higher AG than + * the first block that was allocated. + */ + ASSERT(*ap->firstblock == NULLFSBLOCK || + XFS_FSB_TO_AGNO(mp, *ap->firstblock) == + XFS_FSB_TO_AGNO(mp, args.fsbno) || + (ap->flist->xbf_low && + XFS_FSB_TO_AGNO(mp, *ap->firstblock) < + XFS_FSB_TO_AGNO(mp, args.fsbno))); + + ap->blkno = args.fsbno; + if (*ap->firstblock == NULLFSBLOCK) + *ap->firstblock = args.fsbno; ASSERT(nullfb || fb_agno == args.agno || - (ap->low && fb_agno < args.agno)); - ap->alen = args.len; + (ap->flist->xbf_low && fb_agno < args.agno)); + ap->length = args.len; ap->ip->i_d.di_nblocks += args.len; xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); if (ap->wasdel) @@ -2562,8 +2444,8 @@ xfs_bmap_btalloc( XFS_TRANS_DQ_BCOUNT, (long) args.len); } else { - ap->rval = NULLFSBLOCK; - ap->alen = 0; + ap->blkno = NULLFSBLOCK; + ap->length = 0; } return 0; } @@ -2620,8 +2502,9 @@ xfs_bmap_btree_to_extents( if ((error = xfs_btree_check_lptr(cur, cbno, 1))) return error; #endif - if ((error = xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, - XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; cblock = XFS_BUF_TO_BLOCK(cbp); if ((error = xfs_btree_check_block(cur, cblock, 0, cbp))) @@ -2648,13 +2531,12 @@ STATIC int /* error */ xfs_bmap_del_extent( xfs_inode_t *ip, /* incore inode pointer */ xfs_trans_t *tp, /* current transaction pointer */ - xfs_extnum_t idx, /* extent number to update/delete */ + xfs_extnum_t *idx, /* extent number to update/delete */ xfs_bmap_free_t *flist, /* list of extents to be freed */ xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd) /* OK to allocate reserved blocks */ + int whichfork) /* data or attr fork */ { xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ @@ -2685,10 +2567,10 @@ xfs_bmap_del_extent( mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); - ASSERT((idx >= 0) && (idx < ifp->if_bytes / + ASSERT((*idx >= 0) && (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); ASSERT(del->br_blockcount > 0); - ep = xfs_iext_get_ext(ifp, idx); + ep = xfs_iext_get_ext(ifp, *idx); xfs_bmbt_get_all(ep, &got); ASSERT(got.br_startoff <= del->br_startoff); del_endoff = del->br_startoff + del->br_blockcount; @@ -2719,8 +2601,8 @@ xfs_bmap_del_extent( len = del->br_blockcount; do_div(bno, mp->m_sb.sb_rextsize); do_div(len, mp->m_sb.sb_rextsize); - if ((error = xfs_rtfree_extent(ip->i_transp, bno, - (xfs_extlen_t)len))) + error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); + if (error) goto done; do_fx = 0; nblks = len * mp->m_sb.sb_rextsize; @@ -2762,11 +2644,12 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ - xfs_iext_remove(ip, idx, 1, + xfs_iext_remove(ip, *idx, 1, whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); - ifp->if_lastex = idx; + --*idx; if (delay) break; + XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |= XFS_ILOG_CORE; @@ -2783,21 +2666,20 @@ xfs_bmap_del_extent( /* * Deleting the first part of the extent. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, del_endoff); temp = got.br_blockcount - del->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - ifp->if_lastex = idx; if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); da_new = temp; break; } xfs_bmbt_set_startblock(ep, del_endblock); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); if (!cur) { flags |= xfs_ilog_fext(whichfork); break; @@ -2813,18 +2695,17 @@ xfs_bmap_del_extent( * Deleting the last part of the extent. */ temp = got.br_blockcount - del->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - ifp->if_lastex = idx; if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); da_new = temp; break; } - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); if (!cur) { flags |= xfs_ilog_fext(whichfork); break; @@ -2841,7 +2722,7 @@ xfs_bmap_del_extent( * Deleting the middle of the extent. */ temp = del->br_startoff - got.br_startoff; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); new.br_startoff = del_endoff; temp2 = got_endoff - del_endoff; @@ -2928,9 +2809,9 @@ xfs_bmap_del_extent( } } } - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - xfs_iext_insert(ip, idx + 1, 1, &new, state); - ifp->if_lastex = idx + 1; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + xfs_iext_insert(ip, *idx + 1, 1, &new, state); + ++*idx; break; } /* @@ -2957,7 +2838,7 @@ xfs_bmap_del_extent( ASSERT(da_old >= da_new); if (da_old > da_new) { xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), rsvd); + (int64_t)(da_old - da_new), 0); } done: *logflagsp = flags; @@ -3014,8 +2895,7 @@ xfs_bmap_extents_to_btree( ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + /* * Make space in the inode incore. */ @@ -3044,6 +2924,7 @@ xfs_bmap_extents_to_btree( * Convert to a btree with two levels, one record in root. */ XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = mp; args.firstblock = *firstblock; @@ -3058,8 +2939,6 @@ xfs_bmap_extents_to_btree( args.fsbno = *firstblock; } args.minlen = args.maxlen = args.prod = 1; - args.total = args.minleft = args.alignment = args.mod = args.isfl = - args.minalignslop = 0; args.wasdel = wasdel; *logflagsp = 0; if ((error = xfs_alloc_vextent(&args))) { @@ -3083,6 +2962,7 @@ xfs_bmap_extents_to_btree( /* * Fill in the child block. */ + abp->b_ops = &xfs_bmbt_buf_ops; ablock = XFS_BUF_TO_BLOCK(abp); ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); ablock->bb_level = 0; @@ -3161,13 +3041,8 @@ xfs_bmap_forkoff_reset( ip->i_d.di_format != XFS_DINODE_FMT_BTREE) { uint dfl_forkoff = xfs_default_attroffset(ip) >> 3; - if (dfl_forkoff > ip->i_d.di_forkoff) { + if (dfl_forkoff > ip->i_d.di_forkoff) ip->i_d.di_forkoff = dfl_forkoff; - ip->i_df.if_ext_max = - XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); - ip->i_afp->if_ext_max = - XFS_IFORK_ASIZE(ip) / sizeof(xfs_bmbt_rec_t); - } } } @@ -3194,8 +3069,7 @@ xfs_bmap_local_to_extents( * We don't want to deal with the case of keeping inode data inline yet. * So sending the data fork of a regular inode is invalid. */ - ASSERT(!((ip->i_d.di_mode & S_IFMT) == S_IFREG && - whichfork == XFS_DATA_FORK)); + ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork == XFS_DATA_FORK)); ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); flags = 0; @@ -3205,6 +3079,7 @@ xfs_bmap_local_to_extents( xfs_buf_t *bp; /* buffer for extent block */ xfs_bmbt_rec_host_t *ep;/* extent record pointer */ + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = ip->i_mount; args.firstblock = *firstblock; @@ -3222,8 +3097,6 @@ xfs_bmap_local_to_extents( args.type = XFS_ALLOCTYPE_NEAR_BNO; } args.total = total; - args.mod = args.minleft = args.alignment = args.wasdel = - args.isfl = args.minalignslop = 0; args.minlen = args.maxlen = args.prod = 1; if ((error = xfs_alloc_vextent(&args))) goto done; @@ -3234,8 +3107,8 @@ xfs_bmap_local_to_extents( ASSERT(args.len == 1); *firstblock = args.fsbno; bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); - memcpy((char *)XFS_BUF_PTR(bp), ifp->if_u1.if_data, - ifp->if_bytes); + bp->b_ops = &xfs_bmbt_buf_ops; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); xfs_bmap_forkoff_reset(args.mp, ip, whichfork); xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); @@ -3341,7 +3214,7 @@ xfs_bmap_search_extents( if (unlikely(!(gotp->br_startblock) && (*lastxp != NULLEXTNUM) && !(XFS_IS_REALTIME_INODE(ip) && fork == XFS_DATA_FORK))) { - xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount, + xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, "Access to block zero in inode %llu " "start_block: %llx start_off: %llx " "blkcnt: %llx extent-state: %x lastx: %x\n", @@ -3409,8 +3282,6 @@ xfs_bmap_add_attrfork( int error; /* error return value */ ASSERT(XFS_IFORK_Q(ip) == 0); - ASSERT(ip->i_df.if_ext_max == - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); mp = ip->i_mount; ASSERT(!XFS_NOT_DQATTACHED(mp, ip)); @@ -3441,7 +3312,7 @@ xfs_bmap_add_attrfork( } ASSERT(ip->i_d.di_anextents == 0); - xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); switch (ip->i_d.di_format) { @@ -3465,12 +3336,9 @@ xfs_bmap_add_attrfork( error = XFS_ERROR(EINVAL); goto error1; } - ip->i_df.if_ext_max = - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT(ip->i_afp == NULL); ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); - ip->i_afp->if_ext_max = - XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); ip->i_afp->if_flags = XFS_IFEXTENTS; logflags = 0; xfs_bmap_init(&flist, &firstblock); @@ -3514,20 +3382,17 @@ xfs_bmap_add_attrfork( } else spin_unlock(&mp->m_sb_lock); } - if ((error = xfs_bmap_finish(&tp, &flist, &committed))) + + error = xfs_bmap_finish(&tp, &flist, &committed); + if (error) goto error2; - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - ASSERT(ip->i_df.if_ext_max == - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); error2: xfs_bmap_cancel(&flist); error1: xfs_iunlock(ip, XFS_ILOCK_EXCL); error0: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - ASSERT(ip->i_df.if_ext_max == - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); return error; } @@ -3753,42 +3618,122 @@ xfs_bmap_last_before( return 0; } +STATIC int +xfs_bmap_last_extent( + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *rec, + int *is_empty) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); + int error; + int nextents; + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + nextents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (nextents == 0) { + *is_empty = 1; + return 0; + } + + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, nextents - 1), rec); + *is_empty = 0; + return 0; +} + +/* + * Check the last inode extent to determine whether this allocation will result + * in blocks being allocated at the end of the file. When we allocate new data + * blocks at the end of the file which do not start at the previous data block, + * we will try to align the new blocks at stripe unit boundaries. + * + * Returns 0 in bma->aeof if the file (fork) is empty as any new write will be + * at, or past the EOF. + */ +STATIC int +xfs_bmap_isaeof( + struct xfs_bmalloca *bma, + int whichfork) +{ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + bma->aeof = 0; + error = xfs_bmap_last_extent(NULL, bma->ip, whichfork, &rec, + &is_empty); + if (error || is_empty) + return error; + + /* + * Check if we are allocation or past the last extent, or at least into + * the last delayed allocated extent. + */ + bma->aeof = bma->offset >= rec.br_startoff + rec.br_blockcount || + (bma->offset >= rec.br_startoff && + isnullstartblock(rec.br_startblock)); + return 0; +} + +/* + * Check if the endoff is outside the last extent. If so the caller will grow + * the allocation to a stripe unit boundary. All offsets are considered outside + * the end of file for an empty fork, so 1 is returned in *eof in that case. + */ +int +xfs_bmap_eof( + struct xfs_inode *ip, + xfs_fileoff_t endoff, + int whichfork, + int *eof) +{ + struct xfs_bmbt_irec rec; + int error; + + error = xfs_bmap_last_extent(NULL, ip, whichfork, &rec, eof); + if (error || *eof) + return error; + + *eof = endoff >= rec.br_startoff + rec.br_blockcount; + return 0; +} + /* * Returns the file-relative block number of the first block past eof in * the file. This is not based on i_size, it is based on the extent records. * Returns 0 for local files, as they do not have extent records. */ -int /* error */ +int xfs_bmap_last_offset( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_fileoff_t *last_block, /* last block */ - int whichfork) /* data or attr fork */ + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t *last_block, + int whichfork) { - xfs_bmbt_rec_host_t *ep; /* pointer to last extent */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extnum_t nextents; /* number of extent entries */ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + *last_block = 0; + + if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) + return 0; if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL) + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) return XFS_ERROR(EIO); - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { - *last_block = 0; - return 0; - } - ifp = XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(tp, ip, whichfork))) + + error = xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty); + if (error || is_empty) return error; - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (!nextents) { - *last_block = 0; - return 0; - } - ep = xfs_iext_get_ext(ifp, nextents - 1); - *last_block = xfs_bmbt_get_startoff(ep) + xfs_bmbt_get_blockcount(ep); + + *last_block = rec.br_startoff + rec.br_blockcount; return 0; } @@ -3808,11 +3753,8 @@ xfs_bmap_one_block( xfs_bmbt_irec_t s; /* internal version of extent */ #ifndef DEBUG - if (whichfork == XFS_DATA_FORK) { - return ((ip->i_d.di_mode & S_IFMT) == S_IFREG) ? - (ip->i_size == ip->i_mount->m_sb.sb_blocksize) : - (ip->i_d.di_size == ip->i_mount->m_sb.sb_blocksize); - } + if (whichfork == XFS_DATA_FORK) + return XFS_ISIZE(ip) == ip->i_mount->m_sb.sb_blocksize; #endif /* !DEBUG */ if (XFS_IFORK_NEXTENTS(ip, whichfork) != 1) return 0; @@ -3824,7 +3766,7 @@ xfs_bmap_one_block( xfs_bmbt_get_all(ep, &s); rval = s.br_startoff == 0 && s.br_blockcount == 1; if (rval && whichfork == XFS_DATA_FORK) - ASSERT(ip->i_size == ip->i_mount->m_sb.sb_blocksize); + ASSERT(XFS_ISIZE(ip) == ip->i_mount->m_sb.sb_blocksize); return rval; } @@ -3836,7 +3778,7 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); - if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC || + if (block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC) || be16_to_cpu(block->bb_level) != level || be16_to_cpu(block->bb_numrecs) == 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) @@ -3890,8 +3832,9 @@ xfs_bmap_read_extents( * pointer (leftmost) at each level. */ while (level-- > 0) { - if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) return error; block = XFS_BUF_TO_BLOCK(bp); XFS_WANT_CORRUPTED_GOTO( @@ -3918,16 +3861,14 @@ xfs_bmap_read_extents( xfs_extnum_t num_recs; xfs_extnum_t start; - num_recs = xfs_btree_get_numrecs(block); if (unlikely(i + num_recs > room)) { ASSERT(i + num_recs <= room); - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, (btree extents).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_bmap_read_extents(1)", - XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)", + XFS_ERRLEVEL_LOW, ip->i_mount, block); goto error0; } XFS_WANT_CORRUPTED_GOTO( @@ -3938,7 +3879,8 @@ xfs_bmap_read_extents( */ nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); if (nextbno != NULLFSBLOCK) - xfs_btree_reada_bufl(mp, nextbno, 1); + xfs_btree_reada_bufl(mp, nextbno, 1, + &xfs_bmbt_buf_ops); /* * Copy records into the extent records. */ @@ -3970,8 +3912,9 @@ xfs_bmap_read_extents( */ if (bno == NULLFSBLOCK) break; - if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) return error; block = XFS_BUF_TO_BLOCK(bp); } @@ -4042,9 +3985,8 @@ xfs_bmap_validate_ret( ASSERT(i == 0 || mval[i - 1].br_startoff + mval[i - 1].br_blockcount == mval[i].br_startoff); - if ((flags & XFS_BMAPI_WRITE) && !(flags & XFS_BMAPI_DELAY)) - ASSERT(mval[i].br_startblock != DELAYSTARTBLOCK && - mval[i].br_startblock != HOLESTARTBLOCK); + ASSERT(mval[i].br_startblock != DELAYSTARTBLOCK && + mval[i].br_startblock != HOLESTARTBLOCK); ASSERT(mval[i].br_state == XFS_EXT_NORM || mval[i].br_state == XFS_EXT_UNWRITTEN); } @@ -4053,395 +3995,166 @@ xfs_bmap_validate_ret( /* - * Map file blocks to filesystem blocks. - * File range is given by the bno/len pair. - * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set) - * into a hole or past eof. - * Only allocates blocks from a single allocation group, - * to avoid locking problems. - * The returned value in "firstblock" from the first call in a transaction - * must be remembered and presented to subsequent calls in "firstblock". - * An upper bound for the number of blocks to be allocated is supplied to - * the first call in "total"; if no allocation group has that many free - * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). + * Trim the returned map to the required bounds */ -int /* error */ -xfs_bmapi( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting file offs. mapped */ - xfs_filblks_t len, /* length to map in file */ - int flags, /* XFS_BMAPI_... */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_extlen_t total, /* total blocks needed */ - xfs_bmbt_irec_t *mval, /* output: map values */ - int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist) /* i/o: list extents to free */ +STATIC void +xfs_bmapi_trim_map( + struct xfs_bmbt_irec *mval, + struct xfs_bmbt_irec *got, + xfs_fileoff_t *bno, + xfs_filblks_t len, + xfs_fileoff_t obno, + xfs_fileoff_t end, + int n, + int flags) { - xfs_fsblock_t abno; /* allocated block number */ - xfs_extlen_t alen; /* allocated extent length */ - xfs_fileoff_t aoff; /* allocated file offset */ - xfs_bmalloca_t bma = { 0 }; /* args for xfs_bmap_alloc */ - xfs_btree_cur_t *cur; /* bmap btree cursor */ - xfs_fileoff_t end; /* end of mapped file region */ - int eof; /* we've hit the end of extents */ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - int error; /* error return */ - xfs_bmbt_irec_t got; /* current file extent record */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extlen_t indlen; /* indirect blocks length */ - xfs_extnum_t lastx; /* last useful extent number */ - int logflags; /* flags for transaction logging */ - xfs_extlen_t minleft; /* min blocks left after allocation */ - xfs_extlen_t minlen; /* min allocation size */ - xfs_mount_t *mp; /* xfs mount structure */ - int n; /* current extent index */ - int nallocs; /* number of extents alloc'd */ - xfs_extnum_t nextents; /* number of extents in file */ - xfs_fileoff_t obno; /* old block number (offset) */ - xfs_bmbt_irec_t prev; /* previous file extent record */ - int tmp_logflags; /* temp flags holder */ - int whichfork; /* data or attr fork */ - char inhole; /* current location is hole in file */ - char wasdelay; /* old extent was delayed */ - char wr; /* this is a write request */ - char rt; /* this is a realtime file */ -#ifdef DEBUG - xfs_fileoff_t orig_bno; /* original block number value */ - int orig_flags; /* original flags arg value */ - xfs_filblks_t orig_len; /* original value of len arg */ - xfs_bmbt_irec_t *orig_mval; /* original value of mval */ - int orig_nmap; /* original value of *nmap */ - - orig_bno = bno; - orig_len = len; - orig_flags = flags; - orig_mval = mval; - orig_nmap = *nmap; -#endif - ASSERT(*nmap >= 1); - ASSERT(*nmap <= XFS_BMAP_MAX_NMAP || !(flags & XFS_BMAPI_WRITE)); - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; - mp = ip->i_mount; - if (unlikely(XFS_TEST_ERROR( - (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL), - mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmapi", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + if ((flags & XFS_BMAPI_ENTIRE) || + got->br_startoff + got->br_blockcount <= obno) { + *mval = *got; + if (isnullstartblock(got->br_startblock)) + mval->br_startblock = DELAYSTARTBLOCK; + return; } - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - rt = (whichfork == XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(ip); - ifp = XFS_IFORK_PTR(ip, whichfork); - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); - if ((wr = (flags & XFS_BMAPI_WRITE)) != 0) - XFS_STATS_INC(xs_blk_mapw); + + if (obno > *bno) + *bno = obno; + ASSERT((*bno >= obno) || (n == 0)); + ASSERT(*bno < end); + mval->br_startoff = *bno; + if (isnullstartblock(got->br_startblock)) + mval->br_startblock = DELAYSTARTBLOCK; else - XFS_STATS_INC(xs_blk_mapr); + mval->br_startblock = got->br_startblock + + (*bno - got->br_startoff); /* - * IGSTATE flag is used to combine extents which - * differ only due to the state of the extents. - * This technique is used from xfs_getbmap() - * when the caller does not wish to see the - * separation (which is the default). - * - * This technique is also used when writing a - * buffer which has been partially written, - * (usually by being flushed during a chunkread), - * to ensure one write takes place. This also - * prevents a change in the xfs inode extents at - * this time, intentionally. This change occurs - * on completion of the write operation, in - * xfs_strat_comp(), where the xfs_bmapi() call - * is transactioned, and the extents combined. + * Return the minimum of what we got and what we asked for for + * the length. We can use the len variable here because it is + * modified below and we could have been there before coming + * here if the first part of the allocation didn't overlap what + * was asked for. */ - if ((flags & XFS_BMAPI_IGSTATE) && wr) /* if writing unwritten space */ - wr = 0; /* no allocations are allowed */ - ASSERT(wr || !(flags & XFS_BMAPI_DELAY)); - logflags = 0; - nallocs = 0; - cur = NULL; - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { - ASSERT(wr && tp); - if ((error = xfs_bmap_local_to_extents(tp, ip, - firstblock, total, &logflags, whichfork))) - goto error0; - } - if (wr && *firstblock == NULLFSBLOCK) { - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE) - minleft = be16_to_cpu(ifp->if_broot->bb_level) + 1; - else - minleft = 1; - } else - minleft = 0; - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(tp, ip, whichfork))) - goto error0; - ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - n = 0; - end = bno + len; - obno = bno; - bma.ip = NULL; + mval->br_blockcount = XFS_FILBLKS_MIN(end - *bno, + got->br_blockcount - (*bno - got->br_startoff)); + mval->br_state = got->br_state; + ASSERT(mval->br_blockcount <= len); + return; +} - while (bno < end && n < *nmap) { - /* - * Reading past eof, act as though there's a hole - * up to end. - */ - if (eof && !wr) - got.br_startoff = end; - inhole = eof || got.br_startoff > bno; - wasdelay = wr && !inhole && !(flags & XFS_BMAPI_DELAY) && - isnullstartblock(got.br_startblock); - /* - * First, deal with the hole before the allocated space - * that we found, if any. - */ - if (wr && (inhole || wasdelay)) { - /* - * For the wasdelay case, we could also just - * allocate the stuff asked for in this bmap call - * but that wouldn't be as good. - */ - if (wasdelay) { - alen = (xfs_extlen_t)got.br_blockcount; - aoff = got.br_startoff; - if (lastx != NULLEXTNUM && lastx) { - ep = xfs_iext_get_ext(ifp, lastx - 1); - xfs_bmbt_get_all(ep, &prev); - } - } else { - alen = (xfs_extlen_t) - XFS_FILBLKS_MIN(len, MAXEXTLEN); - if (!eof) - alen = (xfs_extlen_t) - XFS_FILBLKS_MIN(alen, - got.br_startoff - bno); - aoff = bno; - } - minlen = (flags & XFS_BMAPI_CONTIG) ? alen : 1; - if (flags & XFS_BMAPI_DELAY) { - xfs_extlen_t extsz; - - /* Figure out the extent size, adjust alen */ - extsz = xfs_get_extsz_hint(ip); - if (extsz) { - error = xfs_bmap_extsize_align(mp, - &got, &prev, extsz, - rt, eof, - flags&XFS_BMAPI_DELAY, - flags&XFS_BMAPI_CONVERT, - &aoff, &alen); - ASSERT(!error); - } +/* + * Update and validate the extent map to return + */ +STATIC void +xfs_bmapi_update_map( + struct xfs_bmbt_irec **map, + xfs_fileoff_t *bno, + xfs_filblks_t *len, + xfs_fileoff_t obno, + xfs_fileoff_t end, + int *n, + int flags) +{ + xfs_bmbt_irec_t *mval = *map; + + ASSERT((flags & XFS_BMAPI_ENTIRE) || + ((mval->br_startoff + mval->br_blockcount) <= end)); + ASSERT((flags & XFS_BMAPI_ENTIRE) || (mval->br_blockcount <= *len) || + (mval->br_startoff < obno)); + + *bno = mval->br_startoff + mval->br_blockcount; + *len = end - *bno; + if (*n > 0 && mval->br_startoff == mval[-1].br_startoff) { + /* update previous map with new information */ + ASSERT(mval->br_startblock == mval[-1].br_startblock); + ASSERT(mval->br_blockcount > mval[-1].br_blockcount); + ASSERT(mval->br_state == mval[-1].br_state); + mval[-1].br_blockcount = mval->br_blockcount; + mval[-1].br_state = mval->br_state; + } else if (*n > 0 && mval->br_startblock != DELAYSTARTBLOCK && + mval[-1].br_startblock != DELAYSTARTBLOCK && + mval[-1].br_startblock != HOLESTARTBLOCK && + mval->br_startblock == mval[-1].br_startblock + + mval[-1].br_blockcount && + ((flags & XFS_BMAPI_IGSTATE) || + mval[-1].br_state == mval->br_state)) { + ASSERT(mval->br_startoff == + mval[-1].br_startoff + mval[-1].br_blockcount); + mval[-1].br_blockcount += mval->br_blockcount; + } else if (*n > 0 && + mval->br_startblock == DELAYSTARTBLOCK && + mval[-1].br_startblock == DELAYSTARTBLOCK && + mval->br_startoff == + mval[-1].br_startoff + mval[-1].br_blockcount) { + mval[-1].br_blockcount += mval->br_blockcount; + mval[-1].br_state = mval->br_state; + } else if (!((*n == 0) && + ((mval->br_startoff + mval->br_blockcount) <= + obno))) { + mval++; + (*n)++; + } + *map = mval; +} - if (rt) - extsz = alen / mp->m_sb.sb_rextsize; +/* + * Map file blocks to filesystem blocks without allocation. + */ +int +xfs_bmapi_read( + struct xfs_inode *ip, + xfs_fileoff_t bno, + xfs_filblks_t len, + struct xfs_bmbt_irec *mval, + int *nmap, + int flags) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec prev; + xfs_fileoff_t obno; + xfs_fileoff_t end; + xfs_extnum_t lastx; + int error; + int eof; + int n = 0; + int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; - /* - * Make a transaction-less quota reservation for - * delayed allocation blocks. This number gets - * adjusted later. We return if we haven't - * allocated blocks already inside this loop. - */ - error = xfs_trans_reserve_quota_nblks( - NULL, ip, (long)alen, 0, - rt ? XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); - if (error) { - if (n == 0) { - *nmap = 0; - ASSERT(cur == NULL); - return error; - } - break; - } + ASSERT(*nmap >= 1); + ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK|XFS_BMAPI_ENTIRE| + XFS_BMAPI_IGSTATE))); - /* - * Split changing sb for alen and indlen since - * they could be coming from different places. - */ - indlen = (xfs_extlen_t) - xfs_bmap_worst_indlen(ip, alen); - ASSERT(indlen > 0); - - if (rt) { - error = xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - -((int64_t)extsz), (flags & - XFS_BMAPI_RSVBLOCKS)); - } else { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)alen), (flags & - XFS_BMAPI_RSVBLOCKS)); - } - if (!error) { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)indlen), (flags & - XFS_BMAPI_RSVBLOCKS)); - if (error && rt) - xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - (int64_t)extsz, (flags & - XFS_BMAPI_RSVBLOCKS)); - else if (error) - xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - (int64_t)alen, (flags & - XFS_BMAPI_RSVBLOCKS)); - } + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_read", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } - if (error) { - if (XFS_IS_QUOTA_ON(mp)) - /* unreserve the blocks now */ - (void) - xfs_trans_unreserve_quota_nblks( - NULL, ip, - (long)alen, 0, rt ? - XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); - break; - } + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); - ip->i_delayed_blks += alen; - abno = nullstartblock(indlen); - } else { - /* - * If first time, allocate and fill in - * once-only bma fields. - */ - if (bma.ip == NULL) { - bma.tp = tp; - bma.ip = ip; - bma.prevp = &prev; - bma.gotp = &got; - bma.total = total; - bma.userdata = 0; - } - /* Indicate if this is the first user data - * in the file, or just any user data. - */ - if (!(flags & XFS_BMAPI_METADATA)) { - bma.userdata = (aoff == 0) ? - XFS_ALLOC_INITIAL_USER_DATA : - XFS_ALLOC_USERDATA; - } - /* - * Fill in changeable bma fields. - */ - bma.eof = eof; - bma.firstblock = *firstblock; - bma.alen = alen; - bma.off = aoff; - bma.conv = !!(flags & XFS_BMAPI_CONVERT); - bma.wasdel = wasdelay; - bma.minlen = minlen; - bma.low = flist->xbf_low; - bma.minleft = minleft; - /* - * Only want to do the alignment at the - * eof if it is userdata and allocation length - * is larger than a stripe unit. - */ - if (mp->m_dalign && alen >= mp->m_dalign && - (!(flags & XFS_BMAPI_METADATA)) && - (whichfork == XFS_DATA_FORK)) { - if ((error = xfs_bmap_isaeof(ip, aoff, - whichfork, &bma.aeof))) - goto error0; - } else - bma.aeof = 0; - /* - * Call allocator. - */ - if ((error = xfs_bmap_alloc(&bma))) - goto error0; - /* - * Copy out result fields. - */ - abno = bma.rval; - if ((flist->xbf_low = bma.low)) - minleft = 0; - alen = bma.alen; - aoff = bma.off; - ASSERT(*firstblock == NULLFSBLOCK || - XFS_FSB_TO_AGNO(mp, *firstblock) == - XFS_FSB_TO_AGNO(mp, bma.firstblock) || - (flist->xbf_low && - XFS_FSB_TO_AGNO(mp, *firstblock) < - XFS_FSB_TO_AGNO(mp, bma.firstblock))); - *firstblock = bma.firstblock; - if (cur) - cur->bc_private.b.firstblock = - *firstblock; - if (abno == NULLFSBLOCK) - break; - if ((ifp->if_flags & XFS_IFBROOT) && !cur) { - cur = xfs_bmbt_init_cursor(mp, tp, - ip, whichfork); - cur->bc_private.b.firstblock = - *firstblock; - cur->bc_private.b.flist = flist; - } - /* - * Bump the number of extents we've allocated - * in this call. - */ - nallocs++; - } - if (cur) - cur->bc_private.b.flags = - wasdelay ? XFS_BTCUR_BPRV_WASDEL : 0; - got.br_startoff = aoff; - got.br_startblock = abno; - got.br_blockcount = alen; - got.br_state = XFS_EXT_NORM; /* assume normal */ - /* - * Determine state of extent, and the filesystem. - * A wasdelay extent has been initialized, so - * shouldn't be flagged as unwritten. - */ - if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { - if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) - got.br_state = XFS_EXT_UNWRITTEN; - } - error = xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, - whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); - logflags |= tmp_logflags; - if (error) - goto error0; - lastx = ifp->if_lastex; - ep = xfs_iext_get_ext(ifp, lastx); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - xfs_bmbt_get_all(ep, &got); - ASSERT(got.br_startoff <= aoff); - ASSERT(got.br_startoff + got.br_blockcount >= - aoff + alen); -#ifdef DEBUG - if (flags & XFS_BMAPI_DELAY) { - ASSERT(isnullstartblock(got.br_startblock)); - ASSERT(startblockval(got.br_startblock) > 0); - } - ASSERT(got.br_state == XFS_EXT_NORM || - got.br_state == XFS_EXT_UNWRITTEN); -#endif - /* - * Fall down into the found allocated space case. - */ - } else if (inhole) { - /* - * Reading in a hole. - */ + XFS_STATS_INC(xs_blk_mapr); + + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(NULL, ip, whichfork); + if (error) + return error; + } + + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); + end = bno + len; + obno = bno; + + while (bno < end && n < *nmap) { + /* Reading past eof, act as though there's a hole up to end. */ + if (eof) + got.br_startoff = end; + if (got.br_startoff > bno) { + /* Reading in a hole. */ mval->br_startoff = bno; mval->br_startblock = HOLESTARTBLOCK; mval->br_blockcount = @@ -4453,193 +4166,624 @@ xfs_bmapi( n++; continue; } + + /* set up the extent map to return. */ + xfs_bmapi_trim_map(mval, &got, &bno, len, obno, end, n, flags); + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + + /* If we're done, stop now. */ + if (bno >= end || n >= *nmap) + break; + + /* Else go on to the next record. */ + if (++lastx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx), &got); + else + eof = 1; + } + *nmap = n; + return 0; +} + +STATIC int +xfs_bmapi_reserve_delalloc( + struct xfs_inode *ip, + xfs_fileoff_t aoff, + xfs_filblks_t len, + struct xfs_bmbt_irec *got, + struct xfs_bmbt_irec *prev, + xfs_extnum_t *lastx, + int eof) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + xfs_extlen_t alen; + xfs_extlen_t indlen; + char rt = XFS_IS_REALTIME_INODE(ip); + xfs_extlen_t extsz; + int error; + + alen = XFS_FILBLKS_MIN(len, MAXEXTLEN); + if (!eof) + alen = XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); + + /* Figure out the extent size, adjust alen */ + extsz = xfs_get_extsz_hint(ip); + if (extsz) { /* - * Then deal with the allocated space we found. + * Make sure we don't exceed a single extent length when we + * align the extent by reducing length we are going to + * allocate by the maximum amount extent size aligment may + * require. */ - ASSERT(ep != NULL); - if (!(flags & XFS_BMAPI_ENTIRE) && - (got.br_startoff + got.br_blockcount > obno)) { - if (obno > bno) - bno = obno; - ASSERT((bno >= obno) || (n == 0)); - ASSERT(bno < end); - mval->br_startoff = bno; - if (isnullstartblock(got.br_startblock)) { - ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); - mval->br_startblock = DELAYSTARTBLOCK; - } else - mval->br_startblock = - got.br_startblock + - (bno - got.br_startoff); - /* - * Return the minimum of what we got and what we - * asked for for the length. We can use the len - * variable here because it is modified below - * and we could have been there before coming - * here if the first part of the allocation - * didn't overlap what was asked for. - */ - mval->br_blockcount = - XFS_FILBLKS_MIN(end - bno, got.br_blockcount - - (bno - got.br_startoff)); - mval->br_state = got.br_state; - ASSERT(mval->br_blockcount <= len); - } else { - *mval = got; - if (isnullstartblock(mval->br_startblock)) { - ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); - mval->br_startblock = DELAYSTARTBLOCK; + alen = XFS_FILBLKS_MIN(len, MAXEXTLEN - (2 * extsz - 1)); + error = xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof, + 1, 0, &aoff, &alen); + ASSERT(!error); + } + + if (rt) + extsz = alen / mp->m_sb.sb_rextsize; + + /* + * Make a transaction-less quota reservation for delayed allocation + * blocks. This number gets adjusted later. We return if we haven't + * allocated blocks already inside this loop. + */ + error = xfs_trans_reserve_quota_nblks(NULL, ip, (long)alen, 0, + rt ? XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + if (error) + return error; + + /* + * Split changing sb for alen and indlen since they could be coming + * from different places. + */ + indlen = (xfs_extlen_t)xfs_bmap_worst_indlen(ip, alen); + ASSERT(indlen > 0); + + if (rt) { + error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, + -((int64_t)extsz), 0); + } else { + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)alen), 0); + } + + if (error) + goto out_unreserve_quota; + + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)indlen), 0); + if (error) + goto out_unreserve_blocks; + + + ip->i_delayed_blks += alen; + + got->br_startoff = aoff; + got->br_startblock = nullstartblock(indlen); + got->br_blockcount = alen; + got->br_state = XFS_EXT_NORM; + xfs_bmap_add_extent_hole_delay(ip, lastx, got); + + /* + * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay + * might have merged it into one of the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *lastx), got); + + ASSERT(got->br_startoff <= aoff); + ASSERT(got->br_startoff + got->br_blockcount >= aoff + alen); + ASSERT(isnullstartblock(got->br_startblock)); + ASSERT(got->br_state == XFS_EXT_NORM); + return 0; + +out_unreserve_blocks: + if (rt) + xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); + else + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); +out_unreserve_quota: + if (XFS_IS_QUOTA_ON(mp)) + xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? + XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + return error; +} + +/* + * Map file blocks to filesystem blocks, adding delayed allocations as needed. + */ +int +xfs_bmapi_delay( + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting file offs. mapped */ + xfs_filblks_t len, /* length to map in file */ + struct xfs_bmbt_irec *mval, /* output: map values */ + int *nmap, /* i/o: mval size/count */ + int flags) /* XFS_BMAPI_... */ +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_bmbt_irec got; /* current file extent record */ + struct xfs_bmbt_irec prev; /* previous file extent record */ + xfs_fileoff_t obno; /* old block number (offset) */ + xfs_fileoff_t end; /* end of mapped file region */ + xfs_extnum_t lastx; /* last useful extent number */ + int eof; /* we've hit the end of extents */ + int n = 0; /* current extent index */ + int error = 0; + + ASSERT(*nmap >= 1); + ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); + ASSERT(!(flags & ~XFS_BMAPI_ENTIRE)); + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_delay", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + XFS_STATS_INC(xs_blk_mapw); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); + if (error) + return error; + } + + xfs_bmap_search_extents(ip, bno, XFS_DATA_FORK, &eof, &lastx, &got, &prev); + end = bno + len; + obno = bno; + + while (bno < end && n < *nmap) { + if (eof || got.br_startoff > bno) { + error = xfs_bmapi_reserve_delalloc(ip, bno, len, &got, + &prev, &lastx, eof); + if (error) { + if (n == 0) { + *nmap = 0; + return error; + } + break; } } + /* set up the extent map to return. */ + xfs_bmapi_trim_map(mval, &got, &bno, len, obno, end, n, flags); + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + + /* If we're done, stop now. */ + if (bno >= end || n >= *nmap) + break; + + /* Else go on to the next record. */ + prev = got; + if (++lastx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx), &got); + else + eof = 1; + } + + *nmap = n; + return 0; +} + + +STATIC int +xfs_bmapi_allocate( + struct xfs_bmalloca *bma) +{ + struct xfs_mount *mp = bma->ip->i_mount; + int whichfork = (bma->flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags = 0; + int error; + + ASSERT(bma->length > 0); + + /* + * For the wasdelay case, we could also just allocate the stuff asked + * for in this bmap call but that wouldn't be as good. + */ + if (bma->wasdel) { + bma->length = (xfs_extlen_t)bma->got.br_blockcount; + bma->offset = bma->got.br_startoff; + if (bma->idx != NULLEXTNUM && bma->idx) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), + &bma->prev); + } + } else { + bma->length = XFS_FILBLKS_MIN(bma->length, MAXEXTLEN); + if (!bma->eof) + bma->length = XFS_FILBLKS_MIN(bma->length, + bma->got.br_startoff - bma->offset); + } + + /* + * Indicate if this is the first user data in the file, or just any + * user data. + */ + if (!(bma->flags & XFS_BMAPI_METADATA)) { + bma->userdata = (bma->offset == 0) ? + XFS_ALLOC_INITIAL_USER_DATA : XFS_ALLOC_USERDATA; + } + + bma->minlen = (bma->flags & XFS_BMAPI_CONTIG) ? bma->length : 1; + + /* + * Only want to do the alignment at the eof if it is userdata and + * allocation length is larger than a stripe unit. + */ + if (mp->m_dalign && bma->length >= mp->m_dalign && + !(bma->flags & XFS_BMAPI_METADATA) && whichfork == XFS_DATA_FORK) { + error = xfs_bmap_isaeof(bma, whichfork); + if (error) + return error; + } + + if (bma->flags & XFS_BMAPI_STACK_SWITCH) + bma->stack_switch = 1; + + error = xfs_bmap_alloc(bma); + if (error) + return error; + + if (bma->flist->xbf_low) + bma->minleft = 0; + if (bma->cur) + bma->cur->bc_private.b.firstblock = *bma->firstblock; + if (bma->blkno == NULLFSBLOCK) + return 0; + if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) { + bma->cur = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork); + bma->cur->bc_private.b.firstblock = *bma->firstblock; + bma->cur->bc_private.b.flist = bma->flist; + } + /* + * Bump the number of extents we've allocated + * in this call. + */ + bma->nallocs++; + + if (bma->cur) + bma->cur->bc_private.b.flags = + bma->wasdel ? XFS_BTCUR_BPRV_WASDEL : 0; + + bma->got.br_startoff = bma->offset; + bma->got.br_startblock = bma->blkno; + bma->got.br_blockcount = bma->length; + bma->got.br_state = XFS_EXT_NORM; + + /* + * A wasdelay extent has been initialized, so shouldn't be flagged + * as unwritten. + */ + if (!bma->wasdel && (bma->flags & XFS_BMAPI_PREALLOC) && + xfs_sb_version_hasextflgbit(&mp->m_sb)) + bma->got.br_state = XFS_EXT_UNWRITTEN; + + if (bma->wasdel) + error = xfs_bmap_add_extent_delay_real(bma); + else + error = xfs_bmap_add_extent_hole_real(bma, whichfork); + + bma->logflags |= tmp_logflags; + if (error) + return error; + + /* + * Update our extent pointer, given that xfs_bmap_add_extent_delay_real + * or xfs_bmap_add_extent_hole_real might have merged it into one of + * the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &bma->got); + + ASSERT(bma->got.br_startoff <= bma->offset); + ASSERT(bma->got.br_startoff + bma->got.br_blockcount >= + bma->offset + bma->length); + ASSERT(bma->got.br_state == XFS_EXT_NORM || + bma->got.br_state == XFS_EXT_UNWRITTEN); + return 0; +} + + +STATIC int +xfs_bmapi_convert_unwritten( + struct xfs_bmalloca *bma, + struct xfs_bmbt_irec *mval, + xfs_filblks_t len, + int flags) +{ + int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags = 0; + int error; + + /* check if we need to do unwritten->real conversion */ + if (mval->br_state == XFS_EXT_UNWRITTEN && + (flags & XFS_BMAPI_PREALLOC)) + return 0; + + /* check if we need to do real->unwritten conversion */ + if (mval->br_state == XFS_EXT_NORM && + (flags & (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) != + (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) + return 0; + + /* + * Modify (by adding) the state flag, if writing. + */ + ASSERT(mval->br_blockcount <= len); + if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) { + bma->cur = xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp, + bma->ip, whichfork); + bma->cur->bc_private.b.firstblock = *bma->firstblock; + bma->cur->bc_private.b.flist = bma->flist; + } + mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) + ? XFS_EXT_NORM : XFS_EXT_UNWRITTEN; + + error = xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, &bma->idx, + &bma->cur, mval, bma->firstblock, bma->flist, + &tmp_logflags); + bma->logflags |= tmp_logflags; + if (error) + return error; + + /* + * Update our extent pointer, given that + * xfs_bmap_add_extent_unwritten_real might have merged it into one + * of the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &bma->got); + + /* + * We may have combined previously unwritten space with written space, + * so generate another request. + */ + if (mval->br_blockcount < len) + return EAGAIN; + return 0; +} + +/* + * Map file blocks to filesystem blocks, and allocate blocks or convert the + * extent state if necessary. Details behaviour is controlled by the flags + * parameter. Only allocates blocks from a single allocation group, to avoid + * locking problems. + * + * The returned value in "firstblock" from the first call in a transaction + * must be remembered and presented to subsequent calls in "firstblock". + * An upper bound for the number of blocks to be allocated is supplied to + * the first call in "total"; if no allocation group has that many free + * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). + */ +int +xfs_bmapi_write( + struct xfs_trans *tp, /* transaction pointer */ + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting file offs. mapped */ + xfs_filblks_t len, /* length to map in file */ + int flags, /* XFS_BMAPI_... */ + xfs_fsblock_t *firstblock, /* first allocated block + controls a.g. for allocs */ + xfs_extlen_t total, /* total blocks needed */ + struct xfs_bmbt_irec *mval, /* output: map values */ + int *nmap, /* i/o: mval size/count */ + struct xfs_bmap_free *flist) /* i/o: list extents to free */ +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + struct xfs_bmalloca bma = { 0 }; /* args for xfs_bmap_alloc */ + xfs_fileoff_t end; /* end of mapped file region */ + int eof; /* after the end of extents */ + int error; /* error return */ + int n; /* current extent index */ + xfs_fileoff_t obno; /* old block number (offset) */ + int whichfork; /* data or attr fork */ + char inhole; /* current location is hole in file */ + char wasdelay; /* old extent was delayed */ + +#ifdef DEBUG + xfs_fileoff_t orig_bno; /* original block number value */ + int orig_flags; /* original flags arg value */ + xfs_filblks_t orig_len; /* original value of len arg */ + struct xfs_bmbt_irec *orig_mval; /* original value of mval */ + int orig_nmap; /* original value of *nmap */ + + orig_bno = bno; + orig_len = len; + orig_flags = flags; + orig_mval = mval; + orig_nmap = *nmap; +#endif + + ASSERT(*nmap >= 1); + ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); + ASSERT(!(flags & XFS_BMAPI_IGSTATE)); + ASSERT(tp != NULL); + ASSERT(len > 0); + + whichfork = (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_write", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ifp = XFS_IFORK_PTR(ip, whichfork); + + XFS_STATS_INC(xs_blk_mapw); + + if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { + error = xfs_bmap_local_to_extents(tp, ip, firstblock, total, + &bma.logflags, whichfork); + if (error) + goto error0; + } + + if (*firstblock == NULLFSBLOCK) { + if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE) + bma.minleft = be16_to_cpu(ifp->if_broot->bb_level) + 1; + else + bma.minleft = 1; + } else { + bma.minleft = 0; + } + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + goto error0; + } + + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &bma.idx, &bma.got, + &bma.prev); + n = 0; + end = bno + len; + obno = bno; + + bma.tp = tp; + bma.ip = ip; + bma.total = total; + bma.userdata = 0; + bma.flist = flist; + bma.firstblock = firstblock; + + while (bno < end && n < *nmap) { + inhole = eof || bma.got.br_startoff > bno; + wasdelay = !inhole && isnullstartblock(bma.got.br_startblock); + /* - * Check if writing previously allocated but - * unwritten extents. + * First, deal with the hole before the allocated space + * that we found, if any. */ - if (wr && - ((mval->br_state == XFS_EXT_UNWRITTEN && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) || - (mval->br_state == XFS_EXT_NORM && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT)) == - (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT))))) { + if (inhole || wasdelay) { + bma.eof = eof; + bma.conv = !!(flags & XFS_BMAPI_CONVERT); + bma.wasdel = wasdelay; + bma.offset = bno; + bma.flags = flags; + /* - * Modify (by adding) the state flag, if writing. + * There's a 32/64 bit type mismatch between the + * allocation length request (which can be 64 bits in + * length) and the bma length request, which is + * xfs_extlen_t and therefore 32 bits. Hence we have to + * check for 32-bit overflows and handle them here. */ - ASSERT(mval->br_blockcount <= len); - if ((ifp->if_flags & XFS_IFBROOT) && !cur) { - cur = xfs_bmbt_init_cursor(mp, - tp, ip, whichfork); - cur->bc_private.b.firstblock = - *firstblock; - cur->bc_private.b.flist = flist; - } - mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) - ? XFS_EXT_NORM - : XFS_EXT_UNWRITTEN; - error = xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, - whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); - logflags |= tmp_logflags; + if (len > (xfs_filblks_t)MAXEXTLEN) + bma.length = MAXEXTLEN; + else + bma.length = len; + + ASSERT(len > 0); + ASSERT(bma.length > 0); + error = xfs_bmapi_allocate(&bma); if (error) goto error0; - lastx = ifp->if_lastex; - ep = xfs_iext_get_ext(ifp, lastx); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - xfs_bmbt_get_all(ep, &got); - /* - * We may have combined previously unwritten - * space with written space, so generate - * another request. - */ - if (mval->br_blockcount < len) - continue; + if (bma.blkno == NULLFSBLOCK) + break; } - ASSERT((flags & XFS_BMAPI_ENTIRE) || - ((mval->br_startoff + mval->br_blockcount) <= end)); - ASSERT((flags & XFS_BMAPI_ENTIRE) || - (mval->br_blockcount <= len) || - (mval->br_startoff < obno)); - bno = mval->br_startoff + mval->br_blockcount; - len = end - bno; - if (n > 0 && mval->br_startoff == mval[-1].br_startoff) { - ASSERT(mval->br_startblock == mval[-1].br_startblock); - ASSERT(mval->br_blockcount > mval[-1].br_blockcount); - ASSERT(mval->br_state == mval[-1].br_state); - mval[-1].br_blockcount = mval->br_blockcount; - mval[-1].br_state = mval->br_state; - } else if (n > 0 && mval->br_startblock != DELAYSTARTBLOCK && - mval[-1].br_startblock != DELAYSTARTBLOCK && - mval[-1].br_startblock != HOLESTARTBLOCK && - mval->br_startblock == - mval[-1].br_startblock + mval[-1].br_blockcount && - ((flags & XFS_BMAPI_IGSTATE) || - mval[-1].br_state == mval->br_state)) { - ASSERT(mval->br_startoff == - mval[-1].br_startoff + mval[-1].br_blockcount); - mval[-1].br_blockcount += mval->br_blockcount; - } else if (n > 0 && - mval->br_startblock == DELAYSTARTBLOCK && - mval[-1].br_startblock == DELAYSTARTBLOCK && - mval->br_startoff == - mval[-1].br_startoff + mval[-1].br_blockcount) { - mval[-1].br_blockcount += mval->br_blockcount; - mval[-1].br_state = mval->br_state; - } else if (!((n == 0) && - ((mval->br_startoff + mval->br_blockcount) <= - obno))) { - mval++; - n++; - } + /* Deal with the allocated space we found. */ + xfs_bmapi_trim_map(mval, &bma.got, &bno, len, obno, + end, n, flags); + + /* Execute unwritten extent conversion if necessary */ + error = xfs_bmapi_convert_unwritten(&bma, mval, len, flags); + if (error == EAGAIN) + continue; + if (error) + goto error0; + + /* update the extent map to return */ + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + /* * If we're done, stop now. Stop when we've allocated * XFS_BMAP_MAX_NMAP extents no matter what. Otherwise * the transaction may get too big. */ - if (bno >= end || n >= *nmap || nallocs >= *nmap) + if (bno >= end || n >= *nmap || bma.nallocs >= *nmap) break; - /* - * Else go on to the next record. - */ - ep = xfs_iext_get_ext(ifp, ++lastx); - prev = got; - if (lastx >= nextents) + + /* Else go on to the next record. */ + bma.prev = bma.got; + if (++bma.idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma.idx), + &bma.got); + } else eof = 1; - else - xfs_bmbt_get_all(ep, &got); } - ifp->if_lastex = lastx; *nmap = n; + /* * Transform from btree to extents, give it cur. */ - if (tp && XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && - XFS_IFORK_NEXTENTS(ip, whichfork) <= ifp->if_ext_max) { - ASSERT(wr && cur); - error = xfs_bmap_btree_to_extents(tp, ip, cur, + if (xfs_bmap_wants_extents(ip, whichfork)) { + int tmp_logflags = 0; + + ASSERT(bma.cur); + error = xfs_bmap_btree_to_extents(tp, ip, bma.cur, &tmp_logflags, whichfork); - logflags |= tmp_logflags; + bma.logflags |= tmp_logflags; if (error) goto error0; } - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); + XFS_IFORK_NEXTENTS(ip, whichfork) > + XFS_IFORK_MAXEXT(ip, whichfork)); error = 0; error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & xfs_ilog_fext(whichfork)) && + if ((bma.logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~xfs_ilog_fext(whichfork); - else if ((logflags & xfs_ilog_fbroot(whichfork)) && + bma.logflags &= ~xfs_ilog_fext(whichfork); + else if ((bma.logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~xfs_ilog_fbroot(whichfork); + bma.logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, * and it's not logged so we don't shutdown when we should. */ - if (logflags) { - ASSERT(tp && wr); - xfs_trans_log_inode(tp, ip, logflags); - } - if (cur) { + if (bma.logflags) + xfs_trans_log_inode(tp, ip, bma.logflags); + + if (bma.cur) { if (!error) { ASSERT(*firstblock == NULLFSBLOCK || XFS_FSB_TO_AGNO(mp, *firstblock) == XFS_FSB_TO_AGNO(mp, - cur->bc_private.b.firstblock) || + bma.cur->bc_private.b.firstblock) || (flist->xbf_low && XFS_FSB_TO_AGNO(mp, *firstblock) < XFS_FSB_TO_AGNO(mp, - cur->bc_private.b.firstblock))); - *firstblock = cur->bc_private.b.firstblock; + bma.cur->bc_private.b.firstblock))); + *firstblock = bma.cur->bc_private.b.firstblock; } - xfs_btree_del_cursor(cur, + xfs_btree_del_cursor(bma.cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); } if (!error) @@ -4649,59 +4793,6 @@ error0: } /* - * Map file blocks to filesystem blocks, simple version. - * One block (extent) only, read-only. - * For flags, only the XFS_BMAPI_ATTRFORK flag is examined. - * For the other flag values, the effect is as if XFS_BMAPI_METADATA - * was set and all the others were clear. - */ -int /* error */ -xfs_bmapi_single( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - xfs_fsblock_t *fsb, /* output: mapped block */ - xfs_fileoff_t bno) /* starting file offs. mapped */ -{ - int eof; /* we've hit the end of extents */ - int error; /* error return */ - xfs_bmbt_irec_t got; /* current file extent record */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extnum_t lastx; /* last useful extent number */ - xfs_bmbt_irec_t prev; /* previous file extent record */ - - ifp = XFS_IFORK_PTR(ip, whichfork); - if (unlikely( - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)) { - XFS_ERROR_REPORT("xfs_bmapi_single", XFS_ERRLEVEL_LOW, - ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return XFS_ERROR(EIO); - XFS_STATS_INC(xs_blk_mapr); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(tp, ip, whichfork))) - return error; - (void)xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); - /* - * Reading past eof, act as though there's a hole - * up to end. - */ - if (eof || got.br_startoff > bno) { - *fsb = NULLFSBLOCK; - return 0; - } - ASSERT(!isnullstartblock(got.br_startblock)); - ASSERT(bno < got.br_startoff + got.br_blockcount); - *fsb = got.br_startblock + (bno - got.br_startoff); - ifp->if_lastex = lastx; - return 0; -} - -/* * Unmap (remove) blocks from a file. * If nexts is nonzero then the number of extents to remove is limited to * that value. If not all extents in the block range can be removed then @@ -4739,7 +4830,6 @@ xfs_bunmapi( int tmp_logflags; /* partial logging flags */ int wasdel; /* was a delayed alloc extent */ int whichfork; /* data or attribute fork */ - int rsvd; /* OK to allocate reserved blocks */ xfs_fsblock_t sum; trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); @@ -4757,11 +4847,10 @@ xfs_bunmapi( mp = ip->i_mount; if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - rsvd = (flags & XFS_BMAPI_RSVBLOCKS) != 0; + ASSERT(len > 0); ASSERT(nexts >= 0); - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + if (!(ifp->if_flags & XFS_IFEXTENTS) && (error = xfs_iread_extents(tp, ip, whichfork))) return error; @@ -4795,6 +4884,15 @@ xfs_bunmapi( cur->bc_private.b.flags = 0; } else cur = NULL; + + if (isrt) { + /* + * Synchronize by locking the bitmap inode. + */ + xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); + } + extno = 0; while (bno != (xfs_fileoff_t)-1 && bno >= start && lastx >= 0 && (nexts == 0 || extno < nexts)) { @@ -4873,9 +4971,9 @@ xfs_bunmapi( del.br_blockcount = mod; } del.br_state = XFS_EXT_UNWRITTEN; - error = xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + error = xfs_bmap_add_extent_unwritten_real(tp, ip, + &lastx, &cur, &del, firstblock, flist, + &logflags); if (error) goto error0; goto nodelete; @@ -4901,9 +4999,12 @@ xfs_bunmapi( */ ASSERT(bno >= del.br_blockcount); bno -= del.br_blockcount; - if (bno < got.br_startoff) { - if (--lastx >= 0) - xfs_bmbt_get_all(--ep, &got); + if (got.br_startoff > bno) { + if (--lastx >= 0) { + ep = xfs_iext_get_ext(ifp, + lastx); + xfs_bmbt_get_all(ep, &got); + } } continue; } else if (del.br_state == XFS_EXT_UNWRITTEN) { @@ -4927,18 +5028,19 @@ xfs_bunmapi( prev.br_startoff = start; } prev.br_state = XFS_EXT_UNWRITTEN; - error = xfs_bmap_add_extent(ip, lastx - 1, &cur, - &prev, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + lastx--; + error = xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &prev, + firstblock, flist, &logflags); if (error) goto error0; goto nodelete; } else { ASSERT(del.br_state == XFS_EXT_NORM); del.br_state = XFS_EXT_UNWRITTEN; - error = xfs_bmap_add_extent(ip, lastx, &cur, - &del, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + error = xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &del, + firstblock, flist, &logflags); if (error) goto error0; goto nodelete; @@ -4953,13 +5055,13 @@ xfs_bunmapi( rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); do_div(rtexts, mp->m_sb.sb_rextsize); xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, rsvd); + (int64_t)rtexts, 0); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, rsvd); + (int64_t)del.br_blockcount, 0); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_REGBLKS); @@ -4983,46 +5085,43 @@ xfs_bunmapi( */ if (!wasdel && xfs_trans_get_block_res(tp) == 0 && XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) >= ifp->if_ext_max && + XFS_IFORK_NEXTENTS(ip, whichfork) >= /* Note the >= */ + XFS_IFORK_MAXEXT(ip, whichfork) && del.br_startoff > got.br_startoff && del.br_startoff + del.br_blockcount < got.br_startoff + got.br_blockcount) { error = XFS_ERROR(ENOSPC); goto error0; } - error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, whichfork, rsvd); + error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, + &tmp_logflags, whichfork); logflags |= tmp_logflags; if (error) goto error0; bno = del.br_startoff - 1; nodelete: - lastx = ifp->if_lastex; /* * If not done go on to the next (previous) record. - * Reset ep in case the extents array was re-alloced. */ - ep = xfs_iext_get_ext(ifp, lastx); if (bno != (xfs_fileoff_t)-1 && bno >= start) { - if (lastx >= XFS_IFORK_NEXTENTS(ip, whichfork) || - xfs_bmbt_get_startoff(ep) > bno) { - if (--lastx >= 0) - ep = xfs_iext_get_ext(ifp, lastx); - } - if (lastx >= 0) + if (lastx >= 0) { + ep = xfs_iext_get_ext(ifp, lastx); + if (xfs_bmbt_get_startoff(ep) > bno) { + if (--lastx >= 0) + ep = xfs_iext_get_ext(ifp, + lastx); + } xfs_bmbt_get_all(ep, &got); + } extno++; } } - ifp->if_lastex = lastx; *done = bno == (xfs_fileoff_t)-1 || bno < start || lastx < 0; - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + /* * Convert to a btree if necessary. */ - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max) { + if (xfs_bmap_needs_btree(ip, whichfork)) { ASSERT(cur == NULL); error = xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, &cur, 0, &tmp_logflags, whichfork); @@ -5033,8 +5132,7 @@ nodelete: /* * transform from btree to extents, give it cur */ - else if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && - XFS_IFORK_NEXTENTS(ip, whichfork) <= ifp->if_ext_max) { + else if (xfs_bmap_wants_extents(ip, whichfork)) { ASSERT(cur != NULL); error = xfs_bmap_btree_to_extents(tp, ip, cur, &tmp_logflags, whichfork); @@ -5045,8 +5143,6 @@ nodelete: /* * transform from extents to local? */ - ASSERT(ifp->if_ext_max == - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error = 0; error0: /* @@ -5076,88 +5172,252 @@ error0: return error; } +#ifdef DEBUG +STATIC struct xfs_buf * +xfs_bmap_get_bp( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno) +{ + struct xfs_log_item_desc *lidp; + int i; + + if (!cur) + return NULL; + + for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) { + if (!cur->bc_bufs[i]) + break; + if (XFS_BUF_ADDR(cur->bc_bufs[i]) == bno) + return cur->bc_bufs[i]; + } + + /* Chase down all the log items to see if the bp is there */ + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + struct xfs_buf_log_item *bip; + bip = (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) == bno) + return bip->bli_buf; + } + + return NULL; +} + +STATIC void +xfs_check_block( + struct xfs_btree_block *block, + xfs_mount_t *mp, + int root, + short sz) +{ + int i, j, dmxr; + __be64 *pp, *thispa; /* pointer to block address */ + xfs_bmbt_key_t *prevp, *keyp; + + ASSERT(be16_to_cpu(block->bb_level) > 0); + + prevp = NULL; + for( i = 1; i <= xfs_btree_get_numrecs(block); i++) { + dmxr = mp->m_bmap_dmxr[0]; + keyp = XFS_BMBT_KEY_ADDR(mp, block, i); + + if (prevp) { + ASSERT(be64_to_cpu(prevp->br_startoff) < + be64_to_cpu(keyp->br_startoff)); + } + prevp = keyp; + + /* + * Compare the block numbers to see if there are dups. + */ + if (root) + pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, i, sz); + else + pp = XFS_BMBT_PTR_ADDR(mp, block, i, dmxr); + + for (j = i+1; j <= be16_to_cpu(block->bb_numrecs); j++) { + if (root) + thispa = XFS_BMAP_BROOT_PTR_ADDR(mp, block, j, sz); + else + thispa = XFS_BMBT_PTR_ADDR(mp, block, j, dmxr); + if (*thispa == *pp) { + xfs_warn(mp, "%s: thispa(%d) == pp(%d) %Ld", + __func__, j, i, + (unsigned long long)be64_to_cpu(*thispa)); + panic("%s: ptrs are equal in node\n", + __func__); + } + } + } +} + /* - * Check the last inode extent to determine whether this allocation will result - * in blocks being allocated at the end of the file. When we allocate new data - * blocks at the end of the file which do not start at the previous data block, - * we will try to align the new blocks at stripe unit boundaries. + * Check that the extents for the inode ip are in the right order in all + * btree leaves. */ -STATIC int /* error */ -xfs_bmap_isaeof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t off, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - char *aeof) /* return value */ + +STATIC void +xfs_bmap_check_leaf_extents( + xfs_btree_cur_t *cur, /* btree cursor or null */ + xfs_inode_t *ip, /* incore inode pointer */ + int whichfork) /* data or attr fork */ { - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_bmbt_irec_t s; /* expanded extent record */ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_buf_t *bp; /* buffer for "block" */ + int error; /* error return value */ + xfs_extnum_t i=0, j; /* index into the extents list */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + xfs_bmbt_rec_t *ep; /* pointer to current extent */ + xfs_bmbt_rec_t last = {0, 0}; /* last extent in prev block */ + xfs_bmbt_rec_t *nextp; /* pointer to next extent */ + int bp_release = 0; - ASSERT(whichfork == XFS_DATA_FORK); - ifp = XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(NULL, ip, whichfork))) - return error; - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents == 0) { - *aeof = 1; - return 0; + if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) { + return; } + + bno = NULLFSBLOCK; + mp = ip->i_mount; + ifp = XFS_IFORK_PTR(ip, whichfork); + block = ifp->if_broot; /* - * Go to the last extent + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. */ - lastrec = xfs_iext_get_ext(ifp, nextents - 1); - xfs_bmbt_get_all(lastrec, &s); + level = be16_to_cpu(block->bb_level); + ASSERT(level > 0); + xfs_check_block(block, mp, 1, ifp->if_broot_bytes); + pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno = be64_to_cpu(*pp); + + ASSERT(bno != NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + /* - * Check we are allocating in the last extent (for delayed allocations) - * or past the last extent for non-delayed allocations. + * Go down the tree until leaf level is reached, following the first + * pointer (leftmost) at each level. */ - *aeof = (off >= s.br_startoff && - off < s.br_startoff + s.br_blockcount && - isnullstartblock(s.br_startblock)) || - off >= s.br_startoff + s.br_blockcount; - return 0; -} + while (level-- > 0) { + /* See if buf is in cur first */ + bp_release = 0; + bp = xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release = 1; + error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + goto error_norelse; + } + block = XFS_BUF_TO_BLOCK(bp); + XFS_WANT_CORRUPTED_GOTO( + xfs_bmap_sanity_check(mp, bp, level), + error0); + if (level == 0) + break; -/* - * Check if the endoff is outside the last extent. If so the caller will grow - * the allocation to a stripe unit boundary. - */ -int /* error */ -xfs_bmap_eof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t endoff, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - int *eof) /* result value */ -{ - xfs_fsblock_t blockcount; /* extent block count */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_fileoff_t startoff; /* extent starting file offset */ + /* + * Check this block for basic sanity (increasing keys and + * no duplicate blocks). + */ - ASSERT(whichfork == XFS_DATA_FORK); - ifp = XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(NULL, ip, whichfork))) - return error; - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents == 0) { - *eof = 1; - return 0; + xfs_check_block(block, mp, 0, 0); + pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno = be64_to_cpu(*pp); + XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + if (bp_release) { + bp_release = 0; + xfs_trans_brelse(NULL, bp); + } } + + /* + * Here with bp and block set to the leftmost leaf node in the tree. + */ + i = 0; + /* - * Go to the last extent + * Loop over all leaf nodes checking that all extents are in the right order. */ - lastrec = xfs_iext_get_ext(ifp, nextents - 1); - startoff = xfs_bmbt_get_startoff(lastrec); - blockcount = xfs_bmbt_get_blockcount(lastrec); - *eof = endoff >= startoff + blockcount; - return 0; + for (;;) { + xfs_fsblock_t nextbno; + xfs_extnum_t num_recs; + + + num_recs = xfs_btree_get_numrecs(block); + + /* + * Read-ahead the next leaf block, if any. + */ + + nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); + + /* + * Check all the extents to make sure they are OK. + * If we had a previous block, the last entry should + * conform with the first entry in this one. + */ + + ep = XFS_BMBT_REC_ADDR(mp, block, 1); + if (i) { + ASSERT(xfs_bmbt_disk_get_startoff(&last) + + xfs_bmbt_disk_get_blockcount(&last) <= + xfs_bmbt_disk_get_startoff(ep)); + } + for (j = 1; j < num_recs; j++) { + nextp = XFS_BMBT_REC_ADDR(mp, block, j + 1); + ASSERT(xfs_bmbt_disk_get_startoff(ep) + + xfs_bmbt_disk_get_blockcount(ep) <= + xfs_bmbt_disk_get_startoff(nextp)); + ep = nextp; + } + + last = *ep; + i += num_recs; + if (bp_release) { + bp_release = 0; + xfs_trans_brelse(NULL, bp); + } + bno = nextbno; + /* + * If we've reached the end, stop. + */ + if (bno == NULLFSBLOCK) + break; + + bp_release = 0; + bp = xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release = 1; + error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + goto error_norelse; + } + block = XFS_BUF_TO_BLOCK(bp); + } + if (bp_release) { + bp_release = 0; + xfs_trans_brelse(NULL, bp); + } + return; + +error0: + xfs_warn(mp, "%s: at error0", __func__); + if (bp_release) + xfs_trans_brelse(NULL, bp); +error_norelse: + xfs_warn(mp, "%s: BAD after btree leaves for %d extents", + __func__, i); + panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); + return; } +#endif /* * Count fsblocks of the given fork. @@ -5229,7 +5489,9 @@ xfs_bmap_count_tree( struct xfs_btree_block *block, *nextblock; int numrecs; - if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count += 1; block = XFS_BUF_TO_BLOCK(bp); @@ -5238,8 +5500,10 @@ xfs_bmap_count_tree( /* Not at node above leaves, count this level of nodes */ nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); while (nextbno != NULLFSBLOCK) { - if ((error = xfs_btree_read_bufl(mp, tp, nextbno, - 0, &nbp, XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, nextbno, 0, &nbp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count += 1; nextblock = XFS_BUF_TO_BLOCK(nbp); @@ -5268,8 +5532,10 @@ xfs_bmap_count_tree( if (nextbno == NULLFSBLOCK) break; bno = nextbno; - if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count += 1; block = XFS_BUF_TO_BLOCK(bp); @@ -5315,3 +5581,16 @@ xfs_bmap_disk_count_leaves( *count += xfs_bmbt_disk_get_blockcount(frp); } } + +/* + * Convert the given file system block to a disk block. We have to treat it + * differently based on whether the file is a real time file or not, because the + * bmap code does. + */ +xfs_daddr_t +xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) +{ + return (XFS_IS_REALTIME_INODE(ip) ? \ + (xfs_daddr_t)XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \ + XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); +} diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index ff51fdd..836f52f 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -403,10 +403,10 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; - ASSERT(be32_to_cpu(rblock->bb_magic) == XFS_BMAP_MAGIC); - ASSERT(be64_to_cpu(rblock->bb_u.l.bb_leftsib) == NULLDFSBNO); - ASSERT(be64_to_cpu(rblock->bb_u.l.bb_rightsib) == NULLDFSBNO); - ASSERT(be16_to_cpu(rblock->bb_level) > 0); + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); + ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO)); + ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO)); + ASSERT(rblock->bb_level != 0); dblock->bb_level = rblock->bb_level; dblock->bb_numrecs = rblock->bb_numrecs; dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); @@ -687,6 +687,67 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } +static void +xfs_bmbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + unsigned int level; + int lblock_ok; /* block passes checks */ + + /* magic number and level verification. + * + * We don't know waht fork we belong to, so just verify that the level + * is less than the maximum of the two. Later checks will be more + * precise. + */ + level = be16_to_cpu(block->bb_level); + lblock_ok = block->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC) && + level < MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); + + /* numrecs verification */ + lblock_ok = lblock_ok && + be16_to_cpu(block->bb_numrecs) <= mp->m_bmap_dmxr[level != 0]; + + /* sibling pointer verification */ + lblock_ok = lblock_ok && + block->bb_u.l.bb_leftsib && + (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || + XFS_FSB_SANITY_CHECK(mp, + be64_to_cpu(block->bb_u.l.bb_leftsib))) && + block->bb_u.l.bb_rightsib && + (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || + XFS_FSB_SANITY_CHECK(mp, + be64_to_cpu(block->bb_u.l.bb_rightsib))); + + if (!lblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_bmbt_read_verify( + struct xfs_buf *bp) +{ + xfs_bmbt_verify(bp); +} + +static void +xfs_bmbt_write_verify( + struct xfs_buf *bp) +{ + xfs_bmbt_verify(bp); +} + +const struct xfs_buf_ops xfs_bmbt_buf_ops = { + .verify_read = xfs_bmbt_read_verify, + .verify_write = xfs_bmbt_write_verify, +}; + + #ifdef DEBUG STATIC int xfs_bmbt_keys_inorder( @@ -815,7 +876,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .init_rec_from_cur = xfs_bmbt_init_rec_from_cur, .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, - + .buf_ops = &xfs_bmbt_buf_ops, #ifdef DEBUG .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 02854db..c35269b 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -48,11 +48,11 @@ xfs_btree_check_lblock( be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && - (be64_to_cpu(block->bb_u.l.bb_leftsib) == NULLDFSBNO || + (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && - (be64_to_cpu(block->bb_u.l.bb_rightsib) == NULLDFSBNO || + (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib))); if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, @@ -87,10 +87,10 @@ xfs_btree_check_sblock( be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && - (be32_to_cpu(block->bb_u.s.bb_leftsib) == NULLAGBLOCK || + (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_leftsib) < agflen) && block->bb_u.s.bb_leftsib && - (be32_to_cpu(block->bb_u.s.bb_rightsib) == NULLAGBLOCK || + (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, @@ -250,16 +250,19 @@ xfs_btree_dup_cursor( for (i = 0; i < new->bc_nlevels; i++) { new->bc_ptrs[i] = cur->bc_ptrs[i]; new->bc_ra[i] = cur->bc_ra[i]; - if ((bp = cur->bc_bufs[i])) { - if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, - XFS_BUF_ADDR(bp), mp->m_bsize, 0, &bp))) { + bp = cur->bc_bufs[i]; + if (bp) { + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_BUF_ADDR(bp), mp->m_bsize, + 0, &bp, + cur->bc_ops->buf_ops); + if (error) { xfs_btree_del_cursor(new, error); *ncur = NULL; return error; } new->bc_bufs[i] = bp; - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); } else new->bc_bufs[i] = NULL; } @@ -450,8 +453,7 @@ xfs_btree_get_bufl( ASSERT(fsbno != NULLFSBLOCK); d = XFS_FSB_TO_DADDR(mp, fsbno); bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); return bp; } @@ -474,8 +476,7 @@ xfs_btree_get_bufs( ASSERT(agbno != NULLAGBLOCK); d = XFS_AGB_TO_DADDR(mp, agno, agbno); bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); return bp; } @@ -493,9 +494,9 @@ xfs_btree_islastblock( block = xfs_btree_get_block(cur, level, &bp); xfs_btree_check_block(cur, block, level, bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(block->bb_u.l.bb_rightsib) == NULLDFSBNO; + return block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO); else - return be32_to_cpu(block->bb_u.s.bb_rightsib) == NULLAGBLOCK; + return block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK); } /* @@ -596,69 +597,29 @@ xfs_btree_offsets( * Get a buffer for the block, return it read in. * Long-form addressing. */ -int /* error */ +int xfs_btree_read_bufl( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_fsblock_t fsbno, /* file system block number */ - uint lock, /* lock flags for read_buf */ - xfs_buf_t **bpp, /* buffer for fsbno */ - int refval) /* ref count value for buffer */ -{ - xfs_buf_t *bp; /* return value */ + struct xfs_mount *mp, /* file system mount point */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_fsblock_t fsbno, /* file system block number */ + uint lock, /* lock flags for read_buf */ + struct xfs_buf **bpp, /* buffer for fsbno */ + int refval, /* ref count value for buffer */ + const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; /* return value */ xfs_daddr_t d; /* real disk block address */ - int error; + int error; ASSERT(fsbno != NULLFSBLOCK); d = XFS_FSB_TO_DADDR(mp, fsbno); - if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, lock, &bp))) { - return error; - } - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (bp != NULL) { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); - } - *bpp = bp; - return 0; -} - -/* - * Get a buffer for the block, return it read in. - * Short-form addressing. - */ -int /* error */ -xfs_btree_read_bufs( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_agblock_t agbno, /* allocation group block number */ - uint lock, /* lock flags for read_buf */ - xfs_buf_t **bpp, /* buffer for agno/agbno */ - int refval) /* ref count value for buffer */ -{ - xfs_buf_t *bp; /* return value */ - xfs_daddr_t d; /* real disk block address */ - int error; - - ASSERT(agno != NULLAGNUMBER); - ASSERT(agbno != NULLAGBLOCK); - d = XFS_AGB_TO_DADDR(mp, agno, agbno); - if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, lock, &bp))) { + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, + mp->m_bsize, lock, &bp, ops); + if (error) return error; - } - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (bp != NULL) { - switch (refval) { - case XFS_ALLOC_BTREE_REF: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); - break; - case XFS_INO_BTREE_REF: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, refval); - break; - } - } + ASSERT(!xfs_buf_geterror(bp)); + if (bp) + xfs_buf_set_ref(bp, refval); *bpp = bp; return 0; } @@ -674,12 +635,14 @@ xfs_btree_readahead_lblock( xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); if ((lr & XFS_BTCUR_LEFTRA) && left != NULLDFSBNO) { - xfs_btree_reada_bufl(cur->bc_mp, left, 1); + xfs_btree_reada_bufl(cur->bc_mp, left, 1, + cur->bc_ops->buf_ops); rval++; } if ((lr & XFS_BTCUR_RIGHTRA) && right != NULLDFSBNO) { - xfs_btree_reada_bufl(cur->bc_mp, right, 1); + xfs_btree_reada_bufl(cur->bc_mp, right, 1, + cur->bc_ops->buf_ops); rval++; } @@ -699,13 +662,13 @@ xfs_btree_readahead_sblock( if ((lr & XFS_BTCUR_LEFTRA) && left != NULLAGBLOCK) { xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, - left, 1); + left, 1, cur->bc_ops->buf_ops); rval++; } if ((lr & XFS_BTCUR_RIGHTRA) && right != NULLAGBLOCK) { xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, - right, 1); + right, 1, cur->bc_ops->buf_ops); rval++; } @@ -762,14 +725,14 @@ xfs_btree_setbuf( b = XFS_BUF_TO_BLOCK(bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - if (be64_to_cpu(b->bb_u.l.bb_leftsib) == NULLDFSBNO) + if (b->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO)) cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; - if (be64_to_cpu(b->bb_u.l.bb_rightsib) == NULLDFSBNO) + if (b->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO)) cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; } else { - if (be32_to_cpu(b->bb_u.s.bb_leftsib) == NULLAGBLOCK) + if (b->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK)) cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; - if (be32_to_cpu(b->bb_u.s.bb_rightsib) == NULLAGBLOCK) + if (b->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK)) cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; } } @@ -780,9 +743,9 @@ xfs_btree_ptr_is_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(ptr->l) == NULLDFSBNO; + return ptr->l == cpu_to_be64(NULLDFSBNO); else - return be32_to_cpu(ptr->s) == NULLAGBLOCK; + return ptr->s == cpu_to_be32(NULLAGBLOCK); } STATIC void @@ -843,18 +806,22 @@ xfs_btree_set_sibling( } } -STATIC void +void xfs_btree_init_block( - struct xfs_btree_cur *cur, - int level, - int numrecs, - struct xfs_btree_block *new) /* new block */ + struct xfs_mount *mp, + struct xfs_buf *bp, + __u32 magic, + __u16 level, + __u16 numrecs, + unsigned int flags) { - new->bb_magic = cpu_to_be32(xfs_magics[cur->bc_btnum]); + struct xfs_btree_block *new = XFS_BUF_TO_BLOCK(bp); + + new->bb_magic = cpu_to_be32(magic); new->bb_level = cpu_to_be16(level); new->bb_numrecs = cpu_to_be16(numrecs); - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (flags & XFS_BTREE_LONG_PTRS) { new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); } else { @@ -863,6 +830,17 @@ xfs_btree_init_block( } } +STATIC void +xfs_btree_init_block_cur( + struct xfs_btree_cur *cur, + int level, + int numrecs, + struct xfs_buf *bp) +{ + xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], + level, numrecs, cur->bc_flags); +} + /* * Return true if ptr is the last record in the btree and * we need to track updateѕ to this record. The decision @@ -908,12 +886,12 @@ xfs_btree_ptr_to_daddr( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - ASSERT(be64_to_cpu(ptr->l) != NULLDFSBNO); + ASSERT(ptr->l != cpu_to_be64(NULLDFSBNO)); return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); } else { ASSERT(cur->bc_private.a.agno != NULLAGNUMBER); - ASSERT(be32_to_cpu(ptr->s) != NULLAGBLOCK); + ASSERT(ptr->s != cpu_to_be32(NULLAGBLOCK)); return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, be32_to_cpu(ptr->s)); @@ -928,13 +906,13 @@ xfs_btree_set_refs( switch (cur->bc_btnum) { case XFS_BTNUM_BNO: case XFS_BTNUM_CNT: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_ALLOC_BTREE_REF); + xfs_buf_set_ref(bp, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, XFS_INO_BTREE_REF); + xfs_buf_set_ref(bp, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_BMAP_BTREE_REF); + xfs_buf_set_ref(bp, XFS_BMAP_BTREE_REF); break; default: ASSERT(0); @@ -959,9 +937,10 @@ xfs_btree_get_buf_block( *bpp = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, mp->m_bsize, flags); - ASSERT(*bpp); - ASSERT(!XFS_BUF_GETERROR(*bpp)); + if (!*bpp) + return ENOMEM; + (*bpp)->b_ops = cur->bc_ops->buf_ops; *block = XFS_BUF_TO_BLOCK(*bpp); return 0; } @@ -988,20 +967,15 @@ xfs_btree_read_buf_block( d = xfs_btree_ptr_to_daddr(cur, ptr); error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, - mp->m_bsize, flags, bpp); + mp->m_bsize, flags, bpp, + cur->bc_ops->buf_ops); if (error) return error; - ASSERT(*bpp != NULL); - ASSERT(!XFS_BUF_GETERROR(*bpp)); - + ASSERT(!xfs_buf_geterror(*bpp)); xfs_btree_set_refs(cur, *bpp); *block = XFS_BUF_TO_BLOCK(*bpp); - - error = xfs_btree_check_block(cur, *block, level, *bpp); - if (error) - xfs_trans_brelse(cur->bc_tp, *bpp); - return error; + return 0; } /* @@ -2174,7 +2148,7 @@ xfs_btree_split( goto error0; /* Fill in the btree header for the new right block. */ - xfs_btree_init_block(cur, xfs_btree_get_level(left), 0, right); + xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); /* * Split the entries between the old and the new block evenly. @@ -2483,7 +2457,7 @@ xfs_btree_new_root( nptr = 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block(cur, cur->bc_nlevels, 2, new); + xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 3eb34d6..a31d353 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -62,14 +62,92 @@ STATIC void xfs_da_node_unbalance(xfs_da_state_t *state, /* * Utility routines. */ -STATIC uint xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count); -STATIC int xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp); -STATIC xfs_dabuf_t *xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra); +STATIC uint xfs_da_node_lasthash(struct xfs_buf *bp, int *count); +STATIC int xfs_da_node_order(struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp); STATIC int xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_da_state_blk_t *save_blk); STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); +static void +xfs_da_node_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_da_node_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC); + block_ok = block_ok && + be16_to_cpu(hdr->level) > 0 && + be16_to_cpu(hdr->count) > 0 ; + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + +} + +static void +xfs_da_node_write_verify( + struct xfs_buf *bp) +{ + xfs_da_node_verify(bp); +} + +/* + * leaf/node format detection on trees is sketchy, so a node read can be done on + * leaf level blocks when detection identifies the tree as a node format tree + * incorrectly. In this case, we need to swap the verifier to match the correct + * format of the block being read. + */ +static void +xfs_da_node_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_da_blkinfo *info = bp->b_addr; + + switch (be16_to_cpu(info->magic)) { + case XFS_DA_NODE_MAGIC: + xfs_da_node_verify(bp); + break; + case XFS_ATTR_LEAF_MAGIC: + bp->b_ops = &xfs_attr_leaf_buf_ops; + bp->b_ops->verify_read(bp); + return; + case XFS_DIR2_LEAFN_MAGIC: + bp->b_ops = &xfs_dir2_leafn_buf_ops; + bp->b_ops->verify_read(bp); + return; + default: + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, info); + xfs_buf_ioerror(bp, EFSCORRUPTED); + break; + } +} + +const struct xfs_buf_ops xfs_da_node_buf_ops = { + .verify_read = xfs_da_node_read_verify, + .verify_write = xfs_da_node_write_verify, +}; + + +int +xfs_da_node_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int which_fork) +{ + return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + which_fork, &xfs_da_node_buf_ops); +} + /*======================================================================== * Routines used for growing the Btree. *========================================================================*/ @@ -79,19 +157,21 @@ STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); */ int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - xfs_dabuf_t **bpp, int whichfork) + struct xfs_buf **bpp, int whichfork) { xfs_da_intnode_t *node; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; xfs_trans_t *tp; + trace_xfs_da_node_create(args); + tp = args->trans; error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); ASSERT(bp != NULL); - node = bp->data; + node = bp->b_addr; node->hdr.info.forw = 0; node->hdr.info.back = 0; node->hdr.info.magic = cpu_to_be16(XFS_DA_NODE_MAGIC); @@ -99,9 +179,10 @@ xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, node->hdr.count = 0; node->hdr.level = cpu_to_be16(level); - xfs_da_log_buf(tp, bp, + xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + bp->b_ops = &xfs_da_node_buf_ops; *bpp = bp; return(0); } @@ -115,9 +196,11 @@ xfs_da_split(xfs_da_state_t *state) { xfs_da_state_blk_t *oldblk, *newblk, *addblk; xfs_da_intnode_t *node; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int max, action, error, i; + trace_xfs_da_split(state->args); + /* * Walk back up the tree splitting/inserting/adjusting as necessary. * If we need to insert and there isn't room, split the node, then @@ -156,10 +239,12 @@ xfs_da_split(xfs_da_state_t *state) state->extravalid = 1; if (state->inleaf) { state->extraafter = 0; /* before newblk */ + trace_xfs_attr_leaf_split_before(state->args); error = xfs_attr_leaf_split(state, oldblk, &state->extrablk); } else { state->extraafter = 1; /* after newblk */ + trace_xfs_attr_leaf_split_after(state->args); error = xfs_attr_leaf_split(state, newblk, &state->extrablk); } @@ -176,7 +261,6 @@ xfs_da_split(xfs_da_state_t *state) case XFS_DA_NODE_MAGIC: error = xfs_da_node_split(state, oldblk, newblk, addblk, max - i, &action); - xfs_da_buf_done(addblk->bp); addblk->bp = NULL; if (error) return(error); /* GROT: dir is inconsistent */ @@ -194,13 +278,6 @@ xfs_da_split(xfs_da_state_t *state) * Update the btree to show the new hashval for this child. */ xfs_da_fixhashpath(state, &state->path); - /* - * If we won't need this block again, it's getting dropped - * from the active path by the loop control, so we need - * to mark it done now. - */ - if (i > 0 || !addblk) - xfs_da_buf_done(oldblk->bp); } if (!addblk) return(0); @@ -212,8 +289,6 @@ xfs_da_split(xfs_da_state_t *state) oldblk = &state->path.blk[0]; error = xfs_da_root_split(state, oldblk, addblk); if (error) { - xfs_da_buf_done(oldblk->bp); - xfs_da_buf_done(addblk->bp); addblk->bp = NULL; return(error); /* GROT: dir is inconsistent */ } @@ -225,7 +300,7 @@ xfs_da_split(xfs_da_state_t *state) * and the original block 0 could be at any position in the list. */ - node = oldblk->bp->data; + node = oldblk->bp->b_addr; if (node->hdr.info.forw) { if (be32_to_cpu(node->hdr.info.forw) == addblk->blkno) { bp = addblk->bp; @@ -233,13 +308,13 @@ xfs_da_split(xfs_da_state_t *state) ASSERT(state->extravalid); bp = state->extrablk.bp; } - node = bp->data; + node = bp->b_addr; node->hdr.info.back = cpu_to_be32(oldblk->blkno); - xfs_da_log_buf(state->args->trans, bp, + xfs_trans_log_buf(state->args->trans, bp, XFS_DA_LOGRANGE(node, &node->hdr.info, sizeof(node->hdr.info))); } - node = oldblk->bp->data; + node = oldblk->bp->b_addr; if (node->hdr.info.back) { if (be32_to_cpu(node->hdr.info.back) == addblk->blkno) { bp = addblk->bp; @@ -247,14 +322,12 @@ xfs_da_split(xfs_da_state_t *state) ASSERT(state->extravalid); bp = state->extrablk.bp; } - node = bp->data; + node = bp->b_addr; node->hdr.info.forw = cpu_to_be32(oldblk->blkno); - xfs_da_log_buf(state->args->trans, bp, + xfs_trans_log_buf(state->args->trans, bp, XFS_DA_LOGRANGE(node, &node->hdr.info, sizeof(node->hdr.info))); } - xfs_da_buf_done(oldblk->bp); - xfs_da_buf_done(addblk->bp); addblk->bp = NULL; return(0); } @@ -271,13 +344,15 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_intnode_t *node, *oldroot; xfs_da_args_t *args; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error, size; xfs_inode_t *dp; xfs_trans_t *tp; xfs_mount_t *mp; xfs_dir2_leaf_t *leaf; + trace_xfs_da_root_split(state->args); + /* * Copy the existing (incorrect) block from the root node position * to a free space somewhere. @@ -294,20 +369,21 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, if (error) return(error); ASSERT(bp != NULL); - node = bp->data; - oldroot = blk1->bp->data; - if (be16_to_cpu(oldroot->hdr.info.magic) == XFS_DA_NODE_MAGIC) { + node = bp->b_addr; + oldroot = blk1->bp->b_addr; + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(be16_to_cpu(oldroot->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); leaf = (xfs_dir2_leaf_t *)oldroot; size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - (char *)leaf); } memcpy(node, oldroot, size); - xfs_da_log_buf(tp, bp, 0, size - 1); - xfs_da_buf_done(blk1->bp); + xfs_trans_log_buf(tp, bp, 0, size - 1); + + bp->b_ops = blk1->bp->b_ops; blk1->bp = bp; blk1->blkno = blkno; @@ -319,7 +395,7 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); if (error) return(error); - node = bp->data; + node = bp->b_addr; node->btree[0].hashval = cpu_to_be32(blk1->hashval); node->btree[0].before = cpu_to_be32(blk1->blkno); node->btree[1].hashval = cpu_to_be32(blk2->hashval); @@ -327,7 +403,7 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, node->hdr.count = cpu_to_be16(2); #ifdef DEBUG - if (be16_to_cpu(oldroot->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC) { + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { ASSERT(blk1->blkno >= mp->m_dirleafblk && blk1->blkno < mp->m_dirfreeblk); ASSERT(blk2->blkno >= mp->m_dirleafblk && @@ -336,10 +412,9 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, #endif /* Header is already logged by xfs_da_node_create */ - xfs_da_log_buf(tp, bp, + xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, node->btree, sizeof(xfs_da_node_entry_t) * 2)); - xfs_da_buf_done(bp); return(0); } @@ -358,8 +433,10 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, int newcount, error; int useextra; - node = oldblk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + trace_xfs_da_node_split(state->args); + + node = oldblk->bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); /* * With V2 dirs the extra block is data or freespace. @@ -405,7 +482,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * * If we had double-split op below us, then add the extra block too. */ - node = oldblk->bp->data; + node = oldblk->bp->b_addr; if (oldblk->index <= be16_to_cpu(node->hdr.count)) { oldblk->index++; xfs_da_node_add(state, oldblk, addblk); @@ -444,8 +521,10 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, int count, tmp; xfs_trans_t *tp; - node1 = blk1->bp->data; - node2 = blk2->bp->data; + trace_xfs_da_node_rebalance(state->args); + + node1 = blk1->bp->b_addr; + node2 = blk2->bp->b_addr; /* * Figure out how many entries need to move, and in which direction. * Swap the nodes around if that makes it simpler. @@ -458,8 +537,8 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, node1 = node2; node2 = tmpnode; } - ASSERT(be16_to_cpu(node1->hdr.info.magic) == XFS_DA_NODE_MAGIC); - ASSERT(be16_to_cpu(node2->hdr.info.magic) == XFS_DA_NODE_MAGIC); + ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); count = (be16_to_cpu(node1->hdr.count) - be16_to_cpu(node2->hdr.count)) / 2; if (count == 0) return; @@ -499,7 +578,7 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, btree_d = &node1->btree[be16_to_cpu(node1->hdr.count)]; memcpy(btree_d, btree_s, tmp); be16_add_cpu(&node1->hdr.count, count); - xfs_da_log_buf(tp, blk1->bp, + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, btree_d, tmp)); /* @@ -516,9 +595,9 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* * Log header of node 1 and all current bits of node 2. */ - xfs_da_log_buf(tp, blk1->bp, + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, &node1->hdr, sizeof(node1->hdr))); - xfs_da_log_buf(tp, blk2->bp, + xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, sizeof(node2->hdr) + sizeof(node2->btree[0]) * be16_to_cpu(node2->hdr.count))); @@ -527,8 +606,8 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Record the last hashval from each block for upward propagation. * (note: don't use the swapped node pointers) */ - node1 = blk1->bp->data; - node2 = blk2->bp->data; + node1 = blk1->bp->b_addr; + node2 = blk2->bp->b_addr; blk1->hashval = be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval); blk2->hashval = be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval); @@ -552,8 +631,10 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, xfs_da_node_entry_t *btree; int tmp; - node = oldblk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + trace_xfs_da_node_add(state->args); + + node = oldblk->bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) @@ -571,10 +652,10 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, } btree->hashval = cpu_to_be32(newblk->hashval); btree->before = cpu_to_be32(newblk->blkno); - xfs_da_log_buf(state->args->trans, oldblk->bp, + xfs_trans_log_buf(state->args->trans, oldblk->bp, XFS_DA_LOGRANGE(node, btree, tmp + sizeof(*btree))); be16_add_cpu(&node->hdr.count, 1); - xfs_da_log_buf(state->args->trans, oldblk->bp, + xfs_trans_log_buf(state->args->trans, oldblk->bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); /* @@ -597,6 +678,8 @@ xfs_da_join(xfs_da_state_t *state) xfs_da_state_blk_t *drop_blk, *save_blk; int action, error; + trace_xfs_da_join(state->args); + action = 0; drop_blk = &state->path.blk[ state->path.active-1 ]; save_blk = &state->altpath.blk[ state->path.active-1 ]; @@ -670,6 +753,24 @@ xfs_da_join(xfs_da_state_t *state) return(error); } +#ifdef DEBUG +static void +xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) +{ + __be16 magic = blkinfo->magic; + + if (level == 1) { + ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + } else + ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(!blkinfo->forw); + ASSERT(!blkinfo->back); +} +#else /* !DEBUG */ +#define xfs_da_blkinfo_onlychild_validate(blkinfo, level) +#endif /* !DEBUG */ + /* * We have only one entry in the root. Copy the only remaining child of * the old root to block 0 as the new root node. @@ -678,18 +779,18 @@ STATIC int xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) { xfs_da_intnode_t *oldroot; - /* REFERENCED */ - xfs_da_blkinfo_t *blkinfo; xfs_da_args_t *args; xfs_dablk_t child; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; + trace_xfs_da_root_join(state->args); + args = state->args; ASSERT(args != NULL); ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC); - oldroot = root_blk->bp->data; - ASSERT(be16_to_cpu(oldroot->hdr.info.magic) == XFS_DA_NODE_MAGIC); + oldroot = root_blk->bp->b_addr; + ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); ASSERT(!oldroot->hdr.info.forw); ASSERT(!oldroot->hdr.info.back); @@ -705,22 +806,23 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) */ child = be32_to_cpu(oldroot->btree[0].before); ASSERT(child != 0); - error = xfs_da_read_buf(args->trans, args->dp, child, -1, &bp, + error = xfs_da_node_read(args->trans, args->dp, child, -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); - blkinfo = bp->data; - if (be16_to_cpu(oldroot->hdr.level) == 1) { - ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DIR2_LEAFN_MAGIC || - be16_to_cpu(blkinfo->magic) == XFS_ATTR_LEAF_MAGIC); - } else { - ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DA_NODE_MAGIC); - } - ASSERT(!blkinfo->forw); - ASSERT(!blkinfo->back); - memcpy(root_blk->bp->data, bp->data, state->blocksize); - xfs_da_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); + xfs_da_blkinfo_onlychild_validate(bp->b_addr, + be16_to_cpu(oldroot->hdr.level)); + + /* + * This could be copying a leaf back into the root block in the case of + * there only being a single leaf block left in the tree. Hence we have + * to update the b_ops pointer as well to match the buffer type change + * that could occur. + */ + memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); + root_blk->bp->b_ops = bp->b_ops; + xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error = xfs_da_shrink_inode(args, child, bp); return(error); } @@ -742,7 +844,9 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) xfs_da_blkinfo_t *info; int count, forward, error, retval, i; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; + + trace_xfs_da_node_toosmall(state->args); /* * Check for the degenerate case of the block being over 50% full. @@ -750,8 +854,8 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * to coalesce with a sibling. */ blk = &state->path.blk[ state->path.active-1 ]; - info = blk->bp->data; - ASSERT(be16_to_cpu(info->magic) == XFS_DA_NODE_MAGIC); + info = blk->bp->b_addr; + ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); node = (xfs_da_intnode_t *)info; count = be16_to_cpu(node->hdr.count); if (count > (state->node_ents >> 1)) { @@ -800,7 +904,7 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) blkno = be32_to_cpu(info->back); if (blkno == 0) continue; - error = xfs_da_read_buf(state->args->trans, state->args->dp, + error = xfs_da_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); @@ -810,10 +914,10 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) count = state->node_ents; count -= state->node_ents >> 2; count -= be16_to_cpu(node->hdr.count); - node = bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + node = bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); count -= be16_to_cpu(node->hdr.count); - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); if (count >= 0) break; /* fits with at least 25% to spare */ } @@ -865,6 +969,8 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) xfs_dahash_t lasthash=0; int level, count; + trace_xfs_da_fixhashpath(state->args); + level = path->active-1; blk = &path->blk[ level ]; switch (blk->magic) { @@ -885,14 +991,14 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) break; } for (blk--, level--; level >= 0; blk--, level--) { - node = blk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + node = blk->bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); btree = &node->btree[ blk->index ]; if (be32_to_cpu(btree->hashval) == lasthash) break; blk->hashval = lasthash; btree->hashval = cpu_to_be32(lasthash); - xfs_da_log_buf(state->args->trans, blk->bp, + xfs_trans_log_buf(state->args->trans, blk->bp, XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); lasthash = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); @@ -909,7 +1015,9 @@ xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk) xfs_da_node_entry_t *btree; int tmp; - node = drop_blk->bp->data; + trace_xfs_da_node_remove(state->args); + + node = drop_blk->bp->b_addr; ASSERT(drop_blk->index < be16_to_cpu(node->hdr.count)); ASSERT(drop_blk->index >= 0); @@ -921,15 +1029,15 @@ xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk) tmp = be16_to_cpu(node->hdr.count) - drop_blk->index - 1; tmp *= (uint)sizeof(xfs_da_node_entry_t); memmove(btree, btree + 1, tmp); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, btree, tmp)); btree = &node->btree[be16_to_cpu(node->hdr.count)-1]; } memset((char *)btree, 0, sizeof(xfs_da_node_entry_t)); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); be16_add_cpu(&node->hdr.count, -1); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); /* @@ -952,10 +1060,12 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, int tmp; xfs_trans_t *tp; - drop_node = drop_blk->bp->data; - save_node = save_blk->bp->data; - ASSERT(be16_to_cpu(drop_node->hdr.info.magic) == XFS_DA_NODE_MAGIC); - ASSERT(be16_to_cpu(save_node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + trace_xfs_da_node_unbalance(state->args); + + drop_node = drop_blk->bp->b_addr; + save_node = save_blk->bp->b_addr; + ASSERT(drop_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(save_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); tp = state->args->trans; /* @@ -970,13 +1080,13 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, tmp = be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); memmove(btree, &save_node->btree[0], tmp); btree = &save_node->btree[0]; - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, btree, (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)) * sizeof(xfs_da_node_entry_t))); } else { btree = &save_node->btree[be16_to_cpu(save_node->hdr.count)]; - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, btree, be16_to_cpu(drop_node->hdr.count) * sizeof(xfs_da_node_entry_t))); @@ -989,7 +1099,7 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, memcpy(btree, &drop_node->btree[0], tmp); be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, sizeof(save_node->hdr))); @@ -1040,14 +1150,14 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * Read the next node down in the tree. */ blk->blkno = blkno; - error = xfs_da_read_buf(args->trans, args->dp, blkno, + error = xfs_da_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) { blk->blkno = 0; state->path.active--; return(error); } - curr = blk->bp->data; + curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); ASSERT(blk->magic == XFS_DA_NODE_MAGIC || blk->magic == XFS_DIR2_LEAFN_MAGIC || @@ -1057,7 +1167,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * Search an intermediate node for a match. */ if (blk->magic == XFS_DA_NODE_MAGIC) { - node = blk->bp->data; + node = blk->bp->b_addr; max = be16_to_cpu(node->hdr.count); blk->hashval = be32_to_cpu(node->btree[max-1].hashval); @@ -1163,15 +1273,15 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_blkinfo_t *old_info, *new_info, *tmp_info; xfs_da_args_t *args; int before=0, error; - xfs_dabuf_t *bp; + struct xfs_buf *bp; /* * Set up environment. */ args = state->args; ASSERT(args != NULL); - old_info = old_blk->bp->data; - new_info = new_blk->bp->data; + old_info = old_blk->bp->b_addr; + new_info = new_blk->bp->b_addr; ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || old_blk->magic == XFS_DIR2_LEAFN_MAGIC || old_blk->magic == XFS_ATTR_LEAF_MAGIC); @@ -1198,48 +1308,48 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, /* * Link new block in before existing block. */ + trace_xfs_da_link_before(args); new_info->forw = cpu_to_be32(old_blk->blkno); new_info->back = old_info->back; if (old_info->back) { - error = xfs_da_read_buf(args->trans, args->dp, + error = xfs_da_node_read(args->trans, args->dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); - tmp_info = bp->data; + tmp_info = bp->b_addr; ASSERT(be16_to_cpu(tmp_info->magic) == be16_to_cpu(old_info->magic)); ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno); tmp_info->forw = cpu_to_be32(new_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); - xfs_da_buf_done(bp); + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); } old_info->back = cpu_to_be32(new_blk->blkno); } else { /* * Link new block in after existing block. */ + trace_xfs_da_link_after(args); new_info->forw = old_info->forw; new_info->back = cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error = xfs_da_read_buf(args->trans, args->dp, + error = xfs_da_node_read(args->trans, args->dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); - tmp_info = bp->data; + tmp_info = bp->b_addr; ASSERT(tmp_info->magic == old_info->magic); ASSERT(be32_to_cpu(tmp_info->back) == old_blk->blkno); tmp_info->back = cpu_to_be32(new_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); - xfs_da_buf_done(bp); + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); } old_info->forw = cpu_to_be32(new_blk->blkno); } - xfs_da_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1); - xfs_da_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1); + xfs_trans_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1); + xfs_trans_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1); return(0); } @@ -1247,14 +1357,16 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, * Compare two intermediate nodes for "order". */ STATIC int -xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp) +xfs_da_node_order( + struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp) { xfs_da_intnode_t *node1, *node2; - node1 = node1_bp->data; - node2 = node2_bp->data; - ASSERT((be16_to_cpu(node1->hdr.info.magic) == XFS_DA_NODE_MAGIC) && - (be16_to_cpu(node2->hdr.info.magic) == XFS_DA_NODE_MAGIC)); + node1 = node1_bp->b_addr; + node2 = node2_bp->b_addr; + ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) && + node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count) > 0) && ((be32_to_cpu(node2->btree[0].hashval) < be32_to_cpu(node1->btree[0].hashval)) || @@ -1269,12 +1381,14 @@ xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp) * Pick up the last hashvalue from an intermediate node. */ STATIC uint -xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count) +xfs_da_node_lasthash( + struct xfs_buf *bp, + int *count) { xfs_da_intnode_t *node; - node = bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + node = bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); if (count) *count = be16_to_cpu(node->hdr.count); if (!node->hdr.count) @@ -1291,7 +1405,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, { xfs_da_blkinfo_t *drop_info, *save_info, *tmp_info; xfs_da_args_t *args; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; /* @@ -1299,8 +1413,8 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, */ args = state->args; ASSERT(args != NULL); - save_info = save_blk->bp->data; - drop_info = drop_blk->bp->data; + save_info = save_blk->bp->b_addr; + drop_info = drop_blk->bp->b_addr; ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || save_blk->magic == XFS_DIR2_LEAFN_MAGIC || save_blk->magic == XFS_ATTR_LEAF_MAGIC); @@ -1316,42 +1430,42 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * Unlink the leaf block from the doubly linked chain of leaves. */ if (be32_to_cpu(save_info->back) == drop_blk->blkno) { + trace_xfs_da_unlink_back(args); save_info->back = drop_info->back; if (drop_info->back) { - error = xfs_da_read_buf(args->trans, args->dp, + error = xfs_da_node_read(args->trans, args->dp, be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); - tmp_info = bp->data; + tmp_info = bp->b_addr; ASSERT(tmp_info->magic == save_info->magic); ASSERT(be32_to_cpu(tmp_info->forw) == drop_blk->blkno); tmp_info->forw = cpu_to_be32(save_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info) - 1); - xfs_da_buf_done(bp); } } else { + trace_xfs_da_unlink_forward(args); save_info->forw = drop_info->forw; if (drop_info->forw) { - error = xfs_da_read_buf(args->trans, args->dp, + error = xfs_da_node_read(args->trans, args->dp, be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); - tmp_info = bp->data; + tmp_info = bp->b_addr; ASSERT(tmp_info->magic == save_info->magic); ASSERT(be32_to_cpu(tmp_info->back) == drop_blk->blkno); tmp_info->back = cpu_to_be32(save_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info) - 1); - xfs_da_buf_done(bp); } } - xfs_da_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1); + xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1); return(0); } @@ -1374,6 +1488,8 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, xfs_dablk_t blkno=0; int level, error; + trace_xfs_da_path_shift(state->args); + /* * Roll up the Btree looking for the first block where our * current index is not at the edge of the block. Note that @@ -1386,8 +1502,8 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, level = (path->active-1) - 1; /* skip bottom layer in path */ for (blk = &path->blk[level]; level >= 0; blk--, level--) { ASSERT(blk->bp != NULL); - node = blk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); + node = blk->bp->b_addr; + ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); if (forward && (blk->index < be16_to_cpu(node->hdr.count)-1)) { blk->index++; blkno = be32_to_cpu(node->btree[blk->index].before); @@ -1414,21 +1530,21 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, * (if it's dirty, trans won't actually let go) */ if (release) - xfs_da_brelse(args->trans, blk->bp); + xfs_trans_brelse(args->trans, blk->bp); /* * Read the next child block. */ blk->blkno = blkno; - error = xfs_da_read_buf(args->trans, args->dp, blkno, -1, - &blk->bp, args->whichfork); + error = xfs_da_node_read(args->trans, args->dp, blkno, -1, + &blk->bp, args->whichfork); if (error) return(error); ASSERT(blk->bp != NULL); - info = blk->bp->data; - ASSERT(be16_to_cpu(info->magic) == XFS_DA_NODE_MAGIC || - be16_to_cpu(info->magic) == XFS_DIR2_LEAFN_MAGIC || - be16_to_cpu(info->magic) == XFS_ATTR_LEAF_MAGIC); + info = blk->bp->b_addr; + ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); blk->magic = be16_to_cpu(info->magic); if (blk->magic == XFS_DA_NODE_MAGIC) { node = (xfs_da_intnode_t *)info; @@ -1521,79 +1637,60 @@ const struct xfs_nameops xfs_default_nameops = { .compname = xfs_da_compname }; -/* - * Add a block to the btree ahead of the file. - * Return the new block number to the caller. - */ int -xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) +xfs_da_grow_inode_int( + struct xfs_da_args *args, + xfs_fileoff_t *bno, + int count) { - xfs_fileoff_t bno, b; - xfs_bmbt_irec_t map; - xfs_bmbt_irec_t *mapp; - xfs_inode_t *dp; - int nmap, error, w, count, c, got, i, mapi; - xfs_trans_t *tp; - xfs_mount_t *mp; - xfs_drfsbno_t nblks; - - dp = args->dp; - mp = dp->i_mount; - w = args->whichfork; - tp = args->trans; - nblks = dp->i_d.di_nblocks; + struct xfs_trans *tp = args->trans; + struct xfs_inode *dp = args->dp; + int w = args->whichfork; + xfs_drfsbno_t nblks = dp->i_d.di_nblocks; + struct xfs_bmbt_irec map, *mapp; + int nmap, error, got, i, mapi; /* - * For new directories adjust the file offset and block count. - */ - if (w == XFS_DATA_FORK) { - bno = mp->m_dirleafblk; - count = mp->m_dirblkfsbs; - } else { - bno = 0; - count = 1; - } - /* * Find a spot in the file space to put the new block. */ - if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, w))) + error = xfs_bmap_first_unused(tp, dp, count, bno, w); + if (error) return error; - if (w == XFS_DATA_FORK) - ASSERT(bno >= mp->m_dirleafblk && bno < mp->m_dirfreeblk); + /* * Try mapping it in one filesystem block. */ nmap = 1; ASSERT(args->firstblock != NULL); - if ((error = xfs_bmapi(tp, dp, bno, count, - xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| - XFS_BMAPI_CONTIG, + error = xfs_bmapi_write(tp, dp, *bno, count, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist))) { + args->flist); + if (error) return error; - } + ASSERT(nmap <= 1); if (nmap == 1) { mapp = ↦ mapi = 1; - } - /* - * If we didn't get it and the block might work if fragmented, - * try without the CONTIG flag. Loop until we get it all. - */ - else if (nmap == 0 && count > 1) { + } else if (nmap == 0 && count > 1) { + xfs_fileoff_t b; + int c; + + /* + * If we didn't get it and the block might work if fragmented, + * try without the CONTIG flag. Loop until we get it all. + */ mapp = kmem_alloc(sizeof(*mapp) * count, KM_SLEEP); - for (b = bno, mapi = 0; b < bno + count; ) { + for (b = *bno, mapi = 0; b < *bno + count; ) { nmap = MIN(XFS_BMAP_MAX_NMAP, count); - c = (int)(bno + count - b); - if ((error = xfs_bmapi(tp, dp, b, c, - xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| - XFS_BMAPI_METADATA, + c = (int)(*bno + count - b); + error = xfs_bmapi_write(tp, dp, b, c, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { - kmem_free(mapp); - return error; - } + &mapp[mapi], &nmap, args->flist); + if (error) + goto out_free_map; if (nmap < 1) break; mapi += nmap; @@ -1604,24 +1701,55 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) mapi = 0; mapp = NULL; } + /* * Count the blocks we got, make sure it matches the total. */ for (i = 0, got = 0; i < mapi; i++) got += mapp[i].br_blockcount; - if (got != count || mapp[0].br_startoff != bno || + if (got != count || mapp[0].br_startoff != *bno || mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount != - bno + count) { - if (mapp != &map) - kmem_free(mapp); - return XFS_ERROR(ENOSPC); + *bno + count) { + error = XFS_ERROR(ENOSPC); + goto out_free_map; } - if (mapp != &map) - kmem_free(mapp); + /* account for newly allocated blocks in reserved blocks total */ args->total -= dp->i_d.di_nblocks - nblks; - *new_blkno = (xfs_dablk_t)bno; - return 0; + +out_free_map: + if (mapp != &map) + kmem_free(mapp); + return error; +} + +/* + * Add a block to the btree ahead of the file. + * Return the new block number to the caller. + */ +int +xfs_da_grow_inode( + struct xfs_da_args *args, + xfs_dablk_t *new_blkno) +{ + xfs_fileoff_t bno; + int count; + int error; + + trace_xfs_da_grow_inode(args); + + if (args->whichfork == XFS_DATA_FORK) { + bno = args->dp->i_mount->m_dirleafblk; + count = args->dp->i_mount->m_dirblkfsbs; + } else { + bno = 0; + count = 1; + } + + error = xfs_da_grow_inode_int(args, &bno, count); + if (!error) + *new_blkno = (xfs_dablk_t)bno; + return error; } /* @@ -1633,11 +1761,13 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) * a bmap btree split to do that. */ STATIC int -xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, - xfs_dabuf_t **dead_bufp) +xfs_da_swap_lastblock( + xfs_da_args_t *args, + xfs_dablk_t *dead_blknop, + struct xfs_buf **dead_bufp) { xfs_dablk_t dead_blkno, last_blkno, sib_blkno, par_blkno; - xfs_dabuf_t *dead_buf, *last_buf, *sib_buf, *par_buf; + struct xfs_buf *dead_buf, *last_buf, *sib_buf, *par_buf; xfs_fileoff_t lastoff; xfs_inode_t *ip; xfs_trans_t *tp; @@ -1648,6 +1778,8 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, xfs_dir2_leaf_t *dead_leaf2; xfs_dahash_t dead_hash; + trace_xfs_da_swap_lastblock(args); + dead_buf = *dead_bufp; dead_blkno = *dead_blknop; tp = args->trans; @@ -1668,23 +1800,24 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, * Read the last block in the btree space. */ last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - if ((error = xfs_da_read_buf(tp, ip, last_blkno, -1, &last_buf, w))) + error = xfs_da_node_read(tp, ip, last_blkno, -1, &last_buf, w); + if (error) return error; /* * Copy the last block into the dead buffer and log it. */ - memcpy(dead_buf->data, last_buf->data, mp->m_dirblksize); - xfs_da_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); - dead_info = dead_buf->data; + memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); + xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); + dead_info = dead_buf->b_addr; /* * Get values from the moved block. */ - if (be16_to_cpu(dead_info->magic) == XFS_DIR2_LEAFN_MAGIC) { + if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; dead_level = 0; dead_hash = be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.count) - 1].hashval); } else { - ASSERT(be16_to_cpu(dead_info->magic) == XFS_DA_NODE_MAGIC); + ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); dead_node = (xfs_da_intnode_t *)dead_info; dead_level = be16_to_cpu(dead_node->hdr.level); dead_hash = be32_to_cpu(dead_node->btree[be16_to_cpu(dead_node->hdr.count) - 1].hashval); @@ -1694,9 +1827,10 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->back))) { - if ((error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w))) + error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + if (error) goto done; - sib_info = sib_buf->data; + sib_info = sib_buf->b_addr; if (unlikely( be32_to_cpu(sib_info->forw) != last_blkno || sib_info->magic != dead_info->magic)) { @@ -1706,19 +1840,19 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, goto done; } sib_info->forw = cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, sib_buf, + xfs_trans_log_buf(tp, sib_buf, XFS_DA_LOGRANGE(sib_info, &sib_info->forw, sizeof(sib_info->forw))); - xfs_da_buf_done(sib_buf); sib_buf = NULL; } /* * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->forw))) { - if ((error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w))) + error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + if (error) goto done; - sib_info = sib_buf->data; + sib_info = sib_buf->b_addr; if (unlikely( be32_to_cpu(sib_info->back) != last_blkno || sib_info->magic != dead_info->magic)) { @@ -1728,10 +1862,9 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, goto done; } sib_info->back = cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, sib_buf, + xfs_trans_log_buf(tp, sib_buf, XFS_DA_LOGRANGE(sib_info, &sib_info->back, sizeof(sib_info->back))); - xfs_da_buf_done(sib_buf); sib_buf = NULL; } par_blkno = mp->m_dirleafblk; @@ -1740,11 +1873,12 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, * Walk down the tree looking for the parent of the moved block. */ for (;;) { - if ((error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w))) + error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + if (error) goto done; - par_node = par_buf->data; - if (unlikely( - be16_to_cpu(par_node->hdr.info.magic) != XFS_DA_NODE_MAGIC || + par_node = par_buf->b_addr; + if (unlikely(par_node->hdr.info.magic != + cpu_to_be16(XFS_DA_NODE_MAGIC) || (level >= 0 && level != be16_to_cpu(par_node->hdr.level) + 1))) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); @@ -1766,7 +1900,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, par_blkno = be32_to_cpu(par_node->btree[entno].before); if (level == dead_level + 1) break; - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); par_buf = NULL; } /* @@ -1782,7 +1916,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, if (entno < be16_to_cpu(par_node->hdr.count)) break; par_blkno = be32_to_cpu(par_node->hdr.info.forw); - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); par_buf = NULL; if (unlikely(par_blkno == 0)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(6)", @@ -1790,12 +1924,13 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, error = XFS_ERROR(EFSCORRUPTED); goto done; } - if ((error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w))) + error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + if (error) goto done; - par_node = par_buf->data; + par_node = par_buf->b_addr; if (unlikely( be16_to_cpu(par_node->hdr.level) != level || - be16_to_cpu(par_node->hdr.info.magic) != XFS_DA_NODE_MAGIC)) { + par_node->hdr.info.magic != cpu_to_be16(XFS_DA_NODE_MAGIC))) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); @@ -1807,20 +1942,18 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, * Update the parent entry pointing to the moved block. */ par_node->btree[entno].before = cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, par_buf, + xfs_trans_log_buf(tp, par_buf, XFS_DA_LOGRANGE(par_node, &par_node->btree[entno].before, sizeof(par_node->btree[entno].before))); - xfs_da_buf_done(par_buf); - xfs_da_buf_done(dead_buf); *dead_blknop = last_blkno; *dead_bufp = last_buf; return 0; done: if (par_buf) - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); if (sib_buf) - xfs_da_brelse(tp, sib_buf); - xfs_da_brelse(tp, last_buf); + xfs_trans_brelse(tp, sib_buf); + xfs_trans_brelse(tp, last_buf); return error; } @@ -1828,14 +1961,18 @@ done: * Remove a btree block from a directory or attribute. */ int -xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, - xfs_dabuf_t *dead_buf) +xfs_da_shrink_inode( + xfs_da_args_t *args, + xfs_dablk_t dead_blkno, + struct xfs_buf *dead_buf) { xfs_inode_t *dp; int done, error, w, count; xfs_trans_t *tp; xfs_mount_t *mp; + trace_xfs_da_shrink_inode(args); + dp = args->dp; w = args->whichfork; tp = args->trans; @@ -1862,7 +1999,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, break; } } - xfs_da_binval(tp, dead_buf); + xfs_trans_binval(tp, dead_buf); return error; } @@ -1894,36 +2031,75 @@ xfs_da_map_covers_blocks( } /* - * Make a dabuf. - * Used for get_buf, read_buf, read_bufr, and reada_buf. + * Convert a struct xfs_bmbt_irec to a struct xfs_buf_map. + * + * For the single map case, it is assumed that the caller has provided a pointer + * to a valid xfs_buf_map. For the multiple map case, this function will + * allocate the xfs_buf_map to hold all the maps and replace the caller's single + * map pointer with the allocated map. */ -int -xfs_da_do_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t *mappedbnop, - xfs_dabuf_t **bpp, - int whichfork, - int caller, - inst_t *ra) +static int +xfs_buf_map_from_irec( + struct xfs_mount *mp, + struct xfs_buf_map **mapp, + unsigned int *nmaps, + struct xfs_bmbt_irec *irecs, + unsigned int nirecs) { - xfs_buf_t *bp = NULL; - xfs_buf_t **bplist; - int error=0; - int i; - xfs_bmbt_irec_t map; - xfs_bmbt_irec_t *mapp; - xfs_daddr_t mappedbno; - xfs_mount_t *mp; - int nbplist=0; - int nfsb; - int nmap; - xfs_dabuf_t *rbp; + struct xfs_buf_map *map; + int i; + + ASSERT(*nmaps == 1); + ASSERT(nirecs >= 1); + + if (nirecs > 1) { + map = kmem_zalloc(nirecs * sizeof(struct xfs_buf_map), KM_SLEEP); + if (!map) + return ENOMEM; + *mapp = map; + } + + *nmaps = nirecs; + map = *mapp; + for (i = 0; i < *nmaps; i++) { + ASSERT(irecs[i].br_startblock != DELAYSTARTBLOCK && + irecs[i].br_startblock != HOLESTARTBLOCK); + map[i].bm_bn = XFS_FSB_TO_DADDR(mp, irecs[i].br_startblock); + map[i].bm_len = XFS_FSB_TO_BB(mp, irecs[i].br_blockcount); + } + return 0; +} + +/* + * Map the block we are given ready for reading. There are three possible return + * values: + * -1 - will be returned if we land in a hole and mappedbno == -2 so the + * caller knows not to execute a subsequent read. + * 0 - if we mapped the block successfully + * >0 - positive error number if there was an error. + */ +static int +xfs_dabuf_map( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + int whichfork, + struct xfs_buf_map **map, + int *nmaps) +{ + struct xfs_mount *mp = dp->i_mount; + int nfsb; + int error = 0; + struct xfs_bmbt_irec irec; + struct xfs_bmbt_irec *irecs = &irec; + int nirecs; + + ASSERT(map && *map); + ASSERT(*nmaps == 1); - mp = dp->i_mount; nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; - mappedbno = *mappedbnop; + /* * Caller doesn't have a mapping. -2 means don't complain * if we land in a hole. @@ -1932,139 +2108,154 @@ xfs_da_do_buf( /* * Optimize the one-block case. */ - if (nfsb == 1) { - xfs_fsblock_t fsb; + if (nfsb != 1) + irecs = kmem_zalloc(sizeof(irec) * nfsb, KM_SLEEP); - if ((error = - xfs_bmapi_single(trans, dp, whichfork, &fsb, - (xfs_fileoff_t)bno))) { - return error; - } - mapp = ↦ - if (fsb == NULLFSBLOCK) { - nmap = 0; - } else { - map.br_startblock = fsb; - map.br_startoff = (xfs_fileoff_t)bno; - map.br_blockcount = 1; - nmap = 1; - } - } else { - mapp = kmem_alloc(sizeof(*mapp) * nfsb, KM_SLEEP); - nmap = nfsb; - if ((error = xfs_bmapi(trans, dp, (xfs_fileoff_t)bno, - nfsb, - XFS_BMAPI_METADATA | - xfs_bmapi_aflag(whichfork), - NULL, 0, mapp, &nmap, NULL))) - goto exit0; - } + nirecs = nfsb; + error = xfs_bmapi_read(dp, (xfs_fileoff_t)bno, nfsb, irecs, + &nirecs, xfs_bmapi_aflag(whichfork)); + if (error) + goto out; } else { - map.br_startblock = XFS_DADDR_TO_FSB(mp, mappedbno); - map.br_startoff = (xfs_fileoff_t)bno; - map.br_blockcount = nfsb; - mapp = ↦ - nmap = 1; + irecs->br_startblock = XFS_DADDR_TO_FSB(mp, mappedbno); + irecs->br_startoff = (xfs_fileoff_t)bno; + irecs->br_blockcount = nfsb; + irecs->br_state = 0; + nirecs = 1; } - if (!xfs_da_map_covers_blocks(nmap, mapp, bno, nfsb)) { - error = mappedbno == -2 ? 0 : XFS_ERROR(EFSCORRUPTED); + + if (!xfs_da_map_covers_blocks(nirecs, irecs, bno, nfsb)) { + error = mappedbno == -2 ? -1 : XFS_ERROR(EFSCORRUPTED); if (unlikely(error == EFSCORRUPTED)) { if (xfs_error_level >= XFS_ERRLEVEL_LOW) { - cmn_err(CE_ALERT, "xfs_da_do_buf: bno %lld\n", - (long long)bno); - cmn_err(CE_ALERT, "dir: inode %lld\n", + int i; + xfs_alert(mp, "%s: bno %lld dir: inode %lld", + __func__, (long long)bno, (long long)dp->i_ino); - for (i = 0; i < nmap; i++) { - cmn_err(CE_ALERT, - "[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d\n", + for (i = 0; i < *nmaps; i++) { + xfs_alert(mp, +"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d", i, - (long long)mapp[i].br_startoff, - (long long)mapp[i].br_startblock, - (long long)mapp[i].br_blockcount, - mapp[i].br_state); + (long long)irecs[i].br_startoff, + (long long)irecs[i].br_startblock, + (long long)irecs[i].br_blockcount, + irecs[i].br_state); } } XFS_ERROR_REPORT("xfs_da_do_buf(1)", XFS_ERRLEVEL_LOW, mp); } - goto exit0; + goto out; } - if (caller != 3 && nmap > 1) { - bplist = kmem_alloc(sizeof(*bplist) * nmap, KM_SLEEP); - nbplist = 0; - } else - bplist = NULL; - /* - * Turn the mapping(s) into buffer(s). - */ - for (i = 0; i < nmap; i++) { - int nmapped; - - mappedbno = XFS_FSB_TO_DADDR(mp, mapp[i].br_startblock); - if (i == 0) - *mappedbnop = mappedbno; - nmapped = (int)XFS_FSB_TO_BB(mp, mapp[i].br_blockcount); - switch (caller) { - case 0: - bp = xfs_trans_get_buf(trans, mp->m_ddev_targp, - mappedbno, nmapped, 0); - error = bp ? XFS_BUF_GETERROR(bp) : XFS_ERROR(EIO); - break; - case 1: - case 2: - bp = NULL; - error = xfs_trans_read_buf(mp, trans, mp->m_ddev_targp, - mappedbno, nmapped, 0, &bp); - break; - case 3: - xfs_buf_readahead(mp->m_ddev_targp, mappedbno, nmapped); + error = xfs_buf_map_from_irec(mp, map, nmaps, irecs, nirecs); +out: + if (irecs != &irec) + kmem_free(irecs); + return error; +} + +/* + * Get a buffer for the dir/attr block. + */ +int +xfs_da_get_buf( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int whichfork) +{ + struct xfs_buf *bp; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; + + *bpp = NULL; + mapp = ↦ + nmap = 1; + error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error == -1) error = 0; - bp = NULL; - break; - } - if (error) { - if (bp) - xfs_trans_brelse(trans, bp); - goto exit1; - } - if (!bp) - continue; - if (caller == 1) { - if (whichfork == XFS_ATTR_FORK) { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_ATTR_BTREE, - XFS_ATTR_BTREE_REF); - } else { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_DIR_BTREE, - XFS_DIR_BTREE_REF); - } - } - if (bplist) { - bplist[nbplist++] = bp; - } + goto out_free; } - /* - * Build a dabuf structure. - */ - if (bplist) { - rbp = xfs_da_buf_make(nbplist, bplist, ra); - } else if (bp) - rbp = xfs_da_buf_make(1, &bp, ra); + + bp = xfs_trans_get_buf_map(trans, dp->i_mount->m_ddev_targp, + mapp, nmap, 0); + error = bp ? bp->b_error : XFS_ERROR(EIO); + if (error) { + xfs_trans_brelse(trans, bp); + goto out_free; + } + + *bpp = bp; + +out_free: + if (mapp != &map) + kmem_free(mapp); + + return error; +} + +/* + * Get a buffer for the dir/attr block, fill in the contents. + */ +int +xfs_da_read_buf( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int whichfork, + const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; + + *bpp = NULL; + mapp = ↦ + nmap = 1; + error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error == -1) + error = 0; + goto out_free; + } + + error = xfs_trans_read_buf_map(dp->i_mount, trans, + dp->i_mount->m_ddev_targp, + mapp, nmap, 0, &bp, ops); + if (error) + goto out_free; + + if (whichfork == XFS_ATTR_FORK) + xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF); else - rbp = NULL; + xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF); + /* - * For read_buf, check the magic number. + * This verification code will be moved to a CRC verification callback + * function so just leave it here unchanged until then. */ - if (caller == 1) { - xfs_dir2_data_t *data; - xfs_dir2_free_t *free; - xfs_da_blkinfo_t *info; + { + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + xfs_dir2_free_t *free = bp->b_addr; + xfs_da_blkinfo_t *info = bp->b_addr; uint magic, magic1; + struct xfs_mount *mp = dp->i_mount; - info = rbp->data; - data = rbp->data; - free = rbp->data; magic = be16_to_cpu(info->magic); - magic1 = be32_to_cpu(data->hdr.magic); + magic1 = be32_to_cpu(hdr->magic); if (unlikely( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && @@ -2072,71 +2263,23 @@ xfs_da_do_buf( (magic != XFS_DIR2_LEAFN_MAGIC) && (magic1 != XFS_DIR2_BLOCK_MAGIC) && (magic1 != XFS_DIR2_DATA_MAGIC) && - (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC), + (free->hdr.magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { - trace_xfs_da_btree_corrupt(rbp->bps[0], _RET_IP_); + trace_xfs_da_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_ERRLEVEL_LOW, mp, info); error = XFS_ERROR(EFSCORRUPTED); - xfs_da_brelse(trans, rbp); - nbplist = 0; - goto exit1; + xfs_trans_brelse(trans, bp); + goto out_free; } } - if (bplist) { - kmem_free(bplist); - } - if (mapp != &map) { - kmem_free(mapp); - } - if (bpp) - *bpp = rbp; - return 0; -exit1: - if (bplist) { - for (i = 0; i < nbplist; i++) - xfs_trans_brelse(trans, bplist[i]); - kmem_free(bplist); - } -exit0: + *bpp = bp; +out_free: if (mapp != &map) kmem_free(mapp); - if (bpp) - *bpp = NULL; - return error; -} -/* - * Get a buffer for the dir/attr block. - */ -int -xfs_da_get_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 0, - (inst_t *)__return_address); -} - -/* - * Get a buffer for the dir/attr block, fill in the contents. - */ -int -xfs_da_read_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 1, - (inst_t *)__return_address); + return error; } /* @@ -2144,23 +2287,42 @@ xfs_da_read_buf( */ xfs_daddr_t xfs_da_reada_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - int whichfork) + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + int whichfork, + const struct xfs_buf_ops *ops) { - xfs_daddr_t rval; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; - rval = -1; - if (xfs_da_do_buf(trans, dp, bno, &rval, NULL, whichfork, 3, - (inst_t *)__return_address)) + mapp = ↦ + nmap = 1; + error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error == -1) + error = 0; + goto out_free; + } + + mappedbno = mapp[0].bm_bn; + xfs_buf_readahead_map(dp->i_mount->m_ddev_targp, mapp, nmap, ops); + +out_free: + if (mapp != &map) + kmem_free(mapp); + + if (error) return -1; - else - return rval; + return mappedbno; } kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ -kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ /* * Allocate a dir-state structure. @@ -2180,13 +2342,8 @@ xfs_da_state_kill_altpath(xfs_da_state_t *state) { int i; - for (i = 0; i < state->altpath.active; i++) { - if (state->altpath.blk[i].bp) { - if (state->altpath.blk[i].bp != state->path.blk[i].bp) - xfs_da_buf_done(state->altpath.blk[i].bp); - state->altpath.blk[i].bp = NULL; - } - } + for (i = 0; i < state->altpath.active; i++) + state->altpath.blk[i].bp = NULL; state->altpath.active = 0; } @@ -2196,244 +2353,9 @@ xfs_da_state_kill_altpath(xfs_da_state_t *state) void xfs_da_state_free(xfs_da_state_t *state) { - int i; - xfs_da_state_kill_altpath(state); - for (i = 0; i < state->path.active; i++) { - if (state->path.blk[i].bp) - xfs_da_buf_done(state->path.blk[i].bp); - } - if (state->extravalid && state->extrablk.bp) - xfs_da_buf_done(state->extrablk.bp); #ifdef DEBUG memset((char *)state, 0, sizeof(*state)); #endif /* DEBUG */ kmem_zone_free(xfs_da_state_zone, state); } - -#ifdef XFS_DABUF_DEBUG -xfs_dabuf_t *xfs_dabuf_global_list; -static DEFINE_SPINLOCK(xfs_dabuf_global_lock); -#endif - -/* - * Create a dabuf. - */ -/* ARGSUSED */ -STATIC xfs_dabuf_t * -xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra) -{ - xfs_buf_t *bp; - xfs_dabuf_t *dabuf; - int i; - int off; - - if (nbuf == 1) - dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); - else - dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); - dabuf->dirty = 0; -#ifdef XFS_DABUF_DEBUG - dabuf->ra = ra; - dabuf->target = XFS_BUF_TARGET(bps[0]); - dabuf->blkno = XFS_BUF_ADDR(bps[0]); -#endif - if (nbuf == 1) { - dabuf->nbuf = 1; - bp = bps[0]; - dabuf->bbcount = (short)BTOBB(XFS_BUF_COUNT(bp)); - dabuf->data = XFS_BUF_PTR(bp); - dabuf->bps[0] = bp; - } else { - dabuf->nbuf = nbuf; - for (i = 0, dabuf->bbcount = 0; i < nbuf; i++) { - dabuf->bps[i] = bp = bps[i]; - dabuf->bbcount += BTOBB(XFS_BUF_COUNT(bp)); - } - dabuf->data = kmem_alloc(BBTOB(dabuf->bbcount), KM_SLEEP); - for (i = off = 0; i < nbuf; i++, off += XFS_BUF_COUNT(bp)) { - bp = bps[i]; - memcpy((char *)dabuf->data + off, XFS_BUF_PTR(bp), - XFS_BUF_COUNT(bp)); - } - } -#ifdef XFS_DABUF_DEBUG - { - xfs_dabuf_t *p; - - spin_lock(&xfs_dabuf_global_lock); - for (p = xfs_dabuf_global_list; p; p = p->next) { - ASSERT(p->blkno != dabuf->blkno || - p->target != dabuf->target); - } - dabuf->prev = NULL; - if (xfs_dabuf_global_list) - xfs_dabuf_global_list->prev = dabuf; - dabuf->next = xfs_dabuf_global_list; - xfs_dabuf_global_list = dabuf; - spin_unlock(&xfs_dabuf_global_lock); - } -#endif - return dabuf; -} - -/* - * Un-dirty a dabuf. - */ -STATIC void -xfs_da_buf_clean(xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - int i; - int off; - - if (dabuf->dirty) { - ASSERT(dabuf->nbuf > 1); - dabuf->dirty = 0; - for (i = off = 0; i < dabuf->nbuf; - i++, off += XFS_BUF_COUNT(bp)) { - bp = dabuf->bps[i]; - memcpy(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } -} - -/* - * Release a dabuf. - */ -void -xfs_da_buf_done(xfs_dabuf_t *dabuf) -{ - ASSERT(dabuf); - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if (dabuf->dirty) - xfs_da_buf_clean(dabuf); - if (dabuf->nbuf > 1) - kmem_free(dabuf->data); -#ifdef XFS_DABUF_DEBUG - { - spin_lock(&xfs_dabuf_global_lock); - if (dabuf->prev) - dabuf->prev->next = dabuf->next; - else - xfs_dabuf_global_list = dabuf->next; - if (dabuf->next) - dabuf->next->prev = dabuf->prev; - spin_unlock(&xfs_dabuf_global_lock); - } - memset(dabuf, 0, XFS_DA_BUF_SIZE(dabuf->nbuf)); -#endif - if (dabuf->nbuf == 1) - kmem_zone_free(xfs_dabuf_zone, dabuf); - else - kmem_free(dabuf); -} - -/* - * Log transaction from a dabuf. - */ -void -xfs_da_log_buf(xfs_trans_t *tp, xfs_dabuf_t *dabuf, uint first, uint last) -{ - xfs_buf_t *bp; - uint f; - int i; - uint l; - int off; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if (dabuf->nbuf == 1) { - ASSERT(dabuf->data == (void *)XFS_BUF_PTR(dabuf->bps[0])); - xfs_trans_log_buf(tp, dabuf->bps[0], first, last); - return; - } - dabuf->dirty = 1; - ASSERT(first <= last); - for (i = off = 0; i < dabuf->nbuf; i++, off += XFS_BUF_COUNT(bp)) { - bp = dabuf->bps[i]; - f = off; - l = f + XFS_BUF_COUNT(bp) - 1; - if (f < first) - f = first; - if (l > last) - l = last; - if (f <= l) - xfs_trans_log_buf(tp, bp, f - off, l - off); - /* - * B_DONE is set by xfs_trans_log buf. - * If we don't set it on a new buffer (get not read) - * then if we don't put anything in the buffer it won't - * be set, and at commit it it released into the cache, - * and then a read will fail. - */ - else if (!(XFS_BUF_ISDONE(bp))) - XFS_BUF_DONE(bp); - } - ASSERT(last < off); -} - -/* - * Release dabuf from a transaction. - * Have to free up the dabuf before the buffers are released, - * since the synchronization on the dabuf is really the lock on the buffer. - */ -void -xfs_da_brelse(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if ((nbuf = dabuf->nbuf) == 1) { - bplist = &bp; - bp = dabuf->bps[0]; - } else { - bplist = kmem_alloc(nbuf * sizeof(*bplist), KM_SLEEP); - memcpy(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - xfs_da_buf_done(dabuf); - for (i = 0; i < nbuf; i++) - xfs_trans_brelse(tp, bplist[i]); - if (bplist != &bp) - kmem_free(bplist); -} - -/* - * Invalidate dabuf from a transaction. - */ -void -xfs_da_binval(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if ((nbuf = dabuf->nbuf) == 1) { - bplist = &bp; - bp = dabuf->bps[0]; - } else { - bplist = kmem_alloc(nbuf * sizeof(*bplist), KM_SLEEP); - memcpy(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - xfs_da_buf_done(dabuf); - for (i = 0; i < nbuf; i++) - xfs_trans_binval(tp, bplist[i]); - if (bplist != &bp) - kmem_free(bplist); -} - -/* - * Get the first daddr from a dabuf. - */ -xfs_daddr_t -xfs_da_blkno(xfs_dabuf_t *dabuf) -{ - ASSERT(dabuf->nbuf); - ASSERT(dabuf->data); - return XFS_BUF_ADDR(dabuf->bps[0]); -} diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index d475118..6a4027f 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -98,15 +98,15 @@ int xfs_dir_isempty( xfs_inode_t *dp) { - xfs_dir2_sf_t *sfp; + xfs_dir2_sf_hdr_t *sfp; - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if (dp->i_d.di_size == 0) /* might happen during shutdown. */ return 1; if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp)) return 0; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - return !sfp->hdr.count; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + return !sfp->count; } /* @@ -135,7 +135,7 @@ xfs_dir_ino_validate( XFS_AGINO_TO_INO(mp, agno, agino) == ino; if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE, XFS_RANDOM_DIR_INO_VALIDATE))) { - xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx", + xfs_warn(mp, "Invalid inode number 0x%Lx", (unsigned long long) ino); XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); @@ -158,7 +158,7 @@ xfs_dir_init( memset((char *)&args, 0, sizeof(args)); args.dp = dp; args.trans = tp; - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino))) return error; return xfs_dir2_sf_create(&args, pdp->i_ino); @@ -181,7 +181,7 @@ xfs_dir_createname( int rval; int v; /* type-checking value */ - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; XFS_STATS_INC(xs_dir_create); @@ -257,7 +257,7 @@ xfs_dir_lookup( int rval; int v; /* type-checking value */ - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_lookup); memset(&args, 0, sizeof(xfs_da_args_t)); @@ -312,7 +312,7 @@ xfs_dir_removename( int rval; int v; /* type-checking value */ - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_remove); memset(&args, 0, sizeof(xfs_da_args_t)); @@ -359,7 +359,7 @@ xfs_dir_replace( int rval; int v; /* type-checking value */ - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; @@ -397,129 +397,34 @@ xfs_dir_replace( /* * Add a block to the directory. - * This routine is for data and free blocks, not leaf/node blocks - * which are handled by xfs_da_grow_inode. + * + * This routine is for data and free blocks, not leaf/node blocks which are + * handled by xfs_da_grow_inode. */ int xfs_dir2_grow_inode( - xfs_da_args_t *args, - int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */ - xfs_dir2_db_t *dbp) /* out: block number added */ + struct xfs_da_args *args, + int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */ + xfs_dir2_db_t *dbp) /* out: block number added */ { - xfs_fileoff_t bno; /* directory offset of new block */ - int count; /* count of filesystem blocks */ - xfs_inode_t *dp; /* incore directory inode */ - int error; - int got; /* blocks actually mapped */ - int i; - xfs_bmbt_irec_t map; /* single structure for bmap */ - int mapi; /* mapping index */ - xfs_bmbt_irec_t *mapp; /* bmap mapping structure(s) */ - xfs_mount_t *mp; - int nmap; /* number of bmap entries */ - xfs_trans_t *tp; - xfs_drfsbno_t nblks; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + xfs_fileoff_t bno; /* directory offset of new block */ + int count; /* count of filesystem blocks */ + int error; trace_xfs_dir2_grow_inode(args, space); - dp = args->dp; - tp = args->trans; - mp = dp->i_mount; - nblks = dp->i_d.di_nblocks; /* * Set lowest possible block in the space requested. */ bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); count = mp->m_dirblkfsbs; - /* - * Find the first hole for our block. - */ - if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, XFS_DATA_FORK))) - return error; - nmap = 1; - ASSERT(args->firstblock != NULL); - /* - * Try mapping the new block contiguously (one extent). - */ - if ((error = xfs_bmapi(tp, dp, bno, count, - XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, - args->firstblock, args->total, &map, &nmap, - args->flist))) - return error; - ASSERT(nmap <= 1); - if (nmap == 1) { - mapp = ↦ - mapi = 1; - } - /* - * Didn't work and this is a multiple-fsb directory block. - * Try again with contiguous flag turned on. - */ - else if (nmap == 0 && count > 1) { - xfs_fileoff_t b; /* current file offset */ - /* - * Space for maximum number of mappings. - */ - mapp = kmem_alloc(sizeof(*mapp) * count, KM_SLEEP); - /* - * Iterate until we get to the end of our block. - */ - for (b = bno, mapi = 0; b < bno + count; ) { - int c; /* current fsb count */ - - /* - * Can't map more than MAX_NMAP at once. - */ - nmap = MIN(XFS_BMAP_MAX_NMAP, count); - c = (int)(bno + count - b); - if ((error = xfs_bmapi(tp, dp, b, c, - XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, - args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { - kmem_free(mapp); - return error; - } - if (nmap < 1) - break; - /* - * Add this bunch into our table, go to the next offset. - */ - mapi += nmap; - b = mapp[mapi - 1].br_startoff + - mapp[mapi - 1].br_blockcount; - } - } - /* - * Didn't work. - */ - else { - mapi = 0; - mapp = NULL; - } - /* - * See how many fsb's we got. - */ - for (i = 0, got = 0; i < mapi; i++) - got += mapp[i].br_blockcount; - /* - * Didn't get enough fsb's, or the first/last block's are wrong. - */ - if (got != count || mapp[0].br_startoff != bno || - mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount != - bno + count) { - if (mapp != &map) - kmem_free(mapp); - return XFS_ERROR(ENOSPC); - } - /* - * Done with the temporary mapping table. - */ - if (mapp != &map) - kmem_free(mapp); + error = xfs_da_grow_inode_int(args, &bno, count); + if (error) + return error; - /* account for newly allocated blocks in reserved blocks total */ - args->total -= dp->i_d.di_nblocks - nblks; *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); /* @@ -531,7 +436,7 @@ xfs_dir2_grow_inode( size = XFS_FSB_TO_B(mp, bno + count); if (size > dp->i_d.di_size) { dp->i_d.di_size = size; - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); + xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); } } return 0; @@ -588,7 +493,7 @@ int xfs_dir2_shrink_inode( xfs_da_args_t *args, xfs_dir2_db_t db, - xfs_dabuf_t *bp) + struct xfs_buf *bp) { xfs_fileoff_t bno; /* directory file offset */ xfs_dablk_t da; /* directory file offset */ @@ -630,7 +535,7 @@ xfs_dir2_shrink_inode( /* * Invalidate the buffer from the transaction. */ - xfs_da_binval(tp, bp); + xfs_trans_binval(tp, bp); /* * If it's not a data block, we're done. */ diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index b614ea6..7397faa 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -21,10 +21,10 @@ /* * Local function prototypes. */ -static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, xfs_dabuf_t *bp, int first, - int last); -static void xfs_dir2_block_log_tail(xfs_trans_t *tp, xfs_dabuf_t *bp); -static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **bpp, +static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, struct xfs_buf *bp, + int first, int last); +static void xfs_dir2_block_log_tail(xfs_trans_t *tp, struct xfs_buf *bp); +static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, struct xfs_buf **bpp, int *entno); static int xfs_dir2_block_sort(const void *a, const void *b); @@ -40,6 +40,214 @@ xfs_dir_startup(void) xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2); } +static void +xfs_dir2_block_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + block_ok = block_ok && __xfs_dir2_data_check(NULL, bp) == 0; + + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_block_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_block_verify(bp); +} + +static void +xfs_dir2_block_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_block_verify(bp); +} + +const struct xfs_buf_ops xfs_dir2_block_buf_ops = { + .verify_read = xfs_dir2_block_read_verify, + .verify_write = xfs_dir2_block_write_verify, +}; + +static int +xfs_dir2_block_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + struct xfs_buf **bpp) +{ + struct xfs_mount *mp = dp->i_mount; + + return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + XFS_DATA_FORK, &xfs_dir2_block_buf_ops); +} + +static void +xfs_dir2_block_need_space( + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_block_tail *btp, + struct xfs_dir2_leaf_entry *blp, + __be16 **tagpp, + struct xfs_dir2_data_unused **dupp, + struct xfs_dir2_data_unused **enddupp, + int *compact, + int len) +{ + struct xfs_dir2_data_free *bf; + __be16 *tagp = NULL; + struct xfs_dir2_data_unused *dup = NULL; + struct xfs_dir2_data_unused *enddup = NULL; + + *compact = 0; + bf = hdr->bestfree; + + /* + * If there are stale entries we'll use one for the leaf. + */ + if (btp->stale) { + if (be16_to_cpu(bf[0].length) >= len) { + /* + * The biggest entry enough to avoid compaction. + */ + dup = (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[0].offset)); + goto out; + } + + /* + * Will need to compact to make this work. + * Tag just before the first leaf entry. + */ + *compact = 1; + tagp = (__be16 *)blp - 1; + + /* Data object just before the first leaf entry. */ + dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); + + /* + * If it's not free then the data will go where the + * leaf data starts now, if it works at all. + */ + if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { + if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) * + (uint)sizeof(*blp) < len) + dup = NULL; + } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len) + dup = NULL; + else + dup = (xfs_dir2_data_unused_t *)blp; + goto out; + } + + /* + * no stale entries, so just use free space. + * Tag just before the first leaf entry. + */ + tagp = (__be16 *)blp - 1; + + /* Data object just before the first leaf entry. */ + enddup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); + + /* + * If it's not free then can't do this add without cleaning up: + * the space before the first leaf entry needs to be free so it + * can be expanded to hold the pointer to the new entry. + */ + if (be16_to_cpu(enddup->freetag) == XFS_DIR2_DATA_FREE_TAG) { + /* + * Check out the biggest freespace and see if it's the same one. + */ + dup = (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[0].offset)); + if (dup != enddup) { + /* + * Not the same free entry, just check its length. + */ + if (be16_to_cpu(dup->length) < len) + dup = NULL; + goto out; + } + + /* + * It is the biggest freespace, can it hold the leaf too? + */ + if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) { + /* + * Yes, use the second-largest entry instead if it works. + */ + if (be16_to_cpu(bf[1].length) >= len) + dup = (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[1].offset)); + else + dup = NULL; + } + } +out: + *tagpp = tagp; + *dupp = dup; + *enddupp = enddup; +} + +/* + * compact the leaf entries. + * Leave the highest-numbered stale entry stale. + * XXX should be the one closest to mid but mid is not yet computed. + */ +static void +xfs_dir2_block_compact( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_block_tail *btp, + struct xfs_dir2_leaf_entry *blp, + int *needlog, + int *lfloghigh, + int *lfloglow) +{ + int fromidx; /* source leaf index */ + int toidx; /* target leaf index */ + int needscan = 0; + int highstale; /* high stale index */ + + fromidx = toidx = be32_to_cpu(btp->count) - 1; + highstale = *lfloghigh = -1; + for (; fromidx >= 0; fromidx--) { + if (blp[fromidx].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { + if (highstale == -1) + highstale = toidx; + else { + if (*lfloghigh == -1) + *lfloghigh = toidx; + continue; + } + } + if (fromidx < toidx) + blp[toidx] = blp[fromidx]; + toidx--; + } + *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); + *lfloghigh -= be32_to_cpu(btp->stale) - 1; + be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); + xfs_dir2_data_make_free(tp, bp, + (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), + (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), + needlog, &needscan); + blp += be32_to_cpu(btp->stale) - 1; + btp->stale = cpu_to_be32(1); + /* + * If we now need to rebuild the bestfree map, do so. + * This needs to happen before the next call to use_free. + */ + if (needscan) + xfs_dir2_data_freescan(tp->t_mountp, hdr, needlog); +} + /* * Add an entry to a block directory. */ @@ -47,10 +255,9 @@ int /* error */ xfs_dir2_block_addname( xfs_da_args_t *args) /* directory op arguments */ { - xfs_dir2_data_free_t *bf; /* bestfree table in block */ - xfs_dir2_block_t *block; /* directory block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* buffer for block */ + struct xfs_buf *bp; /* buffer for block */ xfs_dir2_block_tail_t *btp; /* block tail */ int compact; /* need to compact leaf ents */ xfs_dir2_data_entry_t *dep; /* block data entry */ @@ -78,203 +285,72 @@ xfs_dir2_block_addname( dp = args->dp; tp = args->trans; mp = dp->i_mount; - /* - * Read the (one and only) directory block into dabuf bp. - */ - if ((error = - xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) { + + /* Read the (one and only) directory block into bp. */ + error = xfs_dir2_block_read(tp, dp, &bp); + if (error) return error; - } - ASSERT(bp != NULL); - block = bp->data; - /* - * Check the magic number, corrupted if wrong. - */ - if (unlikely(be32_to_cpu(block->hdr.magic) != XFS_DIR2_BLOCK_MAGIC)) { - XFS_CORRUPTION_ERROR("xfs_dir2_block_addname", - XFS_ERRLEVEL_LOW, mp, block); - xfs_da_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); - } + len = xfs_dir2_data_entsize(args->namelen); + /* * Set up pointers to parts of the block. */ - bf = block->hdr.bestfree; - btp = xfs_dir2_block_tail_p(mp, block); + hdr = bp->b_addr; + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); + /* - * No stale entries? Need space for entry and new leaf. - */ - if (!btp->stale) { - /* - * Tag just before the first leaf entry. - */ - tagp = (__be16 *)blp - 1; - /* - * Data object just before the first leaf entry. - */ - enddup = (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)); - /* - * If it's not free then can't do this add without cleaning up: - * the space before the first leaf entry needs to be free so it - * can be expanded to hold the pointer to the new entry. - */ - if (be16_to_cpu(enddup->freetag) != XFS_DIR2_DATA_FREE_TAG) - dup = enddup = NULL; - /* - * Check out the biggest freespace and see if it's the same one. - */ - else { - dup = (xfs_dir2_data_unused_t *) - ((char *)block + be16_to_cpu(bf[0].offset)); - if (dup == enddup) { - /* - * It is the biggest freespace, is it too small - * to hold the new leaf too? - */ - if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) { - /* - * Yes, we use the second-largest - * entry instead if it works. - */ - if (be16_to_cpu(bf[1].length) >= len) - dup = (xfs_dir2_data_unused_t *) - ((char *)block + - be16_to_cpu(bf[1].offset)); - else - dup = NULL; - } - } else { - /* - * Not the same free entry, - * just check its length. - */ - if (be16_to_cpu(dup->length) < len) { - dup = NULL; - } - } - } - compact = 0; - } - /* - * If there are stale entries we'll use one for the leaf. - * Is the biggest entry enough to avoid compaction? + * Find out if we can reuse stale entries or whether we need extra + * space for entry and new leaf. */ - else if (be16_to_cpu(bf[0].length) >= len) { - dup = (xfs_dir2_data_unused_t *) - ((char *)block + be16_to_cpu(bf[0].offset)); - compact = 0; - } + xfs_dir2_block_need_space(hdr, btp, blp, &tagp, &dup, + &enddup, &compact, len); + /* - * Will need to compact to make this work. + * Done everything we need for a space check now. */ - else { - /* - * Tag just before the first leaf entry. - */ - tagp = (__be16 *)blp - 1; - /* - * Data object just before the first leaf entry. - */ - dup = (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)); - /* - * If it's not free then the data will go where the - * leaf data starts now, if it works at all. - */ - if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { - if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) * - (uint)sizeof(*blp) < len) - dup = NULL; - } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len) - dup = NULL; - else - dup = (xfs_dir2_data_unused_t *)blp; - compact = 1; + if (args->op_flags & XFS_DA_OP_JUSTCHECK) { + xfs_trans_brelse(tp, bp); + if (!dup) + return XFS_ERROR(ENOSPC); + return 0; } - /* - * If this isn't a real add, we're done with the buffer. - */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) - xfs_da_brelse(tp, bp); + /* * If we don't have space for the new entry & leaf ... */ if (!dup) { - /* - * Not trying to actually do anything, or don't have - * a space reservation: return no-space. - */ - if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) + /* Don't have a space reservation: return no-space. */ + if (args->total == 0) return XFS_ERROR(ENOSPC); /* * Convert to the next larger format. * Then add the new entry in that format. */ error = xfs_dir2_block_to_leaf(args, bp); - xfs_da_buf_done(bp); if (error) return error; return xfs_dir2_leaf_addname(args); } - /* - * Just checking, and it would work, so say so. - */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) - return 0; + needlog = needscan = 0; + /* * If need to compact the leaf entries, do it now. - * Leave the highest-numbered stale entry stale. - * XXX should be the one closest to mid but mid is not yet computed. */ - if (compact) { - int fromidx; /* source leaf index */ - int toidx; /* target leaf index */ - - for (fromidx = toidx = be32_to_cpu(btp->count) - 1, - highstale = lfloghigh = -1; - fromidx >= 0; - fromidx--) { - if (be32_to_cpu(blp[fromidx].address) == XFS_DIR2_NULL_DATAPTR) { - if (highstale == -1) - highstale = toidx; - else { - if (lfloghigh == -1) - lfloghigh = toidx; - continue; - } - } - if (fromidx < toidx) - blp[toidx] = blp[fromidx]; - toidx--; - } - lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); - lfloghigh -= be32_to_cpu(btp->stale) - 1; - be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, bp, - (xfs_dir2_data_aoff_t)((char *)blp - (char *)block), - (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), - &needlog, &needscan); - blp += be32_to_cpu(btp->stale) - 1; - btp->stale = cpu_to_be32(1); + if (compact) + xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, + &lfloghigh, &lfloglow); + else if (btp->stale) { /* - * If we now need to rebuild the bestfree map, do so. - * This needs to happen before the next call to use_free. + * Set leaf logging boundaries to impossible state. + * For the no-stale case they're set explicitly. */ - if (needscan) { - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); - needscan = 0; - } - } - /* - * Set leaf logging boundaries to impossible state. - * For the no-stale case they're set explicitly. - */ - else if (btp->stale) { lfloglow = be32_to_cpu(btp->count); lfloghigh = -1; } + /* * Find the slot that's first lower than our hash value, -1 if none. */ @@ -299,7 +375,7 @@ xfs_dir2_block_addname( */ xfs_dir2_data_use_free(tp, bp, enddup, (xfs_dir2_data_aoff_t) - ((char *)enddup - (char *)block + be16_to_cpu(enddup->length) - + ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), (xfs_dir2_data_aoff_t)sizeof(*blp), &needlog, &needscan); @@ -312,8 +388,7 @@ xfs_dir2_block_addname( * This needs to happen before the next call to use_free. */ if (needscan) { - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, - &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); needscan = 0; } /* @@ -334,12 +409,14 @@ xfs_dir2_block_addname( else { for (lowstale = mid; lowstale >= 0 && - be32_to_cpu(blp[lowstale].address) != XFS_DIR2_NULL_DATAPTR; + blp[lowstale].address != + cpu_to_be32(XFS_DIR2_NULL_DATAPTR); lowstale--) continue; for (highstale = mid + 1; highstale < be32_to_cpu(btp->count) && - be32_to_cpu(blp[highstale].address) != XFS_DIR2_NULL_DATAPTR && + blp[highstale].address != + cpu_to_be32(XFS_DIR2_NULL_DATAPTR) && (lowstale < 0 || mid - lowstale > highstale - mid); highstale++) continue; @@ -378,13 +455,13 @@ xfs_dir2_block_addname( */ blp[mid].hashval = cpu_to_be32(args->hashval); blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh); /* * Mark space for the data entry used. */ xfs_dir2_data_use_free(tp, bp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* * Create the new data entry. @@ -393,18 +470,17 @@ xfs_dir2_block_addname( dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)block); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Clean up the bestfree array and log the header, tail, and entry. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_log_entry(tp, bp, dep); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } @@ -414,21 +490,18 @@ xfs_dir2_block_addname( static void xfs_dir2_block_log_leaf( xfs_trans_t *tp, /* transaction structure */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_buf *bp, /* block buffer */ int first, /* index of first logged leaf */ int last) /* index of last logged leaf */ { - xfs_dir2_block_t *block; /* directory block structure */ - xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dir2_block_tail_t *btp; /* block tail */ - xfs_mount_t *mp; /* filesystem mount point */ + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + xfs_dir2_leaf_entry_t *blp; + xfs_dir2_block_tail_t *btp; - mp = tp->t_mountp; - block = bp->data; - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); blp = xfs_dir2_block_leaf_p(btp); - xfs_da_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)block), - (uint)((char *)&blp[last + 1] - (char *)block - 1)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), + (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); } /* @@ -437,17 +510,14 @@ xfs_dir2_block_log_leaf( static void xfs_dir2_block_log_tail( xfs_trans_t *tp, /* transaction structure */ - xfs_dabuf_t *bp) /* block buffer */ + struct xfs_buf *bp) /* block buffer */ { - xfs_dir2_block_t *block; /* directory block structure */ - xfs_dir2_block_tail_t *btp; /* block tail */ - xfs_mount_t *mp; /* filesystem mount point */ + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + xfs_dir2_block_tail_t *btp; - mp = tp->t_mountp; - block = bp->data; - btp = xfs_dir2_block_tail_p(mp, block); - xfs_da_log_buf(tp, bp, (uint)((char *)btp - (char *)block), - (uint)((char *)(btp + 1) - (char *)block - 1)); + btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), + (uint)((char *)(btp + 1) - (char *)hdr - 1)); } /* @@ -458,9 +528,9 @@ int /* error */ xfs_dir2_block_lookup( xfs_da_args_t *args) /* dir lookup arguments */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -478,21 +548,21 @@ xfs_dir2_block_lookup( return error; dp = args->dp; mp = dp->i_mount; - block = bp->data; + hdr = bp->b_addr; xfs_dir2_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Get the offset from the leaf entry, to point to the data. */ - dep = (xfs_dir2_data_entry_t *)((char *)block + + dep = (xfs_dir2_data_entry_t *)((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); /* * Fill in inode number, CI name if appropriate, release the block. */ args->inumber = be64_to_cpu(dep->inumber); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return XFS_ERROR(error); } @@ -502,13 +572,13 @@ xfs_dir2_block_lookup( static int /* error */ xfs_dir2_block_lookup_int( xfs_da_args_t *args, /* dir lookup arguments */ - xfs_dabuf_t **bpp, /* returned block buffer */ + struct xfs_buf **bpp, /* returned block buffer */ int *entno) /* returned entry number */ { xfs_dir2_dataptr_t addr; /* data entry address */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -524,17 +594,14 @@ xfs_dir2_block_lookup_int( dp = args->dp; tp = args->trans; mp = dp->i_mount; - /* - * Read the buffer, return error if we can't get it. - */ - if ((error = - xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) { + + error = xfs_dir2_block_read(tp, dp, &bp); + if (error) return error; - } - ASSERT(bp != NULL); - block = bp->data; + + hdr = bp->b_addr; xfs_dir2_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Loop doing a binary search for our hash value. @@ -551,7 +618,7 @@ xfs_dir2_block_lookup_int( high = mid - 1; if (low > high) { ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return XFS_ERROR(ENOENT); } } @@ -572,7 +639,7 @@ xfs_dir2_block_lookup_int( * Get pointer to the entry from the leaf. */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -599,7 +666,7 @@ xfs_dir2_block_lookup_int( /* * No match, release the buffer and return ENOENT. */ - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return XFS_ERROR(ENOENT); } @@ -611,9 +678,9 @@ int /* error */ xfs_dir2_block_removename( xfs_da_args_t *args) /* directory operation args */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf pointer */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -638,20 +705,20 @@ xfs_dir2_block_removename( dp = args->dp; tp = args->trans; mp = dp->i_mount; - block = bp->data; - btp = xfs_dir2_block_tail_p(mp, block); + hdr = bp->b_addr; + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry using the leaf entry. */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); /* * Mark the data entry's space free. */ needlog = needscan = 0; xfs_dir2_data_make_free(tp, bp, - (xfs_dir2_data_aoff_t)((char *)dep - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); /* * Fix up the block tail. @@ -667,18 +734,17 @@ xfs_dir2_block_removename( * Fix up bestfree, log the header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir2_data_check(dp, bp); /* * See if the size as a shortform is good enough. */ - if ((size = xfs_dir2_block_sfsize(dp, block, &sfh)) > - XFS_IFORK_DSIZE(dp)) { - xfs_da_buf_done(bp); + size = xfs_dir2_block_sfsize(dp, hdr, &sfh); + if (size > XFS_IFORK_DSIZE(dp)) return 0; - } + /* * If it works, do the conversion. */ @@ -693,9 +759,9 @@ int /* error */ xfs_dir2_block_replace( xfs_da_args_t *args) /* directory operation args */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -714,14 +780,14 @@ xfs_dir2_block_replace( } dp = args->dp; mp = dp->i_mount; - block = bp->data; - btp = xfs_dir2_block_tail_p(mp, block); + hdr = bp->b_addr; + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry we need to change. */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); ASSERT(be64_to_cpu(dep->inumber) != args->inumber); /* * Change the inode number to the new value. @@ -729,7 +795,6 @@ xfs_dir2_block_replace( dep->inumber = cpu_to_be64(args->inumber); xfs_dir2_data_log_entry(args->trans, bp, dep); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } @@ -756,11 +821,11 @@ xfs_dir2_block_sort( int /* error */ xfs_dir2_leaf_to_block( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp, /* leaf buffer */ - xfs_dabuf_t *dbp) /* data buffer */ + struct xfs_buf *lbp, /* leaf buffer */ + struct xfs_buf *dbp) /* data buffer */ { __be16 *bestsp; /* leaf bests table */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused data entry */ @@ -783,8 +848,8 @@ xfs_dir2_leaf_to_block( dp = args->dp; tp = args->trans; mp = dp->i_mount; - leaf = lbp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC); + leaf = lbp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp = xfs_dir2_leaf_tail_p(mp, leaf); /* * If there are data blocks other than the first one, take this @@ -795,48 +860,46 @@ xfs_dir2_leaf_to_block( while (dp->i_d.di_size > mp->m_dirblksize) { bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == - mp->m_dirblksize - (uint)sizeof(block->hdr)) { + mp->m_dirblksize - (uint)sizeof(*hdr)) { if ((error = xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) - goto out; - } else { - error = 0; - goto out; - } + return error; + } else + return 0; } /* * Read the data block if we don't already have it, give up if it fails. */ - if (dbp == NULL && - (error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &dbp, - XFS_DATA_FORK))) { - goto out; + if (!dbp) { + error = xfs_dir2_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + if (error) + return error; } - block = dbp->data; - ASSERT(be32_to_cpu(block->hdr.magic) == XFS_DIR2_DATA_MAGIC); + hdr = dbp->b_addr; + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); /* * Size of the "leaf" area in the block. */ - size = (uint)sizeof(block->tail) + + size = (uint)sizeof(xfs_dir2_block_tail_t) + (uint)sizeof(*lep) * (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); /* * Look at the last data entry. */ - tagp = (__be16 *)((char *)block + mp->m_dirblksize) - 1; - dup = (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)); + tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; + dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); /* * If it's not free or is too short we can't do it. */ if (be16_to_cpu(dup->freetag) != XFS_DIR2_DATA_FREE_TAG || - be16_to_cpu(dup->length) < size) { - error = 0; - goto out; - } + be16_to_cpu(dup->length) < size) + return 0; + /* * Start converting it to block form. */ - block->hdr.magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + dbp->b_ops = &xfs_dir2_block_buf_ops; + hdr->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); needlog = 1; needscan = 0; /* @@ -847,7 +910,7 @@ xfs_dir2_leaf_to_block( /* * Initialize the block tail. */ - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, hdr); btp->count = cpu_to_be32(be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); @@ -856,7 +919,8 @@ xfs_dir2_leaf_to_block( */ lep = xfs_dir2_block_leaf_p(btp); for (from = to = 0; from < be16_to_cpu(leaf->hdr.count); from++) { - if (be32_to_cpu(leaf->ents[from].address) == XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[from].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; lep[to++] = leaf->ents[from]; } @@ -866,32 +930,24 @@ xfs_dir2_leaf_to_block( * Scan the bestfree if we need it and log the data block header. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* * Pitch the old leaf block. */ error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); - lbp = NULL; - if (error) { - goto out; - } + if (error) + return error; + /* * Now see if the resulting block can be shrunken to shortform. */ - if ((size = xfs_dir2_block_sfsize(dp, block, &sfh)) > - XFS_IFORK_DSIZE(dp)) { - error = 0; - goto out; - } + size = xfs_dir2_block_sfsize(dp, hdr, &sfh); + if (size > XFS_IFORK_DSIZE(dp)) + return 0; + return xfs_dir2_block_to_sf(args, dbp, size, &sfh); -out: - if (lbp) - xfs_da_buf_done(lbp); - if (dbp) - xfs_da_buf_done(dbp); - return error; } /* @@ -902,12 +958,10 @@ xfs_dir2_sf_to_block( xfs_da_args_t *args) /* operation arguments */ { xfs_dir2_db_t blkno; /* dir-relative block # (0) */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail pointer */ - char *buf; /* sf buffer */ - int buf_len; xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ int dummy; /* trash */ @@ -921,7 +975,8 @@ xfs_dir2_sf_to_block( int newoffset; /* offset from current entry */ int offset; /* target block offset */ xfs_dir2_sf_entry_t *sfep; /* sf entry pointer */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *oldsfp; /* old shortform header */ + xfs_dir2_sf_hdr_t *sfp; /* shortform header */ __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_name name; @@ -939,32 +994,30 @@ xfs_dir2_sf_to_block( ASSERT(XFS_FORCED_SHUTDOWN(mp)); return XFS_ERROR(EIO); } + + oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count)); + /* - * Copy the directory into the stack buffer. + * Copy the directory into a temporary buffer. * Then pitch the incore inode data so we can make extents. */ + sfp = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); + memcpy(sfp, oldsfp, dp->i_df.if_bytes); - buf_len = dp->i_df.if_bytes; - buf = kmem_alloc(buf_len, KM_SLEEP); - - memcpy(buf, sfp, buf_len); - xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); + xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); dp->i_d.di_size = 0; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - /* - * Reset pointer - old sfp is gone. - */ - sfp = (xfs_dir2_sf_t *)buf; + /* * Add block 0 to the inode. */ error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno); if (error) { - kmem_free(buf); + kmem_free(sfp); return error; } /* @@ -972,21 +1025,22 @@ xfs_dir2_sf_to_block( */ error = xfs_dir2_data_init(args, blkno, &bp); if (error) { - kmem_free(buf); + kmem_free(sfp); return error; } - block = bp->data; - block->hdr.magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + bp->b_ops = &xfs_dir2_block_buf_ops; + hdr = bp->b_addr; + hdr->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); /* * Compute size of block "tail" area. */ i = (uint)sizeof(*btp) + - (sfp->hdr.count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t); + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t); /* * The whole thing is initialized to free by the init routine. * Say we're using the leaf and tail area. */ - dup = (xfs_dir2_data_unused_t *)block->u; + dup = (xfs_dir2_data_unused_t *)(hdr + 1); needlog = needscan = 0; xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, &needscan); @@ -994,50 +1048,51 @@ xfs_dir2_sf_to_block( /* * Fill in the tail. */ - btp = xfs_dir2_block_tail_p(mp, block); - btp->count = cpu_to_be32(sfp->hdr.count + 2); /* ., .. */ + btp = xfs_dir2_block_tail_p(mp, hdr); + btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ btp->stale = 0; blp = xfs_dir2_block_leaf_p(btp); - endoffset = (uint)((char *)blp - (char *)block); + endoffset = (uint)((char *)blp - (char *)hdr); /* * Remove the freespace, we'll manage it. */ xfs_dir2_data_use_free(tp, bp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* * Create entry for . */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + XFS_DIR2_DATA_DOT_OFFSET); + ((char *)hdr + XFS_DIR2_DATA_DOT_OFFSET); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)block); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); /* * Create entry for .. */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + XFS_DIR2_DATA_DOTDOT_OFFSET); - dep->inumber = cpu_to_be64(xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent)); + ((char *)hdr + XFS_DIR2_DATA_DOTDOT_OFFSET); + dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)block); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); offset = XFS_DIR2_DATA_FIRST_OFFSET; /* * Loop over existing entries, stuff them in. */ - if ((i = 0) == sfp->hdr.count) + i = 0; + if (!sfp->count) sfep = NULL; else sfep = xfs_dir2_sf_firstentry(sfp); @@ -1057,43 +1112,40 @@ xfs_dir2_sf_to_block( * There should be a hole here, make one. */ if (offset < newoffset) { - dup = (xfs_dir2_data_unused_t *) - ((char *)block + offset); + dup = (xfs_dir2_data_unused_t *)((char *)hdr + offset); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); dup->length = cpu_to_be16(newoffset - offset); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( - ((char *)dup - (char *)block)); + ((char *)dup - (char *)hdr)); xfs_dir2_data_log_unused(tp, bp, dup); - (void)xfs_dir2_data_freeinsert((xfs_dir2_data_t *)block, - dup, &dummy); + xfs_dir2_data_freeinsert(hdr, dup, &dummy); offset += be16_to_cpu(dup->length); continue; } /* * Copy a real entry. */ - dep = (xfs_dir2_data_entry_t *)((char *)block + newoffset); - dep->inumber = cpu_to_be64(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); + dep->inumber = cpu_to_be64(xfs_dir2_sfe_get_ino(sfp, sfep)); dep->namelen = sfep->namelen; memcpy(dep->name, sfep->name, dep->namelen); tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)block); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> hashname(&name)); blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); - offset = (int)((char *)(tagp + 1) - (char *)block); - if (++i == sfp->hdr.count) + (char *)dep - (char *)hdr)); + offset = (int)((char *)(tagp + 1) - (char *)hdr); + if (++i == sfp->count) sfep = NULL; else sfep = xfs_dir2_sf_nextentry(sfp, sfep); } /* Done with the temporary buffer */ - kmem_free(buf); + kmem_free(sfp); /* * Sort the leaf entries by hash value. */ @@ -1106,6 +1158,5 @@ xfs_dir2_sf_to_block( xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index d89b5b1..eb86739 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -18,23 +18,21 @@ #include - -#ifdef DEBUG /* * Check the consistency of the data block. * The input can also be a block-format directory. - * Pop an assert if we find anything bad. + * Return 0 is the buffer is good, otherwise an error. */ -void -xfs_dir2_data_check( - xfs_inode_t *dp, /* incore inode pointer */ - xfs_dabuf_t *bp) /* data block's buffer */ +int +__xfs_dir2_data_check( + struct xfs_inode *dp, /* incore inode pointer */ + struct xfs_buf *bp) /* data block's buffer */ { xfs_dir2_dataptr_t addr; /* addr for leaf lookup */ xfs_dir2_data_free_t *bf; /* bestfree table */ xfs_dir2_block_tail_t *btp=NULL; /* block tail */ int count; /* count of entries found */ - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_unused_t *dup; /* unused entry */ @@ -49,36 +47,46 @@ xfs_dir2_data_check( int stale; /* count of stale leaves */ struct xfs_name name; - mp = dp->i_mount; - d = bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - bf = d->hdr.bestfree; - p = (char *)d->u; - if (be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC) { - btp = xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + mp = bp->b_target->bt_mount; + hdr = bp->b_addr; + bf = hdr->bestfree; + p = (char *)(hdr + 1); + + switch (be32_to_cpu(hdr->magic)) { + case XFS_DIR2_BLOCK_MAGIC: + btp = xfs_dir2_block_tail_p(mp, hdr); lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; - } else - endp = (char *)d + mp->m_dirblksize; + break; + case XFS_DIR2_DATA_MAGIC: + endp = (char *)hdr + mp->m_dirblksize; + break; + default: + XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); + return EFSCORRUPTED; + } + count = lastfree = freeseen = 0; /* * Account for zero bestfree entries. */ if (!bf[0].length) { - ASSERT(!bf[0].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[0].offset); freeseen |= 1 << 0; } if (!bf[1].length) { - ASSERT(!bf[1].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[1].offset); freeseen |= 1 << 1; } if (!bf[2].length) { - ASSERT(!bf[2].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[2].offset); freeseen |= 1 << 2; } - ASSERT(be16_to_cpu(bf[0].length) >= be16_to_cpu(bf[1].length)); - ASSERT(be16_to_cpu(bf[1].length) >= be16_to_cpu(bf[2].length)); + + XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[0].length) >= + be16_to_cpu(bf[1].length)); + XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[1].length) >= + be16_to_cpu(bf[2].length)); /* * Loop over the data/unused entries. */ @@ -90,17 +98,20 @@ xfs_dir2_data_check( * doesn't need to be there. */ if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { - ASSERT(lastfree == 0); - ASSERT(be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == - (char *)dup - (char *)d); - dfp = xfs_dir2_data_freefind(d, dup); + XFS_WANT_CORRUPTED_RETURN(lastfree == 0); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == + (char *)dup - (char *)hdr); + dfp = xfs_dir2_data_freefind(hdr, dup); if (dfp) { i = (int)(dfp - bf); - ASSERT((freeseen & (1 << i)) == 0); + XFS_WANT_CORRUPTED_RETURN( + (freeseen & (1 << i)) == 0); freeseen |= 1 << i; } else { - ASSERT(be16_to_cpu(dup->length) <= - be16_to_cpu(bf[2].length)); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(dup->length) <= + be16_to_cpu(bf[2].length)); } p += be16_to_cpu(dup->length); lastfree = 1; @@ -113,16 +124,18 @@ xfs_dir2_data_check( * The linear search is crude but this is DEBUG code. */ dep = (xfs_dir2_data_entry_t *)p; - ASSERT(dep->namelen != 0); - ASSERT(xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)) == 0); - ASSERT(be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) == - (char *)dep - (char *)d); + XFS_WANT_CORRUPTED_RETURN(dep->namelen != 0); + XFS_WANT_CORRUPTED_RETURN( + !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) == + (char *)dep - (char *)hdr); count++; lastfree = 0; - if (be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC) { + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)d)); + ((char *)dep - (char *)hdr)); name.name = dep->name; name.len = dep->namelen; hash = mp->m_dirnameops->hashname(&name); @@ -131,26 +144,122 @@ xfs_dir2_data_check( be32_to_cpu(lep[i].hashval) == hash) break; } - ASSERT(i < be32_to_cpu(btp->count)); + XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); } p += xfs_dir2_data_entsize(dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. */ - ASSERT(freeseen == 7); - if (be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC) { + XFS_WANT_CORRUPTED_RETURN(freeseen == 7); + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { for (i = stale = 0; i < be32_to_cpu(btp->count); i++) { - if (be32_to_cpu(lep[i].address) == XFS_DIR2_NULL_DATAPTR) + if (lep[i].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; if (i > 0) - ASSERT(be32_to_cpu(lep[i].hashval) >= be32_to_cpu(lep[i - 1].hashval)); + XFS_WANT_CORRUPTED_RETURN( + be32_to_cpu(lep[i].hashval) >= + be32_to_cpu(lep[i - 1].hashval)); } - ASSERT(count == be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); - ASSERT(stale == be32_to_cpu(btp->stale)); + XFS_WANT_CORRUPTED_RETURN(count == + be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); + XFS_WANT_CORRUPTED_RETURN(stale == be32_to_cpu(btp->stale)); + } + return 0; +} + +static void +xfs_dir2_data_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC); + block_ok = block_ok && __xfs_dir2_data_check(NULL, bp) == 0; + + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * Readahead of the first block of the directory when it is opened is completely + * oblivious to the format of the directory. Hence we can either get a block + * format buffer or a data format buffer on readahead. + */ +static void +xfs_dir2_data_reada_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr = bp->b_addr; + + switch (be32_to_cpu(hdr->magic)) { + case XFS_DIR2_BLOCK_MAGIC: + bp->b_ops = &xfs_dir2_block_buf_ops; + bp->b_ops->verify_read(bp); + return; + case XFS_DIR2_DATA_MAGIC: + xfs_dir2_data_verify(bp); + return; + default: + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + break; } } -#endif + +static void +xfs_dir2_data_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_data_verify(bp); +} + +static void +xfs_dir2_data_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_data_verify(bp); +} + +const struct xfs_buf_ops xfs_dir2_data_buf_ops = { + .verify_read = xfs_dir2_data_read_verify, + .verify_write = xfs_dir2_data_write_verify, +}; + +static const struct xfs_buf_ops xfs_dir2_data_reada_buf_ops = { + .verify_read = xfs_dir2_data_reada_verify, + .verify_write = xfs_dir2_data_write_verify, +}; + + +int +xfs_dir2_data_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mapped_bno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, + XFS_DATA_FORK, &xfs_dir2_data_buf_ops); +} + +int +xfs_dir2_data_readahead( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mapped_bno) +{ + return xfs_da_reada_buf(tp, dp, bno, mapped_bno, + XFS_DATA_FORK, &xfs_dir2_data_reada_buf_ops); +} /* * Given a data block and an unused entry from that block, @@ -158,7 +267,7 @@ xfs_dir2_data_check( */ xfs_dir2_data_free_t * xfs_dir2_data_freefind( - xfs_dir2_data_t *d, /* data block */ + xfs_dir2_data_hdr_t *hdr, /* data block */ xfs_dir2_data_unused_t *dup) /* data unused entry */ { xfs_dir2_data_free_t *dfp; /* bestfree entry */ @@ -168,17 +277,17 @@ xfs_dir2_data_freefind( int seenzero; /* saw a 0 bestfree entry */ #endif - off = (xfs_dir2_data_aoff_t)((char *)dup - (char *)d); + off = (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); #if defined(DEBUG) && defined(__KERNEL__) /* * Validate some consistency in the bestfree table. * Check order, non-overlapping entries, and if we find the * one we're looking for it has to be exact. */ - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - for (dfp = &d->hdr.bestfree[0], seenzero = matched = 0; - dfp < &d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT]; + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + for (dfp = &hdr->bestfree[0], seenzero = matched = 0; + dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) { ASSERT(!dfp->length); @@ -194,7 +303,7 @@ xfs_dir2_data_freefind( else ASSERT(be16_to_cpu(dfp->offset) + be16_to_cpu(dfp->length) <= off); ASSERT(matched || be16_to_cpu(dfp->length) >= be16_to_cpu(dup->length)); - if (dfp > &d->hdr.bestfree[0]) + if (dfp > &hdr->bestfree[0]) ASSERT(be16_to_cpu(dfp[-1].length) >= be16_to_cpu(dfp[0].length)); } #endif @@ -203,13 +312,13 @@ xfs_dir2_data_freefind( * it can't be there since they're sorted. */ if (be16_to_cpu(dup->length) < - be16_to_cpu(d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) + be16_to_cpu(hdr->bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) return NULL; /* * Look at the three bestfree entries for our guy. */ - for (dfp = &d->hdr.bestfree[0]; - dfp < &d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT]; + for (dfp = &hdr->bestfree[0]; + dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) return NULL; @@ -227,7 +336,7 @@ xfs_dir2_data_freefind( */ xfs_dir2_data_free_t * /* entry inserted */ xfs_dir2_data_freeinsert( - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block pointer */ xfs_dir2_data_unused_t *dup, /* unused space */ int *loghead) /* log the data header (out) */ { @@ -235,12 +344,13 @@ xfs_dir2_data_freeinsert( xfs_dir2_data_free_t new; /* new bestfree entry */ #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif - dfp = d->hdr.bestfree; + dfp = hdr->bestfree; new.length = dup->length; - new.offset = cpu_to_be16((char *)dup - (char *)d); + new.offset = cpu_to_be16((char *)dup - (char *)hdr); + /* * Insert at position 0, 1, or 2; or not at all. */ @@ -270,36 +380,36 @@ xfs_dir2_data_freeinsert( */ STATIC void xfs_dir2_data_freeremove( - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block header */ xfs_dir2_data_free_t *dfp, /* bestfree entry pointer */ int *loghead) /* out: log data header */ { #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif /* * It's the first entry, slide the next 2 up. */ - if (dfp == &d->hdr.bestfree[0]) { - d->hdr.bestfree[0] = d->hdr.bestfree[1]; - d->hdr.bestfree[1] = d->hdr.bestfree[2]; + if (dfp == &hdr->bestfree[0]) { + hdr->bestfree[0] = hdr->bestfree[1]; + hdr->bestfree[1] = hdr->bestfree[2]; } /* * It's the second entry, slide the 3rd entry up. */ - else if (dfp == &d->hdr.bestfree[1]) - d->hdr.bestfree[1] = d->hdr.bestfree[2]; + else if (dfp == &hdr->bestfree[1]) + hdr->bestfree[1] = hdr->bestfree[2]; /* * Must be the last entry. */ else - ASSERT(dfp == &d->hdr.bestfree[2]); + ASSERT(dfp == &hdr->bestfree[2]); /* * Clear the 3rd entry, must be zero now. */ - d->hdr.bestfree[2].length = 0; - d->hdr.bestfree[2].offset = 0; + hdr->bestfree[2].length = 0; + hdr->bestfree[2].offset = 0; *loghead = 1; } @@ -309,7 +419,7 @@ xfs_dir2_data_freeremove( void xfs_dir2_data_freescan( xfs_mount_t *mp, /* filesystem mount point */ - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block header */ int *loghead) /* out: log data header */ { xfs_dir2_block_tail_t *btp; /* block tail */ @@ -319,23 +429,23 @@ xfs_dir2_data_freescan( char *p; /* current entry pointer */ #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif /* * Start by clearing the table. */ - memset(d->hdr.bestfree, 0, sizeof(d->hdr.bestfree)); + memset(hdr->bestfree, 0, sizeof(hdr->bestfree)); *loghead = 1; /* * Set up pointers. */ - p = (char *)d->u; - if (be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC) { - btp = xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + p = (char *)(hdr + 1); + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + btp = xfs_dir2_block_tail_p(mp, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else - endp = (char *)d + mp->m_dirblksize; + endp = (char *)hdr + mp->m_dirblksize; /* * Loop over the block's entries. */ @@ -345,9 +455,9 @@ xfs_dir2_data_freescan( * If it's a free entry, insert it. */ if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { - ASSERT((char *)dup - (char *)d == + ASSERT((char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup))); - xfs_dir2_data_freeinsert(d, dup, loghead); + xfs_dir2_data_freeinsert(hdr, dup, loghead); p += be16_to_cpu(dup->length); } /* @@ -355,7 +465,7 @@ xfs_dir2_data_freescan( */ else { dep = (xfs_dir2_data_entry_t *)p; - ASSERT((char *)dep - (char *)d == + ASSERT((char *)dep - (char *)hdr == be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep))); p += xfs_dir2_data_entsize(dep->namelen); } @@ -370,10 +480,10 @@ int /* error */ xfs_dir2_data_init( xfs_da_args_t *args, /* directory operation args */ xfs_dir2_db_t blkno, /* logical dir block number */ - xfs_dabuf_t **bpp) /* output block buffer */ + struct xfs_buf **bpp) /* output block buffer */ { - xfs_dabuf_t *bp; /* block buffer */ - xfs_dir2_data_t *d; /* pointer to block */ + struct xfs_buf *bp; /* block buffer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused entry pointer */ int error; /* error return value */ @@ -390,30 +500,31 @@ xfs_dir2_data_init( */ error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, XFS_DATA_FORK); - if (error) { + if (error) return error; - } - ASSERT(bp != NULL); + bp->b_ops = &xfs_dir2_data_buf_ops; + /* * Initialize the header. */ - d = bp->data; - d->hdr.magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); - d->hdr.bestfree[0].offset = cpu_to_be16(sizeof(d->hdr)); + hdr = bp->b_addr; + hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); + hdr->bestfree[0].offset = cpu_to_be16(sizeof(*hdr)); for (i = 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { - d->hdr.bestfree[i].length = 0; - d->hdr.bestfree[i].offset = 0; + hdr->bestfree[i].length = 0; + hdr->bestfree[i].offset = 0; } + /* * Set up an unused entry for the block's body. */ - dup = &d->u[0].unused; + dup = (xfs_dir2_data_unused_t *)(hdr + 1); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t=mp->m_dirblksize - (uint)sizeof(d->hdr); - d->hdr.bestfree[0].length = cpu_to_be16(t); + t = mp->m_dirblksize - (uint)sizeof(*hdr); + hdr->bestfree[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); - *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)d); + *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); /* * Log it and return it. */ @@ -428,18 +539,18 @@ xfs_dir2_data_init( */ void xfs_dir2_data_log_entry( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); - d = bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)dep - (char *)d), + xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - - (char *)d - 1)); + (char *)hdr - 1)); } /* @@ -447,16 +558,15 @@ xfs_dir2_data_log_entry( */ void xfs_dir2_data_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); - d = bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&d->hdr - (char *)d), - (uint)(sizeof(d->hdr) - 1)); + xfs_trans_log_buf(tp, bp, 0, sizeof(*hdr) - 1); } /* @@ -464,27 +574,27 @@ xfs_dir2_data_log_header( */ void xfs_dir2_data_log_unused( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_unused_t *dup) /* data unused pointer */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr = bp->b_addr; + + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); - d = bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); /* * Log the first part of the unused entry. */ - xfs_da_log_buf(tp, bp, (uint)((char *)dup - (char *)d), + xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), (uint)((char *)&dup->length + sizeof(dup->length) - - 1 - (char *)d)); + 1 - (char *)hdr)); /* * Log the end (tag) of the unused entry. */ - xfs_da_log_buf(tp, bp, - (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)d), - (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)d + + xfs_trans_log_buf(tp, bp, + (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), + (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + sizeof(xfs_dir2_data_off_t) - 1)); } @@ -494,14 +604,14 @@ xfs_dir2_data_log_unused( */ void xfs_dir2_data_make_free( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ int *needlogp, /* out: log header */ int *needscanp) /* out: regen bestfree */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr; /* data block pointer */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ char *endptr; /* end of data area */ xfs_mount_t *mp; /* filesystem mount point */ @@ -511,28 +621,29 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ mp = tp->t_mountp; - d = bp->data; + hdr = bp->b_addr; + /* * Figure out where the end of the data area is. */ - if (be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC) - endptr = (char *)d + mp->m_dirblksize; + if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + endptr = (char *)hdr + mp->m_dirblksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); - btp = xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + btp = xfs_dir2_block_tail_p(mp, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > sizeof(d->hdr)) { + if (offset > sizeof(*hdr)) { __be16 *tagp; /* tag just before us */ - tagp = (__be16 *)((char *)d + offset) - 1; - prevdup = (xfs_dir2_data_unused_t *)((char *)d + be16_to_cpu(*tagp)); + tagp = (__be16 *)((char *)hdr + offset) - 1; + prevdup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); if (be16_to_cpu(prevdup->freetag) != XFS_DIR2_DATA_FREE_TAG) prevdup = NULL; } else @@ -541,9 +652,9 @@ xfs_dir2_data_make_free( * If this isn't the end of the block, see if the entry after * us is free. */ - if ((char *)d + offset + len < endptr) { + if ((char *)hdr + offset + len < endptr) { postdup = - (xfs_dir2_data_unused_t *)((char *)d + offset + len); + (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); if (be16_to_cpu(postdup->freetag) != XFS_DIR2_DATA_FREE_TAG) postdup = NULL; } else @@ -560,21 +671,21 @@ xfs_dir2_data_make_free( /* * See if prevdup and/or postdup are in bestfree table. */ - dfp = xfs_dir2_data_freefind(d, prevdup); - dfp2 = xfs_dir2_data_freefind(d, postdup); + dfp = xfs_dir2_data_freefind(hdr, prevdup); + dfp2 = xfs_dir2_data_freefind(hdr, postdup); /* * We need a rescan unless there are exactly 2 free entries * namely our two. Then we know what's happening, otherwise * since the third bestfree is there, there might be more * entries. */ - needscan = (d->hdr.bestfree[2].length != 0); + needscan = (hdr->bestfree[2].length != 0); /* * Fix up the new big freespace. */ be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(prevdup) = - cpu_to_be16((char *)prevdup - (char *)d); + cpu_to_be16((char *)prevdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, prevdup); if (!needscan) { /* @@ -584,18 +695,18 @@ xfs_dir2_data_make_free( * Remove entry 1 first then entry 0. */ ASSERT(dfp && dfp2); - if (dfp == &d->hdr.bestfree[1]) { - dfp = &d->hdr.bestfree[0]; + if (dfp == &hdr->bestfree[1]) { + dfp = &hdr->bestfree[0]; ASSERT(dfp2 == dfp); - dfp2 = &d->hdr.bestfree[1]; + dfp2 = &hdr->bestfree[1]; } - xfs_dir2_data_freeremove(d, dfp2, needlogp); - xfs_dir2_data_freeremove(d, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, dfp2, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); /* * Now insert the new entry. */ - dfp = xfs_dir2_data_freeinsert(d, prevdup, needlogp); - ASSERT(dfp == &d->hdr.bestfree[0]); + dfp = xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); + ASSERT(dfp == &hdr->bestfree[0]); ASSERT(dfp->length == prevdup->length); ASSERT(!dfp[1].length); ASSERT(!dfp[2].length); @@ -605,10 +716,10 @@ xfs_dir2_data_make_free( * The entry before us is free, merge with it. */ else if (prevdup) { - dfp = xfs_dir2_data_freefind(d, prevdup); + dfp = xfs_dir2_data_freefind(hdr, prevdup); be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) = - cpu_to_be16((char *)prevdup - (char *)d); + cpu_to_be16((char *)prevdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, prevdup); /* * If the previous entry was in the table, the new entry @@ -616,27 +727,27 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, prevdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. */ else { needscan = be16_to_cpu(prevdup->length) > - be16_to_cpu(d->hdr.bestfree[2].length); + be16_to_cpu(hdr->bestfree[2].length); } } /* * The following entry is free, merge with it. */ else if (postdup) { - dfp = xfs_dir2_data_freefind(d, postdup); - newdup = (xfs_dir2_data_unused_t *)((char *)d + offset); + dfp = xfs_dir2_data_freefind(hdr, postdup); + newdup = (xfs_dir2_data_unused_t *)((char *)hdr + offset); newdup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(newdup) = - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If the following entry was in the table, the new entry @@ -644,28 +755,28 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. */ else { needscan = be16_to_cpu(newdup->length) > - be16_to_cpu(d->hdr.bestfree[2].length); + be16_to_cpu(hdr->bestfree[2].length); } } /* * Neither neighbor is free. Make a new entry. */ else { - newdup = (xfs_dir2_data_unused_t *)((char *)d + offset); + newdup = (xfs_dir2_data_unused_t *)((char *)hdr + offset); newdup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length = cpu_to_be16(len); *xfs_dir2_data_unused_tag_p(newdup) = - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); - (void)xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); } *needscanp = needscan; } @@ -675,15 +786,15 @@ xfs_dir2_data_make_free( */ void xfs_dir2_data_use_free( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* data block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ xfs_dir2_data_aoff_t len, /* length to use */ int *needlogp, /* out: need to log header */ int *needscanp) /* out: need regen bestfree */ { - xfs_dir2_data_t *d; /* data block */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ int matchback; /* matches end of freespace */ int matchfront; /* matches start of freespace */ @@ -692,24 +803,24 @@ xfs_dir2_data_use_free( xfs_dir2_data_unused_t *newdup2; /* another new unused entry */ int oldlen; /* old unused entry's length */ - d = bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) == XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) == XFS_DIR2_BLOCK_MAGIC); + hdr = bp->b_addr; + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG); - ASSERT(offset >= (char *)dup - (char *)d); - ASSERT(offset + len <= (char *)dup + be16_to_cpu(dup->length) - (char *)d); - ASSERT((char *)dup - (char *)d == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup))); + ASSERT(offset >= (char *)dup - (char *)hdr); + ASSERT(offset + len <= (char *)dup + be16_to_cpu(dup->length) - (char *)hdr); + ASSERT((char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup))); /* * Look up the entry in the bestfree table. */ - dfp = xfs_dir2_data_freefind(d, dup); + dfp = xfs_dir2_data_freefind(hdr, dup); oldlen = be16_to_cpu(dup->length); - ASSERT(dfp || oldlen <= be16_to_cpu(d->hdr.bestfree[2].length)); + ASSERT(dfp || oldlen <= be16_to_cpu(hdr->bestfree[2].length)); /* * Check for alignment with front and back of the entry. */ - matchfront = (char *)dup - (char *)d == offset; - matchback = (char *)dup + oldlen - (char *)d == offset + len; + matchfront = (char *)dup - (char *)hdr == offset; + matchback = (char *)dup + oldlen - (char *)hdr == offset + len; ASSERT(*needscanp == 0); needscan = 0; /* @@ -718,9 +829,9 @@ xfs_dir2_data_use_free( */ if (matchfront && matchback) { if (dfp) { - needscan = (d->hdr.bestfree[2].offset != 0); + needscan = (hdr->bestfree[2].offset != 0); if (!needscan) - xfs_dir2_data_freeremove(d, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); } } /* @@ -728,27 +839,27 @@ xfs_dir2_data_use_free( * Make a new entry with the remaining freespace. */ else if (matchfront) { - newdup = (xfs_dir2_data_unused_t *)((char *)d + offset + len); + newdup = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length = cpu_to_be16(oldlen - len); *xfs_dir2_data_unused_tag_p(newdup) = - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - dfp = xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + dfp = xfs_dir2_data_freeinsert(hdr, newdup, needlogp); ASSERT(dfp != NULL); ASSERT(dfp->length == newdup->length); - ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)d); + ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)hdr); /* * If we got inserted at the last slot, * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan = dfp == &d->hdr.bestfree[2]; + needscan = dfp == &hdr->bestfree[2]; } } /* @@ -757,25 +868,25 @@ xfs_dir2_data_use_free( */ else if (matchback) { newdup = dup; - newdup->length = cpu_to_be16(((char *)d + offset) - (char *)newdup); + newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - dfp = xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + dfp = xfs_dir2_data_freeinsert(hdr, newdup, needlogp); ASSERT(dfp != NULL); ASSERT(dfp->length == newdup->length); - ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)d); + ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)hdr); /* * If we got inserted at the last slot, * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan = dfp == &d->hdr.bestfree[2]; + needscan = dfp == &hdr->bestfree[2]; } } /* @@ -784,15 +895,15 @@ xfs_dir2_data_use_free( */ else { newdup = dup; - newdup->length = cpu_to_be16(((char *)d + offset) - (char *)newdup); + newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); - newdup2 = (xfs_dir2_data_unused_t *)((char *)d + offset + len); + newdup2 = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup2->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup2->length = cpu_to_be16(oldlen - len - be16_to_cpu(newdup->length)); *xfs_dir2_data_unused_tag_p(newdup2) = - cpu_to_be16((char *)newdup2 - (char *)d); + cpu_to_be16((char *)newdup2 - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup2); /* * If the old entry was in the table, we need to scan @@ -803,13 +914,12 @@ xfs_dir2_data_use_free( * the 2 new will work. */ if (dfp) { - needscan = (d->hdr.bestfree[2].length != 0); + needscan = (hdr->bestfree[2].length != 0); if (!needscan) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup, - needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup2, - needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup2, + needlogp); } } } diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 9ce2320..d303813 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -22,16 +22,93 @@ * Local function declarations. */ #ifdef DEBUG -static void xfs_dir2_leaf_check(xfs_inode_t *dp, xfs_dabuf_t *bp); +static void xfs_dir2_leaf_check(struct xfs_inode *dp, struct xfs_buf *bp); #else #define xfs_dir2_leaf_check(dp, bp) #endif -static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **lbpp, - int *indexp, xfs_dabuf_t **dbpp); -static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp, +static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, + int *indexp, struct xfs_buf **dbpp); +static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, int first, int last); -static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf *bp); +static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void +xfs_dir2_leaf_verify( + struct xfs_buf *bp, + __be16 magic) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_leaf_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->info.magic == magic; + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_leaf1_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); +} + +static void +xfs_dir2_leaf1_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); +} + +void +xfs_dir2_leafn_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); +} + +void +xfs_dir2_leafn_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); +} + +static const struct xfs_buf_ops xfs_dir2_leaf1_buf_ops = { + .verify_read = xfs_dir2_leaf1_read_verify, + .verify_write = xfs_dir2_leaf1_write_verify, +}; + +const struct xfs_buf_ops xfs_dir2_leafn_buf_ops = { + .verify_read = xfs_dir2_leafn_read_verify, + .verify_write = xfs_dir2_leafn_write_verify, +}; + +static int +xfs_dir2_leaf_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_leaf1_buf_ops); +} + +int +xfs_dir2_leafn_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_leafn_buf_ops); +} /* * Convert a block form directory to a leaf form directory. @@ -39,16 +116,16 @@ static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf *bp); int /* error */ xfs_dir2_block_to_leaf( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *dbp) /* input block's buffer */ + struct xfs_buf *dbp) /* input block's buffer */ { __be16 *bestsp; /* leaf's bestsp entries */ xfs_dablk_t blkno; /* leaf block's bno */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block's leaf entries */ xfs_dir2_block_tail_t *btp; /* block's tail */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ - xfs_dabuf_t *lbp; /* leaf block's buffer */ + struct xfs_buf *lbp; /* leaf block's buffer */ xfs_dir2_db_t ldb; /* leaf block's bno */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf's tail */ @@ -79,10 +156,10 @@ xfs_dir2_block_to_leaf( return error; } ASSERT(lbp != NULL); - leaf = lbp->data; - block = dbp->data; + leaf = lbp->b_addr; + hdr = dbp->b_addr; xfs_dir2_data_check(dp, dbp); - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Set the counts in the leaf header. @@ -102,23 +179,24 @@ xfs_dir2_block_to_leaf( * tail be free. */ xfs_dir2_data_make_free(tp, dbp, - (xfs_dir2_data_aoff_t)((char *)blp - (char *)block), - (xfs_dir2_data_aoff_t)((char *)block + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), + (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - (char *)blp), &needlog, &needscan); /* * Fix up the block header, make it a data block. */ - block->hdr.magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); + dbp->b_ops = &xfs_dir2_data_buf_ops; + hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Set up leaf tail and bests table. */ ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = cpu_to_be32(1); bestsp = xfs_dir2_leaf_bests_p(ltp); - bestsp[0] = block->hdr.bestfree[0].length; + bestsp[0] = hdr->bestfree[0].length; /* * Log the data header and leaf bests table. */ @@ -127,10 +205,134 @@ xfs_dir2_block_to_leaf( xfs_dir2_leaf_check(dp, lbp); xfs_dir2_data_check(dp, dbp); xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); - xfs_da_buf_done(lbp); return 0; } +STATIC void +xfs_dir2_leaf_find_stale( + struct xfs_dir2_leaf *leaf, + int index, + int *lowstale, + int *highstale) +{ + /* + * Find the first stale entry before our index, if any. + */ + for (*lowstale = index - 1; *lowstale >= 0; --*lowstale) { + if (leaf->ents[*lowstale].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + break; + } + + /* + * Find the first stale entry at or after our index, if any. + * Stop if the result would require moving more entries than using + * lowstale. + */ + for (*highstale = index; + *highstale < be16_to_cpu(leaf->hdr.count); + ++*highstale) { + if (leaf->ents[*highstale].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + break; + if (*lowstale >= 0 && index - *lowstale <= *highstale - index) + break; + } +} + +struct xfs_dir2_leaf_entry * +xfs_dir2_leaf_find_entry( + xfs_dir2_leaf_t *leaf, /* leaf structure */ + int index, /* leaf table position */ + int compact, /* need to compact leaves */ + int lowstale, /* index of prev stale leaf */ + int highstale, /* index of next stale leaf */ + int *lfloglow, /* low leaf logging index */ + int *lfloghigh) /* high leaf logging index */ +{ + if (!leaf->hdr.stale) { + xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ + + /* + * Now we need to make room to insert the leaf entry. + * + * If there are no stale entries, just insert a hole at index. + */ + lep = &leaf->ents[index]; + if (index < be16_to_cpu(leaf->hdr.count)) + memmove(lep + 1, lep, + (be16_to_cpu(leaf->hdr.count) - index) * + sizeof(*lep)); + + /* + * Record low and high logging indices for the leaf. + */ + *lfloglow = index; + *lfloghigh = be16_to_cpu(leaf->hdr.count); + be16_add_cpu(&leaf->hdr.count, 1); + return lep; + } + + /* + * There are stale entries. + * + * We will use one of them for the new entry. It's probably not at + * the right location, so we'll have to shift some up or down first. + * + * If we didn't compact before, we need to find the nearest stale + * entries before and after our insertion point. + */ + if (compact == 0) + xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + + /* + * If the low one is better, use it. + */ + if (lowstale >= 0 && + (highstale == be16_to_cpu(leaf->hdr.count) || + index - lowstale - 1 < highstale - index)) { + ASSERT(index - lowstale - 1 >= 0); + ASSERT(leaf->ents[lowstale].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + + /* + * Copy entries up to cover the stale entry and make room + * for the new entry. + */ + if (index - lowstale - 1 > 0) { + memmove(&leaf->ents[lowstale], + &leaf->ents[lowstale + 1], + (index - lowstale - 1) * + sizeof(xfs_dir2_leaf_entry_t)); + } + *lfloglow = MIN(lowstale, *lfloglow); + *lfloghigh = MAX(index - 1, *lfloghigh); + be16_add_cpu(&leaf->hdr.stale, -1); + return &leaf->ents[index - 1]; + } + + /* + * The high one is better, so use that one. + */ + ASSERT(highstale - index >= 0); + ASSERT(leaf->ents[highstale].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + + /* + * Copy entries down to cover the stale entry and make room for the + * new entry. + */ + if (highstale - index > 0) { + memmove(&leaf->ents[index + 1], + &leaf->ents[index], + (highstale - index) * sizeof(xfs_dir2_leaf_entry_t)); + } + *lfloglow = MIN(index, *lfloglow); + *lfloghigh = MAX(highstale, *lfloghigh); + be16_add_cpu(&leaf->hdr.stale, -1); + return &leaf->ents[index]; +} + /* * Add an entry to a leaf form directory. */ @@ -140,8 +342,8 @@ xfs_dir2_leaf_addname( { __be16 *bestsp; /* freespace table in leaf */ int compact; /* need to compact leaves */ - xfs_dir2_data_t *data; /* data block structure */ - xfs_dabuf_t *dbp; /* data block buffer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* data unused entry */ @@ -150,7 +352,7 @@ xfs_dir2_leaf_addname( int highstale; /* index of next stale leaf */ int i; /* temporary, index */ int index; /* leaf table position */ - xfs_dabuf_t *lbp; /* leaf's buffer */ + struct xfs_buf *lbp; /* leaf's buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int length; /* length of new entry */ xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ @@ -171,15 +373,11 @@ xfs_dir2_leaf_addname( dp = args->dp; tp = args->trans; mp = dp->i_mount; - /* - * Read the leaf block. - */ - error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp, - XFS_DATA_FORK); - if (error) { + + error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + if (error) return error; - } - ASSERT(lbp != NULL); + /* * Look up the entry by hash value and name. * We know it's not there, our caller has already done a lookup. @@ -187,7 +385,7 @@ xfs_dir2_leaf_addname( * But if there are dup hash values the index is of the first of those. */ index = xfs_dir2_leaf_search_hash(args, lbp); - leaf = lbp->data; + leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); length = xfs_dir2_data_entsize(args->namelen); @@ -204,7 +402,7 @@ xfs_dir2_leaf_addname( continue; i = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); ASSERT(i < be32_to_cpu(ltp->bestcount)); - ASSERT(be16_to_cpu(bestsp[i]) != NULLDATAOFF); + ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF)); if (be16_to_cpu(bestsp[i]) >= length) { use_block = i; break; @@ -218,7 +416,8 @@ xfs_dir2_leaf_addname( /* * Remember a block we see that's missing. */ - if (be16_to_cpu(bestsp[i]) == NULLDATAOFF && use_block == -1) + if (bestsp[i] == cpu_to_be16(NULLDATAOFF) && + use_block == -1) use_block = i; else if (be16_to_cpu(bestsp[i]) >= length) { use_block = i; @@ -229,14 +428,17 @@ xfs_dir2_leaf_addname( /* * How many bytes do we need in the leaf block? */ - needbytes = - (leaf->hdr.stale ? 0 : (uint)sizeof(leaf->ents[0])) + - (use_block != -1 ? 0 : (uint)sizeof(leaf->bests[0])); + needbytes = 0; + if (!leaf->hdr.stale) + needbytes += sizeof(xfs_dir2_leaf_entry_t); + if (use_block == -1) + needbytes += sizeof(xfs_dir2_data_off_t); + /* * Now kill use_block if it refers to a missing block, so we * can use it as an indication of allocation needed. */ - if (use_block != -1 && be16_to_cpu(bestsp[use_block]) == NULLDATAOFF) + if (use_block != -1 && bestsp[use_block] == cpu_to_be16(NULLDATAOFF)) use_block = -1; /* * If we don't have enough free bytes but we can make enough @@ -257,14 +459,13 @@ xfs_dir2_leaf_addname( */ if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOSPC); } /* * Convert to node form. */ error = xfs_dir2_leaf_to_node(args, lbp); - xfs_da_buf_done(lbp); if (error) return error; /* @@ -282,7 +483,7 @@ xfs_dir2_leaf_addname( * a new data block. */ if (args->op_flags & XFS_DA_OP_JUSTCHECK) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return use_block == -1 ? XFS_ERROR(ENOSPC) : 0; } /* @@ -290,7 +491,7 @@ xfs_dir2_leaf_addname( * changed anything. */ if (args->total == 0 && use_block == -1) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOSPC); } /* @@ -321,14 +522,14 @@ xfs_dir2_leaf_addname( */ if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &use_block))) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } /* * Initialize the block. */ if ((error = xfs_dir2_data_init(args, use_block, &dbp))) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } /* @@ -348,37 +549,36 @@ xfs_dir2_leaf_addname( */ else xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); - data = dbp->data; - bestsp[use_block] = data->hdr.bestfree[0].length; + hdr = dbp->b_addr; + bestsp[use_block] = hdr->bestfree[0].length; grown = 1; - } - /* - * Already had space in some data block. - * Just read that one in. - */ - else { - if ((error = - xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, use_block), - -1, &dbp, XFS_DATA_FORK))) { - xfs_da_brelse(tp, lbp); + } else { + /* + * Already had space in some data block. + * Just read that one in. + */ + error = xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, use_block), + -1, &dbp); + if (error) { + xfs_trans_brelse(tp, lbp); return error; } - data = dbp->data; + hdr = dbp->b_addr; grown = 0; } - xfs_dir2_data_check(dp, dbp); /* * Point to the biggest freespace in our data block. */ dup = (xfs_dir2_data_unused_t *) - ((char *)data + be16_to_cpu(data->hdr.bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); ASSERT(be16_to_cpu(dup->length) >= length); needscan = needlog = 0; /* * Mark the initial part of our freespace in use for the new entry. */ xfs_dir2_data_use_free(tp, dbp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)data), length, + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* * Initialize our new entry (at last). @@ -388,12 +588,12 @@ xfs_dir2_leaf_addname( dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)data); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Need to scan fix up the bestfree table. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Need to log the data block's header. */ @@ -404,107 +604,15 @@ xfs_dir2_leaf_addname( * If the bests table needs to be changed, do it. * Log the change unless we've already done that. */ - if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(data->hdr.bestfree[0].length)) { - bestsp[use_block] = data->hdr.bestfree[0].length; + if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(hdr->bestfree[0].length)) { + bestsp[use_block] = hdr->bestfree[0].length; if (!grown) xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); } - /* - * Now we need to make room to insert the leaf entry. - * If there are no stale entries, we just insert a hole at index. - */ - if (!leaf->hdr.stale) { - /* - * lep is still good as the index leaf entry. - */ - if (index < be16_to_cpu(leaf->hdr.count)) - memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * sizeof(*lep)); - /* - * Record low and high logging indices for the leaf. - */ - lfloglow = index; - lfloghigh = be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); - } - /* - * There are stale entries. - * We will use one of them for the new entry. - * It's probably not at the right location, so we'll have to - * shift some up or down first. - */ - else { - /* - * If we didn't compact before, we need to find the nearest - * stale entries before and after our insertion point. - */ - if (compact == 0) { - /* - * Find the first stale entry before the insertion - * point, if any. - */ - for (lowstale = index - 1; - lowstale >= 0 && - be32_to_cpu(leaf->ents[lowstale].address) != - XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find the next stale entry at or after the insertion - * point, if any. Stop if we go so far that the - * lowstale entry would be better. - */ - for (highstale = index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) != - XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || - index - lowstale - 1 >= highstale - index); - highstale++) - continue; - } - /* - * If the low one is better, use it. - */ - if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || - index - lowstale - 1 < highstale - index)) { - ASSERT(index - lowstale - 1 >= 0); - ASSERT(be32_to_cpu(leaf->ents[lowstale].address) == - XFS_DIR2_NULL_DATAPTR); - /* - * Copy entries up to cover the stale entry - * and make room for the new entry. - */ - if (index - lowstale - 1 > 0) - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], - (index - lowstale - 1) * sizeof(*lep)); - lep = &leaf->ents[index - 1]; - lfloglow = MIN(lowstale, lfloglow); - lfloghigh = MAX(index - 1, lfloghigh); - } - /* - * The high one is better, so use that one. - */ - else { - ASSERT(highstale - index >= 0); - ASSERT(be32_to_cpu(leaf->ents[highstale].address) == - XFS_DIR2_NULL_DATAPTR); - /* - * Copy entries down to cover the stale entry - * and make room for the new entry. - */ - if (highstale - index > 0) - memmove(&leaf->ents[index + 1], - &leaf->ents[index], - (highstale - index) * sizeof(*lep)); - lep = &leaf->ents[index]; - lfloglow = MIN(index, lfloglow); - lfloghigh = MAX(highstale, lfloghigh); - } - be16_add_cpu(&leaf->hdr.stale, -1); - } + + lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + highstale, &lfloglow, &lfloghigh); + /* * Fill in the new leaf entry. */ @@ -517,9 +625,7 @@ xfs_dir2_leaf_addname( xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); xfs_dir2_leaf_check(dp, lbp); - xfs_da_buf_done(lbp); xfs_dir2_data_check(dp, dbp); - xfs_da_buf_done(dbp); return 0; } @@ -530,8 +636,8 @@ xfs_dir2_leaf_addname( */ STATIC void xfs_dir2_leaf_check( - xfs_inode_t *dp, /* incore directory inode */ - xfs_dabuf_t *bp) /* leaf's buffer */ + struct xfs_inode *dp, /* incore directory inode */ + struct xfs_buf *bp) /* leaf's buffer */ { int i; /* leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -539,9 +645,9 @@ xfs_dir2_leaf_check( xfs_mount_t *mp; /* filesystem mount point */ int stale; /* count of stale leaves */ - leaf = bp->data; + leaf = bp->b_addr; mp = dp->i_mount; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); /* * This value is not restrictive enough. * Should factor in the size of the bests table as well. @@ -561,7 +667,7 @@ xfs_dir2_leaf_check( if (i + 1 < be16_to_cpu(leaf->hdr.count)) ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= be32_to_cpu(leaf->ents[i + 1].hashval)); - if (be32_to_cpu(leaf->ents[i].address) == XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); @@ -575,14 +681,14 @@ xfs_dir2_leaf_check( void xfs_dir2_leaf_compact( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_buf *bp) /* leaf buffer */ { int from; /* source leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int loglow; /* first leaf entry to log */ int to; /* target leaf index */ - leaf = bp->data; + leaf = bp->b_addr; if (!leaf->hdr.stale) { return; } @@ -590,7 +696,8 @@ xfs_dir2_leaf_compact( * Compress out the stale entries in place. */ for (from = to = 0, loglow = -1; from < be16_to_cpu(leaf->hdr.count); from++) { - if (be32_to_cpu(leaf->ents[from].address) == XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[from].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; /* * Only actually copy the entries that are different. @@ -623,7 +730,7 @@ xfs_dir2_leaf_compact( */ void xfs_dir2_leaf_compact_x1( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int *indexp, /* insertion index */ int *lowstalep, /* out: stale entry before us */ int *highstalep, /* out: stale entry after us */ @@ -639,27 +746,12 @@ xfs_dir2_leaf_compact_x1( int newindex=0; /* new insertion index */ int to; /* destination copy index */ - leaf = bp->data; + leaf = bp->b_addr; ASSERT(be16_to_cpu(leaf->hdr.stale) > 1); index = *indexp; - /* - * Find the first stale entry before our index, if any. - */ - for (lowstale = index - 1; - lowstale >= 0 && - be32_to_cpu(leaf->ents[lowstale].address) != XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find the first stale entry at or after our index, if any. - * Stop if the answer would be worse than lowstale. - */ - for (highstale = index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) != XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || index - lowstale > highstale - index); - highstale++) - continue; + + xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + /* * Pick the better of lowstale and highstale. */ @@ -680,7 +772,8 @@ xfs_dir2_leaf_compact_x1( if (index == from) newindex = to; if (from != keepstale && - be32_to_cpu(leaf->ents[from].address) == XFS_DIR2_NULL_DATAPTR) { + leaf->ents[from].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { if (from == to) *lowlogp = to; continue; @@ -730,10 +823,10 @@ int xfs_dir2_leaf_init( xfs_da_args_t *args, /* operation arguments */ xfs_dir2_db_t bno, /* directory block number */ - xfs_dabuf_t **bpp, /* out: leaf buffer */ + struct xfs_buf **bpp, /* out: leaf buffer */ int magic) /* magic number for block */ { - xfs_dabuf_t *bp; /* leaf buffer */ + struct xfs_buf *bp; /* leaf buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -751,15 +844,14 @@ xfs_dir2_leaf_init( * Get the buffer for the block. */ error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); - if (error) { + XFS_DATA_FORK); + if (error) return error; - } - ASSERT(bp != NULL); - leaf = bp->data; + /* * Initialize the header. */ + leaf = bp->b_addr; leaf->hdr.info.magic = cpu_to_be16(magic); leaf->hdr.info.forw = 0; leaf->hdr.info.back = 0; @@ -772,10 +864,12 @@ xfs_dir2_leaf_init( * the block. */ if (magic == XFS_DIR2_LEAF1_MAGIC) { + bp->b_ops = &xfs_dir2_leaf1_buf_ops; ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = 0; xfs_dir2_leaf_log_tail(tp, bp); - } + } else + bp->b_ops = &xfs_dir2_leafn_buf_ops; *bpp = bp; return 0; } @@ -786,7 +880,7 @@ xfs_dir2_leaf_init( static void xfs_dir2_leaf_log_bests( xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ { @@ -795,12 +889,12 @@ xfs_dir2_leaf_log_bests( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; - xfs_da_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); } @@ -810,7 +904,7 @@ xfs_dir2_leaf_log_bests( void xfs_dir2_leaf_log_ents( xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ { @@ -818,12 +912,12 @@ xfs_dir2_leaf_log_ents( xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ xfs_dir2_leaf_t *leaf; /* leaf structure */ - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC || - be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); firstlep = &leaf->ents[first]; lastlep = &leaf->ents[last]; - xfs_da_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -832,15 +926,15 @@ xfs_dir2_leaf_log_ents( */ void xfs_dir2_leaf_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_leaf_t *leaf; /* leaf structure */ - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC || - be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), (uint)(sizeof(leaf->hdr) - 1)); } @@ -849,18 +943,18 @@ xfs_dir2_leaf_log_header( */ STATIC void xfs_dir2_leaf_log_tail( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ xfs_mount_t *mp; /* filesystem mount point */ mp = tp->t_mountp; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAF1_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp = xfs_dir2_leaf_tail_p(mp, leaf); - xfs_da_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), (uint)(mp->m_dirblksize - 1)); } @@ -873,12 +967,12 @@ int xfs_dir2_leaf_lookup( xfs_da_args_t *args) /* operation arguments */ { - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* found entry index */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ @@ -894,7 +988,7 @@ xfs_dir2_leaf_lookup( tp = args->trans; dp = args->dp; xfs_dir2_leaf_check(dp, lbp); - leaf = lbp->data; + leaf = lbp->b_addr; /* * Get to the leaf entry and contained data entry address. */ @@ -903,15 +997,15 @@ xfs_dir2_leaf_lookup( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *) - ((char *)dbp->data + + ((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); /* * Return the found inode number & CI name if appropriate */ args->inumber = be64_to_cpu(dep->inumber); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); - xfs_da_brelse(tp, dbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, dbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(error); } @@ -924,17 +1018,17 @@ xfs_dir2_leaf_lookup( static int /* error */ xfs_dir2_leaf_lookup_int( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t **lbpp, /* out: leaf buffer */ + struct xfs_buf **lbpp, /* out: leaf buffer */ int *indexp, /* out: index in leaf block */ - xfs_dabuf_t **dbpp) /* out: data buffer */ + struct xfs_buf **dbpp) /* out: data buffer */ { xfs_dir2_db_t curdb = -1; /* current data block number */ - xfs_dabuf_t *dbp = NULL; /* data buffer */ + struct xfs_buf *dbp = NULL; /* data buffer */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* index in leaf block */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ @@ -946,15 +1040,13 @@ xfs_dir2_leaf_lookup_int( dp = args->dp; tp = args->trans; mp = dp->i_mount; - /* - * Read the leaf block into the buffer. - */ - error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp, - XFS_DATA_FORK); + + error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; + *lbpp = lbp; - leaf = lbp->data; + leaf = lbp->b_addr; xfs_dir2_leaf_check(dp, lbp); /* * Look for the first leaf entry with our hash value. @@ -982,21 +1074,20 @@ xfs_dir2_leaf_lookup_int( */ if (newdb != curdb) { if (dbp) - xfs_da_brelse(tp, dbp); - error = xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, newdb), - -1, &dbp, XFS_DATA_FORK); + xfs_trans_brelse(tp, dbp); + error = xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, newdb), + -1, &dbp); if (error) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } - xfs_dir2_data_check(dp, dbp); curdb = newdb; } /* * Point to the data entry. */ - dep = (xfs_dir2_data_entry_t *)((char *)dbp->data + + dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* * Compare name and if it's an exact match, return the index @@ -1024,12 +1115,12 @@ xfs_dir2_leaf_lookup_int( if (args->cmpresult == XFS_CMP_CASE) { ASSERT(cidb != -1); if (cidb != curdb) { - xfs_da_brelse(tp, dbp); - error = xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, cidb), - -1, &dbp, XFS_DATA_FORK); + xfs_trans_brelse(tp, dbp); + error = xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, cidb), + -1, &dbp); if (error) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } } @@ -1041,8 +1132,8 @@ xfs_dir2_leaf_lookup_int( */ ASSERT(cidb == -1); if (dbp) - xfs_da_brelse(tp, dbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, dbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOENT); } @@ -1054,15 +1145,15 @@ xfs_dir2_leaf_removename( xfs_da_args_t *args) /* operation arguments */ { __be16 *bestsp; /* leaf block best freespace */ - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t db; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data entry structure */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_db_t i; /* temporary data block # */ int index; /* index into leaf entries */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ @@ -1083,8 +1174,8 @@ xfs_dir2_leaf_removename( dp = args->dp; tp = args->trans; mp = dp->i_mount; - leaf = lbp->data; - data = dbp->data; + leaf = lbp->b_addr; + hdr = dbp->b_addr; xfs_dir2_data_check(dp, dbp); /* * Point to the leaf entry, use that to point to the data entry. @@ -1092,9 +1183,9 @@ xfs_dir2_leaf_removename( lep = &leaf->ents[index]; db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); dep = (xfs_dir2_data_entry_t *) - ((char *)data + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); needscan = needlog = 0; - oldbest = be16_to_cpu(data->hdr.bestfree[0].length); + oldbest = be16_to_cpu(hdr->bestfree[0].length); ltp = xfs_dir2_leaf_tail_p(mp, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) == oldbest); @@ -1102,7 +1193,7 @@ xfs_dir2_leaf_removename( * Mark the former data entry unused. */ xfs_dir2_data_make_free(tp, dbp, - (xfs_dir2_data_aoff_t)((char *)dep - (char *)data), + (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); /* * We just mark the leaf entry stale by putting a null in it. @@ -1116,23 +1207,23 @@ xfs_dir2_leaf_removename( * log the data block header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ - if (be16_to_cpu(data->hdr.bestfree[0].length) != oldbest) { - bestsp[db] = data->hdr.bestfree[0].length; + if (be16_to_cpu(hdr->bestfree[0].length) != oldbest) { + bestsp[db] = hdr->bestfree[0].length; xfs_dir2_leaf_log_bests(tp, lbp, db, db); } xfs_dir2_data_check(dp, dbp); /* * If the data block is now empty then get rid of the data block. */ - if (be16_to_cpu(data->hdr.bestfree[0].length) == - mp->m_dirblksize - (uint)sizeof(data->hdr)) { + if (be16_to_cpu(hdr->bestfree[0].length) == + mp->m_dirblksize - (uint)sizeof(*hdr)) { ASSERT(db != mp->m_dirdatablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1141,12 +1232,9 @@ xfs_dir2_leaf_removename( * Just go on, returning success, leaving the * empty block in place. */ - if (error == ENOSPC && args->total == 0) { - xfs_da_buf_done(dbp); + if (error == ENOSPC && args->total == 0) error = 0; - } xfs_dir2_leaf_check(dp, lbp); - xfs_da_buf_done(lbp); return error; } dbp = NULL; @@ -1159,7 +1247,7 @@ xfs_dir2_leaf_removename( * Look for the last active entry (i). */ for (i = db - 1; i > 0; i--) { - if (be16_to_cpu(bestsp[i]) != NULLDATAOFF) + if (bestsp[i] != cpu_to_be16(NULLDATAOFF)) break; } /* @@ -1177,10 +1265,9 @@ xfs_dir2_leaf_removename( /* * If the data block was not the first one, drop it. */ - else if (db != mp->m_dirdatablk && dbp != NULL) { - xfs_da_buf_done(dbp); + else if (db != mp->m_dirdatablk) dbp = NULL; - } + xfs_dir2_leaf_check(dp, lbp); /* * See if we can convert to block form. @@ -1195,12 +1282,12 @@ int /* error */ xfs_dir2_leaf_replace( xfs_da_args_t *args) /* operation arguments */ { - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* index of leaf entry */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ @@ -1214,7 +1301,7 @@ xfs_dir2_leaf_replace( return error; } dp = args->dp; - leaf = lbp->data; + leaf = lbp->b_addr; /* * Point to the leaf entry, get data address from it. */ @@ -1223,7 +1310,7 @@ xfs_dir2_leaf_replace( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *) - ((char *)dbp->data + + ((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); ASSERT(args->inumber != be64_to_cpu(dep->inumber)); /* @@ -1232,9 +1319,8 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); tp = args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); - xfs_da_buf_done(dbp); xfs_dir2_leaf_check(dp, lbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return 0; } @@ -1246,7 +1332,7 @@ xfs_dir2_leaf_replace( int /* index value */ xfs_dir2_leaf_search_hash( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp) /* leaf buffer */ + struct xfs_buf *lbp) /* leaf buffer */ { xfs_dahash_t hash=0; /* hash from this entry */ xfs_dahash_t hashwant; /* hash value looking for */ @@ -1256,7 +1342,7 @@ xfs_dir2_leaf_search_hash( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ int mid=0; /* current leaf index */ - leaf = lbp->data; + leaf = lbp->b_addr; #ifndef __KERNEL__ if (!leaf->hdr.count) return 0; @@ -1299,14 +1385,11 @@ xfs_dir2_leaf_search_hash( int /* error */ xfs_dir2_leaf_trim_data( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp, /* leaf buffer */ + struct xfs_buf *lbp, /* leaf buffer */ xfs_dir2_db_t db) /* data block number */ { __be16 *bestsp; /* leaf bests table */ -#ifdef DEBUG - xfs_dir2_data_t *data; /* data block structure */ -#endif - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return value */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -1320,30 +1403,30 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - if ((error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp, - XFS_DATA_FORK))) { + error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + if (error) return error; - } -#ifdef DEBUG - data = dbp->data; - ASSERT(be32_to_cpu(data->hdr.magic) == XFS_DIR2_DATA_MAGIC); -#endif - /* this seems to be an error - * data is only valid if DEBUG is defined? - * RMC 09/08/1999 - */ - leaf = lbp->data; + leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); - ASSERT(be16_to_cpu(data->hdr.bestfree[0].length) == - mp->m_dirblksize - (uint)sizeof(data->hdr)); + +#ifdef DEBUG +{ + struct xfs_dir2_data_hdr *hdr = dbp->b_addr; + + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(be16_to_cpu(hdr->bestfree[0].length) == + mp->m_dirblksize - (uint)sizeof(*hdr)); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); +} +#endif + /* * Get rid of the data block. */ if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { ASSERT(error != ENOSPC); - xfs_da_brelse(tp, dbp); + xfs_trans_brelse(tp, dbp); return error; } /* @@ -1357,6 +1440,20 @@ xfs_dir2_leaf_trim_data( return 0; } +static inline size_t +xfs_dir2_leaf_size( + struct xfs_dir2_leaf_hdr *hdr, + int counts) +{ + int entries; + + entries = be16_to_cpu(hdr->count) - be16_to_cpu(hdr->stale); + return sizeof(xfs_dir2_leaf_hdr_t) + + entries * sizeof(xfs_dir2_leaf_entry_t) + + counts * sizeof(xfs_dir2_data_off_t) + + sizeof(xfs_dir2_leaf_tail_t); +} + /* * Convert node form directory to leaf form directory. * The root of the node form dir needs to already be a LEAFN block. @@ -1369,10 +1466,10 @@ xfs_dir2_node_to_leaf( xfs_da_args_t *args; /* operation arguments */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ - xfs_dabuf_t *fbp; /* buffer for freespace block */ + struct xfs_buf *fbp; /* buffer for freespace block */ xfs_fileoff_t fo; /* freespace file offset */ xfs_dir2_free_t *free; /* freespace structure */ - xfs_dabuf_t *lbp; /* buffer for leaf block */ + struct xfs_buf *lbp; /* buffer for leaf block */ xfs_dir2_leaf_tail_t *ltp; /* tail of leaf structure */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ @@ -1426,30 +1523,28 @@ xfs_dir2_node_to_leaf( if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) return 0; lbp = state->path.blk[0].bp; - leaf = lbp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = lbp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); /* * Read the freespace block. */ - if ((error = xfs_da_read_buf(tp, dp, mp->m_dirfreeblk, -1, &fbp, - XFS_DATA_FORK))) { + error = xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); + if (error) return error; - } - free = fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = fbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); ASSERT(!free->hdr.firstdb); + /* * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if ((uint)sizeof(leaf->hdr) + - (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)) * (uint)sizeof(leaf->ents[0]) + - be32_to_cpu(free->hdr.nvalid) * (uint)sizeof(leaf->bests[0]) + - (uint)sizeof(leaf->tail) > - mp->m_dirblksize) { - xfs_da_brelse(tp, fbp); + if (xfs_dir2_leaf_size(&leaf->hdr, be32_to_cpu(free->hdr.nvalid)) > + mp->m_dirblksize) { + xfs_trans_brelse(tp, fbp); return 0; } + /* * If the leaf has any stale entries in it, compress them out. * The compact routine will log the header. @@ -1458,7 +1553,10 @@ xfs_dir2_node_to_leaf( xfs_dir2_leaf_compact(args, lbp); else xfs_dir2_leaf_log_header(tp, lbp); + + lbp->b_ops = &xfs_dir2_leaf1_buf_ops; leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); + /* * Set up the leaf tail from the freespace block. */ @@ -1468,7 +1566,7 @@ xfs_dir2_node_to_leaf( * Set up the leaf bests table. */ memcpy(xfs_dir2_leaf_bests_p(ltp), free->bests, - be32_to_cpu(ltp->bestcount) * sizeof(leaf->bests[0])); + be32_to_cpu(ltp->bestcount) * sizeof(xfs_dir2_data_off_t)); xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir2_leaf_log_tail(tp, lbp); xfs_dir2_leaf_check(dp, lbp); diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index e4e20d6..649f677 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -21,40 +21,108 @@ /* * Function declarations. */ -static void xfs_dir2_free_log_header(xfs_trans_t *tp, xfs_dabuf_t *bp); -static int xfs_dir2_leafn_add(xfs_dabuf_t *bp, xfs_da_args_t *args, int index); +static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, + int index); #ifdef DEBUG -static void xfs_dir2_leafn_check(xfs_inode_t *dp, xfs_dabuf_t *bp); +static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp); #else #define xfs_dir2_leafn_check(dp, bp) #endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, xfs_dabuf_t *bp_s, - int start_s, xfs_dabuf_t *bp_d, int start_d, - int count); +static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *bp_s, + int start_s, struct xfs_buf *bp_d, + int start_d, int count); static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); -static int xfs_dir2_leafn_remove(xfs_da_args_t *args, xfs_dabuf_t *bp, +static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp, int index, xfs_da_state_blk_t *dblk, int *rval); static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); +static void +xfs_dir2_free_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_free_hdr *hdr = bp->b_addr; + int block_ok = 0; + + block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC); + if (!block_ok) { + XFS_CORRUPTION_ERROR("xfs_dir2_free_verify magic", + XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_free_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_free_verify(bp); +} + +static void +xfs_dir2_free_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_free_verify(bp); +} + +static const struct xfs_buf_ops xfs_dir2_free_buf_ops = { + .verify_read = xfs_dir2_free_read_verify, + .verify_write = xfs_dir2_free_write_verify, +}; + + +static int +__xfs_dir2_free_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_free_buf_ops); +} + +int +xfs_dir2_free_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + struct xfs_buf **bpp) +{ + return __xfs_dir2_free_read(tp, dp, fbno, -1, bpp); +} + +static int +xfs_dir2_free_try_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + struct xfs_buf **bpp) +{ + return __xfs_dir2_free_read(tp, dp, fbno, -2, bpp); +} + /* * Log entries from a freespace block. */ STATIC void xfs_dir2_free_log_bests( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* freespace buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ { xfs_dir2_free_t *free; /* freespace structure */ - free = bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); - xfs_da_log_buf(tp, bp, + free = bp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&free->bests[first] - (char *)free), (uint)((char *)&free->bests[last] - (char *)free + sizeof(free->bests[0]) - 1)); @@ -65,14 +133,14 @@ xfs_dir2_free_log_bests( */ static void xfs_dir2_free_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* freespace buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_free_t *free; /* freespace structure */ - free = bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), + free = bp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), (uint)(sizeof(xfs_dir2_free_hdr_t) - 1)); } @@ -84,11 +152,11 @@ xfs_dir2_free_log_header( int /* error */ xfs_dir2_leaf_to_node( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp) /* leaf buffer */ + struct xfs_buf *lbp) /* leaf buffer */ { xfs_inode_t *dp; /* incore directory inode */ int error; /* error return value */ - xfs_dabuf_t *fbp; /* freespace buffer */ + struct xfs_buf *fbp; /* freespace buffer */ xfs_dir2_db_t fdb; /* freespace block number */ xfs_dir2_free_t *free; /* freespace structure */ __be16 *from; /* pointer to freespace entry */ @@ -116,13 +184,14 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - if ((error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fbp, - XFS_DATA_FORK))) { + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fbp, + XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fbp != NULL); - free = fbp->data; - leaf = lbp->data; + fbp->b_ops = &xfs_dir2_free_buf_ops; + + free = fbp->b_addr; + leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); /* * Initialize the freespace block header. @@ -142,14 +211,16 @@ xfs_dir2_leaf_to_node( *to = cpu_to_be16(off); } free->hdr.nused = cpu_to_be32(n); + + lbp->b_ops = &xfs_dir2_leafn_buf_ops; leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + /* * Log everything. */ xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_free_log_header(tp, fbp); xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1); - xfs_da_buf_done(fbp); xfs_dir2_leafn_check(dp, lbp); return 0; } @@ -160,7 +231,7 @@ xfs_dir2_leaf_to_node( */ static int /* error */ xfs_dir2_leafn_add( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int index) /* insertion pt for new entry */ { @@ -180,7 +251,7 @@ xfs_dir2_leafn_add( dp = args->dp; mp = dp->i_mount; tp = args->trans; - leaf = bp->data; + leaf = bp->b_addr; /* * Quick check just to make sure we are not going to index @@ -224,89 +295,13 @@ xfs_dir2_leafn_add( lfloglow = be16_to_cpu(leaf->hdr.count); lfloghigh = -1; } - /* - * No stale entries, just insert a space for the new entry. - */ - if (!leaf->hdr.stale) { - lep = &leaf->ents[index]; - if (index < be16_to_cpu(leaf->hdr.count)) - memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * sizeof(*lep)); - lfloglow = index; - lfloghigh = be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); - } - /* - * There are stale entries. We'll use one for the new entry. - */ - else { - /* - * If we didn't do a compact then we need to figure out - * which stale entry will be used. - */ - if (compact == 0) { - /* - * Find first stale entry before our insertion point. - */ - for (lowstale = index - 1; - lowstale >= 0 && - be32_to_cpu(leaf->ents[lowstale].address) != - XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find next stale entry after insertion point. - * Stop looking if the answer would be worse than - * lowstale already found. - */ - for (highstale = index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) != - XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || - index - lowstale - 1 >= highstale - index); - highstale++) - continue; - } - /* - * Using the low stale entry. - * Shift entries up toward the stale slot. - */ - if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || - index - lowstale - 1 < highstale - index)) { - ASSERT(be32_to_cpu(leaf->ents[lowstale].address) == - XFS_DIR2_NULL_DATAPTR); - ASSERT(index - lowstale - 1 >= 0); - if (index - lowstale - 1 > 0) - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], - (index - lowstale - 1) * sizeof(*lep)); - lep = &leaf->ents[index - 1]; - lfloglow = MIN(lowstale, lfloglow); - lfloghigh = MAX(index - 1, lfloghigh); - } - /* - * Using the high stale entry. - * Shift entries down toward the stale slot. - */ - else { - ASSERT(be32_to_cpu(leaf->ents[highstale].address) == - XFS_DIR2_NULL_DATAPTR); - ASSERT(highstale - index >= 0); - if (highstale - index > 0) - memmove(&leaf->ents[index + 1], - &leaf->ents[index], - (highstale - index) * sizeof(*lep)); - lep = &leaf->ents[index]; - lfloglow = MIN(index, lfloglow); - lfloghigh = MAX(highstale, lfloghigh); - } - be16_add_cpu(&leaf->hdr.stale, -1); - } + /* * Insert the new entry, log everything. */ + lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + highstale, &lfloglow, &lfloghigh); + lep->hashval = cpu_to_be32(args->hashval); lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); @@ -322,24 +317,24 @@ xfs_dir2_leafn_add( */ void xfs_dir2_leafn_check( - xfs_inode_t *dp, /* incore directory inode */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_inode *dp, + struct xfs_buf *bp) { int i; /* leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ int stale; /* count of stale leaves */ - leaf = bp->data; + leaf = bp->b_addr; mp = dp->i_mount; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { if (i + 1 < be16_to_cpu(leaf->hdr.count)) { ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= be32_to_cpu(leaf->ents[i + 1].hashval)); } - if (be32_to_cpu(leaf->ents[i].address) == XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); @@ -352,13 +347,13 @@ xfs_dir2_leafn_check( */ xfs_dahash_t /* hash value */ xfs_dir2_leafn_lasthash( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { xfs_dir2_leaf_t *leaf; /* leaf structure */ - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (count) *count = be16_to_cpu(leaf->hdr.count); if (!leaf->hdr.count) @@ -372,12 +367,12 @@ xfs_dir2_leafn_lasthash( */ STATIC int xfs_dir2_leafn_lookup_for_addname( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ { - xfs_dabuf_t *curbp = NULL; /* current data/free buffer */ + struct xfs_buf *curbp = NULL; /* current data/free buffer */ xfs_dir2_db_t curdb = -1; /* current data block number */ xfs_dir2_db_t curfdb = -1; /* current free block number */ xfs_inode_t *dp; /* incore directory inode */ @@ -396,8 +391,8 @@ xfs_dir2_leafn_lookup_for_addname( dp = args->dp; tp = args->trans; mp = dp->i_mount; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); #ifdef __KERNEL__ ASSERT(be16_to_cpu(leaf->hdr.count) > 0); #endif @@ -413,8 +408,8 @@ xfs_dir2_leafn_lookup_for_addname( /* If so, it's a free block buffer, get the block number. */ curbp = state->extrablk.bp; curfdb = state->extrablk.blkno; - free = curbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = curbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); } length = xfs_dir2_data_entsize(args->namelen); /* @@ -455,20 +450,18 @@ xfs_dir2_leafn_lookup_for_addname( * If we had one before, drop it. */ if (curbp) - xfs_da_brelse(tp, curbp); - /* - * Read the free block. - */ - error = xfs_da_read_buf(tp, dp, + xfs_trans_brelse(tp, curbp); + + error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, newfdb), - -1, &curbp, XFS_DATA_FORK); + &curbp); if (error) return error; - free = curbp->data; + free = curbp->b_addr; ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); ASSERT((be32_to_cpu(free->hdr.firstdb) % - XFS_DIR2_MAX_FREE_BESTS(mp)) == 0); + xfs_dir2_free_max_bests(mp)) == 0); ASSERT(be32_to_cpu(free->hdr.firstdb) <= curdb); ASSERT(curdb < be32_to_cpu(free->hdr.firstdb) + be32_to_cpu(free->hdr.nvalid)); @@ -480,11 +473,12 @@ xfs_dir2_leafn_lookup_for_addname( /* * If it has room, return it. */ - if (unlikely(be16_to_cpu(free->bests[fi]) == NULLDATAOFF)) { + if (unlikely(free->bests[fi] == + cpu_to_be16(NULLDATAOFF))) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); if (curfdb != newfdb) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); return XFS_ERROR(EFSCORRUPTED); } curfdb = newfdb; @@ -519,12 +513,12 @@ out: */ STATIC int xfs_dir2_leafn_lookup_for_entry( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ { - xfs_dabuf_t *curbp = NULL; /* current data/free buffer */ + struct xfs_buf *curbp = NULL; /* current data/free buffer */ xfs_dir2_db_t curdb = -1; /* current data block number */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ @@ -540,8 +534,8 @@ xfs_dir2_leafn_lookup_for_entry( dp = args->dp; tp = args->trans; mp = dp->i_mount; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); #ifdef __KERNEL__ ASSERT(be16_to_cpu(leaf->hdr.count) > 0); #endif @@ -585,7 +579,7 @@ xfs_dir2_leafn_lookup_for_entry( */ if (curbp && (args->cmpresult == XFS_CMP_DIFFERENT || curdb != state->extrablk.blkno)) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); /* * If needing the block that is saved with a CI match, * use it otherwise read in the new data block. @@ -595,9 +589,9 @@ xfs_dir2_leafn_lookup_for_entry( ASSERT(state->extravalid); curbp = state->extrablk.bp; } else { - error = xfs_da_read_buf(tp, dp, + error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), - -1, &curbp, XFS_DATA_FORK); + -1, &curbp); if (error) return error; } @@ -607,7 +601,7 @@ xfs_dir2_leafn_lookup_for_entry( /* * Point to the data entry. */ - dep = (xfs_dir2_data_entry_t *)((char *)curbp->data + + dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* * Compare the entry and if it's an exact match, return @@ -619,7 +613,7 @@ xfs_dir2_leafn_lookup_for_entry( /* If there is a CI match block, drop it */ if (args->cmpresult != XFS_CMP_DIFFERENT && curdb != state->extrablk.blkno) - xfs_da_brelse(tp, state->extrablk.bp); + xfs_trans_brelse(tp, state->extrablk.bp); args->cmpresult = cmp; args->inumber = be64_to_cpu(dep->inumber); *indexp = index; @@ -627,8 +621,9 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.bp = curbp; state->extrablk.blkno = curdb; state->extrablk.index = (int)((char *)dep - - (char *)curbp->data); + (char *)curbp->b_addr); state->extrablk.magic = XFS_DIR2_DATA_MAGIC; + curbp->b_ops = &xfs_dir2_data_buf_ops; if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -643,10 +638,11 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index = -1; state->extrablk.blkno = curdb; state->extrablk.magic = XFS_DIR2_DATA_MAGIC; + curbp->b_ops = &xfs_dir2_data_buf_ops; } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp != curbp) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); } } else { state->extravalid = 0; @@ -662,7 +658,7 @@ xfs_dir2_leafn_lookup_for_entry( */ int xfs_dir2_leafn_lookup_int( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ @@ -680,9 +676,9 @@ xfs_dir2_leafn_lookup_int( static void xfs_dir2_leafn_moveents( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp_s, /* source leaf buffer */ + struct xfs_buf *bp_s, /* source leaf buffer */ int start_s, /* source leaf index */ - xfs_dabuf_t *bp_d, /* destination leaf buffer */ + struct xfs_buf *bp_d, /* destination leaf buffer */ int start_d, /* destination leaf index */ int count) /* count of leaves to copy */ { @@ -700,8 +696,8 @@ xfs_dir2_leafn_moveents( return; } tp = args->trans; - leaf_s = bp_s->data; - leaf_d = bp_d->data; + leaf_s = bp_s->b_addr; + leaf_d = bp_d->b_addr; /* * If the destination index is not the end of the current * destination leaf entries, open up a hole in the destination @@ -722,7 +718,8 @@ xfs_dir2_leafn_moveents( int i; /* temp leaf index */ for (i = start_s, stale = 0; i < start_s + count; i++) { - if (be32_to_cpu(leaf_s->ents[i].address) == XFS_DIR2_NULL_DATAPTR) + if (leaf_s->ents[i].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } } else @@ -761,16 +758,16 @@ xfs_dir2_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( - xfs_dabuf_t *leaf1_bp, /* leaf1 buffer */ - xfs_dabuf_t *leaf2_bp) /* leaf2 buffer */ + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ - leaf1 = leaf1_bp->data; - leaf2 = leaf2_bp->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf1 = leaf1_bp->b_addr; + leaf2 = leaf2_bp->b_addr; + ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (be16_to_cpu(leaf1->hdr.count) > 0 && be16_to_cpu(leaf2->hdr.count) > 0 && (be32_to_cpu(leaf2->ents[0].hashval) < be32_to_cpu(leaf1->ents[0].hashval) || @@ -816,8 +813,8 @@ xfs_dir2_leafn_rebalance( blk1 = blk2; blk2 = tmp; } - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; + leaf1 = blk1->bp->b_addr; + leaf2 = blk2->bp->b_addr; oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); #ifdef DEBUG oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); @@ -879,11 +876,81 @@ xfs_dir2_leafn_rebalance( if(blk2->index < 0) { state->inleaf = 1; blk2->index = 0; - cmn_err(CE_ALERT, - "xfs_dir2_leafn_rebalance: picked the wrong leaf? reverting original leaf: " - "blk1->index %d\n", - blk1->index); + xfs_alert(args->dp->i_mount, + "%s: picked the wrong leaf? reverting original leaf: blk1->index %d\n", + __func__, blk1->index); + } +} + +static int +xfs_dir2_data_block_free( + xfs_da_args_t *args, + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_free *free, + xfs_dir2_db_t fdb, + int findex, + struct xfs_buf *fbp, + int longest) +{ + struct xfs_trans *tp = args->trans; + int logfree = 0; + + if (!hdr) { + /* One less used entry in the free table. */ + be32_add_cpu(&free->hdr.nused, -1); + xfs_dir2_free_log_header(tp, fbp); + + /* + * If this was the last entry in the table, we can trim the + * table size back. There might be other entries at the end + * referring to non-existent data blocks, get those too. + */ + if (findex == be32_to_cpu(free->hdr.nvalid) - 1) { + int i; /* free entry index */ + + for (i = findex - 1; i >= 0; i--) { + if (free->bests[i] != cpu_to_be16(NULLDATAOFF)) + break; + } + free->hdr.nvalid = cpu_to_be32(i + 1); + logfree = 0; + } else { + /* Not the last entry, just punch it out. */ + free->bests[findex] = cpu_to_be16(NULLDATAOFF); + logfree = 1; + } + /* + * If there are no useful entries left in the block, + * get rid of the block if we can. + */ + if (!free->hdr.nused) { + int error; + + error = xfs_dir2_shrink_inode(args, fdb, fbp); + if (error == 0) { + fbp = NULL; + logfree = 0; + } else if (error != ENOSPC || args->total != 0) + return error; + /* + * It's possible to get ENOSPC if there is no + * space reservation. In this case some one + * else will eventually get rid of this block. + */ + } + } else { + /* + * Data block is not empty, just set the free entry to the new + * value. + */ + free->bests[findex] = cpu_to_be16(longest); + logfree = 1; } + + /* Log the free entry that changed, unless we got rid of it. */ + if (logfree) + xfs_dir2_free_log_bests(tp, fbp, findex, findex); + return 0; } /* @@ -894,14 +961,14 @@ xfs_dir2_leafn_rebalance( static int /* error */ xfs_dir2_leafn_remove( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int index, /* leaf entry index */ xfs_da_state_blk_t *dblk, /* data block */ int *rval) /* resulting block needs join */ { - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t db; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -918,8 +985,8 @@ xfs_dir2_leafn_remove( dp = args->dp; tp = args->trans; mp = dp->i_mount; - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); /* * Point to the entry we're removing. */ @@ -944,9 +1011,9 @@ xfs_dir2_leafn_remove( * in the data block in case it changes. */ dbp = dblk->bp; - data = dbp->data; - dep = (xfs_dir2_data_entry_t *)((char *)data + off); - longest = be16_to_cpu(data->hdr.bestfree[0].length); + hdr = dbp->b_addr; + dep = (xfs_dir2_data_entry_t *)((char *)hdr + off); + longest = be16_to_cpu(hdr->bestfree[0].length); needlog = needscan = 0; xfs_dir2_data_make_free(tp, dbp, off, xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); @@ -955,7 +1022,7 @@ xfs_dir2_leafn_remove( * Log the data block header if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); xfs_dir2_data_check(dp, dbp); @@ -963,126 +1030,63 @@ xfs_dir2_leafn_remove( * If the longest data block freespace changes, need to update * the corresponding freeblock entry. */ - if (longest < be16_to_cpu(data->hdr.bestfree[0].length)) { + if (longest < be16_to_cpu(hdr->bestfree[0].length)) { int error; /* error return value */ - xfs_dabuf_t *fbp; /* freeblock buffer */ + struct xfs_buf *fbp; /* freeblock buffer */ xfs_dir2_db_t fdb; /* freeblock block number */ int findex; /* index in freeblock entries */ xfs_dir2_free_t *free; /* freeblock structure */ - int logfree; /* need to log free entry */ /* * Convert the data block number to a free block, * read in the free block. */ fdb = xfs_dir2_db_to_fdb(mp, db); - if ((error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), - -1, &fbp, XFS_DATA_FORK))) { + error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), + &fbp); + if (error) return error; - } - free = fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = fbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); ASSERT(be32_to_cpu(free->hdr.firstdb) == - XFS_DIR2_MAX_FREE_BESTS(mp) * + xfs_dir2_free_max_bests(mp) * (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); /* * Calculate which entry we need to fix. */ findex = xfs_dir2_db_to_fdindex(mp, db); - longest = be16_to_cpu(data->hdr.bestfree[0].length); + longest = be16_to_cpu(hdr->bestfree[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest == mp->m_dirblksize - (uint)sizeof(data->hdr)) { + if (longest == mp->m_dirblksize - (uint)sizeof(*hdr)) { /* * Try to punch out the data block. */ error = xfs_dir2_shrink_inode(args, db, dbp); if (error == 0) { dblk->bp = NULL; - data = NULL; + hdr = NULL; } /* * We can get ENOSPC if there's no space reservation. * In this case just drop the buffer and some one else * will eventually get rid of the empty block. */ - else if (error == ENOSPC && args->total == 0) - xfs_da_buf_done(dbp); - else + else if (!(error == ENOSPC && args->total == 0)) return error; } /* * If we got rid of the data block, we can eliminate that entry * in the free block. */ - if (data == NULL) { - /* - * One less used entry in the free table. - */ - be32_add_cpu(&free->hdr.nused, -1); - xfs_dir2_free_log_header(tp, fbp); - /* - * If this was the last entry in the table, we can - * trim the table size back. There might be other - * entries at the end referring to non-existent - * data blocks, get those too. - */ - if (findex == be32_to_cpu(free->hdr.nvalid) - 1) { - int i; /* free entry index */ - - for (i = findex - 1; - i >= 0 && be16_to_cpu(free->bests[i]) == NULLDATAOFF; - i--) - continue; - free->hdr.nvalid = cpu_to_be32(i + 1); - logfree = 0; - } - /* - * Not the last entry, just punch it out. - */ - else { - free->bests[findex] = cpu_to_be16(NULLDATAOFF); - logfree = 1; - } - /* - * If there are no useful entries left in the block, - * get rid of the block if we can. - */ - if (!free->hdr.nused) { - error = xfs_dir2_shrink_inode(args, fdb, fbp); - if (error == 0) { - fbp = NULL; - logfree = 0; - } else if (error != ENOSPC || args->total != 0) - return error; - /* - * It's possible to get ENOSPC if there is no - * space reservation. In this case some one - * else will eventually get rid of this block. - */ - } - } - /* - * Data block is not empty, just set the free entry to - * the new value. - */ - else { - free->bests[findex] = cpu_to_be16(longest); - logfree = 1; - } - /* - * Log the free entry that changed, unless we got rid of it. - */ - if (logfree) - xfs_dir2_free_log_bests(tp, fbp, findex, findex); - /* - * Drop the buffer if we still have it. - */ - if (fbp) - xfs_da_buf_done(fbp); + error = xfs_dir2_data_block_free(args, hdr, free, + fdb, findex, fbp, longest); + if (error) + return error; } + xfs_dir2_leafn_check(dp, bp); /* * Return indication of whether this leaf block is empty enough @@ -1173,7 +1177,7 @@ xfs_dir2_leafn_toosmall( { xfs_da_state_blk_t *blk; /* leaf block */ xfs_dablk_t blkno; /* leaf block number */ - xfs_dabuf_t *bp; /* leaf buffer */ + struct xfs_buf *bp; /* leaf buffer */ int bytes; /* bytes in use */ int count; /* leaf live entry count */ int error; /* error return value */ @@ -1189,8 +1193,8 @@ xfs_dir2_leafn_toosmall( * to coalesce with a sibling. */ blk = &state->path.blk[state->path.active - 1]; - info = blk->bp->data; - ASSERT(be16_to_cpu(info->magic) == XFS_DIR2_LEAFN_MAGIC); + info = blk->bp->b_addr; + ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); leaf = (xfs_dir2_leaf_t *)info; count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes = (uint)sizeof(leaf->hdr) + count * (uint)sizeof(leaf->ents[0]); @@ -1236,20 +1240,19 @@ xfs_dir2_leafn_toosmall( /* * Read the sibling leaf block. */ - if ((error = - xfs_da_read_buf(state->args->trans, state->args->dp, blkno, - -1, &bp, XFS_DATA_FORK))) { + error = xfs_dir2_leafn_read(state->args->trans, state->args->dp, + blkno, -1, &bp); + if (error) return error; - } - ASSERT(bp != NULL); + /* * Count bytes in the two blocks combined. */ leaf = (xfs_dir2_leaf_t *)info; count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes = state->blocksize - (state->blocksize >> 2); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + leaf = bp->b_addr; + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes -= count * (uint)sizeof(leaf->ents[0]); /* @@ -1257,7 +1260,7 @@ xfs_dir2_leafn_toosmall( */ if (bytes >= 0) break; - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); } /* * Didn't like either block, give up. @@ -1266,11 +1269,7 @@ xfs_dir2_leafn_toosmall( *action = 0; return 0; } - /* - * Done with the sibling leaf block here, drop the dabuf - * so path_shift can get it. - */ - xfs_da_buf_done(bp); + /* * Make altpath point to the block we want to keep (the lower * numbered block) and path point to the block we want to drop. @@ -1306,10 +1305,10 @@ xfs_dir2_leafn_unbalance( args = state->args; ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); - drop_leaf = drop_blk->bp->data; - save_leaf = save_blk->bp->data; - ASSERT(be16_to_cpu(drop_leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); - ASSERT(be16_to_cpu(save_leaf->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); + drop_leaf = drop_blk->bp->b_addr; + save_leaf = save_blk->bp->b_addr; + ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); /* * If there are any stale leaf entries, take this opportunity * to purge them. @@ -1413,15 +1412,15 @@ xfs_dir2_node_addname_int( xfs_da_args_t *args, /* operation arguments */ xfs_da_state_blk_t *fblk) /* optional freespace block */ { - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t dbno; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* data unused entry pointer */ int error; /* error return value */ xfs_dir2_db_t fbno; /* freespace block number */ - xfs_dabuf_t *fbp; /* freespace buffer */ + struct xfs_buf *fbp; /* freespace buffer */ int findex; /* freespace entry index */ xfs_dir2_free_t *free=NULL; /* freespace block structure */ xfs_dir2_db_t ifbno; /* initial freespace block no */ @@ -1449,8 +1448,8 @@ xfs_dir2_node_addname_int( * Remember initial freespace block number. */ ifbno = fblk->blkno; - free = fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = fbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex = fblk->index; /* * This means the free entry showed that the data block had @@ -1525,16 +1524,15 @@ xfs_dir2_node_addname_int( * This should be really rare, so there's no reason * to avoid it. */ - if ((error = xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), -2, &fbp, - XFS_DATA_FORK))) { + error = xfs_dir2_free_try_read(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + &fbp); + if (error) return error; - } - if (unlikely(fbp == NULL)) { + if (!fbp) continue; - } - free = fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = fbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex = 0; } /* @@ -1551,7 +1549,7 @@ xfs_dir2_node_addname_int( /* * Drop the block. */ - xfs_da_brelse(tp, fbp); + xfs_trans_brelse(tp, fbp); fbp = NULL; if (fblk && fblk->bp) fblk->bp = NULL; @@ -1566,36 +1564,23 @@ xfs_dir2_node_addname_int( /* * Not allowed to allocate, return failure. */ - if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || - args->total == 0) { - /* - * Drop the freespace buffer unless it came from our - * caller. - */ - if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) - xfs_da_buf_done(fbp); + if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) return XFS_ERROR(ENOSPC); - } + /* * Allocate and initialize the new data block. */ if (unlikely((error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &dbno)) || - (error = xfs_dir2_data_init(args, dbno, &dbp)))) { - /* - * Drop the freespace buffer unless it came from our - * caller. - */ - if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) - xfs_da_buf_done(fbp); + (error = xfs_dir2_data_init(args, dbno, &dbp)))) return error; - } + /* * If (somehow) we have a freespace block, get rid of it. */ if (fbp) - xfs_da_brelse(tp, fbp); + xfs_trans_brelse(tp, fbp); if (fblk && fblk->bp) fblk->bp = NULL; @@ -1604,12 +1589,12 @@ xfs_dir2_node_addname_int( * that was just allocated. */ fbno = xfs_dir2_db_to_fdb(mp, dbno); - if (unlikely(error = xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), -2, &fbp, - XFS_DATA_FORK))) { - xfs_da_buf_done(dbp); + error = xfs_dir2_free_try_read(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + &fbp); + if (error) return error; - } + /* * If there wasn't a freespace block, the read will * return a NULL fbp. Allocate and initialize a new one. @@ -1621,26 +1606,22 @@ xfs_dir2_node_addname_int( } if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) { - cmn_err(CE_ALERT, - "xfs_dir2_node_addname_int: dir ino " - "%llu needed freesp block %lld for\n" - " data block %lld, got %lld\n" - " ifbno %llu lastfbno %d\n", - (unsigned long long)dp->i_ino, + xfs_alert(mp, + "%s: dir ino %llu needed freesp block %lld for\n" + " data block %lld, got %lld ifbno %llu lastfbno %d", + __func__, (unsigned long long)dp->i_ino, (long long)xfs_dir2_db_to_fdb(mp, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { - cmn_err(CE_ALERT, - " fblk 0x%p blkno %llu " - "index %d magic 0x%x\n", + xfs_alert(mp, + " fblk 0x%p blkno %llu index %d magic 0x%x", fblk, (unsigned long long)fblk->blkno, fblk->index, fblk->magic); } else { - cmn_err(CE_ALERT, - " ... fblk is NULL\n"); + xfs_alert(mp, " ... fblk is NULL"); } XFS_ERROR_REPORT("xfs_dir2_node_addname_int", XFS_ERRLEVEL_LOW, mp); @@ -1650,27 +1631,27 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - if ((error = xfs_da_get_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - -1, &fbp, XFS_DATA_FORK))) { + error = xfs_da_get_buf(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + -1, &fbp, XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fbp != NULL); + fbp->b_ops = &xfs_dir2_free_buf_ops; /* * Initialize the new block to be empty, and remember * its first slot as our empty slot. */ - free = fbp->data; + free = fbp->b_addr; free->hdr.magic = cpu_to_be32(XFS_DIR2_FREE_MAGIC); free->hdr.firstdb = cpu_to_be32( (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * - XFS_DIR2_MAX_FREE_BESTS(mp)); + xfs_dir2_free_max_bests(mp)); free->hdr.nvalid = 0; free->hdr.nused = 0; } else { - free = fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = fbp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); } /* @@ -1682,7 +1663,7 @@ xfs_dir2_node_addname_int( * freespace block, extend that table. */ if (findex >= be32_to_cpu(free->hdr.nvalid)) { - ASSERT(findex < XFS_DIR2_MAX_FREE_BESTS(mp)); + ASSERT(findex < xfs_dir2_free_max_bests(mp)); free->hdr.nvalid = cpu_to_be32(findex + 1); /* * Tag new entry so nused will go up. @@ -1693,7 +1674,7 @@ xfs_dir2_node_addname_int( * If this entry was for an empty data block * (this should always be true) then update the header. */ - if (be16_to_cpu(free->bests[findex]) == NULLDATAOFF) { + if (free->bests[findex] == cpu_to_be16(NULLDATAOFF)) { be32_add_cpu(&free->hdr.nused, 1); xfs_dir2_free_log_header(tp, fbp); } @@ -1702,8 +1683,8 @@ xfs_dir2_node_addname_int( * We haven't allocated the data entry yet so this will * change again. */ - data = dbp->data; - free->bests[findex] = data->hdr.bestfree[0].length; + hdr = dbp->b_addr; + free->bests[findex] = hdr->bestfree[0].length; logfree = 1; } /* @@ -1713,36 +1694,31 @@ xfs_dir2_node_addname_int( /* * If just checking, we succeeded. */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) { - if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) - xfs_da_buf_done(fbp); + if (args->op_flags & XFS_DA_OP_JUSTCHECK) return 0; - } + /* * Read the data block in. */ - if (unlikely( - error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno), - -1, &dbp, XFS_DATA_FORK))) { - if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) - xfs_da_buf_done(fbp); + error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + -1, &dbp); + if (error) return error; - } - data = dbp->data; + hdr = dbp->b_addr; logfree = 0; } - ASSERT(be16_to_cpu(data->hdr.bestfree[0].length) >= length); + ASSERT(be16_to_cpu(hdr->bestfree[0].length) >= length); /* * Point to the existing unused space. */ dup = (xfs_dir2_data_unused_t *) - ((char *)data + be16_to_cpu(data->hdr.bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); needscan = needlog = 0; /* * Mark the first part of the unused space, inuse for us. */ xfs_dir2_data_use_free(tp, dbp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)data), length, + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* * Fill in the new entry and log it. @@ -1752,13 +1728,13 @@ xfs_dir2_node_addname_int( dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp = xfs_dir2_data_entry_tag_p(dep); - *tagp = cpu_to_be16((char *)dep - (char *)data); + *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dbp, dep); /* * Rescan the block for bestfree if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Log the data block header if needed. */ @@ -1767,8 +1743,8 @@ xfs_dir2_node_addname_int( /* * If the freespace entry is now wrong, update it. */ - if (be16_to_cpu(free->bests[findex]) != be16_to_cpu(data->hdr.bestfree[0].length)) { - free->bests[findex] = data->hdr.bestfree[0].length; + if (be16_to_cpu(free->bests[findex]) != be16_to_cpu(hdr->bestfree[0].length)) { + free->bests[findex] = hdr->bestfree[0].length; logfree = 1; } /* @@ -1777,16 +1753,10 @@ xfs_dir2_node_addname_int( if (logfree) xfs_dir2_free_log_bests(tp, fbp, findex, findex); /* - * If the caller didn't hand us the freespace block, drop it. - */ - if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) - xfs_da_buf_done(fbp); - /* * Return the data block and offset in args, then drop the data block. */ args->blkno = (xfs_dablk_t)dbno; args->index = be16_to_cpu(*tagp); - xfs_da_buf_done(dbp); return 0; } @@ -1824,22 +1794,23 @@ xfs_dir2_node_lookup( /* If a CI match, dup the actual name and return EEXIST */ xfs_dir2_data_entry_t *dep; - dep = (xfs_dir2_data_entry_t *)((char *)state->extrablk.bp-> - data + state->extrablk.index); + dep = (xfs_dir2_data_entry_t *) + ((char *)state->extrablk.bp->b_addr + + state->extrablk.index); rval = xfs_dir_cilookup_result(args, dep->name, dep->namelen); } /* * Release the btree blocks and leaf block. */ for (i = 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp = NULL; } /* * Release the data block if we have it. */ if (state->extravalid && state->extrablk.bp) { - xfs_da_brelse(args->trans, state->extrablk.bp); + xfs_trans_brelse(args->trans, state->extrablk.bp); state->extrablk.bp = NULL; } xfs_da_state_free(state); @@ -1918,7 +1889,7 @@ xfs_dir2_node_replace( xfs_da_args_t *args) /* operation arguments */ { xfs_da_state_blk_t *blk; /* leaf block */ - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry changed */ int error; /* error return value */ int i; /* btree level */ @@ -1956,16 +1927,16 @@ xfs_dir2_node_replace( */ blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); - leaf = blk->bp->data; + leaf = blk->bp->b_addr; lep = &leaf->ents[blk->index]; ASSERT(state->extravalid); /* * Point to the data entry. */ - data = state->extrablk.bp->data; - ASSERT(be32_to_cpu(data->hdr.magic) == XFS_DIR2_DATA_MAGIC); + hdr = state->extrablk.bp->b_addr; + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) - ((char *)data + + ((char *)hdr + xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); ASSERT(inum != be64_to_cpu(dep->inumber)); /* @@ -1979,14 +1950,14 @@ xfs_dir2_node_replace( * Didn't find it, and we're holding a data block. Drop it. */ else if (state->extravalid) { - xfs_da_brelse(args->trans, state->extrablk.bp); + xfs_trans_brelse(args->trans, state->extrablk.bp); state->extrablk.bp = NULL; } /* * Release all the buffers in the cursor. */ for (i = 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp = NULL; } xfs_da_state_free(state); @@ -2003,7 +1974,7 @@ xfs_dir2_node_trim_free( xfs_fileoff_t fo, /* free block number */ int *rvalp) /* out: did something */ { - xfs_dabuf_t *bp; /* freespace buffer */ + struct xfs_buf *bp; /* freespace buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_free_t *free; /* freespace structure */ @@ -2016,25 +1987,22 @@ xfs_dir2_node_trim_free( /* * Read the freespace block. */ - if (unlikely(error = xfs_da_read_buf(tp, dp, (xfs_dablk_t)fo, -2, &bp, - XFS_DATA_FORK))) { + error = xfs_dir2_free_try_read(tp, dp, fo, &bp); + if (error) return error; - } - /* * There can be holes in freespace. If fo is a hole, there's * nothing to do. */ - if (bp == NULL) { + if (!bp) return 0; - } - free = bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); + free = bp->b_addr; + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); /* * If there are used entries, there's nothing to do. */ if (be32_to_cpu(free->hdr.nused) > 0) { - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); *rvalp = 0; return 0; } @@ -2050,7 +2018,7 @@ xfs_dir2_node_trim_free( * pieces. This is the last block of an extent. */ ASSERT(error != ENOSPC); - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return error; } /* diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h new file mode 100644 index 0000000..7da79f6 --- /dev/null +++ b/libxfs/xfs_dir2_priv.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, 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 + */ +#ifndef __XFS_DIR2_PRIV_H__ +#define __XFS_DIR2_PRIV_H__ + +/* xfs_dir2.c */ +extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); +extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); +extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); +extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, + xfs_dir2_db_t *dbp); +extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, + struct xfs_buf *bp); +extern int xfs_dir_cilookup_result(struct xfs_da_args *args, + const unsigned char *name, int len); + +/* xfs_dir2_block.c */ +extern const struct xfs_buf_ops xfs_dir2_block_buf_ops; + +extern int xfs_dir2_block_addname(struct xfs_da_args *args); +extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, + xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_block_lookup(struct xfs_da_args *args); +extern int xfs_dir2_block_removename(struct xfs_da_args *args); +extern int xfs_dir2_block_replace(struct xfs_da_args *args); +extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, + struct xfs_buf *lbp, struct xfs_buf *dbp); + +/* xfs_dir2_data.c */ +#ifdef DEBUG +#define xfs_dir2_data_check(dp,bp) __xfs_dir2_data_check(dp, bp); +#else +#define xfs_dir2_data_check(dp,bp) +#endif + +extern const struct xfs_buf_ops xfs_dir2_data_buf_ops; + +extern int __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp); +extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp); +extern int xfs_dir2_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mapped_bno); + +extern struct xfs_dir2_data_free * +xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_data_unused *dup, int *loghead); +extern void xfs_dir2_data_freescan(struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr, int *loghead); +extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, + struct xfs_buf **bpp); +extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_entry *dep); +extern void xfs_dir2_data_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *bp, + xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, + int *needlogp, int *needscanp); +extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, + xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); + +/* xfs_dir2_leaf.c */ +extern const struct xfs_buf_ops xfs_dir2_leafn_buf_ops; + +extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); +extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, + struct xfs_buf *dbp); +extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); +extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, + struct xfs_buf *bp); +extern void xfs_dir2_leaf_compact_x1(struct xfs_buf *bp, int *indexp, + int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); +extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, + size_t bufsize, xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, + struct xfs_buf **bpp, int magic); +extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, + int first, int last); +extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); +extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); +extern int xfs_dir2_leaf_replace(struct xfs_da_args *args); +extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, + struct xfs_buf *lbp); +extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, + struct xfs_buf *lbp, xfs_dir2_db_t db); +extern struct xfs_dir2_leaf_entry * +xfs_dir2_leaf_find_entry(struct xfs_dir2_leaf *leaf, int index, int compact, + int lowstale, int highstale, + int *lfloglow, int *lfloghigh); +extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); + +/* xfs_dir2_node.c */ +extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, + struct xfs_buf *lbp); +extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_buf *bp, int *count); +extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp, + struct xfs_da_args *args, int *indexp, + struct xfs_da_state *state); +extern int xfs_dir2_leafn_order(struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp); +extern int xfs_dir2_leafn_split(struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); +extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action); +extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk); +extern int xfs_dir2_node_addname(struct xfs_da_args *args); +extern int xfs_dir2_node_lookup(struct xfs_da_args *args); +extern int xfs_dir2_node_removename(struct xfs_da_args *args); +extern int xfs_dir2_node_replace(struct xfs_da_args *args); +extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t fo, + int *rvalp); +extern int xfs_dir2_free_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t fbno, struct xfs_buf **bpp); + +/* xfs_dir2_sf.c */ +extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); +extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, + struct xfs_dir2_sf_entry *sfep); +extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, + struct xfs_dir2_data_hdr *block, struct xfs_dir2_sf_hdr *sfhp); +extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_buf *bp, + int size, xfs_dir2_sf_hdr_t *sfhp); +extern int xfs_dir2_sf_addname(struct xfs_da_args *args); +extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); +extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, + xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); +extern int xfs_dir2_sf_removename(struct xfs_da_args *args); +extern int xfs_dir2_sf_replace(struct xfs_da_args *args); + +#endif /* __XFS_DIR2_PRIV_H__ */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 6b5e6d4..a96be76 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -41,6 +41,82 @@ static void xfs_dir2_sf_toino8(xfs_da_args_t *args); #endif /* XFS_BIG_INUMS */ /* + * Inode numbers in short-form directories can come in two versions, + * either 4 bytes or 8 bytes wide. These helpers deal with the + * two forms transparently by looking at the headers i8count field. + * + * For 64-bit inode number the most significant byte must be zero. + */ +static xfs_ino_t +xfs_dir2_sf_get_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *from) +{ + if (hdr->i8count) + return get_unaligned_be64(&from->i8.i) & 0x00ffffffffffffffULL; + else + return get_unaligned_be32(&from->i4.i); +} + +static void +xfs_dir2_sf_put_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *to, + xfs_ino_t ino) +{ + ASSERT((ino & 0xff00000000000000ULL) == 0); + + if (hdr->i8count) + put_unaligned_be64(ino, &to->i8.i); + else + put_unaligned_be32(ino, &to->i4.i); +} + +xfs_ino_t +xfs_dir2_sf_get_parent_ino( + struct xfs_dir2_sf_hdr *hdr) +{ + return xfs_dir2_sf_get_ino(hdr, &hdr->parent); +} + +void +xfs_dir2_sf_put_parent_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, &hdr->parent, ino); +} + +/* + * In short-form directory entries the inode numbers are stored at variable + * offset behind the entry name. The inode numbers may only be accessed + * through the helpers below. + */ +static xfs_dir2_inou_t * +xfs_dir2_sfe_inop( + struct xfs_dir2_sf_entry *sfep) +{ + return (xfs_dir2_inou_t *)&sfep->name[sfep->namelen]; +} + +xfs_ino_t +xfs_dir2_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, xfs_dir2_sfe_inop(sfep)); +} + +void +xfs_dir2_sfe_put_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, xfs_dir2_sfe_inop(sfep), ino); +} + +/* * Given a block directory (dp/block), calculate its size as a shortform (sf) * directory and a header for the sf directory, if it will fit it the * space currently present in the inode. If it won't fit, the output @@ -49,7 +125,7 @@ static void xfs_dir2_sf_toino8(xfs_da_args_t *args); int /* size for sf form */ xfs_dir2_block_sfsize( xfs_inode_t *dp, /* incore inode pointer */ - xfs_dir2_block_t *block, /* block directory data */ + xfs_dir2_data_hdr_t *hdr, /* block directory data */ xfs_dir2_sf_hdr_t *sfhp) /* output: header for sf form */ { xfs_dir2_dataptr_t addr; /* data entry address */ @@ -69,7 +145,7 @@ xfs_dir2_block_sfsize( mp = dp->i_mount; count = i8count = namelen = 0; - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -82,7 +158,7 @@ xfs_dir2_block_sfsize( * Calculate the pointer to the entry at hand. */ dep = (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. @@ -119,7 +195,7 @@ xfs_dir2_block_sfsize( */ sfhp->count = count; sfhp->i8count = i8count; - xfs_dir2_sf_put_inumber((xfs_dir2_sf_t *)sfhp, &parent, &sfhp->parent); + xfs_dir2_sf_put_parent_ino(sfhp, parent); return size; } @@ -130,11 +206,11 @@ xfs_dir2_block_sfsize( int /* error */ xfs_dir2_block_to_sf( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_buf *bp, int size, /* shortform directory size */ xfs_dir2_sf_hdr_t *sfhp) /* shortform directory hdr */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_block_tail_t *btp; /* block tail pointer */ xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ @@ -145,8 +221,7 @@ xfs_dir2_block_to_sf( xfs_mount_t *mp; /* filesystem mount point */ char *ptr; /* current data pointer */ xfs_dir2_sf_entry_t *sfep; /* shortform entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_ino_t temp; + xfs_dir2_sf_hdr_t *sfp; /* shortform directory header */ trace_xfs_dir2_block_to_sf(args); @@ -157,13 +232,14 @@ xfs_dir2_block_to_sf( * Make a copy of the block data, so we can shrink the inode * and add local data. */ - block = kmem_alloc(mp->m_dirblksize, KM_SLEEP); - memcpy(block, bp->data, mp->m_dirblksize); + hdr = kmem_alloc(mp->m_dirblksize, KM_SLEEP); + memcpy(hdr, bp->b_addr, mp->m_dirblksize); logflags = XFS_ILOG_CORE; if ((error = xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp))) { ASSERT(error != ENOSPC); goto out; } + /* * The buffer is now unconditionally gone, whether * xfs_dir2_shrink_inode worked or not. @@ -179,14 +255,14 @@ xfs_dir2_block_to_sf( /* * Copy the header into the newly allocate local space. */ - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; memcpy(sfp, sfhp, xfs_dir2_sf_hdr_size(sfhp->i8count)); dp->i_d.di_size = size; /* * Set up to loop over the block's entries. */ - btp = xfs_dir2_block_tail_p(mp, block); - ptr = (char *)block->u; + btp = xfs_dir2_block_tail_p(mp, hdr); + ptr = (char *)(hdr + 1); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); /* @@ -214,7 +290,7 @@ xfs_dir2_block_to_sf( else if (dep->namelen == 2 && dep->name[0] == '.' && dep->name[1] == '.') ASSERT(be64_to_cpu(dep->inumber) == - xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent)); + xfs_dir2_sf_get_parent_ino(sfp)); /* * Normal entry, copy it into shortform. */ @@ -222,11 +298,11 @@ xfs_dir2_block_to_sf( sfep->namelen = dep->namelen; xfs_dir2_sf_put_offset(sfep, (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)block)); + ((char *)dep - (char *)hdr)); memcpy(sfep->name, dep->name, dep->namelen); - temp = be64_to_cpu(dep->inumber); - xfs_dir2_sf_put_inumber(sfp, &temp, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + be64_to_cpu(dep->inumber)); + sfep = xfs_dir2_sf_nextentry(sfp, sfep); } ptr += xfs_dir2_data_entsize(dep->namelen); @@ -235,7 +311,7 @@ xfs_dir2_block_to_sf( xfs_dir2_sf_check(args); out: xfs_trans_log_inode(args->trans, dp, logflags); - kmem_free(block); + kmem_free(hdr); return error; } @@ -258,7 +334,7 @@ xfs_dir2_sf_addname( xfs_dir2_data_aoff_t offset = 0; /* offset for new entry */ int old_isize; /* di_size before adding name */ int pick; /* which algorithm to use */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ trace_xfs_dir2_sf_addname(args); @@ -275,19 +351,19 @@ xfs_dir2_sf_addname( } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Compute entry (and change in) size. */ - add_entsize = xfs_dir2_sf_entsize_byname(sfp, args->namelen); + add_entsize = xfs_dir2_sf_entsize(sfp, args->namelen); incr_isize = add_entsize; objchange = 0; #if XFS_BIG_INUMS /* * Do we have to change to 8 byte inodes? */ - if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->hdr.i8count == 0) { + if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count == 0) { /* * Yes, adjust the entry size and the total size. */ @@ -295,7 +371,7 @@ xfs_dir2_sf_addname( (uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t); incr_isize += - (sfp->hdr.count + 2) * + (sfp->count + 2) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); objchange = 1; @@ -365,21 +441,21 @@ xfs_dir2_sf_addname_easy( { int byteoff; /* byte offset in sf dir */ xfs_inode_t *dp; /* incore directory inode */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ dp = args->dp; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; byteoff = (int)((char *)sfep - (char *)sfp); /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, xfs_dir2_sf_entsize_byname(sfp, args->namelen), + xfs_idata_realloc(dp, xfs_dir2_sf_entsize(sfp, args->namelen), XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. */ - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; sfep = (xfs_dir2_sf_entry_t *)((char *)sfp + byteoff); /* * Fill in the new entry. @@ -387,15 +463,14 @@ xfs_dir2_sf_addname_easy( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); /* * Update the header and inode. */ - sfp->hdr.count++; + sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) - sfp->hdr.i8count++; + sfp->i8count++; #endif dp->i_d.di_size = new_isize; xfs_dir2_sf_check(args); @@ -425,19 +500,19 @@ xfs_dir2_sf_addname_hard( xfs_dir2_data_aoff_t offset; /* current offset value */ int old_isize; /* previous di_size */ xfs_dir2_sf_entry_t *oldsfep; /* entry in original dir */ - xfs_dir2_sf_t *oldsfp; /* original shortform dir */ + xfs_dir2_sf_hdr_t *oldsfp; /* original shortform dir */ xfs_dir2_sf_entry_t *sfep; /* entry in new dir */ - xfs_dir2_sf_t *sfp; /* new shortform dir */ + xfs_dir2_sf_hdr_t *sfp; /* new shortform dir */ /* * Copy the old directory to the stack buffer. */ dp = args->dp; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; old_isize = (int)dp->i_d.di_size; buf = kmem_alloc(old_isize, KM_SLEEP); - oldsfp = (xfs_dir2_sf_t *)buf; + oldsfp = (xfs_dir2_sf_hdr_t *)buf; memcpy(oldsfp, sfp, old_isize); /* * Loop over the old directory finding the place we're going @@ -466,7 +541,7 @@ xfs_dir2_sf_addname_hard( /* * Reset the pointer since the buffer was reallocated. */ - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Copy the first part of the directory, including the header. */ @@ -479,12 +554,11 @@ xfs_dir2_sf_addname_hard( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); - sfp->hdr.count++; + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) - sfp->hdr.i8count++; + sfp->i8count++; #endif /* * If there's more left to copy, do that. @@ -518,14 +592,14 @@ xfs_dir2_sf_addname_pick( xfs_mount_t *mp; /* filesystem mount point */ xfs_dir2_data_aoff_t offset; /* data block offset */ xfs_dir2_sf_entry_t *sfep; /* shortform entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ int size; /* entry's data size */ int used; /* data bytes used */ dp = args->dp; mp = dp->i_mount; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir2_data_entsize(args->namelen); offset = XFS_DIR2_DATA_FIRST_OFFSET; sfep = xfs_dir2_sf_firstentry(sfp); @@ -535,7 +609,7 @@ xfs_dir2_sf_addname_pick( * Keep track of data offset and whether we've seen a place * to insert the new entry. */ - for (i = 0; i < sfp->hdr.count; i++) { + for (i = 0; i < sfp->count; i++) { if (!holefit) holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + @@ -547,7 +621,7 @@ xfs_dir2_sf_addname_pick( * was a data block (block form directory). */ used = offset + - (sfp->hdr.count + 3) * (uint)sizeof(xfs_dir2_leaf_entry_t) + + (sfp->count + 3) * (uint)sizeof(xfs_dir2_leaf_entry_t) + (uint)sizeof(xfs_dir2_block_tail_t); /* * If it won't fit in a block form then we can't insert it, @@ -593,30 +667,30 @@ xfs_dir2_sf_check( xfs_ino_t ino; /* entry inode number */ int offset; /* data offset */ xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ dp = args->dp; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; offset = XFS_DIR2_DATA_FIRST_OFFSET; - ino = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); - ino = xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + ino = xfs_dir2_sfe_get_ino(sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; offset = xfs_dir2_sf_get_offset(sfep) + xfs_dir2_data_entsize(sfep->namelen); } - ASSERT(i8count == sfp->hdr.i8count); + ASSERT(i8count == sfp->i8count); ASSERT(XFS_BIG_INUMS || i8count == 0); ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + - (sfp->hdr.count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + (uint)sizeof(xfs_dir2_block_tail_t) <= dp->i_mount->m_dirblksize); } @@ -632,7 +706,7 @@ xfs_dir2_sf_create( { xfs_inode_t *dp; /* incore directory inode */ int i8count; /* parent inode is an 8-byte number */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ int size; /* directory size */ trace_xfs_dir2_sf_create(args); @@ -662,13 +736,13 @@ xfs_dir2_sf_create( /* * Fill in the header, */ - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - sfp->hdr.i8count = i8count; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp->i8count = i8count; /* * Now can put in the inode number, since i8count is set. */ - xfs_dir2_sf_put_inumber(sfp, &pino, &sfp->hdr.parent); - sfp->hdr.count = 0; + xfs_dir2_sf_put_parent_ino(sfp, pino); + sfp->count = 0; dp->i_d.di_size = size; xfs_dir2_sf_check(args); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); @@ -687,7 +761,7 @@ xfs_dir2_sf_lookup( int i; /* entry index */ int error; xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ @@ -706,8 +780,8 @@ xfs_dir2_sf_lookup( } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Special case for . */ @@ -721,7 +795,7 @@ xfs_dir2_sf_lookup( */ if (args->namelen == 2 && args->name[0] == '.' && args->name[1] == '.') { - args->inumber = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + args->inumber = xfs_dir2_sf_get_parent_ino(sfp); args->cmpresult = XFS_CMP_EXACT; return XFS_ERROR(EEXIST); } @@ -729,7 +803,7 @@ xfs_dir2_sf_lookup( * Loop over all the entries trying to match ours. */ ci_sfep = NULL; - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode @@ -740,8 +814,7 @@ xfs_dir2_sf_lookup( sfep->namelen); if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { args->cmpresult = cmp; - args->inumber = xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)); + args->inumber = xfs_dir2_sfe_get_ino(sfp, sfep); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); ci_sfep = sfep; @@ -773,7 +846,7 @@ xfs_dir2_sf_removename( int newsize; /* new inode size */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ trace_xfs_dir2_sf_removename(args); @@ -790,32 +863,31 @@ xfs_dir2_sf_removename( } ASSERT(dp->i_df.if_bytes == oldsize); ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsize >= xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsize >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Loop over the old directory entries. * Find the one we're deleting. */ - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { - ASSERT(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)) == - args->inumber); + ASSERT(xfs_dir2_sfe_get_ino(sfp, sfep) == + args->inumber); break; } } /* * Didn't find it. */ - if (i == sfp->hdr.count) + if (i == sfp->count) return XFS_ERROR(ENOENT); /* * Calculate sizes. */ byteoff = (int)((char *)sfep - (char *)sfp); - entsize = xfs_dir2_sf_entsize_byname(sfp, args->namelen); + entsize = xfs_dir2_sf_entsize(sfp, args->namelen); newsize = oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -826,22 +898,22 @@ xfs_dir2_sf_removename( /* * Fix up the header and file size. */ - sfp->hdr.count--; + sfp->count--; dp->i_d.di_size = newsize; /* * Reallocate, making it smaller. */ xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; #if XFS_BIG_INUMS /* * Are we changing inode number size? */ if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) { - if (sfp->hdr.i8count == 1) + if (sfp->i8count == 1) xfs_dir2_sf_toino4(args); else - sfp->hdr.i8count--; + sfp->i8count--; } #endif xfs_dir2_sf_check(args); @@ -865,7 +937,7 @@ xfs_dir2_sf_replace( int i8elevated; /* sf_toino8 set i8count=1 */ #endif xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ trace_xfs_dir2_sf_replace(args); @@ -881,19 +953,19 @@ xfs_dir2_sf_replace( } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); #if XFS_BIG_INUMS /* * New inode number is large, and need to convert to 8-byte inodes. */ - if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->hdr.i8count == 0) { + if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count == 0) { int error; /* error return value */ int newsize; /* new inode size */ newsize = dp->i_df.if_bytes + - (sfp->hdr.count + 1) * + (sfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); /* @@ -911,7 +983,7 @@ xfs_dir2_sf_replace( */ xfs_dir2_sf_toino8(args); i8elevated = 1; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; } else i8elevated = 0; #endif @@ -922,34 +994,32 @@ xfs_dir2_sf_replace( if (args->namelen == 2 && args->name[0] == '.' && args->name[1] == '.') { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + ino = xfs_dir2_sf_get_parent_ino(sfp); ASSERT(args->inumber != ino); #endif - xfs_dir2_sf_put_inumber(sfp, &args->inumber, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(sfp, args->inumber); } /* * Normal entry, look for the name. */ else { for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)); + ino = xfs_dir2_sfe_get_ino(sfp, sfep); ASSERT(args->inumber != ino); #endif - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); break; } } /* * Didn't find it. */ - if (i == sfp->hdr.count) { + if (i == sfp->count) { ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); #if XFS_BIG_INUMS if (i8elevated) @@ -967,10 +1037,10 @@ xfs_dir2_sf_replace( /* * And the old count was one, so need to convert to small. */ - if (sfp->hdr.i8count == 1) + if (sfp->i8count == 1) xfs_dir2_sf_toino4(args); else - sfp->hdr.i8count--; + sfp->i8count--; } /* * See if the old number was small, the new number is large. @@ -981,9 +1051,9 @@ xfs_dir2_sf_replace( * add to the i8count unless we just converted to 8-byte * inodes (which does an implied i8count = 1) */ - ASSERT(sfp->hdr.i8count != 0); + ASSERT(sfp->i8count != 0); if (!i8elevated) - sfp->hdr.i8count++; + sfp->i8count++; } #endif xfs_dir2_sf_check(args); @@ -1003,13 +1073,12 @@ xfs_dir2_sf_toino4( char *buf; /* old dir's buffer */ xfs_inode_t *dp; /* incore directory inode */ int i; /* entry index */ - xfs_ino_t ino; /* entry inode number */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_t *oldsfp; /* old sf directory */ + xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ - xfs_dir2_sf_t *sfp; /* new sf directory */ + xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ trace_xfs_dir2_sf_toino4(args); @@ -1022,44 +1091,42 @@ xfs_dir2_sf_toino4( */ oldsize = dp->i_df.if_bytes; buf = kmem_alloc(oldsize, KM_SLEEP); - oldsfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsfp->hdr.i8count == 1); + oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsfp->i8count == 1); memcpy(buf, oldsfp, oldsize); /* * Compute the new inode size. */ newsize = oldsize - - (oldsfp->hdr.count + 1) * + (oldsfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); xfs_idata_realloc(dp, newsize, XFS_DATA_FORK); /* * Reset our pointers, the data has moved. */ - oldsfp = (xfs_dir2_sf_t *)buf; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + oldsfp = (xfs_dir2_sf_hdr_t *)buf; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Fill in the new header. */ - sfp->hdr.count = oldsfp->hdr.count; - sfp->hdr.i8count = 0; - ino = xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(sfp, &ino, &sfp->hdr.parent); + sfp->count = oldsfp->count; + sfp->i8count = 0; + xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - ino = xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(sfp, &ino, xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); } /* * Clean up the inode. @@ -1081,13 +1148,12 @@ xfs_dir2_sf_toino8( char *buf; /* old dir's buffer */ xfs_inode_t *dp; /* incore directory inode */ int i; /* entry index */ - xfs_ino_t ino; /* entry inode number */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_t *oldsfp; /* old sf directory */ + xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ - xfs_dir2_sf_t *sfp; /* new sf directory */ + xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ trace_xfs_dir2_sf_toino8(args); @@ -1100,44 +1166,42 @@ xfs_dir2_sf_toino8( */ oldsize = dp->i_df.if_bytes; buf = kmem_alloc(oldsize, KM_SLEEP); - oldsfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsfp->hdr.i8count == 0); + oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsfp->i8count == 0); memcpy(buf, oldsfp, oldsize); /* * Compute the new inode size. */ newsize = oldsize + - (oldsfp->hdr.count + 1) * + (oldsfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); xfs_idata_realloc(dp, newsize, XFS_DATA_FORK); /* * Reset our pointers, the data has moved. */ - oldsfp = (xfs_dir2_sf_t *)buf; - sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + oldsfp = (xfs_dir2_sf_hdr_t *)buf; + sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Fill in the new header. */ - sfp->hdr.count = oldsfp->hdr.count; - sfp->hdr.i8count = 1; - ino = xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(sfp, &ino, &sfp->hdr.parent); + sfp->count = oldsfp->count; + sfp->i8count = 1; + xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - ino = xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(sfp, &ino, xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); } /* * Clean up the inode. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 1fcafb6..529d92d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -131,7 +131,7 @@ xfs_check_agi_freecount( /* * Initialise a new set of inodes. */ -STATIC void +STATIC int xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, @@ -182,10 +182,9 @@ xfs_ialloc_inode_init( d = XFS_AGB_TO_DADDR(mp, agno, agbno + (j * blks_per_cluster)); fbuf = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize * blks_per_cluster, - XBF_LOCK); - ASSERT(fbuf); - ASSERT(!XFS_BUF_GETERROR(fbuf)); - + XBF_UNMAPPED); + if (!fbuf) + return ENOMEM; /* * Initialize all inodes in this buffer and then log them. * @@ -193,6 +192,7 @@ xfs_ialloc_inode_init( * to log a whole cluster of inodes instead of all the * individual transactions causing a lot of log traffic. */ + fbuf->b_ops = &xfs_inode_buf_ops; xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); for (i = 0; i < ninodes; i++) { int ioffset = i << mp->m_sb.sb_inodelog; @@ -207,6 +207,7 @@ xfs_ialloc_inode_init( } xfs_trans_inode_alloc_buf(tp, fbuf); } + return 0; } /* @@ -232,6 +233,7 @@ xfs_ialloc_ag_alloc( /* boundary */ struct xfs_perag *pag; + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; @@ -258,8 +260,6 @@ xfs_ialloc_ag_alloc( (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type = XFS_ALLOCTYPE_THIS_BNO; - args.mod = args.total = args.wasdel = args.isfl = - args.userdata = args.minalignslop = 0; args.prod = 1; /* @@ -312,8 +312,6 @@ xfs_ialloc_ag_alloc( * Allocate a fixed-size extent of inodes. */ args.type = XFS_ALLOCTYPE_NEAR_BNO; - args.mod = args.total = args.wasdel = args.isfl = - args.userdata = args.minalignslop = 0; args.prod = 1; /* * Allow space for the inode btree to split. @@ -351,9 +349,11 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, args.len, - random32()); + error = xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, + args.len, random32()); + if (error) + return error; /* * Convert the results. */ @@ -411,7 +411,7 @@ xfs_ialloc_next_ag( spin_lock(&mp->m_agirotor_lock); agno = mp->m_agirotor; - if (++mp->m_agirotor == mp->m_maxagi) + if (++mp->m_agirotor >= mp->m_maxagi) mp->m_agirotor = 0; spin_unlock(&mp->m_agirotor_lock); @@ -422,14 +422,13 @@ xfs_ialloc_next_ag( * Select an allocation group to look for a free inode in, based on the parent * inode and then mode. Return the allocation group buffer. */ -STATIC xfs_buf_t * /* allocation group buffer */ +STATIC xfs_agnumber_t xfs_ialloc_ag_select( xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t parent, /* parent directory inode number */ - mode_t mode, /* bits set to indicate file type */ + umode_t mode, /* bits set to indicate file type */ int okalloc) /* ok to allocate more space */ { - xfs_buf_t *agbp; /* allocation group header buffer */ xfs_agnumber_t agcount; /* number of ag's in the filesystem */ xfs_agnumber_t agno; /* current ag number */ int flags; /* alloc buffer locking flags */ @@ -439,6 +438,7 @@ xfs_ialloc_ag_select( int needspace; /* file mode implies space allocated */ xfs_perag_t *pag; /* per allocation group data */ xfs_agnumber_t pagno; /* parent (starting) ag number */ + int error; /* * Files of these types need at least one block if length > 0 @@ -454,7 +454,9 @@ xfs_ialloc_ag_select( if (pagno >= agcount) pagno = 0; } + ASSERT(pagno < agcount); + /* * Loop through allocation groups, looking for one with a little * free space in it. Note we don't look for free inodes, exactly. @@ -466,51 +468,45 @@ xfs_ialloc_ag_select( flags = XFS_ALLOC_FLAG_TRYLOCK; for (;;) { pag = xfs_perag_get(mp, agno); + if (!pag->pagi_inodeok) { + xfs_ialloc_next_ag(mp); + goto nextag; + } + if (!pag->pagi_init) { - if (xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; + error = xfs_ialloc_pagi_init(mp, tp, agno); + if (error) goto nextag; - } - } else - agbp = NULL; + } - if (!pag->pagi_inodeok) { - xfs_ialloc_next_ag(mp); - goto unlock_nextag; + if (pag->pagi_freecount) { + xfs_perag_put(pag); + return agno; } - /* - * Is there enough free space for the file plus a block - * of inodes (if we need to allocate some)? - */ - ineed = pag->pagi_freecount ? 0 : XFS_IALLOC_BLOCKS(mp); - if (ineed && !pag->pagf_init) { - if (agbp == NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; + if (!okalloc) + goto nextag; + + if (!pag->pagf_init) { + error = xfs_alloc_pagf_init(mp, tp, agno, flags); + if (error) goto nextag; - } - (void)xfs_alloc_pagf_init(mp, tp, agno, flags); } - if (!ineed || pag->pagf_init) { - if (ineed && !(longest = pag->pagf_longest)) - longest = pag->pagf_flcount > 0; - if (!ineed || - (pag->pagf_freeblks >= needspace + ineed && - longest >= ineed && - okalloc)) { - if (agbp == NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; - goto nextag; - } - xfs_perag_put(pag); - return agbp; - } + + /* + * Is there enough free space for the file plus a block of + * inodes? (if we need to allocate some)? + */ + ineed = XFS_IALLOC_BLOCKS(mp); + longest = pag->pagf_longest; + if (!longest) + longest = pag->pagf_flcount > 0; + + if (pag->pagf_freeblks >= needspace + ineed && + longest >= ineed) { + xfs_perag_put(pag); + return agno; } -unlock_nextag: - if (agbp) - xfs_trans_brelse(tp, agbp); nextag: xfs_perag_put(pag); /* @@ -518,13 +514,13 @@ nextag: * down. */ if (XFS_FORCED_SHUTDOWN(mp)) - return NULL; + return NULLAGNUMBER; agno++; if (agno >= agcount) agno = 0; if (agno == pagno) { if (flags == 0) - return NULL; + return NULLAGNUMBER; flags = 0; } } @@ -587,188 +583,39 @@ xfs_ialloc_get_rec( } /* - * Visible inode allocation functions. - */ - -/* - * Allocate an inode on disk. - * Mode is used to tell whether the new inode will need space, and whether - * it is a directory. + * Allocate an inode. * - * The arguments IO_agbp and alloc_done are defined to work within - * the constraint of one allocation per transaction. - * xfs_dialloc() is designed to be called twice if it has to do an - * allocation to make more free inodes. On the first call, - * IO_agbp should be set to NULL. If an inode is available, - * i.e., xfs_dialloc() did not need to do an allocation, an inode - * number is returned. In this case, IO_agbp would be set to the - * current ag_buf and alloc_done set to false. - * If an allocation needed to be done, xfs_dialloc would return - * the current ag_buf in IO_agbp and set alloc_done to true. - * The caller should then commit the current transaction, allocate a new - * transaction, and call xfs_dialloc() again, passing in the previous - * value of IO_agbp. IO_agbp should be held across the transactions. - * Since the agbp is locked across the two calls, the second call is - * guaranteed to have a free inode available. - * - * Once we successfully pick an inode its number is returned and the - * on-disk data structures are updated. The inode itself is not read - * in, since doing so would break ordering constraints with xfs_reclaim. + * The caller selected an AG for us, and made sure that free inodes are + * available. */ -int -xfs_dialloc( - xfs_trans_t *tp, /* transaction pointer */ - xfs_ino_t parent, /* parent inode (directory) */ - mode_t mode, /* mode bits for new inode */ - int okalloc, /* ok to allocate more space */ - xfs_buf_t **IO_agbp, /* in/out ag header's buffer */ - boolean_t *alloc_done, /* true if we needed to replenish - inode freelist */ - xfs_ino_t *inop) /* inode number allocated */ +STATIC int +xfs_dialloc_ag( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_ino_t parent, + xfs_ino_t *inop) { - xfs_agnumber_t agcount; /* number of allocation groups */ - xfs_buf_t *agbp; /* allocation group header's buffer */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_agi_t *agi; /* allocation group header structure */ - xfs_btree_cur_t *cur; /* inode allocation btree cursor */ - int error; /* error return value */ - int i; /* result code */ - int ialloced; /* inode allocation status */ - int noroom = 0; /* no space for inode blk allocation */ - xfs_ino_t ino; /* fs-relative inode to be returned */ - /* REFERENCED */ - int j; /* result code */ - xfs_mount_t *mp; /* file system mount structure */ - int offset; /* index of inode in chunk */ - xfs_agino_t pagino; /* parent's AG relative inode # */ - xfs_agnumber_t pagno; /* parent's AG number */ - xfs_inobt_rec_incore_t rec; /* inode allocation record */ - xfs_agnumber_t tagno; /* testing allocation group number */ - xfs_btree_cur_t *tcur; /* temp cursor */ - xfs_inobt_rec_incore_t trec; /* temp inode allocation record */ - struct xfs_perag *pag; - - - if (*IO_agbp == NULL) { - /* - * We do not have an agbp, so select an initial allocation - * group for inode allocation. - */ - agbp = xfs_ialloc_ag_select(tp, parent, mode, okalloc); - /* - * Couldn't find an allocation group satisfying the - * criteria, give up. - */ - if (!agbp) { - *inop = NULLFSINO; - return 0; - } - agi = XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC); - } else { - /* - * Continue where we left off before. In this case, we - * know that the allocation group has free inodes. - */ - agbp = *IO_agbp; - agi = XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC); - ASSERT(be32_to_cpu(agi->agi_freecount) > 0); - } - mp = tp->t_mountp; - agcount = mp->m_sb.sb_agcount; - agno = be32_to_cpu(agi->agi_seqno); - tagno = agno; - pagno = XFS_INO_TO_AGNO(mp, parent); - pagino = XFS_INO_TO_AGINO(mp, parent); - - /* - * If we have already hit the ceiling of inode blocks then clear - * okalloc so we scan all available agi structures for a free - * inode. - */ - - if (mp->m_maxicount && - mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { - noroom = 1; - okalloc = 0; - } + struct xfs_mount *mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent); + xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *cur, *tcur; + struct xfs_inobt_rec_incore rec, trec; + xfs_ino_t ino; + int error; + int offset; + int i, j; - /* - * Loop until we find an allocation group that either has free inodes - * or in which we can allocate some inodes. Iterate through the - * allocation groups upward, wrapping at the end. - */ - *alloc_done = B_FALSE; - while (!agi->agi_freecount) { - /* - * Don't do anything if we're not supposed to allocate - * any blocks, just go on to the next ag. - */ - if (okalloc) { - /* - * Try to allocate some new inodes in the allocation - * group. - */ - if ((error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced))) { - xfs_trans_brelse(tp, agbp); - if (error == ENOSPC) { - *inop = NULLFSINO; - return 0; - } else - return error; - } - if (ialloced) { - /* - * We successfully allocated some inodes, return - * the current context to the caller so that it - * can commit the current transaction and call - * us again where we left off. - */ - ASSERT(be32_to_cpu(agi->agi_freecount) > 0); - *alloc_done = B_TRUE; - *IO_agbp = agbp; - *inop = NULLFSINO; - return 0; - } - } - /* - * If it failed, give up on this ag. - */ - xfs_trans_brelse(tp, agbp); - /* - * Go on to the next ag: get its ag header. - */ -nextag: - if (++tagno == agcount) - tagno = 0; - if (tagno == agno) { - *inop = NULLFSINO; - return noroom ? ENOSPC : 0; - } - pag = xfs_perag_get(mp, tagno); - if (pag->pagi_inodeok == 0) { - xfs_perag_put(pag); - goto nextag; - } - error = xfs_ialloc_read_agi(mp, tp, tagno, &agbp); - xfs_perag_put(pag); - if (error) - goto nextag; - agi = XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC); - } - /* - * Here with an allocation group that has a free inode. - * Reset agno since we may have chosen a new ag in the - * loop above. - */ - agno = tagno; - *IO_agbp = NULL; pag = xfs_perag_get(mp, agno); + ASSERT(pag->pagi_init); + ASSERT(pag->pagi_inodeok); + ASSERT(pag->pagi_freecount > 0); + restart_pagno: - cur = xfs_inobt_init_cursor(mp, tp, agbp, be32_to_cpu(agi->agi_seqno)); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); /* * If pagino is 0 (this is the root inode allocation) use newino. * This must work because we've just allocated some. @@ -925,7 +772,7 @@ nextag: * See if the most recently allocated block has any free. */ newino: - if (be32_to_cpu(agi->agi_newino) != NULLAGINO) { + if (agi->agi_newino != cpu_to_be32(NULLAGINO)) { error = xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino), XFS_LOOKUP_EQ, &i); if (error) @@ -968,7 +815,7 @@ newino: } alloc_inode: - offset = xfs_ialloc_find_free(&rec.ir_free); + offset = xfs_lowbit64(rec.ir_free); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1000,6 +847,165 @@ error0: return error; } +/* + * Allocate an inode on disk. + * + * Mode is used to tell whether the new inode will need space, and whether it + * is a directory. + * + * This function is designed to be called twice if it has to do an allocation + * to make more free inodes. On the first call, *IO_agbp should be set to NULL. + * If an inode is available without having to performn an allocation, an inode + * number is returned. In this case, *IO_agbp is set to NULL. If an allocation + * needs to be done, xfs_dialloc returns the current AGI buffer in *IO_agbp. + * The caller should then commit the current transaction, allocate a + * new transaction, and call xfs_dialloc() again, passing in the previous value + * of *IO_agbp. IO_agbp should be held across the transactions. Since the AGI + * buffer is locked across the two calls, the second call is guaranteed to have + * a free inode available. + * + * Once we successfully pick an inode its number is returned and the on-disk + * data structures are updated. The inode itself is not read in, since doing so + * would break ordering constraints with xfs_reclaim. + */ +int +xfs_dialloc( + struct xfs_trans *tp, + xfs_ino_t parent, + umode_t mode, + int okalloc, + struct xfs_buf **IO_agbp, + xfs_ino_t *inop) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_buf *agbp; + xfs_agnumber_t agno; + int error; + int ialloced; + int noroom = 0; + xfs_agnumber_t start_agno; + struct xfs_perag *pag; + + if (*IO_agbp) { + /* + * If the caller passes in a pointer to the AGI buffer, + * continue where we left off before. In this case, we + * know that the allocation group has free inodes. + */ + agbp = *IO_agbp; + goto out_alloc; + } + + /* + * We do not have an agbp, so select an initial allocation + * group for inode allocation. + */ + start_agno = xfs_ialloc_ag_select(tp, parent, mode, okalloc); + if (start_agno == NULLAGNUMBER) { + *inop = NULLFSINO; + return 0; + } + + /* + * If we have already hit the ceiling of inode blocks then clear + * okalloc so we scan all available agi structures for a free + * inode. + */ + if (mp->m_maxicount && + mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { + noroom = 1; + okalloc = 0; + } + + /* + * Loop until we find an allocation group that either has free inodes + * or in which we can allocate some inodes. Iterate through the + * allocation groups upward, wrapping at the end. + */ + agno = start_agno; + for (;;) { + pag = xfs_perag_get(mp, agno); + if (!pag->pagi_inodeok) { + xfs_ialloc_next_ag(mp); + goto nextag; + } + + if (!pag->pagi_init) { + error = xfs_ialloc_pagi_init(mp, tp, agno); + if (error) + goto out_error; + } + + /* + * Do a first racy fast path check if this AG is usable. + */ + if (!pag->pagi_freecount && !okalloc) + goto nextag; + + /* + * Then read in the AGI buffer and recheck with the AGI buffer + * lock held. + */ + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) + goto out_error; + + if (pag->pagi_freecount) { + xfs_perag_put(pag); + goto out_alloc; + } + + if (!okalloc) + goto nextag_relse_buffer; + + + error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); + if (error) { + xfs_trans_brelse(tp, agbp); + + if (error != ENOSPC) + goto out_error; + + xfs_perag_put(pag); + *inop = NULLFSINO; + return 0; + } + + if (ialloced) { + /* + * We successfully allocated some inodes, return + * the current context to the caller so that it + * can commit the current transaction and call + * us again where we left off. + */ + ASSERT(pag->pagi_freecount > 0); + xfs_perag_put(pag); + + *IO_agbp = agbp; + *inop = NULLFSINO; + return 0; + } + +nextag_relse_buffer: + xfs_trans_brelse(tp, agbp); +nextag: + xfs_perag_put(pag); + if (++agno == mp->m_sb.sb_agcount) + agno = 0; + if (agno == start_agno) { + *inop = NULLFSINO; + return noroom ? ENOSPC : 0; + } + } + +out_alloc: + *IO_agbp = NULL; + return xfs_dialloc_ag(tp, agbp, parent, inop); +out_error: + xfs_perag_put(pag); + return XFS_ERROR(error); +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, @@ -1019,10 +1025,9 @@ xfs_imap_lookup( error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); + xfs_alert(mp, + "%s: xfs_ialloc_read_agi() returned error %d, agno %d", + __func__, error, agno); return error; } @@ -1100,24 +1105,21 @@ xfs_imap( if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agno (%d) >= " - "mp->m_sb.sb_agcount (%d)", - agno, mp->m_sb.sb_agcount); + xfs_alert(mp, + "%s: agno (%d) >= mp->m_sb.sb_agcount (%d)", + __func__, agno, mp->m_sb.sb_agcount); } if (agbno >= mp->m_sb.sb_agblocks) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agbno (0x%llx) >= " - "mp->m_sb.sb_agblocks (0x%lx)", - (unsigned long long) agbno, - (unsigned long) mp->m_sb.sb_agblocks); + xfs_alert(mp, + "%s: agbno (0x%llx) >= mp->m_sb.sb_agblocks (0x%lx)", + __func__, (unsigned long long)agbno, + (unsigned long)mp->m_sb.sb_agblocks); } if (ino != XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: ino (0x%llx) != " - "XFS_AGINO_TO_INO(mp, agno, agino) " - "(0x%llx)", - ino, XFS_AGINO_TO_INO(mp, agno, agino)); + xfs_alert(mp, + "%s: ino (0x%llx) != XFS_AGINO_TO_INO() (0x%llx)", + __func__, ino, + XFS_AGINO_TO_INO(mp, agno, agino)); } xfs_stack_trace(); #endif /* DEBUG */ @@ -1189,10 +1191,9 @@ out_map: */ if ((imap->im_blkno + imap->im_len) > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " - " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", - (unsigned long long) imap->im_blkno, + xfs_alert(mp, + "%s: (im_blkno (0x%llx) + im_len (0x%llx)) > sb_dblocks (0x%llx)", + __func__, (unsigned long long) imap->im_blkno, (unsigned long long) imap->im_len, XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); return XFS_ERROR(EINVAL); @@ -1253,7 +1254,7 @@ xfs_ialloc_log_agi( xfs_agi_t *agi; /* allocation group header */ agi = XFS_BUF_TO_AGI(bp); - ASSERT(be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC); + ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); #endif /* * Compute byte offsets for the first and last fields. @@ -1279,6 +1280,57 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif +static void +xfs_agi_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); + int agi_ok; + + /* + * Validate the magic number of the agi block. + */ + agi_ok = agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC) && + XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag) + agi_ok = agi_ok && be32_to_cpu(agi->agi_seqno) == + bp->b_pag->pag_agno; + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_check_agi_unlinked(agi); +} + +static void +xfs_agi_read_verify( + struct xfs_buf *bp) +{ + xfs_agi_verify(bp); +} + +static void +xfs_agi_write_verify( + struct xfs_buf *bp) +{ + xfs_agi_verify(bp); +} + +const struct xfs_buf_ops xfs_agi_buf_ops = { + .verify_read = xfs_agi_read_verify, + .verify_write = xfs_agi_write_verify, +}; + /* * Read in the allocation group header (inode allocation section) */ @@ -1289,38 +1341,18 @@ xfs_read_agi( xfs_agnumber_t agno, /* allocation group number */ struct xfs_buf **bpp) /* allocation group hdr buf */ { - struct xfs_agi *agi; /* allocation group header */ - int agi_ok; /* agi is consistent */ int error; ASSERT(agno != NULLAGNUMBER); error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, bpp); + XFS_FSS_TO_BB(mp, 1), 0, bpp, &xfs_agi_buf_ops); if (error) return error; - ASSERT(*bpp && !XFS_BUF_GETERROR(*bpp)); - agi = XFS_BUF_TO_AGI(*bpp); - - /* - * Validate the magic number of the agi block. - */ - agi_ok = be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)) && - be32_to_cpu(agi->agi_seqno) == agno; - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR("xfs_read_agi", XFS_ERRLEVEL_LOW, - mp, agi); - xfs_trans_brelse(tp, *bpp); - return XFS_ERROR(EFSCORRUPTED); - } - - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGI, XFS_AGI_REF); - - xfs_check_agi_unlinked(agi); + ASSERT(!xfs_buf_geterror(*bpp)); + xfs_buf_set_ref(*bpp, XFS_AGI_REF); return 0; } diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 35dd96f..0bc24cc 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -163,6 +163,59 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } +void +xfs_inobt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + unsigned int level; + int sblock_ok; /* block passes checks */ + + /* magic number and level verification */ + level = be16_to_cpu(block->bb_level); + sblock_ok = block->bb_magic == cpu_to_be32(XFS_IBT_MAGIC) && + level < mp->m_in_maxlevels; + + /* numrecs verification */ + sblock_ok = sblock_ok && + be16_to_cpu(block->bb_numrecs) <= mp->m_inobt_mxr[level != 0]; + + /* sibling pointer verification */ + sblock_ok = sblock_ok && + (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_leftsib && + (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_rightsib; + + if (!sblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_inobt_read_verify( + struct xfs_buf *bp) +{ + xfs_inobt_verify(bp); +} + +static void +xfs_inobt_write_verify( + struct xfs_buf *bp) +{ + xfs_inobt_verify(bp); +} + +const struct xfs_buf_ops xfs_inobt_buf_ops = { + .verify_read = xfs_inobt_read_verify, + .verify_write = xfs_inobt_write_verify, +}; + #ifdef DEBUG STATIC int xfs_inobt_keys_inorder( @@ -266,7 +319,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .init_rec_from_cur = xfs_inobt_init_rec_from_cur, .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, - + .buf_ops = &xfs_inobt_buf_ops, #ifdef DEBUG .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index e4474fd..2970f46 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -21,6 +21,12 @@ kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_inode_zone; +/* + * Used in xfs_itruncate_extents(). This is the maximum number of extents + * freed from a file in a single transaction. + */ +#define XFS_ITRUNC_MAX_EXTENTS 2 + STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); @@ -73,8 +79,8 @@ xfs_inobp_check( dip = (xfs_dinode_t *)xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize); if (!dip->di_next_unlinked) { - xfs_fs_cmn_err(CE_ALERT, mp, - "Detected a bogus zero next_unlinked field in incore inode buffer 0x%p. About to pop an ASSERT.", + xfs_alert(mp, + "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", bp); ASSERT(dip->di_next_unlinked); } @@ -82,176 +88,108 @@ xfs_inobp_check( } #endif -/* - * Find the buffer associated with the given inode map - * We do basic validation checks on the buffer once it has been - * retrieved from disk. - */ -int -xfs_imap_to_bp( - xfs_mount_t *mp, - xfs_trans_t *tp, - struct xfs_imap *imap, - xfs_buf_t **bpp, - uint buf_flags, - uint iget_flags) +static void +xfs_inode_buf_verify( + struct xfs_buf *bp) { - int error; + struct xfs_mount *mp = bp->b_target->bt_mount; int i; int ni; - xfs_buf_t *bp; - - error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, - (int)imap->im_len, buf_flags, &bp); - if (error) { - if (error != EAGAIN) { - cmn_err(CE_WARN, - "xfs_imap_to_bp: xfs_trans_read_buf()returned " - "an error %d on %s. Returning error.", - error, mp->m_fsname); - } else { - ASSERT(buf_flags & XBF_TRYLOCK); - } - return error; - } /* * Validate the magic number and version of every inode in the buffer - * (if DEBUG kernel) or the first inode in the buffer, otherwise. */ -#ifdef DEBUG - ni = BBTOB(imap->im_len) >> mp->m_sb.sb_inodelog; -#else /* usual case */ - ni = 1; -#endif - + ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; for (i = 0; i < ni; i++) { int di_ok; xfs_dinode_t *dip; - dip = (xfs_dinode_t *)xfs_buf_offset(bp, + dip = (struct xfs_dinode *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); - di_ok = be16_to_cpu(dip->di_magic) == XFS_DINODE_MAGIC && + di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) && XFS_DINODE_GOOD_VERSION(dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (iget_flags & XFS_IGET_UNTRUSTED) { - xfs_trans_brelse(tp, bp); - return XFS_ERROR(EINVAL); - } - XFS_CORRUPTION_ERROR("xfs_imap_to_bp", - XFS_ERRLEVEL_HIGH, mp, dip); + xfs_buf_ioerror(bp, EFSCORRUPTED); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, + mp, dip); #ifdef DEBUG - cmn_err(CE_PANIC, - "Device %s - bad inode magic/vsn " - "daddr %lld #%d (magic=%x)", - XFS_BUFTARG_NAME(mp->m_ddev_targp), - (unsigned long long)imap->im_blkno, i, + xfs_emerg(mp, + "bad inode magic/vsn daddr %lld #%d (magic=%x)", + (unsigned long long)bp->b_bn, i, be16_to_cpu(dip->di_magic)); + ASSERT(0); #endif - xfs_trans_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); } } - xfs_inobp_check(mp, bp); +} - /* - * Mark the buffer as an inode buffer now that it looks good - */ - XFS_BUF_SET_VTYPE(bp, B_FS_INO); - *bpp = bp; - return 0; +static void +xfs_inode_buf_read_verify( + struct xfs_buf *bp) +{ + xfs_inode_buf_verify(bp); } -/* - * This routine is called to map an inode number within a file - * system to the buffer containing the on-disk version of the - * inode. It returns a pointer to the buffer containing the - * on-disk inode in the bpp parameter, and in the dip parameter - * it returns a pointer to the on-disk inode within that buffer. - * - * If a non-zero error is returned, then the contents of bpp and - * dipp are undefined. - * - * Use xfs_imap() to determine the size and location of the - * buffer to read from disk. - */ -int -xfs_inotobp( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_dinode_t **dipp, - xfs_buf_t **bpp, - int *offset, - uint imap_flags) +static void +xfs_inode_buf_write_verify( + struct xfs_buf *bp) { - struct xfs_imap imap; - xfs_buf_t *bp; - int error; - - imap.im_blkno = 0; - error = xfs_imap(mp, tp, ino, &imap, imap_flags); - if (error) - return error; - - error = xfs_imap_to_bp(mp, tp, &imap, &bp, XBF_LOCK, imap_flags); - if (error) - return error; - - *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); - *bpp = bp; - *offset = imap.im_boffset; - return 0; + xfs_inode_buf_verify(bp); } +const struct xfs_buf_ops xfs_inode_buf_ops = { + .verify_read = xfs_inode_buf_read_verify, + .verify_write = xfs_inode_buf_write_verify, +}; + /* - * This routine is called to map an inode to the buffer containing - * the on-disk version of the inode. It returns a pointer to the - * buffer containing the on-disk inode in the bpp parameter, and in - * the dip parameter it returns a pointer to the on-disk inode within - * that buffer. + * This routine is called to map an inode to the buffer containing the on-disk + * version of the inode. It returns a pointer to the buffer containing the + * on-disk inode in the bpp parameter, and in the dipp parameter it returns a + * pointer to the on-disk inode within that buffer. * - * If a non-zero error is returned, then the contents of bpp and - * dipp are undefined. - * - * The inode is expected to already been mapped to its buffer and read - * in once, thus we can use the mapping information stored in the inode - * rather than calling xfs_imap(). This allows us to avoid the overhead - * of looking at the inode btree for small block file systems - * (see xfs_imap()). + * If a non-zero error is returned, then the contents of bpp and dipp are + * undefined. */ int -xfs_itobp( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_inode_t *ip, - xfs_dinode_t **dipp, - xfs_buf_t **bpp, - uint buf_flags) +xfs_imap_to_bp( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_imap *imap, + struct xfs_dinode **dipp, + struct xfs_buf **bpp, + uint buf_flags, + uint iget_flags) { - xfs_buf_t *bp; - int error; + struct xfs_buf *bp; + int error; - ASSERT(ip->i_imap.im_blkno != 0); + buf_flags |= XBF_UNMAPPED; + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, + (int)imap->im_len, buf_flags, &bp, + &xfs_inode_buf_ops); + if (error) { + if (error == EAGAIN) { + ASSERT(buf_flags & XBF_TRYLOCK); + return error; + } - error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0); - if (error) - return error; + if (error == EFSCORRUPTED && + (iget_flags & XFS_IGET_UNTRUSTED)) + return XFS_ERROR(EINVAL); - if (!bp) { - ASSERT(buf_flags & XBF_TRYLOCK); - ASSERT(tp == NULL); - *bpp = NULL; - return EAGAIN; + xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", + __func__, error); + return error; } - *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); *bpp = bp; + *dipp = (struct xfs_dinode *)xfs_buf_offset(bp, imap->im_boffset); return 0; } @@ -264,23 +202,20 @@ xfs_itobp( * brought in-core. The rest will be in-lined in if_extents when it * is first referenced (see xfs_iread_extents()). */ -int +STATIC int xfs_iformat( xfs_inode_t *ip, xfs_dinode_t *dip) { xfs_attr_shortform_t *atp; int size; - int error; + int error = 0; xfs_fsize_t di_size; - ip->i_df.if_ext_max = - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - error = 0; if (unlikely(be32_to_cpu(dip->di_nextents) + be16_to_cpu(dip->di_anextents) > be64_to_cpu(dip->di_nblocks))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", (unsigned long long)ip->i_ino, (int)(be32_to_cpu(dip->di_nextents) + @@ -293,8 +228,7 @@ xfs_iformat( } if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt dinode %Lu, forkoff = 0x%x.", + xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", (unsigned long long)ip->i_ino, dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, @@ -304,7 +238,7 @@ xfs_iformat( if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && !ip->i_mount->m_rtdev)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, has realtime flag set.", ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", @@ -323,7 +257,6 @@ xfs_iformat( return XFS_ERROR(EFSCORRUPTED); } ip->i_d.di_size = 0; - ip->i_size = 0; ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); break; @@ -335,10 +268,9 @@ xfs_iformat( /* * no local regular files yet */ - if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(local format for regular file).", + if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (local format for regular file).", (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(4)", XFS_ERRLEVEL_LOW, @@ -348,9 +280,8 @@ xfs_iformat( di_size = be64_to_cpu(dip->di_size); if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %Ld for local inode).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %Ld for local inode).", (unsigned long long) ip->i_ino, (long long) di_size); XFS_CORRUPTION_ERROR("xfs_iformat(5)", @@ -384,19 +315,18 @@ xfs_iformat( } if (!XFS_DFORK_Q(dip)) return 0; + ASSERT(ip->i_afp == NULL); ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); - ip->i_afp->if_ext_max = - XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); size = be16_to_cpu(atp->hdr.totsize); if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad attr fork size %Ld).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad attr fork size %Ld).", (unsigned long long) ip->i_ino, (long long) size); XFS_CORRUPTION_ERROR("xfs_iformat(8)", @@ -451,9 +381,8 @@ xfs_iformat_local( * kmem_alloc() or memcpy() below. */ if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %d for local fork, size = %d).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %d for local fork, size = %d).", (unsigned long long) ip->i_ino, size, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, @@ -510,8 +439,7 @@ xfs_iformat_extents( * kmem_alloc() or memcpy() below. */ if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu ((a)extents = %d).", + xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).", (unsigned long long) ip->i_ino, nex); XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); @@ -582,15 +510,15 @@ xfs_iformat_btree( * or the number of extents is greater than the number of * blocks. */ - if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= ifp->if_ext_max - || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) - || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu (btree).", + if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= + XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_BMDR_SPACE_CALC(nrecs) > + XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { + xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } @@ -683,6 +611,124 @@ xfs_dinode_to_disk( } /* + * Read the disk inode attributes into the in-core inode structure. + */ +int +xfs_iread( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_inode_t *ip, + uint iget_flags) +{ + xfs_buf_t *bp; + xfs_dinode_t *dip; + int error; + + /* + * Fill in the location information in the in-core inode. + */ + error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); + if (error) + return error; + + /* + * Get pointers to the on-disk inode and the buffer containing it. + */ + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags); + if (error) + return error; + + /* + * If we got something that isn't an inode it means someone + * (nfs or dmi) has a stale handle. + */ + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) { +#ifdef DEBUG + xfs_alert(mp, + "%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)", + __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); +#endif /* DEBUG */ + error = XFS_ERROR(EINVAL); + goto out_brelse; + } + + /* + * If the on-disk inode is already linked to a directory + * entry, copy all of the inode into the in-core inode. + * xfs_iformat() handles copying in the inode format + * specific information. + * Otherwise, just get the truly permanent information. + */ + if (dip->di_mode) { + xfs_dinode_from_disk(&ip->i_d, dip); + error = xfs_iformat(ip, dip); + if (error) { +#ifdef DEBUG + xfs_alert(mp, "%s: xfs_iformat() returned error %d", + __func__, error); +#endif /* DEBUG */ + goto out_brelse; + } + } else { + ip->i_d.di_magic = be16_to_cpu(dip->di_magic); + ip->i_d.di_version = dip->di_version; + ip->i_d.di_gen = be32_to_cpu(dip->di_gen); + ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); + /* + * Make sure to pull in the mode here as well in + * case the inode is released without being used. + * This ensures that xfs_inactive() will see that + * the inode is already free and not try to mess + * with the uninitialized part of it. + */ + ip->i_d.di_mode = 0; + } + + /* + * The inode format changed when we moved the link count and + * made it 32 bits long. If this is an old format inode, + * convert it in memory to look like a new one. If it gets + * flushed to disk we will convert back before flushing or + * logging it. We zero out the new projid field and the old link + * count field. We'll handle clearing the pad field (the remains + * of the old uuid field) when we actually convert the inode to + * the new format. We don't change the version number so that we + * can distinguish this from a real new format inode. + */ + if (ip->i_d.di_version == 1) { + ip->i_d.di_nlink = ip->i_d.di_onlink; + ip->i_d.di_onlink = 0; + xfs_set_projid(&ip->i_d, 0); + } + + ip->i_delayed_blks = 0; + + /* + * Mark the buffer containing the inode as something to keep + * around for a while. This helps to keep recently accessed + * meta-data in-core longer. + */ + xfs_buf_set_ref(bp, XFS_INO_REF); + + /* + * Use xfs_trans_brelse() to release the buffer containing the + * on-disk inode, because it was acquired with xfs_trans_read_buf() + * in xfs_imap_to_bp() above. If tp is NULL, this is just a normal + * brelse(). If we're within a transaction, then xfs_trans_brelse() + * will only release the buffer if it is not dirty within the + * transaction. It will be OK to release the buffer in this case, + * because inodes on disk are never destroyed and we will be + * locking the new in-core inode before putting it in the hash + * table where other processes can find it. Thus we don't have + * to worry about the inode being changed just because we released + * the buffer. + */ + out_brelse: + xfs_trans_brelse(tp, bp); + return error; +} + +/* * Read in extents from a btree-format inode. * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. */ @@ -707,7 +753,6 @@ xfs_iread_extents( /* * We know that the size is valid (it's checked in iformat_btree) */ - ifp->if_lastex = NULLEXTNUM; ifp->if_bytes = ifp->if_real_bytes = 0; ifp->if_flags |= XFS_IFEXTENTS; xfs_iext_add(ifp, 0, nextents); @@ -1067,9 +1112,6 @@ xfs_iflush_fork( char *cp; xfs_ifork_t *ifp; xfs_mount_t *mp; -#ifdef XFS_TRANS_DEBUG - int first; -#endif static const short brootflag[2] = { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT }; static const short dataflag[2] = @@ -1092,7 +1134,7 @@ xfs_iflush_fork( mp = ip->i_mount; switch (XFS_IFORK_FORMAT(ip, whichfork)) { case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_format.ilf_fields & dataflag[whichfork]) && + if ((iip->ili_fields & dataflag[whichfork]) && (ifp->if_bytes > 0)) { ASSERT(ifp->if_u1.if_data != NULL); ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); @@ -1102,13 +1144,10 @@ xfs_iflush_fork( case XFS_DINODE_FMT_EXTENTS: ASSERT((ifp->if_flags & XFS_IFEXTENTS) || - !(iip->ili_format.ilf_fields & extflag[whichfork])); - ASSERT((xfs_iext_get_ext(ifp, 0) != NULL) || - (ifp->if_bytes == 0)); - ASSERT((xfs_iext_get_ext(ifp, 0) == NULL) || - (ifp->if_bytes > 0)); - if ((iip->ili_format.ilf_fields & extflag[whichfork]) && + !(iip->ili_fields & extflag[whichfork])); + if ((iip->ili_fields & extflag[whichfork]) && (ifp->if_bytes > 0)) { + ASSERT(xfs_iext_get_ext(ifp, 0)); ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0); (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp, whichfork); @@ -1116,7 +1155,7 @@ xfs_iflush_fork( break; case XFS_DINODE_FMT_BTREE: - if ((iip->ili_format.ilf_fields & brootflag[whichfork]) && + if ((iip->ili_fields & brootflag[whichfork]) && (ifp->if_broot_bytes > 0)) { ASSERT(ifp->if_broot != NULL); ASSERT(ifp->if_broot_bytes <= @@ -1129,14 +1168,14 @@ xfs_iflush_fork( break; case XFS_DINODE_FMT_DEV: - if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) { + if (iip->ili_fields & XFS_ILOG_DEV) { ASSERT(whichfork == XFS_DATA_FORK); xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); } break; case XFS_DINODE_FMT_UUID: - if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) { + if (iip->ili_fields & XFS_ILOG_UUID) { ASSERT(whichfork == XFS_DATA_FORK); memcpy(XFS_DFORK_DPTR(dip), &ip->i_df.if_u2.if_uuid, @@ -1159,6 +1198,8 @@ xfs_iext_get_ext( xfs_extnum_t idx) /* index of target extent */ { ASSERT(idx >= 0); + ASSERT(idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + if ((ifp->if_flags & XFS_IFEXTIREC) && (idx == 0)) { return ifp->if_u1.if_ext_irec->er_extbuf; } else if (ifp->if_flags & XFS_IFEXTIREC) { @@ -1238,7 +1279,6 @@ xfs_iext_add( } ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; ifp->if_real_bytes = 0; - ifp->if_lastex = nextents + ext_diff; } /* * Otherwise use a linear (direct) extent list. @@ -1933,8 +1973,10 @@ xfs_iext_idx_to_irec( xfs_extnum_t page_idx = *idxp; /* extent index in target list */ ASSERT(ifp->if_flags & XFS_IFEXTIREC); - ASSERT(page_idx >= 0 && page_idx <= - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); + ASSERT(page_idx >= 0); + ASSERT(page_idx <= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + ASSERT(page_idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t) || realloc); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; erp_idx = 0; low = 0; diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 32d2255..a9155b3 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -90,8 +90,8 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) ASSERT(atomic_read(&pag->pag_ref) >= 0); ref = atomic_inc_return(&pag->pag_ref); } - trace_xfs_perag_get(mp, agno, ref, _RET_IP_); rcu_read_unlock(); + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); return pag; } @@ -105,6 +105,114 @@ xfs_perag_put(struct xfs_perag *pag) trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); } +/* + * Check the validity of the SB found. + */ +STATIC int +xfs_mount_validate_sb( + xfs_mount_t *mp, + xfs_sb_t *sbp, + bool check_inprogress) +{ + + /* + * If the log device and data device have the + * same device number, the log is internal. + * Consequently, the sb_logstart should be non-zero. If + * we have a zero sb_logstart in this case, we may be trying to mount + * a volume filesystem in a non-volume manner. + */ + if (sbp->sb_magicnum != XFS_SB_MAGIC) { + xfs_warn(mp, "bad magic number"); + return XFS_ERROR(EWRONGFS); + } + + if (!xfs_sb_good_version(sbp)) { + xfs_warn(mp, "bad version"); + return XFS_ERROR(EWRONGFS); + } + + if (unlikely( + sbp->sb_logstart == 0 && mp->m_logdev == mp->m_dev)) { + xfs_warn(mp, + "filesystem is marked as having an external log; " + "specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + if (unlikely( + sbp->sb_logstart != 0 && mp->m_logdev != mp->m_dev)) { + xfs_warn(mp, + "filesystem is marked as having an internal log; " + "do not specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + /* + * More sanity checking. Most of these were stolen directly from + * xfs_repair. + */ + if (unlikely( + sbp->sb_agcount <= 0 || + sbp->sb_sectsize < XFS_MIN_SECTORSIZE || + sbp->sb_sectsize > XFS_MAX_SECTORSIZE || + sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG || + sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG || + sbp->sb_sectsize != (1 << sbp->sb_sectlog) || + sbp->sb_blocksize < XFS_MIN_BLOCKSIZE || + sbp->sb_blocksize > XFS_MAX_BLOCKSIZE || + sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || + sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || + sbp->sb_blocksize != (1 << sbp->sb_blocklog) || + sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || + sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || + sbp->sb_inodelog < XFS_DINODE_MIN_LOG || + sbp->sb_inodelog > XFS_DINODE_MAX_LOG || + sbp->sb_inodesize != (1 << sbp->sb_inodelog) || + (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || + (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || + (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || + (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || + sbp->sb_dblocks == 0 || + sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + XFS_CORRUPTION_ERROR("SB sanity check failed", + XFS_ERRLEVEL_LOW, mp, sbp); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Currently only very few inode sizes are supported. + */ + switch (sbp->sb_inodesize) { + case 256: + case 512: + case 1024: + case 2048: + break; + default: + xfs_warn(mp, "inode size of %d bytes not supported", + sbp->sb_inodesize); + return XFS_ERROR(ENOSYS); + } + + + if (check_inprogress && sbp->sb_inprogress) { + xfs_warn(mp, "Offline file system operation in progress!"); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Version 1 directory format has never worked on Linux. + */ + if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { + xfs_warn(mp, "file system using version 1 directory format"); + return XFS_ERROR(ENOSYS); + } + + return 0; +} + void xfs_sb_from_disk( xfs_sb_t *to, @@ -211,6 +319,72 @@ xfs_sb_to_disk( } } +static void +xfs_sb_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_sb sb; + int error; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + /* + * Only check the in progress field for the primary superblock as + * mkfs.xfs doesn't clear it from secondary superblocks. + */ + error = xfs_mount_validate_sb(mp, &sb, bp->b_blkno == XFS_SB_DADDR); + if (error) + xfs_buf_ioerror(bp, error); +} + +static void +xfs_sb_read_verify( + struct xfs_buf *bp) +{ + xfs_sb_verify(bp); +} + +/* + * We may be probed for a filesystem match, so we may not want to emit + * messages when the superblock buffer is not actually an XFS superblock. + * If we find an XFS superblock, the run a normal, noisy mount because we are + * really going to mount it and want to know about errors. + */ +static void +xfs_sb_quiet_read_verify( + struct xfs_buf *bp) +{ + struct xfs_sb sb; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + if (sb.sb_magicnum == XFS_SB_MAGIC) { + /* XFS filesystem, verify noisily! */ + xfs_sb_read_verify(bp); + return; + } + /* quietly fail */ + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +static void +xfs_sb_write_verify( + struct xfs_buf *bp) +{ + xfs_sb_verify(bp); +} + +const struct xfs_buf_ops xfs_sb_buf_ops = { + .verify_read = xfs_sb_read_verify, + .verify_write = xfs_sb_write_verify, +}; + +static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { + .verify_read = xfs_sb_quiet_read_verify, + .verify_write = xfs_sb_write_verify, +}; + /* * xfs_mount_common * diff --git a/libxfs/xfs_rtalloc.c b/libxfs/xfs_rtalloc.c index 4fbdaa9..1de85fd 100644 --- a/libxfs/xfs_rtalloc.c +++ b/libxfs/xfs_rtalloc.c @@ -49,34 +49,24 @@ xfs_rtbuf_get( xfs_buf_t **bpp) /* output: buffer for the block */ { xfs_buf_t *bp; /* block buffer, result */ - xfs_daddr_t d; /* disk addr of block */ - int error; /* error value */ - xfs_fsblock_t fsb; /* fs block number for block */ xfs_inode_t *ip; /* bitmap or summary inode */ + xfs_bmbt_irec_t map; + int nmap = 1; + int error; /* error value */ ip = issum ? mp->m_rsumip : mp->m_rbmip; - /* - * Map from the file offset (block) and inode number to the - * file system block. - */ - error = xfs_bmapi_single(tp, ip, XFS_DATA_FORK, &fsb, block); - if (error) { + + error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fsb != NULLFSBLOCK); - /* - * Convert to disk address for buffer cache. - */ - d = XFS_FSB_TO_DADDR(mp, fsb); - /* - * Read the buffer. - */ - error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, 0, &bp); - if (error) { + + ASSERT(map.br_startblock != NULLFSBLOCK); + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, map.br_startblock), + mp->m_bsize, 0, &bp, NULL); + if (error) return error; - } - ASSERT(bp && !XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); *bpp = bp; return 0; } @@ -115,7 +105,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp = bp->b_addr; /* * Get the first word's index & point to it. */ @@ -167,7 +157,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp = bp->b_addr; word = XFS_BLOCKWMASK(mp); b = &bufp[word]; } else { @@ -213,7 +203,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp = bp->b_addr; word = XFS_BLOCKWMASK(mp); b = &bufp[word]; } else { @@ -290,7 +280,7 @@ xfs_rtfind_forw( if (error) { return error; } - bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp = bp->b_addr; /* * Get the first word's index & point to it. */ @@ -341,7 +331,7 @@ xfs_rtfind_forw( if (error) { return error; } - b = bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + b = bufp = bp->b_addr; word = 0; } else { /* @@ -386,7 +376,7 @@ xfs_rtfind_forw( if (error) { return error; } - b = bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + b = bufp = bp->b_addr; word = 0; } else { /* @@ -537,7 +527,7 @@ xfs_rtmodify_range( if (error) { return error; } - bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp = bp->b_addr; /* * Compute the starting word's address, and starting bit. */ @@ -582,7 +572,7 @@ xfs_rtmodify_range( if (error) { return error; } - first = b = bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + first = b = bufp = bp->b_addr; word = 0; } else { /* @@ -622,7 +612,7 @@ xfs_rtmodify_range( if (error) { return error; } - first = b = bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); + first = b = bufp = bp->b_addr; word = 0; } else { /* @@ -720,8 +710,8 @@ xfs_rtmodify_summary( */ sp = XFS_SUMPTR(mp, bp, so); *sp += delta; - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)XFS_BUF_PTR(bp)), - (uint)((char *)sp - (char *)XFS_BUF_PTR(bp) + sizeof(*sp) - 1)); + xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), + (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); return 0; } @@ -736,18 +726,15 @@ xfs_rtfree_extent( xfs_extlen_t len) /* length of extent freed */ { int error; /* error value */ - xfs_inode_t *ip; /* bitmap file inode */ xfs_mount_t *mp; /* file system mount structure */ xfs_fsblock_t sb; /* summary file block number */ xfs_buf_t *sumbp; /* summary file block buffer */ mp = tp->t_mountp; - /* - * Synchronize by locking the bitmap inode. - */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) - return error; + + ASSERT(mp->m_rbmip->i_itemp != NULL); + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); + #if defined(__KERNEL__) && defined(DEBUG) /* * Check to see that this whole range is currently allocated. @@ -780,10 +767,10 @@ xfs_rtfree_extent( */ if (tp->t_frextents_delta + mp->m_sb.sb_frextents == mp->m_sb.sb_rextents) { - if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) - ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; - *(__uint64_t *)&ip->i_d.di_atime = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) + mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; + *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; + xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); } return 0; } diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 635de8f..a75a0ca 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -551,14 +551,13 @@ xfs_trans_add_item( { struct xfs_log_item_desc *lidp; - ASSERT(lip->li_mountp = tp->t_mountp); - ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + ASSERT(lip->li_mountp == tp->t_mountp); + ASSERT(lip->li_ailp == tp->t_mountp->m_ail); lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); lidp->lid_item = lip; lidp->lid_flags = 0; - lidp->lid_size = 0; list_add_tail(&lidp->lid_trans, &tp->t_items); lip->li_desc = lidp; @@ -641,8 +640,6 @@ xfs_trans_roll( if (error) return error; - xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(trans, dp); + xfs_trans_ijoin(trans, dp, 0); return 0; } - diff --git a/logprint/log_misc.c b/logprint/log_misc.c index e42e108..c480795 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -17,6 +17,7 @@ */ #include "logprint.h" +#include #define CLEARED_BLKS (-5) #define ZEROED_LOG (-4) @@ -1055,7 +1056,7 @@ xlog_print_rec_head(xlog_rec_header_t *head, int *len) } /* check for cleared blocks written by xlog_clear_stale_blocks() */ - if (!head->h_len && !head->h_chksum && !head->h_prev_block && + if (!head->h_len && !head->h_crc && !head->h_prev_block && !head->h_num_logops && !head->h_size) return CLEARED_BLKS; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 69d6e71..cbc51d9 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -243,7 +243,7 @@ xlog_recover_print_inode_core( (di->di_magic>>8) & 0xff, di->di_magic & 0xff, di->di_mode, di->di_version, di->di_format, di->di_onlink); printf(_(" uid:%d gid:%d nlink:%d projid:%u\n"), - di->di_uid, di->di_gid, di->di_nlink, xfs_get_projid(*di)); + di->di_uid, di->di_gid, di->di_nlink, xfs_get_projid(di)); printf(_(" atime:%d mtime:%d ctime:%d\n"), di->di_atime.t_sec, di->di_mtime.t_sec, di->di_ctime.t_sec); printf(_(" flushiter:%d\n"), di->di_flushiter); diff --git a/mkfs/proto.c b/mkfs/proto.c index 3021028..56eed31 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -243,7 +243,7 @@ newfile( } else if (len > 0) { nb = XFS_B_TO_FSB(mp, len); nmap = 1; - error = libxfs_bmapi(tp, ip, 0, nb, XFS_BMAPI_WRITE, first, nb, + error = libxfs_bmapi_write(tp, ip, 0, nb, 0, first, nb, &map, &nmap, flist); if (error) { fail(_("error allocating space for a file"), error); @@ -667,9 +667,9 @@ rtinit( xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; - error = libxfs_bmapi(tp, rbmip, bno, + error = libxfs_bmapi_write(tp, rbmip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), - XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, + 0, &first, mp->m_sb.sb_rbmblocks, map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime bitmap failed"), @@ -704,9 +704,9 @@ rtinit( xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; - error = libxfs_bmapi(tp, rsumip, bno, + error = libxfs_bmapi_write(tp, rsumip, bno, (xfs_extlen_t)(nsumblocks - bno), - XFS_BMAPI_WRITE, &first, nsumblocks, + 0, &first, nsumblocks, map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime summary failed"), diff --git a/repair/dir.c b/repair/dir.c index 01c8f10..daca17d 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -17,6 +17,7 @@ */ #include +#include #include "avl.h" #include "globals.h" #include "agheader.h" diff --git a/repair/dir2.c b/repair/dir2.c index 7a614a8..c455c83 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -79,182 +79,36 @@ dir2_is_badino( * Multibuffer handling. * V2 directory blocks can be noncontiguous, needing multiple buffers. */ -static xfs_dabuf_t * +static struct xfs_buf * da_read_buf( xfs_mount_t *mp, int nex, bmap_ext_t *bmp) { - xfs_buf_t *bp; - xfs_buf_t *bparray[4]; - xfs_buf_t **bplist; - xfs_dabuf_t *dabuf; +#define MAP_ARRAY_SZ 4 + struct xfs_buf_map map_array[MAP_ARRAY_SZ]; + struct xfs_buf_map *map; + struct xfs_buf *bp; int i; - int off; - if (nex > (sizeof(bparray)/sizeof(xfs_buf_t *))) { - bplist = calloc(nex, sizeof(*bplist)); - if (bplist == NULL) { + if (nex > MAP_ARRAY_SZ) { + map = calloc(nex, sizeof(*map)); + if (map == NULL) { do_error(_("couldn't malloc dir2 buffer list\n")); exit(1); } - } - else { + } else { /* common case avoids calloc/free */ - bplist = bparray; + map = map_array; } for (i = 0; i < nex; i++) { - pftrace("about to read off %llu (len = %d)", - (long long)XFS_FSB_TO_DADDR(mp, bmp[i].startblock), - XFS_FSB_TO_BB(mp, bmp[i].blockcount)); - - bplist[i] = libxfs_readbuf(mp->m_dev, - XFS_FSB_TO_DADDR(mp, bmp[i].startblock), - XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0); - if (!bplist[i]) { - nex = i; - goto failed; - } - - pftrace("readbuf %p (%llu, %d)", bplist[i], - (long long)XFS_BUF_ADDR(bplist[i]), - XFS_BUF_COUNT(bplist[i])); - } - dabuf = malloc(XFS_DA_BUF_SIZE(nex)); - if (dabuf == NULL) { - do_error(_("couldn't malloc dir2 buffer header\n")); - exit(1); - } - dabuf->dirty = 0; - dabuf->nbuf = nex; - if (nex == 1) { - bp = bplist[0]; - dabuf->bbcount = (short)BTOBB(XFS_BUF_COUNT(bp)); - dabuf->data = XFS_BUF_PTR(bp); - dabuf->bps[0] = bp; - } else { - for (i = 0, dabuf->bbcount = 0; i < nex; i++) { - dabuf->bps[i] = bp = bplist[i]; - dabuf->bbcount += BTOBB(XFS_BUF_COUNT(bp)); - } - dabuf->data = malloc(BBTOB(dabuf->bbcount)); - if (dabuf->data == NULL) { - do_error(_("couldn't malloc dir2 buffer data\n")); - exit(1); - } - for (i = off = 0; i < nex; i++, off += XFS_BUF_COUNT(bp)) { - bp = bplist[i]; - memmove((char *)dabuf->data + off, XFS_BUF_PTR(bp), - XFS_BUF_COUNT(bp)); - } - } - if (bplist != bparray) - free(bplist); - return dabuf; -failed: - for (i = 0; i < nex; i++) - libxfs_putbuf(bplist[i]); - if (bplist != bparray) - free(bplist); - return NULL; -} - -static void -da_buf_clean( - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - int i; - int off; - - if (dabuf->dirty) { - dabuf->dirty = 0; - for (i=off=0; i < dabuf->nbuf; i++, off += XFS_BUF_COUNT(bp)) { - bp = dabuf->bps[i]; - memmove(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } -} - -static void -da_buf_done( - xfs_dabuf_t *dabuf) -{ - da_buf_clean(dabuf); - if (dabuf->nbuf > 1) - free(dabuf->data); - free(dabuf); -} - -static int -da_bwrite( - xfs_mount_t *mp, - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int e; - int error; - int i; - int nbuf; - int off; - - if ((nbuf = dabuf->nbuf) == 1) { - bplist = &bp; - bp = dabuf->bps[0]; - } else { - bplist = malloc(nbuf * sizeof(*bplist)); - if (bplist == NULL) { - do_error(_("couldn't malloc dir2 buffer list\n")); - exit(1); - } - memmove(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - for (i = off = 0; i < nbuf; i++, off += XFS_BUF_COUNT(bp)) { - bp = bplist[i]; - memmove(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } - da_buf_done(dabuf); - for (i = error = 0; i < nbuf; i++) { - e = libxfs_writebuf(bplist[i], 0); - if (e) - error = e; - } - if (bplist != &bp) - free(bplist); - return error; -} - -static void -da_brelse( - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - if ((nbuf = dabuf->nbuf) == 1) { - bplist = &bp; - bp = dabuf->bps[0]; - } else { - bplist = malloc(nbuf * sizeof(*bplist)); - if (bplist == NULL) { - do_error(_("couldn't malloc dir2 buffer list\n")); - exit(1); - } - memmove(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - da_buf_done(dabuf); - for (i = 0; i < nbuf; i++) { - pftrace("putbuf %p (%llu)", bplist[i], - (long long)XFS_BUF_ADDR(bplist[i])); - libxfs_putbuf(bplist[i]); + map[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock); + map[i].bm_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount); } - if (bplist != &bp) - free(bplist); + bp = libxfs_readbuf_map(mp->m_dev, map, nex, 0); + if (map != map_array) + free(map); + return bp; } /* @@ -270,7 +124,7 @@ traverse_int_dir2block(xfs_mount_t *mp, { bmap_ext_t *bmp; xfs_dablk_t bno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int i; int nex; xfs_da_blkinfo_t *info; @@ -307,7 +161,7 @@ _("can't read block %u for directory inode %" PRIu64 "\n"), goto error_out; } - info = bp->data; + info = bp->b_addr; if (be16_to_cpu(info->magic) == XFS_DIR2_LEAFN_MAGIC) { if ( i != -1 ) { @@ -316,10 +170,10 @@ _("found non-root LEAFN node in inode %" PRIu64 " bno = %u\n"), da_cursor->ino, bno); } *rbno = 0; - da_brelse(bp); + libxfs_putbuf(bp); return(1); } else if (be16_to_cpu(info->magic) != XFS_DA_NODE_MAGIC) { - da_brelse(bp); + libxfs_putbuf(bp); do_warn( _("bad dir magic number 0x%x in inode %" PRIu64 " bno = %u\n"), be16_to_cpu(info->magic), @@ -328,7 +182,7 @@ _("bad dir magic number 0x%x in inode %" PRIu64 " bno = %u\n"), } node = (xfs_da_intnode_t*)info; if (be16_to_cpu(node->hdr.count) > mp->m_dir_node_ents) { - da_brelse(bp); + libxfs_putbuf(bp); do_warn( _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), da_cursor->ino, be16_to_cpu(node->hdr.count), @@ -344,7 +198,7 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), da_cursor->i do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), da_cursor->ino); - da_brelse(bp); + libxfs_putbuf(bp); i = -1; goto error_out; } @@ -355,7 +209,7 @@ _("bad header depth for directory inode %" PRIu64 "\n"), do_warn( _("bad directory btree for directory inode %" PRIu64 "\n"), da_cursor->ino); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } } @@ -380,7 +234,7 @@ _("bad directory btree for directory inode %" PRIu64 "\n"), error_out: while (i > 1 && i <= da_cursor->active) { - da_brelse(da_cursor->level[i].bp); + libxfs_putbuf(da_cursor->level[i].bp); i++; } @@ -409,7 +263,7 @@ release_dir2_cursor_int(xfs_mount_t *mp, } ASSERT(error != 0); - da_brelse(cursor->level[level].bp); + libxfs_putbuf(cursor->level[level].bp); cursor->level[level].bp = NULL; } @@ -458,7 +312,7 @@ verify_final_dir2_path(xfs_mount_t *mp, * in the block which should be the final (rightmost) entry */ entry = cursor->level[this_level].index; - node = (xfs_da_intnode_t *)(cursor->level[this_level].bp->data); + node = (xfs_da_intnode_t *)(cursor->level[this_level].bp->b_addr); /* * check internal block consistency on this level -- ensure * that all entries are used, encountered and expected hashvals @@ -530,9 +384,9 @@ _("would correct bad hashval in non-leaf dir block\n" (cursor->level[this_level].dirty && !no_modify)); if (cursor->level[this_level].dirty && !no_modify) - da_bwrite(mp, cursor->level[this_level].bp); + libxfs_writebuf(cursor->level[this_level].bp, 0); else - da_brelse(cursor->level[this_level].bp); + libxfs_putbuf(cursor->level[this_level].bp); cursor->level[this_level].bp = NULL; @@ -598,7 +452,7 @@ verify_dir2_path(xfs_mount_t *mp, xfs_da_intnode_t *node; xfs_da_intnode_t *newnode; xfs_dablk_t dabno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int bad; int entry; int this_level = p_level + 1; @@ -611,7 +465,7 @@ verify_dir2_path(xfs_mount_t *mp, * should be processed now in this level. */ entry = cursor->level[this_level].index; - node = cursor->level[this_level].bp->data; + node = cursor->level[this_level].bp->b_addr; /* * if this block is out of entries, validate this @@ -665,7 +519,7 @@ _("can't read block %u for directory inode %" PRIu64 "\n"), return(1); } - newnode = bp->data; + newnode = bp->b_addr; /* * verify magic number and back pointer, sanity-check * entry count, verify level @@ -700,7 +554,7 @@ _("bad level %d in block %u for directory inode %" PRIu64 "\n"), bad++; } if (bad) { - da_brelse(bp); + libxfs_putbuf(bp); return(1); } /* @@ -711,9 +565,9 @@ _("bad level %d in block %u for directory inode %" PRIu64 "\n"), (cursor->level[this_level].dirty && !no_modify)); if (cursor->level[this_level].dirty && !no_modify) - da_bwrite(mp, cursor->level[this_level].bp); + libxfs_writebuf(cursor->level[this_level].bp, 0); else - da_brelse(cursor->level[this_level].bp); + libxfs_putbuf(cursor->level[this_level].bp); cursor->level[this_level].bp = bp; cursor->level[this_level].dirty = 0; cursor->level[this_level].bno = dabno; @@ -785,21 +639,19 @@ process_sf_dir2_fixi8( memmove(oldsfp, newsfp, oldsize); newsfp->hdr.count = oldsfp->hdr.count; newsfp->hdr.i8count = 0; - ino = xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(newsfp, &ino, &newsfp->hdr.parent); - oldsfep = xfs_dir2_sf_firstentry(oldsfp); - newsfep = xfs_dir2_sf_firstentry(newsfp); + ino = xfs_dir2_sf_get_parent_ino(&sfp->hdr); + xfs_dir2_sf_put_parent_ino(&newsfp->hdr, ino); + oldsfep = xfs_dir2_sf_firstentry(&oldsfp->hdr); + newsfep = xfs_dir2_sf_firstentry(&newsfp->hdr); while ((int)((char *)oldsfep - (char *)oldsfp) < oldsize) { newsfep->namelen = oldsfep->namelen; xfs_dir2_sf_put_offset(newsfep, xfs_dir2_sf_get_offset(oldsfep)); memmove(newsfep->name, oldsfep->name, newsfep->namelen); - ino = xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(newsfp, &ino, - xfs_dir2_sf_inumberp(newsfep)); - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep); - newsfep = xfs_dir2_sf_nextentry(newsfp, newsfep); + ino = xfs_dir2_sfe_get_ino(&oldsfp->hdr, oldsfep); + xfs_dir2_sfe_put_ino(&newsfp->hdr, newsfep, ino); + oldsfep = xfs_dir2_sf_nextentry(&oldsfp->hdr, oldsfep); + newsfep = xfs_dir2_sf_nextentry(&newsfp->hdr, newsfep); } *next_sfep = newsfep; free(oldsfp); @@ -818,13 +670,13 @@ process_sf_dir2_fixoff( xfs_dir2_sf_t *sfp; sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); - sfep = xfs_dir2_sf_firstentry(sfp); + sfep = xfs_dir2_sf_firstentry(&sfp->hdr); offset = XFS_DIR2_DATA_FIRST_OFFSET; for (i = 0; i < sfp->hdr.count; i++) { xfs_dir2_sf_put_offset(sfep, offset); offset += xfs_dir2_data_entsize(sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir2_sf_nextentry(&sfp->hdr, sfep); } } @@ -881,13 +733,12 @@ process_sf_dir2( /* * Initialize i8 based on size of parent inode number. */ - i8 = (xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent) - > XFS_DIR2_MAX_SHORT_INUM); + i8 = (xfs_dir2_sf_get_parent_ino(&sfp->hdr) > XFS_DIR2_MAX_SHORT_INUM); /* * check for bad entry count */ - if (num_entries * xfs_dir2_sf_entsize_byname(sfp, 1) + + if (num_entries * xfs_dir2_sf_entsize(&sfp->hdr, 1) + xfs_dir2_sf_hdr_size(0) > max_size || num_entries == 0) num_entries = 0xFF; @@ -895,7 +746,7 @@ process_sf_dir2( * run through entries, stop at first bad entry, don't need * to check for .. since that's encoded in its own field */ - sfep = next_sfep = xfs_dir2_sf_firstentry(sfp); + sfep = next_sfep = xfs_dir2_sf_firstentry(&sfp->hdr); for (i = 0; i < num_entries && ino_dir_size > (char *)next_sfep - (char *)sfp; i++) { @@ -903,7 +754,7 @@ process_sf_dir2( sfep = next_sfep; junkit = 0; bad_sfnamelen = 0; - lino = xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + lino = xfs_dir2_sfe_get_ino(&sfp->hdr, sfep); /* * if entry points to self, junk it since only '.' or '..' * should do that and shortform dirs don't contain either @@ -1017,7 +868,7 @@ _("zero length entry in shortform dir %" PRIu64 ""), break; } } else if ((__psint_t) sfep - (__psint_t) sfp + - xfs_dir2_sf_entsize_byentry(sfp, sfep) + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ino_dir_size) { bad_sfnamelen = 1; @@ -1105,8 +956,8 @@ _("entry contains offset out of order in shortform dir %" PRIu64 "\n"), name[namelen] = '\0'; if (!no_modify) { - tmp_elen = - xfs_dir2_sf_entsize_byentry(sfp, sfep); + tmp_elen = xfs_dir2_sf_entsize(&sfp->hdr, + sfep->namelen); be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; @@ -1158,11 +1009,9 @@ _("would have junked entry \"%s\" in directory inode %" PRIu64 "\n"), */ next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep - + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize_byentry(sfp, - sfep) - : xfs_dir2_sf_entsize_byname(sfp, - namelen))) + + ((!bad_sfnamelen) + ? xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) + : xfs_dir2_sf_entsize(&sfp->hdr, namelen))) : tmp_sfep; } @@ -1242,7 +1091,7 @@ _("corrected entry offsets in directory %" PRIu64 "\n"), /* * check parent (..) entry */ - *parent = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + *parent = xfs_dir2_sf_get_parent_ino(&sfp->hdr); /* * if parent entry is bogus, null it out. we'll fix it later . @@ -1256,7 +1105,7 @@ _("bogus .. inode number (%" PRIu64 ") in directory inode %" PRIu64 ", "), if (!no_modify) { do_warn(_("clearing inode number\n")); - xfs_dir2_sf_put_inumber(sfp, &zero, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, zero); *dino_dirty = 1; *repair = 1; } else { @@ -1271,7 +1120,7 @@ _("bogus .. inode number (%" PRIu64 ") in directory inode %" PRIu64 ", "), _("corrected root directory %" PRIu64 " .. entry, was %" PRIu64 ", now %" PRIu64 "\n"), ino, *parent, ino); *parent = ino; - xfs_dir2_sf_put_inumber(sfp, parent, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, ino); *dino_dirty = 1; *repair = 1; } else { @@ -1291,7 +1140,7 @@ _("bad .. entry in directory inode %" PRIu64 ", points to self, "), if (!no_modify) { do_warn(_("clearing inode number\n")); - xfs_dir2_sf_put_inumber(sfp, &zero, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, zero); *dino_dirty = 1; *repair = 1; } else { @@ -1314,11 +1163,12 @@ process_dir2_data( int ino_discovery, char *dirname, /* directory pathname */ xfs_ino_t *parent, /* out - NULLFSINO if entry not exist */ - xfs_dabuf_t *bp, + struct xfs_buf *bp, int *dot, /* out - 1 if there is a dot, else 0 */ int *dotdot, /* out - 1 if there's a dotdot, else 0 */ xfs_dablk_t da_bno, - char *endptr) + char *endptr, + int *dirty) { int badbest; xfs_dir2_data_free_t *bf; @@ -1338,7 +1188,7 @@ process_dir2_data( char *ptr; xfs_ino_t ent_ino; - d = bp->data; + d = bp->b_addr; bf = d->hdr.bestfree; ptr = (char *)d->u; badbest = lastfree = freeseen = 0; @@ -1372,7 +1222,7 @@ process_dir2_data( (char *)dup - (char *)d) break; badbest |= lastfree != 0; - dfp = xfs_dir2_data_freefind(d, dup); + dfp = xfs_dir2_data_freefind(&d->hdr, dup); if (dfp) { i = dfp - bf; badbest |= (freeseen & (1 << i)) != 0; @@ -1515,7 +1365,7 @@ _("\tclearing inode number in entry at offset %" PRIdPTR "...\n"), (intptr_t)ptr - (intptr_t)d); dep->inumber = cpu_to_be64(BADFSINO); ent_ino = BADFSINO; - bp->dirty = 1; + *dirty = 1; } else { do_warn( _("\twould clear inode number in entry at offset %" PRIdPTR "...\n"), @@ -1541,7 +1391,7 @@ _("entry at block %u offset %" PRIdPTR " in directory inode %" PRIu64 " has ille */ if (!no_modify && ent_ino == BADFSINO) { dep->name[0] = '/'; - bp->dirty = 1; + *dirty = 1; junkit = 0; } /* @@ -1577,7 +1427,7 @@ _("bad .. entry in root directory inode %" PRIu64 ", was %" PRIu64 ": "), if (!no_modify) { do_warn(_("correcting\n")); dep->inumber = cpu_to_be64(ino); - bp->dirty = 1; + *dirty = 1; } else { do_warn(_("would correct\n")); } @@ -1609,7 +1459,7 @@ _("bad . entry in directory inode %" PRIu64 ", was %" PRIu64 ": "), if (!no_modify) { do_warn(_("correcting\n")); dep->inumber = cpu_to_be64(ino); - bp->dirty = 1; + *dirty = 1; } else { do_warn(_("would correct\n")); } @@ -1636,7 +1486,7 @@ _("entry \"%*.*s\" in directory inode %" PRIu64 " points to self: "), if (junkit) { if (!no_modify) { dep->name[0] = '/'; - bp->dirty = 1; + *dirty = 1; do_warn(_("clearing entry\n")); } else { do_warn(_("would clear entry\n")); @@ -1656,8 +1506,8 @@ _("bad bestfree table in block %u in directory inode %" PRIu64 ": "), da_bno, ino); if (!no_modify) { do_warn(_("repairing table\n")); - libxfs_dir2_data_freescan(mp, d, &i); - bp->dirty = 1; + libxfs_dir2_data_freescan(mp, &d->hdr, &i); + *dirty = 1; } else { do_warn(_("would repair table\n")); } @@ -1686,11 +1536,12 @@ process_block_dir2( xfs_dir2_block_t *block; xfs_dir2_leaf_entry_t *blp; bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_block_tail_t *btp; int nex; int rval; bmap_ext_t lbmp; + int dirty = 0; *repair = *dot = *dotdot = 0; *parent = NULLFSINO; @@ -1713,7 +1564,7 @@ _("can't read block %u for directory inode %" PRIu64 "\n"), /* * Verify the block */ - block = bp->data; + block = bp->b_addr; if (be32_to_cpu(block->hdr.magic) != XFS_DIR2_BLOCK_MAGIC) do_warn( _("bad directory block magic # %#x in block %u for directory inode %" PRIu64 "\n"), @@ -1722,7 +1573,7 @@ _("bad directory block magic # %#x in block %u for directory inode %" PRIu64 "\n * process the data area * this also checks & fixes the bestfree */ - btp = xfs_dir2_block_tail_p(mp, block); + btp = xfs_dir2_block_tail_p(mp, &block->hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Don't let this go past the end of the block. @@ -1730,12 +1581,12 @@ _("bad directory block magic # %#x in block %u for directory inode %" PRIu64 "\n if ((char *)blp > (char *)btp) blp = (xfs_dir2_leaf_entry_t *)btp; rval = process_dir2_data(mp, ino, dip, ino_discovery, dirname, parent, - bp, dot, dotdot, mp->m_dirdatablk, (char *)blp); - if (bp->dirty && !no_modify) { + bp, dot, dotdot, mp->m_dirdatablk, (char *)blp, &dirty); + if (dirty && !no_modify) { *repair = 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); return rval; } @@ -1794,7 +1645,7 @@ process_leaf_level_dir2( int *repair) { bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int buf_dirty; xfs_dahash_t current_hashval; xfs_dablk_t da_bno; @@ -1839,7 +1690,7 @@ _("can't read file block %u for directory inode %" PRIu64 "\n"), da_bno, ino); goto error_out; } - leaf = bp->data; + leaf = bp->b_addr; /* * Check magic number for leaf directory btree block. */ @@ -1849,7 +1700,7 @@ _("can't read file block %u for directory inode %" PRIu64 "\n"), _("bad directory leaf magic # %#x for directory inode %" PRIu64 " block %u\n"), be16_to_cpu(leaf->hdr.info.magic), ino, da_bno); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } buf_dirty = 0; @@ -1859,7 +1710,7 @@ _("bad directory leaf magic # %#x for directory inode %" PRIu64 " block %u\n"), */ if (process_leaf_block_dir2(mp, leaf, da_bno, ino, current_hashval, &greatest_hashval)) { - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } /* @@ -1878,14 +1729,14 @@ _("bad directory leaf magic # %#x for directory inode %" PRIu64 " block %u\n"), do_warn( _("bad sibling back pointer for block %u in directory inode %" PRIu64 "\n"), da_bno, ino); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } prev_bno = da_bno; da_bno = be32_to_cpu(leaf->hdr.info.forw); if (da_bno != 0) { if (verify_dir2_path(mp, da_cursor, 0)) { - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } } @@ -1893,9 +1744,9 @@ _("bad sibling back pointer for block %u in directory inode %" PRIu64 "\n"), ASSERT(buf_dirty == 0 || (buf_dirty && !no_modify)); if (buf_dirty && !no_modify) { *repair = 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); } while (da_bno != 0); if (verify_final_dir2_path(mp, da_cursor, 0)) { /* @@ -1988,7 +1839,7 @@ process_leaf_node_dir2( int isnode) /* node directory not leaf */ { bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_data_t *data; xfs_dfiloff_t dbno; int good; @@ -1997,6 +1848,7 @@ process_leaf_node_dir2( int nex; int t; bmap_ext_t lbmp; + int dirty = 0; *repair = *dot = *dotdot = good = 0; *parent = NULLFSINO; @@ -2023,21 +1875,21 @@ _("can't read block %" PRIu64 " for directory inode %" PRIu64 "\n"), dbno, ino); continue; } - data = bp->data; + data = bp->b_addr; if (be32_to_cpu(data->hdr.magic) != XFS_DIR2_DATA_MAGIC) do_warn( _("bad directory block magic # %#x in block %" PRIu64 " for directory inode %" PRIu64 "\n"), be32_to_cpu(data->hdr.magic), dbno, ino); i = process_dir2_data(mp, ino, dip, ino_discovery, dirname, parent, bp, dot, dotdot, (xfs_dablk_t)dbno, - (char *)data + mp->m_dirblksize); + (char *)data + mp->m_dirblksize, &dirty); if (i == 0) good++; - if (bp->dirty && !no_modify) { + if (dirty && !no_modify) { *repair = 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); } if (good == 0) return 1; diff --git a/repair/dir2.h b/repair/dir2.h index a88579f..63e35d4 100644 --- a/repair/dir2.h +++ b/repair/dir2.h @@ -23,6 +23,32 @@ struct blkmap; struct bmap_ext; /* + * generic dir2 structures used by xfs_repair. + * XXX: shared with xfsdb + */ +typedef union { + xfs_dir2_data_entry_t entry; + xfs_dir2_data_unused_t unused; +} xfs_dir2_data_union_t; + +typedef struct xfs_dir2_data { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ + xfs_dir2_data_union_t u[1]; +} xfs_dir2_data_t; + +typedef struct xfs_dir2_block { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_union_t u[1]; + xfs_dir2_leaf_entry_t leaf[1]; + xfs_dir2_block_tail_t tail; +} xfs_dir2_block_t; + +typedef struct xfs_dir2_sf { + xfs_dir2_sf_hdr_t hdr; /* shortform header */ + xfs_dir2_sf_entry_t list[1]; /* shortform entries */ +} xfs_dir2_sf_t; + +/* * the cursor gets passed up and down the da btree processing * routines. The interior block processing routines use the * cursor to determine if the pointers to and from the preceding @@ -42,7 +68,7 @@ struct bmap_ext; * Currently, we just trash it. */ typedef struct dir2_level_state { - xfs_dabuf_t *bp; /* block bp */ + xfs_buf_t *bp; /* block bp */ xfs_dablk_t bno; /* file block number */ xfs_dahash_t hashval; /* last verified hashval */ int index; /* current index in block */ diff --git a/repair/phase6.c b/repair/phase6.c index cbe0b35..00f70a2 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -17,6 +17,7 @@ */ #include +#include #include "avl.h" #include "globals.h" #include "agheader.h" @@ -484,9 +485,9 @@ mk_rbmino(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; - error = libxfs_bmapi(tp, ip, bno, + error = libxfs_bmapi_write(tp, ip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), - XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, + 0, &first, mp->m_sb.sb_rbmblocks, map, &nmap, &flist); if (error) { do_error( @@ -542,7 +543,7 @@ fill_rbmino(xfs_mount_t *mp) * fill the file one block at a time */ nmap = 1; - error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, + error = libxfs_bmapi_write(tp, ip, bno, 1, 0, &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( @@ -555,7 +556,7 @@ fill_rbmino(xfs_mount_t *mp) error = libxfs_trans_read_buf( mp, tp, mp->m_dev, XFS_FSB_TO_DADDR(mp, map.br_startblock), - XFS_FSB_TO_BB(mp, 1), 1, &bp); + XFS_FSB_TO_BB(mp, 1), 1, &bp, NULL); if (error) { do_warn( @@ -611,7 +612,7 @@ fill_rsumino(xfs_mount_t *mp) * fill the file one block at a time */ nmap = 1; - error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, + error = libxfs_bmapi_write(tp, ip, bno, 1, 0, &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( @@ -624,7 +625,7 @@ fill_rsumino(xfs_mount_t *mp) error = libxfs_trans_read_buf( mp, tp, mp->m_dev, XFS_FSB_TO_DADDR(mp, map.br_startblock), - XFS_FSB_TO_BB(mp, 1), 1, &bp); + XFS_FSB_TO_BB(mp, 1), 1, &bp, NULL); if (error) { do_warn( @@ -723,10 +724,9 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; - error = libxfs_bmapi(tp, ip, bno, + error = libxfs_bmapi_write(tp, ip, bno, (xfs_extlen_t)(nsumblocks - bno), - XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist); + 0, &first, nsumblocks, map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime summary inode, error = %d\n"), @@ -1139,7 +1139,6 @@ map_first_dblock_fsbno(xfs_mount_t *mp, xfs_inode_t *ip, xfs_dablk_t *bno) { - xfs_fsblock_t fblock; xfs_da_intnode_t *node; xfs_buf_t *bp; xfs_dablk_t da_bno; @@ -1159,13 +1158,11 @@ map_first_dblock_fsbno(xfs_mount_t *mp, *bno = 0; i = -1; node = NULL; - fblock = NULLFSBLOCK; ftype = _("dir"); nmap = 1; - error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error = libxfs_bmapi_read(ip, (xfs_fileoff_t) da_bno, 1, + &map, &nmap, 0); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1235,9 +1232,8 @@ _("bad dir/attr magic number in inode %" PRIu64 ", file bno = %u, fsbno = %" PRI bp = NULL; nmap = 1; - error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error = libxfs_bmapi_read(ip, (xfs_fileoff_t) da_bno, 1, + &map, &nmap, 0); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1549,7 +1545,6 @@ longform_dir_entry_check(xfs_mount_t *mp, xfs_dir_leafblock_t *leaf; xfs_buf_t *bp; xfs_dfsbno_t fsbno; - xfs_fsblock_t fblock; xfs_dablk_t da_bno; int dirty; int nmap; @@ -1559,7 +1554,6 @@ longform_dir_entry_check(xfs_mount_t *mp, char *ftype; da_bno = 0; - fblock = NULLFSBLOCK; *need_dot = 1; ftype = _("dir"); @@ -1621,9 +1615,8 @@ _("bad magic # (0x%x) for dir ino %" PRIu64 " leaf block (bno %u fsbno %" PRIu64 if (da_bno != 0) { nmap = 1; - error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t)da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error = libxfs_bmapi_read(ip, (xfs_fileoff_t)da_bno, 1, + &map, &nmap, 0); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1790,7 +1783,7 @@ dir2_kill_block( xfs_mount_t *mp, xfs_inode_t *ip, xfs_dablk_t da_bno, - xfs_dabuf_t *bp) + struct xfs_buf *bp) { xfs_da_args_t args; int committed; @@ -1808,7 +1801,7 @@ dir2_kill_block( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - libxfs_da_bjoin(tp, bp); + libxfs_trans_bjoin(tp, bp); memset(&args, 0, sizeof(args)); xfs_bmap_init(&flist, &firstblock); args.dp = ip; @@ -1840,7 +1833,7 @@ longform_dir2_entry_check_data( int *need_dot, ino_tree_node_t *current_irec, int current_ino_offset, - xfs_dabuf_t **bpp, + struct xfs_buf **bpp, dir_hash_tab_t *hashtab, freetab_t **freetabp, xfs_dablk_t da_bno, @@ -1848,7 +1841,7 @@ longform_dir2_entry_check_data( { xfs_dir2_dataptr_t addr; xfs_dir2_leaf_entry_t *blp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_block_tail_t *btp; int committed; xfs_dir2_data_t *d; @@ -1877,14 +1870,14 @@ longform_dir2_entry_check_data( int wantmagic; bp = *bpp; - d = bp->data; + d = bp->b_addr; ptr = (char *)d->u; nbad = 0; needscan = needlog = 0; junkit = 0; freetab = *freetabp; if (isblock) { - btp = xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + btp = xfs_dir2_block_tail_p(mp, (struct xfs_dir2_data_hdr *)d); blp = xfs_dir2_block_leaf_p(btp); endptr = (char *)blp; if (endptr > (char *)btp) @@ -1972,7 +1965,7 @@ longform_dir2_entry_check_data( dir2_kill_block(mp, ip, da_bno, bp); } else { do_warn(_("would junk block\n")); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); } freetab->ents[db].v = NULLDATAOFF; *bpp = NULL; @@ -1990,8 +1983,8 @@ longform_dir2_entry_check_data( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - libxfs_da_bjoin(tp, bp); - libxfs_da_bhold(tp, bp); + libxfs_trans_bjoin(tp, bp); + libxfs_trans_bhold(tp, bp); xfs_bmap_init(&flist, &firstblock); if (be32_to_cpu(d->hdr.magic) != wantmagic) { do_warn( @@ -2256,7 +2249,7 @@ _("entry \"%s\" in dir inode %" PRIu64 " inconsistent with .. value (%" PRIu64 " } *num_illegal += nbad; if (needscan) - libxfs_dir2_data_freescan(mp, d, &needlog); + libxfs_dir2_data_freescan(mp, &d->hdr, &needlog); if (needlog) libxfs_dir2_data_log_header(tp, bp); libxfs_bmap_finish(&tp, &flist, &committed); @@ -2277,7 +2270,7 @@ longform_dir2_check_leaf( { int badtail; __be16 *bestsp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dablk_t da_bno; int i; xfs_dir2_leaf_t *leaf; @@ -2285,13 +2278,13 @@ longform_dir2_check_leaf( int seeval; da_bno = mp->m_dirleafblk; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, NULL)) { do_error( _("can't read block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); /* NOTREACHED */ } - leaf = bp->data; + leaf = bp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(leaf->hdr.info.magic) != XFS_DIR2_LEAF1_MAGIC || @@ -2299,21 +2292,21 @@ longform_dir2_check_leaf( be32_to_cpu(leaf->hdr.info.back) || be16_to_cpu(leaf->hdr.count) < be16_to_cpu(leaf->hdr.stale) || - be16_to_cpu(leaf->hdr.count) > + be16_to_cpu(leaf->hdr.count) > xfs_dir2_max_leaf_ents(mp) || - (char *)&leaf->ents[be16_to_cpu( + (char *)&leaf->ents[be16_to_cpu( leaf->hdr.count)] > (char *)bestsp) { do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } seeval = dir_hash_see_all(hashtab, leaf->ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); if (dir_hash_check(hashtab, ip, seeval)) { - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } badtail = freetab->nents != be32_to_cpu(ltp->bestcount); @@ -2325,10 +2318,10 @@ longform_dir2_check_leaf( do_warn( _("leaf block %u for directory inode %" PRIu64 " bad tail\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 0; } @@ -2343,7 +2336,7 @@ longform_dir2_check_node( dir_hash_tab_t *hashtab, freetab_t *freetab) { - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dablk_t da_bno; xfs_dir2_db_t fdb; xfs_dir2_free_t *free; @@ -2359,25 +2352,25 @@ longform_dir2_check_node( next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, + XFS_DATA_FORK, NULL)) { do_warn( _("can't read leaf block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); return 1; } - leaf = bp->data; + leaf = bp->b_addr; if (be16_to_cpu(leaf->hdr.info.magic) != XFS_DIR2_LEAFN_MAGIC) { if (be16_to_cpu(leaf->hdr.info.magic) == XFS_DA_NODE_MAGIC) { - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); continue; } do_warn( _("unknown magic number %#x for block %u in directory inode %" PRIu64 "\n"), be16_to_cpu(leaf->hdr.info.magic), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } if (be16_to_cpu(leaf->hdr.count) > xfs_dir2_max_leaf_ents(mp) || @@ -2386,13 +2379,13 @@ longform_dir2_check_node( do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } seeval = dir_hash_see_all(hashtab, leaf->ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); if (seeval != DIR_HASH_CK_OK) return 1; } @@ -2405,25 +2398,25 @@ longform_dir2_check_node( next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, + XFS_DATA_FORK, NULL)) { do_warn( _("can't read freespace block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); return 1; } - free = bp->data; + free = bp->b_addr; fdb = xfs_dir2_da_to_db(mp, da_bno); if (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC || be32_to_cpu(free->hdr.firstdb) != (fdb - XFS_DIR2_FREE_FIRSTDB(mp)) * - XFS_DIR2_MAX_FREE_BESTS(mp) || + xfs_dir2_free_max_bests(mp) || be32_to_cpu(free->hdr.nvalid) < be32_to_cpu(free->hdr.nused)) { do_warn( _("free block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } for (i = used = 0; i < be32_to_cpu(free->hdr.nvalid); i++) { @@ -2431,11 +2424,11 @@ longform_dir2_check_node( freetab->nents || freetab->ents[i + be32_to_cpu( free->hdr.firstdb)].v != - be16_to_cpu(free->bests[i])) { + be16_to_cpu(free->bests[i])) { do_warn( _("free block %u entry %i for directory ino %" PRIu64 " bad\n"), da_bno, i, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } used += be16_to_cpu(free->bests[i]) != NULLDATAOFF; @@ -2445,10 +2438,10 @@ longform_dir2_check_node( do_warn( _("free block %u for directory inode %" PRIu64 " bad nused\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); } for (i = 0; i < freetab->nents; i++) { if ((freetab->ents[i].s == 0) && @@ -2478,7 +2471,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, dir_hash_tab_t *hashtab) { xfs_dir2_block_t *block; - xfs_dabuf_t **bplist; + struct xfs_buf **bplist; xfs_dablk_t da_bno; freetab_t *freetab; int num_bps; @@ -2505,7 +2498,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, freetab->ents[i].s = 0; } num_bps = freetab->naents; - bplist = calloc(num_bps, sizeof(xfs_dabuf_t*)); + bplist = calloc(num_bps, sizeof(struct xfs_buf*)); /* is this a block, leaf, or node directory? */ libxfs_dir2_isblock(NULL, ip, &isblock); libxfs_dir2_isleaf(NULL, ip, &isleaf); @@ -2521,14 +2514,14 @@ longform_dir2_entry_check(xfs_mount_t *mp, if (db >= num_bps) { /* more data blocks than expected */ num_bps = db + 1; - bplist = realloc(bplist, num_bps * sizeof(xfs_dabuf_t*)); + bplist = realloc(bplist, num_bps * sizeof(struct xfs_buf*)); if (!bplist) do_error( _("realloc failed in longform_dir2_entry_check (%zu bytes)\n"), - num_bps * sizeof(xfs_dabuf_t*)); + num_bps * sizeof(struct xfs_buf*)); } - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], + XFS_DATA_FORK, NULL)) { do_warn( _("can't read data block %u for directory inode %" PRIu64 "\n"), da_bno, ino); @@ -2547,8 +2540,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, xfs_dir2_block_tail_t *btp; xfs_dir2_leaf_entry_t *blp; - block = bplist[0]->data; - btp = xfs_dir2_block_tail_p(mp, block); + block = bplist[0]->b_addr; + btp = xfs_dir2_block_tail_p(mp, &block->hdr); blp = xfs_dir2_block_leaf_p(btp); seeval = dir_hash_see_all(hashtab, blp, be32_to_cpu(btp->count), @@ -2567,14 +2560,14 @@ longform_dir2_entry_check(xfs_mount_t *mp, dir_hash_dup_names(hashtab); for (i = 0; i < freetab->naents; i++) if (bplist[i]) - libxfs_da_brelse(NULL, bplist[i]); + libxfs_putbuf(bplist[i]); longform_dir2_rebuild(mp, ino, ip, irec, ino_offset, hashtab); *num_illegal = 0; *need_dot = 0; } else { for (i = 0; i < freetab->naents; i++) if (bplist[i]) - libxfs_da_brelse(NULL, bplist[i]); + libxfs_putbuf(bplist[i]); } free(bplist); @@ -2931,7 +2924,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, do_warn( _("setting .. in sf dir inode %" PRIu64 " to %" PRIu64 "\n"), ino, parent); - xfs_dir2_sf_put_inumber(sfp, &parent, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, parent); *ino_dirty = 1; } return; @@ -2948,15 +2941,14 @@ shortform_dir2_entry_check(xfs_mount_t *mp, /* * Initialise i8 counter -- the parent inode number counts as well. */ - i8 = (xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent) > - XFS_DIR2_MAX_SHORT_INUM); + i8 = xfs_dir2_sf_get_parent_ino(&sfp->hdr) > XFS_DIR2_MAX_SHORT_INUM; /* * now run through entries, stop at first bad entry, don't need * to skip over '..' since that's encoded in its own field and * no need to worry about '.' since it doesn't exist. */ - sfep = next_sfep = xfs_dir2_sf_firstentry(sfp); + sfep = next_sfep = xfs_dir2_sf_firstentry(&sfp->hdr); for (i = 0; i < sfp->hdr.count && max_size > (__psint_t)next_sfep - (__psint_t)sfp; @@ -2965,7 +2957,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, bad_sfnamelen = 0; tmp_sfep = NULL; - lino = xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + lino = xfs_dir2_sfe_get_ino(&sfp->hdr, sfep); namelen = sfep->namelen; @@ -2994,7 +2986,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, break; } } else if (no_modify && (__psint_t) sfep - (__psint_t) sfp + - + xfs_dir2_sf_entsize_byentry(sfp, sfep) + + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ip->i_d.di_size) { bad_sfnamelen = 1; @@ -3024,7 +3016,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, if (no_modify && verify_inum(mp, lino)) { next_sfep = (xfs_dir2_sf_entry_t *)((__psint_t)sfep + - xfs_dir2_sf_entsize_byentry(sfp, sfep)); + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen)); continue; } @@ -3075,8 +3067,8 @@ shortform_dir2_entry_check(xfs_mount_t *mp, * check for duplicate names in directory. */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) - (sfep - xfs_dir2_sf_firstentry(sfp)), - lino, sfep->namelen, sfep->name)) { + (sfep - xfs_dir2_sf_firstentry(&sfp->hdr)), + lino, sfep->namelen, sfep->name)) { do_warn( _("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"), fname, lino, ino); @@ -3132,7 +3124,8 @@ do_junkit: if (lino == orphanage_ino) orphanage_ino = 0; if (!no_modify) { - tmp_elen = xfs_dir2_sf_entsize_byentry(sfp, sfep); + tmp_elen = xfs_dir2_sf_entsize(&sfp->hdr, + sfep->namelen); tmp_sfep = (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + tmp_elen); tmp_len = max_size - ((__psint_t) tmp_sfep @@ -3183,9 +3176,9 @@ do_junkit: next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep - + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize_byentry(sfp, sfep) - : xfs_dir2_sf_entsize_byname(sfp, namelen))) + + ((!bad_sfnamelen) + ? xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) + : xfs_dir2_sf_entsize(&sfp->hdr, namelen))) : tmp_sfep; } From 3648-1417-7-0000007828@sbr06.net Mon Jan 14 05:31:17 2013 Return-Path: <3648-1417-7-0000007828@sbr06.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HK_NAME_FREE, HTML_FONT_FACE_BAD,HTML_IMAGE_ONLY_24,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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4A9577F37 for ; Mon, 14 Jan 2013 05:31:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1DDE18F8039 for ; Mon, 14 Jan 2013 03:31:16 -0800 (PST) X-ASG-Debug-ID: 1358163073-04cbb035a4c62ad0001-NocioJ Received: from mta0.sbr06.net (mta0.sbr06.net [94.23.213.115]) by cuda.sgi.com with ESMTP id 6iCLBHpzYOZ4mTLq for ; Mon, 14 Jan 2013 03:31:14 -0800 (PST) X-Barracuda-Envelope-From: 3648-1417-7-0000007828@sbr06.net X-Barracuda-Apparent-Source-IP: 94.23.213.115 Received: from sb2mta16.sarbatech.com (localhost.localdomain [127.0.0.1]) by mta0.sbr06.net (Postfix) with ESMTP id 5F914681779 for ; Mon, 14 Jan 2013 12:31:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sbr06.net; s=mta0; t=1358163071; bh=J9rGEkompW1UkyuNGIRK1KIKRKX79f0/n+SqzenCyDw=; h=Date:From:Reply-To:To:Subject:List-Unsubscribe; b=m3PZnopnjJ+giiTPGqT5QmUC2Cz57cMAMxfIgrrx3AcOkrXgF7cX7jCwNoHG+0TvN RFHQcU1dNMcN1vSSbaK+A2P3LJRpXAtAXV3HAj2/2wSQbq1oD8ueFwqG9TFM1yL848 jnLU2dxHz7X6hmkfO1ii+ymajxAAe4A9qYTOoDN4= Date: Mon, 14 Jan 2013 12:30:43 +0100 (CET) From: =?utf-8?Q?Browning_Golf_Pack_1/2_s=C3=A9rie_CYNERGY_+_Hybride_free?= Reply-To: =?utf-8?Q?Browning_Golf_Pack_1/2_s=C3=A9rie_CYNERGY_+_Hybride_fr?= =?utf-8?Q?ee?= To: xfs@oss.sgi.com Message-ID: <3648-1417-7-0000007828@sbr06.net> Subject: Votre Offre Browning MIME-Version: 1.0 X-ASG-Orig-Subj: Votre Offre Browning Content-Type: multipart/related; boundary="----=_Part_4027904_63020133.1358163061628" List-Unsubscribe: Sender: browning=biiiz.be@sbr06.net X-virtual-MTA: mta0 X-Mailer: Professional Routing Service X-Barracuda-Connect: mta0.sbr06.net[94.23.213.115] X-Barracuda-Start-Time: 1358163074 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.69 X-Barracuda-Spam-Status: No, SCORE=2.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_WWW_MISMATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_FONT_FACE_BAD, HTML_IMAGE_ONLY_24, HTML_IMAGE_ONLY_24_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch -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_ONLY_24 BODY: HTML: images with 2000-2400 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 1.28 HTML_IMAGE_ONLY_24_2 HTML: images with 2000-2400 bytes of words ------=_Part_4027904_63020133.1358163061628 Content-Type: multipart/alternative; boundary="----=_Part_4027905_469937360.1358163061628" ------=_Part_4027905_469937360.1358163061628 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Faites-vous plaisir en 2013 avec un Pack Golf Cynergy Demi s=C3=A9rie Cynergy + hybride Gratuit Le pack =C3=A0 249 eur au lieu de 359 eur Composition : Bois (homme#3, dame#5) le fer #5, #7, #9, commutateur, putter= , le tr=C3=A9pied 7 =C2=AB Bourgogne noir/gris de 1/2 de sac (hommes) ou ac= tions libres beiges/bleu (femmes) quantit=C3=A9s limit=C3=A9es La livraison seulement en Belgique Si cette communication vous importune, veuillez nous en excuser. Pour ne plus recevoir de communication de notre part,veuillez envoyer OUT = =C3=A0 browning@biiiz.be ------=_Part_4027905_469937360.1358163061628 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
3D""
3D""
3D""3D""
D=C3=A9lai de livraison 14 jours &n= bsp; Conditions G=C3=A9n=C3=A9rales de ventes
Si cette comm= unication vous importune, veuillez nous en excuser.
Pour ne plus = recevoir de communication de notre part, suivez ce lien
------=_Part_4027905_469937360.1358163061628-- ------=_Part_4027904_63020133.1358163061628 Content-Type: image/jpeg; name="=?utf-8?Q?Buy=2EJpg?=" Content-Transfer-Encoding: Base64 Content-ID: Content-Location: D40F3E482433F3277300254933C05FC0@JM-VAIO /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABYAIIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIHWjF JmjNUIWikzRmgBaKTPuKM0ABp129rptst1q1ytrCwyi4zJJ/ur/U1S13WYPDtmk0qJNfyjMEDdFH 99h6egryzVNQu9UvJLq/meadzksx/l6CkNI7PUfiAsbFdE0+KMDpNc/vHP4dBWDdeMvEF0fn1OdV /uphR+lc9S0irGwnifW0ORqVyfq2a0LXxrqCsPtaxXC9yRtb8xXL5pKAPUdK8RWV+oG/y5O6t2rZ BrxdGZGDISCOhFdZ4a8TNBIlvftmA8Bz/B7/AEppiaO9pKAc9OlLTJEopaKAPO/+E41z/ntB/wB+ F/wo/wCE41z/AJ7Qf9+F/wAK5mrmkaZeazqMNhpkD3F3McIi/wAyewHqaiUlFc0tjRK7sja/4TjX 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 oooA/9k= ------=_Part_4027904_63020133.1358163061628 Content-Type: image/jpeg; name="=?utf-8?Q?Details=2Ejpg?=" Content-Transfer-Encoding: Base64 Content-ID: <63556D975FB20DDC8E0C8A2C46CB2F6C@JM-VAIO> Content-Location: 63556D975FB20DDC8E0C8A2C46CB2F6C@JM-VAIO /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABYAXIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIopMi jNUIWijNJmgBaKM0lABS0gNGaAFoozSZpALRRmjNMAoozRmgAopM0ZoAWikzRmgBaDRmkzQAtFJm lzSAKKTIpc0AFFJmjNMBaKTNGaQC0UZozQAUUZozQAUUmaXNABRRmkzTAWjvSZoyKAFopM0ZoAWi kzS5oAKKTIozSAWikozTAWikz70UgPOf+E31/wD5/v8AyGv+FH/Cba9nm8B+sa/4VzlFIs6T/hN9 d/5+0/79L/hQPG+vf8/SH/tktc3RQB03/Cc67/z8x/8AflaB4513P/HzF/35WuZooA6c+OdcJ/18 P/fhaQeOdc/57Qf9+F/wrmaKAOm/4TjXP+e0H/fhf8KP+E41v/nvB/34WuZ/Cg8CgDpv+E41z/nv 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 AUUUUWAKSiihALRmiigAooooAKKKKAP/2Q== ------=_Part_4027904_63020133.1358163061628 Content-Type: image/jpeg; name="=?utf-8?Q?head=2Ejpg?=" Content-Transfer-Encoding: Base64 Content-ID: <03879BAF9254BC46B42DA4AC8966EB87@JM-VAIO> Content-Location: 03879BAF9254BC46B42DA4AC8966EB87@JM-VAIO /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAEcAfQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDydpai MlRs2elNJrhOMeXNMLUmaTNMBc0c0lLQAmaMmgmm5oEOLH3o3H1puabTAk3+5oDnsajFLQBKHPqa kWU+pqvmjNKwF6OX3P511fgvTr/U9RiSGO4+yM2JZUYqAPrXFK2K+kfhZNa3XgzT4rRl/dArNjqG zzmmopvU0oq8rmjpmjmytI7aGcOid3JZj75ovUlt0cqFkKgn5OT+XetO7mhi2q24gnGM4FZj3Nsc AvIMsRyc1Xt6cfdudzpylqeNeL7y+m1RjewS2y7lXy5Bg+X1/U9arX+pSXESoGKqPT0rqviPHc3k kLx5mtWQoGTnLA5HvXEWtle3c3kwWkzOOu5doH1Jrkre87x1R30Hyx1GxyLEWc84GAT2Hc1yuqaz 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 tFO4XP/Z ------=_Part_4027904_63020133.1358163061628 Content-Type: image/jpeg; name="=?utf-8?Q?Offer=2EJpg?=" Content-Transfer-Encoding: Base64 Content-ID: <52A29ED5ECD2EE095ADBEFA042D27951@JM-VAIO> Content-Location: 52A29ED5ECD2EE095ADBEFA042D27951@JM-VAIO /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAChAfQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6pooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoozUcsqRIWkYKKAJM0maw9Q12K3ZFyi mQ4QNyznvhR1rnb3xNpVyhNxqcbLhiE8wgEKcEgcZxU8xXKztLjUbO3/ANfdQofQuM1VOv6WD/x9 ofoDXm7ajb31wkOkx2O4ksTI21mTttz3PrzxW7BbxGDdNFAXJJxHyq+wPelzD5Tr4tb02VgqXkWT 2Y4/nV9XVlDKQQehByDXnF3DZKhLRgAejGsRPGkXh+eVLdpniUbmQKXRfY+mafMDgeyUVz3grxZp fi/R01DR7hZU6Omfmjb0IroQaogKKKKACiiigAooooAKKKKACiiigAopCa89+LvxKt/h7p0c7Wsd 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 ------=_Part_4027904_63020133.1358163061628-- From returns@ss56.sertmail.com Mon Jan 14 07:27:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_FRT_STOCK1 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 161B77F37 for ; Mon, 14 Jan 2013 07:27:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2C6D304032 for ; Mon, 14 Jan 2013 05:27:40 -0800 (PST) X-ASG-Debug-ID: 1358170054-04cbb035a5c6a100001-NocioJ Received: from ss56.sertmail.com (ss56.sertmail.com [66.18.14.186]) by cuda.sgi.com with ESMTP id R2ka5PjA2jCXC0nP for ; Mon, 14 Jan 2013 05:27:34 -0800 (PST) X-Barracuda-Envelope-From: returns@ss56.sertmail.com X-Barracuda-Apparent-Source-IP: 66.18.14.186 X-Barracuda-Registry: Level1 [ss56.sertmail.com/66.18.14.186] Received: by ss56.sertmail.com (Postfix, from userid 0) id 1231DBC5B40; Mon, 14 Jan 2013 07:27:33 -0600 (CST) X-Barracuda-Registry: Level1 [ss56.sertmail.com/66.18.14.186] X-Barracuda-Registry: Level1 [ss56.sertmail.com/66.18.14.186] To: xfs@oss.sgi.com Subject: =?utf-8?B?xLDFnyBEw7xueWFzxLFuxLEgWWFrxLFuIEdlbGVjZWt0ZSBOZWxlciBCZWs=?= =?utf-8?B?bGl5b3I/?= Message-ID: <1358170053_SectionID-59355_HitID-1358159806291_SiteID-13448_EmailID-12945937_DB-26_SID-26@ss56.sertmail.com> X-ASG-Orig-Subj: =?utf-8?B?xLDFnyBEw7xueWFzxLFuxLEgWWFrxLFuIEdlbGVjZWt0ZSBOZWxlciBCZWs=?= =?utf-8?B?bGl5b3I/?= List-Unsubscribe: , X-Report-Abuse: Please report abuse for this campaign here: http://ss56.sertmail.com/reportabuse.aspx?stid=13448&hitid=1358159806291&sec=59355&email=xfs@oss.sgi.com&EmID=12945937&SID=26&token=4ef1234ba3eaf93710e0fdc372f136f4dcfe3715 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=ss56.sertmail.com; i=@ss56.sertmail.com; q=dns/txt; s=gmmailerd; t=1358170018; h=From; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=; l=0; b=E4/bfJqQ2zlbNpfaa2XQN7tP8VmSGdr3CxL0aTr2N1Mfd+MGR1k3sGpVB67iFjf1ua9y0A6KjDrvTz95SpYXOZwty0lxoTTAHH6IIVoeV6mwYphIUVoj4+xUleSFiB5UgWY32qfGKPlf9i9fZFTGx4rnCWXWFJnIvYw1iVPOCgs= From: "Dilara Kaya" Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="9dc04bd4b3598f0cda430551be3fba06" Date: Mon, 14 Jan 2013 07:27:33 -0600 (CST) X-Barracuda-Connect: ss56.sertmail.com[66.18.14.186] X-Barracuda-Start-Time: 1358170054 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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=DKIM_SIGNED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --9dc04bd4b3598f0cda430551be3fba06 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable =C4=B0=C5=9F D=C3=BCnyas=C4=B1n=C4=B1 Yak=C4=B1n =0AGelecekte Neler Bekliyo= r?=0A2012 Y=C4=B1l=C4=B1 Ekonomik G=C3=B6r=C3=BCn=C3=BCm=C3=BC ve=0A2013 Y= =C4=B1l=C4=B1 Beklentileri=0AY=C3=96NET=C4=B0M =0ASOHBETLER=C4=B0 =0AK=C3= =BCresel Finans Piyasalar=C4=B1nda=0AGelinen Son Nokta =0A16 =C5=9Eubat 201= 3 / 09.30-17.30=0ALe Meridien =0AOtel Etiler=E2=80=93 =C4=B0stanbul=0AKonu= =C5=9Fmac=C4=B1lar:=0A- Prof. Dr. Necip =C3=87ak=C4=B1r=0A- Prof. Dr. Seyfe= ttin G=C3=BCrsel=0A- Prof. Dr. Taner Berksoy=0A- Prof. Dr. Eser Karaka=C5= =9F=0A- Do=C3=A7. Dr. Deniz G=C3=B6k=C3=A7e=0AKapsam:=0A=C2=B7 K=C3=BCresel= Finans Piyasalar=C4=B1nda Gelinen Son Nokta =0A=C2=B7 Avrupa, Amerika, =C3= =87in ve T=C3=BCrkiye Etkile=C5=9Fimi=0A=C2=B7 T=C3=BCrk Ekonomik Sistemini= n Tan=C4=B1mlanmas=C4=B1 ve =C4=B0=C5=9Fleyi=C5=9Fi=0A=C2=B7 Euro B=C3=B6lg= esi Ekonomik Dura=C4=9Fanl=C4=B1=C4=9F=C4=B1, T=C3=BCrkiye =0AEtkileri ve T= =C3=BCrkiye Ekonomisine Genel Bak=C4=B1=C5=9F=0A=C2=B7 Avrupa'da Finansal P= iyasalardaki Darbo=C4=9Faz 2018'e =0Akadar s=C3=BCrebilir mi? =0A=C2=B7 T= =C3=BCrk =C5=9Firketleri Ne T=C3=BCr Risklerle Kar=C5=9F=C4=B1la=C5=9Fabili= r? =0AHangilerine Haz=C4=B1r?=0A=C2=B7 K=C3=BCresel Finans Piyasalar=C4=B1n= da Yeniden Yap=C4=B1lanma ve =0AT=C3=BCrkiye Senaryolar=C4=B1=0A=C2=B7 Amer= ika Yerel Politikalar=C4=B1n=C4=B1n T=C3=BCrk Ekonomisine =0AYans=C4=B1mala= r=C4=B1 Ne Y=C3=B6nde Olacak?=0A=C2=B7 T=C3=BCrkiye Ekonomisi 2012 Y=C4=B1l= =C4=B1n=C4=B1 Nas=C4=B1l Tamamlad=C4=B1. =0A2013 Y=C4=B1l=C4=B1 Nas=C4=B1l = Ge=C3=A7ecek?=0A=C2=B7 FITCH'in =C3=9Clke Notunu Artt=C4=B1rmas=C4=B1, 2013= Y=C4=B1l=C4=B1 T=C3=BCrkiye =0AEkonomisini Nas=C4=B1l Etkileyecek?=0A=C2= =B7 T=C3=BCrkiye'nin Makro Ekonomik G=C3=B6r=C3=BCn=C3=BCm=C3=BC ve 2013 Y= =C4=B1l=C4=B1 =0AOVP Beklentileri=0A=C2=B7 T=C3=BCrkiye'nin Cari =C4=B0=C5= =9Flemler A=C3=A7=C4=B1=C4=9F=C4=B1 Sorunu ve Reel =0APiyasa Etkile=C5=9Fim= i=0A=C2=B7 T=C3=BCrkiye'nin =C4=B0stihdam, B=C3=BCy=C3=BCme, Enflasyon Soru= nu ve =0ABeklentiler=0A=C2=B7 T=C3=BCrkiye'nin =C4=B0hracata Dayal=C4=B1 B= =C3=BCy=C3=BCme Modeli ile =0ANeler Bekliyor Bizi?=0A=C2=B7 Avrupa Finans D= urgunlu=C4=9Funun Gelecek 5 Y=C4=B1l Devam =0AEtmesi, T=C3=BCrkiye Ekonomis= ini Nas=C4=B1l Etkileyebilir ?=0A=C2=B7 2014 Yerel, 2015 Cumhurba=C5=9Fkanl= =C4=B1=C4=9F=C4=B1 ve Genel =0ASe=C3=A7imlerinin T=C3=BCrk Ekonomisine Etki= leri=0A=C2=B7 T=C3=BCrk =C5=9Eirketlerine Yat=C4=B1r=C4=B1m T=C3=BCyolar=C4= =B1 Sorular, =0AYorumlar, Cevaplar=0AKay=C4=B1t =0Ave Ayr=C4=B1nt=C4=B1l=C4= =B1 Bilgi =C4=B0=C3=A7in=0AL=C3=BCtfen T=C4=B1klay=C4=B1n=C4=B1z.=0AProgram= lar=C4=B1m=C4=B1z kontenjanlar=C4=B1m=C4=B1zla s=C4=B1n=C4=B1rl=C4=B1d=C4= =B1r, Kay=C4=B1t =0Ai=C5=9Flemlerini web sayfam=C4=B1zdan online yapabilirs= iniz, =0AToplu kat=C4=B1l=C4=B1m ve sponsorluk imkanlar=C4=B1ndan faydalanm= ak =0Ai=C3=A7in l=C3=BCtfen aray=C4=B1n=C4=B1z. =0A0 216 422 93 61 - 62 - 6= 3 - 64 =0AKay=C4=B1tlar=C4=B1 =0ADevam Eden Konferanslar=C4=B1m=C4=B1z=0A= =C3=87ALI=C5=9EMA HAYATINDA YEN=C4=B0 =C4=B0=C5=9E =0AHUKUKU UYGULAMALARI= =0ADe=C4=9Fi=C5=9Fen Kanunlarla Gelen Yeni =0AY=C3=BCk=C3=BCml=C3=BCl=C3=BC= kler,=0AKar=C5=9F=C4=B1la=C5=9F=C4=B1labilecek Sorunlar ve Al=C4=B1nmas=C4= =B1 Gereken =C3=96nlemler =0AHakk=C4=B1nda =C3=96nemli Kriterler=0A19 Ocak = 2013 / 09.30 =E2=80=93 17.00 Le Meridien Otel =E2=80=93 =C4=B0stanbul=0AKon= u=C5=9Fmac=C4=B1lar:=0A-Ali Kemal Say=C4=B1n // =C3=87al=C4=B1=C5=9Fma ve S= osyal G=C3=BCvenlik =0ABakanl=C4=B1=C4=9F=C4=B1 =C3=87al=C4=B1=C5=9Fma Gene= l M=C3=BCd=C3=BCr=C3=BC=0A-Dr. Resul Kurt // Sosyal G=C3=BCvenlik ve =C4=B0= =C5=9F Hukuku =0AUzman=C4=B1, Yazar=0A-Prof. Dr. Tekin Akgeyik // =C4=B0sta= nbul =C3=9Cniversitesi=0A-Do=C3=A7. Dr Say=C4=B1m Yorgun // Kocaeli =C3=9Cn= iversitesi =0A-Dr. =C4=B0smail Ercan =C3=9Cnal // Yeminli Mali M=C3=BC=C5= =9Favir=0A3. DEPO Y=C3=96NET=C4=B0M Z=C4=B0RVES=C4=B0=0ATedarik Zincirinde = Depo Y=C3=B6netim Sistemleri,=0AUygulanabilir Teknolojiler ve Ba=C5=9Far=C4= =B1l=C4=B1 K=C3=BCresel Modeller=0A19 Ocak 2013 / 09.30 =E2=80=93 17.00 Le = Meridien Otel =E2=80=93 =0A=C4=B0stanbul=0AKonu=C5=9Fmac=C4=B1lar:=0A-Atill= a Y=C4=B1ld=C4=B1ztekin // Lojistik Y=C3=B6netim Dan=C4=B1=C5=9Fman=C4=B1 /= =0AZirve Koordinat=C3=B6r=C3=BC =0A-Prof. Dr. Murat Erdal // Istanbul =C3= =9Cniversitesi TZY =0ABilim Dal=C4=B1 Ba=C5=9Fkan=C4=B1=0A-Emre Yenal // Ka= rdex Depolama Sistemleri T=C3=BCrkiye =0ASat=C4=B1=C5=9F Direkt=C3=B6r=C3= =BC=0A-Tuncer Y=C4=B1ld=C4=B1z // =C3=9C=C3=A7ge Depo Raf Sistemleri Genel = =0AM=C3=BCd=C3=BCr Yard=C4=B1mc=C4=B1s=C4=B1=0A-Bahad=C4=B1r =C4=B0n=C3=B6z= =C3=BC // Novaces CEO=0A-Ayhan T=C3=BCrkmen // TT Partners Consulting Kuruc= u =0AOrtak=0A-Aykut Ayg=C3=BCven // Horoz Lojistik Entegre Lojistik =0AGrup= Ba=C5=9Fkan=C4=B1=0A-Erdo=C4=9Fan Lak // Replica Sistemi =C3=9Clke M=C3=BC= d=C3=BCr=C3=BC=0A-Oru=C3=A7 Kaya // O2 Lojistik Y=C3=B6netim Dan=C4=B1=C5= =9Fmanl=C4=B1k, =0ADan=C4=B1=C5=9Fman=0A-Mehmet Birdane // Bortex Termal Bo= ya Genel M=C3=BCd=C3=BCr=0A-G=C3=BCven Estik // Selco Dan=C4=B1=C5=9Fmanl= =C4=B1k, Dan=C4=B1=C5=9Fman=0A-G=C3=B6khan Belbes // =C3=87elik Motor / Kia= , Sat=C4=B1nalma ve =0AStok Kontrol =C5=9Eefi=0A7. F=C4=B0RMA =C3=87APINDA = MAL=C4=B0YET =0AD=C3=9C=C5=9E=C3=9CRME TEKN=C4=B0KLER=C4=B0=0A"Farkl=C4=B1 = Bak=C4=B1=C5=9F A=C3=A7=C4=B1lar=C4=B1yla =0AMaliyet D=C3=BC=C5=9F=C3=BCrme= Y=C3=B6ntemleri" Ba=C5=9Far=C4=B1l=C4=B1 =C5=9Eirketler =0AMaliyetlerini N= as=C4=B1l D=C3=BC=C5=9F=C3=BCr=C3=BCyorlar? Nas=C4=B1l Rekabette =C3=96ne = =0AGe=C3=A7iyorlar? Hangi Sistemlerle? Hangi Tekniklerle?=0A26 Ocak 2013 / = 09.30-17.30 Sheraton Maslak - =C4=B0stanbul=0AKonu=C5=9Fmac=C4=B1lar:=0A- S= erhat Cengiz // Kale =C5=9Eirketler Grubu / =C3=9Cr=C3=BCn =0ATedarik Geli= =C5=9Ftirme Md.=0A- Recai G=C3=BCrel // Federal Mogul / Kalite M=C3=BCd=C3= =BCr=C3=BC=0A- Mesut Berber // Ikea T=C3=BCrkiye, Mapa / K=C4=B1demli =C4= =B0=C5=9F =0AGeli=C5=9Ftirme Uzman=C4=B1=0A- Cem K=C3=BCt=C3=BCk // Y=C4=B1= ld=C4=B1z Holding / M&A ve =C4=B0=C5=9F Geli=C5=9Ftirme =0AM=C3=BCd=C3=BCr= =C3=BC=0A- Mehmet Soyupak // Fezalar Grup / YKB Yrd, Genel =0AM=C3=BCd=C3= =BCr =0A- Ozg=C3=BCr Ta=C5=9Fk=C4=B1n // Do=C4=9Fus Otomotiv Sat=C4=B1=C5= =9F M=C3=BCd=C3=BCr=C3=BC=0A- Cem Tuna // Krone Trailer / Sat=C4=B1nalma M= =C3=BCd=C3=BCr=C3=BC=0A- Tuncer Hatuno=C4=9Flu // =C4=B0leti=C5=9Fim Bilgis= ayar / Kurucu / =0ATeknoloji Dan=C4=B1=C5=9Fman=C4=B1=0A- Kas=C4=B1m =C3=87= apraz // Bilim M=C3=BC=C5=9Favirlik / Ekonomist=0A- =C3=96mer =C4=B0hsan K= =C4=B1z=C4=B1l // B=C3=BCt=C3=BCnsel =C4=B0yile=C5=9Ftirme Uzman=C4=B1=0A- = M. Emre =C3=87aptu=C4=9F // Y=C3=B6netim Dan=C4=B1=C5=9Fman=C4=B1=0A- Hakan= G=C3=BCner // Y=C3=B6netim Dan=C4=B1=C5=9Fman=C4=B1=0A- Y=C3=BCksel Bayrak= // Y=C3=B6netim Dan=C4=B1=C5=9Fman=C4=B1=0A- Ayhan T=C3=BCrkmen // TT Part= ners Consulting Kurucu =0AOrtak=0A-->=0AAbonelikten =C3=A7=C4=B1kmak i=C3= =A7in a=C5=9Fa=C4=9F=C4=B1daki linke t=C4=B1klay=C4=B1n=0Ahttp://ss56.sertm= ail.com/RWCode/subscribe.asp?SID=3D26&SiteID=3D13448&Email=3Dxfs@oss.sgi.co= m&HitID=3D1358159806291 --9dc04bd4b3598f0cda430551be3fba06 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

İş Dünyasını Yakın Gelecekte Neler Bekliyor?

2012 Yılı= ; Ekonomik Görünümü ve

2013 Yılı= ; Beklentileri

YÖNETİM SOHBETLERİ

Küresel Finan= s Piyasalarında

Gelinen Son Nokta =

16 Şubat 2013 / 09.30-17.30

Le Meridien Otel Etiler–= İstanbul

Konuşmacılar:

- Prof. Dr. Necip = Çakır
- Prof. Dr. Seyfet= tin Gürsel
- Prof. Dr. Taner = Berksoy
- Prof. Dr. Eser K= arakaş
- Doç. Dr. De= niz Gökçe

 

Kapsam:
· Kürese= l Finans Piyasalarında Gelinen Son Nokta
· Avrupa, Ame= rika, Çin ve Türkiye Etkileşimi
· Türk E= konomik Sisteminin Tanımlanması ve İşleyişi
· Euro Bö= ;lgesi Ekonomik Durağanlığı, Türkiye Etkileri ve Tü= ;rkiye Ekonomisine Genel Bakış
· Avrupa'da F= inansal Piyasalardaki Darboğaz 2018'e kadar sürebil= ir mi?
· Türk &= #351;irketleri Ne Tür Risklerle Karşılaşabilir? Hangilerine Haz= 05;r?
· Kürese= l Finans Piyasalarında Yeniden Yapılanma ve Türkiye Senar= yoları
· Amerika Yer= el Politikalarının Türk Ekonomisine Yansımalar= 05; Ne Yönde Olacak?
· Türkiy= e Ekonomisi 2012 Yılını Nasıl Tamamladı. 2013 Yılı= ; Nasıl Geçecek?
· FITCH'in &#= 220;lke Notunu Arttırması, 2013 Yılı Türkiye Ekonomisini Nas= 05;l Etkileyecek?
· Türkiy= e'nin Makro Ekonomik Görünümü ve 2013 Yılı OVP Beklentileri · Türkiy= e'nin Cari İşlemler Açığı Sorunu ve Reel Piyasa Etkileş= ;imi
· Türkiy= e'nin İstihdam, Büyüme, Enflasyon Sorunu ve Beklentiler
· Türkiy= e'nin İhracata Dayalı Büyüme Modeli ile Neler Bekliyor Biz= i?
· Avrupa Fina= ns Durgunluğunun Gelecek 5 Yıl Devam Etmesi, Türki= ye Ekonomisini Nasıl Etkileyebilir ?
· 2014 Yerel,= 2015 Cumhurbaşkanlığı ve Genel Seçimlerinin = Türk Ekonomisine Etkileri
· Türk &= #350;irketlerine Yatırım Tüyoları Sorular, Yorumlar, Cevaplar=

 

Kayıt ve Ayrınt= 5;lı Bilgi İçin

Lütfen Tı= ;klayınız.

Programlarım&= #305;z kontenjanlarımızla sınırlıdır, Kay= 5;t işlemlerini w= eb sayfamızdan online yapabilirsiniz,
Toplu katıl&#= 305;m ve sponsorluk imkanlarından faydalanmak için lüt= fen arayınız.
0 216 422 93 61 - = 62 - 63 - 64

 

 

Kayıtları Devam Eden Konfera= nslarımız

 

ÇALIŞMA HAYATINDA YENİ İŞ HUKUKU UYGULAMALAR= I
D= eğişen Kanunlarla Gelen Yeni Yüküml&#= 252;lükler,
Karşıla&= #351;ılabilecek Sorunlar ve Alınması Gereken Önlemler Hakkında = 4;nemli Kriterler
19 Ocak 2013 / 09.= 30 – 17.00 Le Meridien Otel – İstanbul

 

Konuşmacı= ;lar:
-Ali Kemal Say= 5;n // Çalışma ve Sosyal Güvenlik Bakanlığ= ı Çalışma Genel Müdürü
-Dr. Resul Kurt //= Sosyal Güvenlik ve İş Hukuku Uzmanı, Yazar=
-Prof. Dr. Tekin A= kgeyik // İstanbul Üniversitesi
-Doç. Dr Say&= #305;m Yorgun // Kocaeli Üniversitesi
-Dr. İsmail E= rcan Ünal // Yeminli Mali Müşavir

3. DEPO YÖNETİM ZİRVESİ
Tedarik Zincirinde= Depo Yönetim Sistemleri,
Uygulanabilir Tekn= olojiler ve Başarılı Küresel Modeller
 19 Ocak 2013= / 09.30 – 17.00  Le Meridien Otel – İstanbul

 

Konuşmacılar:
-Atilla Yıld&= #305;ztekin // Lojistik Yönetim Danışmanı / Zirve Koordinat= 46;rü
-Prof. Dr. Murat E= rdal // Istanbul Üniversitesi TZY Bilim Dalı Ba= şkanı
-Emre Yenal // Kar= dex Depolama Sistemleri Türkiye Satış Di= rektörü
-Tuncer Yıld&= #305;z // Üçge Depo Raf Sistemleri Genel Müdür Ya= rdımcısı
-Bahadır = 4;nözü // Novaces CEO
-Ayhan Türkme= n // TT Partners Consulting Kurucu Ortak
-Aykut Aygüve= n // Horoz Lojistik Entegre Lojistik Grup Başkan&#= 305;
-Erdoğan Lak = // Replica Sistemi Ülke Müdürü
-Oruç Kaya //= O2 Lojistik Yönetim Danışmanlık, Danışman=
-Mehmet Birdane //= Bortex Termal Boya Genel Müdür
-Güven Estik = // Selco Danışmanlık, Danışman
-Gökhan Belbe= s // Çelik Motor / Kia, Satınalma ve Stok Kontrol Ş= ;efi

7. FİRMA ÇAPINDA MALİYET DÜŞÜ= ;RME TEKNİKLERİ
"Farklı Bakış Açılarıyla Maliyet Dü= 51;ürme Yöntemleri" Başarılı Şirketler Maliyetlerini Nas&= #305;l Düşürüyorlar? Nasıl Rekabette Öne Geçiyorlar? H= angi Sistemlerle? Hangi Tekniklerle?
26 Ocak 2013 / 09.= 30-17.30 Sheraton Maslak - İstanbul

 

Konuşmacılar:
- Serhat Cengiz //= Kale Şirketler Grubu / Ürün Tedarik Geliş= tirme Md.
- Recai Gürel= // Federal Mogul / Kalite Müdürü
- Mesut Berber // = Ikea Türkiye, Mapa / Kıdemli İş Geliştirme Uz= manı
- Cem Küt= 2;k // Yıldız Holding / M&A ve İş Geliştirme Müdür= 52;
- Mehmet Soyupak /= / Fezalar Grup / YKB Yrd, Genel Müdür - Ozgür Ta= 51;kın // Doğus Otomotiv Satış Müdürü - Cem Tuna // Kron= e Trailer / Satınalma Müdürü
- Tuncer Hatuno= 87;lu // İletişim Bilgisayar / Kurucu / Teknoloji Danı= ;şmanı
- Kasım Ç= ;apraz // Bilim Müşavirlik / Ekonomist
- Ömer İ= hsan Kızıl // Bütünsel İyileştirme Uzmanı= ;
- M. Emre Çap= tuğ // Yönetim Danışmanı
- Hakan Güner= // Yönetim Danışmanı
- Yüksel Bayr= ak // Yönetim Danışmanı
- Ayhan Türkm= en // TT Partners Consulting Kurucu Ortak

 

 

=20 =0A=0A=0A=0A=0A=
=0A
=0A=0A=0A=09=0A=09= =0A=0A=0A=0A=0A=0A
=0A=0A=09=0A=09= =09=09=09=0A=09=09=09= =0A=09=09=0A=09=09=0A=09=09=09=0A=09=09=0A=09=09=09=0A=09=09=0A=0A=0A=09
=0A=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09
=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09= =09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09= =09=0A =0A=09=09=09=09=09=09=09=09= =09=0A=09=09=09=09=09=09=09=09=0A = =0A=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09=09= =09=09=09=09=09=09=09=09abonelikten =C3=A7= =C4=B1k=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09arkada=C5=9F=C4=B1na g=C3=B6nder=0A=09= =09=09=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09
 
=0A=09=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09
&nb= sp;
=0A=09=09=09=09=09=09=09=09= =09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09= =09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09= =09=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09=09=09=09yetkili=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=093D'http://www.graphicmail.com==0A=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09= =09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09= =09=09
=0A=09=09=09
=0A=09=09=09=0A=09=09
=0A=09= =09=09=0A=09=09=09=0A=09=09=09=09=09=09=09
=0A=09=09=09=09Bu= posta sistemi sadece izne dayal=C4=B1 e-postalar=C4=B1n g=C3=B6nderilmesin= de kullan=C4=B1l=C4=B1r.
E=C4=9Fer bu g=C3=B6ndericiden e-postalar a= lmak i=C3=A7in izin vermediyseniz,=0A=09=09=09=09L=C3=BCtfen bize bildirin=0A=09=09=09=09<= br>=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =0A=09=09=09
=0A=09=09=09
=0A= =0A=0A=0A=0A
=0A=
=0A=0A=0A
=0A
= =0A=0A --9dc04bd4b3598f0cda430551be3fba06-- From 20121018-INTERNETFACIL@pirsom-jupiter.fr Mon Jan 14 08:15:39 2013 Received: from localhost by oss.sgi.com with SpamAssassin (version 3.3.1); Mon, 14 Jan 2013 08:15:39 -0600 From: Internet Facile <20121018-INTERNETFACIL@pirsom-jupiter.fr> To: xfs@oss.sgi.com Subject: =?UTF-8?B?b2J0ZW5leiAgdW5lIHN1YnZlbnRpb24gdG90YWxlIHBvdXIgTGEgY3LDqWF0aW9uIGRlIHZvdHJlIHNpdGUgSW50ZXJuZXQ=?= Date: Mon, 14 Jan 2013 15:15:32 +0200 Message-Id: <20130114141532.4F32F2C5B7@localhost.localdomain> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Flag: YES X-Spam-Level: ********* X-Spam-Status: Yes, score=9.5 required=5.0 tests=FROM_STARTS_WITH_NUMS, HS_INDEX_PARAM,HTML_IMAGE_RATIO_02,HTML_MESSAGE,RCVD_ILLEGAL_IP, T_REMOTE_IMAGE autolearn=no version=3.3.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------=_50F4130B.44AC367C" This is a multi-part message in MIME format. ------------=_50F4130B.44AC367C Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Spam detection software, running on the system "oss.sgi.com", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see postmaster for details. Content preview: Internet Facile Pour vous desabonner et ne plus recevoir nos messages, recopiez le lien ci-dessous dans barre adresse de votre navigateur. http://www.pirsom-jupiter.fr/prsom/?Y2FtcD0yMDEyMTAxOC1JTlRFUk5FVEZBQ0lMJmRlc3RpZD0xOTU0NzA3NyZkZXN0PXhmc0Bvc3Muc2dpLmNvbSZjbGllbnQ9MiZ1cmw9ZGVzYWJv [...] Content analysis details: (9.5 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 3.4 RCVD_ILLEGAL_IP Received: contains illegal IP address 2.8 FROM_STARTS_WITH_NUMS From: starts with many numbers 1.1 HS_INDEX_PARAM URI: Link contains a common tracker pattern. 2.2 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.0 HTML_MESSAGE BODY: HTML included in message 0.0 T_REMOTE_IMAGE Message contains an external image The original message was not completely plain text, and may be unsafe to open with some email clients; in particular, it may contain a virus, or confirm that your address can receive spam. If you wish to view it, it may be safer to save it to a file and open it with an editor. ------------=_50F4130B.44AC367C Content-Type: message/rfc822; x-spam-type=original Content-Description: original message before SpamAssassin Content-Disposition: attachment Content-Transfer-Encoding: 8bit Return-Path: <20121018-INTERNETFACIL@pirsom-jupiter.fr> 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 0615A7F37 for ; Mon, 14 Jan 2013 08:15:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E07698F8039 for ; Mon, 14 Jan 2013 06:15:35 -0800 (PST) X-ASG-Debug-ID: 1358172932-04cb6c05a8cbcf30001-NocioJ Received: from mx461.mktg-venus.com (mx112.mktg-venus.com [176.31.158.56]) by cuda.sgi.com with ESMTP id S4rS5vlhTHD9972j for ; Mon, 14 Jan 2013 06:15:33 -0800 (PST) X-Barracuda-Envelope-From: 20121018-INTERNETFACIL@pirsom-jupiter.fr X-Barracuda-Apparent-Source-IP: 176.31.158.56 To: xfs@oss.sgi.com Reply-To: 20121018-INTERNETFACIL@pirsom-jupiter.fr Subject: =?UTF-8?B?b2J0ZW5leiAgdW5lIHN1YnZlbnRpb24gdG90YWxlIHBvdXIgTGEgY3LDqWF0aW9uIGRlIHZvdHJlIHNpdGUgSW50ZXJuZXQ=?= From: Internet Facile <20121018-INTERNETFACIL@pirsom-jupiter.fr> X-ASG-Orig-Subj: =?UTF-8?B?b2J0ZW5leiAgdW5lIHN1YnZlbnRpb24gdG90YWxlIHBvdXIgTGEgY3LDqWF0aW9uIGRlIHZvdHJlIHNpdGUgSW50ZXJuZXQ=?= Date: Mon, 14 Jan 2013 15:15:32 +0200 X-Mailer: Apple Mail (2.1498) Content-Type: multipart/alternative; boundary="------------6371dccfff6b7ce1e029dcda16a53767" MIME-Version: 1.0 Message-Id: <20130114141532.4F32F2C5B7@localhost.localdomain> X-Barracuda-Connect: mx112.mktg-venus.com[176.31.158.56] X-Barracuda-Start-Time: 1358172933 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.28 X-Barracuda-Spam-Status: No, SCORE=1.28 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, HS_INDEX_PARAM, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 HS_INDEX_PARAM URI: Link contains a common tracker pattern. 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers This is a multi-part message in MIME format --------------6371dccfff6b7ce1e029dcda16a53767 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Internet Facile Pour vous desabonner et ne plus recevoir nos messages, recopiez le lien ci-dessous dans barre adresse de votre navigateur. http://www.pirsom-jupiter.fr/prsom/?Y2FtcD0yMDEyMTAxOC1JTlRFUk5FVEZBQ0lMJmRlc3RpZD0xOTU0NzA3NyZkZXN0PXhmc0Bvc3Muc2dpLmNvbSZjbGllbnQ9MiZ1cmw9ZGVzYWJv --------------6371dccfff6b7ce1e029dcda16a53767 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Internet Facile

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant. Vous pouvez déclarer cet email illégitime en suivant ce lien.
Pour vous désabonner, Suivez ce lien.

--------------6371dccfff6b7ce1e029dcda16a53767-- ------------=_50F4130B.44AC367C-- From tinguely@sgi.com Mon Jan 14 08:33:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 D74877F37 for ; Mon, 14 Jan 2013 08:33:45 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id AA0B38F8039; Mon, 14 Jan 2013 06:33:45 -0800 (PST) Message-ID: <50F4174A.3090709@sgi.com> Date: Mon, 14 Jan 2013 08:33:46 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH V2] xfsprogs: document all commands in xfs_io References: <50C39123.6050303@sandeen.net> <50C3A936.1050805@sandeen.net> In-Reply-To: <50C3A936.1050805@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 14:55, Eric Sandeen wrote: > Add missing command documentation to xfs_io(8) manpage. > fiemap, fpunch, chproj, lsproj, and setfl are all missing. > > setfl seems to not work today in any case, and nothing > in xfstests uses it; I will send another patch to simply > remove it from xfs_io, as I don't think it's terribly useful, > and hasn't worked forever anyway. > > Also fix references to the fallocate manpage, which is (now?) > in section 2, not section 3 of the man pages. (Since it's > a syscall, not a library function). > > Signed-off-by: Eric Sandeen > --- > Looks good. Committed to xfsprogs as 83c324 --Mark. From bpm@sgi.com Mon Jan 14 09:45:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 122C67F37 for ; Mon, 14 Jan 2013 09:45:13 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 893C2AC002; Mon, 14 Jan 2013 07:45:09 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2531C4266DC; Mon, 14 Jan 2013 09:45:09 -0600 (CST) Date: Mon, 14 Jan 2013 09:45:09 -0600 From: Ben Myers To: Russell Cattelan Cc: xfs@oss.sgi.com Subject: Re: oss.sgi.com migration Message-ID: <20130114154509.GC27055@sgi.com> References: <50F0B92A.9000500@sgi.com> <20130113230247.GB19173@dastard> <50F388EE.6060603@thebarn.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F388EE.6060603@thebarn.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Russell, On Sun, Jan 13, 2013 at 10:26:22PM -0600, Russell Cattelan wrote: > On 1/13/13 5:02 PM, Dave Chinner wrote: > > On Fri, Jan 11, 2013 at 05:15:22PM -0800, Trevor Hurst wrote: > >> This is to inform you that oss.sgi.com will be unavailable on > >> Sunday, January 13th between 4:00pm and 6:00pm PST for a > >> migration. We are migrating the server to a virtual environment and > >> adding some new tools and features. > >> > >> Please plan accordingly and sorry for the inconvenience. > > > > git fetches from oss.sgi.com seem to be hanging. The connection gets > > established, but no data comes down the pipe from the server. As > > such, my hourly cron job that pulls from oss.sgi.com trees has been > > failing for the last 12 hours.... > So I'll use this as a test to the list. > > I'm still working on getting the daemon online. It appears to be working this morning. Thanks! Regards, Ben From cattelan@thebarn.com Mon Jan 14 11:04:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E4FBD7F37 for ; Mon, 14 Jan 2013 11:04:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6E51304053 for ; Mon, 14 Jan 2013 09:04:13 -0800 (PST) X-ASG-Debug-ID: 1358183046-04cb6c023904e30001-NocioJ Received: from x.digitalelves.com (x.digitalelves.com [209.98.77.55]) by cuda.sgi.com with ESMTP id GWS7RpHqYQYgok5K (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 14 Jan 2013 09:04:07 -0800 (PST) X-Barracuda-Envelope-From: cattelan@thebarn.com X-Barracuda-Apparent-Source-IP: 209.98.77.55 Received: from abiggart410w7.desktop.isilon.com (localhost [127.0.0.1]) (authenticated bits=0) by x.digitalelves.com (8.14.5/8.14.5) with ESMTP id r0EH3Wi0006662; Mon, 14 Jan 2013 11:04:06 -0600 (CST) (envelope-from cattelan@thebarn.com) Message-ID: <50F43A64.8090502@thebarn.com> Date: Mon, 14 Jan 2013 11:03:32 -0600 From: Russell Cattelan User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com, Ben Myers Subject: Re: oss.sgi.com migration References: <50F0B92A.9000500@sgi.com> <20130113230247.GB19173@dastard> <50F388EE.6060603@thebarn.com> <20130114154509.GC27055@sgi.com> X-ASG-Orig-Subj: Re: oss.sgi.com migration In-Reply-To: <20130114154509.GC27055@sgi.com> X-Enigmail-Version: 1.4.6 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigA4486FBE3F4B8F50B1448A74" X-Barracuda-Connect: x.digitalelves.com[209.98.77.55] X-Barracuda-Start-Time: 1358183047 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-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.2.119848 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigA4486FBE3F4B8F50B1448A74 Content-Type: multipart/mixed; boundary="------------040706090905080202020201" This is a multi-part message in MIME format. --------------040706090905080202020201 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 1/14/13 9:45 AM, Ben Myers wrote: > Hey Russell, >=20 > On Sun, Jan 13, 2013 at 10:26:22PM -0600, Russell Cattelan wrote: >> On 1/13/13 5:02 PM, Dave Chinner wrote: >>> On Fri, Jan 11, 2013 at 05:15:22PM -0800, Trevor Hurst wrote: >>>> This is to inform you that oss.sgi.com will be unavailable on >>>> Sunday, January 13th between 4:00pm and 6:00pm PST for a >>>> migration. We are migrating the server to a virtual environment and >>>> adding some new tools and features. >>>> >>>> Please plan accordingly and sorry for the inconvenience. >>> >>> git fetches from oss.sgi.com seem to be hanging. The connection gets >>> established, but no data comes down the pipe from the server. As >>> such, my hourly cron job that pulls from oss.sgi.com trees has been >>> failing for the last 12 hours.... >> So I'll use this as a test to the list. >> >> I'm still working on getting the daemon online. >=20 > It appears to be working this morning. Thanks! Yup I think I got all the bits installed and configured last night. But it was getting late and I was pretty tired so let me know if something still isn't quite right. Hopefully mail is stable and happy -- but please let me know as the new system is using postfix vs sendmail so some permission fixup were needed. (Note I fixed the issue with spamassassin this morning= ) Note I have not moved over the mharc web mail stuff since mailman's pipermail interface is the standard. Unless somebody really says we need the old unsupported mharc web interface I would prefer not maintaining it any longer. -Russell >=20 > Regards, > Ben >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 --------------040706090905080202020201 Content-Type: text/x-vcard; charset=utf-8; name="cattelan.vcf" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="cattelan.vcf" begin:vcard fn:Russell Cattelan n:Cattelan;Russell org:Digital Elves Inc adr:;;2824 Lakeview Ave;Roseville;MN;55113;usa email;internet:cattelan@digitalelves.com tel;work:612 293 6009 tel;cell:612 805 3144 x-mozilla-html:FALSE url:http://digitalelves.com version:2.1 end:vcard --------------040706090905080202020201-- --------------enigA4486FBE3F4B8F50B1448A74 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (Darwin) Comment: Using GnuPG with undefined - http://www.enigmail.net/ iEYEARECAAYFAlD0OmYACgkQNRmM+OaGhBjMJwCfVrtYwapJsxvPNVdDYBO2MxC3 NXEAn2wj1tK+cDo5ORBmgIWdii/hn5KF =k3rl -----END PGP SIGNATURE----- --------------enigA4486FBE3F4B8F50B1448A74-- From adahl@sgi.com Mon Jan 14 12:15:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 130597F37 for ; Mon, 14 Jan 2013 12:15:14 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay1.corp.sgi.com (Postfix) with ESMTP id EEFCE8F8052 for ; Mon, 14 Jan 2013 10:15:10 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 14 Jan 2013 12:15:10 -0600 Message-ID: <50F44B2E.9050408@sgi.com> Date: Mon, 14 Jan 2013 12:15:10 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: [PATCH 0/4] Refactor release scripts to conform to using git archive Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.232.133] The following four patches fix an issue seen during the last user space release where not all source files were included in xfsprogs. They each change xfsprogs, xfstests, xfsdump, and dmapi to all use git archive for source tarball generation and add 'make realclean' in the release scripts to ensure the configure and m4/autotools temp files are refreshed. -Andrew From adahl@sgi.com Mon Jan 14 12:16:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 78E267F37 for ; Mon, 14 Jan 2013 12:16:06 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A99B304048 for ; Mon, 14 Jan 2013 10:16:03 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 14 Jan 2013 12:16:02 -0600 Message-ID: <50F44B62.7060504@sgi.com> Date: Mon, 14 Jan 2013 12:16:02 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: [PATCH 1/4] xfsprogs: Refactor release scripts to conform to using git archive References: <50F44B2E.9050408@sgi.com> In-Reply-To: <50F44B2E.9050408@sgi.com> Content-Type: multipart/mixed; boundary="------------090905070107030308010000" X-Originating-IP: [128.162.232.133] --------------090905070107030308010000 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------090905070107030308010000 Content-Type: text/x-patch; name="xfsprogs-release-refactor.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfsprogs-release-refactor.patch" Refactored release scripts to conform to using git archive When generating a release, there is a risk of missing necessary source files. This is fixed by using git archive, which also fixes the lack of conformity between the xfs utilities. As well, some files may be stale during packaging. This is fixed with a clean at the beginning of release generation. Signed-off-by: Andrew Dahl --- Makefile | 11 ++++++++--- release.sh | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 0bdc5e8..e73af88 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,8 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.ac release.sh README VERSION $(CONFIGURE) +SRCTARINC = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 po/xfsprogs.pot $(CONFIGURE) LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ conftest* built .census install.* install-dev.* *.gz \ @@ -144,7 +146,10 @@ $(SRCDIR) : $(_FORCE) rm -fr $@ mkdir -p $@ -$(SRCTAR) : default $(SRCDIR) - $(Q)$(MAKE) $(MAKEOPTS) source-link - unset TAPE; $(TAR) -cf - $(SRCDIR) | $(ZIP) --best > $@ && \ +$(SRCTAR) : default + $(Q)git archive --prefix=$(SRCDIR)/ --format=tar v$(PKG_VERSION) \ + -o $(SRCDIR).tar + $(Q)$(TAR) --transform "s,^,$(SRCDIR)/," -rf $(SRCARC).tar \ + $(SRCTARINC) + $(Q)$(ZIP) $(SRCDIR).tar echo Wrote: $@ diff --git a/release.sh b/release.sh index debdb81..db5cc74 100755 --- a/release.sh +++ b/release.sh @@ -8,6 +8,9 @@ version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION} date=`date +"%-d %B %Y"` +echo "Cleaning up" +make realclean + echo "Updating CHANGES" sed -e "s/${version}.*/${version} (${date})/" doc/CHANGES > doc/CHANGES.tmp && \ mv doc/CHANGES.tmp doc/CHANGES -- 1.7.1 --------------090905070107030308010000-- From adahl@sgi.com Mon Jan 14 12:16:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 55AA37F37 for ; Mon, 14 Jan 2013 12:16:40 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29C3C8F8050 for ; Mon, 14 Jan 2013 10:16:40 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 14 Jan 2013 12:16:39 -0600 Message-ID: <50F44B87.3040102@sgi.com> Date: Mon, 14 Jan 2013 12:16:39 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: [PATCH 2/4] xfsdump: Refactor release scripts to conform to using git archive References: <50F44B2E.9050408@sgi.com> In-Reply-To: <50F44B2E.9050408@sgi.com> Content-Type: multipart/mixed; boundary="------------060305050600030702060709" X-Originating-IP: [128.162.232.133] --------------060305050600030702060709 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------060305050600030702060709 Content-Type: text/x-patch; name="xfsdump-release-refactor.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfsdump-release-refactor.patch" Refactored release scripts to conform to using git archive When generating a release, there is a risk of some files being stale, such as configure and the m4/autotools temp files. This is fixed with a clean at the beginning of the release generation. In addition, there is no uniformity in the current method of source tar generation between xfs utilities. Using git archive solves this issue accross all utilities. Signed-off-by: Andrew Dahl --- Makefile | 11 ++++++++--- release.sh | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 39881af..23b6a9e 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,8 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.ac release.sh README VERSION $(CONFIGURE) +SRCTARINC = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ + m4/ltversion.m4 $(CONFIGURE) LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ conftest* built .census install.* install-dev.* *.gz \ @@ -124,7 +126,10 @@ $(SRCDIR) : $(_FORCE) rm -fr $@ mkdir -p $@ -$(SRCTAR) : default $(SRCDIR) - $(Q)$(MAKE) $(MAKEOPTS) source-link - unset TAPE; $(TAR) -cf - $(SRCDIR) | $(ZIP) --best > $@ && \ +$(SRCTAR) : default + $(Q)git archive --prefix=$(SRCDIR)/ --format=tar v$(PKG_VERSION) \ + -o $(SRCDIR).tar + $(Q)$(TAR) --transform "s,^,$(SRCDIR)/," -rf $(SRCDIR).tar \ + $(SRCTARINC) + $(Q)$(ZIP) $(SRCDIR).tar echo Wrote: $@ diff --git a/release.sh b/release.sh index 25a1732..e34b397 100755 --- a/release.sh +++ b/release.sh @@ -8,6 +8,9 @@ version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION} date=`date +"%-d %B %Y"` +echo "Cleaning up" +make realclean + echo "Updating CHANGES" sed -e "s/${version}.*/${version} (${date})/" doc/CHANGES > doc/CHANGES.tmp && \ mv doc/CHANGES.tmp doc/CHANGES -- 1.7.1 --------------060305050600030702060709-- From adahl@sgi.com Mon Jan 14 12:17:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 0B6FF7F37 for ; Mon, 14 Jan 2013 12:17:10 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2FD4304064 for ; Mon, 14 Jan 2013 10:17:09 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 14 Jan 2013 12:17:09 -0600 Message-ID: <50F44BA5.9030509@sgi.com> Date: Mon, 14 Jan 2013 12:17:09 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: [PATCH 3/4] xfstests: Refactor release scripts to conform to using git archive References: <50F44B2E.9050408@sgi.com> In-Reply-To: <50F44B2E.9050408@sgi.com> Content-Type: multipart/mixed; boundary="------------010905030109090905040701" X-Originating-IP: [128.162.232.133] --------------010905030109090905040701 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------010905030109090905040701 Content-Type: text/x-patch; name="xfstests-release-refactor.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfstests-release-refactor.patch" Refactored release scripts to conform to using git archive When generating a release, there is a risk of some files being stale, such as configure and the m4/autotools temp files. This is fixed with a clean at the beginning of release generation. In addition, there is no uniformity in the current method of source tar generation between xfs utilities. Using git archive solves this issue across all utilities. Signed-off-by: Andrew Dahl --- Makefile | 20 ++++++++++++++++++++ release.sh | 11 +++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) mode change 100644 => 100755 release.sh diff --git a/Makefile b/Makefile index b68ec11..a0aef85 100644 --- a/Makefile +++ b/Makefile @@ -39,12 +39,17 @@ ifeq ($(HAVE_BUILDDEFS), yes) include $(TOPDIR)/include/builddefs endif +SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz + TESTS = $(shell sed -n -e '/^[0-9][0-9][0-9]*/s/ .*//p' group) CONFIGURE = configure include/builddefs include/config.h LSRCFILES = configure configure.ac aclocal.m4 README VERSION LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ conftest* check.log check.time +ifeq ($(HAVE_BUILDDEFS), yes) +LDIRT += $(SRCTAR) +endif LIB_SUBDIRS = include lib TOOL_SUBDIRS = ltp src m4 @@ -102,3 +107,18 @@ install-dev install-lib: realclean distclean: clean $(Q)rm -f $(LDIRT) $(CONFIGURE) $(Q)rm -rf autom4te.cache Logs + +dist: include/builddefs include/config.h default +ifeq ($(HAVE_BUILDDEFS), no) + $(Q)$(MAKE) $(MAKEOPTS) -C . $@ +else + $(Q)$(MAKE) $(MAKEOPTS) $(SRCTAR) +endif + +$(SRCTAR) : default + $(Q)git archive --prefix=$(PKG_NAME)-$(PKG_VERSION)/ --format=tar \ + v$(PKG_VERSION) -o $(PKG_NAME)-$(PKG_VERSION).tar + $(Q)$(TAR) --transform "s,^,$(PKG_NAME)-$(PKG_VERSION)/," \ + -rf $(PKG_NAME)-$(PKG_VERSION).tar $(CONFIGURE) + $(Q)$(ZIP) $(PKG_NAME)-$(PKG_VERSION).tar + echo Wrote: $@ diff --git a/release.sh b/release.sh old mode 100644 new mode 100755 index 65e4e4b..5b78ec7 --- a/release.sh +++ b/release.sh @@ -8,6 +8,9 @@ version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION} date=`date +"%-d %B %Y"` +echo "Cleaning up" +make realclean + echo "Updating CHANGES" sed -e "s/${version}.*/${version} (${date})/" doc/CHANGES > doc/CHANGES.tmp && \ mv doc/CHANGES.tmp doc/CHANGES @@ -18,6 +21,10 @@ git commit -s -a -m "${version} release" echo "Tagging git repository" git tag -s -a -m "${version} release" v${version} -echo "Done. Please remember to push out tags using \"git push --tags\"" -echo "If you wish to create a source tarball, run \"make dist\"" +echo "Making source tarball" +make dist +echo "Sign the source tarball" +gpg --detach-sign xfstests-${version}.tar.gz + +echo "Done. Please remember to push out tags using \"git push --tags\"" -- 1.7.1 --------------010905030109090905040701-- From adahl@sgi.com Mon Jan 14 12:17:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 27F7C7F37 for ; Mon, 14 Jan 2013 12:17:38 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE9548F8050 for ; Mon, 14 Jan 2013 10:17:37 -0800 (PST) Received: from localhost.localdomain (128.162.232.133) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 14 Jan 2013 12:17:37 -0600 Message-ID: <50F44BC0.80708@sgi.com> Date: Mon, 14 Jan 2013 12:17:36 -0600 From: Andrew Dahl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Subject: [PATCH 4/4] dmapi: Refactor release scripts to conform to using git archive References: <50F44B2E.9050408@sgi.com> In-Reply-To: <50F44B2E.9050408@sgi.com> Content-Type: multipart/mixed; boundary="------------020209030106080406070601" X-Originating-IP: [128.162.232.133] --------------020209030106080406070601 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit --------------020209030106080406070601 Content-Type: text/x-patch; name="dmapi-release-refactor.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dmapi-release-refactor.patch" Refactored release scripts to conform to using git archive When generating a release, there is a risk of some files being stale, such as configure and the m4/autotools temp files. This is fixed with a clean at the beginning of release generation. In addition, there is no uniformity in the current method of source tar generation between xfs utilities. Using git archive solves this issue across all utilities. Signed-off-by: Andrew Dahl --- Makefile | 19 +++++++++++++++++++ Makepkgs | 4 ++-- build/Makefile | 22 +--------------------- release.sh | 5 ++++- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index 0bddb07..58e5caf 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,8 @@ ifeq ($(HAVE_BUILDDEFS), yes) include $(TOPDIR)/include/builddefs endif +SRCTAR=$(PKG_NAME)-$(PKG_VERSION).tar.gz + CONFIGURE = aclocal.m4 configure config.guess config.sub configure install-sh \ ltmain.sh m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ m4/ltversion.m4 m4/lt~obsolete.m4 @@ -84,3 +86,19 @@ distclean: clean realclean: distclean rm -f $(CONFIGURE) + +dist: default +ifeq ($(HAVE_BUILDDEFS), no) + $(MAKE) $(MAKEOPTS) -C . $@ +else + $(MAKE) $(MAKEOPTS) $(SRCTAR) + $(MAKE) $(MAKEOPTS) -C build dist +endif + +$(SRCTAR) : default + git archive --prefix=$(PKG_NAME)-$(PKG_VERSION)/ --format=tar \ + v$(PKG_VERSION) -o $(PKG_NAME)-$(PKG_VERSION).tar + $(TAR) --transform "s,^,$(PKG_NAME)-$(PKG_VERSION)/," \ + -rf $(PKG_NAME)-$(PKG_VERSION).tar $(CONFIGURE) + $(ZIP) $(PKG_NAME)-$(PKG_VERSION).tar + echo Wrote: $@ diff --git a/Makepkgs b/Makepkgs index e3f9e0c..da08617 100755 --- a/Makepkgs +++ b/Makepkgs @@ -79,9 +79,9 @@ echo echo "== dist, log is $LOGDIR/dist" [ ! -f .census ] && touch .census if $verbose ; then - $MAKE -C build dist 2>&1 | tee $LOGDIR/dist + $MAKE dist 2>&1 | tee $LOGDIR/dist else - $MAKE -C build dist > $LOGDIR/dist 2>&1 || exit 1 + $MAKE dist > $LOGDIR/dist 2>&1 || exit 1 grep '^Wrote:' $LOGDIR/dist | sed -e 's/\.\.\/\.\.\///' fi diff --git a/build/Makefile b/build/Makefile index 200c249..96341a3 100644 --- a/build/Makefile +++ b/build/Makefile @@ -5,9 +5,6 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs -MANIFEST=src-manifest -SRCTAR=$(PKG_NAME)-$(PKG_VERSION).tar.gz - LDIRT = *-manifest *.gz $(TOPDIR)/$(PKG_NAME)-* # for clean and clobber @@ -18,24 +15,7 @@ default install install-dev install-lib: include $(BUILDRULES) -# Symlink in the TOPDIR is used to pack files relative to -# product-version directory. -$(MANIFEST) : $(_FORCE) - @if [ ! -L $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION) ] ; then \ - $(LN_S) . $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION) ; \ - fi - @CDIR=`pwd`; cd $(TOPDIR); \ - $(MAKE) --no-print-directory source | \ - sed -e 's/^\./$(PKG_NAME)-$(PKG_VERSION)/' > $$CDIR/$@ ;\ - if [ $$? -ne 0 ] ; then \ - exit 1; \ - else \ - unset TAPE; \ - $(TAR) -T $$CDIR/$@ -cf - | $(ZIP) --best > $$CDIR/$(SRCTAR); \ - echo Wrote: $$CDIR/$(SRCTAR); \ - fi - -dist : default $(MANIFEST) +dist : default @DIST_MANIFEST=`pwd`/bin-manifest; DIST_ROOT=/tmp/$$$$; \ export DIST_MANIFEST DIST_ROOT; \ rm -f $$DIST_MANIFEST; \ diff --git a/release.sh b/release.sh index 31d5e96..f1ec9b2 100755 --- a/release.sh +++ b/release.sh @@ -3,11 +3,14 @@ # Automate generation a new release # -. VERSION +. ./VERSION version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION} date=`date +"%-d %B %Y"` +echo "Cleaning up" +make realclean + echo "Updating CHANGES" sed -e "s/${version}.*/${version} (${date})/" doc/CHANGES > doc/CHANGES.tmp && \ mv doc/CHANGES.tmp doc/CHANGES -- 1.7.1 --------------020209030106080406070601-- From david@fromorbit.com Mon Jan 14 16:03:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CDB7C7F37 for ; Mon, 14 Jan 2013 16:03:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A92938F8035 for ; Mon, 14 Jan 2013 14:03:19 -0800 (PST) X-ASG-Debug-ID: 1358200995-04cb6c02380f670001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JAnHdLzKU7E8AdmS for ; Mon, 14 Jan 2013 14:03:15 -0800 (PST) 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: Av0OAE9/9FB5LEIF/2dsb2JhbABEhVGyFYJegzYXc4IeAQEFOhwjEAgDGAklDwUlAyETiBinYY4IFYxiCgWEKAOWCpBKgwmBUwgX Received: from ppp121-44-66-5.lns20.syd6.internode.on.net (HELO dastard) ([121.44.66.5]) by ipmail05.adl6.internode.on.net with ESMTP; 15 Jan 2013 08:33:14 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tus7S-0000M8-Ky; Tue, 15 Jan 2013 09:03:02 +1100 Date: Tue, 15 Jan 2013 09:03:02 +1100 From: Dave Chinner To: Russell Cattelan Cc: xfs@oss.sgi.com, Ben Myers Subject: Re: oss.sgi.com migration Message-ID: <20130114220302.GG19173@dastard> X-ASG-Orig-Subj: Re: oss.sgi.com migration References: <50F0B92A.9000500@sgi.com> <20130113230247.GB19173@dastard> <50F388EE.6060603@thebarn.com> <20130114154509.GC27055@sgi.com> <50F43A64.8090502@thebarn.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F43A64.8090502@thebarn.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: 1358200995 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.119868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 14, 2013 at 11:03:32AM -0600, Russell Cattelan wrote: > On 1/14/13 9:45 AM, Ben Myers wrote: > > Hey Russell, > > > > On Sun, Jan 13, 2013 at 10:26:22PM -0600, Russell Cattelan wrote: > >> On 1/13/13 5:02 PM, Dave Chinner wrote: > >>> On Fri, Jan 11, 2013 at 05:15:22PM -0800, Trevor Hurst wrote: > >>>> This is to inform you that oss.sgi.com will be unavailable on > >>>> Sunday, January 13th between 4:00pm and 6:00pm PST for a > >>>> migration. We are migrating the server to a virtual environment and > >>>> adding some new tools and features. > >>>> > >>>> Please plan accordingly and sorry for the inconvenience. > >>> > >>> git fetches from oss.sgi.com seem to be hanging. The connection gets > >>> established, but no data comes down the pipe from the server. As > >>> such, my hourly cron job that pulls from oss.sgi.com trees has been > >>> failing for the last 12 hours.... > >> So I'll use this as a test to the list. > >> > >> I'm still working on getting the daemon online. > > > > It appears to be working this morning. Thanks! > Yup I think I got all the bits installed and configured last night. > But it was getting late and I was pretty tired so let me know > if something still isn't quite right. > > Hopefully mail is stable and happy -- but please let me know as > the new system is using postfix vs sendmail so some permission > fixup were needed. (Note I fixed the issue with spamassassin this morning) Who's the list moderator now? I sent a patch last night that exceeded the message body size limits of 500k. it came in at around 820k, and so is now waiting for the moderator to let it through. I've sent larger patches in the past, so maybe the size limit has been reduced? Cheers, Dave. -- Dave Chinner david@fromorbit.com From czjysk@zgwj.gov.cn Mon Jan 14 16:44:20 2013 Return-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=FORGED_OUTLOOK_HTML, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 85C957F37 for ; Mon, 14 Jan 2013 16:44:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C8088F804C for ; Mon, 14 Jan 2013 14:44:20 -0800 (PST) X-ASG-Debug-ID: 1358203455-04cbb0132711e50001-w1Z2WR Received: from zgwj.gov.cn ([58.211.71.48]) by cuda.sgi.com with ESMTP id bc1rnuzr9OrwwQvn for ; Mon, 14 Jan 2013 14:44:16 -0800 (PST) X-Barracuda-Envelope-From: czjysk@zgwj.gov.cn X-Barracuda-Apparent-Source-IP: 58.211.71.48 Received: from ohwm (unknown [110.52.2.213]) by app2 (Coremail) with SMTP id CgH+_bDrn1yhh_RQgIDLBg--.7056S2; Tue, 15 Jan 2013 06:33:06 +0800 (CST) Message-ID: From: =?utf-8?B?5r2Y56eS5LqR?= To: Subject: =?utf-8?B?56CU5Y+R6aKG5a+85p2D5aiB5Yqb55qE5p2l5rqQLea9mOenkuS6kQ==?= Date: Tue, 15 Jan 2013 06:46:53 +0800 X-ASG-Orig-Subj: =?utf-8?B?56CU5Y+R6aKG5a+85p2D5aiB5Yqb55qE5p2l5rqQLea9mOenkuS6kQ==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0F76_01C4C70E.11CDA5F0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-CM-TRANSID:CgH+_bDrn1yhh_RQgIDLBg--.7056S2 X-Coremail-Antispam: 1UD129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UjIYCTnIWjp_UUUY47I2x7xF5VAaw2AFwI0_GFyj6rW5JwAY jsxI4VW7JwAYFVCjjxCrM7AC8VAFwI0_Gr0_Xr1l1xkIjI8I6I8E6xAIw20EY4v20xvaj4 0_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xv wVC0I7IYx2IY6xkF7I0E14v26r4UJVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4 x0Y4vEx4A2jsIEc7CjxVAFwI0_GcCE3s1le4C267I2x7xF54xIwI1l57IF6xkI12xvs2x2 6I8E6xACxx1lYx0Ex4A2jsIE14v26r1j6r4UM4x0Y48IcxkI7VAKI48JM4xvF2IEb7IF0F y264kE64k0F24lFcxC0VAqx4xG64AKrs4lFIxGxcIEc7CjxVA2Y2ka0xkIwI1lw4CE7480 Y4vE14AKx2xKxVC2ax8xMxkF7I0Ew4C26cxK6c8Ij28IcwCF04k20xvY0x0EwIxGrwCF54 CYxVAaw2AFwI0_ZF0_GFyUMxAqzxv26xkF7I0En4kS14v26r4UJr0_Xr1UJwC2zVAF1VAY 17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcV C0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWrJr0_WFyUJwCI 42IY6I8E87Iv67AKxVW8Jr0_Cr1UMIIF0xvEx4A2jsIEc7CjxVAFwI0_GcCE3sUvcSsGvf C2KfnxnUUI43ZEXa7xR_qXHtUUUUU== X-CM-SenderInfo: 5f2m523n62w4nmoj04gofq/ X-Barracuda-Connect: UNKNOWN[58.211.71.48] X-Barracuda-Start-Time: 1358203456 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0113c, BSF_SC5_MJ1963, FORGED_OUTLOOK_HTML, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 FORGED_OUTLOOK_HTML Outlook can't send HTML message only 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_NextPart_000_0F76_01C4C70E.11CDA5F0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMTkzOTMiPjwvSEVBRD4NCjxCT0RZPjxGT05UIHNpemU9Mj48 QSBjbGFzcz1za2lwIGhyZWY9Imh0dHA6Ly9kYXkuMjM0NS5jb20vZ2FveGlhby8yMDEzMDE0ODI5 MyIgDQp0YXJnZXQ9X2JsYW5rPjwvQT4NCjxESVYgY2xhc3M9dGI+DQo8SDQgY2xhc3M9dGJfdGl0 bGU+6ICB5rm/77yM5Z2R54i55b6I5pyJ5oSP5oCd5piv5ZCnPC9IND4NCjxESVYgY2xhc3M9dGJf dGl0bGU+PFNQQU4+PEZPTlQgc2l6ZT0xPjIwMTMtMS0xNSZuYnNwOyANCjY6NDc6MDU8QlI+PEJS PjwvRk9OVD48L1NQQU4+PC9ESVY+DQo8RElWIGNsYXNzPXRiX3RpdGxlPjxTUEFOPjwvU1BBTj7l joblj7LogIPor5XpgInmi6npopjvvJo8L0RJVj4NCjxQPum7hOiKseWyl+i1t+S5ieesrOS4gOae quiwgeW8gOeahO+8nzwvUD4NCjxQPkHlrovmlZnku4EgQuWtmeS4reWxsSBD6buE5YW0IETlvpDp lKHpup/vvIzogIPnlJ/pgIlD44CCPC9QPg0KPFA+5Y+I55yL56ys5LqM6aKY77yaPC9QPg0KPFA+ 6buE6Iqx5bKX6LW35LmJ56ys5LqM5p6q6LCB5byA55qE77yfPC9QPg0KPFA+6ICD55Sf5YK75LqG 77yM5bCx6YCJ5LqG5LiqQuOAgjwvUD4NCjxQPuaOpeedgOeci+esrOS4iemimO+8jOm7hOiKseWy l+i1t+S5ieS4re+8jOesrOS4ieaequiwgeW8gOeahO+8nzwvUD4NCjxQPuiAg+eUn+eWr+S6hu+8 jOiDoeS5semAieS6hkHjgII8L1A+DQo8UD7ogIPor5Xlh7rmnaXlsLHljrvmib7lh7rljbfogIHl uIjjgII8L1A+DQo8UD7ogIHluIjmi7/lh7ror77mnKzor7Q66buE5YW06L+e5byA5LiJ5p6q77yM 5o+t5byA5LqG6buE6Iqx5bKX6LW35LmJ55qE5bqP5bmV4oCm4oCmPEJSPjxCUj48QSBjbGFzcz1z a2lwIA0KaHJlZj0iaHR0cDovL2RheS4yMzQ1LmNvbS9nYW94aWFvLzIwMTMwMTQ4MjkzIiB0YXJn ZXQ9X2JsYW5rPjwvQT48Rk9OVCANCnNpemU9Mz4tLS0mbmJzcDvmr4/ml6XkuIDnrJEtLS0tLS08 QlI+PC9GT05UPn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn48QlI+PC9GT05UPjxTVFJPTkc+5p+l 5pS26ZmE5Lu2fn5+fjwvU1RST05HPiANCjwvUD48L0RJVj48L0JPRFk+PC9IVE1MPg0K ------=_NextPart_000_0F76_01C4C70E.11CDA5F0 Content-Type: application/vnd.ms-excel; name=cqqtn.xls Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=lih.xls 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAQwAAAAAAAAAA EAAA/v///wAAAAD+////AAAAAEIAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////8J CBAAAAYFAJsgzQfJwAAABgMAAOEAAgCwBMEAAgAAAOIAAABcAHAABAABrl9vjyh1N2IgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIAAgCwBGEBAgAAAMABAAA9AQIA AQCcAAIADgAZAAIAAAASAAIAAAATAAIAAACvAQIAAAC8AQIAAAA9ABIA4AFpABNHkTI4AAAAAAAB AFgCQAACAAAAjQACAAAAIgACAAAADgACAAEAtwECAAAA2gACAAAAMQAUAPAAAAD/f5ABAAAAAIbs AgGLW1NPMQAUAPAAMAD/f5ABAAAAAIbsAgGLW1NPMQAUAPAAMAD/f5ABAAAAAIbsAgGLW1NPMQAU APAAMAD/f5ABAAAAAIbsAgGLW1NPMQAUAPAAAAD/f5ABAAAAAIbsAgGLW1NPMQAUAPAABAAMAJAB AAABAIbsAgGLW1NPMQAUAPAABAAkAJABAAABAIbsAgGLW1NPMQAUALQAAAD/f5ABAAAAAIbsAgGL W1NPMQAUAMgAAAD/f5ABAAAAAIbsAgGLW1NPMQAUALQAAwAUALwCAAAAAIbsAgGLW1NPMQAUABgB AQD/f7wCAAAAAIbsAgHRnlNPMQAUAMgAAQA+ALwCAAAAAIbsAgGLW1NPMQAUAMgAAQAKALwCAAAA AIbsAgGLW1NPHgQrAAUAEwABIgDl/yIAIwAsACMAIwAwADsAIgDl/yIAXAAtACMALAAjACMAMAAe BDUABgAYAAEiAOX/IgAjACwAIwAjADAAOwBbAFIAZQBkAF0AIgDl/yIAXAAtACMALAAjACMAMAAe BDcABwAZAAEiAOX/IgAjACwAIwAjADAALgAwADAAOwAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAw AB4EQQAIAB4AASIA5f8iACMALAAjACMAMAAuADAAMAA7AFsAUgBlAGQAXQAiAOX/IgBcAC0AIwAs ACMAIwAwAC4AMAAwAB4EaQAqADIAAV8AIAAiAOX/IgAqACAAIwAsACMAIwAwAF8AIAA7AF8AIAAi AOX/IgAqACAAXAAtACMALAAjACMAMABfACAAOwBfACAAIgDl/yIAKgAgACIALQAiAF8AIAA7AF8A IABAAF8AIAAeBC4AKQApAABfICogIywjIzBfIDtfICogXC0jLCMjMF8gO18gKiAiLSJfIDtfIEBf IB4EeQAsADoAAV8AIAAiAOX/IgAqACAAIwAsACMAIwAwAC4AMAAwAF8AIAA7AF8AIAAiAOX/IgAq ACAAXAAtACMALAAjACMAMAAuADAAMABfACAAOwBfACAAIgDl/yIAKgAgACIALQAiAD8APwBfACAA OwBfACAAQABfACAAHgQ2ACsAMQAAXyAqICMsIyMwLjAwXyA7XyAqIFwtIywjIzAuMDBfIDtfICog Ii0iPz9fIDtfIEBfIB4EGgAXABUAAFwkIywjIzBfKTtcKFwkIywjIzBcKR4EHwAYABoAAFwkIywj IzBfKTtbUmVkXVwoXCQjLCMjMFwpHgQgABkAGwAAXCQjLCMjMC4wMF8pO1woXCQjLCMjMC4wMFwp HgQlABoAIAAAXCQjLCMjMC4wMF8pO1tSZWRdXChcJCMsIyMwLjAwXCkeBGUAsAAwAAFfAC0AIgDl /yIAKgAgACMALAAjACMAMABfAC0AOwBcAC0AIgDl/yIAKgAgACMALAAjACMAMABfAC0AOwBfAC0A IgDl/yIAKgAgACIALQAiAF8ALQA7AF8ALQBAAF8ALQAeBHUAsQA4AAFfAC0AIgDl/yIAKgAgACMA LAAjACMAMAAuADAAMABfAC0AOwBcAC0AIgDl/yIAKgAgACMALAAjACMAMAAuADAAMABfAC0AOwBf AC0AIgDl/yIAKgAgACIALQAiAD8APwBfAC0AOwBfAC0AQABfAC0A4AAUAAAAAAD1/xAAAAAAAAAA AAAAAMAg4AAUAAEAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAEAAAD1/xAAAPQAAAAAAAAAAMAg4AAU AAIAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAIAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAA APQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAA AMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAA AAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQA AAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg 4AAUAAAAAAABABAAAAAAAAAAAAAAAMAg4AAUAAUACQD1/xAAAPgAAAAAAAAAAMAg4AAUAAUAAAD1 /yAAAAAAAAAAAAAAAMAg4AAUAAYAAAD0/wAAAPQAAAAAAAAAAMAg4AAUAAYAAAD1/xAAAPQAAAAA AAAAAMAg4AAUAAUAsQD1/xAAAPgAAAAAAAAAAMAg4AAUAAUAsAD1/xAAAPgAAAAAAAAAAMAg4AAU AAUAKwD1/xAAAPgAAAAAAAAAAMAg4AAUAAUAKQD1/xAAAPgAAAAAAAAAAMAg4AAUAAcAAAD0/wAA APQAAAAAAAAAAMAg4AAUAAAAAAABABAAAEgAAAAAAAAABAkg4AAUAAkAAAABABAAAGgCAj4APgAA BDEg4AAUAAoAAAAxASMAAHgAAgAAPgAABDEg4AAUAAkAAAABABAAAGggAgAfPgAABDEg4AAUAAkA AAABABAAAGgCAD4AAAAABDEg4AAUAAsAAAABACIAAHgAAAAAAAAABDEg4AAUAAkAAAABABAAAGgg AAAfAAAABDEg4AAUAAkAAAABACIAAHgAAAAAAAAABDEg4AAUAAUAAAARASAAAEgAAAAAAAAABAkg 4AAUAAkAAAARASAAAGgCAD4AAAAABC4g4AAUAAkAAAARASAAAGgAAAAAAAAABC4g4AAUAAkAAAAR ASAAAGggAAAfAAAABC4g4AAUAAkAAAABABAAAGgCAD4AAAAABAkg4AAUAAkAAAABABAAAGgAAAAA AAAABAkg4AAUAAkAAAABABAAAGggAAAfAAAABAkg4AAUAAwAAAABABAAAGgAAAAAAAAABAkg4AAU AAkAAAABABAAAGgCAD4AAAAABC4g4AAUAAkAAAABABAAAGgAAAAAAAAABC4g4AAUAAkAAAABABAA AGggAAAfAAAABC4g4AAUAAkAAAABABAAAGgCAD4AAAAABCkg4AAUAAkAAAABABAAAGgAAAAAAAAA BCkg4AAUAAkAAAABABAAAGggAAAfAAAABCkg4AAUAAkAAAAJABAAAGgAAAAAAAAABCkg4AAUAAAA AAABABEAAFgAAAAAAAAABAkg4AAUAAkAAAABABAAAGgCID4AAB8ABCkg4AAUAAkAAAABABAAAGgA IAAAAB8ABCkg4AAUAAkAAAABABAAAGggIAAfAB8ABCkg4AAUAAkAAAABABAAAEgAAAAAAAAABAkg 4AAUAA0AAAABABgAAHgAAAAAAAAABAkgkwIEABCABf+TAgQAAIAA/5MCFwARAAkAAThexIlfAFMA aABlAGUAdAAxAJMCBAASgAj/kwIbABMACwABhY3+lKVjXwDOToBiL2dwjRFUoXsGdJMCBAAUgAT/ kwIEABWAB/+TAgQAFoAD/5MCBAAXgAb/kwIEABiACf9gAQIAAACFABYA9DIAAAAABwHOToBiL2dw jRFUoXsGdIwABABWAFYArgEEAAEAAQQXAAgAAQAAAAAAAADBAQgAwQEAACK+AQD8ACAgwgAAAMIA AAAGAAEQMKViDVTmi8VgETAPAAEQMH9inlJVU01PETABTyAAGk4gAGZbIABgTiAAUX8vAAEQMPlX rYv5W2GMETABTxpOQwBFAE8ALwA7YM9+BnQBMBR40VM7YM9+BnQvAG9SO2ABMGxR+FM7YOVdLwCA Yi9nO2DRdgEwFHjRU3mY7nbPfgZ0LwCnTsFUz34GdAEwMgABIAAgACAAIAAgACAAIAAgACAAIAAg ACAALU7Vi+iQz34GdAEwFHjRUyiNz5HokM9+BnQBMFAATQBPAAj/eZjudqF7BnSeUmxRpFsJ/ztO +04BMKF7BnSXXE1PhHaAYi9nuk5YVCcAASAAIAAgACAAIAAgACAAIAAgACAAIAAATrpONmU5jTIA NgAwADAAQ1ECMAj/K1QkTilZLU4QmQEwB2OaW1llUGcBMMGLZk4BMDaDuXAJ/wYAARAw/osLesyA b2YRMC0AAQAwADA5aG5jEWLsThpZdF7OTotOFHjRU6F7BnSoVOKLhHbPfoya0VOwcy1O/VYBTxpO OQA1ACUAIADlTgpOhHYUeNFTLU76V0JcO06he/2QL2bOToBiL2f9gA8AAZtS1GuDjzpfhHblXQt6 CF4tTtBj1GJ3jWVnhHY6ACMAASAAIAAgACAAiF8aWRpSGlJwjQpOoXsGdJdcTU+EdhR40VO6TlhU 0olygg1O/YBsj2JjDP/Hj6Zec1HobIBiL2fGfoKCG/8TAAEgACAAIAAgAKSLH3cuXqlSC05eXO9T L2bWTuxOdl4NTnBOJo0b/x0AASAAIAAgACAA4VGLTrJOm1KyTjpODP/ZX5dfJnE0WcJwnZgM/+9T L2YKTvhTdFPMWkhlh3MqWU5PG/8gAAEgACAAIAAgAAxeG2cLTl5cGlnQYw9hwYkM/+9TL2bWTuxO dFPATkhO/ZANTvSLDP8NTj9hD2F/YsViI437Thv/FQABIAAgACAAIAAKTvhTqYs2Uppb5V1cT6GL ElIM/+9TdFPgZc5OC05LYhv/LQABIAAgACAAIAANTuV3U5CCWVVPBlI+beVdXE8M/4JZVU+GmPxb 4lYflgz/9GYNTuV3U5CCWVVPbnjdT2BPhHbiVh+WDU76Ue5dGZX0gX9PsnXrYA1OKlh0U9iPCwAB DU79gAlnSGW+jzBSdGVTT+52B2gCMC0AASAAIAAgACAAzk4ATg1U6lP5W4BiL2cfjSONhHaAYi9n uk5YVGyP2FM6TvlbaFFBbQt6H40jjYR2eZjuds9+BnSMVPlb0GcAThNOGk6GmN9XH40jjYR26JDo lSsAAc9+BnQM/yhX2Y8qTmyP2FOEdsePC3otTgz/gGIvZ7pOWFSBiZ5bsHPqVJtOFYfYUwEwgYmM Y+Fj6lSbTqF7BnSAYv2AATCCWVVP+Vd7UeqB8V2EdoaYDwAB/FubUkl7L2YsZ/6LC3rNkblwomOo i4R2hVG5WwIwBgABEDD+iwt6NmXKdhEwKQABMQAuAAZSq06yiwheCk5+djpXFHjRU6F7BnT5V62L hHYTThpOz36Mmgz/GpDHj7BzOleEdpJOqFIuXqlSZltYVAZ0BW5wjRFUoXsGdIR28FbRYBoAATIA LgA7YNN+jFQGUpBngGIvZ7pOWFTOToBiL2dwjRFUoXsGdMePC3otTjhewYmEdu6VmJgZAAEzAC4A jGPhY55bsHPOToBiL2dwjRFUoXsGdIR2x48Lei1OgYmeW7BzhHbgUSpObI/YUysAATQALgCGTuOJ zk6AYi9ncI0RVKF7BnSEdpROKk59WWBO72AI/9N+nGf8WxFUATD8fsKJaFFAXAEwWoAmcc2RuXAB MNFTJWMYT79SATDGlh1gf17Kdgn/DgABNQAuAIxj4WMOToaY/FufbBqQhHa5ZdVsgGLnXSwAATYA LgCMY+FjcI0KTqF7BnTlXVxPl1xNTw5UAJeBiYxj4WOEdttWKk44aMNfoXsGdIBi/YAI/+52B2gO TqGLElIBMMR+x34OTgZSPm3lXVxPATCnYzZSDk4QAAEgACAAoH5PUAEwhpj8Ww5OwG+xUgn/IAAg ACAAIAAgABgAATcALgCGTuOJEGKfUp5bsHPOToBiL2dwjRFUoXsGdGyP2FOEduBRKk5zUS6VgYkg fSoAATgALgAGUqtOsosIXnBlQVMqTqhU4ot5mO52hHYUeNFToXsGdIR2SGiLT0SNmWUI/yFqf2cB MGiIPGgBMDdoi08mICYgCf8M/y5eqVJmW1hUNlKaWyIAASAAIABBAGMAdABpAG8AbgAgAFAAbABh AG4ADP9/T5dfZltYVMJTrYsOVN5WMFLqgfFdhHZsUfhT/YAfWYhffVmeW/WNDQABEDD8WwhegHvL ThEwWwBHAGkAbABlAHMAXQAPAAEAMAAwIAD9VkWW+3zffuVdC3oIXlSACFQaTxpPWFQGAAGgJRNO Gk7MgG9mGv8sAAFBU+BRdF7YmtF5gGJMiBpOzk4aTsyAb2YM/zBOzFuEdhR40VOhewZ0qFTii89+ jJoM/yhX/VaFUdBnJ1mLV+V3DVQBTxpO5V1cT9GPMQAwAHReDP87TgFjKwABjFTCUw5Ox48aWSpO J1mLV6dOwVSEdhR40VPlXVxPDP9IUQ5UxWL7TsePAF/RU+VdC3oIXgEweZjuds9+BnQBMKdOwVTP fgZ0ATCwZadOwVT8W2VR6JArAAE7YNF2ATAUeNFTeZjudqF7BnTokDtg0XZJe0yATU8CMChX+04U eNFTeZjudqF7BnQ7YNF2H2f0lQz/EGKfUsR+x376Xst6hk4CkAhUU1/2ZcVgtVGEdisAARR40VNB bQt6oXsGdAEweZjudqF7BnQBMIBiL2ehewZ0U0/7fAIwdl5cTzpOOGjDX8R+EGJYVGhRC3rCUw5O hk7GlhBip07BVABf0VPYU2mXeZjudgz/LQABDk5JAEIATQB2mBZcqFTii36Y7pUATneN5V1cT4ZO 21Z0Xi4AaFFilx+NI42GTsaWEGKnTsFUAF/RU6F7BnTYU2mXeZjudihX0GenTsFUv36EdndRU09B bQt6LQABPYQwV4xUqGNMiOVdXE8M//lbdGUqTqF7BnTYU2mXeZjudoR2EGKfUneNMFKGTvOBc1HN kYGJhHZcTyh1AjAOVMhTDk5JAEIATQB+mO6VCFRcTywAEGKfUjtOKwAB/FuGTp9S/YCGmN9X/YCb UtBjR1N5mO52FSAVILBlp07BVPxbZVFBbQt6Dk5zXvBThHb6Xr6LG/8oV/1WhVHQZydZi1fldw1U AU8aTuVdXE8fZ/SVDP8rAAHPfoZThk7li2xR+FMUeNFToXsGdM5ODU7EiQODMFLEiQODFlOEdnRl Kk7Hjwt6DP+fccN+jGPhYwZc/VZFlkhR24+EdhR40VOhewZ0z36Mmg5OLU79VisAAQFPGk6eW0WW xWC1Ufh2034IVGVnhGf6XhR40VOhewZ0U0/7fIR2uWXVbAIwDlSUXtBn5XcNVBqQr4tsUfhThHaA kPeLDP/lTn6Y7pWEdquO/U7bj2VRLQAB5YtsUfhThHaAYi9nLU7DXztO/FsUeNFToXsGdFNP+3wB MBR40VNJAFQAxIkSUiwATQBBAFIASwBFAFQASQBOAEcAoXsGdFNP+3yEdnNe8FP6Xr6L5V1cTwIw CQABoCUUeNFToXsGdKhU4ovPfoyaKwABzk6LThR40VOhewZ0qFTii+VdXE/lTmVnDP9cTzpOeZju djtg0XYQYp9ShHY7TgFjhk48aJdnAVoUXAEwf17eXQFaG1LlZbBlATDQZzV1UFvReYBixpYsAAHi VhR4dnpAYgEw/Va6ThqQ4U9Je3BlQVO2WwFPGk6EdqdOwVTEiRJSQW0LelNP+3y+i6GLATDVi4ya QFxBbQt6vouhiwEw5XfGi6F7BnRTT/t8vouhiwEwLAABLU7VixpOoVKhewZ0U0/7fLNoBnQBMBR4 0VNJAFQAxIkSUgEwFHjRU3mY7nahewZ0U0/7fL6LoYsBMBR40VMojc+RoXsGdFNP+3wBMBR40VPp fkhloXsGdBkAAVNP+3y+i6GLATAUeNFTSwBQAEkAU0/7fL6LoYtJe7llYpeEdqF7BnSoVOKLeZju dgIwCgABoCUUeNFToXsGdPlXrYvPfoyaGv8rAAH+ZihXBFQwVxpZIWs+Tp5SFHjRUyiNz5GhewZ0 ATAUeNFTeZjudqF7BnQBMLBlp07BVABf0VNBbQt6GE8WUw5OoXsGdAEwzk43aMFUcI0RVM+Rp05J eysAAWxRAF/+iwz/Ok5wZUNTtlsBTxpO0GObT4ZOFHjRU6F7BnRsUQBf/ouEdvlXrYsM/zpOcGV+ drZbAU8aTtuPTIiGThR40VOhewZ0hHaFUa2LG//OTotOKwABFHjRU6F7BnSoVOKL5V1cT+VOZWcM /1xPOk55mO52O2DRdhBin1KEdjtOAWOMWxBihk5wZUFTKk4UeNFToXsGdKhU4ot5mO52U0/7fIR2 +l6+iwz/p04tAAHBVMSJElJBbQt6U0/7fL6LoYsBMNWLjJpAXEFtC3q+i6GLLADld8aLoXsGdFNP +3y+i6GLATAtTtWLGk6hUqF7BnRTT/t8s2gGdAEwFHjRU0kAVADEiRJSATAtAAEUeNFTeZjudqF7 BnRTT/t8vouhiwEwFHjRUyiNz5GhewZ0U0/7fAEwFHjRU+l+SGWhewZ0U0/7fL6LoYsBMBR40VNL AFAASQBTT/t8vouhi0l7uWVilz4ADP8sAAEJZ0B3ME7MW4R2FHjRU6F7BnSoVOKLz36Mmgz/iW3K U4R2TIgaTgVT7GIakOFPATBvj/ZOATC2WzV1ATA1deFP0I8lhEZVATCvgkdyATA7U5d1aFawaAEw FwABpE4akNCPk49Jewz/Ll6pUtmPm04BTxpO+l7LetiaSGUBMIxbB1mEdhR40VOhewYAARAw/osL eidZsn4RMAsAAQBOATBIaItPBlKQZwj/MAAuADUACf8OAAExACkAqIu6ixr/gGIvZ3CNEVShewZ0 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 QwAJ/wn/FAABNwApABR40VN5mO52hHbudgdoOk7ATkhODU65WxNmUwBNAEEAUgBUACAAATgAKQA6 TsBOSE75V62Lhk6IXxpZIWtTAE0AQQBSAFQAFHjRU3mY7nbudgdo2I8vZlpQDU4wUlMATQBBAFIA VAAPAAE5ACkAFHjRU+VdXE+hixJShHZQAEQAQwBBAKpfr3MkAAExADAAKQCnTsFUc17wU8SJElIB MKdOwVTvjQdoxIkSUoxUp07BVKGLElIBMEhyLGehixJSATB5cidgoYsSUktO9JWEdnNR+3wNAAEx ADEAKQAUeNFTQW0Leg5OoYsSUoR2c1H7fA4AATEAMgApABR40VN5mO52oYsSUjZSmluEdkFtC3oS AAExADMAKQBQAEUAUgBUAAEwc1Eule+NhF+MVEcAQQBOAE4AVAATAAExADQAKQA6TsBOSE4UeNFT eZjudqGLElINTih1UABFAFIAVAD+ViEAATEANQApAKdOwVQAX9FToYsSUoJZVU8GUhBi21anfgj/ 2Y/bVqd+oYsSUoR2I437TjtOU0+MVDZSmlv2ZfSVuXAJ/w8AATEANgApABR40VOhixJSDk5EjZBu oYsSUoR2oXsGdAwAATEANwApAESNkG6hixJSB2P8W2ZOPk6LTw8AATEAOAApAESNkG6eW71l+VsA X9FT24+mXoR2cV/NVBYAATEAOQApABRvw34a/89rKk4PXMR+NlKaWwBOKk5KU3ReoYsSUgz/0VNo iAH/IQABbVEBMM5OgGIvZ3CNEVShewZ0hHbbVipOOGjDX6F7BnSAYv2AS06MThr/xH7Hfg5OBlI+ beVdXE8I/zIALgAwAAn/DgABMQApADhewYkUeNFTxH7HfmJfD1/KUxhPOn+5cA0AATIAKQCCWVVP +VsUeNFT5V1cT9uPTIgGUuOJDgABMwApANl+FHjRU7pOWFQGUj5t5V1cT4R2n1MZUg4AATQAKQDZ fhR40VO6TlhUBlI+beVdXE+EdmVrpJoTAAE1ACkA2X4UeNFTuk5YVAZSPm3lXVxPLU65WxNm+lGw c4R27pWYmAsAATYAKQAUeNFTn2wakKF7BnSEdoVRuVsKAAE3ACkAn2wakIR27naEdg5On1L9gAoA ATgAKQCfbBqQhHbNeXt8Dk65ZQ9fDgABOQApAAlnSGWfbBqQhHaclo14LwCmfshUzJGXeg4AATEA MAApAGKX+Vtil59sGpB/kE1RhHYPXKhSXE8QAAExADEAKQCCWVVP2X52UYNb6JDolQZSPm0UeNFT 5V1cTw8AATEAMgApABR40VNnYkyIm1I6fzFZhHafU+BWBlKQZxwAATEAMwApABR40VOhewZ0uk5Y VChXBlI+beVdXE8tTrlbE2ZYWyhXhHbulZiYATCfU+BWjFRLUQ1nIAABMQA0ACkA2X4UeNFTgGIv Z7pOWFQbUiCQP2FvZgEwz2PYfj9hb2YM/yRcdlEvZnNRjk55mO52Dk7iVh+WTVIUkCIAATEANQAp AO52B2hxUatODk77TqFSBlJNkQj/7nYHaIR2cVGrThZTATDudgdohHZ/YvqLFlMBMO52B2iEdvt8 334WUwEwGgAB+06hUgZSTZGEdp9TGVIBMAZSTZH2ZYR2l2LSYgRZBnQBMAZSTZH2ZYR2p2M2Uid9 pl4BMA8AAQZSTZEOVIR2340qjg5Op2M2UgEw036cZ81TiJkJ/yIAATEANgApANl+FHjRU4BiL2e6 TlhUenr0lQj/NHNQW6F7BnQBMIhjQ2eEdpROKk6fUxlSATBxUatODk7CUw5OoXsGdAn/JgABMQA3 ACkAO22oUhRvw34gADMAMAAgAAZSn5Qa/1FiS1E4bg9iFCAUIApOLU4LTglOQlySTqhSCP9TT4ya Gv+hewZ0+Vu6Tg5O+VuLTiEAAQz/CU5CXNKJcoKaW01PDP/udgdoC06+jwz/p2M2Ug5O340qjgz/ P2FvZg5O7nYHaHFRq04M/9N+nGfNU4iZSXsJ/yUAATEAOAApAEhoi08UeKiLGv8UeNFTgGIvZ4tX 4lYfloR2EGJYVDheq4jrj39ixWInfSVghHZ5mO52aFQfZwz/5YuCWVVPBFkGdB//JAABMQA5ACkA SGiLTxR4qIsa/9l+iE4UeNFTgGIvZ7pOWFSEdnp69JUwUpVeGlknWQz/r3LATkhON2iEdhmV74vv U+VOpWPXUx//IAABMgAwACkASGiLTxR4qIsa//tOoVILTr6PDlSMWxBil18NTn1ZRk/gVjpOL2aw eDBS8Fa+lshTDmBITgRZBnQf/xoAATIAMQApAEhoi08UeKiLGv8ATipOuk5/YsViGlkqTnmY7nZH kDBSRI2QbrJRgXoOYEhOnlIWAAEyADIAKQBIaItPFHioixr/JE4qToaY/FsPYcGJDU4ATvSBDP8O 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 ewZ0FCAUIBR40VPPfgZ0hHaGmPxbm1IOTmdiTIibUgEADAAIADcAAAAAAAAAAAAiAAEQMPlXrYv2 ZfSVETAgADIAMAAxADMAdF4xAAhnMgAxAC0AMgAyAOVlCk53bQEwIAAxAAhnMgA1AC0AMgA2AOVl 8W0zVxAAARAw7XC/fjV13YsRMBT/EP8Q/xb/Fv8W/xH/Ef8R/xj/KgABEDDxbTNXLwACXjpX6JAR MBD/F/8V/xX/LQAW/xH/Ev8Y/xj/Gf8Q/xf/ADAQMApOd20vAAJeOlfokBEwEP8S/xH/LQAT/xH/ Ev8W/xH/Ff8Y/xD/KgABEDAXU6xOLwACXjpX6JARMAAwEP8R/xD/LQAV/xH/Ev8Z/xX/FP8Q/xn/ ADAQMH9e3l0vAAJeOlfokBEwEP8S/xD/LQAW/xH/Ef8T/xP/F/8X/xX/KgAFEAAAAAowdF7IfidZ 3laImQz/MQAIZ/1OQGIJZ4R2FHjRU3t8/osLegz/AE6LXzEANgAwADAAQ1EvALpODP/Hjx9nYmAN WZ9T904gADpnDU7vUzFZCzAgAAEADAAIADcAAAAAAAAAAAAwAAUQAAAAEDD5V62LOY0odREwNAAw ADAAMABDUS8AJE4pWSAAIgBwTgBOYI0ATiwADU6NUVNimGIiACAAIAAAlyhXDFQATipOCGeEdgxU AE7+iwt6TWKrTglnZGsYT+BgLABVU+xyAQAMAAgANwAAAAAAAABEAP8AygAIANALAAAMAAAApg0A AOIBAACYDwAA1AMAAFoRAACWBQAA9hIAADIHAADIFQAABAoAAO4XAAAqDAAAThoAAIoOAACaGwAA 1g8AALQcAADwEAAApB0AAOARAAC8HgAA+BIAAOQfAAAgFAAAPiEAAHoVAAC8IgAA+BYAACIkAABe GAAADCUAAEgZAACKJgAAxhoAAJgoAADUHAAA/ikAADoeAACqKwAA5h8AAP8sAAAXAQAALS4AAEUC AABXLwAAbwMAACcxAAA/BQAAYwgVAGMIAAAAAAAAAAAAABUAAAAAAAAAAgoAAAAJCBAAAAYQAJsg zQfJwAAABgMAAAsCLAAAAAAAAAAAANMAAADIMwAAyDwAAIhDAABcSgAAUlEAAEhYAAAsXwAAUmMA AA0AAgABAAwAAgBkAA8AAgABABEAAgAAABAACAD8qfHSTWJQP18AAgABACoAAgAAACsAAgAAAIIA AgABAIAACAAAAAAAAAAAACUCBAAAAB0BgQACAMEEFAAAABUAAACDAAIAAACEAAIAAAChACIACQBk APfvAQABAAIAyABoAQAAAAAAAOA/AAAAAAAA4D8BAFUAAgAIAH0ADAAAAAAAAAMZAAIAAgB9AAwA AQABAMACNAACAAIAfQAMAAIAAgBgRjQAAgACAH0ADAADAAMAYAM0AAIAAgB9AAwABAAEAOAHGQAC AAIAfQAMAAUAAAEACRkAAgACAAACDgAAAAAA0wAAAAAAAAEAAAgCEAAAAAAAAAEdAQAAAAAAAQ8A CAIQAAEAAAAAAXcBAAAAAAABDwAIAhAAAgAAAAAB4AEAAAAAQAEPAAgCEAADAAAAAAEdAQAAAAAA AQ8ACAIQAAQAAAAAAaQBAAAAAEABDwAIAhAABQAAAAABpAEAAAAAQAEPAAgCEAAGAAAAAAGkAQAA AABAAQ8ACAIQAAcAAAAAAaQBAAAAAEABDwAIAhAACAAAAAABpAEAAAAAQAEPAAgCEAAJAAAAAAGk AQAAAABAAQ8ACAIQAAoAAAAAAaQBAAAAAEABDwAIAhAACwAAAAABpAEAAAAAQAEPAAgCEAAMAAAA AAGkAQAAAABAAQ8ACAIQAA0AAAAAAaQBAAAAAEABDwAIAhAADgAAAAABdwEAAAAAQAEPAAgCEAAP AAAAAAF3AQAAAABAAQ8ACAIQABAAAQAEAHcBAAAAAEABDwAIAhAAEQABAAQAdwEAAAAAQAEPAAgC EAASAAEABAB3AQAAAABAAQ8ACAIQABMAAQAEAHcBAAAAAEABDwAIAhAAFAABAAQAdwEAAAAAQAEP AAgCEAAVAAEABAB3AQAAAABAAQ8ACAIQABYAAQAEAHcBAAAAAEABDwAIAhAAFwABAAQAdwEAAAAA QAEPAAgCEAAYAAEABAB3AQAAAABAAQ8ACAIQABkAAQAEAHcBAAAAAEABDwAIAhAAGgABAAQAdwEA AAAAQAEPAAgCEAAbAAEABAB3AQAAAABAAQ8ACAIQABwAAQAEAHcBAAAAAEABDwAIAhAAHQABAAQA dwEAAAAAQAEPAAgCEAAeAAEABAB3AQAAAABAAQ8ACAIQAB8AAQAEAHcBAAAAAEABDwC+AAwAAAAB ABoAGwAcAAMAAQIGAAEAAQAdAP0ACgABAAIAHgC7AAAAAQIGAAEAAwAfAL4ADAACAAEAHQAgAB8A AwC+AAoAAwAAACEAIgABAP0ACgADAAIAIwAAAAAAvgAAAgMAAwAkACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhAP8AAQIGAAQAAQAlAP0ACgAEAAIAJgC8AAAA AQIGAAQAAwAnAAECBgAFAAEAJQD9AAoABQACACYAAQAAAAECBgAFAAMAJwABAgYABgABACUA/QAK AAYAAgAmAAIAAAABAgYABgADACcAAQIGAAcAAQAlAP0ACgAHAAIAJgADAAAAAQIGAAcAAwAnAAEC BgAIAAEAJQD9AAoACAACACYAwQAAAAECBgAIAAMAJwABAgYACQABACUA/QAKAAkAAgAmAAQAAAAB AgYACQADACcAAQIGAAoAAQAlAP0ACgAKAAIANQDAAAAAAQIGAAoAAwAnAAECBgALAAEAJQD9AAoA CwACACgAvQAAAAECBgALAAMAJwABAgYADAABACUA/QAKAAwAAgAoAL4AAAABAgYADAADACcAAQIG AA0AAQAlAP0ACgANAAIAKAC/AAAAAQIGAA0AAwAnAAECBgAOAAEAKQD9AAoADgACACoABQAAAAEC BgAOAAMAKwABAgYADwABACwA/QAKAA8AAgAtAAYAAAABAgYADwADAC4AAQIGABAAAQAsAP0ACgAQ AAIALQAHAAAAAQIGABAAAwAuAAECBgARAAEALAD9AAoAEQACAC0ACAAAAAECBgARAAMALgABAgYA EgABACwA/QAKABIAAgAtAAkAAAABAgYAEgADAC4AAQIGABMAAQAsAP0ACgATAAIALQAKAAAAAQIG ABMAAwAuAAECBgAUAAEALAD9AAoAFAACAC0ACwAAAAECBgAUAAMALgABAgYAFQABACwA/QAKABUA AgAtAAwAAAABAgYAFQADAC4AAQIGABYAAQAsAP0ACgAWAAIALQANAAAAAQIGABYAAwAuAAECBgAX AAEALAD9AAoAFwACAC0ADgAAAAECBgAXAAMALgABAgYAGAABACwA/QAKABgAAgAtAA8AAAABAgYA GAADAC4AAQIGABkAAQAsAP0ACgAZAAIALQAQAAAAAQIGABkAAwAuAAECBgAaAAEALAD9AAoAGgAC AC0AEQAAAAECBgAaAAMALgC+AAwAGwABACwALQAuAAMAAQIGABwAAQApAP0ACgAcAAIAKgASAAAA AQIGABwAAwArAAECBgAdAAEALAD9AAoAHQACAC0AEwAAAAECBgAdAAMALgABAgYAHgABACwA/QAK AB4AAgAtABQAAAABAgYAHgADAC4AAQIGAB8AAQAsAP0ACgAfAAIALQAVAAAAAQIGAB8AAwAuANcA RACICAAAbAIQACIAEAAgAiIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAi ACIAIgAQACIAIgAiAAgCEAAgAAEABAB3AQAAAABAAQ8ACAIQACEAAQAEAHcBAAAAAEABDwAIAhAA IgABAAQAdwEAAAAAQAEPAAgCEAAjAAEABAB3AQAAAABAAQ8ACAIQACQAAQAEAHcBAAAAAEABDwAI AhAAJQABAAQAdwEAAAAAQAEPAAgCEAAmAAEABAB3AQAAAABAAQ8ACAIQACcAAQAEAHcBAAAAAEAB DwAIAhAAKAABAAQAdwEAAAAAQAEPAAgCEAApAAEABAB3AQAAAABAAQ8ACAIQACoAAQAEAHcBAAAA AEABDwAIAhAAKwABAAQAdwEAAAAAQAEPAAgCEAAsAAEABAB3AQAAAABAAQ8ACAIQAC0AAQAEAHcB AAAAAEABDwAIAhAALgABAAQAdwEAAAAAQAEPAAgCEAAvAAEABAB3AQAAAABAAQ8ACAIQADAAAQAE AHcBAAAAAEABDwAIAhAAMQABAAQAdwEAAAAAQAEPAAgCEAAyAAEABAB3AQAAAABAAQ8ACAIQADMA AQAEAHcBAAAAAEABDwAIAhAANAABAAQAdwEAAAAAQAEPAAgCEAA1AAEABAB3AQAAAABAAQ8ACAIQ ADYAAQAEAHcBAAAAAEABDwAIAhAANwABAAQAdwEAAAAAQAEPAAgCEAA4AAEABAB3AQAAAABAAQ8A CAIQADkAAQAEAHcBAAAAAEABDwAIAhAAOgABAAQAdwEAAAAAQAEPAAgCEAA7AAEABAB3AQAAAABA AQ8ACAIQADwAAQAEAHcBAAAAAEABDwAIAhAAPQABAAQAdwEAAAAAQAEPAAgCEAA+AAEABAB3AQAA AABAAQ8ACAIQAD8AAQAEAHcBAAAAAEABDwABAgYAIAABACwA/QAKACAAAgAtABYAAAABAgYAIAAD AC4AAQIGACEAAQAsAP0ACgAhAAIALQAXAAAAAQIGACEAAwAuAAECBgAiAAEALAD9AAoAIgACAC0A GAAAAAECBgAiAAMALgABAgYAIwABACwA/QAKACMAAgAtABkAAAABAgYAIwADAC4AAQIGACQAAQAs AP0ACgAkAAIALQAaAAAAAQIGACQAAwAuAAECBgAlAAEALAD9AAoAJQACAC0AGwAAAAECBgAlAAMA LgABAgYAJgABACwA/QAKACYAAgAtABwAAAABAgYAJgADAC4AvgAMACcAAQAsAC0ALgADAAECBgAo AAEAKQD9AAoAKAACACoAHQAAAAECBgAoAAMAKwABAgYAKQABACwA/QAKACkAAgAtAB4AAAABAgYA KQADAC4AvgAMACoAAQAsAC0ALgADAAECBgArAAEALAD9AAoAKwACAC8AHwAAAAECBgArAAMALgAB AgYALAABACwA/QAKACwAAgAtACAAAAABAgYALAADAC4AAQIGAC0AAQAsAP0ACgAtAAIALQAhAAAA AQIGAC0AAwAuAAECBgAuAAEALAD9AAoALgACAC8AIgAAAAECBgAuAAMALgABAgYALwABACwA/QAK AC8AAgAtACMAAAABAgYALwADAC4AAQIGADAAAQAsAP0ACgAwAAIALQAkAAAAAQIGADAAAwAuAAEC BgAxAAEALAD9AAoAMQACAC8AJQAAAAECBgAxAAMALgABAgYAMgABACwA/QAKADIAAgAtACYAAAAB AgYAMgADAC4AAQIGADMAAQAsAP0ACgAzAAIALQAnAAAAAQIGADMAAwAuAAECBgA0AAEALAD9AAoA NAACAC0AKAAAAAECBgA0AAMALgABAgYANQABACwA/QAKADUAAgAvACkAAAABAgYANQADAC4AvgAM ADYAAQAsAC0ALgADAAECBgA3AAEALAD9AAoANwACAC0AKgAAAAECBgA3AAMALgABAgYAOAABACwA /QAKADgAAgAtACsAAAABAgYAOAADAC4AAQIGADkAAQAsAP0ACgA5AAIALQAsAAAAAQIGADkAAwAu AAECBgA6AAEALAD9AAoAOgACAC8ALQAAAAECBgA6AAMALgABAgYAOwABACwA/QAKADsAAgAtAC4A AAABAgYAOwADAC4AvgAMADwAAQAsAC0ALgADAAECBgA9AAEALAD9AAoAPQACAC8ALwAAAAECBgA9 AAMALgABAgYAPgABACwA/QAKAD4AAgAtADAAAAABAgYAPgADAC4AAQIGAD8AAQAsAP0ACgA/AAIA LQAxAAAAAQIGAD8AAwAuANcARAB4BgAAbAIiACIAIgAiACIAIgAiABAAIgAiABAAIgAiACIAIgAi ACIAIgAiACIAIgAiABAAIgAiACIAIgAiABAAIgAiAAgCEABAAAEABAB3AQAAAABAAQ8ACAIQAEEA AQAEAHcBAAAAAEABDwAIAhAAQgABAAQAdwEAAAAAQAEPAAgCEABDAAEABAB3AQAAAABAAQ8ACAIQ AEQAAQAEAHcBAAAAAEABDwAIAhAARQABAAQAdwEAAAAAQAEPAAgCEABGAAEABAB3AQAAAABAAQ8A CAIQAEcAAQAEAHcBAAAAAEABDwAIAhAASAABAAQAdwEAAAAAQAEPAAgCEABJAAEABAB3AQAAAABA AQ8ACAIQAEoAAQAEAHcBAAAAAEABDwAIAhAASwABAAQAdwEAAAAAQAEPAAgCEABMAAEABAB3AQAA AABAAQ8ACAIQAE0AAQAEAHcBAAAAAEABDwAIAhAATgABAAQAdwEAAAAAQAEPAAgCEABPAAEABAB3 AQAAAABAAQ8ACAIQAFAAAQAHAHcBAAAAAEABDwAIAhAAUQABAAcAdwEAAAAAQAEPAAgCEABSAAEA BwB3AQAAAABAAQ8ACAIQAFMAAQAHAHcBAAAAAEABDwAIAhAAVAABAAcAdwEAAAAAQAEPAAgCEABV AAEABwB3AQAAAABAAQ8ACAIQAFYAAQAHAHcBAAAAAEABDwAIAhAAVwABAAcAdwEAAAAAQAEPAAgC EABYAAEABwB3AQAAAABAAQ8ACAIQAFkAAQAHAHcBAAAAAEABDwAIAhAAWgABAAcAdwEAAAAAQAEP AAgCEABbAAEABwB3AQAAAABAAQ8ACAIQAFwAAQAHAHcBAAAAAEABDwAIAhAAXQABAAcAdwEAAAAA wAEwAAgCEABeAAEABwB3AQAAAABAAQ8ACAIQAF8AAQAHAHcBAAAAAEABDwABAgYAQAABACwA/QAK AEAAAgAvADIAAAABAgYAQAADAC4AAQIGAEEAAQAsAP0ACgBBAAIALQAzAAAAAQIGAEEAAwAuAAEC BgBCAAEALAD9AAoAQgACAC0ANAAAAAECBgBCAAMALgABAgYAQwABACwA/QAKAEMAAgAvADUAAAAB AgYAQwADAC4AAQIGAEQAAQAsAP0ACgBEAAIALQA2AAAAAQIGAEQAAwAuAL4ADABFAAEALAAtAC4A AwABAgYARgABACkA/QAKAEYAAgAqADcAAAABAgYARgADACsAAQIGAEcAAQAsAP0ACgBHAAIALwA4 AAAAAQIGAEcAAwAuAAECBgBIAAEALAD9AAoASAACAC8AOQAAAAECBgBIAAMALgC+AAwASQABACwA LQAuAAMAAQIGAEoAAQAsAP0ACgBKAAIALQA6AAAAAQIGAEoAAwAuAAECBgBLAAEALAD9AAoASwAC AC0AOwAAAAECBgBLAAMALgABAgYATAABACwA/QAKAEwAAgAvADwAAAABAgYATAADAC4AAQIGAE0A AQAsAP0ACgBNAAIALQA9AAAAAQIGAE0AAwAuAAECBgBOAAEALAD9AAoATgACAC0APgAAAAECBgBO AAMALgABAgYATwABACwA/QAKAE8AAgAtAD8AAAABAgYATwADAC4AAQIGAFAAAQAsAP0ACgBQAAIA LQBAAAAAAQIGAFAAAwAuAAECBgBRAAEALAD9AAoAUQACAC0AQQAAAAECBgBRAAMALgABAgYAUgAB ACwA/QAKAFIAAgAtAEIAAAABAgYAUgADAC4AAQIGAFMAAQAsAP0ACgBTAAIALQBDAAAAAQIGAFMA AwAuAAECBgBUAAEALAD9AAoAVAACAC0ARAAAAAECBgBUAAMALgABAgYAVQABACwA/QAKAFUAAgAt AEUAAAABAgYAVQADAC4AvgAMAFYAAQAsAC0ALgADAAECBgBXAAEALAD9AAoAVwACAC0ARgAAAAEC BgBXAAMALgABAgYAWAABACwA/QAKAFgAAgAtAEcAAAABAgYAWAADAC4AAQIGAFkAAQAsAP0ACgBZ AAIALQBIAAAAAQIGAFkAAwAuAAECBgBaAAEALAD9AAoAWgACAC0ASQAAAAECBgBaAAMALgABAgYA WwABACwA/QAKAFsAAgAtAEoAAAABAgYAWwADAC4AAQIGAFwAAQAsAP0ACgBcAAIALQBLAAAAAQIG AFwAAwAuAAECBgBcAAYAMAABAgYAXQABACwA/QAKAF0AAgAtAEwAAAABAgYAXQADAC4AAQIGAF0A BgAZAAECBgBeAAEALAD9AAoAXgACAC0ATQAAAAECBgBeAAMALgC+AAwAXwABACwALQAuAAMA1wBE AIwGAABsAiIAIgAiACIAIgAQACIAIgAiABAAIgAiACIAIgAiACIAIgAiACIAIgAiACIAEAAiACIA IgAiACIALAAsACIACAIQAGAAAQAEAHcBAAAAAEABDwAIAhAAYQABAAQAdwEAAAAAQAEPAAgCEABi AAEABAB3AQAAAABAAQ8ACAIQAGMAAQAEAHcBAAAAAEABDwAIAhAAZAABAAQAdwEAAAAAQAEPAAgC EABlAAEABAB3AQAAAABAAQ8ACAIQAGYAAQAEAHcBAAAAAEABDwAIAhAAZwABAAQAdwEAAAAAQAEP AAgCEABoAAEABAB3AQAAAABAAQ8ACAIQAGkAAQAEAHcBAAAAAEABDwAIAhAAagABAAQAdwEAAAAA QAEPAAgCEABrAAEABAB3AQAAAABAAQ8ACAIQAGwAAQAEAHcBAAAAAEABDwAIAhAAbQABAAQAdwEA AAAAQAEPAAgCEABuAAEABAB3AQAAAABAAQ8ACAIQAG8AAQAEAHcBAAAAAEABDwAIAhAAcAABAAQA dwEAAAAAQAEPAAgCEABxAAEABAB3AQAAAABAAQ8ACAIQAHIAAQAEAHcBAAAAAEABDwAIAhAAcwAB AAQAdwEAAAAAQAEPAAgCEAB0AAEABAB3AQAAAABAAQ8ACAIQAHUAAQAEAHcBAAAAAEABDwAIAhAA dgABAAQAdwEAAAAAQAEPAAgCEAB3AAEABAB3AQAAAABAAQ8ACAIQAHgAAQAEAHcBAAAAAEABDwAI AhAAeQABAAQAdwEAAAAAQAEPAAgCEAB6AAEABAB3AQAAAABAAQ8ACAIQAHsAAQAEAHcBAAAAAEAB DwAIAhAAfAABAAQAdwEAAAAAQAEPAAgCEAB9AAEABAB3AQAAAABAAQ8ACAIQAH4AAQAEAHcBAAAA AEABDwAIAhAAfwABAAQAdwEAAAAAQAEPAAECBgBgAAEALAD9AAoAYAACAC0ATgAAAAECBgBgAAMA LgABAgYAYQABACwA/QAKAGEAAgAtAE8AAAABAgYAYQADAC4AAQIGAGIAAQAsAP0ACgBiAAIALQBQ AAAAAQIGAGIAAwAuAAECBgBjAAEALAD9AAoAYwACAC0AUQAAAAECBgBjAAMALgABAgYAZAABACwA /QAKAGQAAgAtAFIAAAABAgYAZAADAC4AAQIGAGUAAQAsAP0ACgBlAAIALQBTAAAAAQIGAGUAAwAu AAECBgBmAAEALAD9AAoAZgACAC0AVAAAAAECBgBmAAMALgABAgYAZwABACwA/QAKAGcAAgAtAFUA AAABAgYAZwADAC4AAQIGAGgAAQAsAP0ACgBoAAIALQBWAAAAAQIGAGgAAwAuAAECBgBpAAEALAD9 AAoAaQACAC0AVwAAAAECBgBpAAMALgABAgYAagABACwA/QAKAGoAAgAtAFgAAAABAgYAagADAC4A AQIGAGsAAQAsAP0ACgBrAAIALQBZAAAAAQIGAGsAAwAuAAECBgBsAAEALAD9AAoAbAACAC0AWgAA AAECBgBsAAMALgABAgYAbQABACwA/QAKAG0AAgAtAFsAAAABAgYAbQADAC4AAQIGAG4AAQAsAP0A CgBuAAIALQBcAAAAAQIGAG4AAwAuAAECBgBvAAEALAD9AAoAbwACAC0AXQAAAAECBgBvAAMALgAB AgYAcAABACwA/QAKAHAAAgAtAF4AAAABAgYAcAADAC4AAQIGAHEAAQAsAP0ACgBxAAIALQBfAAAA AQIGAHEAAwAuAAECBgByAAEALAD9AAoAcgACAC0AYAAAAAECBgByAAMALgABAgYAcwABACwA/QAK AHMAAgAtAGEAAAABAgYAcwADAC4AAQIGAHQAAQAsAP0ACgB0AAIALQBiAAAAAQIGAHQAAwAuAL4A DAB1AAEALAAtAC4AAwABAgYAdgABACwA/QAKAHYAAgAtAGMAAAABAgYAdgADAC4AAQIGAHcAAQAs AP0ACgB3AAIALQBkAAAAAQIGAHcAAwAuAAECBgB4AAEALAD9AAoAeAACAC0AZQAAAAECBgB4AAMA LgABAgYAeQABACwA/QAKAHkAAgAtAGYAAAABAgYAeQADAC4AAQIGAHoAAQAsAP0ACgB6AAIALQBn AAAAAQIGAHoAAwAuAAECBgB7AAEALAD9AAoAewACAC0AaAAAAAECBgB7AAMALgABAgYAfAABACwA /QAKAHwAAgAtAGkAAAABAgYAfAADAC4AAQIGAH0AAQAsAP0ACgB9AAIALQBqAAAAAQIGAH0AAwAu AAECBgB+AAEALAD9AAoAfgACAC0AawAAAAECBgB+AAMALgABAgYAfwABACwA/QAKAH8AAgAtAGwA AAABAgYAfwADAC4A1wBEAK4GAABsAiIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAi ACIAIgAiABAAIgAiACIAIgAiACIAIgAiACIACAIQAIAAAQAEAHcBAAAAAEABDwAIAhAAgQABAAQA dwEAAAAAQAEPAAgCEACCAAEABAB3AQAAAABAAQ8ACAIQAIMAAQAEAHcBAAAAAEABDwAIAhAAhAAB AAQAdwEAAAAAQAEPAAgCEACFAAEABAB3AQAAAABAAQ8ACAIQAIYAAQAEAHcBAAAAAEABDwAIAhAA hwABAAQAdwEAAAAAQAEPAAgCEACIAAEABAB3AQAAAABAAQ8ACAIQAIkAAQAEAHcBAAAAAEABDwAI AhAAigABAAQAdwEAAAAAQAEPAAgCEACLAAEABAB3AQAAAABAAQ8ACAIQAIwAAQAEAHcBAAAAAEAB DwAIAhAAjQABAAQAdwEAAAAAQAEPAAgCEACOAAEABAB3AQAAAABAAQ8ACAIQAI8AAQAEAHcBAAAA AEABDwAIAhAAkAABAAQAdwEAAAAAQAEPAAgCEACRAAEABAB3AQAAAABAAQ8ACAIQAJIAAQAEAHcB AAAAAEABDwAIAhAAkwABAAQAdwEAAAAAQAEPAAgCEACUAAEABAB3AQAAAABAAQ8ACAIQAJUAAQAE AHcBAAAAAEABDwAIAhAAlgABAAQAdwEAAAAAQAEPAAgCEACXAAEABAB3AQAAAABAAQ8ACAIQAJgA AQAEAHcBAAAAAEABDwAIAhAAmQABAAQAdwEAAAAAQAEPAAgCEACaAAEABAB3AQAAAABAAQ8ACAIQ AJsAAQAEAHcBAAAAAEABDwAIAhAAnAABAAQAdwEAAAAAQAEPAAgCEACdAAEABAB3AQAAAABAAQ8A CAIQAJ4AAQAEAHcBAAAAAEABDwAIAhAAnwABAAQAdwEAAAAAQAEPAAECBgCAAAEALAD9AAoAgAAC AC0AbQAAAAECBgCAAAMALgABAgYAgQABACwA/QAKAIEAAgAtAG4AAAABAgYAgQADAC4AAQIGAIIA AQAsAP0ACgCCAAIALQBvAAAAAQIGAIIAAwAuAAECBgCDAAEALAD9AAoAgwACAC0AcAAAAAECBgCD AAMALgABAgYAhAABACwA/QAKAIQAAgAtAHEAAAABAgYAhAADAC4AAQIGAIUAAQAsAP0ACgCFAAIA LQByAAAAAQIGAIUAAwAuAAECBgCGAAEALAD9AAoAhgACAC0AcwAAAAECBgCGAAMALgABAgYAhwAB ACwA/QAKAIcAAgAtAHQAAAABAgYAhwADAC4AAQIGAIgAAQAsAP0ACgCIAAIALQB1AAAAAQIGAIgA AwAuAAECBgCJAAEALAD9AAoAiQACAC0AdgAAAAECBgCJAAMALgC+AAwAigABACwALQAuAAMAAQIG AIsAAQAsAP0ACgCLAAIALQB3AAAAAQIGAIsAAwAuAAECBgCMAAEALAD9AAoAjAACAC0AeAAAAAEC BgCMAAMALgABAgYAjQABACwA/QAKAI0AAgAtAHkAAAABAgYAjQADAC4AAQIGAI4AAQAsAP0ACgCO AAIALQB6AAAAAQIGAI4AAwAuAAECBgCPAAEALAD9AAoAjwACAC0AewAAAAECBgCPAAMALgABAgYA kAABACwA/QAKAJAAAgAtAHwAAAABAgYAkAADAC4AAQIGAJEAAQAsAP0ACgCRAAIALQB9AAAAAQIG AJEAAwAuAAECBgCSAAEALAD9AAoAkgACAC0AfgAAAAECBgCSAAMALgABAgYAkwABACwA/QAKAJMA AgAtAH8AAAABAgYAkwADAC4AAQIGAJQAAQAsAP0ACgCUAAIALQCAAAAAAQIGAJQAAwAuAAECBgCV AAEALAD9AAoAlQACAC0AgQAAAAECBgCVAAMALgABAgYAlgABACwA/QAKAJYAAgAtAIIAAAABAgYA lgADAC4AAQIGAJcAAQAsAP0ACgCXAAIALQCDAAAAAQIGAJcAAwAuAAECBgCYAAEALAD9AAoAmAAC AC0AhAAAAAECBgCYAAMALgABAgYAmQABACwA/QAKAJkAAgAtAIUAAAABAgYAmQADAC4AAQIGAJoA AQAsAP0ACgCaAAIALQCGAAAAAQIGAJoAAwAuAAECBgCbAAEALAD9AAoAmwACAC0AhwAAAAECBgCb AAMALgABAgYAnAABACwA/QAKAJwAAgAtAIgAAAABAgYAnAADAC4AAQIGAJ0AAQAsAP0ACgCdAAIA LQCJAAAAAQIGAJ0AAwAuAAECBgCeAAEALAD9AAoAngACAC0AigAAAAECBgCeAAMALgABAgYAnwAB ACwA/QAKAJ8AAgAtAIsAAAABAgYAnwADAC4A1wBEAK4GAABsAiIAIgAiACIAIgAiACIAIgAiACIA EAAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIACAIQAKAAAQAEAHcBAAAA AEABDwAIAhAAoQABAAQAdwEAAAAAQAEPAAgCEACiAAEABAB3AQAAAABAAQ8ACAIQAKMAAQAEAHcB AAAAAEABDwAIAhAApAABAAQAdwEAAAAAQAEPAAgCEAClAAEABAB3AQAAAABAAQ8ACAIQAKYAAQAE AHcBAAAAAEABDwAIAhAApwABAAQAdwEAAAAAQAEPAAgCEACoAAEABAB3AQAAAABAAQ8ACAIQAKkA AQAEAHcBAAAAAEABDwAIAhAAqgABAAQAdwEAAAAAQAEPAAgCEACrAAEABAB3AQAAAABAAQ8ACAIQ AKwAAQAEAHcBAAAAAEABDwAIAhAArQABAAQAdwEAAAAAQAEPAAgCEACuAAEABAB3AQAAAABAAQ8A CAIQAK8AAQAEAHcBAAAAAEABDwAIAhAAsAABAAQAdwEAAAAAQAEPAAgCEACxAAEABAB3AQAAAABA AQ8ACAIQALIAAQAEAHcBAAAAAEABDwAIAhAAswABAAQAdwEAAAAAQAEPAAgCEAC0AAEABAB3AQAA AABAAQ8ACAIQALUAAQAEAHcBAAAAAEABDwAIAhAAtgABAAQAdwEAAAAAQAEPAAgCEAC3AAEABAB3 AQAAAABAAQ8ACAIQALgAAQAEAHcBAAAAAEABDwAIAhAAuQABAAQAdwEAAAAAQAEPAAgCEAC6AAEA BAB3AQAAAABAAQ8ACAIQALsAAQAEAHcBAAAAAEABDwAIAhAAvAABAAQAdwEAAAAAQAEPAAgCEAC9 AAEABAB3AQAAAABAAQ8ACAIQAL4AAQAEAHcBAAAAAEABDwAIAhAAvwABAAQAdwEAAAAAQAEPAAEC BgCgAAEALAD9AAoAoAACAC0AjAAAAAECBgCgAAMALgABAgYAoQABACwA/QAKAKEAAgAtAI0AAAAB AgYAoQADAC4AAQIGAKIAAQAsAP0ACgCiAAIALQCOAAAAAQIGAKIAAwAuAAECBgCjAAEALAD9AAoA owACAC0AjwAAAAECBgCjAAMALgABAgYApAABACwA/QAKAKQAAgAtAJAAAAABAgYApAADAC4AvgAM AKUAAQAsAC0ALgADAAECBgCmAAEALAD9AAoApgACAC0AkQAAAAECBgCmAAMALgABAgYApwABACwA /QAKAKcAAgAtAJIAAAABAgYApwADAC4AAQIGAKgAAQAsAP0ACgCoAAIALQCTAAAAAQIGAKgAAwAu AAECBgCpAAEALAD9AAoAqQACAC0AlAAAAAECBgCpAAMALgABAgYAqgABACwA/QAKAKoAAgAtAJUA AAABAgYAqgADAC4AAQIGAKsAAQAsAP0ACgCrAAIALQCWAAAAAQIGAKsAAwAuAAECBgCsAAEALAD9 AAoArAACAC0AlwAAAAECBgCsAAMALgABAgYArQABACwA/QAKAK0AAgAtAJgAAAABAgYArQADAC4A AQIGAK4AAQAsAP0ACgCuAAIALQCZAAAAAQIGAK4AAwAuAAECBgCvAAEALAD9AAoArwACAC0AmgAA AAECBgCvAAMALgABAgYAsAABACwA/QAKALAAAgAtAJsAAAABAgYAsAADAC4AAQIGALEAAQAsAP0A CgCxAAIALQCcAAAAAQIGALEAAwAuAAECBgCyAAEALAD9AAoAsgACAC0AnQAAAAECBgCyAAMALgAB AgYAswABACwA/QAKALMAAgAtAJ4AAAABAgYAswADAC4AAQIGALQAAQAsAP0ACgC0AAIALQCfAAAA AQIGALQAAwAuAAECBgC1AAEALAD9AAoAtQACAC0AoAAAAAECBgC1AAMALgABAgYAtgABACwA/QAK ALYAAgAtAKEAAAABAgYAtgADAC4AAQIGALcAAQAsAP0ACgC3AAIALQCiAAAAAQIGALcAAwAuAAEC BgC4AAEALAD9AAoAuAACAC0AowAAAAECBgC4AAMALgABAgYAuQABACwA/QAKALkAAgAtAKQAAAAB AgYAuQADAC4AAQIGALoAAQAsAP0ACgC6AAIALQClAAAAAQIGALoAAwAuAAECBgC7AAEALAD9AAoA uwACAC0ApgAAAAECBgC7AAMALgABAgYAvAABACwA/QAKALwAAgAtAKcAAAABAgYAvAADAC4AAQIG AL0AAQAsAP0ACgC9AAIALQCoAAAAAQIGAL0AAwAuAL4ADAC+AAEALAAtAC4AAwABAgYAvwABACwA /QAKAL8AAgAtAKkAAAABAgYAvwADAC4A1wBEAJwGAABsAiIAIgAiACIAIgAQACIAIgAiACIAIgAi ACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiABAACAIQAMAAAQAEAHcBAAAAAEAB DwAIAhAAwQABAAQAdwEAAAAAQAEPAAgCEADCAAEABAB3AQAAAABAAQ8ACAIQAMMAAQAEAHcBAAAA AEABDwAIAhAAxAABAAQAdwEAAAAAQAEPAAgCEADFAAEABAB3AQAAAABAAQ8ACAIQAMYAAQAEAHcB AAAAAEABDwAIAhAAxwABAAQAdwEAAAAAQAEPAAgCEADIAAEABAB3AQAAAABAAQ8ACAIQAMkAAQAE AHcBAAAAAEABDwAIAhAAygABAAQAdwEAAAAAQAEPAAgCEADLAAEABAB3AQAAAABAAQ8ACAIQAMwA AQAEAHcBAAAAAEABDwAIAhAAzQABAAQAdwEAAAAAQAEPAAgCEADOAAEABAB3AQAAAABAAQ8ACAIQ AM8AAQAEAHcBAAAAAEABDwAIAhAA0AABAAQAdwEAAAAAQAEPAAgCEADRAAEABAB3AQAAAABAAQ8A CAIQANIAAQAEAB0BAAAAAAABDwABAgYAwAABACwA/QAKAMAAAgAtAKoAAAABAgYAwAADAC4AAQIG AMEAAQAsAP0ACgDBAAIALQCrAAAAAQIGAMEAAwAuAAECBgDCAAEALAD9AAoAwgACAC0ArAAAAAEC BgDCAAMALgABAgYAwwABACwA/QAKAMMAAgAtAK0AAAABAgYAwwADAC4AAQIGAMQAAQAsAP0ACgDE AAIALQCuAAAAAQIGAMQAAwAuAAECBgDFAAEALAD9AAoAxQACAC0ArwAAAAECBgDFAAMALgABAgYA xgABACwA/QAKAMYAAgAtALAAAAABAgYAxgADAC4AAQIGAMcAAQAsAP0ACgDHAAIALQCxAAAAAQIG AMcAAwAuAAECBgDIAAEALAD9AAoAyAACAC0AsgAAAAECBgDIAAMALgABAgYAyQABACwA/QAKAMkA AgAtALMAAAABAgYAyQADAC4AAQIGAMoAAQAsAP0ACgDKAAIALQC0AAAAAQIGAMoAAwAuAL4ADADL AAEALAAtAC4AAwABAgYAzAABACwA/QAKAMwAAgAtALUAAAABAgYAzAADAC4AAQIGAM0AAQAsAP0A CgDNAAIALQC2AAAAAQIGAM0AAwAuAAECBgDOAAEALAD9AAoAzgACAC0AtwAAAAECBgDOAAMALgAB AgYAzwABACwA/QAKAM8AAgAtALgAAAABAgYAzwADAC4AAQIGANAAAQAsAP0ACgDQAAIALQC5AAAA AQIGANAAAwAuAAECBgDRAAEALAD9AAoA0QACAC0AugAAAAECBgDRAAMALgC+AAwA0gABADEAMgAz AAMA1wAqAN4DAABoASIAIgAiACIAIgAiACIAIgAiACIAIgAQACIAIgAiACIAIgAiAD4CEgC2BgAA AABAAAAAPAAAAAAAAAAdAA8AAwAAAAAAAAEAAAAAAAAAmQACAAAJ7wAGAAgANwAAAAoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA/v8AAAUBAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAqAAA AAcAAAABAAAAQAAAAAQAAABIAAAACAAAAFwAAAASAAAAcAAAAAwAAACIAAAADQAAAJQAAAATAAAA oAAAAAIAAACoAwAAHgAAAAwAAADOosjt08O7pwAAAAAeAAAADAAAAM6iyO3Tw7unAAAAAB4AAAAQ AAAATWljcm9zb2Z0IEV4Y2VsAEAAAACANagNjKfNAUAAAACAXj/FN/LNAQMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/ AAAFAQIAAAAAAAAAAAAAAAAAAAAAAAEAAAAC1c3VnC4bEJOXCAArLPmuMAAAANAAAAAJAAAAAQAA AFAAAAAPAAAAWAAAABcAAABsAAAACwAAAHQAAAAQAAAAfAAAABMAAACEAAAAFgAAAIwAAAANAAAA lAAAAAwAAACvAAAAAgAAAKgDAAAeAAAADAAAAM6iyO3W0Ln6AAAAAAMAAAAPJwsACwAAAAAAAAAL AAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAA8AAAC007y8yvXX38/yudzA7QAMEAAAAgAA AB4AAAAHAAAAuaTX97HtAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMA AAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAA ABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAA IAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAu AAAALwAAADAAAAAxAAAA/v///zMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAD+////OwAAADwA AAA9AAAAPgAAAD8AAABAAAAAQQAAAP7////9/////v////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////1IAbwBvAHQAIABF AG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUB //////////8CAAAAIAgCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAABAMHEA58s0B/v///wAAAAAA AAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAABIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAvWMAAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAQEAAAADAAAA/////wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADIAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0A YQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIB////////////////AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAAQAAAAAAAA ------=_NextPart_000_0F76_01C4C70E.11CDA5F0-- From bpm@sgi.com Mon Jan 14 16:56:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B51837F37 for ; Mon, 14 Jan 2013 16:56:29 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 905FC8F8035; Mon, 14 Jan 2013 14:56:29 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4AA854266DC; Mon, 14 Jan 2013 16:56:29 -0600 (CST) Date: Mon, 14 Jan 2013 16:56:29 -0600 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code Message-ID: <20130114225629.GD27055@sgi.com> References: <20130114071658.GF19173@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130114071658.GF19173@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Mon, Jan 14, 2013 at 06:16:58PM +1100, Dave Chinner wrote: > Here's a first cut at bringing the userspace code in sync with the > current kernel code. This patch addresses libxfs and getting > everything to work with that update. This is currently one titanic > patch because this sync has been an utter nightmare to get done, and > I've been working on it since before christmas just to get it this > far. The diffstat should give some context to the size of the sync: > > 83 files changed, 8142 insertions(+), 7092 deletions(-) > > Firstly, next time *anyone* rearranges kernel code to "make it > easier to sync with userspace" must also change the userspace code > at the same time. The mess that the dir2 header re-arrangement made > of this sync was terrible, and it appears to be far from optimal to > minimise userspace sync issues. Hint: xfs_db, xfs_repair and > metadump use lots of the kernel code to parse and modify directory > structures. Given that the dir2 code was also turned upside down by > the removal of the dabuf infrastructure and replacement with > discontiguous xfs_bufs, this made for a real nightmare. > > Secondly, I've brought across the verifiers into the userspace code, > but they are not yet hooked up to the IO infrastructure. I'll need > to do that as part of introducing the CRC infrastructure to > userspace, as we'll still need all that sort of checking to be done > regardless of how the metadta is read or written... > > Finally, some notes on things that would make it easier to do syncs > in future by making the contents of the files shared between user > and kernel space contain less kernel only code: > > - readdir/getdents is not used in userspace. Move all the > kernel readdir code to xfs_dir2_readdir.c out of the core > xfs_dir2_{sf,block,node,data}.c files > - sync regularly. i.e. at the end of every kernel cycle. > - removal of attributes is not done in userspace. Move all > of the attr removal code to a kernel only file. > - listing of attributes is not done in userspace. Move all > of the attr listing code to a kernel only file. > - move all the non-mount related code out of xfs_mount.c as > very little of the kernel mount.c is used in userspace > - in-core superblock code into own file > - other superblock stuff into own file > - per-ag infrastructure into own file > - sync regularly. i.e. at the end of every kernel cycle. > - move extent tree stuff in xfs_inode.c into own file as it > is not used in userspace > - move inode flushing into own file - userspace has it's won > versions > - move inode locking into own file - userspace doesn't use > locking. > - sync regularly. i.e. at the end of every kernel cycle. > - work out how to handle static inline functions more > cleanly as userspace has need of inline functions inside > __KERNEL__ regions but they can't be included from the > header files because the structure definition in libxfs.h > requires definitions from the header file which includes > the static inline function which then fails to compile > because the structure is not defined. e.g. xfs_inode and > xfs_get/set_projid. > - make sure kernel/user functions pass the same parameters. > e.g. xfs_get/set_projid require xfs_icdinode to be passed > because they are called from xfs_db/xfs_repair which don't > have a struct xfs_inode context, while the kernel versions > pass struct xfs_inode.... > - kernel infrastructure changes tend to have major impact > on the userspace code - changes to the userspace code > should be done at the same time. > - sync regularly. i.e. at the end of every kernel cycle. > > > This patch, despite it's size and complexity, seems to run through > xfstests without any obvious regressions. I've run with standard 4k > block sizes, 4k block/64k dirblock size and 512byte block/32k > directory block sizes without unexpected issues on a 3.8-rc2 kernel. > I could probably split this huge patch up into a couple of patches > (one to do all the discontiguous buffer support, one for all the > dir2 header changes and fixing the fallout, and one for the rest), > but right now I don't have time for that so I figured I just make > people aware that they are going to nee dto put some time aside for > review in the not too distant future... > > The next step in this work is bring across the kernel CRC > infrastructure so libxlog can be updated to match the kernel code. > Once that is in place, I'll then add all the CRC on-disk format > changes and I can start to test the kernel changes I have. I'm > hoping to have all the kernel changes ready for review by the end of > next week in the hope that we can get the kernel changes reviewd for > the 3.9 merge cycle... I'm really looking forward to seeing this code, but I don't think we should rush into this. If the few weeks between now and the merge window is enough time to get this thoroughly reviewed and tested, that's awesome. But we'll just have to see when it's posted. > Anyway, patch is below. Feedback and testing welcome. I would like to see this split up if possible. It is too big to review effectively. Regards, Ben From david@fromorbit.com Mon Jan 14 17:21:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6ACF07F37 for ; Mon, 14 Jan 2013 17:21:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5422B304032 for ; Mon, 14 Jan 2013 15:21:49 -0800 (PST) X-ASG-Debug-ID: 1358205703-04cb6c023913970001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id D91Xq8qW9bjC4fkV for ; Mon, 14 Jan 2013 15:21:44 -0800 (PST) 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: Av0OAAaS9FB5LEIF/2dsb2JhbABEhVGyFYJegzYXc4IeAQEEATocIxAIAw4KCSUPBSUDIRMfh3QFp2OODRWRGQOWCpBKgwk Received: from ppp121-44-66-5.lns20.syd6.internode.on.net (HELO dastard) ([121.44.66.5]) by ipmail05.adl6.internode.on.net with ESMTP; 15 Jan 2013 09:51:42 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TutLY-0000VD-NT; Tue, 15 Jan 2013 10:21:40 +1100 Date: Tue, 15 Jan 2013 10:21:40 +1100 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code Message-ID: <20130114232140.GH19173@dastard> X-ASG-Orig-Subj: Re: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code References: <20130114071658.GF19173@dastard> <20130114225629.GD27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130114225629.GD27055@sgi.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: 1358205703 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Mon, Jan 14, 2013 at 04:56:29PM -0600, Ben Myers wrote: > Hi Dave, > > On Mon, Jan 14, 2013 at 06:16:58PM +1100, Dave Chinner wrote: > > Here's a first cut at bringing the userspace code in sync with the > > current kernel code. This patch addresses libxfs and getting > > everything to work with that update. This is currently one titanic > > patch because this sync has been an utter nightmare to get done, and > > I've been working on it since before christmas just to get it this > > far. The diffstat should give some context to the size of the sync: > > > > 83 files changed, 8142 insertions(+), 7092 deletions(-) > > > > Firstly, next time *anyone* rearranges kernel code to "make it > > easier to sync with userspace" must also change the userspace code > > at the same time. The mess that the dir2 header re-arrangement made > > of this sync was terrible, and it appears to be far from optimal to > > minimise userspace sync issues. Hint: xfs_db, xfs_repair and > > metadump use lots of the kernel code to parse and modify directory > > structures. Given that the dir2 code was also turned upside down by > > the removal of the dabuf infrastructure and replacement with > > discontiguous xfs_bufs, this made for a real nightmare. > > > > Secondly, I've brought across the verifiers into the userspace code, > > but they are not yet hooked up to the IO infrastructure. I'll need > > to do that as part of introducing the CRC infrastructure to > > userspace, as we'll still need all that sort of checking to be done > > regardless of how the metadta is read or written... > > > > Finally, some notes on things that would make it easier to do syncs > > in future by making the contents of the files shared between user > > and kernel space contain less kernel only code: > > > > - readdir/getdents is not used in userspace. Move all the > > kernel readdir code to xfs_dir2_readdir.c out of the core > > xfs_dir2_{sf,block,node,data}.c files > > - sync regularly. i.e. at the end of every kernel cycle. > > - removal of attributes is not done in userspace. Move all > > of the attr removal code to a kernel only file. > > - listing of attributes is not done in userspace. Move all > > of the attr listing code to a kernel only file. > > - move all the non-mount related code out of xfs_mount.c as > > very little of the kernel mount.c is used in userspace > > - in-core superblock code into own file > > - other superblock stuff into own file > > - per-ag infrastructure into own file > > - sync regularly. i.e. at the end of every kernel cycle. > > - move extent tree stuff in xfs_inode.c into own file as it > > is not used in userspace > > - move inode flushing into own file - userspace has it's won > > versions > > - move inode locking into own file - userspace doesn't use > > locking. > > - sync regularly. i.e. at the end of every kernel cycle. > > - work out how to handle static inline functions more > > cleanly as userspace has need of inline functions inside > > __KERNEL__ regions but they can't be included from the > > header files because the structure definition in libxfs.h > > requires definitions from the header file which includes > > the static inline function which then fails to compile > > because the structure is not defined. e.g. xfs_inode and > > xfs_get/set_projid. > > - make sure kernel/user functions pass the same parameters. > > e.g. xfs_get/set_projid require xfs_icdinode to be passed > > because they are called from xfs_db/xfs_repair which don't > > have a struct xfs_inode context, while the kernel versions > > pass struct xfs_inode.... > > - kernel infrastructure changes tend to have major impact > > on the userspace code - changes to the userspace code > > should be done at the same time. > > - sync regularly. i.e. at the end of every kernel cycle. > > > > > > This patch, despite it's size and complexity, seems to run through > > xfstests without any obvious regressions. I've run with standard 4k > > block sizes, 4k block/64k dirblock size and 512byte block/32k > > directory block sizes without unexpected issues on a 3.8-rc2 kernel. > > I could probably split this huge patch up into a couple of patches > > (one to do all the discontiguous buffer support, one for all the > > dir2 header changes and fixing the fallout, and one for the rest), > > but right now I don't have time for that so I figured I just make > > people aware that they are going to nee dto put some time aside for > > review in the not too distant future... > > > > The next step in this work is bring across the kernel CRC > > infrastructure so libxlog can be updated to match the kernel code. > > Once that is in place, I'll then add all the CRC on-disk format > > changes and I can start to test the kernel changes I have. I'm > > hoping to have all the kernel changes ready for review by the end of > > next week in the hope that we can get the kernel changes reviewd for > > the 3.9 merge cycle... > > I'm really looking forward to seeing this code, but I don't think we should > rush into this. If the few weeks between now and the merge window is enough > time to get this thoroughly reviewed and tested, that's awesome. But we'll > just have to see when it's posted. It'll be marked as experimental, just like the initial delayed logging enhancement was, so it's not critical that it is perfect first time through. I'm working under a pretty tight deadline here, and the kernel code is what I'm really concerned about - the userspace code simply has to work well enough initially to be able to test the kernel changes. I'd suggest that mostly ignoring the userspace code right now and concentrating on the reviewing the kernel code when it is posted is the best use of review and testing time right now.. > > Anyway, patch is below. Feedback and testing welcome. > > I would like to see this split up if possible. It is too big to review > effectively. That can be done later. I just don't have time to do it now - having it work is far more important than being pretty or easy to review. Consider this a heads up for the amount of review and testing work that is going to be needed over the next couple of months... FWIW, because of the size of the sync, I'm not going to spend any significant time breaking it up into fine grained patches - 3 or 4 at most I think. Any finer grained than that is just a waste of time and effort that coul dbe going to other things. As it is, the last usr/kernel sync was a bit larger than this, and it was only split into 3 patches. In terms of review, it was really only given high level review and then *lots* of testing as a substitute for fine grained review. It ended up working pretty well - there were very few regressions introduced - and I suspect that this is the best approach to take for this sync as well. We've only just done a release, so we've got some time to get the code synced, the CRC changes merged and test the hell out of it before we think about a new release 3 months down the track... TO avoid this large patch problem in future, we need to restructure some of the kernel code to make this process easier, smaller and simpler to verify. That will take time to do, and until it is done the sync process is going to require painfully large patches.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From 8373744.99426.560@red.mailbank.com.au Mon Jan 14 17:32:30 2013 Return-Path: <8373744.99426.560@red.mailbank.com.au> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 70AA17F37 for ; Mon, 14 Jan 2013 17:32:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59FF68F8037 for ; Mon, 14 Jan 2013 15:32:27 -0800 (PST) X-ASG-Debug-ID: 1358206339-04cb6c023714bd0001-w1Z2WR Received: from mail.red.mailbank.com.au (mail.red.mailbank.com.au [202.172.104.226]) by cuda.sgi.com with ESMTP id k98IyZ2C7K5t7xWJ (version=SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Jan 2013 15:32:21 -0800 (PST) X-Barracuda-Envelope-From: 8373744.99426.560@red.mailbank.com.au X-Barracuda-Apparent-Source-IP: 202.172.104.226 Received: from GREEN by mail.mailbank.com.au (RTG Mail Server) with ESMTP id ZYS84639 for ; Tue, 15 Jan 2013 10:30:39 +1100 MIME-Version: 1.0 From: "Aurora Global Logistics" Sender: "Aurora Global Logistics" To: "linux-xfs@oss.sgi.com" Reply-To: Date: Tue, 15 Jan 2013 10:30:39 +1100 Subject: International Shipping Project Logistics Service - E-Shot Message-ID: <201301153039.837.8373744@red.mailbank.com.au> X-ASG-Orig-Subj: International Shipping Project Logistics Service - E-Shot Content-Type: multipart/alternative; boundary=--boundary_0_fdde2e6b-89b1-4a31-a9ab-9facb67bdffe X-Barracuda-Connect: mail.red.mailbank.com.au[202.172.104.226] X-Barracuda-Start-Time: 1358206340 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-Spam-Score: 0.47 X-Barracuda-Spam-Status: No, SCORE=0.47 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA503, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.30 BSF_SC7_SA503 Custom Rule SA503 ----boundary_0_fdde2e6b-89b1-4a31-a9ab-9facb67bdffe Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 KioqIElNUE9SVEFOVCBOT1RFICoqKiANCklmIHlvdSBjYW4gc2VlIHRoaXMgdGV4dCwgeW91IGFy ZSBub3QgdXNpbmcgSFRNTCBlbmFibGVkIGVtYWlsIHNvZnR3YXJlLiANCg0KDQpZb3UgY2FuIHZp ZXcgdGhpcyBlLW1haWwgb25saW5lIGF0IA0KaHR0cDovL21haWxiYW5rLmNvbS5hdS9PbmxpbmUv P0I9OTk0MjYmQks9MEJFQjBCRjJEN0Y0NA0KDQoqKioqKiogDQo= ----boundary_0_fdde2e6b-89b1-4a31-a9ab-9facb67bdffe Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PCEtLSANCioqKiBJTVBPUlRBTlQgTk9URSAqKiogDQpJZiB5b3UgY2FuIHNlZSB0aGlzIHRleHQs IHlvdSBhcmUgbm90IHVzaW5nIGFuIEhUTUwgZW5hYmxlZCBlbWFpbCBjbGllbnQuIA0KDQpZb3Ug Y2FuIHZpZXcgdGhpcyBlLW1haWwgb25saW5lIGF0IA0KaHR0cDovL21haWxiYW5rLmNvbS5hdS9P bmxpbmUvP0I9OTk0MjYmQks9MEJFQjBCRjJEN0Y0NA0KDQotIFBsZWFzZSBkaXNyZWdhcmQgYWxs IHRoZSB0ZXh0IGJlbG93IGFzIGl0IGlzIEhUTUwgZm9ybWF0dGVkIHRleHQgLSANCioqKioqKiAN Ci0tPg0KDQoNCg0KDQoNCg0KPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M IDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3Nl LmR0ZCI+DQo8aHRtbD4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBj b250ZW50PSJ0ZXh0L2h0bWw7DQpjaGFyc2V0PVVURi04Ij4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2Nz cyI+DQo8IS0tDQpib2R5LHRkIHsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbDsgZm9udC1zaXpl OjEycHggfQ0KaW1nIHsgYm9yZGVyOjAgfQ0KLS0+DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg Ymdjb2xvcj0id2hpdGUiPg0KPHAgYWxpZ249Y2VudGVyIGNsYXNzPSJ2aWV3T25saW5lIiBzdHls ZT0iZm9udC1mYW1pbHk6dGFob21hLGFyaWFsO2ZvbnQtc2l6ZToxMHB4OyI+UHJvYmxlbXMgcmVh ZGluZyB0aGlzIGUtbWFpbCA/IDxhIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idmlld09ubGluZSIg c3R5bGU9ImZvbnQtc2l6ZToxMHB4IiBocmVmPSJodHRwOi8vbWFpbGJhbmsuY29tLmF1L09ubGlu ZS8/Qj05OTQyNiZCSz0wQkVCMEJGMkQ3RjQ0JkVVSUQ9MTI0RkY5NUE5QjMyNEZEQ0JFNEY1OTBC RUM5M0VCQTEiPlZpZXcgaXQgb25saW5lIGhlcmUuPC9hPjwvcD4NCjx0YWJsZSBzdHlsZT0iUEFE RElORy1CT1RUT006IDBweDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0NSwyNDUsMjQ1KTsgTUFS R0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkct VE9QOiAwcHgiIHdpZHRoPSIxMDAlIj4NCjx0Ym9keT4NCjx0cj4NCjx0ZCBzdHlsZT0iUEFERElO Ry1UT1A6IDIwcHgiPg0KPHRhYmxlIHN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1 NSwyNTUpIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9 Ijc1MCIgYWxpZ249ImNlbnRlciI+DQo8dGJvZHk+DQo8dHI+DQo8dGQgc3R5bGU9IkJBQ0tHUk9V TkQtQ09MT1I6IHJnYigyNDUsMjQ1LDI0NSkiPg0KPHRhYmxlIHN0eWxlPSJCQUNLR1JPVU5ELUNP TE9SOiByZ2IoMjQ1LDI0NSwyNDUpIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFk ZGluZz0iMCIgd2lkdGg9Ijc1MCI+DQo8dGJvZHk+DQo8dHI+DQo8dGQgdmFsaWduPSJ0b3AiIGFs aWduPSJsZWZ0Ij48YSBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMt c2VyaWY7IEZPTlQtU0laRTogMTJweCIgaHJlZj0iIyI+VmlldyB0aGlzIEUtc2hvdCBvbmxpbmU8 L2E+IDwvdGQ+DQo8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCI+PHNwYW4gc3R5bGU9IlRF WFQtVFJBTlNGT1JNOiB1cHBlcmNhc2U7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBz YW5zLXNlcmlmOyBDT0xPUjogI2FhYWFhYTsgRk9OVC1TSVpFOiAxMXB4Ij5FeGN1c2l2ZSBBdXN0 cmFsaWFuIEFnZW50IGZvcjo8L3NwYW4+IDwvdGQ+PC90cj4NCjx0cj4NCjx0ZD4mbmJzcDs8YSBo cmVmPSJodHRwOi8vbWFpbGJhbmsuY29tLmF1L09ubGluZS8/Qj05OTQyNiZCSz0wQkVCMEJGMkQ3 RjQ0JkVVSUQ9MTI0RkY5NUE5QjMyNEZEQ0JFNEY1OTBCRUM5M0VCQTEiIHRhcmdldD0iX2JsYW5r Ij52aWV3IG9ubGluZTwvYT48YnI+PC90ZD4NCjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0 Ij48YSBzdHlsZT0iVEVYVC1ERUNPUkFUSU9OOiBub25lIiBocmVmPSIjIj48aW1nIGFsdD0iIiBz cmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNz L2ltYWdlcy9kdHlfbGluay5qcGciIHdpZHRoPSI5NiIgaGVpZ2h0PSIzMCI+IDwvYT48YSBzdHls ZT0iVEVYVC1ERUNPUkFUSU9OOiBub25lIiBocmVmPSIjIj48aW1nIGFsdD0iIiBzcmM9Imh0dHA6 Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdlcy9w ZXRlcl9saW5rLmpwZyIgd2lkdGg9IjY3IiBoZWlnaHQ9IjI2Ij4gPC9hPjwvdGQ+PC90cj48L3Ri b2R5PjwvdGFibGU+PC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJIRUlHSFQ6IDRweCI+PGJy PjwvdGQ+PC90cj4NCjx0cj4NCjx0ZD4NCjx0YWJsZSBzdHlsZT0iQkFDS0dST1VORC1DT0xPUjog cmdiKDI1NSwyNTUsMjU1KSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9 IjAiIHdpZHRoPSI3MDAiPg0KPHRib2R5Pg0KPHRyPg0KPHRkIHN0eWxlPSJMSU5FLUhFSUdIVDog MXB4IiB2YWxpZ249InRvcCI+PGEgc3R5bGU9IlRFWFQtREVDT1JBVElPTjogbm9uZSIgaHJlZj0i IyI+PGltZyBzdHlsZT0iQk9SREVSLUJPVFRPTTogMHB4IHNvbGlkOyBCT1JERVItTEVGVDogMHB4 IHNvbGlkOyBCT1JERVItVE9QOiAwcHggc29saWQ7IEJPUkRFUi1SSUdIVDogMHB4IHNvbGlkIiBh bHQ9IiIgc3JjPSJodHRwOi8vd2Vic2l0ZXMubWFpbGJhbmsuY29tLmF1L0F1cm9yYUdsb2JhbExv Z2lzdGljcy9pbWFnZXMvYmFubmVyLmpwZyIgd2lkdGg9Ijc1MCIgaGVpZ2h0PSIzMDkiPjwvYT4g PC90ZD48L3RyPg0KPHRyIGJnY29sb3I9IiNmZmZmZmYiPg0KPHRkIHN0eWxlPSJCQUNLR1JPVU5E LUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpIj4NCjx0YWJsZSBzdHlsZT0iQk9SREVSLUJPVFRPTTog cmdiKDIzNywyMzcsMjM3KSAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiByZ2IoMjM3LDIzNywyMzcp IDFweCBzb2xpZDsgUEFERElORy1CT1RUT006IDEwcHg7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigy NDUsMjQ1LDI0NSk7IEJPUkRFUi1UT1A6IHJnYigyMzcsMjM3LDIzNykgMXB4IHNvbGlkOyBCT1JE RVItUklHSFQ6IHJnYigyMzcsMjM3LDIzNykgMXB4IHNvbGlkOyBQQURESU5HLVRPUDogMTBweCIg Y2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNzMwIiBhbGlnbj0iY2VudGVy Ij4NCjx0Ym9keT4NCjx0cj4NCjx0ZD4NCjx0YWJsZSBzdHlsZT0iUEFERElORy1CT1RUT006IDBw eDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0NywyNDcsMjQ3KTsgTUFSR0lOOiAwcHg7IFBBRERJ TkctTEVGVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctVE9QOiAwcHgiIGJvcmRl cj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNzMwIj4NCjx0Ym9k eT4NCjx0cj4NCjx0ZCBzdHlsZT0iUEFERElORy1CT1RUT006IDEwcHg7IFBBRERJTkctTEVGVDog MzBweDsgV0lEVEg6IDQ4NHB4OyBQQURESU5HLVJJR0hUOiAzMHB4OyBQQURESU5HLVRPUDogMTBw eCIgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0Ij4NCjxoMiBzdHlsZT0iUEFERElORy1CT1RU T006IDBweDsgVEVYVC1UUkFOU0ZPUk06IHVwcGVyY2FzZTsgTUFSR0lOOiAwcHg7IFBBRERJTkct TEVGVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0 aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDI1NCwxNDgsMzUpOyBGT05ULVNJWkU6IDE2cHg7 IEZPTlQtV0VJR0hUOiBub3JtYWw7IFBBRERJTkctVE9QOiAwcHgiPlByb2plY3QgTG9naXN0aWNz IFNlcnZpY2UgU3BFQ0lBTElTVFM8L2gyPg0KPHAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwcHg7 IFRFWFQtVFJBTlNGT1JNOiB1cHBlcmNhc2U7IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBw eDsgUEFERElORy1SSUdIVDogMHB4OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fu cy1zZXJpZjsgQ09MT1I6IHJnYigyNTQsMTQ4LDM1KTsgRk9OVC1TSVpFOiAxNnB4OyBGT05ULVdF SUdIVDogbm9ybWFsOyBQQURESU5HLVRPUDogMHB4Ij48c3BhbiBzdHlsZT0iRk9OVC1TSVpFOiAx MHB4Ij5hbiBBdXN0cmFsaWFuIG93bmVkIGFuZCBtYW5hZ2VkIGNvbXBhbnk8L3NwYW4+PC9wPjwv dGQ+DQo8dGQgc3R5bGU9IldJRFRIOiAyNDZweDsgUEFERElORy1SSUdIVDogMzBweCIgdmFsaWdu PSJjZW50ZXIiIGFsaWduPSJyaWdodCI+PGEgc3R5bGU9IlRFWFQtREVDT1JBVElPTjogbm9uZSIg aHJlZj0ibWFpbHRvOnByb2plY3RzQGF1cm9yYWxvZ2lzdGljcy5jb20/c3ViamVjdD1Qcm9qZWN0 JTIwTG9naXN0aWNzJTIwSW5xdWlyeSI+PGltZyBhbHQ9IiIgc3JjPSJodHRwOi8vd2Vic2l0ZXMu bWFpbGJhbmsuY29tLmF1L0F1cm9yYUdsb2JhbExvZ2lzdGljcy9pbWFnZXMvcmVxdWVzdF9idG4u anBnIiB3aWR0aD0iMjA1IiBoZWlnaHQ9IjM5Ij48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGJvZHk+ PC90YWJsZT48L3RkPjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9IlBBRERJTkctVE9QOiAxMHB4Ij4N Cjx0YWJsZSBzdHlsZT0iQkFDS0dST1VORC1DT0xPUjogcmdiKDI0NywyNDcsMjQ3KSIgYm9yZGVy PSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI2NjAiIGFsaWduPSJj ZW50ZXIiPg0KPHRib2R5Pg0KPHRyPg0KPHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWduPSJ0 b3AiIGFsaWduPSJsZWZ0Ij48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFu ay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0KPHRk IHN0eWxlPSJQQURESU5HLVJJR0hUOiAzMHB4OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGlj YSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTJweCIg dmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij5BdXJvcmEgY2FuIGFzc2lzdCB3aXRoIHRoZSBtb3Zl bWVudCBvZiB5b3VyIG1hY2hpbmVyeSAvIHByb2plY3QgZnJvbSBzaXRlIHRvIHNpdGUsIG9yIHBv cnQgdG8gcG9ydCBnbG9iYWxseS48L3RkPg0KPHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWdu PSJ0b3AiIGFsaWduPSJsZWZ0Ij48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWls YmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0K PHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09M T1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTJweCIgdmFsaWduPSJ0b3AiIGFsaWdu PSJsZWZ0Ij5XZSBhcmUgcHJvamVjdCBsb2dpc3RpY3MgY3VzdG9tcyBicm9rZXJzIGFuZCBjYW4g YXNzaXN0IHdpdGggYWxsIGFzcGVjdHMgb2YgY2xlYXJhbmNlIGludG8gYW5kIG91dCBvZiBBdXN0 cmFsaWEgPC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWduPSJ0 b3AiIGFsaWduPSJsZWZ0Ij48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFu ay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0KPHRk IHN0eWxlPSJQQURESU5HLVJJR0hUOiAzMHB4OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGlj YSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTJweCIg dmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij5XZSBvZmZlciBmaXhlZCBzY2hlZHVsZXM8L3RkPg0K PHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij48aW1nIGFs dD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9n aXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQt U0laRTogMTJweDsgUEFERElORy1UT1A6IDBweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij5Q cml2YXRlbHkgb3duZWQgQXVzdHJhbGlhbiBidXNpbmVzcyA8L3RkPjwvdHI+PC90Ym9keT48L3Rh YmxlPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxl PSJCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMjBweCI+ DQo8dGFibGUgc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IE1BUkdJ Ti1UT1A6IDEwcHgiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3 aWR0aD0iNzEwIiBhbGlnbj0iY2VudGVyIj4NCjx0Ym9keT4NCjx0cj4NCjx0ZCBzdHlsZT0iUEFE RElORy1MRUZUOiA1cHg7IEhFSUdIVDogNDBweCIgdmFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIi IGFsaWduPSJsZWZ0Ij4NCjxoMyBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IHVwcGVyY2FzZTsgRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoNTEsNTEs NTEpOyBGT05ULVNJWkU6IDE4cHg7IEZPTlQtV0VJR0hUOiBub3JtYWwiPkF1cm9yYSBJTlRFUk5B VElPTkFMIEFORCBET01FU1RJQyBTY2hlZHVsZXM8L2gzPjwvdGQ+PC90cj4NCjx0cj4NCjx0ZCB2 YWxpZ249InRvcCIgcm93c3Bhbj0iMyIgYWxpZ249ImxlZnQiPjxpbWcgYWx0PSIiIHNyYz0iaHR0 cDovL3dlYnNpdGVzLm1haWxiYW5rLmNvbS5hdS9BdXJvcmFHbG9iYWxMb2dpc3RpY3MvaW1hZ2Vz L3BpY19sZWZ0LmpwZyIgd2lkdGg9IjE0MyIgaGVpZ2h0PSI0NTEiPjwvdGQ+DQo8dGQ+DQo8dGFi bGUgc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSkiIGJvcmRlcj0iMCIg Y2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI2Ij4NCjx0Ym9keT4NCjx0cj4NCjx0ZCBzdHls ZT0iV0lEVEg6IDE1MHB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPg0KPGgzIHN0eWxlPSJQ QURESU5HLUJPVFRPTTogMHB4OyBURVhULVRSQU5TRk9STTogdXBwZXJjYXNlOyBNQVJHSU46IDBw eDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctUklHSFQ6IDBweDsgRk9OVC1GQU1JTFk6IEFy aWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMjI4LDEyMCw5KTsgRk9OVC1T SVpFOiAxMnB4OyBGT05ULVdFSUdIVDogbm9ybWFsOyBQQURESU5HLVRPUDogMHB4Ij5XZXN0IENv YXN0IFVTQSA8YnI+dG8gQVVzdHJhbGlhPC9oMz48L3RkPg0KPHRkIHN0eWxlPSJXSURUSDogOTBw eDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2Io NDEsNDAsOTApOyBGT05ULVNJWkU6IDExcHg7IEZPTlQtV0VJR0hUOiBib2xkIiB2YWxpZ249InRv cCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IldJRFRIOiAxMDBweDsgRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoNDEsNDAs OTApOyBGT05ULVNJWkU6IDExcHg7IEZPTlQtV0VJR0hUOiBib2xkIiB2YWxpZ249InRvcCIgYWxp Z249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IldJRFRIOiA5MHB4OyBGT05ULUZBTUlM WTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYig0MSw0MCw5MCk7IEZP TlQtU0laRTogMTFweDsgRk9OVC1XRUlHSFQ6IGJvbGQiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVm dCI+Jm5ic3A7PC90ZD4NCjx0ZCBzdHlsZT0iV0lEVEg6IDEyMHB4OyBGT05ULUZBTUlMWTogQXJp YWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYig0MSw0MCw5MCk7IEZPTlQtU0la RTogMTFweDsgRk9OVC1XRUlHSFQ6IGJvbGQiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5i c3A7PC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZl dGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTFw eCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4NCjxwIHN0eWxlPSJQQURESU5HLUJPVFRPTTog MHB4OyBMSU5FLUhFSUdIVDogMTVweDsgTUFSR0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQ QURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctVE9QOiAwcHgiPkxvcyBBbmdlbGVzPC9wPjwvdGQ+ DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBD T0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxp Z249ImxlZnQiPiZuYnNwO0V2ZXJ5IDMgd2Vla3M8L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7 IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3RkPg0K PHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09M T1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJ0b3AiIGFsaWdu PSJsZWZ0Ij4mbmJzcDs8L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZl dGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTFw eCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3RkPjwvdHI+DQo8dHI+DQo8dGQg c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjog cmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249Imxl ZnQiPkJyaXNiYW5lPC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRp Y2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgi IHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7MzIgRGF5czwvdGQ+DQo8dGQgc3R5bGU9 IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEw MiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZu YnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5z LXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249 InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBB cmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9O VC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+PC90cj4N Cjx0cj4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2Vy aWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9w IiBhbGlnbj0ibGVmdCI+TWVsYm91cm5lPC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05U LVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7MzUgRGF5czwvdGQ+ DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBD T0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxp Z249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVs dmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAx MXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwx MDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNw OzwvdGQ+PC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRp Y2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgi IHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+UG9ydCBLZW1ibGE8L3RkPg0KPHRkIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIs MTAyLDEwMik7IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJz cDszOSBEYXlzPC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2Es IHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZh bGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7PC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIp OyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7PC90ZD4N Cjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENP TE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGln bj0ibGVmdCI+Jm5ic3A7PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+DQo8dHI+ DQo8dGQgc3R5bGU9IlBBRERJTkctVE9QOiAzMHB4Ij4NCjx0YWJsZSBzdHlsZT0iQkFDS0dST1VO RC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2Vs bHBhZGRpbmc9IjYiPg0KPHRib2R5Pg0KPHRyPg0KPHRkIHN0eWxlPSJXSURUSDogMTUwcHgiIHZh bGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+DQo8aDMgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwcHg7 IFRFWFQtVFJBTlNGT1JNOiB1cHBlcmNhc2U7IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBw eDsgUEFERElORy1SSUdIVDogMHB4OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fu cy1zZXJpZjsgQ09MT1I6IHJnYigyMjgsMTIwLDkpOyBGT05ULVNJWkU6IDEycHg7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IFBBRERJTkctVE9QOiAwcHgiPkFzaWEgPGJyPnRvIEFVc3RyYWxpYTwvaDM+ PC90ZD4NCjx0ZCBzdHlsZT0iV0lEVEg6IDkwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0 aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDQxLDQwLDkwKTsgRk9OVC1TSVpFOiAxMXB4OyBG T05ULVdFSUdIVDogYm9sZCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3RkPg0K PHRkIHN0eWxlPSJXSURUSDogMTAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBz YW5zLXNlcmlmOyBDT0xPUjogcmdiKDQxLDQwLDkwKTsgRk9OVC1TSVpFOiAxMXB4OyBGT05ULVdF SUdIVDogYm9sZCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3RkPg0KPHRkIHN0 eWxlPSJXSURUSDogOTBweDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2Vy aWY7IENPTE9SOiByZ2IoNDEsNDAsOTApOyBGT05ULVNJWkU6IDExcHg7IEZPTlQtV0VJR0hUOiBi b2xkIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IldJ RFRIOiAxMjBweDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENP TE9SOiByZ2IoNDEsNDAsOTApOyBGT05ULVNJWkU6IDExcHg7IEZPTlQtV0VJR0hUOiBib2xkIiB2 YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+PC90cj4NCjx0cj4NCjx0ZCBzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2Io MTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+ U2hhbmdoYWk8L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwg c2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTFweCIgdmFs aWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDtXZWVrbHkgU2VydmljZTwvdGQ+DQo8dGQgc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdi KDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQi PiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBz YW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxp Z249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZ OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsg Rk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+PC90 cj4NCjx0cj4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMt c2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0i dG9wIiBhbGlnbj0ibGVmdCI+DQo8cCBzdHlsZT0iUEFERElORy1CT1RUT006IDBweDsgTElORS1I RUlHSFQ6IDE1cHg7IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1SSUdI VDogMHB4OyBQQURESU5HLVRPUDogMHB4Ij5TeWRuZXk8L3A+PC90ZD4NCjx0ZCBzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEw MiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7 MTggRGF5czwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBz YW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxp Z249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZ OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsg Rk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8 dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xP UjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249 ImxlZnQiPiZuYnNwOzwvdGQ+PC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05U LVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+TWVsYm91cm5lPC90ZD4NCjx0 ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9S OiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0i bGVmdCI+Jm5ic3A7MjAgRGF5czwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwg SGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpF OiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9 IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDEw MiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZu YnNwOzwvdGQ+DQo8dGQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5z LXNlcmlmOyBDT0xPUjogcmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249 InRvcCIgYWxpZ249ImxlZnQiPiZuYnNwOzwvdGQ+PC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEw MiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+QnJpc2Jh bmU8L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1z ZXJpZjsgQ09MT1I6IHJnYigxMDIsMTAyLDEwMik7IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJ0 b3AiIGFsaWduPSJsZWZ0Ij4mbmJzcDsyMyBEYXlzPC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIp OyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7PC90ZD4N Cjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENP TE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGln bj0ibGVmdCI+Jm5ic3A7PC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2 ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDEx cHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Jm5ic3A7PC90ZD48L3RyPjwvdGJvZHk+PC90 YWJsZT48L3RkPjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9IlBBRERJTkctVE9QOiAzMHB4Ij4NCjx0 YWJsZSBzdHlsZT0iQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KSIgYm9yZGVyPSIw IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjYiPg0KPHRib2R5Pg0KPHRyPg0KPHRkIHN0 eWxlPSJXSURUSDogMTUwcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+DQo8aDMgc3R5bGU9 IlBBRERJTkctQk9UVE9NOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiB1cHBlcmNhc2U7IE1BUkdJTjog MHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1SSUdIVDogMHB4OyBGT05ULUZBTUlMWTog QXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigyMjgsMTIwLDkpOyBGT05U LVNJWkU6IDEycHg7IEZPTlQtV0VJR0hUOiBub3JtYWw7IFBBRERJTkctVE9QOiAwcHgiPkNvYXN0 YWwgY2FyZ288L2gzPjwvdGQ+DQo8dGQgc3R5bGU9IldJRFRIOiAyODRweDsgRk9OVC1GQU1JTFk6 IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoNDEsNDAsOTApOyBGT05U LVNJWkU6IDExcHg7IEZPTlQtV0VJR0hUOiBib2xkIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQi PiZuYnNwOzwvdGQ+DQo8dGQgc3R5bGU9IldJRFRIOiAxMzhweDsgRk9OVC1GQU1JTFk6IEFyaWFs LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoNDEsNDAsOTApOyBGT05ULVNJWkU6 IDExcHg7IEZPTlQtV0VJR0hUOiBib2xkIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiZuYnNw OzwvdGQ+PC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRp Y2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBGT05ULVNJWkU6IDExcHgi IHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+UG9ydCBIZWFkbGFuZC9XZWlwYTwvdGQ+DQo8dGQg c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjog cmdiKDEwMiwxMDIsMTAyKTsgRk9OVC1TSVpFOiAxMXB4IiB2YWxpZ249InRvcCIgYWxpZ249Imxl ZnQiPk1vbnRobHk8L3RkPg0KPHRkIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGlj YSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxNTMsMTUzLDE1Myk7IEZPTlQtU0laRTogMTFweCIg dmFsaWduPSJ0b3AiIHJvd3NwYW49IjIiIGFsaWduPSJsZWZ0Ij4qIFNlcnZpY2luZyBhbGwgb3Ro ZXIgcG9ydHMgb24gYSByZWd1bGFyIGJhc2ljPC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMDIs MTAyLDEwMik7IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4NCjxw IHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4OyBMSU5FLUhFSUdIVDogMTVweDsgTUFSR0lOOiAw cHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctVE9QOiAw cHgiPkZyZW1hbnRsZS9OZXdjYXN0bGU8L3A+PC90ZD4NCjx0ZCBzdHlsZT0iRk9OVC1GQU1JTFk6 IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTAyLDEwMiwxMDIpOyBG T05ULVNJWkU6IDExcHgiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+TW9udGhseTwvdGQ+PC90 cj48L3Rib2R5PjwvdGFibGU+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+DQo8 dHI+DQo8dGQgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAxNXB4OyBMSU5FLUhFSUdIVDogMXB4OyBQ QURESU5HLVRPUDogMjBweCIgYWxpZ249Im1pZGRsZSI+DQo8dGFibGUgc3R5bGU9IlBBRERJTkct Qk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1SSUdI VDogMHB4OyBQQURESU5HLVRPUDogMHB4IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxs cGFkZGluZz0iMCIgd2lkdGg9IjczMCIgYWxpZ249ImNlbnRlciI+DQo8dGJvZHk+DQo8dHI+DQo8 dGQgc3R5bGU9IldJRFRIOiAyN3B4OyBIRUlHSFQ6IDIxNXB4Ij48aW1nIGFsdD0iIiBzcmM9Imh0 dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdl cy9sZWZ0LmpwZyIgd2lkdGg9IjI3IiBoZWlnaHQ9IjI1MSI+PC90ZD4NCjx0ZCBzdHlsZT0iTElO RS1IRUlHSFQ6IDFweDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDU4LDU4LDU4KSIgdmFsaWduPSJ0 b3AiPg0KPHRhYmxlIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgUEFE RElORy1MRUZUOiAwcHg7IFBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1UT1A6IDBweCIgYm9y ZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KPHRib2R5Pg0KPHRyPg0K PHRkIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElO Ry1SSUdIVDogMHB4OyBIRUlHSFQ6IDEwMHB4OyBQQURESU5HLVRPUDogMjBweCIgdmFsaWduPSJj ZW50ZXIiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4NCjxoMiBzdHlsZT0iUEFERElORy1CT1RU T006IDBweDsgTElORS1IRUlHSFQ6IDE4cHg7IE1BUkdJTjogMHB4OyBQQURESU5HLUxFRlQ6IDBw eDsgUEFERElORy1SSUdIVDogMHB4OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fu cy1zZXJpZjsgQ09MT1I6IHJnYigyNTQsMTQ4LDM1KTsgRk9OVC1TSVpFOiAxOHB4OyBGT05ULVdF SUdIVDogbm9ybWFsOyBQQURESU5HLVRPUDogMHB4Ij5DVVNUT01TIENMRUFSQU5DRTwvaDI+DQo8 cCBzdHlsZT0iUEFERElORy1CT1RUT006IDBweDsgTElORS1IRUlHSFQ6IDE1cHg7IE1BUkdJTjog MTBweCAwcHggNXB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1SSUdIVDogMHB4OyBGT05U LUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigyNTUsMjU1 LDI1NSk7IEZPTlQtU0laRTogMTJweDsgUEFERElORy1UT1A6IDBweCI+QXVyb3JhIEdsb2JhbCBM b2dpc3RpY3MgYXJlIGZ1bGx5IGxpY2Vuc2VkIGN1c3RvbXMgYW5kIHF1YXJhbnRpbmUgYnJva2Vy cyBmb3IgYWxsIHBvcnRzIG9mIEF1c3RyYWxpYS48L3A+DQo8cCBzdHlsZT0iUEFERElORy1CT1RU T006IDBweDsgTElORS1IRUlHSFQ6IDE1cHg7IE1BUkdJTjogMHB4IDBweCA1cHg7IFBBRERJTkct TEVGVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0 aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgRk9OVC1TSVpFOiAxMnB4 OyBQQURESU5HLVRPUDogMHB4Ij5PdXIgc2VydmljZXMgaW5jbHVkZTo8L3A+PC90ZD48L3RyPg0K PHRyPg0KPHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij48 aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xv YmFsTG9naXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0KPHRkIHN0eWxlPSJMSU5FLUhFSUdI VDogMTVweCIgdmFsaWduPSJ0b3AiPjxzcGFuIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4OyBM SU5FLUhFSUdIVDogMTVweDsgTUFSR0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURESU5H LVJJR0hUOiAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBD T0xPUjogI2ZmZmZmZjsgRk9OVC1TSVpFOiAxMnB4OyBQQURESU5HLVRPUDogMHB4Ij5Jbi1ob3Vz ZSBjdXN0b21zIGNsZWFyYW5jZSBbQXVzdHJhbGlhbiBDdXN0b21zIFNlcnZpY2UgKEFDUykgYW5k IEF1c3RyYWxpYW4gUXVhcmFudGluZSAmYW1wOyBJbnNwZWN0aW9uIFNlcnZpY2UgKEFRSVMpIGFj Y3JlZGl0ZWQgQ3VzdG9tcyBCcm9rZXJzXTwvc3Bhbj48L3RkPjwvdHI+DQo8dHI+DQo8dGQgc3R5 bGU9IldJRFRIOiAzMHB4IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxpbWcgYWx0PSIiIHNy Yz0iaHR0cDovL3dlYnNpdGVzLm1haWxiYW5rLmNvbS5hdS9BdXJvcmFHbG9iYWxMb2dpc3RpY3Mv aW1hZ2VzL2JsMS5wbmciPjwvdGQ+DQo8dGQgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNXB4IiB2YWxp Z249InRvcCI+PHNwYW4gc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwcHg7IExJTkUtSEVJR0hUOiAx NXB4OyBNQVJHSU46IDBweDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctUklHSFQ6IDBweDsg Rk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiAjZmZmZmZm OyBGT05ULVNJWkU6IDEycHg7IFBBRERJTkctVE9QOiAwcHgiPlNwZWNpYWxpc3RzIGluIGN1c3Rv bXMgYW5kIEFRSVMgcHJvamVjdCBjbGVhcmFuY2UgY29uc3VsdGFuY2U8L3NwYW4+PC90ZD48L3Ry Pg0KPHRyPg0KPHRkIHN0eWxlPSJXSURUSDogMzBweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0 Ij48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3Jh R2xvYmFsTG9naXN0aWNzL2ltYWdlcy9ibDEucG5nIj48L3RkPg0KPHRkIHN0eWxlPSJMSU5FLUhF SUdIVDogMTVweCIgdmFsaWduPSJ0b3AiPjxzcGFuIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMHB4 OyBMSU5FLUhFSUdIVDogMTVweDsgTUFSR0lOOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURE SU5HLVJJR0hUOiAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlm OyBDT0xPUjogI2ZmZmZmZjsgRk9OVC1TSVpFOiAxMnB4OyBQQURESU5HLVRPUDogMHB4Ij5FeHRl bnNpdmUgb24tZ3JvdW5kIGhhbmRsaW5nIGV4cGVyaWVuY2U8L3NwYW4+PC90ZD48L3RyPjwvdGJv ZHk+PC90YWJsZT48L3RkPg0KPHRkIHN0eWxlPSJXSURUSDogMzQ4cHgiPjxpbWcgYWx0PSIiIHNy Yz0iaHR0cDovL3dlYnNpdGVzLm1haWxiYW5rLmNvbS5hdS9BdXJvcmFHbG9iYWxMb2dpc3RpY3Mv aW1hZ2VzL3JpZ2h0LmpwZyIgd2lkdGg9IjM0OCIgaGVpZ2h0PSIyNTEiPjwvdGQ+PC90cj48L3Ri b2R5PjwvdGFibGU+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+DQo8dHI+DQo8 dGQgc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDUsMjQ1LDI0NSkiPg0KPHRhYmxlIHN0 eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjQ1LDI0NSwyNDUpIiBib3JkZXI9IjAiIGNlbGxz cGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjczMCI+DQo8dGJvZHk+DQo8dHI+DQo8 dGQgc3R5bGU9IlBBRERJTkctVE9QOiAzMHB4Ij4NCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFj aW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjczMCIgYWxpZ249ImNlbnRlciI+DQo8dGJv ZHk+DQo8dHI+DQo8dGQgc3R5bGU9IldJRFRIOiAxOTJweCIgdmFsaWduPSJ0b3AiPjxhIHN0eWxl PSJURVhULURFQ09SQVRJT046IG5vbmUiIGhyZWY9IiMiPjwvYT48YSBocmVmPSJodHRwOi8vbWFp bGJhbmsuY29tLmF1L3JlZGlyLmFzcD9FPTgzNzM3NDQmVD05OTQyNiZVPTU2MDE0Y2IyMGFmMjEw ZjRiOGI5YTgzOTUwOTIyNzg2ODQ5IiB0YXJnZXQ9Il9ibGFuayI+PGltZyBhbHQ9IiIgc3JjPSJo dHRwOi8vd2Vic2l0ZXMubWFpbGJhbmsuY29tLmF1L0F1cm9yYUdsb2JhbExvZ2lzdGljcy9pbWFn ZXMvbG9nby5qcGciIHdpZHRoPSIxNDEiIGhlaWdodD0iNDMiPjwvYT48L3RkPg0KPHRkIHN0eWxl PSJXSURUSDogMzQ1cHgiIHZhbGlnbj0idG9wIj4NCjxwIHN0eWxlPSJMSU5FLUhFSUdIVDogMTZw eDsgTUFSR0lOOiAwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlm OyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMXB4Ij5BdXJvcmEgR2xvYmFsIExv Z2lzdGljcyBQdHkgTHRkPGJyPjQ4IE1jQ29ubmVsIFN0cmVldCwgQnVsaW1iYSBRTEQgQXVzdHJh bGlhbiA0MTcxPGJyPlRlbDogMDcgMzkwMCA1OTAwPGJyPkZheDogMDcgMzM5OSA3MjA5PC9wPjwv dGQ+DQo8dGQgc3R5bGU9IldJRFRIOiAxOTNweCIgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCI+ PHNwYW4gc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBD T0xPUjogIzMzMzMzMzsgRk9OVC1TSVpFOiAxMXB4Ij5BdXJvcmEgR2xvYmFsIExvZ2lzdGljcyBh cmUgdGhlIGV4Y2x1c2l2ZSBjb21tZXJjaWFsIGFnZW50cyBmb3I6PC9zcGFuPiA8L3RkPjwvdHI+ DQo8dHI+DQo8dGQ+PGltZyBzdHlsZT0iQk9SREVSLUJPVFRPTTogMHB4IHNvbGlkOyBCT1JERVIt TEVGVDogMHB4IHNvbGlkOyBCT1JERVItVE9QOiAwcHggc29saWQ7IEJPUkRFUi1SSUdIVDogMHB4 IHNvbGlkIiBhbHQ9IiIgc3JjPSJodHRwOi8vd2Vic2l0ZXMubWFpbGJhbmsuY29tLmF1L0F1cm9y YUdsb2JhbExvZ2lzdGljcy9pbWFnZXMvZmFjZWJvb2tfaWNvbi5wbmciPiZuYnNwOyZuYnNwOzxh IHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgRk9OVC1T SVpFOiAxMXB4IiBocmVmPSIjIj5GaW5kIHVzIG9uIEZhY2Vib29rPC9hPjwvdGQ+DQo8dGQ+PGEg c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBGT05ULVNJ WkU6IDExcHgiIGhyZWY9Imh0dHA6Ly93d3cuYXVyb3JhbG9naXN0aWNzLmNvbSI+d3d3LmF1cm9y YWxvZ2lzdGljcy5jb208L2E+PC90ZD4NCjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0Ij48 YSBzdHlsZT0iVEVYVC1ERUNPUkFUSU9OOiBub25lIiBocmVmPSIjIj48aW1nIGFsdD0iIiBzcmM9 Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2lt YWdlcy9kdHlfbGluay5qcGciIHdpZHRoPSI5NiIgaGVpZ2h0PSIzMCI+PC9hPiA8YSBzdHlsZT0i VEVYVC1ERUNPUkFUSU9OOiBub25lIiBocmVmPSIjIj48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93 ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNzL2ltYWdlcy9wZXRl cl9saW5rLmpwZyIgd2lkdGg9IjY3IiBoZWlnaHQ9IjI2Ij48L2E+IDwvdGQ+PC90cj4NCjx0cj4N Cjx0ZD48aW1nIHN0eWxlPSJCT1JERVItQk9UVE9NOiAwcHggc29saWQ7IEJPUkRFUi1MRUZUOiAw cHggc29saWQ7IEJPUkRFUi1UT1A6IDBweCBzb2xpZDsgQk9SREVSLVJJR0hUOiAwcHggc29saWQi IGFsdD0iIiBzcmM9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFs TG9naXN0aWNzL2ltYWdlcy90d2lpdGVyX2ljb24ucG5nIj4mbmJzcDsmbmJzcDs8YSBzdHlsZT0i Rk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IEZPTlQtU0laRTogMTFw eCIgaHJlZj0iIyI+Rm9sbG93IG9uIFR3aXR0ZXI8L2E+PC90ZD4NCjx0ZD48YSBzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IEZPTlQtU0laRTogMTFweCIg aHJlZj0iaHR0cDovL3d3dy55YWNodC10cmFuc3BvcnQuY29tLmF1Ij53d3cueWFjaHQtdHJhbnNw b3J0LmNvbS5hdTwvYT48L3RkPg0KPHRkPiZuYnNwOzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+ PC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJQQURESU5HLVRPUDogMzBweCI+DQo8dGFibGUg Ym9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIHdpZHRoPSI3NTAiPg0K PHRib2R5Pg0KPHRyPg0KPHRkIGFsaWduPSJtaWRkbGUiPjxzcGFuIHN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6ICMzMzMzMzM7IEZPTlQtU0la RTogMTBweCI+UGxlYXNlIGRvIG5vdCByZXBseSB0byB0aGlzIEUtU2hvdDwvc3Bhbj48L3RkPjwv dHI+DQo8dHI+DQo8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJtaWRkbGUiPjxzcGFuIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6ICMzMzMzMzM7 IEZPTlQtU0laRTogMTBweCI+U2ltcGx5IGNsaWNrICdyZXF1ZXN0IGEgcXVvdGUnIGZvciBhbiBp bW1lZGlhdGUgcXVvdGF0aW9uPC9zcGFuPjwvdGQ+PC90cj4NCjx0cj4NCjx0ZCB2YWxpZ249InRv cCIgYWxpZ249Im1pZGRsZSI+PHNwYW4gc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0 aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogIzMzMzMzMzsgRk9OVC1TSVpFOiAxMHB4Ij5QbGVhc2Ug ZW1haWwgPGEgaHJlZj0ibWFpbHRvOmphc29uQGF1cm9yYWxvZ2lzdGljcy5jb20iPmphc29uQGF1 cm9yYWxvZ2lzdGljcy5jb208L2E+IG9yIDxhIGhyZWY9Im1haWx0bzpnZW1tYUBhdXJvcmFsb2dp c3RpY3MuY29tIj5nZW1tYUBhdXJvcmFsb2dpc3RpY3MuY29tIDwvYT5mb3IgZnVydGhlciBpbmZv cm1hdGlvbjwvc3Bhbj48L3RkPjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9IkhFSUdIVDogNDBweDsg Q09MT1I6IHJnYig0MSw0MCw5MCk7IEZPTlQtU0laRTogMTFweCIgdmFsaWduPSJtaWRsZSIgYWxp Z249Im1pZGRsZSI+PHNwYW4gc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0aWNhLCBz YW5zLXNlcmlmOyBDT0xPUjogIzI5Mjg1YTsgRk9OVC1TSVpFOiAxMHB4Ij5DbGljayBoZXJlIHRv IHVuc3Vic2NyaWJlPC9zcGFuPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC90ZD48L3RyPjwv dGJvZHk+PC90YWJsZT48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvdGQ+PC90cj48L3Rib2R5 PjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgaWQ9Im1iTGlua3MiIGFsaWduPSJjZW50ZXIiIGNl bGxwYWRkaW5nPSIwIj4NCjx0cj48dGQgID4NCjxpbWcgaGVpZ2h0PSIzIiB3aWR0aD0iMyIgc3Jj PSJodHRwOi8vbWFpbGJhbmsuY29tLmF1L19tYnN0YXQvODM3Mzc0NC85OTQyNi9pbWcuZ2lmIj48 YSBocmVmPSJodHRwOi8vbWFpbGJhbmsuY29tLmF1LyIgdGFyZ2V0PV9ibGFuayBjbGFzcz0iY3Jl YXRlZFdpdGgiPjxpbWcgaGVpZ2h0PSIyMCIgd2lkdGg9IjIwIiBzcmM9Imh0dHA6Ly9tYWlsYmFu ay5jb20uYXUvYXNzZXRzL21iTG9nbzIweDIwLmdpZiIgYWx0PSJtYWlsQkFOSyIgc3R5bGU9ImJv cmRlcjowOyIgLz48L2E+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiPjxhIGhyZWY9Imh0dHA6Ly9t YWlsYmFuay5jb20uYXUvIiB0YXJnZXQ9X2JsYW5rIGNsYXNzPSJjcmVhdGVkV2l0aCI+Jm5ic3A7 Q3JlYXRlZCB3aXRoIG1haWxCQU5LPC9hPjwvdGQ+PHRkICBhbGlnbj1yaWdodD4mbmJzcDt8Jm5i c3A7PGEgaHJlZj0iaHR0cDovL21haWxiYW5rLmNvbS5hdS9TZW5kVG9BRnJpZW5kLz9CPTk5NDI2 JkJLPTBCRUIwQkYyRDdGNDQiPlNlbmQgdG8gYSBmcmllbmQ8L2E+Jm5ic3A7fCZuYnNwOzxhIGhy ZWY9J2h0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNz L21haWxCQU5LLmFzcHg/RVVJRD0xMjRGRjk1QTlCMzI0RkRDQkU0RjU5MEJFQzkzRUJBMSZVSUQ9 ODM3Mzc0NCZlbWFpbD1saW51eC14ZnNAb3NzLnNnaS5jb20nPlZpZXcgeW91ciBkZXRhaWxzPC9h PiZuYnNwO3wmbmJzcDs8YSBocmVmPSdodHRwOi8vd2Vic2l0ZXMubWFpbGJhbmsuY29tLmF1L0F1 cm9yYUdsb2JhbExvZ2lzdGljcy9tYWlsQkFOSy5hc3B4P0VVSUQ9MTI0RkY5NUE5QjMyNEZEQ0JF NEY1OTBCRUM5M0VCQTEmVW5zdWI9MSc+VW5zdWJzY3JpYmU8L2E+Jm5ic3A7fCZuYnNwOzxhIGhy ZWY9Imh0dHA6Ly93ZWJzaXRlcy5tYWlsYmFuay5jb20uYXUvQXVyb3JhR2xvYmFsTG9naXN0aWNz L1ByaXZhY3kuYXNwIj5Qcml2YWN5IHBvbGljeTwvYT48L3RkPjwvdHI+DQo8L3RhYmxlPjwvYm9k eT48L2h0bWw+ ----boundary_0_fdde2e6b-89b1-4a31-a9ab-9facb67bdffe-- From nazarzadeh@ut.ac.ir Tue Jan 15 04:16:27 2013 Return-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.6 required=5.0 tests=T_LOTS_OF_MONEY,US_DOLLARS_3 autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 D8DFF7F37 for ; Tue, 15 Jan 2013 04:16:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72702AC001 for ; Tue, 15 Jan 2013 02:16:24 -0800 (PST) X-ASG-Debug-ID: 1358244980-04cbb0132633cc0001-w1Z2WR Received: from utservm.ut.ac.ir (utservm.ut.ac.ir [80.66.177.10]) by cuda.sgi.com with ESMTP id CDVSWTYYy5zUrxDP for ; Tue, 15 Jan 2013 02:16:22 -0800 (PST) X-Barracuda-Envelope-From: nazarzadeh@ut.ac.ir X-Barracuda-Apparent-Source-IP: 80.66.177.10 Received: from localhost (localhost [127.0.0.1]) by utservm.ut.ac.ir (Postfix) with ESMTP id DF0951DA6E8; Tue, 15 Jan 2013 13:46:19 +0330 (IRST) X-Virus-Scanned: amavisd-new at ut.ac.ir Received: from utservm.ut.ac.ir ([127.0.0.1]) by localhost (utservm.ut.ac.ir [127.0.0.1]) (amavisd-new, port 10024) with LMTP id EfUnbBi_bOTl; Tue, 15 Jan 2013 13:46:18 +0330 (IRST) Received: from utservm.ut.ac.ir (localhost [127.0.0.1]) by utservm.ut.ac.ir (Postfix) with ESMTP id 3A5E31DA911; Tue, 15 Jan 2013 13:46:18 +0330 (IRST) Received: from 78.47.231.189 (SquirrelMail authenticated user nazarzadeh) by utservm.ut.ac.ir with HTTP; Tue, 15 Jan 2013 13:46:18 +0330 (IRST) Message-ID: <61015.78.47.231.189.1358244978.squirrel@utservm.ut.ac.ir> Date: Tue, 15 Jan 2013 13:46:18 +0330 (IRST) Subject: PCH Prize From: "info@pchsearch&win.com" X-ASG-Orig-Subj: PCH Prize To: info@pch.com User-Agent: SquirrelMail/1.4.4 MIME-Version: 1.0 Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: utservm.ut.ac.ir[80.66.177.10] X-Barracuda-Start-Time: 1358244981 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.17 X-Barracuda-Spam-Status: No, SCORE=0.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, US_DOLLARS_3 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119912 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.17 US_DOLLARS_3 BODY: Mentions millions of $ ($NN,NNN,NNN.NN) You won $1,000,000.00 USD from PCH. Contact us for claims.. Note: Contact us only Via Email below for claims: Email: pchprizess@delfterik.nl From idayu@imr.gov.my Tue Jan 15 05:09:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-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 26C7B7F37 for ; Tue, 15 Jan 2013 05:09:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 118A6304048 for ; Tue, 15 Jan 2013 03:09:24 -0800 (PST) X-ASG-Debug-ID: 1358248153-04cb6c0239350c0001-w1Z2WR Received: from zimbra.imr.gov.my (imr.gov.my [175.28.13.109]) by cuda.sgi.com with SMTP id GyqEjXRxDH1BorW8 for ; Tue, 15 Jan 2013 03:09:13 -0800 (PST) X-Barracuda-Envelope-From: idayu@imr.gov.my X-Barracuda-Apparent-Source-IP: 175.28.13.109 Received: from zimbra.imr.gov.my (localhost.localdomain [127.0.0.1]) by zimbra.imr.gov.my (Postfix) with ESMTP id 90C967F408E; Tue, 15 Jan 2013 19:06:13 +0800 (MYT) Date: Tue, 15 Jan 2013 19:06:13 +0800 (MYT) From: BELFIUS Message-ID: <1816584246.205771.1358247973448.JavaMail.root@imr.gov.my> Subject: =?utf-8?Q?Dringend_om_maatregelen_vraagt=E2=80=8B=E2=80=8B!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?Dringend_om_maatregelen_vraagt=E2=80=8B=E2=80=8B!?= Content-Type: multipart/alternative; boundary="----=_Part_205770_494590248.1358247973446" X-Originating-IP: [41.71.174.206] X-Mailer: Zimbra 7.2.0_GA_2669 (zclient/7.2.0_GA_2669) To: undisclosed-recipients:; X-Barracuda-Connect: imr.gov.my[175.28.13.109] X-Barracuda-Start-Time: 1358248153 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC7_SA578_CH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH ------=_Part_205770_494590248.1358247973446 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Geachte klant, BELFIUS is op dit moment bezig met technische werkzaamheden op de afdeling internet bankieren. Deze afdeling is bezig met het installeren van een nieuwe software voor het gebruik van internetbankieren. Met deze dienst willen wij van de BELFIUS het internetbankieren voor u spamvrij maken en extra beveiligen tegen internetfraude. Om van deze dienst gebruik te kunnen maken adviseren wij u om onderstaande link aan te klikken en de gevraagde informatie in te vullen. U kunt hier inloggen Na het invullen van de gevraagde informatie word uw internetbankieren automatisch geupdate met de nieuwe software. Wanneer u dit eenmaal heeft gedaan word u telefonisch benaderd door ??n van de medewerkers van de afdeling internetbankieren, om de software volledig te installeren. Vergeet niet dat BELFIUS waarde hecht aan uw veiligheid en privacy. Hartelijk dank voor uw tijd en medewerking. Hoogachtend, Klantenservice, BELFIUS BANK, afdeling Internet Bankieren. ------=_Part_205770_494590248.1358247973446 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Geachte klant,



BELFIUS is op dit moment bez= ig met technische werkzaamheden op de afdeling internet bankieren. Deze afd= eling is bezig met het installeren van een nieuwe software voor het gebruik= van internetbankieren. Met deze dienst willen wij van de BELFIUS het inter= netbankieren voor u spamvrij maken en extra beveiligen tegen internetfraude= .



Om van deze dienst gebruik te kunnen maken adviseren wi= j u om onderstaande link aan te klikken en de gevraagde informatie in te vu= llen.



U kunt hier inloggen

Na het invullen van de gevraag= de informatie word uw internetbankieren automatisch geupdate met de nieuwe = software. Wanneer u dit eenmaal heeft gedaan word u telefonisch benaderd do= or ??n van de medewerkers van de afdeling internetbankieren, om de software= volledig te installeren. Vergeet niet dat BELFIUS waarde hecht aan uw veil= igheid en privacy. Hartelijk dank voor uw tijd en medewerking.


Hoogachtend,

Klantenservice,

BELFIUS BANK, afdeling I= nternet Bankieren.
------=_Part_205770_494590248.1358247973446-- From jocelyn@comcast.com Tue Jan 15 06:44:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,RCVD_NUMERIC_HELO 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 63D0F7F37 for ; Tue, 15 Jan 2013 06:44:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4153AC003 for ; Tue, 15 Jan 2013 04:44:10 -0800 (PST) X-ASG-Debug-ID: 1358253848-04cb6c023a3aa20001-NocioJ Received: from mx22.valuehost.ru (mx22.valuehost.ru [217.112.35.7]) by cuda.sgi.com with SMTP id tK4MDOY79XXQxRiY for ; Tue, 15 Jan 2013 04:44:08 -0800 (PST) X-Barracuda-Envelope-From: jocelyn@comcast.com X-Barracuda-Apparent-Source-IP: 217.112.35.7 Received: (qmail 92097 invoked by uid 89); 15 Jan 2013 16:43:50 +0400 Received: from loft2120.serverloft.de (HELO 85.25.176.169) (info@sobakovoz.ru@85.25.176.169) by mx22.valuehost.ru with SMTP; 15 Jan 2013 16:43:50 +0400 Message-ID: Reply-To: =?windows-1251?B?zuHz9+Xt6OU6ICLM6OPw4Pbo7u3t++kg8/fl?= =?windows-1251?B?8iDo7e7x8vDg7e379SDj8ODm5ODtIg==?= From: =?windows-1251?B?zuHz9+Xt6OU6ICLM6OPw4Pbo7u3t++kg8/fl?= =?windows-1251?B?8iDo7e7x8vDg7e379SDj8ODm5ODtIg==?= To: , , , , Subject: =?windows-1251?B?wiDx6/Pm4fMg7+Xw8e7t4Ovg?= Date: Tue, 15 Jan 2013 15:43:54 +0300 X-ASG-Orig-Subj: =?windows-1251?B?wiDx6/Pm4fMg7+Xw8e7t4Ovg?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0657_01CDF337.1FE0CEF0" 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: mx22.valuehost.ru[217.112.35.7] X-Barracuda-Start-Time: 1358253848 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.26 X-Barracuda-Spam-Status: No, SCORE=1.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. ------=_NextPart_000_0657_01CDF337.1FE0CEF0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D6=E5=ED=F2=F0 =EF=EE=E4=E3=EE=F2=EE=E2=EA=E8 =F1= =EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 =E8= =CB=E5=ED=E8=ED=E3=F0=E0=E4=F1=EA=EE=E9 =EE=E1=EB=E0=F1=F2=E8 =CA=CE=CD=D4=C5=D0=C5=CD=D6=C8=DF -------------------------------------------------- =D2=D0=D3=C4=CE=D3=D1=D2=D0=CE=C9=D1=D2=C2=CE =C8=CD= =CE=D1=D2=D0=C0=CD=CD=DB=D5 =C3=D0=C0=C6=C4=C0=CD. =20 =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E8=ED= =EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2=20 =E8 =EB=E8=F6 =E1=E5=E7 =E3=F0=E0=E6=E4=E0=ED=F1=F2= =E2=E0 =E2 =D0=D4. =D4=C7-109. -------------------------------------------------- 11 =F4=E5=E2=F0=E0=EB=FF 2013 =E3=EE=E4=E0, =E3. =D1=E0= =ED=EA=F2 - =CF=E5=F2=E5=F0=E1=F3=F0=E3 =20 =20 =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8: - =CF=F0=E0=E2=EE=E2=EE=E5 =EF=EE=EB=EE=E6=E5=ED=E8=E5 =E8=ED=EE=F1=F2=F0= =E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2: =EF=F0=E5=E1=FB=E2=E0=ED=E8= =E5 =E8 =EF=F0=EE=E6=E8=E2=E0=ED=E8=E5. - =D0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0= =E0=E1=EE=F2=ED=E8=EA=EE=E2 =ED=E0 =F2=E5=F0=F0=E8=F2=EE=F0=E8=E8 =D0=D4. - =CF=F0=E0=E2=E8=EB=E0 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =EC=E8=E3= =F0=E0=F6=E8=EE=ED=ED=EE=E3=EE =F3=F7=E5=F2=E0 =E8=ED=EE=F1=F2=F0=E0=ED=ED= =FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2 =E8 =EB=E8=F6 =E1=E5=E7 =E3=F0=E0=E6= =E4=E0=ED=F1=F2=E2=E0. - =CE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FF = =EF=EE =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=EC=F3 =F3=F7=E5=F2=F3 =E8=ED=EE=F1= =F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2 - =C4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=EB=FF= =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF =E8 =EF=EE=E4=E0=F7=E8 =F3=E2=E5=E4=EE=EC= =EB=E5=ED=E8=FF. - =D1=ED=FF=F2=E8=E5 =E2=F0=E5=EC=E5=ED=ED=EE =EF=F0=E5=E1=FB=E2=E0=FE=F9= =E5=E3=EE =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE =F1=EE=F2=F0=F3=E4=ED=E8=EA= =E0 =F1 =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=E3=EE =F3=F7=E5=F2=E0. - =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E2=FB=F1=EE=EA=EE=EA= =E2=E0=EB=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=F5 =F1=EF=E5=F6=E8=E0=EB=E8= =F1=F2=EE=E2. - =CD=E0=EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5. =CA=E0=E4=F0=EE=E2=FB=E9= =F3=F7=E5=F2 =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE= =E2. =CF=E5=ED=F1=E8=EE=ED=ED=EE=E5 =F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5. - =CE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8 =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE = =F0=E0=E1=EE=F2=ED=E8=EA=E0 =EF=E5=F0=E5=E4 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5= =EB=E5=EC. - =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =EF=F0=E8 =ED=E0=EF=F0= =E0=E2=EB=E5=ED=E8=E8 =E8=ED=EE=F1=F2=F0=E0=ED=F6=E0 =E2 =EA=EE=EC=E0=ED=E4= =E8=F0=EE=E2=EA=F3 =E8=EB=E8 =F1=EB=F3=E6=E5=E1=ED=F3=FE =EF=EE=E5=E7=E4=EA= =F3. =CF=F0=E0=E2=E8=EB=E0 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=FF =EE= =F2=EF=F3=F1=EA=E0. =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =D7=E5=F0=ED=EE=E2=E0 =CE=EB=FC=E3=E0 =C2=E0=F1=E8=EB=FC=E5=E2=ED=E0 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2 =F6=E5=ED=F2=F0=E0 =EE=E1=F3=F7=E5=ED=E8=FF =F2=E5=EB.: 8 * 812 * 6=F72 * =EE=D7 * 3=F7 =20 ------=_NextPart_000_0657_01CDF337.1FE0CEF0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
           &n= bsp;           &nb= sp;=20 =D6=E5=ED=F2=F0 =EF=EE=E4=E3=EE=F2=EE=E2=EA=E8=20 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2
     &nb= sp;           =20 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 =E8 =CB=E5=ED=E8=ED=E3= =F0=E0=E4=F1=EA=EE=E9 =EE=E1=EB=E0=F1=F2=E8
 
           &n= bsp;           &nb= sp;         =20 =CA=CE=CD=D4=C5=D0=C5=CD=D6=C8=DF
 
           &n= bsp;  =20 --------------------------------------------------
 
           &n= bsp;         =20 =D2=D0=D3=C4=CE=D3=D1=D2=D0=CE=C9=D1=D2=C2=CE =C8=CD=CE=D1=D2=D0=C0=CD=CD= =DB=D5=20 =C3=D0=C0=C6=C4=C0=CD.        &nb= sp;           &nbs= p;=20
           &nb= sp;      =20 =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E8=ED=EE=F1=F2=F0=E0=ED= =ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2=20
           &nb= sp;         =20 =E8 =EB=E8=F6 =E1=E5=E7 =E3=F0=E0=E6=E4=E0=ED=F1=F2=E2=E0 =E2 =D0=D4. =D4= =C7-109.
 
           &n= bsp;  =20 --------------------------------------------------
 
           &n= bsp;      =20 11 =F4=E5=E2=F0=E0=EB=FF 2013 =E3=EE=E4=E0, =E3. =D1=E0=ED=EA=F2 -=20 =CF=E5=F2=E5=F0=E1=F3=F0=E3
       =       
     &nb= sp;           &nbs= p;    =20
=CF=F0=EE=E3=F0=E0=EC=EC=E0 =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8:
 
- =CF=F0=E0=E2=EE=E2=EE=E5 =EF=EE=EB=EE=E6=E5=ED=E8=E5 =E8=ED=EE=F1=F2= =F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2: =EF=F0=E5=E1=FB=E2=E0=ED= =E8=E5 =E8 =EF=F0=EE=E6=E8=E2=E0=ED=E8=E5.
 
- =D0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5= =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2 =ED=E0 =F2=E5=F0=F0=E8=F2=EE=F0=E8=E8 =D0= =D4.
 
- =CF=F0=E0=E2=E8=EB=E0 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =EC=E8= =E3=F0=E0=F6=E8=EE=ED=ED=EE=E3=EE =F3=F7=E5=F2=E0 =E8=ED=EE=F1=F2=F0=E0=ED= =ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2 =E8 =EB=E8=F6=20 =E1=E5=E7 =E3=F0=E0=E6=E4=E0=ED=F1=F2=E2=E0.
 
- =CE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB= =FF =EF=EE =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=EC=F3 =F3=F7=E5=F2=F3 =E8=ED= =EE=F1=F2=F0=E0=ED=ED=FB=F5=20 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2
 
- =C4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4= =EB=FF =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF =E8 =EF=EE=E4=E0=F7=E8 =F3=E2=E5=E4= =EE=EC=EB=E5=ED=E8=FF.
 
- =D1=ED=FF=F2=E8=E5 =E2=F0=E5=EC=E5=ED=ED=EE =EF=F0=E5=E1=FB=E2=E0=FE= =F9=E5=E3=EE =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE =F1=EE=F2=F0=F3=E4=ED=E8= =EA=E0 =F1 =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=E3=EE=20 =F3=F7=E5=F2=E0.
 
- =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E2=FB=F1=EE=EA=EE= =EA=E2=E0=EB=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=F5 =F1=EF=E5=F6=E8=E0=EB= =E8=F1=F2=EE=E2.
 
- =CD=E0=EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5. =CA=E0=E4=F0=EE=E2=FB= =E9 =F3=F7=E5=F2 =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA= =EE=E2. =CF=E5=ED=F1=E8=EE=ED=ED=EE=E5=20 =F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5.
 
- =CE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8 =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3= =EE =F0=E0=E1=EE=F2=ED=E8=EA=E0 =EF=E5=F0=E5=E4 =F0=E0=E1=EE=F2=EE=E4=E0=F2= =E5=EB=E5=EC.
 
- =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =EF=F0=E8 =ED=E0= =EF=F0=E0=E2=EB=E5=ED=E8=E8 =E8=ED=EE=F1=F2=F0=E0=ED=F6=E0 =E2 =EA=EE=EC=E0= =ED=E4=E8=F0=EE=E2=EA=F3 =E8=EB=E8 =F1=EB=F3=E6=E5=E1=ED=F3=FE=20 =EF=EE=E5=E7=E4=EA=F3. =CF=F0=E0=E2=E8=EB=E0 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB= =E5=ED=E8=FF =EE=F2=EF=F3=F1=EA=E0.
 

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=D7=E5=F0=ED=EE=E2=E0 =CE=EB= =FC=E3=E0 =C2=E0=F1=E8=EB=FC=E5=E2=ED=E0
=F1=EF=E5=F6=E8=E0=EB=E8=F1=F2= =F6=E5=ED=F2=F0=E0=20 =EE=E1=F3=F7=E5=ED=E8=FF
=F2=E5=EB.: 8 * 812 * 6=F72 * =EE=D7= * 3=F7
------=_NextPart_000_0657_01CDF337.1FE0CEF0-- From gzhw@huaweishipping.com Tue Jan 15 12:37:40 2013 Return-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_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 18B627F37 for ; Tue, 15 Jan 2013 12:37:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02D048F8049 for ; Tue, 15 Jan 2013 10:37:39 -0800 (PST) X-ASG-Debug-ID: 1358275056-04cbb013265b2d0001-NocioJ Received: from cm01.71.com (cm01.71.com [218.85.132.165]) by cuda.sgi.com with ESMTP id tgPtbWmnCatIQpsF for ; Tue, 15 Jan 2013 10:37:37 -0800 (PST) X-Barracuda-Envelope-From: gzhw@huaweishipping.com X-Barracuda-Apparent-Source-IP: 218.85.132.165 Received: from pqqrttt (unknown [119.33.43.170]) by cm01.71.com (DMOS V2.5 (Postfix)) with ESMTPA id 4984CA80F6 for ; Wed, 16 Jan 2013 02:37:16 +0800 (CST) Date: Wed, 16 Jan 2013 02:37:35 +0800 From: "Alex Lee" Reply-To: alex-lee@huaweishipping.com To: "xfs" Subject: =?GB2312?B?MVzXqNK1tPqw7LP2v9qwo7ywoaLSwcDKtci5+kNJUdakyum8sLP2v9rJzLzs?= =?GB2312?B?0rXO8aOho6E=?= Message-ID: <201301160237354824455@huaweishipping.com> X-ASG-Orig-Subj: =?GB2312?B?MVzXqNK1tPqw7LP2v9qwo7ywoaLSwcDKtci5+kNJUdakyum8sLP2v9rJzLzs?= =?GB2312?B?0rXO8aOho6E=?= X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/html; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: cm01.71.com[218.85.132.165] X-Barracuda-Start-Time: 1358275057 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, HELO_DYNAMIC_DHCP, HELO_DYNAMIC_DHCP_2, HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HELO_DYNAMIC_DHCP Relay HELO'd using suspicious hostname (DHCP) 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 1.66 HELO_DYNAMIC_DHCP_2 HELO_DYNAMIC_DHCP_2 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVu aWNvZGUiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPg0KPE1FVEEgbmFtZT1HRU5FUkFUT1IgY29u dGVudD0iTVNIVE1MIDkuMDAuODExMi4xNjQ1NyI+PC9IRUFEPg0KPEJPRFk+DQo8RElWIGFsaWdu PWNlbnRlcj48Rk9OVCBzaXplPTQ+PEZPTlQgY29sb3I9IzAwMDBhMCBmYWNlPb+szOU+PFNUUk9O Rz4mbmJzcDsgDQo8L1NUUk9ORz48L0ZPTlQ+PC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0iTUFS R0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgZmFjZT0iQ29taWMgU2FucyBNUyI+PEZPTlQg DQpzaXplPTQ+PEZPTlQgY29sb3I9IzAwMDBhMD48U1RST05HPjxGT05UIGZhY2U9v6zM5T4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgPEZPTlQgDQpzaXplPTU+uePW3buq4cu5+rzKu/XUy7T6wO3T 0M/euavLvjwvRk9OVD48L0ZPTlQ+PC9TVFJPTkc+PC9GT05UPjwvRk9OVD48Rk9OVCBzaXplPTMg DQpmYWNlPc6iyO3RxbraPsrH0ru80ryvufq8yrqj1Muhor/V1MuhorGoudixqLzsoaKy1rSi1MvK 5NPa0rvM5bXE19u6z7n6vMrO78H3uavLvqOsur3P39PFysbW99Kqzqq3x9beoaLEz8PAvLC12NbQ uqO12Mf4o6yzpMbaus/X97XEtKy5q8u+1vfSqlNBRk1BUklORVxNU0tcQ01BXENDTklcSEpcS0xJ TkVcQVBMtcijrDIwMDbE6rPJwaLS1MC00rXO8bK7ts/AqbTzo6y31rHw1Nq3x9beyPvE2rzTtvuh otbQw8DW3s6jtdjC7cCtoaLW0LarsKLBqsf1oaLEz8PAtquwzc73oaLL1cDvxM+hornn0cfEx6Gi xM+3x7ywtqvEz9HHufq80ra809DX1Ly6tcS0+rHttKa8sLT6wO2jrL/JzOG5qdeo0rW1xMPFtb3D xcurx+W3/s7xo6zNrMqxztLLvrbgxOrAtNbCwabT2rnj1t0vxM/Js7/asLbU07v1oaLD9LjQu/XO 77T6wO2xqLnYt/7O8aOst/7O8dPF1sqjrLzbuPG6z8Dto6zU2tDQ0rXW0M/t09DSu7aotcS/2rGu o7vNrMqxztLLvr/JzOG5qbP2v9rWwdLUz8K5+rzSu/XO78v50Oi1xMzYyuK3/s7xo6y+38zlyOfP wqO6IA0KPC9GT05UPjwvRk9OVD48L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4 IiBkaXI9bHRyPjxGT05UIGZhY2U9zqLI7dHFuto+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJViBz dHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgDQpmYWNlPc6iyO3RxbraPjxT VFJPTkc+zNjJq7f+zvHSu6O6PC9TVFJPTkc+PEZPTlQgDQpjb2xvcj0jZmYwMDAwPteo0rW0+rDs yuTN+bCjvLChotLBwMqhorCjyPu27bHI0cehorCitvu8sMD70ce1yLn6vNK79c7v17DUy8ewvOzR 6dakyumjqENJUaOpK0lMQUMrQ09JK0NPQ6O7IA0K17DUy8ewvOzR6dakyulDSVGjrNakyunIq7PG zqpDRVJUSUZJQ0FURSBGT1IgUFJFLVNISVBNRU5UIA0KSU5TUEVDVElPTqOsvPKzxs6qUFNJo6y4 w9akyunTycnMvOzX3L7Ws/a+36Osvt/M5bLZ1/fB97PMyOfPwjwvRk9OVD6jujwvRk9OVD48L0RJ Vj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIGZhY2U9zqLI 7dHFuto+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgi IGRpcj1sdHI+PEZPTlQgDQpmYWNlPc6iyO3RxbraPjGhotewz+THsNe8yLfM7tC0Q0lRyerH686v zdC1paOs0tSx487Sy77M4cewz/LJzLzsvtbJ6sfro7vK1bv118rBz87xsdjXvMi3o6zI57jE1qS9 q7L6yfq4xNakt9HTw1JNQjMwMC+33aOovOzR6brzsru908rcu/XWtbywvP7K/dDeuMSjqaO7PC9G T05UPjwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQg DQpmYWNlPc6iyO3RxbraPjKhokNJUdaks/a/2snMzKfNt6O61f2zo7Wl1qSxqLnYtcSjrENJUdak yum1xMynzbe+zcrH1f2zo7Goudi1xL6t06q1pc67o6zC8rWlsai52LP2v9q79c7vyeqxqMynzbe/ ydPJztLLvrvyv827p9fUvLrM4bmpOzwvRk9OVD48L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1S SUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIA0KZmFjZT3Oosjt0cW62j4zoaLXsLnxyrHSqsXE1dWj qLyqufHKsaOs17DSu7DryrG498XE0rvVxaOpo6y8qrnx1dXSu7ao0qq0+LnxusWjrLKivLDKsbei uPjO0su+o7sgwarPtbe9yr2junRvbnlAaHVhd2Vpc2hpcHBpbmcuY29tIA0KMDIwLTIyMDYzODU5 IFRvbnk7IDwvRk9OVD48L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9 bHRyPjxGT05UIA0KZmFjZT3Oosjt0cW62j40oaK79c7vvfizocewzOHHsMzhuanLvrv6tcTXysHP o6iztbbTu/LLvrv6ye233dakusXC66Giw/vX1ryws7XFxqOp0tSx48zhx7Cw7MDtvfizocrW0Pij uyANCtLUyc/XysHPxuvIq6Osvfizobrzu/mxvsnPMy000KHKscTav8nS1LjjtqijrLbU09rSu9Cp yea8sLW9yMvJ7bCyyKu3vcPmtcSy+sa3o6zI57n7tPPQzbv6teey+sa3o6zKs8a3o6y157PYvLDS vcHGxveyxLXIu/XO79Do0qrU2snMvOy+1rG4sLi1xLL6xrex2NDr1KTPyMi3yM+yxcTc17C58aOs Q0lRs/bWpLXEz+C52LfR08PX6bPJvt/M5cjnz8KjuiANCjwvRk9OVD48L0RJVj4NCjxESVYgc3R5 bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIGZhY2U9zqLI7dHFuto+PC9GT05U PiZuYnNwOzwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZP TlQgZmFjZT3Oosjt0cW62j4xo6kgDQpDSVHWpLfR08OjqNXiuPm+3bK7zay79c7vt9HTw9PQy/m1 99X7o6mjuzwvRk9OVD48L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9 bHRyPjxGT05UIGZhY2U9zqLI7dHFuto+MqOpycy87NX+uK655rfROiANCsnqsai79da1VVNEMTAw MDDS1MTatcTK1cihUk1CMTUwL8axLLOsuf1VU0QxMDAwMLC0x6e31tauMS41wLTK1cihOzwvRk9O VD48L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIGZh Y2U9zqLI7dHFuto+MykgDQrNqLnYtaWjulJNQjM1MC+33aOoyOfQ6NKqKaO7PC9GT05UPjwvRElW Pg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgDQpmYWNlPc6i yO3RxbraPjSjqb34s6G30VJNQjUwL7O1o7s8L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJNQVJH SU4tUklHSFQ6IDBweCIgZGlyPWx0cj48Rk9OVCBmYWNlPc6iyO3RxbraPjwvRk9OVD4mbmJzcDs8 L0RJVj4NCjxESVYgc3R5bGU9Ik1BUkdJTi1SSUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIA0KZmFj ZT3Oosjt0cW62j48U1RST05HPiZuYnNwO8zYyau3/s7xtv6jujwvU1RST05HPjxGT05UIA0KY29s b3I9I2ZmMDAwMD60+rDsu/XO77P2v9rJzLzszai52LWlPC9GT05UPqO7PC9GT05UPjwvRElWPg0K PERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgDQpmYWNlPc6iyO3R xbraPiZuYnNwO87Sy76/ybT6sOyz9r/aycy87M2oudi1paOsyeqxqMqxv8m21Mnqsaiy+sa3tcS8 29a11/bP4NOmtcS199X7o6zK1bfR0tTJ6rGovNvWtc6qsrvNrLb4srvNrKO7PC9GT05UPjwvRElW Pg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgZmFjZT3Oosjt 0cW62j48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWIHN0eWxlPSJNQVJHSU4tUklHSFQ6IDBweCIg ZGlyPWx0cj48Rk9OVCANCmZhY2U9zqLI7dHFuto+PFNUUk9ORz4mbmJzcDvM2Mmrt/7O8cj9o7o8 L1NUUk9ORz48Rk9OVCBjb2xvcj0jZmYwMDAwPsurx+XDxbW9w8W3/s7xPC9GT05UPqO7IA0KPC9G T05UPjwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQg ZmFjZT3Oosjt0cW62j4xoaKwosGqx/WjqLXPsN0vybPlyKOpy6vH5bnYw8W1vcPFt/7O8aO7IA0K PC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZP TlQgDQpmYWNlPc6iyO3RxbraPjKhorarxM/Rx7n6vNKjqLfGwsmx9qGiwu3AtM730cehotOhxOGh otDCvNPGwrXIo6nLq8flw8W1vcPFt/7O8aO7IDwvRk9OVD48L0RJVj4NCjxESVYgc3R5bGU9Ik1B UkdJTi1SSUdIVDogMHB4IiBkaXI9bHRyPjxGT05UIGZhY2U9zqLI7dHFuto+PC9GT05UPiZuYnNw OzwvRElWPg0KPERJViBzdHlsZT0iTUFSR0lOLVJJR0hUOiAwcHgiIGRpcj1sdHI+PEZPTlQgZmFj ZT3Oosjt0cW62j67ttOtwLS157Lp0a+joTwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgc2l6ZT00 IGZhY2U9Q2FsaWJyaT48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UIA0KY29sb3I9I2Zm MDAwMD4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq PC9GT05UPjwvRElWPg0KPERJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDBhMCBzaXplPTQgZmFj ZT1DYWxpYnJpPjxFTT5CZXN0IFJlZ2FyZHM8L0VNPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQg Y29sb3I9IzAwMDBhMCBzaXplPTQgZmFjZT1DYWxpYnJpPjxFTT5BbGV4IExlZTwvRU0+PC9GT05U PjwvRElWPg0KPERJVj48Rk9OVCBzaXplPTI+PEJSPjxGT05UIGNvbG9yPSMwMDAwYTAgc2l6ZT00 IA0KZmFjZT1DYWxpYnJpPjxFTT6549bdu6rhy7n6vMq79dTLtPrA7dPQz965q8u+PEJSPkdVQU5H WkhPVSBIVUFXRUkgSU5URVJOQVRJT05BTCBMT0dJU1RJQ1MgDQpDTy4sTFREPEJSPlRlbDo4Ni0y MC0yMjA2Mzg2OCANCkZheDo4Ni0yMC0yMjA2Mzg1NTxCUj5Nb2I6ODYtMTM5MjIyMzQ4NzU8QlI+ UVGjujg5MTE2Nzgzo6jH69eiw/e5q8u+o6k8QlI+RW1haWw6IA0KYWxleC1sZWU8L0VNPjwvRk9O VD48QSBocmVmPSJtYWlsdG86Y0BodWF3ZWlzaGlwcGluZy5jb20iPjxGT05UIGNvbG9yPSMwMDAw YTAgDQpzaXplPTQgZmFjZT1DYWxpYnJpPjxFTT5AaHVhd2Vpc2hpcHBpbmcuY29tPC9FTT48L0ZP TlQ+PC9BPjxCUj48Rk9OVCANCmNvbG9yPSMwMDAwYTAgc2l6ZT00IGZhY2U9Q2FsaWJyaT48RU0+ V2ViOiA8L0VNPjwvRk9OVD48QSANCmhyZWY9Imh0dHA6Ly9nemh3cy5jb20uY24vIj48Rk9OVCBj b2xvcj0jMDAwMGEwIHNpemU9NCANCmZhY2U9Q2FsaWJyaT48RU0+aHR0cDovL2d6aHdzLmNvbS5j bjwvRU0+PC9GT05UPjwvQT48QlI+PC9ESVY+PC9GT05UPjwvRElWPjwvQk9EWT48L0hUTUw+ From tinguely@sgi.com Tue Jan 15 14:46:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 D8CAD7F37 for ; Tue, 15 Jan 2013 14:46:06 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC5788F8035; Tue, 15 Jan 2013 12:46:03 -0800 (PST) Message-ID: <50F5C00C.8070402@sgi.com> Date: Tue, 15 Jan 2013 14:46:04 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: remove setfl from xfs_io References: <50C39123.6050303@sandeen.net> <50C3AB0E.3050006@sandeen.net> In-Reply-To: <50C3AB0E.3050006@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 15:03, Eric Sandeen wrote: > Doesn't seem to have worked for ages, and is (therefore) > apparently not ever used: > > xfs_io> setfl > xfs_io> help setfl > setfl [-adx] -- set/clear append/direct flags on the open file > xfs_io> setfl -a > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl -d > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl > xfs_io> > > At best, it seems intended to toggle the flag state, but > gives no feedback about current state. -x is in help but > not implemented, etc. > > Just remove it. > > Signed-off-by: Eric Sandeen > --- I heard no objections to removing it ... Reviewed-by: Mark Tinguely From fw@deneb.enyo.de Tue Jan 15 15:31:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7BD617F37 for ; Tue, 15 Jan 2013 15:31:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6D1758F804B for ; Tue, 15 Jan 2013 13:31:15 -0800 (PST) X-ASG-Debug-ID: 1358285472-04cb6c023868400001-NocioJ Received: from ka.mail.enyo.de (ka.mail.enyo.de [87.106.162.201]) by cuda.sgi.com with ESMTP id oDA7Gxx1yWSDryTE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 15 Jan 2013 13:31:13 -0800 (PST) X-Barracuda-Envelope-From: fw@deneb.enyo.de X-Barracuda-Apparent-Source-IP: 87.106.162.201 Received: from [172.17.135.4] (helo=deneb.enyo.de) by ka.mail.enyo.de with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) id 1TvE68-0003Xf-NZ; Tue, 15 Jan 2013 22:31:08 +0100 Received: from fw by deneb.enyo.de with local (Exim 4.80) (envelope-from ) id 1TvE68-0005Ov-Da; Tue, 15 Jan 2013 22:31:08 +0100 From: Florian Weimer To: Dave Chinner Cc: Ben Myers , xfs@oss.sgi.com, "Bradley C. Kuszmaul" Subject: Re: hole punching performance References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> X-ASG-Orig-Subj: Re: hole punching performance Date: Tue, 15 Jan 2013 22:31:08 +0100 In-Reply-To: <20130113225545.GA19173@dastard> (Dave Chinner's message of "Mon, 14 Jan 2013 09:55:45 +1100") Message-ID: <87mwwaqgkj.fsf@mid.deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: ka.mail.enyo.de[87.106.162.201] X-Barracuda-Start-Time: 1358285473 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-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.2.119958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- * Dave Chinner: > On Sun, Jan 13, 2013 at 01:49:41PM -0600, Ben Myers wrote: >> On Sun, Jan 13, 2013 at 11:36:27AM -0500, Bradley C. Kuszmaul wrote: >> > On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer wrote: >> > > I once was a heavy Berkeley DB user and had files with dozens >> > > of gigabytes containing hundreds of thousands of extents, and >> > > open() times in the order of minutes were not unusual with a >> > > cold cache and other concurrent read activities from the same >> > > RAID device. >> >> Ouch. I would not have expected open times that bad. > > That will only happen if the extent list needs to be read during the > open() call. That will only occur if O_TRUNC is set. Otherwise, the > extents are read on the first syscall that needs them to be read in > (read, write, alloc, punch, truncate, etc) and that's when the > latency occurs. Indeed, I think I have misremembered. The delay occurred when Berkeley DB tried to read the first page from disk. From kuszmaul@gmail.com Tue Jan 15 15:35:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C29E17F37 for ; Tue, 15 Jan 2013 15:35:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E7F8304039 for ; Tue, 15 Jan 2013 13:35:11 -0800 (PST) X-ASG-Debug-ID: 1358285710-04cbb013296cf60001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id ZV0zKtFWnDjcrw2h (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Jan 2013 13:35:10 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id qd14so1142736ieb.20 for ; Tue, 15 Jan 2013 13:35:10 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=9uBw+22r4lbW0diyecSwOy9pHcdyxXgc7t+3W9LuuHA=; b=nwxvU6iupIwcUlDrRrTpbNf+A7HqGc+b/Dsa9T9nYhzLFiU9XbHq+31AVL9xFF/5EE z3HS8uTQO4DMKOKcbOpuiwCBKB4vZw4XwHH9U7DMOY6fM5rb0pdLwNyIY3/wiT9Iv973 4do5es0C6vcCgG7kDD7w/KhbbCv0VhWgC2NkeLdz7rF49mfpWAR2f9WeS+PxNHWPt5Tr RgdJhtv+OSjMaoarzA+f/vZYHjCDnLElMEZ+Z6NbCPhhveAeGO6CpSLx5FwtMXlbeAD5 4JWwGRTDIjkLC2pYOrgDPb6R+XztE+rv51PXr+1EQsYkxG5RXW2dEZPD0hzYacyQfQmc oZXA== Received: by 10.50.195.135 with SMTP id ie7mr2981463igc.8.1358285710563; Tue, 15 Jan 2013 13:35:10 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.146.33 with HTTP; Tue, 15 Jan 2013 13:34:50 -0800 (PST) In-Reply-To: <87mwwaqgkj.fsf@mid.deneb.enyo.de> References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> From: "Bradley C. Kuszmaul" Date: Tue, 15 Jan 2013 16:34:50 -0500 Message-ID: Subject: Re: hole punching performance To: Florian Weimer X-ASG-Orig-Subj: Re: hole punching performance Cc: Dave Chinner , Ben Myers , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=14dae9340fcb48199c04d35a898e X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1358285710 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-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.2.119958 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 --14dae9340fcb48199c04d35a898e Content-Type: text/plain; charset=ISO-8859-1 So does it cost a lot to read all the extents just to read the first block? I don't generally open a file without immediately reading some block, so it doesn't really matter to me if there is a high cost for open() or a high cost for the first read(). -Bradley On Tue, Jan 15, 2013 at 4:31 PM, Florian Weimer wrote: > * Dave Chinner: > > > On Sun, Jan 13, 2013 at 01:49:41PM -0600, Ben Myers wrote: > >> On Sun, Jan 13, 2013 at 11:36:27AM -0500, Bradley C. Kuszmaul wrote: > >> > On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer > wrote: > >> > > I once was a heavy Berkeley DB user and had files with dozens > >> > > of gigabytes containing hundreds of thousands of extents, and > >> > > open() times in the order of minutes were not unusual with a > >> > > cold cache and other concurrent read activities from the same > >> > > RAID device. > >> > >> Ouch. I would not have expected open times that bad. > > > > That will only happen if the extent list needs to be read during the > > open() call. That will only occur if O_TRUNC is set. Otherwise, the > > extents are read on the first syscall that needs them to be read in > > (read, write, alloc, punch, truncate, etc) and that's when the > > latency occurs. > > Indeed, I think I have misremembered. The delay occurred when > Berkeley DB tried to read the first page from disk. > --14dae9340fcb48199c04d35a898e Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable So does it cost a lot to read all the extents just to read the first block?= =A0I don't generally open a file without immediately reading some bloc= k, so it doesn't really matter to me if there is a high cost for open()= or a high cost for the first read().

-Bradley

On Tue, Jan 15, 2= 013 at 4:31 PM, Florian Weimer <fw@deneb.enyo.de> wrote:
<= blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px= #ccc solid;padding-left:1ex"> * Dave Chinner:

> On Sun, Jan 13, 2013 at 01:49:41PM -0600, Ben Myers wrote:
>> On Sun, Jan 13, 2013 at 11:36:27AM -0500, Bradley C. Kuszmaul wrot= e:
>> > On Sun, Jan 13, 2013 at 4:26 AM, Florian Weimer <fw@deneb.enyo.de> wrote:
>> > > I once was a heavy Berkeley DB user and had files with d= ozens
>> > > of gigabytes containing hundreds of thousands of extents= , and
>> > > open() times in the order of minutes were not unusual wi= th a
>> > > cold cache and other concurrent read activities from the= same
>> > > RAID device.
>>
>> Ouch. =A0I would not have expected open times that bad.
>
> That will only happen if the extent list needs to be read during the > open() call. That will only occur if O_TRUNC is set. Otherwise, the > extents are read on the first syscall that needs them to be read in > (read, write, alloc, punch, truncate, etc) and that's when the
> latency occurs.

Indeed, I think I have misremembered. =A0The delay occurred whe= n
Berkeley DB tried to read the first page from disk.

--14dae9340fcb48199c04d35a898e-- From david@fromorbit.com Tue Jan 15 16:54:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 80DE37F37 for ; Tue, 15 Jan 2013 16:54:42 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F1B8AC003 for ; Tue, 15 Jan 2013 14:54:38 -0800 (PST) X-ASG-Debug-ID: 1358290477-04bdf04a5972fc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id kiwKp2ER30SBLVoZ for ; Tue, 15 Jan 2013 14:54:37 -0800 (PST) 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: Aj0bAAHd9VB5LEIF/2dsb2JhbABFhVGyD4JfgjoCgQoXc4IeAQEFOhwjEAgDGAklDwUlAyETiBi3OBWNQ4J/YQOWC5BKgwk Received: from ppp121-44-66-5.lns20.syd6.internode.on.net (HELO dastard) ([121.44.66.5]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Jan 2013 09:24:35 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvFOt-0003J8-2i; Wed, 16 Jan 2013 09:54:35 +1100 Date: Wed, 16 Jan 2013 09:54:35 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130115225435.GB2498@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> 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: 1358290477 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119964 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Jan 15, 2013 at 04:34:50PM -0500, Bradley C. Kuszmaul wrote: > So does it cost a lot to read all the extents just to read the first block? Depends on the number of extents in the file. Figure an IO per 250 extents for a 4k block size filesystem (extent records are 16 bytes in size on disk). Cheers, Dave. -- Dave Chinner david@fromorbit.com From kuszmaul@gmail.com Tue Jan 15 17:34:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 95D1C7F37 for ; Tue, 15 Jan 2013 17:34:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E31F304053 for ; Tue, 15 Jan 2013 15:34:15 -0800 (PST) X-ASG-Debug-ID: 1358292854-04cb6c0239724c0001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id Ge1E2TQnh4DqcgB2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Jan 2013 15:34:14 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] Received: by mail-ie0-f174.google.com with SMTP id c11so1346533ieb.33 for ; Tue, 15 Jan 2013 15:34:14 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=yttPFoJE1vkG0ejk+uzUrTZ8Ba75DNBiKjwYNE5JfWU=; b=glXs/kZ4Vw/MQn7to7lkz6mhJvwptnTM2hSIt4/fU0hJxo5joRkBmJUShoscvnSwUO kFm8KEKRsyZ8+BOhVU2w6CcLi+nRPlc13Dzi5BvKiA+a87yAys9/LxLymI1Qp4pH25bF OTAmrLNoLLn1A0MmX+6WJCa+RyTuAoL20T6deka9XaI06OzSMrNafiowDkktftSnzfCF ss1kOqFgpW6O7/mR+sjvPAuJJ12We4rzyEx1w82/p7GQJO7GVC3/U6+pqVo6upkrsbxL SmCzQ1HuJ3HjBAZef/C43yhoz+JuqQQp4lswKTIzYj5MjaeAbQ2UuMSrIJo0YHIwg3Nv q95Q== X-Received: by 10.50.207.67 with SMTP id lu3mr3343649igc.12.1358292854389; Tue, 15 Jan 2013 15:34:14 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.146.33 with HTTP; Tue, 15 Jan 2013 15:33:54 -0800 (PST) In-Reply-To: <20130115225435.GB2498@dastard> References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> <20130115225435.GB2498@dastard> From: "Bradley C. Kuszmaul" Date: Tue, 15 Jan 2013 18:33:54 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=14dae9340b65163a4c04d35c3355 X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1358292854 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-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.2.119966 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 --14dae9340b65163a4c04d35c3355 Content-Type: text/plain; charset=ISO-8859-1 So my understanding is that the first time I do a read() I'll have to read the extents. My writes are on the order of a megabyte, a 250MB file will likely require an extra I/O to open. That's fine. It really has been helpful to have all this performance-modeling information. Thanks. -Bradley On Tue, Jan 15, 2013 at 5:54 PM, Dave Chinner wrote: > On Tue, Jan 15, 2013 at 04:34:50PM -0500, Bradley C. Kuszmaul wrote: > > So does it cost a lot to read all the extents just to read the first > block? > > Depends on the number of extents in the file. Figure an IO per 250 > extents for a 4k block size filesystem (extent records are 16 bytes > in size on disk). > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --14dae9340b65163a4c04d35c3355 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable So my understanding is that the first time I do a read() I'll have to r= ead the extents. =A0My writes are on the order of a megabyte, a 250MB file = will likely require an extra I/O to open. =A0That's fine. =A0

<= /div>
It really has been helpful to have all this performance-modeling infor= mation. =A0

Thanks.

-Bradley
On Tue, Jan 15, 2013 at 5:54 PM, Dave Chinn= er <david@fromorbit.com> wrote:
On Tue, Jan 15, 2013 at 04= :34:50PM -0500, Bradley C. Kuszmaul wrote:
> So does it cost a lot to read all the extents just to read the first b= lock?

Depends on the number of extents in the file. Figure an IO per 250 extents for a 4k block size filesystem (extent records are 16 bytes
in size on disk).

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--14dae9340b65163a4c04d35c3355-- From david@fromorbit.com Tue Jan 15 18:01:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 984597F37 for ; Tue, 15 Jan 2013 18:01:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E62EAC002 for ; Tue, 15 Jan 2013 16:01:06 -0800 (PST) X-ASG-Debug-ID: 1358294463-04cbb0132678140001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id DfcgRqmCKCyQ5yvs for ; Tue, 15 Jan 2013 16:01:04 -0800 (PST) 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: Aj0bAFrt9VB5LEIF/2dsb2JhbABFhVGyD4JfgjoCgQsXc4IeAQEFOhwjEAgDGAklDwUlAyETiBi3QRWNQ4J/YQOSWYMykEqDCQ Received: from ppp121-44-66-5.lns20.syd6.internode.on.net (HELO dastard) ([121.44.66.5]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Jan 2013 10:30:53 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvGR2-0003VX-2E; Wed, 16 Jan 2013 11:00:52 +1100 Date: Wed, 16 Jan 2013 11:00:52 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130116000051.GC2498@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> <20130115225435.GB2498@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: 1358294463 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Jan 15, 2013 at 06:33:54PM -0500, Bradley C. Kuszmaul wrote: > So my understanding is that the first time I do a read() I'll have to read > the extents. My writes are on the order of a megabyte, a 250MB file will > likely require an extra I/O to open. That's fine. write size != extent size. Extents on XFS on a 4k block size filesystem can be up to 8GB in size. It's entirely likely that your 250MB file is a single extent an dhence has no extra overhead on read. Use xfs_bmap to check. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jellis@dhnet.us Tue Jan 15 18:57:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5A59E7F37 for ; Tue, 15 Jan 2013 18:57:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 476118F8039 for ; Tue, 15 Jan 2013 16:57:05 -0800 (PST) X-ASG-Debug-ID: 1358297824-04cb6c023a789e0001-NocioJ Received: from relay02.pair.com (relay02.pair.com [209.68.5.16]) by cuda.sgi.com with SMTP id 68IAtmuClFF7dkdA for ; Tue, 15 Jan 2013 16:57:04 -0800 (PST) X-Barracuda-Envelope-From: jellis@dhnet.us X-Barracuda-Apparent-Source-IP: 209.68.5.16 Received: (qmail 26901 invoked from network); 16 Jan 2013 00:56:59 -0000 Received: from 199.188.179.147 (HELO ?192.168.2.38?) (199.188.179.147) by relay02.pair.com with SMTP; 16 Jan 2013 00:56:59 -0000 X-pair-Authenticated: 199.188.179.147 User-Agent: Microsoft-Entourage/12.35.0.121009 Date: Tue, 15 Jan 2013 19:56:56 -0500 Subject: Re: xfsdump INTERRUPT issue From: "J. Ellis" X-ASG-Orig-Subj: Re: xfsdump INTERRUPT issue To: Dave Chinner CC: Stan Hoeppner , "xfs@oss.sgi.com" Message-ID: Thread-Topic: xfsdump INTERRUPT issue Thread-Index: Ac3zhGF2AVV20As8tEO26qM7kPNz1g== In-Reply-To: <104E5EA8-B962-4D36-BC08-9FD041ED9E02@gmail.com> Mime-version: 1.0 Content-type: text/plain; charset="ISO-8859-1" Content-transfer-encoding: quoted-printable X-Barracuda-Connect: relay02.pair.com[209.68.5.16] X-Barracuda-Start-Time: 1358297824 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... I'm not sure what my next step is. IIRC, we did a dump of the volume in question to a file and that file exists and was having the same issues copying. Best, J. On Sat, Jan 12, 2013 at 1:15 PM, Jeffrey wrote: > =20 > Hi, Dave-- > =20 > Ok, here's the output: > =20 > root@jeffrey:~# mount -t xfs -o rtdev=3D/dev/sdb3 /dev/sdb2 /mnt/hr20 > mount: /dev/sdb2 already mounted or /mnt/hr20 busy > mount: according to mtab, /dev/sdb2 is mounted on / > root@jeffrey:/# cd /mnt > root@jeffrey:/mnt# ls > fap=A0 fp=A0 hr20 > root@jeffrey:/mnt# ls -lRa /mnt/hr20 > /mnt/hr20: > total 8 > drwxr-xr-x 2 root root 4096 Dec=A0 3 11:19 . > drwxr-xr-x 5 root root 4096 Dec=A0 3 11:19 .. > =20 > I then tried the command on the other two volumes: > =20 > root@jeffrey:/mnt# ls -lRa /mnt/fp > /mnt/fp: > total 8 > drwxr-xr-x 2 root root 4096 Dec=A0 3 11:18 . > drwxr-xr-x 5 root root 4096 Dec=A0 3 11:19 .. > root@jeffrey:/mnt# ls -lRa /mnt/fap > /mnt/fap: > total 8 > drwxr-xr-x 2 root root 4096 Nov 20 12:31 . > drwxr-xr-x 5 root root 4096 Dec=A0 3 11:19 .. > =20 > =20 > =20 > =20 > Best, > J. >=20 > =20 > =20 >> =20 >>> =20 >>> From: Dave Chinner >>> Date: January 10, 2013, 9:20:41 PM EST >>> To: Jeffrey Ellis >>> Subject: Re: xfsdump INTERRUPT issue >>> =20 >>> =20 >>> =20 >> =20 >>> =20 >>> On Thu, Jan 10, 2013 at 05:56:53PM -0500, Jeffrey Ellis wrote: >>> =20 >>>> No. hr20 is the mount point for the source. >>>> =20 >>> =20 >>> Sorry, got them mixed up. Perhaps everything is below a hidden file? >>> Try `ls -lRa /mnt/hr20` >>> =20 >>> -Dave >>> --=20 >>> Dave Chinner >>> david@fromorbit.com >>> =20 >>> =20 >> =20 > =20 > =20 From kuszmaul@gmail.com Tue Jan 15 20:46:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8087A7F37 for ; Tue, 15 Jan 2013 20:46:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E6768F8035 for ; Tue, 15 Jan 2013 18:46:58 -0800 (PST) X-ASG-Debug-ID: 1358304416-04bdf04a5b842f0001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id SlstfzLWio7kvAAW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Jan 2013 18:46:56 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] Received: by mail-ie0-f179.google.com with SMTP id k14so1594306iea.10 for ; Tue, 15 Jan 2013 18:46:56 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=dDP3sEiuGbK1jBApmppGzu8JrpdpwwL7zDZRvYSPCqE=; b=zBM2vt4VATMOMrIFMZUGQfirhxXWEyJL0y3r5QuD/N3ahl40h5JAzD3AlWh0bvaMG7 mmgBLcsfpdTedi6NXyd5ETV11xclH+PuYMvtUWFRy0np3GSJEAsAgDLtQ6F7cnbTqM5B dRW0pefCeqCaIf13UAi7acC4NNwQAPyS6y28swJJDX7n75sEeyDKNQUqUmxutM9KT/YV JkvlBowEs4CeQK6xEuLHY/kSn+plU5VF8c0Hh3zSHsDy2+365/acTQK+EiAKOhevD83+ 0s6C07KbH2FG4+pTTuCSCI6Yv0Akbd2JkdexbLUpjPbGEoc4qdaDogY9LuBrKAemLl2o L/nw== X-Received: by 10.50.33.147 with SMTP id r19mr3766636igi.73.1358304416470; Tue, 15 Jan 2013 18:46:56 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.146.33 with HTTP; Tue, 15 Jan 2013 18:46:36 -0800 (PST) In-Reply-To: <20130116000051.GC2498@dastard> References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> <20130115225435.GB2498@dastard> <20130116000051.GC2498@dastard> From: "Bradley C. Kuszmaul" Date: Tue, 15 Jan 2013 21:46:36 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=f46d04462ec83d96e404d35ee43a X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1358304416 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-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.2.119978 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 --f46d04462ec83d96e404d35ee43a Content-Type: text/plain; charset=ISO-8859-1 But if I populate the file with a collection of near-1MB writes at random offsets, I'm likely to end up with one extent per write. Each non-hole line in xfs_bmap is an extent, right? -Bradley On Tue, Jan 15, 2013 at 7:00 PM, Dave Chinner wrote: > On Tue, Jan 15, 2013 at 06:33:54PM -0500, Bradley C. Kuszmaul wrote: > > So my understanding is that the first time I do a read() I'll have to > read > > the extents. My writes are on the order of a megabyte, a 250MB file will > > likely require an extra I/O to open. That's fine. > > write size != extent size. > > Extents on XFS on a 4k block size filesystem can be up to 8GB in > size. It's entirely likely that your 250MB file is a single extent > an dhence has no extra overhead on read. Use xfs_bmap to check. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --f46d04462ec83d96e404d35ee43a Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable But if I populate the file with a collection of near-1MB writes at random o= ffsets, I'm likely to end up with one extent per write. =A0Each non-hol= e line in xfs_bmap is an extent, right?

-Bradley

On Tue, Jan 15, 2013 at 7:00 PM, Dave Chinner <david@fromorbit.com> wrote:
On Tue, Jan 15, 2013 at 06:33:54PM -0500, Bradley C. Kusz= maul wrote:
> So my understanding is that the first time I do a read() I'll have= to read
> the extents. =A0My writes are on the order of a megabyte, a 250MB file= will
> likely require an extra I/O to open. =A0That's fine.

write size !=3D extent size.

Extents on XFS on a 4k block size filesystem can be up to 8GB in
size. It's entirely likely that your 250MB file is a single extent
an dhence has no extra overhead on read. =A0Use xfs_bmap to check.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--f46d04462ec83d96e404d35ee43a-- From david@fromorbit.com Tue Jan 15 21:22:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D12517F37 for ; Tue, 15 Jan 2013 21:22:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD9718F8037 for ; Tue, 15 Jan 2013 19:22:18 -0800 (PST) X-ASG-Debug-ID: 1358306533-04cbb0132685b30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CFT3xU3b2DrOmzEZ for ; Tue, 15 Jan 2013 19:22:14 -0800 (PST) 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: Aj4bANIb9lB5LEIF/2dsb2JhbABFhVGyEoJfgjoCgQ4Xc4IeAQEEATocIwULCAMYCSUPBSUDIROIEwW3PhWNQ4J/YQOWC5BKgwk Received: from ppp121-44-66-5.lns20.syd6.internode.on.net (HELO dastard) ([121.44.66.5]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Jan 2013 13:52:12 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvJZq-0004D2-JG; Wed, 16 Jan 2013 14:22:10 +1100 Date: Wed, 16 Jan 2013 14:22:10 +1100 From: Dave Chinner To: "Bradley C. Kuszmaul" Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Subject: Re: hole punching performance Message-ID: <20130116032210.GD2498@dastard> X-ASG-Orig-Subj: Re: hole punching performance References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> <20130115225435.GB2498@dastard> <20130116000051.GC2498@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: 1358306533 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Jan 15, 2013 at 09:46:36PM -0500, Bradley C. Kuszmaul wrote: > But if I populate the file with a collection of near-1MB writes at random > offsets, I'm likely to end up with one extent per write. Maybe. What you get depends on a lot of factors e.g. buffered IO will give different extent allocations to direct IO. Synchronous buffered IO will give different patterns to async buffered IO. Adding random fdatasync() calls will give different patterns again. And even better, if you are doing async buffered IO, different amounts of memory pressure can give you different results... > Each non-hole > line in xfs_bmap is an extent, right? Well, that depends on your definition of an extent. e.g. is a contiguous region on disk that alternates between written and unwritten state one extent? From an physical perspective it is a single extent, but from a logical perspective (i.e. for indexing) it is multiple extents.... FWIW, if you are intending that the file is non-sparse at the end of all the writes (i.e. you fill all the holes), they preallocating the file before starting any writes is a good idea because it guarantees you'll end up with a minimal number of physical extents when the file is completely written.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kuszmaul@gmail.com Tue Jan 15 21:25:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 77F6E7F37 for ; Tue, 15 Jan 2013 21:25:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5AF488F8049 for ; Tue, 15 Jan 2013 19:25:45 -0800 (PST) X-ASG-Debug-ID: 1358306744-04cb6c023782470001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id pGAN6qxvD59tfd25 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Jan 2013 19:25:44 -0800 (PST) X-Barracuda-Envelope-From: kuszmaul@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] Received: by mail-ie0-f171.google.com with SMTP id 17so1645959iea.2 for ; Tue, 15 Jan 2013 19:25:44 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=h4SozV/1nlmeykSmraHouVzFdfnjR9AwrN1KsBtDQm8=; b=wFNWdQOgAsMDUWv+H4y4yfaciWjYTcN9JYtiLz/2jV4ccM9RkIlN7K0NqfzrhXKCPm QRGWfJhqLyqDYDUJSoAWBTZG2Qj+V27I8ZyS1W3tQqNXdvgsrHhrzT94gT/VJt4a0SMS ZP5XhYd9GqQeThUiFUatC0B2icgf0vf75+6e/uvzRyykDBSud1l79diU6n98U4xRYTqr cgENpfgnrUm07AXTbG1kh2F3PvPO2cWlYEg9Th/O+mC9i8A95jr3RPLgxBL6H2O01kA4 RvEaUhuyHx67gwzTlG1JyKyXKuRwpO5faU11kou+T6Q+Bff+zRyxBSdpRk2CzeJOMvX7 1TAQ== Received: by 10.42.51.207 with SMTP id f15mr282376icg.16.1358306744102; Tue, 15 Jan 2013 19:25:44 -0800 (PST) MIME-Version: 1.0 Received: by 10.64.146.33 with HTTP; Tue, 15 Jan 2013 19:25:23 -0800 (PST) In-Reply-To: <20130116032210.GD2498@dastard> References: <87pq195t8q.fsf@mid.deneb.enyo.de> <20130113194941.GB27055@sgi.com> <20130113225545.GA19173@dastard> <87mwwaqgkj.fsf@mid.deneb.enyo.de> <20130115225435.GB2498@dastard> <20130116000051.GC2498@dastard> <20130116032210.GD2498@dastard> From: "Bradley C. Kuszmaul" Date: Tue, 15 Jan 2013 22:25:23 -0500 Message-ID: Subject: Re: hole punching performance To: Dave Chinner X-ASG-Orig-Subj: Re: hole punching performance Cc: Florian Weimer , Ben Myers , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf301cc2c8fa6e2904d35f6e20 X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1358306744 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-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.2.119982 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 --20cf301cc2c8fa6e2904d35f6e20 Content-Type: text/plain; charset=ISO-8859-1 I'm doing direct I/O. The definition of "extent" that I'm probing is how much inode or metadata must be read in order to execute the first read of a file. The file will always be sparse. On Tue, Jan 15, 2013 at 10:22 PM, Dave Chinner wrote: > On Tue, Jan 15, 2013 at 09:46:36PM -0500, Bradley C. Kuszmaul wrote: > > But if I populate the file with a collection of near-1MB writes at random > > offsets, I'm likely to end up with one extent per write. > > Maybe. What you get depends on a lot of factors > > e.g. buffered IO will give different extent allocations to direct > IO. Synchronous buffered IO will give different patterns to async > buffered IO. Adding random fdatasync() calls will give different > patterns again. And even better, if you are doing async buffered IO, > different amounts of memory pressure can give you different > results... > > > Each non-hole > > line in xfs_bmap is an extent, right? > > Well, that depends on your definition of an extent. e.g. is a > contiguous region on disk that alternates between written and > unwritten state one extent? From an physical perspective > it is a single extent, but from a logical perspective (i.e. > for indexing) it is multiple extents.... > > FWIW, if you are intending that the file is non-sparse at the end of > all the writes (i.e. you fill all the holes), they preallocating the > file before starting any writes is a good idea because it guarantees > you'll end up with a minimal number of physical extents when the > file is completely written.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --20cf301cc2c8fa6e2904d35f6e20 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I'm doing direct I/O. =A0

The definition of "ex= tent" that I'm probing is how much inode or metadata must be read = in order to execute the first read of a file.

The = file will always be sparse.

On Tue, Jan 15, 2013 at 10:22 PM, Dave Chinn= er <david@fromorbit.com> wrote:
On Tue, Jan 15, 2013 at 09:46:36PM -0500, Bradley C. Kusz= maul wrote:
> But if I populate the file with a collection of near-1MB writes at ran= dom
> offsets, I'm likely to end up with one extent per write.

Maybe. What you get depends on a lot of factors

e.g. buffered IO will give different extent allocations to direct
IO. Synchronous buffered IO will give different patterns to async
buffered IO. Adding random fdatasync() calls will give different
patterns again. And even better, if you are doing async buffered IO,
different amounts of memory pressure can give you different
results...

> Each non-hole
> line in xfs_bmap is an extent, right?

Well, that depends on your definition of an extent. e.g. is a
contiguous region on disk that alternates between written and
unwritten state one extent? From an physical perspective
it is a single extent, but from a logical perspective (i.e.
for indexing) it is multiple extents....

FWIW, if you are intending that the file is non-sparse at the end of
all the writes (i.e. you fill all the holes), they preallocating the
file before starting any writes is a good idea because it guarantees
you'll end up with a minimal number of physical extents when the
file is completely written....

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--20cf301cc2c8fa6e2904d35f6e20-- From 62ljz63@mppstuning.com Tue Jan 15 22:21:16 2013 Return-Path: <62ljz63@mppstuning.com> 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, UNPARSEABLE_RELAY 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 180187F37 for ; Tue, 15 Jan 2013 22:21:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89625AC003 for ; Tue, 15 Jan 2013 20:21:12 -0800 (PST) X-ASG-Debug-ID: 1358310067-04cb6c023985fa0001-NocioJ Received: from mppstuning.com (96-46-10-92.lucn.us [96.46.10.92]) by cuda.sgi.com with SMTP id euTNaZh0yMFLfhWU for ; Tue, 15 Jan 2013 20:21:08 -0800 (PST) X-Barracuda-Envelope-From: 62ljz63@mppstuning.com X-Barracuda-Apparent-Source-IP: 96.46.10.92 Received: from [123.22.135.210]; Tue, 15 Jan 2013 20:21:06 +0800 MIME-Version: 1.0 From: =?utf-8?B?6JqV5ouz6JGX5ZmO?= <62ljz63@mppstuning.com> To: xfs@oss.sgi.com Reply-To: redfj@163.com Date: 16 Jan 2013 12:21:03 +0800 Subject: =?utf-8?B?QmVzdCBiZXZlcmFnZSBhbmQgZm9vZCBwcm9kdWN0cyBmcm9tIFZpZXRuYW0uJDIwMTMvMS8xNiAxMjoyMDozOCQ=?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?QmVzdCBiZXZlcmFnZSBhbmQgZm9vZCBwcm9kdWN0cyBmcm9tIFZpZXRuYW0uJDIwMTMvMS8xNiAxMjoyMDozOCQ=?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: 96-46-10-92.lucn.us[96.46.10.92] X-Barracuda-Start-Time: 1358310068 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_DYNAMIC, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20130116042111.CE6EF1296117@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9u YWwvL0VOIj4KPEhUTUw+PEhFQUQ+CjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNl dD11bmljb2RlIiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4KPE1FVEEgbmFtZT1HRU5FUkFU T1IgY29udGVudD0iTVNIVE1MIDkuMDAuODExMi4xNjQ1NyI+PC9IRUFEPgo8Qk9EWT4KPERJ Vj48Rk9OVCBzaXplPTIgZmFjZT1BcmlhbD4KPERJViBzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBGT05ULVNJWkU6IDExcHQiPiZuYnNwOzwvRElWPgo8RElWIHN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdCI+RGVhciBidXllciw8L0RJVj4KPERJViBz dHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDExcHQiPjwvRElWPgo8RElW IHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdCI+TGlzdGVkIGlu IGFib3ZlIHBpY3R1cmUgaXMgb3VyIApwcm9kdWN0IHJhbmdlLjwvRElWPgo8RElWIHN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdCI+PC9ESVY+CjxESVYgc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0Ij5XZSBhcmUgZnJvbSBW aWV0bmFtLCBzbyB3ZSBjYW4gCnN1cHBseSB5b3Ugd2l0aCBjb21wZXRpdGl2ZSBwcmljZSBm b3IgdGhlc2UgYmV2ZXJhZ2UgYW5kIGZvb2QgcHJvZHVjdHMuIDwvRElWPgo8RElWIHN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdCI+PC9ESVY+CjxESVYgc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0Ij5XZSBhcmUgdGhlIG1h bnVmYWN0dXJlciBhbmQgCmV4cG9ydGVyIHdoaWNoIGhhcyBtb3JlIHRoYW4gPEIgc3R5bGU9 IkZPTlQtU0laRTogMTFwdCI+PEZPTlQgY29sb3I9I2ZmMDAwMD4yMCAKeWVhcnMgZXhwZXJp ZW5jZTwvRk9OVD48L0I+IGluIGZvb2QgYW5kIGRyaW5rIGluZHVzdHJ5LCB3ZSBoYXZlIGhp LXRlY2ggCmVxdWlwbWVudCBhbmQgaGlnaCBwcm9kdWN0aW9uIGNhcGFjaXR5LCBvdXIgY29t cGFueSBoYXMgcGFzc2VkPEIgCnN0eWxlPSJGT05ULVNJWkU6IDExcHQiPiBJU08gPC9CPiwg YWxsIHByb2R1Y3RzIGhhdmUgdGhlIGNlcnRpZmljYXRlcyBvZiA8QiAKc3R5bGU9IkZPTlQt U0laRTogMTFwdCI+RkRBLCBIQUxBTCwgSEFDQ1A8L0I+IGFuZCBzbyBvbiwgbW9yZSBkZXRh aWxzIHBsZWFzZSAKYnJvd3NlIG91ciB3ZWJzaXRlIDxBIGhyZWY9Imh0dHA6Ly93d3cuYmV2 ZXJhZ2UtdmlldG5hbS5jb20vIj48Rk9OVCAKc2l6ZT0zPnd3dy5iZXZlcmFnZS12aWV0bmFt LmNvbTwvRk9OVD48L0E+LjwvRElWPgo8RElWIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7 IEZPTlQtU0laRTogMTFwdCI+PC9ESVY+CjxESVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bDsgRk9OVC1TSVpFOiAxMXB0Ij5XaWxsIHdhaXQgZm9yIHlvdXIgaW5xdWlyZXMsIHdlIAp3 b3VsZCBiZSBwbGVhc2VkIHRvIGZlZWRiYWNrIG91ciBwcmljZS48L0RJVj4KPERJViBzdHls ZT0iRk9OVC1TSVpFOiAxMXB0IiBjbGFzcz1TVFlMRTI+CjxESVYgc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbDsgQ09MT1I6ICMwMDAwMDA7IEZPTlQtU0laRTogMTFwdCI+PC9ESVY+CjxE SVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMwMDAwMDA7IEZPTlQtU0la RTogMTFwdCI+CjxESVY+CjxESVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6 ICMwMDAwMDA7IEZPTlQtU0laRTogMTFwdCI+TWFueSB0aGFua3MgCiZhbXA7IEJlc3QgUmVn YXJkczwvRElWPgo8RElWIApzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAw MDAwMDsgRk9OVC1TSVpFOiAxMXB0Ij48U1RST05HPkNlbGluZTxCUj48L1NUUk9ORz5Ta3lw ZTogCnJpdGEtY2VsaW5lPEJSPlRlbDogMDA4NC0xNjM2NTY0MDkzPEJSPkVtYWlsOiA8QSAK aHJlZj0ibWFpbHRvOmFiY3ZuQHZubi52biI+YWJjdm5Adm5uLnZuPC9BPiAKPERJViBzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwMDAwMDsgRk9OVC1TSVpFOiAxMXB0 Ij48Rk9OVCAKc3R5bGU9IkxJTkUtSEVJR0hUOiBub3JtYWw7IFdJRE9XUzogMjsgVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IEZP TlQtVkFSSUFOVDogbm9ybWFsOyBGT05ULVNUWUxFOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAw cHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgV0hJVEUt U1BBQ0U6IG5vcm1hbDsgT1JQSEFOUzogMjsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyB3ZWJraXQtdGV4dC1zaXplLWFkanVz dDogYXV0bzsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIApzaXplPTI+PFNQQU4g Y2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPjwvU1BBTj48L0ZPTlQ+Jm5ic3A7PC9ESVY+ CjxESVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMwMDAwMDA7IEZPTlQt U0laRTogMTFwdCI+PEZPTlQgCnN0eWxlPSJMSU5FLUhFSUdIVDogbm9ybWFsOyBXSURPV1M6 IDI7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1 NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9OVC1TVFlMRTogbm9ybWFsOyBURVhU LUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJp YWw7IFdISVRFLVNQQUNFOiBub3JtYWw7IE9SUEhBTlM6IDI7IENPTE9SOiByZ2IoMCwwLDAp OyBGT05ULVdFSUdIVDogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgd2Via2l0LXRleHQt c2l6ZS1hZGp1c3Q6IGF1dG87IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiAKc2l6 ZT0yPjxTUEFOIGNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT48L1NQQU4+PC9GT05UPjxT UEFOIApzdHlsZT0iRk9OVC1TSVpFOiAxNHB4Ij48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6 IEFyaWFsIj48Rk9OVCAKc3R5bGU9IkZPTlQtV0VJR0hUOiBib2xkIiAKY29sb3I9IzAwODAw MD49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT08L0ZPTlQ+PC9TUEFOPjwvU1BBTj48Rk9OVCAKc2l6 ZT0rMD48Rk9OVCBjb2xvcj0jMDAwMDAwPjxGT05UIHNpemU9Mj48Rk9OVCBzaXplPSswPjxG T05UIGNvbG9yPSMwMDAwMDA+PEZPTlQgCnNpemU9Mj48U1BBTiAKc3R5bGU9IkZPTlQtRkFN SUxZOiAnQ2FsaWJyaScsJ3NhbnMtc2VyaWYnOyBDT0xPUjogIzFmNDk3ZDsgRk9OVC1TSVpF OiAxMXB0Ij48U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCI+PFNQQU4gc3R5bGU9 IkZPTlQtU0laRTogOXB0Ij48U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBUaW1lcyBOZXcg Um9tYW4iPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdCI+PFNQQU4gCnN0eWxlPSJG T05ULVNJWkU6IDEwcHQiPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwiPjxTUEFO IApzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQiPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDlw dCI+PEZPTlQgY29sb3I9IzAwMDAwMD48U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bCI+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogOXB0Ij48U1BBTiAKc3R5bGU9IkZPTlQtRkFN SUxZOiBUaW1lcyBOZXcgUm9tYW4iPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdCI+ PFNQQU4gCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWwiPjxTUEFOIApzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQiPjxTUEFOIHN0eWxl PSJGT05ULVNJWkU6IDlwdCI+IAo8L1NQQU4+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFO PjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvRk9OVD48L1NQQU4+PC9TUEFOPjwvU1BBTj48L1NQ QU4+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvU1BBTj48L0ZPTlQ+PEZPTlQgCnNp emU9Mj48L0RJVj48L0RJVj4KPERJVj4KPERJVj4KPERJVj48U1BBTiBzdHlsZT0iRk9OVC1T SVpFOiAxOHB4Ij48U1BBTiBzdHlsZT0iQ09MT1I6ICMwMDMzOTkiPjxCPjxGT05UIApjb2xv cj0jOTljYzAwPjxGT05UIApzdHlsZT0iRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlM WTogQXJpYWw7IEZPTlQtU0laRTogMTRwdDsgRk9OVC1XRUlHSFQ6IGJvbGQiIApjb2xvcj0j ZmYwMDAwIHNpemU9MT5SaXRhPC9GT05UPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDE2cHQi PjxTUEFOIApzdHlsZT0iRk9OVC1TSVpFOiAxNnB0Ij48U1BBTiBzdHlsZT0iRk9OVC1TSVpF OiAxOHB0Ij48U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBUaW1lcyBOZXcgUm9tYW4iPjxT UEFOIApzdHlsZT0iRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlMWTogQXJpYWw7IEZP TlQtU0laRTogMTRwdDsgRk9OVC1XRUlHSFQ6IGJvbGQiPiAKPC9TUEFOPjxTUEFOIHN0eWxl PSJGT05ULUZBTUlMWTogVGltZXMgTmV3IFJvbWFuIj48U1BBTiAKc3R5bGU9IkZPTlQtU0la RTogMTZwdCI+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMThwdCI+PFNQQU4gCnN0eWxlPSJG T05ULUZBTUlMWTogVGltZXMgTmV3IFJvbWFuIj48U1BBTiAKc3R5bGU9IkZPTlQtU1RZTEU6 IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwMDAwMDsgRk9OVC1TSVpF OiAxNHB0OyBGT05ULVdFSUdIVDogbm9ybWFsIj5GT09EIApBTkQgRFJJTksgQ09NUEFOWTxT UEFOIApzdHlsZT0iRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlMWTogQXJpYWw7IENP TE9SOiAjMDAwMDAwOyBGT05ULVNJWkU6IDE0cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWwiPiAK PC9TUEFOPjwvU1BBTj48U1BBTiAKc3R5bGU9IkZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1G QU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwMDAwMDsgRk9OVC1TSVpFOiAxNHB0OyBGT05ULVdF SUdIVDogbm9ybWFsIj5MSU1JVEVEPC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvU1BB Tj48L1NQQU4+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9GT05UPjwvQj48L1NQQU4+PC9TUEFO PjwvRElWPgo8RElWPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHgiPjxTUEFOIHN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWwiPjxGT05UIApjb2xvcj0jMDAwMDAwPjxCIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogOXB0Ij5BZGQ6PC9CPjxTUEFOIApzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDlwdCI+IFVuaXQgIyAzMCBWU0lQ LCBTdHJlZXQgNCAKVmlldG5hbS1TaW5nYXBvcmUgSW5kdXN0cmlhbCBQYXJrICxUaHVhbiBB biBEaXN0cmljdCwgQmluaCBEdW9uZyBQcm92aW5jZSwgClZpZXRuYW0uPC9TUEFOPjwvRk9O VD48L1NQQU4+PC9TUEFOPjwvRElWPgo8RElWPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEy cHgiPjxTUEFOIApzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDlwdCI+ PC9TUEFOPjwvU1BBTj48U1BBTiAKc3R5bGU9IkZPTlQtU0laRTogMTJweCI+PFNQQU4gc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCI+PFNQQU4gCnN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWwiPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwiPjxGT05UIApzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDlwdCIgY29sb3I9IzAwMDAwMCBzaXplPTE+ PEIgCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogOXB0Ij5Nb2I8L0I+ Ois4NC0xNjg0NTQ4MTIxIAo8L0ZPTlQ+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwv RElWPgo8RElWPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHgiPjxTUEFOIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWwiPjxTUEFOIApzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsIj48 U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCI+PC9TUEFOPjwvU1BBTj48L1NQQU4+ PC9TUEFOPjxTUEFOIApzdHlsZT0iRk9OVC1TSVpFOiAxMnB4Ij48U1BBTiBzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsIj48U1BBTiAKc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCI+PEZP TlQgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiA5cHQiIApjb2xvcj0j MDAwMDAwIHNpemU9MT48QiBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6 IDlwdCI+VGVsPC9CPjogCis4NC02NTAtMzc4NDY4OCAKPC9GT05UPjwvU1BBTj48L1NQQU4+ PC9TUEFOPjwvRElWPjwvRk9OVD48L0ZPTlQ+PC9GT05UPjwvRElWPjwvRk9OVD48L0ZPTlQ+ PC9GT05UPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRk9OVD48L0RJVj4KPERJVj4mbmJz cDs8L0RJVj7oirMgPC9CT0RZPjwvSFRNTD4KPFA+PC9QPjxicj4= From xfs@tlinx.org Wed Jan 16 00:03:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 ACC2A7F37 for ; Wed, 16 Jan 2013 00:03:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 985288F8039 for ; Tue, 15 Jan 2013 22:03:54 -0800 (PST) X-ASG-Debug-ID: 1358316232-04cbb0132891390001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id FpEOhIXYUcDu7xtC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Jan 2013 22:03:53 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0G63nAS012520 for ; Tue, 15 Jan 2013 22:03:51 -0800 Message-ID: <50F642C6.8050705@tlinx.org> Date: Tue, 15 Jan 2013 22:03:50 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358316233 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-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.2.119992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Was doing some createrepo ops with about 3k rpms and it created a cachedir w/~10k LONG entries .. size of the dir was(is) 348k, did a frag count on it and it had 155 fragments. Ouch. Tried to make a copy w/links thinking that doing so might create all the names "quickly enough" (?!) to benefit from some block-allocation coalescing. Not at all ;-(. Anyway to pre-alloc a dir or some means get a dir w/fewer frags... Mostly curiosity -- though I'd fix it if there was an easy fix -- but it's not a dir that's going to get much access, so it doesn't matter alot. Anway, thought I'd throw the Q out in case someone had any ideas... Tnx, Linda ---- P.s. -- these may be of no use to anyone, and have no guarantees or warrantees other than they work for me -- but 2 script to satisfy my idle curiosity... ----- #!/bin/bash # frags -- prints out the fragments (la walsh util script;pubdomain) if (($#<1)); then echo "need filename" >&2 ; exit 1; fi if [ ! -e "$1" ]; then echo "Name \"$1\" doesn't exist.">&2; exit 2; fi dev=$(df "$1"|tail -1|cut -d\ -f1) mountline=$(mount|grep "$dev") fstype=$( echo $mountline| (perl -ne '/ type (\S+) / && print "$1\n" '; echo error)| head -1 ) if [[ "$fstype" == "ext2" || "$fstype" == "ext3" ]]; then fstype=ext; fi if [[ "$fstype" == "ext" ]]; then exec "filefrags.$fstype" "$@" elif [[ "$fstype" == "xfs" ]]; then xfs_bmap "$@" else echo "I don't know how to dump frags (or extents) for a file on fstype \"$fstype\"." echo "If you do, send me an email: frags (at) tlinx (dot) org. Thanks!" exit 1 fi #: vim:ts=4:sw -------------------------------------------------- #!/bin/bash # nfrags -- just gives me a number! (la walsh util script;pubdomain) function nfrags { { grep -P '\s*\d:\s*\[\d+\.\.\d+\]\:\s\d+\.\.\d+' | wc -l ; } < <(frags "${1:?need file or dir}") } if (($#==0)); then echo 'Need file or dir name(s)' else for fn in "$@"; do printf "%4d:%s\n" "$(nfrags "$fn")" "$fn" done fi From livingcouk@neon.freezone.co.uk Wed Jan 16 02:08:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 966307F37 for ; Wed, 16 Jan 2013 02:08:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 65D0C30405F for ; Wed, 16 Jan 2013 00:08:42 -0800 (PST) X-ASG-Debug-ID: 1358323720-04bdf04a5a967c0001-NocioJ Received: from neon.freezone.co.uk (neon.freezone.co.uk [91.222.8.105]) by cuda.sgi.com with ESMTP id VCCq7geiocqRw1A8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Jan 2013 00:08:41 -0800 (PST) X-Barracuda-Envelope-From: livingcouk@neon.freezone.co.uk X-Barracuda-Apparent-Source-IP: 91.222.8.105 Received: by neon.freezone.co.uk (Postfix, from userid 10439) id 71C7471ECE; Wed, 16 Jan 2013 07:30:21 +0000 (GMT) To: xfs@oss.sgi.com Subject: Re: PURCHASE ORDER X-PHP-Originating-Script: 10439:Jesq..php X-ASG-Orig-Subj: Re: PURCHASE ORDER From: Globe Reply-To: Globe@mail.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20130116074517.71C7471ECE@neon.freezone.co.uk> Date: Wed, 16 Jan 2013 07:30:21 +0000 (GMT) X-Barracuda-Connect: neon.freezone.co.uk[91.222.8.105] X-Barracuda-Start-Time: 1358323720 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-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_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119999 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 Julia JH Globe 103, Park son road, California,USA. Hello Dear Thanks for your e-mail. Can you give me an assurance on the quality and that you can start processing if we place an order immediately or do you already have in stock?. We could not find our desire products in your cart/website. Can you produce exactly the product show below in the link? if yes i will need up to 50,000 Click here To View Product Photo: http://ps3media.com/new.alibaba1/acco.unt.verify.php Depending on your browser and cache settings, you may be asked to log-in to your e-mail to view the web page, login your email address to see if you can supply us the same product and give us your payment terms and delivery time. Await soonest reply Julia Purchase Manager From david@fromorbit.com Wed Jan 16 06:11:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6EC647F37 for ; Wed, 16 Jan 2013 06:11:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4EAFD8F8039 for ; Wed, 16 Jan 2013 04:11:07 -0800 (PST) X-ASG-Debug-ID: 1358338262-04bdf04a589dab0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id KHWk7PQYArkoeFyj for ; Wed, 16 Jan 2013 04:11:02 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag8gAKaX9lB5LIZq/2dsb2JhbABFtTOCMoJfgjoCgQYXc4IeAQEEATocIwULCAMOCgkaCw8FJQMhE4gTBbd0FY1Dgn9hA5JZgzKQSoMJ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail06.adl2.internode.on.net with ESMTP; 16 Jan 2013 22:41:01 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvRpN-00059K-2g; Wed, 16 Jan 2013 23:10:45 +1100 Date: Wed, 16 Jan 2013 23:10:45 +1100 From: Dave Chinner To: Linda Walsh Cc: xfs-oss Subject: Re: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) Message-ID: <20130116121045.GE2498@dastard> X-ASG-Orig-Subj: Re: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) References: <50F642C6.8050705@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F642C6.8050705@tlinx.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1358338262 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.120014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 15, 2013 at 10:03:50PM -0800, Linda Walsh wrote: > Was doing some createrepo ops with about 3k rpms and it created a > cachedir w/~10k LONG entries .. size of the dir was(is) 348k, > did a frag count on it and it had 155 fragments. Ouch. > > Tried to make a copy w/links thinking that doing so might create all > the names "quickly enough" (?!) to benefit from some block-allocation > coalescing. Not at all ;-(. > > Anyway to pre-alloc a dir or some means get a dir w/fewer frags... No. > Mostly curiosity -- though I'd fix it if there was an easy fix -- but > it's not a dir that's going to get much access, so it doesn't matter > alot. Just because the directory has lots of extents, it doesn't mean it is fragmented. Indeed, the directory read order may be a different order to the order of extents, especially as tehre are multiple trees/indexes in the directory structure that are used depending on the type of access. So unless you have a performance problem, there is nothing to "fix". And if you do have a perf problem with large directories, then use a larger directory block size.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bounce@smtp-4-54.dattaweb.com Wed Jan 16 07:18:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, 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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4557B7F37 for ; Wed, 16 Jan 2013 07:18:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32221304066 for ; Wed, 16 Jan 2013 05:18:35 -0800 (PST) X-ASG-Debug-ID: 1358342303-04cbb013279d940001-NocioJ Received: from smtp-4-54.dattaweb.com (smtp-4-54.dattaweb.com [200.58.123.96]) by cuda.sgi.com with ESMTP id XfzfhHMbvDExwKJv for ; Wed, 16 Jan 2013 05:18:24 -0800 (PST) X-Barracuda-Envelope-From: bounce@smtp-4-54.dattaweb.com X-Barracuda-Apparent-Source-IP: 200.58.123.96 To: From: Vendedor Reply-To: Vendedor Subject: =?utf-8?B?TWFzLWNvbWlzaW9uZXM=?= Date: Wed, 16 Jan 2013 10:14:04 -0300 X-ASG-Orig-Subj: =?utf-8?B?TWFzLWNvbWlzaW9uZXM=?= List-Unsubscribe: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="_=_envialosimple-93341030650f6a79ceb3da3.89210139_=_" Content-Transfer-Encoding: 7bit X-Priority: 3 X-IADB-IP: 200.58.123.96 X-IADB-IP-REVERSE: 96.123.58.200 X-IADB-URL: http://www.isipp.com/iadb.php X-Mailer-MsgId: eGZzQG9zcy5zZ2kuY29t X-Mailer-CSID: NjQ2MDlfNTI0MTdfMTE2NA== Message-ID: <1tVsOE-000Q2b-KN@smtp-1-marketing.dattaweb.com> Sender: Vendedor X-Complaints-To: postmaster@email-marketing.adminsimple.com X-Report-Abuse: postmaster@email-marketing.adminsimple.com X-DKIM: envialosimple.com DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=18612; s=emailmkt; t=1358342041; c=relaxed/simple; h=From:To:Subject; d=smtp-4-54.dattaweb.com; z=From:=20Vendedor=20=0A=0D=0A|To:=20=0A=0D=0A|Subject:=20=3D?utf-8?B?TWFzLWNvbWlzaW9uZXM=3D?=3D=0A=0D=0A; bh=fyO8lmqwAM0D3MAB6jZP544fxUc=; b=RpgUSE1aYtouAanZagM6+tLH9qNegH3NALohtquBDLDzSaSeWZI2XejeqX0UTh7wFB4HDZ/XkPHgXhMLsZvqQwNKsRO8RR78DQWvLWhXGAvHZMZTH3ynMqi3IVVLU1BZqONL/GgFC/qVpE0r7G0egsJw6LKLUq2k7QSA6jzGGf4= X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - smtp-4-54.dattaweb.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [500 500] X-AntiAbuse: Sender Address Domain - smtp-4-54.dattaweb.com X-Barracuda-Connect: smtp-4-54.dattaweb.com[200.58.123.96] X-Barracuda-Start-Time: 1358342303 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, HTML_IMAGE_RATIO_06, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120020 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 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 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 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers This is a message in multipart MIME format. Your mail client should not be displaying this. Consider upgrading your mail client to view this message correctly. --_=_envialosimple-93341030650f6a79ceb3da3.89210139_=_ Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Si no visualiza correctamente este E-Mail haga =0A=0AClick Aqu=ED (Link->ht= tp://v2.email-marketing.adminsimple.com/campaign/htmlversion?AdministratorI= D=3D1164&CampaignID=3D64609&StatisticID=3D52417&MemberID=3D22448294&s=3D227= 52d37de164160cd60d3a03f206961&isDemo=3D0) =0A=0ACasos de Exito! Qu=E9 dicen= Nuestros Clientes. =0A=0A... me ayuda a detectar a los clientes que=0A=0An= o est=E1n siendo atendidos... La herramienta cubre al 100% todas las necesi= dades de administracion de ventas...=0A=0AM.C.C. =0A=0AGerente Comercial=0A= =0A... tener mayor control sobre mis actividades, clientes y procedimientos= que realizo con ellos.=0A=0AAsi mismo a llevar un control mas a detalle so= bre mis vendedores...=0A=0A... lo mas importante, exigir a los vendedores c= uando sea necesario... G.M.L.=0A=0AEjecutivo de Ventas=0A=0A... puedo estar= actualizado y ser mas ordenado en mi carrera como vendedor y ahorro de tie= mpo al d=EDa y tener mas utilidades.=0A=0AF.T.R.=0A=0AEjecutivo de Ventas= =0A=0A... a organizarme como vendedor y aplicarme en el desempe=F1o de mi l= abor a ejecutar mi potencial de ventas. I.G.L.=0A=0A... Como vendedora a ad= ministrar mi cartera y tener un seguimiento mas de cerca, asi como objetivo= s a cumplir y prospectaci=F3n y crecimiento. R.V.G.=0A=0ASolicite un Video = sin Costo =0A=0ATel. (55) 5243 5222 =0A=0AV.C.C. Sistemas, S.A. de C.V. Ang= el Urraza #267 Col. Vertiz Narvarte.=0A=0ASi no desea recibir mas nuestros = newsletter's, puede desuscribirse haciendo =0A=0AClick aqu=ED (Link->http:/= /v2.email-marketing.adminsimple.com/member/publicunsubscribe?AdministratorI= D=3D1164&MemberID=3D22448294&StatisticID=3D52417&CampaignID=3D64609&isDemo= =3D0&MailListsIds[]=3D29581&s=3D4a9f5855cfeca21a4492a42872692981) =0A=0APar= a desuscribirse de nuestra lista haga =0A=0AClick Aqu=ED (Link->http://v2.e= mail-marketing.adminsimple.com/member/publicunsubscribe?AdministratorID=3D1= 164&MemberID=3D22448294&StatisticID=3D52417&CampaignID=3D64609&isDemo=3D0&M= ailListsIds[]=3D29581&s=3D4a9f5855cfeca21a4492a42872692981) --_=_envialosimple-93341030650f6a79ceb3da3.89210139_=_ Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
=0A=0A=09=09
=0A=09=09Si no visualiza correctamente este E-Mail haga Click Aqu=ED=0A=09=09
<= !-- \\ PreHeader Contents // -->=0A
=0A=0A =0A =0A =0A
=
=0A =0A =0A =0A =0A = =0A =0A =0A =0A =0A = =0A =0A =0A
=0A =0A =0A =0A = =0A = =0A =0A
3D""
=0A = =0A = =0A =0A =0A =0A =0A = =0A
=0A =

3D""3D""

=0A =
=0A =

Casos= de Exito!

=0A

Qu=E9 dicen Nuestros Clientes. 

=0A =
=0A = =0A =0A = =0A =0A = =0A =0A =0A

 

=0A = =0A =0A =0A =0A =0A = =0A =0A =0A =0A =0A = =0A =0A=
3D""
 
=0A

... me ayuda a detectar a los clientes que
=0A = no est=E1n siendo atendidos...

=0A

La herramienta cubre al 100% todas las necesidades = de administracion de ventas...
=0A M.C.C.

=0A =
=0A = =0A =0A = =0A =0A =0A =0A =0A
=3D""=0A = =0A = =0A =0A = =0A =0A = =0A
=0A =

Gerente Comercia= l

=0A

... tener mayor control sobre mis actividades, clientes y proced= imientos que realizo con ellos.

=0A =

Asi mismo a llevar un control mas a detal= le sobre mis vendedores...

=0A =

... lo mas importante, exigir a los vendedores= cuando sea necesario... G.M.L.

=0A =
= =0A
=0A =

 

=0A = =0A = =0A =0A = =0A = =0A <= td>=0A

... puedo estar actualizado y ser =09=09=09=09=09= =09=09=09=09=09=09mas ordenado en mi carrera como =09=09=09=09=09=09=09=09= =09=09=09vendedor y ahorro de tiempo al d=EDa y =09=09=09=09=09=09=09=09= =09=09=09tener mas utilidades.

=0A =

F.T.R.

=0A = =0A =0A = =0A =
=0A =0A
=0A
3D""=0A
=0A
=0A =

 

=0A =0A = =0A =0A = =0A =0A = =0A
3D""=0A = =0A =0A = =0A = =0A = =0A = =0A
=0A

Ejecutivo de Ventas

=0A =

... a organizarme como vendedor y =09=09=09=09= =09=09=09=09=09=09=09aplicarme en el desempe=F1o de mi =09=09=09=09=09=09= =09=09=09=09=09labor a ejecutar mi potencial de =09=09=09=09=09=09=09=09= =09=09=09ventas. I.G.L.

=0A <= p style=3D"margin: 10px 0px 8px; text-align: left; color: rgb(93, 118, 131)= ; line-height: 16px; font-family: Arial,Helvetica,sans-serif; font-size: 14= px; font-weight: normal;">... Como vendedora a administrar mi =09=09=09=09= =09=09=09=09=09=09=09cartera y tener un seguimiento mas =09=09=09=09=09=09= =09=09=09=09=09de cerca, asi como objetivos a =09=09=09=09=09=09=09=09=09= =09=09cumplir y prospectaci=F3n y =09=09=09=09=09=09=09=09=09=09=09crecimi= ento. R.V.G.

=0A
=0A =
=0A

Solicite un Video sin Costo

=0A =


=0A Tel.= (55) 5243 5222

=0A

<= /p>=0A

V.C.C. Sistemas, S= .A. de C.V. Angel Urraza #267 Col. Vertiz Narvarte.

=0A =
=0A
Si no desea recibir mas nuestros newsl= etter's, puede desuscribirse haciendo Click aqu=ED
=0A =
= =0A
=0A =0A
=0A<= !-- // Footer Contents \\ -->=0A=09=09
=0A=09=09Para desuscribirse de nuestra lista haga Click Aqu=ED=0A= =09=09
=0A
=0A=0A3D"= --_=_envialosimple-93341030650f6a79ceb3da3.89210139_=_-- From relatsdeficcio@telefonica.net Wed Jan 16 07:18:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_FONT_SIZE_HUGE,HTML_MESSAGE,T_REMOTE_IMAGE 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 56DD17F37 for ; Wed, 16 Jan 2013 07:18:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5C91AC002 for ; Wed, 16 Jan 2013 05:18:47 -0800 (PST) X-ASG-Debug-ID: 1358342318-04cb6c023a98930001-NocioJ Received: from telefonica.net (impaqm1.telefonica.net [213.4.138.17]) by cuda.sgi.com with ESMTP id rAsDg9j4PJHg5YZQ for ; Wed, 16 Jan 2013 05:18:38 -0800 (PST) X-Barracuda-Envelope-From: relatsdeficcio@telefonica.net X-Barracuda-Apparent-Source-IP: 213.4.138.17 Received: from IMPmailhost2.adm.correo ([10.20.102.39]) by IMPaqm1.telefonica.net with bizsmtp id oWv61k00m0r0BT63MdJdn8; Wed, 16 Jan 2013 14:18:37 +0100 Received: from FIX ([83.61.195.89]) by IMPmailhost2.adm.correo with BIZ IMP id odJb1k00p1wC4HP1idJcg4; Wed, 16 Jan 2013 14:18:37 +0100 X-Brightmail-Tracker: AAAAAA== X-original-sender: relatsdeficcio@telefonica.net From: "Novetat Editorial" Subject: Roma, segle XIII... To: "xfs" X-ASG-Orig-Subj: Roma, segle XIII... Content-Type: multipart/alternative; charset="iso-8859-1"; boundary="A2I4YA7eu=_7LdXb1iIvpqkHjqCLPEnsGz" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Organization: LLEUC Date: Wed, 16 Jan 2013 14:18:40 +0100 X-Confirm-Reading-To: relatsdeficcio@telefonica.net Return-Receipt-To: relatsdeficcio@telefonica.net Disposition-Notification-To: relatsdeficcio@telefonica.net X-Barracuda-Connect: impaqm1.telefonica.net[213.4.138.17] X-Barracuda-Start-Time: 1358342318 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.03 X-Barracuda-Spam-Status: No, SCORE=1.03 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC0_TG035a, HTML_FONT_SIZE_HUGE, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.39 HTML_FONT_SIZE_HUGE BODY: HTML font size is huge 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.00 BSF_SC0_TG035a Message contains invalid style definition Message-Id: <20130116131847.023A41296117@cuda.sgi.com> This is a multi-part message in MIME format --A2I4YA7eu=_7LdXb1iIvpqkHjqCLPEnsGz Content-Type: text/plain ; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable L'editorial El Toll presenta "El dol del lliri" de Marta Nin Roma, segle XIII. Tres germans i un amic, pertanyents a l=92alta noble= sa romana, es disputen l=92amor d=92una noia, filla d=92un comerciant = de teles. De sobte, la crida a la Croada irrompr=E0 en les seves vides= i els portar=E0 des de Trastevere fins a l=92Orient de la Mitja Lluna= =2E Despr=E9s, ja res no ser=E0 el mateix... Marta Nin =E9s filla del barri de Gr=E0cia de Barcelona, per=F2 viu a = l=92estranger des de fa m=E9s de vint anys. Actualment resideix a Roma= amb el seu marit i els seus dos fills. Ha treballat en la traducci=F3= , en l=92ensenyament i tamb=E9 en l=92=E0mbit bibliogr=E0fic i editori= al per a acabar dedicant-se al periodisme i a la narrativa. Ha publica= t relats de ficci=F3 en diverses revistes liter=E0ries, aix=ED com el = recull de narracions =93Dones en cam=ED=94 (Publicacions de l=92Abadia= de Montserrat, 2007). En l'editorial El Toll ha publicat la novel=B7l= a "El dol del lliri".=20 T=EDtol: El dol del lliri Autora: Marta Nin Format: 15x21 cm. P=E0gines: 236 ISBN: 978-84-940155-4-0 Editorial El Toll "Baixa" en l'encap=E7alament si no voleu rebre el butllet=ED. --A2I4YA7eu=_7LdXb1iIvpqkHjqCLPEnsGz Content-Type: text/html ; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
L'editorial El Toll
presenta
"El dol del lliri"
de Marta Nin
 
 
3D""
 
Roma, segle XIII. Tres germans i un amic, pertanye= nts a l'alta noblesa romana, es disputen l'amor d'una noia, filla d'un= comerciant de teles. De sobte, la crida a la Croada irrompr=E0 en les= seves vides i els portar=E0 des de Trastevere fins a l'Orient de la M= itja Lluna. Despr=E9s, ja res no ser=E0 el mateix...
 
 
3D""
 
Marta Nin =E9s filla del barri de Gr=E0cia= de Barcelona, per=F2 viu a l'estranger des de fa m=E9s de vint anys. = Actualment resideix a Roma amb el seu marit i els seus dos fills. Ha t= reballat en la traducci=F3, en l'ensenyament i tamb=E9 en l'=E0mbit bi= bliogr=E0fic i editorial per a acabar dedicant-se al periodisme i a la= narrativa. Ha publicat relats de ficci=F3 en diverses revistes liter=E0= ries, aix=ED com el recull de narracions "Dones en cam=ED" (Publicacio= ns de l'Abadia de Montserrat, 2007). En l'editorial El Toll= ha publicat la novel=B7la "El dol del lliri".=20
 
 
3D""
 
T=EDtol: El dol del lliriAutora: Marta Nin
Format: 15x21 cm.
P=E0gines: 2= 36
ISBN: 978-84-940155-4-0
Editorial El Toll=
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
"Baixa" en l'encap=E7alament si= no voleu rebre el butllet=ED.
--A2I4YA7eu=_7LdXb1iIvpqkHjqCLPEnsGz-- From noreply@sungrape.com Wed Jan 16 08:21:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 7CA137F37 for ; Wed, 16 Jan 2013 08:21:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D1E29AC003 for ; Wed, 16 Jan 2013 06:21:05 -0800 (PST) X-ASG-Debug-ID: 1358346061-04cb6c02389acd0001-w1Z2WR Received: from p3nw8sh231.shr.prod.phx3.secureserver.net (p3nw8sh231.shr.prod.phx3.secureserver.net [184.168.192.31]) by cuda.sgi.com with SMTP id Iy1ZLH1TyBZsN78d for ; Wed, 16 Jan 2013 06:21:02 -0800 (PST) X-Barracuda-Envelope-From: noreply@sungrape.com X-Barracuda-Apparent-Source-IP: 184.168.192.31 Received: from mail1.hosting.paran.com (mail1.hosting.paran.com [72.3.135.22]) by p3nw8sh231.shr.prod.phx3.secureserver.net with ESMTP id OOHYT0WJW5X87X0 for ; Wed, 16 Jan 2013 17:20:02 +0300 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail1.hosting.paran.com via ESMTP id 9BL7X68F6764ADA for ; Wed, 16 Jan 2013 17:17:01 +0300 Message-ID: From: Discount-Canadian-Meds To: Subject: Our most cherished customers enjoy all possible privileges and discounts we have to offer! Date: Wed, 16 Jan 2013 17:14:16 +0300 X-ASG-Orig-Subj: Our most cherished customers enjoy all possible privileges and discounts we have to offer! MIME-Version: 1.0 List-Subscribe: Content-Type: multipart/alternative; boundary="----=_NextPart_000_A793_76A.066" X-Priority: 1 X-MSMail-Priority: Hight X-Mailer: Microsoft Windows Live Mail 14.0.8089.726. X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726. X-Barracuda-Connect: p3nw8sh231.shr.prod.phx3.secureserver.net[184.168.192.31] X-Barracuda-Start-Time: 1358346061 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com 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_SC0_SA085c, BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120024 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 0.20 BSF_SC0_SA085c Custom Rule SA085c This is a multi-part message in MIME format. ------=_NextPart_000_A793_76A.066 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: base64 CgoJCWxoCgoJCVN5U2VBclByTGkKIAkJbnRyb21vZWRwaQogCQlocnF1dXJuaXRvCiAJCW9pZWxz b3IKIAkJZGxvCiAJCW5lCgogCQkkMCQwJDAkMCQwCiAJCS4zLjUuMi4yLjMKIAkJNzUyMDUKCgkJ KDU1KykgU2VlIG1vcmUuLi4KCgkJZ2gKCQloRAoKCQlXZVByWm9QckxlCiAJCWxsb3psb2lzeGEK IAkJYnVhY2Z0dGlwcgogCQl0cnFvCiAJCWluCiAJCVMKIAkJUgoKIAkJJDEkMCQwJDEkMAogCQku Mi40LjguMS40CiAJCTUxODExCgoJCSgyNCspIFNlZSBtb3JlLi4uCgoJCWhmCgkJaE0KCgkJQ2lD aVZpVmlWaQogCQlhbGFsYWdhZ2FnCiAJCWlzaXNyYXJhcmEKIAkJU1MrCiAJCW9mb2YKIAkJdHRU CiAJCVRhYWIKIAkJYnNzCgogCQkkMiQxJDIkNCQxCiAJCS41LjcuMC44LjgKIAkJMDUyNTUKCgkJ KDY1KykgU2VlIG1vcmUuLi4KCgkJRGlUckNlQXJGbAogCQljbGFtbGVjb2V4CiAJCW9mYWRicnhp ZXIKIAkJZW5vbGV4YWlsCiAJCWFjCiAJCUcKIAkJZWwKCiAJCSQ5JDEkMCQwJDAKIAkJLjAuNS41 LjMuOAogCQkwMDk4OQoKCQkoMzkrKSBTZWUgbW9yZS4uLgoKCQlMZUF1QW1CYVppCiAJCXZhZ21v eGN0dGgKIAkJcXVlbmljcmlybwogCQlpbnRpaWxtbWEKIAkJbmxpeAogCQluCgogCQkkMCQxJDAk MCQwCiAJCS45LjUuNS40LjUKIAkJNTkyMDgKCgkJKDYwKykgU2VlIG1vcmUuLi4KCgkJaEIKCgkJ RmVBbVVsVmlUcgogCQltYW94dHJhZ2FtCiAJCWxlaWNhbXJhYWQKIAkJVmlsb2wKIAkJaWFsaQog CQlncm4KIAkJYQoKIAkJJDAkMCQwJDEkMQogCQkuOS41LjkuOC41CiAJCTcyOTUwCgoJCSg2MDAr KSBTZWUgbW9yZS4uLgoKCQloZgoJCWhXCgoJCUZlUmVEZU5lQ2wKIAkJbWF0aWZseGlvbQogCQls ZW4tdWN1bWlkCiAJCUNBYW4KIAkJaWEKIAkJbGkKIAkJcwoKIAkJJDEkOSQwJDAkMAogCQkuMS45 LjcuNS40CiAJCTE5MjU1CgoJCSg0NSspIFNlZSBtb3JlLi4uCgoJCWhBCgoJCUFkRmxTZVZlTmEK IAkJdmFvdnJlbnRzbwogCQlpcmVudmVvbG5lCiAJCXRudGlueAoKIAkJJDIkMSQxJDEkMQogCQk0 LjkuOC41LjcuCiAJCTk1OTU5NTk1OTkKCgkJKDMyKykgU2VlIG1vcmUuLi4KCgkJIFVuc3Vic2Ny aWJlIFsxXSAKCgoKTGlua3M6Ci0tLS0tLQpbMV0KaHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3Rp bmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYmYWN0 PVVuc3Vic2NyaWJlCg0K ------=_NextPart_000_A793_76A.066 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4KPEhUTUw+PEhFQUQ+CjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5k b3dzLTEyNTEiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPgo8TUVUQSBuYW1lPUdFTkVSQVRPUiBj b250ZW50PSJNU0hUTUwgOC4wMC43NjAwLjE2NDkwIj4KPFNUWUxFPjwvU1RZTEU+CjwvSEVBRD4K PEJPRFkgYmdDb2xvcj0jZmZmZmZmPgo8RElWPjxGT05UIHNpemU9MiBmYWNlPUFyaWFsPjx0YWJs ZSBhbGlnbj0nY2VudGVyJyBib3JkZXI9JzAnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0n MCcgd2lkdGg9JzU1MCc+Cjx0Ym9keT4KCjx0cj48dGQ+Cjx0YWJsZSBzdHlsZT0nYm9yZGVyLXdp ZHRoOjI7IGJvcmRlci1zdHlsZTpzb2xpZDsgYm9yZGVyLWNvbG9yOiMzM2NjMzMnIGNlbGxwYWRk aW5nPScwJyBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzI3MCcgaGVpZ2h0PScxNzQnPgo8dGJvZHk+ Cjx0cj48dGQgYmdjb2xvcj0nIzMzY2MwMCcgaGVpZ2h0PTI0IHN0eWxlPSdwYWRkaW5nLWxlZnQ6 MTBwdDsnPjx0YWJsZSBib3JkZXI9JzAnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcg aGVpZ2h0PScyMCc+PHRyPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7 IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+R2U8L3NwYW4+ PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6 MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPm5lPC9zcGFuPjwvdGQ+PHRkPjxz cGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQt d2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5yYTwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0n Zm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xk OyBjb2xvcjp3aGl0ZSc+bDxmb250IGNvbG9yPScjMzNjYzAwJz5oPC9mb250Pjwvc3Bhbj48L3Rk Pjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0 OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+TWU8L3NwYW4+PC90ZD48dGQ+PHNwYW4g c3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWln aHQ6Ym9sZDsgY29sb3I6d2hpdGUnPmRzPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90 cj4KPHRyPjx0ZCBhbGlnbj0nY2VudGVyJyBzdHlsZT0ncGFkZGluZy10b3A6IDdwdDsnPgoKPHRh YmxlIGNlbGxwYWRkaW5nPScwJyBib3JkZXI9MCBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzIwMCcg aGVpZ2h0PScxMDAnPgo8dGJvZHk+Cjx0cj48dGQgd2lkdGg9JzE1NScgaGVpZ2h0PTIxIHN0eWxl PSd0ZXh0LWFsaWduOmxlZnQ7Jz4KPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHBhZGRpbmc9JzAnIGNl bGxzcGFjaW5nPScwJyBoZWlnaHQ9JzIwJz4KPHRib2R5Pgo8dHI+PHRkPjxhIGhyZWY9J2h0dHA6 Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlv bnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQt c2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29y YXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5TeTxicj5TZTxicj5Bcjxicj5Qcjxicj5MaTxicj48 L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4u Y28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2Zv bnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsg Zm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+bnQ8 YnI+cm88YnI+bW88YnI+ZWQ8YnI+cGk8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDov L3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9u cy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1z aXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3Jh dGlvbjpub25lOyBjb2xvcjpibGFjazsnPmhyPGJyPnF1PGJyPnVyPGJyPm5pPGJyPnRvPGJyPjwv YT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5j by51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9u dC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBm b250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5vaTxi cj5lbDxicj4mbmJzcDsmbmJzcDs8YnI+c288YnI+ciZuYnNwOzxicj48L2E+PC90ZD4NCjx0ZD48 YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRz L3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJp ZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9s ZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+ZCZuYnNwOzxicj4mbmJzcDsm bmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPmxvPGJyPiZuYnNwOyZuYnNwOzxicj48L2E+PC90ZD4N Cjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9j dW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5 OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWln aHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+Jm5ic3A7Jm5ic3A7 PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+bmU8YnI+Jm5ic3A7Jm5ic3A7PGJy PjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnpl bi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0n Zm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4y OyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4m bmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJz cDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5k b3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdh YjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZTox MXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246 bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNw OyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRk PjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVu dHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291 cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpi b2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5i c3A7PGJyPjwvYT48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9u dC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVj b3JhdGlvbjpub25lO2NvbG9yOmJsYWNrOyc+JDA8YnI+JDA8YnI+JDA8YnI+JDA8YnI+JDA8YnI+ PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0 OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9u ZTtjb2xvcjpibGFjazsnPi4zPGJyPi41PGJyPi4yPGJyPi4yPGJyPi4zPGJyPjwvdGQ+DQo8dGQg c3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWln aHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6Ymxh Y2s7Jz43PGJyPjU8YnI+Mjxicj4wPGJyPjU8YnI+PC90ZD4NCjwvdHI+PC90Ym9keT48L3RhYmxl Pgo8L3Rib2R5Pgo8L3RhYmxlPgoKPC90ZD48L3RyPgo8dHI+PHRkIGhlaWdodD0yNCBhbGlnbj1y aWdodCB2YWxpZ249dG9wPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnpl bi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0n dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjxmb250IHN0eWxlPSdwYWRkaW5nLXJpZ2h0OiA3cHQ7Zm9u dC1mYW1pbHk6Y291cmllciBuZXc7Zm9udC1zaXplOjExcHQ7JyBjb2xvcj0nYmxhY2snPig1NSsp IFNlZSBtb3JlLi4uPC9mb250PjwvYT48L3RkPjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+CjwvdGQ+ PHRkPgo8dGFibGUgc3R5bGU9J2JvcmRlci13aWR0aDoyOyBib3JkZXItc3R5bGU6c29saWQ7IGJv cmRlci1jb2xvcjojMzNjYzMzJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIHdpZHRo PScyNzAnIGhlaWdodD0nMTc0Jz4KPHRib2R5Pgo8dHI+PHRkIGJnY29sb3I9JyM2NjMzOTknIGhl aWdodD0yNCBzdHlsZT0ncGFkZGluZy1sZWZ0OjEwcHQ7Jz48dGFibGUgYm9yZGVyPScwJyBjZWxs cGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGhlaWdodD0nMjAnPjx0cj48dGQ+PHNwYW4gc3R5 bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6 Ym9sZDsgY29sb3I6d2hpdGUnPkRlPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZh bWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9y OndoaXRlJz5hbDwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmll ciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+aW48 L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250 LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPmc8Zm9udCBjb2xvcj0n IzY2MzM5OSc+aDwvZm9udD48L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5 OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hp dGUnPndpPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5l dzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz50aDwvc3Bh bj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6 ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+PGZvbnQgY29sb3I9JyM2NjMz OTknPmg8L2ZvbnQ+RDwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291 cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+ ZXA8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBm b250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPnJlPC9zcGFuPjwv dGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEz cHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5zczwvc3Bhbj48L3RkPjx0ZD48c3Bh biBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdl aWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+aW88L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2Zv bnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsg Y29sb3I6d2hpdGUnPm48L3NwYW4+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPgo8dHI+PHRk IGFsaWduPSdjZW50ZXInIHN0eWxlPSdwYWRkaW5nLXRvcDogN3B0Oyc+Cgo8dGFibGUgY2VsbHBh ZGRpbmc9JzAnIGJvcmRlcj0wIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzEw MCc+Cjx0Ym9keT4KPHRyPjx0ZCB3aWR0aD0nMTU1JyBoZWlnaHQ9MjEgc3R5bGU9J3RleHQtYWxp Z246bGVmdDsnPgo8dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9 JzAnIGhlaWdodD0nMjAnPgo8dGJvZHk+Cjx0cj48dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEu c2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5o dG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l OyBjb2xvcjpibGFjazsnPldlPGJyPlByPGJyPlpvPGJyPlByPGJyPkxlPGJyPjwvYT48L3RkPg0K PHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1 bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6 Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdo dDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5sbDxicj5vejxicj5s bzxicj5pczxicj54YTxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5z aGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0 bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGNvbG9yOmJsYWNrOyc+YnU8YnI+YWM8YnI+ZnQ8YnI+dGk8YnI+cHI8YnI+PC9hPjwvdGQ+DQo8 dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3Vt ZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpj b3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0 OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPnRyPGJyPiZuYnNwOyZu YnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+cSZuYnNwOzxicj5vJm5ic3A7PGJyPjwvYT48L3RkPg0K PHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1 bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6 Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdo dDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5pbjxicj4mbmJzcDsm bmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVu LmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdm b250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7 IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZu YnNwO1M8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNo YXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRt bD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBs aW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsg Y29sb3I6YmxhY2s7Jz5SJm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdo dHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmlj YXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBm b250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1k ZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNw Ozxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj48L2E+ PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28u dWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQt ZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9u dC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+Jm5ic3A7 Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJy PiZuYnNwOyZuYnNwOzxicj48L2E+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmll ciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xk OyB0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpibGFjazsnPiQxPGJyPiQwPGJyPiQwPGJyPiQx PGJyPiQwPGJyPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250 LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNv cmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz4uMjxicj4uNDxicj4uODxicj4uMTxicj4uNDxicj48 L3RkPg0KPHRkIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l O2NvbG9yOmJsYWNrOyc+NTxicj4xPGJyPjg8YnI+MTxicj4xPGJyPjwvdGQ+DQo8L3RyPjwvdGJv ZHk+PC90YWJsZT4KPC90Ym9keT4KPC90YWJsZT4KCjwvdGQ+PC90cj4KPHRyPjx0ZCBoZWlnaHQ9 MjQgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQu aG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9 Nicgc3R5bGU9J3RleHQtZGVjb3JhdGlvbjpub25lJz48Zm9udCBzdHlsZT0ncGFkZGluZy1yaWdo dDogN3B0O2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3O2ZvbnQtc2l6ZToxMXB0OycgY29sb3I9J2Js YWNrJz4oMjQrKSBTZWUgbW9yZS4uLjwvZm9udD48L2E+PC90ZD48L3RyPgo8L3Rib2R5Pgo8L3Rh YmxlPgo8L3RkPjwvdHI+PHRyPjx0ZCBoZWlnaHQ9Nz48L3RkPjwvdHI+PHRyPjx0ZD4KPHRhYmxl IHN0eWxlPSdib3JkZXItd2lkdGg6MjsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItY29sb3I6 IzMzY2MzMycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nMjcwJyBoZWln aHQ9JzE3NCc+Cjx0Ym9keT4KPHRyPjx0ZCBiZ2NvbG9yPScjMDAwMGNjJyBoZWlnaHQ9MjQgc3R5 bGU9J3BhZGRpbmctbGVmdDoxMHB0Oyc+PHRhYmxlIGJvcmRlcj0nMCcgY2VsbHBhZGRpbmc9JzAn IGNlbGxzcGFjaW5nPScwJyBoZWlnaHQ9JzIwJz48dHI+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZh bWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9y OndoaXRlJz5NZTwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmll ciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+ZHM8 L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250 LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPjxmb250IGNvbG9yPScj MDAwMGNjJz5oPC9mb250PmY8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5 OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hp dGUnPm9yPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5l dzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz48Zm9udCBj b2xvcj0nIzAwMDBjYyc+aDwvZm9udD5NPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250 LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNv bG9yOndoaXRlJz5lbjwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+Cjx0cj48dGQg YWxpZ249J2NlbnRlcicgc3R5bGU9J3BhZGRpbmctdG9wOiA3cHQ7Jz4KCjx0YWJsZSBjZWxscGFk ZGluZz0nMCcgYm9yZGVyPTAgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPScyMDAnIGhlaWdodD0nMTAw Jz4KPHRib2R5Pgo8dHI+PHRkIHdpZHRoPScxNTUnIGhlaWdodD0yMSBzdHlsZT0ndGV4dC1hbGln bjpsZWZ0Oyc+Cjx0YWJsZSBib3JkZXI9JzAnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0n MCcgaGVpZ2h0PScyMCc+Cjx0Ym9keT4KPHRyPjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5z aGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0 bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGNvbG9yOmJsYWNrOyc+Q2k8YnI+Q2k8YnI+Vmk8YnI+Vmk8YnI+Vmk8YnI+PC9hPjwvdGQ+DQo8 dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3Vt ZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpj b3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0 OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPmFsPGJyPmFsPGJyPmFn PGJyPmFnPGJyPmFnPGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNo YXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRt bD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBs aW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsg Y29sb3I6YmxhY2s7Jz5pczxicj5pczxicj5yYTxicj5yYTxicj5yYTxicj48L2E+PC90ZD4NCjx0 ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1l bnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNv dXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6 Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+Jm5ic3A7Uzxicj4mbmJz cDsmbmJzcDs8YnI+Jm5ic3A7Uzxicj4mbmJzcDsrPGJyPiZuYnNwOyZuYnNwOzxicj48L2E+PC90 ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsv ZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFt aWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13 ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+b2Y8YnI+Jm5i c3A7Jm5ic3A7PGJyPm9mPGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwv dGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVr L2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZh bWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQt d2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPnQmbmJzcDs8 YnI+Jm5ic3A7Jm5ic3A7PGJyPnRUPGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVu LmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdm b250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7 IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPlRh PGJyPiZuYnNwOyZuYnNwOzxicj5hYjxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJy PjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnpl bi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0n Zm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4y OyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5i czxicj4mbmJzcDsmbmJzcDs8YnI+cyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5i c3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0 aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBz dHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdo dDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6Ymxh Y2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJz cDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZh bWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQt d2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmJsYWNrOyc+JDI8YnI+JDE8 YnI+JDI8YnI+JDQ8YnI+JDE8YnI+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmll ciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xk OyB0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpibGFjazsnPi41PGJyPi43PGJyPi4wPGJyPi44 PGJyPi44PGJyPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250 LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNv cmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz4wPGJyPjU8YnI+Mjxicj41PGJyPjU8YnI+PC90ZD4N CjwvdHI+PC90Ym9keT48L3RhYmxlPgo8L3Rib2R5Pgo8L3RhYmxlPgoKPC90ZD48L3RyPgo8dHI+ PHRkIGhlaWdodD0yNCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGhyZWY9J2h0dHA6Ly9wYW5k b3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdh YjAuaHRtbD9pZD02JyBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOm5vbmUnPjxmb250IHN0eWxlPSdw YWRkaW5nLXJpZ2h0OiA3cHQ7Zm9udC1mYW1pbHk6Y291cmllciBuZXc7Zm9udC1zaXplOjExcHQ7 JyBjb2xvcj0nYmxhY2snPig2NSspIFNlZSBtb3JlLi4uPC9mb250PjwvYT48L3RkPjwvdHI+Cjwv dGJvZHk+CjwvdGFibGU+CjwvdGQ+PHRkPgo8dGFibGUgc3R5bGU9J2JvcmRlci13aWR0aDoyOyBi b3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci1jb2xvcjojMzNjYzMzJyBjZWxscGFkZGluZz0nMCcg Y2VsbHNwYWNpbmc9JzAnIHdpZHRoPScyNzAnIGhlaWdodD0nMTc0Jz4KPHRib2R5Pgo8dHI+PHRk IGJnY29sb3I9JyMwMDk5NjYnIGhlaWdodD0yNCBzdHlsZT0ncGFkZGluZy1sZWZ0OjEwcHQ7Jz48 dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGhlaWdodD0n MjAnPjx0cj48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNp emU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPlBhPC9zcGFuPjwvdGQ+PHRk PjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZv bnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5pbjwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHls ZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpi b2xkOyBjb2xvcjp3aGl0ZSc+a2k8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFt aWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6 d2hpdGUnPmxsPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVy IG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5lcjwv c3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQt c2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+czwvc3Bhbj48L3RkPjwv dHI+PC90YWJsZT48L3RkPjwvdHI+Cjx0cj48dGQgYWxpZ249J2NlbnRlcicgc3R5bGU9J3BhZGRp bmctdG9wOiA3cHQ7Jz4KCjx0YWJsZSBjZWxscGFkZGluZz0nMCcgYm9yZGVyPTAgY2VsbHNwYWNp bmc9JzAnIHdpZHRoPScyMDAnIGhlaWdodD0nMTAwJz4KPHRib2R5Pgo8dHI+PHRkIHdpZHRoPScx NTUnIGhlaWdodD0yMSBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0Oyc+Cjx0YWJsZSBib3JkZXI9JzAn IGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgaGVpZ2h0PScyMCc+Cjx0Ym9keT4KPHRy Pjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9j dW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5 OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWln aHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+RGk8YnI+VHI8YnI+ Q2U8YnI+QXI8YnI+Rmw8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEu c2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5o dG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l OyBjb2xvcjpibGFjazsnPmNsPGJyPmFtPGJyPmxlPGJyPmNvPGJyPmV4PGJyPjwvYT48L3RkPg0K PHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1 bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6 Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdo dDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5vZjxicj5hZDxicj5i cjxicj54aTxicj5lcjxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5z aGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0 bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGNvbG9yOmJsYWNrOyc+ZW48YnI+b2w8YnI+ZXg8YnI+YSZuYnNwOzxicj5pbDxicj48L2E+PC90 ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsv ZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFt aWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13 ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+YWM8YnI+Jm5i c3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7 PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5n Lnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHls ZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDog MS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7 Jz4mbmJzcDtHPGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7 PGJyPiZuYnNwOyZuYnNwOzxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9y YS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIw Lmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFw dDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5v bmU7IGNvbG9yOmJsYWNrOyc+ZWw8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4m bmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0 dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNh dGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZv bnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRl Y29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7 PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48 L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51 ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1m YW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250 LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsm bmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVy IG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7 IHRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmJsYWNrOyc+JDk8YnI+JDE8YnI+JDA8YnI+JDA8 YnI+JDA8YnI+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQt c2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29y YXRpb246bm9uZTtjb2xvcjpibGFjazsnPi4wPGJyPi41PGJyPi41PGJyPi4zPGJyPi44PGJyPjwv dGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 Y29sb3I6YmxhY2s7Jz4wPGJyPjA8YnI+OTxicj44PGJyPjk8YnI+PC90ZD4NCjwvdHI+PC90Ym9k eT48L3RhYmxlPgo8L3Rib2R5Pgo8L3RhYmxlPgoKPC90ZD48L3RyPgo8dHI+PHRkIGhlaWdodD0y NCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5o b3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02 JyBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOm5vbmUnPjxmb250IHN0eWxlPSdwYWRkaW5nLXJpZ2h0 OiA3cHQ7Zm9udC1mYW1pbHk6Y291cmllciBuZXc7Zm9udC1zaXplOjExcHQ7JyBjb2xvcj0nYmxh Y2snPigzOSspIFNlZSBtb3JlLi4uPC9mb250PjwvYT48L3RkPjwvdHI+CjwvdGJvZHk+CjwvdGFi bGU+CjwvdGQ+PC90cj48dHI+PHRkIGhlaWdodD03PjwvdGQ+PC90cj48dHI+PHRkPgo8dGFibGUg c3R5bGU9J2JvcmRlci13aWR0aDoyOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci1jb2xvcjoj MzNjYzMzJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPScyNzAnIGhlaWdo dD0nMTc0Jz4KPHRib2R5Pgo8dHI+PHRkIGJnY29sb3I9JyNmZjk5MzMnIGhlaWdodD0yNCBzdHls ZT0ncGFkZGluZy1sZWZ0OjEwcHQ7Jz48dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcg Y2VsbHNwYWNpbmc9JzAnIGhlaWdodD0nMjAnPjx0cj48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFt aWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6 d2hpdGUnPkFuPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVy IG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz50aTwv c3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQt c2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+Ymk8L3NwYW4+PC90ZD48 dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsg Zm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPm90PC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0 eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0 OmJvbGQ7IGNvbG9yOndoaXRlJz5pYzwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1m YW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xv cjp3aGl0ZSc+czwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+Cjx0cj48dGQgYWxp Z249J2NlbnRlcicgc3R5bGU9J3BhZGRpbmctdG9wOiA3cHQ7Jz4KCjx0YWJsZSBjZWxscGFkZGlu Zz0nMCcgYm9yZGVyPTAgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPScyMDAnIGhlaWdodD0nMTAwJz4K PHRib2R5Pgo8dHI+PHRkIHdpZHRoPScxNTUnIGhlaWdodD0yMSBzdHlsZT0ndGV4dC1hbGlnbjps ZWZ0Oyc+Cjx0YWJsZSBib3JkZXI9JzAnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcg aGVpZ2h0PScyMCc+Cjx0Ym9keT4KPHRyPjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFy ZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/ aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGlu ZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNv bG9yOmJsYWNrOyc+TGU8YnI+QXU8YnI+QW08YnI+QmE8YnI+Wmk8YnI+PC9hPjwvdGQ+DQo8dGQ+ PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50 cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3Vy aWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJv bGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPnZhPGJyPmdtPGJyPm94PGJy PmN0PGJyPnRoPGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJl ZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9p ZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5l LWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29s b3I6YmxhY2s7Jz5xdTxicj5lbjxicj5pYzxicj5yaTxicj5ybzxicj48L2E+PC90ZD4NCjx0ZD48 YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRz L3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJp ZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9s ZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+aW48YnI+dGk8YnI+aWw8YnI+ bSZuYnNwOzxicj5tYTxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5z aGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0 bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGNvbG9yOmJsYWNrOyc+Jm5ic3A7Jm5ic3A7PGJyPm4mbmJzcDs8YnI+bGk8YnI+Jm5ic3A7Jm5i c3A7PGJyPngmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEu c2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5o dG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l OyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+biZuYnNwOzxi cj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9 J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lm aWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7 IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0 LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5i c3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwv YT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5j by51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9u dC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBm b250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJz cDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8 YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3Jh LnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAu aHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0 OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9u ZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZu YnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkIHN0 eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0 OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmJsYWNr Oyc+JDA8YnI+JDE8YnI+JDA8YnI+JDA8YnI+JDA8YnI+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1m YW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250 LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpibGFjazsnPi45PGJyPi41 PGJyPi41PGJyPi40PGJyPi41PGJyPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJp ZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9s ZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz41PGJyPjk8YnI+Mjxicj4wPGJy Pjg8YnI+PC90ZD4NCjwvdHI+PC90Ym9keT48L3RhYmxlPgo8L3Rib2R5Pgo8L3RhYmxlPgoKPC90 ZD48L3RyPgo8dHI+PHRkIGhlaWdodD0yNCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGhyZWY9 J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lm aWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOm5vbmUnPjxm b250IHN0eWxlPSdwYWRkaW5nLXJpZ2h0OiA3cHQ7Zm9udC1mYW1pbHk6Y291cmllciBuZXc7Zm9u dC1zaXplOjExcHQ7JyBjb2xvcj0nYmxhY2snPig2MCspIFNlZSBtb3JlLi4uPC9mb250PjwvYT48 L3RkPjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+CjwvdGQ+PHRkPgo8dGFibGUgc3R5bGU9J2JvcmRl ci13aWR0aDoyOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci1jb2xvcjojMzNjYzMzJyBjZWxs cGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPScyNzAnIGhlaWdodD0nMTc0Jz4KPHRi b2R5Pgo8dHI+PHRkIGJnY29sb3I9JyNmZjMzOTknIGhlaWdodD0yNCBzdHlsZT0ncGFkZGluZy1s ZWZ0OjEwcHQ7Jz48dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9 JzAnIGhlaWdodD0nMjAnPjx0cj48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIg bmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPkJlPC9z cGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1z aXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5zdDwvc3Bhbj48L3RkPjx0 ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBm b250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+PGZvbnQgY29sb3I9JyNmZjMzOTknPmg8L2Zv bnQ+Qjwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7 IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+dXk8L3NwYW4+ PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPgo8dHI+PHRkIGFsaWduPSdjZW50ZXInIHN0eWxl PSdwYWRkaW5nLXRvcDogN3B0Oyc+Cgo8dGFibGUgY2VsbHBhZGRpbmc9JzAnIGJvcmRlcj0wIGNl bGxzcGFjaW5nPScwJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzEwMCc+Cjx0Ym9keT4KPHRyPjx0ZCB3 aWR0aD0nMTU1JyBoZWlnaHQ9MjEgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnPgo8dGFibGUgYm9y ZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGhlaWdodD0nMjAnPgo8dGJv ZHk+Cjx0cj48dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNv LnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250 LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZv bnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPkZlPGJy PkFtPGJyPlVsPGJyPlZpPGJyPlRyPGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9w YW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMv YTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6 ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRp b246bm9uZTsgY29sb3I6YmxhY2s7Jz5tYTxicj5veDxicj50cjxicj5hZzxicj5hbTxicj48L2E+ PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28u dWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQt ZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9u dC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyc+bGU8YnI+ aWM8YnI+YW08YnI+cmE8YnI+YWQ8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3Bh bmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9h N2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXpl OjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlv bjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwO1Y8YnI+aWw8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZu YnNwOyZuYnNwOzxicj5vbDxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9y YS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIw Lmh0bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFw dDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5v bmU7IGNvbG9yOmJsYWNrOyc+aWE8YnI+bGk8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNw Ozxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRv cmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2Fi MC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEx cHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpu b25lOyBjb2xvcjpibGFjazsnPmdyPGJyPm4mbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNw OyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDov L3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9u cy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1z aXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3Jh dGlvbjpub25lOyBjb2xvcjpibGFjazsnPmEmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNw OyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRk PjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVu dHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291 cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpi b2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5i c3A7PGJyPjwvYT48L3RkPg0KPHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0 aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBz dHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdo dDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6Ymxh Y2s7Jz4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJz cDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZh bWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQt d2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmJsYWNrOyc+JDA8YnI+JDA8 YnI+JDA8YnI+JDE8YnI+JDE8YnI+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmll ciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xk OyB0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpibGFjazsnPi45PGJyPi41PGJyPi45PGJyPi44 PGJyPi41PGJyPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250 LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNv cmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz43PGJyPjI8YnI+OTxicj41PGJyPjA8YnI+PC90ZD4N CjwvdHI+PC90Ym9keT48L3RhYmxlPgo8L3Rib2R5Pgo8L3RhYmxlPgoKPC90ZD48L3RyPgo8dHI+ PHRkIGhlaWdodD0yNCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGhyZWY9J2h0dHA6Ly9wYW5k b3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdh YjAuaHRtbD9pZD02JyBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOm5vbmUnPjxmb250IHN0eWxlPSdw YWRkaW5nLXJpZ2h0OiA3cHQ7Zm9udC1mYW1pbHk6Y291cmllciBuZXc7Zm9udC1zaXplOjExcHQ7 JyBjb2xvcj0nYmxhY2snPig2MDArKSBTZWUgbW9yZS4uLjwvZm9udD48L2E+PC90ZD48L3RyPgo8 L3Rib2R5Pgo8L3RhYmxlPgo8L3RkPjwvdHI+PHRyPjx0ZCBoZWlnaHQ9Nz48L3RkPjwvdHI+PHRy Pjx0ZD4KPHRhYmxlIHN0eWxlPSdib3JkZXItd2lkdGg6MjsgYm9yZGVyLXN0eWxlOnNvbGlkOyBi b3JkZXItY29sb3I6IzMzY2MzMycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJyB3aWR0 aD0nMjcwJyBoZWlnaHQ9JzE3NCc+Cjx0Ym9keT4KPHRyPjx0ZCBiZ2NvbG9yPScjY2MwMDY2JyBo ZWlnaHQ9MjQgc3R5bGU9J3BhZGRpbmctbGVmdDoxMHB0Oyc+PHRhYmxlIGJvcmRlcj0nMCcgY2Vs bHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJyBoZWlnaHQ9JzIwJz48dHI+PHRkPjxzcGFuIHN0 eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0 OmJvbGQ7IGNvbG9yOndoaXRlJz5NZTwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1m YW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xv cjp3aGl0ZSc+ZHM8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJp ZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPjxm b250IGNvbG9yPScjY2MwMDY2Jz5oPC9mb250PmY8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9 J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9s ZDsgY29sb3I6d2hpdGUnPm9yPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWls eTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndo aXRlJz48Zm9udCBjb2xvcj0nI2NjMDA2Nic+aDwvZm9udD5XPC9zcGFuPjwvdGQ+PHRkPjxzcGFu IHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2Vp Z2h0OmJvbGQ7IGNvbG9yOndoaXRlJz5vbTwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9u dC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBj b2xvcjp3aGl0ZSc+ZW48L3NwYW4+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPgo8dHI+PHRk IGFsaWduPSdjZW50ZXInIHN0eWxlPSdwYWRkaW5nLXRvcDogN3B0Oyc+Cgo8dGFibGUgY2VsbHBh ZGRpbmc9JzAnIGJvcmRlcj0wIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzEw MCc+Cjx0Ym9keT4KPHRyPjx0ZCB3aWR0aD0nMTU1JyBoZWlnaHQ9MjEgc3R5bGU9J3RleHQtYWxp Z246bGVmdDsnPgo8dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9 JzAnIGhlaWdodD0nMjAnPgo8dGJvZHk+Cjx0cj48dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEu c2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5o dG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l OyBjb2xvcjpibGFjazsnPkZlPGJyPlJlPGJyPkRlPGJyPk5lPGJyPkNsPGJyPjwvYT48L3RkPg0K PHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1 bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6 Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdo dDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5tYTxicj50aTxicj5m bDxicj54aTxicj5vbTxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5z aGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0 bWw/aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsg bGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGNvbG9yOmJsYWNrOyc+bGU8YnI+bi08YnI+dWM8YnI+dW08YnI+aWQ8YnI+PC9hPjwvdGQ+DQo8 dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3Vt ZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpj b3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0 OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwO0M8YnI+QSZu YnNwOzxicj5hbjxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPjwvYT48L3RkPg0K PHRkPjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1 bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6 Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdo dDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz5pYTxicj4mbmJzcDsm bmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVu LmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdm b250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7 IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPmxp PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNw OyZuYnNwOzxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFyZWQu aG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/aWQ9 Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1o ZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9y OmJsYWNrOyc+cyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNw OyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDov L3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9u cy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1z aXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3Jh dGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+ Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+ DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2Rv Y3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWls eTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2Vp Z2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNw Ozxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJz cDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3 OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4 dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz4kMTxicj4kOTxicj4kMDxicj4kMDxicj4k MDxicj48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXpl OjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlv bjpub25lO2NvbG9yOmJsYWNrOyc+LjE8YnI+Ljk8YnI+Ljc8YnI+LjU8YnI+LjQ8YnI+PC90ZD4N Cjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5l LWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xv cjpibGFjazsnPjE8YnI+OTxicj4yPGJyPjU8YnI+NTxicj48L3RkPg0KPC90cj48L3Rib2R5Pjwv dGFibGU+CjwvdGJvZHk+CjwvdGFibGU+Cgo8L3RkPjwvdHI+Cjx0cj48dGQgaGVpZ2h0PTI0IGFs aWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3Rp bmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0 eWxlPSd0ZXh0LWRlY29yYXRpb246bm9uZSc+PGZvbnQgc3R5bGU9J3BhZGRpbmctcmlnaHQ6IDdw dDtmb250LWZhbWlseTpjb3VyaWVyIG5ldztmb250LXNpemU6MTFwdDsnIGNvbG9yPSdibGFjayc+ KDQ1KykgU2VlIG1vcmUuLi48L2ZvbnQ+PC9hPjwvdGQ+PC90cj4KPC90Ym9keT4KPC90YWJsZT4K PC90ZD48dGQ+Cjx0YWJsZSBzdHlsZT0nYm9yZGVyLXdpZHRoOjI7IGJvcmRlci1zdHlsZTpzb2xp ZDsgYm9yZGVyLWNvbG9yOiMzM2NjMzMnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcg d2lkdGg9JzI3MCcgaGVpZ2h0PScxNzQnPgo8dGJvZHk+Cjx0cj48dGQgYmdjb2xvcj0nIzk5MDAw MCcgaGVpZ2h0PTI0IHN0eWxlPSdwYWRkaW5nLWxlZnQ6MTBwdDsnPjx0YWJsZSBib3JkZXI9JzAn IGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgaGVpZ2h0PScyMCc+PHRyPjx0ZD48c3Bh biBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdl aWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+QXM8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2Zv bnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsg Y29sb3I6d2hpdGUnPnRoPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpj b3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOndoaXRl Jz5tYTwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7 IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xvcjp3aGl0ZSc+PGZvbnQgY29s b3I9JyM5OTAwMDAnPmg8L2ZvbnQ+JmFtcDs8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2Zv bnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsg Y29sb3I6d2hpdGUnPjxmb250IGNvbG9yPScjOTkwMDAwJz5oPC9mb250PkE8L3NwYW4+PC90ZD48 dGQ+PHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTNwdDsg Zm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6d2hpdGUnPmxsPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0 eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0 OmJvbGQ7IGNvbG9yOndoaXRlJz5lcjwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nZm9udC1m YW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6ZToxM3B0OyBmb250LXdlaWdodDpib2xkOyBjb2xv cjp3aGl0ZSc+Z3k8L3NwYW4+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPgo8dHI+PHRkIGFs aWduPSdjZW50ZXInIHN0eWxlPSdwYWRkaW5nLXRvcDogN3B0Oyc+Cgo8dGFibGUgY2VsbHBhZGRp bmc9JzAnIGJvcmRlcj0wIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzEwMCc+ Cjx0Ym9keT4KPHRyPjx0ZCB3aWR0aD0nMTU1JyBoZWlnaHQ9MjEgc3R5bGU9J3RleHQtYWxpZ246 bGVmdDsnPgo8dGFibGUgYm9yZGVyPScwJyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAn IGhlaWdodD0nMjAnPgo8dGJvZHk+Cjx0cj48dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hh cmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1s P2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxp bmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBj b2xvcjpibGFjazsnPkFkPGJyPkZsPGJyPlNlPGJyPlZlPGJyPk5hPGJyPjwvYT48L3RkPg0KPHRk PjxhIGhyZWY9J2h0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5nLnplbi5jby51ay9kb2N1bWVu dHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JyBzdHlsZT0nZm9udC1mYW1pbHk6Y291 cmllciBuZXc7IGZvbnQtc2l6ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpi b2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6YmxhY2s7Jz52YTxicj5vdjxicj5yZTxi cj5udDxicj5zbzxicj48L2E+PC90ZD4NCjx0ZD48YSBocmVmPSdodHRwOi8vcGFuZG9yYS5zaGFy ZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3YWIwLmh0bWw/ aWQ9Nicgc3R5bGU9J2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGlu ZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNv bG9yOmJsYWNrOyc+aXI8YnI+ZW48YnI+dmU8YnI+b2w8YnI+bmU8YnI+PC9hPjwvdGQ+DQo8dGQ+ PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50 cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3Vy aWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJv bGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj50 Jm5ic3A7PGJyPm50PGJyPmluPGJyPngmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0n aHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZp Y2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsg Zm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQt ZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJz cDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9h PjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNv LnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250 LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZv bnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNw OyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxi cj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEu c2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5o dG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7 IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25l OyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5i c3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQ+PGEg aHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3RpbmcuemVuLmNvLnVrL2RvY3VtZW50cy9z cGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVy IG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7 IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsnPiZuYnNwOyZuYnNwOzxicj4mbmJz cDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8 YnI+PC9hPjwvdGQ+DQo8dGQ+PGEgaHJlZj0naHR0cDovL3BhbmRvcmEuc2hhcmVkLmhvc3Rpbmcu emVuLmNvLnVrL2RvY3VtZW50cy9zcGVjaWZpY2F0aW9ucy9hN2FiMC5odG1sP2lkPTYnIHN0eWxl PSdmb250LWZhbWlseTpjb3VyaWVyIG5ldzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAx LjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjpibGFjazsn PiZuYnNwOyZuYnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+Jm5ic3A7Jm5ic3A7PGJyPiZuYnNwOyZu YnNwOzxicj4mbmJzcDsmbmJzcDs8YnI+PC9hPjwvdGQ+DQo8dGQgc3R5bGU9J2ZvbnQtZmFtaWx5 OmNvdXJpZXIgbmV3OyBmb250LXNpemU6MTFwdDsgbGluZS1oZWlnaHQ6IDEuMjsgZm9udC13ZWln aHQ6Ym9sZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6YmxhY2s7Jz4kMjxicj4kMTxicj4k MTxicj4kMTxicj4kMTxicj48L3RkPg0KPHRkIHN0eWxlPSdmb250LWZhbWlseTpjb3VyaWVyIG5l dzsgZm9udC1zaXplOjExcHQ7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRl eHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOmJsYWNrOyc+NC48YnI+OS48YnI+OC48YnI+NS48YnI+ Ny48YnI+PC90ZD4NCjx0ZCBzdHlsZT0nZm9udC1mYW1pbHk6Y291cmllciBuZXc7IGZvbnQtc2l6 ZToxMXB0OyBsaW5lLWhlaWdodDogMS4yOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRp b246bm9uZTtjb2xvcjpibGFjazsnPjk1PGJyPjk1PGJyPjk1PGJyPjk1PGJyPjk5PGJyPjwvdGQ+ DQo8L3RyPjwvdGJvZHk+PC90YWJsZT4KPC90Ym9keT4KPC90YWJsZT4KCjwvdGQ+PC90cj4KPHRy Pjx0ZCBoZWlnaHQ9MjQgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBocmVmPSdodHRwOi8vcGFu ZG9yYS5zaGFyZWQuaG9zdGluZy56ZW4uY28udWsvZG9jdW1lbnRzL3NwZWNpZmljYXRpb25zL2E3 YWIwLmh0bWw/aWQ9Nicgc3R5bGU9J3RleHQtZGVjb3JhdGlvbjpub25lJz48Zm9udCBzdHlsZT0n cGFkZGluZy1yaWdodDogN3B0O2ZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3O2ZvbnQtc2l6ZToxMXB0 OycgY29sb3I9J2JsYWNrJz4oMzIrKSBTZWUgbW9yZS4uLjwvZm9udD48L2E+PC90ZD48L3RyPgo8 L3Rib2R5Pgo8L3RhYmxlPgo8L3RkPjwvdHI+PHRyPjx0ZCBoZWlnaHQ9Nz48L3RkPjwvdHI+Cjx0 cj48dGQgY29sc3Bhbj0yIHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDEwcHg7cGFkZGluZy1yaWdodDog MTBweDsnIGFsaWduPSdyaWdodCcgYmdjb2xvcj0nd2hpdGUnIGhlaWdodD0nMjAnIHdpZHRoPSc1 NTAnPgo8Zm9udCBzdHlsZT0nZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6Y291cmllciBuZXc7 Zm9udC13ZWlnaHQ6Ym9sZDsnPjxhIGhyZWY9Imh0dHA6Ly9wYW5kb3JhLnNoYXJlZC5ob3N0aW5n Lnplbi5jby51ay9kb2N1bWVudHMvc3BlY2lmaWNhdGlvbnMvYTdhYjAuaHRtbD9pZD02JmFjdD1V bnN1YnNjcmliZSI+VW5zdWJzY3JpYmU8L2ZvbnQ+PC9hPgo8L3RkPjwvdHI+CjwvdGJvZHk+Cjwv dGFibGU+CjwvRk9OVD48L0RJVj48L0JPRFk+PC9IVE1MPg0K ------=_NextPart_000_A793_76A.066-- From glommer@parallels.com Wed Jan 16 13:21:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6FF957F4A for ; Wed, 16 Jan 2013 13:21:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4DE7530406B for ; Wed, 16 Jan 2013 11:21:26 -0800 (PST) X-ASG-Debug-ID: 1358364084-04cbb01329bb1a0001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id wOEWLbGKRETnJGAs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Jan 2013 11:21:25 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TvYY8-00082g-9h; Wed, 16 Jan 2013 14:21:24 -0500 Received: from straightjacket.localdomain (216.239.55.193) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Wed, 16 Jan 2013 11:21:23 -0800 Message-ID: <50F6FDC8.5020909@parallels.com> Date: Wed, 16 Jan 2013 11:21:44 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <1354058086-27937-10-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.193] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358364085 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-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.2.120044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/27/2012 03:14 PM, Dave Chinner wrote: > From: Dave Chinner > > Now that we have an LRU list API, we can start to enhance the > implementation. This splits the single LRU list into per-node lists > and locks to enhance scalability. Items are placed on lists > according to the node the memory belongs to. To make scanning the > lists efficient, also track whether the per-node lists have entries > in them in a active nodemask. > > Signed-off-by: Dave Chinner > --- > include/linux/list_lru.h | 14 ++-- > lib/list_lru.c | 160 +++++++++++++++++++++++++++++++++++----------- > 2 files changed, 129 insertions(+), 45 deletions(-) > > diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h > index 3423949..b0e3ba2 100644 > --- a/include/linux/list_lru.h > +++ b/include/linux/list_lru.h > @@ -8,21 +8,23 @@ > #define _LRU_LIST_H 0 > > #include > +#include > > -struct list_lru { > +struct list_lru_node { > spinlock_t lock; > struct list_head list; > long nr_items; > +} ____cacheline_aligned_in_smp; > + > +struct list_lru { > + struct list_lru_node node[MAX_NUMNODES]; > + nodemask_t active_nodes; > }; > MAX_NUMNODES will default to 1 << 9, if I'm not mistaken. Your list_lru_node seems to be around 32 bytes on 64-bit systems (128 with debug). So we're talking about 16k per lru. The superblocks only, are present by the dozens even in a small system, and I believe the whole goal of this API is to get more users to switch to it. This can easily use up a respectable bunch of megs. Isn't it a bit too much ? I am wondering if we can't do better in here and at least allocate+grow according to the actual number of nodes. From bpm@oss.sgi.com Wed Jan 16 16:50:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id DBEB27F4E; Wed, 16 Jan 2013 16:50:43 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v3.8-rc1-6-g37f1356 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: f9668a09e32ac6d2aa22f44cc310e430a8f4a40f X-Git-Newrev: 37f13561de6039b3a916d1510086030d097dea0f Message-Id: <20130116225043.DBEB27F4E@oss.sgi.com> Date: Wed, 16 Jan 2013 16:50:43 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 37f1356 xfs: recalculate leaf entry pointer after compacting a dir2 block ab7eac2 xfs: remove int casts from debug dquot soft limit timer asserts 91e4bac xfs: fix the multi-segment log buffer format 2d0e9df xfs: fix segment in xfs_buf_item_format_segment 0f22f9d xfs: rename bli_format to avoid confusion with bli_formats d44d9bc xfs: use b_maps[] for discontiguous buffers d69043c xfs: drop buffer io reference when a bad bio is built 3daed8b xfs: fix broken error handling in xfs_vm_writepage 42e2976 xfs: fix attr tree double split corruption 6ce377a xfs: fix reading of wrapped log data 03b1293 xfs: fix buffer shudown reference count mismatch 4b62acf xfs: don't vmap inode cluster buffers during free ca250b1 xfs: invalidate allocbt blocks moved to the free list 1e7acbb xfs: silence uninitialised f.file warning. eaef854 xfs: growfs: don't read garbage for new secondary superblocks 1f3c785 xfs: move allocation stack switch up to xfs_bmapi_allocate 326c035 xfs: introduce XFS_BMAPI_STACK_SWITCH 408cc4e xfs: zero allocation_args on the kernel stack 7e9620f xfs: only update the last_sync_lsn when a transaction completes from f9668a09e32ac6d2aa22f44cc310e430a8f4a40f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 37f13561de6039b3a916d1510086030d097dea0f Author: Eric Sandeen Date: Thu Jan 10 10:41:48 2013 -0600 xfs: recalculate leaf entry pointer after compacting a dir2 block Dave Jones hit this assert when doing a compile on recent git, with CONFIG_XFS_DEBUG enabled: XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828 Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup) contained "2" and not the proper offset, and I found that this value was changed after the memmoves under "Use a stale leaf for our new entry." in xfs_dir2_block_addname(), i.e. memmove(&blp[mid + 1], &blp[mid], (highstale - mid) * sizeof(*blp)); overwrote it. What has happened is that the previous call to xfs_dir2_block_compact() has rearranged things; it changes btp->count as well as the blp array. So after we make that call, we must recalculate the proper pointer to the leaf entries by making another call to xfs_dir2_block_leaf_p(). Dave provided a metadump image which led to a simple reproducer (create a particular filename in the affected directory) and this resolves the testcase as well as the bug on his live system. Thanks also to dchinner for looking at this one with me. Signed-off-by: Eric Sandeen Tested-by: Dave Jones Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit ab7eac22008f044631c0a3f4be344ebc2cb0e266 Author: Brian Foster Date: Fri Dec 21 10:45:17 2012 -0500 xfs: remove int casts from debug dquot soft limit timer asserts The int casts here make it easy to trigger an assert with a large soft limit. For example, set a >4TB soft limit on an empty volume to reproduce a (0 > -x) comparison due to an overflow of d_blk_softlimit. Signed-off-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 91e4bac0b72736410c88632906953f14259144b1 Author: Mark Tinguely Date: Tue Dec 4 17:18:05 2012 -0600 xfs: fix the multi-segment log buffer format Per Dave Chinner suggestion, this patch: 1) Corrects the detection of whether a multi-segment buffer is still tracking data. 2) Clears all the buffer log formats for a multi-segment buffer. Signed-off-by: Mark Tinguely Reviewed-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit 2d0e9df579029b62adc72b50977182757cc04cd5 Author: Mark Tinguely Date: Tue Dec 4 17:18:04 2012 -0600 xfs: fix segment in xfs_buf_item_format_segment Not every segment in a multi-segment buffer is dirty in a transaction and they will not be outputted. The assert in xfs_buf_item_format_segment() that checks for the at least one chunk of data in the segment to be used is not necessary true for multi-segmented buffers. Signed-off-by: Mark Tinguely Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit 0f22f9d0cd8a630b40a9ccc07a8844345b185aae Author: Mark Tinguely Date: Tue Dec 4 17:18:03 2012 -0600 xfs: rename bli_format to avoid confusion with bli_formats Rename the bli_format structure to __bli_format to avoid accidently confusing them with the bli_formats pointer. Signed-off-by: Mark Tinguely Reviewed-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit d44d9bc68e32ad5881b105f82bd259d261d1ef74 Author: Mark Tinguely Date: Tue Dec 4 17:18:02 2012 -0600 xfs: use b_maps[] for discontiguous buffers Commits starting at 77c1a08 introduced a multiple segment support to xfs_buf. xfs_trans_buf_item_match() could not find a multi-segment buffer in the transaction because it was looking at the single segment block number rather than the multi-segment b_maps[0].bm.bn. This results on a recursive buffer lock that can never be satisfied. This patch: 1) Changed the remaining b_map accesses to be b_maps[0] accesses. 2) Renames the single segment b_map structure to __b_map to avoid future confusion. Signed-off-by: Mark Tinguely Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_buf.c | 12 ++++++------ fs/xfs/xfs_buf.h | 6 +++--- fs/xfs/xfs_buf_item.c | 49 ++++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_dir2_block.c | 6 ++++-- fs/xfs/xfs_qm_syscalls.c | 4 ++-- fs/xfs/xfs_trans_buf.c | 27 ++++++++++++++------------ 7 files changed, 64 insertions(+), 42 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Wed Jan 16 16:55:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 072027F4F for ; Wed, 16 Jan 2013 16:55:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CFE3230406B for ; Wed, 16 Jan 2013 14:55:26 -0800 (PST) X-ASG-Debug-ID: 1358376924-04bdf04a58ca270001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 1UIwVH1aXENPgToZ for ; Wed, 16 Jan 2013 14:55:24 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AswbANgu91B5LIZq/2dsb2JhbABEt2mFDQKBBxdzgh4BAQQBOhwjBQsIAw4HAwklDwUlAyETG4d4BbkiFYxgY4J/YQOWC4lOhnyDCQ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Jan 2013 09:25:23 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvbtC-0006ey-0L; Thu, 17 Jan 2013 09:55:22 +1100 Date: Thu, 17 Jan 2013 09:55:21 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130116225521.GF2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F6FDC8.5020909@parallels.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358376924 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.120058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 16, 2013 at 11:21:44AM -0800, Glauber Costa wrote: > On 11/27/2012 03:14 PM, Dave Chinner wrote: > > From: Dave Chinner > > > > Now that we have an LRU list API, we can start to enhance the > > implementation. This splits the single LRU list into per-node lists > > and locks to enhance scalability. Items are placed on lists > > according to the node the memory belongs to. To make scanning the > > lists efficient, also track whether the per-node lists have entries > > in them in a active nodemask. > > > > Signed-off-by: Dave Chinner > > --- > > include/linux/list_lru.h | 14 ++-- > > lib/list_lru.c | 160 +++++++++++++++++++++++++++++++++++----------- > > 2 files changed, 129 insertions(+), 45 deletions(-) > > > > diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h > > index 3423949..b0e3ba2 100644 > > --- a/include/linux/list_lru.h > > +++ b/include/linux/list_lru.h > > @@ -8,21 +8,23 @@ > > #define _LRU_LIST_H 0 > > > > #include > > +#include > > > > -struct list_lru { > > +struct list_lru_node { > > spinlock_t lock; > > struct list_head list; > > long nr_items; > > +} ____cacheline_aligned_in_smp; > > + > > +struct list_lru { > > + struct list_lru_node node[MAX_NUMNODES]; > > + nodemask_t active_nodes; > > }; > > > MAX_NUMNODES will default to 1 << 9, if I'm not mistaken. Your > list_lru_node seems to be around 32 bytes on 64-bit systems (128 with > debug). So we're talking about 16k per lru. *nod* It is relatively little compared to the number of inodes typically on a LRU. > The superblocks only, are present by the dozens even in a small system, > and I believe the whole goal of this API is to get more users to switch > to it. This can easily use up a respectable bunch of megs. > > Isn't it a bit too much ? Maybe, but for active superblocks it only takes a handful of cached inodes to make this 16k look like noise, so I didn't care. Indeed, a typical active filesystem could be consuming gigabytes of memory in the slab, so 16k is a tiny amount of overhead to track this amount of memory more efficiently. Most other LRU/shrinkers are tracking large objects and only have a single LRU instance machine wide. Hence the numbers arguments don't play out well in favour of a more complex, dynamic solution for them, either. Sometimes dumb and simple is the best approach ;) > I am wondering if we can't do better in here and at least allocate+grow > according to the actual number of nodes. We could add hotplug notifiers and grow/shrink the node array as they get hot plugged, but that seems unnecessarily complex given how rare such operations are. If superblock proliferation is the main concern here, then doing somethign as simple as allowing filesystems to specify they want numa aware LRU lists via a mount_bdev() flag would solve this problem. If the flag is set, then full numa lists are created. Otherwise the LRU list simply has a "single node" and collapses all node IDs down to 0 and ignores all NUMA optimisations... That way the low item count virtual filesystems like proc, sys, hugetlbfs, etc won't use up memory, but filesytems that actually make use of NUMA awareness still get the more expensive, scalable implementation. Indeed, any subsystem that is not performance or location sensitive can use the simple single list version, so we can avoid overhead in that manner system wide... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Wed Jan 16 17:16:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 4ECD57F51 for ; Wed, 16 Jan 2013 17:16:03 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D99A304064; Wed, 16 Jan 2013 15:16:03 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id BFAEB4266DC; Wed, 16 Jan 2013 17:16:02 -0600 (CST) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 3.8-rc4 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20130116231602.BFAEB4266DC@whiskey.americas.sgi.com> Date: Wed, 16 Jan 2013 17:16:02 -0600 (CST) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these fixes for XFS. There are fixes for compound buffers, a fix for quotas, and a fix for dirv2 corruption introduced in the 3.8 merge window. Thanks, Ben The following changes since commit a49f0d1ea3ec94fc7cf33a7c36a16343b74bd565: Linux 3.8-rc1 (2012-12-21 17:19:00 -0800) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/for-linus-v3.8-rc4 for you to fetch changes up to 37f13561de6039b3a916d1510086030d097dea0f: xfs: recalculate leaf entry pointer after compacting a dir2 block (2013-01-16 16:08:55 -0600) ---------------------------------------------------------------- xfs: bugfixes for 3.8-rc4 - fix(es) for compound buffers - fix for dquot soft timer asserts due to overflow of d_blk_softlimit - fix for regression in dir v2 code introduced in commit 20f7e9f3 ---------------------------------------------------------------- Brian Foster (1): xfs: remove int casts from debug dquot soft limit timer asserts Eric Sandeen (1): xfs: recalculate leaf entry pointer after compacting a dir2 block Mark Tinguely (4): xfs: use b_maps[] for discontiguous buffers xfs: rename bli_format to avoid confusion with bli_formats xfs: fix segment in xfs_buf_item_format_segment xfs: fix the multi-segment log buffer format fs/xfs/xfs_buf.c | 12 ++++++------ fs/xfs/xfs_buf.h | 6 +++--- fs/xfs/xfs_buf_item.c | 49 ++++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_dir2_block.c | 6 ++++-- fs/xfs/xfs_qm_syscalls.c | 4 ++-- fs/xfs/xfs_trans_buf.c | 27 ++++++++++++++------------ 7 files changed, 64 insertions(+), 42 deletions(-) From sandeen@sandeen.net Wed Jan 16 17:18:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1F0F57F53 for ; Wed, 16 Jan 2013 17:18:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DCDBAC003 for ; Wed, 16 Jan 2013 15:18:06 -0800 (PST) X-ASG-Debug-ID: 1358378285-04bdf04a58cb1f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LlIAe8cLCgQVL1k3 for ; Wed, 16 Jan 2013 15:18:05 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 25B1C60299E2; Wed, 16 Jan 2013 17:18:05 -0600 (CST) Message-ID: <50F7352C.1090304@sandeen.net> Date: Wed, 16 Jan 2013 17:18:04 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs-oss Subject: Re: [PATCH V2] xfsprogs: document all commands in xfs_io References: <50C39123.6050303@sandeen.net> <50C3A936.1050805@sandeen.net> <50F4174A.3090709@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfsprogs: document all commands in xfs_io In-Reply-To: <50F4174A.3090709@sgi.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1358378285 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.120058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/14/13 8:33 AM, Mark Tinguely wrote: > On 12/08/12 14:55, Eric Sandeen wrote: >> Add missing command documentation to xfs_io(8) manpage. >> fiemap, fpunch, chproj, lsproj, and setfl are all missing. >> >> setfl seems to not work today in any case, and nothing >> in xfstests uses it; I will send another patch to simply >> remove it from xfs_io, as I don't think it's terribly useful, >> and hasn't worked forever anyway. >> >> Also fix references to the fallocate manpage, which is (now?) >> in section 2, not section 3 of the man pages. (Since it's >> a syscall, not a library function). >> >> Signed-off-by: Eric Sandeen >> --- >> > > Looks good. Committed to xfsprogs as 83c324 Thanks. Any plans to merge the other 3? [PATCH] xfsprogs: remove setfl from xfs_io [PATCH] xfsprogs: document fpunch command in xfs_io [PATCH] xfstests: ensure all xfs_io commands are documented in the manpage > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Wed Jan 16 17:27:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 9B6CA7F55 for ; Wed, 16 Jan 2013 17:27:48 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F7168F8037; Wed, 16 Jan 2013 15:27:45 -0800 (PST) Message-ID: <50F73772.9080804@sgi.com> Date: Wed, 16 Jan 2013 17:27:46 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH V2] xfsprogs: document all commands in xfs_io References: <50C39123.6050303@sandeen.net> <50C3A936.1050805@sandeen.net> <50F4174A.3090709@sgi.com> <50F7352C.1090304@sandeen.net> In-Reply-To: <50F7352C.1090304@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/16/13 17:18, Eric Sandeen wrote: > On 1/14/13 8:33 AM, Mark Tinguely wrote: >> On 12/08/12 14:55, Eric Sandeen wrote: >>> Add missing command documentation to xfs_io(8) manpage. >>> fiemap, fpunch, chproj, lsproj, and setfl are all missing. >>> >>> setfl seems to not work today in any case, and nothing >>> in xfstests uses it; I will send another patch to simply >>> remove it from xfs_io, as I don't think it's terribly useful, >>> and hasn't worked forever anyway. >>> >>> Also fix references to the fallocate manpage, which is (now?) >>> in section 2, not section 3 of the man pages. (Since it's >>> a syscall, not a library function). >>> >>> Signed-off-by: Eric Sandeen >>> --- >>> >> >> Looks good. Committed to xfsprogs as 83c324 > > Thanks. Any plans to merge the other 3? > > [PATCH] xfsprogs: remove setfl from xfs_io ^^^ have this ready to commit, just holding my breath in case someone wanted to have it fixed rather than removed. > [PATCH] xfsprogs: document fpunch command in xfs_io ^^^ Turns out to be superseded by the above patch. > [PATCH] xfstests: ensure all xfs_io commands are documented in the manpage ^^^ This one is ready, waiting for the setfl feature removal. If I don't hear anything overnight, I will remove the setfl feature and commit the new test. --Mark. From bpm@oss.sgi.com Wed Jan 16 17:36:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id C347C7F58; Wed, 16 Jan 2013 17:36:49 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-11-gaeb4f20 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a17164e54bf0e3c2cbc72c35b9f67c2873a122dd X-Git-Newrev: aeb4f20a02b4c984c48995ad54f40caf5ffa0705 Message-Id: <20130116233649.C347C7F58@oss.sgi.com> Date: Wed, 16 Jan 2013 17:36:49 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated aeb4f20 xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic from a17164e54bf0e3c2cbc72c35b9f67c2873a122dd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aeb4f20a02b4c984c48995ad54f40caf5ffa0705 Author: Eric Sandeen Date: Wed Jan 16 17:33:53 2013 -0600 xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic 9802182 changed the return value from EWRONGFS (aka EINVAL) to EFSCORRUPTED which doesn't seem to be handled properly by the root filesystem probe. Signed-off-by: Eric Sandeen Tested-by: Sergei Trofimovich Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_mount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Wed Jan 16 17:37:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id F39A47F5D; Wed, 16 Jan 2013 17:37:04 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-11-gaeb4f20 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: a17164e54bf0e3c2cbc72c35b9f67c2873a122dd X-Git-Newrev: aeb4f20a02b4c984c48995ad54f40caf5ffa0705 Message-Id: <20130116233704.F39A47F5D@oss.sgi.com> Date: Wed, 16 Jan 2013 17:37:04 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated aeb4f20 xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic from a17164e54bf0e3c2cbc72c35b9f67c2873a122dd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aeb4f20a02b4c984c48995ad54f40caf5ffa0705 Author: Eric Sandeen Date: Wed Jan 16 17:33:53 2013 -0600 xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic 9802182 changed the return value from EWRONGFS (aka EINVAL) to EFSCORRUPTED which doesn't seem to be handled properly by the root filesystem probe. Signed-off-by: Eric Sandeen Tested-by: Sergei Trofimovich Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_mount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Wed Jan 16 17:39:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 3EAF97F5A for ; Wed, 16 Jan 2013 17:39:06 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 799A8AC003; Wed, 16 Jan 2013 15:39:05 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id EC01D4266DC; Wed, 16 Jan 2013 17:39:04 -0600 (CST) Date: Wed, 16 Jan 2013 17:39:04 -0600 From: Ben Myers To: Eric Sandeen Cc: Sergei Trofimovich , Alex Elder , Phil White , xfs@oss.sgi.com, Dave Chinner Subject: Re: [bisected] xfs panics when attempting to mount btrfs Message-ID: <20130116233904.GE27055@sgi.com> References: <20121229135229.4ea4615a@st.vba.domain> <50DF508D.2010105@sandeen.net> <20121230015109.1219d01f@sf> <50DF7CD1.90205@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50DF7CD1.90205@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Sat, Dec 29, 2012 at 05:29:21PM -0600, Eric Sandeen wrote: > From: Eric Sandeen > > Do not return EFSCORRUPTED when filesystem probe finds no XFS magic > > 9802182 changed the return value from EWRONGFS (aka EINVAL) > to EFSCORRUPTED which doesn't seem to be handled properly by > the root filesystem probe. > > Signed-off-by: Eric Sandeen > - --- > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index da50846..7d6df7c 100644 > - --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -658,7 +658,7 @@ xfs_sb_quiet_read_verify( > return; > } > /* quietly fail */ > - - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_buf_ioerror(bp, EWRONGFS); > } > > static void Applied. Thanks, Ben From choiys@uos.ac.kr Wed Jan 16 18:01:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=HTML_IMAGE_ONLY_08, HTML_MESSAGE,T_REMOTE_IMAGE 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 5BF427F5F for ; Wed, 16 Jan 2013 18:01:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F7A1304064 for ; Wed, 16 Jan 2013 16:01:40 -0800 (PST) X-ASG-Debug-ID: 1358380896-04bdf04a5bcd3e0001-NocioJ Received: from mail.uos.ac.kr (pop.uos.ac.kr [203.249.96.33]) by cuda.sgi.com with ESMTP id W8Z5rWMvzcUqoc1N for ; Wed, 16 Jan 2013 16:01:38 -0800 (PST) X-Barracuda-Envelope-From: choiys@uos.ac.kr X-Barracuda-Apparent-Source-IP: 203.249.96.33 Received: from uos.ac.kr (127.0.0.1) by uos.ac.kr with ESMTP imoxion SensMail SmtpServer 7.0 id <50f7416c3fe3df887b769382> for from ; Thu, 17 Jan 2013 09:10:18 +0900 Date: Thu, 17 Jan 2013 09:10:19 +0900 (KST) From: =?UTF-8?B?7LWc7Jyk7IiY?= To: info@mail.org Message-ID: <50f7436a3fe6_@_imoxion.com> Subject: =?UTF-8?B?VXBncmFkZQ==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?UTF-8?B?VXBncmFkZQ==?= Content-Type: multipart/alternative; boundary="----=_Part_93620_1329546494.1358381419274" X-Priority: 3 X-Sensmail-Info: uos.ac.kr;50f7435d3fe5c0be1368fc0c X-Sensmail-Rcptkey: 50f743693fe88ca1a1fcf4d6 X-ClientIP: 116.203.237.147 X-Barracuda-Connect: pop.uos.ac.kr[203.249.96.33] X-Barracuda-Start-Time: 1358380898 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.78 X-Barracuda-Spam-Status: No, SCORE=1.78 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_IMAGE_ONLY_08, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120062 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.78 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_93620_1329546494.1358381419274 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Y2xpY2sgaGVyZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldC92aWV3Zm9ybT9m b3Jta2V5PWRHMDNXWE5SZFZRMVN6SkRVa1pSY1hWaWNXVlJibWM2TVENCg0KDQo= ------=_Part_93620_1329546494.1358381419274 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjxsaW5rIGhyZWY9J2h0dHA6Ly9tYWlsLnVvcy5hYy5r ci9zZW5zLXN0YXRpYy9jc3MvbWFpbC9tYWlsX3ZpZXdfZW4uY3NzJyByZWw9J3N0eWxlc2hlZXQn IHR5cGU9J3RleHQvY3NzJz48dGFibGUgd2lkdGg9OTklIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7 Jz48dHIgdmFsaWduPXRvcD48dGQgc3R5bGU9ImZvbnQtc2l6ZToxMHB0Ij4NCjx0YWJsZSB3aWR0 aD0iOTklIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1mYW1pbHk6IEd1bGltLCBBcmlhbCwg VGFob21hLCAnTVMgUEdvdGhpYyc7Ij48dGJvZHk+PHRyIHZhbGlnbj0idG9wIj48dGQgc3R5bGU9 ImZvbnQtZmFtaWx5OiBHdWxpbSwgQXJpYWwsIFRhaG9tYSwgJ01TIFBHb3RoaWMnICFpbXBvcnRh bnQ7Ij48c3BhbiBzaXplPSIyIiA+Y2xpY2sgaGVyZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9z cHJlYWRzaGVldC92aWV3Zm9ybT9mb3Jta2V5PWRHMDNXWE5SZFZRMVN6SkRVa1pSY1hWaWNXVlJi bWM2TVE8YnI+PGJyPjwvc3Bhbj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxwPjxiciBtY2Vf Ym9ndXM9IjEiPjwvcD48L3RkPjwvdHI+PC90YWJsZT48L2JvZHk+PC9odG1sPg0KDQo8aW1nIGlk PSdtYWlsZXhwJyB3aWR0aD0wIGhlaWdoPTAgYm9yZGVyPTAgc3JjPSdodHRwOi8vbWFpbC51b3Mu YWMua3IvTWFpbD9hY3Q9UkVDRUlQVF9DSEVDSyZ1a2V5PTUwZjc0MzY5M2ZlODhjYTFhMWZjZjRk NiZ1c2VyaWQ9Y2hvaXlzJm1ob3N0PXVvcy5hYy5rciZhaG9zdD1kMDAwMSc+PC9ib2R5PjwvaHRt bD4= ------=_Part_93620_1329546494.1358381419274-- From glommer@parallels.com Wed Jan 16 18:35:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F00E17F63 for ; Wed, 16 Jan 2013 18:35:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6CA5CAC003 for ; Wed, 16 Jan 2013 16:35:27 -0800 (PST) X-ASG-Debug-ID: 1358382925-04cbb01328ca600001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id SMM8Gz0DLfzfvej6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Jan 2013 16:35:26 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TvdS0-0004AU-NI; Wed, 16 Jan 2013 19:35:24 -0500 Received: from straightjacket.localdomain (216.239.55.193) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Wed, 16 Jan 2013 16:35:23 -0800 Message-ID: <50F7475F.90609@parallels.com> Date: Wed, 16 Jan 2013 16:35:43 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130116225521.GF2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.193] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358382925 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-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.2.120064 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >> The superblocks only, are present by the dozens even in a small system, >> and I believe the whole goal of this API is to get more users to switch >> to it. This can easily use up a respectable bunch of megs. >> >> Isn't it a bit too much ? > > Maybe, but for active superblocks it only takes a handful of cached > inodes to make this 16k look like noise, so I didn't care. Indeed, a > typical active filesystem could be consuming gigabytes of memory in > the slab, so 16k is a tiny amount of overhead to track this amount > of memory more efficiently. > > Most other LRU/shrinkers are tracking large objects and only have a > single LRU instance machine wide. Hence the numbers arguments don't > play out well in favour of a more complex, dynamic solution for > them, either. Sometimes dumb and simple is the best approach ;) > Being dumb and simple myself, I'm of course forced to agree. Let me give you more context so you can understand my deepest fears better: >> I am wondering if we can't do better in here and at least allocate+grow >> according to the actual number of nodes. > > We could add hotplug notifiers and grow/shrink the node array as > they get hot plugged, but that seems unnecessarily complex given > how rare such operations are. > > If superblock proliferation is the main concern here, then doing > somethign as simple as allowing filesystems to specify they want > numa aware LRU lists via a mount_bdev() flag would solve this > problem. If the flag is set, then full numa lists are created. > Otherwise the LRU list simply has a "single node" and collapses all node > IDs down to 0 and ignores all NUMA optimisations... > > That way the low item count virtual filesystems like proc, sys, > hugetlbfs, etc won't use up memory, but filesytems that actually > make use of NUMA awareness still get the more expensive, scalable > implementation. Indeed, any subsystem that is not performance or > location sensitive can use the simple single list version, so we can > avoid overhead in that manner system wide... > Deepest fears: 1) snakes. 2) It won't surprise you to know that I am adapting your work, which provides a very sane and helpful API, to memcg shrinking. The dumb and simple approach in there is to copy all lrus that are marked memcg aware at memcg creation time. The API is kept the same, but when you do something like list_lru_add(lru, obj), for instance, we derive the memcg context from obj and relay it to the right list. Statically allocating those arrays for all possible combinations is basically our way to guarantee that the lookups will be cheap. Otherwise, we always need to ask the question: "is dentries from this superblock currently billed to this memcg?", and if yes, allocate memory in list_lru_add or other steady state operations. But of course, if we copy all the per node stuff as well, we are basically talking about that amount of memory per memcg, which means each memcg will now have an extra overhead of some megs, which is way too big. Using online nodes+grow was one of the approaches we considered. Making the memcg list single-noded while keeping the global lists node-aware also works for us. Your current suggestion of going per-node only in the performance critical filesystems could also possibly work, provided this count is expected to be small. From david@fromorbit.com Wed Jan 16 22:22:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D35B77F6C for ; Wed, 16 Jan 2013 22:22:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C388230405F for ; Wed, 16 Jan 2013 20:22:50 -0800 (PST) X-ASG-Debug-ID: 1358396568-04cb6c0237cf800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9ZzhP7yYee4BiSmZ for ; Wed, 16 Jan 2013 20:22:48 -0800 (PST) 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: AksNAKx791B5LIZq/2dsb2JhbABEhVWyGYYXF3OCHgEBBAE6HCMFCwgDDgoJJQ8FJQMhExuHeAW5NRWRIwOWC4lOhnyDCQ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Jan 2013 14:52:47 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tvh01-0007Js-Aj; Thu, 17 Jan 2013 15:22:45 +1100 Date: Thu, 17 Jan 2013 15:22:45 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130117042245.GG2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F7475F.90609@parallels.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: 1358396568 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.120078 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 16, 2013 at 04:35:43PM -0800, Glauber Costa wrote: > > >> The superblocks only, are present by the dozens even in a small system, > >> and I believe the whole goal of this API is to get more users to switch > >> to it. This can easily use up a respectable bunch of megs. > >> > >> Isn't it a bit too much ? > > > > Maybe, but for active superblocks it only takes a handful of cached > > inodes to make this 16k look like noise, so I didn't care. Indeed, a > > typical active filesystem could be consuming gigabytes of memory in > > the slab, so 16k is a tiny amount of overhead to track this amount > > of memory more efficiently. > > > > Most other LRU/shrinkers are tracking large objects and only have a > > single LRU instance machine wide. Hence the numbers arguments don't > > play out well in favour of a more complex, dynamic solution for > > them, either. Sometimes dumb and simple is the best approach ;) > > > > Being dumb and simple myself, I'm of course forced to agree. :) > Let me give you more context so you can understand my deepest fears better: > > >> I am wondering if we can't do better in here and at least allocate+grow > >> according to the actual number of nodes. > > > > We could add hotplug notifiers and grow/shrink the node array as > > they get hot plugged, but that seems unnecessarily complex given > > how rare such operations are. > > > > If superblock proliferation is the main concern here, then doing > > somethign as simple as allowing filesystems to specify they want > > numa aware LRU lists via a mount_bdev() flag would solve this > > problem. If the flag is set, then full numa lists are created. > > Otherwise the LRU list simply has a "single node" and collapses all node > > IDs down to 0 and ignores all NUMA optimisations... > > > > That way the low item count virtual filesystems like proc, sys, > > hugetlbfs, etc won't use up memory, but filesytems that actually > > make use of NUMA awareness still get the more expensive, scalable > > implementation. Indeed, any subsystem that is not performance or > > location sensitive can use the simple single list version, so we can > > avoid overhead in that manner system wide... > > > > Deepest fears: > > 1) snakes. Snakes are merely poisonous. Drop Bears are far more dangerous :P > 2) It won't surprise you to know that I am adapting your work, which > provides a very sane and helpful API, to memcg shrinking. > > The dumb and simple approach in there is to copy all lrus that are > marked memcg aware at memcg creation time. The API is kept the same, > but when you do something like list_lru_add(lru, obj), for instance, we > derive the memcg context from obj and relay it to the right list. At which point, you don't want the overhead of per-node lists. The problem I see here is that someone might still need the scalability of the per-node lists. If someone runs a large memcg in terms of CPU and memory, then we most definitely are going to need to retain per-node lists regardless of the fact that the workload is running in a constrained environment. And if you are running a mix of large and small containers, then one static solution is not going to cut it for some workload. This is a problem that superblock contexts don't care about - they are global by their very nature. Hence I'm wondering if trying to fit these two very different behaviours into the one LRU list is the wrong approach. Consider this: these patches give us a generic LRU list structure. It currently uses a list_head in each object for indexing, and we are talking about single LRU lists because of this limitation and trying to build infrastructure that can support this indexing mechanism. I think that all of thses problems go away if we replace the list_head index in the object with a "struct lru_item" index. To start with, it's just a s/list_head/lru_item/ changeover, but from there we can expand. What I'm getting at is that we want to have multiple axis of tracking and reclaim, but we only have a single axis for tracking. If the lru_item grew a second list_head called "memcg_lru", then suddenly the memcg LRUs can be maintained separately to the global (per-superblock) LRU. i.e.: struct lru_item { struct list_head global_list; struct list_head memcg_list; } And then you can use whatever tracking structure you want for a memcg LRU list. Indeed, this would allow per-node lists for the global LRU, and whatever LRU type is appropriate for the memcg using the object (e.g. single list for small memcgs, per-node for large memcgs).... i.e. rather than trying to make the infrastructure jump through hoops to only have one LRU index per object, have a second index that allows memcg's to have a separate LRU index and a method for the global LRU structure to find them. This woul dallow memcg specific shrinker callouts switch to the memcg LRU rather than the global LRU and operate on that. That way we still only instantiate a single LRU/shrinker pair per cache context, but the memcg code doesn't need to duplicate the entire LRU infrastructure into every memcg that contains that type of object for that cache context.... /me stops rambling.... > Your current suggestion of going per-node only in the performance > critical filesystems could also possibly work, provided this count is > expected to be small. The problem is deciding on a per filesystem basis. I was thinking that all filesytsems of a specific type would use a particular type of structure, not that specific instances of a filesystem could use different types.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Thu Jan 17 01:28:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 921B07F6F for ; Thu, 17 Jan 2013 01:28:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 74E678F8039 for ; Wed, 16 Jan 2013 23:28:23 -0800 (PST) X-ASG-Debug-ID: 1358407702-04cbb01328dace0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gU5UppxyPvZHQ4SA for ; Wed, 16 Jan 2013 23:28:22 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0H7SMAu028868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Jan 2013 02:28:22 -0500 Received: from localhost (dhcp12-106.nay.redhat.com [10.66.12.106] (may be forged)) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0H7SJ3g013088; Thu, 17 Jan 2013 02:28:21 -0500 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock Date: Thu, 17 Jan 2013 15:27:49 +0800 X-ASG-Orig-Subj: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock Message-Id: <1358407669-29346-1-git-send-email-eguan@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: 1358407702 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Regression test case for commit: 437a255 xfs: fix direct IO nested transaction deadlock. Signed-off-by: Eryu Guan --- v2: 1. drop generic freeze vs fsstress test, 068 has done this 2. remove unnecessary _scratch_unmount 3. rm $seq.full before _scratch_mkfs_xfs 4. remove unnecessary sleep 5. remove unnecessary output 6. run fixed number(10) of iterations of freeze/thaw cycles 7. remove from dangerous group 293 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 293.out | 3 +++ group | 1 + 3 files changed, 92 insertions(+) create mode 100644 293 create mode 100644 293.out diff --git a/293 b/293 new file mode 100644 index 0000000..33dd500 --- /dev/null +++ b/293 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 293 +# +# Test freeze/unfreeze file system randomly under fsstress +# Regression test for commit: +# 437a255 xfs: fix direct IO nested transaction deadlock. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=eguan@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os IRIX Linux + +_require_scratch +_require_freeze + +rm -f $seq.full +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 +_scratch_mount >/dev/null 2>&1 + +TESTDIR="$SCRATCH_MNT/testdir" +mkdir -p $TESTDIR + +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & + +# Freeze/unfreeze file system randomly +echo "Start freeze/unfreeze randomly" | tee -a $seq.full +LOOP=10 +while [ $LOOP -gt 0 ];do + TIMEOUT=`expr $RANDOM % 5` + sleep $TIMEOUT + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -f $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: freeze filesystem failed" | tee -a $seq.full + fi + TIMEOUT=`expr $RANDOM % 3` + sleep $TIMEOUT + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -u $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: unfreeze filesystem failed" | tee -a $seq.full + fi + ((LOOP--)) +done +echo "Test done" | tee -a $seq.full +killall -q $FSSTRESS_PROG +sync + +_check_scratch_fs +status=0 +exit diff --git a/293.out b/293.out new file mode 100644 index 0000000..29d417a --- /dev/null +++ b/293.out @@ -0,0 +1,3 @@ +QA output created by 293 +Start freeze/unfreeze randomly +Test done diff --git a/group b/group index c32839b..4665f69 100644 --- a/group +++ b/group @@ -411,3 +411,4 @@ deprecated 290 auto rw prealloc quick ioctl 291 repair 292 auto mkfs quick +293 auto freeze -- 1.7.11.7 From liparra@ivic.gob.ve Thu Jan 17 03:09:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-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 2CD4C7F74 for ; Thu, 17 Jan 2013 03:09:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F33EF304064 for ; Thu, 17 Jan 2013 01:09:53 -0800 (PST) X-ASG-Debug-ID: 1358413790-04bdf04a59e4130001-w1Z2WR Received: from mail.ivic.gob.ve (ivic.gob.ve [190.170.128.187]) by cuda.sgi.com with ESMTP id wHRqPwLcXTGShNox for ; Thu, 17 Jan 2013 01:09:51 -0800 (PST) X-Barracuda-Envelope-From: liparra@ivic.gob.ve X-Barracuda-Apparent-Source-IP: 190.170.128.187 Received: from localhost (localhost [127.0.0.1]) by mail.ivic.gob.ve (Postfix) with ESMTP id AF80B2722C5; Thu, 17 Jan 2013 04:30:33 -0430 (VET) X-Virus-Scanned: amavisd-new at ivic.gob.ve Received: from mail.ivic.gob.ve ([127.0.0.1]) by localhost (mail.ivic.gob.ve [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oohJ3VLYztzX; Thu, 17 Jan 2013 04:30:33 -0430 (VET) Received: from mail.ivic.gob.ve (mail.ivic.gob.ve [190.170.128.187]) by mail.ivic.gob.ve (Postfix) with ESMTP id 363842722BA; Thu, 17 Jan 2013 04:30:33 -0430 (VET) Date: Thu, 17 Jan 2013 04:30:33 -0430 (VET) From: "Webmail Administrator " Reply-To: Webmail@mail.ivic.gob.ve, Administrator@mail.ivic.gob.ve Subject: Erneut validieren Ihr Webmail-Konto Message-ID: <5574b3d7-7027-4706-b264-a0f8d3d9e910@mail> X-ASG-Orig-Subj: Erneut validieren Ihr Webmail-Konto Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Originating-IP: [41.190.3.130] X-Mailer: Zimbra 7.1.2_GA_3268 (zclient/7.1.2_GA_3268) To: undisclosed-recipients:; X-Barracuda-Connect: ivic.gob.ve[190.170.128.187] X-Barracuda-Start-Time: 1358413791 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.120093 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Sehr geehrter Abonnent, Seltsame Aktivit=C3=A4t in Ihrem Webmail-Konto erkannt wurde, ist die gegen= unsere Acceptable Use Policy (AUP). Dieses Konto wird vermutet entf=C3=BCh= rt worden sind, f=C3=BCr einen Nachweis des Anteilsbesitzes Bitte klicken S= ie auf den untenstehenden Link und f=C3=BCllen Sie die =C3=9Cberpr=C3=BCfun= g Form innerhalb 48 Stunden nach Erhalt dieser Mail. Klicken Sie auf diesen Link, um Ihr Konto zu aktualisieren: http://qakjww.p= hpforms.net/view_forms/view/747440f7ab#top Geben Sie alle diese Informationen korrekt und vollst=C3=A4ndig, sonst aus = Sicherheitsgr=C3=BCnden wemay haben Ihr Webmail-Konto dauerhaft zu schlie= =C3=9Fen. Bitte haben Sie Verst=C3=A4ndnis, dass dies eine Sicherheitsma=C3=9Fnahme s= oll helfen, sch=C3=BCtzen Sie und Ihr Webmail-Konto ist. Wir entschuldigen uns f=C3=BCr etwaige Unannehmlichkeiten. Thanks, Webmail Upgrade-Teams From malpg@uni-kassel.de Thu Jan 17 03:41:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_TO_NO_BRKTS_FREEMAIL 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 660E17F78 for ; Thu, 17 Jan 2013 03:41:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01B81AC004 for ; Thu, 17 Jan 2013 01:41:16 -0800 (PST) X-ASG-Debug-ID: 1358415674-04cbb01329df930001-NocioJ Received: from mx3.its.uni-kassel.de (mx3.its.uni-kassel.de [141.51.12.60]) by cuda.sgi.com with ESMTP id Vp73S5850LQtNWz0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 17 Jan 2013 01:41:15 -0800 (PST) X-Barracuda-Envelope-From: malpg@uni-kassel.de X-Barracuda-Apparent-Source-IP: 141.51.12.60 X-CGP-ClamAV-Result: CLEAN X-VirusScanner: Niversoft's CGPClamav Helper v1.16.6 (ClamAV engine v0.97.6) From: "Li Hao" Subject: Partnership X-Mailer: CommuniGate Pro WebUser v5.4.5 X-ASG-Orig-Subj: Partnership Date: Thu, 17 Jan 2013 10:41:13 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain;charset=utf-8; format="flowed" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mx3.its.uni-kassel.de[141.51.12.60] X-Barracuda-Start-Time: 1358415675 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-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=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120094 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; Greetings, I am Mr. Li Hao, CFO of China Merchants Bank, P.R.C. I have a discreet proposal for you in the tune of 105 Million EUR, after successful transfer, we shall share in the ratio of forty for you and sixty for me. Please reply for specifics. Warmest Li Hao From cmaiolino@redhat.com Thu Jan 17 08:31:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5F67D7F8C for ; Thu, 17 Jan 2013 08:31:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D1F28F8037 for ; Thu, 17 Jan 2013 06:31:05 -0800 (PST) X-ASG-Debug-ID: 1358433064-04cbb01326ebb30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ycTcMZJaHhgZYhEq for ; Thu, 17 Jan 2013 06:31:04 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0HEV3ZJ026177 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 17 Jan 2013 09:31:03 -0500 Received: from andromeda.usersys.redhat.com (ovpn-113-85.phx2.redhat.com [10.3.113.85]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0HEUxn7004933 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 17 Jan 2013 09:31:02 -0500 Date: Thu, 17 Jan 2013 09:30:58 -0500 From: Carlos Maiolino To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: remove setfl from xfs_io Message-ID: <20130117143058.GA18060@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: remove setfl from xfs_io References: <50C39123.6050303@sandeen.net> <50C3AB0E.3050006@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C3AB0E.3050006@sandeen.net> 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: 1358433064 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Mark looks to have it stacked just needing reviews. So, the patch looks good, feel free to add: Reviewed-by: Carlos Maiolino On Sat, Dec 08, 2012 at 03:03:10PM -0600, Eric Sandeen wrote: > Doesn't seem to have worked for ages, and is (therefore) > apparently not ever used: > > xfs_io> setfl > xfs_io> help setfl > setfl [-adx] -- set/clear append/direct flags on the open file > xfs_io> setfl -a > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl -d > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl > xfs_io> > > At best, it seems intended to toggle the flag state, but > gives no feedback about current state. -x is in help but > not implemented, etc. > > Just remove it. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/io/open.c b/io/open.c > index 46538ba..cc677e6 100644 > --- a/io/open.c > +++ b/io/open.c > @@ -25,7 +25,6 @@ > static cmdinfo_t open_cmd; > static cmdinfo_t stat_cmd; > static cmdinfo_t close_cmd; > -static cmdinfo_t setfl_cmd; > static cmdinfo_t statfs_cmd; > static cmdinfo_t chproj_cmd; > static cmdinfo_t lsproj_cmd; > @@ -668,45 +667,6 @@ extsize_f( > } > > static int > -setfl_f( > - int argc, > - char **argv) > -{ > - int c, flags; > - > - flags = fcntl(file->fd, F_GETFL, 0); > - if (flags < 0) { > - perror("fcntl(F_GETFL)"); > - return 0; > - } > - > - while ((c = getopt(argc, argv, "ad")) != EOF) { > - switch (c) { > - case 'a': > - if (flags & O_APPEND) > - flags |= O_APPEND; > - else > - flags &= ~O_APPEND; > - break; > - case 'd': > - if (flags & O_DIRECT) > - flags |= O_DIRECT; > - else > - flags &= ~O_DIRECT; > - break; > - default: > - printf(_("invalid setfl argument -- '%c'\n"), c); > - return 0; > - } > - } > - > - if (fcntl(file->fd, F_SETFL, flags) < 0) > - perror("fcntl(F_SETFL)"); > - > - return 0; > -} > - > -static int > statfs_f( > int argc, > char **argv) > @@ -791,13 +751,6 @@ open_init(void) > close_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; > close_cmd.oneline = _("close the current open file"); > > - setfl_cmd.name = "setfl"; > - setfl_cmd.cfunc = setfl_f; > - setfl_cmd.args = _("[-adx]"); > - setfl_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; > - setfl_cmd.oneline = > - _("set/clear append/direct flags on the open file"); > - > statfs_cmd.name = "statfs"; > statfs_cmd.cfunc = statfs_f; > statfs_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; > @@ -837,7 +790,6 @@ open_init(void) > add_command(&open_cmd); > add_command(&stat_cmd); > add_command(&close_cmd); > - add_command(&setfl_cmd); > add_command(&statfs_cmd); > add_command(&chproj_cmd); > add_command(&lsproj_cmd); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From tinguely@sgi.com Thu Jan 17 08:57:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 2AABB7F8E for ; Thu, 17 Jan 2013 08:57:45 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id E962C30405F; Thu, 17 Jan 2013 06:57:41 -0800 (PST) Message-ID: <50F81167.80404@sgi.com> Date: Thu, 17 Jan 2013 08:57:43 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss , Carlos Maiolino Subject: Re: [PATCH] xfsprogs: remove setfl from xfs_io References: <50C39123.6050303@sandeen.net> <50C3AB0E.3050006@sandeen.net> In-Reply-To: <50C3AB0E.3050006@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 15:03, Eric Sandeen wrote: > Doesn't seem to have worked for ages, and is (therefore) > apparently not ever used: > > xfs_io> setfl > xfs_io> help setfl > setfl [-adx] -- set/clear append/direct flags on the open file > xfs_io> setfl -a > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl -d > bad argument count 1 to setfl, expected 0 arguments > xfs_io> setfl > xfs_io> > > At best, it seems intended to toggle the flag state, but > gives no feedback about current state. -x is in help but > not implemented, etc. > > Just remove it. > > Signed-off-by: Eric Sandeen > --- Committed to xfsprogs as 618e842. --Mark. From tinguely@sgi.com Thu Jan 17 09:20:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 8FBB97F91 for ; Thu, 17 Jan 2013 09:20:50 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5010E304077; Thu, 17 Jan 2013 07:20:47 -0800 (PST) Message-ID: <50F816D1.1090806@sgi.com> Date: Thu, 17 Jan 2013 09:20:49 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfstests: ensure all xfs_io commands are documented in the manpage References: <50C39123.6050303@sandeen.net> <50C3AA0F.4070505@sandeen.net> In-Reply-To: <50C3AA0F.4070505@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 14:58, Eric Sandeen wrote: > Ensure that all commands listed in "xfs_io -c help" are > documented in the xfs_io(8) manpage. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/293 b/293 > new file mode 100755 > index 0000000..e42344d > --- /dev/null > +++ b/293 > @@ -0,0 +1,59 @@ > +#! /bin/bash > +# FS QA Test No. 293 > +# > +# Ensure all xfs_io commands are documented > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2012 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 > +#----------------------------------------------------------------------- > +# > +# creator > +owner=sandeen@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs xfs > +_supported_os IRIX Linux > + > +echo "Silence is golden" > + > +for COMMAND in `$XFS_IO_PROG -c help | awk '{print $1}' | grep -v "^Use "`; do Can I remove the space in the "^Use " - The output still includes "Use": xfs_io -c help | awk '{print $1}' | grep -v "^Use " allocsp bmap chattr chproj close extsize fadvise falloc fdatasync fiemap file fpunch freesp fsync help lsattr lsproj madvise mincore mmap mread msync munmap mwrite open pread print pwrite quit resvsp sendfile stat statfs sync_range truncate unresvsp zero Use Otherwise it looks good. Reviewed-by: Mark Tinguely From bfoster@redhat.com Thu Jan 17 12:10:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A46637F9E for ; Thu, 17 Jan 2013 12:10:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32C73AC008 for ; Thu, 17 Jan 2013 10:10:51 -0800 (PST) X-ASG-Debug-ID: 1358446246-04cbb01329f6b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g8wriFO436RyECWm for ; Thu, 17 Jan 2013 10:10:50 -0800 (PST) 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 r0HIAfOT027523 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Jan 2013 13:10:46 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0HIAS20016545 for ; Thu, 17 Jan 2013 13:10:37 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7E5D5120090; Thu, 17 Jan 2013 13:11:29 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Date: Thu, 17 Jan 2013 13:11:29 -0500 X-ASG-Orig-Subj: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-Id: <1358446289-871-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: 1358446246 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The stack_switch check currently occurs in __xfs_bmapi_allocate, which means the stack switch only occurs when xfs_bmapi_allocate() is called in a loop. Pull the check up before the loop in xfs_bmapi_write() such that the first iteration of the loop has consistent behavior. Signed-off-by: Brian Foster --- I was reading through this code and confused myself over whether the stack switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, I might add) the surrounding loop that I had missed, but it wasn't clear whether the behavior to enable the stack switch after the first iteration was intentional or not. I'm throwing this out there to either fix the issue or seek out an explanation for the existing behavior. Thanks! Brian fs/xfs/xfs_bmap.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index c507720..491f35e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4676,9 +4676,6 @@ __xfs_bmapi_allocate( return error; } - if (bma->flags & XFS_BMAPI_STACK_SWITCH) - bma->stack_switch = 1; - error = xfs_bmap_alloc(bma); if (error) return error; @@ -4952,6 +4949,9 @@ xfs_bmapi_write( bma.flist = flist; bma.firstblock = firstblock; + if (flags & XFS_BMAPI_STACK_SWITCH) + bma.stack_switch = 1; + while (bno < end && n < *nmap) { inhole = eof || bma.got.br_startoff > bno; wasdelay = !inhole && isnullstartblock(bma.got.br_startblock); -- 1.7.7.6 From glommer@parallels.com Thu Jan 17 12:20:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D92BB7FA0 for ; Thu, 17 Jan 2013 12:20:57 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7A9C304059 for ; Thu, 17 Jan 2013 10:20:54 -0800 (PST) X-ASG-Debug-ID: 1358446852-04cb6c0238f45e0001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id ItEM0GKFxtZjQ09h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Jan 2013 10:20:52 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1Tvu55-0006mk-OP; Thu, 17 Jan 2013 13:20:52 -0500 Received: from straightjacket.localdomain (216.239.55.193) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Thu, 17 Jan 2013 10:20:50 -0800 Message-ID: <50F84118.7030608@parallels.com> Date: Thu, 17 Jan 2013 10:21:12 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130117042245.GG2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.193] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358446852 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-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.2.120130 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >> Deepest fears: >> >> 1) snakes. > > Snakes are merely poisonous. Drop Bears are far more dangerous :P > fears are irrational anyway... >> 2) It won't surprise you to know that I am adapting your work, which >> provides a very sane and helpful API, to memcg shrinking. >> >> The dumb and simple approach in there is to copy all lrus that are >> marked memcg aware at memcg creation time. The API is kept the same, >> but when you do something like list_lru_add(lru, obj), for instance, we >> derive the memcg context from obj and relay it to the right list. > > At which point, you don't want the overhead of per-node lists. > This is one of the assumptions we may have to end up doing here. > The problem I see here is that someone might still need the > scalability of the per-node lists. If someone runs a large memcg in terms > of CPU and memory, then we most definitely are going to need to > retain per-node lists regardless of the fact that the workload is > running in a constrained environment. And if you are running a mix > of large and small containers, then one static solution is not going > to cut it for some workload. > Yes, this is spot on. As a first approach, I think single-node lists will do. > This is a problem that superblock contexts don't care about - they > are global by their very nature. Hence I'm wondering if trying to > fit these two very different behaviours into the one LRU list is > the wrong approach. > I am not that much concerned about that, honestly. I like the API, and I like the fact that it allow me to have the subsystems using it transparently, just by referring to the "master" lru (the dentry, inode, etc). It reduces complexity to reuse the data structures, but that is not paramount. However, a more flexible data structure in which we could select at least at creation time if we want per-node lists or not, would be quite helpful. And it seems it would be at least moderately helpful to you as well for usually-small filesystems, so I think it would be a good addition to next version. > Consider this: these patches give us a generic LRU list structure. > It currently uses a list_head in each object for indexing, and we > are talking about single LRU lists because of this limitation and > trying to build infrastructure that can support this indexing > mechanism. > > I think that all of thses problems go away if we replace the > list_head index in the object with a "struct lru_item" index. To > start with, it's just a s/list_head/lru_item/ changeover, but from > there we can expand. > > What I'm getting at is that we want to have multiple axis of > tracking and reclaim, but we only have a single axis for tracking. > If the lru_item grew a second list_head called "memcg_lru", then > suddenly the memcg LRUs can be maintained separately to the global > (per-superblock) LRU. i.e.: > > struct lru_item { > struct list_head global_list; > struct list_head memcg_list; > } > I may be misunderstanding you, but that is not how I see it. Your global list AFAIU, is more like a hook to keep the lists together. The actual accesses to it are controlled by a parent structure, like the super-block, which in turns, embeds a shrinker. So we get (in the sb case), from shrinker to sb, and from sb to dentry list (or inode). We never care about the global list head. >From this point on, we "entered" the LRU, but we still don't know which list to reclaim from: there is one list per node, and we need to figure out which is our target, based on the flags. This list selection mechanism is where I am usually hooking memcg: and for the same way you are using an array - given a node, you want fast access to the underlying list - so am I. Given the memcg context, I want to get to the corresponding memcg list. Now, in my earliest implementations, the memcg would still take me to a node-wide array, and an extra level would be required. We seem to agree that (at least as a starting point) getting rid of this extra level, so the memcg colapses all objects in the same list would provide decent behavior in most cases, while still keeping the footprint manageable. So that is what I am pursuing at the moment. > And then you can use whatever tracking structure you want for a > memcg LRU list. Indeed, this would allow per-node lists for the > global LRU, and whatever LRU type is appropriate for the memcg using > the object (e.g. single list for small memcgs, per-node for large > memcgs).... > Yes. You can have either a small number of big memcgs or a big number of small memcgs. So if we adopt selectively per-node scalability, our memory usage is always bounded by #memcgs x avg_size. It works perfectly. > i.e. rather than trying to make the infrastructure jump through hoops > to only have one LRU index per object, have a second index that > allows memcg's to have a separate LRU index and a method for the > global LRU structure to find them. This woul dallow memcg specific > shrinker callouts switch to the memcg LRU rather than the global LRU > and operate on that. That way we still only instantiate a single > LRU/shrinker pair per cache context, but the memcg code doesn't need > to duplicate the entire LRU infrastructure into every memcg that > contains that type of object for that cache context.... > > /me stops rambling.... > >> Your current suggestion of going per-node only in the performance >> critical filesystems could also possibly work, provided this count is >> expected to be small. > > The problem is deciding on a per filesystem basis. I was thinking > that all filesytsems of a specific type would use a particular type > of structure, not that specific instances of a filesystem could use > different types.... > Yes, I referred to "critical" as an attribute of the fs class as well. Most of the disk filesystems (if not all) would use per-node lists, and I would guess most of the pseudo fs would do fine with a single-node. From tinguely@sgi.com Thu Jan 17 12:50:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 772F57FA2 for ; Thu, 17 Jan 2013 12:50:57 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45DC28F8064; Thu, 17 Jan 2013 10:50:54 -0800 (PST) Message-ID: <50F8480F.4090201@sgi.com> Date: Thu, 17 Jan 2013 12:50:55 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write References: <1358446289-871-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1358446289-871-1-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/17/13 12:11, Brian Foster wrote: > The stack_switch check currently occurs in __xfs_bmapi_allocate, > which means the stack switch only occurs when xfs_bmapi_allocate() > is called in a loop. Pull the check up before the loop in > xfs_bmapi_write() such that the first iteration of the loop has > consistent behavior. > > Signed-off-by: Brian Foster > --- > > I was reading through this code and confused myself over whether the stack > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > I might add) the surrounding loop that I had missed, but it wasn't clear whether > the behavior to enable the stack switch after the first iteration was > intentional or not. I'm throwing this out there to either fix the issue or seek > out an explanation for the existing behavior. Thanks! > > Brian > > fs/xfs/xfs_bmap.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index c507720..491f35e 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -4676,9 +4676,6 @@ __xfs_bmapi_allocate( > return error; > } > > - if (bma->flags& XFS_BMAPI_STACK_SWITCH) > - bma->stack_switch = 1; > - > error = xfs_bmap_alloc(bma); > if (error) > return error; > @@ -4952,6 +4949,9 @@ xfs_bmapi_write( > bma.flist = flist; > bma.firstblock = firstblock; > > + if (flags& XFS_BMAPI_STACK_SWITCH) > + bma.stack_switch = 1; > + > while (bno< end&& n< *nmap) { > inhole = eof || bma.got.br_startoff> bno; > wasdelay = !inhole&& isnullstartblock(bma.got.br_startblock); Might want to read the Sep 2012 OSS archives, for example the below thread and the spin off threads. http://oss.sgi.com/archives/xfs/2012-09/msg00254.html My original patch was in xfs_bmapi_write() and it was moved to its current location. You can force the code by restricting to only one allocation worker and there were 2 xfstests (76? and 139? come to mind) that quickly triggered the event. --Mark. From tinguely@sgi.com Thu Jan 17 14:38:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 4DEBA7FA4 for ; Thu, 17 Jan 2013 14:38:19 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29A178F8064; Thu, 17 Jan 2013 12:38:15 -0800 (PST) Message-ID: <50F86139.6070909@sgi.com> Date: Thu, 17 Jan 2013 14:38:17 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfstests: ensure all xfs_io commands are documented in the manpage References: <50C39123.6050303@sandeen.net> <50C3AA0F.4070505@sandeen.net> <50F816D1.1090806@sgi.com> In-Reply-To: <50F816D1.1090806@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/17/13 09:20, Mark Tinguely wrote: > On 12/08/12 14:58, Eric Sandeen wrote: >> Ensure that all commands listed in "xfs_io -c help" are >> documented in the xfs_io(8) manpage. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/293 b/293 >> new file mode 100755 >> index 0000000..e42344d >> --- /dev/null >> +++ b/293 >> @@ -0,0 +1,59 @@ >> +#! /bin/bash >> +# FS QA Test No. 293 >> +# >> +# Ensure all xfs_io commands are documented >> +# >> +#----------------------------------------------------------------------- >> +# Copyright (c) 2012 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 >> +#----------------------------------------------------------------------- >> +# >> +# creator >> +owner=sandeen@redhat.com >> + >> +seq=`basename $0` >> +echo "QA output created by $seq" >> + >> +here=`pwd` >> +tmp=/tmp/$$ >> +status=1 # failure is the default! >> +trap "_cleanup; exit \$status" 0 1 2 3 15 >> + >> +_cleanup() >> +{ >> + cd / >> + rm -f $tmp.* >> +} >> + >> +# get standard environment, filters and checks >> +. ./common.rc >> +. ./common.filter >> + >> +# real QA test starts here >> + >> +# Modify as appropriate. >> +_supported_fs xfs >> +_supported_os IRIX Linux >> + >> +echo "Silence is golden" >> + >> +for COMMAND in `$XFS_IO_PROG -c help | awk '{print $1}' | grep -v >> "^Use "`; do > > > Can I remove the space in the "^Use " - The output still includes "Use": > > xfs_io -c help | awk '{print $1}' | grep -v "^Use " > > allocsp bmap chattr chproj close extsize fadvise falloc fdatasync fiemap > file fpunch freesp fsync help lsattr lsproj madvise mincore mmap mread > msync munmap mwrite open pread print pwrite quit resvsp sendfile stat > statfs sync_range truncate unresvsp zero Use > > Otherwise it looks good. > > Reviewed-by: Mark Tinguely > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs xfstest 293 has been committed as 244295a --Mark. From bfoster@redhat.com Thu Jan 17 14:52:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 827927FA6 for ; Thu, 17 Jan 2013 14:52:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42BC4304059 for ; Thu, 17 Jan 2013 12:52:03 -0800 (PST) X-ASG-Debug-ID: 1358455918-04bdf04a5b104740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eBH2VsmnmwGK8838; Thu, 17 Jan 2013 12:51:59 -0800 (PST) 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 r0HKpw8i013497 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 17 Jan 2013 15:51:58 -0500 Received: from laptop.bfoster (vpn-53-195.rdu2.redhat.com [10.10.53.195]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0HKpv06015654 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 17 Jan 2013 15:51:58 -0500 Message-ID: <50F863F0.8090201@redhat.com> Date: Thu, 17 Jan 2013 15:49:52 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com, dchinner@redhat.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write References: <1358446289-871-1-git-send-email-bfoster@redhat.com> <50F8480F.4090201@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write In-Reply-To: <50F8480F.4090201@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358455919 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 01/17/2013 01:50 PM, Mark Tinguely wrote: > On 01/17/13 12:11, Brian Foster wrote: >> The stack_switch check currently occurs in __xfs_bmapi_allocate, >> which means the stack switch only occurs when xfs_bmapi_allocate() >> is called in a loop. Pull the check up before the loop in >> xfs_bmapi_write() such that the first iteration of the loop has >> consistent behavior. >> >> Signed-off-by: Brian Foster >> --- >> >> I was reading through this code and confused myself over whether the >> stack >> switch ever actually occurs. Eric and Ben pointed out on irc >> (simultaneously, >> I might add) the surrounding loop that I had missed, but it wasn't >> clear whether >> the behavior to enable the stack switch after the first iteration was >> intentional or not. I'm throwing this out there to either fix the >> issue or seek >> out an explanation for the existing behavior. Thanks! >> >> Brian >> ... > > > Might want to read the Sep 2012 OSS archives, for example the below > thread and the spin off threads. > > http://oss.sgi.com/archives/xfs/2012-09/msg00254.html > Thanks for the pointer Mark. I think I follow the gist of the original problem based on your example (e.g., flusher kicks in and gets a perag, a separate xfsalloc worker is started and pends on the perag, meanwhile it has consumed the worker resource that the original flusher ultimately needed to proceed). > My original patch was in xfs_bmapi_write() and it was moved to its > current location. > So that points me to Dave's fix: http://oss.sgi.com/archives/xfs/2012-10/msg00080.html ... where he calls out doing the stack switch from a limited context (via the new flag) and then moving it into xfs_bmapi_allocate(). I can't say I completely understand the solution here, but my specific question and reason for this patch is to understand that for the case where we do switch stacks (and pass XFS_BMAPI_STACK_SWITCH), is it intentional or part of the solution that we don't actually do the switch until the second (and subsequent) iteration of the loop in xfs_bmapi_write()? Brian > You can force the code by restricting to only one allocation worker and > there were 2 xfstests (76? and 139? come to mind) that quickly triggered > the event. > > --Mark. From bpm@sgi.com Thu Jan 17 15:41:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 ABF437FA8 for ; Thu, 17 Jan 2013 15:41:12 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id C22A2AC001; Thu, 17 Jan 2013 13:41:08 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 860F14266DC; Thu, 17 Jan 2013 15:41:08 -0600 (CST) Date: Thu, 17 Jan 2013 15:41:08 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130117214108.GF27055@sgi.com> References: <1358446289-871-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358446289-871-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > The stack_switch check currently occurs in __xfs_bmapi_allocate, > which means the stack switch only occurs when xfs_bmapi_allocate() > is called in a loop. Pull the check up before the loop in > xfs_bmapi_write() such that the first iteration of the loop has > consistent behavior. > > Signed-off-by: Brian Foster > --- > > I was reading through this code and confused myself over whether the stack > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > I might add) the surrounding loop that I had missed, but it wasn't clear whether > the behavior to enable the stack switch after the first iteration was > intentional or not. I'm throwing this out there to either fix the issue or seek > out an explanation for the existing behavior. Thanks! To me this looks to be the correct behavior. It might be better to just get rid of the XFS_BMAPI_STACK_SWITCH flag entirely. Nice find. -Ben From bpm@sgi.com Thu Jan 17 16:27:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 E9D0E7F49 for ; Thu, 17 Jan 2013 16:27:32 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BF80304070; Thu, 17 Jan 2013 14:27:32 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3EF754266DC; Thu, 17 Jan 2013 16:27:32 -0600 (CST) Date: Thu, 17 Jan 2013 16:27:32 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] metadump: obfuscate symlinks by path component Message-ID: <20130117222732.GG27055@sgi.com> References: <4F83B844.3060508@redhat.com> <50CA9545.10105@sandeen.net> <50CB8432.8010101@inktank.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50CB8432.8010101@inktank.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Fri, Dec 14, 2012 at 01:55:30PM -0600, Alex Elder wrote: > On 12/13/2012 08:56 PM, Eric Sandeen wrote: > > On 4/9/12 11:34 PM, Eric Sandeen wrote: > >> xfs_metadump currently obfuscates entire symlinks without regard > >> to path components; this can lead to a corrupt image when restoring > >> a metadump containing extremely long symlinks: > >> > >> Phase 3 - for each AG... > >> - scan and clear agi unlinked lists... > >> - process known inodes and perform inode discovery... > >> - agno = 0 > >> component of symlink in inode 145 too long > >> problem with symbolic link in inode 145 > >> cleared inode 145 > >> ... > >> > >> Fix this by consolidating symlink obfuscation into a new > >> function which obfuscates one path component at a time. > >> > >> Signed-off-by: Eric Sandeen > > > > ping? :) > > You know, these things take time. > > What you have looks good to me, but I rewrote it, below. :) > > Even if you don't change anything... > > Reviewed-by: Alex Elder Applied. This is commit b249a9f0. Thanks, Ben From bpm@sgi.com Thu Jan 17 16:44:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 AE6807F37 for ; Thu, 17 Jan 2013 16:44:12 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7882D8F8035; Thu, 17 Jan 2013 14:44:09 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 28CC14266DC; Thu, 17 Jan 2013 16:44:09 -0600 (CST) Date: Thu, 17 Jan 2013 16:44:09 -0600 From: Ben Myers To: Lukas Czerner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: Change the diff output of failed tests Message-ID: <20130117224409.GH27055@sgi.com> References: <1334047113-32720-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) Hey Lukas, On Thu, Apr 19, 2012 at 10:39:57AM +0200, Lukas Czerner wrote: > On Tue, 10 Apr 2012, Lukas Czerner wrote: > > > Currently the entire diff is printed to the stdout in the case that the > > test output template differs from the actual test run. However in some > > cases the diff can be _very_ long. This commit changes it so that we > > print only first 10 lines of the diff. > > > > Also indent the diff output from the left by four spaces for better > > output readability. > > ping Saw this next to Eric's metadump patch. Sorry to have missed it before. Looks fine to me. Reviewed-by: Ben Myers This is commit 11c1d79. -Ben From david@fromorbit.com Thu Jan 17 17:31:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CB0077F37 for ; Thu, 17 Jan 2013 17:31:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 62227AC004 for ; Thu, 17 Jan 2013 15:31:14 -0800 (PST) X-ASG-Debug-ID: 1358465472-04cbb01326102060001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id zmel6AKSuf2sP3pX for ; Thu, 17 Jan 2013 15:31:12 -0800 (PST) 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: ArgOACOJ+FB5LIZq/2dsb2JhbABFhVyyNYYgF3OCHgEBBTocIxAIAw4KCSUPBSUDIROIGLtdFYxjhEEDlguJToZ8gwk Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Jan 2013 10:01:11 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvyvN-000140-MR; Fri, 18 Jan 2013 10:31:09 +1100 Date: Fri, 18 Jan 2013 10:31:09 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130117233109.GI2498@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write References: <1358446289-871-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358446289-871-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1358465472 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > The stack_switch check currently occurs in __xfs_bmapi_allocate, > which means the stack switch only occurs when xfs_bmapi_allocate() > is called in a loop. Pull the check up before the loop in > xfs_bmapi_write() such that the first iteration of the loop has > consistent behavior. > > Signed-off-by: Brian Foster Yeah, that's a bug. As i mentioned on IRC, the backup copy of the patch I have has these two hunks in it. Why they got dropped from the primary copy is have no idea - perhaps it was an issue with popping and pushing patches on and off my stack, and the hunks got silently dropped... I note that the port to the RHEL6 codebase has this correct - and looking a the patch I ported it is the same as the backup copy in my mainline guilt patch directory. So the intention was there that the stack switch should have been moved, but it wasn't and the logic problem wasn't picked up on review, so here we are... Anyway, looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 17 17:39:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4C6D07F37 for ; Thu, 17 Jan 2013 17:39:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7FA0AC001 for ; Thu, 17 Jan 2013 15:39:25 -0800 (PST) X-ASG-Debug-ID: 1358465963-04cbb013261026f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id V7MMOirv0TQvzVrX for ; Thu, 17 Jan 2013 15:39:24 -0800 (PST) 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: ArgOAL6K+FB5LIZq/2dsb2JhbABFhVyyNYYgF3OCHgEBBTocIxAIAw4KCSUPBSUDIROIGLtdFZEkA5YLiU6GfIMJ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Jan 2013 10:09:23 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tvz3K-00015u-Ly; Fri, 18 Jan 2013 10:39:22 +1100 Date: Fri, 18 Jan 2013 10:39:22 +1100 From: Dave Chinner To: Ben Myers Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130117233922.GJ2498@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write References: <1358446289-871-1-git-send-email-bfoster@redhat.com> <20130117214108.GF27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130117214108.GF27055@sgi.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: 1358465963 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 03:41:08PM -0600, Ben Myers wrote: > Hey Brian, > > On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > > The stack_switch check currently occurs in __xfs_bmapi_allocate, > > which means the stack switch only occurs when xfs_bmapi_allocate() > > is called in a loop. Pull the check up before the loop in > > xfs_bmapi_write() such that the first iteration of the loop has > > consistent behavior. > > > > Signed-off-by: Brian Foster > > --- > > > > I was reading through this code and confused myself over whether the stack > > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > > I might add) the surrounding loop that I had missed, but it wasn't clear whether > > the behavior to enable the stack switch after the first iteration was > > intentional or not. I'm throwing this out there to either fix the issue or seek > > out an explanation for the existing behavior. Thanks! > > To me this looks to be the correct behavior. It might be better to > just get rid of the XFS_BMAPI_STACK_SWITCH flag entirely. Nice find. Which would take it back to the original logic which always switched stacks and we know that caused significant metadata performance degradation in various workloads. If we want to remove XFS_BMAPI_STACK_SWITCH, then we either need to solve either the stack overrun problem (not possible, AFAICT) or the metadata performance degradation as a result of always pushing allocation off into workqueues. So, unfortunately, until we have some other resolution, we stuck with it.... :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From akpm@linux-foundation.org Thu Jan 17 17:39:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 252797F4D for ; Thu, 17 Jan 2013 17:39:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 575C1AC001 for ; Thu, 17 Jan 2013 15:39:57 -0800 (PST) X-ASG-Debug-ID: 1358465995-04cbb01328102750001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id 8nVdAMwcRuUypgcs for ; Thu, 17 Jan 2013 15:39:56 -0800 (PST) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from akpm.mtv.corp.google.com (unknown [216.239.45.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id EA379825; Thu, 17 Jan 2013 23:39:54 +0000 (UTC) Date: Thu, 17 Jan 2013 15:39:54 -0800 From: Andrew Morton To: Abhijit Pawar Cc: Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov , Chris Mason , Steve French , Christine Caulfield , David Teigland , Ben Myers , Alex Elder , xfs@oss.sgi.com, v9fs-developer@lists.sourceforge.net, linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, cluster-devel@redhat.com Subject: Re: [PATCH 4/4] fs: remove obsolete simple_strto Message-Id: <20130117153954.e36a474b.akpm@linux-foundation.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] fs: remove obsolete simple_strto In-Reply-To: <1354881319-23585-1-git-send-email-abhi.c.pawar@gmail.com> References: <1354881319-23585-1-git-send-email-abhi.c.pawar@gmail.com> X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1358465996 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, 7 Dec 2012 17:25:19 +0530 Abhijit Pawar wrote: > This patch replace the obsolete simple_strto with kstrto > The XFS part (or something like it) has been applied. > > ... > > --- a/fs/9p/v9fs.c > +++ b/fs/9p/v9fs.c > @@ -112,7 +112,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) > substring_t args[MAX_OPT_ARGS]; > char *p; > int option = 0; > - char *s, *e; > + char *s; > int ret = 0; > > /* setup defaults */ > @@ -249,8 +249,8 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) > v9ses->flags |= V9FS_ACCESS_CLIENT; > } else { > v9ses->flags |= V9FS_ACCESS_SINGLE; > - v9ses->uid = simple_strtoul(s, &e, 10); > - if (*e != '\0') { > + ret = kstrtouint(s, 10, &v9ses->uid); > + if (ret) { > ret = -EINVAL; > pr_info("Unknown access argument %s\n", > s); Here we should propagate the kstrtouint() errno back to the caller rather than overwriting it with EINVAL. > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 5b3429a..95d9e09 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -1335,7 +1335,11 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root, > sizestr = devstr + 1; > *devstr = '\0'; > devstr = vol_args->name; > - devid = simple_strtoull(devstr, &end, 10); > + ret = kstrtoull(devstr, 10, &devid); > + if (ret) { > + ret = -EINVAL; > + goto out_free; > + } Propagate the kstrtoull errno back to the caller. > printk(KERN_INFO "btrfs: resizing devid %llu\n", > (unsigned long long)devid); > } > > ... > > @@ -609,8 +610,9 @@ static ssize_t cifs_security_flags_proc_write(struct file *file, > } > /* else we have a number */ > > - flags = simple_strtoul(flags_string, NULL, 0); > - > + rc = kstrtouint(flags_string, 0, &flags); > + if (rc) > + return -EINVAL; Here we should propagate the return value. But if this error path is taken, we might already have altered global_secflags. Perhaps that change should be undone. Or, better, check the string before starting to change state. > cFYI(1, "sec flags 0x%x", flags); > > if (flags <= 0) { > --- a/fs/dlm/config.c > +++ b/fs/dlm/config.c > @@ -156,11 +156,14 @@ static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field, > const char *buf, size_t len) > { > unsigned int x; > + int rc; > > if (!capable(CAP_SYS_ADMIN)) > return -EPERM; > > - x = simple_strtoul(buf, NULL, 0); > + rc = kstrtouint(buf, 0, &x); > + if (rc) > + return -EINVAL; Propagate it back. > if (check_zero && !x) > return -EINVAL; > @@ -729,7 +732,10 @@ static ssize_t comm_nodeid_read(struct dlm_comm *cm, char *buf) > static ssize_t comm_nodeid_write(struct dlm_comm *cm, const char *buf, > size_t len) > { > - cm->nodeid = simple_strtol(buf, NULL, 0); > + int rc; > + rc = kstrtoint(buf, 0, &cm->nodeid); > + if (rc) > + return -EINVAL; Ditto > return len; > } > > @@ -741,7 +747,10 @@ static ssize_t comm_local_read(struct dlm_comm *cm, char *buf) > static ssize_t comm_local_write(struct dlm_comm *cm, const char *buf, > size_t len) > { > - cm->local= simple_strtol(buf, NULL, 0); > + int rc; > + rc = kstrtoint(buf, 0, &cm->local); > + if (rc) > + return -EINVAL; Ditto > if (cm->local && !local_comm) > local_comm = cm; > return len; > @@ -845,7 +854,10 @@ static ssize_t node_nodeid_write(struct dlm_node *nd, const char *buf, > size_t len) > { > uint32_t seq = 0; > - nd->nodeid = simple_strtol(buf, NULL, 0); > + int rc; > + rc = kstrtoint(buf, 0, &nd->nodeid); > + if (rc) > + return -EINVAL; Ditto > dlm_comm_seq(nd->nodeid, &seq); > nd->comm_seq = seq; > return len; > @@ -859,7 +871,10 @@ static ssize_t node_weight_read(struct dlm_node *nd, char *buf) > static ssize_t node_weight_write(struct dlm_node *nd, const char *buf, > size_t len) > { > - nd->weight = simple_strtol(buf, NULL, 0); > + int rc; > + rc = kstrtoint(buf, 0, &nd->weight); > + if (rc) > + return -EINVAL; Ditto > return len; > } > > diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c > index 2e99fb0..e83abfb 100644 > --- a/fs/dlm/lockspace.c > +++ b/fs/dlm/lockspace.c > @@ -35,7 +35,10 @@ static struct task_struct * scand_task; > static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len) > { > ssize_t ret = len; > - int n = simple_strtol(buf, NULL, 0); > + int n, rc; > + rc = kstrtoint(buf, 0, &n); > + if (rc) > + return -EINVAL; etcetera > ls = dlm_find_lockspace_local(ls->ls_local_handle); > if (!ls) > > ... > From bpm@sgi.com Thu Jan 17 17:50:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 889B47F4C for ; Thu, 17 Jan 2013 17:50:40 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9089FAC001; Thu, 17 Jan 2013 15:50:39 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 806B24266DC; Thu, 17 Jan 2013 17:50:39 -0600 (CST) Date: Thu, 17 Jan 2013 17:50:39 -0600 From: Ben Myers To: Dave Chinner Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130117235039.GY30652@sgi.com> References: <1358446289-871-1-git-send-email-bfoster@redhat.com> <20130117214108.GF27055@sgi.com> <20130117233922.GJ2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130117233922.GJ2498@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Fri, Jan 18, 2013 at 10:39:22AM +1100, Dave Chinner wrote: > On Thu, Jan 17, 2013 at 03:41:08PM -0600, Ben Myers wrote: > > Hey Brian, > > > > On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > > > The stack_switch check currently occurs in __xfs_bmapi_allocate, > > > which means the stack switch only occurs when xfs_bmapi_allocate() > > > is called in a loop. Pull the check up before the loop in > > > xfs_bmapi_write() such that the first iteration of the loop has > > > consistent behavior. > > > > > > Signed-off-by: Brian Foster > > > --- > > > > > > I was reading through this code and confused myself over whether the stack > > > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > > > I might add) the surrounding loop that I had missed, but it wasn't clear whether > > > the behavior to enable the stack switch after the first iteration was > > > intentional or not. I'm throwing this out there to either fix the issue or seek > > > out an explanation for the existing behavior. Thanks! > > > > To me this looks to be the correct behavior. It might be better to > > just get rid of the XFS_BMAPI_STACK_SWITCH flag entirely. Nice find. > > Which would take it back to the original logic which always switched > stacks and we know that caused significant metadata performance > degradation in various workloads. > > If we want to remove XFS_BMAPI_STACK_SWITCH, then we either need to > solve either the stack overrun problem (not possible, AFAICT) or the > metadata performance degradation as a result of always pushing > allocation off into workqueues. So, unfortunately, until we have some > other resolution, we stuck with it.... :/ Yeah, I went off the rails there. I meant to suggest something more along the lines of getting rid of the stack_switch member of the args structure, since xfs_bmapi_write is the only caller of xfs_bmapi_allocate. But it didn't come out that way... Anyway, what we have is just fine. Regards, Ben From bpm@oss.sgi.com Thu Jan 17 18:01:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 7A6387F50; Thu, 17 Jan 2013 18:01:04 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-13-g9e96fe6 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: aeb4f20a02b4c984c48995ad54f40caf5ffa0705 X-Git-Newrev: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 Message-Id: <20130118000104.7A6387F50@oss.sgi.com> Date: Thu, 17 Jan 2013 18:01:03 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 9e96fe6 xfs: pull up stack_switch check into xfs_bmapi_write 667a929 xfs: Remove boolean_t typedef completely. from aeb4f20a02b4c984c48995ad54f40caf5ffa0705 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9e96fe6df44425b69ed89f6ac20352cec1f127d7 Author: Brian Foster Date: Thu Jan 17 13:11:29 2013 -0500 xfs: pull up stack_switch check into xfs_bmapi_write The stack_switch check currently occurs in __xfs_bmapi_allocate, which means the stack switch only occurs when xfs_bmapi_allocate() is called in a loop. Pull the check up before the loop in xfs_bmapi_write() such that the first iteration of the loop has consistent behavior. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit 667a9291c5b38318a47a2df730bc064e5d37d2a8 Author: Thiago Farina Date: Mon Nov 12 21:32:59 2012 -0200 xfs: Remove boolean_t typedef completely. Since we are using C99 we have one builtin defined in include/linux/types.h, use that instead. v2: you missed one in fs/xfs/xfs_qm_bhv.c, cleaned up. -bpm Signed-off-by: Thiago Farina Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap.c | 6 +++--- fs/xfs/xfs_log.c | 8 ++++---- fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 8 ++++---- fs/xfs/xfs_trans_dquot.c | 10 +++++----- fs/xfs/xfs_types.h | 1 - fs/xfs/xfs_vnodeops.c | 12 ++++++------ 7 files changed, 23 insertions(+), 24 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Thu Jan 17 18:01:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 34FD57F4F; Thu, 17 Jan 2013 18:01:16 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-13-g9e96fe6 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: aeb4f20a02b4c984c48995ad54f40caf5ffa0705 X-Git-Newrev: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 Message-Id: <20130118000116.34FD57F4F@oss.sgi.com> Date: Thu, 17 Jan 2013 18:01:15 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 9e96fe6 xfs: pull up stack_switch check into xfs_bmapi_write 667a929 xfs: Remove boolean_t typedef completely. from aeb4f20a02b4c984c48995ad54f40caf5ffa0705 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9e96fe6df44425b69ed89f6ac20352cec1f127d7 Author: Brian Foster Date: Thu Jan 17 13:11:29 2013 -0500 xfs: pull up stack_switch check into xfs_bmapi_write The stack_switch check currently occurs in __xfs_bmapi_allocate, which means the stack switch only occurs when xfs_bmapi_allocate() is called in a loop. Pull the check up before the loop in xfs_bmapi_write() such that the first iteration of the loop has consistent behavior. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit 667a9291c5b38318a47a2df730bc064e5d37d2a8 Author: Thiago Farina Date: Mon Nov 12 21:32:59 2012 -0200 xfs: Remove boolean_t typedef completely. Since we are using C99 we have one builtin defined in include/linux/types.h, use that instead. v2: you missed one in fs/xfs/xfs_qm_bhv.c, cleaned up. -bpm Signed-off-by: Thiago Farina Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap.c | 6 +++--- fs/xfs/xfs_log.c | 8 ++++---- fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 8 ++++---- fs/xfs/xfs_trans_dquot.c | 10 +++++----- fs/xfs/xfs_types.h | 1 - fs/xfs/xfs_vnodeops.c | 12 ++++++------ 7 files changed, 23 insertions(+), 24 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Thu Jan 17 18:05:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 70FE07F51 for ; Thu, 17 Jan 2013 18:05:11 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id D1B3CAC001; Thu, 17 Jan 2013 16:05:07 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 810D34266DC; Thu, 17 Jan 2013 18:05:07 -0600 (CST) Date: Thu, 17 Jan 2013 18:05:07 -0600 From: Ben Myers To: Thiago Farina Cc: Alex Elder , xfs@oss.sgi.com Subject: Re: xfs: Remove boolean_t typedef completely. Message-ID: <20130118000507.GJ27055@sgi.com> References: <20121113015318.GD25039@dastard> <20121113023207.GZ9783@sgi.com> <20121113152459.GW31970@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121113152459.GW31970@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Nov 13, 2012 at 09:24:59AM -0600, Ben Myers wrote: > On Tue, Nov 13, 2012 at 01:16:43PM -0200, Thiago Farina wrote: > > On Tue, Nov 13, 2012 at 12:32 AM, Ben Myers wrote: > > >> >> > Also, can you please place patches in line rather than attaching > > >> >> > them. Attaching them means they cannot be quoted in reply. See > > >> >> > Documentation/SubmittingPatches and Documentation/email-clients.txt > > >> >> > for guidelines. > > None of these docs say anything about send-email. > > > > >> > It's still attached as a base64 encoded attachment, not as inline > > >> > text.... > > >> > > > >> Yep, sorry about that. Is just a text file from $(git format-patch master); > > > > > > If you don't mind another try... > > No, thanks. It's too painful to use git send-email, the patch is > > attached, if you want to take it, then fine, if not then it's fine too > > :) > > Ok then, no problem. I can make an accomodation. Thanks for the patch! :) > > FYI, there are other options than git send-email that work fine too. Plenty of > folks are using 'quilt mail' and that is fairly painless. I suggest you take a > peek at that if you're going to post on a regular basis. This is commit 667a9291. Thanks Thiago! From bpm@sgi.com Thu Jan 17 18:06:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 478667F54 for ; Thu, 17 Jan 2013 18:06:11 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 10FFE8F8039; Thu, 17 Jan 2013 16:06:08 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id C1E154266DC; Thu, 17 Jan 2013 18:06:07 -0600 (CST) Date: Thu, 17 Jan 2013 18:06:07 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130118000607.GK27055@sgi.com> References: <1358446289-871-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358446289-871-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > The stack_switch check currently occurs in __xfs_bmapi_allocate, > which means the stack switch only occurs when xfs_bmapi_allocate() > is called in a loop. Pull the check up before the loop in > xfs_bmapi_write() such that the first iteration of the loop has > consistent behavior. > > Signed-off-by: Brian Foster Applied. From david@fromorbit.com Thu Jan 17 18:10:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 431C37F58 for ; Thu, 17 Jan 2013 18:10:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32DEC304039 for ; Thu, 17 Jan 2013 16:10:34 -0800 (PST) X-ASG-Debug-ID: 1358467831-04cbb01329103bd0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rE3UFSoqQT9uXF7w for ; Thu, 17 Jan 2013 16:10:31 -0800 (PST) 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: ArgOAHKS+FB5LIZq/2dsb2JhbABFhVyyNYYhF3OCHgEBBAEnExwjEAgDDgoJJQ8FJQMhE4gTBbteFZEkA5YLiU6GfIMJ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Jan 2013 10:40:30 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TvzXR-0001AF-RM; Fri, 18 Jan 2013 11:10:29 +1100 Date: Fri, 18 Jan 2013 11:10:29 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130118001029.GK2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F84118.7030608@parallels.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: 1358467831 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 10:21:12AM -0800, Glauber Costa wrote: > >> Deepest fears: > >> > >> 1) snakes. > > > > Snakes are merely poisonous. Drop Bears are far more dangerous :P > > fears are irrational anyway... > > >> 2) It won't surprise you to know that I am adapting your work, which > >> provides a very sane and helpful API, to memcg shrinking. > >> > >> The dumb and simple approach in there is to copy all lrus that are > >> marked memcg aware at memcg creation time. The API is kept the same, > >> but when you do something like list_lru_add(lru, obj), for instance, we > >> derive the memcg context from obj and relay it to the right list. > > > > At which point, you don't want the overhead of per-node lists. > > This is one of the assumptions we may have to end up doing here. *nod*. Good to get it out in the open to see if we can work around it.... > > This is a problem that superblock contexts don't care about - they > > are global by their very nature. Hence I'm wondering if trying to > > fit these two very different behaviours into the one LRU list is > > the wrong approach. > > > > I am not that much concerned about that, honestly. I like the API, and I > like the fact that it allow me to have the subsystems using it > transparently, just by referring to the "master" lru (the dentry, inode, > etc). It reduces complexity to reuse the data structures, but that is > not paramount. > > However, a more flexible data structure in which we could select at > least at creation time if we want per-node lists or not, would be quite > helpful. *nod* > > Consider this: these patches give us a generic LRU list structure. > > It currently uses a list_head in each object for indexing, and we > > are talking about single LRU lists because of this limitation and > > trying to build infrastructure that can support this indexing > > mechanism. > > > > I think that all of thses problems go away if we replace the > > list_head index in the object with a "struct lru_item" index. To > > start with, it's just a s/list_head/lru_item/ changeover, but from > > there we can expand. > > > > What I'm getting at is that we want to have multiple axis of > > tracking and reclaim, but we only have a single axis for tracking. > > If the lru_item grew a second list_head called "memcg_lru", then > > suddenly the memcg LRUs can be maintained separately to the global > > (per-superblock) LRU. i.e.: > > > > struct lru_item { > > struct list_head global_list; > > struct list_head memcg_list; > > } > > > > I may be misunderstanding you, but that is not how I see it. Your global > list AFAIU, is more like a hook to keep the lists together. The actual > accesses to it are controlled by a parent structure, like the > super-block, which in turns, embeds a shrinker. > > So we get (in the sb case), from shrinker to sb, and from sb to dentry > list (or inode). We never care about the global list head. > > From this point on, we "entered" the LRU, but we still don't know which > list to reclaim from: there is one list per node, and we need to figure > out which is our target, based on the flags. > > This list selection mechanism is where I am usually hooking memcg: and > for the same way you are using an array - given a node, you want fast > access to the underlying list - so am I. Given the memcg context, I want > to get to the corresponding memcg list. > > Now, in my earliest implementations, the memcg would still take me to a > node-wide array, and an extra level would be required. We seem to agree > that (at least as a starting point) getting rid of this extra level, so > the memcg colapses all objects in the same list would provide decent > behavior in most cases, while still keeping the footprint manageable. So > that is what I am pursuing at the moment. Ah, I think that maybe you misunderstood. There are two main triggers for reclaim: global memory is short, or a memcg is short on memory. To find appropriate objects quickly for reclaim, we need objects on appropriate lists. E.g. if we are doing global reclaim (e.g. from kswapd) it means a node is short of memory and needs more. Hence just walking a per-node list is the most efficient method of doing this. Having to walk all the memcg LRU lists to find objects on a specific node is not feasible. OTOH, if we are doing memcg specific reclaim, the opposite is true. SO, if we have: struct lru_list_head { struct list_head head; spinlock_t lock; u64 nr_items; } struct lru_list { struct lru_list_node *per_node; int numnodes; nodemask_t active_nodes; void *memcg_lists; /* managed by memcg code */ .... } lru_list_init(bool per_node) { numnodes = 1; if (pernode) numnodes = NRNODES; lru_list->pernode = alloc(numnodes * sizeof(struct lru_list_head)); .... } And then each object uses: struct lru_item { struct list_head global_list; struct list_head memcg_list; } and we end up with: lru_add(struct lru_list *lru, struct lru_item *item) { node_id = min(object_to_nid(item), lru->numnodes); __lru_add(lru, node_id, &item->global_list); if (memcg) { memcg_lru = find_memcg_lru(lru->memcg_lists, memcg_id) __lru_add_(memcg_lru, node_id, &item->memcg_list); } } Then when it comes to reclaim, the reclaim information passed tot eh shrinker needs to indicate either the node to reclaim from or the memcg_id (or both), so that reclaim can walk the appropriate list to find objects to reclaim. Then we delete them from both lists and reclaim the object.... And the memcg lists can instantiate new struct lru_list and index them appropriately according to some criteria. Then all the generic LRU code cares about is that the memcg lookup returns the correct struct lru_list for it to operate on... Cheers, Dave. -- Dave Chinner david@fromorbit.com From glommer@parallels.com Thu Jan 17 18:13:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3D6CC7F58 for ; Thu, 17 Jan 2013 18:13:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A9768F804B for ; Thu, 17 Jan 2013 16:13:53 -0800 (PST) X-ASG-Debug-ID: 1358468032-04cb6c023a100400001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id RcSRtVNOmkA924uG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Jan 2013 16:13:52 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1Tvzah-0003ws-Kx; Thu, 17 Jan 2013 19:13:51 -0500 Received: from straightjacket.localdomain (216.239.55.193) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Thu, 17 Jan 2013 16:13:50 -0800 Message-ID: <50F893D2.7080103@parallels.com> Date: Thu, 17 Jan 2013 16:14:10 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130118001029.GK2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.193] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358468032 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-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.2.120151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/17/2013 04:10 PM, Dave Chinner wrote: > And then each object uses: > > struct lru_item { > struct list_head global_list; > struct list_head memcg_list; > } by objects you mean dentries, inodes, and the such, right? Would it be acceptable to you? We've been of course doing our best to avoid increasing the size of the objects, therefore this is something we've never mentioned. However, if it would be acceptable from the fs POV, this would undoubtedly make our life extremely easier. From david@fromorbit.com Thu Jan 17 18:15:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1C6847F58 for ; Thu, 17 Jan 2013 18:15:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 044418F804C for ; Thu, 17 Jan 2013 16:15:52 -0800 (PST) X-ASG-Debug-ID: 1358468150-04cb6c0239100680001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tN8xoDmhGushw1YD for ; Thu, 17 Jan 2013 16:15:51 -0800 (PST) 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: ArgOAL6T+FB5LIZq/2dsb2JhbABFhVyyNYYhF3OCHgEBBScTHCMQCAMOCgklDwUlAyETiBi7XxWRJAOWC4lOhnyDCQ Received: from ppp121-44-134-106.lns20.syd7.internode.on.net (HELO dastard) ([121.44.134.106]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Jan 2013 10:45:50 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tvzcb-0001Al-QI; Fri, 18 Jan 2013 11:15:49 +1100 Date: Fri, 18 Jan 2013 11:15:49 +1100 From: Dave Chinner To: Ben Myers Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130118001549.GL2498@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write References: <1358446289-871-1-git-send-email-bfoster@redhat.com> <20130117214108.GF27055@sgi.com> <20130117233922.GJ2498@dastard> <20130117235039.GY30652@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130117235039.GY30652@sgi.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: 1358468151 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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.2.120151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 05:50:39PM -0600, Ben Myers wrote: > Hey Dave, > > On Fri, Jan 18, 2013 at 10:39:22AM +1100, Dave Chinner wrote: > > On Thu, Jan 17, 2013 at 03:41:08PM -0600, Ben Myers wrote: > > > Hey Brian, > > > > > > On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > > > > The stack_switch check currently occurs in __xfs_bmapi_allocate, > > > > which means the stack switch only occurs when xfs_bmapi_allocate() > > > > is called in a loop. Pull the check up before the loop in > > > > xfs_bmapi_write() such that the first iteration of the loop has > > > > consistent behavior. > > > > > > > > Signed-off-by: Brian Foster > > > > --- > > > > > > > > I was reading through this code and confused myself over whether the stack > > > > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > > > > I might add) the surrounding loop that I had missed, but it wasn't clear whether > > > > the behavior to enable the stack switch after the first iteration was > > > > intentional or not. I'm throwing this out there to either fix the issue or seek > > > > out an explanation for the existing behavior. Thanks! > > > > > > To me this looks to be the correct behavior. It might be better to > > > just get rid of the XFS_BMAPI_STACK_SWITCH flag entirely. Nice find. > > > > Which would take it back to the original logic which always switched > > stacks and we know that caused significant metadata performance > > degradation in various workloads. > > > > If we want to remove XFS_BMAPI_STACK_SWITCH, then we either need to > > solve either the stack overrun problem (not possible, AFAICT) or the > > metadata performance degradation as a result of always pushing > > allocation off into workqueues. So, unfortunately, until we have some > > other resolution, we stuck with it.... :/ > > Yeah, I went off the rails there. I meant to suggest something more along the > lines of getting rid of the stack_switch member of the args structure, since > xfs_bmapi_write is the only caller of xfs_bmapi_allocate. But it didn't come > out that way... Anyway, what we have is just fine. Oh, ok, I see what you mean. The code currently has an extra level of indirection (XFS_BMAPI_STACK_SWITCH -> args->stack_switch). That is in line with all the other XFS_BMAPI_* flags, though. i.e. they are interface flags and not propagated down through the struct xfs_bmalloc arguments. To tell the truth, I've previously considered just passing a flags field down rather than the current single bit variables. I've never done it though, because (IMO) it doesn't really improve the code significantly or reduce the footprint of the structure. Perhaps we should look at that again now that the code has been significantly factored.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From fengguang.wu@intel.com Thu Jan 17 18:20:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C08F57F60 for ; Thu, 17 Jan 2013 18:20:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65EA6AC003 for ; Thu, 17 Jan 2013 16:20:39 -0800 (PST) X-ASG-Debug-ID: 1358468438-04bdf04a5810b750001-NocioJ Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by cuda.sgi.com with ESMTP id 8JzYbbDHY687o7Pg for ; Thu, 17 Jan 2013 16:20:38 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.93 X-Barracuda-IPDD: Level2 [intel.com/192.55.52.93] Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 17 Jan 2013 16:20:25 -0800 X-Barracuda-IPDD: Level2 [intel.com/192.55.52.93] X-Barracuda-IPDD: Level2 [intel.com/192.55.52.93] X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.84,488,1355126400"; d="scan'208";a="275253314" Received: from bee.sh.intel.com (HELO localhost) ([10.239.97.14]) by fmsmga001.fm.intel.com with ESMTP; 17 Jan 2013 16:20:23 -0800 Received: from [192.168.1.144] (helo=kbuild.lkp.intel.com) by localhost with smtp (Exim 4.80) (envelope-from ) id 1Tvzgv-000HJT-8T; Fri, 18 Jan 2013 08:20:17 +0800 Date: Fri, 18 Jan 2013 08:16:58 +0800 From: kbuild test robot To: Thiago Farina Cc: xfs@oss.sgi.com, Ben Myers Subject: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared Message-ID: <50f8947a.G99Y3+js5SanqAIW%fengguang.wu@intel.com> X-ASG-Orig-Subj: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared User-Agent: Heirloom mailx 12.5 6/20/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 192.168.1.144 X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on localhost); SAEximRunCond expanded to false X-Barracuda-Connect: mga11.intel.com[192.55.52.93] X-Barracuda-Start-Time: 1358468438 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com tree: git://oss.sgi.com/xfs/xfs for-next head: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 commit: 667a9291c5b38318a47a2df730bc064e5d37d2a8 [7/8] xfs: Remove boolean_t typedef completely. config: make ARCH=x86_64 allmodconfig All error/warnings: fs/xfs/xfs_log.c: In function 'xlog_sync': >> fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared (first use in this function) fs/xfs/xfs_log.c:1740:39: note: each undeclared identifier is reported only once for each function it appears in vim +/B_TRUE +1740 fs/xfs/xfs_log.c 1734 bp->b_flags |= XBF_FLUSH; 1735 } 1736 1737 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); 1738 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize); 1739 > 1740 xlog_verify_iclog(log, iclog, count, B_TRUE); 1741 1742 /* account for log which doesn't start at block #0 */ 1743 XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart); --- 0-DAY kernel build testing backend Open Source Technology Center http://lists.01.org/mailman/listinfo/kbuild Intel Corporation From david@fromorbit.com Thu Jan 17 18:28:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C20437F60 for ; Thu, 17 Jan 2013 18:28:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF4CD304053 for ; Thu, 17 Jan 2013 16:28:22 -0800 (PST) X-ASG-Debug-ID: 1358468900-04cbb01329104780001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kbGEjPq8xyR9wJ7F for ; Thu, 17 Jan 2013 16:28:21 -0800 (PST) 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: ArgOAI6W+FB5LBTV/2dsb2JhbABFhVyyNYYhF3OCHgEBBTocIxAIAw4KCSUPBSUDIROIGLtfFZEkA5YLkEqDCQ Received: from ppp121-44-20-213.lns20.syd6.internode.on.net (HELO dastard) ([121.44.20.213]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Jan 2013 10:58:19 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tvzog-0001C4-BN; Fri, 18 Jan 2013 11:28:18 +1100 Date: Fri, 18 Jan 2013 11:28:18 +1100 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock Message-ID: <20130118002818.GM2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock References: <1358407669-29346-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358407669-29346-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1358468900 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 03:27:49PM +0800, Eryu Guan wrote: > Regression test case for commit: > > 437a255 xfs: fix direct IO nested transaction deadlock. > > Signed-off-by: Eryu Guan Couple of things: > +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 > +_scratch_mount >/dev/null 2>&1 > + > +TESTDIR="$SCRATCH_MNT/testdir" > +mkdir -p $TESTDIR That's far too similar to TEST_DIR - the mount point for the test device. Reading the test makes me wonder why fsstress is beig run on the test device, while the freezes are being done on the scratch device. Other tests use $testdir, which is fine because the difference in case makes it obvious that it's not the test device mount point. I'd prefer you cal it something like "STRESS_DIR", though, so it's obvious what it is being used for... > +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & > + > +# Freeze/unfreeze file system randomly > +echo "Start freeze/unfreeze randomly" | tee -a $seq.full > +LOOP=10 > +while [ $LOOP -gt 0 ];do > + TIMEOUT=`expr $RANDOM % 5` > + sleep $TIMEOUT > + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -f $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: freeze filesystem failed" | tee -a $seq.full > + fi > + TIMEOUT=`expr $RANDOM % 3` > + sleep $TIMEOUT > + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -u $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: unfreeze filesystem failed" | tee -a $seq.full > + fi > + ((LOOP--)) Does that sort of decrement construct work on older versions of bash? > +done > +echo "Test done" | tee -a $seq.full > +killall -q $FSSTRESS_PROG > +sync No need for the sync, _check_scratch_fs will do it as part of the unmount. FWIW you probably need a "wait" call here to wait for all the fsstress processes to exit otherwise the unmount will fail. In fact, I bet that's what the sync call does - many of the 1000 fsstress processes will be blocked waiting for queued sys_sync() operations to complete as the kernel serialises them and fsstress issues them faster than they can be completed. queuing another sync will effectively wait for them all to complete and die. I often saw 700-800 of the fsstress processes stuck like this when testing the fix for the bug this test exposed... Cheers, Dave. -- Dave Chinner david@fromorbit.com From glommer@parallels.com Thu Jan 17 18:50:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 79EF27F66 for ; Thu, 17 Jan 2013 18:50:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 671D98F804B for ; Thu, 17 Jan 2013 16:50:45 -0800 (PST) X-ASG-Debug-ID: 1358470244-04cbb01327105350001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id bGX4dOFiqHl4fO1M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Jan 2013 16:50:44 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1Tw0AN-0004RP-T6; Thu, 17 Jan 2013 19:50:44 -0500 Received: from straightjacket.localdomain (216.239.55.193) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Thu, 17 Jan 2013 16:50:43 -0800 Message-ID: <50F89C77.4010101@parallels.com> Date: Thu, 17 Jan 2013 16:51:03 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130118001029.GK2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.193] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358470244 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-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.2.120155 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/17/2013 04:10 PM, Dave Chinner wrote: > and we end up with: > > lru_add(struct lru_list *lru, struct lru_item *item) > { > node_id = min(object_to_nid(item), lru->numnodes); > > __lru_add(lru, node_id, &item->global_list); > if (memcg) { > memcg_lru = find_memcg_lru(lru->memcg_lists, memcg_id) > __lru_add_(memcg_lru, node_id, &item->memcg_list); > } > } A follow up thought: If we have multiple memcgs, and global pressure kicks in (meaning none of them are particularly under pressure), shouldn't we try to maintain fairness among them and reclaim equal proportions from them all the same way we do with sb's these days, for instance? I would argue that if your memcg is small, the list of dentries is small: scan it all for the nodes you want shouldn't hurt. if the memcg is big, it will have per-node lists anyway. Given that, do we really want to pay the price of two list_heads in the objects? From tfarina@chromium.org Thu Jan 17 18:52:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3148C7F6A for ; Thu, 17 Jan 2013 18:52:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3EFA30406B for ; Thu, 17 Jan 2013 16:52:12 -0800 (PST) X-ASG-Debug-ID: 1358470330-04bdf04a5810cb40001-NocioJ Received: from mail-qa0-f52.google.com (mail-qa0-f52.google.com [209.85.216.52]) by cuda.sgi.com with ESMTP id EgEyNJGWI52Z5rPI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 17 Jan 2013 16:52:11 -0800 (PST) X-Barracuda-Envelope-From: tfarina@chromium.org X-Barracuda-Apparent-Source-IP: 209.85.216.52 Received: by mail-qa0-f52.google.com with SMTP id d13so2648397qak.11 for ; Thu, 17 Jan 2013 16:52:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=TtIsmhBjlw2rxUYfDoy9ENCI3aZQwO+uOswTjiULWdc=; b=GYHy8SSlWWZSL+cIh07HbleufuAtgwc877wVAAhJ8Vf9AUEzLbfy+r6a2AK0mYjI9p e3DoniRaexgkpgK5pMyEQkZEYxLQZu21Mn28/UNJuMJV6uAXEwR2RLIsvgvRWjtwJkgQ 0zUNHz3Qs8GAdUJKcrjpVPJgvWJsKlFDAuQIc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type:x-gm-message-state; bh=TtIsmhBjlw2rxUYfDoy9ENCI3aZQwO+uOswTjiULWdc=; b=hs4nj7fRJ9cNbUOZU2QsZm1Ct8/WVq7UdBOKmTlmQF/F6OIUj+nf89uYWSGfOa31Ns tYl4eaRX41VHzXQtwWKpqOEnaY0tsWCMLx1KABjaj7B1CYIA4CCtRjQNXlnVfFc+isyB m4/vUD/WWIOYsWU7bYLhQxfHpd3yLwCv1+LYdKMJrSVcbAZS5l+WSVa/yPnZPp8uTplT kNzM46kx9XYWPe5xxMnltMdTQJIEnCg1a4m11rpejRV50SIuwLUn8VJXhv6q02fK0LoY +oeHMr/2oQKmv6omcTn9yJ3WW8S3BwSNr9RTXSrDBOGtW8QH/SQ6pfBPYY8ad5XE5iJA u6Cg== MIME-Version: 1.0 X-Received: by 10.229.178.146 with SMTP id bm18mr1770038qcb.51.1358470330557; Thu, 17 Jan 2013 16:52:10 -0800 (PST) Received: by 10.229.78.195 with HTTP; Thu, 17 Jan 2013 16:52:10 -0800 (PST) In-Reply-To: <50f8947a.G99Y3+js5SanqAIW%fengguang.wu@intel.com> References: <50f8947a.G99Y3+js5SanqAIW%fengguang.wu@intel.com> Date: Thu, 17 Jan 2013 22:52:10 -0200 Message-ID: Subject: Re: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared From: Thiago Farina X-ASG-Orig-Subj: Re: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared To: kbuild test robot Cc: xfs@oss.sgi.com, Ben Myers Content-Type: text/plain; charset=ISO-8859-1 X-Gm-Message-State: ALoCoQleKA5tsy+iaSO4sRPap9ClLJT9y/rESvRjRYpkGShTNO63rfs8I8neyuVUcjkeRg7jYxTR X-Barracuda-Connect: mail-qa0-f52.google.com[209.85.216.52] X-Barracuda-Start-Time: 1358470331 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-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.2.120155 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 Thu, Jan 17, 2013 at 10:16 PM, kbuild test robot wrote: > tree: git://oss.sgi.com/xfs/xfs for-next > head: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 > commit: 667a9291c5b38318a47a2df730bc064e5d37d2a8 [7/8] xfs: Remove boolean_t typedef completely. > config: make ARCH=x86_64 allmodconfig > > All error/warnings: > > fs/xfs/xfs_log.c: In function 'xlog_sync': >>> fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared (first use in this function) > fs/xfs/xfs_log.c:1740:39: note: each undeclared identifier is reported only once for each function it appears in > > vim +/B_TRUE +1740 fs/xfs/xfs_log.c > > 1734 bp->b_flags |= XBF_FLUSH; > 1735 } > 1736 > 1737 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); > 1738 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize); > 1739 >> 1740 xlog_verify_iclog(log, iclog, count, B_TRUE); > 1741 s/B_TRUE/true ? > 1742 /* account for log which doesn't start at block #0 */ > 1743 XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart); > > --- > 0-DAY kernel build testing backend Open Source Technology Center > http://lists.01.org/mailman/listinfo/kbuild Intel Corporation -- Thiago From peter.andersson@hoganas.se Thu Jan 17 19:16:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-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 AF7157F6A for ; Thu, 17 Jan 2013 19:16:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39784AC003 for ; Thu, 17 Jan 2013 17:16:36 -0800 (PST) X-ASG-Debug-ID: 1358471794-04cbb01328106600001-w1Z2WR Received: from MAIL1.hoganas.se (mail1.hoganas.se [194.132.44.98]) by cuda.sgi.com with ESMTP id 5GE4fWbBfrbPFCRL (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 17 Jan 2013 17:16:35 -0800 (PST) X-Barracuda-Envelope-From: peter.andersson@hoganas.se X-Barracuda-Apparent-Source-IP: 194.132.44.98 Received: from HKNEX3.Hoganas.se (194.132.47.109) by MAIL1.hoganas.se (194.132.45.48) with Microsoft SMTP Server (TLS) id 8.3.297.1; Fri, 18 Jan 2013 02:21:31 +0100 Received: from HKNEX1.Hoganas.se ([194.132.47.110]) by HKNEX3.Hoganas.se ([194.132.47.109]) with mapi; Fri, 18 Jan 2013 02:16:33 +0100 From: Peter Andersson Date: Fri, 18 Jan 2013 02:16:32 +0100 Subject: =?windows-1256?Q?I_am_Mrs._Mona_Saeedi.=FE.=FE=FE?= Thread-Topic: =?windows-1256?Q?I_am_Mrs._Mona_Saeedi.=FE.=FE=FE?= X-ASG-Orig-Subj: =?windows-1256?Q?I_am_Mrs._Mona_Saeedi.=FE.=FE=FE?= Thread-Index: AQHN9RlzCUHXe2xe20qwNos9L2ehiA== Message-ID: <78C848A908B69945BDBF79703827027108932D1F2C@HKNEX1.Hoganas.se> Accept-Language: en-US, sv-SE Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US, sv-SE Content-Type: multipart/alternative; boundary="_000_78C848A908B69945BDBF79703827027108932D1F2CHKNEX1Hoganas_" MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: mail1.hoganas.se[194.132.44.98] X-Barracuda-Start-Time: 1358471795 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-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120155 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) --_000_78C848A908B69945BDBF79703827027108932D1F2CHKNEX1Hoganas_ Content-Type: text/plain; charset="windows-1256" Content-Transfer-Encoding: quoted-printable I am Mrs. Mona Saeedi, a Muslim woman.I have picked you for an inheritance.= I am aware that this is certainly not a conventional way of approach to est= ablish a relationship of trust and confidence, but you will realize the nee= d for my action.Please contact me on my private email for more details: mrs= mona@safadi-saeedi.com --_000_78C848A908B69945BDBF79703827027108932D1F2CHKNEX1Hoganas_ Content-Type: text/html; charset="windows-1256" Content-Transfer-Encoding: quoted-printable
I am Mrs. Mona Saeedi, a Muslim woman.I have picked you = for an inheritance.I am aware that this is certainly not a conventional way= of approach to establish a relationship of trust and confidence, but you will realize the need for my action.Please contact= me on my private email for more details: mrsmona@safadi-saeedi.com
--_000_78C848A908B69945BDBF79703827027108932D1F2CHKNEX1Hoganas_-- From xfs@tlinx.org Thu Jan 17 21:53:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C3ADA7F6A for ; Thu, 17 Jan 2013 21:53:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9E598F8035 for ; Thu, 17 Jan 2013 19:53:50 -0800 (PST) X-ASG-Debug-ID: 1358481225-04cb6c0237109060001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 5JpMLxF7xI1kjNA4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Jan 2013 19:53:46 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0I3rZIZ011133; Thu, 17 Jan 2013 19:53:37 -0800 Message-ID: <50F8C73F.6000601@tlinx.org> Date: Thu, 17 Jan 2013 19:53:35 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) References: <50F642C6.8050705@tlinx.org> <20130116121045.GE2498@dastard> X-ASG-Orig-Subj: Re: is thee anyway to pre-alloc space for a dir that is going to get a bunch of long filenames? (+ frag scripts) In-Reply-To: <20130116121045.GE2498@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358481226 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-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.2.120167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner wrote: > On Tue, Jan 15, 2013 at 10:03:50PM -0800, Linda Walsh wrote: >> Was doing some createrepo ops with about 3k rpms and it created a >> cachedir w/~10k LONG entries .. size of the dir was(is) 348k, >> did a frag count on it and it had 155 fragments. Ouch. >> >> Anyway to pre-alloc a dir or some means get a dir w/fewer frags... > > No. > >> Mostly curiosity -- though I'd fix it if there was an easy fix -- but >> it's not a dir that's going to get much access, so it doesn't matter >> alot. > > Just because the directory has lots of extents, it doesn't > mean it is fragmented. Indeed, the directory read order may be a > different order to the order of extents, especially as tehre are > multiple trees/indexes in the directory structure that are used > depending on the type of access. So unless you have a performance > problem, there is nothing to "fix". And if you do have a perf > problem with large directories, then use a larger directory block > size.... ---- Thanks!...it's not a problem, just my anal retentiveness! ;-) From eguan@redhat.com Thu Jan 17 23:16:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 97AFF7F6D for ; Thu, 17 Jan 2013 23:16:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5BF3D8F8035 for ; Thu, 17 Jan 2013 21:16:18 -0800 (PST) X-ASG-Debug-ID: 1358486177-04bdf04a5b115ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L1BWSigeoPjPrB9C for ; Thu, 17 Jan 2013 21:16:17 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0I5G9YS019506 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 18 Jan 2013 00:16:09 -0500 Received: from localhost ([10.66.13.231]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0I5G7Sq013300; Fri, 18 Jan 2013 00:16:08 -0500 Date: Fri, 18 Jan 2013 13:16:06 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock Message-ID: <20130118051606.GF2551@eguan-t400.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests 293: test xfs direct IO nested transaction deadlock References: <1358407669-29346-1-git-send-email-eguan@redhat.com> <20130118002818.GM2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130118002818.GM2498@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1358486177 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Jan 18, 2013 at 11:28:18AM +1100, Dave Chinner wrote: > On Thu, Jan 17, 2013 at 03:27:49PM +0800, Eryu Guan wrote: > > Regression test case for commit: > > > > 437a255 xfs: fix direct IO nested transaction deadlock. > > > > Signed-off-by: Eryu Guan > > Couple of things: > > > +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 > > +_scratch_mount >/dev/null 2>&1 > > + > > +TESTDIR="$SCRATCH_MNT/testdir" > > +mkdir -p $TESTDIR > > That's far too similar to TEST_DIR - the mount point for the test > device. Reading the test makes me wonder why fsstress is beig run > on the test device, while the freezes are being done on the scratch > device. > > Other tests use $testdir, which is fine because the difference in > case makes it obvious that it's not the test device mount point. I'd > prefer you cal it something like "STRESS_DIR", though, so it's > obvious what it is being used for... Make sense, I'll change it to STRESS_DIR > > > +$FSSTRESS_PROG -d $TESTDIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & > > + > > +# Freeze/unfreeze file system randomly > > +echo "Start freeze/unfreeze randomly" | tee -a $seq.full > > +LOOP=10 > > +while [ $LOOP -gt 0 ];do > > + TIMEOUT=`expr $RANDOM % 5` > > + sleep $TIMEOUT > > + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full > > + xfs_freeze -f $SCRATCH_MNT > > + if [ $? -ne 0 ];then > > + echo " - Error: freeze filesystem failed" | tee -a $seq.full > > + fi > > + TIMEOUT=`expr $RANDOM % 3` > > + sleep $TIMEOUT > > + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full > > + xfs_freeze -u $SCRATCH_MNT > > + if [ $? -ne 0 ];then > > + echo " - Error: unfreeze filesystem failed" | tee -a $seq.full > > + fi > > + ((LOOP--)) > > Does that sort of decrement construct work on older versions of > bash? I've tried it on RHEL5.8 and it worked as expected, bash version is 3.2.25, so I guess that's fine. But I think it's better to use the expression let LOOP=$LOOP-1 which many other tests used to decrease counter. > > > +done > > +echo "Test done" | tee -a $seq.full > > +killall -q $FSSTRESS_PROG > > +sync > > No need for the sync, _check_scratch_fs will do it as part of the > unmount. FWIW you probably need a "wait" call here to wait for all > the fsstress processes to exit otherwise the unmount will fail. > > In fact, I bet that's what the sync call does - many of the 1000 > fsstress processes will be blocked waiting for queued sys_sync() > operations to complete as the kernel serialises them and fsstress > issues them faster than they can be completed. queuing another sync > will effectively wait for them all to complete and die. I often saw > 700-800 of the fsstress processes stuck like this when testing the > fix for the bug this test exposed... Yes, that's what the sync call is for. After more testings, I found that unmount succeeds without any wait/sync call on upstream kernel(3.8-rc3), sync is needed on RHEL6 kernel to make unmount success, wait won't help. I have three proposals: 1. do not kill any fsstress processes, call wait to wait for them to die 2. kill fsstress and call wait (as what you suggested, but would fail on RHEL6 kernel, another RHEL bug needed?) 3. kill fsstress and call sync(leave the sync untouched), this will make it pass on both upstream and RHEL kernels Any other better ways to go? Thanks for the review! Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Fri Jan 18 02:08:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F097D7F3F for ; Fri, 18 Jan 2013 02:08:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1BB730406B for ; Fri, 18 Jan 2013 00:08:30 -0800 (PST) X-ASG-Debug-ID: 1358496508-04bdf04a59119e00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SbYswfAGaYQwxiAc for ; Fri, 18 Jan 2013 00:08:28 -0800 (PST) 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: ArYNAFAC+VB5LBTV/2dsb2JhbABFuBaGHRdzgh4BAQQBJxMcIwULCAMOCgklDwUlAyETiBMFvAIVkSQDklmDMolOhnyDCQ Received: from ppp121-44-20-213.lns20.syd6.internode.on.net (HELO dastard) ([121.44.20.213]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Jan 2013 18:38:27 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tw6zx-0001zV-8K; Fri, 18 Jan 2013 19:08:25 +1100 Date: Fri, 18 Jan 2013 19:08:25 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130118080825.GP2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F89C77.4010101@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F89C77.4010101@parallels.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: 1358496508 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi 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.2.120182 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 04:51:03PM -0800, Glauber Costa wrote: > On 01/17/2013 04:10 PM, Dave Chinner wrote: > > and we end up with: > > > > lru_add(struct lru_list *lru, struct lru_item *item) > > { > > node_id = min(object_to_nid(item), lru->numnodes); > > > > __lru_add(lru, node_id, &item->global_list); > > if (memcg) { > > memcg_lru = find_memcg_lru(lru->memcg_lists, memcg_id) > > __lru_add_(memcg_lru, node_id, &item->memcg_list); > > } > > } > > A follow up thought: If we have multiple memcgs, and global pressure > kicks in (meaning none of them are particularly under pressure), > shouldn't we try to maintain fairness among them and reclaim equal > proportions from them all the same way we do with sb's these days, for > instance? I don't like the complexity. The global lists will be reclaimed in LRU order, so it's going to be as fair as can be. If there's a memcg that has older unused objectsi than the others, then froma global perspective they should be reclaimed first because the memcg is not using them... > I would argue that if your memcg is small, the list of dentries is > small: scan it all for the nodes you want shouldn't hurt. on the contrary - the memcg might be small, but what happens if someone ran a find across all the filesytsems on the system in it? Then the LRU will be huge, and scanning expensive... We can't make static decisions about small and large, and we can't trust heuristics to get it right, either. If we have a single list, we don't/can't do node-aware reclaim efficiently and so shouldn't even try. > if the memcg is big, it will have per-node lists anyway. But may have no need for them due to the workload. ;) > Given that, do we really want to pay the price of two list_heads > in the objects? I'm just looking at ways at making the infrastructure sane. If the cost is an extra 16 bytes per object on a an LRU, then that a small price to pay for having robust memory reclaim infrastructure.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Jan 18 02:11:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AA1FE7F3F for ; Fri, 18 Jan 2013 02:11:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93189304043 for ; Fri, 18 Jan 2013 00:11:36 -0800 (PST) X-ASG-Debug-ID: 1358496694-04cbb01328115ac0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4X5SKx3GjOlOeDa5 for ; Fri, 18 Jan 2013 00:11:35 -0800 (PST) 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: ArYNAFAC+VB5LBTV/2dsb2JhbABFuBaGHRdzgh4BAQQBOhwjBQsIAw4KCSUPBSUDIRMZh3oFvAIVkSQDlguJToZ8gwk Received: from ppp121-44-20-213.lns20.syd6.internode.on.net (HELO dastard) ([121.44.20.213]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Jan 2013 18:41:34 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Tw72z-00020B-EH; Fri, 18 Jan 2013 19:11:33 +1100 Date: Fri, 18 Jan 2013 19:11:33 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130118081133.GQ2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F893D2.7080103@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F893D2.7080103@parallels.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: 1358496694 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi 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.2.120182 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 17, 2013 at 04:14:10PM -0800, Glauber Costa wrote: > On 01/17/2013 04:10 PM, Dave Chinner wrote: > > And then each object uses: > > > > struct lru_item { > > struct list_head global_list; > > struct list_head memcg_list; > > } > by objects you mean dentries, inodes, and the such, right? Yup. > Would it be acceptable to you? If it works the way I think it should, then yes. > We've been of course doing our best to avoid increasing the size of the > objects, therefore this is something we've never mentioned. However, if > it would be acceptable from the fs POV, this would undoubtedly make our > life extremely easier. I've been trying hard to work out how to avoid increasing the size of structures as well. But if we can't work out how to implement something sanely with only a single list head per object to work from, then increasing the size of objects is something that we need to consider if it solves all the problems we are trying to solve. i.e. if adding a second list head makes the code dumb, simple, obviously correct and hard to break then IMO it's a no-brainer. But we have to tick all the right boxes first... Cheers, Dave. -- Dave Chinner david@fromorbit.com From megan@comcast.com Fri Jan 18 04:15:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D4B617F37 for ; Fri, 18 Jan 2013 04:15:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5BC4304066 for ; Fri, 18 Jan 2013 02:15:29 -0800 (PST) X-ASG-Debug-ID: 1358504128-04cb6c0237111a50001-NocioJ Received: from adamant-studio.com (marketgold.ru [85.10.193.140]) by cuda.sgi.com with ESMTP id egCjcBllkInaOwGl for ; Fri, 18 Jan 2013 02:15:28 -0800 (PST) X-Barracuda-Envelope-From: megan@comcast.com X-Barracuda-Apparent-Source-IP: 85.10.193.140 Received: from 174.34.168.242.rdns.ubiquityservers.com (unknown [222.178.10.248]) by adamant-studio.com (Postfix) with ESMTPA id B3E6E3C056A; Fri, 18 Jan 2013 13:15:20 +0300 (MSK) Message-ID: Reply-To: =?windows-1251?B?1uXt8vAg7+7k4+7y7uLq6CDx7+X26ODr6PHy?= =?windows-1251?B?7uI=?= From: =?windows-1251?B?1uXt8vAg7+7k4+7y7uLq6CDx7+X26ODr6PHy?= =?windows-1251?B?7uI=?= To: , , , Subject: =?windows-1251?B?MTgg/+3i4PD/IDIwMTPj?= Date: Fri, 18 Jan 2013 13:15:25 +0300 X-ASG-Orig-Subj: =?windows-1251?B?MTgg/+3i4PD/IDIwMTPj?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_22BE_01CDF57D.E0BA3830" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 X-Barracuda-Connect: marketgold.ru[85.10.193.140] X-Barracuda-Start-Time: 1358504128 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.26 X-Barracuda-Spam-Status: No, SCORE=1.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. ------=_NextPart_000_22BE_01CDF57D.E0BA3830 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C8=F1=F5.N 2311/18-01 =CA=F3=E4=E0: = =C2 =EE=F2=E4=E5=EB =C2=DD=C4 =EE=F2 18 =FF=ED=E2=E0=F0=FF 2013=E3. =CA=EE= =EC=F3: =D0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FE =D3=E2=E0=E6=E0=E5=EC=FB=E5 =F3=F7=E0=F1=F2=ED=E8=EA= =E8 =C2=DD=C4! =20 =C8=ED=F4=EE=F0=EC=E8=F0=F3=E5=EC =C2=E0=F1, =F7=F2=EE =E2 =D1=E0=ED=EA=F2= -=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =EF=F0=EE=E2=EE=E4=E8=F2=F1=FF =EA=EE=ED=F4= =E5=F0=E5=ED=F6=E8=FF, =EF=EE=F1=E2=FF=F9=E5=ED=ED=E0=FF =EF=EE=F1=EB=E5=E4= =ED=E8=EC =E8=E7=EC=E5=ED=E5=ED=E8=FF=EC =E2 =F2=E0=EC=EE=E6=E5=ED=ED=EE=EC= =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E5. =20 =20 ---------------------------------------------------------------------- =D2=E5=EC=E0: "=C2=DD=C4 2013. =CF=F0=E0=EA=F2=E8=EA=E0 =EF=F0=E8=EC=E5=ED= =E5=ED=E8=FF =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0.=20 =C2=DD=C4 =E2 =F0=E0=EC=EA=E0=F5 =C2=D2=CE". =C4=E0=F2=FB: 04 - 05 =F4=E5=E2=F0=E0=EB=FF 2013 =E3=EE=E4=E0 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 ---------------------------------------------------------------------- = =20 =20 =C2 =F0=E0=EC=EA=E0=F5 =EF=F0=EE=E3=F0=E0=EC=EC=FB =EE=F1=E2=FF=F9=E0=FE=F2= =F1=FF =E2=EE=EF=F0=EE=F1=FB =EF=F0=E0=E2=EE=E2=EE=E3=EE =F0=E5=E3=F3=EB=E8= =F0=EE=E2=E0=ED=E8=FF =C2=DD=C4, =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F0=E5= =E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =E2 =F0=E0=EC=EA=E0=F5 =C2=D2=CE =E8 =E4= =F0=F3=E3=E8=E5 =E2=EE=EF=F0=EE=F1=FB. =C7=E0=EF=F0=EE=F1=E8=F2=FC =EF=F0=EE=E3=F0=E0=EC=EC=F3 =EA=EE=ED=F4=E5=F0= =E5=ED=F6=E8=E8 =EC=EE=E6=ED=EE =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3: 8 {= =EA=EE=E4 =CF=E8=F2=E5=F0=E0 } 642 -- 48 - 45=20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =CC=E0=F0=EA=E8=ED=E0 =C5=EA=E0=F2=E5=F0=E8=ED=E0 =CD=E8=EA=EE=EB=E0=E5=E2= =ED=E0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=FB=E9 =EE=F2=E4=E5=EB =EA=EE=ED=F4=E5= =F0=E5=ED=F6=E8=E9 =EF=EE =C2=DD=C4 =D2=E5=EB.: [ =EA=EE=E4 =CF=E8=F2=E5=F0=E0 ] 642 . =D7= 8 ^ 45=20 ------=_NextPart_000_22BE_01CDF57D.E0BA3830 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C8=F1=F5.N=20 2311/18-01          &nb= sp;           &nbs= p;          =20 =CA=F3=E4=E0:    =C2 =EE=F2=E4=E5=EB =C2=DD=C4
=EE=F2 1= 8 =FF=ED=E2=E0=F0=FF=20 2013=E3.           = ;            =        =20 =CA=EE=EC=F3:   =D0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FE
 

          &nbs= p;           =20 =D3=E2=E0=E6=E0=E5=EC=FB=E5 =F3=F7=E0=F1=F2=ED=E8=EA=E8=20 =C2=DD=C4!
          = ;            = =20
=C8=ED=F4=EE=F0=EC=E8=F0=F3=E5=EC =C2=E0=F1, =F7=F2=EE =E2 =D1=E0=ED=EA= =F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =EF=F0=EE=E2=EE=E4=E8=F2=F1=FF =EA=EE=ED= =F4=E5=F0=E5=ED=F6=E8=FF, =EF=EE=F1=E2=FF=F9=E5=ED=ED=E0=FF=20 =EF=EE=F1=EB=E5=E4=ED=E8=EC =E8=E7=EC=E5=ED=E5=ED=E8=FF=EC =E2 =F2=E0=EC=EE= =E6=E5=ED=ED=EE=EC=20 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E5.    =             &= nbsp;   =20
 
           &n= bsp;          =20
---------------------------------------------------------------------= -
=D2=E5=EC=E0:=20 "=C2=DD=C4 2013. =CF=F0=E0=EA=F2=E8=EA=E0 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF = =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0.=20
       =C2=DD=C4 =E2 =F0=E0=EC=EA=E0=F5= =C2=D2=CE".
 
=C4=E0=F2=FB: 04 - 05 =F4=E5=E2=F0=E0=EB=FF 2013 =E3=EE=E4=E0
&nb= sp;     =E3.=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
--------------------------= --------------------------------------------     = ;=20
 
     
=C2 =F0=E0=EC=EA=E0=F5 =EF=F0=EE=E3= =F0=E0=EC=EC=FB =EE=F1=E2=FF=F9=E0=FE=F2=F1=FF =E2=EE=EF=F0=EE=F1=FB=20 =EF=F0=E0=E2=EE=E2=EE=E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =C2=DD= =C4, =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8= =FF =E2 =F0=E0=EC=EA=E0=F5 =C2=D2=CE =E8 =E4=F0=F3=E3=E8=E5=20 =E2=EE=EF=F0=EE=F1=FB.
 

=C7=E0=EF=F0=EE=F1=E8=F2=FC =EF=F0=EE=E3=F0=E0=EC=EC=F3 =EA=EE=ED= =F4=E5=F0=E5=ED=F6=E8=E8 =EC=EE=E6=ED=EE =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:= =20 8 { =EA=EE=E4 =CF=E8=F2=E5=F0=E0 } 642 -- 48 - 45 =

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
 
=CC=E0=F0=EA=E8=ED=E0 =C5=EA=E0=F2=E5=F0=E8=ED=E0 =CD=E8=EA=EE=EB=E0= =E5=E2=ED=E0
=E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=FB=E9 =EE=F2=E4=E5=EB= =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E9 =EF=EE=20 =C2=DD=C4
=D2=E5=EB.: [ =EA=EE=E4 =CF=E8=F2=E5=F0=E0 ] 64= 2 . =D78 ^ 45
------=_NextPart_000_22BE_01CDF57D.E0BA3830-- From rwheeler@redhat.com Fri Jan 18 05:56:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 45B747F37 for ; Fri, 18 Jan 2013 05:56:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22BCD8F8035 for ; Fri, 18 Jan 2013 03:56:27 -0800 (PST) X-ASG-Debug-ID: 1358510185-04cbb0132811aac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QkTFaIlztptZEMBE for ; Fri, 18 Jan 2013 03:56:26 -0800 (PST) X-Barracuda-Envelope-From: rwheeler@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 r0IBuLri008834 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 18 Jan 2013 06:56:21 -0500 Received: from tunkums.home ([10.3.112.11]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0IBuJ1e016617; Fri, 18 Jan 2013 06:56:20 -0500 Message-ID: <50F93863.8050508@redhat.com> Date: Fri, 18 Jan 2013 06:56:19 -0500 From: Ric Wheeler User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: "linux-ext4@vger.kernel.org" , linux-btrfs , xfs@oss.sgi.com Subject: [Lsf-pc] [CFP] Linux Storage, Filesystem and Memory Management Summit 2013 Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [Lsf-pc] [CFP] Linux Storage, Filesystem and Memory Management Summit 2013 Content-Transfer-Encoding: 7bit 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: 1358510186 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The annual Linux Storage, Filesystem and Memory Management Summit for 2013 will be held on April 18th and 19th following the Linux Foundation Collaboration Summit at Parc 55 Hotel in San Francisco, CA: https://events.linuxfoundation.org/events/collaboration-summit https://events.linuxfoundation.org/events/lsfmm-summit We'd therefore like to issue a call for agenda proposals that are suitable for cross-track discussion as well as more technical subjects for discussion in the breakout sessions. 1) Suggestions for agenda topics should be sent before February 8th 2013 to: lsf-pc@lists.linux-foundation.org and optionally cc the Linux list which would be most interested in it: ATA: linux-ide@vger.kernel.org SCSI: linux-scsi@vger.kernel.org FS: linux-fsdevel@vger.kernel.org MM: linux-mm@kvack.org Please remember to tag your subject with [LSF/MM TOPIC] to make it easier to track. Agenda topics and attendees will be selected by the program committee, but the final agenda will be formed by consensus of the attendees on the day. We'll try to cap attendance at around 25-30 per track to facilitate discussions although the final numbers will depend on the room sizes at the venue. 2) Requests to attend the summit should be sent to: lsf-pc@lists.linux-foundation.org Please summarize what expertise you will bring to the meeting, and what you'd like to discuss. please also tag your email with [ATTEND] so there's less chance of it getting lost in the large mail pile. Presentations are allowed to guide discussion, but are strongly discouraged. There will be no recording or audio bridge. However, written minutes will be published as in previous years: 2012: http://lwn.net/Articles/490114/ http://lwn.net/Articles/490501/ 2011: http://lwn.net/Articles/436871/ http://lwn.net/Articles/437066/ 2010: http://lwn.net/Articles/399148/ http://lwn.net/Articles/399313/ http://lwn.net/Articles/400589/ 2009: http://lwn.net/Articles/327601/ http://lwn.net/Articles/327740/ http://lwn.net/Articles/328347/ Prior years: http://www.usenix.org/events/lsf08/tech/lsf08sums.pdf http://www.usenix.org/publications/login/2007-06/openpdfs... 3) If you have feedback on last year's meeting that we can use to improve this year's, please also send that to: lsf-pc@lists.linux-foundation.org Thank you on behalf of the program committee: Storage: Martin K. Petersen Jens Axboe James Bottomley Filesystems: Ric Wheeler Christoph Hellwig Jaegeuk Kim Jeffrey Layton Tao Ma Chris Mason Trond Myklebust Eric Sandeen Theodore Ts'o Sage Weil MM: Rik van Riel Mel Gorman Ying Han _______________________________________________ Lsf-pc mailing list Lsf-pc@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/lsf-pc From obozy@1v.pl Fri Jan 18 07:06:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,UPPERCASE_50_75 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 A00767F37 for ; Fri, 18 Jan 2013 07:06:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6024430406B for ; Fri, 18 Jan 2013 05:06:52 -0800 (PST) X-ASG-Debug-ID: 1358514408-04bdf04a5b120fb0001-NocioJ Received: from alx120.rev.netart.pl (alx120.rev.netart.pl [85.128.180.120]) by cuda.sgi.com with ESMTP id ENDN2NzrsJQ4oYTC for ; Fri, 18 Jan 2013 05:06:49 -0800 (PST) X-Barracuda-Envelope-From: obozy@1v.pl X-Barracuda-Apparent-Source-IP: 85.128.180.120 Received: from Piotr-Komputer (unknown [83.23.189.2]) by vitaltur.nazwa.pl (Postfix) with ESMTP id 34C86294869B; Fri, 18 Jan 2013 14:06:27 +0100 (CET) From: "Miejsca Na ZIMOWISKO" To: "Miejsca Na ZIMOWISKO" Subject: MIejsce na ZIMOWISKO Message-ID: <75AF76C51EC2D61AC8DABBA149C0F674@Piotr-Komputer> X-ASG-Orig-Subj: MIejsce na ZIMOWISKO Date: Fri, 18 Jan 2013 14:06:50 +0100 Organization: VITALTUR-COM MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------000804030308030808070807" X-Barracuda-Connect: alx120.rev.netart.pl[85.128.180.120] X-Barracuda-Start-Time: 1358514408 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.99 X-Barracuda-Spam-Status: No, SCORE=0.99 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120201 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address This is a multi-part message in MIME format. --------------000804030308030808070807 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-2";format=flowed DOSKONA=A3E MIEJSCE NA ZIMOWISKO 340 Z=A3 TURNUS 6 DNI=20 ZAPRASAMY DO JASTROWIA ODDALONEGO=20 OD POZNANIA 130 km=20 OD BYDGOSZCZY 100 km=20 Osrodek Wypoczynkowy "Le=B6na Chata" TURNUSY 6 DNIOWE ( 5 D=D3B)=20 W CENIE 69 Z=A3 OD OSOBY DOBA -- TURNUS (340 Z=A3/OS.)=20 ZAKWATEROWANIE W POKOJACH 2- 3 OSOBOWYCH z TV i WiFi WY=AFYWIENIE 4 POSI=A3KI DZIENNIE=20 SALE Z MAT=A1 DO =C6WICZEN=20 2 X 70 MIN AQUAPARK=20 SALE WYK=A3ADOW=A1 Z RZUTNIKIEM=20 BOISKO WIELOFUNKCYJNE=20 2 WYCHOWAWCOW BEZPLATNIE=20 CODZIENNE nordic walking 30 min Z KIJKAMI=20 SAUNA SUCHA pod opieka wychowawcy=20 SI=A3OWNIA=20 OGNISKO Z KIELBASKAMI=20 MO=AFLIWO=A6=C6 SKOZYSTANIA Z POBLISKICH PAG=D3RKOW D=A3UGO=A6=C6 ZJAZDU= OK 200 M OFERTA DLA MIN 40 OS=D3B PE=A3NOP=A3ATNYCH TURNUS (6 DNIOWY)=20 ZAPRASZAMY MI=A3O=A6NIK=D3W ZIMOWISK Pozdrawiam=20 INFOLINIA 604936806 FAX 672662580=20 mail: obozy@1v.pl=20 WWW.LESNACHATA.PL=20 VITALTUR - koncesja Woj. Wielkopolskiego nr 160 Najlepszym Us=B3ugodawc=B1 Bran=BFy Turystycznej 2011 roku! Wydarzenie Roku Z=A3OTY HERB 2012 r oku=20 64-915 Jastrowie ul. Jeziorna 1 WIELKOPOLSKA (Bory Kraje=F1ski --------------000804030308030808070807 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="iso-8859-2" =0A =0A =0A =0A = =0A =0A

DOSKONA=A3E = MIEJSCE NA ZIMOWISKO 340 Z=A3 TURNUS 6 =0ADNI 

=0A

ZAPRASAMY DO JASTROWIA ODDALONEGO
OD = GDA=D1SKA 190 km  =0A
OD POZNANIA 130 km
OD BYDGOSZCZY 100 km= =0A

=0A

Osrodek =0AWypocz= ynkowy "Le=B6na Chata" TURNUSY =0A6 DNIOWE ( 5 D=D3B)
W CENIE 69 Z=A3 OD OSOBY DOBA -- TURNUS =0A(3= 40 Z=A3/OS.)

=0A<= UL> =0A
  • =0A
    ZAKWATEROWANIE W POKOJACH 2- 3 OSOBOWYCH z =0A TV i W= iFi
    =0A
  • =0A
    WY=AFYWIENIE 4 POSI=A3KI DZIENNIE =0A
    =0A
  • =0A
    SALE Z MAT=A1 DO =C6WICZEN
    =0A =0A
    2 X 70 MIN AQUA= PARK
    =0A
  • =0A
    = SALE WYK=A3ADOW=A1 Z RZUTNIKIEM
    = =0A
  • =0A
    B= OISKO WIELOFUNKCYJNE
    =0A
  • =0A 2 WYCHOWAWCOW BEZPLATNIE =0A
  • =0A
    CODZIENNE nordic walking 30 min Z KIJKAMI =0A
    =0A
  • =0A
    SAUNA SUCHA pod opieka wychowawcy =0A =0A
  • =0A
    SI=A3OWNIA
    =0A
  • =0A
    OGNISKO Z KIELBASKAMI
    = =0A
  • =0A
    MO=AFLIWO=A6=C6 SKOZYSTANIA Z POBLISKICH =0A PAG=D3RKOW D=A3= UGO=A6=C6 ZJAZDU OK 200 M
  • =0A

    OFERTA DLA MIN 40 OS=D3B PE=A3NOP=A3ATNYCH TURNUS (6 DNIOWY)

    = =0A

    WIECEJ O O=A6RODKU wiecej = =0A

    ZAPRA= SZAMY MI=A3O=A6NIK=D3W =0AZIMOWISK
    Pozdrawiam
    <= FONT color=3D#808080>INFOLINIA  604936806 =0AFAX 6726625= 80 
    mail:
    obozy@1v.pl
    www.lesnachata.pl

    = =0A

    Je=B6l= i chcesz wypisa=E6 si=EA z =0Alisty kliknij link Rezygnacji<= /FONT> lub napisz do nas

    = =0A

     

    <= /SPAN> =0A =0A --------------000804030308030808070807-- From glommer@parallels.com Fri Jan 18 13:01:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 14FFF7F37 for ; Fri, 18 Jan 2013 13:01:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 675B3AC005 for ; Fri, 18 Jan 2013 11:01:43 -0800 (PST) X-ASG-Debug-ID: 1358535697-04bdf04a5812d550001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id Po9ALKV2YGOKnXAS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 11:01:38 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TwHC4-0006HR-OI; Fri, 18 Jan 2013 14:01:37 -0500 Received: from straightjacket.localdomain (216.239.55.194) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Fri, 18 Jan 2013 11:01:35 -0800 Message-ID: <50F99C24.4040003@parallels.com> Date: Fri, 18 Jan 2013 11:01:56 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F89C77.4010101@parallels.com> <20130118080825.GP2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130118080825.GP2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.194] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358535698 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-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.2.120224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/18/2013 12:08 AM, Dave Chinner wrote: > On Thu, Jan 17, 2013 at 04:51:03PM -0800, Glauber Costa wrote: >> On 01/17/2013 04:10 PM, Dave Chinner wrote: >>> and we end up with: >>> >>> lru_add(struct lru_list *lru, struct lru_item *item) >>> { >>> node_id = min(object_to_nid(item), lru->numnodes); >>> >>> __lru_add(lru, node_id, &item->global_list); >>> if (memcg) { >>> memcg_lru = find_memcg_lru(lru->memcg_lists, memcg_id) >>> __lru_add_(memcg_lru, node_id, &item->memcg_list); >>> } >>> } >> >> A follow up thought: If we have multiple memcgs, and global pressure >> kicks in (meaning none of them are particularly under pressure), >> shouldn't we try to maintain fairness among them and reclaim equal >> proportions from them all the same way we do with sb's these days, for >> instance? > > I don't like the complexity. The global lists will be reclaimed in > LRU order, so it's going to be as fair as can be. If there's a memcg > that has older unused objectsi than the others, then froma global > perspective they should be reclaimed first because the memcg is not > using them... > Disclaimer: I don't necessarily disagree with you, but let's explore the playing field... How do we know ? The whole point of memcg is maintaining a best-effort isolation between different logically separated entities. If we need to reclaim 1k dentries, and your particular memcg has the first 1k dentries in the LRU, it is not obvious that you should be hurt more than others just because you are idle for longer. You could of course argue that under global reclaim, we should lift our fairness attempts in this case, specially given cost and complexity trade offs, but still. >> I would argue that if your memcg is small, the list of dentries is >> small: scan it all for the nodes you want shouldn't hurt. > > on the contrary - the memcg might be small, but what happens if > someone ran a find across all the filesytsems on the system in it? > Then the LRU will be huge, and scanning expensive... > The memcg being small means that the size of the list is limited, no? It can never use more memory than X bytes, which translates to Y entries. If you do it, you will trigger reclaim for yourself. > We can't make static decisions about small and large, and we can't > trust heuristics to get it right, either. If we have a single list, > we don't/can't do node-aware reclaim efficiently and so shouldn't > even try. > >> if the memcg is big, it will have per-node lists anyway. > > But may have no need for them due to the workload. ;) > sure. >> Given that, do we really want to pay the price of two list_heads >> in the objects? > > I'm just looking at ways at making the infrastructure sane. If the > cost is an extra 16 bytes per object on a an LRU, then that a small > price to pay for having robust memory reclaim infrastructure.... > We still need to evaluate that versus the solution to use some sort of dynamic node-list allocation, which would allow us to address online nodes instead of possible nodes. This way, memory overhead may very well be bounded enough so everybody gets to be per-node. From glommer@parallels.com Fri Jan 18 13:09:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 897197F37 for ; Fri, 18 Jan 2013 13:09:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EE414AC001 for ; Fri, 18 Jan 2013 11:09:42 -0800 (PST) X-ASG-Debug-ID: 1358536181-04cb6c023a1239e0001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id TaEbgAb8jRhBt8ZU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 11:09:41 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TwHJt-0006Mo-AI; Fri, 18 Jan 2013 14:09:41 -0500 Received: from straightjacket.localdomain (216.239.55.194) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Fri, 18 Jan 2013 11:09:40 -0800 Message-ID: <50F99E08.4060107@parallels.com> Date: Fri, 18 Jan 2013 11:10:00 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F893D2.7080103@parallels.com> <20130118081133.GQ2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130118081133.GQ2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.194] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358536181 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-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.2.120224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/18/2013 12:11 AM, Dave Chinner wrote: > On Thu, Jan 17, 2013 at 04:14:10PM -0800, Glauber Costa wrote: >> On 01/17/2013 04:10 PM, Dave Chinner wrote: >>> And then each object uses: >>> >>> struct lru_item { >>> struct list_head global_list; >>> struct list_head memcg_list; >>> } >> by objects you mean dentries, inodes, and the such, right? > > Yup. > >> Would it be acceptable to you? > > If it works the way I think it should, then yes. > >> We've been of course doing our best to avoid increasing the size of the >> objects, therefore this is something we've never mentioned. However, if >> it would be acceptable from the fs POV, this would undoubtedly make our >> life extremely easier. > > I've been trying hard to work out how to avoid increasing the size > of structures as well. But if we can't work out how to implement > something sanely with only a single list head per object to work > from, then increasing the size of objects is something that we need > to consider if it solves all the problems we are trying to solve. > > i.e. if adding a second list head makes the code dumb, simple, > obviously correct and hard to break then IMO it's a no-brainer. > But we have to tick all the right boxes first... > One of our main efforts recently has been trying to reduce memcg impact when it is not in use, even if its compiled in. So what really bothers me here is the fact that we are increasing the size of dentries and inodes no matter what. Still within the idea of exploring the playing field, would an indirection be worth it ? We would increase the total per-object memory usage by 8 bytes instead of 16: the dentry gets a pointer, and a separate allocation for the list_lru. When memcg is not being actively used, we can allocate a smaller list_lru, with only the global list. When it is, we allocate the whole thing. Embedding the lru is certainly easier from my PoV, the main question is how much do you, as a fs representative, value those 8 bytes? From bpm@sgi.com Fri Jan 18 14:17:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 8917C7F37 for ; Fri, 18 Jan 2013 14:17:50 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D50F30405F; Fri, 18 Jan 2013 12:17:47 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 03A5A4266DC; Fri, 18 Jan 2013 14:17:46 -0600 (CST) Date: Fri, 18 Jan 2013 14:17:46 -0600 From: Ben Myers To: Thiago Farina Cc: kbuild test robot , xfs@oss.sgi.com Subject: Re: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared Message-ID: <20130118201746.GL27055@sgi.com> References: <50f8947a.G99Y3+js5SanqAIW%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Jan 17, 2013 at 10:52:10PM -0200, Thiago Farina wrote: > On Thu, Jan 17, 2013 at 10:16 PM, kbuild test robot > wrote: > > tree: git://oss.sgi.com/xfs/xfs for-next > > head: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 > > commit: 667a9291c5b38318a47a2df730bc064e5d37d2a8 [7/8] xfs: Remove boolean_t typedef completely. > > config: make ARCH=x86_64 allmodconfig > > > > All error/warnings: > > > > fs/xfs/xfs_log.c: In function 'xlog_sync': > >>> fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared (first use in this function) > > fs/xfs/xfs_log.c:1740:39: note: each undeclared identifier is reported only once for each function it appears in > > > > vim +/B_TRUE +1740 fs/xfs/xfs_log.c > > > > 1734 bp->b_flags |= XBF_FLUSH; > > 1735 } > > 1736 > > 1737 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); > > 1738 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize); > > 1739 > >> 1740 xlog_verify_iclog(log, iclog, count, B_TRUE); > > 1741 > s/B_TRUE/true > ? You are correct. I neglected to do a debug build. Fail. :/ From: Ben Myers xfs: fix debug build Commit 667a9291c5b3 "xfs: Remove boolean_t typedef completely." didn't. Remove a stray B_TRUE that breaks CONFIG_XFS_DEBUG=y. Signed-off-by: Ben Myers Reported-by: Wu Fengguang Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c +++ xfs/fs/xfs/xfs_log.c @@ -1737,7 +1737,7 @@ xlog_sync( ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize); - xlog_verify_iclog(log, iclog, count, B_TRUE); + xlog_verify_iclog(log, iclog, count, true); /* account for log which doesn't start at block #0 */ XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart); From tinguely@sgi.com Fri Jan 18 14:45:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 31F577F37 for ; Fri, 18 Jan 2013 14:45:15 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id C21CC304066; Fri, 18 Jan 2013 12:45:14 -0800 (PST) Message-ID: <50F9B45A.3080807@sgi.com> Date: Fri, 18 Jan 2013 14:45:14 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Ben Myers CC: Thiago Farina , kbuild test robot , xfs@oss.sgi.com Subject: Re: [xfs:for-next 7/8] fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared References: <50f8947a.G99Y3+js5SanqAIW%fengguang.wu@intel.com> <20130118201746.GL27055@sgi.com> In-Reply-To: <20130118201746.GL27055@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/18/13 14:17, Ben Myers wrote: > On Thu, Jan 17, 2013 at 10:52:10PM -0200, Thiago Farina wrote: >> On Thu, Jan 17, 2013 at 10:16 PM, kbuild test robot >> wrote: >>> tree: git://oss.sgi.com/xfs/xfs for-next >>> head: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 >>> commit: 667a9291c5b38318a47a2df730bc064e5d37d2a8 [7/8] xfs: Remove boolean_t typedef completely. >>> config: make ARCH=x86_64 allmodconfig >>> >>> All error/warnings: >>> >>> fs/xfs/xfs_log.c: In function 'xlog_sync': >>>>> fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared (first use in this function) >>> fs/xfs/xfs_log.c:1740:39: note: each undeclared identifier is reported only once for each function it appears in >>> >>> vim +/B_TRUE +1740 fs/xfs/xfs_log.c >>> >>> 1734 bp->b_flags |= XBF_FLUSH; >>> 1735 } >>> 1736 >>> 1737 ASSERT(XFS_BUF_ADDR(bp)<= log->l_logBBsize-1); >>> 1738 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count)<= log->l_logBBsize); >>> 1739 >>>> 1740 xlog_verify_iclog(log, iclog, count, B_TRUE); >>> 1741 >> s/B_TRUE/true >> ? > > You are correct. I neglected to do a debug build. Fail. :/ > > From: Ben Myers > xfs: fix debug build > > Commit 667a9291c5b3 "xfs: Remove boolean_t typedef completely." didn't. > > Remove a stray B_TRUE that breaks CONFIG_XFS_DEBUG=y. > > Signed-off-by: Ben Myers > Reported-by: Wu Fengguang > > Index: xfs/fs/xfs/xfs_log.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_log.c > +++ xfs/fs/xfs/xfs_log.c > @@ -1737,7 +1737,7 @@ xlog_sync( > ASSERT(XFS_BUF_ADDR(bp)<= log->l_logBBsize-1); > ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count)<= log->l_logBBsize); > > - xlog_verify_iclog(log, iclog, count, B_TRUE); > + xlog_verify_iclog(log, iclog, count, true); > > /* account for log which doesn't start at block #0 */ > XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart); > Looks good. Though it looks like xlog_verify_iclog() has only been called with syncing=true for a long time. Probably a routine that could use some cleaning. Reviewed-by: Mark Tinguely From bpm@oss.sgi.com Fri Jan 18 15:12:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 16E777F3F; Fri, 18 Jan 2013 15:12:45 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-14-g003fd6c X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 X-Git-Newrev: 003fd6c8be14a348c56cb1d171605ab13fca906f Message-Id: <20130118211245.16E777F3F@oss.sgi.com> Date: Fri, 18 Jan 2013 15:12:44 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 003fd6c xfs: fix fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared from 9e96fe6df44425b69ed89f6ac20352cec1f127d7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 003fd6c8be14a348c56cb1d171605ab13fca906f Author: Ben Myers Date: Fri Jan 18 14:17:46 2013 -0600 xfs: fix fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared Commit 667a9291c5b3 "xfs: Remove boolean_t typedef completely." didn't. Remove a stray B_TRUE that breaks CONFIG_XFS_DEBUG=y. Signed-off-by: Ben Myers Reported-by: Wu Fengguang Reviewed-by: Mark Tinguely ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Fri Jan 18 15:12:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 4F3B77F37; Fri, 18 Jan 2013 15:12:56 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-14-g003fd6c X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 9e96fe6df44425b69ed89f6ac20352cec1f127d7 X-Git-Newrev: 003fd6c8be14a348c56cb1d171605ab13fca906f Message-Id: <20130118211256.4F3B77F37@oss.sgi.com> Date: Fri, 18 Jan 2013 15:12:55 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 003fd6c xfs: fix fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared from 9e96fe6df44425b69ed89f6ac20352cec1f127d7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 003fd6c8be14a348c56cb1d171605ab13fca906f Author: Ben Myers Date: Fri Jan 18 14:17:46 2013 -0600 xfs: fix fs/xfs/xfs_log.c:1740:39: error: 'B_TRUE' undeclared Commit 667a9291c5b3 "xfs: Remove boolean_t typedef completely." didn't. Remove a stray B_TRUE that breaks CONFIG_XFS_DEBUG=y. Signed-off-by: Ben Myers Reported-by: Wu Fengguang Reviewed-by: Mark Tinguely ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- XFS development tree From tinguely@sgi.com Fri Jan 18 15:40:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 DBB267F37 for ; Fri, 18 Jan 2013 15:40:56 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97EDC30405F; Fri, 18 Jan 2013 13:40:53 -0800 (PST) Message-ID: <50F9C164.2050806@sgi.com> Date: Fri, 18 Jan 2013 15:40:52 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> In-Reply-To: <50EEC680.9040903@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/10/13 07:47, Jeff Liu wrote: > Hello, > > Here is the v2 patch set of killing hard-coded number 128 which is used to indicate > the extra log space reservation for almost all of those transactions. > > In this round, I also tried to convert some transactions to pre-calculate out the > space log reservation from runtime to mount time so that we can make the code related > to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically > can be ignored. :)) IMHO, which were includes: super block quota flags changes, > quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, > log super block counters, log super block units/fields, as well as set attributes. > > > Changes of v2 to v1: > - use xfs_calc_buf_res() to calulate out the space log reservation per item. > > Old patches: > v1: > http://www.spinics.net/lists/xfs/msg15499.html > > Thanks, > -Jeff > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Hi Jeff, I did a quick read of the series and it looks good. Any reason to have separate constants for: XFS_SYNC_ICSBCOUNT_LOG_RES(mp) XFS_SYNC_ICSBUNIT_LOG_RES(mp) XFS_LOG_DUMMY1_LOG_RES(mp) since they are the same value and are all superblock operations. --Mark Tinguely. From koen.de.wit@oracle.com Fri Jan 18 15:50:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3EA007F37 for ; Fri, 18 Jan 2013 15:50:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 204C78F8033 for ; Fri, 18 Jan 2013 13:50:14 -0800 (PST) X-ASG-Debug-ID: 1358545812-04cbb00f2d04a50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id euHpj2TabQPpGQqi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:13 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILoBQo003042 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 18 Jan 2013 21:50:12 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILoBkj023156 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 18 Jan 2013 21:50:11 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILoBg0028556; Fri, 18 Jan 2013 15:50:11 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:11 -0800 Message-ID: <50F9C30C.4050603@oracle.com> Date: Fri, 18 Jan 2013 22:47:56 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: dsterba@suse.cz, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test for file clone functionality of btrfs ("reflinks") References: <50C762DA.2090907@oracle.com> <20130110131525.GE20089@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test for file clone functionality of btrfs ("reflinks") In-Reply-To: <20130110131525.GE20089@twin.jikos.cz> Content-Type: text/plain; charset=ISO-8859-1; format=flowed 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: 1358545813 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave and David, Thanks for your extensive reviews. I have rewritten the testscripts according to your comments. The original script is split into 6 smaller scripts, as suggested by Dave. The 7th patch is a new testscript for send/receive. Koen. On 01/10/2013 02:15 PM, David Sterba wrote: > David did a review and I agree with all of his comments. I have a few > suggestions to extend test scope: > > * check if reflink expectedly fails when it's done on the same > filesystem but mounted to 2 different directories (for example bind > mount the TEST partition to SCRATCH dir and do the reflinks) > I've added this to test 301. > * most of the files are very small and will get inlined, this > covers only a small range of problems that could arise from reflinks. > I'd like to see this included in the initial test version so the test > covers majority of the cases and we can add specific corner cases > later > All tests create bigger files of variable size now. > * larger files allow to test reflinks on files that comprise of > interesting mix of holes and data (eg. what happens if I reflink half > of hole and data extent at once?), reflink beginning or end of a file > to another file > I'm planning to write a testscript for file hole punching with btrfs in future, I will include a test with reflinks then. From koen.de.wit@oracle.com Fri Jan 18 15:50:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0C1B27F50 for ; Fri, 18 Jan 2013 15:50:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C411D8F8033 for ; Fri, 18 Jan 2013 13:50:20 -0800 (PST) X-ASG-Debug-ID: 1358545818-04bdf00eec02cf0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id W7tOEe4WU047PpZe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:19 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILoIDD003099 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:18 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILoH2O023306 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:17 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILoHBw031590 for ; Fri, 18 Jan 2013 15:50:17 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:17 -0800 Message-ID: <50F9C313.1000903@oracle.com> Date: Fri, 18 Jan 2013 22:48:03 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 297: simple sparse copy testcase for btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 297: simple sparse copy testcase for btrfs 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: 1358545818 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11: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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 297 | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 297.out | 10 ++++++++ 2 files changed, 85 insertions(+), 0 deletions(-) create mode 100644 297 create mode 100644 297.out diff --git a/297 b/297 new file mode 100644 index 0000000..0851b57 --- /dev/null +++ b/297 @@ -0,0 +1,75 @@ +#! /bin/bash +# FS QA Test No. 297 +# +# Tests file clone functionality of btrfs ("reflinks"): +# - Reflink a file +# - Reflink the reflinked file +# - Modify the original file +# - Modify the reflinked file +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_cp_reflink + +TESTDIR1=$TEST_DIR/test-$seq.$$ +mkdir $TESTDIR1 + +_catfiles() { + for F in original copy1 copy2 + do + md5sum $TESTDIR1/$F | $AWK_PROG 'END {print $1}' + done +} + +$XFS_IO_PROG -f -c 'pwrite -S 0x61 0 9000' $TESTDIR1/original > /dev/null +cp --reflink $TESTDIR1/original $TESTDIR1/copy1 +cp --reflink $TESTDIR1/copy1 $TESTDIR1/copy2 +_catfiles +$XFS_IO_PROG -c 'pwrite -S 0x62 0 9000' $TESTDIR1/original > /dev/null +_catfiles +$XFS_IO_PROG -c 'pwrite -S 0x63 0 9000' $TESTDIR1/copy1 > /dev/null +_catfiles + +# success, all done +status=0 +exit diff --git a/297.out b/297.out new file mode 100644 index 0000000..39c498b --- /dev/null +++ b/297.out @@ -0,0 +1,10 @@ +QA output created by 297 +42d69d1a6d333a7ebdf64792a555e392 +42d69d1a6d333a7ebdf64792a555e392 +42d69d1a6d333a7ebdf64792a555e392 +4a847a25439532bf48b68c9e9536ed5b +42d69d1a6d333a7ebdf64792a555e392 +42d69d1a6d333a7ebdf64792a555e392 +4a847a25439532bf48b68c9e9536ed5b +e271cd47d9f62ebc96cb4e67ae4d16db +42d69d1a6d333a7ebdf64792a555e392 -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:50:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9789C7F4F for ; Fri, 18 Jan 2013 15:50:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 713D0304067 for ; Fri, 18 Jan 2013 13:50:28 -0800 (PST) X-ASG-Debug-ID: 1358545827-04cb6c0eef063c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id U6N5IfaJ8VhsIJg8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:27 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILoQOV003258 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:27 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILoPrw023516 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:26 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILoPYA031654 for ; Fri, 18 Jan 2013 15:50:25 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:25 -0800 Message-ID: <50F9C31B.20203@oracle.com> Date: Fri, 18 Jan 2013 22:48:11 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 298: sparse copy of a directory tree on btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 298: sparse copy of a directory tree on btrfs 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: 1358545827 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 298 | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 298.out | 19 ++++++++++++++ 2 files changed, 101 insertions(+), 0 deletions(-) create mode 100644 298 create mode 100644 298.out diff --git a/298 b/298 new file mode 100644 index 0000000..47ac55d --- /dev/null +++ b/298 @@ -0,0 +1,82 @@ +#! /bin/bash +# FS QA Test No. 298 +# +# Tests file clone functionality of btrfs ("reflinks") on directory trees. +# - Create directory and subdirectory, each having one file +# - Create 2 reflinked copies of the tree +# - Modify the original files +# - Modify one of the copies +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_cp_reflink + +TESTDIR1=$TEST_DIR/test-$seq.$$ +mkdir $TESTDIR1 + +_catfiles() { + for F in original/file1 original/subdir/file2 \ + copy1/file1 copy1/subdir/file2 \ + copy2/file1 copy2/subdir/file2 + do + md5sum $TESTDIR1/$F | $AWK_PROG 'END {print $1}' + done +} + +mkdir $TESTDIR1/original +mkdir $TESTDIR1/original/subdir +$XFS_IO_PROG -f -c 'pwrite -S 0x61 0 9000' $TESTDIR1/original/file1 > /dev/null +$XFS_IO_PROG -f -c 'pwrite -S 0x62 0 11000' $TESTDIR1/original/subdir/file2 > /dev/null +cp --recursive --reflink $TESTDIR1/original $TESTDIR1/copy1 +cp --recursive --reflink $TESTDIR1/copy1 $TESTDIR1/copy2 +_catfiles +$XFS_IO_PROG -c 'pwrite -S 0x63 0 13000' $TESTDIR1/original/file1 > /dev/null +$XFS_IO_PROG -c 'pwrite -S 0x64 5000 1000' $TESTDIR1/original/subdir/file2 > /dev/null +_catfiles +$XFS_IO_PROG -c 'pwrite -S 0x65 0 9000' $TESTDIR1/copy1/file1 > /dev/null +$XFS_IO_PROG -c 'pwrite -S 0x66 5000 25000' $TESTDIR1/copy1/subdir/file2 > /dev/null +_catfiles + +# success, all done +status=0 +exit diff --git a/298.out b/298.out new file mode 100644 index 0000000..f8b6b70 --- /dev/null +++ b/298.out @@ -0,0 +1,19 @@ +QA output created by 298 +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd +260f6785c0537fd12582dcae28a3c1a9 +b8d91fb600f6f2191f2ba66665374860 +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd +260f6785c0537fd12582dcae28a3c1a9 +b8d91fb600f6f2191f2ba66665374860 +b20229a003e3985c4b0e6806abcd6642 +b815b24069db14e0a3a07169fd563e93 +42d69d1a6d333a7ebdf64792a555e392 +ca390545f0aedb54b808d6128c56a7dd -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:50:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DECA97F52 for ; Fri, 18 Jan 2013 15:50:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C35B28F8033 for ; Fri, 18 Jan 2013 13:50:37 -0800 (PST) X-ASG-Debug-ID: 1358545836-04cbb00f2c04a90001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id DsqBAaKHKHnvDYHP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:36 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILoZST003345 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:36 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILoYlC027517 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:35 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILoYaP028952 for ; Fri, 18 Jan 2013 15:50:34 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:34 -0800 Message-ID: <50F9C324.5010502@oracle.com> Date: Fri, 18 Jan 2013 22:48:20 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 299: moving and deleting sparse copies on btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 299: moving and deleting sparse copies on btrfs 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: 1358545836 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 299 | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 299.out | 4 +++ 2 files changed, 73 insertions(+), 0 deletions(-) create mode 100644 299 create mode 100644 299.out diff --git a/299 b/299 new file mode 100644 index 0000000..0ddb022 --- /dev/null +++ b/299 @@ -0,0 +1,69 @@ +#! /bin/bash +# FS QA Test No. 299 +# +# Moving and deleting cloned ("reflinked") files on btrfs: +# - Create a file and a reflink +# - Move both to a directory +# - Delete the original (moved) file, check that the copy still exists. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_cp_reflink + +TESTDIR1=$TEST_DIR/test-$seq.$$ +mkdir $TESTDIR1 + +$XFS_IO_PROG -f -c 'pwrite -S 0x61 0 9000' $TESTDIR1/original > /dev/null +cp --reflink $TESTDIR1/original $TESTDIR1/copy +mkdir $TESTDIR1/subdir +mv $TESTDIR1/original $TESTDIR1/subdir/original_moved +mv $TESTDIR1/copy $TESTDIR1/subdir/copy_moved +md5sum $TESTDIR1/subdir/original_moved | $AWK_PROG 'END {print $1}' +md5sum $TESTDIR1/subdir/copy_moved | $AWK_PROG 'END {print $1}' +rm $TESTDIR1/subdir/original_moved +md5sum $TESTDIR1/subdir/copy_moved | $AWK_PROG 'END {print $1}' +rm -rf $TESTDIR1/subdir + +# success, all done +status=0 +exit diff --git a/299.out b/299.out new file mode 100644 index 0000000..f06eb2b --- /dev/null +++ b/299.out @@ -0,0 +1,4 @@ +QA output created by 299 +42d69d1a6d333a7ebdf64792a555e392 +42d69d1a6d333a7ebdf64792a555e392 +42d69d1a6d333a7ebdf64792a555e392 -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:50:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6AA7A7F53 for ; Fri, 18 Jan 2013 15:50:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 039A7304066 for ; Fri, 18 Jan 2013 13:50:43 -0800 (PST) X-ASG-Debug-ID: 1358545842-04bdf00ee602d30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id nIloZ6c28VyQc6Y6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:42 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILof4M003394 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:42 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILofAN007587 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:41 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILofC8031977 for ; Fri, 18 Jan 2013 15:50:41 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:40 -0800 Message-ID: <50F9C32A.6000600@oracle.com> Date: Fri, 18 Jan 2013 22:48:26 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 300: diskspace consumption of cloned files on btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 300: diskspace consumption of cloned files on btrfs 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: 1358545842 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 300 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 300.out | 4 +++ 2 files changed, 88 insertions(+), 0 deletions(-) create mode 100644 300 create mode 100644 300.out diff --git a/300 b/300 new file mode 100644 index 0000000..a6f706c --- /dev/null +++ b/300 @@ -0,0 +1,84 @@ +#! /bin/bash +# FS QA Test No. 300 +# +# Diskspace consumption of sparse file clones ("reflinks") on btrfs +# - Check that a reflink does not consume space +# - Check that a reflink starts to consume space when the original file +# is modified +# - Check that diskspace is freed up after deleting all files +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_cp_reflink + +TESTDIR1=$TEST_DIR/test-$seq.$$ +mkdir $TESTDIR1 + +_free() { + _df_dir $TEST_DIR | $AWK_PROG '{ print $5 }' +} + +free_before=`_free` +$XFS_IO_PROG -f -c "pwrite -S 0x61 0 10m" -c "fsync" $TESTDIR1/original > /dev/null +cp --reflink=always $TESTDIR1/original $TESTDIR1/copy1 +cp --reflink=auto $TESTDIR1/copy1 $TESTDIR1/copy2 +btrfs filesystem sync $TEST_DIR > /dev/null +free_after_creating_reflinks=`_free` +_within_tolerance "free space after creating 1 file and 2 reflinks" \ + `expr $free_before - $free_after_creating_reflinks` 10252 512 -v + +$XFS_IO_PROG -c "pwrite -S 0x62 3m 5m" -c "fsync" $TESTDIR1/original > /dev/null +btrfs filesystem sync $TEST_DIR > /dev/null +free_after_overwriting=`_free` +_within_tolerance "free space after overwriting original file" \ + `expr $free_before - $free_after_overwriting` 15376 512 -v + +rm $TESTDIR1/original $TESTDIR1/copy1 $TESTDIR1/copy2 +btrfs filesystem sync $TEST_DIR > /dev/null +free_after_removing=`_free` +_within_tolerance "free space after removing all files" \ + `expr $free_before - $free_after_removing` 0 128 -v + +# success, all done +status=0 +exit diff --git a/300.out b/300.out new file mode 100644 index 0000000..bbb94f4 --- /dev/null +++ b/300.out @@ -0,0 +1,4 @@ +QA output created by 300 +free space after creating 1 file and 2 reflinks is in range +free space after overwriting original file is in range +free space after removing all files is in range -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:50:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 723C47F4A for ; Fri, 18 Jan 2013 15:50:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47EFD304067 for ; Fri, 18 Jan 2013 13:50:51 -0800 (PST) X-ASG-Debug-ID: 1358545850-04cbb00f2a04ac0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id QzgKoA3AoWqEf5Af (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:50 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILomAC021561 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:49 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILomXw007735 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:48 GMT Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILomcs029065 for ; Fri, 18 Jan 2013 15:50:48 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:48 -0800 Message-ID: <50F9C331.9000501@oracle.com> Date: Fri, 18 Jan 2013 22:48:33 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 301: sparse copy between different filesystems/mountpoints on btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 301: sparse copy between different filesystems/mountpoints on btrfs 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: 1358545850 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 301 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 301.out | 7 ++++ 2 files changed, 102 insertions(+), 0 deletions(-) create mode 100644 301 create mode 100644 301.out diff --git a/301 b/301 new file mode 100644 index 0000000..05b9b39 --- /dev/null +++ b/301 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 301 +# +# Check if creating a sparse copy ("reflink") of a file on btrfs +# expectedly fails when it's done betweeen different filesystems or +# different mount points of the same filesystem. +# +# For both situations, these actions are executed: +# - Copy a file with the reflink=auto option. +# A normal copy should be created. +# - Copy a file with the reflink=always option. Should result in error, +# no file should be created. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_scratch +_require_cp_reflink + +TESTDIR1=$TEST_DIR/test-$seq.$$ +TESTDIR2=$SCRATCH_MNT/test-$seq.$$ +TESTDIR3=$SCRATCH_MNT/test-bis-$seq.$$ + +mkdir $TESTDIR1 +_scratch_mkfs +$XFS_IO_PROG -f -c 'pwrite -S 0x61 0 9000' $TESTDIR1/original > /dev/null + +_filter_testdirs() +{ + sed -e "s,$TESTDIR1,TESTDIR1,g" \ + -e "s,$TESTDIR2,TESTDIR2,g" \ + -e "s,$TESTDIR3,TESTDIR3,g" +} + +_create_reflinks_to() +{ + mkdir $1 + cp --reflink=auto $TESTDIR1/original $1/copy + md5sum $1/copy | $AWK_PROG 'END {print $1}' + rm -rf $1 + mkdir $1 + cp --reflink=always $TESTDIR1/original $1/copyfail 2>&1 | _filter_testdirs + ls $1/copyfail | wc -l +} + +_scratch_mount +_create_reflinks_to $TESTDIR2 +_scratch_unmount + +mount $TEST_DEV $SCRATCH_MNT +_create_reflinks_to $TESTDIR3 +umount $SCRATCH_MNT + +# success, all done +status=0 +exit diff --git a/301.out b/301.out new file mode 100644 index 0000000..3b66682 --- /dev/null +++ b/301.out @@ -0,0 +1,7 @@ +QA output created by 301 +42d69d1a6d333a7ebdf64792a555e392 +cp: failed to clone `TESTDIR2/copyfail' from `TESTDIR1/original': Invalid cross-device link +0 +42d69d1a6d333a7ebdf64792a555e392 +cp: failed to clone `TESTDIR3/copyfail' from `TESTDIR1/original': Invalid cross-device link +0 -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:50:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2CF2D7F47 for ; Fri, 18 Jan 2013 15:50:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D91658F8033 for ; Fri, 18 Jan 2013 13:50:58 -0800 (PST) X-ASG-Debug-ID: 1358545857-04bdf00ee602d50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 94debsPZhoyQxLsZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:50:57 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILouRc021640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:50:57 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILouYY024994 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:50:56 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILouaj017465 for ; Fri, 18 Jan 2013 15:50:56 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:50:55 -0800 Message-ID: <50F9C339.6010000@oracle.com> Date: Fri, 18 Jan 2013 22:48:41 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 302: cross-subvolume sparse copies on btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 302: cross-subvolume sparse copies on btrfs 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: 1358545857 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11: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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 302 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 302.out | 28 ++++++++++++++++ 2 files changed, 136 insertions(+), 0 deletions(-) create mode 100644 302 create mode 100644 302.out diff --git a/302 b/302 new file mode 100644 index 0000000..b7f7507 --- /dev/null +++ b/302 @@ -0,0 +1,108 @@ +#! /bin/bash +# FS QA Test No. 302 +# +# Testing cross-subvolume sparse copy on btrfs +# - Create two subvolumes, mount one of them +# - Create a file on each (sub/root)volume, +# reflink them on the other volumes +# - Change one original and two reflinked files +# - Move and delete files +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux + +_require_scratch +_require_cp_reflink + +_catfiles() { + for D in $TESTDIR1 $SCRATCH_MNT $SUBVOL2 + do + for F in file1 file2 file3 + do + md5sum $D/$F | $AWK_PROG 'END {print $1}' + done + done +} + +_scratch_unmount 2>/dev/null +TESTDIR1=$TEST_DIR/test-$seq.$$-1 +TESTDIR2=$TEST_DIR/test-$seq.$$-2 +SUBVOL1=$TEST_DIR/subvol-$seq.$$-1 +SUBVOL2=$TEST_DIR/subvol-$seq.$$-2 + +mkdir $TESTDIR1 +mkdir $TESTDIR2 +btrfs subvolume create $SUBVOL1 > /dev/null +btrfs subvolume create $SUBVOL2 > /dev/null +mount -t btrfs -o subvol=subvol-$seq.$$-1 $TEST_DEV $SCRATCH_MNT + +$XFS_IO_PROG -f -c 'pwrite -S 0x61 0 9000' $TESTDIR1/file1 > /dev/null +$XFS_IO_PROG -f -c 'pwrite -S 0x62 0 13000' $SCRATCH_MNT/file2 > /dev/null +$XFS_IO_PROG -f -c 'pwrite -S 0x63 0 17000' $SUBVOL2/file3 > /dev/null +cp --reflink $TESTDIR1/file1 $SUBVOL1 +cp --reflink $TESTDIR1/file1 $SUBVOL2 +cp --reflink $SUBVOL1/file2 $TESTDIR1/ +cp --reflink $SUBVOL1/file2 $SUBVOL2 +cp --reflink $SUBVOL2/file3 $TESTDIR1/ +cp --reflink $SUBVOL2/file3 $SUBVOL1 +_catfiles + +$XFS_IO_PROG -c 'pwrite -S 0x64 0 9000' $TESTDIR1/file1 > /dev/null +$XFS_IO_PROG -c 'pwrite -S 0x66 7000 21000' $SUBVOL2/file2 > /dev/null +$XFS_IO_PROG -c 'pwrite -S 0x65 5000 5000' $SCRATCH_MNT/file3 > /dev/null +_catfiles + +mv $TESTDIR1/file* $TESTDIR2 +mv $SCRATCH_MNT/file* $TESTDIR1/ +mv $SUBVOL2/file* $SCRATCH_MNT/ +mv $TESTDIR2/file* $SUBVOL2/ +_catfiles + +rm -rf $TESTDIR1 +rm -rf $TESTDIR2 +umount $SCRATCH_MNT +btrfs subvolume delete $SUBVOL1 > /dev/null +btrfs subvolume delete $SUBVOL2 > /dev/null + +# success, all done +status=0 +exit diff --git a/302.out b/302.out new file mode 100644 index 0000000..a4bc12e --- /dev/null +++ b/302.out @@ -0,0 +1,28 @@ +QA output created by 302 +42d69d1a6d333a7ebdf64792a555e392 +d7402b46310fbbfbc5e466b1dccb043b +5a95800e4c04b11117aa4e4de057721f +42d69d1a6d333a7ebdf64792a555e392 +d7402b46310fbbfbc5e466b1dccb043b +5a95800e4c04b11117aa4e4de057721f +42d69d1a6d333a7ebdf64792a555e392 +d7402b46310fbbfbc5e466b1dccb043b +5a95800e4c04b11117aa4e4de057721f +2e26ad0e8b8e123d18c2d20c81cab0a8 +d7402b46310fbbfbc5e466b1dccb043b +5a95800e4c04b11117aa4e4de057721f +42d69d1a6d333a7ebdf64792a555e392 +d7402b46310fbbfbc5e466b1dccb043b +b9f275cd638cb784c9e61def94c622a8 +42d69d1a6d333a7ebdf64792a555e392 +a229d0159dad76eecec390d9b1db16d3 +5a95800e4c04b11117aa4e4de057721f +42d69d1a6d333a7ebdf64792a555e392 +d7402b46310fbbfbc5e466b1dccb043b +b9f275cd638cb784c9e61def94c622a8 +42d69d1a6d333a7ebdf64792a555e392 +a229d0159dad76eecec390d9b1db16d3 +5a95800e4c04b11117aa4e4de057721f +2e26ad0e8b8e123d18c2d20c81cab0a8 +d7402b46310fbbfbc5e466b1dccb043b +5a95800e4c04b11117aa4e4de057721f -- 1.7.2.5 From koen.de.wit@oracle.com Fri Jan 18 15:51:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3A83A7F4A for ; Fri, 18 Jan 2013 15:51:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E70158F8033 for ; Fri, 18 Jan 2013 13:51:06 -0800 (PST) X-ASG-Debug-ID: 1358545865-04cb6c0eef06430001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KecjgIlVkSkaEBCR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 13:51:05 -0800 (PST) X-Barracuda-Envelope-From: koen.de.wit@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0ILp4Fw021972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 21:51:04 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0ILp3Y1025219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 21:51:04 GMT Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0ILp3DI032168 for ; Fri, 18 Jan 2013 15:51:03 -0600 Received: from [192.168.0.247] (/178.118.101.11) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 13:51:03 -0800 Message-ID: <50F9C340.5050309@oracle.com> Date: Fri, 18 Jan 2013 22:48:48 +0100 From: Koen De Wit User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Icedove/3.0.11 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: 303: send/receive functionality of btrfs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: 303: send/receive functionality of btrfs 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: 1358545865 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.2.120236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Koen De Wit --- 303 | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 303.out | 72 +++++++++++++++++++++++++++++++++++ group | 7 +++ 3 files changed, 206 insertions(+), 0 deletions(-) create mode 100644 303 create mode 100644 303.out diff --git a/303 b/303 new file mode 100644 index 0000000..6a5628d --- /dev/null +++ b/303 @@ -0,0 +1,127 @@ +#! /bin/bash +# FS QA Test No. 303 +# +# Tests btrfs send/receive functionality +# +#----------------------------------------------------------------------- +# Copyright (c) 2013, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=koen.de.wit@oracle.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -f $tmp.* + btrfs subvolume delete $MAINPATH | _filter_test_dir + btrfs subvolume delete $TEST_DIR/snap1 | _filter_test_dir + btrfs subvolume delete $TEST_DIR/snap2 | _filter_test_dir + btrfs subvolume delete $TEST_DIR/snap3 | _filter_test_dir + btrfs subvolume delete $TEST_DIR/snap4 | _filter_test_dir +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs btrfs +_supported_os Linux + +_compare_to_main() { + # Compare file contents + diff -r $MAINPATH $1 + + # Compare file attributes + ls -lR $MAINPATH | _filter_test_dir > $TEST_DIR/main-files + ls -lR $1 | _filter_scratch > $TEST_DIR/compare-files + diff $TEST_DIR/main-files $TEST_DIR/compare-files +} + +# Setup main subvolume +MAINPATH=$TEST_DIR/main +btrfs subvolume create $MAINPATH + +# Create btrfs filesystem on scratch disk +_scratch_mkfs + +# Create a directory and three files in the main subvolume. +xfs_io -f -c 'pwrite -S 0x61 0 9000' $MAINPATH/file1 > /dev/null +xfs_io -f -c 'pwrite -S 0x62 0 11000' $MAINPATH/file2 > /dev/null +mkdir $MAINPATH/dir1 +xfs_io -f -c 'pwrite -S 0x63 0 13000' $MAINPATH/dir1/file3 > /dev/null +xfs_io -f -c 'pwrite -S 0x64 0 15000' $MAINPATH/dir1/file4 > /dev/null +mkdir $MAINPATH/dir2 +xfs_io -f -c 'pwrite -S 0x65 0 17000' $MAINPATH/dir1/file5 > /dev/null + +# Create a snapshot of main and replay on the scratch disk. +btrfs subvolume snapshot -r $MAINPATH $TEST_DIR/snap1 | _filter_test_dir +btrfs send $TEST_DIR/snap1 > $TEST_DIR/snap1.send | _filter_test_dir +btrfs receive -f $TEST_DIR/snap1.send $SCRATCH_MNT +_compare_to_main $SCRATCH_MNT/snap1 + +# Change, add and delete files in the main subvolume. +xfs_io -c 'pwrite -S 0x66 5000 19000' $MAINPATH/dir1/file3 > /dev/null +rm $MAINPATH/file2 +mkdir $MAINPATH/dir1/dir3 +xfs_io -f -c 'pwrite -S 0x67 0 21000' $MAINPATH/dir1/dir3/file6 > /dev/null +chmod +x $MAINPATH/dir1/file4 + +# Create a snapshot of main, the first snapshot being the parent. +btrfs subvolume snapshot -r $MAINPATH $TEST_DIR/snap2 | _filter_test_dir +btrfs send -p $TEST_DIR/snap1 $TEST_DIR/snap2 \ + > $TEST_DIR/snap2.send | _filter_test_dir +btrfs receive -f $TEST_DIR/snap2.send $SCRATCH_MNT +_compare_to_main $SCRATCH_MNT/snap2 + +# Reflink a new file and a file existing on another subvolume +cp --reflink $TEST_DIR/snap1/file2 $MAINPATH/dir1/dir3 +xfs_io -f -c 'pwrite -S 0x68 0 23000' $TEST_DIR/file7 > /dev/null +cp --reflink $TEST_DIR/file7 $MAINPATH/dir2 + +# Create a snapshot with a parent and clone source. +btrfs subvolume snapshot -r $MAINPATH $TEST_DIR/snap3 | _filter_test_dir +btrfs send -p $TEST_DIR/snap2 -i $TEST_DIR/snap1 $TEST_DIR/snap3 \ + > $TEST_DIR/snap3.send | _filter_test_dir +btrfs receive -f $TEST_DIR/snap3.send $SCRATCH_MNT +_compare_to_main $SCRATCH_MNT/snap3 + +# Error scenario: clone source does not exist on target disk +btrfs subvolume delete $SCRATCH_MNT/snap1 | _filter_scratch +btrfs subvolume delete $SCRATCH_MNT/snap3 | _filter_scratch +btrfs receive -f $TEST_DIR/snap3.send $SCRATCH_MNT 2>&1 | _filter_scratch + +# Error scenario: parent source does not exist on target disk +btrfs subvolume delete $SCRATCH_MNT/snap2 | _filter_scratch +btrfs receive -f $TEST_DIR/snap2.send $SCRATCH_MNT 2>&1 | _filter_scratch + +# Error scenario: snapshotting a writable subvolume +btrfs subvolume snapshot $MAINPATH $TEST_DIR/snap4 | _filter_test_dir +btrfs send $TEST_DIR/snap4 2>&1 | _filter_test_dir + +# success, all done +status=0 +exit diff --git a/303.out b/303.out new file mode 100644 index 0000000..da4bec8 --- /dev/null +++ b/303.out @@ -0,0 +1,72 @@ +QA output created by 303 +Create subvolume '/mnt/diskb/main' +/dev/sdf1 is mounted +Create a readonly snapshot of 'TEST_DIR/main' in 'TEST_DIR/snap1' +At subvol /mnt/diskb/snap1 +At subvol snap1 +1c1 +< TEST_DIR/main: +--- +> SCRATCH_MNT/snap1: +8c8 +< TEST_DIR/main/dir1: +--- +> SCRATCH_MNT/snap1/dir1: +14c14 +< TEST_DIR/main/dir2: +--- +> SCRATCH_MNT/snap1/dir2: +Create a readonly snapshot of 'TEST_DIR/main' in 'TEST_DIR/snap2' +At subvol /mnt/diskb/snap2 +At snapshot snap2 +1c1 +< TEST_DIR/main: +--- +> SCRATCH_MNT/snap2: +7,8c7,8 +< TEST_DIR/main/dir1: +< total 60 +--- +> SCRATCH_MNT/snap2/dir1: +> total 72 +14c14 +< TEST_DIR/main/dir1/dir3: +--- +> SCRATCH_MNT/snap2/dir1/dir3: +18c18 +< TEST_DIR/main/dir2: +--- +> SCRATCH_MNT/snap2/dir2: +Create a readonly snapshot of 'TEST_DIR/main' in 'TEST_DIR/snap3' +At subvol /mnt/diskb/snap3 +At snapshot snap3 +1c1 +< TEST_DIR/main: +--- +> SCRATCH_MNT/snap3: +7c7 +< TEST_DIR/main/dir1: +--- +> SCRATCH_MNT/snap3/dir1: +14c14 +< TEST_DIR/main/dir1/dir3: +--- +> SCRATCH_MNT/snap3/dir1/dir3: +19c19 +< TEST_DIR/main/dir2: +--- +> SCRATCH_MNT/snap3/dir2: +Delete subvolume 'SCRATCH_MNT/snap1' +Delete subvolume 'SCRATCH_MNT/snap3' +ERROR: Failed to lookup path for root 0 - No such file or directory +ERROR: unable to resolve path for root 257 +Delete subvolume 'SCRATCH_MNT/snap2' +At snapshot snap2 +ERROR: could not find parent subvolume +Create a snapshot of 'TEST_DIR/main' in 'TEST_DIR/snap4' +ERROR: TEST_DIR/snap4 is not read-only. +Delete subvolume 'TEST_DIR/main' +Delete subvolume 'TEST_DIR/snap1' +Delete subvolume 'TEST_DIR/snap2' +Delete subvolume 'TEST_DIR/snap3' +Delete subvolume 'TEST_DIR/snap4' diff --git a/group b/group index 1fdae31..af5356d 100644 --- a/group +++ b/group @@ -412,3 +412,10 @@ deprecated 291 repair 292 auto mkfs quick 293 auto quick +297 auto rw +298 auto rw +299 auto rw +300 auto rw +301 auto rw +302 auto rw +303 auto -- 1.7.2.5 From jmoyer@redhat.com Fri Jan 18 16:02:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 42A357F37 for ; Fri, 18 Jan 2013 16:02:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1AA04304066 for ; Fri, 18 Jan 2013 14:01:59 -0800 (PST) X-ASG-Debug-ID: 1358546518-04bdf00eec03530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id flYsmddNsNc0NA0E for ; Fri, 18 Jan 2013 14:01:59 -0800 (PST) X-Barracuda-Envelope-From: jmoyer@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 r0IM1wil016151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Jan 2013 17:01:58 -0500 Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.16.60.26]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0IM1vxe030395 for ; Fri, 18 Jan 2013 17:01:57 -0500 From: Jeff Moyer To: xfs@oss.sgi.com Subject: [patch] xfstests, aio-dio-extend-stat.c: fix error reporting X-PGP-KeyID: 1F78E1B4 X-ASG-Orig-Subj: [patch] xfstests, aio-dio-extend-stat.c: fix error reporting X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 18 Jan 2013 17:01:57 -0500 Message-ID: User-Agent: Gnus/5.110011 (No Gnus v0.11) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1358546519 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 Hi, If we receive an unexpected result from an async write, the error reporting does not tell the actual number of bytes written. Fix that, and also a couple of typos in printf's. Signed-off-by: Jeff Moyer diff --git a/src/aio-dio-regress/aio-dio-extend-stat.c b/src/aio-dio-regress/aio-dio-extend-stat.c index a6b4f08..7733f51 100644 --- a/src/aio-dio-regress/aio-dio-extend-stat.c +++ b/src/aio-dio-regress/aio-dio-extend-stat.c @@ -141,8 +141,7 @@ void fun_read(void *ptr) struct io_event *event = &ioevents[i]; if (event->res != BUFSIZE) fail("error in block: expected %d bytes, " - "received %ld\n", BUFSIZE, - event->obj->u.c.nbytes); + "received %ld\n", BUFSIZE, event->res); exSize = event->obj->u.c.offset + event->obj->u.c.nbytes; fstat(handle, &filestat); @@ -164,7 +163,7 @@ void fun_writeN(void *ptr) for(i = 0; i < MAX_AIO_EVENTS; ++i) { ret = io_submit(ctxp, 1, &(iocbs[i])); if (ret != 1) - fail("io_subit returned %d instead of 1\n", ret); + fail("io_submit returned %d instead of 1\n", ret); } } @@ -174,6 +173,6 @@ void fun_write1(void *ptr) ret = io_submit(ctxp, MAX_AIO_EVENTS, iocbs); if (ret != MAX_AIO_EVENTS) - fail("io_subit returned %d instead of %u\n", ret, + fail("io_submit returned %d instead of %u\n", ret, MAX_AIO_EVENTS); } From bpm@sgi.com Fri Jan 18 16:13:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B40DF7F37 for ; Fri, 18 Jan 2013 16:13:15 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4878D304043; Fri, 18 Jan 2013 14:13:15 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1F60B4266DC; Fri, 18 Jan 2013 16:13:15 -0600 (CST) Date: Fri, 18 Jan 2013 16:13:15 -0600 From: Ben Myers To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] mkfs.xfs: don't detect geometry values <= psectorsize Message-ID: <20130118221315.GM27055@sgi.com> References: <50C9093C.8080400@redhat.com> <50C912A0.7090008@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C912A0.7090008@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Dec 12, 2012 at 05:26:24PM -0600, Eric Sandeen wrote: > blkid_get_topology() ignores devices which report 512 > as their minimum & optimal IO size, but we should ignore > anything up to the physical sector size; otherwise hard-4k > sector devices will report a "stripe size" of 4k, and warn > if anything larger is specified: > > # modprobe scsi_debug physblk_exp=3 num_parts=2 dev_size_mb=128 > # mdadm --create /dev/md1 --level=0 --raid-devices=2 -c 4 /dev/sdb1 /dev/sdb2 > # mkfs.xfs -f -d su=16k,sw=2 /dev/md1 > mkfs.xfs: Specified data stripe unit 32 is not the same as the volume stripe unit 8 > mkfs.xfs: Specified data stripe width 64 is not the same as the volume stripe width 16 > ... > > but a stripe unit of 4k is pretty nonsensical. And that's even chosen by > default in this case, which is maybe even worse? > > # mkfs.xfs -f /dev/md1 > meta-data=/dev/md1 isize=256 agcount=2, agsize=8125 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=16249, imaxpct=25 > = sunit=1 swidth=8 blks > ... > > We can rearrange things a bit, get the physical sector size first, > and then ignore reported minimum/optimal sizes which is no larger > than that. > > Signed-off-by: Eric Sandeen Applied. This is commit 3dc7147f03cd. From bpm@sgi.com Fri Jan 18 16:55:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 72D997F37 for ; Fri, 18 Jan 2013 16:55:44 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0CCF830405F; Fri, 18 Jan 2013 14:55:43 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6D97E4266DC; Fri, 18 Jan 2013 16:55:43 -0600 (CST) Date: Fri, 18 Jan 2013 16:55:43 -0600 From: Ben Myers To: Dave Chinner Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: pull up stack_switch check into xfs_bmapi_write Message-ID: <20130118225543.GN27055@sgi.com> References: <1358446289-871-1-git-send-email-bfoster@redhat.com> <20130117214108.GF27055@sgi.com> <20130117233922.GJ2498@dastard> <20130117235039.GY30652@sgi.com> <20130118001549.GL2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130118001549.GL2498@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Fri, Jan 18, 2013 at 11:15:49AM +1100, Dave Chinner wrote: > On Thu, Jan 17, 2013 at 05:50:39PM -0600, Ben Myers wrote: > > Hey Dave, > > > > On Fri, Jan 18, 2013 at 10:39:22AM +1100, Dave Chinner wrote: > > > On Thu, Jan 17, 2013 at 03:41:08PM -0600, Ben Myers wrote: > > > > Hey Brian, > > > > > > > > On Thu, Jan 17, 2013 at 01:11:29PM -0500, Brian Foster wrote: > > > > > The stack_switch check currently occurs in __xfs_bmapi_allocate, > > > > > which means the stack switch only occurs when xfs_bmapi_allocate() > > > > > is called in a loop. Pull the check up before the loop in > > > > > xfs_bmapi_write() such that the first iteration of the loop has > > > > > consistent behavior. > > > > > > > > > > Signed-off-by: Brian Foster > > > > > --- > > > > > > > > > > I was reading through this code and confused myself over whether the stack > > > > > switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously, > > > > > I might add) the surrounding loop that I had missed, but it wasn't clear whether > > > > > the behavior to enable the stack switch after the first iteration was > > > > > intentional or not. I'm throwing this out there to either fix the issue or seek > > > > > out an explanation for the existing behavior. Thanks! > > > > > > > > To me this looks to be the correct behavior. It might be better to > > > > just get rid of the XFS_BMAPI_STACK_SWITCH flag entirely. Nice find. > > > > > > Which would take it back to the original logic which always switched > > > stacks and we know that caused significant metadata performance > > > degradation in various workloads. > > > > > > If we want to remove XFS_BMAPI_STACK_SWITCH, then we either need to > > > solve either the stack overrun problem (not possible, AFAICT) or the > > > metadata performance degradation as a result of always pushing > > > allocation off into workqueues. So, unfortunately, until we have some > > > other resolution, we stuck with it.... :/ > > > > Yeah, I went off the rails there. I meant to suggest something more along the > > lines of getting rid of the stack_switch member of the args structure, since > > xfs_bmapi_write is the only caller of xfs_bmapi_allocate. But it didn't come > > out that way... Anyway, what we have is just fine. > > Oh, ok, I see what you mean. The code currently has an extra level > of indirection (XFS_BMAPI_STACK_SWITCH -> args->stack_switch). Exactly. Thanks. ;) > That > is in line with all the other XFS_BMAPI_* flags, though. i.e. they > are interface flags and not propagated down through the > struct xfs_bmalloc arguments. > > To tell the truth, I've previously considered just passing a flags > field down rather than the current single bit variables. I've never > done it though, because (IMO) it doesn't really improve the code > significantly or reduce the footprint of the structure. Perhaps we > should look at that again now that the code has been significantly > factored.... Some of the args style structures seem pretty sizeable, but I think I'm more concerned about readability than size. It gets to be kind of a muddle in through there copying all those flags around, and in this case we got bitten. Regards, Ben From tinguely@sgi.com Fri Jan 18 17:03:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 7B2A77F37 for ; Fri, 18 Jan 2013 17:03:05 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5153E304039; Fri, 18 Jan 2013 15:03:02 -0800 (PST) Message-ID: <50F9D4A5.6050800@sgi.com> Date: Fri, 18 Jan 2013 17:03:01 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item References: <50EEC68A.1030306@oracle.com> In-Reply-To: <50EEC68A.1030306@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/10/13 07:47, Jeff Liu wrote: > Add a helper xfs_calc_buf_res() to calcuate out the space log reservations per item which were got > involved in a transaction. It will call the xfs_buf_log_overhead() to figure out the extra space > for the struct xfs_buf_log_format that gets written into the log for every buffer as well as a little > bit of extra space because there also needs a log opheader, i.e. struct xlog_op_header. > The commit message is too wide. > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 06ed520..6c601ea 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -37,14 +37,45 @@ > #include "xfs_extent_busy.h" > #include "xfs_bmap.h" > #include "xfs_quota.h" > +#include "xfs_qm.h" > #include "xfs_trans_priv.h" > #include "xfs_trans_space.h" > #include "xfs_inode_item.h" > +#include "xfs_log_priv.h" > +#include "xfs_buf_item.h" > #include "xfs_trace.h" > > kmem_zone_t *xfs_trans_zone; > kmem_zone_t *xfs_log_item_desc_zone; > > +/* > + * A buffer has a format structure overhead in the log in addition > + * to the data, so we need to take this into account when reserving > + * space in a transaction for a buffer. Round the space required up > + * to a multiple of 128 bytes so that we don't change the historical > + * reservation that has been used for this overhead. > + */ > +STATIC uint > +xfs_buf_log_overhead(void) > +{ > + return round_up(sizeof(struct xlog_op_header) + > + sizeof(struct xfs_buf_log_format), 128); > +} Not used directly except below. inline or fold below? --Mark. From david@fromorbit.com Fri Jan 18 18:10:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A7FD07F37 for ; Fri, 18 Jan 2013 18:10:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DB71AC002 for ; Fri, 18 Jan 2013 16:10:50 -0800 (PST) X-ASG-Debug-ID: 1358554245-04cb6c0ef50b270001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qNodAjOmEtLKe1RQ for ; Fri, 18 Jan 2013 16:10:45 -0800 (PST) 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: AjgPANvi+VB5LBTV/2dsb2JhbABEuBuGHhdzgh4BAQQBOg0PIwULCAMOCgklDwUlAyETGQKHeAWuTI1vFZEkA5YLiU6GfIMJ Received: from ppp121-44-20-213.lns20.syd6.internode.on.net (HELO dastard) ([121.44.20.213]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2013 10:40:44 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwM1C-0003rP-3C; Sat, 19 Jan 2013 11:10:42 +1100 Date: Sat, 19 Jan 2013 11:10:42 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure Message-ID: <20130119001042.GR2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F893D2.7080103@parallels.com> <20130118081133.GQ2498@dastard> <50F99E08.4060107@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F99E08.4060107@parallels.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: 1358554245 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.2.120244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 18, 2013 at 11:10:00AM -0800, Glauber Costa wrote: > On 01/18/2013 12:11 AM, Dave Chinner wrote: > > On Thu, Jan 17, 2013 at 04:14:10PM -0800, Glauber Costa wrote: > >> On 01/17/2013 04:10 PM, Dave Chinner wrote: > >>> And then each object uses: > >>> > >>> struct lru_item { > >>> struct list_head global_list; > >>> struct list_head memcg_list; > >>> } > >> by objects you mean dentries, inodes, and the such, right? > > > > Yup. > > > >> Would it be acceptable to you? > > > > If it works the way I think it should, then yes. > > > >> We've been of course doing our best to avoid increasing the size of the > >> objects, therefore this is something we've never mentioned. However, if > >> it would be acceptable from the fs POV, this would undoubtedly make our > >> life extremely easier. > > > > I've been trying hard to work out how to avoid increasing the size > > of structures as well. But if we can't work out how to implement > > something sanely with only a single list head per object to work > > from, then increasing the size of objects is something that we need > > to consider if it solves all the problems we are trying to solve. > > > > i.e. if adding a second list head makes the code dumb, simple, > > obviously correct and hard to break then IMO it's a no-brainer. > > But we have to tick all the right boxes first... > > > > One of our main efforts recently has been trying to reduce memcg impact > when it is not in use, even if its compiled in. So what really bothers > me here is the fact that we are increasing the size of dentries and > inodes no matter what. > > Still within the idea of exploring the playing field, would an > indirection be worth it ? > We would increase the total per-object memory usage by 8 bytes instead > of 16: the dentry gets a pointer, and a separate allocation for the > list_lru. A separate allocation is really not an option. We can't do an allocation in where dentries/inodes/other objects are added to the LRU because they are under object state spinlocks, and adding a potential memory allocation failure to the "add to lru" case is pretty nasty, IMO. > Embedding the lru is certainly easier from my PoV, the main question is > how much do you, as a fs representative, value those 8 bytes? Some things are worth using a few extra bytes, and thats my point. The question of whether memcg enabled kernels need to grow objects for sane memory management behaviour is what I'm trying to explore here. We might end up deciding that a single list head is all that is needed, but lets not constrain our thinking to "we must only use elements existing in the current structures" and hence rule out solutions that may work far better than any single list algorithm possibly can without having first explored them.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From glommer@parallels.com Fri Jan 18 18:13:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E558B7F37 for ; Fri, 18 Jan 2013 18:13:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 900368F804B for ; Fri, 18 Jan 2013 16:13:39 -0800 (PST) X-ASG-Debug-ID: 1358554413-04bdf00eec07d20001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id 0krATN93yHJNE6EJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Jan 2013 16:13:34 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TwM3x-0001Se-3p; Fri, 18 Jan 2013 19:13:33 -0500 Received: from straightjacket.localdomain (216.239.55.194) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Fri, 18 Jan 2013 16:13:31 -0800 Message-ID: <50F9E53F.4090902@parallels.com> Date: Fri, 18 Jan 2013 16:13:51 -0800 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Greg Thelen , Ying Han , Suleiman Souhlal Subject: Re: [PATCH 09/19] list_lru: per-node list infrastructure References: <1354058086-27937-10-git-send-email-david@fromorbit.com> <50F6FDC8.5020909@parallels.com> <20130116225521.GF2498@dastard> <50F7475F.90609@parallels.com> <20130117042245.GG2498@dastard> <50F84118.7030608@parallels.com> <20130118001029.GK2498@dastard> <50F893D2.7080103@parallels.com> <20130118081133.GQ2498@dastard> <50F99E08.4060107@parallels.com> <20130119001042.GR2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] list_lru: per-node list infrastructure In-Reply-To: <20130119001042.GR2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [216.239.55.194] X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358554414 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.2.120244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/18/2013 04:10 PM, Dave Chinner wrote: > On Fri, Jan 18, 2013 at 11:10:00AM -0800, Glauber Costa wrote: >> On 01/18/2013 12:11 AM, Dave Chinner wrote: >>> On Thu, Jan 17, 2013 at 04:14:10PM -0800, Glauber Costa wrote: >>>> On 01/17/2013 04:10 PM, Dave Chinner wrote: >>>>> And then each object uses: >>>>> >>>>> struct lru_item { >>>>> struct list_head global_list; >>>>> struct list_head memcg_list; >>>>> } >>>> by objects you mean dentries, inodes, and the such, right? >>> >>> Yup. >>> >>>> Would it be acceptable to you? >>> >>> If it works the way I think it should, then yes. >>> >>>> We've been of course doing our best to avoid increasing the size of the >>>> objects, therefore this is something we've never mentioned. However, if >>>> it would be acceptable from the fs POV, this would undoubtedly make our >>>> life extremely easier. >>> >>> I've been trying hard to work out how to avoid increasing the size >>> of structures as well. But if we can't work out how to implement >>> something sanely with only a single list head per object to work >>> from, then increasing the size of objects is something that we need >>> to consider if it solves all the problems we are trying to solve. >>> >>> i.e. if adding a second list head makes the code dumb, simple, >>> obviously correct and hard to break then IMO it's a no-brainer. >>> But we have to tick all the right boxes first... >>> >> >> One of our main efforts recently has been trying to reduce memcg impact >> when it is not in use, even if its compiled in. So what really bothers >> me here is the fact that we are increasing the size of dentries and >> inodes no matter what. >> >> Still within the idea of exploring the playing field, would an >> indirection be worth it ? >> We would increase the total per-object memory usage by 8 bytes instead >> of 16: the dentry gets a pointer, and a separate allocation for the >> list_lru. > > A separate allocation is really not an option. We can't do an > allocation in where dentries/inodes/other objects are added to the > LRU because they are under object state spinlocks, and adding a > potential memory allocation failure to the "add to lru" case is > pretty nasty, IMO. > That would of course happen on dentry creation time, not lru add time. It is totally possible since at creation time, we already know if memcg is enabled or not. From david@fromorbit.com Fri Jan 18 18:20:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4784F7F37 for ; Fri, 18 Jan 2013 18:20:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 128BA304066 for ; Fri, 18 Jan 2013 16:20:20 -0800 (PST) X-ASG-Debug-ID: 1358554818-04cbb00f2c0a070001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id u70gzjWuv99AFzCf for ; Fri, 18 Jan 2013 16:20:19 -0800 (PST) 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: AjkPAITk+VB5LBTV/2dsb2JhbABEuBuGHhdzgh4BAQEEAQEBNxwYCxAIAxgJJQ8FEwERAyETiBgNvC8VjH6EJgOTXoItkEqDCYFT Received: from ppp121-44-20-213.lns20.syd6.internode.on.net (HELO dastard) ([121.44.20.213]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2013 10:50:18 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwMAT-0003sS-N0; Sat, 19 Jan 2013 11:20:17 +1100 Date: Sat, 19 Jan 2013 11:20:17 +1100 From: Dave Chinner To: Mark Tinguely Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation Message-ID: <20130119002017.GS2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> <50F9C164.2050806@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F9C164.2050806@sgi.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: 1358554818 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.2.120246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 18, 2013 at 03:40:52PM -0600, Mark Tinguely wrote: > On 01/10/13 07:47, Jeff Liu wrote: > >Hello, > > > >Here is the v2 patch set of killing hard-coded number 128 which is used to indicate > >the extra log space reservation for almost all of those transactions. > > > >In this round, I also tried to convert some transactions to pre-calculate out the > >space log reservation from runtime to mount time so that we can make the code related > >to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically > >can be ignored. :)) IMHO, which were includes: super block quota flags changes, > >quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, > >log super block counters, log super block units/fields, as well as set attributes. > > > > > >Changes of v2 to v1: > >- use xfs_calc_buf_res() to calulate out the space log reservation per item. > > > >Old patches: > >v1: > >http://www.spinics.net/lists/xfs/msg15499.html > > > >Thanks, > >-Jeff > > > >_______________________________________________ > >xfs mailing list > >xfs@oss.sgi.com > >http://oss.sgi.com/mailman/listinfo/xfs > > > Hi Jeff, > > I did a quick read of the series and it looks good. > > Any reason to have separate constants for: > > XFS_SYNC_ICSBCOUNT_LOG_RES(mp) > XFS_SYNC_ICSBUNIT_LOG_RES(mp) > XFS_LOG_DUMMY1_LOG_RES(mp) > > since they are the same value and are all superblock operations. Right - they can all use the same "XFS_SB_LOG_RES(mp)" reservation. FWIW, using the notiation "ICSB" is wrong here. ICSB is short for "in-core superblock" (i.e. in memory) but transactions are used for modifying the on-disk superblock. They are two separate things, so let's make sure we get the terminology right. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From garythod@snsbank.nl Fri Jan 18 18:50:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 718BB7F37 for ; Fri, 18 Jan 2013 18:50:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5895D8F8037 for ; Fri, 18 Jan 2013 16:50:04 -0800 (PST) X-ASG-Debug-ID: 1358556598-04cb6c0eef0c190001-w1Z2WR Received: from cent.se (195-198-173-171.customer.telia.com [195.198.173.171]) by cuda.sgi.com with ESMTP id xDlLpBhXjMfRGAl5 for ; Fri, 18 Jan 2013 16:49:58 -0800 (PST) X-Barracuda-Envelope-From: garythod@snsbank.nl X-Barracuda-Apparent-Source-IP: 195.198.173.171 Received: from vpn ([50.76.245.49]) by cent.se with Microsoft SMTPSVC(6.0.3790.4675); Fri, 18 Jan 2013 17:33:54 +0100 From: "SNS BANK NL" Subject: Los fondos de su familiar fallecido To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Los fondos de su familiar fallecido Content-Type: multipart/alternative; boundary="X54w05JOeMbfaEbb6RjkhobPKgZVPm=_rR0" MIME-Version: 1.0 Reply-To: garytribbett@yahoo.cn Date: Fri, 18 Jan 2013 10:34:36 -0600 Message-ID: X-OriginalArrivalTime: 18 Jan 2013 16:33:55.0010 (UTC) FILETIME=[9B6E2220:01CDF599] X-Barracuda-Connect: 195-198-173-171.customer.telia.com[195.198.173.171] X-Barracuda-Start-Time: 1358556598 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format --X54w05JOeMbfaEbb6RjkhobPKgZVPm=_rR0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable - This mail is in HTML. Some elements may be ommited in plain text. - Saludos, Estoy enviando este correo acerca de sus fondos a fines relativos que = remians reclamado con nuestro banco. Por favor volver a m=ED con su n=FAmero de tel=E9fono para que yo pued= a darle m=E1s informaci=F3n sobre este mattter urgente. Saludos Gary Tribbett www.snsbank.nl --X54w05JOeMbfaEbb6RjkhobPKgZVPm=_rR0 Content-Type: text/html Content-Transfer-Encoding: quoted-printable

    Saludos,

    Estoy enviando este correo acerca de sus fondos a fines relativos q= ue remians reclamado con nuestro banco.
    Por favor volver a m=ED con= su n=FAmero de tel=E9fono para que yo pueda darle m=E1s informaci=F3n= sobre este mattter urgente.
    Saludos
    Gary Tribbett
    www.snsbank.nl



     

    --X54w05JOeMbfaEbb6RjkhobPKgZVPm=_rR0-- From jeff.liu@oracle.com Fri Jan 18 21:28:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8B2F97F37 for ; Fri, 18 Jan 2013 21:28:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 566728F8035 for ; Fri, 18 Jan 2013 19:28:32 -0800 (PST) X-ASG-Debug-ID: 1358566107-04bdf00ee20d4a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id lUhKb9RkRFxe6QCG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Fri, 18 Jan 2013 19:28:27 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0J3SP57020535 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 19 Jan 2013 03:28:26 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0J3SMK6005694 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 19 Jan 2013 03:28:25 GMT Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0J3SMnY016081; Fri, 18 Jan 2013 21:28:22 -0600 Received: from [192.168.1.102] (/221.223.97.176) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 19:28:22 -0800 Message-ID: <50FA12D2.7090209@oracle.com> Date: Sat, 19 Jan 2013 11:28:18 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item References: <50EEC68A.1030306@oracle.com> <50F9D4A5.6050800@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item In-Reply-To: <50F9D4A5.6050800@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1358566107 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.2.120257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/19/2013 07:03 AM, Mark Tinguely wrote: > On 01/10/13 07:47, Jeff Liu wrote: >> Add a helper xfs_calc_buf_res() to calcuate out the space log reservations per item which were got >> involved in a transaction. It will call the xfs_buf_log_overhead() to figure out the extra space >> for the struct xfs_buf_log_format that gets written into the log for every buffer as well as a little >> bit of extra space because there also needs a log opheader, i.e. struct xlog_op_header. >> > The commit message is too wide. > >> Signed-off-by: Jie Liu >> --- >> fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ >> 1 file changed, 31 insertions(+) >> >> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c >> index 06ed520..6c601ea 100644 >> --- a/fs/xfs/xfs_trans.c >> +++ b/fs/xfs/xfs_trans.c >> @@ -37,14 +37,45 @@ >> #include "xfs_extent_busy.h" >> #include "xfs_bmap.h" >> #include "xfs_quota.h" >> +#include "xfs_qm.h" >> #include "xfs_trans_priv.h" >> #include "xfs_trans_space.h" >> #include "xfs_inode_item.h" >> +#include "xfs_log_priv.h" >> +#include "xfs_buf_item.h" >> #include "xfs_trace.h" >> >> kmem_zone_t *xfs_trans_zone; >> kmem_zone_t *xfs_log_item_desc_zone; >> >> +/* >> + * A buffer has a format structure overhead in the log in addition >> + * to the data, so we need to take this into account when reserving >> + * space in a transaction for a buffer. Round the space required up >> + * to a multiple of 128 bytes so that we don't change the historical >> + * reservation that has been used for this overhead. >> + */ >> +STATIC uint >> +xfs_buf_log_overhead(void) >> +{ >> + return round_up(sizeof(struct xlog_op_header) + >> + sizeof(struct xfs_buf_log_format), 128); >> +} > > Not used directly except below. inline or fold below? I should be inline. Maybe it's proper to make xfs_calc_buf_res() inline as well? Thanks, -Jeff From jeff.liu@oracle.com Fri Jan 18 21:43:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 35F9D7F37 for ; Fri, 18 Jan 2013 21:43:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C21F8F8035 for ; Fri, 18 Jan 2013 19:43:25 -0800 (PST) X-ASG-Debug-ID: 1358567003-04cbb00f2d0f9c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xHY5CsiateRWgGuW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Fri, 18 Jan 2013 19:43:24 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0J3hLWH002041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 19 Jan 2013 03:43:22 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0J3hKbW011658 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 19 Jan 2013 03:43:21 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0J3hKZU000479; Fri, 18 Jan 2013 21:43:20 -0600 Received: from [192.168.1.102] (/221.223.97.176) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jan 2013 19:43:20 -0800 Message-ID: <50FA1654.1000004@oracle.com> Date: Sat, 19 Jan 2013 11:43:16 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> <50F9C164.2050806@sgi.com> <20130119002017.GS2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation In-Reply-To: <20130119002017.GS2498@dastard> Content-Type: text/plain; charset=ISO-8859-1 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: 1358567003 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.2.120257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Mark and Dave, On 01/19/2013 08:20 AM, Dave Chinner wrote: > On Fri, Jan 18, 2013 at 03:40:52PM -0600, Mark Tinguely wrote: >> On 01/10/13 07:47, Jeff Liu wrote: >>> Hello, >>> >>> Here is the v2 patch set of killing hard-coded number 128 which is used to indicate >>> the extra log space reservation for almost all of those transactions. >>> >>> In this round, I also tried to convert some transactions to pre-calculate out the >>> space log reservation from runtime to mount time so that we can make the code related >>> to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically >>> can be ignored. :)) IMHO, which were includes: super block quota flags changes, >>> quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, >>> log super block counters, log super block units/fields, as well as set attributes. >>> >>> >>> Changes of v2 to v1: >>> - use xfs_calc_buf_res() to calulate out the space log reservation per item. >>> >>> Old patches: >>> v1: >>> http://www.spinics.net/lists/xfs/msg15499.html >>> >>> Thanks, >>> -Jeff >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >> >> >> Hi Jeff, >> >> I did a quick read of the series and it looks good. >> >> Any reason to have separate constants for: >> >> XFS_SYNC_ICSBCOUNT_LOG_RES(mp) >> XFS_SYNC_ICSBUNIT_LOG_RES(mp) >> XFS_LOG_DUMMY1_LOG_RES(mp) >> >> since they are the same value and are all superblock operations. I am intending to make the code looks a bit clear by introducing those separate definitions. :) > > Right - they can all use the same "XFS_SB_LOG_RES(mp)" reservation. > > FWIW, using the notiation "ICSB" is wrong here. ICSB is short for > "in-core superblock" (i.e. in memory) but transactions are used for > modifying the on-disk superblock. They are two separate things, so > let's make sure we get the terminology right. ;) Yes, how about if we can add a new XFS_SB_LOG_RES(mp) and call it in those transactions directly? Thanks, -Jeff From apache@net.net Sat Jan 19 09:18:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_TO_NO_BRKTS_FREEMAIL 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 646057F37 for ; Sat, 19 Jan 2013 09:18:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 25D6A8F8033 for ; Sat, 19 Jan 2013 07:18:11 -0800 (PST) X-ASG-Debug-ID: 1358608688-04bdf00ee6212a0001-NocioJ Received: from smtpout13.vox.co.za (smtpout13.vox.co.za [196.41.2.213]) by cuda.sgi.com with ESMTP id 8cfRgsJVmSjSx1fF for ; Sat, 19 Jan 2013 07:18:09 -0800 (PST) X-Barracuda-Envelope-From: apache@net.net X-Barracuda-Apparent-Source-IP: 196.41.2.213 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjkJAJtkv1DEA6QogWdsb2JhbABEgwBHpjSEGo8TAoEXDgEBFiYnghEBBQMBFSAxWRMhFAkDAQ4BhXoBAQaCIQEKAQEPCKBDhlWISgmBK4ZmChkECn+Ie40aN4JGYQOOE4dvAYZpiH+DUw X-IronPort-AV: E=Sophos;i="4.84,498,1355090400"; d="scan'208";a="19979524" Received: from mail.uskonet.com (HELO smtp01.datapro.co.za) ([196.3.164.40]) by smtpout11.vox.co.za with ESMTP; 19 Jan 2013 17:18:07 +0200 Received: from lan-linux-01.hc8.voxcore.co.za ([41.193.5.52] helo=lantic.net) by smtp01.datapro.co.za with esmtp (Exim 4.71 (FreeBSD)) (envelope-from ) id 1TwaBH-0001kY-3P for xfs@oss.sgi.com; Sat, 19 Jan 2013 17:18:07 +0200 Received: by lantic.net (Postfix, from userid 48) id 68AAB4108041; Sat, 19 Jan 2013 17:16:34 +0200 (SAST) To: xfs@oss.sgi.com Subject: Staff Enquiry (Reservation). From: MrsCaroline X-ASG-Orig-Subj: Staff Enquiry (Reservation). Reply-To: intertravelsconsultancy@gmail.com MIME-Version: 1.0 Content-Type: text/plain Message-Id: <20130119151634.68AAB4108041@lantic.net> Date: Sat, 19 Jan 2013 17:16:34 +0200 (SAST) Content-Transfer-Encoding: quoted-printable X-Sender-Verify: SUCCEEDED (sender exists & accepts mail) X-Barracuda-Connect: smtpout13.vox.co.za[196.41.2.213] X-Barracuda-Start-Time: 1358608688 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=ADVANCE_FEE_1 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) =0D Greetings from Inter-Travels Ltd=0D =0D Hello,=0D I am Mrs Caroline campbell,I am making enquiry on behalf of a group of sc= hool staffs (Lecturers) that are coming to your country for a leave,tour,= relaxation visit and academic related activities.=0D =0D This group of staffs are 12 guest in numbers.=0D =0D number of rooms needed: 12=0D type of rooms: 12 executive rooms=0D Arrival Scheduled date: February 21st 2013=0D departure: February 30th 2013=0D =0D This team also requested that we prepare a tour package for them .=0D =0D Kindly let me know if you would be able to assist us with this group book= ing and arrangements.=0D =0D I will appreciate your swift response ,=0D =0D Thanks and God bless you,=0D =0D Best Regard,=0D Mrs Caroline campbell=0D Inter-Travels Ltd=0D From just.for.lkml@googlemail.com Sat Jan 19 11:15:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D9DA97F37 for ; Sat, 19 Jan 2013 11:15:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E121AC002 for ; Sat, 19 Jan 2013 09:15:41 -0800 (PST) X-ASG-Debug-ID: 1358615740-04cb6c0eee25f60001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id zpun8GSQ0sotyXKp (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 19 Jan 2013 09:15:40 -0800 (PST) X-Barracuda-Envelope-From: just.for.lkml@googlemail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 Received: by mail-ie0-f171.google.com with SMTP id 9so3967130iec.16 for ; Sat, 19 Jan 2013 09:15:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=g8yT9igdA1CycftqKwl1weFeQD98cF14fbLCHfCKHRs=; b=D8a/7yAIlEVwmr8RXCsMD20U/NdFkxBOj1Ypk+DywLz8NBoYISCtXgIoDUyGxyIcA8 eWSVXgdOQoakJ0uNjjp+nIsBTxh/zJySNrwrvAMz5Gukrm1WaXNlr4ySdDpgqcH2XLA3 NqCzRCLs4TvaAZtpcTP+Hp8BN4M6dy2tu6zlOvk20LwXqylrAjWvYWbMFM0BCaMp4FN7 JJ0yLG8JB372DwmkcupoqdRvg+d+Db1mP9p5c2kkwUsnCO4XEekGVvKkjnnaw7D9eBsr Oq2HuIiqK2wlmX1R1gXVppwQJecdJKBwuzRr+tdS0vrFLQ14re0KZatvwwicT7fHBxEa vWMw== MIME-Version: 1.0 X-Received: by 10.50.190.199 with SMTP id gs7mr5270446igc.89.1358615740235; Sat, 19 Jan 2013 09:15:40 -0800 (PST) Received: by 10.42.72.197 with HTTP; Sat, 19 Jan 2013 09:15:40 -0800 (PST) Date: Sat, 19 Jan 2013 18:15:40 +0100 Message-ID: Subject: xfs_fsr / xfs_swap_extents() broken in 3.8-rc4? From: Torsten Kaiser X-ASG-Orig-Subj: xfs_fsr / xfs_swap_extents() broken in 3.8-rc4? To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1358615740 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, I just used xfs_fsr the first time under a 3.8-rc kernel and was spammed with an enormous amount of "XFS_IOC_SWAPEXT failed: ino=56118: Invalid argument" messages. I found the thread http://marc.info/?t=135727980600001&r=1&w=2 and went to check the kernel sources for these additional checks, because I wanted to know what was allowed earlier and is now failing. I found commit fb59581404ab7ec5075299065c22cb211a9262a9: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=fb59581404ab7ec5075299065c22cb211a9262a9#patch2 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -246,12 +246,10 @@ xfs_swap_extents( goto out_unlock; } - if (VN_CACHED(VFS_I(tip)) != 0) { - error = xfs_flushinval_pages(tip, 0, -1, - FI_REMAPF_LOCKED); - if (error) - goto out_unlock; - } + error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); + if (error) + goto out_unlock; + truncate_pagecache_range(VFS_I(ip), 0, -1); That looks really wrong to me. The old code was calling xfs_flushinval_pages() for *tip*, but the new code is working on *ip*. Was that change really intended? Is looks unintentional and is not mentioned in the commit comment... Thanks for looking / correcting me if I'm missing something obvious, but I can't find a reason for this change... Torsten From tinguely@sgi.com Sat Jan 19 12:18:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 3480E7F37 for ; Sat, 19 Jan 2013 12:18:23 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14A9D30406A; Sat, 19 Jan 2013 10:18:20 -0800 (PST) Message-ID: <50FAE36D.8040508@sgi.com> Date: Sat, 19 Jan 2013 12:18:21 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item References: <50EEC68A.1030306@oracle.com> <50F9D4A5.6050800@sgi.com> <50FA12D2.7090209@oracle.com> In-Reply-To: <50FA12D2.7090209@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/18/13 21:28, Jeff Liu wrote: > On 01/19/2013 07:03 AM, Mark Tinguely wrote: >> On 01/10/13 07:47, Jeff Liu wrote: >>> Add a helper xfs_calc_buf_res() to calcuate out the space log reservations per item which were got >>> involved in a transaction. It will call the xfs_buf_log_overhead() to figure out the extra space >>> for the struct xfs_buf_log_format that gets written into the log for every buffer as well as a little >>> bit of extra space because there also needs a log opheader, i.e. struct xlog_op_header. >>> >> The commit message is too wide. >> >>> Signed-off-by: Jie Liu >>> --- >>> fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ >>> 1 file changed, 31 insertions(+) >>> >>> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c >>> index 06ed520..6c601ea 100644 >>> --- a/fs/xfs/xfs_trans.c >>> +++ b/fs/xfs/xfs_trans.c >>> @@ -37,14 +37,45 @@ >>> #include "xfs_extent_busy.h" >>> #include "xfs_bmap.h" >>> #include "xfs_quota.h" >>> +#include "xfs_qm.h" >>> #include "xfs_trans_priv.h" >>> #include "xfs_trans_space.h" >>> #include "xfs_inode_item.h" >>> +#include "xfs_log_priv.h" >>> +#include "xfs_buf_item.h" >>> #include "xfs_trace.h" >>> >>> kmem_zone_t *xfs_trans_zone; >>> kmem_zone_t *xfs_log_item_desc_zone; >>> >>> +/* >>> + * A buffer has a format structure overhead in the log in addition >>> + * to the data, so we need to take this into account when reserving >>> + * space in a transaction for a buffer. Round the space required up >>> + * to a multiple of 128 bytes so that we don't change the historical >>> + * reservation that has been used for this overhead. >>> + */ >>> +STATIC uint >>> +xfs_buf_log_overhead(void) >>> +{ >>> + return round_up(sizeof(struct xlog_op_header) + >>> + sizeof(struct xfs_buf_log_format), 128); >>> +} >> >> Not used directly except below. inline or fold below? > I should be inline. Maybe it's proper to make xfs_calc_buf_res() inline > as well? Looks like these routines just get run at boot time - the existing reservations routines that run at boot time are routines too, so you are following the existing style. So I don't want to build a bikeshed so I am flexible on this point. There appears seems to be some errors in patch 2.... --Mark. From tinguely@sgi.com Sat Jan 19 13:08:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 7F9247F37 for ; Sat, 19 Jan 2013 13:08:49 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43F8D8F8033; Sat, 19 Jan 2013 11:08:46 -0800 (PST) Message-ID: <50FAEF3F.7090607@sgi.com> Date: Sat, 19 Jan 2013 13:08:47 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <50EEC68F.6070309@oracle.com> In-Reply-To: <50EEC68F.6070309@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/10/13 07:47, Jeff Liu wrote: > Start to make use of the new helper to figure out space log reservations for those > transactions which are pre-calculated at mount time in xfs_trans.c. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_trans.c | 244 ++++++++++++++++++++++++---------------------------- > 1 file changed, 113 insertions(+), 131 deletions(-) > Wow! Reading this patch makes me appreciate the work you did here and gets my eyes in shape for Dave's UBER user sync patch. A question for you, or anyone. When these reservations are made, the comments talk about specify number of agf/agfl (usually 2 or 3) that will be dirty in the command. There are other comments that seem to imply an agf/agfl is reserved for all AGs and then use the multiplier of 4. Is a specific number of AGs can be involved in the operation or does it want something like sb_agcount? I think there a couple error (may be more): > /* > @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - MAX((mp->m_sb.sb_inodesize + > - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + > - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), > - (4 * mp->m_sb.sb_sectsize + > - 4 * mp->m_sb.sb_sectsize + > - mp->m_sb.sb_sectsize + > - XFS_ALLOCFREE_LOG_RES(mp, 4) + > - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + > - 128 * 5 + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, > + XFS_FSB_TO_B(mp, 1))), > + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(5, 0) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + mp->m_in_maxlevels, > + XFS_FSB_TO_B(mp, 1)))); ^^^^^^^^^^^^^^ I think this should be 0. In the original code, I see the headers being reserved but not the data. > /* > @@ -298,18 +287,18 @@ xfs_calc_create_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - MAX((mp->m_sb.sb_inodesize + > - mp->m_sb.sb_inodesize + > - mp->m_sb.sb_sectsize + > - XFS_FSB_TO_B(mp, 1) + > - XFS_DIROP_LOG_RES(mp) + > - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), > - (3 * mp->m_sb.sb_sectsize + > - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + > - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(0, XFS_FSB_TO_B(mp, 1)) + ^^^^ 0 * (128+XFS_FSB_TO_B(mp, 1))? from the header counts, it appears you meant no headers, so it would be just: XFS_FSB_TO_B(mp, 1) + > + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), > + XFS_FSB_TO_B(mp, 1))), > + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(mp->m_in_maxlevels, > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1)))); > } > /* > @@ -337,16 +326,15 @@ xfs_calc_ifree_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - mp->m_sb.sb_inodesize + > - mp->m_sb.sb_sectsize + > - mp->m_sb.sb_sectsize + > - XFS_FSB_TO_B(mp, 1) + > - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > - XFS_INODE_CLUSTER_SIZE(mp)) + ^^^ end of MAX() 5th header is is the single item in MAX > - 128 * 5 + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + > + MAX(xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)), > + XFS_INODE_CLUSTER_SIZE(mp) + ^^^^^ MAX should end here ^^ > + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + mp->m_in_maxlevels, 0) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1))); > } > > /* > @@ -337,16 +326,15 @@ xfs_calc_ifree_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - mp->m_sb.sb_inodesize + > - mp->m_sb.sb_sectsize + > - mp->m_sb.sb_sectsize + > - XFS_FSB_TO_B(mp, 1) + > - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), ^^^^ > - XFS_INODE_CLUSTER_SIZE(mp)) + > - 128 * 5 + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + > + MAX(xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)), ^^^ has extra header added it. > + XFS_INODE_CLUSTER_SIZE(mp) + > + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + mp->m_in_maxlevels, 0) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1))); > } > /* I will have to go through this patch again and also test prints before and after the patch. Before the patch: write 108216 itrnc 219064 renam 305976 link 153144 remov 153144 symlk 158520 creat 157880 mkdir 157880 ifree 57912 ichng 1592 grwdt 44160 swrit 384 wrtid 384 addfk 69560 atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr 4224 gwrfr 5760 After the patch: write 108216 itrnc 255928 renam 305976 link 153144 remov 153144 symlk 158520 creat 153784 mkdir 153784 ifree 57784 ichng 1592 grwdt 44160 swrit 384 wrtid 384 addfk 69560 atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr 4224 gwrfr 5760 I plan to test on both sides of the routine's MAX() command too. ---- BTW, besides reusing the same superblock reservation and the commit widths, the rest of the series looks good to me. --Mark. From xfs@tlinx.org Sat Jan 19 13:47:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4247A7F37 for ; Sat, 19 Jan 2013 13:47:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7372AC001 for ; Sat, 19 Jan 2013 11:47:51 -0800 (PST) X-ASG-Debug-ID: 1358624866-04cbb00f2c2a390001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id RXELOOUV7Hx5davs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 19 Jan 2013 11:47:47 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0JJlibO001108 for ; Sat, 19 Jan 2013 11:47:46 -0800 Message-ID: <50FAF860.3000702@tlinx.org> Date: Sat, 19 Jan 2013 11:47:44 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358624867 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.2.120321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Given that XFS relies on the page size for it's maximum block size, does switching to 1GB pages for kernel pagetables allow for larger page-size use in XFS -- and therefore, larger blocksize? Is it something that might be in the not too distant future? ;-) ...just wistful curiosty... ;-) From david@fromorbit.com Sat Jan 19 16:44:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 024997F37 for ; Sat, 19 Jan 2013 16:44:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4181304048 for ; Sat, 19 Jan 2013 14:44:01 -0800 (PST) X-ASG-Debug-ID: 1358635436-04cbb00c65011e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Fz0DJ2tavbWmgz74 for ; Sat, 19 Jan 2013 14:43:57 -0800 (PST) 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: An8OAPEg+1B5LETJ/2dsb2JhbABEhVyyPoYiF3OCHgEBBTocIxAIAxgJDBkPBSUDIROIGLtEFY1vgzUDlguQSoMJ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 09:13:55 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Twh8k-0005sP-2r; Sun, 20 Jan 2013 09:43:54 +1100 Date: Sun, 20 Jan 2013 09:43:54 +1100 From: Dave Chinner To: Jeff Liu Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item Message-ID: <20130119224354.GU2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item References: <50EEC68A.1030306@oracle.com> <50F9D4A5.6050800@sgi.com> <50FA12D2.7090209@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FA12D2.7090209@oracle.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: 1358635436 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.2.120333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 19, 2013 at 11:28:18AM +0800, Jeff Liu wrote: > On 01/19/2013 07:03 AM, Mark Tinguely wrote: > > On 01/10/13 07:47, Jeff Liu wrote: > >> Add a helper xfs_calc_buf_res() to calcuate out the space log reservations per item which were got > >> involved in a transaction. It will call the xfs_buf_log_overhead() to figure out the extra space > >> for the struct xfs_buf_log_format that gets written into the log for every buffer as well as a little > >> bit of extra space because there also needs a log opheader, i.e. struct xlog_op_header. > >> > > The commit message is too wide. > > > >> Signed-off-by: Jie Liu > >> --- > >> fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ > >> 1 file changed, 31 insertions(+) > >> > >> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > >> index 06ed520..6c601ea 100644 > >> --- a/fs/xfs/xfs_trans.c > >> +++ b/fs/xfs/xfs_trans.c > >> @@ -37,14 +37,45 @@ > >> #include "xfs_extent_busy.h" > >> #include "xfs_bmap.h" > >> #include "xfs_quota.h" > >> +#include "xfs_qm.h" > >> #include "xfs_trans_priv.h" > >> #include "xfs_trans_space.h" > >> #include "xfs_inode_item.h" > >> +#include "xfs_log_priv.h" > >> +#include "xfs_buf_item.h" > >> #include "xfs_trace.h" > >> > >> kmem_zone_t *xfs_trans_zone; > >> kmem_zone_t *xfs_log_item_desc_zone; > >> > >> +/* > >> + * A buffer has a format structure overhead in the log in addition > >> + * to the data, so we need to take this into account when reserving > >> + * space in a transaction for a buffer. Round the space required up > >> + * to a multiple of 128 bytes so that we don't change the historical > >> + * reservation that has been used for this overhead. > >> + */ > >> +STATIC uint > >> +xfs_buf_log_overhead(void) > >> +{ > >> + return round_up(sizeof(struct xlog_op_header) + > >> + sizeof(struct xfs_buf_log_format), 128); > >> +} > > > > Not used directly except below. inline or fold below? > I should be inline. Maybe it's proper to make xfs_calc_buf_res() inline > as well? It's static. The compiler will inline it for us if appropriate. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 19 16:46:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9FD037F37 for ; Sat, 19 Jan 2013 16:46:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7AC93304064 for ; Sat, 19 Jan 2013 14:46:06 -0800 (PST) X-ASG-Debug-ID: 1358635564-04cb6c391501550001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id s5IQDuq8B6Ftdv6h for ; Sat, 19 Jan 2013 14:46:04 -0800 (PST) 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: An8OAPEg+1B5LETJ/2dsb2JhbABEhVyyPoYiF3OCHgEBBTocIxAIAxgJDBkPBSUDIROIGLtEFY1vgzUDlguQSoMJ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 09:16:03 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwhAp-0005t2-8d; Sun, 20 Jan 2013 09:46:03 +1100 Date: Sun, 20 Jan 2013 09:46:03 +1100 From: Dave Chinner To: Mark Tinguely Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item Message-ID: <20130119224603.GV2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 01/12] xfs: add a helper to figure out the space log reservation per item References: <50EEC68A.1030306@oracle.com> <50F9D4A5.6050800@sgi.com> <50FA12D2.7090209@oracle.com> <50FAE36D.8040508@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FAE36D.8040508@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: 1358635564 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.2.120333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 19, 2013 at 12:18:21PM -0600, Mark Tinguely wrote: > On 01/18/13 21:28, Jeff Liu wrote: > >On 01/19/2013 07:03 AM, Mark Tinguely wrote: > >>On 01/10/13 07:47, Jeff Liu wrote: > >>>+/* > >>>+ * A buffer has a format structure overhead in the log in addition > >>>+ * to the data, so we need to take this into account when reserving > >>>+ * space in a transaction for a buffer. Round the space required up > >>>+ * to a multiple of 128 bytes so that we don't change the historical > >>>+ * reservation that has been used for this overhead. > >>>+ */ > >>>+STATIC uint > >>>+xfs_buf_log_overhead(void) > >>>+{ > >>>+ return round_up(sizeof(struct xlog_op_header) + > >>>+ sizeof(struct xfs_buf_log_format), 128); > >>>+} > >> > >>Not used directly except below. inline or fold below? > >I should be inline. Maybe it's proper to make xfs_calc_buf_res() inline > >as well? > > Looks like these routines just get run at boot time - the existing They run at mount time, not boot time... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 19 17:09:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F41BA7F37 for ; Sat, 19 Jan 2013 17:09:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D88FAC003 for ; Sat, 19 Jan 2013 15:09:46 -0800 (PST) X-ASG-Debug-ID: 1358636984-04bdf0231d01c20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OhjOH71TWSC2hMB2 for ; Sat, 19 Jan 2013 15:09:45 -0800 (PST) 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: An8OANIl+1B5LETJ/2dsb2JhbABEhVyyPoYiF3OCHgEBBAE6HCMFCwgDGAklDwUlAyETiBMFu0IVkSQDlguJToZ8gwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 09:39:44 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwhXj-0005vg-Kw; Sun, 20 Jan 2013 10:09:43 +1100 Date: Sun, 20 Jan 2013 10:09:43 +1100 From: Dave Chinner To: Mark Tinguely Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Message-ID: <20130119230943.GW2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <50EEC68F.6070309@oracle.com> <50FAEF3F.7090607@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FAEF3F.7090607@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: 1358636984 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.2.120335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 19, 2013 at 01:08:47PM -0600, Mark Tinguely wrote: > On 01/10/13 07:47, Jeff Liu wrote: > >Start to make use of the new helper to figure out space log reservations for those > >transactions which are pre-calculated at mount time in xfs_trans.c. > > > >Signed-off-by: Jie Liu > >--- > > fs/xfs/xfs_trans.c | 244 ++++++++++++++++++++++++---------------------------- > > 1 file changed, 113 insertions(+), 131 deletions(-) > > > > Wow! Reading this patch makes me appreciate the work you did here > and gets my eyes in shape for Dave's UBER user sync patch. > > A question for you, or anyone. When these reservations are made, the > comments talk about specify number of agf/agfl (usually 2 or 3) that > will be dirty in the command. > > There are other comments that seem to imply an agf/agfl is reserved > for all AGs and then use the multiplier of 4. Is a specific number > of AGs can be involved in the operation or does it want something > like sb_agcount? Do you mean comments like this about xfs_calc_itruncate_reservation()? * And the bmap_finish transaction can free the blocks and bmap * blocks: * the agf for each of the ags: 4 * sector size * the agfl for each of the ags: 4 * sector size This assumes the transaction can free 4 extents before a commit, and all 4 extents can be in a different AG. You'll find all the other cases documented like this indicate how many extents can be freed or allocated in a single transaction.... > I think there a couple error (may be more): At a quick glance, it's hard to verify if there are errors or not. I was about to suggest that you do this: > I will have to go through this patch again and also test prints > before and after the patch. > > Before the patch: > write 108216 itrnc 219064 renam 305976 link 153144 remov 153144 > symlk 158520 creat 157880 > mkdir 157880 ifree 57912 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > addfk 69560 > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr > 4224 gwrfr 5760 > > > After the patch: > write 108216 itrnc 255928 renam 305976 link 153144 remov 153144 > symlk 158520 creat 153784 > mkdir 153784 ifree 57784 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > addfk 69560 > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr > 4224 gwrfr 5760 But it looks like you've already thought of that :) I'd also suggest that different geometries need to be checked, because things like block size affect the result. I'd be looking at checking these geometries: -b size=512 -n size=512 -b size=512 -n size=4096 -b size=512 -n size=65536 -b size=4096 -n size=4096 -b size=4096 -n size=65536 -b size=4096 -n size=4096 -i size=2048 Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 19 17:16:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 877417F37 for ; Sat, 19 Jan 2013 17:16:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 73F18304043 for ; Sat, 19 Jan 2013 15:16:47 -0800 (PST) X-ASG-Debug-ID: 1358637405-04cb6c391502020001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IOKDNt70I55Hd7QW for ; Sat, 19 Jan 2013 15:16:45 -0800 (PST) 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: AoAOAN4o+1B5LETJ/2dsb2JhbABEhVyyPoYiF3OCHgEBBAE6HCMFCwgDDgoJJQ8FJQMhE4gTBbs+FZEkA5YLkEqDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 09:46:45 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwheW-0005wZ-81; Sun, 20 Jan 2013 10:16:44 +1100 Date: Sun, 20 Jan 2013 10:16:44 +1100 From: Dave Chinner To: Linda Walsh Cc: xfs-oss Subject: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? Message-ID: <20130119231644.GX2498@dastard> X-ASG-Orig-Subj: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? References: <50FAF860.3000702@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FAF860.3000702@tlinx.org> 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: 1358637405 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.2.120335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 19, 2013 at 11:47:44AM -0800, Linda Walsh wrote: > Given that XFS relies on the page size for it's maximum block size, > does switching to 1GB pages for kernel pagetables allow for larger > page-size use in XFS -- and therefore, larger blocksize? No, it doesn't. The page cache can't use large pages so there's no path to allowing XFS to use larger blocks with them. As it is, you'd need a system that supports 16k or 64k page sizes for this to be useful, otherwise you just waste a *lot* of memory... > Is it something that might be in the not too distant future? ;-) I have no plans to do this any time soon - there's no compelling reason to do so. I can't speak for anyone else, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 19 17:17:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C3A247F37 for ; Sat, 19 Jan 2013 17:17:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A0ED18F8033 for ; Sat, 19 Jan 2013 15:17:50 -0800 (PST) X-ASG-Debug-ID: 1358637468-04cb6c3913020a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hbI1QWS3j2yYVEtp for ; Sat, 19 Jan 2013 15:17:49 -0800 (PST) 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: An8OAN4o+1B5LETJ/2dsb2JhbABEhVyyPoYiF3OCHgEBBScTHCMQCAMOCgklDwUlAyETiBgNuzEVkSQDlguBHYgxhnyDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 09:47:48 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwhfX-0005wk-Ji; Sun, 20 Jan 2013 10:17:47 +1100 Date: Sun, 20 Jan 2013 10:17:47 +1100 From: Dave Chinner To: Torsten Kaiser Cc: xfs@oss.sgi.com Subject: Re: xfs_fsr / xfs_swap_extents() broken in 3.8-rc4? Message-ID: <20130119231747.GY2498@dastard> X-ASG-Orig-Subj: Re: xfs_fsr / xfs_swap_extents() broken in 3.8-rc4? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1358637468 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Jan 19, 2013 at 06:15:40PM +0100, Torsten Kaiser wrote: > Hi, > > I just used xfs_fsr the first time under a 3.8-rc kernel and was > spammed with an enormous amount of "XFS_IOC_SWAPEXT failed: ino=56118: > Invalid argument" messages. > > I found the thread http://marc.info/?t=135727980600001&r=1&w=2 and > went to check the kernel sources for these additional checks, because > I wanted to know what was allowed earlier and is now failing. > > I found commit fb59581404ab7ec5075299065c22cb211a9262a9: > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=fb59581404ab7ec5075299065c22cb211a9262a9#patch2 > > --- a/fs/xfs/xfs_dfrag.c > +++ b/fs/xfs/xfs_dfrag.c > @@ -246,12 +246,10 @@ xfs_swap_extents( > goto out_unlock; > } > > - if (VN_CACHED(VFS_I(tip)) != 0) { > - error = xfs_flushinval_pages(tip, 0, -1, > - FI_REMAPF_LOCKED); > - if (error) > - goto out_unlock; > - } > + error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); > + if (error) > + goto out_unlock; > + truncate_pagecache_range(VFS_I(ip), 0, -1); > > That looks really wrong to me. The old code was calling > xfs_flushinval_pages() for *tip*, but the new code is working on *ip*. > Was that change really intended? Is looks unintentional and is not > mentioned in the commit comment... > > Thanks for looking / correcting me if I'm missing something obvious, > but I can't find a reason for this change... I think you're right - good catch. Can you send the patch with a proper subject, commit message and sign-ofif? Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Sat Jan 19 17:55:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4DE457F37 for ; Sat, 19 Jan 2013 17:55:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 184A68F8033 for ; Sat, 19 Jan 2013 15:55:28 -0800 (PST) X-ASG-Debug-ID: 1358639727-04bdf0231d02b40001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id hx139wpuzsoyH1qW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 19 Jan 2013 15:55:27 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0JNtGmd011377; Sat, 19 Jan 2013 15:55:19 -0800 Message-ID: <50FB3265.8060506@tlinx.org> Date: Sat, 19 Jan 2013 15:55:17 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> X-ASG-Orig-Subj: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? In-Reply-To: <20130119231644.GX2498@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358639727 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.2.120339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner wrote: > On Sat, Jan 19, 2013 at 11:47:44AM -0800, Linda Walsh wrote: >> Given that XFS relies on the page size for it's maximum block size, >> does switching to 1GB pages for kernel pagetables allow for larger >> page-size use in XFS -- and therefore, larger blocksize? > > No, it doesn't. The page cache can't use large pages so there's no > path to allowing XFS to use larger blocks with them. > > As it is, you'd need a system that supports 16k or 64k page sizes > for this to be useful, otherwise you just waste a *lot* of memory... > >> Is it something that might be in the not too distant future? ;-) > > I have no plans to do this any time soon - there's no compelling > reason to do so. I can't speak for anyone else, though... --- No prob.. I admit a 1GB page size might be a tad large for my purposes... I actually was reading 1MB though even that would be large...but a GB/disk sector...um...-- at least I'd be likely to get full speed read & writes if I could fill them...(1GB/R or W gives me about the fastest overall throughput to my disks). Can't test higher (i.e. >=2GB) than that due to getting partial block read/writes (on a 64 bit machine??) Sounds like my LSI controller is only 32bits...but that doesn't seem right... Maybe it only supports consecutive read/writes up to the limit of the memory on the controller card.. All that talk about RAIDs recently, got me depressed a bit when I realize that while I can get fast speeds, type speeds in seeking around are about 1/10-1/20th the speed...sigh. Might that indicate that I should go with smaller RAIDS with more spindles? I.e. instead of 3 groups of RAID5 striped as 0, go for 4-5 groups of RAID5 striped as a 0? Just aligning the darn things nearly takes a rocket scientist! But then start talking about multiple spindles and optimizing IOP's...ARG!...;-) (If it wasn't challenging, I'd find it boring...)... From david@fromorbit.com Sat Jan 19 18:46:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7002F7F37 for ; Sat, 19 Jan 2013 18:46:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3867AC001 for ; Sat, 19 Jan 2013 16:46:46 -0800 (PST) X-ASG-Debug-ID: 1358642800-04cbb00c6403730001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id U3SLqITMYYsjPXAq for ; Sat, 19 Jan 2013 16:46:41 -0800 (PST) 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: AoAOAGs9+1B5LETJ/2dsb2JhbABEhVyyP4YiF3OCHgEBBAE6HCMFCwgDDgoJJQ8FJQMhE4gTBbs1FYx2AYQtA5YLkEqDCYFSAR8 Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 11:16:40 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Twj3W-00064O-TT; Sun, 20 Jan 2013 11:46:38 +1100 Date: Sun, 20 Jan 2013 11:46:38 +1100 From: Dave Chinner To: Linda Walsh Cc: xfs-oss Subject: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? Message-ID: <20130120004638.GZ2498@dastard> X-ASG-Orig-Subj: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FB3265.8060506@tlinx.org> 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: 1358642800 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.2.120340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 19, 2013 at 03:55:17PM -0800, Linda Walsh wrote: > > > Dave Chinner wrote: > >On Sat, Jan 19, 2013 at 11:47:44AM -0800, Linda Walsh wrote: > >>Given that XFS relies on the page size for it's maximum block size, > >>does switching to 1GB pages for kernel pagetables allow for larger > >>page-size use in XFS -- and therefore, larger blocksize? > > > >No, it doesn't. The page cache can't use large pages so there's no > >path to allowing XFS to use larger blocks with them. > > > >As it is, you'd need a system that supports 16k or 64k page sizes > >for this to be useful, otherwise you just waste a *lot* of memory... > > > >>Is it something that might be in the not too distant future? ;-) > > > >I have no plans to do this any time soon - there's no compelling > >reason to do so. I can't speak for anyone else, though... > > --- > No prob.. I admit a 1GB page size might be a tad large for > my purposes... I actually was reading 1MB though even that would be > large...but a GB/disk sector...um...-- at least I'd be likely to > get full speed read & writes if I could fill them...(1GB/R or W > gives me about the fastest overall throughput to my disks). > > Can't test higher (i.e. >=2GB) than that due to getting > partial block read/writes (on a 64 bit machine??) Sounds like I think that the read/write interface are limited to 2GB buffer size, regardless of the platform. > my LSI controller is only 32bits...but that doesn't seem right... > Maybe it only supports consecutive read/writes up to the limit > of the memory on the controller card.. > > All that talk about RAIDs recently, got me depressed a bit > when I realize that while I can get fast speeds, type speeds in seeking > around are about 1/10-1/20th the speed...sigh. > > Might that indicate that I should go with smaller RAIDS with more > spindles? I.e. instead of 3 groups of RAID5 striped as 0, go for 4-5 groups > of RAID5 striped as a 0? Just aligning the darn things nearly takes a rocket > scientist! But then start talking about multiple spindles and optimizing > IOP's...ARG!...;-) (If it wasn't challenging, I'd find it boring...)... Somebody on the list might be able to help you with this - I don't have the time right now as I'm deep in metadata CRC changes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Jan 19 20:17:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 720627F37 for ; Sat, 19 Jan 2013 20:17:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F258304064 for ; Sat, 19 Jan 2013 18:17:06 -0800 (PST) X-ASG-Debug-ID: 1358648223-04cbb00c63052a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qCNxDEoAKDcXWHCW for ; Sat, 19 Jan 2013 18:17:03 -0800 (PST) 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: AiweADdS+1B5LETJ/2dsb2JhbABEhVyyP4USAoEOF3OCHgEBBTocIxAIAxgJJQ8FJQMhE4gYuzQVjUSCf2EDlguJToZ8gwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Jan 2013 12:47:02 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwkSz-0006Bx-4C; Sun, 20 Jan 2013 13:17:01 +1100 Date: Sun, 20 Jan 2013 13:17:01 +1100 From: Dave Chinner To: Mark Tinguely Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Message-ID: <20130120021701.GA2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <50EEC68F.6070309@oracle.com> <50FAEF3F.7090607@sgi.com> <20130119230943.GW2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130119230943.GW2498@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: 1358648223 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.2.120346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jan 20, 2013 at 10:09:43AM +1100, Dave Chinner wrote: > On Sat, Jan 19, 2013 at 01:08:47PM -0600, Mark Tinguely wrote: > > On 01/10/13 07:47, Jeff Liu wrote: > > I will have to go through this patch again and also test prints > > before and after the patch. > > > > Before the patch: > > write 108216 itrnc 219064 renam 305976 link 153144 remov 153144 > > symlk 158520 creat 157880 > > mkdir 157880 ifree 57912 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > > addfk 69560 > > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr > > 4224 gwrfr 5760 > > > > > > After the patch: > > write 108216 itrnc 255928 renam 305976 link 153144 remov 153144 > > symlk 158520 creat 153784 > > mkdir 153784 ifree 57784 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > > addfk 69560 > > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr > > 4224 gwrfr 5760 > > But it looks like you've already thought of that :) > > I'd also suggest that different geometries need to be checked, because > things like block size affect the result. I'd be looking at checking > these geometries: > > -b size=512 -n size=512 > -b size=512 -n size=4096 > -b size=512 -n size=65536 > -b size=4096 -n size=4096 > -b size=4096 -n size=65536 > -b size=4096 -n size=4096 -i size=2048 Just thinking aloud - probably a good idea to test different secotr sizes as well (-s size=4096) for a couple of those.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From lheart@coxltdlimited.com Sat Jan 19 23:15:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.7 required=5.0 tests=MSGID_FROM_MTA_HEADER, TVD_PH_SUBJ_URGENT,TVD_SPACE_RATIO,T_HK_NAME_MR_MRS,UNPARSEABLE_RELAY 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 559087F37 for ; Sat, 19 Jan 2013 23:15:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9617AC002 for ; Sat, 19 Jan 2013 21:15:26 -0800 (PST) X-ASG-Debug-ID: 1358658923-04cbb00c66097f0001-NocioJ Received: from rediffmail.com (pro237-212.mxout.rediffmailpro.com [202.137.237.212]) by cuda.sgi.com with SMTP id M8TIuHwVZSnaEiMl for ; Sat, 19 Jan 2013 21:15:24 -0800 (PST) X-Barracuda-Envelope-From: lheart@coxltdlimited.com X-Barracuda-Apparent-Source-IP: 202.137.237.212 Received: (qmail 6017 invoked by uid 510); 20 Jan 2013 05:15:19 -0000 x-m-msg: asd54ad564ad7aa6sd5as6d5; a6da7d6asas6dasd77; 5dad65ad5sd; X-CTCH-Spam: Unknown X-CTCH-VOD: Unknown X-CTCH-Flags: : 0 X-CTCH-RefID: str=0001.0A150206.50FB7D68.00CA,ss=1,re=0.000,fgs=0 Date: 20 Jan 2013 05:15:18 -0000 Message-ID: <20130120051518.6011.qmail@pro237-212.mxout.rediffmailpro.com> MIME-Version: 1.0 To: Received: from unknown 110.159.162.7 by rediffmailpro.com via HTTP; 20 Jan 2013 05:15:18 -0000 Sender: lheart@coxltdlimited.com Subject: =?utf-8?B?VXJnZW50?= From: "Mrs Linda Heart" X-ASG-Orig-Subj: =?utf-8?B?VXJnZW50?= X-Barracuda-Connect: pro237-212.mxout.rediffmailpro.com[202.137.237.212] X-Barracuda-Start-Time: 1358658923 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2, TVD_PH_SUBJ_URGENT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120358 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.10 TVD_PH_SUBJ_URGENT TVD_PH_SUBJ_URGENT 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay From lheart@coxltdlimited.com Sat Jan 19 23:46:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.7 required=5.0 tests=MSGID_FROM_MTA_HEADER, TVD_PH_SUBJ_URGENT,TVD_SPACE_RATIO,T_HK_NAME_MR_MRS,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 D49517F37 for ; Sat, 19 Jan 2013 23:46:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B6B858F8033 for ; Sat, 19 Jan 2013 21:46:19 -0800 (PST) X-ASG-Debug-ID: 1358660777-04cbb00c660a890001-w1Z2WR Received: from rediffmail.com (pro237-235.mxout.rediffmailpro.com [202.137.237.235]) by cuda.sgi.com with SMTP id 4mzveu0XUL1VTZJY for ; Sat, 19 Jan 2013 21:46:18 -0800 (PST) X-Barracuda-Envelope-From: lheart@coxltdlimited.com X-Barracuda-Apparent-Source-IP: 202.137.237.235 Received: (qmail 24559 invoked by uid 510); 20 Jan 2013 05:46:14 -0000 x-m-msg: asd54ad564ad7aa6sd5as6d5; a6da7d6asas6dasd77; 5dad65ad5sd; X-CTCH-Spam: Unknown X-CTCH-VOD: Unknown X-CTCH-Flags: : 0 X-CTCH-RefID: str=0001.0A150205.50FB84A8.0092,ss=1,re=0.000,fgs=0 Date: 20 Jan 2013 05:46:14 -0000 Message-ID: <20130120054614.24551.qmail@pro237-235.mxout.rediffmailpro.com> MIME-Version: 1.0 To: Received: from unknown 110.159.162.7 by rediffmailpro.com via HTTP; 20 Jan 2013 05:46:14 -0000 Sender: lheart@coxltdlimited.com Subject: =?utf-8?B?VXJnZW50?= From: "Mrs Linda Heart" X-ASG-Orig-Subj: =?utf-8?B?VXJnZW50?= X-Barracuda-Connect: pro237-235.mxout.rediffmailpro.com[202.137.237.235] X-Barracuda-Start-Time: 1358660777 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2, TVD_PH_SUBJ_URGENT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120360 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.10 TVD_PH_SUBJ_URGENT TVD_PH_SUBJ_URGENT 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay From just.for.lkml@googlemail.com Sun Jan 20 03:24:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F2C87F37 for ; Sun, 20 Jan 2013 03:24:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D6588F8037 for ; Sun, 20 Jan 2013 01:24:55 -0800 (PST) X-ASG-Debug-ID: 1358673893-04cb6c391211300001-NocioJ Received: from mail-ee0-f54.google.com (mail-ee0-f54.google.com [74.125.83.54]) by cuda.sgi.com with ESMTP id NbV8HraovqesutXv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 20 Jan 2013 01:24:54 -0800 (PST) X-Barracuda-Envelope-From: just.for.lkml@googlemail.com X-Barracuda-Apparent-Source-IP: 74.125.83.54 X-Barracuda-IPDD: Level1 [googlemail.com/74.125.83.54] Received: by mail-ee0-f54.google.com with SMTP id c41so2451462eek.13 for ; Sun, 20 Jan 2013 01:24:53 -0800 (PST) X-Barracuda-IPDD: Level1 [googlemail.com/74.125.83.54] X-Barracuda-IPDD: Level1 [googlemail.com/74.125.83.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:x-mailer:mime-version :content-type:content-transfer-encoding; bh=SVSpx/VxRxNa8Oe2LeEBGyyRUl943NvBe7z62JKrV14=; b=PDSvTYSJM9I3o5FmPbIMtY7SpHvb323zCULD42SEeKUVWapu3g608aPw111WUll7Rh LFeRHfN+GcyuB+XUzfFW+IWqCbhHf3RKEAZeIYTCuYbixZGuXC5UXOwF0n16ohpnqvQk xdqJk+6L2a0rPzh3uIkplcbsXTccUv0jMVcy2SX2HXzupgAnaEOWtG6VSxI/RuqVZyyF 3YY8ORrl01Yus5RGPi6j8Mg1YngcHis6tevoRfBKMesXRvMoE4uaOSdS028KLG72vJk7 ao3P+jrzQLdbSI9Am8+ANbaTHOHQ1Tpr9QP3AU8l1NKVxOTK0Q6LnxrmrC8tp0p9ZcrC HmtA== X-Received: by 10.14.1.195 with SMTP id 43mr47202332eed.31.1358673893236; Sun, 20 Jan 2013 01:24:53 -0800 (PST) Received: from localhost (p57AC75D7.dip.t-dialin.net. [87.172.117.215]) by mx.google.com with ESMTPS id a2sm16378160eeo.1.2013.01.20.01.24.51 (version=SSLv3 cipher=RC4-SHA bits=128/128); Sun, 20 Jan 2013 01:24:52 -0800 (PST) Date: Sun, 20 Jan 2013 10:24:49 +0100 From: Torsten Kaiser To: Dave Chinner , xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: [PATCH]xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() Message-ID: <20130120102449.397b3f8b@googlemail.com> X-ASG-Orig-Subj: [PATCH]xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.12; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f54.google.com[74.125.83.54] X-Barracuda-Start-Time: 1358673894 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.2.120376 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 From: Torsten Kaiser Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed xfs_flushinval_pages() and changed its callers to use filemap_write_and_wait() and truncate_pagecache_range() directly. But in xfs_swap_extents() this change accidental switched the argument for 'tip' to 'ip'. This patch switches it back to 'tip' Signed-off-by: Torsten Kaiser --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -246,10 +246,10 @@ xfs_swap_extents( goto out_unlock; } - error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); + error = -filemap_write_and_wait(VFS_I(tip)->i_mapping); if (error) goto out_unlock; - truncate_pagecache_range(VFS_I(ip), 0, -1); + truncate_pagecache_range(VFS_I(tip), 0, -1); /* Verify O_DIRECT for ftmp */ if (VN_CACHED(VFS_I(tip)) != 0) { From stan@hardwarefreak.com Sun Jan 20 03:33:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 712467F37 for ; Sun, 20 Jan 2013 03:33:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58E6C8F8033 for ; Sun, 20 Jan 2013 01:33:16 -0800 (PST) X-ASG-Debug-ID: 1358674395-04cb6c391411680001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id wBo5RHZ2LrBFM4e3 for ; Sun, 20 Jan 2013 01:33:15 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 270C66C0AD; Sun, 20 Jan 2013 03:33:15 -0600 (CST) Message-ID: <50FBB9D4.9060109@hardwarefreak.com> Date: Sun, 20 Jan 2013 03:33:08 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: Linda Walsh , xfs-oss Subject: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> <20130120004638.GZ2498@dastard> X-ASG-Orig-Subj: Re: in 3.7 kernel, how does 1GB page tables for kernel pagetables affect XFS? In-Reply-To: <20130120004638.GZ2498@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1358674395 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 On 1/19/2013 6:46 PM, Dave Chinner wrote: > On Sat, Jan 19, 2013 at 03:55:17PM -0800, Linda Walsh wrote: >> All that talk about RAIDs recently, got me depressed a bit >> when I realize that while I can get fast speeds, type speeds in seeking >> around are about 1/10-1/20th the speed...sigh. >> >> Might that indicate that I should go with smaller RAIDS with more >> spindles? I.e. instead of 3 groups of RAID5 striped as 0, go for 4-5 groups >> of RAID5 striped as a 0? Just aligning the darn things nearly takes a rocket >> scientist! But then start talking about multiple spindles and optimizing >> IOP's...ARG!...;-) (If it wasn't challenging, I'd find it boring...)... > > Somebody on the list might be able to help you with this - I don't > have the time right now as I'm deep in metadata CRC changes... I have time Dave. Hay Linda, if you're to re-architect your storage, the first thing I'd do is ditch that RAID50 setup. RAID50 exists strictly to reduce some of the penalties of RAID5. But then you find new downsides specific to RAID50, including the alignment issues you mentioned. Briefly describe your workload(s), the total capacity you have now, and (truly) need now and project to need 3 years from now. Provide the model# of your current LSI RAID HBA if you intend to keep/redeploy it, and the make/model# of the server and/or external JBOD chassis if present, and your current drives. I'll then provide a recommendation(s) of better potential solutions that may/not require additional hardware. If it is needed, I'll recommend vendor specific hardware if you like that will plug into your existing gear, or I can provide information on new dissimilar brand storage gear. And of course I'll provide necessary Linux and XFS configuration information optimized to the workload and hardware. I'm not trying to consult here, just providing information/recommendations. In general, yes, more spindles will always be faster if utilized properly. But depending on your workload(s) you might be able to fix your performance problems by simply moving your current array to non parity RAID10, layered stripe over RAID1 pairs, concat, etc, thus eliminating the RMW penalty entirely. You'll need more drives to maintain the same usable capacity, but as a consequence you wind up with even more spindles, thus more performance. And of course making any such changes will require a dump/restore before/after blowing away the LSI config and creating/initializing the new non parity array. -- Stan From david@fromorbit.com Sun Jan 20 05:55:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 701517F37 for ; Sun, 20 Jan 2013 05:55:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AA96AC002 for ; Sun, 20 Jan 2013 03:55:27 -0800 (PST) X-ASG-Debug-ID: 1358682925-04bdf0231e14040001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2jlPrBDfQE3mKmwD for ; Sun, 20 Jan 2013 03:55:25 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArUeAPzZ+1B5LETJ/2dsb2JhbABEuBuFEgKBCRdzgh4BAQU6HCMQCAMYCSUPBSUDIROIGA27FxWNCTuCf2EDlguJToZ8gwmBVA Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2013 22:25:24 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TwtUg-00071H-S4; Sun, 20 Jan 2013 22:55:22 +1100 Date: Sun, 20 Jan 2013 22:55:22 +1100 From: Dave Chinner To: "Michael L. Semon" Cc: xfs@oss.sgi.com Subject: Re: Is xfs_fsr broken for Linux 3.8-rc? Message-ID: <20130120115522.GC2498@dastard> X-ASG-Orig-Subj: Re: Is xfs_fsr broken for Linux 3.8-rc? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358682925 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.2.120385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Jan 04, 2013 at 01:08:06AM -0500, Michael L. Semon wrote: > Hi! I upgraded the Linux kernel, glibc (to 2.17), and xfsprogs (to > 3.1.9) on three 32-bit x86 PCs. Only one of them was upgraded to > Linux 3.8-rc2, and I get xfs_fsr output like this, regardless of which > XFS filesystem on which xfs_fsr is used: > > XFS_IOC_SWAPEXT failed: ino=1048813: Invalid argument > > On this particular XFS filesystem (/var), xfs_repair made no > difference, so I went through the whole > xfsdump/umount/zero/mkfs.xfs/mount/xfsrestore cycle for the /var > partition. I got the lone fragmented file after a reboot. > > Upgrading yet again to the git version of xfsprogs did not change things. > > If you can reproduce this problem, could you tell me by which kernel > or xfsprogs version this will be fixed? Really, a fix isn't really > needed, merely an assurance that XFS will still be production-ready > when kernel 3.8 has its main release. Hi michael, Can you check that this patch fixes your problem? http://oss.sgi.com/pipermail/xfs/2013-January/023636.html Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Sun Jan 20 14:14:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 4358A7F37 for ; Sun, 20 Jan 2013 14:14:37 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0CE658F8033; Sun, 20 Jan 2013 12:14:33 -0800 (PST) Message-ID: <50FC502B.9000908@sgi.com> Date: Sun, 20 Jan 2013 14:14:35 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <50EEC68F.6070309@oracle.com> <50FAEF3F.7090607@sgi.com> <20130119230943.GW2498@dastard> In-Reply-To: <20130119230943.GW2498@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/19/13 17:09, Dave Chinner wrote: > On Sat, Jan 19, 2013 at 01:08:47PM -0600, Mark Tinguely wrote: >> On 01/10/13 07:47, Jeff Liu wrote: >>> Start to make use of the new helper to figure out space log reservations for those >>> transactions which are pre-calculated at mount time in xfs_trans.c. >>> >>> Signed-off-by: Jie Liu >>> --- >>> fs/xfs/xfs_trans.c | 244 ++++++++++++++++++++++++---------------------------- >>> 1 file changed, 113 insertions(+), 131 deletions(-) >>> >> >> Wow! Reading this patch makes me appreciate the work you did here >> and gets my eyes in shape for Dave's UBER user sync patch. >> >> A question for you, or anyone. When these reservations are made, the >> comments talk about specify number of agf/agfl (usually 2 or 3) that >> will be dirty in the command. >> >> There are other comments that seem to imply an agf/agfl is reserved >> for all AGs and then use the multiplier of 4. Is a specific number >> of AGs can be involved in the operation or does it want something >> like sb_agcount? > > Do you mean comments like this about > xfs_calc_itruncate_reservation()? > > * And the bmap_finish transaction can free the blocks and bmap > * blocks: > * the agf for each of the ags: 4 * sector size > * the agfl for each of the ags: 4 * sector size > > This assumes the transaction can free 4 extents before a commit, and > all 4 extents can be in a different AG. > > You'll find all the other cases documented like this indicate how > many extents can be freed or allocated in a single transaction.... > Yes thanks. The 2/3 cases were obvious, but I was wondering how to read this one. --Mark. From noreply@imf.fr Sun Jan 20 15:59:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE,RCVD_ILLEGAL_IP,SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 D94007F3F for ; Sun, 20 Jan 2013 15:59:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A6CFAC003 for ; Sun, 20 Jan 2013 13:59:15 -0800 (PST) X-ASG-Debug-ID: 1358719149-04cb6c3912263b0001-w1Z2WR Received: from co1.local (host56-49-8-185.static.arubacloud.fr [185.8.49.56]) by cuda.sgi.com with ESMTP id B7fXMp4QCvAvjlOo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Jan 2013 13:59:10 -0800 (PST) X-Barracuda-Envelope-From: noreply@imf.fr X-Barracuda-Apparent-Source-IP: 185.8.49.56 X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network Received: from dedi-it-7212.op-net.com (unknown [5.254.141.230]) by co1.local (Postfix) with ESMTPA id 0019A2A06; Sun, 20 Jan 2013 22:57:38 +0100 (CET) Message-ID: <7EEB5DBD40EB49A8928005E067BC9A2E@Z-PC> Reply-To: "IMF" From: "IMF" Subject: =?windows-1251?B?UkU6IEZVTkRTIFJFQ09WRVJZ?= Date: Sun, 20 Jan 2013 22:57:13 +0100 X-ASG-Orig-Subj: =?windows-1251?B?UkU6IEZVTkRTIFJFQ09WRVJZ?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_25D8_01CDF761.7C50F060" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18000 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18000 X-Barracuda-Connect: host56-49-8-185.static.arubacloud.fr[185.8.49.56] X-Barracuda-Start-Time: 1358719150 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: 1.45 X-Barracuda-Spam-Status: No, SCORE=1.45 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE, MISSING_HEADERS, RCVD_ILLEGAL_IP, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_25D8_01CDF761.7C50F060 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable From: Jose Vinal Financial Counsellor and Director Monetary and Capital Markets Department Re: Funds Recovery The International Fund through the help of Interpol recovered your funds = which some criminals diverted. We found out that you have spent so much m= oney trying to get your funds. Right now, the fund is deposited with a vault company in Holland which yo= ur presence is required. The Vault Company in under IMF and the officer i= n charge will assist you. The IMF will not persuade you over your payment, so it=92s left to you to= confirm your arrival in Holland . Seeing is believing. Issues of documen= ts, stop order and these entire crazy schemes that made you spent so much= in the hands of criminals are over. Jose Vinal Financial Counsellor and Director Monetary and Capital Markets Department Email:jose.vinal@aim.com IMF ------=_NextPart_000_25D8_01CDF761.7C50F060 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    From: Jose VinalFinancial=20 Counsellor and Director
    Monetary and Capital Markets=20 Department


    Re: Funds Recovery

    The Internationa= l Fund=20 through the help of Interpol recovered your funds which some criminals di= verted.=20 We found out that you have spent so much money trying to get your=20 funds.

    Right now, the fund is deposited with a vault company in Ho= lland=20 which your presence is required. The Vault Company in under IMF and the o= fficer=20 in charge will assist you.

    The IMF will not persuade you over your= =20 payment, so it=92s left to you to confirm your arrival in Holland . Seein= g is=20 believing. Issues of documents, stop order and these entire crazy schemes= that=20 made you spent so much in the hands of criminals are over.

    Jose Vinal
    Financial Counsellor and Director
    Monetary and Capital Markets=20 Department
    Email:jose.vinal@aim.com
    = IMF
     
    3D""=20
    ------=_NextPart_000_25D8_01CDF761.7C50F060-- From xfs@tlinx.org Sun Jan 20 21:19:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6ACAB7F3F for ; Sun, 20 Jan 2013 21:19:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 593688F8033 for ; Sun, 20 Jan 2013 19:19:27 -0800 (PST) X-ASG-Debug-ID: 1358738365-04cbb00c642c640001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id MYAHqH4fF3hS7Gdk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Jan 2013 19:19:25 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0L3JK82004897; Sun, 20 Jan 2013 19:19:22 -0800 Message-ID: <50FCB3B8.5000404@tlinx.org> Date: Sun, 20 Jan 2013 19:19:20 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: stan@hardwarefreak.com CC: xfs-oss Subject: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> <20130120004638.GZ2498@dastard> <50FBB9D4.9060109@hardwarefreak.com> X-ASG-Orig-Subj: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... In-Reply-To: <50FBB9D4.9060109@hardwarefreak.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358738365 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.2.120446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Stan Hoeppner wrote: > On 1/19/2013 6:46 PM, Dave Chinner wrote: >> On Sat, Jan 19, 2013 at 03:55:17PM -0800, Linda Walsh wrote: > >>> All that talk about RAIDs recently, got me depressed a bit >>> when I realize that while I can get fast speeds, type speeds in seeking >>> around are about 1/10-1/20th the speed...sigh. >>> >>> Might that indicate that I should go with smaller RAIDS with more >>> spindles? I.e. instead of 3 groups of RAID5 striped as 0, go for 4-5 groups >>> of RAID5 striped as a 0? Just aligning the darn things nearly takes a rocket >>> scientist! But then start talking about multiple spindles and optimizing >>> IOP's...ARG!...;-) (If it wasn't challenging, I'd find it boring...)... >> Somebody on the list might be able to help you with this - I don't >> have the time right now as I'm deep in metadata CRC changes... > > I have time Dave. Hay Linda, if you're to re-architect your storage, > the first thing I'd do is ditch that RAID50 setup. RAID50 exists > strictly to reduce some of the penalties of RAID5. But then you find > new downsides specific to RAID50, including the alignment issues you > mentioned. ---- Well, like I said, I don't have a pressing need, since it works fairly well for most of my activities. But it's hard to characterize my workload as I do development and experimenting. My most recent failure (well not entirely), that I wouldn't say is 'closed', was trying to up the BW between my workstation and my server. I generally run my server as a 'backend' file store for my workstation, though I do linux devel, I work & play through a Win7 workstation. It provides content for my living room 'TV'[sic] as well as music. Those are relatively low drain. I take breaks throughout the day from doing software work/programming to watching a video or playing the occasional game. If I do any one thing for too long, I'm liable to worsen back and RSI problems. I ran a diff between my primary media disk and a primary duplicate of it that I use as a backup. I'd just finished synchronizing them with rsync, then decided to use my media library (~6.5T) as a test bed for my 'dedup' program I'm working on. (I screwed myself once before when I thought it was working but it wasn't and I didn't catch it immediately - which is why I used it as a test bed after doing a full sync of it, and then ran a diff -r on the two disks. Fortunately, even though the 'dedup'r prog found and linked about 140 files on the Media disk, they were all correct. The diff ran in about 5 hours, or averaged around 400+MB/s, likely limited by the Media disk as it's a simple 5-disk/4-spindle RAID 5. I have 4 separate RAIDs: 1) Boot+OS: RAID5 2-data spindles; short-stroked@50% w/68gB, 15K SAS.. Hitachi -- just noticed today, they aren't exactly matched. 2 are MUA3073RC, 1 is MBA3073RC. Odd. This array is optimized more for faster seeking (the 50% usage limited to the outside tracks) than linear speed -- I may migrate those to SSD's at some point. 2) Downloaded+online media+SW. RAID5: 4-data spindles using 2tB(1.819TB) Hitachi Ultrastar 7.2K SATA's (note, the disks in #3 & #4 are the same type). 3) Main data+devel disk: RAID50 12-data spindles in 3 groups of 4. NOTE: I tried and benched RAID60 but wasn't happy with the performance, not to mention the diskspace hit RAID10 would be a bit too decadent for my usage/budget. 4) Backups: RAID6: 6-data spindles. Not the fastest config, but it is not bad for backups. #3 is my play/devel/experimentation RAID, it's divided with LVM. #4 and #2 have an LVM layer as well, but since it's currently a 1:1 mapping, it doesn't come into play much other than eating a few MB and possibly allowing me to more easily reorg them in the future. On #3 currently using 12.31tB in 20 partitions (but only 3 work partitions)... the rest are snapshots (only 1 live snapshot others are copies of diffs for those dates... ). ------------- NOTE: One thing that had me being less happy than usual with the speed -- the internal battery on #3 was going through reconditioning, and that meant the internal cache policy went to WT (write-through) instead of (WB) write-back. I think that's something that was causing me some noticeable slowdown -- just found out about that last night in reviewing the controller log. Note -- I generally Like the RAID50's, they don't "REALLY" have a stripe size of 768k -- that's just optimal speed/write amount before it hits the same disk again. But since it is a RAID50, Any small write only needs to update 1 of the RAID5 groups, so 256k stripe size, which is far more reasonable/normal. Cards, 1 internal: Dell Perc 6/i (serving #1 & #2 above -- all internal) 1 LSI MR9280DE-8e (serving #3+4) 2 Enclosures LSI-DE1600-SAS (12x3.5" ea) > Briefly describe your workload(s), the total capacity you have now, and > (truly) need now and project to need 3 years from now. --- 3 years from now? Ha!. Lets just say that with the dollar dropping as fast as disk prices over the past 4 years has flamboozled any normal planning. I was mostly interested in how increasing number of spindles in a Raid50 would help parallelism. My thoughts on that was that since each member of a RAID0, can be read or written independently of any other member (as there is no parity to check), that IF I wanted to increase parallelism (while hurting maximum throughput AND disk space), I **could** reconfigure to .. well extreme would be 5 groups of 2-data/3disk RAID5's. That would, I think, theoretically (and if the controller is up to it, which I think it is), allow *up_to* 5 separate reads/writes to be served in parallel, vs. now, I think it should be 3. A middling approach is to use an extra disk (total 16 instead of 15) to go with 4 groups of RAID5 @ 3data disks each -- which would give the same space, but consume my spare. Am unclear about what it would do to maximum throughput, but likely it would go down a bit on writes due to write-overhead increasing from 25% to 33%. It was, I thought, a fairly simply question, but I have a history of sometimes thinking things will be easier than they are proportional to how far away (in future or someone else doing it! ;-)) something is... > If it is needed, I'll recommend vendor specific hardware if you like > that will plug into your existing gear, or I can provide information on > new dissimilar brand storage gear. And of course I'll provide necessary > Linux and XFS configuration information optimized to the workload and > hardware. I'm not trying to consult here, just providing > information/recommendations. ---- My **GENERAL** plan if prices had cooperated was to move to 3TB SATA's and **mabye** a 3rd enclosure -- I sorta like the LSI ones.. they seem pretty solid. Have tried a few others and generally found them not as good, but have looked on the economical side since this is for a home office^h^h^h^h^h^hlab^h^h^hplay setup.... > > In general, yes, more spindles will always be faster if utilized > properly. But depending on your workload(s) you might be able to fix > your performance problems by simply moving your current array to non > parity RAID10, layered stripe over RAID1 pairs, concat, etc, thus > eliminating the RMW penalty entirely. ---- Consider this -- my max read and write (both), on my large array is 1GB/s. There's no way I could get that with a RAID10 setup without a much larger number of disks. Though I admit, concurrency would rise... but I generate most of my workload, so usually I don't have too many things going on at the same time... a few maybe... When an xfs_fsr kicks in and starts swallowing disk-cache, *ahem*, and the daily backup kicks in, AND the daily 'rsync' to create a static snapshot... things can slow down a bit.. but rare am I up at those hours... The most intensive is the xfs_fsr, partly due to it swallowing up disk cache (it runs at nice -19 ionice -c3, and I can still feel it!)... I might play more with putting it in it's own blkio cgroup. and just limiting the overall disk transactions...(not to mention fixing that disk-buffer usage issue)... > You'll need more drives to maintain the same usable capacity, --- (oh, a minor detail! ;^))... ;-) Don't spend much time on this.. (well if you read it, that might be too much already! ;-))... As I said it's not THAT important...and was mostly about the effect of groups in a RAID50 relating to performance tradeoffs. Thanks for any insights...(I'm always open to learning how wrong I am! ;-))... From wamegopr@box607.bluehost.com Mon Jan 21 02:14:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF, SUBJECT_NEEDS_ENCODING,SUBJ_ILLEGAL_CHARS 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 7777A7F3F for ; Mon, 21 Jan 2013 02:14:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54E15304051 for ; Mon, 21 Jan 2013 00:14:14 -0800 (PST) X-ASG-Debug-ID: 1358756047-04cb6c39153a450001-NocioJ Received: from oproxy5-pub.bluehost.com (oproxy5-pub.bluehost.com [67.222.38.55]) by cuda.sgi.com with SMTP id 6aYpCzfKbh47C8eD for ; Mon, 21 Jan 2013 00:14:08 -0800 (PST) X-Barracuda-Envelope-From: wamegopr@box607.bluehost.com X-Barracuda-Apparent-Source-IP: 67.222.38.55 Received: (qmail 3994 invoked by uid 0); 21 Jan 2013 08:14:07 -0000 Received: from unknown (HELO box607.bluehost.com) (70.40.220.107) by cpoproxy2.bluehost.com with SMTP; 21 Jan 2013 08:14:07 -0000 Received: from localhost ([127.0.0.1]:45439 helo=box607.bluehost.com) by box607.bluehost.com with esmtp (Exim 4.80) (envelope-from ) id 1TxCW7-0008NL-C9 for xfs@oss.sgi.com; Mon, 21 Jan 2013 01:14:07 -0700 Date: Mon, 21 Jan 2013 01:14:07 -0700 To: xfs@oss.sgi.com Subject: اخبار العهد X-PHP-Script: www.wamegopresbyterian.org/ for 69.89.31.74 X-ASG-Orig-Subj: اخبار العهد From: upvc Reply-To: upvc@al-badawi.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="d46447257c700df2df0a53c434d31894" X-Identified-User: {:box607.bluehost.com:wamegopr:box607.bluehost.com} {sentby:program running on server} X-Barracuda-Connect: oproxy5-pub.bluehost.com[67.222.38.55] X-Barracuda-Start-Time: 1358756047 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: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID, MPART_ALT_DIFF, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING Message-Id: <20130121081414.6CC1D1296118@cuda.sgi.com> --d46447257c700df2df0a53c434d31894 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit --d46447257c700df2df0a53c434d31894 Content-type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit . --d46447257c700df2df0a53c434d31894-- From soporte@prodigy.net.mx Mon Jan 21 04:58:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=TVD_SPACE_RATIO 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 A290D7F3F for ; Mon, 21 Jan 2013 04:58:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F946304043 for ; Mon, 21 Jan 2013 02:58:35 -0800 (PST) X-ASG-Debug-ID: 1358765913-04bdf0231e3ffc0001-NocioJ Received: from nlpiport12.prodigy.net.mx (nlpiport12.prodigy.net.mx [148.235.52.62]) by cuda.sgi.com with ESMTP id JoadOe7XY2C04ctx for ; Mon, 21 Jan 2013 02:58:33 -0800 (PST) X-Barracuda-Envelope-From: soporte@prodigy.net.mx X-Barracuda-Apparent-Source-IP: 148.235.52.62 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgUTAEAc/VCU6zRy/2dsb2JhbABEg0iCfaU9AZEmAQIBAQF9F28Egj4KMzggAiYCOz+IEZshjlWRIoEjjB8tIYIWMmEDiGGFNpMvhQ+DFA X-IronPort-AV: E=Sophos;i="4.84,505,1355119200"; d="scan'208";a="59587072" Received: from du-148-235-52-114.prodigy.net.mx (HELO prodigy.net.mx) ([148.235.52.114]) by nlpiport12.prodigy.net.mx with ESMTP; 21 Jan 2013 04:58:32 -0600 Date: Mon, 21 Jan 2013 04:58:33 -0600 Message-Id: Subject: Actividad Fraudulenta. MIME-Version: 1.0 X-ASG-Orig-Subj: Actividad Fraudulenta. X-Sensitivity: 3 X-Priority: 1 (Highest) Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable From: "Hotmail" To: xfs@oss.sgi.com X-XaM3-API-Version: V3(R1) X-SenderIP: 76.73.76.58 X-Barracuda-Connect: nlpiport12.prodigy.net.mx[148.235.52.62] X-Barracuda-Start-Time: 1358765913 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.2.120475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Re-activar cuenta=0Ahttp://www.koobana.com/secure From dave@fromorbit.com Mon Jan 21 06:54:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 588567F3F for ; Mon, 21 Jan 2013 06:54:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C79B8F8033 for ; Mon, 21 Jan 2013 04:54:05 -0800 (PST) X-ASG-Debug-ID: 1358772840-04bdf0231b436c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PwmFjR09qLLVDOjC for ; Mon, 21 Jan 2013 04:54:01 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EABs6/VB5LETJ/2dsb2JhbABEvisXc4IeAQEFJy8zCBgxOQMbGYgYuySOEE2CXAOfWYZ8gmgh Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:24:00 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxGsw-0001Fn-6z for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxGsw-0005aY-0a for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Date: Mon, 21 Jan 2013 23:53:52 +1100 X-ASG-Orig-Subj: [PATCH 1/4] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Message-Id: <1358772835-21436-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358772835-21436-1-git-send-email-david@fromorbit.com> References: <1358772835-21436-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358772841 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.2.120483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When _xfs_buf_find is passed an out of range address, it will fail to find a relevant struct xfs_perag and oops with a null dereference. This can happen when trying to walk a filesystem with a metadata inode that has a partially corrupted extent map (i.e. the block number returned is corrupt, but is otherwise intact) and we try to read from the corrupted block address. In this case, just fail the lookup. If it is readahead being issued, it will simply not be done, but if it is real read that fails we will get an error being reported. Ideally this case should result in an EFSCORRUPTED error being reported, but we cannot return an error through xfs_buf_read() or xfs_buf_get() so this lookup failure may result in ENOMEM or EIO errors being reported instead. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 56d1614..689d726 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -487,6 +487,7 @@ _xfs_buf_find( struct rb_node *parent; xfs_buf_t *bp; xfs_daddr_t blkno = map[0].bm_bn; + xfs_daddr_t eofs; int numblks = 0; int i; @@ -498,6 +499,23 @@ _xfs_buf_find( ASSERT(!(numbytes < (1 << btp->bt_sshift))); ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); + /* + * Corrupted block numbers can get through to here, unfortunately, so we + * have to check that the buffer falls within the filesystem bounds. + */ + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); + if (blkno >= eofs) { + /* + * XXX (dgc): we should really be returning EFSCORRUPTED here, + * but none of the higher level infrastructure supports + * returning a specific error on buffer lookup failures. + */ + xfs_alert(btp->bt_mount, + "%s: Block out of range: block 0x%llx, EOFS 0x%llx ", + __func__, blkno, eofs); + return NULL; + } + /* get tree root */ pag = xfs_perag_get(btp->bt_mount, xfs_daddr_to_agno(btp->bt_mount, blkno)); -- 1.7.10 From dave@fromorbit.com Mon Jan 21 06:54:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 93C417F3F for ; Mon, 21 Jan 2013 06:54:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 409BBAC006 for ; Mon, 21 Jan 2013 04:54:07 -0800 (PST) X-ASG-Debug-ID: 1358772840-04bdf0231b436c0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Gvi4DwaUiD9e0M4n for ; Mon, 21 Jan 2013 04:54:05 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EABs6/VB5LETJ/2dsb2JhbABEvisXc4IeAQEFJy8zCBgxOQMbGYgYuySNDIFRglwDplWCaCGBUw Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:24:00 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxGsw-0001Fo-6z for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxGsw-0005ac-2N for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files Date: Mon, 21 Jan 2013 23:53:53 +1100 X-ASG-Orig-Subj: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files Message-Id: <1358772835-21436-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358772835-21436-1-git-send-email-david@fromorbit.com> References: <1358772835-21436-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358772845 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.2.120483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This is an RFC that follow sup from a conversion Eric and I had on IRC. The idea is to prevent EOF speculative preallocation from triggering larger allocations on IO patterns of truncate--to-zero-seek-write-seek-write-.... which results in non-sparse files for large files. This, unfortunately, is the way cp behaves when copying sparse files, and it results in sub-optimal destination file layouts. What this code does is that it looks at the current extent over the new EOF location, and if it is a hole it turns off preallocation altogether. To avoid the next write from doing a large prealloc, it takes the size of subsequent preallocations from the current size of the existing EOF extent. IOWs, if you leave a hole in the file, it resets preallocation behaviour to the same as if it was a zero size file. I haven't fully tested this, so I'm not sure if it works exactly like I think it should, but I wanted to get this out there to get more eyes on it... Example new behaviour: $ xfs_io -f -c "pwrite 0 31m" \ -c "pwrite 33m 1m" \ -c "pwrite 128m 1m" \ -c "fiemap -v" /mnt/scratch/blah wrote 32505856/32505856 bytes at offset 0 31 MiB, 7936 ops; 0.0000 sec (1.608 GiB/sec and 421432.7439 ops/sec) wrote 1048576/1048576 bytes at offset 34603008 1 MiB, 256 ops; 0.0000 sec (1.462 GiB/sec and 383233.5329 ops/sec) wrote 1048576/1048576 bytes at offset 134217728 1 MiB, 256 ops; 0.0000 sec (1.719 GiB/sec and 450704.2254 ops/sec) /mnt/scratch/blah: EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS 0: [0..65535]: 96..65631 65536 0x0 1: [65536..67583]: hole 2048 2: [67584..69631]: 67680..69727 2048 0x0 3: [69632..262143]: hole 192512 4: [262144..264191]: 262240..264287 2048 0x1 Signed-off-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 65 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index add06b4..3587772 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -311,6 +311,53 @@ xfs_iomap_eof_want_preallocate( } /* + * Determine the initial size of the preallocation. It will be bound by the + * current file size, but when we are extending sparse files the current file + * size is not a good metric to use. Hence we need to look up the extent that + * ends at the current EOF and use the result to determine the preallocation + * size. + * + * If the extent is a hole, then preallocation is essentially disabled. + * Otherwise we take the size of the data extent as the basis for the + * preallocation size. If the size of the extent is greater than half the + * maximum extent length, then use the file size as the basis. This ensures that + * for large files the preallocation size always extends to MAXEXTLEN rather + * than falling short due to things like stripe unit/width alignment of real + * extents. + */ +STATIC int +xfs_iomap_eof_prealloc_initial_size( + struct xfs_mount *mp, + struct xfs_inode *ip, + xfs_bmbt_irec_t *imap, + int nimaps) +{ + xfs_fileoff_t start_fsb; + xfs_fsblock_t firstblock; + int imaps = 1; + int error; + + ASSERT(nimaps >= imaps); + + /* if we are using a specific prealloc size, return now */ + if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) + return 0; + + start_fsb = XFS_B_TO_FSBT(mp, XFS_ISIZE(ip)); + error = xfs_bmapi_read(ip, start_fsb, 1, imap, &imaps, + XFS_BMAPI_ENTIRE); + if (error) + return 0; + + ASSERT(imaps == 1); + if (imap[0].br_startblock == HOLESTARTBLOCK) + return 0; + if (imap[0].br_blockcount <= (MAXEXTLEN >> 1)) + return imap[0].br_blockcount; + return XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); +} + +/* * If we don't have a user specified preallocation size, dynamically increase * the preallocation size as the size of the file grows. Cap the maximum size * at a single extent or less if the filesystem is near full. The closer the @@ -319,20 +366,17 @@ xfs_iomap_eof_want_preallocate( STATIC xfs_fsblock_t xfs_iomap_prealloc_size( struct xfs_mount *mp, - struct xfs_inode *ip) + struct xfs_inode *ip, + xfs_bmbt_irec_t *imap, + int nimaps) { xfs_fsblock_t alloc_blocks = 0; - if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { + alloc_blocks = xfs_iomap_eof_prealloc_initial_size(mp, ip, imap, nimaps); + if (alloc_blocks > 0) { int shift = 0; int64_t freesp; - /* - * rounddown_pow_of_two() returns an undefined result - * if we pass in alloc_blocks = 0. Hence the "+ 1" to - * ensure we always pass in a non-zero value. - */ - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, rounddown_pow_of_two(alloc_blocks)); @@ -398,7 +442,10 @@ xfs_iomap_write_delay( retry: if (prealloc) { - xfs_fsblock_t alloc_blocks = xfs_iomap_prealloc_size(mp, ip); + xfs_fsblock_t alloc_blocks; + + alloc_blocks = xfs_iomap_prealloc_size(mp, ip, imap, + XFS_WRITE_IMAPS); aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); ioalign = XFS_B_TO_FSBT(mp, aligned_offset); -- 1.7.10 From dave@fromorbit.com Mon Jan 21 06:54:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 647F07F51 for ; Mon, 21 Jan 2013 06:54:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 296058F8033 for ; Mon, 21 Jan 2013 04:54:10 -0800 (PST) X-ASG-Debug-ID: 1358772840-04bdf0231b436c0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id LsPK0uY6dhGN3YJe for ; Mon, 21 Jan 2013 04:54:08 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAFABs6/VB5LETJ/2dsb2JhbABEjmyvPxdzghphO4ECA4V9B4IrHZsioAKNEX9NglwDplWCaCGBWw Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:24:08 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxGt6-0001Fm-40 for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:54:08 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxGsv-0005aV-Vd for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfs: miscellaneous kernel patches Date: Mon, 21 Jan 2013 23:53:51 +1100 X-ASG-Orig-Subj: [PATCH 0/4] xfs: miscellaneous kernel patches Message-Id: <1358772835-21436-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358772846 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.2.120483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- These are the current fixes I have sitting in front of my CRC patchset. The 3 non-RFC patches are probably candidates from 3.8-rc4 as they are fixes for bugs that have been reported to me either on the list, via IRC or private mail... Cheers, Dave. From dave@fromorbit.com Mon Jan 21 06:54:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D63177F55 for ; Mon, 21 Jan 2013 06:54:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A92BF304048 for ; Mon, 21 Jan 2013 04:54:11 -0800 (PST) X-ASG-Debug-ID: 1358772840-04bdf0231b436c0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id TEhKuUWMWrbtyDiH for ; Mon, 21 Jan 2013 04:54:09 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EABs6/VB5LETJ/2dsb2JhbABEvisXc4IeAQEFJy8zCBgxOQMbGYgYuySOXYJcA6ZVgmgh Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:24:09 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxGt6-0001Fq-95 for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:54:08 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxGsw-0005am-4P for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: fix shutdown hang on invalid inode during create Date: Mon, 21 Jan 2013 23:53:55 +1100 X-ASG-Orig-Subj: [PATCH 4/4] xfs: fix shutdown hang on invalid inode during create Message-Id: <1358772835-21436-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358772835-21436-1-git-send-email-david@fromorbit.com> References: <1358772835-21436-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358772849 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.2.120483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When the new inode verify in xfs_iread() fails, the create transaction is aborted and a shutdown occurs. The subsequent unmount then hangs in xfs_wait_buftarg() on a buffer that has an elevated hold count. Debug showed that it was an AGI buffer getting stuck: [ 22.576147] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 22.976213] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.376206] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.776325] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck The trace of this buffer leading up to the shutdown (trimmed for brevity) looks like: xfs_buf_init: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 1 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 1 caller xfs_trans_read_buf_map xfs_buf_iorequest: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_iorequest xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_iorequest xfs_buf_iowait: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_ioerror: bno 0x2 len 0x200 hold 1 caller xfs_buf_bio_end_io xfs_buf_iodone: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_ioend xfs_buf_iowait_done: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_trans_brelse: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_buf_item_relse: bno 0x2 nblks 0x1 hold 2 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_relse xfs_buf_unlock: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_trylock: bno 0x2 nblks 0x1 hold 2 caller _xfs_buf_find xfs_buf_find: bno 0x2 len 0x200 hold 2 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 2 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 2 caller xfs_trans_read_buf_map xfs_buf_hold: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_trans_log_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_buf_item_unlock: bno 0x2 len 0x200 hold 3 flags DIRTY liflags ABORTED xfs_buf_unlock: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock xfs_buf_rele: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock And that is the AGI buffer from cold cache read into memory to transaction abort. You can see at transaction abort the bli is dirty and only has a single reference. The item is not pinned, and it's not in the AIL. Hence the only reference to it is this transaction. The problem is that the xfs_buf_item_unlock() call is dropping the last reference to the xfs_buf_log_item attached to the buffer (which holds a reference to the buffer), but it is not freeing the xfs_buf_log_item. Hence nothing will ever release the buffer, and the unmount hangs waiting for this reference to go away. The fix is simple - xfs_buf_item_unlock needs to detect the last reference going away in this case and free the xfs_buf_log_item to release the reference it holds on the buffer. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 2 ++ fs/xfs/xfs_buf_item.c | 12 ++++++++++-- fs/xfs/xfs_trace.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 689d726..fbbb9eb 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1505,6 +1505,8 @@ restart: while (!list_empty(&btp->bt_lru)) { bp = list_first_entry(&btp->bt_lru, struct xfs_buf, b_lru); if (atomic_read(&bp->b_hold) > 1) { + trace_xfs_buf_wait_buftarg(bp, _RET_IP_); + list_move_tail(&bp->b_lru, &btp->bt_lru); spin_unlock(&btp->bt_lru_lock); delay(100); goto restart; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 63c86c4..9c4c050 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -548,7 +548,10 @@ xfs_buf_item_unlock( /* * If the buf item isn't tracking any data, free it, otherwise drop the - * reference we hold to it. + * reference we hold to it. If we are aborting the transaction, this may + * be the only reference to the buf item, so we free it anyway + * regardless of whether it is dirty or not. A dirty abort implies a + * shutdown, anyway. */ clean = 1; for (i = 0; i < bip->bli_format_count; i++) { @@ -560,7 +563,12 @@ xfs_buf_item_unlock( } if (clean) xfs_buf_item_relse(bp); - else + else if (aborted) { + if (atomic_dec_and_test(&bip->bli_refcount)) { + ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); + xfs_buf_item_relse(bp); + } + } else atomic_dec(&bip->bli_refcount); if (!hold) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 2e137d4..16a8129 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -341,6 +341,7 @@ DEFINE_BUF_EVENT(xfs_buf_item_relse); DEFINE_BUF_EVENT(xfs_buf_item_iodone); DEFINE_BUF_EVENT(xfs_buf_item_iodone_async); DEFINE_BUF_EVENT(xfs_buf_error_relse); +DEFINE_BUF_EVENT(xfs_buf_wait_buftarg); DEFINE_BUF_EVENT(xfs_trans_read_buf_io); DEFINE_BUF_EVENT(xfs_trans_read_buf_shut); -- 1.7.10 From dave@fromorbit.com Mon Jan 21 06:54:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DAC427F56 for ; Mon, 21 Jan 2013 06:54:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 670F5AC006 for ; Mon, 21 Jan 2013 04:54:11 -0800 (PST) X-ASG-Debug-ID: 1358772849-04cb6c391243690001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tLLhdJxswXxJ51Ft for ; Mon, 21 Jan 2013 04:54:09 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EABs6/VB5LETJ/2dsb2JhbABEvisXc4IeAQEFJy8zCBgxOQMbGYgYuySNDIEETYJcA6ZVgmghgVM Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:24:09 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxGsw-0001Fp-70 for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxGsw-0005ah-3O for xfs@oss.sgi.com; Mon, 21 Jan 2013 23:53:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds Date: Mon, 21 Jan 2013 23:53:54 +1100 X-ASG-Orig-Subj: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds Message-Id: <1358772835-21436-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358772835-21436-1-git-send-email-david@fromorbit.com> References: <1358772835-21436-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358772849 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.2.120483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is a window on small filesytsems where specualtive preallocation can be larger than that ENOSPC throttling thresholds, resulting in specualtive preallocation trying to reserve more space than there is space available. This causes immediate ENOSPC to be triggered, prealloc to be turned off and flushing to occur. One the next write (i.e. next 4k page), we do exactly the same thing, and so effective drive into synchronous 4k writes by triggering ENOSPC flushing on every page while in the window between the prealloc size and the ENOSPC prealloc throttle threshold. Fix this by checking to see if the prealloc size would consume all free space, and throttle it appropriately to avoid premature ENOSPC... Signed-off-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 3587772..de3bad5 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -395,6 +395,15 @@ xfs_iomap_prealloc_size( } if (shift) alloc_blocks >>= shift; + + /* + * If we are still trying to allocate more space than is + * available, squash the prealloc hard. This can happen if we + * have a large file on a small filesystem and the above + * lowspace thresholds are smaller than MAXEXTLEN. + */ + while (alloc_blocks >= freesp) + alloc_blocks >>= 4; } if (alloc_blocks < mp->m_writeio_blocks) -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0E2DE7F3F for ; Mon, 21 Jan 2013 07:26:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C69A4304039 for ; Mon, 21 Jan 2013 05:26:06 -0800 (PST) X-ASG-Debug-ID: 1358774765-04bdf0231d448a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ACm9EVF61z6u1EnY for ; Mon, 21 Jan 2013 05:26:05 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAKBB/VB5LETJ/2dsb2JhbABEvioXc4J7O4ECA4hMmxmRFY5wjRN9gykDplWDCYFTAR4G Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:04 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHNz-0001Km-Pp for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005j8-LE for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/9] xfs: metadata CRCs, kernel, first batch Date: Tue, 22 Jan 2013 00:25:51 +1100 X-ASG-Orig-Subj: [PATCH 0/9] xfs: metadata CRCs, kernel, first batch Message-Id: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774765 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The following patches are the first set of kernel changes for metadata CRC validation. This batch of patches covers inodes, freespace, quota, superblock and symlinks. It does not cover directory or attribute metadata - that will be sent as a separate patch. This series makes is through to 001-092 in xfstests - there is a problem in the dquot verifier that causes log recovery of dquot buffers to follow a NULL pointer. I'm slowly working through these issues one by one, but given that I can run fsstress for extended periods of time and not crash or corrupt a metadata CRC enabled filesystem. Similarly, I've created, walked and removed about 500 million inodes today using fsmark, and that hasn't fallen over, either, so I think the kernel patches are close enough to start having them reviewed. The current overhead of the metadata CRCs under fsmark workloads is around 2.5-3% of the total CPU time. This is in a VM, so hardware acceleration is not available, but the overhead is definitely within the expected bounds at this point in time. The most complex patch is the btree block conversion, simply because it requires converting all the users of the generic btrees at the same time. The changes are relatively straight forward, and you'll see the same pattern throughout the patches: - add the fields to the structure - add the to/from disk translations - add support into the verifiers - add crc calculations to the verifiers - add buffer type support for log recovery The AGFL is a bit special - it's adding a header where there wasn't one before, so there's a bti fo dancing around that conversion in places. The symlink support is a bit different - I moved the symlink code into it's own .c and .h file to make it easy to port to userspace, and added all the new functionality there. It is also adding a header where there wasn't one before. I'll follow this series up with a posting of the userspace code. The userspace code is functional, but is not ready for review. It will allow you to create/test/repair filesystems that you can use with this patch set, but I wouldn't bother looking at the code. It's going to take a fair bit of work to clean up the mess... ObWarning to non-developers: This code eats babies for fun and profit. Unless you are going to be testing, reviewing and reporting problems with the code as part of the development process, do not apply this patch set. Yeah, I know, all the cool kids are doing CRCs these days - it'll be ready to go soon, and then you can get your fix... Cheers, Dave. From dave@fromorbit.com Mon Jan 21 07:26:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A55EE7F4E for ; Mon, 21 Jan 2013 07:26:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77EC98F8037 for ; Mon, 21 Jan 2013 05:26:08 -0800 (PST) X-ASG-Debug-ID: 1358774765-04bdf0231d448a0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZHknhUyQaF59iwJc for ; Mon, 21 Jan 2013 05:26:06 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrC6OcI0ThCYDplWDCYFTAR4G Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:04 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHNz-0001Ku-W3 for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:04 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jY-SC for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfs: add CRC checks for quota blocks Date: Tue, 22 Jan 2013 00:25:57 +1100 X-ASG-Orig-Subj: [PATCH 6/9] xfs: add CRC checks for quota blocks Message-Id: <1358774760-21841-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774766 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Use the reserved space in struct xfs_dqblk to store a UUID and a crc for the quota blocks. [dchinner@redhat.com] Add a LSN field and update for current verifier infrastructure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_dquot.c | 87 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_log_recover.c | 9 +++++ fs/xfs/xfs_qm.c | 4 +++ fs/xfs/xfs_quota.h | 11 +++++- 4 files changed, 98 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 9e1bf52..c83beee 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -36,6 +36,7 @@ #include "xfs_trans_space.h" #include "xfs_trans_priv.h" #include "xfs_qm.h" +#include "xfs_cksum.h" #include "xfs_trace.h" /* @@ -239,6 +240,8 @@ xfs_qm_init_dquot_blk( d->dd_diskdq.d_version = XFS_DQUOT_VERSION; d->dd_diskdq.d_id = cpu_to_be32(curid); d->dd_diskdq.d_flags = type; + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); } xfs_trans_dquot_buf(tp, bp, @@ -248,13 +251,51 @@ xfs_qm_init_dquot_blk( xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1); } -static void +STATIC void +xfs_dquot_buf_calc_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + offsetof(struct xfs_dqblk, dd_crc)); + } +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + offsetof(struct xfs_dqblk, dd_crc))) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + + return true; +} + +STATIC bool xfs_dquot_buf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - struct xfs_disk_dquot *ddq; xfs_dqid_t id = 0; int i; @@ -266,7 +307,8 @@ xfs_dquot_buf_verify( * buffer so corruptions could point to the wrong dquot in this case. */ for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) { - int error; + struct xfs_disk_dquot *ddq; + int error; ddq = &d[i].dd_diskdq; @@ -274,27 +316,37 @@ xfs_dquot_buf_verify( id = be32_to_cpu(ddq->d_id); error = xfs_qm_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, - "xfs_dquot_read_verify"); - if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, d); - xfs_buf_ioerror(bp, EFSCORRUPTED); - break; - } + "xfs_dquot_buf_verify"); + if (error) + return false; } + return true; } static void xfs_dquot_buf_read_verify( struct xfs_buf *bp) { - xfs_dquot_buf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } void xfs_dquot_buf_write_verify( struct xfs_buf *bp) { - xfs_dquot_buf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_dquot_buf_calc_crc(mp, bp); } const struct xfs_buf_ops xfs_dquot_buf_ops = { @@ -1041,6 +1093,17 @@ xfs_qm_dqflush( &dqp->q_logitem.qli_item.li_lsn); /* + * copy the lsn into the on-disk dquot now while we have the in memory + * dquot here. This can't be done later in the write verifier as we + * can't get access to the log item at that point in time. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; + + dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); + } + + /* * Attach an iodone routine so that we can remove this dquot from the * AIL and release the flush lock once the dquot is synced to disk. */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 8df1ff8..5794875 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1975,6 +1975,15 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agi_buf_ops; break; + case XFS_BLF_UDQUOT_BUF: + case XFS_BLF_PDQUOT_BUF: + case XFS_BLF_GDQUOT_BUF: + if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DQUOT_MAGIC)) { + xfs_warn(mp, "Bad DQUOT block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_dquot_buf_ops; + break; default: break; } diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 60eff47..22f10c6 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -897,6 +897,10 @@ xfs_qm_dqiter_bufs( if (error) break; + /* + * XXX(hch): need to figure out if it makes sense to validate + * the CRC here. + */ xfs_qm_reset_dqcounts(mp, bp, firstid, type); xfs_buf_delwri_queue(bp, buffer_list); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index b50ec5b..c61e31c 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -77,7 +77,14 @@ typedef struct xfs_disk_dquot { */ typedef struct xfs_dqblk { xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[32]; /* filling for posterity */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + __be32 dd_crc; /* checksum */ + __be64 dd_lsn; /* last modification in log */ + uuid_t dd_uuid; /* location information */ } xfs_dqblk_t; /* @@ -380,5 +387,7 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); +extern const struct xfs_buf_ops xfs_dquot_buf_ops; + #endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C3E6C7F3F for ; Mon, 21 Jan 2013 07:26:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87B738F8037 for ; Mon, 21 Jan 2013 05:26:10 -0800 (PST) X-ASG-Debug-ID: 1358774765-04bdf0231d448a0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id b489nraBtGh8zFDQ for ; Mon, 21 Jan 2013 05:26:07 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrC6OcI0ThCYDklmTfIMJgVM Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:04 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHO0-0001Kw-2M for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:04 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jj-Uy for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfs: add CRC checks to the superblock Date: Tue, 22 Jan 2013 00:25:59 +1100 X-ASG-Orig-Subj: [PATCH 8/9] xfs: add CRC checks to the superblock Message-Id: <1358774760-21841-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774767 X-Barracuda-URL: http://192.48.157.11: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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With the addition of CRCs, there is such a wide and varied change to the on disk format that it makes sense to bump the superblock version number rather than try to use feature bits for all the new functionality. This commit introduces all the new superblock fields needed for all the new functionality: feature masks similar to ext4, separate project quota inodes, a LSN field for recovery and the CRC field. This commit does not bump the superblock version number, however. That will be done as a separate commit at the end of the series after all the new functionality is present so we switch it all on in one commit. This means that we can slowly introduce the changes without them being active and hence maintain bisectability of the tree. This patch is based on a patch originally written by myself back from SGI days, which was subsequently modified by Christoph Hellwig. There is relatively little of that patch remaining, but the history of the patch still should be acknowledged here. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_log_recover.c | 7 ++++ fs/xfs/xfs_mount.c | 97 ++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_sb.h | 100 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 163 insertions(+), 46 deletions(-) diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index abae8c8..d1eeeab 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -49,6 +49,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) +#define XFS_BLF_SB_BUF (1<<10) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -58,7 +59,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF) + XFS_BLF_DINO_BUF | \ + XFS_BLF_SB_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0d786c9..a13a47a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1999,6 +1999,13 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_inode_buf_ops; break; + case XFS_BLF_SB_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SB_MAGIC)) { + xfs_warn(mp, "Bad SB block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_sb_buf_ops; + break; default: break; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 7d6df7c..2130210 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -43,6 +43,8 @@ #include "xfs_utils.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" #ifdef HAVE_PERCPU_SB @@ -109,6 +111,12 @@ static const struct { { offsetof(xfs_sb_t, sb_logsunit), 0 }, { offsetof(xfs_sb_t, sb_features2), 0 }, { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } }; @@ -557,6 +565,12 @@ xfs_sb_from_disk( to->sb_logsunit = be32_to_cpu(from->sb_logsunit); to->sb_features2 = be32_to_cpu(from->sb_features2); to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); + to->sb_features_compat = be32_to_cpu(from->sb_features_compat); + to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); + to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); + to->sb_crc = be32_to_cpu(from->sb_crc); + to->sb_pquotino = be64_to_cpu(from->sb_pquotino); + to->sb_lsn = be64_to_cpu(from->sb_lsn); } /* @@ -612,13 +626,12 @@ xfs_sb_to_disk( } } -static void +static int xfs_sb_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_sb sb; - int error; xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -626,16 +639,46 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error = xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); - if (error) - xfs_buf_ioerror(bp, error); + return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); } +/* + * If the superblock has the CRC feature bit set or the CRC field is non-null, + * check that the CRC is valid. We check the CRC field is non-null because a + * single bit error could clear the feature bit and unused parts of the + * superblock are supposed to be zero. Hence a non-null crc field indicates that + * we've potentially lost a feature bit and we should check it anyway. + */ static void xfs_sb_read_verify( struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); + int error; + + /* + * open code the version check to avoid needing to convert the entire + * superblock from disk order just to check the version number + */ + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) && + (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) == + XFS_SB_VERSION_5) || + dsb->sb_crc != 0)) { + + if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + offsetof(struct xfs_sb, sb_crc))) { + error = EFSCORRUPTED; + goto out_error; + } + } + error = xfs_sb_verify(bp); + +out_error: + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + } } /* @@ -648,11 +691,10 @@ static void xfs_sb_quiet_read_verify( struct xfs_buf *bp) { - struct xfs_sb sb; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - if (sb.sb_magicnum == XFS_SB_MAGIC) { + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { /* XFS filesystem, verify noisily! */ xfs_sb_read_verify(bp); return; @@ -663,9 +705,27 @@ xfs_sb_quiet_read_verify( static void xfs_sb_write_verify( - struct xfs_buf *bp) + struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + int error; + + error = xfs_sb_verify(bp); + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_sb, sb_crc)); } const struct xfs_buf_ops xfs_sb_buf_ops = { @@ -687,7 +747,8 @@ int xfs_readsb(xfs_mount_t *mp, int flags) { unsigned int sector_size; - xfs_buf_t *bp; + struct xfs_buf *bp; + struct xfs_sb *sbp = &mp->m_sb; int error; int loud = !(flags & XFS_MFSI_QUIET); @@ -726,10 +787,10 @@ reread: /* * We must be able to do sector-sized and sector-aligned IO. */ - if (sector_size > mp->m_sb.sb_sectsize) { + if (sector_size > sbp->sb_sectsize) { if (loud) xfs_warn(mp, "device supports %u byte sectors (not %u)", - sector_size, mp->m_sb.sb_sectsize); + sector_size, sbp->sb_sectsize); error = ENOSYS; goto release_buf; } @@ -738,15 +799,18 @@ reread: * If device sector size is smaller than the superblock size, * re-read the superblock so the buffer is correctly sized. */ - if (sector_size < mp->m_sb.sb_sectsize) { + if (sector_size < sbp->sb_sectsize) { xfs_buf_relse(bp); - sector_size = mp->m_sb.sb_sectsize; + sector_size = sbp->sb_sectsize; goto reread; } /* Initialize per-cpu counters */ xfs_icsb_reinit_counters(mp); + /* no need to be quiet anymore, so reset the buf ops */ + bp->b_ops = &xfs_sb_buf_ops; + mp->m_sb_bp = bp; xfs_buf_unlock(bp); return 0; @@ -1633,6 +1697,7 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) ASSERT((1LL << f) & XFS_SB_MOD_BITS); first = xfs_sb_info[f].offset; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_SB_BUF); xfs_trans_log_buf(tp, bp, first, last); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index bab8314..3a3f850 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -385,6 +385,7 @@ extern void xfs_set_low_space_thresholds(struct xfs_mount *); #endif /* __KERNEL__ */ +extern void xfs_sb_calc_crc(struct xfs_buf *); extern void xfs_mod_sb(struct xfs_trans *, __int64_t); extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, xfs_agnumber_t *); diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index a05b451..457fefa 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -32,6 +32,7 @@ struct xfs_mount; #define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ #define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ #define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 #define XFS_SB_VERSION_SASHFBITS 0xf000 @@ -161,6 +162,18 @@ typedef struct xfs_sb { */ __uint32_t sb_bad_features2; + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + + __uint32_t sb_crc; /* superblock crc */ + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + /* must be padded to 64 bit alignment */ } xfs_sb_t; @@ -229,7 +242,19 @@ typedef struct xfs_dsb { * for features2 bits. Easiest just to mark it bad and not use * it for anything else. */ - __be32 sb_bad_features2; + __be32 sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __be32 sb_features_compat; + __be32 sb_features_ro_compat; + __be32 sb_features_incompat; + + __le32 sb_crc; /* superblock crc */ + + __be64 sb_pquotino; /* project quota inode */ + __be64 sb_lsn; /* last write sequence */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -250,7 +275,9 @@ typedef enum { XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; @@ -276,6 +303,11 @@ typedef enum { #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) +#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) +#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_CRC XFS_SB_MVAL(CRC) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) #define XFS_SB_MOD_BITS \ @@ -283,7 +315,8 @@ typedef enum { XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2) + XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) /* @@ -325,6 +358,8 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) return 1; } + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return 1; return 0; } @@ -365,7 +400,7 @@ static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_2 || sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } @@ -373,7 +408,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { if (sbp->sb_versionnum == XFS_SB_VERSION_1) sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; else sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; @@ -382,7 +417,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } @@ -396,13 +431,13 @@ static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; else sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | @@ -411,13 +446,14 @@ static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } @@ -429,38 +465,42 @@ static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); } /* @@ -475,14 +515,16 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) @@ -500,14 +542,14 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } /* -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C5E337F4F for ; Mon, 21 Jan 2013 07:26:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46D82AC006 for ; Mon, 21 Jan 2013 05:26:09 -0800 (PST) X-ASG-Debug-ID: 1358774766-04cb6c3915445d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gCCrun1YlrGzOoX4 for ; Mon, 21 Jan 2013 05:26:06 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrC6OcJE5A6ZVgwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:04 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHNz-0001Kq-Uq for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jO-QE for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/9] xfs: add CRC checks to the AGFL Date: Tue, 22 Jan 2013 00:25:55 +1100 X-ASG-Orig-Subj: [PATCH 4/9] xfs: add CRC checks to the AGFL Message-Id: <1358774760-21841-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774766 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add CRC checks, location information and a magic number to the AGFL. Previously the AGFL was just a block containing nothing but the free block pointers. The new AGFL has a real header with the usual boilerplate instead, so that we can verify it's not corrupted and written into the right place. [dchinner@redhat.com] Added LSN field, reworked significantly to fit into new verifier structure and growfs structure, enabled full verifier functionality now there is a header to verify and we can guarantee an initialised AGFL. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 25 +++++++++- fs/xfs/xfs_alloc.c | 119 ++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_fsops.c | 5 ++ fs/xfs/xfs_log_recover.c | 7 +++ 5 files changed, 116 insertions(+), 44 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index b382703..813caea 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -30,6 +30,7 @@ struct xfs_trans; #define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ #define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ +#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ #define XFS_AGF_VERSION 1 #define XFS_AGI_VERSION 1 @@ -190,11 +191,31 @@ extern const struct xfs_buf_ops xfs_agi_buf_ops; */ #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) -#define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) #define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) +#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ + (__be32 *)(bp)->b_addr) + +/* + * Size of the AGFL. For CRC-enabled filesystes we steal a couple of + * slots in the beginning of the block for a proper header with the + * location information and CRC. + */ +#define XFS_AGFL_SIZE(mp) \ + (((mp)->m_sb.sb_sectsize - \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + sizeof(struct xfs_agfl) : 0)) / \ + sizeof(xfs_agblock_t)) + typedef struct xfs_agfl { - __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ + __be32 agfl_magicnum; + __be32 agfl_seqno; + uuid_t agfl_uuid; + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; /* diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 1d2e9c3..53e699e 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -432,53 +432,84 @@ xfs_alloc_fixup_trees( return 0; } -static void +static bool xfs_agfl_verify( struct xfs_buf *bp) { -#ifdef WHEN_CRCS_COME_ALONG - /* - * we cannot actually do any verification of the AGFL because mkfs does - * not initialise the AGFL to zero or NULL. Hence the only valid part of - * the AGFL is what the AGF says is active. We can't get to the AGF, so - * we can't verify just those entries are valid. - * - * This problem goes away when the CRC format change comes along as that - * requires the AGFL to be initialised by mkfs. At that point, we can - * verify the blocks in the agfl -active or not- lie within the bounds - * of the AG. Until then, just leave this check ifdef'd out. - */ struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); - int agfl_ok = 1; - int i; + if (!uuid_equal(&agfl->agfl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC) + return false; + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag && be32_to_cpu(agfl->agfl_seqno) != bp->b_pag->pag_agno) + return false; + for (i = 0; i < XFS_AGFL_SIZE(mp); i++) { - if (be32_to_cpu(agfl->agfl_bno[i]) == NULLAGBLOCK || + if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK && be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks) - agfl_ok = 0; + return false; } + return true; +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + int agfl_ok = 1; + + /* + * There is no verification of non-crc AGFLs because mkfs does not + * initialise the AGFL to zero or NULL. Hence the only valid part of the + * AGFL is what the AGF says is active. We can't get to the AGF, so we + * can't verify just those entries are valid. + */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + agfl_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); + + agfl_ok = agfl_ok && xfs_agfl_verify(bp); if (!agfl_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } -#endif } static void xfs_agfl_write_verify( struct xfs_buf *bp) { - xfs_agfl_verify(bp); -} + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; -static void -xfs_agfl_read_verify( - struct xfs_buf *bp) -{ - xfs_agfl_verify(bp); + /* no verification of non-crc AGFLs */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_agfl_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) + XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); } const struct xfs_buf_ops xfs_agfl_buf_ops = { @@ -1984,18 +2015,18 @@ xfs_alloc_get_freelist( int btreeblk) /* destination is a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. freelist structure */ xfs_buf_t *agflbp;/* buffer for a.g. freelist structure */ xfs_agblock_t bno; /* block number returned */ + __be32 *agfl_bno; int error; int logflags; - xfs_mount_t *mp; /* mount structure */ + xfs_mount_t *mp = tp->t_mountp; xfs_perag_t *pag; /* per allocation group data */ - agf = XFS_BUF_TO_AGF(agbp); /* * Freelist is empty, give up. */ + agf = XFS_BUF_TO_AGF(agbp); if (!agf->agf_flcount) { *bnop = NULLAGBLOCK; return 0; @@ -2003,15 +2034,17 @@ xfs_alloc_get_freelist( /* * Read the array of free blocks. */ - mp = tp->t_mountp; - if ((error = xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) + error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), + &agflbp); + if (error) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); + + /* * Get the block number and update the data structures. */ - bno = be32_to_cpu(agfl->agfl_bno[be32_to_cpu(agf->agf_flfirst)]); + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]); be32_add_cpu(&agf->agf_flfirst, 1); xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) @@ -2104,12 +2137,13 @@ xfs_alloc_put_freelist( int btreeblk) /* block came from a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. free block array */ __be32 *blockp;/* pointer to array entry */ int error; int logflags; xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ + __be32 *agfl_bno; + int startoff; agf = XFS_BUF_TO_AGF(agbp); mp = tp->t_mountp; @@ -2117,7 +2151,6 @@ xfs_alloc_put_freelist( if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), &agflbp))) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; @@ -2138,13 +2171,17 @@ xfs_alloc_put_freelist( xfs_alloc_log_agf(tp, agbp, logflags); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); - blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; + + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + blockp = &agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp = cpu_to_be32(bno); + startoff = (char *)blockp - (char *)agflbp->b_addr; + xfs_alloc_log_agf(tp, agbp, logflags); - xfs_trans_log_buf(tp, agflbp, - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl + - sizeof(xfs_agblock_t) - 1)); + + xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_log_buf(tp, agflbp, startoff, + startoff + sizeof(xfs_agblock_t) - 1); return 0; } diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 76bd7a1..067d5f0 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -46,13 +46,15 @@ extern kmem_zone_t *xfs_buf_item_zone; */ #define XFS_BLF_BTREE_BUF (1<<5) #define XFS_BLF_AGF_BUF (1<<6) +#define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ XFS_BLF_BTREE_BUF | \ - XFS_BLF_AGF_BUF) + XFS_BLF_AGF_BUF | \ + XFS_BLF_AGFL_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 10ee0b8..1edfdf0 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -268,6 +268,11 @@ xfs_growfs_data_private( } agfl = XFS_BUF_TO_AGFL(bp); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno = cpu_to_be32(agno); + uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + } for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 65c35d5..81d3cc5a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1961,6 +1961,13 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agf_buf_ops; break; + case XFS_BLF_AGFL_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGFL_MAGIC)) { + xfs_warn(mp, "Bad AGFL block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_agfl_buf_ops; + break; default: break; } -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5B5387F5A for ; Mon, 21 Jan 2013 07:26:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29F4E304043 for ; Mon, 21 Jan 2013 05:26:17 -0800 (PST) X-ASG-Debug-ID: 1358774775-04cb6c3915445e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cFjUnoxGCUsLt3Cv for ; Mon, 21 Jan 2013 05:26:15 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgYGTkDGxmIGKwujnCOBIM1A59ZhnyDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:14 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHO9-0001LF-Ro for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jB-MS for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfs: take inode version into account in XFS_LITINO Date: Tue, 22 Jan 2013 00:25:52 +1100 X-ASG-Orig-Subj: [PATCH 1/9] xfs: take inode version into account in XFS_LITINO Message-Id: <1358774760-21841-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774775 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add a version argument to XFS_LITINO so that it can return different values depending on the inode version. This is required for the upcoming v3 inodes with a larger fixed layout dinode. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr_leaf.c | 6 ++++-- fs/xfs/xfs_bmap.c | 4 ++-- fs/xfs/xfs_dinode.h | 6 +++--- fs/xfs/xfs_inode.h | 5 +++-- fs/xfs/xfs_vnodeops.c | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index ee24993..f96a734 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -172,7 +172,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) int dsize; xfs_mount_t *mp = dp->i_mount; - offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ + /* rounded down */ + offset = (XFS_LITINO(mp, dp->i_d.di_version) - bytes) >> 3; switch (dp->i_d.di_format) { case XFS_DINODE_FMT_DEV: @@ -243,7 +244,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) minforkoff = roundup(minforkoff, 8) >> 3; /* attr fork btree root can have at least this many key/ptr pairs */ - maxforkoff = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS); + maxforkoff = XFS_LITINO(mp, dp->i_d.di_version) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); maxforkoff = maxforkoff >> 3; /* rounded down */ if (offset >= maxforkoff) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 491f35e..f338012 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3174,13 +3174,13 @@ xfs_default_attroffset( uint offset; if (mp->m_sb.sb_inodesize == 256) { - offset = XFS_LITINO(mp) - + offset = XFS_LITINO(mp, ip->i_d.di_version) - XFS_BMDR_SPACE_CALC(MINABTPTRS); } else { offset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); } - ASSERT(offset < XFS_LITINO(mp)); + ASSERT(offset < XFS_LITINO(mp, ip->i_d.di_version)); return offset; } diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 1d9643b..88a3368 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -104,7 +104,7 @@ typedef enum xfs_dinode_fmt { /* * Inode size for given fs. */ -#define XFS_LITINO(mp) \ +#define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) #define XFS_BROOT_SIZE_ADJ \ @@ -119,10 +119,10 @@ typedef enum xfs_dinode_fmt { #define XFS_DFORK_DSIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ XFS_DFORK_BOFF(dip) : \ - XFS_LITINO(mp)) + XFS_LITINO(mp, (dip)->di_version)) #define XFS_DFORK_ASIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ - XFS_LITINO(mp) - XFS_DFORK_BOFF(dip) : \ + XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \ 0) #define XFS_DFORK_SIZE(dip,mp,w) \ ((w) == XFS_DATA_FORK ? \ diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 22baf6e..440bdb0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -180,10 +180,11 @@ typedef struct xfs_icdinode { #define XFS_IFORK_DSIZE(ip) \ (XFS_IFORK_Q(ip) ? \ XFS_IFORK_BOFF(ip) : \ - XFS_LITINO((ip)->i_mount)) + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) #define XFS_IFORK_ASIZE(ip) \ (XFS_IFORK_Q(ip) ? \ - XFS_LITINO((ip)->i_mount) - XFS_IFORK_BOFF(ip) : \ + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ + XFS_IFORK_BOFF(ip) : \ 0) #define XFS_IFORK_SIZE(ip,w) \ ((w) == XFS_DATA_FORK ? \ diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 77ad748..aa0c066 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1420,7 +1420,7 @@ xfs_symlink( * The symlink will fit into the inode data fork? * There can't be any attributes so we get the whole variable part. */ - if (pathlen <= XFS_LITINO(mp)) + if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) fs_blocks = 0; else fs_blocks = XFS_B_TO_FSB(mp, pathlen); -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7A51B7F63 for ; Mon, 21 Jan 2013 07:26:19 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5ADD98F8037 for ; Mon, 21 Jan 2013 05:26:19 -0800 (PST) X-ASG-Debug-ID: 1358774775-04cb6c3915445e0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id EdtUsyy2BiAI349D for ; Mon, 21 Jan 2013 05:26:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbAA6Cr4qF3OCHgEBBScvMwgYMTkDGxmIGKwujnCNB4QyA5t3il6DCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:14 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHO9-0001Ko-RR for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jK-PF for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/9] xfs: add CRC checks to the AGF Date: Tue, 22 Jan 2013 00:25:54 +1100 X-ASG-Orig-Subj: [PATCH 3/9] xfs: add CRC checks to the AGF Message-Id: <1358774760-21841-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774776 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner THe AGF already has some self identifying fields (e.g. the sequence number) so we only need to add the uuid to it to identify the filesystem it belongs to. The location is fixed based on the sequence number, so there's no need to add a block number, either. Hence the only additional fields are the CRC and LSN fields. These are unlogged, so place some space between the end of the logged fields and them so that future expansion of the AGF for legged fields can be placed adjacent to the existing logged fields and hence not complicate the field-derived range based logging we currently have. Based originally on a patch from myself, modified further by Christoph Hellwig and then modified again to fit into the verifier structure with additional fields by myself. The multiple signed-off-by tags indicate the age and history of this patch. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 21 +++++++++++- fs/xfs/xfs_alloc.c | 80 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_buf_item.h | 4 ++- fs/xfs/xfs_fsops.c | 3 ++ fs/xfs/xfs_log_recover.c | 7 ++++ 5 files changed, 89 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index f2aeedb..b382703 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -63,12 +63,29 @@ typedef struct xfs_agf { __be32 agf_spare0; /* spare field */ __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ __be32 agf_spare1; /* spare field */ + __be32 agf_flfirst; /* first freelist block's index */ __be32 agf_fllast; /* last freelist block's index */ __be32 agf_flcount; /* count of blocks in freelist */ __be32 agf_freeblks; /* total free blocks */ + __be32 agf_longest; /* longest free space */ __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ + uuid_t agf_uuid; /* uuid of filesystem */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + __be64 agf_spare64[16]; + + /* unlogged fields, written during buffer writeback. */ + __be64 agf_lsn; /* last write sequence */ + __be32 agf_crc; /* crc of agf sector */ + __be32 agf_spare2; + + /* structure must be padded to 64 bit alignment */ } xfs_agf_t; #define XFS_AGF_MAGICNUM 0x00000001 @@ -83,6 +100,7 @@ typedef struct xfs_agf { #define XFS_AGF_FREEBLKS 0x00000200 #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 +#define XFS_AGF_UUID 0x00001000 #define XFS_AGF_NUM_BITS 12 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) @@ -98,7 +116,8 @@ typedef struct xfs_agf { { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ - { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ + { XFS_AGF_UUID, "UUID" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 0ad2325..1d2e9c3 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -33,7 +33,9 @@ #include "xfs_alloc.h" #include "xfs_extent_busy.h" #include "xfs_error.h" +#include "xfs_cksum.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" struct workqueue_struct *xfs_alloc_wq; @@ -2058,11 +2060,14 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_freeblks), offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), + offsetof(xfs_agf_t, agf_uuid), sizeof(xfs_agf_t) }; trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2143,22 +2148,24 @@ xfs_alloc_put_freelist( return 0; } -static void +static bool xfs_agf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_agf *agf; - int agf_ok; + struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); - agf = XFS_BUF_TO_AGF(bp); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + return false; - agf_ok = agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -2166,33 +2173,58 @@ xfs_agf_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agf_ok = agf_ok && be32_to_cpu(agf->agf_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno) + return false; - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= - be32_to_cpu(agf->agf_length); + if (xfs_sb_version_haslazysbcount(&mp->m_sb) && + be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) + return false; + + return true;; - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } } static void xfs_agf_read_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agf_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agf_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); + + agf_ok = agf_ok && xfs_agf_verify(mp, bp); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agf_write_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); } const struct xfs_buf_ops xfs_agf_buf_ops = { diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 101ef83..76bd7a1 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -45,12 +45,14 @@ extern kmem_zone_t *xfs_buf_item_zone; * once the changes have been replayed into the buffer. */ #define XFS_BLF_BTREE_BUF (1<<5) +#define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF) + XFS_BLF_BTREE_BUF | \ + XFS_BLF_AGF_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 50c43ec..10ee0b8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -247,6 +247,9 @@ xfs_growfs_data_private( tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + error = xfs_bwrite(bp); xfs_buf_relse(bp); if (error) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c57a987..65c35d5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1954,6 +1954,13 @@ xlog_recover_do_reg_buffer( break; } break; + case XFS_BLF_AGF_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGF_MAGIC)) { + xfs_warn(mp, "Bad AGF block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_agf_buf_ops; + break; default: break; } -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4A3507F5E for ; Mon, 21 Jan 2013 07:26:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CCE02AC007 for ; Mon, 21 Jan 2013 05:26:19 -0800 (PST) X-ASG-Debug-ID: 1358774777-04cbb00c6342c60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HrBeAQdhGJqKt6GF for ; Mon, 21 Jan 2013 05:26:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrC6OcJE5A5t3il6DCYFUJA Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:14 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHO9-0001Kr-UD for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jT-RD for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/9] xfs: add CRC checks to the AGI Date: Tue, 22 Jan 2013 00:25:56 +1100 X-ASG-Orig-Subj: [PATCH 5/9] xfs: add CRC checks to the AGI Message-Id: <1358774760-21841-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774777 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Same set of changes made to the AGF need to be made to the AGI. This patch has a similar history to the AGF, hence a similar sign-off chain. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 8 +++++++ fs/xfs/xfs_buf_item.h | 4 +++- fs/xfs/xfs_fsops.c | 3 +++ fs/xfs/xfs_ialloc.c | 57 ++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_log_recover.c | 7 ++++++ 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 813caea..1e0fa34 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -152,6 +152,7 @@ typedef struct xfs_agi { __be32 agi_root; /* root of inode btree */ __be32 agi_level; /* levels in inode btree */ __be32 agi_freecount; /* number of free inodes */ + __be32 agi_newino; /* new inode just allocated */ __be32 agi_dirino; /* last directory inode chunk */ /* @@ -159,6 +160,13 @@ typedef struct xfs_agi { * still being referenced. */ __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; + + uuid_t agi_uuid; /* uuid of filesystem */ + __be32 agi_crc; /* crc of agi sector */ + __be32 agi_pad32; + __be64 agi_lsn; /* last write sequence */ + + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_MAGICNUM 0x00000001 diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 067d5f0..c256606 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -47,6 +47,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_BTREE_BUF (1<<5) #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) +#define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -54,7 +55,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_GDQUOT_BUF | \ XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ - XFS_BLF_AGFL_BUF) + XFS_BLF_AGFL_BUF | \ + XFS_BLF_AGI_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 1edfdf0..22ce48d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -304,8 +304,11 @@ xfs_growfs_data_private( agi->agi_freecount = 0; agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO); + error = xfs_bwrite(bp); xfs_buf_relse(bp); if (error) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 515bf71..41c76d6 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -36,6 +36,8 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_bmap.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" /* @@ -1453,6 +1455,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } @@ -1470,19 +1473,23 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif -static void +static bool xfs_agi_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); - int agi_ok; + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_uuid)) + return false; /* * Validate the magic number of the agi block. */ - agi_ok = agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC) && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + if (agi->agi_magicnum != cpu_to_be32(XFS_AGI_MAGIC)) + return false; + if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -1490,30 +1497,52 @@ xfs_agi_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agi_ok = agi_ok && be32_to_cpu(agi->agi_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agi->agi_seqno) != bp->b_pag->pag_agno) + return false; - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } xfs_check_agi_unlinked(agi); + return true; } static void xfs_agi_read_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agi_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agi_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); + agi_ok = agi_ok && xfs_agi_verify(bp); + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agi_write_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agi_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGI(bp)->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); } const struct xfs_buf_ops xfs_agi_buf_ops = { diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 81d3cc5a..8df1ff8 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1968,6 +1968,13 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agfl_buf_ops; break; + case XFS_BLF_AGI_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGI_MAGIC)) { + xfs_warn(mp, "Bad AGI block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_agi_buf_ops; + break; default: break; } -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0C4B57F5A for ; Mon, 21 Jan 2013 07:26:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF1388F8037 for ; Mon, 21 Jan 2013 05:26:19 -0800 (PST) X-ASG-Debug-ID: 1358774774-04cb6c3913445d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id C1eeFBhvdoS0oLE8 for ; Mon, 21 Jan 2013 05:26:14 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAFAKBB/VB5LETJ/2dsb2JhbAA6CoZFt2UXc4IeAQEFGgEIBAsBIzMIGAUCJgICOQMbGYgYqW6CQI5wgSOLZIMfgRMDplWDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:11 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHNz-0001Kn-Rh for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jF-OA for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: =?UTF-8?q?=5BPATCH=202/9=5D=20xfs=3A=20add=20support=20for=20large=20btree=20blocks?= Date: Tue, 22 Jan 2013 00:25:53 +1100 X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=202/9=5D=20xfs=3A=20add=20support=20for=20large=20btree=20blocks?= Message-Id: <1358774760-21841-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774774 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add support for larger btree blocks that contains a CRC32C checksum, a filesystem uuid and block number for detecting filesystem consistency and out of place writes. [dchinner@redhat.com] Also include an owner field to allow reverse mappings to be implemented for improved repairability and a LSN field to so that log recovery can easily determine the last modification that made it to disk for each buffer. [dchinner@redhat.com] Add buffer log format flags to indicate the type of buffer to recovery so that we don't have to do blind magic number tests to determine what the buffer is. [dchinner@redhat.com] Modified to fit into the verifier structure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc_btree.c | 105 +++++++++++++------ fs/xfs/xfs_alloc_btree.h | 12 ++- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_bmap.c | 42 +++++--- fs/xfs/xfs_bmap_btree.c | 110 +++++++++++++------ fs/xfs/xfs_bmap_btree.h | 19 ++-- fs/xfs/xfs_btree.c | 256 +++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_btree.h | 64 ++++++++++-- fs/xfs/xfs_buf_item.h | 24 ++++- fs/xfs/xfs_dinode.h | 4 +- fs/xfs/xfs_fsops.c | 23 +++- fs/xfs/xfs_ialloc_btree.c | 87 ++++++++++----- fs/xfs/xfs_ialloc_btree.h | 9 +- fs/xfs/xfs_inode.c | 33 +++--- fs/xfs/xfs_log_recover.c | 28 +++++ fs/xfs/xfs_trans.h | 2 + fs/xfs/xfs_trans_buf.c | 29 +++-- 17 files changed, 643 insertions(+), 206 deletions(-) diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b1ddef6..30c4c14 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -33,6 +33,7 @@ #include "xfs_extent_busy.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" STATIC struct xfs_btree_cur * @@ -272,7 +273,7 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } -static void +static bool xfs_allocbt_verify( struct xfs_buf *bp) { @@ -280,66 +281,103 @@ xfs_allocbt_verify( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ /* * magic number and level verification * - * During growfs operations, we can't verify the exact level as the - * perag is not fully initialised and hence not attached to the buffer. - * In this case, check against the maximum tree depth. + * During growfs operations, we can't verify the exact level or owner as + * the perag is not fully initialised and hence not attached to the + * buffer. In this case, check against the maximum tree depth. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agf information will not yet have been initialised + * from the on disk AGF. Again, we can only check against maximum limits + * in this case. */ level = be16_to_cpu(block->bb_level); switch (block->bb_magic) { + case cpu_to_be32(XFS_ABTB_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case cpu_to_be32(XFS_ABTB_MAGIC): - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_BNOi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag && pag->pagf_init) { + if (level >= pag->pagf_levels[XFS_BTNUM_BNOi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; + case cpu_to_be32(XFS_ABTC_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case cpu_to_be32(XFS_ABTC_MAGIC): - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_CNTi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag && pag->pagf_init) { + if (level >= pag->pagf_levels[XFS_BTNUM_CNTi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; default: - sblock_ok = 0; - break; + return false; } /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_alloc_mxr[level != 0]; + if (be16_to_cpu(block->bb_numrecs) > mp->m_alloc_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_allocbt_read_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_allocbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_allocbt_write_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!xfs_allocbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_allocbt_buf_ops = { @@ -444,6 +482,9 @@ xfs_allocbt_init_cursor( cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; + return cur; } diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index 7e89a2b..087465b 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h @@ -31,8 +31,10 @@ struct xfs_mount; * by blockcount and blockno. All blocks look the same to make the code * simpler; if we have time later, we'll make the optimizations. */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x4142544a +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x4142544b /* * Data record/key structure @@ -59,10 +61,10 @@ typedef __be32 xfs_alloc_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_ALLOC_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_ALLOC_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index f96a734..aa4765f 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -232,7 +232,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) return 0; return dp->i_d.di_forkoff; } - dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot); break; } diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index f338012..821f599 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3053,6 +3053,7 @@ xfs_bmap_extents_to_btree( xfs_extnum_t nextents; /* number of file extents */ xfs_bmbt_ptr_t *pp; /* root block address pointer */ + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); @@ -3066,16 +3067,18 @@ xfs_bmap_extents_to_btree( * Fill in the root. */ block = ifp->if_broot; - block->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - block->bb_level = cpu_to_be16(1); - block->bb_numrecs = cpu_to_be16(1); - block->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - block->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS); /* * Need a cursor. Can't allocate until bb_level is filled in. */ - mp = ip->i_mount; cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); cur->bc_private.b.firstblock = *firstblock; cur->bc_private.b.flist = flist; @@ -3124,10 +3127,15 @@ xfs_bmap_extents_to_btree( */ abp->b_ops = &xfs_bmbt_buf_ops; ablock = XFS_BUF_TO_BLOCK(abp); - ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - ablock->bb_level = 0; - ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { @@ -3155,8 +3163,8 @@ xfs_bmap_extents_to_btree( * Do all this logging at the end so that * the root is at the right level. */ - xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); + xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); ASSERT(*curp == NULL); *curp = cur; *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); @@ -3268,8 +3276,12 @@ xfs_bmap_local_to_extents( *firstblock = args.fsbno; bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); bp->b_ops = &xfs_bmbt_buf_ops; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + + xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); + xfs_bmap_forkoff_reset(args.mp, ip, whichfork); xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); xfs_iext_add(ifp, 0, 1); @@ -4023,11 +4035,15 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); - if (block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC) || - be16_to_cpu(block->bb_level) != level || + if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && + block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) + return 0; + + if (be16_to_cpu(block->bb_level) != level || be16_to_cpu(block->bb_numrecs) == 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) return 0; + return 1; } diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 061b45c..3a86c3f 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -37,6 +37,7 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" +#include "xfs_cksum.h" /* * Determine the extent state. @@ -59,24 +60,31 @@ xfs_extent_state( */ void xfs_bmdr_to_bmbt( - struct xfs_mount *mp, + struct xfs_inode *ip, xfs_bmdr_block_t *dblock, int dblocklen, struct xfs_btree_block *rblock, int rblocklen) { + struct xfs_mount *mp = ip->i_mount; int dmxr; xfs_bmbt_key_t *fkp; __be64 *fpp; xfs_bmbt_key_t *tkp; __be64 *tpp; - rblock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + rblock->bb_level = dblock->bb_level; ASSERT(be16_to_cpu(rblock->bb_level) > 0); rblock->bb_numrecs = dblock->bb_numrecs; - rblock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - rblock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); fkp = XFS_BMDR_KEY_ADDR(dblock, 1); tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); @@ -424,7 +432,13 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; - ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno == + cpu_to_be64(XFS_BUF_DADDR_NULL)); + } else + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_level != 0); @@ -708,59 +722,89 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } -static void +static int xfs_bmbt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); unsigned int level; - int lblock_ok; /* block passes checks */ - /* magic number and level verification. + switch (block->bb_magic) { + case cpu_to_be32(XFS_BMAP_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(block->bb_u.l.bb_blkno) != bp->b_bn) + return false; + /* + * XXX: need a better way of verifying the owner here. Right now + * just make sure there has been one set. + */ + if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) + return false; + /* fall through */ + case cpu_to_be32(XFS_BMAP_MAGIC): + break; + default: + return false; + } + + /* + * numrecs and level verification. * - * We don't know waht fork we belong to, so just verify that the level + * We don't know what fork we belong to, so just verify that the level * is less than the maximum of the two. Later checks will be more * precise. */ level = be16_to_cpu(block->bb_level); - lblock_ok = block->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC) && - level < max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); - - /* numrecs verification */ - lblock_ok = lblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_bmap_dmxr[level != 0]; + if (level > max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) + return false; /* sibling pointer verification */ - lblock_ok = lblock_ok && - block->bb_u.l.bb_leftsib && - (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && - block->bb_u.l.bb_rightsib && - (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); - - if (!lblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; + } static void xfs_bmbt_read_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!(xfs_btree_lblock_verify_crc(bp) && + xfs_bmbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + } static void xfs_bmbt_write_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!xfs_bmbt_verify(bp)) { + xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_btree_lblock_calc_crc(bp); } const struct xfs_buf_ops xfs_bmbt_buf_ops = { @@ -838,6 +882,8 @@ xfs_bmbt_init_cursor( cur->bc_ops = &xfs_bmbt_ops; cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, whichfork); cur->bc_private.b.ip = ip; diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 88469ca..1b2f3e7 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -18,7 +18,8 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4158 struct xfs_btree_cur; struct xfs_btree_block; @@ -136,10 +137,10 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN +#define XFS_BMBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN) #define XFS_BMBT_REC_ADDR(mp, block, index) \ ((xfs_bmbt_rec_t *) \ @@ -186,12 +187,12 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \ XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) -#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ - (int)(XFS_BTREE_LBLOCK_LEN + \ +#define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \ + (int)(XFS_BMBT_BLOCK_LEN(mp) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) -#define XFS_BMAP_BROOT_SPACE(bb) \ - (XFS_BMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs))) +#define XFS_BMAP_BROOT_SPACE(mp, bb) \ + (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs))) #define XFS_BMDR_SPACE_CALC(nrecs) \ (int)(sizeof(xfs_bmdr_block_t) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) @@ -204,7 +205,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Prototypes for xfs_bmap.c to call. */ -extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, +extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int, struct xfs_btree_block *, int); extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index db01040..9e8fcad 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -30,9 +30,11 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" +#include "xfs_buf_item.h" #include "xfs_btree.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" /* * Cursor allocation zone. @@ -42,9 +44,13 @@ kmem_zone_t *xfs_btree_cur_zone; /* * Btree magic numbers. */ -const __uint32_t xfs_magics[XFS_BTNUM_MAX] = { - XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC +static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } }; +#define xfs_btree_magic(cur) \ + xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] STATIC int /* error (0 or EFSCORRUPTED) */ @@ -54,30 +60,38 @@ xfs_btree_check_lblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer for block, if any */ { - int lblock_ok; /* block passes checks */ + int lblock_ok = 1; /* block passes checks */ struct xfs_mount *mp; /* file system mount point */ mp = cur->bc_mp; - lblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + lblock_ok = lblock_ok && + uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.l.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + lblock_ok = lblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && + be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); + be64_to_cpu(block->bb_u.l.bb_rightsib))); + if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, - mp); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -90,16 +104,26 @@ xfs_btree_check_sblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block */ { + struct xfs_mount *mp; /* file system mount point */ struct xfs_buf *agbp; /* buffer for ag. freespace struct */ struct xfs_agf *agf; /* ag. freespace structure */ xfs_agblock_t agflen; /* native ag. freespace length */ - int sblock_ok; /* block passes checks */ + int sblock_ok = 1; /* block passes checks */ + mp = cur->bc_mp; agbp = cur->bc_private.a.agbp; agf = XFS_BUF_TO_AGF(agbp); agflen = be32_to_cpu(agf->agf_length); - sblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + sblock_ok = sblock_ok && + uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.s.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + sblock_ok = sblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && @@ -109,13 +133,13 @@ xfs_btree_check_sblock( (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; - if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, + + if (unlikely(XFS_TEST_ERROR(!sblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", - XFS_ERRLEVEL_LOW, cur->bc_mp, block); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -194,6 +218,72 @@ xfs_btree_check_ptr( #endif /* + * Calculate CRC on the whole btree block and stuff it into the + * long-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_lblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); +} + +bool +xfs_btree_lblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); + return true; +} + +/* + * Calculate CRC on the whole btree block and stuff it into the + * short-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_sblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); +} + +bool +xfs_btree_sblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); + return true; +} + +/* * Delete the btree cursor. */ void @@ -277,10 +367,8 @@ xfs_btree_dup_cursor( *ncur = NULL; return error; } - new->bc_bufs[i] = bp; - ASSERT(!xfs_buf_geterror(bp)); - } else - new->bc_bufs[i] = NULL; + } + new->bc_bufs[i] = bp; } *ncur = new; return 0; @@ -321,9 +409,14 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? - XFS_BTREE_LBLOCK_LEN : - XFS_BTREE_SBLOCK_LEN; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_LBLOCK_CRC_LEN; + return XFS_BTREE_LBLOCK_LEN; + } + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_SBLOCK_CRC_LEN; + return XFS_BTREE_SBLOCK_LEN; } /* @@ -863,43 +956,85 @@ xfs_btree_set_sibling( } void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags) +{ + buf->bb_magic = cpu_to_be32(magic); + buf->bb_level = cpu_to_be16(level); + buf->bb_numrecs = cpu_to_be16(numrecs); + + if (flags & XFS_BTREE_LONG_PTRS) { + buf->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); + buf->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.l.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.l.bb_owner = cpu_to_be64(owner); + uuid_copy(&buf->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid); + buf->bb_u.l.bb_pad = 0; + } + } else { + /* owner is a 32 bit value on short blocks */ + __u32 __owner = (__u32)owner; + + buf->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); + buf->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.s.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.s.bb_owner = cpu_to_be32(__owner); + uuid_copy(&buf->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid); + } + } +} + +void xfs_btree_init_block( struct xfs_mount *mp, struct xfs_buf *bp, __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags) { - struct xfs_btree_block *new = XFS_BUF_TO_BLOCK(bp); - - new->bb_magic = cpu_to_be32(magic); - new->bb_level = cpu_to_be16(level); - new->bb_numrecs = cpu_to_be16(numrecs); - - if (flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); - } else { - new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - } + xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + magic, level, numrecs, owner, flags); } STATIC void xfs_btree_init_block_cur( struct xfs_btree_cur *cur, + struct xfs_buf *bp, int level, - int numrecs, - struct xfs_buf *bp) + int numrecs) { - xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], - level, numrecs, cur->bc_flags); + __u64 owner; + + /* + * we can pull the owner from the cursor right now as the different + * owners align directly with the pointer size of the btree. This may + * change in future, but is safe for current users of the generic btree + * code. + */ + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + owner = cur->bc_private.b.ip->i_ino; + else + owner = cur->bc_private.a.agno; + + xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + xfs_btree_magic(cur), level, numrecs, + owner, cur->bc_flags); } /* * Return true if ptr is the last record in the btree and - * we need to track updateѕ to this record. The decision + * we need to track updates to this record. The decision * will be further refined in the update_lastrec method. */ STATIC int @@ -1147,6 +1282,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1171,6 +1307,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1195,6 +1332,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); int level = xfs_btree_get_level(block); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1223,7 +1361,12 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib), - XFS_BTREE_SBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.s.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.s.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.s.bb_owner), + offsetof(struct xfs_btree_block, bb_u.s.bb_crc), + XFS_BTREE_SBLOCK_CRC_LEN }; static const short loffsets[] = { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1231,17 +1374,40 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib), - XFS_BTREE_LBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.l.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.l.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.l.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.l.bb_owner), + offsetof(struct xfs_btree_block, bb_u.l.bb_crc), + offsetof(struct xfs_btree_block, bb_u.l.bb_pad), + XFS_BTREE_LBLOCK_CRC_LEN }; XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBI(cur, bp, fields); if (bp) { + int nbits; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { + /* + * We don't log the CRC when updating a btree + * block but instead recreate it during log + * recovery. As the log buffers have checksums + * of their this is safe and avoids logging a crc + * update in a lot of places. + */ + if (fields == XFS_BB_ALL_BITS) + fields = XFS_BB_ALL_BITS_CRC; + nbits = XFS_BB_NUM_BITS_CRC; + } else { + nbits = XFS_BB_NUM_BITS; + } xfs_btree_offsets(fields, (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, - XFS_BB_NUM_BITS, &first, &last); + nbits, &first, &last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, @@ -2204,7 +2370,7 @@ xfs_btree_split( goto error0; /* Fill in the btree header for the new right block. */ - xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); + xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); /* * Split the entries between the old and the new block evenly. @@ -2513,7 +2679,7 @@ xfs_btree_new_root( nptr = 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); + xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index f932897..6e6c915 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -42,11 +42,15 @@ extern kmem_zone_t *xfs_btree_cur_zone; * Generic btree header. * * This is a combination of the actual format used on disk for short and long - * format btrees. The first three fields are shared by both format, but - * the pointers are different and should be used with care. + * format btrees. The first three fields are shared by both format, but the + * pointers are different and should be used with care. * - * To get the size of the actual short or long form headers please use - * the size macros below. Never use sizeof(xfs_btree_block). + * To get the size of the actual short or long form headers please use the size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesystems + * with the crc feature bit, and all accesses to them must be conditional on + * that flag. */ struct xfs_btree_block { __be32 bb_magic; /* magic number for block type */ @@ -56,10 +60,23 @@ struct xfs_btree_block { struct { __be32 bb_leftsib; __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; } s; /* short form pointers */ struct { __be64 bb_leftsib; __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ } l; /* long form pointers */ } bb_u; /* rest */ }; @@ -67,6 +84,16 @@ struct xfs_btree_block { #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) + + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) + /* * Generic key, ptr and record wrapper structures. @@ -101,13 +128,11 @@ union xfs_btree_rec { #define XFS_BB_NUMRECS 0x04 #define XFS_BB_LEFTSIB 0x08 #define XFS_BB_RIGHTSIB 0x10 +#define XFS_BB_BLKNO 0x20 #define XFS_BB_NUM_BITS 5 #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) - -/* - * Magic numbers for btree blocks. - */ -extern const __uint32_t xfs_magics[]; +#define XFS_BB_NUM_BITS_CRC 8 +#define XFS_BB_ALL_BITS_CRC ((1 << XFS_BB_NUM_BITS_CRC) - 1) /* * Generic stats interface @@ -256,6 +281,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LONG_PTRS (1<<0) /* pointers are 64bits long */ #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ +#define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ #define XFS_BTREE_NOERROR 0 @@ -393,8 +419,20 @@ xfs_btree_init_block( __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags); +void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags); + /* * Common btree core entry points. */ @@ -408,6 +446,14 @@ int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); /* + * btree block CRC helpers + */ +void xfs_btree_lblock_calc_crc(struct xfs_buf *); +bool xfs_btree_lblock_verify_crc(struct xfs_buf *); +void xfs_btree_sblock_calc_crc(struct xfs_buf *); +bool xfs_btree_sblock_verify_crc(struct xfs_buf *); + +/* * Internal btree helpers also used by xfs_bmap.c. */ void xfs_btree_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index ee36c88..101ef83 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -24,19 +24,33 @@ extern kmem_zone_t *xfs_buf_item_zone; * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLF_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF (1<<0) /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLF_CANCEL 0x2 +#define XFS_BLF_CANCEL (1<<1) + /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLF_UDQUOT_BUF 0x4 -#define XFS_BLF_PDQUOT_BUF 0x8 -#define XFS_BLF_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF (1<<2) +#define XFS_BLF_PDQUOT_BUF (1<<3) +#define XFS_BLF_GDQUOT_BUF (1<<4) + +/* + * all buffers now need flags to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + */ +#define XFS_BLF_BTREE_BUF (1<<5) + +#define XFS_BLF_TYPE_MASK \ + (XFS_BLF_UDQUOT_BUF | \ + XFS_BLF_PDQUOT_BUF | \ + XFS_BLF_GDQUOT_BUF | \ + XFS_BLF_BTREE_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 88a3368..6b5bd17 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -107,8 +107,8 @@ typedef enum xfs_dinode_fmt { #define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) -#define XFS_BROOT_SIZE_ADJ \ - (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) +#define XFS_BROOT_SIZE_ADJ(ip) \ + (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) /* * Inode data & attribute fork sizes, per inode. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 94eaeed..50c43ec 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -316,7 +316,13 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_ABTB_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); arec->ar_blockcount = cpu_to_be32( @@ -339,7 +345,13 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_ABTC_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); arec->ar_blockcount = cpu_to_be32( @@ -363,7 +375,12 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_IBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, + agno, 0); error = xfs_bwrite(bp); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index bec344b..c82ac88 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -34,6 +34,7 @@ #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" STATIC int @@ -182,52 +183,88 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } -void +static int xfs_inobt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ - /* magic number and level verification */ - level = be16_to_cpu(block->bb_level); - sblock_ok = block->bb_magic == cpu_to_be32(XFS_IBT_MAGIC) && - level < mp->m_in_maxlevels; + /* + * During growfs operations, we can't verify the exact owner as the + * perag is not fully initialised and hence not attached to the buffer. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agi information will not yet have been initialised + * from the on disk AGI. We don't currently use any of this information, + * but beware of the landmine (i.e. need to check pag->pagi_init) if we + * ever do. + */ + switch (block->bb_magic) { + case cpu_to_be32(XFS_IBT_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ + case cpu_to_be32(XFS_IBT_MAGIC): + break; + default: + return 0; + } - /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_inobt_mxr[level != 0]; + /* numrecs and level verification */ + level = be16_to_cpu(block->bb_level); + if (level >= mp->m_in_maxlevels) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_inobt_read_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_inobt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_inobt_write_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!xfs_inobt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_inobt_buf_ops = { @@ -301,6 +338,8 @@ xfs_inobt_init_cursor( cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index 25c0239..78dfd1e 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -29,7 +29,8 @@ struct xfs_mount; /* * There is a btree for the inode map per allocation group. */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x4941425c typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -76,10 +77,10 @@ typedef __be32 xfs_inobt_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_INOBT_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_INOBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4f20165..202ce37 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -786,6 +786,7 @@ xfs_iformat_btree( xfs_dinode_t *dip, int whichfork) { + struct xfs_mount *mp = ip->i_mount; xfs_bmdr_block_t *dfp; xfs_ifork_t *ifp; /* REFERENCED */ @@ -794,7 +795,7 @@ xfs_iformat_btree( ifp = XFS_IFORK_PTR(ip, whichfork); dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); - size = XFS_BMAP_BROOT_SPACE(dfp); + size = XFS_BMAP_BROOT_SPACE(mp, dfp); nrecs = be16_to_cpu(dfp->bb_numrecs); /* @@ -805,14 +806,14 @@ xfs_iformat_btree( * blocks. */ if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= - XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_IFORK_MAXEXT(ip, whichfork) || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_DFORK_SIZE(dip, mp, whichfork) || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", - (unsigned long long) ip->i_ino); + xfs_warn(mp, "corrupt inode %Lu (btree).", + (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); + mp, dip); return XFS_ERROR(EFSCORRUPTED); } @@ -823,8 +824,7 @@ xfs_iformat_btree( * Copy and convert from the on-disk structure * to the in-memory structure. */ - xfs_bmdr_to_bmbt(ip->i_mount, dfp, - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), ifp->if_broot, size); ifp->if_flags &= ~XFS_IFEXTENTS; ifp->if_flags |= XFS_IFBROOT; @@ -2037,7 +2037,7 @@ xfs_iroot_realloc( * allocate it now and get out. */ if (ifp->if_broot_bytes == 0) { - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes = (int)new_size; return; @@ -2051,9 +2051,9 @@ xfs_iroot_realloc( */ cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); new_max = cur_max + rec_diff; - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ + XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -2061,7 +2061,7 @@ xfs_iroot_realloc( (int)new_size); ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); return; } @@ -2076,7 +2076,7 @@ xfs_iroot_realloc( new_max = cur_max + rec_diff; ASSERT(new_max >= 0); if (new_max > 0) - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); else new_size = 0; if (new_size > 0) { @@ -2084,7 +2084,8 @@ xfs_iroot_realloc( /* * First copy over the btree block header. */ - memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN); + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); } else { new_broot = NULL; ifp->if_flags &= ~XFS_IFBROOT; @@ -2114,7 +2115,7 @@ xfs_iroot_realloc( ifp->if_broot = new_broot; ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); return; } @@ -2427,7 +2428,7 @@ xfs_iflush_fork( ASSERT(ifp->if_broot != NULL); ASSERT(ifp->if_broot_bytes <= (XFS_IFORK_SIZE(ip, whichfork) + - XFS_BROOT_SIZE_ADJ)); + XFS_BROOT_SIZE_ADJ(ip))); xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, (xfs_bmdr_block_t *)cp, XFS_DFORK_SIZE(dip, mp, whichfork)); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 96fcbb8..c57a987 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -29,6 +29,7 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" +#include "xfs_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" @@ -1929,6 +1930,33 @@ xlog_recover_do_reg_buffer( /* Shouldn't be any more regions */ ASSERT(i == item->ri_total); + + switch (buf_f->blf_flags & XFS_BLF_TYPE_MASK) { + case XFS_BLF_BTREE_BUF: + switch (be32_to_cpu(*(__be32 *)bp->b_addr)) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTB_MAGIC: + case XFS_ABTC_MAGIC: + bp->b_ops = &xfs_allocbt_buf_ops; + break; + case XFS_IBT_CRC_MAGIC: + case XFS_IBT_MAGIC: + bp->b_ops = &xfs_inobt_buf_ops; + break; + case XFS_BMAP_CRC_MAGIC: + case XFS_BMAP_MAGIC: + bp->b_ops = &xfs_bmbt_buf_ops; + break; + default: + xfs_warn(mp, "Bad btree block magic!"); + ASSERT(0); + break; + } + break; + default: + break; + } } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c6c0601..932de22 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -503,6 +503,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + uint); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 3edf5db..f950edd 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -659,6 +659,7 @@ xfs_trans_binval( ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_INODE_BUF)); + ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_TYPE_MASK)); ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); @@ -671,6 +672,7 @@ xfs_trans_binval( bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->__bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->__bli_format.blf_flags |= XFS_BLF_CANCEL; + bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; for (i = 0; i < bip->bli_format_count; i++) { memset(bip->bli_formats[i].blf_data_map, 0, (bip->bli_formats[i].blf_map_size * sizeof(uint))); @@ -751,6 +753,26 @@ xfs_trans_inode_alloc_buf( bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; } +/* + * Set the type of the buffer for log recovery so that it can correctly identify + * and hence attach the correct buffer ops to the buffer after replay. + */ +void +xfs_trans_buf_set_type( + struct xfs_trans *tp, + struct xfs_buf *bp, + uint type) +{ + struct xfs_buf_log_item *bip = bp->b_fspriv; + + ASSERT(bp->b_transp == tp); + ASSERT(bip != NULL); + ASSERT(atomic_read(&bip->bli_refcount) > 0); + ASSERT((type & XFS_BLF_TYPE_MASK) != 0); + + bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; + bip->__bli_format.blf_flags |= type; +} /* * Similar to xfs_trans_inode_buf(), this marks the buffer as a cluster of @@ -769,14 +791,9 @@ xfs_trans_dquot_buf( xfs_buf_t *bp, uint type) { - xfs_buf_log_item_t *bip = bp->b_fspriv; - - ASSERT(bp->b_transp == tp); - ASSERT(bip != NULL); ASSERT(type == XFS_BLF_UDQUOT_BUF || type == XFS_BLF_PDQUOT_BUF || type == XFS_BLF_GDQUOT_BUF); - ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->__bli_format.blf_flags |= type; + xfs_trans_buf_set_type(tp, bp, type); } -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6B8EB7F60 for ; Mon, 21 Jan 2013 07:26:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4BED1304039 for ; Mon, 21 Jan 2013 05:26:21 -0800 (PST) X-ASG-Debug-ID: 1358774774-04cb6c3913445d0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JQvGW4Ep0zSIXIax for ; Mon, 21 Jan 2013 05:26:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av8EAKBB/VB5LETJ/2dsb2JhbAA8CL4qF3OCHgEBBRoBDC8WHQgYGBk5AxsZiBisLo5wjHYXBghpgzUDplWDCYFSAQECHAY Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:15 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHO0-0001Ky-3t for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:04 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005jn-WA for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfs: add CRC checks to remote symlinks Date: Tue, 22 Jan 2013 00:26:00 +1100 X-ASG-Orig-Subj: [PATCH 9/9] xfs: add CRC checks to remote symlinks Message-Id: <1358774760-21841-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774777 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add a header to the remote symlink block, containing location and owner information, as well as CRCs and LSN fields. This requires verifiers to be added to the remote symlink buffers for CRC enabled filesystems. This also fixes a bug reading multiple block symlinks, where the second block overwrites the first block when copying out the link name. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 5 +- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_log_recover.c | 8 + fs/xfs/xfs_symlink.c | 690 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_symlink.h | 43 +++ fs/xfs/xfs_vnodeops.c | 480 +------------------------------- 6 files changed, 751 insertions(+), 479 deletions(-) create mode 100644 fs/xfs/xfs_symlink.c create mode 100644 fs/xfs/xfs_symlink.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index d02201d..062f25c 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -45,11 +45,11 @@ xfs-y += xfs_aops.o \ xfs_itable.o \ xfs_message.o \ xfs_mru_cache.o \ - xfs_super.o \ - xfs_xattr.o \ xfs_rename.o \ + xfs_super.o \ xfs_utils.o \ xfs_vnodeops.o \ + xfs_xattr.o \ kmem.o \ uuid.o @@ -73,6 +73,7 @@ xfs-y += xfs_alloc.o \ xfs_inode.o \ xfs_log_recover.o \ xfs_mount.o \ + xfs_symlink.o \ xfs_trans.o # low-level transaction/log code diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index d1eeeab..298438f 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -50,6 +50,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_SB_BUF (1<<10) +#define XFS_BLF_SYMLINK_BUF (1<<11) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -60,7 +61,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ XFS_BLF_DINO_BUF | \ - XFS_BLF_SB_BUF) + XFS_BLF_SB_BUF | \ + XFS_BLF_SYMLINK_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a13a47a..b5d4e91 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -45,6 +45,7 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_symlink.h" STATIC int xlog_find_zeroed( @@ -2006,6 +2007,13 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_sb_buf_ops; break; + case XFS_BLF_SYMLINK_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SYMLINK_MAGIC)) { + xfs_warn(mp, "Bad symlink block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_symlink_buf_ops; + break; default: break; } diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c new file mode 100644 index 0000000..1c0660e --- /dev/null +++ b/fs/xfs/xfs_symlink.c @@ -0,0 +1,690 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright 2013 Red Hat, Inc. + * All rights reserved. + */ + +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_types.h" +#include "xfs_bit.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_dir2.h" +#include "xfs_mount.h" +#include "xfs_da_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_ialloc_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" +#include "xfs_inode_item.h" +#include "xfs_itable.h" +#include "xfs_ialloc.h" +#include "xfs_alloc.h" +#include "xfs_bmap.h" +#include "xfs_error.h" +#include "xfs_quota.h" +#include "xfs_utils.h" +#include "xfs_trans_space.h" +#include "xfs_log_priv.h" +#include "xfs_trace.h" +#include "xfs_symlink.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" + + +/* + * Each contiguous block has a header, so it is not just a simple pathlen + * to FSB conversion. + */ +int +xfs_symlink_blocks( + struct xfs_mount *mp, + int pathlen) +{ + int fsblocks = 0; + int len = pathlen; + + do { + fsblocks++; + len -= XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + ASSERT(fsblocks <= XFS_SYMLINK_MAPS); + return fsblocks; +} + +static int +xfs_symlink_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); + dsl->sl_offset = cpu_to_be32(offset); + dsl->sl_bytes = cpu_to_be32(size); + uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); + dsl->sl_owner = cpu_to_be64(ino); + dsl->sl_blkno = cpu_to_be64(bp->b_bn); + bp->b_ops = &xfs_symlink_buf_ops; + + return sizeof(struct xfs_dsymlink_hdr); +} + +/* + * Checking of the symlink header is split into two parts. the verifier does + * CRC, location and bounds checking, the unpacking function checks the path + * parameters and owner. + */ +bool +xfs_symlink_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (offset != be32_to_cpu(dsl->sl_offset)) + return false; + if (size != be32_to_cpu(dsl->sl_bytes)) + return false; + if (ino != be64_to_cpu(dsl->sl_owner)) + return false; + + /* ok */ + return true; + +} + +static bool +xfs_symlink_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) + return false; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) + return false; + if (be32_to_cpu(dsl->sl_offset) + + be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) + return false; + if (dsl->sl_owner == 0) + return false; + + return true; +} + +static void +xfs_symlink_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + !xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_symlink_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)); +} + +const struct xfs_buf_ops xfs_symlink_buf_ops = { + .verify_read = xfs_symlink_read_verify, + .verify_write = xfs_symlink_write_verify, +}; + + +/* ----- Kernel only functions below ----- */ +STATIC int +xfs_readlink_bmap( + struct xfs_inode *ip, + char *link) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; + struct xfs_buf *bp; + xfs_daddr_t d; + char *cur_chunk; + int pathlen = ip->i_d.di_size; + int nmaps = XFS_SYMLINK_MAPS; + int byte_cnt; + int n; + int error = 0; + int fsblocks = 0; + int offset; + + fsblocks = xfs_symlink_blocks(mp, pathlen); + error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0); + if (error) + goto out; + + offset = 0; + for (n = 0; n < nmaps; n++) { + d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); + byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); + + bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, + &xfs_symlink_buf_ops); + if (!bp) + return XFS_ERROR(ENOMEM); + error = bp->b_error; + if (error) { + xfs_buf_ioerror_alert(bp, __func__); + xfs_buf_relse(bp); + goto out; + } + byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); + if (pathlen < byte_cnt) + byte_cnt = pathlen; + + cur_chunk = bp->b_addr; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!xfs_symlink_hdr_ok(mp, ip->i_ino, offset, + byte_cnt, bp)) { + error = EFSCORRUPTED; + xfs_alert(mp, +"symlink header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", + offset, byte_cnt, ip->i_ino); + xfs_buf_relse(bp); + goto out; + + } + + cur_chunk += sizeof(struct xfs_dsymlink_hdr); + } + + memcpy(link + offset, bp->b_addr, byte_cnt); + + pathlen -= byte_cnt; + offset += byte_cnt; + + xfs_buf_relse(bp); + } + ASSERT(pathlen == 0); + + link[ip->i_d.di_size] = '\0'; + error = 0; + + out: + return error; +} + +int +xfs_readlink( + struct xfs_inode *ip, + char *link) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fsize_t pathlen; + int error = 0; + + trace_xfs_readlink(ip); + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + xfs_ilock(ip, XFS_ILOCK_SHARED); + + pathlen = ip->i_d.di_size; + if (!pathlen) + goto out; + + if (pathlen < 0 || pathlen > MAXPATHLEN) { + xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", + __func__, (unsigned long long) ip->i_ino, + (long long) pathlen); + ASSERT(0); + error = XFS_ERROR(EFSCORRUPTED); + goto out; + } + + + if (ip->i_df.if_flags & XFS_IFINLINE) { + memcpy(link, ip->i_df.if_u1.if_data, pathlen); + link[pathlen] = '\0'; + } else { + error = xfs_readlink_bmap(ip, link); + } + + out: + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return error; +} + +int +xfs_symlink( + struct xfs_inode *dp, + struct xfs_name *link_name, + const char *target_path, + umode_t mode, + struct xfs_inode **ipp) +{ + struct xfs_mount *mp = dp->i_mount; + struct xfs_trans *tp = NULL; + struct xfs_inode *ip = NULL; + int error = 0; + int pathlen; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + bool unlock_dp_on_error = false; + uint cancel_flags; + int committed; + xfs_fileoff_t first_fsb; + xfs_filblks_t fs_blocks; + int nmaps; + struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; + xfs_daddr_t d; + const char *cur_chunk; + int byte_cnt; + int n; + xfs_buf_t *bp; + prid_t prid; + struct xfs_dquot *udqp, *gdqp; + uint resblks; + + *ipp = NULL; + + trace_xfs_symlink(dp, link_name); + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + /* + * Check component lengths of the target path name. + */ + pathlen = strlen(target_path); + if (pathlen >= MAXPATHLEN) /* total string too long */ + return XFS_ERROR(ENAMETOOLONG); + + udqp = gdqp = NULL; + if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) + prid = xfs_get_projid(dp); + else + prid = XFS_PROJID_DEFAULT; + + /* + * Make sure that we have allocated dquot(s) on disk. + */ + error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, + XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); + if (error) + goto std_return; + + tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; + /* + * The symlink will fit into the inode data fork? + * There can't be any attributes so we get the whole variable part. + */ + if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) + fs_blocks = 0; + else + fs_blocks = XFS_B_TO_FSB(mp, pathlen); + resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); + error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); + if (error == ENOSPC && fs_blocks == 0) { + resblks = 0; + error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); + } + if (error) { + cancel_flags = 0; + goto error_return; + } + + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + unlock_dp_on_error = true; + + /* + * Check whether the directory allows new symlinks or not. + */ + if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { + error = XFS_ERROR(EPERM); + goto error_return; + } + + /* + * Reserve disk quota : blocks and inode. + */ + error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0); + if (error) + goto error_return; + + /* + * Check for ability to enter directory entry, if no space reserved. + */ + error = xfs_dir_canenter(tp, dp, link_name, resblks); + if (error) + goto error_return; + /* + * Initialize the bmap freelist prior to calling either + * bmapi or the directory create code. + */ + xfs_bmap_init(&free_list, &first_block); + + /* + * Allocate an inode for the symlink. + */ + error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, + prid, resblks > 0, &ip, NULL); + if (error) { + if (error == ENOSPC) + goto error_return; + goto error1; + } + + /* + * An error after we've joined dp to the transaction will result in the + * transaction cancel unlocking dp so don't do it explicitly in the + * error path. + */ + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + unlock_dp_on_error = false; + + /* + * Also attach the dquot(s) to it, if applicable. + */ + xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp); + + if (resblks) + resblks -= XFS_IALLOC_SPACE_RES(mp); + /* + * If the symlink will fit into the inode, write it inline. + */ + if (pathlen <= XFS_IFORK_DSIZE(ip)) { + xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); + memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); + ip->i_d.di_size = pathlen; + + /* + * The inode was initially created in extent format. + */ + ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); + ip->i_df.if_flags |= XFS_IFINLINE; + + ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; + xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); + + } else { + int offset; + + first_fsb = 0; + nmaps = XFS_SYMLINK_MAPS; + + error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, + XFS_BMAPI_METADATA, &first_block, resblks, + mval, &nmaps, &free_list); + if (error) + goto error2; + + if (resblks) + resblks -= fs_blocks; + ip->i_d.di_size = pathlen; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + cur_chunk = target_path; + offset = 0; + for (n = 0; n < nmaps; n++) { + char *buf; + + d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); + byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, + BTOBB(byte_cnt), 0); + if (!bp) { + error = ENOMEM; + goto error2; + } + bp->b_ops = &xfs_symlink_buf_ops; + + byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); + if (pathlen < byte_cnt) { + byte_cnt = pathlen; + } + + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, + byte_cnt, bp); + + memcpy(buf, cur_chunk, byte_cnt); + + cur_chunk += byte_cnt; + pathlen -= byte_cnt; + offset += byte_cnt; + + xfs_trans_log_buf(tp, bp, 0, + (buf + byte_cnt) - (char *)bp->b_addr); + } + } + + /* + * Create the directory entry for the symlink. + */ + error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, + &first_block, &free_list, resblks); + if (error) + goto error2; + xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); + + /* + * If this is a synchronous mount, make sure that the + * symlink transaction goes to disk before returning to + * the user. + */ + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { + xfs_trans_set_sync(tp); + } + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) { + goto error2; + } + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_qm_dqrele(udqp); + xfs_qm_dqrele(gdqp); + + *ipp = ip; + return 0; + + error2: + IRELE(ip); + error1: + xfs_bmap_cancel(&free_list); + cancel_flags |= XFS_TRANS_ABORT; + error_return: + xfs_trans_cancel(tp, cancel_flags); + xfs_qm_dqrele(udqp); + xfs_qm_dqrele(gdqp); + + if (unlock_dp_on_error) + xfs_iunlock(dp, XFS_ILOCK_EXCL); + std_return: + return error; +} + +/* + * Free a symlink that has blocks associated with it. + */ +int +xfs_inactive_symlink_rmt( + xfs_inode_t *ip, + xfs_trans_t **tpp) +{ + xfs_buf_t *bp; + int committed; + int done; + int error; + xfs_fsblock_t first_block; + xfs_bmap_free_t free_list; + int i; + xfs_mount_t *mp; + xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; + int nmaps; + xfs_trans_t *ntp; + int size; + xfs_trans_t *tp; + + tp = *tpp; + mp = ip->i_mount; + ASSERT(ip->i_d.di_size > XFS_IFORK_DSIZE(ip)); + /* + * We're freeing a symlink that has some + * blocks allocated to it. Free the + * blocks here. We know that we've got + * either 1 or 2 extents and that we can + * free them all in one bunmapi call. + */ + ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); + + /* + * Lock the inode, fix the size, and join it to the transaction. + * Hold it so in the normal path, we still have it locked for + * the second transaction. In the error paths we need it + * held so the cancel won't rele it, see below. + */ + size = (int)ip->i_d.di_size; + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* + * Find the block(s) so we can inval and unmap them. + */ + done = 0; + xfs_bmap_init(&free_list, &first_block); + nmaps = ARRAY_SIZE(mval); + error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), + mval, &nmaps, 0); + if (error) + goto error0; + /* + * Invalidate the block(s). No validation is done. + */ + for (i = 0; i < nmaps; i++) { + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), + XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); + if (!bp) { + error = ENOMEM; + goto error1; + } + xfs_trans_binval(tp, bp); + } + /* + * Unmap the dead block(s) to the free_list. + */ + if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, + &first_block, &free_list, &done))) + goto error1; + ASSERT(done); + /* + * Commit the first transaction. This logs the EFI and the inode. + */ + if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) + goto error1; + /* + * The transaction must have been committed, since there were + * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. + * The new tp has the extent freeing and EFDs. + */ + ASSERT(committed); + /* + * The first xact was committed, so add the inode to the new one. + * Mark it dirty so it will be logged and moved forward in the log as + * part of every commit. + */ + xfs_trans_ijoin(tp, ip, 0); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* + * Get a new, empty transaction to return to our caller. + */ + ntp = xfs_trans_dup(tp); + /* + * Commit the transaction containing extent freeing and EFDs. + * If we get an error on the commit here or on the reserve below, + * we need to unlock the inode since the new transaction doesn't + * have the inode attached. + */ + error = xfs_trans_commit(tp, 0); + tp = ntp; + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error0; + } + /* + * transaction commit worked ok so we can drop the extra ticket + * reference that we gained in xfs_trans_dup() + */ + xfs_log_ticket_put(tp->t_ticket); + + /* + * Remove the memory for extent descriptions (just bookkeeping). + */ + if (ip->i_df.if_bytes) + xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); + ASSERT(ip->i_df.if_bytes == 0); + /* + * Put an itruncate log reservation in the new transaction + * for our caller. + */ + if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error0; + } + + xfs_trans_ijoin(tp, ip, 0); + *tpp = tp; + return 0; + + error1: + xfs_bmap_cancel(&free_list); + error0: + return error; +} diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h new file mode 100644 index 0000000..bb21e6a --- /dev/null +++ b/fs/xfs/xfs_symlink.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. All rights reserved. + */ +#ifndef __XFS_SYMLINK_H +#define __XFS_SYMLINK_H 1 + +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. + */ +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); + +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + +#ifdef __KERNEL__ + +int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, + const char *target_path, umode_t mode, struct xfs_inode **ipp); +int xfs_readlink(struct xfs_inode *ip, char *link); +int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); + +#endif /* __KERNEL__ */ +#endif /* __XFS_SYMLINK_H */ diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index aa0c066..1034440 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2012 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -48,103 +49,10 @@ #include "xfs_vnodeops.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_symlink.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" -/* - * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 2 extents back from - * bmapi. - */ -#define SYMLINK_MAPS 2 - -STATIC int -xfs_readlink_bmap( - xfs_inode_t *ip, - char *link) -{ - xfs_mount_t *mp = ip->i_mount; - int pathlen = ip->i_d.di_size; - int nmaps = SYMLINK_MAPS; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - xfs_daddr_t d; - int byte_cnt; - int n; - xfs_buf_t *bp; - int error = 0; - - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, pathlen), mval, &nmaps, - 0); - if (error) - goto out; - - for (n = 0; n < nmaps; n++) { - d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); - byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); - - bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, NULL); - if (!bp) - return XFS_ERROR(ENOMEM); - error = bp->b_error; - if (error) { - xfs_buf_ioerror_alert(bp, __func__); - xfs_buf_relse(bp); - goto out; - } - if (pathlen < byte_cnt) - byte_cnt = pathlen; - pathlen -= byte_cnt; - - memcpy(link, bp->b_addr, byte_cnt); - xfs_buf_relse(bp); - } - - link[ip->i_d.di_size] = '\0'; - error = 0; - - out: - return error; -} - -int -xfs_readlink( - xfs_inode_t *ip, - char *link) -{ - xfs_mount_t *mp = ip->i_mount; - xfs_fsize_t pathlen; - int error = 0; - - trace_xfs_readlink(ip); - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - xfs_ilock(ip, XFS_ILOCK_SHARED); - - pathlen = ip->i_d.di_size; - if (!pathlen) - goto out; - - if (pathlen < 0 || pathlen > MAXPATHLEN) { - xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", - __func__, (unsigned long long) ip->i_ino, - (long long) pathlen); - ASSERT(0); - error = XFS_ERROR(EFSCORRUPTED); - goto out; - } - - - if (ip->i_df.if_flags & XFS_IFINLINE) { - memcpy(link, ip->i_df.if_u1.if_data, pathlen); - link[pathlen] = '\0'; - } else { - error = xfs_readlink_bmap(ip, link); - } - - out: - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return error; -} /* * This is called by xfs_inactive to free any blocks beyond eof @@ -249,145 +157,6 @@ xfs_free_eofblocks( return error; } -/* - * Free a symlink that has blocks associated with it. - */ -STATIC int -xfs_inactive_symlink_rmt( - xfs_inode_t *ip, - xfs_trans_t **tpp) -{ - xfs_buf_t *bp; - int committed; - int done; - int error; - xfs_fsblock_t first_block; - xfs_bmap_free_t free_list; - int i; - xfs_mount_t *mp; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - int nmaps; - xfs_trans_t *ntp; - int size; - xfs_trans_t *tp; - - tp = *tpp; - mp = ip->i_mount; - ASSERT(ip->i_d.di_size > XFS_IFORK_DSIZE(ip)); - /* - * We're freeing a symlink that has some - * blocks allocated to it. Free the - * blocks here. We know that we've got - * either 1 or 2 extents and that we can - * free them all in one bunmapi call. - */ - ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); - - /* - * Lock the inode, fix the size, and join it to the transaction. - * Hold it so in the normal path, we still have it locked for - * the second transaction. In the error paths we need it - * held so the cancel won't rele it, see below. - */ - size = (int)ip->i_d.di_size; - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - /* - * Find the block(s) so we can inval and unmap them. - */ - done = 0; - xfs_bmap_init(&free_list, &first_block); - nmaps = ARRAY_SIZE(mval); - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, size), - mval, &nmaps, 0); - if (error) - goto error0; - /* - * Invalidate the block(s). - */ - for (i = 0; i < nmaps; i++) { - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), - XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); - if (!bp) { - error = ENOMEM; - goto error1; - } - xfs_trans_binval(tp, bp); - } - /* - * Unmap the dead block(s) to the free_list. - */ - if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, &done))) - goto error1; - ASSERT(done); - /* - * Commit the first transaction. This logs the EFI and the inode. - */ - if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) - goto error1; - /* - * The transaction must have been committed, since there were - * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. - * The new tp has the extent freeing and EFDs. - */ - ASSERT(committed); - /* - * The first xact was committed, so add the inode to the new one. - * Mark it dirty so it will be logged and moved forward in the log as - * part of every commit. - */ - xfs_trans_ijoin(tp, ip, 0); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - /* - * Get a new, empty transaction to return to our caller. - */ - ntp = xfs_trans_dup(tp); - /* - * Commit the transaction containing extent freeing and EFDs. - * If we get an error on the commit here or on the reserve below, - * we need to unlock the inode since the new transaction doesn't - * have the inode attached. - */ - error = xfs_trans_commit(tp, 0); - tp = ntp; - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - /* - * transaction commit worked ok so we can drop the extra ticket - * reference that we gained in xfs_trans_dup() - */ - xfs_log_ticket_put(tp->t_ticket); - - /* - * Remove the memory for extent descriptions (just bookkeeping). - */ - if (ip->i_df.if_bytes) - xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); - ASSERT(ip->i_df.if_bytes == 0); - /* - * Put an itruncate log reservation in the new transaction - * for our caller. - */ - if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - - xfs_trans_ijoin(tp, ip, 0); - *tpp = tp; - return 0; - - error1: - xfs_bmap_cancel(&free_list); - error0: - return error; -} - int xfs_release( xfs_inode_t *ip) @@ -1353,247 +1122,6 @@ xfs_link( } int -xfs_symlink( - xfs_inode_t *dp, - struct xfs_name *link_name, - const char *target_path, - umode_t mode, - xfs_inode_t **ipp) -{ - xfs_mount_t *mp = dp->i_mount; - xfs_trans_t *tp; - xfs_inode_t *ip; - int error; - int pathlen; - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - bool unlock_dp_on_error = false; - uint cancel_flags; - int committed; - xfs_fileoff_t first_fsb; - xfs_filblks_t fs_blocks; - int nmaps; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - xfs_daddr_t d; - const char *cur_chunk; - int byte_cnt; - int n; - xfs_buf_t *bp; - prid_t prid; - struct xfs_dquot *udqp, *gdqp; - uint resblks; - - *ipp = NULL; - error = 0; - ip = NULL; - tp = NULL; - - trace_xfs_symlink(dp, link_name); - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - /* - * Check component lengths of the target path name. - */ - pathlen = strlen(target_path); - if (pathlen >= MAXPATHLEN) /* total string too long */ - return XFS_ERROR(ENAMETOOLONG); - - udqp = gdqp = NULL; - if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) - prid = xfs_get_projid(dp); - else - prid = XFS_PROJID_DEFAULT; - - /* - * Make sure that we have allocated dquot(s) on disk. - */ - error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, - XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); - if (error) - goto std_return; - - tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; - /* - * The symlink will fit into the inode data fork? - * There can't be any attributes so we get the whole variable part. - */ - if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) - fs_blocks = 0; - else - fs_blocks = XFS_B_TO_FSB(mp, pathlen); - resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); - error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); - if (error == ENOSPC && fs_blocks == 0) { - resblks = 0; - error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); - } - if (error) { - cancel_flags = 0; - goto error_return; - } - - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); - unlock_dp_on_error = true; - - /* - * Check whether the directory allows new symlinks or not. - */ - if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { - error = XFS_ERROR(EPERM); - goto error_return; - } - - /* - * Reserve disk quota : blocks and inode. - */ - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0); - if (error) - goto error_return; - - /* - * Check for ability to enter directory entry, if no space reserved. - */ - error = xfs_dir_canenter(tp, dp, link_name, resblks); - if (error) - goto error_return; - /* - * Initialize the bmap freelist prior to calling either - * bmapi or the directory create code. - */ - xfs_bmap_init(&free_list, &first_block); - - /* - * Allocate an inode for the symlink. - */ - error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, - prid, resblks > 0, &ip, NULL); - if (error) { - if (error == ENOSPC) - goto error_return; - goto error1; - } - - /* - * An error after we've joined dp to the transaction will result in the - * transaction cancel unlocking dp so don't do it explicitly in the - * error path. - */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); - unlock_dp_on_error = false; - - /* - * Also attach the dquot(s) to it, if applicable. - */ - xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp); - - if (resblks) - resblks -= XFS_IALLOC_SPACE_RES(mp); - /* - * If the symlink will fit into the inode, write it inline. - */ - if (pathlen <= XFS_IFORK_DSIZE(ip)) { - xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); - memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); - ip->i_d.di_size = pathlen; - - /* - * The inode was initially created in extent format. - */ - ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); - ip->i_df.if_flags |= XFS_IFINLINE; - - ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; - xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); - - } else { - first_fsb = 0; - nmaps = SYMLINK_MAPS; - - error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, - XFS_BMAPI_METADATA, &first_block, resblks, - mval, &nmaps, &free_list); - if (error) - goto error2; - - if (resblks) - resblks -= fs_blocks; - ip->i_d.di_size = pathlen; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - - cur_chunk = target_path; - for (n = 0; n < nmaps; n++) { - d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); - byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, - BTOBB(byte_cnt), 0); - if (!bp) { - error = ENOMEM; - goto error2; - } - if (pathlen < byte_cnt) { - byte_cnt = pathlen; - } - pathlen -= byte_cnt; - - memcpy(bp->b_addr, cur_chunk, byte_cnt); - cur_chunk += byte_cnt; - - xfs_trans_log_buf(tp, bp, 0, byte_cnt - 1); - } - } - - /* - * Create the directory entry for the symlink. - */ - error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, - &first_block, &free_list, resblks); - if (error) - goto error2; - xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - - /* - * If this is a synchronous mount, make sure that the - * symlink transaction goes to disk before returning to - * the user. - */ - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { - xfs_trans_set_sync(tp); - } - - error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) { - goto error2; - } - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - - *ipp = ip; - return 0; - - error2: - IRELE(ip); - error1: - xfs_bmap_cancel(&free_list); - cancel_flags |= XFS_TRANS_ABORT; - error_return: - xfs_trans_cancel(tp, cancel_flags); - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - - if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); - std_return: - return error; -} - -int xfs_set_dmattrs( xfs_inode_t *ip, u_int evmask, -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:26:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 53D9F7F7B for ; Mon, 21 Jan 2013 07:26:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4314F304032 for ; Mon, 21 Jan 2013 05:26:29 -0800 (PST) X-ASG-Debug-ID: 1358774785-04cbb00c6442c80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id kQBUAl3pXE2FCc9T for ; Mon, 21 Jan 2013 05:26:26 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAKBB/VB5LETJ/2dsb2JhbAA8CL4qF3OCHgEBBScvMwgYMTkDGxmIGKwujnCNDYQsA4tSkCVviW+DCYFUJA Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Jan 2013 23:56:24 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHOJ-0001LI-W1 for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:24 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHNz-0005je-Te for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:26:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfs: add version 3 inode format with CRCs Date: Tue, 22 Jan 2013 00:25:58 +1100 X-ASG-Orig-Subj: [PATCH 7/9] xfs: add version 3 inode format with CRCs Message-Id: <1358774760-21841-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358774760-21841-1-git-send-email-david@fromorbit.com> References: <1358774760-21841-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358774785 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.2.120485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add a new inode version with a larger core. The primary objective is to allow for a crc of the inode, and location information (uuid and ino) to verify it was written in the right place. We also extend it by: a creation time (for Samba); a changecount (for NFSv4); a flush sequence (in LSN format for recovery); an additional inode flags field; and some additional padding. These additional fields are not implemented yet, but already laid out in the structure. [dchinner@redhat.com] Added LSN and flags field, some factoring and rework to capture all the necessary information in the crc calculation. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_dinode.h | 33 +++++++-- fs/xfs/xfs_ialloc.c | 23 +++++- fs/xfs/xfs_inode.c | 179 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_inode.h | 26 +++++++ fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_log_recover.c | 34 +++++++-- fs/xfs/xfs_trans_buf.c | 5 +- 8 files changed, 236 insertions(+), 70 deletions(-) diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index c256606..abae8c8 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -48,6 +48,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) +#define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -56,7 +57,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF) + XFS_BLF_AGI_BUF | \ + XFS_BLF_DINO_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 6b5bd17..bdc946a 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -19,7 +19,7 @@ #define __XFS_DINODE_H__ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) +#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ @@ -70,11 +70,36 @@ typedef struct xfs_dinode { /* di_next_unlinked is the only non-core field in the old dinode */ __be32 di_next_unlinked;/* agi unlinked list ptr */ -} __attribute__((packed)) xfs_dinode_t; + + /* start of the extended dinode, writable fields */ + __be32 di_crc; /* CRC of the inode */ + __be64 di_changecount; /* number of attribute changes */ + __be64 di_lsn; /* flush sequence */ + __be64 di_flags2; /* more random flags */ + __u8 di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + __be64 di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode_t; #define DI_MAX_FLUSH 0xffff /* + * Size of the core inode on disk. Version 1 and 2 inodes have + * the same size, but version 3 has grown a few additional fields. + */ +static inline uint xfs_dinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_dinode); + return offsetof(struct xfs_dinode, di_crc); +} + +/* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. * Since the pathconf interface is signed, we use 2^31 - 1 instead. * The old inode format had a 16 bit link count, so its maximum is USHRT_MAX. @@ -105,7 +130,7 @@ typedef enum xfs_dinode_fmt { * Inode size for given fs. */ #define XFS_LITINO(mp, version) \ - ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) #define XFS_BROOT_SIZE_ADJ(ip) \ (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) @@ -133,7 +158,7 @@ typedef enum xfs_dinode_fmt { * Return pointers to the data or attribute forks. */ #define XFS_DFORK_DPTR(dip) \ - ((char *)(dip) + sizeof(struct xfs_dinode)) + ((char *)dip + xfs_dinode_size(dip->di_version)) #define XFS_DFORK_APTR(dip) \ (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 41c76d6..25e4c17 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -167,6 +167,7 @@ xfs_ialloc_inode_init( int version; int i, j; xfs_daddr_t d; + xfs_ino_t ino = 0; /* * Loop over the new block(s), filling in the inodes. @@ -190,8 +191,18 @@ xfs_ialloc_inode_init( * the new inode format, then use the new inode version. Otherwise * use the old version so that old kernels will continue to be * able to use the file system. + * + * For v3 inodes, we also need to write the inode number into the inode, + * so calculate the first inode number of the chunk here as + * XFS_OFFBNO_TO_AGINO() only works on filesystem block boundaries, not + * cluster boundaries and so cannot be used in the cluster buffer loop + * below. */ - if (xfs_sb_version_hasnlink(&mp->m_sb)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + version = 3; + ino = XFS_AGINO_TO_INO(mp, agno, + XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); + } else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; else version = 1; @@ -217,13 +228,21 @@ xfs_ialloc_inode_init( xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); for (i = 0; i < ninodes; i++) { int ioffset = i << mp->m_sb.sb_inodelog; - uint isize = sizeof(struct xfs_dinode); + uint isize = xfs_dinode_size(version); free = xfs_make_iptr(mp, fbuf, i); free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); free->di_version = version; free->di_gen = cpu_to_be32(gen); free->di_next_unlinked = cpu_to_be32(NULLAGINO); + + if (version == 3) { + free->di_ino = cpu_to_be64(ino); + ino++; + uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); + xfs_dinode_calc_crc(mp, free); + } + xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); } xfs_trans_inode_alloc_buf(tp, fbuf); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 202ce37..558ef49 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -44,6 +44,7 @@ #include "xfs_quota.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" +#include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" @@ -866,6 +867,17 @@ xfs_dinode_from_disk( to->di_dmstate = be16_to_cpu(from->di_dmstate); to->di_flags = be16_to_cpu(from->di_flags); to->di_gen = be32_to_cpu(from->di_gen); + + if (to->di_version == 3) { + to->di_changecount = be64_to_cpu(from->di_changecount); + to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); + to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); + to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_ino = be64_to_cpu(from->di_ino); + to->di_lsn = be64_to_cpu(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + uuid_copy(&to->di_uuid, &from->di_uuid); + } } void @@ -902,6 +914,17 @@ xfs_dinode_to_disk( to->di_dmstate = cpu_to_be16(from->di_dmstate); to->di_flags = cpu_to_be16(from->di_flags); to->di_gen = cpu_to_be32(from->di_gen); + + if (from->di_version == 3) { + to->di_changecount = cpu_to_be64(from->di_changecount); + to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); + to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); + to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_ino = cpu_to_be64(from->di_ino); + to->di_lsn = cpu_to_be64(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + uuid_copy(&to->di_uuid, &from->di_uuid); + } } STATIC uint @@ -962,6 +985,47 @@ xfs_dic2xflags( (XFS_DFORK_Q(dip) ? XFS_XFLAG_HASATTR : 0); } +static bool +xfs_dinode_verify( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) + return false; + + /* only version 3 or greater inodes are extensively verified here */ + if (dip->di_version < 3) + return true; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc))) + return false; + if (be64_to_cpu(dip->di_ino) != ip->i_ino) + return false; + if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) + return false; + return true; +} + +void +xfs_dinode_calc_crc( + struct xfs_mount *mp, + struct xfs_dinode *dip) +{ + __uint32_t crc; + + if (dip->di_version < 3) + return; + + ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); + crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc)); + dip->di_crc = xfs_end_cksum(crc); +} + /* * Read the disk inode attributes into the in-core inode structure. */ @@ -990,17 +1054,13 @@ xfs_iread( if (error) return error; - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) { -#ifdef DEBUG - xfs_alert(mp, - "%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)", - __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); + /* even unallocated inodes are verified */ + if (!xfs_dinode_verify(mp, ip, dip)) { + xfs_alert(mp, "%s: validation failed for inode %lld failed", + __func__, ip->i_ino); + + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); + error = XFS_ERROR(EFSCORRUPTED); goto out_brelse; } @@ -1022,10 +1082,20 @@ xfs_iread( goto out_brelse; } } else { + /* + * Partial initialisation of the in-core inode. Just the bits + * that xfs_ialloc won't overwrite or relies on being correct. + */ ip->i_d.di_magic = be16_to_cpu(dip->di_magic); ip->i_d.di_version = dip->di_version; ip->i_d.di_gen = be32_to_cpu(dip->di_gen); ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); + + if (dip->di_version == 3) { + ip->i_d.di_ino = be64_to_cpu(dip->di_ino); + uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); + } + /* * Make sure to pull in the mode here as well in * case the inode is released without being used. @@ -1161,6 +1231,7 @@ xfs_ialloc( xfs_buf_t **ialloc_context, xfs_inode_t **ipp) { + struct xfs_mount *mp = tp->t_mountp; xfs_ino_t ino; xfs_inode_t *ip; uint flags; @@ -1187,7 +1258,7 @@ xfs_ialloc( * This is because we're setting fields here we need * to prevent others from looking at until we're done. */ - error = xfs_iget(tp->t_mountp, tp, ino, XFS_IGET_CREATE, + error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip); if (error) return error; @@ -1208,7 +1279,7 @@ xfs_ialloc( * the inode version number now. This way we only do the conversion * here rather than here and in the flush/logging code. */ - if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) && + if (xfs_sb_version_hasnlink(&mp->m_sb) && ip->i_d.di_version == 1) { ip->i_d.di_version = 2; /* @@ -1258,6 +1329,19 @@ xfs_ialloc( ip->i_d.di_dmevmask = 0; ip->i_d.di_dmstate = 0; ip->i_d.di_flags = 0; + + if (ip->i_d.di_version == 3) { + ASSERT(ip->i_d.di_ino == ino); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + 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; + } + + flags = XFS_ILOG_CORE; switch (mode & S_IFMT) { case S_IFIFO: @@ -2716,20 +2800,18 @@ abort_out: STATIC int xfs_iflush_int( - xfs_inode_t *ip, - xfs_buf_t *bp) + struct xfs_inode *ip, + struct xfs_buf *bp) { - xfs_inode_log_item_t *iip; - xfs_dinode_t *dip; - xfs_mount_t *mp; + struct xfs_inode_log_item *iip = ip->i_itemp; + struct xfs_dinode *dip; + struct xfs_mount *mp = ip->i_mount; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); ASSERT(xfs_isiflocked(ip)); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK)); - - iip = ip->i_itemp; - mp = ip->i_mount; + ASSERT(iip != NULL && iip->ili_fields != 0); /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); @@ -2790,9 +2872,9 @@ xfs_iflush_int( } /* * bump the flush iteration count, used to detect flushes which - * postdate a log record during recovery. + * postdate a log record during recovery. This is redundant as we now + * log every change and hence this can't happen. Still, it doesn't hurt. */ - ip->i_d.di_flushiter++; /* @@ -2868,41 +2950,30 @@ xfs_iflush_int( * need the AIL lock, because it is a 64 bit value that cannot be read * atomically. */ - if (iip != NULL && iip->ili_fields != 0) { - iip->ili_last_fields = iip->ili_fields; - iip->ili_fields = 0; - iip->ili_logged = 1; + iip->ili_last_fields = iip->ili_fields; + iip->ili_fields = 0; + iip->ili_logged = 1; - xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, - &iip->ili_item.li_lsn); + xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, + &iip->ili_item.li_lsn); - /* - * Attach the function xfs_iflush_done to the inode's - * buffer. This will remove the inode from the AIL - * and unlock the inode's flush lock when the inode is - * completely written to disk. - */ - xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); + /* + * Attach the function xfs_iflush_done to the inode's + * buffer. This will remove the inode from the AIL + * and unlock the inode's flush lock when the inode is + * completely written to disk. + */ + xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); - ASSERT(bp->b_fspriv != NULL); - ASSERT(bp->b_iodone != NULL); - } else { - /* - * We're flushing an inode which is not in the AIL and has - * not been logged. For this case we can immediately drop - * the inode flush lock because we can avoid the whole - * AIL state thing. It's OK to drop the flush lock now, - * because we've already locked the buffer and to do anything - * you really need both. - */ - if (iip != NULL) { - ASSERT(iip->ili_logged == 0); - ASSERT(iip->ili_last_fields == 0); - ASSERT((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0); - } - xfs_ifunlock(ip); - } + /* update the lsn in the on disk inode if required */ + if (ip->i_d.di_version == 3) + dip->di_lsn = cpu_to_be64(iip->ili_item.li_lsn); + + /* generate the checksum. */ + xfs_dinode_calc_crc(mp, dip); + ASSERT(bp->b_fspriv != NULL); + ASSERT(bp->b_iodone != NULL); return 0; corrupt_out: diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 440bdb0..3ba0c4b 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -150,13 +150,38 @@ typedef struct xfs_icdinode { __uint16_t di_dmstate; /* DMIG state info */ __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint32_t di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __uint32_t di_crc; /* CRC of the inode */ + __uint64_t di_changecount; /* number of attribute changes */ + xfs_lsn_t di_lsn; /* flush sequence */ + __uint64_t di_flags2; /* more random flags */ + __uint8_t di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_ictimestamp_t di_crtime; /* time created */ + xfs_ino_t di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; +static inline uint xfs_icdinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_icdinode); + return offsetof(struct xfs_icdinode, di_next_unlinked); +} + /* * Flags for xfs_ichgtime(). */ #define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ /* * Per-fork incore inode flags. @@ -555,6 +580,7 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index f034bd1..f76ff52 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -179,7 +179,7 @@ xfs_inode_item_format( nvecs = 1; vecp->i_addr = &ip->i_d; - vecp->i_len = sizeof(struct xfs_icdinode); + vecp->i_len = xfs_icdinode_size(ip->i_d.di_version); vecp->i_type = XLOG_REG_TYPE_ICORE; vecp++; nvecs++; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 5794875..0d786c9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1787,6 +1787,7 @@ xlog_recover_do_inode_buffer( xfs_agino_t *buffer_nextp; trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); + bp->b_ops = &xfs_inode_buf_ops; inodes_per_buf = BBTOB(bp->b_io_length) >> mp->m_sb.sb_inodelog; for (i = 0; i < inodes_per_buf; i++) { @@ -1931,6 +1932,9 @@ xlog_recover_do_reg_buffer( /* Shouldn't be any more regions */ ASSERT(i == item->ri_total); + /* Shouldn't be any more regions */ + ASSERT(i == item->ri_total); + switch (buf_f->blf_flags & XFS_BLF_TYPE_MASK) { case XFS_BLF_BTREE_BUF: switch (be32_to_cpu(*(__be32 *)bp->b_addr)) { @@ -1984,6 +1988,17 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_dquot_buf_ops; break; + case XFS_BLF_DINO_BUF: + /* + * we get here with inode allocation buffers, not buffers that + * track unlinked list changes. + */ + if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DINODE_MAGIC)) { + xfs_warn(mp, "Bad INODE block magic!"); + ASSERT(0); + } + bp->b_ops = &xfs_inode_buf_ops; + break; default: break; } @@ -2272,6 +2287,7 @@ xlog_recover_inode_pass2( int attr_index; uint fields; xfs_icdinode_t *dicp; + uint isize; int need_free = 0; if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) { @@ -2297,7 +2313,7 @@ xlog_recover_inode_pass2( trace_xfs_log_recover_inode_recover(log, in_f); bp = xfs_buf_read(mp->m_ddev_targp, in_f->ilf_blkno, in_f->ilf_len, 0, - NULL); + &xfs_inode_buf_ops); if (!bp) { error = ENOMEM; goto error; @@ -2408,7 +2424,8 @@ xlog_recover_inode_pass2( error = EFSCORRUPTED; goto error; } - if (unlikely(item->ri_buf[1].i_len > sizeof(struct xfs_icdinode))) { + isize = xfs_icdinode_size(dicp->di_version); + if (unlikely(item->ri_buf[1].i_len > isize)) { XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); @@ -2420,13 +2437,13 @@ xlog_recover_inode_pass2( } /* The core is in in-core format */ - xfs_dinode_to_disk(dip, item->ri_buf[1].i_addr); + xfs_dinode_to_disk(dip, dicp); /* the rest is in on-disk format */ - if (item->ri_buf[1].i_len > sizeof(struct xfs_icdinode)) { - memcpy((xfs_caddr_t) dip + sizeof(struct xfs_icdinode), - item->ri_buf[1].i_addr + sizeof(struct xfs_icdinode), - item->ri_buf[1].i_len - sizeof(struct xfs_icdinode)); + if (item->ri_buf[1].i_len > isize) { + memcpy((char *)dip + isize, + item->ri_buf[1].i_addr + isize, + item->ri_buf[1].i_len - isize); } fields = in_f->ilf_fields; @@ -2510,6 +2527,9 @@ xlog_recover_inode_pass2( } write_inode_buffer: + /* re-generate the checksum. */ + xfs_dinode_calc_crc(log->l_mp, dip); + ASSERT(bp->b_target->bt_mount == mp); bp->b_iodone = xlog_recover_iodone; xfs_buf_delwri_queue(bp, buffer_list); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index f950edd..8a0f6af 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -704,12 +704,13 @@ xfs_trans_inode_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* * This call is used to indicate that the buffer is going to * be staled and was an inode buffer. This means it gets - * special processing during unpin - where any inodes + * special processing during unpin - where any inodes * associated with the buffer should be removed from ail. * There is also special processing during recovery, * any replay of the inodes in the buffer needs to be @@ -728,6 +729,7 @@ xfs_trans_stale_inode_buf( bip->bli_flags |= XFS_BLI_STALE_INODE; bip->bli_item.li_cb = xfs_buf_iodone; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* @@ -751,6 +753,7 @@ xfs_trans_inode_alloc_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* -- 1.7.10 From stan@hardwarefreak.com Mon Jan 21 07:38:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7E2DF7F4A for ; Mon, 21 Jan 2013 07:38:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D54B8F8039 for ; Mon, 21 Jan 2013 05:38:15 -0800 (PST) X-ASG-Debug-ID: 1358775493-04bdf0231b44e50001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id g6zYe6rZp98i0Miw for ; Mon, 21 Jan 2013 05:38:13 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 4246E6C132; Mon, 21 Jan 2013 07:38:13 -0600 (CST) Message-ID: <50FD44C1.7040301@hardwarefreak.com> Date: Mon, 21 Jan 2013 07:38:09 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Linda Walsh CC: xfs-oss Subject: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> <20130120004638.GZ2498@dastard> <50FBB9D4.9060109@hardwarefreak.com> <50FCB3B8.5000404@tlinx.org> X-ASG-Orig-Subj: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... In-Reply-To: <50FCB3B8.5000404@tlinx.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1358775493 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On 1/20/2013 9:19 PM, Linda Walsh wrote: > 2) Downloaded+online media+SW. RAID5: 4-data spindles using 2tB(1.819TB) > Hitachi Ultrastar 7.2K SATA's (note, the disks in #3 & #4 are the same > type). > > 3) Main data+devel disk: RAID50 12-data spindles in 3 groups of 4. > NOTE: I tried > and benched RAID60 but wasn't happy with the performance, The 2108 ROC ASIC in the 9280 doesn't have sufficient horsepower for good performance with dual parity arrays, but that pales in comparison to the performance drop due to the RMW induced seek latency. > not to mention > the diskspace > hit RAID10 would be a bit too decadent for my usage/budget. When one perceives the capacity overhead of RAID1/10 as an intolerable cost, instead of a benefit, one is forever destined to suffer from the poor performance of parity RAID schemes. ... > On #3 currently using 12.31tB in 20 partitions ... > Note -- I generally Like the RAID50's ... > Cards, 1 internal: Dell Perc 6/i (serving #1 & #2 above -- all internal) > 1 LSI MR9280DE-8e (serving #3+4) > 2 Enclosures LSI-DE1600-SAS (12x3.5" ea) So you have 24x 2TB 7.2K SATA drives total in two 630Js, correct? > 3 years from now? Ha!. Lets just say that with the dollar dropping > as fast as disk prices over the past 4 years has flamboozled any normal > planning. I feel ya. > I was mostly interested in how increasing number of spindles > in a Raid50 would help parallelism. ... > My thoughts on that > was that since each member of a RAID0, can be read or written independently > of any other member (as there is no parity to check), that IF I wanted to > increase parallelism (while hurting maximum throughput AND disk space), I > **could** reconfigure to .. well extreme would be 5 groups of 2-data/3disk > RAID5's. That would, I think, theoretically (and if the controller is > up to > it, which I think it is), allow *up_to* 5 separate reads/writes to be > served > in parallel, vs. now, I think it should be 3. ... > It was, I thought, a fairly simply question, but I have a history > of sometimes thinking things will be easier than they are proportional to > how far away (in future or someone else doing it! ;-)) something is... The answer is simple too: Parity RAID sucks. If you want anything more than a trivial increase in performance, you need to ditch parity RAID. Given the time and effort involved in rearranging all of your disks to get one or two more RAID5 arrays with fewer disks per array into a RAID50, it doesn't make sense to do so when you can simply create one large RAID10, and be done monkeying around and second guessing. You'll have the performance you're seeking. Actually far, far more. > My **GENERAL** plan if prices had cooperated was to move > to 3TB SATA's and **mabye** a 3rd enclosure -- I sorta like the LSI ones.. Using 3TB (or larger) drives simply increases the probability of losing an entire RAID5 array if you ever have to rebuild a dead drive. See the linux-raid archives for the past few days for a good discussion on the topic. LSI sold the Engenio division to NetApp in early 2011, only a ~year after they started selling the 620/630 in the channel--very short product life. The DE1600 (LSI 630J) 12 bay enclosure you have is still available from NetApp but I'd doubt you want to pay NetApp's price, if they'd even sell it bare without drives, or without a mandatory service contract. > they seem pretty solid. Have tried a few others and generally found them > not as good, but have looked on the economical side since this is for > a home office^h^h^h^h^h^hlab^h^h^hplay setup.... Norco's units have a decent rep, especially given the price point. They use LSI's SAS expander ASIC: http://www.newegg.com/Product/Product.aspx?Item=N82E16816133047 No dual hot swap PSUs or expander module slots compared to the LSI, but probably 2:1 lower price. I didn't list the 12 bay unit as it's only $230 less, $1369 vs $1139. > Consider this -- my max read and write (both), on my > large array is 1GB/s. There's no way I could get that with a RAID10 setup > without a much larger number of disks. On the contrary. The same disks in RAID10 will walk all over your RAID50 setup. Let's discuss practical use and performance instead of peak optimums shall we? Note that immediately below I'm simply educating you, not recommending a 12 drive RAID10. Recommendations come later. In this one array you have 12 drives, 3x 4 drive RAID5 arrays in RAID50, for 9 effective data spindles. An equivalent 12 drive RAID10 would yield 6 data spindles. For a pure streaming read workload with all drives evenly in play, the RAID50 might be ~50% faster. For a purely random read workload about the same, although in both cases 50x or more slower than the streaming read case due to random seeks. With a pure streaming allocation write workload with perfect stripe filling, no RMW, the RAID50 will be faster, but less than the 50% above due to parity calcs in the ASIC. Now it gets interesting. With a purely random write non aligned non allocation workload on the RAID50, RMW cycles will abound driving seek latency through the roof, while the ASIC is performing a parity calc on each stripe update. Throughput here will be in the low tens of MBs per second, tops. RAID10 simply writes each sector--done. Throughput will be in the high tens to 100s of MB/s. So in this scenario RAID10 will be anywhere from 5-10x or more faster depending on the distribution of the writes across the drives. Another factor here is that RMW reads from the disks go into the LSI cache for parity recalculation, eating cache bandwidth and capacity, decreasing the writeback efficiency. With RAID10 you get full cache bandwidth for sinking incoming writes and performing flush scheduling, both being extremely important for random write workloads. Food for thought: A random write workload of ~500MB with RAID10 will complete almost instantly after the controller cache consumes it. With RAID50 you have to go through the hundreds or thousands of RMW cycles on the disks, so the same operation will take many minutes. Lets look at more real world scenarios. Take your example of the nightly background processes kicking in. This constitutes a mixed random read and write workload. In this situation every RMW can create 3 seeks per drive write: read, write, parity write. Now you have a seek for a pending read operation, making 4 seeks. But the problem isn't just the seeks, it is the inter-seek latency due to the slow 7.2K RPM platters having to spin under the head for the next read or write. This scenario makes scheduling in the controller and the drives themselves very difficult adding more latency. With RAID10 in this scenario, you simply have write/read/write/read/etc. You're not performing 2 extra seeks for each write, so you're not incurring that latency between operations, nor the scheduling complexity, thus driving throughput much higher. In this scenario, the 6 disk RAID10 may be 10x to as much as 50x faster than the RAID50 depending on the access/seek patterns. I've obviously not covered this in much technical detail as storage behavior is quite complex. I've attempted to give you a high level overview of the behavioral differences between parity and non parity RAID, and the potential performance differences with various workloads, and the differences between "peak" performance and actual performance. While your RAID50 may have greater theoretical peak streaming performance, the RAID10 will typically, literally, run circles around it with most day-to-day mixed IO workloads. While the RAID50 may have a peak throughput of ~1GB/s, it may only attain that 1-10% of the time. The RAID10 may have a peak throughput of "only" ~700MB/s, but may likely achieve that more than 60% of the time. And as a result its performance degradation will be much more graceful with concurrent workloads due the the dramatically lower IO completion latencies. > Though I admit, concurrency would > rise... but I generate most of my workload, so usually I don't have > too many things going on at the same time... a few maybe... But I'd guess it's at times like this when you bog down the RAID50 with mixed workloads and become annoyed. You typically don't see that with the non-parity arrays. > When an xfs_fsr kicks in and starts swallowing disk-cache, *ahem*, > and the daily backup kicks in, AND the daily 'rsync' to create a static > snapshot... things can slow down a bit.. but rare am I up at those hours... And this is one scenario where the RAID10 would run circles around the RAID50. > The most intensive is the xfs_fsr, partly due to it swallowing > up disk cache (it runs at nice -19 ionice -c3, and I can still feel it!)... As Dave and possibly other devs have stated, cron'ing xfs_fsr is not recommended. While it defrags your files it fragments free space. Fragmented free space tends to kill performance more than file fragmentation. It also puts extra wear & tear on your drives, especially when using parity RAID due to the things mentioned above. > I might play more with putting it in it's own blkio cgroup. > and just limiting the overall disk transactions...(not to mention > fixing that disk-buffer usage issue)... On the off chance that xfs_fsr has completion timers or some such, I'd ask around before doing that. Sufficiently limiting its IO rate may have unintended consequences. >> You'll need more drives to maintain the same usable capacity, > --- > > (oh, a minor detail! ;^))... Well how much space do you really need in a one person development operation plus home media/etc storage system? 10TB, 24TB, 48TB? Assuming you have both 630Js filled with 24x 2TB drives, that's 48TB raw. If you have 6x 4 drive RAID5s in multiple RAID50 spans, you have 18x 2TB = 36TB of capacity. Your largest array is 12 drives with 9 effective spindles of throughput. You've split up your arrays for different functions, limiting some workloads to fewer spindles of performance, and having spindles sit idle that could otherwise be actively adding performance to active workloads. You've created partitions directly on the array disk devices and have various LVM devices and filesystems on those for various purposes, again limiting some filesystems to less performance than your total spindles can give you. The change I recommend you consider is to do something similar to what we do with SAN storage consolidation. Create a single large spindle count non-parity array on the LSI. In this case that would be a 24 drive RAID10 with a strip (sunit) of 32KB, yielding a stripe width (swidth) of 384KB, which should work very well with all of your filesystems and workloads, giving a good probability of full stripe writes. You'd have ~24TB of usable space. All of your workloads would have 12 spindles of non-parity performance, peak streaming read/write of ~1.4GB/s, and random read/write mixed workload throughput of a few hundred MB/s, simply stomping what you have now. You'd be very hard pressed to bog down this 12 spindle non-parity array. Making a conservative guesstimate, I'd say the mixed random IO throughput would be on the order of 30x-50x that of your current RAID5/50 arrays combined. In summary, you'd gain a staggering performance increase you simply wouldn't have considered possible with your current hardware. You'd "sacrifice" 12TB of your 48TB of raw space to achieve it. That 30-50x increase in random IOPs is exactly why many folks gladly "waste money on extra drives". After you see the dramatic performance increase you'll wonder why you ever considered spending money on high RPM SAS drives to reduce RAID5 latency. Put these 24 7.2K SATA drives in this RAID10 up against 24 15K SAS drives in a 6x4 RAID50. Your big slow Hitachis will best the nimble SAS 15ks in random IOPS, probably by a wide margin. Simply due to RMW. Yes, RMW will hammer 15K drives that much. RMW hammers all spinning rust, everything but SSDs. > Don't spend much time on this.. (well if you read it, that might be too > much > already! ;-))... As I said it's not THAT important...and was mostly about > the effect of groups in a RAID50 relating to performance tradeoffs. Optimizing the spindle count of constituent RAID5s in a RAID50 to gain performance is akin to a downhill skier manically waxing his skis every day, hoping to shave 2 seconds off a 2 minute course. > Thanks for any insights...(I'm always open to learning how wrong I am! > ;-))... If nothing else I hopefully got the point across as to how destructive parity RAID read-modify-write operations are to performance. It's simply impossible to get good mixed IO performance from parity RAID unless one's workloads always fit in controller write cache, or if one has SSD storage. -- Stan From dave@fromorbit.com Mon Jan 21 07:53:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 790297F3F for ; Mon, 21 Jan 2013 07:53:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64B7E304039 for ; Mon, 21 Jan 2013 05:53:22 -0800 (PST) X-ASG-Debug-ID: 1358776396-04cbb00c6643830001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FtrfFTv9THyu2Axh for ; Mon, 21 Jan 2013 05:53:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFGgE7MwgVAzE5Aw0OGYgYrCmOcZE5A6ZVgwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:14 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoH-0001Og-Ol for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoH-0005ns-KG for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/12] xfsprogs: add CRC32c infrastructure Date: Tue, 22 Jan 2013 00:53:00 +1100 X-ASG-Orig-Subj: [PATCH 01/12] xfsprogs: add CRC32c infrastructure Message-Id: <1358776391-22140-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776396 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Pull the generic crc32(c) code from the kernel and add it to libxfs. Modify it to build in the libxfs environment, and drop the bigendian CRC version as it is unused by XFS, which uses the little endian version so that it can be hardware accelerated using native instructions on x86-64 CPUs. Also wire up the self-test code in the crc32 module to the build infrastructure and make passing the self test a build dependency. This prevents xfsprogs from being built on platforms that the CRC algorithm does not work on and hence ensures the tools do not write bad CRCs to disk as a result of a broken calculation. Also pull the XFS CRC helper functions across in preparation for using the CRC functions in libxfs. XXX: something in the CRC table generation breaks the debian package build. It fails to build libxfs as a dependency of mkfs.xfs. Works fine outside the debian build environment, so I'm not sure what the issue is yet. Most likely it is the execution path of the gen_crc32table binary that is built... Signed-off-by: Dave Chinner --- include/Makefile | 6 +- include/libxfs.h | 10 + include/xfs_arch.h | 16 + include/xfs_cksum.h | 63 +++ libxfs/Makefile | 26 +- libxfs/crc32.c | 1036 +++++++++++++++++++++++++++++++++++++++++++++++ libxfs/crc32defs.h | 72 ++++ libxfs/gen_crc32table.c | 144 +++++++ 8 files changed, 1367 insertions(+), 6 deletions(-) create mode 100644 include/xfs_cksum.h create mode 100644 libxfs/crc32.c create mode 100644 libxfs/crc32defs.h create mode 100644 libxfs/gen_crc32table.c diff --git a/include/Makefile b/include/Makefile index de2c4f0..9ed5077 100644 --- a/include/Makefile +++ b/include/Makefile @@ -23,9 +23,9 @@ QAHFILES = libxfs.h libxlog.h \ swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ - xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ - xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h xfs_dir_sf.h \ - xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ + xfs_btree_trace.h xfs_buf_item.h xfs_cksum.h xfs_da_btree.h \ + xfs_dinode.h xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h \ + xfs_dir_sf.h xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 0e2fc5f..e671391 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -668,4 +668,14 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); +/* CRC wrappers */ + +extern uint32_t crc32_le(uint32_t crc, unsigned char const *p, size_t len); +extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); + +#define crc32(c,p,l) crc32_le((c),(unsigned char const *)(p),(l)) +#define crc32c(c,p,l) crc32c_le((c),(unsigned char const *)(p),(l)) + +#include + #endif /* __LIBXFS_H__ */ diff --git a/include/xfs_arch.h b/include/xfs_arch.h index 0902249..d5e591a 100644 --- a/include/xfs_arch.h +++ b/include/xfs_arch.h @@ -47,6 +47,14 @@ #define be16_to_cpu(val) ((__force __u16)(__be16)(val)) #define be32_to_cpu(val) ((__force __u32)(__be32)(val)) #define be64_to_cpu(val) ((__force __u64)(__be64)(val)) + +#define cpu_to_le32(val) ((__force __be32)__swab32((__u32)(val))) +#define le32_to_cpu(val) (__swab32((__force __u32)(__le32)(val))) + +#define __constant_cpu_to_le32(val) \ + ((__force __le32)___constant_swab32((__u32)(val))) +#define __constant_cpu_to_be32(val) \ + ((__force __be32)(__u32)(val)) #else #define cpu_to_be16(val) ((__force __be16)__swab16((__u16)(val))) #define cpu_to_be32(val) ((__force __be32)__swab32((__u32)(val))) @@ -54,6 +62,14 @@ #define be16_to_cpu(val) (__swab16((__force __u16)(__be16)(val))) #define be32_to_cpu(val) (__swab32((__force __u32)(__be32)(val))) #define be64_to_cpu(val) (__swab64((__force __u64)(__be64)(val))) + +#define cpu_to_le32(val) ((__force __le32)(__u32)(val)) +#define le32_to_cpu(val) ((__force __u32)(__le32)(val)) + +#define __constant_cpu_to_le32(val) \ + ((__force __le32)(__u32)(val)) +#define __constant_cpu_to_be32(val) \ + ((__force __be32)___constant_swab32((__u32)(val))) #endif static inline void be16_add_cpu(__be16 *a, __s16 b) diff --git a/include/xfs_cksum.h b/include/xfs_cksum.h new file mode 100644 index 0000000..fad1676 --- /dev/null +++ b/include/xfs_cksum.h @@ -0,0 +1,63 @@ +#ifndef _XFS_CKSUM_H +#define _XFS_CKSUM_H 1 + +#define XFS_CRC_SEED (~(__uint32_t)0) + +/* + * Calculate the intermediate checksum for a buffer that has the CRC field + * inside it. The offset of the 32bit crc fields is passed as the + * cksum_offset parameter. + */ +static inline __uint32_t +xfs_start_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t zero = 0; + __uint32_t crc; + + /* Calculate CRC up to the checksum. */ + crc = crc32c(XFS_CRC_SEED, buffer, cksum_offset); + + /* Skip checksum field */ + crc = crc32c(crc, &zero, sizeof(__u32)); + + /* Calculate the rest of the CRC. */ + return crc32c(crc, &buffer[cksum_offset + sizeof(__be32)], + length - (cksum_offset + sizeof(__be32))); +} + +/* + * Convert the intermediate checksum to the final ondisk format. + * + * The CRC32c calculation uses LE format even on BE machines, but returns the + * result in host endian format. Hence we need to byte swap it back to LE format + * so that it is consistent on disk. + */ +static inline __le32 +xfs_end_cksum(__uint32_t crc) +{ + return ~cpu_to_le32(crc); +} + +/* + * Helper to generate the checksum for a buffer. + */ +static inline void +xfs_update_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); + + *(__le32 *)(buffer + cksum_offset) = xfs_end_cksum(crc); +} + +/* + * Helper to verify the checksum for a buffer. + */ +static inline int +xfs_verify_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); + + return *(__le32 *)(buffer + cksum_offset) == xfs_end_cksum(crc); +} + +#endif /* _XFS_CKSUM_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index dc9b22c..28f71c8 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -10,17 +10,19 @@ LT_CURRENT = 0 LT_REVISION = 0 LT_AGE = 0 -HFILES = xfs.h init.h xfs_dir2_priv.h +HFILES = xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c + xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c \ + crc32.c CFILES += $(PKG_PLATFORM).c PCFILES = darwin.c freebsd.c irix.c linux.c LSRCFILES = $(shell echo $(PCFILES) | sed -e "s/$(PKG_PLATFORM).c//g") +LSRCFILES += gen_crc32table.c # # Tracing flags: @@ -38,7 +40,25 @@ LTLIBS = $(LIBPTHREAD) $(LIBRT) # don't try linking xfs_repair with a debug libxfs. DEBUG = -DNDEBUG -default: ltdepend $(LTLIBRARY) +LDIRT = gen_crc32table crc32table.h crc32selftest + +default: crc32selftest ltdepend $(LTLIBRARY) + +crc32table.h: gen_crc32table.c + @echo " [CC] gen_crc32table" + $(Q) $(CC) $(CFLAGS) -o gen_crc32table $< + @echo " [GENERATE] $@" + $(Q) ./gen_crc32table > crc32table.h + +# The selftest binary will return an error if it fails. This is made a +# dependency of the build process so that we refuse to build the tools on broken +# systems/architectures. Hence we make sure that xfsprogs will never use a +# busted CRC calculation at build time and hence avoid putting bad CRCs down on +# disk. +crc32selftest: gen_crc32table.c crc32table.h crc32.c + @echo " [TEST] CRC32" + $(Q) $(CC) $(CFLAGS) -D CRC32_SELFTEST=1 crc32.c -o $@ + $(Q) ./$@ include $(BUILDRULES) diff --git a/libxfs/crc32.c b/libxfs/crc32.c new file mode 100644 index 0000000..1c0d958 --- /dev/null +++ b/libxfs/crc32.c @@ -0,0 +1,1036 @@ +/* + * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin + * cleaned up code to current version of sparse and added the slicing-by-8 + * algorithm to the closely similar existing slicing-by-4 algorithm. + * + * Oct 15, 2000 Matt Domsch + * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks! + * Code was from the public domain, copyright abandoned. Code was + * subsequently included in the kernel, thus was re-licensed under the + * GNU GPL v2. + * + * Oct 12, 2000 Matt Domsch + * Same crc32 function was used in 5 other places in the kernel. + * I made one version, and deleted the others. + * There are various incantations of crc32(). Some use a seed of 0 or ~0. + * Some xor at the end with ~0. The generic crc32() function takes + * seed as an argument, and doesn't xor at the end. Then individual + * users can do whatever they need. + * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0. + * fs/jffs2 uses seed 0, doesn't xor with ~0. + * fs/partitions/efi.c uses seed ~0, xor's with ~0. + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +/* see: Documentation/crc32.txt for a description of algorithms */ + +/* + * lifted from the 3.8-rc2 kernel source for xfsprogs. Killed CONFIG_X86 + * specific bits for just the generic algorithm. Also removed the big endian + * version of the algorithm as XFS only uses the little endian CRC version to + * match the hardware acceleration available on Intel CPUs. + */ + +#include +#include "crc32defs.h" + +/* types specifc to this file */ +typedef __u8 u8; +typedef __u16 u16; +typedef __u32 u32; +typedef __u32 u64; +#define __pure + +#if CRC_LE_BITS > 8 +# define tole(x) ((__force u32) __constant_cpu_to_le32(x)) +#else +# define tole(x) (x) +#endif + +#if CRC_BE_BITS > 8 +# define tobe(x) ((__force u32) __constant_cpu_to_be32(x)) +#else +# define tobe(x) (x) +#endif + +#include "crc32table.h" + +#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 + +/* implements slicing-by-4 or slicing-by-8 algorithm */ +static inline u32 +crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) +{ +# ifdef __LITTLE_ENDIAN +# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8) +# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \ + t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255]) +# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \ + t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255]) +# else +# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) +# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \ + t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255]) +# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \ + t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255]) +# endif + const u32 *b; + size_t rem_len; + const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3]; +# if CRC_LE_BITS != 32 + const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7]; +# endif + u32 q; + + /* Align it */ + if (((long)buf & 3) && len) { + do { + DO_CRC(*buf++); + } while ((--len) && ((long)buf)&3); + } + +# if CRC_LE_BITS == 32 + rem_len = len & 3; + len = len >> 2; +# else + rem_len = len & 7; + len = len >> 3; +# endif + + b = (const u32 *)buf; + for (--b; len; --len) { + q = crc ^ *++b; /* use pre increment for speed */ +# if CRC_LE_BITS == 32 + crc = DO_CRC4; +# else + crc = DO_CRC8; + q = *++b; + crc ^= DO_CRC4; +# endif + } + len = rem_len; + /* And the last few bytes */ + if (len) { + u8 *p = (u8 *)(b + 1) - 1; + do { + DO_CRC(*++p); /* use pre increment for speed */ + } while (--len); + } + return crc; +#undef DO_CRC +#undef DO_CRC4 +#undef DO_CRC8 +} +#endif + +/** + * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 + * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for + * other uses, or the previous crc32 value if computing incrementally. + * @p: pointer to buffer over which CRC is run + * @len: length of buffer @p + */ +static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p, + size_t len, const u32 (*tab)[256], + u32 polynomial) +{ +#if CRC_LE_BITS == 1 + int i; + while (len--) { + crc ^= *p++; + for (i = 0; i < 8; i++) + crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0); + } +# elif CRC_LE_BITS == 2 + while (len--) { + crc ^= *p++; + crc = (crc >> 2) ^ tab[0][crc & 3]; + crc = (crc >> 2) ^ tab[0][crc & 3]; + crc = (crc >> 2) ^ tab[0][crc & 3]; + crc = (crc >> 2) ^ tab[0][crc & 3]; + } +# elif CRC_LE_BITS == 4 + while (len--) { + crc ^= *p++; + crc = (crc >> 4) ^ tab[0][crc & 15]; + crc = (crc >> 4) ^ tab[0][crc & 15]; + } +# elif CRC_LE_BITS == 8 + /* aka Sarwate algorithm */ + while (len--) { + crc ^= *p++; + crc = (crc >> 8) ^ tab[0][crc & 255]; + } +# else + crc = (__force u32) cpu_to_le32(crc); + crc = crc32_body(crc, p, len, tab); + crc = le32_to_cpu((__force __le32)crc); +#endif + return crc; +} + +#if CRC_LE_BITS == 1 +u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE); +} +u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE); +} +#else +u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, + (const u32 (*)[256])crc32table_le, CRCPOLY_LE); +} +u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, + (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE); +} +#endif + + +#ifdef CRC32_SELFTEST + +/* 4096 random bytes */ +static u8 __attribute__((__aligned__(8))) test_buf[] = +{ + 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30, + 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4, + 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60, + 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c, + 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4, + 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a, + 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a, + 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4, + 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9, + 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4, + 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca, + 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61, + 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e, + 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a, + 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f, + 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd, + 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c, + 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88, + 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53, + 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f, + 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4, + 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74, + 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60, + 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09, + 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07, + 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1, + 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f, + 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2, + 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0, + 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95, + 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22, + 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93, + 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86, + 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d, + 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40, + 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b, + 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35, + 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40, + 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63, + 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b, + 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8, + 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72, + 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86, + 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff, + 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed, + 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c, + 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed, + 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30, + 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99, + 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4, + 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80, + 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37, + 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04, + 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e, + 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd, + 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c, + 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09, + 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb, + 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b, + 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53, + 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b, + 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f, + 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff, + 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40, + 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6, + 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb, + 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73, + 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f, + 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4, + 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66, + 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1, + 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80, + 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f, + 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5, + 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7, + 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce, + 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff, + 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48, + 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26, + 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72, + 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88, + 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9, + 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc, + 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8, + 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09, + 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8, + 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c, + 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48, + 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d, + 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f, + 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae, + 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97, + 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8, + 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75, + 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc, + 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27, + 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf, + 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7, + 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0, + 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8, + 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c, + 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44, + 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54, + 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38, + 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f, + 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b, + 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7, + 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef, + 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e, + 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c, + 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c, + 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0, + 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37, + 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf, + 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e, + 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4, + 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60, + 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe, + 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61, + 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3, + 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe, + 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40, + 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec, + 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f, + 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7, + 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79, + 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c, + 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f, + 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21, + 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9, + 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30, + 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b, + 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee, + 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6, + 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3, + 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09, + 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd, + 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f, + 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9, + 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc, + 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59, + 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60, + 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5, + 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1, + 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8, + 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9, + 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab, + 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80, + 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01, + 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e, + 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d, + 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35, + 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38, + 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a, + 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac, + 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca, + 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57, + 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed, + 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20, + 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef, + 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c, + 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a, + 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64, + 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4, + 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54, + 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16, + 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26, + 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc, + 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87, + 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60, + 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d, + 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54, + 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13, + 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59, + 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb, + 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f, + 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15, + 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78, + 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93, + 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e, + 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31, + 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1, + 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37, + 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15, + 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78, + 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f, + 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31, + 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f, + 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc, + 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9, + 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3, + 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe, + 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4, + 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24, + 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1, + 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85, + 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8, + 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09, + 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c, + 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46, + 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5, + 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39, + 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2, + 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc, + 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35, + 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde, + 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80, + 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15, + 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63, + 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58, + 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d, + 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf, + 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12, + 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c, + 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b, + 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1, + 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6, + 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73, + 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9, + 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e, + 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22, + 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb, + 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2, + 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c, + 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c, + 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93, + 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f, + 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38, + 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57, + 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03, + 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90, + 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8, + 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4, + 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36, + 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7, + 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47, + 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46, + 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73, + 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72, + 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23, + 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a, + 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58, + 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f, + 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96, + 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9, + 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b, + 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c, + 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef, + 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3, + 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4, + 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f, + 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17, + 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18, + 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8, + 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98, + 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42, + 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97, + 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97, + 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1, + 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77, + 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb, + 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c, + 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb, + 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56, + 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04, + 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48, + 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe, + 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d, + 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97, + 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8, + 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f, + 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e, + 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca, + 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44, + 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f, + 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6, + 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63, + 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19, + 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58, + 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b, + 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28, + 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf, + 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6, + 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3, + 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe, + 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f, + 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf, + 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9, + 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e, + 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7, + 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70, + 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0, + 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d, + 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4, + 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5, + 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85, + 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc, + 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f, + 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56, + 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb, + 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b, + 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5, + 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03, + 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23, + 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03, + 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87, + 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4, + 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43, + 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11, + 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40, + 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59, + 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9, + 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30, + 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd, + 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45, + 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83, + 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b, + 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5, + 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3, + 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84, + 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8, + 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34, + 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b, + 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31, + 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b, + 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40, + 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b, + 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e, + 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38, + 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb, + 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2, + 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c, + 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1, + 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc, + 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec, + 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34, + 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95, + 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92, + 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f, + 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c, + 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b, + 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c, + 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5, + 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb, + 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4, + 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9, + 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4, + 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41, + 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a, + 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8, + 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06, + 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62, + 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47, + 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4, + 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00, + 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67, + 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81, + 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0, + 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10, + 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79, + 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19, + 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8, + 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1, + 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83, + 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86, + 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55, + 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66, + 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0, + 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49, + 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea, + 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24, + 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e, + 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88, + 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87, + 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34, + 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f, + 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a, + 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a, + 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93, + 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37, + 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38, + 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4, + 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48, + 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65, + 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09, + 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e, + 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5, + 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b, + 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4, + 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e, + 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d, + 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0, + 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5, + 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48, + 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e, + 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f, + 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a, + 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d, + 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14, + 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69, + 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53, + 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56, + 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48, + 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4, + 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26, + 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e, + 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40, + 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7, + 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62, + 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe, + 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf, + 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2, + 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d, + 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32, + 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa, + 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45, + 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04, + 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33, + 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad, + 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4, + 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c, + 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b, + 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36, + 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa, + 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9, + 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28, + 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b, + 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03, + 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d, + 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff, + 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39, + 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b, + 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2, + 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34, + 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe, + 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0, + 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27, + 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86, + 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90, + 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03, + 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb, + 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57, + 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9, + 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5, + 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16, + 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5, + 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a, + 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d, + 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0, + 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f, + 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48, + 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1, + 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09, + 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51, + 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b, + 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf, + 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe, + 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad, + 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e, + 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57, + 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f, + 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef, + 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8, + 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69, + 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d, + 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59, + 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9, + 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d, + 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea, + 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56, + 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4, + 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8, + 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78, + 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f, + 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4, + 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91, + 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f, + 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c, + 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57, + 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4, + 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23, + 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17, + 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66, + 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39, + 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36, + 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00, + 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7, + 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60, + 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c, + 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e, + 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7, + 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a, + 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d, + 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37, + 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82, + 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8, + 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e, + 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85, + 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98, + 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22, + 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7, + 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49, + 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33, + 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc, + 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8, + 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f, + 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3, + 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98, + 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c, + 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6, + 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc, + 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d, +}; + +/* 100 test cases */ +static struct crc_test { + u32 crc; /* random starting crc */ + u32 start; /* random 6 bit offset in buf */ + u32 length; /* random 11 bit length of test */ + u32 crc_le; /* expected crc32_le result */ + u32 crc_be; /* expected crc32_be result */ + u32 crc32c_le; /* expected crc32c_le result */ +} test[] = +{ + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, + 0xf6e93d6c}, + {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, + 0x0fe92aca}, + {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, + 0x52e1ebb8}, + {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, + 0x0798af9a}, + {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, + 0x18eb3152}, + {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, + 0xd00d08c7}, + {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, + 0x8ba966bc}, + {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, + 0x11d694a2}, + {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, + 0x6ab3208d}, + {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, + 0xba4603c5}, + {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, + 0xe6071c6f}, + {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, + 0x179ec30a}, + {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, + 0x0903beb8}, + {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, + 0x6a7cb4fa}, + {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, + 0xdb535801}, + {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, + 0x92bed597}, + {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, + 0x192a3f1b}, + {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, + 0xccbaec1a}, + {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, + 0x7eabae4d}, + {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, + 0x28c72982}, + {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, + 0xc3cd4d18}, + {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, + 0xbca8f0e7}, + {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, + 0x713f60b3}, + {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, + 0xebd08fd5}, + {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, + 0x64406c59}, + {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, + 0x7421890e}, + {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, + 0xe9347603}, + {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, + 0x1bef9060}, + {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, + 0x34720072}, + {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, + 0x48310f59}, + {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, + 0x783a4213}, + {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, + 0x9e8efd41}, + {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, + 0xfc3d34a5}, + {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, + 0x17a52ae2}, + {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, + 0x886d935a}, + {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, + 0xeaaeaeb2}, + {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, + 0x8e900a4b}, + {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, + 0xd74662b1}, + {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, + 0xd26752ba}, + {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, + 0x8b1fcd62}, + {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, + 0xf54342fe}, + {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, + 0x5b95b988}, + {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, + 0x2e1176be}, + {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, + 0x66120546}, + {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, + 0xf256a5cc}, + {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, + 0x4af1dd69}, + {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, + 0x56f0a04a}, + {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, + 0x74f6b6b2}, + {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, + 0x085951fd}, + {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, + 0xc65387eb}, + {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, + 0x1ca9257b}, + {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, + 0xfd196d76}, + {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, + 0x5ef88339}, + {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, + 0x2c3714d9}, + {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, + 0x58576548}, + {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, + 0xfd7c57de}, + {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, + 0xd5fedd59}, + {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, + 0x1cc3b17b}, + {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, + 0x270eed73}, + {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, + 0x91ecbb11}, + {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, + 0x05ed8d0c}, + {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, + 0x0b09ad5b}, + {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, + 0xf8d511fb}, + {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, + 0x5ad832cc}, + {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, + 0x1214d196}, + {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, + 0x5747218a}, + {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, + 0xde8f14de}, + {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, + 0x3563b7b9}, + {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, + 0x071475d0}, + {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, + 0x54c79d60}, + {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, + 0x4c53eee6}, + {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, + 0x10137a3c}, + {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, + 0xaa9d6c73}, + {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, + 0xb63d23e7}, + {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, + 0x7f53e9cf}, + {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, + 0x13c1cd83}, + {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, + 0x49ff5867}, + {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, + 0x8467f211}, + {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, + 0x3f9683b2}, + {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, + 0x76a3f874}, + {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, + 0x863b702f}, + {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, + 0xdc6c58ff}, + {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, + 0x0622cc95}, + {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, + 0xe85605cd}, + {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, + 0x31da5f06}, + {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, + 0xa1f2e784}, + {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, + 0xb07cc616}, + {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, + 0xbf943b6c}, + {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, + 0x2c01af1c}, + {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, + 0x0fe5f56d}, + {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, + 0xf8943b2d}, + {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, + 0xe4d89272}, + {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, + 0x7c2f6bbb}, + {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, + 0xabbf388b}, + {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, + 0x1dca1f4e}, + {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, + 0x5c170e23}, + {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, + 0xc0e9d672}, + {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, + 0xc18bdc86}, + {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, + 0xa874fcdd}, + {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, + 0x9dc0bb48}, +}; + +static int crc32c_test(void) +{ + int i; + int errors = 0; + int bytes = 0; + struct timeval start, stop; + uint64_t usec; + + /* keep static to prevent cache warming code from + * getting eliminated by the compiler */ + static u32 crc; + + /* pre-warm the cache */ + for (i = 0; i < 100; i++) { + bytes += 2*test[i].length; + + crc ^= crc32c_le(test[i].crc, test_buf + + test[i].start, test[i].length); + } + + gettimeofday(&start, NULL); + for (i = 0; i < 100; i++) { + if (test[i].crc32c_le != crc32c_le(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; + } + gettimeofday(&stop, NULL); + + usec = stop.tv_usec - start.tv_usec + + 1000000 * (stop.tv_sec - start.tv_sec); + + if (errors) + printf("crc32c: %d self tests failed\n", errors); + else { + printf("crc32c: tests passed, %d bytes in %" PRIu64 " usec\n", + bytes, usec); + } + + return errors; +} + +static int crc32_test(void) +{ + int i; + int errors = 0; + int bytes = 0; + struct timeval start, stop; + uint64_t usec; + + /* keep static to prevent cache warming code from + * getting eliminated by the compiler */ + static u32 crc; + + /* pre-warm the cache */ + for (i = 0; i < 100; i++) { + bytes += 2*test[i].length; + + crc ^= crc32_le(test[i].crc, test_buf + + test[i].start, test[i].length); + +#if 0 /* not used */ + crc ^= crc32_be(test[i].crc, test_buf + + test[i].start, test[i].length); +#endif + } + + gettimeofday(&start, NULL); + for (i = 0; i < 100; i++) { + if (test[i].crc_le != crc32_le(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; + +#if 0 /* not used */ + if (test[i].crc_be != crc32_be(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; +#endif + } + gettimeofday(&stop, NULL); + + usec = stop.tv_usec - start.tv_usec + + 1000000000 * (stop.tv_sec - start.tv_sec); + + if (errors) + printf("crc32: %d self tests failed\n", errors); + else { + printf("crc32: tests passed, %d bytes in %" PRIu64 " usec\n", + bytes, usec); + } + + return errors; +} +/* + * make sure we always return 0 for a successful test run, and non-zero for a + * failed run. The build infrastructure is looking for this information to + * determine whether to allow the build to proceed. + */ +int main(int argc, char **argv) +{ + int errors; + + printf("CRC_LE_BITS = %d\n", CRC_LE_BITS); + + errors = crc32_test(); + errors += crc32c_test(); + + return errors != 0; +} +#endif /* CRC32_SELFTEST */ diff --git a/libxfs/crc32defs.h b/libxfs/crc32defs.h new file mode 100644 index 0000000..64cba2c --- /dev/null +++ b/libxfs/crc32defs.h @@ -0,0 +1,72 @@ +/* + * There are multiple 16-bit CRC polynomials in common use, but this is + * *the* standard CRC-32 polynomial, first popularized by Ethernet. + * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0 + */ +#define CRCPOLY_LE 0xedb88320 +#define CRCPOLY_BE 0x04c11db7 + +/* + * This is the CRC32c polynomial, as outlined by Castagnoli. + * x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+x^11+x^10+x^9+ + * x^8+x^6+x^0 + */ +#define CRC32C_POLY_LE 0x82F63B78 + +/* Try to choose an implementation variant via Kconfig */ +#ifdef CONFIG_CRC32_SLICEBY8 +# define CRC_LE_BITS 64 +# define CRC_BE_BITS 64 +#endif +#ifdef CONFIG_CRC32_SLICEBY4 +# define CRC_LE_BITS 32 +# define CRC_BE_BITS 32 +#endif +#ifdef CONFIG_CRC32_SARWATE +# define CRC_LE_BITS 8 +# define CRC_BE_BITS 8 +#endif +#ifdef CONFIG_CRC32_BIT +# define CRC_LE_BITS 1 +# define CRC_BE_BITS 1 +#endif + +/* + * How many bits at a time to use. Valid values are 1, 2, 4, 8, 32 and 64. + * For less performance-sensitive, use 4 or 8 to save table size. + * For larger systems choose same as CPU architecture as default. + * This works well on X86_64, SPARC64 systems. This may require some + * elaboration after experiments with other architectures. + */ +#ifndef CRC_LE_BITS +# ifdef CONFIG_64BIT +# define CRC_LE_BITS 64 +# else +# define CRC_LE_BITS 32 +# endif +#endif +#ifndef CRC_BE_BITS +# ifdef CONFIG_64BIT +# define CRC_BE_BITS 64 +# else +# define CRC_BE_BITS 32 +# endif +#endif + +/* + * Little-endian CRC computation. Used with serial bit streams sent + * lsbit-first. Be sure to use cpu_to_le32() to append the computed CRC. + */ +#if CRC_LE_BITS > 64 || CRC_LE_BITS < 1 || CRC_LE_BITS == 16 || \ + CRC_LE_BITS & CRC_LE_BITS-1 +# error "CRC_LE_BITS must be one of {1, 2, 4, 8, 32, 64}" +#endif + +/* + * Big-endian CRC computation. Used with serial bit streams sent + * msbit-first. Be sure to use cpu_to_be32() to append the computed CRC. + */ +#if CRC_BE_BITS > 64 || CRC_BE_BITS < 1 || CRC_BE_BITS == 16 || \ + CRC_BE_BITS & CRC_BE_BITS-1 +# error "CRC_BE_BITS must be one of {1, 2, 4, 8, 32, 64}" +#endif diff --git a/libxfs/gen_crc32table.c b/libxfs/gen_crc32table.c new file mode 100644 index 0000000..574a2d1 --- /dev/null +++ b/libxfs/gen_crc32table.c @@ -0,0 +1,144 @@ +#include +#include "crc32defs.h" +#include + +#define ENTRIES_PER_LINE 4 + +#if CRC_LE_BITS > 8 +# define LE_TABLE_ROWS (CRC_LE_BITS/8) +# define LE_TABLE_SIZE 256 +#else +# define LE_TABLE_ROWS 1 +# define LE_TABLE_SIZE (1 << CRC_LE_BITS) +#endif + +#if CRC_BE_BITS > 8 +# define BE_TABLE_ROWS (CRC_BE_BITS/8) +# define BE_TABLE_SIZE 256 +#else +# define BE_TABLE_ROWS 1 +# define BE_TABLE_SIZE (1 << CRC_BE_BITS) +#endif + +static uint32_t crc32table_le[LE_TABLE_ROWS][256]; +static uint32_t crc32ctable_le[LE_TABLE_ROWS][256]; + +/* + * big endian ordered CRC not used by XFS. +static uint32_t crc32table_be[BE_TABLE_ROWS][256]; + */ + +/** + * crc32init_le() - allocate and initialize LE table data + * + * crc is the crc of the byte i; other entries are filled in based on the + * fact that crctable[i^j] = crctable[i] ^ crctable[j]. + * + */ +static void crc32init_le_generic(const uint32_t polynomial, + uint32_t (*tab)[256]) +{ + unsigned i, j; + uint32_t crc = 1; + + tab[0][0] = 0; + + for (i = LE_TABLE_SIZE >> 1; i; i >>= 1) { + crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0); + for (j = 0; j < LE_TABLE_SIZE; j += 2 * i) + tab[0][i + j] = crc ^ tab[0][j]; + } + for (i = 0; i < LE_TABLE_SIZE; i++) { + crc = tab[0][i]; + for (j = 1; j < LE_TABLE_ROWS; j++) { + crc = tab[0][crc & 0xff] ^ (crc >> 8); + tab[j][i] = crc; + } + } +} + +static void crc32init_le(void) +{ + crc32init_le_generic(CRCPOLY_LE, crc32table_le); +} + +static void crc32cinit_le(void) +{ + crc32init_le_generic(CRC32C_POLY_LE, crc32ctable_le); +} + +/** + * crc32init_be() - allocate and initialize BE table data + */ +#if 0 /* not used */ +static void crc32init_be(void) +{ + unsigned i, j; + uint32_t crc = 0x80000000; + + crc32table_be[0][0] = 0; + + for (i = 1; i < BE_TABLE_SIZE; i <<= 1) { + crc = (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0); + for (j = 0; j < i; j++) + crc32table_be[0][i + j] = crc ^ crc32table_be[0][j]; + } + for (i = 0; i < BE_TABLE_SIZE; i++) { + crc = crc32table_be[0][i]; + for (j = 1; j < BE_TABLE_ROWS; j++) { + crc = crc32table_be[0][(crc >> 24) & 0xff] ^ (crc << 8); + crc32table_be[j][i] = crc; + } + } +} +#endif + +static void output_table(uint32_t (*table)[256], int rows, int len, char *trans) +{ + int i, j; + + for (j = 0 ; j < rows; j++) { + printf("{"); + for (i = 0; i < len - 1; i++) { + if (i % ENTRIES_PER_LINE == 0) + printf("\n"); + printf("%s(0x%8.8xL), ", trans, table[j][i]); + } + printf("%s(0x%8.8xL)},\n", trans, table[j][len - 1]); + } +} + +int main(int argc, char** argv) +{ + printf("/* this file is generated - do not edit */\n\n"); + + if (CRC_LE_BITS > 1) { + crc32init_le(); + printf("static u32 crc32table_le[%d][%d] = {", + LE_TABLE_ROWS, LE_TABLE_SIZE); + output_table(crc32table_le, LE_TABLE_ROWS, + LE_TABLE_SIZE, "tole"); + printf("};\n"); + } + +#if 0 /* not used by xfsprogs */ + if (CRC_BE_BITS > 1) { + crc32init_be(); + printf("static u32 crc32table_be[%d][%d] = {", + BE_TABLE_ROWS, BE_TABLE_SIZE); + output_table(crc32table_be, LE_TABLE_ROWS, + BE_TABLE_SIZE, "tobe"); + printf("};\n"); + } +#endif + if (CRC_LE_BITS > 1) { + crc32cinit_le(); + printf("static u32 crc32ctable_le[%d][%d] = {", + LE_TABLE_ROWS, LE_TABLE_SIZE); + output_table(crc32ctable_le, LE_TABLE_ROWS, + LE_TABLE_SIZE, "tole"); + printf("};\n"); + } + + return 0; +} -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 539B37F52 for ; Mon, 21 Jan 2013 07:53:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34011304048 for ; Mon, 21 Jan 2013 05:53:27 -0800 (PST) X-ASG-Debug-ID: 1358776396-04cbb00c6643830002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GfGnOuXrjJH76DFV for ; Mon, 21 Jan 2013 05:53:25 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgYGTkDGxmIGKwpjnGOBIM1A6ZVgwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:24 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoR-0001Op-Rp for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005o1-NB for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/12] xfsprogs: take inode version number into account in literal area Date: Tue, 22 Jan 2013 00:53:02 +1100 X-ASG-Orig-Subj: [PATCH 03/12] xfsprogs: take inode version number into account in literal area Message-Id: <1358776391-22140-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776400 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner So that version 3 inodes can be handled transparently. Signed-off-by: Dave Chinner --- db/check.c | 3 ++- db/metadump.c | 3 ++- include/xfs_dinode.h | 6 +++--- include/xfs_inode.h | 5 +++-- libxfs/xfs_attr_leaf.c | 6 ++++-- libxfs/xfs_bmap.c | 4 ++-- repair/dinode.c | 8 +++++--- repair/prefetch.c | 3 ++- 8 files changed, 23 insertions(+), 15 deletions(-) diff --git a/db/check.c b/db/check.c index 5921779..2a817d8 100644 --- a/db/check.c +++ b/db/check.c @@ -2715,7 +2715,8 @@ process_inode( error++; return; } - if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) { + if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= + XFS_LITINO(mp, dip->di_version)) { if (v) dbprintf(_("bad fork offset %d for inode %lld\n"), idic.di_forkoff, id->ino); diff --git a/db/metadump.c b/db/metadump.c index ff534fa..c6cac27 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1607,7 +1607,8 @@ process_inode( nametable_clear(); /* copy extended attributes if they exist and forkoff is valid */ - if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) { + if (success && XFS_DFORK_DSIZE(dip, mp) < + XFS_LITINO(mp, dip->di_version)) { attr_data.remote_val_count = 0; switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 1d9643b..88a3368 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -104,7 +104,7 @@ typedef enum xfs_dinode_fmt { /* * Inode size for given fs. */ -#define XFS_LITINO(mp) \ +#define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) #define XFS_BROOT_SIZE_ADJ \ @@ -119,10 +119,10 @@ typedef enum xfs_dinode_fmt { #define XFS_DFORK_DSIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ XFS_DFORK_BOFF(dip) : \ - XFS_LITINO(mp)) + XFS_LITINO(mp, (dip)->di_version)) #define XFS_DFORK_ASIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ - XFS_LITINO(mp) - XFS_DFORK_BOFF(dip) : \ + XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \ 0) #define XFS_DFORK_SIZE(dip,mp,w) \ ((w) == XFS_DATA_FORK ? \ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 437b3af..809a8d5 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -180,10 +180,11 @@ typedef struct xfs_icdinode { #define XFS_IFORK_DSIZE(ip) \ (XFS_IFORK_Q(ip) ? \ XFS_IFORK_BOFF(ip) : \ - XFS_LITINO((ip)->i_mount)) + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) #define XFS_IFORK_ASIZE(ip) \ (XFS_IFORK_Q(ip) ? \ - XFS_LITINO((ip)->i_mount) - XFS_IFORK_BOFF(ip) : \ + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ + XFS_IFORK_BOFF(ip) : \ 0) #define XFS_IFORK_SIZE(ip,w) \ ((w) == XFS_DATA_FORK ? \ diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 824c122..426130f 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -141,7 +141,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) int dsize; xfs_mount_t *mp = dp->i_mount; - offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ + /* rounded down */ + offset = (XFS_LITINO(mp, dp->i_d.di_version) - bytes) >> 3; switch (dp->i_d.di_format) { case XFS_DINODE_FMT_DEV: @@ -212,7 +213,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) minforkoff = roundup(minforkoff, 8) >> 3; /* attr fork btree root can have at least this many key/ptr pairs */ - maxforkoff = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS); + maxforkoff = XFS_LITINO(mp, dp->i_d.di_version) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); maxforkoff = maxforkoff >> 3; /* rounded down */ if (offset >= maxforkoff) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index b328a0b..26358c8 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3014,13 +3014,13 @@ xfs_default_attroffset( uint offset; if (mp->m_sb.sb_inodesize == 256) { - offset = XFS_LITINO(mp) - + offset = XFS_LITINO(mp, ip->i_d.di_version) - XFS_BMDR_SPACE_CALC(MINABTPTRS); } else { offset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); } - ASSERT(offset < XFS_LITINO(mp)); + ASSERT(offset < XFS_LITINO(mp, ip->i_d.di_version)); return offset; } diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..f564216 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -250,7 +250,8 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) /* and clear the forks */ if (dirty && !no_modify) - memset(XFS_DFORK_DPTR(dino), 0, XFS_LITINO(mp)); + memset(XFS_DFORK_DPTR(dino), 0, + XFS_LITINO(mp, dino->di_version)); return(dirty); } @@ -1919,11 +1920,12 @@ _("bad attr fork offset %d in dev inode %" PRIu64 ", should be %d\n"), case XFS_DINODE_FMT_LOCAL: /* fall through ... */ case XFS_DINODE_FMT_EXTENTS: /* fall through ... */ case XFS_DINODE_FMT_BTREE: - if (dino->di_forkoff >= (XFS_LITINO(mp) >> 3)) { + if (dino->di_forkoff >= + (XFS_LITINO(mp, dino->di_version) >> 3)) { do_warn( _("bad attr fork offset %d in inode %" PRIu64 ", max=%d\n"), dino->di_forkoff, lino, - XFS_LITINO(mp) >> 3); + XFS_LITINO(mp, dino->di_version) >> 3); return 1; } break; diff --git a/repair/prefetch.c b/repair/prefetch.c index c0b1002..b787663 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -374,7 +374,8 @@ pf_read_inode_dirs( continue; if ((dino->di_forkoff != 0) && - (dino->di_forkoff >= (XFS_LITINO(mp) >> 3))) + (dino->di_forkoff >= + (XFS_LITINO(mp, dino->di_version) >> 3))) continue; switch (dino->di_format) { -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 41A847F52 for ; Mon, 21 Jan 2013 07:53:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FDE28F8033 for ; Mon, 21 Jan 2013 05:53:28 -0800 (PST) X-ASG-Debug-ID: 1358776405-04cbb00c6543840001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id s4DPGVzApV20J3zR for ; Mon, 21 Jan 2013 05:53:26 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgYGTkDGxmIGKwpjnGMdoEOgzUDplWDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:24 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoS-0001Oy-26 for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:24 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oV-Ur for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/12] libxfs: add support for crc headers on remote symlinks Date: Tue, 22 Jan 2013 00:53:08 +1100 X-ASG-Orig-Subj: [PATCH 09/12] libxfs: add support for crc headers on remote symlinks Message-Id: <1358776391-22140-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776405 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 1 + include/xfs_buf_item.h | 4 +- include/xfs_symlink.h | 43 ++++++++++++++ libxfs/Makefile | 2 +- libxfs/xfs_symlink.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 include/xfs_symlink.h create mode 100644 libxfs/xfs_symlink.c diff --git a/include/Makefile b/include/Makefile index 9ed5077..54241bd 100644 --- a/include/Makefile +++ b/include/Makefile @@ -28,8 +28,8 @@ QAHFILES = libxfs.h libxlog.h \ xfs_dir_sf.h xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ - xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ - xfs_trans.h xfs_trans_space.h xfs_types.h xfs_dfrag.h + xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_symlink.h \ + xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_types.h xfs_dfrag.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h HFILES += $(PKG_PLATFORM).h diff --git a/include/libxfs.h b/include/libxfs.h index f66da03..29767ef 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -56,6 +56,7 @@ #include #include #include +#include #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index d1eeeab..298438f 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -50,6 +50,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_SB_BUF (1<<10) +#define XFS_BLF_SYMLINK_BUF (1<<11) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -60,7 +61,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ XFS_BLF_DINO_BUF | \ - XFS_BLF_SB_BUF) + XFS_BLF_SB_BUF | \ + XFS_BLF_SYMLINK_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h new file mode 100644 index 0000000..bb21e6a --- /dev/null +++ b/include/xfs_symlink.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. All rights reserved. + */ +#ifndef __XFS_SYMLINK_H +#define __XFS_SYMLINK_H 1 + +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. + */ +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); + +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + +#ifdef __KERNEL__ + +int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, + const char *target_path, umode_t mode, struct xfs_inode **ipp); +int xfs_readlink(struct xfs_inode *ip, char *link); +int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); + +#endif /* __KERNEL__ */ +#endif /* __XFS_SYMLINK_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 28f71c8..75f365c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -17,7 +17,7 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c \ - crc32.c + crc32.c xfs_symlink.c CFILES += $(PKG_PLATFORM).c PCFILES = darwin.c freebsd.c irix.c linux.c diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c new file mode 100644 index 0000000..e018abc --- /dev/null +++ b/libxfs/xfs_symlink.c @@ -0,0 +1,154 @@ +/* + * Copyright 2013 Red Hat, Inc. + * All rights reserved. + */ + +#include "xfs.h" + +/* + * Each contiguous block has a header, so it is not just a simple pathlen + * to FSB conversion. + */ +int +xfs_symlink_blocks( + struct xfs_mount *mp, + int pathlen) +{ + int fsblocks = 0; + int len = pathlen; + + do { + fsblocks++; + len -= XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + ASSERT(fsblocks <= XFS_SYMLINK_MAPS); + return fsblocks; +} + +/* + * XXX: this need to be used by mkfs/proto.c to create symlinks. + */ +static int +xfs_symlink_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); + dsl->sl_offset = cpu_to_be32(offset); + dsl->sl_bytes = cpu_to_be32(size); + uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); + dsl->sl_owner = cpu_to_be64(ino); + dsl->sl_blkno = cpu_to_be64(bp->b_bn); + bp->b_ops = &xfs_symlink_buf_ops; + + return sizeof(struct xfs_dsymlink_hdr); +} + +/* + * Checking of the symlink header is split into two parts. the verifier does + * CRC, location and bounds checking, the unpacking function checks the path + * parameters and owner. + */ +bool +xfs_symlink_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (offset != be32_to_cpu(dsl->sl_offset)) + return false; + if (size != be32_to_cpu(dsl->sl_bytes)) + return false; + if (ino != be64_to_cpu(dsl->sl_owner)) + return false; + + /* ok */ + return true; + +} + +static bool +xfs_symlink_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) + return false; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) + return false; + if (be32_to_cpu(dsl->sl_offset) + + be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) + return false; + if (dsl->sl_owner == 0) + return false; + + return true; +} + +static void +xfs_symlink_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + !xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_symlink_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)); +} + +const struct xfs_buf_ops xfs_symlink_buf_ops = { + .verify_read = xfs_symlink_read_verify, + .verify_write = xfs_symlink_write_verify, +}; + -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B7F8C7F55 for ; Mon, 21 Jan 2013 07:53:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 624CCAC008 for ; Mon, 21 Jan 2013 05:53:31 -0800 (PST) X-ASG-Debug-ID: 1358776409-04bdf0231d45640001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 7KLAl6ccNtz5ZC6G for ; Mon, 21 Jan 2013 05:53:30 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAP9G/VB5LETJ/2dsb2JhbABEvioXc4J7O4ECA4hMDZsHkRWOcY0TfYMpA6ZVgwmBUw Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:29 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoH-0001Of-NY for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoH-0005np-Iy for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/12, DEV-ONLY] xfsprogs: metadata CRC support, first batch Date: Tue, 22 Jan 2013 00:52:59 +1100 X-ASG-Orig-Subj: [PATCH 00/12, DEV-ONLY] xfsprogs: metadata CRC support, first batch Message-Id: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776409 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, Here is the userspace side of the first batch of kernel patches for metadata CRC support. It needs to be applied on top of the kernel sync patch I sent here: http://oss.sgi.com/archives/xfs/2013-01/msg00188.html This batch of patches covers the porting of the kernel crc32c code, syncing the kernel log recovery code to libxlog, and metadata CRC support for inodes, freespace, quota, superblock and symlinks. It does not cover directory or attribute metadata - that will be sent as a separate patch. This code is functional, but not pretty and probably pretty much unreviewable. There are outstanding issues like how to report verifier errors in a sane way that is source compatible with the kernel code, how to factor all the repeated copy-n-paste template code so taht kernel and userspace share code sanely, and so on. The xfs_db code is not fully converted - xfs_check does not work at all on metadata CRC enabled filesystems, so if you want to run xfstests, you need to set XFS_CHECK_PROG="/bin/true" in common.config. I haven't touched xfs_copy, metadata, quota, io, etc, and I know that xfs_io sees metadata CRC enabled filesystems as foreign because it doesn't believe that version 5 superblocks are valid.... xfs_reapir mostly works - it's got some interesting extra output to do with verifier failure so that I can debug problems. I added these filters to _filter_repair() in common.repair: # crc enabled filesystems /XFS_CORRUPTION_ERROR/ && next; /^bad uuid/ && next; so that most of the noise is filtered out and so most xfstests pass just fine. Quite a few tests have mkfs output in their golden image, and hence they fail because of the new crc information line in the output. The userspace verifier support is pretty cool - if xfs_repair fixes something incorrectly, the verifier will pick it up as being bad and it doesn't get written to disk. Error handling of these situations is currently non-existent, which is why there is error output in these cases. This has found several problems and lots of redundant checks and fixes in xfs_repair - having to fix the same problem in 3 different phases which have 3 different implementations of the same corruption detection gets old in a hurry.... The overall diffstat for this series currently stands at: 93 files changed, 4126 insertions(+), 961 deletions(-) and that is on top of the initial kernel sync patch. Once again, I don't expect this patch set to be reviewed - I'm providing it so that the kernel code that needs review can be exercised and tested ..... ObWarning to non-developers: This code eats babies for fun and profit. Unless you are going to be testing, reviewing and reporting problems with the code as part of the development process, do not apply this patch set. Yeah, I know, all the cool kids are doing CRCs these days - it'll be ready to go soon, and then you can get your fix... Cheers, Dave. From dave@fromorbit.com Mon Jan 21 07:53:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 918EE7F52 for ; Mon, 21 Jan 2013 07:53:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 126F2AC006 for ; Mon, 21 Jan 2013 05:53:30 -0800 (PST) X-ASG-Debug-ID: 1358776396-04cbb00c6643830003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZgLjvLW4uoLiVkQM for ; Mon, 21 Jan 2013 05:53:26 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFGg0vMwgYMTkDGxmIGKwpjnGNEgyEGwOSWZN8gwmBVCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:24 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoH-0001Oh-Qr for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoH-0005nx-MP for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:13 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/12] xfsprogs: updata libxlog to current kernel code Date: Tue, 22 Jan 2013 00:53:01 +1100 X-ASG-Orig-Subj: [PATCH 02/12] xfsprogs: updata libxlog to current kernel code Message-Id: <1358776391-22140-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776406 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Update the log recovery code to match the current 3.8-rc2 kernel code. Note: while this introduces CRC validation infrastructure, it is currently short-circuited as we cannot validate the CRC from userspace because we do not know what the size of the log buffer was that wrote the header. This information is not written into the log header anywhere, so we have no way of working out the correct number of extra headers that need to be summed. This is also a problem for the kernel code, and needs fixing. Signed-off-by: Dave Chinner --- db/sb.c | 7 +- include/libxlog.h | 32 ++--- libxlog/xfs_log_recover.c | 301 +++++++++++++++++++++++++++----------------- logprint/log_copy.c | 2 +- logprint/log_dump.c | 2 +- logprint/log_misc.c | 4 +- logprint/log_print_all.c | 2 +- logprint/log_print_trans.c | 4 +- logprint/logprint.c | 2 +- logprint/logprint.h | 10 +- repair/phase2.c | 7 +- 11 files changed, 229 insertions(+), 144 deletions(-) diff --git a/db/sb.c b/db/sb.c index 21f38c5..d83db9c 100644 --- a/db/sb.c +++ b/db/sb.c @@ -205,12 +205,15 @@ get_sb(xfs_agnumber_t agno, xfs_sb_t *sb) } /* workaround craziness in the xlog routines */ -int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return 0; } +int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) +{ + return 0; +} int sb_logcheck(void) { - xlog_t log; + struct xlog log; xfs_daddr_t head_blk, tail_blk; if (mp->m_sb.sb_logstart) { diff --git a/include/libxlog.h b/include/libxlog.h index d1142ab..36ede59 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -24,7 +24,7 @@ * xlog_t that we actually need to get our work done, avoiding * the need to define any exotic kernel types in userland. */ -typedef struct log { +struct xlog { xfs_lsn_t l_tail_lsn; /* lsn of 1st LR w/ unflush buffers */ xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ xfs_mount_t *l_mp; /* mount point */ @@ -45,7 +45,7 @@ typedef struct log { uint l_sectbb_mask; /* sector size (in BBs) * alignment mask */ int l_sectBBsize; /* size of log sector in 512 byte chunks */ -} xlog_t; +}; #include #include @@ -76,6 +76,10 @@ typedef union { #define unlikely(x) (x) #define min(a,b) ((a) < (b) ? (a) : (b)) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_hex_dump(d,n) ((void) 0) + extern void xlog_warn(char *fmt,...); extern void xlog_exit(char *fmt,...); extern void xlog_panic(char *fmt,...); @@ -88,34 +92,34 @@ extern int print_record_header; /* libxfs parameters */ extern libxfs_init_t x; -extern struct xfs_buf *xlog_get_bp(xlog_t *, int); +extern struct xfs_buf *xlog_get_bp(struct xlog *, int); extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *log, xfs_daddr_t blk_no, int nbblks, +extern int xlog_bread(struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp, xfs_caddr_t *offset); -extern int xlog_bread_noalign(xlog_t *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp); +extern int xlog_bread_noalign(struct xlog *log, xfs_daddr_t blk_no, + int nbblks, xfs_buf_t *bp); -extern int xlog_find_zeroed(xlog_t *log, xfs_daddr_t *blk_no); -extern int xlog_find_cycle_start(xlog_t *log, xfs_buf_t *bp, +extern int xlog_find_zeroed(struct xlog *log, xfs_daddr_t *blk_no); +extern int xlog_find_cycle_start(struct xlog *log, xfs_buf_t *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk, uint cycle); -extern int xlog_find_tail(xlog_t *log, xfs_daddr_t *head_blk, +extern int xlog_find_tail(struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk); -extern int xlog_test_footer(xlog_t *log); -extern int xlog_recover(xlog_t *log, int readonly); +extern int xlog_test_footer(struct xlog *log); +extern int xlog_recover(struct xlog *log, int readonly); extern void xlog_recover_print_data(xfs_caddr_t p, int len); extern void xlog_recover_print_logitem(xlog_recover_item_t *item); extern void xlog_recover_print_trans_head(xlog_recover_t *tr); -extern int xlog_print_find_oldest(xlog_t *log, xfs_daddr_t *last_blk); +extern int xlog_print_find_oldest(struct xlog *log, xfs_daddr_t *last_blk); /* for transactional view */ extern void xlog_recover_print_trans_head(xlog_recover_t *tr); extern void xlog_recover_print_trans(xlog_recover_t *trans, struct list_head *itemq, int print); -extern int xlog_do_recovery_pass(xlog_t *log, xfs_daddr_t head_blk, +extern int xlog_do_recovery_pass(struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass); -extern int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *trans, +extern int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *trans, int pass); extern int xlog_header_check_recover(xfs_mount_t *mp, xlog_rec_header_t *head); diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 23fe6fd..ad53e86 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -18,10 +18,11 @@ #include -#define xlog_unpack_data_checksum(rhead, dp, log) ((void)0) -#define xlog_clear_stale_blocks(log, tail_lsn) (0) #define xfs_readonly_buftarg(buftarg) (0) +/* avoid set-but-unused var warning. gcc is not very bright. */ +#define xlog_clear_stale_blocks(log, taillsn) ((taillsn) = (taillsn)) + /* * Verify the given count of basic blocks is valid number of blocks @@ -31,7 +32,7 @@ static inline int xlog_buf_bbcount_valid( - xlog_t *log, + struct xlog *log, int bbcount) { return bbcount > 0 && bbcount <= log->l_logBBsize; @@ -44,11 +45,11 @@ xlog_buf_bbcount_valid( */ xfs_buf_t * xlog_get_bp( - xlog_t *log, + struct xlog *log, int nbblks) { if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return NULL; @@ -57,7 +58,7 @@ xlog_get_bp( /* * We do log I/O in units of log sectors (a power-of-2 * multiple of the basic block size), so we round up the - * requested size to acommodate the basic blocks required + * requested size to accommodate the basic blocks required * for complete log sectors. * * In addition, the buffer may be used for a non-sector- @@ -68,12 +69,11 @@ xlog_get_bp( * an issue. Nor will this be a problem if the log I/O is * done in basic blocks (sector size 1). But otherwise we * extend the buffer by one extra log sector to ensure - * there's space to accomodate this possiblility. + * there's space to accommodate this possibility. */ if (nbblks > 1 && log->l_sectBBsize > 1) nbblks += log->l_sectBBsize; - if (log->l_sectBBsize) - nbblks = round_up(nbblks, log->l_sectBBsize); + nbblks = round_up(nbblks, log->l_sectBBsize); return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, nbblks); } @@ -91,57 +91,54 @@ xlog_put_bp( */ STATIC xfs_caddr_t xlog_align( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + struct xfs_buf *bp) { - xfs_daddr_t offset = 0; - - if (log->l_sectBBsize) - offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); + xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); - ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp)); - return XFS_BUF_PTR(bp) + BBTOB(offset); + ASSERT(offset + nbblks <= bp->b_length); + return bp->b_addr + BBTOB(offset); } + /* * nbblks should be uint, but oh well. Just want to catch that 32-bit length. */ int xlog_bread_noalign( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + struct xfs_buf *bp) { if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return EFSCORRUPTED; } - if (log->l_sectBBsize > 1) { - blk_no = round_down(blk_no, log->l_sectBBsize); - nbblks = round_up(nbblks, log->l_sectBBsize); - } + blk_no = round_down(blk_no, log->l_sectBBsize); + nbblks = round_up(nbblks, log->l_sectBBsize); ASSERT(nbblks > 0); ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp)); XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); + bp->b_error = 0; return libxfs_readbufr(log->l_dev, XFS_BUF_ADDR(bp), bp, nbblks, 0); } int xlog_bread( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp, + struct xfs_buf *bp, xfs_caddr_t *offset) { int error; @@ -155,6 +152,35 @@ xlog_bread( } /* + * Read at an offset into the buffer. Returns with the buffer in it's original + * state regardless of the result of the read. + */ +STATIC int +xlog_bread_offset( + struct xlog *log, + xfs_daddr_t blk_no, /* block to read from */ + int nbblks, /* blocks to read */ + struct xfs_buf *bp, + xfs_caddr_t offset) +{ + xfs_caddr_t orig_offset = bp->b_addr; + int orig_len = bp->b_bcount; + int error, error2; + + error = XFS_BUF_SET_PTR(bp, offset, BBTOB(nbblks)); + if (error) + return error; + + error = xlog_bread_noalign(log, blk_no, nbblks, bp); + + /* must reset buffer pointer even on error */ + error2 = XFS_BUF_SET_PTR(bp, orig_offset, orig_len); + if (error) + return error; + return error2; +} + +/* * This routine finds (to an approximation) the first block in the physical * log which contains the given cycle. It uses a binary search algorithm. * Note that the algorithm can not be perfect because the disk will not @@ -162,8 +188,8 @@ xlog_bread( */ int xlog_find_cycle_start( - xlog_t *log, - xfs_buf_t *bp, + struct xlog *log, + struct xfs_buf *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk, uint cycle) @@ -205,7 +231,7 @@ xlog_find_cycle_start( */ STATIC int xlog_find_verify_cycle( - xlog_t *log, + struct xlog *log, xfs_daddr_t start_blk, int nbblks, uint stop_on_cycle_no, @@ -225,9 +251,11 @@ xlog_find_verify_cycle( * a log sector, or we're out of luck. */ bufblks = 1 << ffs(nbblks); + while (bufblks > log->l_logBBsize) + bufblks >>= 1; while (!(bp = xlog_get_bp(log, bufblks))) { bufblks >>= 1; - if (bufblks < MAX(log->l_sectBBsize, 1)) + if (bufblks < log->l_sectBBsize) return ENOMEM; } @@ -272,7 +300,7 @@ out: */ STATIC int xlog_find_verify_log_record( - xlog_t *log, + struct xlog *log, xfs_daddr_t start_blk, xfs_daddr_t *last_blk, int extra_bblks) @@ -302,8 +330,8 @@ xlog_find_verify_log_record( for (i = (*last_blk) - 1; i >= 0; i--) { if (i < start_blk) { /* valid log record not found */ - xlog_warn( - "XFS: Log inconsistent (didn't find previous header)"); + xfs_warn(log->l_mp, + "Log inconsistent (didn't find previous header)"); ASSERT(0); error = XFS_ERROR(EIO); goto out; @@ -317,7 +345,7 @@ xlog_find_verify_log_record( head = (xlog_rec_header_t *)offset; - if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(head->h_magicno)) + if (head->h_magicno == cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) break; if (!smallmem) @@ -382,7 +410,7 @@ out: */ STATIC int xlog_find_head( - xlog_t *log, + struct xlog *log, xfs_daddr_t *return_head_blk) { xfs_buf_t *bp; @@ -403,12 +431,12 @@ xlog_find_head( * mkfs etc write a dummy unmount record to a fresh * log so we can store the uuid in there */ - xlog_warn("XFS: totally zeroed log"); + xfs_warn(log->l_mp, "totally zeroed log"); } return 0; } else if (error) { - xlog_warn("XFS: empty log check failed"); + xfs_warn(log->l_mp, "empty log check failed"); return error; } @@ -631,7 +659,7 @@ validate_head: xlog_put_bp(bp); if (error) - xlog_warn("XFS: failed to find log head"); + xfs_warn(log->l_mp, "failed to find log head"); return error; } @@ -653,7 +681,7 @@ validate_head: */ int xlog_find_tail( - xlog_t *log, + struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk) { @@ -699,7 +727,7 @@ xlog_find_tail( if (error) goto done; - if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { + if (*(__be32 *)offset == cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) { found = 1; break; } @@ -716,15 +744,15 @@ xlog_find_tail( if (error) goto done; - if (XLOG_HEADER_MAGIC_NUM == - be32_to_cpu(*(__be32 *)offset)) { + if (*(__be32 *)offset == + cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) { found = 2; break; } } } if (!found) { - xlog_warn("XFS: xlog_find_tail: couldn't find sync record"); + xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -750,9 +778,9 @@ xlog_find_tail( log->l_curr_cycle++; atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); - xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, + xlog_assign_grant_head(&log->l_reserve_head.grant, log->l_curr_cycle, BBTOB(log->l_curr_block)); - xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, + xlog_assign_grant_head(&log->l_write_head.grant, log->l_curr_cycle, BBTOB(log->l_curr_block)); /* @@ -840,7 +868,7 @@ done: xlog_put_bp(bp); if (error) - xlog_warn("XFS: failed to locate log tail"); + xfs_warn(log->l_mp, "failed to locate log tail"); return error; } @@ -862,7 +890,7 @@ done: */ int xlog_find_zeroed( - xlog_t *log, + struct xlog *log, xfs_daddr_t *blk_no) { xfs_buf_t *bp; @@ -904,7 +932,8 @@ xlog_find_zeroed( * the first block must be 1. If it's not, maybe we're * not looking at a log... Bail out. */ - xlog_warn("XFS: Log inconsistent or not a log (last==0, first!=1)"); + xfs_warn(log->l_mp, + "Log inconsistent or not a log (last==0, first!=1)"); return XFS_ERROR(EINVAL); } @@ -1002,8 +1031,8 @@ xlog_recover_add_item( STATIC int xlog_recover_add_to_cont_trans( - struct log *log, - xlog_recover_t *trans, + struct xlog *log, + struct xlog_recover *trans, xfs_caddr_t dp, int len) { @@ -1025,7 +1054,7 @@ xlog_recover_add_to_cont_trans( old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; old_len = item->ri_buf[item->ri_cnt-1].i_len; - ptr = kmem_realloc(old_ptr, len+old_len, old_len, 0u); + ptr = kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); memcpy(&ptr[old_len], dp, len); /* d, s, l */ item->ri_buf[item->ri_cnt-1].i_len += len; item->ri_buf[item->ri_cnt-1].i_addr = ptr; @@ -1048,8 +1077,8 @@ xlog_recover_add_to_cont_trans( */ STATIC int xlog_recover_add_to_trans( - struct log *log, - xlog_recover_t *trans, + struct xlog *log, + struct xlog_recover *trans, xfs_caddr_t dp, int len) { @@ -1062,8 +1091,8 @@ xlog_recover_add_to_trans( if (list_empty(&trans->r_itemq)) { /* we need to catch log corruptions here */ if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { - xlog_warn("XFS: xlog_recover_add_to_trans: " - "bad header magic number"); + xfs_warn(log->l_mp, "%s: bad header magic number", + __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -1090,8 +1119,8 @@ xlog_recover_add_to_trans( if (item->ri_total == 0) { /* first region to be added */ if (in_f->ilf_size == 0 || in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { - xlog_warn( - "XFS: bad number of regions (%d) in inode log format", + xfs_warn(log->l_mp, + "bad number of regions (%d) in inode log format", in_f->ilf_size); ASSERT(0); return XFS_ERROR(EIO); @@ -1144,7 +1173,7 @@ xlog_recover_free_trans( */ STATIC int xlog_recover_commit_trans( - struct log *log, + struct xlog *log, struct xlog_recover *trans, int pass) { @@ -1163,7 +1192,7 @@ xlog_recover_unmount_trans( xlog_recover_t *trans) { /* Do nothing now */ - xlog_warn("XFS: xlog_recover_unmount_trans: Unmount LR"); + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); return 0; } @@ -1178,9 +1207,9 @@ xlog_recover_unmount_trans( */ STATIC int xlog_recover_process_data( - xlog_t *log, + struct xlog *log, struct hlist_head rhash[], - xlog_rec_header_t *rhead, + struct xlog_rec_header *rhead, xfs_caddr_t dp, int pass) { @@ -1206,8 +1235,8 @@ xlog_recover_process_data( dp += sizeof(xlog_op_header_t); if (ohead->oh_clientid != XFS_TRANSACTION && ohead->oh_clientid != XFS_LOG) { - xlog_warn( - "XFS: xlog_recover_process_data: bad clientid"); + xfs_warn(log->l_mp, "%s: bad clientid 0x%x", + __func__, ohead->oh_clientid); ASSERT(0); return (XFS_ERROR(EIO)); } @@ -1220,8 +1249,8 @@ xlog_recover_process_data( be64_to_cpu(rhead->h_lsn)); } else { if (dp + be32_to_cpu(ohead->oh_len) > lp) { - xlog_warn( - "XFS: xlog_recover_process_data: bad length"); + xfs_warn(log->l_mp, "%s: bad length 0x%x", + __func__, be32_to_cpu(ohead->oh_len)); return (XFS_ERROR(EIO)); } flags = ohead->oh_flags & ~XLOG_END_TRANS; @@ -1241,8 +1270,8 @@ xlog_recover_process_data( be32_to_cpu(ohead->oh_len)); break; case XLOG_START_TRANS: - xlog_warn( - "XFS: xlog_recover_process_data: bad transaction"); + xfs_warn(log->l_mp, "%s: bad transaction", + __func__); ASSERT(0); error = XFS_ERROR(EIO); break; @@ -1252,8 +1281,8 @@ xlog_recover_process_data( dp, be32_to_cpu(ohead->oh_len)); break; default: - xlog_warn( - "XFS: xlog_recover_process_data: bad flag"); + xfs_warn(log->l_mp, "%s: bad flag 0x%x", + __func__, flags); ASSERT(0); error = XFS_ERROR(EIO); break; @@ -1267,13 +1296,64 @@ xlog_recover_process_data( return 0; } -STATIC void +/* + * Upack the log buffer data and crc check it. If the check fails, issue a + * warning if and only if the CRC in the header is non-zero. This makes the + * check an advisory warning, and the zero CRC check will prevent failure + * warnings from being emitted when upgrading the kernel from one that does not + * add CRCs by default. + * + * When filesystems are CRC enabled, this CRC mismatch becomes a fatal log + * corruption failure + * + * XXX: we cannot calculate the CRC here without knowing the number of extra + * headers taht were CRC'd in log write. This information is derived from the + * in-core log buffer size, and is not written to the log! Hence for now we + * simple *cannot* verify the CRCs, and so we short circuit it. + */ +#define xlog_cksum(l,r,dp,len) ((r)->h_crc) +STATIC int +xlog_unpack_data_crc( + struct xlog_rec_header *rhead, + xfs_caddr_t dp, + struct xlog *log) +{ + __le32 crc; + + crc = xlog_cksum(log, rhead, dp, be32_to_cpu(rhead->h_len)); + if (crc != rhead->h_crc) { + if (rhead->h_crc || xfs_sb_version_hascrc(&log->l_mp->m_sb)) { + xfs_alert(log->l_mp, + "log record CRC mismatch: found 0x%x, expected 0x%x.\n", + le32_to_cpu(rhead->h_crc), + le32_to_cpu(crc)); + xfs_hex_dump(dp, 32); + } + + /* + * If we've detected a log record corruption, then we can't + * recover past this point. Abort recovery if we are enforcing + * CRC protection by punting an error back up the stack. + */ + if (xfs_sb_version_hascrc(&log->l_mp->m_sb)) + return EFSCORRUPTED; + } + + return 0; +} + +STATIC int xlog_unpack_data( - xlog_rec_header_t *rhead, + struct xlog_rec_header *rhead, xfs_caddr_t dp, - xlog_t *log) + struct xlog *log) { int i, j, k; + int error; + + error = xlog_unpack_data_crc(rhead, dp, log); + if (error) + return error; for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { @@ -1290,17 +1370,19 @@ xlog_unpack_data( dp += BBSIZE; } } + + return 0; } STATIC int xlog_valid_rec_header( - xlog_t *log, - xlog_rec_header_t *rhead, + struct xlog *log, + struct xlog_rec_header *rhead, xfs_daddr_t blkno) { int hlen; - if (unlikely(be32_to_cpu(rhead->h_magicno) != XLOG_HEADER_MAGIC_NUM)) { + if (unlikely(rhead->h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))) { XFS_ERROR_REPORT("xlog_valid_rec_header(1)", XFS_ERRLEVEL_LOW, log->l_mp); return XFS_ERROR(EFSCORRUPTED); @@ -1308,7 +1390,7 @@ xlog_valid_rec_header( if (unlikely( (!rhead->h_version || (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) { - xlog_warn("XFS: %s: unrecognised log version (%d).", + xfs_warn(log->l_mp, "%s: unrecognised log version (%d).", __func__, be32_to_cpu(rhead->h_version)); return XFS_ERROR(EIO); } @@ -1338,7 +1420,7 @@ xlog_valid_rec_header( */ int xlog_do_recovery_pass( - xlog_t *log, + struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass) @@ -1421,9 +1503,13 @@ xlog_do_recovery_pass( if (error) goto bread_err2; - xlog_unpack_data(rhead, offset, log); - if ((error = xlog_recover_process_data(log, - rhash, rhead, offset, pass))) + error = xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; + + error = xlog_recover_process_data(log, + rhash, rhead, offset, pass); + if (error) goto bread_err2; blk_no += bblks + hblks; } @@ -1438,7 +1524,7 @@ xlog_do_recovery_pass( /* * Check for header wrapping around physical end-of-log */ - offset = XFS_BUF_PTR(hbp); + offset = hbp->b_addr; split_hblks = 0; wrapped_hblks = 0; if (blk_no + hblks <= log->l_logBBsize) { @@ -1474,19 +1560,9 @@ xlog_do_recovery_pass( * - order is important. */ wrapped_hblks = hblks - split_hblks; - error = XFS_BUF_SET_PTR(hbp, - offset + BBTOB(split_hblks), - BBTOB(hblks - split_hblks)); - if (error) - goto bread_err2; - - error = xlog_bread_noalign(log, 0, - wrapped_hblks, hbp); - if (error) - goto bread_err2; - - error = XFS_BUF_SET_PTR(hbp, offset, - BBTOB(hblks)); + error = xlog_bread_offset(log, 0, + wrapped_hblks, hbp, + offset + BBTOB(split_hblks)); if (error) goto bread_err2; } @@ -1508,7 +1584,7 @@ xlog_do_recovery_pass( } else { /* This log record is split across the * physical end of log */ - offset = XFS_BUF_PTR(dbp); + offset = dbp->b_addr; split_bblks = 0; if (blk_no != log->l_logBBsize) { /* some data is before the physical @@ -1537,25 +1613,20 @@ xlog_do_recovery_pass( * _first_, then the log start (LR header end) * - order is important. */ - error = XFS_BUF_SET_PTR(dbp, - offset + BBTOB(split_bblks), - BBTOB(bblks - split_bblks)); + error = xlog_bread_offset(log, 0, + bblks - split_bblks, dbp, + offset + BBTOB(split_bblks)); if (error) goto bread_err2; + } - error = xlog_bread_noalign(log, wrapped_hblks, - bblks - split_bblks, - dbp); - if (error) - goto bread_err2; + error = xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; - error = XFS_BUF_SET_PTR(dbp, offset, h_size); - if (error) - goto bread_err2; - } - xlog_unpack_data(rhead, offset, log); - if ((error = xlog_recover_process_data(log, rhash, - rhead, offset, pass))) + error = xlog_recover_process_data(log, rhash, + rhead, offset, pass); + if (error) goto bread_err2; blk_no += bblks; } @@ -1580,9 +1651,13 @@ xlog_do_recovery_pass( if (error) goto bread_err2; - xlog_unpack_data(rhead, offset, log); - if ((error = xlog_recover_process_data(log, rhash, - rhead, offset, pass))) + error = xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; + + error = xlog_recover_process_data(log, rhash, + rhead, offset, pass); + if (error) goto bread_err2; blk_no += bblks + hblks; } diff --git a/logprint/log_copy.c b/logprint/log_copy.c index fd36317..f6ef0e9 100644 --- a/logprint/log_copy.c +++ b/logprint/log_copy.c @@ -24,7 +24,7 @@ void xfs_log_copy( - xlog_t *log, + struct xlog *log, int fd, char *filename) { diff --git a/logprint/log_dump.c b/logprint/log_dump.c index 1975b1b..a333077 100644 --- a/logprint/log_dump.c +++ b/logprint/log_dump.c @@ -24,7 +24,7 @@ void xfs_log_dump( - xlog_t *log, + struct xlog *log, int fd, int print_block_start) { diff --git a/logprint/log_misc.c b/logprint/log_misc.c index c480795..4277a48 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -816,7 +816,7 @@ xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *i, int num_ops) */ void -xlog_print_lseek(xlog_t *log, int fd, xfs_daddr_t blkno, int whence) +xlog_print_lseek(struct xlog *log, int fd, xfs_daddr_t blkno, int whence) { #define BBTOOFF64(bbs) (((xfs_off_t)(bbs)) << BBSHIFT) xfs_off_t offset; @@ -1265,7 +1265,7 @@ xlog_print_extended_headers( /* * This code is gross and needs to be rewritten. */ -void xfs_log_print(xlog_t *log, +void xfs_log_print(struct xlog *log, int fd, int print_block_start) { diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index cbc51d9..44fb4c4 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -23,7 +23,7 @@ */ int xlog_print_find_oldest( - struct log *log, + struct xlog *log, xfs_daddr_t *last_blk) { xfs_buf_t *bp; diff --git a/logprint/log_print_trans.c b/logprint/log_print_trans.c index 7405772..86e1c42 100644 --- a/logprint/log_print_trans.c +++ b/logprint/log_print_trans.c @@ -30,7 +30,7 @@ xlog_recover_print_trans_head( int xlog_recover_do_trans( - xlog_t *log, + struct xlog *log, xlog_recover_t *trans, int pass) { @@ -40,7 +40,7 @@ xlog_recover_do_trans( void xfs_log_print_trans( - xlog_t *log, + struct xlog *log, int print_block_start) { xfs_daddr_t head_blk, tail_blk; diff --git a/logprint/logprint.c b/logprint/logprint.c index 482fd4e..2a01780 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -128,7 +128,7 @@ main(int argc, char **argv) int c; int logfd; char *copy_file = NULL; - xlog_t log = {0}; + struct xlog log = {0}; xfs_mount_t mount; setlocale(LC_ALL, ""); diff --git a/logprint/logprint.h b/logprint/logprint.h index df4cea3..933c9e6 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -34,12 +34,12 @@ extern int print_no_print; /* exports */ extern char *trans_type[]; -extern void xlog_print_lseek(xlog_t *, int, xfs_daddr_t, int); +extern void xlog_print_lseek(struct xlog *, int, xfs_daddr_t, int); -extern void xfs_log_copy(xlog_t *, int, char *); -extern void xfs_log_dump(xlog_t *, int, int); -extern void xfs_log_print(xlog_t *, int, int); -extern void xfs_log_print_trans(xlog_t *, int); +extern void xfs_log_copy(struct xlog *, int, char *); +extern void xfs_log_dump(struct xlog *, int, int); +extern void xfs_log_print(struct xlog *, int, int); +extern void xfs_log_print_trans(struct xlog *, int); extern void print_xlog_record_line(void); extern void print_xlog_op_line(void); diff --git a/repair/phase2.c b/repair/phase2.c index 9fd591c..23b457a 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -29,13 +29,16 @@ void set_mp(xfs_mount_t *mpp); /* workaround craziness in the xlog routines */ -int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return 0; } +int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) +{ + return 0; +} static void zero_log(xfs_mount_t *mp) { int error; - xlog_t log; + struct xlog log; xfs_daddr_t head_blk, tail_blk; dev_t logdev = (mp->m_sb.sb_logstart == 0) ? x.logdev : x.ddev; -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7F43C7F3F for ; Mon, 21 Jan 2013 07:53:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EB888F8033 for ; Mon, 21 Jan 2013 05:53:43 -0800 (PST) X-ASG-Debug-ID: 1358776420-04cbb00c6643860001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 829es4dvn02IpRvh for ; Mon, 21 Jan 2013 05:53:40 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgYGTkDGxmIGKwpjnGOBIM1A6ZVgwmBVCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:34 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoS-0001Ot-0e for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:24 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oL-Sb for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/12] libxfs: add version 3 inode support Date: Tue, 22 Jan 2013 00:53:06 +1100 X-ASG-Orig-Subj: [PATCH 07/12] libxfs: add version 3 inode support Message-Id: <1358776391-22140-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776420 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner Header from folded patch 'debug': xfs_quota: fix report command parsing The report command line needs to be parsed as a whole not as individual elements - report_f() is set up to do this correctly. When treated as non-global command line, the report function is called once for each command line arg, resulting in reports being issued multiple times. Set the command to be a global command so that it is only called once. Signed-off-by: Dave Chinner --- db/dir2sf.c | 9 +++-- include/xfs_buf_item.h | 4 +- include/xfs_dinode.h | 33 +++++++++++++++-- include/xfs_inode.h | 26 +++++++++++++ libxfs/trans.c | 1 + libxfs/util.c | 30 ++++++++++++++- libxfs/xfs_ialloc.c | 25 ++++++++++++- libxfs/xfs_inode.c | 91 ++++++++++++++++++++++++++++++++++++++++------ logprint/log_misc.c | 2 +- logprint/log_print_all.c | 3 +- repair/phase6.c | 63 +++++++++++++++++++++++++++++--- 11 files changed, 257 insertions(+), 30 deletions(-) diff --git a/db/dir2sf.c b/db/dir2sf.c index 92f8a66..271e08a 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -74,10 +74,11 @@ dir2_inou_i4_count( void *obj, int startoff) { + struct xfs_dinode *dip = obj; xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return sf->hdr.i8count == 0; } @@ -87,10 +88,11 @@ dir2_inou_i8_count( void *obj, int startoff) { + struct xfs_dinode *dip = obj; xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return sf->hdr.i8count != 0; } @@ -101,11 +103,12 @@ dir2_inou_size( int startoff, int idx) { + struct xfs_dinode *dip = obj; xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); ASSERT(idx == 0); - sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return bitize(sf->hdr.i8count ? (uint)sizeof(xfs_dir2_ino8_t) : (uint)sizeof(xfs_dir2_ino4_t)); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index c256606..abae8c8 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -48,6 +48,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) +#define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -56,7 +57,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF) + XFS_BLF_AGI_BUF | \ + XFS_BLF_DINO_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 6b5bd17..bdc946a 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -19,7 +19,7 @@ #define __XFS_DINODE_H__ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) +#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ @@ -70,11 +70,36 @@ typedef struct xfs_dinode { /* di_next_unlinked is the only non-core field in the old dinode */ __be32 di_next_unlinked;/* agi unlinked list ptr */ -} __attribute__((packed)) xfs_dinode_t; + + /* start of the extended dinode, writable fields */ + __be32 di_crc; /* CRC of the inode */ + __be64 di_changecount; /* number of attribute changes */ + __be64 di_lsn; /* flush sequence */ + __be64 di_flags2; /* more random flags */ + __u8 di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + __be64 di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode_t; #define DI_MAX_FLUSH 0xffff /* + * Size of the core inode on disk. Version 1 and 2 inodes have + * the same size, but version 3 has grown a few additional fields. + */ +static inline uint xfs_dinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_dinode); + return offsetof(struct xfs_dinode, di_crc); +} + +/* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. * Since the pathconf interface is signed, we use 2^31 - 1 instead. * The old inode format had a 16 bit link count, so its maximum is USHRT_MAX. @@ -105,7 +130,7 @@ typedef enum xfs_dinode_fmt { * Inode size for given fs. */ #define XFS_LITINO(mp, version) \ - ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) #define XFS_BROOT_SIZE_ADJ(ip) \ (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) @@ -133,7 +158,7 @@ typedef enum xfs_dinode_fmt { * Return pointers to the data or attribute forks. */ #define XFS_DFORK_DPTR(dip) \ - ((char *)(dip) + sizeof(struct xfs_dinode)) + ((char *)dip + xfs_dinode_size(dip->di_version)) #define XFS_DFORK_APTR(dip) \ (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 809a8d5..9a4363f 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -150,13 +150,38 @@ typedef struct xfs_icdinode { __uint16_t di_dmstate; /* DMIG state info */ __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint32_t di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + __be32 di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __uint32_t di_crc; /* CRC of the inode */ + __uint64_t di_changecount; /* number of attribute changes */ + xfs_lsn_t di_lsn; /* flush sequence */ + __uint64_t di_flags2; /* more random flags */ + __uint8_t di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_ictimestamp_t di_crtime; /* time created */ + xfs_ino_t di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; +static inline uint xfs_icdinode_size(struct xfs_icdinode *dicp) +{ + if (dicp->di_version == 3) + return sizeof(struct xfs_icdinode); + return offsetof(struct xfs_icdinode, di_next_unlinked); +} + /* * Flags for xfs_ichgtime(). */ #define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ /* * Per-fork incore inode flags. @@ -555,6 +580,7 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/libxfs/trans.c b/libxfs/trans.c index 7cb3c8c..619aad1 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -218,6 +218,7 @@ libxfs_trans_inode_alloc_buf( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* diff --git a/libxfs/util.c b/libxfs/util.c index 2ad4bfd..abe16cf 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -47,6 +47,10 @@ libxfs_trans_ichgtime( ip->i_d.di_ctime.t_sec = (__int32_t)tv.tv_sec; ip->i_d.di_ctime.t_nsec = (__int32_t)tv.tv_nsec; } + if (flags & XFS_ICHGTIME_CREATE) { + ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec; + ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec; + } } /* @@ -75,6 +79,7 @@ libxfs_ialloc( xfs_inode_t *ip; uint flags; int error; + int times; /* * Call the space management code to pick @@ -103,6 +108,7 @@ libxfs_ialloc( ip->i_d.di_gid = cr->cr_gid; xfs_set_projid(&ip->i_d, pip ? 0 : fsx->fsx_projid); memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD); /* * If the superblock version is up to where we support new format @@ -128,7 +134,6 @@ libxfs_ialloc( ip->i_d.di_size = 0; ip->i_d.di_nextents = 0; ASSERT(ip->i_d.di_nblocks == 0); - xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); /* * di_gen will have been taken care of in xfs_iread. */ @@ -136,6 +141,18 @@ libxfs_ialloc( ip->i_d.di_dmevmask = 0; ip->i_d.di_dmstate = 0; ip->i_d.di_flags = pip ? 0 : fsx->fsx_xflags; + + if (ip->i_d.di_version == 3) { + ASSERT(ip->i_d.di_ino == ino); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + 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; + } + flags = XFS_ILOG_CORE; switch (mode & S_IFMT) { case S_IFIFO: @@ -295,6 +312,10 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) ASSERT(ip->i_d.di_nextents+ip->i_d.di_anextents <= ip->i_d.di_nblocks); ASSERT(ip->i_d.di_forkoff <= mp->m_sb.sb_inodesize); + /* bump the change count on v3 inodes */ + if (ip->i_d.di_version == 3) + ip->i_d.di_changecount++; + /* * Copy the dirty parts of the inode into the on-disk * inode. We always copy out the core of the inode, @@ -338,6 +359,13 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) if (XFS_IFORK_Q(ip)) xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK, bp); + /* update the lsn in the on disk inode if required */ + if (ip->i_d.di_version == 3) + dip->di_lsn = cpu_to_be64(iip->ili_item.li_lsn); + + /* generate the checksum. */ + xfs_dinode_calc_crc(mp, dip); + return 0; } diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 88dc02a..625e119 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -146,6 +146,7 @@ xfs_ialloc_inode_init( int version; int i, j; xfs_daddr_t d; + xfs_ino_t ino = 0; /* * Loop over the new block(s), filling in the inodes. @@ -169,8 +170,20 @@ xfs_ialloc_inode_init( * the new inode format, then use the new inode version. Otherwise * use the old version so that old kernels will continue to be * able to use the file system. + * + * For v3 inodes, we also need to write the inode number into the inode, + * so calculate the first inode number of the chunk here as + * XFS_OFFBNO_TO_AGINO() only works on filesystem block boundaries, not + * cluster boundaries and so cannot be used in the cluster buffer loop + * below. */ - if (xfs_sb_version_hasnlink(&mp->m_sb)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + version = 3; + ino = XFS_AGINO_TO_INO(mp, agno, + XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); + } else if (xfs_sb_version_hasnlink(&mp->m_sb)) + version = 3; + else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; else version = 1; @@ -196,13 +209,21 @@ xfs_ialloc_inode_init( xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); for (i = 0; i < ninodes; i++) { int ioffset = i << mp->m_sb.sb_inodelog; - uint isize = sizeof(struct xfs_dinode); + uint isize = xfs_dinode_size(version); free = xfs_make_iptr(mp, fbuf, i); free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); free->di_version = version; free->di_gen = cpu_to_be32(gen); free->di_next_unlinked = cpu_to_be32(NULLAGINO); + + if (version == 3) { + free->di_ino = cpu_to_be64(ino); + ino++; + uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); + xfs_dinode_calc_crc(mp, free); + } + xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); } xfs_trans_inode_alloc_buf(tp, fbuf); diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index da61233..b700599 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -572,6 +572,17 @@ xfs_dinode_from_disk( to->di_dmstate = be16_to_cpu(from->di_dmstate); to->di_flags = be16_to_cpu(from->di_flags); to->di_gen = be32_to_cpu(from->di_gen); + + if (to->di_version == 3) { + to->di_changecount = be64_to_cpu(from->di_changecount); + to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); + to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); + to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_ino = be64_to_cpu(from->di_ino); + to->di_lsn = be64_to_cpu(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } } void @@ -608,6 +619,58 @@ xfs_dinode_to_disk( to->di_dmstate = cpu_to_be16(from->di_dmstate); to->di_flags = cpu_to_be16(from->di_flags); to->di_gen = cpu_to_be32(from->di_gen); + + if (from->di_version == 3) { + to->di_changecount = cpu_to_be64(from->di_changecount); + to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); + to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); + to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_ino = cpu_to_be64(from->di_ino); + to->di_lsn = cpu_to_be64(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } +} + +static bool +xfs_dinode_verify( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) + return false; + + /* only version 3 or greater inodes are extensively verified here */ + if (dip->di_version < 3) + return true; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc))) + return false; + if (be64_to_cpu(dip->di_ino) != ip->i_ino) + return false; + if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) + return false; + return true; +} + +void +xfs_dinode_calc_crc( + struct xfs_mount *mp, + struct xfs_dinode *dip) +{ + __uint32_t crc; + + if (dip->di_version < 3) + return; + + ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); + crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc)); + dip->di_crc = xfs_end_cksum(crc); } /* @@ -638,17 +701,13 @@ xfs_iread( if (error) return error; - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) { -#ifdef DEBUG - xfs_alert(mp, - "%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)", - __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); + /* even unallocated inodes are verified */ + if (!xfs_dinode_verify(mp, ip, dip)) { + xfs_alert(mp, "%s: validation failed for inode %lld failed", + __func__, ip->i_ino); + + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); + error = XFS_ERROR(EFSCORRUPTED); goto out_brelse; } @@ -670,10 +729,20 @@ xfs_iread( goto out_brelse; } } else { + /* + * Partial initialisation of the in-core inode. Just the bits + * that xfs_ialloc won't overwrite or relies on being correct. + */ ip->i_d.di_magic = be16_to_cpu(dip->di_magic); ip->i_d.di_version = dip->di_version; ip->i_d.di_gen = be32_to_cpu(dip->di_gen); ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); + + if (dip->di_version == 3) { + ip->i_d.di_ino = be64_to_cpu(dip->di_ino); + uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); + } + /* * Make sure to pull in the mode here as well in * case the inode is released without being used. diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 4277a48..26a8efb 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -650,7 +650,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) mode = dino.di_mode & S_IFMT; size = (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr += sizeof(xfs_icdinode_t); + *ptr += xfs_icdinode_size(&dino); if (*i == num_ops-1 && f->ilf_size == 3) { return 1; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 44fb4c4..5b2d942 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -276,7 +276,8 @@ xlog_recover_print_inode( f->ilf_dsize); /* core inode comes 2nd */ - ASSERT(item->ri_buf[1].i_len == sizeof(xfs_icdinode_t)); + ASSERT(item->ri_buf[1].i_len == xfs_icdinode_size((xfs_icdinode_t *) + item->ri_buf[1].i_addr)); xlog_recover_print_inode_core((xfs_icdinode_t *) item->ri_buf[1].i_addr); diff --git a/repair/phase6.c b/repair/phase6.c index 00f70a2..136bb4f 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -429,6 +429,8 @@ mk_rbmino(xfs_mount_t *mp) xfs_bmap_free_t flist; xfs_dfiloff_t bno; xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; + int vers; + int times; /* * first set up inode @@ -445,16 +447,31 @@ mk_rbmino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version = vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = 1; + ip->i_d.di_version = vers; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_nlink = 1; /* account for sb ptr */ + times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version == 3) { + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + ip->i_d.di_flags2 = 0; + ip->i_d.di_ino = mp->m_sb.sb_rbmino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |= XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + /* * now the ifork */ @@ -661,6 +678,8 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmap_free_t flist; xfs_dfiloff_t bno; xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; + int vers; + int times; /* * first set up inode @@ -678,16 +697,31 @@ mk_rsumino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version = vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = 1; + ip->i_d.di_version = vers; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_nlink = 1; /* account for sb ptr */ + times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version == 3) { + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + ip->i_d.di_flags2 = 0; + ip->i_d.di_ino = mp->m_sb.sb_rsumino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |= XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + /* * now the ifork */ @@ -760,6 +794,8 @@ mk_root_dir(xfs_mount_t *mp) int error; const mode_t mode = 0755; ino_tree_node_t *irec; + int vers; + int times; ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); @@ -778,16 +814,31 @@ mk_root_dir(xfs_mount_t *mp) /* * take care of the core -- initialization from xfs_ialloc() */ - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version = vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = (__uint16_t) mode|S_IFDIR; - ip->i_d.di_version = 1; + ip->i_d.di_version = vers; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_nlink = 1; /* account for . */ + times = XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version == 3) { + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + ip->i_d.di_flags2 = 0; + ip->i_d.di_ino = mp->m_sb.sb_rootino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |= XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 137577F62 for ; Mon, 21 Jan 2013 07:53:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02FD58F8033 for ; Mon, 21 Jan 2013 05:53:44 -0800 (PST) X-ASG-Debug-ID: 1358776418-04cb6c3915453e0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JxekE2CiaPTGBuy7 for ; Mon, 21 Jan 2013 05:53:42 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrCmOcZE5A6ZVgwmBVCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:34 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoR-0001Or-VA for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:24 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oC-QX for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/12] xfsprogs: add crc format chagnes to ag headers Date: Tue, 22 Jan 2013 00:53:04 +1100 X-ASG-Orig-Subj: [PATCH 05/12] xfsprogs: add crc format chagnes to ag headers Message-Id: <1358776391-22140-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776422 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_ag.h | 54 ++++++++++++- include/xfs_buf_item.h | 8 +- libxfs/xfs_alloc.c | 197 ++++++++++++++++++++++++++++++++---------------- libxfs/xfs_ialloc.c | 55 ++++++++++---- 4 files changed, 231 insertions(+), 83 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index f2aeedb..1e0fa34 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -30,6 +30,7 @@ struct xfs_trans; #define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ #define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ +#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ #define XFS_AGF_VERSION 1 #define XFS_AGI_VERSION 1 @@ -63,12 +64,29 @@ typedef struct xfs_agf { __be32 agf_spare0; /* spare field */ __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ __be32 agf_spare1; /* spare field */ + __be32 agf_flfirst; /* first freelist block's index */ __be32 agf_fllast; /* last freelist block's index */ __be32 agf_flcount; /* count of blocks in freelist */ __be32 agf_freeblks; /* total free blocks */ + __be32 agf_longest; /* longest free space */ __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ + uuid_t agf_uuid; /* uuid of filesystem */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + __be64 agf_spare64[16]; + + /* unlogged fields, written during buffer writeback. */ + __be64 agf_lsn; /* last write sequence */ + __be32 agf_crc; /* crc of agf sector */ + __be32 agf_spare2; + + /* structure must be padded to 64 bit alignment */ } xfs_agf_t; #define XFS_AGF_MAGICNUM 0x00000001 @@ -83,6 +101,7 @@ typedef struct xfs_agf { #define XFS_AGF_FREEBLKS 0x00000200 #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 +#define XFS_AGF_UUID 0x00001000 #define XFS_AGF_NUM_BITS 12 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) @@ -98,7 +117,8 @@ typedef struct xfs_agf { { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ - { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ + { XFS_AGF_UUID, "UUID" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) @@ -132,6 +152,7 @@ typedef struct xfs_agi { __be32 agi_root; /* root of inode btree */ __be32 agi_level; /* levels in inode btree */ __be32 agi_freecount; /* number of free inodes */ + __be32 agi_newino; /* new inode just allocated */ __be32 agi_dirino; /* last directory inode chunk */ /* @@ -139,6 +160,13 @@ typedef struct xfs_agi { * still being referenced. */ __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; + + uuid_t agi_uuid; /* uuid of filesystem */ + __be32 agi_crc; /* crc of agi sector */ + __be32 agi_pad32; + __be64 agi_lsn; /* last write sequence */ + + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_MAGICNUM 0x00000001 @@ -171,11 +199,31 @@ extern const struct xfs_buf_ops xfs_agi_buf_ops; */ #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) -#define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) #define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) +#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ + (__be32 *)(bp)->b_addr) + +/* + * Size of the AGFL. For CRC-enabled filesystes we steal a couple of + * slots in the beginning of the block for a proper header with the + * location information and CRC. + */ +#define XFS_AGFL_SIZE(mp) \ + (((mp)->m_sb.sb_sectsize - \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + sizeof(struct xfs_agfl) : 0)) / \ + sizeof(xfs_agblock_t)) + typedef struct xfs_agfl { - __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ + __be32 agfl_magicnum; + __be32 agfl_seqno; + uuid_t agfl_uuid; + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; /* diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 101ef83..c256606 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -45,12 +45,18 @@ extern kmem_zone_t *xfs_buf_item_zone; * once the changes have been replayed into the buffer. */ #define XFS_BLF_BTREE_BUF (1<<5) +#define XFS_BLF_AGF_BUF (1<<6) +#define XFS_BLF_AGFL_BUF (1<<7) +#define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF) + XFS_BLF_BTREE_BUF | \ + XFS_BLF_AGF_BUF | \ + XFS_BLF_AGFL_BUF | \ + XFS_BLF_AGI_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 61cdc6c..d8f3566 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -410,53 +410,84 @@ xfs_alloc_fixup_trees( return 0; } -static void +static bool xfs_agfl_verify( struct xfs_buf *bp) { -#ifdef WHEN_CRCS_COME_ALONG - /* - * we cannot actually do any verification of the AGFL because mkfs does - * not initialise the AGFL to zero or NULL. Hence the only valid part of - * the AGFL is what the AGF says is active. We can't get to the AGF, so - * we can't verify just those entries are valid. - * - * This problem goes away when the CRC format change comes along as that - * requires the AGFL to be initialised by mkfs. At that point, we can - * verify the blocks in the agfl -active or not- lie within the bounds - * of the AG. Until then, just leave this check ifdef'd out. - */ struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); - int agfl_ok = 1; - int i; + if (!uuid_equal(&agfl->agfl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC) + return false; + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag && be32_to_cpu(agfl->agfl_seqno) != bp->b_pag->pag_agno) + return false; + for (i = 0; i < XFS_AGFL_SIZE(mp); i++) { - if (be32_to_cpu(agfl->agfl_bno[i]) == NULLAGBLOCK || + if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK && be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks) - agfl_ok = 0; + return false; } + return true; +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + int agfl_ok = 1; + + /* + * There is no verification of non-crc AGFLs because mkfs does not + * initialise the AGFL to zero or NULL. Hence the only valid part of the + * AGFL is what the AGF says is active. We can't get to the AGF, so we + * can't verify just those entries are valid. + */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + agfl_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); + + agfl_ok = agfl_ok && xfs_agfl_verify(bp); if (!agfl_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } -#endif } static void xfs_agfl_write_verify( struct xfs_buf *bp) { - xfs_agfl_verify(bp); -} + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; -static void -xfs_agfl_read_verify( - struct xfs_buf *bp) -{ - xfs_agfl_verify(bp); + /* no verification of non-crc AGFLs */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_agfl_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) + XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); } const struct xfs_buf_ops xfs_agfl_buf_ops = { @@ -1964,18 +1995,18 @@ xfs_alloc_get_freelist( int btreeblk) /* destination is a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. freelist structure */ xfs_buf_t *agflbp;/* buffer for a.g. freelist structure */ xfs_agblock_t bno; /* block number returned */ + __be32 *agfl_bno; int error; int logflags; - xfs_mount_t *mp; /* mount structure */ + xfs_mount_t *mp = tp->t_mountp; xfs_perag_t *pag; /* per allocation group data */ - agf = XFS_BUF_TO_AGF(agbp); /* * Freelist is empty, give up. */ + agf = XFS_BUF_TO_AGF(agbp); if (!agf->agf_flcount) { *bnop = NULLAGBLOCK; return 0; @@ -1983,15 +2014,17 @@ xfs_alloc_get_freelist( /* * Read the array of free blocks. */ - mp = tp->t_mountp; - if ((error = xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) + error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), + &agflbp); + if (error) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); + + /* * Get the block number and update the data structures. */ - bno = be32_to_cpu(agfl->agfl_bno[be32_to_cpu(agf->agf_flfirst)]); + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]); be32_add_cpu(&agf->agf_flfirst, 1); xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) @@ -2040,11 +2073,14 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_freeblks), offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), + offsetof(xfs_agf_t, agf_uuid), sizeof(xfs_agf_t) }; trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2081,12 +2117,13 @@ xfs_alloc_put_freelist( int btreeblk) /* block came from a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. free block array */ __be32 *blockp;/* pointer to array entry */ int error; int logflags; xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ + __be32 *agfl_bno; + int startoff; agf = XFS_BUF_TO_AGF(agbp); mp = tp->t_mountp; @@ -2094,7 +2131,6 @@ xfs_alloc_put_freelist( if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), &agflbp))) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; @@ -2115,32 +2151,38 @@ xfs_alloc_put_freelist( xfs_alloc_log_agf(tp, agbp, logflags); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); - blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; + + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + blockp = &agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp = cpu_to_be32(bno); + startoff = (char *)blockp - (char *)agflbp->b_addr; + xfs_alloc_log_agf(tp, agbp, logflags); - xfs_trans_log_buf(tp, agflbp, - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl + - sizeof(xfs_agblock_t) - 1)); + + xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_log_buf(tp, agflbp, startoff, + startoff + sizeof(xfs_agblock_t) - 1); return 0; } -static void +static bool xfs_agf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_agf *agf; - int agf_ok; + struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); - agf = XFS_BUF_TO_AGF(bp); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + return false; - agf_ok = agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -2148,33 +2190,58 @@ xfs_agf_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agf_ok = agf_ok && be32_to_cpu(agf->agf_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno) + return false; - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= - be32_to_cpu(agf->agf_length); + if (xfs_sb_version_haslazysbcount(&mp->m_sb) && + be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) + return false; + + return true;; - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } } static void xfs_agf_read_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agf_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agf_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); + + agf_ok = agf_ok && xfs_agf_verify(mp, bp); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agf_write_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); } const struct xfs_buf_ops xfs_agf_buf_ops = { diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 529d92d..88dc02a 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1263,6 +1263,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } @@ -1280,19 +1281,23 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif -static void +static bool xfs_agi_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); - int agi_ok; + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_uuid)) + return false; /* * Validate the magic number of the agi block. */ - agi_ok = agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC) && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + if (agi->agi_magicnum != cpu_to_be32(XFS_AGI_MAGIC)) + return false; + if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -1300,30 +1305,52 @@ xfs_agi_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agi_ok = agi_ok && be32_to_cpu(agi->agi_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agi->agi_seqno) != bp->b_pag->pag_agno) + return false; - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } xfs_check_agi_unlinked(agi); + return true; } static void xfs_agi_read_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agi_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agi_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); + agi_ok = agi_ok && xfs_agi_verify(bp); + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agi_write_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agi_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGI(bp)->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); } const struct xfs_buf_ops xfs_agi_buf_ops = { -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B70C67F67 for ; Mon, 21 Jan 2013 07:53:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1168304039 for ; Mon, 21 Jan 2013 05:53:46 -0800 (PST) X-ASG-Debug-ID: 1358776424-04cbb00c6343860001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id iCzkqcW5TcGuRV1m for ; Mon, 21 Jan 2013 05:53:45 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFVjMIGDE5AxsZiBisKY5xjH8UfYMpA6ZVgwmBUgEf Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:44 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHob-0001PC-Vk for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:34 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oH-RY for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/12] libxfs: change quota buffer formats Date: Tue, 22 Jan 2013 00:53:05 +1100 X-ASG-Orig-Subj: [PATCH 06/12] libxfs: change quota buffer formats Message-Id: <1358776391-22140-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776424 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_quota.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/include/xfs_quota.h b/include/xfs_quota.h index b50ec5b..c61e31c 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -77,7 +77,14 @@ typedef struct xfs_disk_dquot { */ typedef struct xfs_dqblk { xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[32]; /* filling for posterity */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + __be32 dd_crc; /* checksum */ + __be64 dd_lsn; /* last modification in log */ + uuid_t dd_uuid; /* location information */ } xfs_dqblk_t; /* @@ -380,5 +387,7 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); +extern const struct xfs_buf_ops xfs_dquot_buf_ops; + #endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 455C77F4D for ; Mon, 21 Jan 2013 07:53:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 258CB8F8033 for ; Mon, 21 Jan 2013 05:53:44 -0800 (PST) X-ASG-Debug-ID: 1358776418-04cb6c3915453e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id y1JBCHy4oOSrJr3e for ; Mon, 21 Jan 2013 05:53:39 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAFAP9G/VB5LETJ/2dsb2JhbABEhkW3ZRdzgh4BAQUaAQgECwEjMwgYBQImAgI5AxsZiBipaYJAjnGBI48DgRMDplWDCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:34 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoR-0001Oq-Sa for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005o7-OQ for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: =?UTF-8?q?=5BPATCH=2004/12=5D=20libxfs=3A=20add=20crc=20format=20changes=20to=20generic=20btrees?= Date: Tue, 22 Jan 2013 00:53:03 +1100 X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=2004/12=5D=20libxfs=3A=20add=20crc=20format=20changes=20to=20generic=20btrees?= Message-Id: <1358776391-22140-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776418 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner Signed-off-by: Dave Chinner --- include/libxfs.h | 15 +-- include/xfs_alloc_btree.h | 13 ++- include/xfs_bmap_btree.h | 20 ++-- include/xfs_btree.h | 60 +++++++++-- include/xfs_buf_item.h | 24 ++++- include/xfs_dinode.h | 4 +- include/xfs_ialloc_btree.h | 10 +- include/xfs_trans.h | 2 + libxfs/rdwr.c | 24 ++--- libxfs/xfs.h | 4 + libxfs/xfs_alloc_btree.c | 99 +++++++++++------ libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap.c | 42 +++++--- libxfs/xfs_bmap_btree.c | 107 ++++++++++++------ libxfs/xfs_btree.c | 257 ++++++++++++++++++++++++++++++++++++-------- libxfs/xfs_ialloc_btree.c | 80 +++++++++----- libxfs/xfs_inode.c | 33 +++--- libxfs/xfs_mount.c | 2 +- mdrestore/Makefile | 2 +- 19 files changed, 584 insertions(+), 216 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index e671391..f66da03 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -240,14 +240,14 @@ struct xfs_buf_ops { typedef struct xfs_buf { struct cache_node b_node; unsigned int b_flags; - xfs_daddr_t b_blkno; + xfs_daddr_t b_bn; unsigned b_bcount; unsigned int b_length; dev_t b_dev; pthread_mutex_t b_lock; pthread_t b_holder; unsigned int b_recur; - void *b_fsprivate; + void *b_fspriv; void *b_fsprivate2; void *b_fsprivate3; void *b_addr; @@ -273,9 +273,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ }; +#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) + #define XFS_BUF_PTR(bp) ((char *)(bp)->b_addr) #define xfs_buf_offset(bp, offset) (XFS_BUF_PTR(bp) + (offset)) -#define XFS_BUF_ADDR(bp) ((bp)->b_blkno) +#define XFS_BUF_ADDR(bp) ((bp)->b_bn) #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) #define XFS_BUF_COUNT(bp) ((bp)->b_bcount) #define XFS_BUF_TARGET(bp) ((bp)->b_dev) @@ -284,11 +286,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ XFS_BUF_SET_COUNT(bp,cnt); \ }) -#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_blkno = (blk)) +#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_bn = (blk)) #define XFS_BUF_SET_COUNT(bp,cnt) ((bp)->b_bcount = (cnt)) -#define XFS_BUF_FSPRIVATE(bp,type) ((type)(bp)->b_fsprivate) -#define XFS_BUF_SET_FSPRIVATE(bp,val) (bp)->b_fsprivate = (void *)(val) +#define XFS_BUF_FSPRIVATE(bp,type) ((type)(bp)->b_fspriv) +#define XFS_BUF_SET_FSPRIVATE(bp,val) (bp)->b_fspriv = (void *)(val) #define XFS_BUF_FSPRIVATE2(bp,type) ((type)(bp)->b_fsprivate2) #define XFS_BUF_SET_FSPRIVATE2(bp,val) (bp)->b_fsprivate2 = (void *)(val) #define XFS_BUF_FSPRIVATE3(bp,type) ((type)(bp)->b_fsprivate3) @@ -392,6 +394,7 @@ typedef struct xfs_log_item { struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ struct xfs_mount *li_mountp; /* ptr to fs mount */ uint li_type; /* item type */ + xfs_lsn_t li_lsn; } xfs_log_item_t; typedef struct xfs_inode_log_item { diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index 7e89a2b..6968494 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -31,8 +31,10 @@ struct xfs_mount; * by blockcount and blockno. All blocks look the same to make the code * simpler; if we have time later, we'll make the optimizations. */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x4142544a +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x4142544b /* * Data record/key structure @@ -59,10 +61,11 @@ typedef __be32 xfs_alloc_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_ALLOC_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_ALLOC_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 88469ca..2dd3a1a 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -18,7 +18,8 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4158 struct xfs_btree_cur; struct xfs_btree_block; @@ -136,10 +137,11 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN +#define XFS_BMBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_LBLOCK_LEN) #define XFS_BMBT_REC_ADDR(mp, block, index) \ ((xfs_bmbt_rec_t *) \ @@ -186,12 +188,12 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \ XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) -#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ - (int)(XFS_BTREE_LBLOCK_LEN + \ +#define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \ + (int)(XFS_BMBT_BLOCK_LEN(mp) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) -#define XFS_BMAP_BROOT_SPACE(bb) \ - (XFS_BMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs))) +#define XFS_BMAP_BROOT_SPACE(mp, bb) \ + (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs))) #define XFS_BMDR_SPACE_CALC(nrecs) \ (int)(sizeof(xfs_bmdr_block_t) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) @@ -204,7 +206,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Prototypes for xfs_bmap.c to call. */ -extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, +extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int, struct xfs_btree_block *, int); extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); diff --git a/include/xfs_btree.h b/include/xfs_btree.h index be1eb23..02f89d8 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -42,11 +42,15 @@ extern kmem_zone_t *xfs_btree_cur_zone; * Generic btree header. * * This is a combination of the actual format used on disk for short and long - * format btrees. The first three fields are shared by both format, but - * the pointers are different and should be used with care. + * format btrees. The first three fields are shared by both format, but the + * pointers are different and should be used with care. * - * To get the size of the actual short or long form headers please use - * the size macros below. Never use sizeof(xfs_btree_block). + * To get the size of the actual short or long form headers please use the size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesystems + * with the crc feature bit, and all accesses to them must be conditional on + * that flag. */ struct xfs_btree_block { __be32 bb_magic; /* magic number for block type */ @@ -56,16 +60,35 @@ struct xfs_btree_block { struct { __be32 bb_leftsib; __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; } s; /* short form pointers */ struct { __be64 bb_leftsib; __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ } l; /* long form pointers */ } bb_u; /* rest */ }; #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ +#define XFS_BTREE_CRCBLOCK_ADD 32 /* size of blkno + crc + uuid */ + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) /* @@ -101,13 +124,11 @@ union xfs_btree_rec { #define XFS_BB_NUMRECS 0x04 #define XFS_BB_LEFTSIB 0x08 #define XFS_BB_RIGHTSIB 0x10 +#define XFS_BB_BLKNO 0x20 #define XFS_BB_NUM_BITS 5 #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) - -/* - * Magic numbers for btree blocks. - */ -extern const __uint32_t xfs_magics[]; +#define XFS_BB_NUM_BITS_CRC 8 +#define XFS_BB_ALL_BITS_CRC ((1 << XFS_BB_NUM_BITS_CRC) - 1) /* * Generic stats interface @@ -275,6 +296,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LONG_PTRS (1<<0) /* pointers are 64bits long */ #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ +#define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ #define XFS_BTREE_NOERROR 0 @@ -412,8 +434,20 @@ xfs_btree_init_block( __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags); +void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags); + /* * Common btree core entry points. */ @@ -427,6 +461,14 @@ int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); /* + * btree block CRC helpers + */ +void xfs_btree_lblock_calc_crc(struct xfs_buf *); +bool xfs_btree_lblock_verify_crc(struct xfs_buf *); +void xfs_btree_sblock_calc_crc(struct xfs_buf *); +bool xfs_btree_sblock_verify_crc(struct xfs_buf *); + +/* * Internal btree helpers also used by xfs_bmap.c. */ void xfs_btree_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index ee36c88..101ef83 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -24,19 +24,33 @@ extern kmem_zone_t *xfs_buf_item_zone; * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLF_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF (1<<0) /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLF_CANCEL 0x2 +#define XFS_BLF_CANCEL (1<<1) + /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLF_UDQUOT_BUF 0x4 -#define XFS_BLF_PDQUOT_BUF 0x8 -#define XFS_BLF_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF (1<<2) +#define XFS_BLF_PDQUOT_BUF (1<<3) +#define XFS_BLF_GDQUOT_BUF (1<<4) + +/* + * all buffers now need flags to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + */ +#define XFS_BLF_BTREE_BUF (1<<5) + +#define XFS_BLF_TYPE_MASK \ + (XFS_BLF_UDQUOT_BUF | \ + XFS_BLF_PDQUOT_BUF | \ + XFS_BLF_GDQUOT_BUF | \ + XFS_BLF_BTREE_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 88a3368..6b5bd17 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -107,8 +107,8 @@ typedef enum xfs_dinode_fmt { #define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) -#define XFS_BROOT_SIZE_ADJ \ - (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) +#define XFS_BROOT_SIZE_ADJ(ip) \ + (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) /* * Inode data & attribute fork sizes, per inode. diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 25c0239..96fb140 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -29,7 +29,8 @@ struct xfs_mount; /* * There is a btree for the inode map per allocation group. */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x4941425c typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -76,10 +77,11 @@ typedef __be32 xfs_inobt_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_INOBT_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_INOBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_trans.h b/include/xfs_trans.h index c6c0601..932de22 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -503,6 +503,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + uint); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 595538e..f2a6647 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -323,17 +323,17 @@ libxfs_bcompare(struct cache_node *node, cache_key_t key) #ifdef IO_BCOMPARE_CHECK if (bp->b_dev == bkey->device && - bp->b_blkno == bkey->blkno && + bp->b_bn == bkey->blkno && bp->b_bcount != BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" "bp=(bno 0x%llx, len %u bytes) key=(bno 0x%llx, len %u bytes)\n", pthread_self(), - (unsigned long long)bp->b_blkno, (int)bp->b_bcount, + (unsigned long long)bp->b_bn, (int)bp->b_bcount, (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); #endif return (bp->b_dev == bkey->device && - bp->b_blkno == bkey->blkno && + bp->b_bn == bkey->blkno && bp->b_bcount == BBTOB(bkey->bblen)); } @@ -341,7 +341,7 @@ void libxfs_bprint(xfs_buf_t *bp) { fprintf(stderr, "Buffer 0x%p blkno=%llu bytes=%u flags=0x%x count=%u\n", - bp, (unsigned long long)bp->b_blkno, (unsigned)bp->b_bcount, + bp, (unsigned long long)bp->b_bn, (unsigned)bp->b_bcount, bp->b_flags, bp->b_node.cn_count); } @@ -349,7 +349,7 @@ static void __initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) { bp->b_flags = 0; - bp->b_blkno = bno; + bp->b_bn = bno; bp->b_bcount = bytes; bp->b_length = BTOBB(bytes); bp->b_dev = device; @@ -613,7 +613,7 @@ libxfs_purgebuf(xfs_buf_t *bp) struct xfs_bufkey key = {0}; key.device = bp->b_dev; - key.blkno = bp->b_blkno; + key.blkno = bp->b_bn; key.bblen = bp->b_bcount >> BBSHIFT; cache_node_purge(libxfs_bcache, &key, (struct cache_node *)bp); @@ -669,7 +669,7 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) error = __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flags); if (!error && bp->b_dev == dev && - bp->b_blkno == blkno && + bp->b_bn == blkno && bp->b_bcount == bytes) bp->b_flags |= LIBXFS_B_UPTODATE; #ifdef IO_DEBUG @@ -736,7 +736,7 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, - (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); + (long long)LIBXFS_BBTOOFF64(bp->b_bn), (long long)bp->b_bn, bp); #endif return bp; } @@ -772,7 +772,7 @@ libxfs_writebufr(xfs_buf_t *bp) if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { error = __write_buf(fd, bp->b_addr, bp->b_bcount, - LIBXFS_BBTOOFF64(bp->b_blkno), bp->b_flags); + LIBXFS_BBTOOFF64(bp->b_bn), bp->b_flags); } else { int i; char *buf = bp->b_addr; @@ -794,8 +794,8 @@ libxfs_writebufr(xfs_buf_t *bp) #ifdef IO_DEBUG printf("%lx: %s: wrote %u bytes, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, bp->b_bcount, - (long long)LIBXFS_BBTOOFF64(bp->b_blkno), - (long long)bp->b_blkno, bp); + (long long)LIBXFS_BBTOOFF64(bp->b_bn), + (long long)bp->b_bn, bp); #endif if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; @@ -826,7 +826,7 @@ libxfs_iomove(xfs_buf_t *bp, uint boff, int len, void *data, int flags) if (boff + len > bp->b_bcount) { printf("Badness, iomove out of range!\n" "bp=(bno 0x%llx, bytes %u) range=(boff %u, bytes %u)\n", - (long long)bp->b_blkno, bp->b_bcount, boff, len); + (long long)bp->b_bn, bp->b_bcount, boff, len); abort(); } #endif diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 4311059..e03f6c7 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -246,6 +246,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_agblocks_delta(tp, d) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) +#define xfs_trans_buf_set_type(tp, bp, t) #define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ #define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ @@ -311,6 +312,9 @@ do { \ #define xfs_trans_unreserve_quota_nblks(t,i,b,n,f) ((void) 0) #define xfs_qm_dqattach(i,f) (0) +#define uuid_copy(s,d) platform_uuid_copy((s),(d)) +#define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) + /* * Prototypes for kernel static functions that are aren't in their * associated header files diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index dc9ed48..949c96d 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -254,7 +254,7 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } -static void +static bool xfs_allocbt_verify( struct xfs_buf *bp) { @@ -262,66 +262,98 @@ xfs_allocbt_verify( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ /* * magic number and level verification * - * During growfs operations, we can't verify the exact level as the - * perag is not fully initialised and hence not attached to the buffer. - * In this case, check against the maximum tree depth. + * During growfs operations, we can't verify the exact level or owner as + * the perag is not fully initialised and hence not attached to the + * buffer. In this case, check against the maximum tree depth. */ level = be16_to_cpu(block->bb_level); switch (cpu_to_be32(block->bb_magic)) { + case XFS_ABTB_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case XFS_ABTB_MAGIC: - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_BNOi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag) { + if (level >= pag->pagf_levels[XFS_BTNUM_BNOi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; + case XFS_ABTC_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case XFS_ABTC_MAGIC: - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_CNTi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag) { + if (level >= pag->pagf_levels[XFS_BTNUM_CNTi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; default: - sblock_ok = 0; - break; + return false; } /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_alloc_mxr[level != 0]; + if (be16_to_cpu(block->bb_numrecs) > mp->m_alloc_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_allocbt_read_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_allocbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_allocbt_write_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!xfs_allocbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_allocbt_buf_ops = { @@ -499,6 +531,9 @@ xfs_allocbt_init_cursor( cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; + return cur; } diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 426130f..85cb31d 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -201,7 +201,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) return 0; return dp->i_d.di_forkoff; } - dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot); break; } diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 26358c8..fad7b03 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -2893,6 +2893,7 @@ xfs_bmap_extents_to_btree( xfs_extnum_t nextents; /* number of file extents */ xfs_bmbt_ptr_t *pp; /* root block address pointer */ + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); @@ -2906,16 +2907,18 @@ xfs_bmap_extents_to_btree( * Fill in the root. */ block = ifp->if_broot; - block->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - block->bb_level = cpu_to_be16(1); - block->bb_numrecs = cpu_to_be16(1); - block->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - block->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS); /* * Need a cursor. Can't allocate until bb_level is filled in. */ - mp = ip->i_mount; cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); cur->bc_private.b.firstblock = *firstblock; cur->bc_private.b.flist = flist; @@ -2964,10 +2967,15 @@ xfs_bmap_extents_to_btree( */ abp->b_ops = &xfs_bmbt_buf_ops; ablock = XFS_BUF_TO_BLOCK(abp); - ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - ablock->bb_level = 0; - ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { @@ -2995,8 +3003,8 @@ xfs_bmap_extents_to_btree( * Do all this logging at the end so that * the root is at the right level. */ - xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); + xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); ASSERT(*curp == NULL); *curp = cur; *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); @@ -3108,8 +3116,12 @@ xfs_bmap_local_to_extents( *firstblock = args.fsbno; bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); bp->b_ops = &xfs_bmbt_buf_ops; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + + xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); + xfs_bmap_forkoff_reset(args.mp, ip, whichfork); xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); xfs_iext_add(ifp, 0, 1); @@ -3778,11 +3790,15 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); - if (block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC) || - be16_to_cpu(block->bb_level) != level || + if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && + block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) + return 0; + + if (be16_to_cpu(block->bb_level) != level || be16_to_cpu(block->bb_numrecs) == 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) return 0; + return 1; } diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 836f52f..473db4a 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -38,24 +38,31 @@ xfs_extent_state( */ void xfs_bmdr_to_bmbt( - struct xfs_mount *mp, + struct xfs_inode *ip, xfs_bmdr_block_t *dblock, int dblocklen, struct xfs_btree_block *rblock, int rblocklen) { + struct xfs_mount *mp = ip->i_mount; int dmxr; xfs_bmbt_key_t *fkp; __be64 *fpp; xfs_bmbt_key_t *tkp; __be64 *tpp; - rblock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + rblock->bb_level = dblock->bb_level; ASSERT(be16_to_cpu(rblock->bb_level) > 0); rblock->bb_numrecs = dblock->bb_numrecs; - rblock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - rblock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); fkp = XFS_BMDR_KEY_ADDR(dblock, 1); tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); @@ -403,7 +410,13 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; - ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno == + cpu_to_be64(XFS_BUF_DADDR_NULL)); + } else + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_level != 0); @@ -687,45 +700,59 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } -static void +static bool xfs_bmbt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); unsigned int level; - int lblock_ok; /* block passes checks */ - /* magic number and level verification. + switch (be32_to_cpu(block->bb_magic)) { + case XFS_BMAP_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.l.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + /* + * XXX: need a better way of verifying the owner here. Right now + * just make sure there has been one set. + */ + if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) + return false; + /* fall through */ + case XFS_BMAP_MAGIC: + break; + default: + return false; + } + + /* + * numrecs and level verification. * - * We don't know waht fork we belong to, so just verify that the level + * We don't know what fork we belong to, so just verify that the level * is less than the maximum of the two. Later checks will be more * precise. */ level = be16_to_cpu(block->bb_level); - lblock_ok = block->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC) && - level < MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); - - /* numrecs verification */ - lblock_ok = lblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_bmap_dmxr[level != 0]; + if (level > MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) + return false; /* sibling pointer verification */ - lblock_ok = lblock_ok && - block->bb_u.l.bb_leftsib && - (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && - block->bb_u.l.bb_rightsib && - (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); - - if (!lblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; } static void @@ -733,13 +760,29 @@ xfs_bmbt_read_verify( struct xfs_buf *bp) { xfs_bmbt_verify(bp); + if (!(xfs_btree_lblock_verify_crc(bp) && + xfs_bmbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + } static void xfs_bmbt_write_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!xfs_bmbt_verify(bp)) { + xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_btree_lblock_calc_crc(bp); } const struct xfs_buf_ops xfs_bmbt_buf_ops = { @@ -913,6 +956,8 @@ xfs_bmbt_init_cursor( cur->bc_ops = &xfs_bmbt_ops; cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, whichfork); cur->bc_private.b.ip = ip; diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index c35269b..a7c19e9 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -26,9 +26,13 @@ kmem_zone_t *xfs_btree_cur_zone; /* * Btree magic numbers. */ -const __uint32_t xfs_magics[XFS_BTNUM_MAX] = { - XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC +static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } }; +#define xfs_btree_magic(cur) \ + xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] STATIC int /* error (0 or EFSCORRUPTED) */ @@ -38,30 +42,38 @@ xfs_btree_check_lblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer for block, if any */ { - int lblock_ok; /* block passes checks */ + int lblock_ok = 1; /* block passes checks */ struct xfs_mount *mp; /* file system mount point */ mp = cur->bc_mp; - lblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + lblock_ok = lblock_ok && + uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.l.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + lblock_ok = lblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && + be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); + be64_to_cpu(block->bb_u.l.bb_rightsib))); + if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, - mp); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -74,16 +86,26 @@ xfs_btree_check_sblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block */ { + struct xfs_mount *mp; /* file system mount point */ struct xfs_buf *agbp; /* buffer for ag. freespace struct */ struct xfs_agf *agf; /* ag. freespace structure */ xfs_agblock_t agflen; /* native ag. freespace length */ - int sblock_ok; /* block passes checks */ + int sblock_ok = 1; /* block passes checks */ + mp = cur->bc_mp; agbp = cur->bc_private.a.agbp; agf = XFS_BUF_TO_AGF(agbp); agflen = be32_to_cpu(agf->agf_length); - sblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + sblock_ok = sblock_ok && + uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.s.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + sblock_ok = sblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && @@ -93,13 +115,13 @@ xfs_btree_check_sblock( (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; - if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, + + if (unlikely(XFS_TEST_ERROR(!sblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", - XFS_ERRLEVEL_LOW, cur->bc_mp, block); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -178,6 +200,72 @@ xfs_btree_check_ptr( #endif /* + * Calculate CRC on the whole btree block and stuff it into the + * long-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_lblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); +} + +bool +xfs_btree_lblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); + return true; +} + +/* + * Calculate CRC on the whole btree block and stuff it into the + * short-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_sblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); +} + +bool +xfs_btree_sblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); + return true; +} + +/* * Delete the btree cursor. */ void @@ -261,10 +349,8 @@ xfs_btree_dup_cursor( *ncur = NULL; return error; } - new->bc_bufs[i] = bp; - ASSERT(!xfs_buf_geterror(bp)); - } else - new->bc_bufs[i] = NULL; + } + new->bc_bufs[i] = bp; } *ncur = new; return 0; @@ -305,9 +391,17 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? - XFS_BTREE_LBLOCK_LEN : - XFS_BTREE_SBLOCK_LEN; + size_t len; + + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + len = XFS_BTREE_LBLOCK_LEN; + else + len = XFS_BTREE_SBLOCK_LEN; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + len += XFS_BTREE_CRCBLOCK_ADD; + + return len; } /* @@ -807,43 +901,85 @@ xfs_btree_set_sibling( } void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags) +{ + buf->bb_magic = cpu_to_be32(magic); + buf->bb_level = cpu_to_be16(level); + buf->bb_numrecs = cpu_to_be16(numrecs); + + if (flags & XFS_BTREE_LONG_PTRS) { + buf->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); + buf->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.l.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.l.bb_owner = cpu_to_be64(owner); + uuid_copy(&buf->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid); + buf->bb_u.l.bb_pad = 0; + } + } else { + /* owner is a 32 bit value on short blocks */ + __u32 __owner = (__u32)owner; + + buf->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); + buf->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.s.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.s.bb_owner = cpu_to_be32(__owner); + uuid_copy(&buf->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid); + } + } +} + +void xfs_btree_init_block( struct xfs_mount *mp, struct xfs_buf *bp, __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags) { - struct xfs_btree_block *new = XFS_BUF_TO_BLOCK(bp); - - new->bb_magic = cpu_to_be32(magic); - new->bb_level = cpu_to_be16(level); - new->bb_numrecs = cpu_to_be16(numrecs); - - if (flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); - } else { - new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - } + xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + magic, level, numrecs, owner, flags); } STATIC void xfs_btree_init_block_cur( struct xfs_btree_cur *cur, + struct xfs_buf *bp, int level, - int numrecs, - struct xfs_buf *bp) + int numrecs) { - xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], - level, numrecs, cur->bc_flags); + __u64 owner; + + /* + * we can pull the owner from the cursor right now as the different + * owners align directly with the pointer size of the btree. This may + * change in future, but is safe for current users of the generic btree + * code. + */ + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + owner = cur->bc_private.b.ip->i_ino; + else + owner = cur->bc_private.a.agno; + + xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + xfs_btree_magic(cur), level, numrecs, + owner, cur->bc_flags); } /* * Return true if ptr is the last record in the btree and - * we need to track updateѕ to this record. The decision + * we need to track updates to this record. The decision * will be further refined in the update_lastrec method. */ STATIC int @@ -1091,6 +1227,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1115,6 +1252,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1139,6 +1277,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); int level = xfs_btree_get_level(block); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1167,7 +1306,12 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib), - XFS_BTREE_SBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.s.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.s.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.s.bb_owner), + offsetof(struct xfs_btree_block, bb_u.s.bb_crc), + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD }; static const short loffsets[] = { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1175,17 +1319,40 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib), - XFS_BTREE_LBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.l.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.l.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.l.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.l.bb_owner), + offsetof(struct xfs_btree_block, bb_u.l.bb_crc), + offsetof(struct xfs_btree_block, bb_u.l.bb_pad), + XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD }; XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBI(cur, bp, fields); if (bp) { + int nbits; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { + /* + * We don't log the CRC when updating a btree + * block but instead recreate it during log + * recovery. As the log buffers have checksums + * of their this is safe and avoids logging a crc + * update in a lot of places. + */ + if (fields == XFS_BB_ALL_BITS) + fields = XFS_BB_ALL_BITS_CRC; + nbits = XFS_BB_NUM_BITS_CRC; + } else { + nbits = XFS_BB_NUM_BITS; + } xfs_btree_offsets(fields, (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, - XFS_BB_NUM_BITS, &first, &last); + nbits, &first, &last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, @@ -2148,7 +2315,7 @@ xfs_btree_split( goto error0; /* Fill in the btree header for the new right block. */ - xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); + xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); /* * Split the entries between the old and the new block evenly. @@ -2457,7 +2624,7 @@ xfs_btree_new_root( nptr = 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); + xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 0bc24cc..ee036bf 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -163,52 +163,82 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } -void +static int xfs_inobt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ - /* magic number and level verification */ - level = be16_to_cpu(block->bb_level); - sblock_ok = block->bb_magic == cpu_to_be32(XFS_IBT_MAGIC) && - level < mp->m_in_maxlevels; + /* + * During growfs operations, we can't verify the exact owner as the + * perag is not fully initialised and hence not attached to the buffer. + */ + switch (be32_to_cpu(block->bb_magic)) { + case XFS_IBT_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ + case XFS_IBT_MAGIC: + break; + default: + return 0; + } - /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_inobt_mxr[level != 0]; + /* numrecs and level verification */ + level = be16_to_cpu(block->bb_level); + if (level >= mp->m_in_maxlevels) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_inobt_read_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_inobt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_inobt_write_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!xfs_inobt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_inobt_buf_ops = { @@ -355,6 +385,8 @@ xfs_inobt_init_cursor( cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index 2970f46..da61233 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -492,6 +492,7 @@ xfs_iformat_btree( xfs_dinode_t *dip, int whichfork) { + struct xfs_mount *mp = ip->i_mount; xfs_bmdr_block_t *dfp; xfs_ifork_t *ifp; /* REFERENCED */ @@ -500,7 +501,7 @@ xfs_iformat_btree( ifp = XFS_IFORK_PTR(ip, whichfork); dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); - size = XFS_BMAP_BROOT_SPACE(dfp); + size = XFS_BMAP_BROOT_SPACE(mp, dfp); nrecs = be16_to_cpu(dfp->bb_numrecs); /* @@ -511,14 +512,14 @@ xfs_iformat_btree( * blocks. */ if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= - XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_IFORK_MAXEXT(ip, whichfork) || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_DFORK_SIZE(dip, mp, whichfork) || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", - (unsigned long long) ip->i_ino); + xfs_warn(mp, "corrupt inode %Lu (btree).", + (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); + mp, dip); return XFS_ERROR(EFSCORRUPTED); } @@ -529,8 +530,7 @@ xfs_iformat_btree( * Copy and convert from the on-disk structure * to the in-memory structure. */ - xfs_bmdr_to_bmbt(ip->i_mount, dfp, - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), ifp->if_broot, size); ifp->if_flags &= ~XFS_IFEXTENTS; ifp->if_flags |= XFS_IFBROOT; @@ -813,7 +813,7 @@ xfs_iroot_realloc( * allocate it now and get out. */ if (ifp->if_broot_bytes == 0) { - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes = (int)new_size; return; @@ -827,9 +827,9 @@ xfs_iroot_realloc( */ cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); new_max = cur_max + rec_diff; - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ + XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -837,7 +837,7 @@ xfs_iroot_realloc( (int)new_size); ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); return; } @@ -852,7 +852,7 @@ xfs_iroot_realloc( new_max = cur_max + rec_diff; ASSERT(new_max >= 0); if (new_max > 0) - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); else new_size = 0; if (new_size > 0) { @@ -860,7 +860,8 @@ xfs_iroot_realloc( /* * First copy over the btree block header. */ - memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN); + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); } else { new_broot = NULL; ifp->if_flags &= ~XFS_IFBROOT; @@ -890,7 +891,7 @@ xfs_iroot_realloc( ifp->if_broot = new_broot; ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); return; } @@ -1160,7 +1161,7 @@ xfs_iflush_fork( ASSERT(ifp->if_broot != NULL); ASSERT(ifp->if_broot_bytes <= (XFS_IFORK_SIZE(ip, whichfork) + - XFS_BROOT_SIZE_ADJ)); + XFS_BROOT_SIZE_ADJ(ip))); xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, (xfs_bmdr_block_t *)cp, XFS_DFORK_SIZE(dip, mp, whichfork)); diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index a9155b3..e59ea78 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -333,7 +333,7 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error = xfs_mount_validate_sb(mp, &sb, bp->b_blkno == XFS_SB_DADDR); + error = xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); if (error) xfs_buf_ioerror(bp, error); } diff --git a/mdrestore/Makefile b/mdrestore/Makefile index ca2d1a0..5171306 100644 --- a/mdrestore/Makefile +++ b/mdrestore/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = xfs_mdrestore CFILES = xfs_mdrestore.c -LLDLIBS = $(LIBXFS) $(LIBRT) $(LIBPTHREAD) +LLDLIBS = $(LIBXFS) $(LIBRT) $(LIBPTHREAD) $(LIBUUID) LTDEPENDENCIES = $(LIBXFS) LLDFLAGS = -static -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 379DF7F5E for ; Mon, 21 Jan 2013 07:53:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9CF1EAC006 for ; Mon, 21 Jan 2013 05:53:53 -0800 (PST) X-ASG-Debug-ID: 1358776424-04cbb00c6343860002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BB38b4Ug3eGHs18A for ; Mon, 21 Jan 2013 05:53:48 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFGgEMLzMIGDE5AxsZiBisKY5xkTkDklmET48tgwmBVCQ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:44 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoS-0001P2-4b for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:24 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoS-0005oe-0o for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/12] xfsprogs: add crc format support to repair Date: Tue, 22 Jan 2013 00:53:10 +1100 X-ASG-Orig-Subj: [PATCH 11/12] xfsprogs: add crc format support to repair Message-Id: <1358776391-22140-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776426 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- db/sb.c | 1 + include/libxfs.h | 5 ++ include/xfs_alloc_btree.h | 2 +- include/xfs_bmap_btree.h | 2 +- include/xfs_btree.h | 5 +- include/xfs_ialloc_btree.h | 2 +- include/xfs_symlink.h | 2 + libxfs/rdwr.c | 20 ++++- libxfs/xfs.h | 12 ++- libxfs/xfs_alloc.c | 7 +- libxfs/xfs_btree.c | 20 +++-- libxfs/xfs_ialloc.c | 2 - libxfs/xfs_mount.c | 16 ---- libxlog/xfs_log_recover.c | 4 +- logprint/logprint.c | 3 + repair/agheader.c | 36 ++++++++- repair/dino_chunks.c | 7 +- repair/dinode.c | 190 ++++++++++++++++++++++++++------------------ repair/phase2.c | 1 + repair/phase5.c | 157 +++++++++++++++++++++++++++--------- repair/prefetch.c | 7 +- repair/scan.c | 158 +++++++++++++++++++----------------- repair/scan.h | 12 ++- repair/versions.c | 2 +- repair/xfs_repair.c | 2 +- 25 files changed, 435 insertions(+), 240 deletions(-) diff --git a/db/sb.c b/db/sb.c index f99210c..af86722 100644 --- a/db/sb.c +++ b/db/sb.c @@ -240,6 +240,7 @@ sb_logcheck(void) log.l_logsize = BBTOB(log.l_logBBsize); log.l_logBBsize = x.logBBsize; log.l_logBBstart = x.logBBstart; + log.l_sectBBsize = x.lbsize; log.l_mp = mp; if (xlog_find_tail(&log, &head_blk, &tail_blk)) { diff --git a/include/libxfs.h b/include/libxfs.h index f64e489..e6cae94 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -678,6 +678,7 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); #define libxfs_dinode_to_disk xfs_dinode_to_disk void xfs_dinode_from_disk(struct xfs_icdinode *, struct xfs_dinode *); +#define libxfs_dinode_calc_crc xfs_dinode_calc_crc #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork @@ -686,6 +687,10 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_sb_from_disk xfs_sb_from_disk #define libxfs_sb_to_disk xfs_sb_to_disk +/* xfs_symlink.h */ +#define libxfs_symlink_blocks xfs_symlink_blocks +#define libxfs_symlink_hdr_ok xfs_symlink_hdr_ok + /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index 6968494..5cf27ec 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -64,7 +64,7 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_ALLOC_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_CRC_LEN : \ XFS_BTREE_SBLOCK_LEN) /* diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 2dd3a1a..b54cc0c 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -140,7 +140,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; */ #define XFS_BMBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_LBLOCK_CRC_LEN : \ XFS_BTREE_LBLOCK_LEN) #define XFS_BMBT_REC_ADDR(mp, block, index) \ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 02f89d8..c0acbbf 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -83,7 +83,10 @@ struct xfs_btree_block { #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ -#define XFS_BTREE_CRCBLOCK_ADD 32 /* size of blkno + crc + uuid */ + +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) #define XFS_BTREE_SBLOCK_CRC_OFF \ offsetof(struct xfs_btree_block, bb_u.s.bb_crc) diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 96fb140..2efbd91 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -80,7 +80,7 @@ typedef __be32 xfs_inobt_ptr_t; */ #define XFS_INOBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_CRC_LEN : \ XFS_BTREE_SBLOCK_LEN) /* diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h index bb21e6a..55f3f2d 100644 --- a/include/xfs_symlink.h +++ b/include/xfs_symlink.h @@ -29,6 +29,8 @@ struct xfs_dsymlink_hdr { sizeof(struct xfs_dsymlink_hdr) : 0)) int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); +bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, + uint32_t size, struct xfs_buf *bp); extern const struct xfs_buf_ops xfs_symlink_buf_ops; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 0629d50..ee7702c 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -444,6 +444,7 @@ __libxfs_getbufr(int blen) } else bp = kmem_zone_zalloc(xfs_buf_zone, 0); pthread_mutex_unlock(&xfs_buf_freelist.cm_mutex); + bp->b_ops = NULL; return bp; } @@ -700,6 +701,7 @@ libxfs_readbuf(struct xfs_buftarg dev, xfs_daddr_t blkno, int len, int flags, bp = libxfs_getbuf(dev, blkno, len); if (!bp) return NULL; + bp->b_error = 0; bp->b_ops = ops; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; @@ -795,10 +797,20 @@ libxfs_writebufr(xfs_buf_t *bp) int fd = libxfs_device_to_fd(bp->b_target.dev); int error = 0; + /* + * clear any pre-existing error status on the buffer. This can occur if + * the buffer is corrupt on disk and the repair process doesn't clear + * the error before fixing and writing it back. + */ + bp->b_error = 0; if (bp->b_ops) { bp->b_ops->verify_write(bp); - if (bp->b_error) + if (bp->b_error) { + fprintf(stderr, + _("%s: write verifer failed on bno 0x%llx/0x%x\n"), + __func__, (long long)bp->b_bn, bp->b_bcount); return error; + } } if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { @@ -845,6 +857,12 @@ libxfs_writebuf_int(xfs_buf_t *bp, int flags) int libxfs_writebuf(xfs_buf_t *bp, int flags) { +#ifdef IO_DEBUG + printf("%lx: %s: dirty blkno=%llu(%llu)\n", + pthread_self(), __FUNCTION__, + (long long)LIBXFS_BBTOOFF64(bp->b_bn), + (long long)bp->b_bn); +#endif bp->b_flags |= (LIBXFS_B_DIRTY | flags); libxfs_putbuf(bp); return 0; diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 398e48c..74617d1 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -76,8 +76,16 @@ typedef __uint32_t inst_t; /* an instruction */ #define IHOLD(ip) ((void) 0) /* stop unused var warnings by assigning mp to itself */ -#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { (mp) = (mp); } while (0) -#define XFS_ERROR_REPORT(e,l,mp) do { (mp) = (mp); } while (0) +#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { \ + (mp) = (mp); \ + cmn_err(CE_ALERT, "%s: XFS_CORRUPTION_ERROR", (e)); \ +} while (0) + +#define XFS_ERROR_REPORT(e,l,mp) do { \ + (mp) = (mp); \ + cmn_err(CE_ALERT, "%s: XFS_ERROR_REPORT", (e)); \ +} while (0) + #define XFS_QM_DQATTACH(mp,ip,flags) 0 #define XFS_ERROR(e) (e) #define XFS_ERRLEVEL_LOW 1 diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index bc9995d..df36435 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2173,8 +2173,13 @@ xfs_agf_verify( struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) { + char uu[64], uu2[64]; + platform_uuid_unparse(&agf->agf_uuid, uu); + platform_uuid_unparse(&mp->m_sb.sb_uuid, uu2); + return false; + } if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 0d36584..219d154 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -391,17 +391,15 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - size_t len; - - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - len = XFS_BTREE_LBLOCK_LEN; - else - len = XFS_BTREE_SBLOCK_LEN; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_LBLOCK_CRC_LEN; + return XFS_BTREE_LBLOCK_LEN; + } if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) - len += XFS_BTREE_CRCBLOCK_ADD; - - return len; + return XFS_BTREE_SBLOCK_CRC_LEN; + return XFS_BTREE_SBLOCK_LEN; } /* @@ -1311,7 +1309,7 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), offsetof(struct xfs_btree_block, bb_u.s.bb_owner), offsetof(struct xfs_btree_block, bb_u.s.bb_crc), - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD + XFS_BTREE_SBLOCK_CRC_LEN }; static const short loffsets[] = { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1325,7 +1323,7 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_u.l.bb_owner), offsetof(struct xfs_btree_block, bb_u.l.bb_crc), offsetof(struct xfs_btree_block, bb_u.l.bb_pad), - XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD + XFS_BTREE_LBLOCK_CRC_LEN }; XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 5e49a7d..400fb1d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -182,8 +182,6 @@ xfs_ialloc_inode_init( ino = XFS_AGINO_TO_INO(mp, agno, XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); } else if (xfs_sb_version_hasnlink(&mp->m_sb)) - version = 3; - else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; else version = 1; diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 6ff2773..95e6726 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -141,22 +141,6 @@ xfs_mount_validate_sb( return XFS_ERROR(EWRONGFS); } - if (unlikely( - sbp->sb_logstart == 0 && mp->m_logdev.dev == mp->m_dev.dev)) { - xfs_warn(mp, - "filesystem is marked as having an external log; " - "specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - - if (unlikely( - sbp->sb_logstart != 0 && mp->m_logdev.dev != mp->m_dev.dev)) { - xfs_warn(mp, - "filesystem is marked as having an internal log; " - "do not specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - /* * More sanity checking. Most of these were stolen directly from * xfs_repair. diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index ad53e86..c66f9a1 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -19,9 +19,7 @@ #include #define xfs_readonly_buftarg(buftarg) (0) - -/* avoid set-but-unused var warning. gcc is not very bright. */ -#define xlog_clear_stale_blocks(log, taillsn) ((taillsn) = (taillsn)) +#define xlog_clear_stale_blocks(log, taillsn) (0) /* diff --git a/logprint/logprint.c b/logprint/logprint.c index 5452e87..cf24b6e 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -93,6 +93,7 @@ logstat(xfs_mount_t *mp) x.logBBsize = XFS_FSB_TO_BB(mp, sb->sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, sb->sb_logstart); + x.lbsize = 1 << mp->m_sb.sb_logsectlog; if (!x.logname && sb->sb_logstart == 0) { fprintf(stderr, _(" external log device not specified\n\n")); usage(); @@ -104,6 +105,7 @@ logstat(xfs_mount_t *mp) stat(x.dname, &s); x.logBBsize = s.st_size >> 9; x.logBBstart = 0; + x.lbsize = 1; } @@ -235,6 +237,7 @@ main(int argc, char **argv) log.l_logsize = BBTOB(x.logBBsize); log.l_logBBstart = x.logBBstart; log.l_logBBsize = x.logBBsize; + log.l_sectBBsize = x.lbsize; log.l_mp = &mount; switch (print_operation) { diff --git a/repair/agheader.c b/repair/agheader.c index 769022d..bc8b1bf 100644 --- a/repair/agheader.c +++ b/repair/agheader.c @@ -22,6 +22,11 @@ #include "protos.h" #include "err_protos.h" +/* + * XXX (dgc): WTF is the point of all the check and repair here when phase 5 + * recreates the AGF/AGI/AGFL completely from scratch? + */ + static int verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_agnumber_t i) { @@ -104,7 +109,20 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_agnumber_t i) /* don't check freespace btrees -- will be checked by caller */ - return(retval); + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return retval; + + if (platform_uuid_compare(&agf->agf_uuid, &mp->m_sb.sb_uuid)) { + char uu[64]; + + retval = XR_AG_AGF; + platform_uuid_unparse(&agf->agf_uuid, uu); + do_warn(_("bad uuid %s for agf %d\n"), uu, i); + + if (!no_modify) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + } + return retval; } static int @@ -169,7 +187,21 @@ verify_set_agi(xfs_mount_t *mp, xfs_agi_t *agi, xfs_agnumber_t agno) /* don't check inode btree -- will be checked by caller */ - return(retval); + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return retval; + + if (platform_uuid_compare(&agi->agi_uuid, &mp->m_sb.sb_uuid)) { + char uu[64]; + + retval = XR_AG_AGI; + platform_uuid_unparse(&agi->agi_uuid, uu); + do_warn(_("bad uuid %s for agi %d\n"), uu, agno); + + if (!no_modify) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + } + + return retval; } /* diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 3e7e225..280423b 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -629,7 +629,7 @@ process_inode_chunk( bplist[bp_index] = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), XFS_FSB_TO_BB(mp, blks_per_cluster), 0, - NULL); + &xfs_inode_buf_ops); if (!bplist[bp_index]) { do_warn(_("cannot read inode %" PRIu64 ", disk block %" PRId64 ", cnt %d\n"), XFS_AGINO_TO_INO(mp, agno, first_irec->ino_startnum), @@ -776,8 +776,11 @@ process_inode_chunk( extra_attr_check, &isa_dir, &parent); ASSERT(is_used != 3); - if (ino_dirty) + if (ino_dirty) { dirty = 1; + libxfs_dinode_calc_crc(mp, dino); + } + /* * XXX - if we want to try and keep * track of whether we need to bang on diff --git a/repair/dinode.c b/repair/dinode.c index 7a75dc8..5e1633b 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -86,139 +86,127 @@ _("would have cleared inode %" PRIu64 " attributes\n"), ino_num); } static int -clear_dinode_core(xfs_dinode_t *dinoc, xfs_ino_t ino_num) +clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t *dinoc, xfs_ino_t ino_num) { int dirty = 0; + int i; - if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) { - dirty = 1; - - if (no_modify) - return(1); +#define __dirty_no_modify_ret(dirty) \ + ({ (dirty) = 1; if (no_modify) return 1; }) + if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) { + __dirty_no_modify_ret(dirty); dinoc->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); } if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || (!fs_inode_nlink && dinoc->di_version > 1)) { - dirty = 1; - - if (no_modify) - return(1); - - dinoc->di_version = (fs_inode_nlink) ? 2 : 1; + __dirty_no_modify_ret(dirty); + if (xfs_sb_version_hascrc(&mp->m_sb)) + dinoc->di_version = 3; + else + dinoc->di_version = (fs_inode_nlink) ? 2 : 1; } if (be16_to_cpu(dinoc->di_mode) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_mode = 0; } if (be16_to_cpu(dinoc->di_flags) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_flags = 0; } if (be32_to_cpu(dinoc->di_dmevmask) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_dmevmask = 0; } if (dinoc->di_forkoff != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_forkoff = 0; } if (dinoc->di_format != XFS_DINODE_FMT_EXTENTS) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_format = XFS_DINODE_FMT_EXTENTS; } if (dinoc->di_aformat != XFS_DINODE_FMT_EXTENTS) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_aformat = XFS_DINODE_FMT_EXTENTS; } if (be64_to_cpu(dinoc->di_size) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_size = 0; } if (be64_to_cpu(dinoc->di_nblocks) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_nblocks = 0; } if (be16_to_cpu(dinoc->di_onlink) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_onlink = 0; } if (be32_to_cpu(dinoc->di_nextents) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_nextents = 0; } if (be16_to_cpu(dinoc->di_anextents) != 0) { - dirty = 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_anextents = 0; } if (dinoc->di_version > 1 && be32_to_cpu(dinoc->di_nlink) != 0) { - dirty = 1; + __dirty_no_modify_ret(dirty); + dinoc->di_nlink = 0; + } - if (no_modify) - return(1); + /* we are done for version 1/2 inodes */ + if (dinoc->di_version < 3) + return dirty; - dinoc->di_nlink = 0; + if (be64_to_cpu(dinoc->di_ino) != ino_num) { + __dirty_no_modify_ret(dirty); + dinoc->di_ino = cpu_to_be64(ino_num); } - return(dirty); + if (platform_uuid_compare(&dinoc->di_uuid, &mp->m_sb.sb_uuid)) { + __dirty_no_modify_ret(dirty); + platform_uuid_copy(&dinoc->di_uuid, &mp->m_sb.sb_uuid); + } + + for (i = 0; i < 16; i++) { + if (dinoc->di_pad[i] != 0) { + __dirty_no_modify_ret(dirty); + memset(dinoc->di_pad, 0, 16); + break; + } + } + + if (be64_to_cpu(dinoc->di_flags2) != 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_flags2 = 0; + } + + if (be64_to_cpu(dinoc->di_lsn) != 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_lsn = 0; + } + + if (be64_to_cpu(dinoc->di_changecount) != 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_changecount = 0; + } + + return dirty; } static int @@ -244,7 +232,7 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) { int dirty; - dirty = clear_dinode_core(dino, ino_num); + dirty = clear_dinode_core(mp, dino, ino_num); dirty += clear_dinode_unlinked(mp, dino); /* and clear the forks */ @@ -1127,6 +1115,7 @@ process_btinode( int level; int numrecs; bmap_cursor_t cursor; + __uint64_t magic; dib = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); lino = XFS_AGINO_TO_INO(mp, agno, ino); @@ -1138,6 +1127,9 @@ process_btinode( else forkname = _("attr"); + magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_BMAP_CRC_MAGIC + : XFS_BMAP_MAGIC; + level = be16_to_cpu(dib->bb_level); numrecs = be16_to_cpu(dib->bb_numrecs); @@ -1191,9 +1183,9 @@ _("bad numrecs 0 in inode %" PRIu64 " bmap btree root block\n"), return(1); } - if (scan_lbtree(be64_to_cpu(pp[i]), level, scanfunc_bmap, type, + if (scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt, type, whichfork, lino, tot, nex, blkmapp, &cursor, - 1, check_dups)) + 1, check_dups, magic, &xfs_bmbt_buf_ops)) return(1); /* * fix key (offset) mismatches between the keys in root @@ -1512,9 +1504,21 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), return(1); } + buf_data = (char *)XFS_BUF_PTR(bp); - size = MIN(be64_to_cpu(dino->di_size) - amountdone, - XFS_FSB_TO_BB(mp, 1) * BBSIZE); + size = MIN(be64_to_cpu(dino->di_size) - amountdone, + XFS_SYMLINK_BUF_SPACE(mp, + mp->m_sb.sb_blocksize)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!libxfs_symlink_hdr_ok(mp, lino, amountdone, + size, bp)) { + do_warn( +_("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), + lino, i, fsbno); + return(1); + } + buf_data += sizeof(struct xfs_dsymlink_hdr); + } memmove(cptr, buf_data, size); cptr += size; amountdone += size; @@ -2464,7 +2468,8 @@ process_dinode_int(xfs_mount_t *mp, } if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || - (!fs_inode_nlink && dino->di_version > 1)) { + (!fs_inode_nlink && dino->di_version > 1) || + (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) ) { retval = 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %" PRIu64 "%c"), @@ -2473,7 +2478,9 @@ process_dinode_int(xfs_mount_t *mp, if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting version number\n")); - dino->di_version = (fs_inode_nlink) ? 2 : 1; + dino->di_version = + xfs_sb_version_hascrc(&mp->m_sb) ? 3 : + (fs_inode_nlink) ? 2 : 1; *dirty = 1; } else do_warn(_(" would reset version number\n")); @@ -2481,6 +2488,31 @@ process_dinode_int(xfs_mount_t *mp, } /* + * We don't bother checking the CRC here - we cannot guarantee that when + * we are called here that the inode has not already been modified in + * memory and hence invalidated the CRC. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (be64_to_cpu(dino->di_ino) != lino) { + if (!uncertain) + do_warn( +_("inode identifier %" PRIu64 " mismatch on inode %" PRIu64 "\n"), + be64_to_cpu(dino->di_ino), lino); + if (verify_mode) + return 1; + goto clear_bad_out; + } + if (platform_uuid_compare(&dino->di_uuid, &mp->m_sb.sb_uuid)) { + if (!uncertain) + do_warn( + _("UUID mismatch on inode %" PRIu64 "\n"), lino); + if (verify_mode) + return 1; + goto clear_bad_out; + } + } + + /* * blow out of here if the inode size is < 0 */ if ((xfs_fsize_t)be64_to_cpu(dino->di_size) < 0) { diff --git a/repair/phase2.c b/repair/phase2.c index 5a4cf10..0481f51 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -64,6 +64,7 @@ zero_log(xfs_mount_t *mp) ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT); } log.l_sectbb_mask = (1 << log.l_sectbb_log) - 1; + log.l_sectBBsize = 1 << mp->m_sb.sb_logsectlog; if ((error = xlog_find_tail(&log, &head_blk, &tail_blk))) { do_warn(_("zero_log: cannot find log head/tail " diff --git a/repair/phase5.c b/repair/phase5.c index 7d5cd49..52d035f 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -602,6 +602,12 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, xfs_alloc_ptr_t *bt_ptr; xfs_agblock_t agbno; bt_stat_level_t *lptr; + __uint32_t crc_magic; + + if (magic == XFS_ABTB_MAGIC) + crc_magic = XFS_ABTB_CRC_MAGIC; + else + crc_magic = XFS_ABTC_CRC_MAGIC; level++; @@ -650,14 +656,17 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, /* * initialize block header */ + lptr->buf_p->b_ops = &xfs_allocbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, level, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, level, + 0, agno, 0); - bt_hdr->bb_magic = cpu_to_be32(magic); - bt_hdr->bb_level = cpu_to_be16(level); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs = 0; /* * propagate extent record for first extent in new block up @@ -699,6 +708,7 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, extent_tree_node_t *ext_ptr; bt_stat_level_t *lptr; xfs_extlen_t freeblks; + __uint32_t crc_magic; #ifdef XR_BLD_FREE_TRACE fprintf(stderr, "in build_freespace_tree, agno = %d\n", agno); @@ -707,6 +717,10 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, freeblks = 0; ASSERT(level > 0); + if (magic == XFS_ABTB_MAGIC) + crc_magic = XFS_ABTB_CRC_MAGIC; + else + crc_magic = XFS_ABTC_CRC_MAGIC; /* * initialize the first block on each btree level @@ -728,14 +742,15 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * initialize block header */ + lptr->buf_p->b_ops = &xfs_allocbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - - bt_hdr->bb_magic = cpu_to_be32(magic); - bt_hdr->bb_level = cpu_to_be16(i); - bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs = 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, i, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, i, + 0, agno, 0); } /* * run along leaf, setting up records. as we have to switch @@ -759,13 +774,17 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * block initialization, lay in block header */ + lptr->buf_p->b_ops = &xfs_allocbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, 0, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, + 0, agno, 0); - bt_hdr->bb_magic = cpu_to_be32(magic); - bt_hdr->bb_level = 0; bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); bt_hdr->bb_numrecs = cpu_to_be16(lptr->num_recs_pb + (lptr->modulo > 0)); #ifdef XR_BLD_FREE_TRACE @@ -996,14 +1015,19 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, /* * initialize block header */ + lptr->buf_p->b_ops = &xfs_inobt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + level, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + level, 0, agno, 0); - bt_hdr->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level = cpu_to_be16(level); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs = 0; + /* * propagate extent record for first extent in new block up */ @@ -1024,6 +1048,9 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, *bt_ptr = cpu_to_be32(btree_curs->level[level-1].agbno); } +/* + * XXX: yet more code that can be shared with mkfs, growfs. + */ static void build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, xfs_agino_t first_agino, @@ -1036,6 +1063,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, agi_buf = libxfs_getbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), mp->m_sb.sb_sectsize/BBSIZE); + agi_buf->b_ops = &xfs_agi_buf_ops; agi = XFS_BUF_TO_AGI(agi_buf); memset(agi, 0, mp->m_sb.sb_sectsize); @@ -1057,6 +1085,9 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) agi->agi_unlinked[i] = cpu_to_be32(NULLAGINO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + libxfs_writebuf(agi_buf, 0); } @@ -1099,15 +1130,19 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * initialize block header */ + + lptr->buf_p->b_ops = &xfs_inobt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - - bt_hdr->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level = cpu_to_be16(i); - bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs = 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + i, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + i, 0, agno, 0); } + /* * run along leaf, setting up records. as we have to switch * blocks, call the prop_ino_cursor routine to set up the new @@ -1127,13 +1162,18 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * block initialization, lay in block header */ + lptr->buf_p->b_ops = &xfs_inobt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + 0, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + 0, 0, agno, 0); - bt_hdr->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level = 0; bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); bt_hdr->bb_numrecs = cpu_to_be16(lptr->num_recs_pb + (lptr->modulo > 0)); @@ -1192,7 +1232,9 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * build both the agf and the agfl for an agno given both - * btree cursors + * btree cursors. + * + * XXX: yet more common code that can be shared with mkfs/growfs. */ static void build_agf_agfl(xfs_mount_t *mp, @@ -1208,10 +1250,12 @@ build_agf_agfl(xfs_mount_t *mp, int j; xfs_agfl_t *agfl; xfs_agf_t *agf; + __be32 *freelist; agf_buf = libxfs_getbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), mp->m_sb.sb_sectsize/BBSIZE); + agf_buf->b_ops = &xfs_agf_buf_ops; agf = XFS_BUF_TO_AGF(agf_buf); memset(agf, 0, mp->m_sb.sb_sectsize); @@ -1265,31 +1309,45 @@ build_agf_agfl(xfs_mount_t *mp, XFS_BTNUM_CNT); #endif + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + + /* initialise the AGFL, then fill it if there are blocks left over. */ + agfl_buf = libxfs_getbuf(mp->m_dev, + XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), + mp->m_sb.sb_sectsize/BBSIZE); + agfl_buf->b_ops = &xfs_agfl_buf_ops; + agfl = XFS_BUF_TO_AGFL(agfl_buf); + + /* setting to 0xff results in initialisation to NULLAGBLOCK */ + memset(agfl, 0xff, mp->m_sb.sb_sectsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno = cpu_to_be32(agno); + platform_uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + for (i = 0; i < XFS_AGFL_SIZE(mp); i++) + agfl->agfl_bno[i] = cpu_to_be32(NULLAGBLOCK); + } + freelist = XFS_BUF_TO_AGFL_BNO(mp, agfl_buf); + /* * do we have left-over blocks in the btree cursors that should * be used to fill the AGFL? */ if (bno_bt->num_free_blocks > 0 || bcnt_bt->num_free_blocks > 0) { + /* - * yes - grab the AGFL buffer - */ - agfl_buf = libxfs_getbuf(mp->m_dev, - XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - mp->m_sb.sb_sectsize/BBSIZE); - agfl = XFS_BUF_TO_AGFL(agfl_buf); - memset(agfl, 0, mp->m_sb.sb_sectsize); - /* - * ok, now grab as many blocks as we can + * yes, now grab as many blocks as we can */ i = j = 0; while (bno_bt->num_free_blocks > 0 && i < XFS_AGFL_SIZE(mp)) { - agfl->agfl_bno[i] = cpu_to_be32( + freelist[i] = cpu_to_be32( get_next_blockaddr(agno, 0, bno_bt)); i++; } while (bcnt_bt->num_free_blocks > 0 && i < XFS_AGFL_SIZE(mp)) { - agfl->agfl_bno[i] = cpu_to_be32( + freelist[i] = cpu_to_be32( get_next_blockaddr(agno, 0, bcnt_bt)); i++; } @@ -1324,13 +1382,14 @@ build_agf_agfl(xfs_mount_t *mp, fprintf(stderr, "writing agfl for ag %u\n", agno); #endif - libxfs_writebuf(agfl_buf, 0); } else { agf->agf_flfirst = 0; agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount = 0; } + libxfs_writebuf(agfl_buf, 0); + ext_ptr = findbiggest_bcnt_extent(agno); agf->agf_longest = cpu_to_be32((ext_ptr != NULL) ? ext_ptr->ex_blockcount : 0); @@ -1340,6 +1399,26 @@ build_agf_agfl(xfs_mount_t *mp, libxfs_writebuf(agf_buf, 0); + /* + * now fix up the free list appropriately + * XXX: code lifted from mkfs, shoul dbe shared. + */ + { + xfs_alloc_arg_t args; + xfs_trans_t *tp; + + memset(&args, 0, sizeof(args)); + args.tp = tp = libxfs_trans_alloc(mp, 0); + args.mp = mp; + args.agno = agno; + args.alignment = 1; + args.pag = xfs_perag_get(mp,agno); + libxfs_trans_reserve(tp, XFS_MIN_FREELIST(agf, mp), 0, 0, 0, 0); + libxfs_alloc_fix_freelist(&args, 0); + xfs_perag_put(args.pag); + libxfs_trans_commit(tp, 0); + } + #ifdef XR_BLD_FREE_TRACE fprintf(stderr, "wrote agf for ag %u, error = %d\n", agno, error); #endif diff --git a/repair/prefetch.c b/repair/prefetch.c index ebe00c2..f5f8985 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -222,7 +222,7 @@ pf_scan_lbtree( int rc; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, &xfs_bmbt_buf_ops); if (!bp) return 0; @@ -338,6 +338,11 @@ pf_read_inode_dirs( int hasdir = 0; int isadir; + bp->b_ops = &xfs_inode_buf_ops; + bp->b_ops->verify_read(bp); + if (bp->b_error) + return; + for (icnt = 0; icnt < (XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog); icnt++) { dino = xfs_make_iptr(mp, bp, icnt); diff --git a/repair/scan.c b/repair/scan.c index 9f0ddaf..219b617 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -48,17 +48,6 @@ struct aghdr_cnts { __uint64_t ifreecount; }; -static void -scanfunc_allocbt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - __uint32_t magic, - struct aghdr_cnts *agcnts); - void set_mp(xfs_mount_t *mpp) { @@ -78,20 +67,23 @@ scan_sbtree( xfs_agnumber_t agno, int suspect, int isroot, + __uint32_t magic, void *priv), int isroot, - void *priv) + __uint32_t magic, + void *priv, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; bp = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, ops); if (!bp) { do_error(_("can't read btree block %d/%d\n"), agno, root); return; } (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, - isroot, priv); + isroot, magic, priv); libxfs_putbuf(bp); } @@ -114,7 +106,8 @@ scan_lbtree( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty), + int *dirty, + __uint64_t magic), int type, int whichfork, xfs_ino_t ino, @@ -123,14 +116,16 @@ scan_lbtree( blkmap_t **blkmapp, bmap_cursor_t *bm_cursor, int isroot, - int check_dups) + int check_dups, + __uint64_t magic, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int err; int dirty = 0; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, ops); if (!bp) { do_error(_("can't read btree block %d/%d\n"), XFS_FSB_TO_AGNO(mp, root), @@ -139,7 +134,8 @@ scan_lbtree( } err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, - bm_cursor, isroot, check_dups, &dirty); + bm_cursor, isroot, check_dups, &dirty, + magic); ASSERT(dirty == 0 || (dirty && !no_modify)); @@ -152,7 +148,7 @@ scan_lbtree( } int -scanfunc_bmap( +scan_bmapbt( struct xfs_btree_block *block, int level, int type, @@ -165,7 +161,8 @@ scanfunc_bmap( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty) + int *dirty, + __uint64_t magic) { int i; int err; @@ -192,7 +189,7 @@ scanfunc_bmap( * another inode are claiming the same block but that's * highly unlikely. */ - if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC) { + if (be32_to_cpu(block->bb_magic) != magic) { do_warn( _("bad magic # %#x in inode %" PRIu64 " (%s fork) bmbt block %" PRIu64 "\n"), be32_to_cpu(block->bb_magic), ino, forkname, bno); @@ -206,6 +203,16 @@ _("expected level %d got %d in inode %" PRIu64 ", (%s fork) bmbt block %" PRIu64 return(1); } + if (magic == XFS_BMAP_CRC_MAGIC) { + /* verify owner */ + if (be64_to_cpu(block->bb_u.l.bb_owner) != ino) { + do_warn( +_("expected owner inode %" PRIu64 ", got %llu, bmbt block %" PRIu64 "\n"), + ino, be64_to_cpu(block->bb_u.l.bb_owner), bno); + return(1); + } + } + if (check_dups == 0) { /* * check sibling pointers. if bad we have a conflict @@ -408,9 +415,10 @@ _("bad bmap btree ptr 0x%llx in ino %" PRIu64 "\n"), return(1); } - err = scan_lbtree(be64_to_cpu(pp[i]), level, scanfunc_bmap, + err = scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt, type, whichfork, ino, tot, nex, blkmapp, - bm_cursor, 0, check_dups); + bm_cursor, 0, check_dups, magic, + &xfs_bmbt_buf_ops); if (err) return(1); @@ -481,35 +489,7 @@ _("bad fwd (right) sibling pointer (saw %" PRIu64 " should be NULLDFSBNO)\n" } static void -scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - void *agcnts) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTB_MAGIC, agcnts); -} - -static void -scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - void *agcnts) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTC_MAGIC, agcnts); -} - -static void -scanfunc_allocbt( +scan_allocbt( struct xfs_btree_block *block, int level, xfs_agblock_t bno, @@ -517,8 +497,9 @@ scanfunc_allocbt( int suspect, int isroot, __uint32_t magic, - struct aghdr_cnts *agcnts) + void *priv) { + struct aghdr_cnts *agcnts = priv; const char *name; int i; xfs_alloc_ptr_t *pp; @@ -529,9 +510,19 @@ scanfunc_allocbt( xfs_extlen_t lastcount = 0; xfs_agblock_t lastblock = 0; - assert(magic == XFS_ABTB_MAGIC || magic == XFS_ABTC_MAGIC); - - name = (magic == XFS_ABTB_MAGIC) ? "bno" : "cnt"; + switch (magic) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTB_MAGIC: + name = "bno"; + break; + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTC_MAGIC: + name = "cnt"; + break; + default: + assert(0); + break; + } if (be32_to_cpu(block->bb_magic) != magic) { do_warn(_("bad magic # %#x in bt%s block %d/%d\n"), @@ -615,7 +606,8 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), continue; } - if (magic == XFS_ABTB_MAGIC) { + if (magic == XFS_ABTB_MAGIC || + magic == XFS_ABTB_CRC_MAGIC) { if (b <= lastblock) { do_warn(_( "out-of-order bno btree record %d (%u %u) block %u/%u\n"), @@ -648,7 +640,8 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * no warning messages -- we'll catch * FREE1 blocks later */ - if (magic == XFS_ABTC_MAGIC) { + if (magic == XFS_ABTC_MAGIC || + magic == XFS_ABTC_CRC_MAGIC) { set_bmap_ext(agno, b, blen, XR_E_FREE); break; @@ -709,10 +702,20 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * as possible. */ if (bno != 0 && verify_agbno(mp, agno, bno)) { - scan_sbtree(bno, level, agno, suspect, - (magic == XFS_ABTB_MAGIC) ? - scanfunc_bno : scanfunc_cnt, 0, - (void *)agcnts); + switch (magic) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTB_MAGIC: + scan_sbtree(bno, level, agno, suspect, + scan_allocbt, 0, magic, priv, + &xfs_allocbt_buf_ops); + break; + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTC_MAGIC: + scan_sbtree(bno, level, agno, suspect, + scan_allocbt, 0, magic, priv, + &xfs_allocbt_buf_ops); + break; + } } } } @@ -896,13 +899,14 @@ _("inode rec for ino %" PRIu64 " (%d/%d) overlaps existing rec (start %d/%d)\n") * that we aren't sure about go into the uncertain list. */ static void -scanfunc_ino( +scan_inobt( struct xfs_btree_block *block, int level, xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, int isroot, + __uint32_t magic, void *priv) { struct aghdr_cnts *agcnts = priv; @@ -915,7 +919,7 @@ scanfunc_ino( hdr_errors = 0; - if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC) { + if (be32_to_cpu(block->bb_magic) != magic) { do_warn(_("bad magic # %#x in inobt block %d/%d\n"), be32_to_cpu(block->bb_magic), agno, bno); hdr_errors++; @@ -1032,7 +1036,8 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (be32_to_cpu(pp[i]) != 0 && verify_agbno(mp, agno, be32_to_cpu(pp[i]))) scan_sbtree(be32_to_cpu(pp[i]), level, agno, - suspect, scanfunc_ino, 0, priv); + suspect, scan_inobt, 0, magic, priv, + &xfs_inobt_buf_ops); } } @@ -1041,12 +1046,12 @@ scan_freelist( xfs_agf_t *agf, struct aghdr_cnts *agcnts) { - xfs_agfl_t *agfl; xfs_buf_t *agflbuf; xfs_agnumber_t agno; xfs_agblock_t bno; int count; int i; + __be32 *freelist; agno = be32_to_cpu(agf->agf_seqno); @@ -1065,11 +1070,11 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } - agfl = XFS_BUF_TO_AGFL(agflbuf); + freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); i = be32_to_cpu(agf->agf_flfirst); count = 0; for (;;) { - bno = be32_to_cpu(agfl->agfl_bno[i]); + bno = be32_to_cpu(freelist[i]); if (verify_agbno(mp, agno, bno)) set_bmap(agno, bno, XR_E_FREE); else @@ -1098,11 +1103,15 @@ validate_agf( struct aghdr_cnts *agcnts) { xfs_agblock_t bno; + __uint32_t magic; bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]); if (bno != 0 && verify_agbno(mp, agno, bno)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTB_CRC_MAGIC + : XFS_ABTB_MAGIC; scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]), - agno, 0, scanfunc_bno, 1, agcnts); + agno, 0, scan_allocbt, 1, magic, agcnts, + &xfs_allocbt_buf_ops); } else { do_warn(_("bad agbno %u for btbno root, agno %d\n"), bno, agno); @@ -1110,8 +1119,11 @@ validate_agf( bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]); if (bno != 0 && verify_agbno(mp, agno, bno)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTC_CRC_MAGIC + : XFS_ABTC_MAGIC; scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]), - agno, 0, scanfunc_cnt, 1, agcnts); + agno, 0, scan_allocbt, 1, magic, agcnts, + &xfs_allocbt_buf_ops); } else { do_warn(_("bad agbno %u for btbcnt root, agno %d\n"), bno, agno); @@ -1142,11 +1154,15 @@ validate_agi( { xfs_agblock_t bno; int i; + __uint32_t magic; bno = be32_to_cpu(agi->agi_root); if (bno != 0 && verify_agbno(mp, agno, bno)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC + : XFS_IBT_MAGIC; scan_sbtree(bno, be32_to_cpu(agi->agi_level), - agno, 0, scanfunc_ino, 1, agcnts); + agno, 0, scan_inobt, 1, magic, agcnts, + &xfs_inobt_buf_ops); } else { do_warn(_("bad agbno %u for inobt root, agno %d\n"), be32_to_cpu(agi->agi_root), agno); diff --git a/repair/scan.h b/repair/scan.h index 9f945cf..92593e9 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -35,7 +35,8 @@ int scan_lbtree( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty), + int *dirty, + __uint64_t magic), int type, int whichfork, xfs_ino_t ino, @@ -44,9 +45,11 @@ int scan_lbtree( struct blkmap **blkmapp, bmap_cursor_t *bm_cursor, int isroot, - int check_dups); + int check_dups, + __uint64_t magic, + const struct xfs_buf_ops *ops); -int scanfunc_bmap( +int scan_bmapbt( struct xfs_btree_block *block, int level, int type, @@ -59,7 +62,8 @@ int scanfunc_bmap( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty); + int *dirty, + __uint64_t magic); void scan_ags( diff --git a/repair/versions.c b/repair/versions.c index 957766a..c11a728 100644 --- a/repair/versions.c +++ b/repair/versions.c @@ -165,7 +165,7 @@ _("This filesystem contains features not understood by this program.\n")); return(1); } - if (XFS_SB_VERSION_NUM(sb) == XFS_SB_VERSION_4) { + if (XFS_SB_VERSION_NUM(sb) >= XFS_SB_VERSION_4) { if (!fs_sb_feature_bits_allowed) { if (!no_modify) { do_warn( diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 167b1f6..8eefc48 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -612,7 +612,7 @@ main(int argc, char **argv) glob_agcount = mp->m_sb.sb_agcount; chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK; - max_symlink_blocks = howmany(MAXPATHLEN - 1, mp->m_sb.sb_blocksize); + max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN); inodes_per_cluster = MAX(mp->m_sb.sb_inopblock, XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AF1237F7C for ; Mon, 21 Jan 2013 07:53:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 636DD8F8035 for ; Mon, 21 Jan 2013 05:53:58 -0800 (PST) X-ASG-Debug-ID: 1358776434-04bdf0231a45670001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id obqdqSCQZ7mpc6r9 for ; Mon, 21 Jan 2013 05:53:55 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFGg0vMwgYMTkDGxmIGKwpjnGROQObd4pegwk Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:44 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHom-0001PI-3v for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:44 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoc-0005oj-1f for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:34 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/12] xfsprogs: add crc format support to db Date: Tue, 22 Jan 2013 00:53:11 +1100 X-ASG-Orig-Subj: [PATCH 12/12] xfsprogs: add crc format support to db Message-Id: <1358776391-22140-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776434 X-Barracuda-URL: http://192.48.157.11: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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- db/agf.c | 3 + db/agfl.c | 16 +++++ db/agfl.h | 2 + db/agi.c | 3 + db/btblock.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++ db/btblock.h | 10 ++++ db/field.c | 16 +++++ db/field.h | 8 +++ db/freesp.c | 11 +++- db/init.c | 4 ++ db/inode.c | 27 +++++++++ db/inode.h | 3 + db/sb.c | 26 +++++++++ db/type.c | 35 ++++++++++- db/type.h | 3 +- include/xfs_inode.h | 4 +- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 4 +- repair/phase6.c | 9 +-- 19 files changed, 315 insertions(+), 16 deletions(-) diff --git a/db/agf.c b/db/agf.c index 668637a..389cb43 100644 --- a/db/agf.c +++ b/db/agf.c @@ -69,6 +69,9 @@ const field_t agf_flds[] = { { "freeblks", FLDT_EXTLEN, OI(OFF(freeblks)), C1, 0, TYP_NONE }, { "longest", FLDT_EXTLEN, OI(OFF(longest)), C1, 0, TYP_NONE }, { "btreeblks", FLDT_UINT32D, OI(OFF(btreeblks)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/agfl.c b/db/agfl.c index 72dca23..93f1096 100644 --- a/db/agfl.c +++ b/db/agfl.c @@ -41,6 +41,11 @@ const field_t agfl_hfld[] = { { { NULL } }; +const field_t agfl_crc_hfld[] = { { + "", FLDT_AGFL_CRC, OI(0), C1, 0, TYP_NONE, }, + { NULL } +}; + #define OFF(f) bitize(offsetof(xfs_agfl_t, agfl_ ## f)) const field_t agfl_flds[] = { { "bno", FLDT_AGBLOCKNZ, OI(OFF(bno)), agfl_bno_size, @@ -48,6 +53,17 @@ const field_t agfl_flds[] = { { NULL } }; +const field_t agfl_crc_flds[] = { + { "magicnum", FLDT_UINT32X, OI(OFF(magicnum)), C1, 0, TYP_NONE }, + { "seqno", FLDT_AGNUMBER, OI(OFF(seqno)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "bno", FLDT_AGBLOCKNZ, OI(OFF(bno)), agfl_bno_size, + FLD_ARRAY|FLD_COUNT, TYP_DATA }, + { NULL } +}; + static int agfl_bno_size( void *obj, diff --git a/db/agfl.h b/db/agfl.h index 7b7631b..177ad41 100644 --- a/db/agfl.h +++ b/db/agfl.h @@ -18,6 +18,8 @@ extern const struct field agfl_flds[]; extern const struct field agfl_hfld[]; +extern const struct field agfl_crc_flds[]; +extern const struct field agfl_crc_hfld[]; extern void agfl_init(void); extern int agfl_size(void *obj, int startoff, int idx); diff --git a/db/agi.c b/db/agi.c index 02d5d30..6b2e889 100644 --- a/db/agi.c +++ b/db/agi.c @@ -54,6 +54,9 @@ const field_t agi_flds[] = { { "dirino", FLDT_AGINO, OI(OFF(dirino)), C1, 0, TYP_INODE }, { "unlinked", FLDT_AGINONN, OI(OFF(unlinked)), CI(XFS_AGI_UNLINKED_BUCKETS), FLD_ARRAY, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/btblock.c b/db/btblock.c index 2c199b2..37b9903 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -60,6 +60,31 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + [/*0x424d415*/8] = { /* BMAP_CRC */ + XFS_BTREE_LBLOCK_CRC_LEN, + sizeof(xfs_bmbt_key_t), + sizeof(xfs_bmbt_rec_t), + sizeof(__be64), + }, + [/*0x4142544*/0xa] = { /* ABTB_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_alloc_key_t), + sizeof(xfs_alloc_rec_t), + sizeof(__be32), + }, + [/*0x414254*/0xb] = { /* ABTC_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_alloc_key_t), + sizeof(xfs_alloc_rec_t), + sizeof(__be32), + }, + [/*0x4941425*/0xc] = { /* IABT_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, + }; /* @@ -208,6 +233,15 @@ const field_t bmapbtd_hfld[] = { { NULL } }; +const field_t bmapbta_crc_hfld[] = { + { "", FLDT_BMAPBTA_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; +const field_t bmapbtd_crc_hfld[] = { + { "", FLDT_BMAPBTD_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t bmapbta_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -237,6 +271,45 @@ const field_t bmapbtd_flds[] = { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, { NULL } }; +/* crc enabled versions */ +const field_t bmapbta_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTA }, + { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTA }, + { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, + { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BMAPBTAREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BMAPBTAKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BMAPBTAPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTA }, + { NULL } +}; +const field_t bmapbtd_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTD }, + { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTD }, + { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, + { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BMAPBTDPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, + { NULL } +}; #undef OFF #define KOFF(f) bitize(offsetof(xfs_bmbt_key_t, br_ ## f)) @@ -289,6 +362,11 @@ const field_t inobt_hfld[] = { { NULL } }; +const field_t inobt_crc_hfld[] = { + { "", FLDT_INOBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t inobt_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -304,6 +382,25 @@ const field_t inobt_flds[] = { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, { NULL } }; +const field_t inobt_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_INOBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_INOBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_INOBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_INOBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, + { NULL } +}; #undef OFF #define KOFF(f) bitize(offsetof(xfs_inobt_key_t, ir_ ## f)) @@ -331,6 +428,11 @@ const field_t bnobt_hfld[] = { { NULL } }; +const field_t bnobt_crc_hfld[] = { + { "", FLDT_BNOBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t bnobt_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -346,6 +448,25 @@ const field_t bnobt_flds[] = { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, { NULL } }; +const field_t bnobt_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_BNOBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_BNOBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_BNOBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BNOBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, + { NULL } +}; #undef OFF #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) @@ -369,6 +490,11 @@ const field_t cntbt_hfld[] = { { NULL } }; +const field_t cntbt_crc_hfld[] = { + { "", FLDT_CNTBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t cntbt_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -384,6 +510,25 @@ const field_t cntbt_flds[] = { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, { NULL } }; +const field_t cntbt_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_CNTBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_CNTBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_CNTBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_CNTBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, + { NULL } +}; #undef OFF #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) diff --git a/db/btblock.h b/db/btblock.h index 0631e66..daee060 100644 --- a/db/btblock.h +++ b/db/btblock.h @@ -18,26 +18,36 @@ extern const struct field bmapbta_flds[]; extern const struct field bmapbta_hfld[]; +extern const struct field bmapbta_crc_flds[]; +extern const struct field bmapbta_crc_hfld[]; extern const struct field bmapbta_key_flds[]; extern const struct field bmapbta_rec_flds[]; extern const struct field bmapbtd_flds[]; extern const struct field bmapbtd_hfld[]; +extern const struct field bmapbtd_crc_flds[]; +extern const struct field bmapbtd_crc_hfld[]; extern const struct field bmapbtd_key_flds[]; extern const struct field bmapbtd_rec_flds[]; extern const struct field inobt_flds[]; extern const struct field inobt_hfld[]; +extern const struct field inobt_crc_flds[]; +extern const struct field inobt_crc_hfld[]; extern const struct field inobt_key_flds[]; extern const struct field inobt_rec_flds[]; extern const struct field bnobt_flds[]; extern const struct field bnobt_hfld[]; +extern const struct field bnobt_crc_flds[]; +extern const struct field bnobt_crc_hfld[]; extern const struct field bnobt_key_flds[]; extern const struct field bnobt_rec_flds[]; extern const struct field cntbt_flds[]; extern const struct field cntbt_hfld[]; +extern const struct field cntbt_crc_flds[]; +extern const struct field cntbt_crc_hfld[]; extern const struct field cntbt_key_flds[]; extern const struct field cntbt_rec_flds[]; diff --git a/db/field.c b/db/field.c index 6903898..032b74e 100644 --- a/db/field.c +++ b/db/field.c @@ -48,6 +48,8 @@ const ftattr_t ftattrtab[] = { agf_flds }, { FLDT_AGFL, "agfl", NULL, (char *)agfl_flds, agfl_size, FTARG_SIZE, NULL, agfl_flds }, + { FLDT_AGFL_CRC, "agfl", NULL, (char *)agfl_crc_flds, agfl_size, + FTARG_SIZE, NULL, agfl_crc_flds }, { FLDT_AGI, "agi", NULL, (char *)agi_flds, agi_size, FTARG_SIZE, NULL, agi_flds }, { FLDT_AGINO, "agino", fp_num, "%u", SI(bitsz(xfs_agino_t)), @@ -86,6 +88,8 @@ const ftattr_t ftattrtab[] = { attrshort_size, FTARG_SIZE, NULL, attr_shortform_flds }, { FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size, FTARG_SIZE, NULL, bmapbta_flds }, + { FLDT_BMAPBTA_CRC, "bmapbta", NULL, (char *)bmapbta_crc_flds, + btblock_size, FTARG_SIZE, NULL, bmapbta_crc_flds }, { FLDT_BMAPBTAKEY, "bmapbtakey", fp_sarray, (char *)bmapbta_key_flds, SI(bitsz(xfs_bmbt_key_t)), 0, NULL, bmapbta_key_flds }, { FLDT_BMAPBTAPTR, "bmapbtaptr", fp_num, "%llu", @@ -94,6 +98,8 @@ const ftattr_t ftattrtab[] = { SI(bitsz(xfs_bmbt_rec_t)), 0, NULL, bmapbta_rec_flds }, { FLDT_BMAPBTD, "bmapbtd", NULL, (char *)bmapbtd_flds, btblock_size, FTARG_SIZE, NULL, bmapbtd_flds }, + { FLDT_BMAPBTD_CRC, "bmapbtd", NULL, (char *)bmapbtd_crc_flds, + btblock_size, FTARG_SIZE, NULL, bmapbtd_crc_flds }, { FLDT_BMAPBTDKEY, "bmapbtdkey", fp_sarray, (char *)bmapbtd_key_flds, SI(bitsz(xfs_bmbt_key_t)), 0, NULL, bmapbtd_key_flds }, { FLDT_BMAPBTDPTR, "bmapbtdptr", fp_num, "%llu", @@ -114,6 +120,8 @@ const ftattr_t ftattrtab[] = { SI(bitsz(xfs_bmdr_ptr_t)), 0, fa_dfsbno, NULL }, { FLDT_BNOBT, "bnobt", NULL, (char *)bnobt_flds, btblock_size, FTARG_SIZE, NULL, bnobt_flds }, + { FLDT_BNOBT_CRC, "bnobt", NULL, (char *)bnobt_crc_flds, btblock_size, + FTARG_SIZE, NULL, bnobt_crc_flds }, { FLDT_BNOBTKEY, "bnobtkey", fp_sarray, (char *)bnobt_key_flds, SI(bitsz(xfs_alloc_key_t)), 0, NULL, bnobt_key_flds }, { FLDT_BNOBTPTR, "bnobtptr", fp_num, "%u", SI(bitsz(xfs_alloc_ptr_t)), @@ -135,6 +143,8 @@ const ftattr_t ftattrtab[] = { { FLDT_CHARS, "chars", fp_num, "%c", SI(bitsz(char)), 0, NULL, NULL }, { FLDT_CNTBT, "cntbt", NULL, (char *)cntbt_flds, btblock_size, FTARG_SIZE, NULL, cntbt_flds }, + { FLDT_CNTBT_CRC, "cntbt", NULL, (char *)cntbt_crc_flds, btblock_size, + FTARG_SIZE, NULL, cntbt_crc_flds }, { FLDT_CNTBTKEY, "cntbtkey", fp_sarray, (char *)cntbt_key_flds, SI(bitsz(xfs_alloc_key_t)), 0, NULL, cntbt_key_flds }, { FLDT_CNTBTPTR, "cntbtptr", fp_num, "%u", SI(bitsz(xfs_alloc_ptr_t)), @@ -156,6 +166,8 @@ const ftattr_t ftattrtab[] = { SI(bitsz(__int8_t)), 0, NULL, NULL }, { FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size, FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_u_flds }, + { FLDT_DINODE_V3, "dinode_v3", NULL, (char *)inode_v3_flds, + SI(bitsz(xfs_dinode_t)), 0, NULL, inode_v3_flds }, { FLDT_DIR, "dir", NULL, (char *)dir_flds, dir_size, FTARG_SIZE, NULL, dir_flds }, { FLDT_DIR2, "dir2", NULL, (char *)dir2_flds, dir2_size, FTARG_SIZE, @@ -246,6 +258,8 @@ const ftattr_t ftattrtab[] = { fa_ino, NULL }, { FLDT_INOBT, "inobt", NULL, (char *)inobt_flds, btblock_size, FTARG_SIZE, NULL, inobt_flds }, + { FLDT_INOBT_CRC, "inobt", NULL, (char *)inobt_crc_flds, btblock_size, + FTARG_SIZE, NULL, inobt_crc_flds }, { FLDT_INOBTKEY, "inobtkey", fp_sarray, (char *)inobt_key_flds, SI(bitsz(xfs_inobt_key_t)), 0, NULL, inobt_key_flds }, { FLDT_INOBTPTR, "inobtptr", fp_num, "%u", SI(bitsz(xfs_inobt_ptr_t)), @@ -254,6 +268,8 @@ const ftattr_t ftattrtab[] = { SI(bitsz(xfs_inobt_rec_t)), 0, NULL, inobt_rec_flds }, { FLDT_INODE, "inode", NULL, (char *)inode_flds, inode_size, FTARG_SIZE, NULL, inode_flds }, + { FLDT_INODE_CRC, "inode", NULL, (char *)inode_crc_flds, inode_size, + FTARG_SIZE, NULL, inode_crc_flds }, { FLDT_INOFREE, "inofree", fp_num, "%#llx", SI(bitsz(xfs_inofree_t)), 0, NULL, NULL }, { FLDT_INT16D, "int16d", fp_num, "%d", SI(bitsz(__int16_t)), diff --git a/db/field.h b/db/field.h index 6962d69..f503c42 100644 --- a/db/field.h +++ b/db/field.h @@ -22,6 +22,7 @@ typedef enum fldt { FLDT_AGBLOCKNZ, FLDT_AGF, FLDT_AGFL, + FLDT_AGFL_CRC, FLDT_AGI, FLDT_AGINO, FLDT_AGINONN, @@ -39,10 +40,12 @@ typedef enum fldt { FLDT_ATTRBLOCK, FLDT_ATTRSHORT, FLDT_BMAPBTA, + FLDT_BMAPBTA_CRC, FLDT_BMAPBTAKEY, FLDT_BMAPBTAPTR, FLDT_BMAPBTAREC, FLDT_BMAPBTD, + FLDT_BMAPBTD_CRC, FLDT_BMAPBTDKEY, FLDT_BMAPBTDPTR, FLDT_BMAPBTDREC, @@ -53,6 +56,7 @@ typedef enum fldt { FLDT_BMROOTDKEY, FLDT_BMROOTDPTR, FLDT_BNOBT, + FLDT_BNOBT_CRC, FLDT_BNOBTKEY, FLDT_BNOBTPTR, FLDT_BNOBTREC, @@ -64,6 +68,7 @@ typedef enum fldt { FLDT_CHARNS, FLDT_CHARS, FLDT_CNTBT, + FLDT_CNTBT_CRC, FLDT_CNTBTKEY, FLDT_CNTBTPTR, FLDT_CNTBTREC, @@ -75,6 +80,7 @@ typedef enum fldt { FLDT_DINODE_CORE, FLDT_DINODE_FMT, FLDT_DINODE_U, + FLDT_DINODE_V3, FLDT_DIR, FLDT_DIR2, FLDT_DIR2_BLOCK_TAIL, @@ -116,10 +122,12 @@ typedef enum fldt { FLDT_FSIZE, FLDT_INO, FLDT_INOBT, + FLDT_INOBT_CRC, FLDT_INOBTKEY, FLDT_INOBTPTR, FLDT_INOBTREC, FLDT_INODE, + FLDT_INODE_CRC, FLDT_INOFREE, FLDT_INT16D, FLDT_INT32D, diff --git a/db/freesp.c b/db/freesp.c index c4dabad..a39bfce 100644 --- a/db/freesp.c +++ b/db/freesp.c @@ -231,6 +231,7 @@ scan_freelist( xfs_agfl_t *agfl; xfs_agblock_t bno; int i; + __be32 *agfl_bno; if (be32_to_cpu(agf->agf_flcount) == 0) return; @@ -238,9 +239,11 @@ scan_freelist( set_cur(&typtab[TYP_AGFL], XFS_AG_DADDR(mp, seqno, XFS_AGFL_DADDR(mp)), XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL); agfl = iocur_top->data; + agfl_bno = xfs_sb_version_hascrc(&mp->m_sb) ? &agfl->agfl_bno[0] + : iocur_top->data; i = be32_to_cpu(agf->agf_flfirst); for (;;) { - bno = be32_to_cpu(agfl->agfl_bno[i]); + bno = be32_to_cpu(agfl_bno[i]); addtohist(seqno, bno, 1); if (i == be32_to_cpu(agf->agf_fllast)) break; @@ -286,7 +289,8 @@ scanfunc_bno( xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; - if (be32_to_cpu(block->bb_magic) != XFS_ABTB_MAGIC) + if (!(be32_to_cpu(block->bb_magic) == XFS_ABTB_MAGIC || + be32_to_cpu(block->bb_magic) == XFS_ABTB_CRC_MAGIC)) return; if (level == 0) { @@ -313,7 +317,8 @@ scanfunc_cnt( xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; - if (be32_to_cpu(block->bb_magic) != XFS_ABTC_MAGIC) + if (!(be32_to_cpu(block->bb_magic) == XFS_ABTC_MAGIC || + be32_to_cpu(block->bb_magic) == XFS_ABTC_CRC_MAGIC)) return; if (level == 0) { diff --git a/db/init.c b/db/init.c index 2a31cb8..141b484 100644 --- a/db/init.c +++ b/db/init.c @@ -26,6 +26,7 @@ #include "sig.h" #include "output.h" #include "malloc.h" +#include "type.h" static char **cmdline; static int ncmdline; @@ -145,6 +146,9 @@ init( } blkbb = 1 << mp->m_blkbb_log; + if (xfs_sb_version_hascrc(&mp->m_sb)) + type_set_tab_crc(); + push_cur(); init_commands(); init_sig(); diff --git a/db/inode.c b/db/inode.c index 036717f..6596e4f 100644 --- a/db/inode.c +++ b/db/inode.c @@ -58,6 +58,10 @@ const field_t inode_hfld[] = { { "", FLDT_INODE, OI(0), C1, 0, TYP_NONE }, { NULL } }; +const field_t inode_crc_hfld[] = { + { "", FLDT_INODE_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; /* XXX: fix this up! */ #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) @@ -70,6 +74,17 @@ const field_t inode_flds[] = { FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } }; +const field_t inode_crc_flds[] = { + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, + TYP_INODE }, + { "v3", FLDT_DINODE_V3, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, + { "a", FLDT_DINODE_A, inode_a_offset, inode_a_count, + FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { NULL } +}; + #define COFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_core_flds[] = { @@ -152,6 +167,18 @@ const field_t inode_core_flds[] = { { NULL } }; +const field_t inode_v3_flds[] = { + { "crc", FLDT_UINT32X, OI(COFF(crc)), C1, 0, TYP_NONE }, + { "change_count", FLDT_UINT64D, OI(COFF(changecount)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(COFF(lsn)), C1, 0, TYP_NONE }, + { "flags2", FLDT_UINT64X, OI(COFF(flags2)), C1, 0, TYP_NONE }, + { "crtime", FLDT_TIMESTAMP, OI(COFF(crtime)), C1, 0, TYP_NONE }, + { "inumber", FLDT_INO, OI(COFF(ino)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(COFF(uuid)), C1, 0, TYP_NONE }, + { NULL } +}; + + #define TOFF(f) bitize(offsetof(xfs_timestamp_t, t_ ## f)) const field_t timestamp_flds[] = { { "sec", FLDT_TIME, OI(TOFF(sec)), C1, 0, TYP_NONE }, diff --git a/db/inode.h b/db/inode.h index 6c1ac5c..1624f1d 100644 --- a/db/inode.h +++ b/db/inode.h @@ -18,8 +18,11 @@ extern const struct field inode_a_flds[]; extern const struct field inode_core_flds[]; +extern const struct field inode_v3_flds[]; extern const struct field inode_flds[]; +extern const struct field inode_crc_flds[]; extern const struct field inode_hfld[]; +extern const struct field inode_crc_hfld[]; extern const struct field inode_u_flds[]; extern const struct field timestamp_flds[]; diff --git a/db/sb.c b/db/sb.c index af86722..2cb8fa6 100644 --- a/db/sb.c +++ b/db/sb.c @@ -109,6 +109,14 @@ const field_t sb_flds[] = { { "logsunit", FLDT_UINT32D, OI(OFF(logsunit)), C1, 0, TYP_NONE }, { "features2", FLDT_UINT32X, OI(OFF(features2)), C1, 0, TYP_NONE }, { "bad_features2", FLDT_UINT32X, OI(OFF(bad_features2)), C1, 0, TYP_NONE }, + + { "features_compat", FLDT_UINT32X, OI(OFF(features_compat)), C1, 0, TYP_NONE }, + { "features_ro_compat", FLDT_UINT32X, OI(OFF(features_ro_compat)), C1, 0, TYP_NONE }, + { "features_incompat", FLDT_UINT32X, OI(OFF(features_incompat)), C1, 0, TYP_NONE }, + + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { NULL } }; @@ -595,6 +603,8 @@ version_string( strcpy(s, "V3"); else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) strcpy(s, "V4"); + else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + strcpy(s, "V5"); if (xfs_sb_version_hasattr(sbp)) strcat(s, ",ATTR"); @@ -626,6 +636,8 @@ version_string( strcat(s, ",LAZYSBCOUNT"); if (xfs_sb_version_hasprojid32bit(sbp)) strcat(s, ",PROJID32BIT"); + if (xfs_sb_version_hascrc(sbp)) + strcat(s, ",CRC"); return s; } @@ -666,6 +678,10 @@ version_f( version = mp->m_sb.sb_versionnum | XFS_SB_VERSION_EXTFLGBIT; break; + case XFS_SB_VERSION_5: + dbprintf( + _("unwritten extents always enabled for v5 superblocks.\n")); + break; } } else if (!strcasecmp(argv[1], "log2")) { switch (XFS_SB_VERSION_NUM(&mp->m_sb)) { @@ -686,8 +702,18 @@ version_f( version = mp->m_sb.sb_versionnum | XFS_SB_VERSION_LOGV2BIT; break; + case XFS_SB_VERSION_5: + dbprintf( + _("Version 2 logs always enabled for v5 superblocks.\n")); + break; } + } else if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5) { + dbprintf( + _("%s: Cannot change %s on v5 superblocks.\n"), + progname, argv[1]); + return 0; } else if (!strcasecmp(argv[1], "attr1")) { + if (xfs_sb_version_hasattr2(&mp->m_sb)) { if (!(mp->m_sb.sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT)) diff --git a/db/type.c b/db/type.c index e5fd9eb..ad67543 100644 --- a/db/type.c +++ b/db/type.c @@ -50,7 +50,7 @@ static const cmdinfo_t type_cmd = { "type", NULL, type_f, 0, 1, 1, N_("[newtype]"), N_("set/show current data type"), NULL }; -const typ_t typtab[] = { +static const typ_t __typtab[] = { { TYP_AGF, "agf", handle_struct, agf_hfld }, { TYP_AGFL, "agfl", handle_struct, agfl_hfld }, { TYP_AGI, "agi", handle_struct, agi_hfld }, @@ -75,6 +75,39 @@ const typ_t typtab[] = { { TYP_NONE, NULL } }; +static const typ_t __typtab_crc[] = { + { TYP_AGF, "agf", handle_struct, agf_hfld }, + { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld }, + { TYP_AGI, "agi", handle_struct, agi_hfld }, + { TYP_ATTR, "attr", handle_struct, attr_hfld }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld }, + { TYP_DATA, "data", handle_block, NULL }, + { TYP_DIR, "dir", handle_struct, dir_hfld }, + { TYP_DIR2, "dir2", handle_struct, dir2_hfld }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, + { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld }, + { TYP_INODATA, "inodata", NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_crc_hfld }, + { TYP_LOG, "log", NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld }, + { TYP_SYMLINK, "symlink", handle_string, NULL }, + { TYP_TEXT, "text", handle_text, NULL }, + { TYP_NONE, NULL } +}; + +const typ_t *typtab = __typtab; + +void +type_set_tab_crc(void) +{ + typtab = __typtab_crc; +} + static const typ_t * findtyp( char *name) diff --git a/db/type.h b/db/type.h index 8dd7925..ae92581 100644 --- a/db/type.h +++ b/db/type.h @@ -43,9 +43,10 @@ typedef struct typ pfunc_t pfunc; const struct field *fields; } typ_t; -extern const typ_t typtab[], *cur_typ; +extern const typ_t *typtab, *cur_typ; extern void type_init(void); +extern void type_set_tab_crc(void); extern void handle_block(int action, const struct field *fields, int argc, char **argv); extern void handle_string(int action, const struct field *fields, int argc, diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 9a4363f..00a29b7 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -169,9 +169,9 @@ typedef struct xfs_icdinode { /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; -static inline uint xfs_icdinode_size(struct xfs_icdinode *dicp) +static inline uint xfs_icdinode_size(int version) { - if (dicp->di_version == 3) + if (version == 3) return sizeof(struct xfs_icdinode); return offsetof(struct xfs_icdinode, di_next_unlinked); } diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 26a8efb..90f3436 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -650,7 +650,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) mode = dino.di_mode & S_IFMT; size = (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr += xfs_icdinode_size(&dino); + *ptr += xfs_icdinode_size(dino.di_version); if (*i == num_ops-1 && f->ilf_size == 3) { return 1; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 5b2d942..26027e3 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -276,8 +276,8 @@ xlog_recover_print_inode( f->ilf_dsize); /* core inode comes 2nd */ - ASSERT(item->ri_buf[1].i_len == xfs_icdinode_size((xfs_icdinode_t *) - item->ri_buf[1].i_addr)); + ASSERT(item->ri_buf[1].i_len == xfs_icdinode_size(1) || + item->ri_buf[1].i_len == xfs_icdinode_size(3)); xlog_recover_print_inode_core((xfs_icdinode_t *) item->ri_buf[1].i_addr); diff --git a/repair/phase6.c b/repair/phase6.c index b9e0cc3..0ef96cc 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -448,8 +448,7 @@ mk_rbmino(xfs_mount_t *mp) } vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version = vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; @@ -698,8 +697,7 @@ mk_rsumino(xfs_mount_t *mp) } vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version = vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; @@ -815,8 +813,7 @@ mk_root_dir(xfs_mount_t *mp) * take care of the core -- initialization from xfs_ialloc() */ vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version = vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = (__uint16_t) mode|S_IFDIR; -- 1.7.10 From dave@fromorbit.com Mon Jan 21 07:53:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2CFE87F7B for ; Mon, 21 Jan 2013 07:53:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0BD53304032 for ; Mon, 21 Jan 2013 05:53:55 -0800 (PST) X-ASG-Debug-ID: 1358776429-04cbb00c6443870001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cbaa23j13l6YN4Gn for ; Mon, 21 Jan 2013 05:53:50 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAP9G/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFGgEMLzMIGDE5AxsZiBisKY5xkTkDklmTfIMJ Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:23:44 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoc-0001P0-3X for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:34 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oZ-Vu for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/12] xfsprogs: introduce CRC support into mkfs.xfs Date: Tue, 22 Jan 2013 00:53:09 +1100 X-ASG-Orig-Subj: [PATCH 10/12] xfsprogs: introduce CRC support into mkfs.xfs Message-Id: <1358776391-22140-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358776429 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.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580D X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580D Custom Rule 7580D From: Dave Chinner Signed-off-by: Dave Chinner --- copy/xfs_copy.c | 5 +- db/sb.c | 6 +- include/libxfs.h | 85 ++++++++++++++---------- include/libxlog.h | 2 +- include/xfs_sb.h | 2 - libxfs/init.c | 20 +++--- libxfs/logitem.c | 4 +- libxfs/rdwr.c | 125 +++++++++++++++++++++------------- libxfs/trans.c | 8 +-- libxfs/xfs.h | 17 +++-- libxfs/xfs_alloc.c | 10 +-- libxfs/xfs_alloc_btree.c | 6 +- libxfs/xfs_attr.c | 2 +- libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap_btree.c | 6 +- libxfs/xfs_btree.c | 8 +-- libxfs/xfs_da_btree.c | 4 +- libxfs/xfs_dir2_block.c | 2 +- libxfs/xfs_dir2_data.c | 6 +- libxfs/xfs_dir2_leaf.c | 2 +- libxfs/xfs_dir2_node.c | 2 +- libxfs/xfs_ialloc.c | 6 +- libxfs/xfs_ialloc_btree.c | 6 +- libxfs/xfs_inode.c | 4 +- libxfs/xfs_mount.c | 18 +++-- libxfs/xfs_symlink.c | 8 +-- logprint/logprint.c | 3 +- mkfs/maxtrres.c | 4 +- mkfs/proto.c | 4 +- mkfs/xfs_mkfs.c | 162 +++++++++++++++++++++++++++++++++++---------- mkfs/xfs_mkfs.h | 12 ++-- repair/attr_repair.c | 6 +- repair/dino_chunks.c | 8 ++- repair/dinode.c | 10 +-- repair/dir.c | 8 +-- repair/dir2.c | 2 +- repair/phase2.c | 5 +- repair/phase3.c | 2 +- repair/phase6.c | 8 +-- repair/prefetch.c | 4 +- repair/rt.c | 4 +- repair/scan.c | 12 ++-- repair/xfs_repair.c | 7 +- 43 files changed, 393 insertions(+), 234 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index c01e0b9..7dc7d9a 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -674,8 +674,11 @@ main(int argc, char **argv) /* prepare the mount structure */ - sbp = libxfs_readbuf(xargs.ddev, XFS_SB_DADDR, 1, 0); memset(&mbuf, 0, sizeof(xfs_mount_t)); + mbuf.m_ddev_targ.dev = xargs.ddev; + mbuf.m_ddev_targ.bt_mount = &mbuf; + sbp = libxfs_readbuf(mbuf.m_ddev_targ, XFS_SB_DADDR, 1, 0, + &xfs_sb_buf_ops); sb = &mbuf.m_sb; libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); diff --git a/db/sb.c b/db/sb.c index d83db9c..f99210c 100644 --- a/db/sb.c +++ b/db/sb.c @@ -235,7 +235,8 @@ sb_logcheck(void) x.logdev = x.ddev; x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); - log.l_dev = (mp->m_sb.sb_logstart == 0) ? x.logdev : x.ddev; + log.l_dev.dev = (mp->m_sb.sb_logstart == 0) ? x.logdev : x.ddev; + log.l_dev.bt_mount = mp; log.l_logsize = BBTOB(log.l_logBBsize); log.l_logBBsize = x.logBBsize; log.l_logBBstart = x.logBBstart; @@ -266,8 +267,7 @@ sb_logzero(uuid_t *uuidp) dbprintf(_("Clearing log and setting UUID\n")); - if (libxfs_log_clear( - (mp->m_sb.sb_logstart == 0) ? x.logdev : x.ddev, + if (libxfs_log_clear(mp->m_logdev_targ, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), uuidp, diff --git a/include/libxfs.h b/include/libxfs.h index 29767ef..f64e489 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -116,6 +116,16 @@ typedef struct { #define LIBXFS_EXCLUSIVELY 0x0010 /* disallow other accesses (O_EXCL) */ #define LIBXFS_DIRECT 0x0020 /* can use direct I/O, not buffered */ +/* + * IO verifier callbacks need the xfs_mount pointer, so we have to behave + * somewhat like the kernel now for userspace IO in terms of having buftarg + * based devices... + */ +struct xfs_buftarg { + struct xfs_mount *bt_mount; + dev_t dev; +}; + extern char *progname; extern int libxfs_init (libxfs_init_t *); extern void libxfs_destroy (void); @@ -130,11 +140,12 @@ extern void platform_findsizes(char *path, int fd, long long *sz, int *bsz); /* check or write log footer: specify device, log size in blocks & uuid */ typedef xfs_caddr_t (libxfs_get_block_t)(xfs_caddr_t, int, void *); -extern int libxfs_log_clear (dev_t, xfs_daddr_t, uint, uuid_t *, +extern int libxfs_log_clear (struct xfs_buftarg, xfs_daddr_t, uint, uuid_t *, int, int, int); extern int libxfs_log_header (xfs_caddr_t, uuid_t *, int, int, int, libxfs_get_block_t *, void *); + /* * Define a user-level mount structure with all we need * in order to make use of the numerous XFS_* macros. @@ -151,9 +162,12 @@ typedef struct xfs_mount { struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ struct xfs_inode *m_rsumip; /* pointer to summary inode */ struct xfs_inode *m_rootip; /* pointer to root directory */ - dev_t m_dev; - dev_t m_logdev; - dev_t m_rtdev; + struct xfs_buftarg m_ddev_targ; + struct xfs_buftarg m_logdev_targ; + struct xfs_buftarg m_rtdev_targ; +#define m_dev m_ddev_targ +#define m_logdev m_logdev_targ +#define m_rtdev m_rtdev_targ __uint8_t m_dircook_elog; /* log d-cookie entry bits */ __uint8_t m_blkbit_log; /* blocklog + NBBY */ __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ @@ -218,11 +232,6 @@ extern void libxfs_rtmount_destroy (xfs_mount_t *); /* * Simple I/O interface */ -typedef struct xfs_buftarg { - struct xfs_mount *bt_mount; - dev_t dev; -} xfs_buftarg_t; - #define XB_PAGES 2 struct xfs_buf_map { @@ -244,7 +253,8 @@ typedef struct xfs_buf { xfs_daddr_t b_bn; unsigned b_bcount; unsigned int b_length; - dev_t b_dev; + struct xfs_buftarg b_target; +#define b_dev b_target.dev pthread_mutex_t b_lock; pthread_t b_holder; unsigned int b_recur; @@ -254,7 +264,6 @@ typedef struct xfs_buf { void *b_addr; int b_error; const struct xfs_buf_ops *b_ops; - struct xfs_buftarg *b_target; struct xfs_perag *b_pag; struct xfs_buf_map *b_map; int b_nmaps; @@ -315,12 +324,12 @@ extern struct cache_operations libxfs_bcache_operations; #ifdef XFS_BUF_TRACING -#define libxfs_readbuf(dev, daddr, len, flags) \ +#define libxfs_readbuf(dev, daddr, len, flags, ops) \ libxfs_trace_readbuf(__FUNCTION__, __FILE__, __LINE__, \ - (dev), (daddr), (len), (flags)) -#define libxfs_readbuf_map(dev, map, nmaps, flags) \ + (dev), (daddr), (len), (flags), (ops)) +#define libxfs_readbuf_map(dev, map, nmaps, flags, ops) \ libxfs_trace_readbuf_map(__FUNCTION__, __FILE__, __LINE__, \ - (dev), (map), (nmaps), (flags)) + (dev), (map), (nmaps), (flags), (ops)) #define libxfs_writebuf(buf, flags) \ libxfs_trace_writebuf(__FUNCTION__, __FILE__, __LINE__, \ (buf), (flags)) @@ -337,28 +346,34 @@ extern struct cache_operations libxfs_bcache_operations; libxfs_trace_putbuf(__FUNCTION__, __FILE__, __LINE__, (buf)) extern xfs_buf_t *libxfs_trace_readbuf(const char *, const char *, int, - dev_t, xfs_daddr_t, int, int); + struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_ops *); extern xfs_buf_t *libxfs_trace_readbuf_map(const char *, const char *, int, - dev_t, struct xfs_buf_map *, int, int); + struct xfs_buftarg, struct xfs_buf_map *, int, int, + const struct xfs_buf_ops *); extern int libxfs_trace_writebuf(const char *, const char *, int, xfs_buf_t *, int); extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, - dev_t, xfs_daddr_t, int); + struct xfs_buftarg, xfs_daddr_t, int); extern xfs_buf_t *libxfs_trace_getbuf_map(const char *, const char *, int, - dev_t, struct xfs_buf_map *, int); + struct xfs_buftarg, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_trace_getbuf_flags(const char *, const char *, int, - dev_t, xfs_daddr_t, int, unsigned int); + struct xfs_buftarg, xfs_daddr_t, int, unsigned int); extern void libxfs_trace_putbuf (const char *, const char *, int, xfs_buf_t *); #else -extern xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); -extern xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); +extern xfs_buf_t *libxfs_readbuf(struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_ops *); +extern xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg, struct xfs_buf_map *, + int, int, const struct xfs_buf_ops *); extern int libxfs_writebuf(xfs_buf_t *, int); -extern xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); -extern xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); -extern xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); +extern xfs_buf_t *libxfs_getbuf(struct xfs_buftarg, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg, + struct xfs_buf_map *, int); +extern xfs_buf_t *libxfs_getbuf_flags(struct xfs_buftarg, xfs_daddr_t, + int, unsigned int); extern void libxfs_putbuf (xfs_buf_t *); #endif @@ -371,11 +386,11 @@ extern int libxfs_bcache_overflowed(void); extern int libxfs_bcache_usage(void); /* Buffer (Raw) Interfaces */ -extern xfs_buf_t *libxfs_getbufr(dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbufr(struct xfs_buftarg, xfs_daddr_t, int); extern void libxfs_putbufr(xfs_buf_t *); extern int libxfs_writebuf_int(xfs_buf_t *, int); -extern int libxfs_readbufr(dev_t, xfs_daddr_t, xfs_buf_t *, int, int); +extern int libxfs_readbufr(struct xfs_buftarg, xfs_daddr_t, xfs_buf_t *, int, int); extern int libxfs_bhash_size; extern int libxfs_ihash_size; @@ -461,14 +476,15 @@ extern int libxfs_trans_read_buf (xfs_mount_t *, xfs_trans_t *, dev_t, xfs_daddr_t, int, uint, struct xfs_buf **); */ -struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, dev_t dev, - struct xfs_buf_map *map, int nmaps, - uint flags); +struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, + struct xfs_buftarg dev, + struct xfs_buf_map *map, int nmaps, + uint flags); static inline struct xfs_buf * libxfs_trans_get_buf( struct xfs_trans *tp, - dev_t dev, + struct xfs_buftarg dev, xfs_daddr_t blkno, int numblks, uint flags) @@ -478,7 +494,8 @@ libxfs_trans_get_buf( } int libxfs_trans_read_buf_map(struct xfs_mount *mp, - struct xfs_trans *tp, dev_t dev, + struct xfs_trans *tp, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint flags, struct xfs_buf **bpp, const struct xfs_buf_ops *ops); @@ -487,7 +504,7 @@ static inline int libxfs_trans_read_buf( struct xfs_mount *mp, struct xfs_trans *tp, - dev_t dev, + struct xfs_buftarg dev, xfs_daddr_t blkno, int numblks, uint flags, @@ -507,7 +524,7 @@ typedef struct xfs_inode { xfs_mount_t *i_mount; /* fs mount struct ptr */ xfs_ino_t i_ino; /* inode number (agno/agino) */ struct xfs_imap i_imap; /* location for xfs_imap() */ - dev_t i_dev; /* dev for this inode */ + struct xfs_buftarg i_dev; /* dev for this inode */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ xfs_trans_t *i_transp; /* ptr to owning transaction */ diff --git a/include/libxlog.h b/include/libxlog.h index 36ede59..37cbc68 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -28,7 +28,7 @@ struct xlog { xfs_lsn_t l_tail_lsn; /* lsn of 1st LR w/ unflush buffers */ xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ xfs_mount_t *l_mp; /* mount point */ - dev_t l_dev; /* dev_t of log */ + struct xfs_buftarg l_dev; /* dev_t of log */ xfs_daddr_t l_logBBstart; /* start block of log */ int l_logsize; /* size of log in bytes */ int l_logBBsize; /* size of log in 512 byte chunks */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 1f8c1cd..d6709db 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -358,10 +358,8 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) return 1; } -#ifdef REMOVE_TO_ENABLE_CRC_SUPPORT if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) return 1; -#endif return 0; } diff --git a/libxfs/init.c b/libxfs/init.c index 1b11fb0..55a17d2 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -457,7 +457,7 @@ rtmount_init( sbp = &mp->m_sb; if (sbp->sb_rblocks == 0) return 0; - if (mp->m_rtdev == 0 && !(flags & LIBXFS_MOUNT_DEBUGGER)) { + if (mp->m_rtdev.dev == 0 && !(flags & LIBXFS_MOUNT_DEBUGGER)) { fprintf(stderr, _("%s: filesystem has a realtime subvolume\n"), progname); return -1; @@ -486,7 +486,7 @@ rtmount_init( return -1; } bp = libxfs_readbuf(mp->m_rtdev, - d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), 0); + d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), 0, NULL); if (bp == NULL) { fprintf(stderr, _("%s: realtime size check failed\n"), progname); @@ -634,9 +634,13 @@ libxfs_mount( xfs_sb_t *sbp; int error; - mp->m_dev = dev; - mp->m_rtdev = rtdev; - mp->m_logdev = logdev; + mp->m_ddev_targ.dev = dev; + mp->m_ddev_targ.bt_mount = mp; + mp->m_logdev_targ.dev = logdev; + mp->m_logdev_targ.bt_mount = mp; + mp->m_rtdev_targ.dev = rtdev; + mp->m_rtdev_targ.bt_mount = mp; + mp->m_flags = (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); mp->m_sb = *sb; INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); @@ -720,7 +724,7 @@ libxfs_mount( bp = libxfs_readbuf(mp->m_dev, d - XFS_FSS_TO_BB(mp, 1), XFS_FSS_TO_BB(mp, 1), - !(flags & LIBXFS_MOUNT_DEBUGGER)); + !(flags & LIBXFS_MOUNT_DEBUGGER), NULL); if (!bp) { fprintf(stderr, _("%s: data size check failed\n"), progname); if (!(flags & LIBXFS_MOUNT_DEBUGGER)) @@ -728,13 +732,13 @@ libxfs_mount( } else libxfs_putbuf(bp); - if (mp->m_logdev && mp->m_logdev != mp->m_dev) { + if (mp->m_logdev.dev && mp->m_logdev.dev != mp->m_dev.dev) { d = (xfs_daddr_t) XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); if ( (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) || (!(bp = libxfs_readbuf(mp->m_logdev, d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), - !(flags & LIBXFS_MOUNT_DEBUGGER)))) ) { + !(flags & LIBXFS_MOUNT_DEBUGGER), NULL))) ) { fprintf(stderr, _("%s: log size checks failed\n"), progname); if (!(flags & LIBXFS_MOUNT_DEBUGGER)) diff --git a/libxfs/logitem.c b/libxfs/logitem.c index 84e4c14..f298aa0 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -32,7 +32,7 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ xfs_buf_t * xfs_trans_buf_item_match( xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps) { @@ -47,7 +47,7 @@ xfs_trans_buf_item_match( list_for_each_entry(lidp, &tp->t_items, lid_trans) { blip = (struct xfs_buf_log_item *)lidp->lid_item; if (blip->bli_item.li_type == XFS_LI_BUF && - blip->bli_buf->b_dev == dev && + blip->bli_buf->b_target.dev == dev.dev && XFS_BUF_ADDR(blip->bli_buf) == map[0].bm_bn && blip->bli_buf->b_bcount == BBTOB(len)) { ASSERT(blip->bli_buf->b_map_count == nmaps); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index f2a6647..0629d50 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -102,7 +102,7 @@ static xfs_caddr_t next(xfs_caddr_t ptr, int offset, void *private) int libxfs_log_clear( - dev_t device, + struct xfs_buftarg device, xfs_daddr_t start, uint length, uuid_t *fs_uuid, @@ -113,11 +113,11 @@ libxfs_log_clear( xfs_buf_t *bp; int len; - if (!device || !fs_uuid) + if (!device.dev || !fs_uuid) return -EINVAL; /* first zero the log */ - libxfs_device_zero(device, start, length); + libxfs_device_zero(device.dev, start, length); /* then write a log record header */ len = ((version == 2) && sunit) ? BTOBB(sunit) : 2; @@ -200,12 +200,15 @@ libxfs_log_header( #undef libxfs_getbuf_flags #undef libxfs_putbuf -xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); -xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); +xfs_buf_t *libxfs_readbuf(struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_map *); +xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg, struct xfs_buf_map *, + int, int, const struct xfs_buf_map *); int libxfs_writebuf(xfs_buf_t *, int); -xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); -xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); -xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); +xfs_buf_t *libxfs_getbuf(struct xfs_buftarg, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg, struct xfs_buf_map *, int); +xfs_buf_t *libxfs_getbuf_flags(struct xfs_buftarg, xfs_daddr_t, int, + unsigned int); void libxfs_putbuf (xfs_buf_t *); #define __add_trace(bp, func, file, line) \ @@ -219,18 +222,20 @@ do { \ xfs_buf_t * libxfs_trace_readbuf(const char *func, const char *file, int line, - dev_t dev, xfs_daddr_t blkno, int len, int flags) + struct xfs_buftarg dev, xfs_daddr_t blkno, int len, int flags, + const struct xfs_buf_ops *ops) { - xfs_buf_t *bp = libxfs_readbuf(dev, blkno, len, flags); + xfs_buf_t *bp = libxfs_readbuf(dev, blkno, len, flags, ops); __add_trace(bp, func, file, line); return bp; } xfs_buf_t * libxfs_trace_readbuf_map(const char *func, const char *file, int line, - dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, int flags, + const struct xfs_buf_ops *ops) { - xfs_buf_t *bp = libxfs_readbuf_map(dev, map, nmaps, flags); + xfs_buf_t *bp = libxfs_readbuf_map(dev, map, nmaps, flags, ops); __add_trace(bp, func, file, line); return bp; } @@ -244,7 +249,7 @@ libxfs_trace_writebuf(const char *func, const char *file, int line, xfs_buf_t *b xfs_buf_t * libxfs_trace_getbuf(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len) + struct xfs_buftarg device, xfs_daddr_t blkno, int len) { xfs_buf_t *bp = libxfs_getbuf(device, blkno, len); __add_trace(bp, func, file, line); @@ -253,7 +258,7 @@ libxfs_trace_getbuf(const char *func, const char *file, int line, xfs_buf_t * libxfs_trace_getbuf_map(const char *func, const char *file, int line, - dev_t device, struct xfs_buf_map *map, int nmaps) + struct xfs_buftarg device, struct xfs_buf_map *map, int nmaps) { xfs_buf_t *bp = libxfs_getbuf_map(device, map, nmaps); __add_trace(bp, func, file, line); @@ -262,7 +267,7 @@ libxfs_trace_getbuf_map(const char *func, const char *file, int line, xfs_buf_t * libxfs_trace_getbuf_flags(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) + struct xfs_buftarg device, xfs_daddr_t blkno, int len, unsigned int flags) { xfs_buf_t *bp = libxfs_getbuf_flags(device, blkno, len, flags); __add_trace(bp, func, file, line); @@ -284,7 +289,7 @@ xfs_buf_t * libxfs_getsb(xfs_mount_t *mp, int flags) { return libxfs_readbuf(mp->m_dev, XFS_SB_DADDR, - XFS_FSS_TO_BB(mp, 1), flags); + XFS_FSS_TO_BB(mp, 1), flags, &xfs_sb_buf_ops); } kmem_zone_t *xfs_buf_zone; @@ -302,7 +307,7 @@ static struct cache_mru xfs_buf_freelist = * buffer initialisation instead of a contiguous buffer. */ struct xfs_bufkey { - dev_t device; + struct xfs_buftarg device; xfs_daddr_t blkno; unsigned int bblen; struct xfs_buf_map *map; @@ -322,7 +327,7 @@ libxfs_bcompare(struct cache_node *node, cache_key_t key) struct xfs_bufkey *bkey = (struct xfs_bufkey *)key; #ifdef IO_BCOMPARE_CHECK - if (bp->b_dev == bkey->device && + if (bp->b_target.dev == bkey->device.dev && bp->b_bn == bkey->blkno && bp->b_bcount != BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" @@ -332,7 +337,7 @@ libxfs_bcompare(struct cache_node *node, cache_key_t key) (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); #endif - return (bp->b_dev == bkey->device && + return (bp->b_target.dev == bkey->device.dev && bp->b_bn == bkey->blkno && bp->b_bcount == BBTOB(bkey->bblen)); } @@ -346,13 +351,14 @@ libxfs_bprint(xfs_buf_t *bp) } static void -__initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) +__initbuf(xfs_buf_t *bp, struct xfs_buftarg device, xfs_daddr_t bno, + unsigned int bytes) { bp->b_flags = 0; bp->b_bn = bno; bp->b_bcount = bytes; bp->b_length = BTOBB(bytes); - bp->b_dev = device; + bp->b_target = device; bp->b_error = 0; if (!bp->b_addr) bp->b_addr = memalign(libxfs_device_alignment(), bytes); @@ -372,13 +378,15 @@ __initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) } static void -libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) +libxfs_initbuf(xfs_buf_t *bp, struct xfs_buftarg device, xfs_daddr_t bno, + unsigned int bytes) { __initbuf(bp, device, bno, bytes); } static void -libxfs_initbuf_map(xfs_buf_t *bp, dev_t device, struct xfs_buf_map *map, int nmaps) +libxfs_initbuf_map(xfs_buf_t *bp, struct xfs_buftarg device, + struct xfs_buf_map *map, int nmaps) { unsigned int bytes = 0; int i; @@ -441,7 +449,7 @@ __libxfs_getbufr(int blen) } xfs_buf_t * -libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +libxfs_getbufr(struct xfs_buftarg device, xfs_daddr_t blkno, int bblen) { xfs_buf_t *bp; int blen = BBTOB(bblen); @@ -459,7 +467,7 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) } xfs_buf_t * -libxfs_getbufr_map(dev_t device, xfs_daddr_t blkno, int bblen, +libxfs_getbufr_map(struct xfs_buftarg device, xfs_daddr_t blkno, int bblen, struct xfs_buf_map *map, int nmaps) { xfs_buf_t *bp; @@ -552,9 +560,10 @@ out_put: } struct xfs_buf * -libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) +libxfs_getbuf_flags(struct xfs_buftarg device, xfs_daddr_t blkno, int len, + unsigned int flags) { - struct xfs_bufkey key = {0}; + struct xfs_bufkey key = {{0}}; key.device = device; key.blkno = blkno; @@ -564,15 +573,15 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int flags } struct xfs_buf * -libxfs_getbuf(dev_t device, xfs_daddr_t blkno, int len) +libxfs_getbuf(struct xfs_buftarg device, xfs_daddr_t blkno, int len) { return libxfs_getbuf_flags(device, blkno, len, 0); } struct xfs_buf * -libxfs_getbuf_map(dev_t device, struct xfs_buf_map *map, int nmaps) +libxfs_getbuf_map(struct xfs_buftarg device, struct xfs_buf_map *map, int nmaps) { - struct xfs_bufkey key = {0}; + struct xfs_bufkey key = {{0}}; int i; key.device = device; @@ -610,9 +619,9 @@ libxfs_putbuf(xfs_buf_t *bp) void libxfs_purgebuf(xfs_buf_t *bp) { - struct xfs_bufkey key = {0}; + struct xfs_bufkey key = {{0}}; - key.device = bp->b_dev; + key.device = bp->b_target; key.blkno = bp->b_bn; key.bblen = bp->b_bcount >> BBSHIFT; @@ -658,9 +667,10 @@ __read_buf(int fd, void *buf, int len, off64_t offset, int flags) } int -libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) +libxfs_readbufr(struct xfs_buftarg dev, xfs_daddr_t blkno, xfs_buf_t *bp, + int len, int flags) { - int fd = libxfs_device_to_fd(dev); + int fd = libxfs_device_to_fd(dev.dev); int bytes = BBTOB(len); int error; @@ -668,7 +678,7 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) error = __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flags); if (!error && - bp->b_dev == dev && + bp->b_target.dev == dev.dev && bp->b_bn == blkno && bp->b_bcount == bytes) bp->b_flags |= LIBXFS_B_UPTODATE; @@ -681,22 +691,30 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int flags) } xfs_buf_t * -libxfs_readbuf(dev_t dev, xfs_daddr_t blkno, int len, int flags) +libxfs_readbuf(struct xfs_buftarg dev, xfs_daddr_t blkno, int len, int flags, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int error; bp = libxfs_getbuf(dev, blkno, len); - if (bp && !(bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { - error = libxfs_readbufr(dev, blkno, bp, len, flags); - if (error) - bp->b_error = error; - } + if (!bp) + return NULL; + bp->b_ops = ops; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + error = libxfs_readbufr(dev, blkno, bp, len, flags); + if (error) + bp->b_error = error; + else if (bp->b_ops) + bp->b_ops->verify_read(bp); return bp; } struct xfs_buf * -libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) +libxfs_readbuf_map(struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, + int flags, const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int error = 0; @@ -705,15 +723,19 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) char *buf; if (nmaps == 1) - return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, flags); + return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, + flags, ops); bp = libxfs_getbuf_map(dev, map, nmaps); - if (!bp || (bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + if (!bp) + return NULL; + bp->b_ops = ops; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; ASSERT(bp->b_nmaps = nmaps); - fd = libxfs_device_to_fd(dev); + fd = libxfs_device_to_fd(dev.dev); buf = bp->b_addr; for (i = 0; i < bp->b_nmaps; i++) { off64_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); @@ -731,8 +753,11 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) offset += len; } - if (!error) + if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; + if (bp->b_ops) + bp->b_ops->verify_read(bp); + } #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, @@ -767,9 +792,15 @@ __write_buf(int fd, void *buf, int len, off64_t offset, int flags) int libxfs_writebufr(xfs_buf_t *bp) { - int fd = libxfs_device_to_fd(bp->b_dev); + int fd = libxfs_device_to_fd(bp->b_target.dev); int error = 0; + if (bp->b_ops) { + bp->b_ops->verify_write(bp); + if (bp->b_error) + return error; + } + if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { error = __write_buf(fd, bp->b_addr, bp->b_bcount, LIBXFS_BBTOOFF64(bp->b_bn), bp->b_flags); diff --git a/libxfs/trans.c b/libxfs/trans.c index 619aad1..f4e42ea 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -386,7 +386,7 @@ libxfs_trans_bhold( xfs_buf_t * libxfs_trans_get_buf_map( xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint f) @@ -465,7 +465,7 @@ int libxfs_trans_read_buf_map( xfs_mount_t *mp, xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint flags, @@ -479,7 +479,7 @@ libxfs_trans_read_buf_map( *bpp = NULL; if (tp == NULL) { - bp = libxfs_readbuf_map(dev, map, nmaps, flags); + bp = libxfs_readbuf_map(dev, map, nmaps, flags, ops); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -498,7 +498,7 @@ libxfs_trans_read_buf_map( goto done; } - bp = libxfs_readbuf_map(dev, map, nmaps, flags); + bp = libxfs_readbuf_map(dev, map, nmaps, flags, ops); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index e03f6c7..398e48c 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -52,9 +52,16 @@ typedef __uint32_t inst_t; /* an instruction */ #define EWRONGFS EINVAL #endif +#if 0 #define m_ddev_targp m_dev #define m_logdev_targp m_logdev #define m_rtdev_targp m_rtdev +#endif + +#define m_ddev_targp m_ddev_targ +#define m_logdev_targp m_logdev_targ +#define m_rtdev_targp m_rtdev_targ + #define xfs_error_level 0 #define STATIC static @@ -179,12 +186,8 @@ roundup_pow_of_two(uint v) #define xfs_incore(bt,blkno,len,lockit) 0 #define xfs_buf_relse(bp) libxfs_putbuf(bp) -#define xfs_read_buf(mp,devp,blkno,len,f,bpp) \ - (*(bpp) = libxfs_readbuf((devp), \ - (blkno), (len), 1), 0) -#define xfs_buf_get(devp,blkno,len,f) \ - (libxfs_getbuf((devp), (blkno), (len))) -#define xfs_bwrite(mp,bp) libxfs_writebuf((bp), 0) +#define xfs_buf_get(devp,blkno,len,f) (libxfs_getbuf((devp), (blkno), (len))) +#define xfs_bwrite(bp) libxfs_writebuf((bp), 0) #define XBRW_READ LIBXFS_BREAD #define XBRW_WRITE LIBXFS_BWRITE @@ -363,7 +366,7 @@ void xfs_buf_item_init (xfs_buf_t *, xfs_mount_t *); void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); /* xfs_trans_buf.c */ -xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, dev_t, +xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, struct xfs_buftarg, struct xfs_buf_map *, int); /* local source files */ diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index d8f3566..bc9995d 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -414,7 +414,7 @@ static bool xfs_agfl_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); int i; @@ -443,7 +443,7 @@ static void xfs_agfl_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; int agfl_ok = 1; /* @@ -470,7 +470,7 @@ static void xfs_agfl_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; /* no verification of non-crc AGFLs */ @@ -2205,7 +2205,7 @@ static void xfs_agf_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; int agf_ok = 1; if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -2225,7 +2225,7 @@ static void xfs_agf_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; if (!xfs_agf_verify(mp, bp)) { diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 949c96d..a845a15 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -258,7 +258,7 @@ static bool xfs_allocbt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag = bp->b_pag; unsigned int level; @@ -337,7 +337,7 @@ xfs_allocbt_read_verify( xfs_allocbt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } } @@ -349,7 +349,7 @@ xfs_allocbt_write_verify( if (!xfs_allocbt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 0450dca..8c6365c 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -1695,7 +1695,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) if (tmp < buflen) xfs_buf_zero(bp, tmp, buflen - tmp); - error = xfs_bwrite(mp, bp); /* GROT: NOTE: synchronous write */ + error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ xfs_buf_relse(bp); if (error) return error; diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 85cb31d..57f99eb 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -61,7 +61,7 @@ static void xfs_attr_leaf_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_attr_leaf_hdr *hdr = bp->b_addr; int block_ok = 0; diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 473db4a..761ef29 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -704,7 +704,7 @@ static bool xfs_bmbt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); unsigned int level; @@ -764,7 +764,7 @@ xfs_bmbt_read_verify( xfs_bmbt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } @@ -778,7 +778,7 @@ xfs_bmbt_write_verify( xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); return; } diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index a7c19e9..0d36584 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -214,7 +214,7 @@ xfs_btree_lblock_calc_crc( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_buf_log_item *bip = bp->b_fspriv; - if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (!xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return; if (bip) block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); @@ -226,7 +226,7 @@ bool xfs_btree_lblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_BTREE_LBLOCK_CRC_OFF); return true; @@ -247,7 +247,7 @@ xfs_btree_sblock_calc_crc( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_buf_log_item *bip = bp->b_fspriv; - if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (!xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return; if (bip) block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); @@ -259,7 +259,7 @@ bool xfs_btree_sblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_BTREE_SBLOCK_CRC_OFF); return true; diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index a31d353..738caee 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -74,7 +74,7 @@ static void xfs_da_node_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_da_node_hdr *hdr = bp->b_addr; int block_ok = 0; @@ -106,7 +106,7 @@ static void xfs_da_node_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_da_blkinfo *info = bp->b_addr; switch (be16_to_cpu(info->magic)) { diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 7397faa..2655542 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -44,7 +44,7 @@ static void xfs_dir2_block_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dir2_data_hdr *hdr = bp->b_addr; int block_ok = 0; diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index eb86739..bc3a1b5 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -47,7 +47,7 @@ __xfs_dir2_data_check( int stale; /* count of stale leaves */ struct xfs_name name; - mp = bp->b_target->bt_mount; + mp = bp->b_target.bt_mount; hdr = bp->b_addr; bf = hdr->bestfree; p = (char *)(hdr + 1); @@ -173,7 +173,7 @@ static void xfs_dir2_data_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dir2_data_hdr *hdr = bp->b_addr; int block_ok = 0; @@ -195,7 +195,7 @@ static void xfs_dir2_data_reada_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dir2_data_hdr *hdr = bp->b_addr; switch (be32_to_cpu(hdr->magic)) { diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index d303813..12e6f86 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -37,7 +37,7 @@ xfs_dir2_leaf_verify( struct xfs_buf *bp, __be16 magic) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dir2_leaf_hdr *hdr = bp->b_addr; int block_ok = 0; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 649f677..80df3af 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -44,7 +44,7 @@ static void xfs_dir2_free_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dir2_free_hdr *hdr = bp->b_addr; int block_ok = 0; diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 625e119..5e49a7d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1306,7 +1306,7 @@ static bool xfs_agi_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); if (xfs_sb_version_hascrc(&mp->m_sb) && @@ -1337,7 +1337,7 @@ static void xfs_agi_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; int agi_ok = 1; if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -1356,7 +1356,7 @@ static void xfs_agi_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; if (!xfs_agi_verify(bp)) { diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index ee036bf..d7c865f 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -167,7 +167,7 @@ static int xfs_inobt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag = bp->b_pag; unsigned int level; @@ -222,7 +222,7 @@ xfs_inobt_read_verify( xfs_inobt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } } @@ -234,7 +234,7 @@ xfs_inobt_write_verify( if (!xfs_inobt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index b700599..24265cf 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -92,7 +92,7 @@ static void xfs_inode_buf_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; int i; int ni; @@ -237,7 +237,7 @@ xfs_iformat( } if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && - !ip->i_mount->m_rtdev)) { + !ip->i_mount->m_rtdev.dev)) { xfs_warn(ip->i_mount, "corrupt dinode %Lu, has realtime flag set.", ip->i_ino); diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index ed8c770..6ff2773 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -113,6 +113,9 @@ xfs_perag_put(struct xfs_perag *pag) /* * Check the validity of the SB found. + * + * We don't check the in-progress flag here because it is set by userspace + * utilities to indicate operations are in progress.... */ STATIC int xfs_mount_validate_sb( @@ -139,7 +142,7 @@ xfs_mount_validate_sb( } if (unlikely( - sbp->sb_logstart == 0 && mp->m_logdev == mp->m_dev)) { + sbp->sb_logstart == 0 && mp->m_logdev.dev == mp->m_dev.dev)) { xfs_warn(mp, "filesystem is marked as having an external log; " "specify logdev on the mount command line."); @@ -147,7 +150,7 @@ xfs_mount_validate_sb( } if (unlikely( - sbp->sb_logstart != 0 && mp->m_logdev != mp->m_dev)) { + sbp->sb_logstart != 0 && mp->m_logdev.dev != mp->m_dev.dev)) { xfs_warn(mp, "filesystem is marked as having an internal log; " "do not specify logdev on the mount command line."); @@ -203,11 +206,6 @@ xfs_mount_validate_sb( } - if (check_inprogress && sbp->sb_inprogress) { - xfs_warn(mp, "Offline file system operation in progress!"); - return XFS_ERROR(EFSCORRUPTED); - } - /* * Version 1 directory format has never worked on Linux. */ @@ -335,7 +333,7 @@ static int xfs_sb_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_sb sb; xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -358,7 +356,7 @@ static void xfs_sb_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); int error; @@ -412,7 +410,7 @@ static void xfs_sb_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; int error; diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c index e018abc..6c42de7 100644 --- a/libxfs/xfs_symlink.c +++ b/libxfs/xfs_symlink.c @@ -29,7 +29,7 @@ xfs_symlink_blocks( /* * XXX: this need to be used by mkfs/proto.c to create symlinks. */ -static int +int xfs_symlink_hdr_set( struct xfs_mount *mp, xfs_ino_t ino, @@ -84,7 +84,7 @@ static bool xfs_symlink_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_dsymlink_hdr *dsl = bp->b_addr; if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -108,7 +108,7 @@ static void xfs_symlink_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -126,7 +126,7 @@ static void xfs_symlink_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_mount *mp = bp->b_target.bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; /* no verification of non-crc buffers */ diff --git a/logprint/logprint.c b/logprint/logprint.c index 2a01780..5452e87 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -230,7 +230,8 @@ main(int argc, char **argv) ASSERT(x.logBBsize <= INT_MAX); - log.l_dev = x.logdev; + log.l_dev.dev = x.logdev; + log.l_dev.bt_mount = &mount; log.l_logsize = BBTOB(x.logBBsize); log.l_logBBstart = x.logBBstart; log.l_logBBsize = x.logBBsize; diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index 33dee52..d88b3ab 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -72,6 +72,7 @@ max_trans_res_by_mount( int max_trans_res( + int crcs_enabled, int dirversion, int sectorlog, int blocklog, @@ -95,7 +96,8 @@ max_trans_res( sbp->sb_inodesize = 1 << inodelog; sbp->sb_inopblock = 1 << (blocklog - inodelog); sbp->sb_dirblklog = dirblocklog - blocklog; - sbp->sb_versionnum = XFS_SB_VERSION_4 | + sbp->sb_versionnum = + (crcs_enabled ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | (dirversion == 2 ? XFS_SB_VERSION_DIRV2BIT : 0); libxfs_mount(&mount, sbp, 0,0,0,0); diff --git a/mkfs/proto.c b/mkfs/proto.c index 56eed31..4254f8a 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -676,7 +676,7 @@ rtinit( error); } for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno += ep->br_blockcount; @@ -713,7 +713,7 @@ rtinit( error); } for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno += ep->br_blockcount; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 577880b..2df7871 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -178,6 +178,12 @@ char *sopts[] = { NULL }; +char *mopts[] = { +#define M_CRC 0 + "crc", + NULL +}; + #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) #define GIGABYTES(count, blog) ((__uint64_t)(count) << (30 - (blog))) #define MEGABYTES(count, blog) ((__uint64_t)(count) << (20 - (blog))) @@ -952,6 +958,7 @@ main( libxfs_init_t xi; struct fs_topology ft; int lazy_sb_counters; + int crcs_enabled; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -983,13 +990,14 @@ main( force_overwrite = 0; worst_freelist = 0; lazy_sb_counters = 1; + crcs_enabled = 0; memset(&fsx, 0, sizeof(fsx)); memset(&xi, 0, sizeof(xi)); xi.isdirect = LIBXFS_DIRECT; xi.isreadonly = LIBXFS_EXCLUSIVELY; - while ((c = getopt(argc, argv, "b:d:i:l:L:n:KNp:qr:s:CfV")) != EOF) { + while ((c = getopt(argc, argv, "b:d:i:l:L:m:n:KNp:qr:s:CfV")) != EOF) { switch (c) { case 'C': case 'f': @@ -1455,6 +1463,25 @@ main( illegal(optarg, "L"); label = optarg; break; + case 'm': + p = optarg; + while (*p != '\0') { + char *value; + + switch (getsubopt(&p, (constpp)mopts, &value)) { + case M_CRC: + if (!value || *value == '\0') + reqval('m', mopts, M_CRC); + c = atoi(value); + if (c < 0 || c > 1) + illegal(value, "m crc"); + crcs_enabled = c; + break; + default: + unknown('m', value); + } + } + break; case 'n': p = optarg; while (*p != '\0') { @@ -1774,9 +1801,17 @@ _("block size %d cannot be smaller than logical sector size %d\n"), inodelog = blocklog - libxfs_highbit32(inopblock); isize = 1 << inodelog; } else if (!ilflag && !isflag) { - inodelog = XFS_DINODE_DFL_LOG; + inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG + : XFS_DINODE_DFL_LOG; isize = 1 << inodelog; } + if (crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) { + fprintf(stderr, + _("Minimum inode size for CRCs is %d bytes\n"), + 1 << XFS_DINODE_DFL_CRC_LOG); + usage(); + } + if (xi.lisfile && (!logsize || !xi.logname)) { fprintf(stderr, _("if -l file then -l name and -l size are required\n")); @@ -2025,7 +2060,7 @@ reported by the device (%u).\n"), sectorsize, xi.rtbsize); } - max_tr_res = max_trans_res(dirversion, + max_tr_res = max_trans_res(crcs_enabled, dirversion, sectorlog, blocklog, inodelog, dirblocklog); ASSERT(max_tr_res); min_logblocks = max_tr_res * XFS_MIN_LOG_FACTOR; @@ -2295,7 +2330,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), */ if (!logsize) { logblocks = MIN(logblocks, - agsize - XFS_PREALLOC_BLOCKS(mp)); + XFS_ALLOC_AG_MAX_USABLE(mp)); } if (logblocks > agsize - XFS_PREALLOC_BLOCKS(mp)) { fprintf(stderr, @@ -2338,6 +2373,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" + " =%-22s crc=%-5u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d\n" @@ -2346,6 +2382,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, "", sectorsize, attrversion, projid32bit, + "", crcs_enabled, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, dirversion, dirblocksize, nci, @@ -2411,9 +2448,10 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), sbp->sb_logsectlog = 0; sbp->sb_logsectsize = 0; } - sbp->sb_features2 = XFS_SB_VERSION2_MKFS(lazy_sb_counters, + sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, attrversion == 2, projid32bit == 1, 0); - sbp->sb_versionnum = XFS_SB_VERSION_MKFS(iaflag, dsunit != 0, + sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, + dsunit != 0, logversion == 2, attrversion == 1, (sectorsize != BBSIZE || lsectorsize != BBSIZE), @@ -2435,13 +2473,16 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), * swap (somewhere around the page size), jfs (32k), * ext[2,3] and reiserfs (64k) - and hopefully all else. */ - buf = libxfs_getbuf(xi.ddev, 0, BTOBB(WHACK_SIZE)); + mp->m_ddev_targ.dev = xi.ddev; + mp->m_ddev_targ.bt_mount = mp; + buf = libxfs_getbuf(mp->m_ddev_targ, 0, BTOBB(WHACK_SIZE)); memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); libxfs_purgebuf(buf); /* OK, now write the superblock */ - buf = libxfs_getbuf(xi.ddev, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1)); + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1)); + buf->b_ops = &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2460,10 +2501,11 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * Zero out the end of the device, to obliterate any * old MD RAID (or other) metadata at the end of the device. - * (MD sb is ~64k from the end, take out a wider swath to be sure) + * (MD sb is ~64k from the end, take out a wider swath to be sure) */ if (!xi.disfile) { - buf = libxfs_getbuf(xi.ddev, (xi.dsize - BTOBB(WHACK_SIZE)), + buf = libxfs_getbuf(mp->m_ddev_targ, + (xi.dsize - BTOBB(WHACK_SIZE)), BTOBB(WHACK_SIZE)); memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2475,10 +2517,13 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), */ if (loginternal) xi.logdev = xi.ddev; - if (xi.logdev) - libxfs_log_clear(xi.logdev, XFS_FSB_TO_DADDR(mp, logstart), + if (xi.logdev) { + mp->m_logdev_targ.dev = xi.ddev; + libxfs_log_clear(mp->m_logdev_targ, + XFS_FSB_TO_DADDR(mp, logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), &sbp->sb_uuid, logversion, lsunit, XLOG_FMT); + } mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 1); if (mp == NULL) { @@ -2487,13 +2532,22 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), exit(1); } + /* + * XXX: this code is effectively shared with the kernel growfs code. + * These initialisations should be pulled into libxfs to keep the + * kernel/userspace header initialisation code the same. + */ for (agno = 0; agno < agcount; agno++) { + struct xfs_agfl *agfl; + int bucket; + /* * Superblock. */ - buf = libxfs_getbuf(xi.ddev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1)); + buf->b_ops = &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2501,9 +2555,10 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * AG header block: freespace */ - buf = libxfs_getbuf(mp->m_dev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), XFS_FSS_TO_BB(mp, 1)); + buf->b_ops = &xfs_agf_buf_ops; agf = XFS_BUF_TO_AGF(buf); memset(agf, 0, sectorsize); if (agno == agcount - 1) @@ -2522,6 +2577,9 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), nbmblocks = (xfs_extlen_t)(agsize - XFS_PREALLOC_BLOCKS(mp)); agf->agf_freeblks = cpu_to_be32(nbmblocks); agf->agf_longest = cpu_to_be32(nbmblocks); + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + if (loginternal && agno == logagno) { be32_add_cpu(&agf->agf_freeblks, -logblocks); agf->agf_longest = cpu_to_be32(agsize - @@ -2532,12 +2590,33 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); /* + * AG freelist header block + */ + buf = libxfs_getbuf(mp->m_ddev_targ, + XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), + XFS_FSS_TO_BB(mp, 1)); + buf->b_ops = &xfs_agfl_buf_ops; + agfl = XFS_BUF_TO_AGFL(buf); + /* setting to 0xff results in initialisation to NULLAGBLOCK */ + memset(agfl, 0xff, sectorsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno = cpu_to_be32(agno); + platform_uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) + agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); + } + + libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + + /* * AG header block: inodes */ - buf = libxfs_getbuf(mp->m_dev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), XFS_FSS_TO_BB(mp, 1)); agi = XFS_BUF_TO_AGI(buf); + buf->b_ops = &xfs_agi_buf_ops; memset(agi, 0, sectorsize); agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC); agi->agi_versionnum = cpu_to_be32(XFS_AGI_VERSION); @@ -2549,6 +2628,8 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), agi->agi_freecount = 0; agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); for (c = 0; c < XFS_AGI_UNLINKED_BUCKETS; c++) agi->agi_unlinked[c] = cpu_to_be32(NULLAGINO); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2556,16 +2637,19 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * BNO btree root block */ - buf = libxfs_getbuf(mp->m_dev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), bsize); + buf->b_ops = &xfs_allocbt_buf_ops; block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC); - block->bb_level = 0; - block->bb_numrecs = cpu_to_be16(1); - block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_ABTB_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_ABTB_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, block, 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); if (loginternal && agno == logagno) { @@ -2599,16 +2683,19 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * CNT btree root block */ - buf = libxfs_getbuf(mp->m_dev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), bsize); + buf->b_ops = &xfs_allocbt_buf_ops; block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC); - block->bb_level = 0; - block->bb_numrecs = cpu_to_be16(1); - block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_ABTC_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_ABTC_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, block, 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); if (loginternal && agno == logagno) { @@ -2632,16 +2719,18 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * INO btree root block */ - buf = libxfs_getbuf(mp->m_dev, + buf = libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), bsize); + buf->b_ops = &xfs_inobt_buf_ops; block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); - block->bb_level = 0; - block->bb_numrecs = 0; - block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_IBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, + agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } @@ -2656,7 +2745,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), /* * Make sure we can write the last block in the realtime area. */ - if (mp->m_rtdev && rtblocks > 0) { + if (mp->m_rtdev.dev && rtblocks > 0) { buf = libxfs_getbuf(mp->m_rtdev, XFS_FSB_TO_BB(mp, rtblocks - 1LL), bsize); memset(XFS_BUF_PTR(buf), 0, blocksize); @@ -2710,7 +2799,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), XFS_AGB_TO_DADDR(mp, mp->m_sb.sb_agcount-1, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), - LIBXFS_EXIT_ON_FAILURE); + LIBXFS_EXIT_ON_FAILURE, &xfs_sb_buf_ops); XFS_BUF_TO_SBP(buf)->sb_rootino = cpu_to_be64( mp->m_sb.sb_rootino); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2722,7 +2811,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), XFS_AGB_TO_DADDR(mp, (mp->m_sb.sb_agcount-1)/2, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), - LIBXFS_EXIT_ON_FAILURE); + LIBXFS_EXIT_ON_FAILURE, &xfs_sb_buf_ops); XFS_BUF_TO_SBP(buf)->sb_rootino = cpu_to_be64( mp->m_sb.sb_rootino); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2878,6 +2967,7 @@ usage( void ) { fprintf(stderr, _("Usage: %s\n\ /* blocksize */ [-b log=n|size=num]\n\ +/* metadata */ [-m crc=[0|1]\n\ /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\ (sunit=value,swidth=value|su=num,sw=num),\n\ sectlog=n|sectsize=num\n\ diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h index f25a7f3..d10e444 100644 --- a/mkfs/xfs_mkfs.h +++ b/mkfs/xfs_mkfs.h @@ -23,9 +23,9 @@ XFS_SB_VERSION_EXTFLGBIT | \ XFS_SB_VERSION_DIRV2BIT) -#define XFS_SB_VERSION_MKFS(ia,dia,log2,attr1,sflag,ci,more) (\ - ((ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - ( XFS_SB_VERSION_4 | \ +#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ + ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ + (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ @@ -36,15 +36,17 @@ XFS_DFL_SB_VERSION_BITS | \ 0 ) : XFS_SB_VERSION_1 ) -#define XFS_SB_VERSION2_MKFS(lazycount, attr2, projid32bit, parent) (\ +#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent) (\ ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ + ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ 0 ) #define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ #define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ +#define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ #define XFS_MIN_DATA_BLOCKS 100 #define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ #define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ @@ -79,7 +81,7 @@ extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); extern void res_failed (int err); /* maxtrres.c */ -extern int max_trans_res (int dirversion, +extern int max_trans_res (int crcs_enabled, int dirversion, int sectorlog, int blocklog, int inodelog, int dirblocklog); #endif /* __XFS_MKFS_H__ */ diff --git a/repair/attr_repair.c b/repair/attr_repair.c index bab65b1..590363f 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -344,7 +344,7 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, break; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); @@ -673,7 +673,7 @@ process_leaf_attr_level(xfs_mount_t *mp, } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), @@ -855,7 +855,7 @@ process_longform_attr( } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read block 0 of inode %" PRIu64 " attribute fork\n"), diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 4d14c57..3e7e225 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -53,7 +53,7 @@ check_aginode_block(xfs_mount_t *mp, * so no one else will overlap them. */ bp = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn(_("cannot read agbno (%u/%u), disk block %" PRId64 "\n"), agno, agbno, XFS_AGB_TO_DADDR(mp, agno, agbno)); @@ -66,6 +66,8 @@ check_aginode_block(xfs_mount_t *mp, XFS_OFFBNO_TO_AGINO(mp, agbno, i))) cnt++; } + if (cnt) + bp->b_ops = &xfs_inode_buf_ops; libxfs_putbuf(bp); return(cnt); @@ -626,7 +628,8 @@ process_inode_chunk( bplist[bp_index] = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), - XFS_FSB_TO_BB(mp, blks_per_cluster), 0); + XFS_FSB_TO_BB(mp, blks_per_cluster), 0, + NULL); if (!bplist[bp_index]) { do_warn(_("cannot read inode %" PRIu64 ", disk block %" PRId64 ", cnt %d\n"), XFS_AGINO_TO_INO(mp, agno, first_irec->ino_startnum), @@ -640,6 +643,7 @@ process_inode_chunk( return(1); } agbno += blks_per_cluster; + bplist[bp_index]->b_ops = &xfs_inode_buf_ops; pftrace("readbuf %p (%llu, %d) in AG %d", bplist[bp_index], (long long)XFS_BUF_ADDR(bplist[bp_index]), diff --git a/repair/dinode.c b/repair/dinode.c index f564216..7a75dc8 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -837,7 +837,8 @@ get_agino_buf(xfs_mount_t *mp, size = XFS_FSB_TO_BB(mp, MAX(1, XFS_INODES_PER_CHUNK/inodes_per_block)); bp = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, - XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum)), size, 0); + XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum)), size, 0, + &xfs_inode_buf_ops); if (!bp) { do_warn(_("cannot read inode (%u/%u), disk block %" PRIu64 "\n"), agno, irec->ino_startnum, @@ -948,7 +949,7 @@ getfunc_btree(xfs_mount_t *mp, ASSERT(verify_dfsbno(mp, fsbno)); bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); return(NULLDFSBNO); @@ -1005,7 +1006,7 @@ _("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), pr */ libxfs_putbuf(bp); bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); @@ -1502,7 +1503,8 @@ process_symlink( if (fsbno != NULLDFSBNO) bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_symlink_buf_ops); if (!bp || fsbno == NULLDFSBNO) { do_warn( _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), diff --git a/repair/dir.c b/repair/dir.c index daca17d..1f313f5 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -761,7 +761,7 @@ traverse_int_dablock(xfs_mount_t *mp, goto error_out; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { if (whichfork == XFS_DATA_FORK) do_warn( @@ -1135,7 +1135,7 @@ verify_da_path(xfs_mount_t *mp, } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read block %u (%" PRIu64 ") for directory inode %" PRIu64 "\n"), @@ -2251,7 +2251,7 @@ process_leaf_dir_level(xfs_mount_t *mp, bd_addr = (xfs_daddr_t)XFS_FSB_TO_DADDR(mp, dev_bno); bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ", daddr %" PRId64 ") " @@ -2512,7 +2512,7 @@ process_leaf_dir( return(1); } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn(_("can't read block 0 for directory inode %" PRIu64 "\n"), ino); diff --git a/repair/dir2.c b/repair/dir2.c index c455c83..d853c44 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -105,7 +105,7 @@ da_read_buf( map[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock); map[i].bm_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount); } - bp = libxfs_readbuf_map(mp->m_dev, map, nex, 0); + bp = libxfs_readbuf_map(mp->m_dev, map, nex, 0, NULL); if (map != map_array) free(map); return bp; diff --git a/repair/phase2.c b/repair/phase2.c index 23b457a..5a4cf10 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -48,7 +48,8 @@ zero_log(xfs_mount_t *mp) x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); - log.l_dev = logdev; + log.l_dev.dev = logdev; + log.l_dev.bt_mount = mp; log.l_logsize = BBTOB(x.logBBsize); log.l_logBBsize = x.logBBsize; log.l_logBBstart = x.logBBstart; @@ -92,7 +93,7 @@ zero_log(xfs_mount_t *mp) } } - libxfs_log_clear(logdev, + libxfs_log_clear(log.l_dev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &mp->m_sb.sb_uuid, diff --git a/repair/phase3.c b/repair/phase3.c index 80c66b5..3e43938 100644 --- a/repair/phase3.c +++ b/repair/phase3.c @@ -40,7 +40,7 @@ process_agi_unlinked( bp = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - mp->m_sb.sb_sectsize/BBSIZE, 0); + mp->m_sb.sb_sectsize/BBSIZE, 0, &xfs_agi_buf_ops); if (!bp) do_error(_("cannot read agi block %" PRId64 " for ag %u\n"), XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), agno); diff --git a/repair/phase6.c b/repair/phase6.c index 136bb4f..b9e0cc3 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -512,7 +512,7 @@ mk_rbmino(xfs_mount_t *mp) error); } for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno += ep->br_blockcount; @@ -767,7 +767,7 @@ mk_rsumino(xfs_mount_t *mp) error); } for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno += ep->br_blockcount; @@ -1255,7 +1255,7 @@ _("can't map block %d in %s inode %" PRIu64 ", xfs_bmapi returns %d, nmap = %d\n */ bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( @@ -1621,7 +1621,7 @@ longform_dir_entry_check(xfs_mount_t *mp, skipit = 0; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error( diff --git a/repair/prefetch.c b/repair/prefetch.c index b787663..ebe00c2 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -222,7 +222,7 @@ pf_scan_lbtree( int rc; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) return 0; @@ -722,7 +722,7 @@ init_prefetch( xfs_mount_t *pmp) { mp = pmp; - mp_fd = libxfs_device_to_fd(mp->m_dev); + mp_fd = libxfs_device_to_fd(mp->m_ddev_targ.dev); pf_max_bytes = sysconf(_SC_PAGE_SIZE) << 7; pf_max_bbs = pf_max_bytes >> BBSHIFT; pf_max_fsbs = pf_max_bytes >> mp->m_sb.sb_blocklog; diff --git a/repair/rt.c b/repair/rt.c index d6ecd56..042ff46 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -206,7 +206,7 @@ process_rtbitmap(xfs_mount_t *mp, continue; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1)); + XFS_FSB_TO_BB(mp, 1), NULL); if (!bp) { do_warn(_("can't read block %d for rtbitmap inode\n"), bmbno); @@ -268,7 +268,7 @@ process_rtsummary(xfs_mount_t *mp, continue; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1)); + XFS_FSB_TO_BB(mp, 1), NULL); if (!bp) { do_warn(_("can't read block %d for rtsummary inode\n"), sumbno); diff --git a/repair/scan.c b/repair/scan.c index 5345094..9f0ddaf 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -85,7 +85,7 @@ scan_sbtree( xfs_buf_t *bp; bp = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("can't read btree block %d/%d\n"), agno, root); return; @@ -130,7 +130,7 @@ scan_lbtree( int dirty = 0; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("can't read btree block %d/%d\n"), XFS_FSB_TO_AGNO(mp, root), @@ -1060,7 +1060,7 @@ scan_freelist( agflbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agfl_buf_ops); if (!agflbuf) { do_abort(_("can't read agfl block for ag %d\n"), agno); return; @@ -1196,7 +1196,7 @@ scan_ag( int status; sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_sb_buf_ops); if (!sbbuf) { do_error(_("can't get root superblock for ag %d\n"), agno); return; @@ -1212,7 +1212,7 @@ scan_ag( agfbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agf_buf_ops); if (!agfbuf) { do_error(_("can't read agf block for ag %d\n"), agno); libxfs_putbuf(sbbuf); @@ -1223,7 +1223,7 @@ scan_ag( agibuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agi_buf_ops); if (!agibuf) { do_error(_("can't read agi block for ag %d\n"), agno); libxfs_putbuf(agfbuf); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 67a7446..167b1f6 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -558,9 +558,12 @@ main(int argc, char **argv) } /* prepare the mount structure */ - sbp = libxfs_readbuf(x.ddev, XFS_SB_DADDR, - 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0); memset(&xfs_m, 0, sizeof(xfs_mount_t)); + xfs_m.m_ddev_targ.dev = x.ddev; + xfs_m.m_ddev_targ.bt_mount = &xfs_m; + sbp = libxfs_readbuf(xfs_m.m_ddev_targ, XFS_SB_DADDR, + 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, + &xfs_sb_buf_ops); libxfs_sb_from_disk(&xfs_m.m_sb, XFS_BUF_TO_SBP(sbp)); /* -- 1.7.10 From dave@fromorbit.com Mon Jan 21 08:09:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6E4A97F3F for ; Mon, 21 Jan 2013 08:09:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F425304048 for ; Mon, 21 Jan 2013 06:09:11 -0800 (PST) X-ASG-Debug-ID: 1358777348-04cbb00c6343f40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id t5D57UuCYBYREfMQ for ; Mon, 21 Jan 2013 06:09:08 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av4EAAxL/VB5LETJ/2dsb2JhbABEvioXc4IeAQEFJy8zCBgxOQMbGYgYrB+OdY0ThCYDklmTfIMJgVM Received: from ppp121-44-68-201.lns20.syd6.internode.on.net (HELO dastard) ([121.44.68.201]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 00:39:07 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1TxHoc-0001PD-0s for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:34 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1TxHoR-0005oQ-Te for xfs@oss.sgi.com; Tue, 22 Jan 2013 00:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/12] libxfs: introduce new superblock format Date: Tue, 22 Jan 2013 00:53:07 +1100 X-ASG-Orig-Subj: [PATCH 08/12] libxfs: introduce new superblock format Message-Id: <1358776391-22140-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.com> References: <1358776391-22140-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358777348 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.2.120487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_buf_item.h | 4 +- include/xfs_mount.h | 1 + include/xfs_sb.h | 102 ++++++++++++++++++++++++++++++++++-------------- libxfs/xfs_mount.c | 81 ++++++++++++++++++++++++++++++++------ 4 files changed, 147 insertions(+), 41 deletions(-) diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index abae8c8..d1eeeab 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -49,6 +49,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) +#define XFS_BLF_SB_BUF (1<<10) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -58,7 +59,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF) + XFS_BLF_DINO_BUF | \ + XFS_BLF_SB_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 655866e..6cc1626 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -385,6 +385,7 @@ struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, int tag); void xfs_perag_put(struct xfs_perag *pag); +extern void xfs_sb_calc_crc(struct xfs_buf *); extern void xfs_mod_sb(struct xfs_trans *, __int64_t); extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, xfs_agnumber_t *); diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 6a7f8b0..1f8c1cd 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -32,6 +32,7 @@ struct xfs_mount; #define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ #define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ #define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 #define XFS_SB_VERSION_SASHFBITS 0xf000 @@ -161,6 +162,18 @@ typedef struct xfs_sb { */ __uint32_t sb_bad_features2; + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + + __uint32_t sb_crc; /* superblock crc */ + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + /* must be padded to 64 bit alignment */ } xfs_sb_t; @@ -229,7 +242,19 @@ typedef struct xfs_dsb { * for features2 bits. Easiest just to mark it bad and not use * it for anything else. */ - __be32 sb_bad_features2; + __be32 sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __be32 sb_features_compat; + __be32 sb_features_ro_compat; + __be32 sb_features_incompat; + + __le32 sb_crc; /* superblock crc */ + + __be64 sb_pquotino; /* project quota inode */ + __be64 sb_lsn; /* last write sequence */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -250,7 +275,9 @@ typedef enum { XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; @@ -276,6 +303,11 @@ typedef enum { #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) +#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) +#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_CRC XFS_SB_MVAL(CRC) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) #define XFS_SB_MOD_BITS \ @@ -283,7 +315,8 @@ typedef enum { XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2) + XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) /* @@ -325,6 +358,10 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) return 1; } +#ifdef REMOVE_TO_ENABLE_CRC_SUPPORT + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return 1; +#endif return 0; } @@ -365,7 +402,7 @@ static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_2 || sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } @@ -373,7 +410,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { if (sbp->sb_versionnum == XFS_SB_VERSION_1) sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; else sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; @@ -382,7 +419,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } @@ -396,13 +433,13 @@ static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; else sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | @@ -411,13 +448,14 @@ static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } @@ -429,38 +467,42 @@ static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); } /* @@ -475,14 +517,16 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) @@ -500,8 +544,9 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) @@ -513,8 +558,7 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } /* diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index e59ea78..ed8c770 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -70,6 +70,12 @@ static const struct { { offsetof(xfs_sb_t, sb_logsunit), 0 }, { offsetof(xfs_sb_t, sb_features2), 0 }, { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } }; @@ -264,6 +270,12 @@ xfs_sb_from_disk( to->sb_logsunit = be32_to_cpu(from->sb_logsunit); to->sb_features2 = be32_to_cpu(from->sb_features2); to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); + to->sb_features_compat = be32_to_cpu(from->sb_features_compat); + to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); + to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); + to->sb_crc = be32_to_cpu(from->sb_crc); + to->sb_pquotino = be64_to_cpu(from->sb_pquotino); + to->sb_lsn = be64_to_cpu(from->sb_lsn); } /* @@ -319,13 +331,12 @@ xfs_sb_to_disk( } } -static void +static int xfs_sb_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_sb sb; - int error; xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -333,16 +344,46 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error = xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); - if (error) - xfs_buf_ioerror(bp, error); + return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); } +/* + * If the superblock has the CRC feature bit set or the CRC field is non-null, + * check that the CRC is valid. We check the CRC field is non-null because a + * single bit error could clear the feature bit and unused parts of the + * superblock are supposed to be zero. Hence a non-null crc field indicates that + * we've potentially lost a feature bit and we should check it anyway. + */ static void xfs_sb_read_verify( struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); + int error; + + /* + * open code the version check to avoid needing to convert the entire + * superblock from disk order just to check the version number + */ + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) && + (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) == + XFS_SB_VERSION_5) || + dsb->sb_crc != 0)) { + + if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + offsetof(struct xfs_sb, sb_crc))) { + error = EFSCORRUPTED; + goto out_error; + } + } + error = xfs_sb_verify(bp); + +out_error: + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + } } /* @@ -355,11 +396,10 @@ static void xfs_sb_quiet_read_verify( struct xfs_buf *bp) { - struct xfs_sb sb; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - if (sb.sb_magicnum == XFS_SB_MAGIC) { + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { /* XFS filesystem, verify noisily! */ xfs_sb_read_verify(bp); return; @@ -370,9 +410,27 @@ xfs_sb_quiet_read_verify( static void xfs_sb_write_verify( - struct xfs_buf *bp) + struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + int error; + + error = xfs_sb_verify(bp); + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_sb, sb_crc)); } const struct xfs_buf_ops xfs_sb_buf_ops = { @@ -525,5 +583,6 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) ASSERT((1LL << f) & XFS_SB_MOD_BITS); first = xfs_sb_info[f].offset; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_SB_BUF); xfs_trans_log_buf(tp, bp, first, last); } -- 1.7.10 From glommer@parallels.com Mon Jan 21 10:08:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7B7D77F3F for ; Mon, 21 Jan 2013 10:08:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A7728F8039 for ; Mon, 21 Jan 2013 08:08:39 -0800 (PST) X-ASG-Debug-ID: 1358784517-04cbb00c6647100001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id 06h8csWoFluPHGwU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Jan 2013 08:08:37 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1TxJvI-00027L-L9; Mon, 21 Jan 2013 11:08:36 -0500 Received: from straightjacket.localdomain (195.214.232.10) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Mon, 21 Jan 2013 08:08:35 -0800 Message-ID: <50FD6815.90900@parallels.com> Date: Mon, 21 Jan 2013 20:08:53 +0400 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Johannes Weiner Subject: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers References: <1354058086-27937-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers In-Reply-To: <1354058086-27937-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358784517 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120495 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 11/28/2012 03:14 AM, Dave Chinner wrote: > [PATCH 09/19] list_lru: per-node list infrastructure > > This makes the generic LRU list much more scalable by changing it to > a {list,lock,count} tuple per node. There are no external API > changes to this changeover, so is transparent to current users. > > [PATCH 10/19] shrinker: add node awareness > [PATCH 11/19] fs: convert inode and dentry shrinking to be node > > Adds a nodemask to the struct shrink_control for callers of > shrink_slab to set appropriately for their reclaim context. This > nodemask is then passed by the inode and dentry cache reclaim code > to the generic LRU list code to implement node aware shrinking. I have a follow up question that popped up from a discussion between me and my very American friend Johnny Wheeler, also known as Johannes Weiner (CC'd). I actually remember we discussing this, but don't fully remember the outcome. And since I can't find it anywhere, it must have been in a media other than e-mail. So I thought it would do no harm in at least documenting it... Why are we doing this per-node, instead of per-zone? It seems to me that the goal is to collapse all zones of a node into a single list, but since the number of zones is not terribly larger than the number of nodes, and zones is where the pressure comes from, what do we really gain from this? From theojacvogeljr@illustration.com Mon Jan 21 11:09:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B0A5A7F3F for ; Mon, 21 Jan 2013 11:09:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9ED538F8033 for ; Mon, 21 Jan 2013 09:09:09 -0800 (PST) X-ASG-Debug-ID: 1358788144-04cb6c39144aea0001-NocioJ Received: from ns.pro.com ([166.78.15.221]) by cuda.sgi.com with ESMTP id HDEcBG6o5ABRCVFm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Jan 2013 09:09:05 -0800 (PST) X-Barracuda-Envelope-From: theojacvogeljr@illustration.com X-Barracuda-Apparent-Source-IP: 166.78.15.221 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=illustration.com; s=default; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:To:Reply-to:From:Date:Message-ID; bh=Cr8f2qTvmeOVPM2Ts4vqSgbAi/J9dpd2fE9N2pG0igA=; b=W0qNb2DtcqKsZT7RWxqsx9RwEgnM64e/J43ySlHmifg17KmY2eRAMqmobPIxobyM/2cJbzc5KtcvKo7bZswaKOPSnIL4Z+m7fXouMHUMOve3OzBOJOxl4uVXpjI+gYOrdJNv8TIrr+F4vEm4vuW3Htygb6V3buE+MLXPqtdyMM8=; Received: from localhost ([127.0.0.1]:50734) by ns.pro.com with esmtpa (Exim 4.80) (envelope-from ) id 1TxKp0-0000zO-G5; Mon, 21 Jan 2013 17:06:10 +0000 Received: from 180.74.124.37 ([180.74.124.37]) by 166.78.15.221 (Horde Framework) with HTTP; Mon, 21 Jan 2013 17:06:08 +0000 Message-ID: <20130121170608.10633btug9pcpxfk@166.78.15.221> Date: Mon, 21 Jan 2013 17:06:08 +0000 From: Theodore Jacob Vogel Jr Reply-To: theodjacvog@abv.bg To: undisclosed-recipients:; Subject: Investment inquiry MIME-Version: 1.0 X-ASG-Orig-Subj: Investment inquiry Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: 7bit User-Agent: Internet Messaging Program (IMP) H3 (4.3.11) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns.pro.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - illustration.com X-Get-Message-Sender-Via: ns.pro.com: authenticated_id: theojacvogeljr@illustration.com X-Barracuda-Connect: UNKNOWN[166.78.15.221] X-Barracuda-Start-Time: 1358788145 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: 2.66 X-Barracuda-Spam-Status: No, SCORE=2.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, ADVANCE_FEE_2, ADVANCE_FEE_2_2, BSF_SC0_SA620a, DKIM_SIGNED, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 ADVANCE_FEE_2 Appears to be advance fee fraud (Nigerian 419) 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 2.05 ADVANCE_FEE_2_2 Appears to be advance fee fraud (Nigerian 419) 0.50 BSF_SC0_SA620a Custom Rule SA620a Hi, How are you? Hope life is okay? And compliments of the year.I was on my searching through Business Magazines and I discovered your contacts details, thus why am writing you this mail. I am an investor from Philadelphia PA. A Strategic Business consulting and real estate development in U.S. REIT, INC. "United States - Real Estate Investment Trust". Currently residing in Northern Ireland with my family. I intent to invest in Real Estate Field & Hotels or industrial estates in the states or in any city for the sole benefit of my 2 children. I am showing interest in going into partnership with you, looking forward ahead for any good investment opportunities you have ideas on. I am also willing to participate in any lucrative investment opportunities that has good marginal returns and if actually you can assist in partnership with me to achieve my focus dream to invest . I can also welcome any other investment opportunities ideas you may advice on. I am looking towards to develop five star resort islands. The Resort will be unique and one of the best resort in city and complex indeed. It will be the modern luxurious holiday resort in the city. The concept of the Resort will compass luxury and hospitality. The resort will be five star standards of service and amenities in the Environment will be Sustainable good to give the customers the maximum access to feel the nature and enjoy the prestige Holiday. The Resort will also have focus on the European and Asian market to sell unique products /cloths etc, and any other product that have the Potential. The department structure and management will focus on food & beverage, spa and other facilities to the entire satisfaction of the customers. I am looking for an investment partners to accomplish my dream plan ahead to be achieved. Awaiting your earliest response & look forward to hear from you and I hope to establish a cordial business partner relationship with you. Best Regards Theodore Jacob Vogel Jr From xfs@tlinx.org Mon Jan 21 11:12:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 835C57F3F for ; Mon, 21 Jan 2013 11:12:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EB0D30405F for ; Mon, 21 Jan 2013 09:12:26 -0800 (PST) X-ASG-Debug-ID: 1358788345-04bdf0231a4c160001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 5vpznIyftc33yMXu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Jan 2013 09:12:25 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r0LHCL3O003291; Mon, 21 Jan 2013 09:12:23 -0800 Message-ID: <50FD76F5.20203@tlinx.org> Date: Mon, 21 Jan 2013 09:12:21 -0800 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: stan@hardwarefreak.com, xfs-oss Subject: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> <20130120004638.GZ2498@dastard> <50FBB9D4.9060109@hardwarefreak.com> <50FCB3B8.5000404@tlinx.org> <50FD44C1.7040301@hardwarefreak.com> X-ASG-Orig-Subj: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... In-Reply-To: <50FD44C1.7040301@hardwarefreak.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1358788345 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.2.120499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > If nothing else I hopefully got the point across as to how destructive > parity RAID read-modify-write operations are to performance. It's > simply impossible to get good mixed IO performance from parity RAID > unless one's workloads always fit in controller write cache, or if one > has SSD storage. > ---- Will have to reread it a few times to digest everything (but it is sufficiently depressing...)... Especially the costs on the enclosures...I am pretty sure I paid under 1k for each of them....*ouch*... From contacto@fluzu.com.ar Mon Jan 21 14:00:21 2013 Return-Path: X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 2BABF7F3F for ; Mon, 21 Jan 2013 14:00:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66A66304059 for ; Mon, 21 Jan 2013 12:00:16 -0800 (PST) X-ASG-Debug-ID: 1358798406-04bdf0231d523e0001-w1Z2WR Received: from x039vm01.fluzu.com.ar (x039vm01.fluzu.com.ar [200.58.114.21]) by cuda.sgi.com with ESMTP id 5X8CMFGwGkJD3mAR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Jan 2013 12:00:08 -0800 (PST) X-Barracuda-Envelope-From: contacto@fluzu.com.ar X-Barracuda-Apparent-Source-IP: 200.58.114.21 Received: from [190.48.90.159] (helo=pc) by x039vm01.fluzu.com.ar with esmtpa (Exim 4.77) (envelope-from ) id 1TxNWy-0006Bl-7B for linux-xfs@oss.sgi.com; Mon, 21 Jan 2013 17:00:05 -0300 Reply-To: info@fluzu.com.ar Message-ID: <8f82a53ddb75c034d1ecc26d001d352b@fluzu.com.ar> From: "Fluzu Indumentaria" To: Subject: Uniformes para su empresa Date: Mon, 21 Jan 2013 14:30:53 -0300 X-ASG-Orig-Subj: Uniformes para su empresa MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=SPLITOR00A_001_21169359D" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - x039vm01.fluzu.com.ar X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [502 502] / [502 502] X-AntiAbuse: Sender Address Domain - fluzu.com.ar X-Barracuda-Connect: x039vm01.fluzu.com.ar[200.58.114.21] X-Barracuda-Start-Time: 1358798408 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.78 X-Barracuda-Spam-Status: No, SCORE=1.78 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_ONLY_08, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.78 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=SPLITOR00A_001_21169359D Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxodG1sPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250 ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4NCjwvaGVhZD4NCjxib2R5IHN0 eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYSI+DQo8cD5Ob3MgY29udGFjdGFtb3MgcGFyYSBvZnJl Y2VybGUgbnVlc3Ryb3Mgc2VydmljaW9zIGRlIGRpc2XxbyB5IGNvbmZlY2Np824gZGUgDQppbmR1 bWVudGFyaWEuPC9wPg0KPHA+VHJhYmFqYW1vcyBlbiBhbXBsaW9zIHJ1YnJvcyBjb21vIHNlcjog Um9wYSBkZSB0cmFiYWpvLCBjb3Jwb3JhdGl2YSwmbmJzcDsgDQpkZXBvcnRpdmEsIGV0Yy48L3A+ DQo8cD5BZGp1bnRhbW9zIGZseWVyIHBhcmEgbeFzIGluZm9ybWFjafNuIHkgZGF0b3MgZGUgY29u dGFjdG9zLjwvcD4NCjxwPkZsdXp1IEluZHVtZW50YXJpYTwvcD4NCjxwPiZuYnNwOzwvcD4NCjxw PjxpbWcgYm9yZGVyPTAgc3JjPSJjaWQ6MjU5NmFuJElONjU4MDEzNTg3ODk0NTMwQHBjIj48L3A+ DQo8cD4mbmJzcDs8L3A+DQo8cD4mbmJzcDs8L3A+DQo8cD5TaSB1c3RlZCBubyBkZXNlYSByZWNp YmlyIG3hcyBlc3RlIGZvbGxldGluIGluZm9ybWF0aXZvLCByZXNwb25kYSBlbCBtYWlsIGNvbiAN CmxhIGxleWVuZGEgIlJFTU9WRVIiIGVuIGVsIGFzdW50bzwvcD4NCjxwPiZuYnNwOzwvcD4NCjwv Ym9keT4NCjwvaHRtbD4= ------=SPLITOR00A_001_21169359D Content-Type: image/jpeg; name="folleto fluzu mail.jpg" Content-Transfer-Encoding: base64 Content-ID: <2596an$IN658013587894530@pc> /9j/4AAQSkZJRgABAQEBLAEsAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC IFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFj cHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJD AAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5 OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEA AAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAA AA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt IHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt IHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENv bmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAK AA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMC DAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh Ay0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4E jASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3 BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqY Cq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBh EH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT 5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9oc AhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCY IMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZcl xyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIx SjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+ oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXe RiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYP VlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1f D19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/ aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy S3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f HZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1 q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm4 0blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZG xsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj 4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgMC AgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIU FRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBT/wAARCATdBvUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ 2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaH iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4x+N3/JZ/H3/Ywah/6UyVxVdr8bv+Sz+Pv+xg1D/0pkri qCgooooGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV7b+xR/ydd8Mf+wxH/Jq8Sr239ij/ AJOu+GP/AGGI/wCTUCP3pooooJCiiigD+d743f8AJZ/H3/Ywah/6UyVxVdr8bv8Aks/j7/sYNQ/9 KZK4qgoKKKKBhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUV +qfwS/Yk/Z/1b9m3wh4+8caa1k1zo8F7qWp3Osz28CswGWP7wKoyR6Dmr9l+wn+yn8XY5rHwN4tj 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 Nl8MalcrqdjPCLvTdTjTYLqAkrkrk7XUqQy5OMA8ggkC54/RX3t+yB/wTeg+JfhC08ffFC/utG8O XUX2mx0m2cQzTwYyJ5pGB8uMjkADJU7tyjGfaovhp+wc94fD4vfDBuQ3lGdvEF2FLdM/aDNs/JsU Bc/J+ivuv9uP9hXwT8Dvhvb/ABE8Ca9eyaXcXkNt/Zl063MTLKrFZIpxg7fl6NuznO7tW9+yL/wT j0XxV4DtfiL8X72aw0W6g+22mjJP9lX7LjcJ7mbgqrL8wVSpC4JbnAAufntRX6z6b8LP2GfHmpp4 T0mXw8dVlbyIDb6vdxO8h4AjmaTbIxPQZbJ7Gvk79tv9hS7/AGZzb+JfDt7ca34FvJ/I8y5ANzYS nJVJSoAZWwdrgDkbSAdpYC58k0V+gP8AwTu/ZK+GH7Qfwr8R6x420W41LVLLWmtIpIb+aACHyInA 2owB+Zm56818laJ4O0S9/aVsPCk1uzeHJfF0elvbiVgxtTeCMrvzuzs4znPegDzOivvT/gov+yn8 NP2efAvhLUPBGjXGm32o6lJbzvNfTTho1iLYAdiBzjkVo/8ABO/9kf4X/tB/CTxBrXjbRbjUtVs9 cezilhv5oAIRbwuBtRgD8zvz159qAufn1RW5460210fxv4hsLFDHZWuo3EECFixWNZWVRk8ngDk1 h0DCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvbf2KP8A k674Y/8AYYj/AJNXiVe2/sUf8nXfDH/sMR/yagR+9NFFFBIUUUUAfzvfG7/ks/j7/sYNQ/8ASmSu Krtfjd/yWfx9/wBjBqH/AKUyVxVBQUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigD9dvE3/KKKL/sUbP/ANGRV+Sel6re6HqVtqGnXc9hf20glguraQxyRODk MrDBBB7iv1s8Tf8AKKKL/sUbP/0ZFX5FxxtLIqIpd2IVVUZJJ6ACgSP2T0TWm/bA/wCCd19eeI0S 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 m0mDxBbvd6fHcjbLLApA8wp1VWJ+XOCRz0IJAOTooooAKKKs6Zpt1rOpWmn2NvJd313KkEFvCu55 ZGIVVUDqSSAB70AVqKtanpd5ouoXFhqNpPYX1u5jmtrmNo5YmHVWVgCCPQ1VoAKKKKACtTw74Z1H xTfi0063M0mMsxOFQerHtWXX0b8F9Jg0/wAD21yijzrxnllfucMVA+gA/U15+OxLwtLnS1eiPseF MijxBmP1apLlhFOUrb2TSsvNto4CX4Ba2ltvS9sZJgM+UGYA+wO2vPNV0m70S+ls76B7a5jOGR/5 j1HuK+va8o/aA0mB9H07U9oFzHP9nLd2VlZsH6Ff1NeRgsyq1Kqp1dUz9K4q4FwGBy6eNy+8ZU9W m7prrvs1v26WPDqKKK+nPwQKKK9c/Zx/Zj8Y/tMeLhpPhu1+z6bbsp1HWrlT9mskPqf4nIztQcn2 ALAA8jorqPin4Rh+H/xO8X+F7e4e7g0TWLzTI7iRQrSrDM8YYgcAkLn8a5egAooooAKK9S+BH7OX i39oy78Q2Hg4Wlxqmj2QvjZ3U3ktcrvCbI2I27ssPvFR15rifGXgfxB8PNfuNE8TaNe6Fq0B/eWl /C0TgdiAeqnswyD2NAGHRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFbeneB/Eer2C31j4f1S9smBK3NvZSSRnBIOGCkcEEH6UAYlFFFABRRWloXhnWPFF zJb6NpV9q9xGnmPFY2zzuq5A3EKCQMkDPvQBm0Ve1nQtS8OXzWWrafd6XeKoY297A0MgB6HawBwa o0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFe2/sUf8AJ13wx/7DEf8AJq8Sr239ij/k 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 oooAKKKKACiv0u+FH/BKzwV8QPhd4P8AFN340162udc0az1OWCGKDZG80CSFVyucAsQM1+dPjHRY /Dfi7W9IikaWKwvp7RJHxuYJIygnHc4oEY9FFFAwooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr239ij/k 674Y/wDYYj/k1eJV7b+xR/ydd8Mf+wxH/JqBH700UUUEhRRRQB/O98bv+Sz+Pv8AsYNQ/wDSmSuK rtfjd/yWfx9/2MGof+lMlcVQUWLG/udMuFuLS4ltZ16SQuUYfiK7LSfjP4m0zCyXMWoRj+G6jBP/ AH0uD+ZNcLRWNSjTq/xIpnq4LNMdlzvg60oejaXzWz+Z7dpP7QNnLtXUtLmtz3ktnEg/I4x+ZrtN J+JXhrWcCDVYI5D/AMs7gmI59Pmxn8K+XaK8uplOHn8N4/15n3+B8Rs4w1liOWqvNWf3xsvwZ9jo 6yKGVgykZBByDVHUtA0zWARfafbXfvNErEfQkV8raZr+paK+6wv7i05ziGQqD9R0NdlpPxw8R6ft W5NvqKDr50e1sfVcfqDXmTyitTd6Ur/gz7vDeI+V4yPs8woON/Scf0f4M9M1P4LeGNQyY7aaxc/x W0p/k2RXJ6n+z44y2n6urekdzFj/AMeUn+Vamk/H7SrnauoWFxZMerRESp/Q/oa7TSfHnh/W9otN WtndukcjeW5/4C2DWLqZhhvivb7/AMdT044LgzPv4Sp8z/lfs5f+A+7+R4Xqfwd8UabkrZJeIP47 aUN+hwf0rlb/AEe/0p9t7ZXFo3TE8TJ/MV9eda4n4zf8k91D/fi/9GLXXhs1q1Kkac4rV2PnM88P MBhMHWxmFrSXJGUrOzTsr26NfifNtFFFfUH4CFFFFAH65f8ABIn/AJNy8Tf9jXcf+kdnX3DXw9/w SJ/5Ny8Tf9jXcf8ApHZ19w0EsKK/FL4s/ttfHDQfip4y0zT/AIh6lbWFlrV7bW8CxQ4jjSd1VRlM 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 zUAfBH/BOc4/bL+Hf+9f/wDpvua/RD/gp+M/ska57ajY/wDo4V+dn/BOs4/bJ+HX/XS+/wDSC4r9 Fv8Agp4M/sjeIPa/sf8A0etAPc9f/ZcOf2avhT/2Kul/+ksdfi4upw+H/wBr4ahdEJb2Xjrz5S3Q Kmobmz+ANfqt/wAE8fjFpPxP/Zs8M6Xb3cZ1zwzbLpOoWW4eZEI8rC+Ou1owuG6ZDDqpqzqf/BPH 4I654+1XxZqnhu61C81O5lvJ7OXUJltfOkYs7BEZSMsScZwM8DpQGx6l+0Nod14l+AnxI0mxRpb2 98OahbwRqMl5GtpAq/iSB+Nfz21++HwE/aJ8N/FvUPFPhaC5jtPFPhTVLvSrzTJZcyvFBO8UdwmT l1ZVXcf4WJB7E+d+JP8Agmn8EPE/jefxJNpGpWYuJzcTaTZXxispGJy3yAbkBOflRlA7AUAan/BO jRrrRP2PvAiXaNHJcC7ukRhgiN7uZkP0KkN/wKvzD/b/ANTg1b9sD4kT27Bo0ure3JH9+O1hjcf9 9Ia/XP47fHHwb+yp8KDqV99mtI7S2+yaLoVuQj3LooWOGJB0Rfly2MKv4A/g54q8S3/jPxNq2v6r N9o1PVLuW9upcY3yyOXc/mxoBGXRRRQUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXtv7FH/J13wx/7DEf8mrxKvbf2 KP8Ak674Y/8AYYj/AJNQI/emiiigkKKKKAP53vjd/wAln8ff9jBqH/pTJXFV2vxu/wCSz+Pv+xg1 D/0pkriqCgorW8L+G7nxZrMOm2skUU0gZg0xIUADJ6A161pH7P8AYw7W1PUprk9THbqI1+mTkn9K 4q+Mo4Z2qPXsfVZRwzmmdx9pg6d4J2cm0kn+fXomeH1q6T4V1jXSPsGm3Nyp/jSM7P8Avo8D86+k dI+Hnh3Q9ptdKgMg6STDzWz65bOPwrogAAABgCvHqZytqUPv/r9T9NwPhfN2lj8Ql5QV/wDyZ2/9 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 GNuMY/1fpXhFFAFvSNWu9B1ay1Owna2v7KdLm3nTGY5EYMrDPcEA1654k/bJ+NHi/QNR0TWPiBqd 9pWo272t1ayLEFlidSrKcIDggkV4xRQM2fB/jDWfAPiSx8QeHtQl0rWbFzJbXkGN8TFSpIyCOhI/ Gu88c/tT/Fj4l+Gbvw94o8canrOi3ZQz2VwU2SFHDrnCjoyqfwryqigD2Dw/+178ZfCuhafouk/E LWLDS9PgS1tbWGRQkUSKFVR8vQAAV5TquqXWt6neajfzvdX15M9xPPJ96SR2LMx9ySTVWigD1j4a /tWfFv4RWEdh4U8d6rp2nRDEVjKy3NvEPRIpldFH0ArpPFH7ePx78X2LWl/8SNShhYYJ02CCwfH+ /BGjfrXgdFAjo/DHxH8UeDPFY8T6Jr+oad4i+f8A4mkM7faDvBD5c8nIJB+tb/jr9oP4k/E3RBo/ ivxrrOv6WJVnFpfXTSR+YoIVsHuMn8689ooA1/Cfi3WvAviC013w9qd1o2sWhY299ZyGOWIspRtr DkZVmH0JrrPGX7Q3xM+IehS6L4m8da7rukysryWV9fPLEzKcqSpOOCMivPKKBm54O8ceIfh7rces eGNbv9A1SMFVu9OuGhk2nqpKkZB7g8GvUNY/bV+OeuWBs7n4m68kJG0m0mFs+P8AfjCt+teJ0UAa mn+KdZ0nX112x1e+s9bWU3A1K3uXS5EhJJfzAd24knJznmvaLX9vH4+Weniyj+JWptCF27pYYJJc f9dGjL5985rwOigDc8YeOPEPxB1qTV/E+uahr+pyDa13qNy88mOygsTgDsBwKw6KKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAK9t/Yo/5Ou+GP8A2GI/5NXiVe2/sUf8nXfDH/sMR/yagR+9NFFFBIUUUUAfzvfG 7/ks/j7/ALGDUP8A0pkriq7X43f8ln8ff9jBqH/pTJXFUFHc/Bf/AJKBZf8AXOX/ANANfR9fHUU0 kEiyRO0cinKuhwQfY12Oh/F3xLou1TeC/hH/ACzvBv8A/HuG/WvBzDL6mJn7Sm1tax+wcG8Y4PIs LLBYuErOTlzKz3SWq07dL+h754k/t77NnQzYebjkXof9Cv8AWvFfGGp/ES13/wBpve21uOr2YCxg f70f9TXX6H8fNNutqapZTWLngyQnzU+pHBH5Gu/0bxTpPiFA2nahBdHGdiPhx9VPI/EV5EPbYF/v KKa72/U/R8Wst4tjbA5lKEn9mMrL5wdm/vPk6WV55GkkdpHbksxyT+NMr6n1v4f+H/EG5rzTITK3 WaIeW+fUlcZ/HNcBrf7P0bbn0nU2Q9obxcj/AL7Xp+Rr2qWbUJ6T90/Lcx8O84wrc8O1WXk7S+5/ o2eL0V1Ot/DLxJoO5ptNknhH/LW1/erj145H4gVy5BUkEEEcEGvXhUhUV4O5+cYrBYnAz9niqcoS 7STX5iUUUVocQUUUUAFFFFAH65f8Eif+TcvE3/Y13H/pHZ19w18Pf8Eif+TcvE3/AGNdx/6R2dfc NBLP54vjh/yWr4gf9jBqH/pTJXE123xw/wCS1fED/sYNQ/8ASmSuJoGFFFFAwooooAKKKKACiiig Ar9hP+CTv/JsF9/2Md3/AOibevx7r9hf+CTv/JsF7/2Md3/6Jt6BM+ufFn/Iraz/ANeU3/oBr+cv ShnVLMf9Nk/9CFf0aeLP+RW1n/rym/8AQDX85ujjOr2P/XdP/QhQJH9I9fk5/wAFfD/xfDwaP+pd X/0pmr9Y6/Jv/gr4f+L5+Dh/1Li/+lU9AI+EKKKKCgr0D9nr/kvvw0/7GbTP/SqOvP69A/Z6/wCS /fDT/sZtM/8ASqOgD+hOvxx/4KrHP7U59tCs/wD0KWv2Or8b/wDgqoc/tUP7aHZ/zkoJR8eUUVo+ HNBvPFXiHS9F06LztQ1K6is7aP8AvyyOEQfiWFBR+vf/AASz+GH/AAhP7OH/AAkVxFsvvFV/Je7i MN9njPkxKfbKyuPaSvrrWtYtPD2jX+q38wt7Gxt5Lq4lbokaKWZj9ACazvAPg6z+Hvgbw/4Y08Ys tGsILCE4wWWNAgJ9zjJ9zXz5/wAFIfif/wAK3/Za8QW0E3lah4klj0SDB52yZabj0MKSL/wIUEH4 5fEzxxd/Ev4h+JPFd9kXWs6hPfOpOdnmOWCD2UEAewFc1RRQWFFFFAH2T/wSjGf2o5v+xfu//RkN fsVX47/8EoRn9qK4/wCxeu//AEZDX7EUEs/ne+Mxz8YPHR/6j1//AOlD1xtdh8Yzn4u+OD/1Hb7/ ANKHrj6BhRRRQM+/v+CPv/JVfHv/AGBYv/R61+qtflX/AMEff+SqePf+wLF/6PFfqpQSz+bK7Obq Y/7bfzqGpLg5uJT/ALR/nUdBQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXtv7 FH/J13wx/wCwxH/Jq8Sr239ij/k674Y/9hiP+TUCP3pooooJCiiigD+d743f8ln8ff8AYwah/wCl MlcVXa/G7/ks/j7/ALGDUP8A0pkriqCgooooGFOR2jYMrFWByCDgim0UBsddofxV8S6FtVL9ruEf 8srweYPzPzD8DXoOh/H+zm2pq2nyWzdDLbNvX6lTgj9a8Qorgq4HD1vijr5aH2GXcW5zlllRrtxX SXvL8dV8mj6v0TxjoviID+z9Sgnc/wDLLdtk/wC+Tg/pTta8I6N4hB/tDToLliMeYVw//fQwf1r5 k0Twtq/iBwNN0+e5Gf8AWIuEB92PA/OvafA/g7xlpPltf+IBFbjraMPtJx6Zb7v/AAEmvncTg6eF fNTq2fbr+H+R+05HxPi+IIKjjMuc4PeSS5PunZf+TN+RT1v4Badc7n0u/ms36iOceYn0B4I/WvOf FHwv13wpbSXVzDFNZR43XEEgKjJAGQcHqR2r6brj/i7/AMk71f6Rf+jUpYTMcR7SNOTum0tTTiLg rJngq+MoU3TnCEpLlejaTeqd1bTpY+Z6KKK+yP5iCiiigD9cv+CRP/JuXib/ALGu4/8ASOzr7hr4 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 +0+ESXCBRPA5ULhgfunOenrXFDLK9GrGSs0mj6nFce5RmmXV8PUjKE5QkkpK6u4u1mr9erSPOqKK K+tP5yCiiigD9cv+CRP/ACbl4m/7Gu4/9I7OvuGvh7/gkT/ybl4m/wCxruP/AEjs6+4aCWfzxfHD /ktXxA/7GDUP/SmSuJrtvjh/yWr4gf8AYwah/wClMlcTQMKKKKBhRRRQAUUUUAFFFFABX7Ef8Eof +TXbj/sYLv8A9Fw1+O9fsT/wSi/5Ncn/AOxgu/8A0XDQJn1r4s/5FbWf+vKb/wBANfzg1/SD4mhk uPDeqxRI0kr2kqqiDJYlCAAO5r8C2/Zg+MS9fhR42/Dw9dn/ANp0CR5lRXpLfs0fF9PvfCnxuv18 O3n/AMbqNv2cfiyvX4X+Mx9fD93/APG6CjzqivQG/Z6+Kife+GnjBfroN1/8bqNvgF8Tk+98OfFq /XQ7r/43QBwdFdnefBb4hafazXN14E8TW1vChklmm0e4REUDJZiUwAACSTXGUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFe2/sUf8nXfDH/ALDEf8mrxKvbf2KP+Trvhj/2GI/5NQI/emiiigkKKKKAP53vjd/y Wfx9/wBjBqH/AKUyVxVdr8bv+Sz+Pv8AsYNQ/wDSmSuKoKCiiigYUUVLb2013KsUETzSt0SNSzH8 BRsNJydktSKiux0j4SeJ9X2sNPNnGf47xvLx/wAB+9+ldvpH7Psa7W1TVWf1itEx/wCPNn/0GuCr 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 wb+3x+05crdXfwu8MXclsiqE167hJVpQyhhaq390hh5mDzkoeN6n7U+Ivi+D4f8AgLxF4luE82LS bCe9MWQDIUQsEGSBliAo56kV+JutavdeIdZ1DVb+Uz31/cSXdxK2MvLIxd2PuWJP400BToooqgCi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKASpBBII5BFFFAH6JfsD/tNT+MrM/DjxPdLJq9hDv0e7kcBrm3UfNAR3eMDcCMkpngeWSfs 6vw78C+Mr/4e+MtF8S6YcXulXcd3Gu8qJNrAlGI52sMqfYmv220PWbTxHoun6tp8wuLC/t47q3lX o8bqGVvxBBqWBeooopAFFFFABRRRQAUUUjMEUsxCqBkk9BQAtNd1jRmZgqqMlicACvjT45f8FAIr HULzw78JbK08RX0DNDc+Jr4k6ZbuOCsIUg3DDnkEIDjlulfInjTXvFPxTnefx54u1fxWXO77HPcG CxQ/7FtHtjH4gn3rzsRj6GHfLJ3fZH2+TcHZrncVVowUKb+1LRP03b9UreZ+ofiP9oz4V+EZXi1j 4jeFrCdPvQS6vB5o/wCABt36Vyzfts/ApZNh+J2g59RMxH54xX5n2fh3StPUC1020twP+ecCr/IV e8pMY2Lj0xXlvOl0p/j/AMA/QKfhZUa/eYxJ+UL/APtyP1G8O/tL/CbxZKkWk/EnwteTvwsC6tAs rfRGYN+lejxSpPGskbrJG4DK6nII9Qa/Ga80HTNQUi60+1uAevmwq38xWl4L1nxJ8LLpbnwH4q1b wlIrbjbWs5lspD/t20m6NvyB962p5xSk7Ti1+J5mN8McwoxcsJWjU8neLfpuvvaP0B/b510aN+zR r0G9kfUrq0s1KnBP75ZCPoVjYH2zX5UV9DfH39rzX/ij8HbLwn430GC01a21WC6XX9KJ+xXKLHKh EkbEtC+XU9WU84K4APzwCCAQcg9692lUhVjzQd0flGMwWJy+s8PioOE10f8AWq89haKKK1OIKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAK/Xj9jXxBN4l/Zm8CXdxnzIrWSy5/uwTyQL/AOOxrX5D1+sH7B5z+y/4U9pb3/0rlqWB 9AUUUUgCiiigArI8U+MNB8DaS2q+JNb07w/piOsbXuq3cdtCGbhVLuQuT2Ga16+R/wDgqR/yaZqf /YVsv/RhoA9t/wCGm/g7/wBFY8D/APhR2f8A8cr5L/bL/alt/iVcf8K2+HniC3vfDbQrL4i17R7p ZY7lX+7YwyoSMEcyFT0ITIywr8qK+pvh/wCHl8M+E7C02bZmQSznHJkYZOfpwPoBXlZjiXh6Xu/E z9F4IyGnneY3xCvSpLmku76L56t+SaN21tYbK3jt7eJYYI1CpGgwFHoBWdr3izSPDEYfUr6K2JGV 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 kfR/601E/aQw9NT/AJuXX8/1Ow+I3xHu/H+oIzJ9l0+AnyLYHPXqzHux/T8ycHwxeQ6f4k0m6uH8 uCC7ilkfBO1VcEnA5PArNor6mlhKNDD/AFakuWFraef6nytXGVq+I+tVZc07318v0Pevil8T/DPi PwPqGn6dqX2i7lMZSPyJVziRSeWUDoD3rwWiiuXLMso5VRdCg203fW19kuiXY6szzOtmtZV66SaV tL23b6t9wooor1zyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAK8h8Xf8jHff7/9K9eryHxd/wAjHff7/wDSpY0Y9fq1/wAEfP8Akkfjr/sOJ/6T pX5S1+rX/BHz/kkfjr/sOJ/6TpSGz78ooooJCvkf/gqR/wAmman/ANhWy/8ARhr64r5H/wCCpH/J pmp/9hWy/wDRhoA/GGum8BeCLjxvq/2dCYbOLDXE4H3V7Af7R7fie1czX1F8OvDCeFfCtpbFNtzK omuD3LsOn4DA/CvMzDFPDUvd+J7f5n6Bwbw/HPswtX/hU1eXn2j8/wAk+psaJodl4e0+OysIFt4E 7L1Y+pPc+9P1LV7LR4POvruG0i7NM4UH2Getcd8TviUvg23W0sws2qzLuUNysK/3iO59B+fv8/ap q15rV291fXMl1cN1eRsn6D0HsK+fwuXVMUva1HZP72fsnEHGuD4el9QwVNTqRVrLSMey06+S279D 6EvvjR4Ws2KpdTXZH/PCFsfm2Kzj8ffDwP8Ax56kffyo/wD4uvAaK9lZTh0tbv5n5hU8R87nK8eS K7KP+bZ9EWnxx8M3DASPd2o9ZYM4/wC+Sa6vRfFWkeIR/wAS7UILpsZKK2HA91PI/KvkynwzSW8q SRO0ciHKuhwQfUGsqmT0ZL3JNP7zvwfiZmVKS+t0ozj5Xi/vu1+B9gXVpDfW0lvcRJPBINrxyDKs PQivL9Z0STwVqEUIZpdFuW2W8jnLW79o2PdT/CfwqH4VfFabU7mLRtal8y4f5be7bq5/uN7+h7/W vTdd0eDX9IutPuRmKdCue6nsw9wcH8K8mlOrllflnt1813P0fHYbLuPMp9vhv4kb8rfxRl/LLyf3 dUed0VR0ieaS0MV1xd20jW84/wBtDgn8ev41er7dNNXR/K84SpycJKzWjCiiimQFFFFABRWrq3hL XNAt47jU9G1DToJG2JLd2skSs2M4BYAE4BP4VlUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUVpt4W1pNH/tZtIvxpWAftxtn8jGdv38bevHXrQBmUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFSwWk91u8mGSbb18t C2PrioqAF3tjGTjp1pKKKAFDsOhI+hqxp2qXmkXK3Fhdz2VwvSW3kaNx+IINVgMmpZ7O4tQDNBJC D08xCufzoAl1PVb3Wrx7vULy4v7p/vT3MrSO31ZiSa+0/wDgm5r2maHafEP+0tSs9P8AOFkI/tdw kW8gT5xuIzjI/MV8RUUgLk2oXUS3FqlzMls8hLQrIQjHPUr0NU6KVVLsFUFmJwAOppgX7DxFqulW 0ttZaneWdvN/rIre4dEf6gHB/GqAYgYBIH1qW4s7i1CmeCSENkKZEK5x1xn6j86hoAKKKKAL9jr+ qaXazW1lqV3aW8xzLDBOyI/+8AcHoOtUNxxjJxRRQAVfHiDVBZGzGpXgsyCDb+e/lkHr8ucVQooA KKKKAHwTy2sySwyPDKhyrxsVZT6ginXN5PeTGW4nknlPV5HLMfxNRUUABOetWNP1G70m7S6sbqaz uY/uTW8hjdfow5FV6KAJ7y/udQuZLm6uJbm4kOXlmcu7H3J5NQ7iTnJz65pKKAL+meIdV0RpG07U rywaQbXNrO8ZYeh2kZqlJI80jPIxd2OWZjkk+pNNooAt6ZrF/olz9o06+ubC4xt821laNsemVINQ 3N3Pe3Dz3E0k87nLSyuWZvqTyaiooA+7fgX+yn4B0CPwR8U9V8e20dlDZ2WrvYX00UaQXflI7b5g 64CS5IUjjaA24Bs+F/tmfGvSfjb8WUvtAaSXRdMs1sILhwQLhg7s0qqQCoO4AA/3c98V4NRSAuaX rOoaHcefp19c6fPjHm2szRtj6qQagu7y41C4e4up5Lmdzl5ZnLsx9yeTUVFMAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAryHxd/yMd9/v/0r 16vIfF3/ACMd9/v/ANKljRj1+rX/AAR8/wCSR+Ov+w4n/pOlflLX6tf8EfP+SR+Ov+w4n/pOlIbP vyiiigkK+R/+CpH/ACaZqf8A2FbL/wBGGvrivkf/AIKkf8mman/2FbL/ANGGgD8ePCNiNT8U6Tas NyS3UauP9ncM/pmvrEkAZPAr5b+HDBPHWik9PtKj8+K+n7xGltJ0T7zIwH1xXyecNurCPkf0b4Yw jHAYmql7zkl90dPzZ8oeJ9ak8Q+IL/UZGLGeUsuey9FH4AAVl0UV9VGKjFRWyP57rVp4irKtUd5S bbfm9WFFFFUYhRRRQBr+GLVrzUXjRisvlM8bKcFXHKkfiBX1B4b1T+29A06/OA1xAkjAdmI5H55r 5q8BMF8QxsTgCNyT+FfQHw0Ro/AmjBhgmDcPoSSP0NfO5zFezhLrc/avC+tUWNxFBfC4J/NOy/Nn JavALPxvrkSjCTCG5Ue7LtY/mlLUvikhvH93j+GxhB+u5zUVexgm3hqbfZH5zxPTjSzrFxhtzy/F 3Ciiiu0+YCvrr4Lfsy/Db49fBSC30HxUbb4nW3m3N0k3AQllCxNCcExAbQJVJO5ySTxGPkWvtD9n aP4GfBf4Z6V8U/EGqza74qd3ih06RF8+2uFB3pDbhyDgMv71zjBQ/uy2KTA+nf2g/wBnuf48+GfB ugXWqrpWn6beLc6hPGu+RlWIptjB4yS2Nx4HXB6H89f2o/Cvw38I+Prew+Gusf2pp8dnHHeojmaK K4UYJSbo+8YZgMhW3AEDCr+jfxz+LPg7wX4Q0WLx9przeGfE+bK5YJ5yQFo93zqBuK43fMvzAgED uPgT41fCP4d+Hfjt4W8O+Btfk1bStZubZriJXSeG0SeVQixzhiZAUbOGGQNp3Pu4SA9i+BX7PHgb 4N/CUfFr4tWsGqebbJdWelzw+dHEki4jUxE7ZJX3jAYYQ4PBG4Xf+Hi/g6e8Okz/AA0c+FC3lf62 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 bTrqIRxO20yCZ8owTO45ABAIyucjzD9uX4X6T4G+O3hPW9It47KPxCyzXMEWQpuI5lDyAZwNwdOB gZBPUmgDqP8Agp8irN8NtoAymok4HvbV8T6J4f1TxLfLZaRpt3qt4wJW3soGmkIHXCqCa+8P+CiP hq68Z+Mvg5oFkyJd6pc3dlE8mQitJJaoC2OgBOT7VtfFb4jwfsX+F9B8C/DTwot/rskMd3eXt3ZS TQzKQyNLI6OrNKzR5x90DgYAC0Afnzr/AIY1nwpeC01vSb7R7ojcIL+2eByPXa4BrM61+k3wi8dT /tpfDzxf4T+I3hi20/UbRVltLqC0kjSNnSRI5oxIzESRnd/Fgh8dC1cN+yT8GPDvws+HXiD4veOb KO8udLkuRZxyKriBbaQozorYxMZY2Ve/AxjcaLgfF914D8TWOk/2rc+HdWt9Mxn7bLYyrDj/AHyu 39awq+z9O/4KY+JF8SGS+8IaU3h0uQtnbyyC5jTt+9J2sRx/AoOP4c5HefBbwb8Pvid8UviF8dZN Ptz4RsDDJptncW4jW3uUs4ZbqWSIDBdGyAwypcuwyQrUAfC5+G3i4aOdWPhbWv7KC7jff2dN5AHr v27cfjXOV9nR/wDBS3xIPFW5/CmlDwt5hAtF8z7WIug/eb9me+NmO2a3P2o/2ePCvifx18NvG2gq lhoHjXVbOw1JbL935jTnes8akEK7puB4xuCkjLMSAfFugeDdf8V+b/Ymh6lrHlf6z7BaST7PrsBx WfqGm3ek3T219azWdyhIaG4jMbqc45BGRyDX6MftK/H3W/2TZPDXhXwF4N0y18OiyDpd3dvK0G7e wMSlGXL8b2JYkmTJ5JJ+c/jz+1xbfH/4VWmj6r4ah0vxRaX0cwvbUh4pY9jCTBYb48nZ8uWB2jng YAPmuiiimAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUVq+G/Cet+MtQax0HSL3Wr1YzKbawt2mkCAgFtqgnAJHPvQBlUV3f/ChfiV/0T/xP/wCC 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 9059qAPpvTdXtNM/4KK6tBcuFlv/AAwttbA/xSBYpCB/wCN/yrmvj5+294r+DfxW1zwoPCGk3NtZ ujW91O8oaaN41cNxgH72DjoQR2r5o+PP7QMfi79oOH4jeCJ77TJLVLZraS4QJKkka4YEAsCp5BBy GUkEYJFe7x/tXfBL47aLYR/F/wAIvZa7bRhXvLeF5ISe/lSRt5qqx52EEDgbmxmgDjfEv/BQvxT4 z8M6zoLeDdJSHUbKe2le3klLojRsGcc/wjJ5445ru7EFv+CYfAz8kv8A6dHrm/G37S3wR8E/D7xP 4V+GHgqU3Otabcaa+qmEQYWWMplpJN0rhc52kAEjqM5rA/Zh/au8N+C/h3e/Df4j2E9/4VlZxbyw RbwkcjFpIpFBBKliW4yfmYdMUAcr+w78ItG+LPxiK+IbdL/StHtTftYyjMdxIGVUVx/EgLbivQ7Q CCCQfZPjL+33rXw/8eav4U8D+GNJtdN0O4fTWl1OJ3aR4j5bFEidQiAqQvLZABOM7Rz93+078J/g 74y8MXnwj8NyR2MDzx62z2ux7y2lCYRZZCZNyNGGAOAOgPzNXX+Jvjl+ypqWpt40u/C51vxHORLN YDTHJkkb7xkSQrA55JJJOcZ5NAGx+2F4lvPGn7GPg3X9QSNL/VW0y+nWFSqB5IGdtoJJAy3HJrzj 4Rft53/w98PWvgv4i+Fp9YTSc2LXACpdRpGNgilhcAM6Y2kkgnHzZOSav7TH7XfhH42fBfT/AA7p WmX+l6wlzbXUtu8aG3i2o2+NHBBbaWwDtXIGcDpXX3/7SH7OHxyWK8+Ivg+40jWljXzbhoXdnIAG 0T25EjgADG5V9gOaANjx/wDDj4RftNfAPXfHvgTRk8N6to0c8m+CzW1YyxJ5jQTonyPuVlIdSSuV +bAZD+fFfX/xb/aw8C+Hvhbe/Dn4NaDJpml6gJYr3UbiPYDG4AcIrEuzOCQXfG0AYBz8vyBTQBRR RTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAryHxd/yMd9/v8A9K9erx7xRIJfEF8ynI8w 81LGjKr9Wv8Agj5/ySPx1/2HE/8ASdK/KWv1a/4I+f8AJI/HX/YcT/0nSkNn35RRRQSFfI//AAVI /wCTTNT/AOwrZf8Aow19cV8j/wDBUj/k0zU/+wrZf+jDQB+MNb3gvxZceDdcivocvF9yeHPEiHqP r3B9RWDX098MFU+AtGO0Z8k9v9o15uPxEaFL3o8yeh95wfk9bOMwaoV/ZTprnUrc2qaW113/AELO sabp3xF8JGNJBJbXUYkgmAyUbs31B4I+or5m1rR7rQNTnsL2MxXELbWHY+hHqCORX10BjpRXzOEx 8sJeKV4vpf8A4B+88ScH0uIvZVZ1eSrFWclG6kvTmVtdVq7Xa1PjjGafEzxSJIgO5SGBx3FfYlFe j/bX/Tv8f+AfErwss7/Xf/Kf/wBuNjkEsaOv3WAIr5J1LT5l1a8gjhkcpM6gKpPRiK+uKK8rB4x4 Nyaje/mfoHE/C64lhRjKtyezv9m97281bbzPnjwH8J9T12/hn1G3lsNMU5cygo8o/uqOvPr6etfQ yIsaKiKFRRgKBgAUtcT468apaE6HplwraxcAqzq3/Hsndj/tY6Dr3+tVKtbMqqil/wADzMcFl+V8 D5dUrSl5uTteTW0UvyXq2+pzk14NY8Ta1qKHdC0otYT2KxjBI9ixap6gsrSOwtIreEbY41CqKnr7 ilTVKCguisfynjsXPH4qriqnxTk5P5u4UUUVqcQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFdV8K9c0Lwx8RNA1jxLZ3OoaLYXS3U9raKjPKU+ZFw5ClSwXIPUZrlaKAPcv2sv2iYP2 hfGWlXmmW17YaHpln5NvaXuzcJWbMr4UkDcBGOv8Arw2iigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIL 66Sys5p3IVY1LEmvFLiUzzySnq7FvzNd18QfECrGNNgfLHmYg9PRa4GpZSCv1a/4I+f8kj8df9hx P/SdK/KWv1a/4I+f8kj8df8AYcT/ANJ0pAz78ooooJCvkf8A4Kkf8mman/2FbL/0Ya+uK+R/+CpH /Jpmp/8AYVsv/RhoA/GGvRfDvxnv/DmiWmmxadbyx267Q7s2TyT/AFrzqisKtCnXXLUV0exl2aYz Kajq4Ko4Sas2rbb9U+x6t/w0Fqf/AEC7T/vpv8ab/wANA6r/ANAyz/76f/GvK6K5f7Pwv8n5nv8A +uef/wDQU/uj/kepn9oHVv8AoGWX5v8A40f8NA6v/wBA2y/8f/xryyin/Z+F/kF/rln/AP0FS+5f 5HqX/DQGsf8AQOsf/H//AIqmP8f9cI+Sw09T7q5/9mrzCij6hhv5ES+MM+f/ADFS/D/I7LWfi54m 1mNozfCzibqtovln/vr7361yUVzLDcLOkjLMrbg4POfWoqK66dKnSVqcUj53GZhi8wnz4urKb/vN u3p2+R2um/EmWGIJe2/nED78ZwT9RV3/AIWba/8APlN/30K89ora559j0L/hZtr/AM+U3/fQo/4W ba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/ 4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQ o/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8A fQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U 3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5 Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/ AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZt r/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/h Ztr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L /hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj 0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oou Fj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89o ouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K8 9oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30 K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/ 30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/Pl N/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8A PlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2 v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWb a/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP +Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/ AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/ 30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf9 9Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8A PlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z 5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWb a/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZ tr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/ AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0 L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouF j0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oo uFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89 oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K 89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/3 0K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/ AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba/wDP lN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4Wba/8 +U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/4Wba /wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQo/4W ba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8AfQo/ 4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U3/fQ o/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5Tf8A fQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/AM+U 3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZtr/z5 Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/hZtr/ AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L/hZt r/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj0L/h Ztr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oouFj0L /hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89oouFj 0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cj/AIWba/8APlN/30K89oou Fj0L/hZtr/z5Tf8AfQo/4Wba/wDPlN/30K89oouFj0L/AIWba/8APlN/30KP+Fm2v/PlN/30K89o ouFj0L/hZtr/AM+U3/fQo/4Wba/8+U3/AH0K89oouFj0L/hZtr/z5Tf99Cs/VviNPcxGOyh+zZHM jHLD6VxtFFwsKzF2LMSzE5JPU0lFFIYV+rX/AAR8/wCSR+Ov+w4n/pOlflLX6tf8EfP+SR+Ov+w4 n/pOlAmfflFFFBIV8j/8FSP+TTNT/wCwrZf+jDX1xXyP/wAFSP8Ak0zU/wDsK2X/AKMNAH4w1oW3 h7VbyFZrfTLyeF+VkjgdlP0IFZ9fTnwq/wCSf6P/ANc2/wDQ2rzsdinhKamle7sfb8KcP0+IsZPD VKjgox5rpX6pfqfPA8J62f8AmDah/wCAr/4Uv/CI66f+YLqH/gLJ/hX1lRXi/wBsz/kX3n6p/wAQ uwv/AEFS/wDAV/mfJ3/CH68f+YJqP/gJJ/hS/wDCG6+f+YHqX/gJJ/hX1hRR/bNT+RD/AOIX4T/o Jl9yPlD/AIQzxB/0AtT/APAOT/Cj/hC/EP8A0AtT/wDAOT/Cvq+il/bNT+RD/wCIX4P/AKCZfcj5 R/4QnxCf+YFqX/gJJ/hSjwR4iP8AzAtR/wDAV/8ACvq2ij+2an8iH/xC/Bf9BMvuR8fXtjc6bdPb XcEltcJjdFKpVlyMjIPsQagrsvjB/wAlF1b/ALY/+iUrja+mozdSnGb6pM/BcywscDjq+Fi7qnOU b9+VtfoFFFFbHnBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFek/s3/D/S/ip8 dPBfhLWzONJ1fUFtrn7M4STYQT8rEHB49K/T+X/glV8DlwhuPEsbvwv/ABM48n6ZioFc/Heivvn9 q7/gmMfhR4K1Lxn8PNavtc0vS4muL/SdUVGuo4FGXljkRVVwoySpUEKCcnpXwNQAUUV+ov7b37MH ws+G/wCydeeJ/DPgyw0jXkfTwt9AZN43yIH6sRyCe1AH5dUUV+on7JH7MHws8efsW2Xi7X/Blhqf iR7TVJG1GYyeYWjnnWM8MB8oRR07UAfl3RRRQMKKKKACiiigAoorqPhp8NPEXxf8a6f4S8J2A1PX 9Q8w29qZ44Q/lxtI/wA8jKowiMeT2x1oA5eiv03+C3/BL3Qrb4QX2ofFi1vbbxkpuJ0t9M1JTFDC qDy1baCpbIYnBIwRX5/fBDwhYfEH4y+BvDGq+aNM1nW7PT7ryH2yeVLMiNtODg4Y4OKBHE0V+xbf 8EqPggvWTxKPrqaf/Gq8o/an/wCCevwn+D/wB8YeMPD8muNrGlW8UluLq/WSPLTRodyhBnhj3oC5 +ZdFFfZX7A37Fnhb9pzTvEOveK9Y1K2sNIu47VdO03ZG0zMm/c0rBsDtgKD/ALVAHxrRX7FXH/BN z9nTxXZXml6Ibu21K3XbLc6brhnngboC6OXUc9ior84fjT+yp4q+FP7QMfwrs0bxBqWoSRHR5oE2 fbYZSRG5BPyYKuGycKUY5wM0Bc8Tor9XPhl/wSy+GfgjwvDqHxR1241nUyim58q8+w6fAx/hVuHb B43Fhn+6K+Z/+Ch37Nnw9+AV54Buvh6lxHY+IIr1pVe9N1EfKMGwxscnnzWz8x6Dp3AufHdFfpL+ zX/wS00vUvCNn4o+L2o31pPdQi5Tw/ZSC3+zRkZH2iUgndjkqu3b3YnIGX+23+x98Gvhd8A5vGvw 8SVb621G3tDJBqrXcDhyQwbcW5HHQigLn53UV+rXwZ/4JpfB7x38HfAvibVH8QjUdZ0Gw1G68nUF WPzZrdJH2jyzgbmOBmuw/wCHVfwO/wCe3iT/AMGif/G6AufjrRWl4ksItK8RapZQbvJtrqWFNxyd quQMn6CvoT9gf9n3wp+0f8XNa8OeMGvl0200OXUIzYTiF/NW4gjGSVPG2VuMelAHzTRX7Ff8Oq/g d/z28Sf+DRP/AI3Xl37UX/BO/wCFHwh+AXjHxhoL68dX0q2Sa3+1X6yRbjKiHcojGeGPegLn5jUV 6d+zv8AfEX7R3xIsvCmgRmKM4mv9RdCYrG3BG6VvU9lX+JiBxyR9f/tq/sH/AA2/Z7+Ak3ivw1Nr U2sw3tta77+7WSNlckMSoQc8etAH55UVteDPBus/ELxVpnhzw9YS6nrOpTLb21rCPmdj+gAGSSeA AScAV+k3iP8A4Jh/D/4efs7+Idd1vUdW1Lxro/h681Ga4tbpY7Q3UcDyBVQpkoGAHJywGeM4AB+X 9FOjjaWRURS7sQqqoyST0AFfpr+zb/wSy0DWPhtaav8AFeTVrbxHqOJ00uwuFg+wwkfKkmUYmQ9W HG3heoNAH5kUV0XxG0K28LfELxPo1lv+x6dql1ZweY25vLjlZFye5wBXO0DCiiigAr9Wv+CPn/JI /HX/AGHE/wDSdK/KWv1a/wCCPn/JI/HX/YcT/wBJ0oEz78ooooJCvkf/AIKkf8mman/2FbL/ANGG vrivkf8A4Kkf8mman/2FbL/0YaAPxhrs9D+LOu+HtKt9OtDbfZ4AQm+LJ5JPJz71xlFZVKUKqtUV 0elgswxeXVHVwlRwk1a6dtO34HoJ+OXib+9af9+P/r0n/C8PE/8Aftf+/H/168/orn+pYb/n2vuP Y/1ozv8A6C5/+BM7/wD4Xf4n/wCetr/34H+NJ/wu7xR/z2tv+/ArgaKf1PD/APPtfcL/AFnzv/oL n/4Ezvf+F2+KP+e9v/34FWNN+OXiCC+ge8MNzahv3kSxBSy98EdDXnVFJ4LDtW5F9xUOKM7hJSWL np3k2vu2Z9cW9+niDQ1utMugi3MW6GcKG2ntlT6Hgj614hrvxO8a+HdVuNPvbiGOeFsHFuuGHZgc cgitb4C+J2S5utCmfMbqbi3yejD7yj6jB/A+tdT8YPBK+I9DbULaPOo2KlxgcyR9WX8Oo/Ed6+dp wp4TFOhWinF7N/h/wT9tx2KxvEeQQzXK60qdaCfNGMmk7fErJ79Y9bO3p4NrmtXfiLVJtQvnEl1N t3sqhQcKFHA9gKoUUV9ckopRWyP5uq1Z1pyq1HeUm22923u36hRRRTMwooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA oorZ0/wX4g1e2W4sdC1O9t26S29nJIh+hAIoAxqK6L/hXHiz/oV9a/8ABfN/8TR/wrjxZ/0K+tf+ C+b/AOJoA52iui/4Vx4s/wChX1r/AMF83/xNZmq6BqegyImp6dd6c7jKrdwNEW+gYCgChRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA 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 EMbxiK8sjPbyIu0M0yhWCIWYD5hjr2BIzP2j/g/N+0d8LtA8PaB4jSy8JXeo2NxqSabsZdR00OpK RSglVAG2QEAg7AKAPzj/AGAP2LZfj14jTxl4ttHT4faVPxDICP7VnU/6pf8Apkp++3f7o5LFf0a/ bLW3T9kb4jraCNbUaIwiEONgTK7duOMYxjFdf4v+FFxL8H38A+ANZT4dQLarYW19Z2fnvaQYwwiX emHIz+8JJBJP3uRla78BE1z9mWP4QNrjxRr4ft9B/tj7NuYiKJI/N8rf1OzO3dxnrQB+AtFdn8Zv h6vwm+Kvirwcl8dTXRNQlsheNF5Rm2HG7Zk7c+mTXGUFBRRRQAV+rX/BHz/kkfjr/sOJ/wCk6V+U tfq1/wAEfP8Akkfjr/sOJ/6TpQJn35RRRQSFfI//AAVI/wCTTNT/AOwrZf8Aow19cV8j/wDBUj/k 0zU/+wrZf+jDQB+MNFFFBYUUUUAb+m+O9b0i2EFtehYwoQF4kdgo6Dcyk4HYdB2rP1bXtR16VZNQ vJrtl+6JGyqeyr0X8BVCigQUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooA+sP8AgmF/ydxoP/YPvv8A0Q1fff7WX7Cdn+1T470TxFd+MZ/Dsem6eLA2sGni cyjzXfdvMi7fv4xtPSvxs8J+Mte8B61Hq/hvWb/QdVjVkS9025eCZVYYYB1IIBHBrt5f2o/jHOhR /ir4z2nqBr10P5PQI/Wrw54Z+D3/AATm+EWo3MmoPE90fOmnvJVfUdXnVTsjjQYyBkgKAFXcSx5Z q439gn9r+2/aCi8X+H/FF1DaeK5dTudQs7B5OJbGXBEUROCxiwVI67dp9cfkRrviHVfFGoPf6zqd 5q184w1zfXDzSsPdmJJqtYX9zpd7BeWVxLaXcDiSKeBykkbDkMrDkEeooCx+p2q/8Ew/E1x4xnls Pjhrln4XeYvHbSrNLdxR5yI9/nBWIHG/A9dtfQHwN+DWg/BD4r63oehX+ragsnh2xmuJ9Y1GS7mk k8+4Xf8AMcJuCjIUKOOlfkWv7YXxtTS/7PHxQ8TfZ9u3cdQcy4/66/fz77q5Dw78ZvH3hHVdS1PR PGviDSdS1Mqb68s9TmjmuiudvmOGy+MnGSepoFY+j/jT/wApP4f+x20f/wBDta/RL9on/kt37PH/ AGMt5/6b5q/Ee+8beIdU8WDxRea5qF14kFwl0NXmuXa685MbJPNJ3bl2rg5yMD0rptT/AGhPifrV /pl9qHxD8T3t5pkrT2NxcavO8lrIylS8bFsoSpIyOxIoHY/Yn9oD9nrwZ+0T8U9F0fxdHdeZZeH7 u40+5sbtoJ7aUzwr5qYOGI4+8GHTis74Hfs6fGL4SePrWTU/jjeeMfAcAcNpGrWRluZlKEIvmu7M m1ipyrc7cbQDx+PWu/Gr4geJ9Y03VtX8b+IdS1XTN32G+utUmee13Y3eW5bcmcDOCOldXdftf/Gu 90ltOm+J/iVrVl2Ni/dZCPeQfOfzoFY/Zq1/aZ8D3Hx+vfhN/bNuPEUNjFcIvmDY85Z/Mtg2f9aq CN9nXDHupr5s+JP/AATa8SeKPiNqer+HvjLq+g+HtQunuv7OmWaaS03sWaONhMoZQSduQCBgHOMn 8n/tc/2r7V50n2nf5nnbzv35zuz1znnNes6d+198atK0safbfE7xKtqq7FD37yOo9A7ZYfgaAsfZ fx//AGTPBXgT4s/s7eDLq91vxTaeINVubbWX1nVp5Hu1XyMEBWAi++4/d4OMZJIzWH/wUZ/ZO+Fv wE+EPh7W/A3hltF1O712OymnOoXVxuhNvO5XbLIwHzIpyBnjrXwjJ8QfFE3iyLxRJ4j1WXxLFIJo 9YkvZGu0cdGEpbcCPXNaXjT4zePviPpsOn+K/GmveJLGGUTx22q6jNcxpIAVDhXYgNhmGfQmgZxt fSv7IH7F1z+1lZeKLi38WReGRoclvGVksDc+d5okORiRNuPL985r5qrq/BHxY8a/DSO8Twl4t1rw yl4Va5XSb+W2ExXO0vsYbsbmxnpk0AfuR+1H8A5f2jPg5deBodaTQZJri3n+2vbGcDy23Y2Bl6/W vhb9nz/gnp4N8Y+MvjP4D8WatfXuq+FLmwtrHW9NP2cqZoXkZjCxdSOFGDngHBGePkf/AIao+Mv/ AEVXxl/4Pbn/AOLrmLf4seNbTxhP4rg8Xa3B4nuCDNrEeoSrdy4AA3ShtzcADk9AKAP0+/Z7/wCC YVv8FvjPpPjXUPHP/CQWejSNPZWMenfZ3eUqVRpG8xsBc5wByQOQMg+Ef8FWfjnpnjP4k+HPBegX 63R8LRXDajcWsmVFzMYwYcjqUWIZx0LkHlSB83az+2D8atf0eTS734l+IZLKRdjrHdmJnXoQXTDE HuCea8fZizEkkk8knvQBaTVr6N1dLy4R1OQyysCD69a7r/ho74s/9FQ8Z/8AhQXf/wAcrzqigZ+2 H7EvizXPE/7Eul61rOs6hq2svb6oW1G+unmuGK3E4QmRiW4AAHPGBXmn/BLn9oub4ieEPEPgrxV4 gutW8XWV42oW82q3bT3F1aOiKQGclm8tlOeeBInpX5p+Hfjp8RvCPh1NA0Px34j0fQ0Dqum2OqTQ 26hyS4EasF+YsxPHOTXKaLreo+G9VttT0m/udL1K1fzILyzmaKaJv7yupBU+4NArH7D/ALMv/BP6 y/Z2+N+u+Ol8RLqtg0U9vo+ni2Mb2qSuCTI+4hiqDYMAA7ieOlfGn7d37XXiPxL+0Hqlr8PvHWt6 V4b0W3j0tW0PVZre3upkLNLKBG4DfO5Td3EYwcYrw7xL+1j8YvGGgyaLq/xG1+70yVPLlg+1lPNQ 8FXK4Lg9wxOe9eTUBY+9P+CZ3xf8d+N/2k203xH428Ra/p39i3Uv2TVNVnuYt4aLDbHcjIyecd6s f8FQtS8X+JP2kvD3gHRtT1W4sNX0iwWLQIbuQW1xdPdTqjGHOwuSEG4jPA54r4f8IeOPEXw+1f8A tXwxrmo+HtT8toftmmXT28uw4yu5CDg4HHtWlqPxe8cax4vsvFV94v1y88TWKCO11ifUJXu4FG7A SUtuUDe3Q/xH1oA/YLxXqGkfsAfsYJbWLwyavp9oLS1fH/H7q04JaTB6gPvkwf4I8dhX4r3V/c31 9Ne3E8k15NIZpJ3Yl3cnJYnqSSc5rp/G3xf8dfEm0trXxZ4x13xLbWzmWGHVtRluUjcjBZQ7EA44 yK5CgCz/AGnef8/c/wD38P8AjX0P+x3+ygv7WuqeLbObxTN4du9GtYJ4Zza/aRIzswwwLqQBt7Hv XzfXXfDr4t+MvhHqVxf+DfEuo+HLq4QRztYzFBMoOQHXo2CTjIOMmgD9df2av2N7X9mO/vvGvjX4 h3Him8srSRIJ79mt7HTISP3kgEkjfMVGNxKgKWGOc18KfHrxddft7ftk6ZonhJpG0V3j0bTbhkOF tIyzz3TL2HMsnODtCg88V4P8Qv2gfiT8VrQWfi3xtrWu2IYN9jubtvs+4dG8oYTI9cZrm/B/jnxF 8PdWOq+GNd1Hw9qZjaE3mmXL28uwkEruQg4OBx7UAfrp+3N8UdM/ZY/ZZsvA/hQjT9Q1a1GgaVFG 2HgtUQLPNnrkIQu7rvlDetfnN+xD8VtK+Df7S/hHxDrsy22is8tjd3L/AHYFmiaMSE9lVmUsf7oN eV+NfiR4s+JN3b3XizxLq3iW5tozFDNq17JctEhOSqlycDPOBXOUAfsv+23+xNd/tYah4X8ReG/E llpeo2Fs1q4vVZ7e4t2beroyZIYEt2IYMORjnY+KfiPSf2Jv2Lk8Pza+0+tWmjSaPpEyt5U91eyI w8yNQcqqM5fg/KqjnOM/lB4D/ag+LHwy0hNK8M+Pta0vS4xiOyW5MkMQ9ER9wT/gIFcj44+Inif4 l6ydW8V6/qPiHUcbRcajctMyr/dXcflX2GBQFjo/+Gjviz/0VDxn/wCFBd//AByv1r8Z+LNctv8A gnHb+IodZ1CLxAfAdhdnVkunF2ZmtoS0vmg7t5JJLZySTX4n13Nx8dPiNd+Ex4Xn8d+I5vDYtlsh pD6pMbUQKAqxeVu27AAAFxgACgDktX1i/wDEGp3Opape3OpajdOZZ7u7laWWVz1Z3YksT6k1Tooo GFFFFABX6tf8EfP+SR+Ov+w4n/pOlflLX6tf8EfP+SR+Ov8AsOJ/6TpQJn35RRRQSFfI/wDwVI/5 NM1P/sK2X/ow19cV8j/8FSP+TTNT/wCwrZf+jDQB+MNFFFBYUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAV+rX/BHz/kkfjr/sOJ/6TpX5S1+rX/BHz/kkfjr/ALDif+k6UCZ9+UUUUEn/ 2Q== ------=SPLITOR00A_001_21169359D-- From bpm@sgi.com Mon Jan 21 16:52:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B99387F3F for ; Mon, 21 Jan 2013 16:52:57 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11A1EAC006; Mon, 21 Jan 2013 14:52:54 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B83CF4266DC; Mon, 21 Jan 2013 16:52:53 -0600 (CST) Date: Mon, 21 Jan 2013 16:52:53 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 2/2 V3] xfstests: test EROFS vs. EEXIST when creating on an RO filesystem Message-ID: <20130121225253.GO27055@sgi.com> References: <50B52DB7.3030506@redhat.com> <50ED9726.4030008@sandeen.net> <50ED9837.8040301@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50ED9837.8040301@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Wed, Jan 09, 2013 at 10:17:59AM -0600, Eric Sandeen wrote: > TBH, I don't know if this is posix-specified, but I found out the > hard way that when trying to re-create existing files on a readonly > filesystem, some apps expect/handle EEXIST, but fail on EROFS. > > This will test mkdir, mknod, and symlinks for that behavior. > > Signed-off-by: Eric Sandeen > --- > > V2: Change test dir var name, do scratch mkfs, drop _fail > V3: Use common _filter_ln ... > diff --git a/293 b/293 > new file mode 100755 > index 0000000..9013f9a > --- /dev/null > +++ b/293 > @@ -0,0 +1,73 @@ ... > +_create_files() > +{ > + mknod $THIS_TEST_DIR/testnode c 1 3 > + mkdir $THIS_TEST_DIR/testdir > + touch $THIS_TEST_DIR/testtarget > + ln -s $THIS_TEST_DIR/testtarget $THIS_TEST_DIR/testlink | _filter_ln ^ Added 2>&1 Applied this as test 294 and the ln filter patch, with one minor change as above. Thanks, Ben From bpm@sgi.com Mon Jan 21 17:04:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 66F127F3F for ; Mon, 21 Jan 2013 17:04:33 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 40CA08F8033; Mon, 21 Jan 2013 15:04:30 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1CE774266DC; Mon, 21 Jan 2013 17:04:30 -0600 (CST) Date: Mon, 21 Jan 2013 17:04:30 -0600 From: Ben Myers To: Liu Bo Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: fix 284 ENOENT error Message-ID: <20130121230430.GP27055@sgi.com> References: <1357482638-27129-1-git-send-email-liub.liubo@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357482638-27129-1-git-send-email-liub.liubo@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Liu, On Sun, Jan 06, 2013 at 10:30:38PM +0800, Liu Bo wrote: > 284 misses a 'mkdir' operation. > > Signed-off-by: Liu Bo Reviewed-by: Ben Myers Applied to git://oss.sgi.com/xfs/cmds/xfstests.git Regards, Ben From david@fromorbit.com Mon Jan 21 17:21:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 174B77F3F for ; Mon, 21 Jan 2013 17:21:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 690D9AC002 for ; Mon, 21 Jan 2013 15:21:25 -0800 (PST) X-ASG-Debug-ID: 1358810483-04bdf0231e5b070001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FO8APxM7UWLHimwc for ; Mon, 21 Jan 2013 15:21:24 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AioOAGXK/VB5LKUj/2dsb2JhbABEhVyyQIYTF3OCHgEBBTocFgoDEAgDDgoJJQ8FJQMhE4gYrQePHhWMYRuEKAOWC5BKgwmBWw Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Jan 2013 09:51:22 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxQg5-0002eD-82; Tue, 22 Jan 2013 10:21:21 +1100 Date: Tue, 22 Jan 2013 10:21:21 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Johannes Weiner Subject: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers Message-ID: <20130121232121.GG2498@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <50FD6815.90900@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FD6815.90900@parallels.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358810483 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Mon, Jan 21, 2013 at 08:08:53PM +0400, Glauber Costa wrote: > On 11/28/2012 03:14 AM, Dave Chinner wrote: > > [PATCH 09/19] list_lru: per-node list infrastructure > > > > This makes the generic LRU list much more scalable by changing it to > > a {list,lock,count} tuple per node. There are no external API > > changes to this changeover, so is transparent to current users. > > > > [PATCH 10/19] shrinker: add node awareness > > [PATCH 11/19] fs: convert inode and dentry shrinking to be node > > > > Adds a nodemask to the struct shrink_control for callers of > > shrink_slab to set appropriately for their reclaim context. This > > nodemask is then passed by the inode and dentry cache reclaim code > > to the generic LRU list code to implement node aware shrinking. > > I have a follow up question that popped up from a discussion between me > and my very American friend Johnny Wheeler, also known as Johannes > Weiner (CC'd). I actually remember we discussing this, but don't fully > remember the outcome. And since I can't find it anywhere, it must have > been in a media other than e-mail. So I thought it would do no harm in > at least documenting it... > > Why are we doing this per-node, instead of per-zone? > > It seems to me that the goal is to collapse all zones of a node into a > single list, but since the number of zones is not terribly larger than > the number of nodes, and zones is where the pressure comes from, what do > we really gain from this? The number is quite a bit higher - there are platforms with 5 zones to a node. The reality is, though, for most platforms slab allocations come from a single zone - they never come from ZONE_DMA, ZONE_HIGHMEM or ZONE_MOVEABLE, so there is there is no good reason for having cache LRUs for these zones. So, two zones at most. And then there's the complexity issue - it's simple/trivial to user per node lists, node masks, etc. It's an obvious abstraction that everyone understands, is simle to understand, acheives exactly the purpose that is needed and is not tied to the /current/ implementation of the current VM memory management code. I don't see any good reason for tying LRUs to MM zones. the original implementation of the per-node shrinkers by Nick Piggin did this: the LRUs for the dentry and inode caches were embedded in the struct zone, and it wasn't generically extensible because of that. i.e. node-aware shrinkers were directly influenced by the zone infrastructure and so the internal implementation of the mm subsystem started leaking out and determining how completely unrelated subsystems need to implement their own cache management..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Mon Jan 21 21:03:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7F3997F3F for ; Mon, 21 Jan 2013 21:03:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7124B304039 for ; Mon, 21 Jan 2013 19:03:05 -0800 (PST) X-ASG-Debug-ID: 1358823781-04cbb00c65600b0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id LXOHOiEBgxylCEUc for ; Mon, 21 Jan 2013 19:03:01 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 5B0066C132; Mon, 21 Jan 2013 21:03:01 -0600 (CST) Message-ID: <50FE0162.2030108@hardwarefreak.com> Date: Mon, 21 Jan 2013 21:02:58 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Linda Walsh CC: xfs-oss Subject: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... References: <50FAF860.3000702@tlinx.org> <20130119231644.GX2498@dastard> <50FB3265.8060506@tlinx.org> <20130120004638.GZ2498@dastard> <50FBB9D4.9060109@hardwarefreak.com> <50FCB3B8.5000404@tlinx.org> <50FD44C1.7040301@hardwarefreak.com> <50FD76F5.20203@tlinx.org> X-ASG-Orig-Subj: Re: RAID setups, usage, Q's' effect of spindle groups...etc...blah blahblah... In-Reply-To: <50FD76F5.20203@tlinx.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1358823781 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 1/21/2013 11:12 AM, Linda Walsh wrote: > >> If nothing else I hopefully got the point across as to how destructive >> parity RAID read-modify-write operations are to performance. It's >> simply impossible to get good mixed IO performance from parity RAID >> unless one's workloads always fit in controller write cache, or if one >> has SSD storage. >> > > ---- > Will have to reread it a few times to digest everything (but it is > sufficiently > depressing...)... Depressing? If someone explained to me how I could get a 2x-50x increase in performance just by rearranging what I already had, I'd say that's exciting, not depressing. If 24TB net isn't sufficient for a 1 person home office/media setup then you must be doing something unique. > Especially the costs on the enclosures...I am pretty sure I paid under > 1k for > each of them....*ouch*... Keep in mind that big Norco is 24 bays for ~$1400. So it's still considerably less per bay than the two 630Js you bought, not even taking the devalued dollar into account. Note the small cost difference between the 12 and 24 bay Norcos is due to the SAS expander module being ~$700 of the unit price. The 24 has a little more sheet metal, 3 more backplane PCBs, 12 carriers, and a slightly larger PSU-- all low cost items, $230 retail cost. Maybe worth pondering: for ~$3900 one can acquire that Norco chassis filled with 24x 1TB SATA 7.2K UltraStars. Performance would be the same as I described for your current 24 drives in RAID10. You'd have 12TB net. Simply jack it into the spare port on your 9280 or daisy chain it off a 630J. You'd then use it for everything but say your media files. For those you'd reconfigure your current 24x 2TB drives into a concat of two 12 drive RAID6 arrays. This would yield 40TB net for media, and since it's a primarily single streaming workload 10 effective RAID6 spindles would yield great performance, maximum space, with dual parity reliability. $3900 is a decent chunk to part with in one shot. But with the resulting high performance 12TB space for work and 40TB for play, I'd think you'd thrive for many, many years without needing to worry about storage performance or space. A trap many/most home users fall into is buying such a chassis and 4 drives in RAID5, then adding sets of 4 drives in RAID5 as "budget permits", and ending up with 6 separate arrays thus 6 different data silos each of low performance. This may be better/easier on the wallet for those who can't/don't plan and save, but in the end they end up with 1/6th of their spindle performance for any given workload, and a difficult migration path to get the actual performance the drives are capable of. Which is obviously why I recommend acquiring the end game solution in one shot and configuring for maximum performance from day one. -- Stan From jeff.liu@oracle.com Mon Jan 21 21:28:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AFC5B7F3F for ; Mon, 21 Jan 2013 21:28:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 75FDC8F8037 for ; Mon, 21 Jan 2013 19:28:13 -0800 (PST) X-ASG-Debug-ID: 1358825291-04bdf0231d65a30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id C2kK4qVdMeSoe8En (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 21 Jan 2013 19:28:11 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0M3S3ZS015950 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 03:28:03 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0M3S1ws019918 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 03:28:02 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0M3S1aO024816; Mon, 21 Jan 2013 21:28:01 -0600 Received: from [192.168.1.102] (/123.119.101.204) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Jan 2013 19:28:00 -0800 Message-ID: <50FE073A.3090502@oracle.com> Date: Tue, 22 Jan 2013 11:27:54 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <50EEC68F.6070309@oracle.com> <50FAEF3F.7090607@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v2 02/12] xfs: make use of xfs_calc_buf_res() in xfs_trans.c In-Reply-To: <50FAEF3F.7090607@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1358825291 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.2.120540 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Mark and Dave, Thanks for your review and sorry for my late response! On 01/20/2013 03:08 AM, Mark Tinguely wrote: > On 01/10/13 07:47, Jeff Liu wrote: >> Start to make use of the new helper to figure out space log reservations for those >> transactions which are pre-calculated at mount time in xfs_trans.c. >> >> Signed-off-by: Jie Liu >> --- >> fs/xfs/xfs_trans.c | 244 ++++++++++++++++++++++++---------------------------- >> 1 file changed, 113 insertions(+), 131 deletions(-) >> > > Wow! Reading this patch makes me appreciate the work you did here and > gets my eyes in shape for Dave's UBER user sync patch. > > A question for you, or anyone. When these reservations are made, the > comments talk about specify number of agf/agfl (usually 2 or 3) that > will be dirty in the command. > > There are other comments that seem to imply an agf/agfl is reserved for > all AGs and then use the multiplier of 4. Is a specific number of AGs > can be involved in the operation or does it want something like sb_agcount? With Dave's comments in another email for this question: """ Do you mean comments like this about xfs_calc_itruncate_reservation()? * And the bmap_finish transaction can free the blocks and bmap * blocks: * the agf for each of the ags: 4 * sector size * the agfl for each of the ags: 4 * sector size This assumes the transaction can free 4 extents before a commit, and all 4 extents can be in a different AG. You'll find all the other cases documented like this indicate how many extents can be freed or allocated in a single transaction.... """ Does it sounds make sense if we improve those comments(anything might confuse the reader) with more detailed info like above? > I think there a couple error (may be more): > >> /* >> @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( >> struct xfs_mount *mp) >> { >> return XFS_DQUOT_LOGRES(mp) + >> - MAX((mp->m_sb.sb_inodesize + >> - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + >> - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), >> - (4 * mp->m_sb.sb_sectsize + >> - 4 * mp->m_sb.sb_sectsize + >> - mp->m_sb.sb_sectsize + >> - XFS_ALLOCFREE_LOG_RES(mp, 4) + >> - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + >> - 128 * 5 + >> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); >> + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >> + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, >> + XFS_FSB_TO_B(mp, 1))), >> + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), >> + XFS_FSB_TO_B(mp, 1)) + >> + xfs_calc_buf_res(5, 0) + >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >> + XFS_FSB_TO_B(mp, 1)) + >> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >> + mp->m_in_maxlevels, >> + XFS_FSB_TO_B(mp, 1)))); > ^^^^^^^^^^^^^^ > I think this should be 0. In the > original code, I see the headers being > reserved but not the data. Yep, will fix it. > > > > /* > > @@ -298,18 +287,18 @@ xfs_calc_create_reservation( > > struct xfs_mount *mp) > > { > > return XFS_DQUOT_LOGRES(mp) + > > - MAX((mp->m_sb.sb_inodesize + > > - mp->m_sb.sb_inodesize + > > - mp->m_sb.sb_sectsize + > > - XFS_FSB_TO_B(mp, 1) + > > - XFS_DIROP_LOG_RES(mp) + > > - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), > > - (3 * mp->m_sb.sb_sectsize + > > - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + > > - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + > > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > > + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + > > + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + > > + xfs_calc_buf_res(0, XFS_FSB_TO_B(mp, 1)) + > ^^^^ > 0 * (128+XFS_FSB_TO_B(mp, 1))? > from the header counts, it appears you meant > no headers, so it would be just: > XFS_FSB_TO_B(mp, 1) + Ah, You're right. > > > + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), > > + XFS_FSB_TO_B(mp, 1))), > > + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + > > + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), > > + XFS_FSB_TO_B(mp, 1)) + > > + xfs_calc_buf_res(mp->m_in_maxlevels, > > + XFS_FSB_TO_B(mp, 1)) + > > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > > + XFS_FSB_TO_B(mp, 1)))); > > } > > > > /* > > @@ -337,16 +326,15 @@ xfs_calc_ifree_reservation( > > struct xfs_mount *mp) > > { > > return XFS_DQUOT_LOGRES(mp) + > > - mp->m_sb.sb_inodesize + > > - mp->m_sb.sb_sectsize + > > - mp->m_sb.sb_sectsize + > > - XFS_FSB_TO_B(mp, 1) + > > - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > > - XFS_INODE_CLUSTER_SIZE(mp)) + > > ^^^ end of MAX() 5th header is > is the single item in MAX > > > - 128 * 5 + > > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > > + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > > + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > > + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + > > + MAX(xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)), > > + XFS_INODE_CLUSTER_SIZE(mp) + > ^^^^^ MAX should end here ^^ Yes. :) > > > + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > > + mp->m_in_maxlevels, 0) + > > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > > + XFS_FSB_TO_B(mp, 1))); > > } > > > >> /* >> @@ -337,16 +326,15 @@ xfs_calc_ifree_reservation( >> struct xfs_mount *mp) >> { >> return XFS_DQUOT_LOGRES(mp) + >> - mp->m_sb.sb_inodesize + >> - mp->m_sb.sb_sectsize + >> - mp->m_sb.sb_sectsize + >> - XFS_FSB_TO_B(mp, 1) + >> - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > ^^^^ > >> - XFS_INODE_CLUSTER_SIZE(mp)) + >> - 128 * 5 + ^^^^^^^^^ I have not idea why we have to log 5 headers here by looking at the comments of this transaction, I think I must missed something... >> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); >> + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >> + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + >> + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + >> + MAX(xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)), > ^^^ has extra header added it. >> + XFS_INODE_CLUSTER_SIZE(mp) + >> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >> + mp->m_in_maxlevels, 0) + >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >> + XFS_FSB_TO_B(mp, 1))); >> } > >> /* > > I will have to go through this patch again and also test prints before > and after the patch. > > Before the patch: > write 108216 itrnc 219064 renam 305976 link 153144 remov 153144 symlk > 158520 creat 157880 > mkdir 157880 ifree 57912 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > addfk 69560 > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr 4224 > gwrfr 5760 > > > After the patch: > write 108216 itrnc 255928 renam 305976 link 153144 remov 153144 symlk > 158520 creat 153784 > mkdir 153784 ifree 57784 ichng 1592 grwdt 44160 swrit 384 wrtid 384 > addfk 69560 > atriv 174720 attst 22456 attrr 87992 clagi 640 gwall 65024 grezr 4224 > gwrfr 5760 > In previous tests, I have only ran xfstests to make sure nothing was broke. But obviously, I should test it according to yours and combine with Dave's comments(i.e. enlarge the test coverage with different sector size/block size). Thanks, -Jeff From alvin.ong@medinacomtech.com Mon Jan 21 22:22:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5F0597F3F for ; Mon, 21 Jan 2013 22:22:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3260D8F8037 for ; Mon, 21 Jan 2013 20:22:48 -0800 (PST) X-ASG-Debug-ID: 1358828563-04bdf0231b683a0001-NocioJ Received: from mail-pb0-f47.google.com (mail-pb0-f47.google.com [209.85.160.47]) by cuda.sgi.com with ESMTP id D8sAdX753DgaziVw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Jan 2013 20:22:43 -0800 (PST) X-Barracuda-Envelope-From: alvin.ong@medinacomtech.com X-Barracuda-Apparent-Source-IP: 209.85.160.47 Received: by mail-pb0-f47.google.com with SMTP id wz17so3711741pbc.6 for ; Mon, 21 Jan 2013 20:22:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:x-originating-ip:date:message-id:subject :from:to:content-type:x-gm-message-state; bh=pu1wquXR3cXX5/j0kgV8gyav2Iv4Zl2zSOuLE5EW2U0=; b=p3LBTg8GUbDR9fG2hNWUlFEwtyWwO2oMPeeEeep4leegzK2xDT9HoaWqPvkHpDxiVH SZ29XbpiXtTy33qEteL4oChuR2MiHKVCjzQtg2HhtUfSiI3Jiqo7wDEllGDvR/CTSr1B nzuuGDTzlP5zObUFF6Bxd5Fj3HFF1MfEppXBjvaetbItK2KLU1/A+e2pdyI6dFBjyqJw QusvfoF4crxzXa31jSUnvv3OfA/EQsShjtjd2+YcioBJrnKqRxwoPNlZzGLEM2I8d9Pm wZmn4fJPn1710MZ4WXyV1cJKwbzN/lWLTaJkqjPAJvUJv9B/PvXVChxY57+FDgCyk+m5 w7Xw== MIME-Version: 1.0 X-Received: by 10.68.237.135 with SMTP id vc7mr35587807pbc.2.1358828562983; Mon, 21 Jan 2013 20:22:42 -0800 (PST) Received: by 10.66.77.201 with HTTP; Mon, 21 Jan 2013 20:22:42 -0800 (PST) X-Originating-IP: [203.106.136.7] Date: Tue, 22 Jan 2013 12:22:42 +0800 Message-ID: Subject: Need advice on building a new XFS setup for large files From: Alvin Ong X-ASG-Orig-Subj: Need advice on building a new XFS setup for large files To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b339003ceac8e04d3d8ed72 X-Gm-Message-State: ALoCoQmYXbxPeKW2H7XxZDKiFTeaVSRNpqwLPYzcmPe0bqGY47Fy1jHMJGCfINR7BmdXLL6mg8NX X-Barracuda-Connect: mail-pb0-f47.google.com[209.85.160.47] X-Barracuda-Start-Time: 1358828563 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.2.120545 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b339003ceac8e04d3d8ed72 Content-Type: text/plain; charset=ISO-8859-1 Hi, We are building a solution with a web front end for our users to store large files. Large files starting from the size of 500GB and above and can grow up to 1-2TB's per file. This is the reason we are trying out XFS to see if we can get a test system running. We plan to use a 6+2 RAID6 to start off with. Then when it gets filled up to maybe 60-70% we will expand by adding another 6+2 RAID6 to the array. The max we can grow this configuration is up to 252TB usable which should be enough for a year. Our requirements might grow up to 2PB in 2 years time if all goes well. So I have been testing all of this out on a VM running 3 vmdk's and using LVM to create a single logical volume of the 3 disks. I noticed that out of sdb, sdc and sdd, files keep getting written to sdc. This is probably due to our web app creating a single folder and all files are written under that folder. This is the nature of the Allocation Group of XFS? Is there a way to avoid this? As we will have files keep writing to the same disk thus creating a hot spot. Although it might not hurt us that much if we fill up a single RAID6 to 60-70% then adding another RAID6 to the mix. We could go up to a total of 14 RAID6 sets. Is LVM a good choice of doing this configuration? Or do you have a better recommendation? The reason we thought LVM would be good was so that we could easily grow XFS. Here is some info: # xfs_info /xfs meta-data=/dev/mapper/vg_xfs-lv_xfs isize=256 agcount=4, agsize=32768000 blks = sectsz=512 attr=2 data = bsize=4096 blocks=131072000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =external bsize=4096 blocks=65536, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Mount options: /dev/mapper/vg_xfs-lv_xfs on /xfs type xfs (rw,noatime,nodiratime,logdev=/dev/vg_xfs/lv_log_xfs,nobarrier,inode64,logbsize=262144,allocsize=512m) Is I was to use the 8-disk RAID6 array with a 256kB stripe size will have a sunit of 512 and a swidth of (8-2)*512=3072. # mkfs.xfs -d sunit=512,swidth=3072 /dev/mapper/vg_xfs-lv_xfs # mount -o remount,sunit=512,swidth=3072 Correct? What about the logdev option? What is the optimal size to create for it? Hope to get some guidance from you guru's please. Thank you. Alvin --047d7b339003ceac8e04d3d8ed72 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Hi,

    We are building a solution wi= th a web front end for our users to store large files.
    Larg= e files starting from the size of 500GB and above and can grow up to 1-2TB&= #39;s per file.
    This is the reason we are trying out XFS to see if we can get a = test system running.

    We plan to use a = 6+2 RAID6 to start off with. Then when it gets filled up to maybe 60-70% we= will
    expand by adding another 6+2 RAID6 to the array.
    The max we can grow this configuration is up to 252TB usable which should = be enough for a year.
    Our requirements might grow up to 2PB= in 2 years time if all goes well.

    So I have been testing all of this out on a= VM running 3 vmdk's and using LVM to create a single logical volume of= the 3 disks.
    I noticed that out of sdb, sdc and sdd, files= keep getting written to sdc.
    This is probably due to our web app creating a single folder and= all files are written under that folder.
    This is the natur= e of the Allocation Group of XFS? Is there a way to avoid this? As we will = have files keep writing to the same disk thus creating a hot spot.
    Although it might not hurt us that much if we fill up a single R= AID6 to 60-70% then adding another RAID6 to the mix. We could go up to a to= tal of 14 RAID6 sets.

    Is LVM a good ch= oice of doing this configuration? Or do you have a better recommendation?
    The reason we thought LVM would be good was so that we could eas= ily grow XFS.

    Here is some info:
    =

    # xfs_info /xfs
    meta-data=3D= /dev/mapper/vg_xfs-lv_xfs isize=3D256 =A0 =A0agcount=3D4, agsize=3D32768000= blks
    =A0 =A0 =A0 =A0 =A0=3D =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sec= tsz=3D512 =A0 attr=3D2
    data =A0 =A0 =3D =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 bsize=3D4096 =A0 blocks=3D131072000, imaxpct=3D25
    =
    =A0 =A0 =A0 =A0 =A0=3D =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sun= it=3D0 =A0 =A0 =A0swidth=3D0 blks
    naming =A0 =3Dversion 2 =A0 =A0 =A0 =A0 =A0 =A0 =A0bsize=3D4096 =A0 ascii-c= i=3D0
    log =A0 =A0 =A0=3Dexternal =A0 =A0 =A0 =A0 =A0 =A0 =A0 bsiz= e=3D4096 =A0 blocks=3D65536, version=3D2
    =A0 =A0 =A0 =A0 =A0=3D = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sectsz=3D512 =A0 sunit=3D0 blks= , lazy-count=3D1
    realtime =3Dnone =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 extsz=3D4096 =A0 = blocks=3D0, rtextents=3D0


    Mou= nt options:
    /dev/mapper/vg_xfs-lv_xfs on /xfs type xfs= (rw,noatime,nodiratime,logdev=3D/dev/vg_xfs/lv_log_xfs,nobarrier,inode64,l= ogbsize=3D262144,allocsize=3D512m)

    Is I was to use the 8-disk RAID6 array with a 256= kB stripe size will have a sunit of 512 and a swidth of (8-2)*512=3D3072.= =A0
    # mkfs.xfs -d sunit=3D512,swidth=3D3072 /dev/mapper/vg_xfs-lv= _xfs
    # mount -o remount,sunit=3D512,swidth=3D3072
    Correct?

    What about the logdev opti= on? What is the optimal size to create for it?

    Hope to get some guidance from you guru's please.

    <= /div>
    Thank you.
    Alvin

    =


    --047d7b339003ceac8e04d3d8ed72-- From david@fromorbit.com Mon Jan 21 23:51:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A270E7F3F for ; Mon, 21 Jan 2013 23:51:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90426304039 for ; Mon, 21 Jan 2013 21:51:09 -0800 (PST) X-ASG-Debug-ID: 1358833864-04cb6c391469f60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id QmwptrEcmDQaa45w for ; Mon, 21 Jan 2013 21:51:04 -0800 (PST) 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: ArEOAC4o/lB5LKUj/2dsb2JhbABEhVyyQYYYF3OCHgEBBTocMwgDGAklDwUlAzSIGA2sOI8qFYx7fYMpA5YLkEqDCYFT Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail05.adl6.internode.on.net with ESMTP; 22 Jan 2013 16:21:03 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxWlB-0003JL-Hd for xfs@oss.sgi.com; Tue, 22 Jan 2013 16:51:01 +1100 Date: Tue, 22 Jan 2013 16:51:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 00/12, DEV-ONLY] xfsprogs: metadata CRC support, first batch Message-ID: <20130122055101.GJ2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/12, DEV-ONLY] xfsprogs: metadata CRC support, first batch References: <1358776391-22140-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358776391-22140-1-git-send-email-david@fromorbit.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: 1358833864 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.2.120550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 12:52:59AM +1100, Dave Chinner wrote: > Hi folks, > > Here is the userspace side of the first batch of kernel patches for > metadata CRC support. It needs to be applied on top of the kernel > sync patch I sent here: > > http://oss.sgi.com/archives/xfs/2013-01/msg00188.html > > This batch of patches covers the porting of the kernel crc32c code, > syncing the kernel log recovery code to libxlog, and metadata CRC > support for inodes, freespace, quota, superblock and symlinks. It > does not cover directory or attribute metadata - that will be sent > as a separate patch. > > This code is functional, but not pretty and probably pretty much > unreviewable. There are outstanding issues like how to report > verifier errors in a sane way that is source compatible with the > kernel code, how to factor all the repeated copy-n-paste template > code so taht kernel and userspace share code sanely, and so on. > > The xfs_db code is not fully converted - xfs_check does not work at > all on metadata CRC enabled filesystems, so if you want to run > xfstests, you need to set XFS_CHECK_PROG="/bin/true" in > common.config. I haven't touched xfs_copy, metadata, quota, io, etc, > and I know that xfs_io sees metadata CRC enabled filesystems as > foreign because it doesn't believe that version 5 superblocks are > valid.... Just a word of note about xfs_db. xfs_db does not use libxfs for reading and writing stuff from disk, so currently has no infrastructure for checking or calculating checksums. Hence anything that you do with xfs_db to write to disk on a CRC enabled filesystem will corrupt it as it will invalidate the on-disk CRC. Hence there are various xfstests that use xfs_db to write different values into structures (e.g. 045, which writes a UUID into the superblock) will not work. Indeed, this specific operation needs to be disallowed on version 5 superblocks - the UUID is stamped into every single piece of metadata, so changing it is, well, a whol elot more complex that reading and writing the superblocks.... As a result, right now my only focus for xfs_db is for it to be able to parse the structures correctly. We'll have to decide what the best approach to fixing these problems in xfs-db are - rewriting it to use libxfs is a major undertaking, but then again so is architecting in the verifiers for CRC checking and calculation. And I don't really like the idea of have two different implementations of the same thing in the one place at the best of times.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mlsemon35@gmail.com Tue Jan 22 00:23:11 2013 Return-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.6 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL 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 790C57F3F for ; Tue, 22 Jan 2013 00:23:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 48D098F8033 for ; Mon, 21 Jan 2013 22:23:08 -0800 (PST) X-ASG-Debug-ID: 1358835783-04bdf0231e6bfc0001-NocioJ Received: from mail-ob0-f195.google.com (mail-ob0-f195.google.com [209.85.214.195]) by cuda.sgi.com with ESMTP id tMaMj01HJOVPiijg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Jan 2013 22:23:03 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.195 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.195] Received: by mail-ob0-f195.google.com with SMTP id ta17so290126obb.6 for ; Mon, 21 Jan 2013 22:23:02 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.195] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.195] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=6NZ/nME6SGkQZ7zwiXGlUQUTFhB+DQk8f7TOGYmauQY=; b=HIwBUG6SYIyVe40M0NyTQ0wULACfmj5CY62GuOnOjQW3njT3b4jeOEtIRv3BbaVCDP CvXf70NBFwX/KahwywYaglCicu6Ws3Cu1YD4NVI/WZKA/uQbq7TAHnNYzQJ5q17YCDHH dpZoeXs8aPCXzWcC7J4mYWV0NB/ScxvESCcKiZoiZPZ0mDKU67SH39pIhfErCTN30p4O g58uTEjdN3GQQ7hRqq4himXc6g78O96fU7mSv4Co9utr2Z2KZitB1qDuinXhRjlmyMAu EXFBA4OdVJ/Mh3ef6T3mWhd+bbB7opbkrmYyCE83OIaPr7iscC2XIgBJLW+VcrO18peY LHCw== MIME-Version: 1.0 X-Received: by 10.60.32.193 with SMTP id l1mr15573651oei.114.1358835782641; Mon, 21 Jan 2013 22:23:02 -0800 (PST) Received: by 10.76.70.233 with HTTP; Mon, 21 Jan 2013 22:23:02 -0800 (PST) Date: Tue, 22 Jan 2013 01:23:02 -0500 Message-ID: Subject: Re: [PATCH]xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() From: "Michael L. Semon" X-ASG-Orig-Subj: Re: [PATCH]xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ob0-f195.google.com[209.85.214.195] X-Barracuda-Start-Time: 1358835783 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.2.120552 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 > From: Torsten Kaiser > > Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed > xfs_flushinval_pages() and changed its callers to use > filemap_write_and_wait() and truncate_pagecache_range() directly. > > But in xfs_swap_extents() this change accidental switched the argument > for 'tip' to 'ip'. This patch switches it back to 'tip' The patch works in casual testing, and I can defragment files using Linux 3.8-rc4. It solves the problem listed here: http://oss.sgi.com/pipermail/xfs/2013-January/023379.html However, I'm having trouble getting the filesystems to fragment again so that a more formal test can be done...and that's one of the many reasons that I use XFS ;-) xfstests #042, #222, and #227 passed outright, with and without a lot of debug options in the kernel. Very nice! Without debug options, xfstests #111 failed with a simple "Directory defragmentation not supported" message but did not cause problems for later tests. With debug options, xfstests #111 causes a screenful of oops and a stopped PC--it did this when defrag was broken, too--and I don't know whether to blame the defrag code, the test code, or the debug code. I'm willing to write down that oops screen, but only on request. In other words, I'm happy with the patch. Good work! Michael From jeff.liu@oracle.com Tue Jan 22 00:52:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 83EAC7F3F for ; Tue, 22 Jan 2013 00:52:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F3E2304048 for ; Mon, 21 Jan 2013 22:52:24 -0800 (PST) X-ASG-Debug-ID: 1358837542-04bdf0231e6cc40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Kez69y2KEo1oXGSo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 21 Jan 2013 22:52:22 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0M6qJST016791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 06:52:20 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0M6qJKW005383 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 06:52:19 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0M6qI9Y032442; Tue, 22 Jan 2013 00:52:18 -0600 Received: from [192.168.1.102] (/123.119.101.204) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Jan 2013 22:52:18 -0800 Message-ID: <50FE371C.3050400@oracle.com> Date: Tue, 22 Jan 2013 14:52:12 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Dave Chinner CC: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> <50F9C164.2050806@sgi.com> <20130119002017.GS2498@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation In-Reply-To: <20130119002017.GS2498@dastard> Content-Type: text/plain; charset=ISO-8859-1 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: 1358837542 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11: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.2.120554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/19/2013 08:20 AM, Dave Chinner wrote: > On Fri, Jan 18, 2013 at 03:40:52PM -0600, Mark Tinguely wrote: >> On 01/10/13 07:47, Jeff Liu wrote: >>> Hello, >>> >>> Here is the v2 patch set of killing hard-coded number 128 which is used to indicate >>> the extra log space reservation for almost all of those transactions. >>> >>> In this round, I also tried to convert some transactions to pre-calculate out the >>> space log reservation from runtime to mount time so that we can make the code related >>> to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically >>> can be ignored. :)) IMHO, which were includes: super block quota flags changes, >>> quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, >>> log super block counters, log super block units/fields, as well as set attributes. >>> >>> >>> Changes of v2 to v1: >>> - use xfs_calc_buf_res() to calulate out the space log reservation per item. >>> >>> Old patches: >>> v1: >>> http://www.spinics.net/lists/xfs/msg15499.html >>> >>> Thanks, >>> -Jeff >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >> >> >> Hi Jeff, >> >> I did a quick read of the series and it looks good. >> >> Any reason to have separate constants for: >> >> XFS_SYNC_ICSBCOUNT_LOG_RES(mp) >> XFS_SYNC_ICSBUNIT_LOG_RES(mp) >> XFS_LOG_DUMMY1_LOG_RES(mp) >> >> since they are the same value and are all superblock operations. > > Right - they can all use the same "XFS_SB_LOG_RES(mp)" reservation. > > FWIW, using the notiation "ICSB" is wrong here. ICSB is short for > "in-core superblock" (i.e. in memory) but transactions are used for > modifying the on-disk superblock. They are two separate things, so > let's make sure we get the terminology right. ;) Since those transactions are used for changing the on-disk super block, how about naming this transaction to XFS_UPDATE_SB_LOG_RES(mp) and introduce a corresponding mp->m_reservations.tr_updatesb? Does this sounds more meaningful? Thanks, -Jeff From eguan@redhat.com Tue Jan 22 00:53:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 86B157F3F for ; Tue, 22 Jan 2013 00:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 660ED8F8033 for ; Mon, 21 Jan 2013 22:53:08 -0800 (PST) X-ASG-Debug-ID: 1358837587-04cb6c39146bbc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZDOhzsUve4giI4OK for ; Mon, 21 Jan 2013 22:53:07 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0M6r7WG008623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 22 Jan 2013 01:53:07 -0500 Received: from localhost (dhcp12-106.nay.redhat.com [10.66.12.106] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0M6ehei027893; Tue, 22 Jan 2013 01:40:46 -0500 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v3] xfstests 295: test xfs direct IO nested transaction deadlock Date: Tue, 22 Jan 2013 14:40:28 +0800 X-ASG-Orig-Subj: [PATCH v3] xfstests 295: test xfs direct IO nested transaction deadlock Message-Id: <1358836828-32517-1-git-send-email-eguan@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: 1358837587 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 Regression test case for commit: 437a255 xfs: fix direct IO nested transaction deadlock. Signed-off-by: Eryu Guan --- v3: 1. rename TESTDIR to STRESS_DIR 2. decrease variable by using "let" 3. call wait instead of sync after killing all fsstress processes 4. rebase on top of master v2: 1. drop generic freeze vs fsstress test, 068 has done this 2. remove unnecessary _scratch_unmount 3. rm $seq.full before _scratch_mkfs_xfs 4. remove unnecessary sleep 5. remove unnecessary output 6. run fixed number(10) of iterations of freeze/thaw cycles 7. remove from dangerous group 295 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 295.out | 3 +++ group | 1 + 3 files changed, 92 insertions(+) create mode 100644 295 create mode 100644 295.out diff --git a/295 b/295 new file mode 100644 index 0000000..57aa63c --- /dev/null +++ b/295 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 295 +# +# Test freeze/unfreeze file system randomly under fsstress +# Regression test for commit: +# 437a255 xfs: fix direct IO nested transaction deadlock. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +#----------------------------------------------------------------------- +# +# creator +owner=eguan@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os IRIX Linux + +_require_scratch +_require_freeze + +rm -f $seq.full +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 +_scratch_mount >/dev/null 2>&1 + +STRESS_DIR="$SCRATCH_MNT/testdir" +mkdir -p $STRESS_DIR + +$FSSTRESS_PROG -d $STRESS_DIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & + +# Freeze/unfreeze file system randomly +echo "Start freeze/unfreeze randomly" | tee -a $seq.full +LOOP=10 +while [ $LOOP -gt 0 ];do + TIMEOUT=`expr $RANDOM % 5` + sleep $TIMEOUT + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -f $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: freeze filesystem failed" | tee -a $seq.full + fi + TIMEOUT=`expr $RANDOM % 3` + sleep $TIMEOUT + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full + xfs_freeze -u $SCRATCH_MNT + if [ $? -ne 0 ];then + echo " - Error: unfreeze filesystem failed" | tee -a $seq.full + fi + let LOOP=$LOOP-1 +done +echo "Test done" | tee -a $seq.full +killall -q $FSSTRESS_PROG +wait + +_check_scratch_fs +status=0 +exit diff --git a/295.out b/295.out new file mode 100644 index 0000000..ab4f99b --- /dev/null +++ b/295.out @@ -0,0 +1,3 @@ +QA output created by 295 +Start freeze/unfreeze randomly +Test done diff --git a/group b/group index 505bc7f..6578540 100644 --- a/group +++ b/group @@ -413,3 +413,4 @@ deprecated 292 auto mkfs quick 293 auto quick 294 auto quick +295 auto freeze -- 1.7.11.7 From samuel.kvasnica@ims.co.at Tue Jan 22 05:10:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 12E707F37 for ; Tue, 22 Jan 2013 05:10:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F1C808F8033 for ; Tue, 22 Jan 2013 03:10:31 -0800 (PST) X-ASG-Debug-ID: 1358853029-04cb6c391574e60001-NocioJ Received: from mail.ims.co.at (mail.ims.co.at [81.223.138.19]) by cuda.sgi.com with ESMTP id XIAhVQPD9chSgOLU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 03:10:30 -0800 (PST) X-Barracuda-Envelope-From: samuel.kvasnica@ims.co.at X-Barracuda-Apparent-Source-IP: 81.223.138.19 Received: from localhost (localhost [127.0.0.1]) by mail.ims.co.at (Postfix) with ESMTP id 5507513F3A for ; Tue, 22 Jan 2013 12:10:29 +0100 (CET) X-Virus-Scanned: amavisd-new at ims.co.at Received: from mail.ims.co.at ([127.0.0.1]) by localhost (mail.ims.co.at [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ok91kwW27oDW for ; Tue, 22 Jan 2013 12:10:28 +0100 (CET) Received: by mail.ims.co.at (Postfix, from userid 1000) id 9B28513F63; Tue, 22 Jan 2013 12:10:28 +0100 (CET) Received: from imap.ims.co.at (imap.ims.co.at [192.168.100.12]) by mail.ims.co.at (Postfix) with ESMTP id 9361413F3A for ; Tue, 22 Jan 2013 12:10:28 +0100 (CET) Received: from [192.168.100.110] (pc-50-sk.ims.co.at [192.168.100.110]) by imap.ims.co.at (Postfix) with ESMTPSA id 5B5CB21074B0 for ; Tue, 22 Jan 2013 12:10:28 +0100 (CET) Message-ID: <50FE73A4.7020308@ims.co.at> Date: Tue, 22 Jan 2013 12:10:28 +0100 From: Samuel Kvasnica Organization: IMS Nanofabrication AG User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130105 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: XFS with nfs over rdma performance X-Enigmail-Version: 1.5 X-ASG-Orig-Subj: XFS with nfs over rdma performance Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.ims.co.at[81.223.138.19] X-Barracuda-Start-Time: 1358853030 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.2.120570 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, I would like to hear about your experience with the performance of XFS when used on NFS client mounted using Infininband RDMA connection on 3.4.11 kernel. What we observe is following: - we do have local RAID storage with 1.4GB/s read and write performance (both dd on raw partition and on xfs filesystem give basically the same performance) - we do have QDR Infiniband connection (Mellanox), the rdma benchmark gives 29Gbit/s throughput Now, both above points look pretty Ok but if we mount an nfs export using rdma on client we never get the 1.4GB/s throughput. Sporadically (and especially at the beginning) it comes up to some 1.3GB/s for short period but then it starts oscillating between 300MB/s and some 1.2GB/s with an average of 500-600MB/s. Even when using more clients in parallel, the net throughput behaves the same so it seems to be a server-side related bottleneck. We do not see any remarkable CPU load. The interesting point is, we use btrfs filesystem on server instead of xfs now (with otherwise same config) and we are getting consistent, steady throughput around 1.2-1.3GB/s. What is wrong with XFS on 3.x kernel ? Any hints what parameters to look at ? Samuel From eflorac@intellique.com Tue Jan 22 05:39:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D7CBF7F37 for ; Tue, 22 Jan 2013 05:39:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A3EBE8F8037 for ; Tue, 22 Jan 2013 03:39:34 -0800 (PST) X-ASG-Debug-ID: 1358854769-04bdf0231a777c0001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id bef3Pa7bq3mHjAMc for ; Tue, 22 Jan 2013 03:39:31 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id A4E674C8101; Tue, 22 Jan 2013 12:39:25 +0100 (CET) Date: Tue, 22 Jan 2013 12:39:26 +0100 From: Emmanuel Florac To: Samuel Kvasnica Cc: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance Message-ID: <20130122123926.3e618de2@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance In-Reply-To: <50FE73A4.7020308@ims.co.at> References: <50FE73A4.7020308@ims.co.at> Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1358854769 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.2.120572 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 22 Jan 2013 12:10:28 +0100 Samuel Kvasnica =E9crivait: > We do not see any remarkable CPU load. What does the output from iostat -mx 3 looks like while you're writing or reading? =20 > The interesting point is, we use btrfs filesystem on server instead of > xfs now (with otherwise same config) and we are getting consistent, > steady throughput > around 1.2-1.3GB/s. >=20 > What is wrong with XFS on 3.x kernel ? Any hints what parameters to > look at ? What mkfs and mount options did you use? With a large array nobarrier and inode64 may make a big difference. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Tue Jan 22 06:49:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2D0A97F37 for ; Tue, 22 Jan 2013 06:49:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C64F8F8035 for ; Tue, 22 Jan 2013 04:49:52 -0800 (PST) X-ASG-Debug-ID: 1358858989-04cbb00c6474680001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id rYkOrJeHTWU4jGHA for ; Tue, 22 Jan 2013 04:49:49 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E8E1A6C132; Tue, 22 Jan 2013 06:49:48 -0600 (CST) Message-ID: <50FE8AEA.7020300@hardwarefreak.com> Date: Tue, 22 Jan 2013 06:49:46 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Alvin Ong CC: xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files References: X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1358858989 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 1/21/2013 10:22 PM, Alvin Ong wrote: > Hi, > > We are building a solution with a web front end for our users to store > large files. > Large files starting from the size of 500GB and above and can grow up to > 1-2TB's per file. > This is the reason we are trying out XFS to see if we can get a test system > running. Tell us more about these files. Is this simply bulk file storage? Start at 500GB and append until 2TB? How often will the files be appended and at what rate? I.e. will it take 3 days to append from 500GB to 2TB or take 3 months? The answer to this dictates how the files and filesystem will fragment over time. Constantly expanding with additional 6 spindle constituent arrays, LVM concatenation, and xfs_growfs may leave you with an undesirable, possibly disastrous, fragmentation pattern. Will any of these files ever be deleted or moved to tape silo via HSM, or manually? Deletion also greatly affects fragmentation patterns. What is the planed read workload of these files once written? High performance parallel read of a single file, i.e. TPC-H data mining, is not feasible with this configuration. > We plan to use a 6+2 RAID6 to start off with. Then when it gets filled up > to maybe 60-70% we will > expand by adding another 6+2 RAID6 to the array. > The max we can grow this configuration is up to 252TB usable which should > be enough for a year. > Our requirements might grow up to 2PB in 2 years time if all goes well. I'd not attempt growing a single XFS to the scale you're describing, via the methods you describe. The odds of catastrophe are too great. Important question: What make/model of storage array are you using. The quality and reliability of it makes a difference in choosing a proper architecture and expansion methodology. Is this a NetApp filer or other? How is the front end web host connected? 4/8Gb Fibre Channel? 1Gb iSCSI? 10Gb iSCSI? > So I have been testing all of this out on a VM running 3 vmdk's and using > LVM to create a single logical volume of the 3 disks. > I noticed that out of sdb, sdc and sdd, files keep getting written to sdc. > This is probably due to our web app creating a single folder and all files > are written under that folder. > This is the nature of the Allocation Group of XFS? Is there a way to avoid > this? Yes. 1. Don't put all files in a single directory. 2. Use the inode32 allocator on a filesystem greater than 1TB in size. This will cause inodes to be located in the first 1TB and files to be allocated round robin across the AGs via rotor stepping. See page 10: http://oss.sgi.com/projects/xfs/training/xfs_slides_06_allocators.pdf >From what you've stated so far, inode32 would seem ideal for your workload, as you have relatively few massive files, very little metadata, and would like all files in a single directory. Inode32 on a huge XFS can give you that. > As we will have files keep writing to the same disk thus creating a > hot spot. > Although it might not hurt us that much if we fill up a single RAID6 to > 60-70% then adding another RAID6 to the mix. We could go up to a total of > 14 RAID6 sets. Again, you probably don't want to do this. Too many eggs in one basket. You should investigate using GlusterFS to tie multiple XFS storage servers together into a single file tree. A proper Gluster/XFS architecture provides for better resiliency, failover, throughput, etc. Start with 4 Gluster nodes each with a 6+2 RAID6, expanding all 4 nodes simultaneously, resulting in each node with a max 63TB XFS. Gluster provides the ability to mirror files across nodes as well as some other tricks which increase resiliency to failures. Running an xfs_repair on a single filesystem denies all access, and with a 252TB XFS this could take some time. With the Gluster architecture, you can take a Gluster node offline to run the xfs_check and users never know the difference as the other 3 nodes handle the load. > Is LVM a good choice of doing this configuration? Or do you have a better > recommendation? > The reason we thought LVM would be good was so that we could easily grow > XFS. Why not do the concatenation within the SAN array controller? > Is I was to use the 8-disk RAID6 array with a 256kB stripe size will have a > sunit of 512 and a swidth of (8-2)*512=3072. So a 256KB strip and a 1.5MB stripe. With RAID6 RMW? I wouldn't recommend this. > # mkfs.xfs -d sunit=512,swidth=3072 /dev/mapper/vg_xfs-lv_xfs > # mount -o remount,sunit=512,swidth=3072 > Correct? It appears most of your writes will be appends, meaning little allocation, which means little stripe aligned write out. Here you are trying to optimize for large IOs which would be fine if you had an all or mostly allocation workload, but you don't. You have an append heavy workload. Using large strips (stripe units, chunks) with parity RAID, especially RAID6, will simply murder your append performance due to massive read-modify-write operations on large strips. With RAID6 with a mostly append workload, you should be using a small strip size. This has been discussed here at length and the consensus is anything over a 32KB strip size doesn't improve performance, but can hurt performance, especially with parity RAID. Thus you should create your 6+2 arrays with a 32KB strip and (6*32)=192KB stripe, and create your XFS with "-d su=32k,sw=6". This should yield significantly better append performance. > What about the logdev option? What is the optimal size to create for it? You don't use an external log device for workloads that have no metadata operations. By your account above you'll have approximately 125-500 files stored in 252TB net of disk space. Which means you'll update the directory tress with something like one write every few days. External log devices are for systems that modify metadata at rates of hundreds of IOs per second. So don't specify a log device. -- Stan From samuel.kvasnica@ims.co.at Tue Jan 22 06:51:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A86967F50 for ; Tue, 22 Jan 2013 06:51:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 98197304032 for ; Tue, 22 Jan 2013 04:51:03 -0800 (PST) X-ASG-Debug-ID: 1358859061-04cbb00c6574730001-NocioJ Received: from mail.ims.co.at (mail.ims.co.at [81.223.138.19]) by cuda.sgi.com with ESMTP id 7M4Ez5Pi0sq7uEi9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 04:51:02 -0800 (PST) X-Barracuda-Envelope-From: samuel.kvasnica@ims.co.at X-Barracuda-Apparent-Source-IP: 81.223.138.19 Received: from localhost (localhost [127.0.0.1]) by mail.ims.co.at (Postfix) with ESMTP id 36D9913F1D; Tue, 22 Jan 2013 13:51:01 +0100 (CET) X-Virus-Scanned: amavisd-new at ims.co.at Received: from mail.ims.co.at ([127.0.0.1]) by localhost (mail.ims.co.at [127.0.0.1]) (amavisd-new, port 10024) with LMTP id jB6VEWIUdYfT; Tue, 22 Jan 2013 13:51:00 +0100 (CET) Received: by mail.ims.co.at (Postfix, from userid 1000) id 1F27413FB1; Tue, 22 Jan 2013 13:51:00 +0100 (CET) Received: from imap.ims.co.at (imap.ims.co.at [192.168.100.12]) by mail.ims.co.at (Postfix) with ESMTP id 18D8C13F1D; Tue, 22 Jan 2013 13:51:00 +0100 (CET) Received: from [192.168.100.110] (pc-50-sk.ims.co.at [192.168.100.110]) by imap.ims.co.at (Postfix) with ESMTPSA id 2750221074B0; Tue, 22 Jan 2013 13:50:59 +0100 (CET) Message-ID: <50FE8B33.3060208@ims.co.at> Date: Tue, 22 Jan 2013 13:50:59 +0100 From: Samuel Kvasnica Organization: IMS Nanofabrication AG User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130105 Thunderbird/17.0.2 MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance References: <50FE73A4.7020308@ims.co.at> <20130122123926.3e618de2@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance In-Reply-To: <20130122123926.3e618de2@harpe.intellique.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail.ims.co.at[81.223.138.19] X-Barracuda-Start-Time: 1358859062 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.2.120578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Emmanuel, On 01/22/2013 12:39 PM, Emmanuel Florac wrote: > Le Tue, 22 Jan 2013 12:10:28 +0100 > Samuel Kvasnica crivait: > >> We do not see any remarkable CPU load. > What does the output from iostat -mx 3 looks like while you're writing > or reading? well ok, this will take some time as I need to switch back from btrfs to xfs first... >> The interesting point is, we use btrfs filesystem on server instead of >> xfs now (with otherwise same config) and we are getting consistent, >> steady throughput >> around 1.2-1.3GB/s. >> >> What is wrong with XFS on 3.x kernel ? Any hints what parameters to >> look at ? > What mkfs and mount options did you use? With a large array nobarrier > and inode64 may make a big difference. mkfs: -f -L data -i attr=2 -d agcount=12 -l lazy-count=1,version=2,size=128m mount: attr2,noalign,inode64,relatime,nobarrier,logbufs=8,logbsize=256k inode64 cannot be relevant at all as the filesystem is empty. Actually, funny way, noalign is always better that sw/su alignment for any hardware-RAID I tried so far. But I do not think that mkfs or mount is that much relevant here as the local filesystem performance is pretty Ok (actually same as raw dd). The bottleneck issue comes only when exported by NFS over RDMA. And it seems more like a "pumping effect" that bottleneck. regards, Samuel From eflorac@intellique.com Tue Jan 22 07:43:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DEF567F37 for ; Tue, 22 Jan 2013 07:43:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D03F58F8035 for ; Tue, 22 Jan 2013 05:43:01 -0800 (PST) X-ASG-Debug-ID: 1358862178-04cb6c39137b0e0001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id SebYX1hVKuF16VC0 for ; Tue, 22 Jan 2013 05:42:59 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 470644C8135; Tue, 22 Jan 2013 14:42:54 +0100 (CET) Date: Tue, 22 Jan 2013 14:42:55 +0100 From: Emmanuel Florac To: Samuel Kvasnica Cc: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance Message-ID: <20130122144255.1ce6b329@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance In-Reply-To: <50FE8B33.3060208@ims.co.at> References: <50FE73A4.7020308@ims.co.at> <20130122123926.3e618de2@harpe.intellique.com> <50FE8B33.3060208@ims.co.at> Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1358862178 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.2.120580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 22 Jan 2013 13:50:59 +0100 Samuel Kvasnica =E9crivait: > Actually, funny way, noalign is always better that sw/su alignment for > any hardware-RAID I tried so far. It may be because of lvm in case you're using it. > But I do not think that mkfs or mount is that much relevant here as > the local filesystem performance is pretty Ok (actually same as raw > dd). >=20 > The bottleneck issue comes only when exported by NFS over RDMA. And it > seems more like a "pumping effect" > that bottleneck. >=20 NFS tends to make small IOs and can be tricky, in your case it reminds me of a random access bottleneck, for instance log access. That's why I'm wondering what iostat output looks like... Periodical log flushing could be the culprit. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From samuel.kvasnica@ims.co.at Tue Jan 22 07:47:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E6CBB7F37 for ; Tue, 22 Jan 2013 07:47:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C702D304032 for ; Tue, 22 Jan 2013 05:47:58 -0800 (PST) X-ASG-Debug-ID: 1358862476-04cbb00c65767e0001-NocioJ Received: from mail.ims.co.at (mail.ims.co.at [81.223.138.19]) by cuda.sgi.com with ESMTP id 5ghkej4k6c0BdTrW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 05:47:57 -0800 (PST) X-Barracuda-Envelope-From: samuel.kvasnica@ims.co.at X-Barracuda-Apparent-Source-IP: 81.223.138.19 Received: from localhost (localhost [127.0.0.1]) by mail.ims.co.at (Postfix) with ESMTP id DD68413F85; Tue, 22 Jan 2013 14:47:55 +0100 (CET) X-Virus-Scanned: amavisd-new at ims.co.at Received: from mail.ims.co.at ([127.0.0.1]) by localhost (mail.ims.co.at [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ke6iMaunFpHl; Tue, 22 Jan 2013 14:47:54 +0100 (CET) Received: by mail.ims.co.at (Postfix, from userid 1000) id A09D513FAA; Tue, 22 Jan 2013 14:47:54 +0100 (CET) Received: from imap.ims.co.at (imap.ims.co.at [192.168.100.12]) by mail.ims.co.at (Postfix) with ESMTP id 9A41B13F85; Tue, 22 Jan 2013 14:47:54 +0100 (CET) Received: from [192.168.100.110] (pc-50-sk.ims.co.at [192.168.100.110]) by imap.ims.co.at (Postfix) with ESMTPSA id CB42321074B0; Tue, 22 Jan 2013 14:47:54 +0100 (CET) Message-ID: <50FE988A.5090104@ims.co.at> Date: Tue, 22 Jan 2013 14:47:54 +0100 From: Samuel Kvasnica Organization: IMS Nanofabrication AG User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130105 Thunderbird/17.0.2 MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance References: <50FE73A4.7020308@ims.co.at> <20130122123926.3e618de2@harpe.intellique.com> <50FE8B33.3060208@ims.co.at> <20130122144255.1ce6b329@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance In-Reply-To: <20130122144255.1ce6b329@harpe.intellique.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail.ims.co.at[81.223.138.19] X-Barracuda-Start-Time: 1358862476 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.2.120580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/22/2013 02:42 PM, Emmanuel Florac wrote: > Le Tue, 22 Jan 2013 13:50:59 +0100 > Samuel Kvasnica crivait: > >> Actually, funny way, noalign is always better that sw/su alignment for >> any hardware-RAID I tried so far. > It may be because of lvm in case you're using it. No, no LVM. And no partitions. The filesystem lives directly on raw device, even no partition table there. I have actually never seen this working (except on mdraid), but noalign gives perfect performance so I do not bother much. > >> But I do not think that mkfs or mount is that much relevant here as >> the local filesystem performance is pretty Ok (actually same as raw >> dd). >> >> The bottleneck issue comes only when exported by NFS over RDMA. And it >> seems more like a "pumping effect" >> that bottleneck. >> > NFS tends to make small IOs and can be tricky, in your case it reminds > me of a random access bottleneck, for instance log access. That's why > I'm wondering what iostat output looks like... Periodical log flushing > could be the culprit. But I read/write only long files in this test (100GB). The point is btrfs has not this issue and I do not remember seeing it earlier around 2.6.x kernels. There must be some IO-buffer issue. As I remember there used to be quite some NFS-specific code within the XFS tree. regards, Samuel From dsterba@suse.cz Tue Jan 22 08:02:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5F74B7F37 for ; Tue, 22 Jan 2013 08:02:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6C14AC006 for ; Tue, 22 Jan 2013 06:02:01 -0800 (PST) X-ASG-Debug-ID: 1358863319-04cb6c39147bd10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 78wkJlHeZ3qttAcj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 06:02:00 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 2D446A3A4A for ; Tue, 22 Jan 2013 15:01:59 +0100 (CET) Received: by ds.suse.cz (Postfix, from userid 10065) id 5913C75B0C; Tue, 22 Jan 2013 15:01:58 +0100 (CET) From: David Sterba To: xfs@oss.sgi.com Cc: David Sterba Subject: [PATCH] xfstests: make length of diff output configurable Date: Tue, 22 Jan 2013 15:01:46 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: make length of diff output configurable Message-Id: <1358863307-16489-1-git-send-email-dsterba@suse.cz> X-Mailer: git-send-email 1.8.0.2 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1358863320 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.2.120582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In commit 11c1d79414e2571 "xfstests: Change the diff output of failed tests", the diff output of a failed test was hardcoded to 10 lines to avoid overly long output and user can get the full output by manually running the diff. However this is not always possible and convenient, eg. in repeated automated tests where the required information is lost after the test round finished. Then the caputred logs do not contain enough informatin for analysis. Introduce the DIFF_LENGTH env variable to tune the diff size, keeping it 10 as deafult and 0 to disable the limit. Signed-off-by: David Sterba --- README | 2 ++ check | 7 ++++++- common.config | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README b/README index d81ede9..b70f75d 100644 --- a/README +++ b/README @@ -63,6 +63,8 @@ Preparing system for tests (IRIX and Linux): - if TEST_LOGDEV and/or TEST_RTDEV, these will always be used. - if SCRATCH_LOGDEV and/or SCRATCH_RTDEV, the USE_EXTERNAL environment variable set to "yes" will enable their use. + - setenv DIFF_LENGTH "number of diff lines to print from a failed test", + by default 10, set to 0 to print the full diff - or add a case to the switch in common.config assigning these variables based on the hostname of your test machine diff --git a/check b/check index 75addb5..8b79678 100755 --- a/check +++ b/check @@ -287,7 +287,12 @@ do else echo " - output mismatch (see $seq.out.bad)" mv $tmp.out $seq.out.bad - $diff $seq.out $seq.out.bad | head -n 10 | \ + $diff $seq.out $seq.out.bad | { + if [ "$DIFF_LENGTH" -le 0 ]; then + cat + else + head -n "$DIFF_LENGTH" + fi; } | \ sed -e 's/^\(.\)/ \1/' echo " ..." echo " (Run '$diff $seq.out $seq.out.bad' to see the" \ diff --git a/common.config b/common.config index 57f505d..8dfe574 100644 --- a/common.config +++ b/common.config @@ -63,6 +63,8 @@ HOSTOS=`uname -s` MODULAR=0 # using XFS as a module or not BOOT="/boot" # install target for kernels export EXTRA=${EXTRA:=xfs-qa} +# number of diff lines from a failed test, 0 for whole output +export DIFF_LENGTH=${DIFF_LENGTH:=10} # general parameters (mainly for auto-qa) SOAK_PROC=3 # -p option to fsstress -- 1.8.0.2 From tinguely@sgi.com Tue Jan 22 08:22:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 959527F37 for ; Tue, 22 Jan 2013 08:22:06 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77EF68F8049; Tue, 22 Jan 2013 06:22:03 -0800 (PST) Message-ID: <50FEA08D.8090405@sgi.com> Date: Tue, 22 Jan 2013 08:22:05 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 00/12, DEV-ONLY] xfsprogs: metadata CRC support, first batch References: <1358776391-22140-1-git-send-email-david@fromorbit.com> <20130122055101.GJ2498@dastard> In-Reply-To: <20130122055101.GJ2498@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/21/13 23:51, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 12:52:59AM +1100, Dave Chinner wrote: >> Hi folks, >> ... > Just a word of note about xfs_db. xfs_db does not use libxfs for > reading and writing stuff from disk, so currently has no > infrastructure for checking or calculating checksums. Hence anything > that you do with xfs_db to write to disk on a CRC enabled filesystem > will corrupt it as it will invalidate the on-disk CRC. > > Hence there are various xfstests that use xfs_db to write different > values into structures (e.g. 045, which writes a UUID into the > superblock) will not work. Indeed, this specific operation needs to > be disallowed on version 5 superblocks - the UUID is stamped into > every single piece of metadata, so changing it is, well, a whol elot > more complex that reading and writing the superblocks.... > > As a result, right now my only focus for xfs_db is for it to be able > to parse the structures correctly. We'll have to decide what the > best approach to fixing these problems in xfs-db are - rewriting it > to use libxfs is a major undertaking, but then again so is > architecting in the verifiers for CRC checking and calculation. And > I don't really like the idea of have two different implementations > of the same thing in the one place at the best of times.... > > Cheers, > > Dave. > Thanks for the heads-up. --Mark. From tinguely@sgi.com Tue Jan 22 08:33:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 BF8697F37 for ; Tue, 22 Jan 2013 08:33:14 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A4438F804B; Tue, 22 Jan 2013 06:33:14 -0800 (PST) Message-ID: <50FEA32C.6070704@sgi.com> Date: Tue, 22 Jan 2013 08:33:16 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> <50F9C164.2050806@sgi.com> <20130119002017.GS2498@dastard> <50FE371C.3050400@oracle.com> In-Reply-To: <50FE371C.3050400@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/22/13 00:52, Jeff Liu wrote: > On 01/19/2013 08:20 AM, Dave Chinner wrote: >> On Fri, Jan 18, 2013 at 03:40:52PM -0600, Mark Tinguely wrote: >>> On 01/10/13 07:47, Jeff Liu wrote: >>>> Hello, >>>> >>>> Here is the v2 patch set of killing hard-coded number 128 which is used to indicate >>>> the extra log space reservation for almost all of those transactions. >>>> >>>> In this round, I also tried to convert some transactions to pre-calculate out the >>>> space log reservation from runtime to mount time so that we can make the code related >>>> to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically >>>> can be ignored. :)) IMHO, which were includes: super block quota flags changes, >>>> quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, >>>> log super block counters, log super block units/fields, as well as set attributes. >>>> >>>> >>>> Changes of v2 to v1: >>>> - use xfs_calc_buf_res() to calulate out the space log reservation per item. >>>> >>>> Old patches: >>>> v1: >>>> http://www.spinics.net/lists/xfs/msg15499.html >>>> >>>> Thanks, >>>> -Jeff >>>> >>>> _______________________________________________ >>>> xfs mailing list >>>> xfs@oss.sgi.com >>>> http://oss.sgi.com/mailman/listinfo/xfs >>> >>> >>> Hi Jeff, >>> >>> I did a quick read of the series and it looks good. >>> >>> Any reason to have separate constants for: >>> >>> XFS_SYNC_ICSBCOUNT_LOG_RES(mp) >>> XFS_SYNC_ICSBUNIT_LOG_RES(mp) >>> XFS_LOG_DUMMY1_LOG_RES(mp) >>> >>> since they are the same value and are all superblock operations. >> >> Right - they can all use the same "XFS_SB_LOG_RES(mp)" reservation. >> >> FWIW, using the notiation "ICSB" is wrong here. ICSB is short for >> "in-core superblock" (i.e. in memory) but transactions are used for >> modifying the on-disk superblock. They are two separate things, so >> let's make sure we get the terminology right. ;) > Since those transactions are used for changing the on-disk super block, > how about naming this transaction to XFS_UPDATE_SB_LOG_RES(mp) and > introduce a corresponding mp->m_reservations.tr_updatesb? > Does this sounds more meaningful? > > Thanks, > -Jeff > I like the simpler "XFS_SB_LOG_RES(mp)". It follows the existing names. --Mark. From bfoster@redhat.com Tue Jan 22 08:34:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7BCC97F37 for ; Tue, 22 Jan 2013 08:34:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 005C6AC002 for ; Tue, 22 Jan 2013 06:34:07 -0800 (PST) X-ASG-Debug-ID: 1358865246-04cbb00c6578780001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UvHj1P4wDCEr7hwz for ; Tue, 22 Jan 2013 06:34:06 -0800 (PST) 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 r0MEXxeV024481 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 09:33:59 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0MEXwFo029023 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 09:33:59 -0500 Message-ID: <50FEA2D8.9050604@redhat.com> Date: Tue, 22 Jan 2013 09:31:52 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end In-Reply-To: <1358772835-21436-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358865246 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 01/21/2013 07:53 AM, Dave Chinner wrote: > From: Dave Chinner > > When _xfs_buf_find is passed an out of range address, it will fail > to find a relevant struct xfs_perag and oops with a null > dereference. This can happen when trying to walk a filesystem with a > metadata inode that has a partially corrupted extent map (i.e. the > block number returned is corrupt, but is otherwise intact) and we > try to read from the corrupted block address. > > In this case, just fail the lookup. If it is readahead being issued, > it will simply not be done, but if it is real read that fails we > will get an error being reported. Ideally this case should result > in an EFSCORRUPTED error being reported, but we cannot return an > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > may result in ENOMEM or EIO errors being reported instead. > > Signed-off-by: Dave Chinner As we briefly chatted, I ended up playing with the same bug a bit and came to the same general conclusion (invalid blkno leads to a NULL pag), just wasn't aware you had a fix in the pipe already... Reviewed-by: Brian Foster > --- > fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 56d1614..689d726 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -487,6 +487,7 @@ _xfs_buf_find( > struct rb_node *parent; > xfs_buf_t *bp; > xfs_daddr_t blkno = map[0].bm_bn; > + xfs_daddr_t eofs; > int numblks = 0; > int i; > > @@ -498,6 +499,23 @@ _xfs_buf_find( > ASSERT(!(numbytes < (1 << btp->bt_sshift))); > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > > + /* > + * Corrupted block numbers can get through to here, unfortunately, so we > + * have to check that the buffer falls within the filesystem bounds. > + */ > + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > + if (blkno >= eofs) { > + /* > + * XXX (dgc): we should really be returning EFSCORRUPTED here, > + * but none of the higher level infrastructure supports > + * returning a specific error on buffer lookup failures. > + */ > + xfs_alert(btp->bt_mount, > + "%s: Block out of range: block 0x%llx, EOFS 0x%llx ", > + __func__, blkno, eofs); > + return NULL; > + } > + > /* get tree root */ > pag = xfs_perag_get(btp->bt_mount, > xfs_daddr_to_agno(btp->bt_mount, blkno)); > From bfoster@redhat.com Tue Jan 22 08:34:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9EACA7F37 for ; Tue, 22 Jan 2013 08:34:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1FE81AC002 for ; Tue, 22 Jan 2013 06:34:55 -0800 (PST) X-ASG-Debug-ID: 1358865293-04cbb00c63787e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NCQqu4YQFDLujzy5 for ; Tue, 22 Jan 2013 06:34:54 -0800 (PST) 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 r0MEYrKY019206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 09:34:53 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0MEYqvF003644 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 09:34:52 -0500 Message-ID: <50FEA30E.20400@redhat.com> Date: Tue, 22 Jan 2013 09:32:46 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files In-Reply-To: <1358772835-21436-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358865293 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 01/21/2013 07:53 AM, Dave Chinner wrote: > From: Dave Chinner > > This is an RFC that follow sup from a conversion Eric and I had on > IRC. The idea is to prevent EOF speculative preallocation from > triggering larger allocations on IO patterns of > truncate--to-zero-seek-write-seek-write-.... which results in > non-sparse files for large files. This, unfortunately, is the way cp > behaves when copying sparse files, and it results in sub-optimal > destination file layouts. > > What this code does is that it looks at the current extent over the > new EOF location, and if it is a hole it turns off preallocation > altogether. To avoid the next write from doing a large prealloc, it > takes the size of subsequent preallocations from the current size of > the existing EOF extent. IOWs, if you leave a hole in the file, it > resets preallocation behaviour to the same as if it was a zero size > file. > Interesting. So the prealloc heuristics remains the same, but is primed based on the size the last extent of the file rather than the size of the file (provided the last extent is small enough). > I haven't fully tested this, so I'm not sure if it works exactly > like I think it should, but I wanted to get this out there to get > more eyes on it... > Thanks. I'll plan to play around with this as well. > Example new behaviour: > > $ xfs_io -f -c "pwrite 0 31m" \ > -c "pwrite 33m 1m" \ > -c "pwrite 128m 1m" \ > -c "fiemap -v" /mnt/scratch/blah > wrote 32505856/32505856 bytes at offset 0 > 31 MiB, 7936 ops; 0.0000 sec (1.608 GiB/sec and 421432.7439 ops/sec) > wrote 1048576/1048576 bytes at offset 34603008 > 1 MiB, 256 ops; 0.0000 sec (1.462 GiB/sec and 383233.5329 ops/sec) > wrote 1048576/1048576 bytes at offset 134217728 > 1 MiB, 256 ops; 0.0000 sec (1.719 GiB/sec and 450704.2254 ops/sec) > /mnt/scratch/blah: > EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS > 0: [0..65535]: 96..65631 65536 0x0 > 1: [65536..67583]: hole 2048 > 2: [67584..69631]: 67680..69727 2048 0x0 > 3: [69632..262143]: hole 192512 > 4: [262144..264191]: 262240..264287 2048 0x1 > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_iomap.c | 65 ++++++++++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 56 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index add06b4..3587772 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -311,6 +311,53 @@ xfs_iomap_eof_want_preallocate( > } > > /* > + * Determine the initial size of the preallocation. It will be bound by the > + * current file size, but when we are extending sparse files the current file > + * size is not a good metric to use. Hence we need to look up the extent that > + * ends at the current EOF and use the result to determine the preallocation > + * size. > + * > + * If the extent is a hole, then preallocation is essentially disabled. > + * Otherwise we take the size of the data extent as the basis for the > + * preallocation size. If the size of the extent is greater than half the > + * maximum extent length, then use the file size as the basis. This ensures that > + * for large files the preallocation size always extends to MAXEXTLEN rather > + * than falling short due to things like stripe unit/width alignment of real > + * extents. > + */ > +STATIC int > +xfs_iomap_eof_prealloc_initial_size( > + struct xfs_mount *mp, > + struct xfs_inode *ip, > + xfs_bmbt_irec_t *imap, > + int nimaps) > +{ > + xfs_fileoff_t start_fsb; > + xfs_fsblock_t firstblock; > + int imaps = 1; > + int error; > + > + ASSERT(nimaps >= imaps); > + > + /* if we are using a specific prealloc size, return now */ > + if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) > + return 0; > + > + start_fsb = XFS_B_TO_FSBT(mp, XFS_ISIZE(ip)); > + error = xfs_bmapi_read(ip, start_fsb, 1, imap, &imaps, > + XFS_BMAPI_ENTIRE); > + if (error) > + return 0; > + > + ASSERT(imaps == 1); > + if (imap[0].br_startblock == HOLESTARTBLOCK) > + return 0; A couple questions (that stem from my lack of experience thus far in the mapping/allocation layer): - Does this depend on seeking past any already existing post-EOF preallocation? - Is this subject to variance based on fragmentation? In other words, if the file happens to be fragmented and the last real extent is small (but the file contiguously allocated), is that reflected in the blockcount we receive at this level, or is that hidden away in the lower bmap levels? > + if (imap[0].br_blockcount <= (MAXEXTLEN >> 1)) Just thinking aloud, but any thought to just using the size of the last extent unconditionally? I suppose that would make a difference in cases where a large sparse file has a 5GB range allocated high in the file, such that you'd get a 4GB prealloc when you cross that 4GB extent size boundary rather than switching over to the file size value and getting an 8GB extent. Brian > + return imap[0].br_blockcount; > + return XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); > +} > + > +/* > * If we don't have a user specified preallocation size, dynamically increase > * the preallocation size as the size of the file grows. Cap the maximum size > * at a single extent or less if the filesystem is near full. The closer the > @@ -319,20 +366,17 @@ xfs_iomap_eof_want_preallocate( > STATIC xfs_fsblock_t > xfs_iomap_prealloc_size( > struct xfs_mount *mp, > - struct xfs_inode *ip) > + struct xfs_inode *ip, > + xfs_bmbt_irec_t *imap, > + int nimaps) > { > xfs_fsblock_t alloc_blocks = 0; > > - if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { > + alloc_blocks = xfs_iomap_eof_prealloc_initial_size(mp, ip, imap, nimaps); > + if (alloc_blocks > 0) { > int shift = 0; > int64_t freesp; > > - /* > - * rounddown_pow_of_two() returns an undefined result > - * if we pass in alloc_blocks = 0. Hence the "+ 1" to > - * ensure we always pass in a non-zero value. > - */ > - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; > alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, > rounddown_pow_of_two(alloc_blocks)); > > @@ -398,7 +442,10 @@ xfs_iomap_write_delay( > > retry: > if (prealloc) { > - xfs_fsblock_t alloc_blocks = xfs_iomap_prealloc_size(mp, ip); > + xfs_fsblock_t alloc_blocks; > + > + alloc_blocks = xfs_iomap_prealloc_size(mp, ip, imap, > + XFS_WRITE_IMAPS); > > aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); > ioalign = XFS_B_TO_FSBT(mp, aligned_offset); > From bfoster@redhat.com Tue Jan 22 08:35:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 01C697F37 for ; Tue, 22 Jan 2013 08:35:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9B8C304032 for ; Tue, 22 Jan 2013 06:35:21 -0800 (PST) X-ASG-Debug-ID: 1358865320-04cb6c39137d3e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zwpGNLhvRbXxnMtN for ; Tue, 22 Jan 2013 06:35:21 -0800 (PST) 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 r0MEZHJ8024845 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 09:35:17 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0MEZGif032269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 09:35:17 -0500 Message-ID: <50FEA326.5000402@redhat.com> Date: Tue, 22 Jan 2013 09:33:10 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-4-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds In-Reply-To: <1358772835-21436-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358865320 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 On 01/21/2013 07:53 AM, Dave Chinner wrote: > From: Dave Chinner > > There is a window on small filesytsems where specualtive > preallocation can be larger than that ENOSPC throttling thresholds, > resulting in specualtive preallocation trying to reserve more space > than there is space available. This causes immediate ENOSPC to be > triggered, prealloc to be turned off and flushing to occur. One the > next write (i.e. next 4k page), we do exactly the same thing, and so > effective drive into synchronous 4k writes by triggering ENOSPC > flushing on every page while in the window between the prealloc size > and the ENOSPC prealloc throttle threshold. > > Fix this by checking to see if the prealloc size would consume all > free space, and throttle it appropriately to avoid premature > ENOSPC... > Would this alternatively be resolved by the updated throttling code that is part of my quota prealloc throttling set? I'm referring to the following patch in particular: http://oss.sgi.com/archives/xfs/2013-01/msg00003.html Brian > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_iomap.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 3587772..de3bad5 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -395,6 +395,15 @@ xfs_iomap_prealloc_size( > } > if (shift) > alloc_blocks >>= shift; > + > + /* > + * If we are still trying to allocate more space than is > + * available, squash the prealloc hard. This can happen if we > + * have a large file on a small filesystem and the above > + * lowspace thresholds are smaller than MAXEXTLEN. > + */ > + while (alloc_blocks >= freesp) > + alloc_blocks >>= 4; > } > > if (alloc_blocks < mp->m_writeio_blocks) > From jeff.liu@oracle.com Tue Jan 22 09:16:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 97E7F7F37 for ; Tue, 22 Jan 2013 09:16:00 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8B01A8F8049 for ; Tue, 22 Jan 2013 07:15:57 -0800 (PST) X-ASG-Debug-ID: 1358867756-04cbb00c637a3e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9vZxWViqNNe703O6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 07:15:56 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0MFFsmd022087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 15:15:55 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0MFFsvW005362 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 15:15:54 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0MFFrhE001217; Tue, 22 Jan 2013 09:15:53 -0600 Received: from [192.168.1.102] (/123.119.101.204) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Jan 2013 07:15:53 -0800 Message-ID: <50FEAD23.2060904@oracle.com> Date: Tue, 22 Jan 2013 23:15:47 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation References: <50EEC680.9040903@oracle.com> <50F9C164.2050806@sgi.com> <20130119002017.GS2498@dastard> <50FE371C.3050400@oracle.com> <50FEA32C.6070704@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v2 00/12] xfs: kill hard-coded number 128 for transaction space log reservation In-Reply-To: <50FEA32C.6070704@sgi.com> Content-Type: text/plain; charset=UTF-8 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: 1358867756 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.2.120586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/22/2013 10:33 PM, Mark Tinguely wrote: > On 01/22/13 00:52, Jeff Liu wrote: >> On 01/19/2013 08:20 AM, Dave Chinner wrote: >>> On Fri, Jan 18, 2013 at 03:40:52PM -0600, Mark Tinguely wrote: >>>> On 01/10/13 07:47, Jeff Liu wrote: >>>>> Hello, >>>>> >>>>> Here is the v2 patch set of killing hard-coded number 128 which is used to indicate >>>>> the extra log space reservation for almost all of those transactions. >>>>> >>>>> In this round, I also tried to convert some transactions to pre-calculate out the >>>>> space log reservation from runtime to mount time so that we can make the code related >>>>> to xfs_trans_reserve() looks a bit neat and reduce a bit performance overhead(basically >>>>> can be ignored. :)) IMHO, which were includes: super block quota flags changes, >>>>> quota off/end of quota off, adjust quota limits, quota allocations, log dummy1, >>>>> log super block counters, log super block units/fields, as well as set attributes. >>>>> >>>>> >>>>> Changes of v2 to v1: >>>>> - use xfs_calc_buf_res() to calulate out the space log reservation per item. >>>>> >>>>> Old patches: >>>>> v1: >>>>> http://www.spinics.net/lists/xfs/msg15499.html >>>>> >>>>> Thanks, >>>>> -Jeff >>>>> >>>>> _______________________________________________ >>>>> xfs mailing list >>>>> xfs@oss.sgi.com >>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>> >>>> >>>> Hi Jeff, >>>> >>>> I did a quick read of the series and it looks good. >>>> >>>> Any reason to have separate constants for: >>>> >>>> XFS_SYNC_ICSBCOUNT_LOG_RES(mp) >>>> XFS_SYNC_ICSBUNIT_LOG_RES(mp) >>>> XFS_LOG_DUMMY1_LOG_RES(mp) >>>> >>>> since they are the same value and are all superblock operations. >>> >>> Right - they can all use the same "XFS_SB_LOG_RES(mp)" reservation. >>> >>> FWIW, using the notiation "ICSB" is wrong here. ICSB is short for >>> "in-core superblock" (i.e. in memory) but transactions are used for >>> modifying the on-disk superblock. They are two separate things, so >>> let's make sure we get the terminology right. ;) >> Since those transactions are used for changing the on-disk super block, >> how about naming this transaction to XFS_UPDATE_SB_LOG_RES(mp) and >> introduce a corresponding mp->m_reservations.tr_updatesb? >> Does this sounds more meaningful? >> >> Thanks, >> -Jeff >> > > I like the simpler "XFS_SB_LOG_RES(mp)". It follows the existing names. That is ok, then. Thanks, -Jeff From bpm@sgi.com Tue Jan 22 11:55:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 290457F37 for ; Tue, 22 Jan 2013 11:55:34 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id A78BC8F8035; Tue, 22 Jan 2013 09:55:30 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6C7644266DC; Tue, 22 Jan 2013 11:55:30 -0600 (CST) Date: Tue, 22 Jan 2013 11:55:30 -0600 From: Ben Myers To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields Message-ID: <20130122175530.GR27055@sgi.com> References: <5092A1DE.10609@redhat.com> <5092A2B6.2000907@redhat.com> <5092A46A.8080909@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5092A46A.8080909@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Thu, Nov 01, 2012 at 11:33:46AM -0500, Eric Sandeen wrote: > As xlog_print_trans_inode() stands today, it will error > out if more than one flag is set on f->ilf_fields: > > xlog_print_trans_inode: illegal inode type > > but this is a perfectly valid case, to have i.e. a data and > an attr flag set. > > Following is a pretty big reworking of the function to > handle more than one field type set. I'm trying to wrap my head around this one. I have a few stupid questions. > I've tested this by a simple test such as creating one > file on an selinux box, so that data+attr is set, and > logprinting; I've also tested by running logprint after > subsequent xfstest runs (although we hit other bugs that > way). > > Signed-off-by: Eric Sandeen > --- > > V2: Fix subject, sigh. > > diff --git a/logprint/log_misc.c b/logprint/log_misc.c > index e42e108..be2426e 100644 > --- a/logprint/log_misc.c > +++ b/logprint/log_misc.c > @@ -657,97 +657,84 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) > > /* does anything come next */ > op_head = (xlog_op_header_t *)*ptr; > - switch (f->ilf_fields & XFS_ILOG_NONCORE) { > - case XFS_ILOG_DEXT: { > - ASSERT(f->ilf_size == 3); > - (*i)++; > - xlog_print_op_header(op_head, *i, ptr); > - printf(_("EXTENTS inode data\n")); > - *ptr += be32_to_cpu(op_head->oh_len); > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > - return 1; > - } > - break; > - } > - case XFS_ILOG_DBROOT: { > - ASSERT(f->ilf_size == 3); > - (*i)++; > - xlog_print_op_header(op_head, *i, ptr); > - printf(_("BTREE inode data\n")); > - *ptr += be32_to_cpu(op_head->oh_len); > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > - return 1; > - } > + > + if (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { > + switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { Here you kept only XFS_ILOG_DEV and XFS_ILOG_UUID... > + case XFS_ILOG_DEV: > + printf(_("DEV inode: no extra region\n")); > break; > - } > - case XFS_ILOG_DDATA: { > - ASSERT(f->ilf_size == 3); > - (*i)++; > - xlog_print_op_header(op_head, *i, ptr); > - printf(_("LOCAL inode data\n")); > - if (mode == S_IFDIR) { > - xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); > - } > - *ptr += be32_to_cpu(op_head->oh_len); > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > - return 1; > - } > + case XFS_ILOG_UUID: > + printf(_("UUID inode: no extra region\n")); > break; > + case XFS_ILOG_DEXT: > + case XFS_ILOG_DBROOT: > + case XFS_ILOG_DDATA: Do you need to test for these other flags here? > + default: > + xlog_panic(_("xlog_print_trans_inode: illegal inode type 0x%x"), > + f->ilf_fields); > } > - case XFS_ILOG_AEXT: { > - ASSERT(f->ilf_size == 3); > + } > + > + if (f->ilf_fields & (XFS_ILOG_DFORK | XFS_ILOG_AFORK)) { > + ASSERT(f->ilf_size <= 4); Can you explain this ASSERT? I saw only ilf_size == 3 in the old code. Under what circumstances can it be 4? Maybe when multiple ilf_fields are set? > + ASSERT((f->ilf_size == 3) || (f->ilf_fields & XFS_ILOG_AFORK)); I also don't understand this ASSERT. It seems like in the old code all of the AFORK related cases had an ASSERT for ilf_size == 3. > + if (f->ilf_fields & XFS_ILOG_DFORK) { > (*i)++; > xlog_print_op_header(op_head, *i, ptr); > - printf(_("EXTENTS inode attr\n")); > - *ptr += be32_to_cpu(op_head->oh_len); > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > - return 1; > + > + switch (f->ilf_fields & XFS_ILOG_DFORK) { > + case XFS_ILOG_DEXT: > + printf(_("EXTENTS inode data\n")); > + break; > + case XFS_ILOG_DBROOT: > + printf(_("BTREE inode data\n")); > + break; > + case XFS_ILOG_DDATA: > + printf(_("LOCAL inode data\n")); > + if (mode == S_IFDIR) > + xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); > + break; > + case XFS_ILOG_DEV: > + case XFS_ILOG_UUID: ILOG_DEV and ILOG_UUID aren't in ILOG_DFORK. You needn't test for them, correct? I think I understand, just want to make sure. Thanks, Ben From bpm@sgi.com Tue Jan 22 12:52:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 675BC7F4C for ; Tue, 22 Jan 2013 12:52:33 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 400A88F804B; Tue, 22 Jan 2013 10:52:30 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 0BEF94266DC; Tue, 22 Jan 2013 12:52:30 -0600 (CST) Date: Tue, 22 Jan 2013 12:52:30 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC] xfs: run a filtered eofblocks scan on edquot/enospc Message-ID: <20130122185229.GS27055@sgi.com> References: <1354913396-42206-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1354913396-42206-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Fri, Dec 07, 2012 at 03:49:56PM -0500, Brian Foster wrote: > EDQUOT occurs in the buffered write path on user or group quota > allocation failures (project quotas currently use ENOSPC). For > inodes in multiple quotas, we do not know which quota might have > led to the failure. We also cannot technically discern project > quota ENOSPC from global ENOSPC. Therefore, we check the state of > each quota applicable to the inode and run an eofblocks scan on > each considered to be under limited free space conditions. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_file.c | 14 +++++++++++ > fs/xfs/xfs_icache.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_icache.h | 1 + > 3 files changed, 81 insertions(+), 0 deletions(-) > > Hi guys, > > Here's an RFC that covers the recently discussed integration of eofblocks > scanning into EDQUOT/ENOSPC error handling. This is incomplete and only spot > tested against user quotas because I wanted to get some feedback on the approach > before I proceed. > > My biggest question at this point is whether this is the best layer to include > this behavior (i.e., in xfs_file_buffered_aio_write() where we've lost > quota-related context on the error). An alternative approach I considered was to > bury a scan/retry down in xfs_trans_dquot.c (i.e., in or around > xfs_trans_reserve_quota_bydquots()), where the specific failure context is > available. That would result in the higher level buffered write code remaining the > same and only receiving an EDQUOT if we've already done the retry and failed. Any > thoughts on that are appreciated. > > Brian > > TODOs: > - I'm not a huge fan of the name of xfs_inode_free_quota_eofblocks(), but haven't > thought of anything better yet. :) > - Turn the quota checking into a range check (i.e., reserved blocks within %1 of > the limit) and bury it in a 'xfs_quota_is_full()' macro somewhere. > - Enhance eofblocks to support a flush operation and enable that in the project > quota ENOSPC case. > - It just occurred to me when looking this over I might need to use the > XFS_IS_*QUOTA_ENFORCED macros around the quota space checks. > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 67284ed..505b9fb 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -35,6 +35,7 @@ > #include "xfs_dir2_priv.h" > #include "xfs_ioctl.h" > #include "xfs_trace.h" > +#include "xfs_icache.h" > > #include > #include > @@ -716,6 +717,7 @@ xfs_file_buffered_aio_write( > struct xfs_inode *ip = XFS_I(inode); > ssize_t ret; > int enospc = 0; > + int edquot = 0; > int iolock = XFS_IOLOCK_EXCL; > size_t count = ocount; > > @@ -734,6 +736,18 @@ write_retry: > pos, &iocb->ki_pos, count, 0); > > /* > + * A quota failure can be represented as EDQUOT or ENOSPC in the case > + * of project quotas. Check the quotas explicitly for low space > + * conditions, run a prealloc scan if warranted and retry. Otherwise, > + * proceed to general ENOSPC handling. > + */ > + if ((ret == -EDQUOT || ret == -ENOSPC) && !edquot) { > + edquot = 1; > + if (xfs_inode_free_quota_eofblocks(ip)) > + goto write_retry; > + } It looks like you have the iolock held across this call to free eofblocks. Is it possible that this inode would already have some eofblocks, be tagged on the radix tree, and you'd try to get the lock a second time? I think you're right about XFS_IS_*QUOTA_ENFORCED. Neat patch! I wish we had a solid way to know which quota was enforced at this level. Still, this is much better than trimming eofblocks on all inodes. -Ben From bfoster@redhat.com Tue Jan 22 13:06:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4BA297F4F for ; Tue, 22 Jan 2013 13:06:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C2AD8F8049 for ; Tue, 22 Jan 2013 11:06:23 -0800 (PST) X-ASG-Debug-ID: 1358881582-04cb6c391489c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sijek9c0wSjbR2y9 for ; Tue, 22 Jan 2013 11:06:22 -0800 (PST) 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 r0MJ6Kx4030472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 14:06:20 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0MJ6IwK015222 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 14:06:19 -0500 Message-ID: <50FEE2AC.9050005@redhat.com> Date: Tue, 22 Jan 2013 14:04:12 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files In-Reply-To: <1358772835-21436-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358881582 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 On 01/21/2013 07:53 AM, Dave Chinner wrote: > From: Dave Chinner > > This is an RFC that follow sup from a conversion Eric and I had on > IRC. The idea is to prevent EOF speculative preallocation from > triggering larger allocations on IO patterns of > truncate--to-zero-seek-write-seek-write-.... which results in > non-sparse files for large files. This, unfortunately, is the way cp > behaves when copying sparse files, and it results in sub-optimal > destination file layouts. > > What this code does is that it looks at the current extent over the > new EOF location, and if it is a hole it turns off preallocation > altogether. To avoid the next write from doing a large prealloc, it > takes the size of subsequent preallocations from the current size of > the existing EOF extent. IOWs, if you leave a hole in the file, it > resets preallocation behaviour to the same as if it was a zero size > file. > > I haven't fully tested this, so I'm not sure if it works exactly > like I think it should, but I wanted to get this out there to get > more eyes on it... > On a quick test, I didn't quite get the behavior documented below. Is it possible your test file had the initial extent preallocated from an xfs module with the current preallocation scheme? What I see is that sequential writes to a file disable preallocation completely (so the first extent in the test below is 31m instead of 32m). Digging a bit further, it seemed to be due to start_fsb always being a hole. I hacked that a bit to read the extent of the block immediately previous to the write offset (instead of the inode size), e.g.: start_fsb = XFS_B_TO_FSBT(mp, offset); if (start_fsb) start_fsb--; ... and I seem to get expected behavior, at least in the simple xfs_io test. Brian > Example new behaviour: > > $ xfs_io -f -c "pwrite 0 31m" \ > -c "pwrite 33m 1m" \ > -c "pwrite 128m 1m" \ > -c "fiemap -v" /mnt/scratch/blah > wrote 32505856/32505856 bytes at offset 0 > 31 MiB, 7936 ops; 0.0000 sec (1.608 GiB/sec and 421432.7439 ops/sec) > wrote 1048576/1048576 bytes at offset 34603008 > 1 MiB, 256 ops; 0.0000 sec (1.462 GiB/sec and 383233.5329 ops/sec) > wrote 1048576/1048576 bytes at offset 134217728 > 1 MiB, 256 ops; 0.0000 sec (1.719 GiB/sec and 450704.2254 ops/sec) > /mnt/scratch/blah: > EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS > 0: [0..65535]: 96..65631 65536 0x0 > 1: [65536..67583]: hole 2048 > 2: [67584..69631]: 67680..69727 2048 0x0 > 3: [69632..262143]: hole 192512 > 4: [262144..264191]: 262240..264287 2048 0x1 > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_iomap.c | 65 ++++++++++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 56 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index add06b4..3587772 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -311,6 +311,53 @@ xfs_iomap_eof_want_preallocate( > } > > /* > + * Determine the initial size of the preallocation. It will be bound by the > + * current file size, but when we are extending sparse files the current file > + * size is not a good metric to use. Hence we need to look up the extent that > + * ends at the current EOF and use the result to determine the preallocation > + * size. > + * > + * If the extent is a hole, then preallocation is essentially disabled. > + * Otherwise we take the size of the data extent as the basis for the > + * preallocation size. If the size of the extent is greater than half the > + * maximum extent length, then use the file size as the basis. This ensures that > + * for large files the preallocation size always extends to MAXEXTLEN rather > + * than falling short due to things like stripe unit/width alignment of real > + * extents. > + */ > +STATIC int > +xfs_iomap_eof_prealloc_initial_size( > + struct xfs_mount *mp, > + struct xfs_inode *ip, > + xfs_bmbt_irec_t *imap, > + int nimaps) > +{ > + xfs_fileoff_t start_fsb; > + xfs_fsblock_t firstblock; > + int imaps = 1; > + int error; > + > + ASSERT(nimaps >= imaps); > + > + /* if we are using a specific prealloc size, return now */ > + if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) > + return 0; > + > + start_fsb = XFS_B_TO_FSBT(mp, XFS_ISIZE(ip)); > + error = xfs_bmapi_read(ip, start_fsb, 1, imap, &imaps, > + XFS_BMAPI_ENTIRE); > + if (error) > + return 0; > + > + ASSERT(imaps == 1); > + if (imap[0].br_startblock == HOLESTARTBLOCK) > + return 0; > + if (imap[0].br_blockcount <= (MAXEXTLEN >> 1)) > + return imap[0].br_blockcount; > + return XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); > +} > + > +/* > * If we don't have a user specified preallocation size, dynamically increase > * the preallocation size as the size of the file grows. Cap the maximum size > * at a single extent or less if the filesystem is near full. The closer the > @@ -319,20 +366,17 @@ xfs_iomap_eof_want_preallocate( > STATIC xfs_fsblock_t > xfs_iomap_prealloc_size( > struct xfs_mount *mp, > - struct xfs_inode *ip) > + struct xfs_inode *ip, > + xfs_bmbt_irec_t *imap, > + int nimaps) > { > xfs_fsblock_t alloc_blocks = 0; > > - if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { > + alloc_blocks = xfs_iomap_eof_prealloc_initial_size(mp, ip, imap, nimaps); > + if (alloc_blocks > 0) { > int shift = 0; > int64_t freesp; > > - /* > - * rounddown_pow_of_two() returns an undefined result > - * if we pass in alloc_blocks = 0. Hence the "+ 1" to > - * ensure we always pass in a non-zero value. > - */ > - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; > alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, > rounddown_pow_of_two(alloc_blocks)); > > @@ -398,7 +442,10 @@ xfs_iomap_write_delay( > > retry: > if (prealloc) { > - xfs_fsblock_t alloc_blocks = xfs_iomap_prealloc_size(mp, ip); > + xfs_fsblock_t alloc_blocks; > + > + alloc_blocks = xfs_iomap_prealloc_size(mp, ip, imap, > + XFS_WRITE_IMAPS); > > aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); > ioalign = XFS_B_TO_FSBT(mp, aligned_offset); > From bpm@sgi.com Tue Jan 22 13:14:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 5F1FD7F50 for ; Tue, 22 Jan 2013 13:14:29 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 355918F804B; Tue, 22 Jan 2013 11:14:29 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id F2C6A4266DC; Tue, 22 Jan 2013 13:14:28 -0600 (CST) Date: Tue, 22 Jan 2013 13:14:28 -0600 From: Ben Myers To: Satoru Takeuchi Cc: xfs ML Subject: Re: [PATCH] xfstests: Change the interpreter of ltp/runtest.sh to bash Message-ID: <20130122191428.GT27055@sgi.com> References: <50C520C5.9030600@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50C520C5.9030600@jp.fujitsu.com> User-Agent: Mutt/1.5.20 (2009-06-14) Satoru, On Mon, Dec 10, 2012 at 08:37:41AM +0900, Satoru Takeuchi wrote: > From: Satoru Takeuchi > > In some environment, Running 080 fails with the following log. > > ========== > 080 [failed, exit status 2] - output mismatch (see 080.out.bad) > --- 080.out 2012-11-18 20:26:40.000000000 +0900 > +++ 080.out.bad 2012-12-08 21:05:15.000000000 +0900 > @@ -1,3 +1,26 @@ > QA output created by 080 > > -Completed rwtest pass 1 successfully. > +/home/sat/src/xfstests/ltp/rwtest.sh: 90: /home/sat/src/xfstests/ltp/rwtest.sh: 6: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 177: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 190: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +dirname: invalid option -- 'q' > +Try `dirname --help' for more information. > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=-q: not found > +dirname: invalid option -- 'c' > +Try `dirname --help' for more information. > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=-c: not found > +dirname: invalid option -- 'i' > +Try `dirname --help' for more information. > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=-i: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=2000: not found > +dirname: invalid option -- 'f' > +Try `dirname --help' for more information. > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=-f: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 270: /home/sat/src/xfstests/ltp/rwtest.sh: [[: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 317: /home/sat/src/xfstests/ltp/rwtest.sh: F[0+1]=direct,buffered,sync: not found > +/home/sat/src/xfstests/ltp/rwtest.sh: 320: /home/sat/src/xfstests/ltp/rwtest.sh: Bad substitution > ========== > > It happens because ltp/rwtest.sh assumes /bin/sh is `bash' and it's not > always true (ex. /bin/sh is `dash' in Debian.) This script should > explicitly declare that its interpriter is `bash'. > > Signed-off-by: Satoru Takeuchi Reviewed-by: Ben Myers Applied. I cleaned up the commit header a little bit. Regards, Ben From david@fromorbit.com Tue Jan 22 15:05:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 290737F53 for ; Tue, 22 Jan 2013 15:05:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AB228AC002 for ; Tue, 22 Jan 2013 13:05:16 -0800 (PST) X-ASG-Debug-ID: 1358888714-04cb6c39158f670001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id eHItQ80zKeXgF9lW for ; Tue, 22 Jan 2013 13:05:14 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PAOD9/lB5LKUj/2dsb2JhbABEuBWGFxdzgh4BAQUnExwjEAgDDgoJJQ8FJQMhE4gYvToVjF6EQwOWC4lOhnyDCQ Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 07:35:13 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Txl1r-0005D1-Dk; Wed, 23 Jan 2013 08:05:11 +1100 Date: Wed, 23 Jan 2013 08:05:11 +1100 From: Dave Chinner To: Ben Myers Cc: Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields Message-ID: <20130122210511.GK2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields References: <5092A1DE.10609@redhat.com> <5092A2B6.2000907@redhat.com> <5092A46A.8080909@sandeen.net> <20130122175530.GR27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130122175530.GR27055@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358888714 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.2.120610 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 11:55:30AM -0600, Ben Myers wrote: > Hey Eric, > > On Thu, Nov 01, 2012 at 11:33:46AM -0500, Eric Sandeen wrote: > > As xlog_print_trans_inode() stands today, it will error > > out if more than one flag is set on f->ilf_fields: > > > > xlog_print_trans_inode: illegal inode type > > > > but this is a perfectly valid case, to have i.e. a data and > > an attr flag set. > > > > Following is a pretty big reworking of the function to > > handle more than one field type set. > > I'm trying to wrap my head around this one. I have a few stupid questions. > > > I've tested this by a simple test such as creating one > > file on an selinux box, so that data+attr is set, and > > logprinting; I've also tested by running logprint after > > subsequent xfstest runs (although we hit other bugs that > > way). > > > > Signed-off-by: Eric Sandeen > > --- > > > > V2: Fix subject, sigh. > > > > diff --git a/logprint/log_misc.c b/logprint/log_misc.c > > index e42e108..be2426e 100644 > > --- a/logprint/log_misc.c > > +++ b/logprint/log_misc.c > > @@ -657,97 +657,84 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) > > > > /* does anything come next */ > > op_head = (xlog_op_header_t *)*ptr; > > - switch (f->ilf_fields & XFS_ILOG_NONCORE) { > > - case XFS_ILOG_DEXT: { > > - ASSERT(f->ilf_size == 3); > > - (*i)++; > > - xlog_print_op_header(op_head, *i, ptr); > > - printf(_("EXTENTS inode data\n")); > > - *ptr += be32_to_cpu(op_head->oh_len); > > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > > - return 1; > > - } > > - break; > > - } > > - case XFS_ILOG_DBROOT: { > > - ASSERT(f->ilf_size == 3); > > - (*i)++; > > - xlog_print_op_header(op_head, *i, ptr); > > - printf(_("BTREE inode data\n")); > > - *ptr += be32_to_cpu(op_head->oh_len); > > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > > - return 1; > > - } > > + > > + if (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { > > + switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { > > Here you kept only XFS_ILOG_DEV and XFS_ILOG_UUID... > > > + case XFS_ILOG_DEV: > > + printf(_("DEV inode: no extra region\n")); > > break; > > - } > > - case XFS_ILOG_DDATA: { > > - ASSERT(f->ilf_size == 3); > > - (*i)++; > > - xlog_print_op_header(op_head, *i, ptr); > > - printf(_("LOCAL inode data\n")); > > - if (mode == S_IFDIR) { > > - xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); > > - } > > - *ptr += be32_to_cpu(op_head->oh_len); > > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > > - return 1; > > - } > > + case XFS_ILOG_UUID: > > + printf(_("UUID inode: no extra region\n")); > > break; > > + case XFS_ILOG_DEXT: > > + case XFS_ILOG_DBROOT: > > + case XFS_ILOG_DDATA: > > Do you need to test for these other flags here? It's defensive code - ensuring that they never overlap as the fields are mutually exclusive. i.e if XFS_ILOG_DEV or XFS_ILOG_UUID is set, the data fork format flags should not be set as the other two fields indicate the data fork contents.... > > + default: > > + xlog_panic(_("xlog_print_trans_inode: illegal inode type 0x%x"), > > + f->ilf_fields); > > } > > - case XFS_ILOG_AEXT: { > > - ASSERT(f->ilf_size == 3); > > + } > > + > > + if (f->ilf_fields & (XFS_ILOG_DFORK | XFS_ILOG_AFORK)) { > > + ASSERT(f->ilf_size <= 4); > > Can you explain this ASSERT? I saw only ilf_size == 3 in the old code. Under > what circumstances can it be 4? Maybe when multiple ilf_fields are set? XFS_ILOG_CORE | XFS_ILOG_TIMESTAMP | XFS_ILOG_DFORK | XFS_ILOG_AFORK > > + ASSERT((f->ilf_size == 3) || (f->ilf_fields & XFS_ILOG_AFORK)); > > I also don't understand this ASSERT. It seems like in the old code all of the > AFORK related cases had an ASSERT for ilf_size == 3. It's valid - if the size is not 3, the the attribute for must be logged - it's the only way to get 4 format items. > > > + if (f->ilf_fields & XFS_ILOG_DFORK) { > > (*i)++; > > xlog_print_op_header(op_head, *i, ptr); > > - printf(_("EXTENTS inode attr\n")); > > - *ptr += be32_to_cpu(op_head->oh_len); > > - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { > > - return 1; > > + > > + switch (f->ilf_fields & XFS_ILOG_DFORK) { > > + case XFS_ILOG_DEXT: > > + printf(_("EXTENTS inode data\n")); > > + break; > > + case XFS_ILOG_DBROOT: > > + printf(_("BTREE inode data\n")); > > + break; > > + case XFS_ILOG_DDATA: > > + printf(_("LOCAL inode data\n")); > > + if (mode == S_IFDIR) > > + xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); > > + break; > > + case XFS_ILOG_DEV: > > + case XFS_ILOG_UUID: > > ILOG_DEV and ILOG_UUID aren't in ILOG_DFORK. You needn't test for them, correct? See above. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Jan 22 15:35:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8E2F77F37 for ; Tue, 22 Jan 2013 15:35:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 367A9AC008 for ; Tue, 22 Jan 2013 13:35:00 -0800 (PST) X-ASG-Debug-ID: 1358890498-04bdf0231e94bc0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tE9ITZMnluNh3r1k for ; Tue, 22 Jan 2013 13:34:58 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PAL8F/1B5LKUj/2dsb2JhbABEuBWGFxdzgh4BAQQBOhwjEAgDDgcDCSUPBSUDIROIEwW9QBWMdIQtA5YLkEqDCYFT Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 08:04:41 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxlUO-0005Gv-Gi; Wed, 23 Jan 2013 08:34:40 +1100 Date: Wed, 23 Jan 2013 08:34:40 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files Message-ID: <20130122213440.GL2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] [RFC] xfs: limit speculative prealloc size on sparse files References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-3-git-send-email-david@fromorbit.com> <50FEE2AC.9050005@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FEE2AC.9050005@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358890498 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.2.120611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 02:04:12PM -0500, Brian Foster wrote: > On 01/21/2013 07:53 AM, Dave Chinner wrote: > > From: Dave Chinner > > > > This is an RFC that follow sup from a conversion Eric and I had on > > IRC. The idea is to prevent EOF speculative preallocation from > > triggering larger allocations on IO patterns of > > truncate--to-zero-seek-write-seek-write-.... which results in > > non-sparse files for large files. This, unfortunately, is the way cp > > behaves when copying sparse files, and it results in sub-optimal > > destination file layouts. > > > > What this code does is that it looks at the current extent over the > > new EOF location, and if it is a hole it turns off preallocation > > altogether. To avoid the next write from doing a large prealloc, it > > takes the size of subsequent preallocations from the current size of > > the existing EOF extent. IOWs, if you leave a hole in the file, it > > resets preallocation behaviour to the same as if it was a zero size > > file. > > > > I haven't fully tested this, so I'm not sure if it works exactly > > like I think it should, but I wanted to get this out there to get > > more eyes on it... > > > > On a quick test, I didn't quite get the behavior documented below. Is it > possible your test file had the initial extent preallocated from an xfs > module with the current preallocation scheme? No, I didn't run the test on an unmodified kernel. It is possible that I didn't remove it or truncate it between identical tests or tests with different offsets, though. I get the same result as what I posted. Note that I am using a CRC enabled kernel and filesystem here, and it's 17TB in size, but that shouldn't affect the preallocation algorithm... $ sudo mkfs.xfs -f -l size=131072b,sunit=8 -m crc=1 /dev/vdc meta-data=/dev/vdc isize=512 agcount=17, agsize=268435455 blks = sectsz=512 attr=2, projid32bit=0 = crc=1 data = bsize=4096 blocks=4563402735, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=131072, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 $ sudo mount -o nobarrier,logbsize=256k /dev/vdc /mnt/scratch $ sudo xfs_io -f -c "pwrite 0 31m" -c "pwrite 33m 1m" -c "pwrite 128m 1m" -c "fiemap -v" /mnt/scratch/blah wrote 32505856/32505856 bytes at offset 0 31 MiB, 7936 ops; 0.0000 sec (1.036 GiB/sec and 271501.8816 ops/sec) wrote 1048576/1048576 bytes at offset 34603008 1 MiB, 256 ops; 0.0000 sec (738.007 MiB/sec and 188929.8893 ops/sec) wrote 1048576/1048576 bytes at offset 134217728 1 MiB, 256 ops; 0.0000 sec (55.772 MiB/sec and 14277.7468 ops/sec) /mnt/scratch/blah: EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS 0: [0..65535]: 128..65663 65536 0x0 1: [65536..67583]: hole 2048 2: [67584..133119]: 67712..133247 65536 0x0 3: [133120..262143]: hole 129024 4: [262144..393215]: 262272..393343 131072 0x1 $ > > What I see is that sequential writes to a file disable preallocation > completely (so the first extent in the test below is 31m instead of > 32m). Digging a bit further, it seemed to be due to start_fsb always > being a hole. I hacked that a bit to read the extent of the block > immediately previous to the write offset (instead of the inode size), e.g.: > > start_fsb = XFS_B_TO_FSBT(mp, offset); > if (start_fsb) > start_fsb--; > > ... and I seem to get expected behavior, at least in the simple xfs_io test. I'll have a look at it if I get time before LCA, otherwise it will be a couple of weeks before I get back to it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Jan 22 15:44:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B4DF87F53 for ; Tue, 22 Jan 2013 15:44:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A30E5304039 for ; Tue, 22 Jan 2013 13:44:38 -0800 (PST) X-ASG-Debug-ID: 1358891076-04cbb00c638bb80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id v00PylPpOeeQ6Z6v for ; Tue, 22 Jan 2013 13:44:37 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PAMsG/1B5LKUj/2dsb2JhbABEuBSGFxdzgh4BAQQBOhwjBQsIAw4KCSUPBSUDIROIEwW9NxWMZw2ELQOWC5BKgwmBUgEf Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 08:14:36 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Txldz-0005I6-H5; Wed, 23 Jan 2013 08:44:35 +1100 Date: Wed, 23 Jan 2013 08:44:35 +1100 From: Dave Chinner To: David Sterba Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: make length of diff output configurable Message-ID: <20130122214435.GM2498@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make length of diff output configurable References: <1358863307-16489-1-git-send-email-dsterba@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358863307-16489-1-git-send-email-dsterba@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358891076 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.2.120611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 03:01:46PM +0100, David Sterba wrote: > In commit 11c1d79414e2571 "xfstests: Change the diff output of failed > tests", the diff output of a failed test was hardcoded to 10 lines to > avoid overly long output and user can get the full output by manually > running the diff. However this is not always possible and convenient, > eg. in repeated automated tests where the required information is lost > after the test round finished. Then the caputred logs do not contain > enough informatin for analysis. Ah, the problem of pulling in year old patches from the list without first posting them for review again has struck again. I noticed this same change of behaviour a couple of days again when I updated and it lead to a few WTF moments for me, too. Maintainers, we've talked about this before. Please don't just pull in old patches that have been sitting on the list ignored for months - post them for review again first so people at least have a heads up that behaviour is going to change soon. > Introduce the DIFF_LENGTH env variable to tune the diff size, keeping it > 10 as deafult and 0 to disable the limit. Seems reasonable. Implementation comment below. > Signed-off-by: David Sterba > --- > README | 2 ++ > check | 7 ++++++- > common.config | 2 ++ > 3 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/README b/README > index d81ede9..b70f75d 100644 > --- a/README > +++ b/README > @@ -63,6 +63,8 @@ Preparing system for tests (IRIX and Linux): > - if TEST_LOGDEV and/or TEST_RTDEV, these will always be used. > - if SCRATCH_LOGDEV and/or SCRATCH_RTDEV, the USE_EXTERNAL > environment variable set to "yes" will enable their use. > + - setenv DIFF_LENGTH "number of diff lines to print from a failed test", > + by default 10, set to 0 to print the full diff > - or add a case to the switch in common.config assigning > these variables based on the hostname of your test > machine > diff --git a/check b/check > index 75addb5..8b79678 100755 > --- a/check > +++ b/check > @@ -287,7 +287,12 @@ do > else > echo " - output mismatch (see $seq.out.bad)" > mv $tmp.out $seq.out.bad > - $diff $seq.out $seq.out.bad | head -n 10 | \ > + $diff $seq.out $seq.out.bad | { > + if [ "$DIFF_LENGTH" -le 0 ]; then > + cat > + else > + head -n "$DIFF_LENGTH" > + fi; } | \ > sed -e 's/^\(.\)/ \1/' > echo " ..." > echo " (Run '$diff $seq.out $seq.out.bad' to see the" \ > diff --git a/common.config b/common.config > index 57f505d..8dfe574 100644 > --- a/common.config > +++ b/common.config > @@ -63,6 +63,8 @@ HOSTOS=`uname -s` > MODULAR=0 # using XFS as a module or not > BOOT="/boot" # install target for kernels > export EXTRA=${EXTRA:=xfs-qa} > +# number of diff lines from a failed test, 0 for whole output > +export DIFF_LENGTH=${DIFF_LENGTH:=10} I'd actually set that in the check executable, as the diff output is a function of the check program, not the generic test harness config... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Tue Jan 22 15:52:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C920F7F54 for ; Tue, 22 Jan 2013 15:52:04 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 456D7AC008 for ; Tue, 22 Jan 2013 13:52:04 -0800 (PST) X-ASG-Debug-ID: 1358891520-04cbb00c668c050001-NocioJ Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id gFeCO8AxrHtdaNjZ for ; Tue, 22 Jan 2013 13:52:01 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.3 Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 3DEAEA628C; Tue, 22 Jan 2013 22:51:55 +0100 (CET) Date: Tue, 22 Jan 2013 22:51:46 +0100 From: Emmanuel Florac To: Alvin Ong Cc: xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files Message-ID: <20130122225146.29064bba@galadriel.home> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: References: 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: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1358891520 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.2.120614 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 22 Jan 2013 12:22:42 +0800 vous =C3=A9criviez: > We plan to use a 6+2 RAID6 to start off with. Bad, bad idea. 6+2 RAID-6 performance sucks. If you want decent performance, use at least 12 to 16 drives arrays. See these tests (all using the same HGST HUA 2 TB drives, and Adaptec 5xx5 controllers, and XFS) : 6+2 2TB RAID-6 sequential performance : write 580 MB/s, read 660 MB/s 10+2 2TB RAID-6 sequential performance: write 800 MB/s, read 1250 MB/s 14+2 2TB RAID-6 sequential performance: write 830 MB/s, read 1300 MB/s 22+2 2TB RAID-6 sequential performance: write 900 MB/s, read 1400 MB/s As you can see, maximum controller throughput is reached around 12 to 16 drives. And the difference in IOPS is even more obvious. Better controllers will give you more oomph with wider arrays (but at higher cost, obviously). > Then when it gets > filled up to maybe 60-70% we will > expand by adding another 6+2 RAID6 to the array. > The max we can grow this configuration is up to 252TB usable which > should be enough for a year. > Our requirements might grow up to 2PB in 2 years time if all goes > well. And you'll always write to the latest RAID only. Plan for that: you need your base array to be fast enough to serve your planned traffic in 2 years time, else you'll have to ditch everything and rebuild it from the ground up. > So I have been testing all of this out on a VM running 3 vmdk's and > using LVM to create a single logical volume of the 3 disks. > I noticed that out of sdb, sdc and sdd, files keep getting written to > sdc. This is probably due to our web app creating a single folder and > all files are written under that folder. No, this is due to the fact that LVM can't stripe across physical volumes if you keep adding them, and that xfs can't optimze AGs after extension. If you start with one volume then add one, and another one, you'll always be writing to the volumes sequentially. Therefore your maximum write performance will always be that of the current volume, making it more obvious that you must look for the fastest single volume performance from the start. >=20 > Is LVM a good choice of doing this configuration? Or do you have a > better recommendation? You could try a parallel filesystem like Lustre, PVFS2, Gluster, Ceph... These are precisely made to overcome these kind of problems and scaling by adding more nodes. Lustre and PVFS2 are HPC-oriented. Lustre is a complete PITA to be reserved to specialists. PVFS2 is relatively easy to set up, run and extend (if properly planned beforehand), and can run for years without a glitch. Gluster and Ceph are more "internet oriented" and won't give as much performance (well actually they're pretty slow) but provide redundancy and on-the-fly expansion. >=20 > Mount options: > /dev/mapper/vg_xfs-lv_xfs on /xfs type xfs > (rw,noatime,nodiratime,logdev=3D/dev/vg_xfs/lv_log_xfs,nobarrier,inode64,= logbsize=3D262144,allocsize=3D512m) >=20 > Is I was to use the 8-disk RAID6 array with a 256kB stripe size will > have a sunit of 512 and a swidth of (8-2)*512=3D3072. > # mkfs.xfs -d sunit=3D512,swidth=3D3072 /dev/mapper/vg_xfs-lv_xfs > # mount -o remount,sunit=3D512,swidth=3D3072 > Correct? Don't bother, use su and sw: su=3D256k,sw=3D6=20 =20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From bfoster@redhat.com Tue Jan 22 15:54:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BA2CC7F55 for ; Tue, 22 Jan 2013 15:54:00 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A80538F804B for ; Tue, 22 Jan 2013 13:53:57 -0800 (PST) X-ASG-Debug-ID: 1358891636-04cbb00c668c130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B2vBrODvl8YDF020; Tue, 22 Jan 2013 13:53:56 -0800 (PST) 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 r0MLrurc013009 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 16:53:56 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0MLrtm0006705 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 16:53:56 -0500 Message-ID: <50FF09F5.1000702@redhat.com> Date: Tue, 22 Jan 2013 16:51:49 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH RFC] xfs: run a filtered eofblocks scan on edquot/enospc References: <1354913396-42206-1-git-send-email-bfoster@redhat.com> <20130122185229.GS27055@sgi.com> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: run a filtered eofblocks scan on edquot/enospc In-Reply-To: <20130122185229.GS27055@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358891636 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 01/22/2013 01:52 PM, Ben Myers wrote: > Hey Brian, > > On Fri, Dec 07, 2012 at 03:49:56PM -0500, Brian Foster wrote: ... >> /* >> + * A quota failure can be represented as EDQUOT or ENOSPC in the case >> + * of project quotas. Check the quotas explicitly for low space >> + * conditions, run a prealloc scan if warranted and retry. Otherwise, >> + * proceed to general ENOSPC handling. >> + */ >> + if ((ret == -EDQUOT || ret == -ENOSPC) && !edquot) { >> + edquot = 1; >> + if (xfs_inode_free_quota_eofblocks(ip)) >> + goto write_retry; >> + } > > It looks like you have the iolock held across this call to free eofblocks. Is > it possible that this inode would already have some eofblocks, be tagged on the > radix tree, and you'd try to get the lock a second time? > Yeah, we're doing a SYNC_WAIT eofblocks scan here so it does seem to be a possibility. It looks like I should drop and reacquire the lock around the xfs_inode_free_quota_eofblocks() call. > I think you're right about XFS_IS_*QUOTA_ENFORCED. > > Neat patch! I wish we had a solid way to know which quota was enforced at this > level. Still, this is much better than trimming eofblocks on all inodes. > Thanks for reviewing. I agree on the quota bit, I figured this approach would be more appropriate than burying it in the reservation code, since the alternative is an error back to userspace. I'll plan to add the flush bits and polish this up. Brian > -Ben > From david@fromorbit.com Tue Jan 22 16:05:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 05AC47F58 for ; Tue, 22 Jan 2013 16:05:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E79E0304048 for ; Tue, 22 Jan 2013 14:05:16 -0800 (PST) X-ASG-Debug-ID: 1358892314-04cb6c391592200001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GG3vr3fpv4TWrTNB for ; Tue, 22 Jan 2013 14:05:14 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao4PAHgM/1B5LKUj/2dsb2JhbABEuBWGFxdzgh4BAQMBATocIwULCAMYCSUPBSUDIRMbAYd3BQ29MRWMf4QiA5YLkEqDCYFT Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 08:35:13 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Txlxw-0005LW-0S; Wed, 23 Jan 2013 09:05:12 +1100 Date: Wed, 23 Jan 2013 09:05:11 +1100 From: Dave Chinner To: Stan Hoeppner Cc: Alvin Ong , xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files Message-ID: <20130122220511.GN2498@dastard> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files References: <50FE8AEA.7020300@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FE8AEA.7020300@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358892314 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_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120614 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Jan 22, 2013 at 06:49:46AM -0600, Stan Hoeppner wrote: > On 1/21/2013 10:22 PM, Alvin Ong wrote: > > Hi, > > > > We are building a solution with a web front end for our users to store > > large files. > > Large files starting from the size of 500GB and above and can grow up to > > 1-2TB's per file. > > This is the reason we are trying out XFS to see if we can get a test system > > running. > > Tell us more about these files. Is this simply bulk file storage? > Start at 500GB and append until 2TB? How often will the files be > appended and at what rate? I.e. will it take 3 days to append from > 500GB to 2TB or take 3 months? The answer to this dictates how the > files and filesystem will fragment over time. Constantly expanding with > additional 6 spindle constituent arrays, LVM concatenation, and > xfs_growfs may leave you with an undesirable, possibly disastrous, > fragmentation pattern. I'd say it's guaranteed, not a possibility. > > We plan to use a 6+2 RAID6 to start off with. Then when it gets filled up > > to maybe 60-70% we will > > expand by adding another 6+2 RAID6 to the array. > > The max we can grow this configuration is up to 252TB usable which should > > be enough for a year. > > Our requirements might grow up to 2PB in 2 years time if all goes well. > > I'd not attempt growing a single XFS to the scale you're describing, via > the methods you describe. The odds of catastrophe are too great. It's a recipe for disaster and not recommended at all. > > So I have been testing all of this out on a VM running 3 vmdk's and using > > LVM to create a single logical volume of the 3 disks. > > I noticed that out of sdb, sdc and sdd, files keep getting written to sdc. > > This is probably due to our web app creating a single folder and all files > > are written under that folder. > > This is the nature of the Allocation Group of XFS? Is there a way to avoid > > this? > > Yes. > > 1. Don't put all files in a single directory. > > 2. Use the inode32 allocator on a filesystem greater than 1TB in size. > This will cause inodes to be located in the first 1TB and files to be > allocated round robin across the AGs via rotor stepping. See page 10: > http://oss.sgi.com/projects/xfs/training/xfs_slides_06_allocators.pdf 3: Use a storage layout that is not affected by hotspots due to filesystem locality. That is, build the storage to the scale that you are likely to need in the future. i.e. use all 112 disks (14x 6+2 RAID = 112 disks) to begin with and lay the storage and filesystem out optimally accordingly. I'd build seven 14+2 hardware RAID6 luns (112 disks) and stripe them in RAID0, setting the XFS stripe unit to be the width of a hardware RAID6 lun. That way sequential IO to a single region of the disk still hits every single disk in the array, and hotspots don't occur. If you do this, it doesn't matter if you use inode64 or inode32 for a hotspot perspective, only a file fragmentation perspective. This is the way XFs has been used for exactly this sort of storage for the last 15 years.... > > As we will have files keep writing to the same disk thus creating a > > hot spot. > > Although it might not hurt us that much if we fill up a single RAID6 to > > 60-70% then adding another RAID6 to the mix. We could go up to a total of > > 14 RAID6 sets. > > Again, you probably don't want to do this. Too many eggs in one basket. > > You should investigate using GlusterFS to tie multiple XFS storage > servers together into a single file tree. Another possible solution. You should talk to RedHat (says the RedHat employee ;).... > Running an xfs_repair on a single filesystem denies all access, and with > a 252TB XFS this could take some time. For a filesystem with 1-2TB files, it'll take 30s to run. That's not an issue. > > Is LVM a good choice of doing this configuration? Or do you have a better > > recommendation? > > The reason we thought LVM would be good was so that we could easily grow > > XFS. > > Why not do the concatenation within the SAN array controller? Same problem as LVM concatenation. Hot spots. > > Is I was to use the 8-disk RAID6 array with a 256kB stripe size will have a > > sunit of 512 and a swidth of (8-2)*512=3072. > > So a 256KB strip and a 1.5MB stripe. With RAID6 RMW? I wouldn't > recommend this. Large files, sequential IO, there will be no RMW cycles in the RAID. The write cache of RAID controller will do the aggregation of individual IOs into full stripe writes just fine. > It appears most of your writes will be appends, meaning little > allocation, which means little stripe aligned write out. Here you are > trying to optimize for large IOs which would be fine if you had an all > or mostly allocation workload, but you don't. You have an append heavy > workload. > > Using large strips (stripe units, chunks) with parity RAID, especially > RAID6, will simply murder your append performance due to massive > read-modify-write operations on large strips. No, that's wrong. sequential IO will always fill full stripes in the cache, so RMW cycles simple will not happen. Remember that RMW occurs whenteh cache has to be flushed to the back end disks, not when writes come in to the front end cache.... > With RAID6 with a mostly append workload, you should be using a small > strip size. This has been discussed here at length and the consensus is > anything over a 32KB strip size doesn't improve performance, but can > hurt performance, especially with parity RAID. Thus you should create > your 6+2 arrays with a 32KB strip and (6*32)=192KB stripe, and create > your XFS with "-d su=32k,sw=6". This should yield significantly better > append performance. That's a tuning for an IOPS intensive workload, not a large scale, large file storage workloads. While sequential writes are an append workload, it's an append workload that the RAID controller is optimised to avoid causing RMW cycles for. As such, the above is bad advice for large files with sequential IO workloads. Large files, large fielsystem, sequential IO is ideal for large RAID6 widths.... > External log devices are for systems that modify metadata at rates of > hundreds of IOs per second. So don't specify a log device. Even at hundreds of thousands of IOs per second, external logs don't provide much in way of benefit thanks to delayed logging. The only reason for using an external log these days is a fsync heavy or synchronous write workload. And in most cases a BBWC means even those worklaods don't need an external log... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Jan 22 16:05:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 769627F5F for ; Tue, 22 Jan 2013 16:05:33 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44898304048; Tue, 22 Jan 2013 14:05:33 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1B9494266DC; Tue, 22 Jan 2013 16:05:33 -0600 (CST) Date: Tue, 22 Jan 2013 16:05:33 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/7] xfs: reorganize xfs_iomap_prealloc_size to remove indentation Message-ID: <20130122220532.GU27055@sgi.com> References: <1357150091-37530-1-git-send-email-bfoster@redhat.com> <1357150091-37530-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357150091-37530-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Wed, Jan 02, 2013 at 01:08:05PM -0500, Brian Foster wrote: > The majority of xfs_iomap_prealloc_size() executes within the > check for lack of default I/O size. Reverse the logic to remove the > extra indentation. > > Signed-off-by: Brian Foster > Reviewed-by: Dave Chinner FWIW, this one looked ok to me too. Reviewed-by: Ben Myers Regards, Ben From david@fromorbit.com Tue Jan 22 16:22:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A59447F50 for ; Tue, 22 Jan 2013 16:22:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 939518F8037 for ; Tue, 22 Jan 2013 14:22:37 -0800 (PST) X-ASG-Debug-ID: 1358893355-04cbb00c668d150001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZRZVdxsTZzSMcmq8 for ; Tue, 22 Jan 2013 14:22:35 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PALsQ/1B5LKUj/2dsb2JhbABEuBWGFxdzgh4BAQQBOhwjBQsIAxgJJQ8FJQMhE4gTBb1AFYx/hCIDlguQSoMJgVM Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 08:52:19 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxmEU-0005Nz-PR; Wed, 23 Jan 2013 09:22:18 +1100 Date: Wed, 23 Jan 2013 09:22:18 +1100 From: Dave Chinner To: Samuel Kvasnica Cc: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance Message-ID: <20130122222218.GO2498@dastard> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance References: <50FE73A4.7020308@ims.co.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FE73A4.7020308@ims.co.at> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358893355 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.2.120616 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 12:10:28PM +0100, Samuel Kvasnica wrote: > Hi folks, > > I would like to hear about your experience with the performance of XFS when > used on NFS client mounted using Infininband RDMA connection on 3.4.11 > kernel. > > What we observe is following: > > - we do have local RAID storage with 1.4GB/s read and write performance > (both dd on raw partition > and on xfs filesystem give basically the same performance) > > - we do have QDR Infiniband connection (Mellanox), the rdma benchmark > gives 29Gbit/s throughput > > Now, both above points look pretty Ok but if we mount an nfs export > using rdma on client we never get the 1.4GB/s throughput. Of course not. The efficiency of the NFS client/server write protocol makes it a theoretical impossibility.... > Sporadically (and especially at the beginning) it comes up to some > 1.3GB/s for short period but then it starts oscillating > between 300MB/s and some 1.2GB/s with an average of 500-600MB/s. Even > when using more clients in parallel, > the net throughput behaves the same so it seems to be a server-side > related bottleneck. > We do not see any remarkable CPU load. Sounds exactly like the usual NFS server/client writeback exclusion behaviour. i.e. while there is a commit being processed by the server, the client is not sending any new writes across the wire. hence you get the behaviour: client server send writes cache writes send commit fsync start writeback ...... finish writeback send commit response send writes cache writes send commit fsync start writeback ...... finish writeback send commit response and so you see binary throughput - either traffic comes across the wire, or the data is being written to disk. They don't happen at the same time. If it's not scaling with multiple clients, then that implies you don't have enough nfsd's configured to handle the incoming IO requests. This is a commmon enough NFS problem, you shoul dbe able to find tips from google dating back for years on how to tune your NFS setup to avoid these sorts of problems. > The interesting point is, we use btrfs filesystem on server instead of > xfs now (with otherwise same config) and we are getting consistent, > steady throughput > around 1.2-1.3GB/s. Different fsync implementation, or the btrfs configuration is ignoring commits (async export, by any chance?) Cheers, Dave. -- Dave Chinner david@fromorbit.com From unlock.service@stgeorge.com.au Tue Jan 22 16:37:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_ONLY_32, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2A5E7F5D for ; Tue, 22 Jan 2013 16:37:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0FE4304048 for ; Tue, 22 Jan 2013 14:37:51 -0800 (PST) X-ASG-Debug-ID: 1358894269-04cb6c3915942e0001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.186]) by cuda.sgi.com with ESMTP id vvd2TzVDGYdjvfPX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 22 Jan 2013 14:37:49 -0800 (PST) X-Barracuda-Envelope-From: unlock.service@stgeorge.com.au X-Barracuda-Apparent-Source-IP: 212.227.126.186 Received: from icpu2586.kundenserver.de (infong-es85.1and1.es [212.227.221.5]) by mrelayeu.kundenserver.de (node=mreu2) with ESMTP (Nemesis) id 0MARW2-1TmHCw2oUk-00C46h; Tue, 22 Jan 2013 23:37:48 +0100 Received: from 41.14.161.138 (IP may be forged by CGI script) by icpu2586.kundenserver.de with HTTP id 4AG7mW-1TFgHV2J5l-00iT6t; Tue, 22 Jan 2013 23:37:48 +0100 X-Sender-Info: <412040538@icpu2586.kundenserver.de> Date: Tue, 22 Jan 2013 23:37:48 +0100 Message-Id: <4AG7mW-1TFgHV2J5l-00iT6t@icpu2586.kundenserver.de> Precedence: bulk To: xfs@oss.sgi.com Subject: Important Notice - Online Account Locked From: St.George Internet Banking X-ASG-Orig-Subj: Important Notice - Online Account Locked Reply-To: MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit X-Provags-ID: V02:K0:YOg3q9U3ah/EmibJUHldOj+cLHEdLz4Z5HhUDLmFKzv iU0n7PxZfgOCHEm+GNL9qInu/BKx5RzYF+oFqTUS4IfaOqwUtm w9kc+vXHGbZSQaWpru8MTC3v/0mVnkvjzhgpJqmKHirxPetzrA DjVpg1VYA7zI7oXV4ugHg4lKHUaoqHpKs6qJ2ejUbUPLz+1PLe 0gPa7QsXnWSgWa2FOrXwHjSR/dMiYAda/JiwcNL8nTDFtVc40X 4OtaMA4NXdYrO/WXdp9WkEZdUHIBZpGcpBnmrhHBvrnybyYbED Glp/ghqSrHrS1jkDi4SM4HbuVjJk2gkqmK4sjy/Z0M6Bbw/Kby jYPxYZKcZ6mN+CP5Gn8JbJOA3aKjTXHPWQu/hSwn8Y5bLA9yk1 JeIajCR5rx9dOt2Ak1JcbI1p63ZqObpa+w= X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.186] X-Barracuda-Start-Time: 1358894269 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=HTML_IMAGE_ONLY_32, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120616 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message New Page 1

    http://promos.stgeorge.com.au/resources/images/popup/logo.gif

    Dear Customer

    Your online banking has been temporarily suspended, due to 3 unsuccessful login attempt on your account.
    To uplift this suspension, Please click on the Unlock option Below and confirm your account details.

    Unlock

    IMPORTANT - You are strictly advised to match your Sensitive Details correctly to avoid service denial.

    Yours sincerely,
    St.George Bank Customer Service

    From david@fromorbit.com Tue Jan 22 16:37:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 64D937F62 for ; Tue, 22 Jan 2013 16:37:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9FC0AC009 for ; Tue, 22 Jan 2013 14:37:49 -0800 (PST) X-ASG-Debug-ID: 1358894267-04cb6c3912942d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wSVzadIUypG3DdVK for ; Tue, 22 Jan 2013 14:37:48 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PAAgT/1B5LKUj/2dsb2JhbABEuBWGFhdzgh4BAQU6HCMQCAMOBwMJJQ8FJQMhE4gYDb0sFYx0B4QmA5YLkEqDCYFT Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 09:07:47 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxmTS-0005Pc-51; Wed, 23 Jan 2013 09:37:46 +1100 Date: Wed, 23 Jan 2013 09:37:46 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds Message-ID: <20130122223746.GP2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-4-git-send-email-david@fromorbit.com> <50FEA326.5000402@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FEA326.5000402@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358894267 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.2.120616 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 09:33:10AM -0500, Brian Foster wrote: > On 01/21/2013 07:53 AM, Dave Chinner wrote: > > From: Dave Chinner > > > > There is a window on small filesytsems where specualtive > > preallocation can be larger than that ENOSPC throttling thresholds, > > resulting in specualtive preallocation trying to reserve more space > > than there is space available. This causes immediate ENOSPC to be > > triggered, prealloc to be turned off and flushing to occur. One the > > next write (i.e. next 4k page), we do exactly the same thing, and so > > effective drive into synchronous 4k writes by triggering ENOSPC > > flushing on every page while in the window between the prealloc size > > and the ENOSPC prealloc throttle threshold. > > > > Fix this by checking to see if the prealloc size would consume all > > free space, and throttle it appropriately to avoid premature > > ENOSPC... > > > > Would this alternatively be resolved by the updated throttling code that > is part of my quota prealloc throttling set? I'm referring to the > following patch in particular: > > http://oss.sgi.com/archives/xfs/2013-01/msg00003.html Not quite. If shift is set (i.e. within either the quota or ENOSPC throttling zone) then it will have a similar-but-not-as-drastic effect, but the bug reported (and being fixed) is for when freespace is outside the throttling zone, but the prealloc is large enough to use all remaining free space. The config that this was found on was a 100GB filesystem, so the ENOSPC throttling only kicks in at 5GB freespace remaining, but prealloc was triggering ENOSPC flushing at 7GB freespace remaining by trying to prealloc a 8GB delalloc extent and throttling wasn't preventing that. In that case, your patch allows preallocation to try to use all of the remaining free space in one go. It is likely to fail in the same way as if it didn't cap the alloc_size to freesp, as the metadata overhead of the delalloc reservation will push the requested amount of space over the amount of remaining free space. Further, even if we have throttled a prealloc of MAXEXTLEN to the highest threshold (i.e 2^21>>6 = 2^15 = 128MB at 4k block size) we may still be over the amount of free space remaining, and in that case we need to keep throttling the preallocation down to below the free space so we don't use all the remaining space in one go. So it's really handling corner cases for a different corner to the ones that the your code is handling. It's like a mandlebrot set - corners within corners. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Jan 22 16:47:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B41D67F61 for ; Tue, 22 Jan 2013 16:47:17 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29342AC002; Tue, 22 Jan 2013 14:47:17 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id BAFF64266DC; Tue, 22 Jan 2013 16:47:16 -0600 (CST) Date: Tue, 22 Jan 2013 16:47:16 -0600 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: push rounddown_pow_of_two() to after prealloc throttle Message-ID: <20130122224716.GV27055@sgi.com> References: <1357150091-37530-1-git-send-email-bfoster@redhat.com> <1357150091-37530-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1357150091-37530-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Wed, Jan 02, 2013 at 01:08:06PM -0500, Brian Foster wrote: > The round down occurs towards the beginning of the function. Push > it down after throttling has occurred. This is to support adding > further transformations to 'alloc_blocks' that might not preserve > power-of-two alignment (and thus could lead to rounding down > multiple times). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_iomap.c | 21 +++++++++++++++------ > 1 files changed, 15 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index bd7c060..b2002a5 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -329,13 +329,14 @@ xfs_iomap_prealloc_size( > goto check_writeio; > > /* > - * rounddown_pow_of_two() returns an undefined result > - * if we pass in alloc_blocks = 0. Hence the "+ 1" to > - * ensure we always pass in a non-zero value. > + * MAXEXTLEN is not a power of two value but we round the prealloc down > + * to the nearest power of two value after throttling. To prevent the > + * round down from unconditionally reducing the maximum supported prealloc > + * size, we round up first, apply appropriate throttling, round down and > + * cap the value to MAXEXTLEN. > */ > - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; > - alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, > - rounddown_pow_of_two(alloc_blocks)); > + alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), > + XFS_B_TO_FSB(mp, XFS_ISIZE(ip))); > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > freesp = mp->m_sb.sb_fdblocks; > @@ -352,6 +353,14 @@ xfs_iomap_prealloc_size( > } > if (shift) > alloc_blocks >>= shift; > + /* > + * rounddown_pow_of_two() returns an undefined result if we pass in > + * alloc_blocks = 0. > + */ > + if (alloc_blocks) > + alloc_blocks = rounddown_pow_of_two(alloc_blocks); > + if (alloc_blocks > MAXEXTLEN) > + alloc_blocks = MAXEXTLEN; Well that hurt my brain cell. It turns out: xfs_fsblock_t len, len2, len3; len = MAXEXTLEN; len2 = roundup_pow_of_two(len); len3 = rounddown_pow_of_two(len2); printk("maxextlen %lu up one %lu down one %lu\n", len, len2, len3); prints: maxextlen 2097151 up one 2097152 down one 2097152 Looks good Brian. Reviewed-by: Ben Myers From samuel.kvasnica@ims.co.at Tue Jan 22 16:49:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A08E17F63 for ; Tue, 22 Jan 2013 16:49:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2AF3CAC002 for ; Tue, 22 Jan 2013 14:49:48 -0800 (PST) X-ASG-Debug-ID: 1358894986-04cb6c3913947f0001-NocioJ Received: from mail.ims.co.at (mail.ims.co.at [81.223.138.19]) by cuda.sgi.com with ESMTP id 972XqRoI4qkOgI1L (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 14:49:47 -0800 (PST) X-Barracuda-Envelope-From: samuel.kvasnica@ims.co.at X-Barracuda-Apparent-Source-IP: 81.223.138.19 Received: from home-pc.home.kvasnica.net (fw.kvasnica.net [213.235.217.114]) by mail.ims.co.at (Postfix) with ESMTPSA id DF95413F9F; Tue, 22 Jan 2013 23:49:45 +0100 (CET) Message-ID: <50FF1789.2050107@ims.co.at> Date: Tue, 22 Jan 2013 23:49:45 +0100 From: Samuel Kvasnica User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130105 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance References: <50FE73A4.7020308@ims.co.at> <20130122222218.GO2498@dastard> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance In-Reply-To: <20130122222218.GO2498@dastard> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.ims.co.at[81.223.138.19] X-Barracuda-Start-Time: 1358894986 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.2.120618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/22/2013 11:22 PM, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 12:10:28PM +0100, Samuel Kvasnica wrote: >> Hi folks, >> >> I would like to hear about your experience with the performance of XFS when >> used on NFS client mounted using Infininband RDMA connection on 3.4.11 >> kernel. >> >> What we observe is following: >> >> - we do have local RAID storage with 1.4GB/s read and write performance >> (both dd on raw partition >> and on xfs filesystem give basically the same performance) >> >> - we do have QDR Infiniband connection (Mellanox), the rdma benchmark >> gives 29Gbit/s throughput >> >> Now, both above points look pretty Ok but if we mount an nfs export >> using rdma on client we never get the 1.4GB/s throughput. > Of course not. The efficiency of the NFS client/server write > protocol makes it a theoretical impossibility.... hmm, well, never seen that bottleneck on NFSv4 so far. Does this apply for NFSv4 as well (as I use NFSv4, not v3). ? > >> Sporadically (and especially at the beginning) it comes up to some >> 1.3GB/s for short period but then it starts oscillating >> between 300MB/s and some 1.2GB/s with an average of 500-600MB/s. Even >> when using more clients in parallel, >> the net throughput behaves the same so it seems to be a server-side >> related bottleneck. >> We do not see any remarkable CPU load. > Sounds exactly like the usual NFS server/client writeback exclusion > behaviour. i.e. while there is a commit being processed by the > server, the client is not sending any new writes across the wire. > hence you get the behaviour: > > client server > send writes cache writes > send commit fsync > start writeback > ...... > finish writeback > send commit response > send writes cache writes > send commit fsync > start writeback > ...... > finish writeback > send commit response > > and so you see binary throughput - either traffic comes across the > wire, or the data is being written to disk. They don't happen at the > same time. > > If it's not scaling with multiple clients, then that implies you > don't have enough nfsd's configured to handle the incoming IO > requests. This is a commmon enough NFS problem, you shoul dbe able > to find tips from google dating back for years on how to tune your > NFS setup to avoid these sorts of problems. Ok, this explanation makes partially sense, on the other hand we are speaking here about just 1.4GB/s which is pretty low load for a Xeon E5 to process and the oscillation between 300-600MB/s is even more low-end. And: why do we see exactly the same for read, not only for write ? I looks to me like there is some too large buffer somewhere on the way which needs to be decreased as it is not needed at all. I cannot recall seeing this earlier on 2.6.2x kernels, unfortunately I cannot test that on new hardware. >> The interesting point is, we use btrfs filesystem on server instead of >> xfs now (with otherwise same config) and we are getting consistent, >> steady throughput >> around 1.2-1.3GB/s. > Different fsync implementation, or the btrfs configuration is > ignoring commits (async export, by any chance?) Well, there is no explicit async mount option. With btrfs write gives full BW, however read is some 10% worse but still acceptable cheers, Sam From bfoster@redhat.com Tue Jan 22 16:58:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C8B4E7F60 for ; Tue, 22 Jan 2013 16:58:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1FA5304048 for ; Tue, 22 Jan 2013 14:58:03 -0800 (PST) X-ASG-Debug-ID: 1358895482-04cb6c3913953c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id a4wGqrs7OW0UjZTi for ; Tue, 22 Jan 2013 14:58:02 -0800 (PST) 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 r0MMw1uu032615 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jan 2013 17:58:01 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0MMw0eI022751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Jan 2013 17:58:01 -0500 Message-ID: <50FF18FA.1020305@redhat.com> Date: Tue, 22 Jan 2013 17:55:54 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-4-git-send-email-david@fromorbit.com> <50FEA326.5000402@redhat.com> <20130122223746.GP2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds In-Reply-To: <20130122223746.GP2498@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1358895482 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 On 01/22/2013 05:37 PM, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 09:33:10AM -0500, Brian Foster wrote: >> On 01/21/2013 07:53 AM, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> There is a window on small filesytsems where specualtive >>> preallocation can be larger than that ENOSPC throttling thresholds, >>> resulting in specualtive preallocation trying to reserve more space >>> than there is space available. This causes immediate ENOSPC to be >>> triggered, prealloc to be turned off and flushing to occur. One the >>> next write (i.e. next 4k page), we do exactly the same thing, and so >>> effective drive into synchronous 4k writes by triggering ENOSPC >>> flushing on every page while in the window between the prealloc size >>> and the ENOSPC prealloc throttle threshold. >>> >>> Fix this by checking to see if the prealloc size would consume all >>> free space, and throttle it appropriately to avoid premature >>> ENOSPC... >>> >> >> Would this alternatively be resolved by the updated throttling code that >> is part of my quota prealloc throttling set? I'm referring to the >> following patch in particular: >> >> http://oss.sgi.com/archives/xfs/2013-01/msg00003.html > > Not quite. If shift is set (i.e. within either the quota or ENOSPC > throttling zone) then it will have a similar-but-not-as-drastic > effect, but the bug reported (and being fixed) is for when freespace > is outside the throttling zone, but the prealloc is large enough to > use all remaining free space. The config that this was found on was > a 100GB filesystem, so the ENOSPC throttling only kicks in at 5GB > freespace remaining, but prealloc was triggering ENOSPC flushing at > 7GB freespace remaining by trying to prealloc a 8GB delalloc extent > and throttling wasn't preventing that. > > In that case, your patch allows preallocation to try to use all of > the remaining free space in one go. It is likely to fail in the same > way as if it didn't cap the alloc_size to freesp, as the metadata > overhead of the delalloc reservation will push the requested amount > of space over the amount of remaining free space. > > Further, even if we have throttled a prealloc of MAXEXTLEN to the > highest threshold (i.e 2^21>>6 = 2^15 = 128MB at 4k block size) we > may still be over the amount of free space remaining, and in that > case we need to keep throttling the preallocation down to below the > free space so we don't use all the remaining space in one go. > > So it's really handling corner cases for a different corner to the > ones that the your code is handling. It's like a mandlebrot set - > corners within corners. ;) > Ok, thanks for the explanation. In fact, it actually sounds like I'll need to include (or preserve) this case in the quota throttling set (e.g., carry the minimum free space available through the per-quota calculations along with the shift and prealloc size and apply the additional reduction based on that). Brian > Cheers, > > Dave. > From bfoster@redhat.com Tue Jan 22 16:58:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 523077F6F for ; Tue, 22 Jan 2013 16:58:41 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D501304039 for ; Tue, 22 Jan 2013 14:58:41 -0800 (PST) X-ASG-Debug-ID: 1358895520-04cb6c391395480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id U2UzZJ0hUUGk45nn for ; Tue, 22 Jan 2013 14:58:40 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0MMweLe032711 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 22 Jan 2013 17:58:40 -0500 Received: from laptop.bfoster (vpn-55-170.rdu2.redhat.com [10.10.55.170]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0MMwdhk001155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 22 Jan 2013 17:58:39 -0500 Message-ID: <50FF1921.6020606@redhat.com> Date: Tue, 22 Jan 2013 17:56:33 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-4-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: limit speculative prealloc near ENOSPC thresholds In-Reply-To: <1358772835-21436-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1358895520 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 On 01/21/2013 07:53 AM, Dave Chinner wrote: > From: Dave Chinner > > There is a window on small filesytsems where specualtive > preallocation can be larger than that ENOSPC throttling thresholds, > resulting in specualtive preallocation trying to reserve more space > than there is space available. This causes immediate ENOSPC to be > triggered, prealloc to be turned off and flushing to occur. One the > next write (i.e. next 4k page), we do exactly the same thing, and so > effective drive into synchronous 4k writes by triggering ENOSPC > flushing on every page while in the window between the prealloc size > and the ENOSPC prealloc throttle threshold. > > Fix this by checking to see if the prealloc size would consume all > free space, and throttle it appropriately to avoid premature > ENOSPC... > > Signed-off-by: Dave Chinner Reviewed-by: Brian Foster > --- > fs/xfs/xfs_iomap.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 3587772..de3bad5 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -395,6 +395,15 @@ xfs_iomap_prealloc_size( > } > if (shift) > alloc_blocks >>= shift; > + > + /* > + * If we are still trying to allocate more space than is > + * available, squash the prealloc hard. This can happen if we > + * have a large file on a small filesystem and the above > + * lowspace thresholds are smaller than MAXEXTLEN. > + */ > + while (alloc_blocks >= freesp) > + alloc_blocks >>= 4; > } > > if (alloc_blocks < mp->m_writeio_blocks) > From david@fromorbit.com Tue Jan 22 17:11:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 76D2F7F6D for ; Tue, 22 Jan 2013 17:11:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64D8D304059 for ; Tue, 22 Jan 2013 15:11:23 -0800 (PST) X-ASG-Debug-ID: 1358896281-04cb6c391395ce0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id MyhxrOZM9YNqtO0c for ; Tue, 22 Jan 2013 15:11:21 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PADIc/1B5LKUj/2dsb2JhbABEuBWGFRdzgh4BAQQBOhwjBQsIAxgJJQ8FJQMhE4gTBb0yFYx/hCIDlguQSoMJgVM Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 09:41:20 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1Txmzu-0005Tj-UY; Wed, 23 Jan 2013 10:11:19 +1100 Date: Wed, 23 Jan 2013 10:11:18 +1100 From: Dave Chinner To: Samuel Kvasnica Cc: xfs@oss.sgi.com Subject: Re: XFS with nfs over rdma performance Message-ID: <20130122231118.GQ2498@dastard> X-ASG-Orig-Subj: Re: XFS with nfs over rdma performance References: <50FE73A4.7020308@ims.co.at> <20130122222218.GO2498@dastard> <50FF1789.2050107@ims.co.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FF1789.2050107@ims.co.at> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358896281 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.2.120618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 11:49:45PM +0100, Samuel Kvasnica wrote: > On 01/22/2013 11:22 PM, Dave Chinner wrote: > > On Tue, Jan 22, 2013 at 12:10:28PM +0100, Samuel Kvasnica wrote: > >> Hi folks, > >> > >> I would like to hear about your experience with the performance of XFS when > >> used on NFS client mounted using Infininband RDMA connection on 3.4.11 > >> kernel. > >> > >> What we observe is following: > >> > >> - we do have local RAID storage with 1.4GB/s read and write performance > >> (both dd on raw partition > >> and on xfs filesystem give basically the same performance) > >> > >> - we do have QDR Infiniband connection (Mellanox), the rdma benchmark > >> gives 29Gbit/s throughput > >> > >> Now, both above points look pretty Ok but if we mount an nfs export > >> using rdma on client we never get the 1.4GB/s throughput. > > Of course not. The efficiency of the NFS client/server write > > protocol makes it a theoretical impossibility.... > hmm, well, never seen that bottleneck on NFSv4 so far. Does this apply > for NFSv4 as well (as I use NFSv4, not v3). ? Yup, it's the same algorithm. > >> Sporadically (and especially at the beginning) it comes up to some > >> 1.3GB/s for short period but then it starts oscillating > >> between 300MB/s and some 1.2GB/s with an average of 500-600MB/s. Even > >> when using more clients in parallel, > >> the net throughput behaves the same so it seems to be a server-side > >> related bottleneck. > >> We do not see any remarkable CPU load. > > Sounds exactly like the usual NFS server/client writeback exclusion > > behaviour. i.e. while there is a commit being processed by the > > server, the client is not sending any new writes across the wire. > > hence you get the behaviour: > > > > client server > > send writes cache writes > > send commit fsync > > start writeback > > ...... > > finish writeback > > send commit response > > send writes cache writes > > send commit fsync > > start writeback > > ...... > > finish writeback > > send commit response > > > > and so you see binary throughput - either traffic comes across the > > wire, or the data is being written to disk. They don't happen at the > > same time. > > > > If it's not scaling with multiple clients, then that implies you > > don't have enough nfsd's configured to handle the incoming IO > > requests. This is a commmon enough NFS problem, you shoul dbe able > > to find tips from google dating back for years on how to tune your > > NFS setup to avoid these sorts of problems. > Ok, this explanation makes partially sense, on the other hand we are > speaking here about just 1.4GB/s which is pretty low > load for a Xeon E5 to process and the oscillation between 300-600MB/s is > even more low-end. > > And: why do we see exactly the same for read, not only for write ? A lack of NFSDs, or a too-small r/wsize, or not enough readahead on the client and/or server, etc. > I looks to me like there is some too large buffer somewhere on the way > which needs to be decreased as it is not needed at all. > I cannot recall seeing this earlier on 2.6.2x kernels, unfortunately I > cannot test that on new hardware. > > >> The interesting point is, we use btrfs filesystem on server instead of > >> xfs now (with otherwise same config) and we are getting consistent, > >> steady throughput > >> around 1.2-1.3GB/s. > > Different fsync implementation, or the btrfs configuration is > > ignoring commits (async export, by any chance?) > Well, there is no explicit async mount option. With btrfs write gives Sure - I'm talking about the server export option, not a client mount option. And - seriously - you need to check that btrfs is actually honouring commits correctly otherwise data integrity is compromised (the async export option makes the server ignore commits).... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kdasu.kdev@gmail.com Tue Jan 22 19:24:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, LOCALPART_IN_SUBJECT,T_DKIM_INVALID,T_LOTS_OF_MONEY,T_TO_NO_BRKTS_FREEMAIL 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 2B7A87F47 for ; Tue, 22 Jan 2013 19:24:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF11EAC006 for ; Tue, 22 Jan 2013 17:24:04 -0800 (PST) X-ASG-Debug-ID: 1358904243-04cb6c39129af20001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id TnwgSeImMbmainQQ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 22 Jan 2013 17:24:03 -0800 (PST) X-Barracuda-Envelope-From: kdasu.kdev@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] Received: by mail-vc0-f177.google.com with SMTP id m18so2825077vcm.36 for ; Tue, 22 Jan 2013 17:24:02 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=tb8VXpR1lL4qiKLMafaxf4WNCX90plugyDCnlO+VDEY=; b=BTSoiF1/C4tqNyN/Y6WK5jt89PatApG++rN3py2R8eXPTNMIw3poXCDmJqywfo0/rU F8wZZ6pS4wZEur9OgmNnd3P6ZUSh8rzGrl7Hk4k9ymo48OXMngPvmo8gdY8phBTd9EUh yabTEGimpv1v9/ezu2JdV0oDw3tAF1yD7aj/nwI6PAbaunKg98RRUwPQ/CxQ5V9o5q4l 4tx9z9/dfG67K5jZ77Cm8pd6fr0drE/aUK4/M7eKoMYgV+C0su+vfi2i8ratKZiQ9MpD MecyClvOAaKfHs+tFfqk0PYG0KBHBrVmH49x/nh09KIbPOLTuYN+Ws1cVZzgkwAID4oG /B/w== MIME-Version: 1.0 X-Received: by 10.220.157.72 with SMTP id a8mr21740555vcx.30.1358904242756; Tue, 22 Jan 2013 17:24:02 -0800 (PST) Received: by 10.220.106.208 with HTTP; Tue, 22 Jan 2013 17:24:02 -0800 (PST) Date: Tue, 22 Jan 2013 20:24:02 -0500 Message-ID: Subject: xfs: xfs_io oops on _raw_spin_lock From: Kamal Dasu X-ASG-Orig-Subj: xfs: xfs_io oops on _raw_spin_lock To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1358904243 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: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120628 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject I am running a simple test with xfs_io on Kernel 3.3 writing in O_DIRECT mode and I get # /rt.sh ++ DEV=/dev/sda2 ++ RTDEV=/dev/sda3 ++ MNT=/mnt/xfsmnt ++ mkdir /mnt/xfsmnt ++ mkfs.xfs -f /dev/sda2 -r extsize=2m,rtdev=/dev/sda3 meta-data=/dev/sda2 isize=256 agcount=4, agsize=983479 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=3933916, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =/dev/sda3 extsz=2097152 blocks=240089416, rtextents=468924 mkfs.xfs: sending ioctl 20001261 to a partition! mkfs.xfs: sending ioctl 20001261 to a partition! mkfs.xfs: sending ioctl 20001261 to a partition! mkfs.xfs: sending ioctl 20001261 to a partition! ++ mount /dev/sda2 -o rtdev=/dev/sda3 /mnt/xfsmnt UDF-fs: bad mount option "rtdev=/dev/sda3" or missing value XFS (sda2): Mounting Filesystem XFS (sda2): Ending clean mount ++ touch /mnt/xfsmnt/foo ++ xfs_io -c 'chattr +r' /mnt/xfsmnt/foo ++ for i in ''\''0'\''' ''\''1g'\''' ''\''2g'\''' ++ xfs_io -d -c 'pwrite 0 1g' /mnt/xfsmnt/foo CPU 0 Unable to handle kernel paging request at virtual address 00000070, epc == 8050b82c, ra == 8021e71c Oops[#1]: Cpu 0 $ 0 : 00000000 00000001 00010000 00000001 $ 4 : 00000070 00001000 00000000 00000004 $ 8 : 00000000 0000123c 00001000 00000000 $12 : 00000001 00000000 bc667f38 22adedc1 $16 : 00000000 00000f01 00000000 c6e48000 $20 : 00001000 00000008 cee65620 ceabfc00 $24 : 00000007 80059f48 $28 : cee64000 cee65508 00000000 8021e71c Hi : 0000fe48 Lo : 00001000 epc : 8050b82c _raw_spin_lock+0x4/0x30 Not tainted ra : 8021e71c _xfs_buf_find+0xa4/0x364 Status: 30008703 KERNEL EXL IE Cause : 00800008 BadVA : 00000070 PrId : 00025a11 (Broadcom BMIPS5000) Modules linked in: Process xfs_io (pid: 578, threadinfo=cee64000, task=cfd4a138, tls=77b13460) Stack : 00000250 00000001 cee6557c cee65578 00001000 00000000 00000000 00028009 00028009 80e37240 cea75e80 00000007 00000008 8021ec4c cee65624 00000000 cf831ab0 8024ff48 00000008 00028009 00000000 ce968b80 00000000 cee6557c cee65578 00028009 00000007 00008008 cea60df8 00000008 cea75e80 8021f078 00000000 00000000 0000000c 00000000 00000008 00028009 00000000 80e37240 ... Call Trace: [<8050b82c>] _raw_spin_lock+0x4/0x30 [<8021e71c>] _xfs_buf_find+0xa4/0x364 [<8021ec4c>] xfs_buf_get+0x44/0x1ac [<8021f078>] xfs_buf_read+0x28/0xf0 [<8028c2bc>] xfs_trans_read_buf+0x204/0x304 [<8028cb40>] xfs_rtbuf_get+0x140/0x160 [<8028cebc>] xfs_rtfind_forw+0x8c/0x554 [<8028e19c>] xfs_rtallocate_range+0xec/0x328 [<8028f030>] xfs_rtallocate_extent_block+0x34c/0x3f4 [<8028f1e0>] xfs_rtallocate_extent_size+0x108/0x3d4 [<802901b4>] xfs_rtallocate_extent+0x190/0x1fc [<80249f0c>] xfs_bmap_rtalloc+0x1bc/0x3f8 [<8024d430>] xfs_bmapi_allocate+0xec/0x354 [<802508ac>] xfs_bmapi_write+0x264/0x82c [<802299dc>] xfs_iomap_write_direct+0x248/0x544 [<8021ac8c>] __xfs_get_blocks+0x3d4/0x6f4 [<8021afd0>] xfs_get_blocks_direct+0x24/0x30 [<80104750>] __blockdev_direct_IO+0xf80/0x3fd8 [<8021a2b4>] xfs_vm_direct_IO+0xb8/0x158 [<80089c00>] generic_file_direct_write+0x198/0x2d0 [<80222d90>] xfs_file_dio_aio_write+0x180/0x258 [<80223220>] xfs_file_aio_write+0x23c/0x24c [<800c582c>] do_sync_write+0xc4/0x13c [<800c6598>] vfs_write+0xc4/0x16c [<800c6a58>] sys_pwrite64+0x88/0xc0 [<8000db1c>] stack_done+0x20/0x40 Code: 03e00008 0002102b 3c020001 00622821 e0850000 10a0fffc 00032c02 3063ffff ---[ end trace 355da1cf684cbaba ]--- /rt.sh: line 17: 578 Segmentation fault xfs_io -d -c "pwrite $i 1g" ${MNT}/foo ++ for i in ''\''0'\''' ''\''1g'\''' ''\''2g'\''' ++ xfs_io -d -c 'pwrite 1g 1g' /mnt/xfsmnt/foo Has anyone else seen this ?. Thanks Kamal From david@fromorbit.com Tue Jan 22 19:35:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 942237F47 for ; Tue, 22 Jan 2013 19:35:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 74ABD8F8033 for ; Tue, 22 Jan 2013 17:35:14 -0800 (PST) X-ASG-Debug-ID: 1358904912-04cbb00c6394b40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sh0WEmzVNxKNmOM6 for ; Tue, 22 Jan 2013 17:35:13 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0PAFM7/1B5LKUj/2dsb2JhbABEuAuGFhdzgh4BAQQBOhwjBQsIAw4KCSUPBSUDIROIEwW9KRWRIQOWC4lOhnyDCQ Received: from ppp121-44-165-35.lns20.syd7.internode.on.net (HELO dastard) ([121.44.165.35]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Jan 2013 12:05:11 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TxpF7-0005l3-Ou; Wed, 23 Jan 2013 12:35:09 +1100 Date: Wed, 23 Jan 2013 12:35:09 +1100 From: Dave Chinner To: Kamal Dasu Cc: xfs@oss.sgi.com Subject: Re: xfs: xfs_io oops on _raw_spin_lock Message-ID: <20130123013509.GR2498@dastard> X-ASG-Orig-Subj: Re: xfs: xfs_io oops on _raw_spin_lock References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1358904912 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.2.120628 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 22, 2013 at 08:24:02PM -0500, Kamal Dasu wrote: > I am running a simple test with xfs_io on Kernel 3.3 writing in > O_DIRECT mode and I get > > # /rt.sh > ++ DEV=/dev/sda2 > ++ RTDEV=/dev/sda3 > ++ MNT=/mnt/xfsmnt > ++ mkdir /mnt/xfsmnt > ++ mkfs.xfs -f /dev/sda2 -r extsize=2m,rtdev=/dev/sda3 > meta-data=/dev/sda2 isize=256 agcount=4, agsize=983479 blks > = sectsz=512 attr=2, projid32bit=0 > data = bsize=4096 blocks=3933916, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal log bsize=4096 blocks=2560, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =/dev/sda3 extsz=2097152 blocks=240089416, > rtextents=468924 Patches are pending in 3.8 to fix the oops, but it won't fix your problems..... > Call Trace: > [<8050b82c>] _raw_spin_lock+0x4/0x30 > [<8021e71c>] _xfs_buf_find+0xa4/0x364 > [<8021ec4c>] xfs_buf_get+0x44/0x1ac > [<8021f078>] xfs_buf_read+0x28/0xf0 > [<8028c2bc>] xfs_trans_read_buf+0x204/0x304 > [<8028cb40>] xfs_rtbuf_get+0x140/0x160 > [<8028cebc>] xfs_rtfind_forw+0x8c/0x554 > [<8028e19c>] xfs_rtallocate_range+0xec/0x328 > [<8028f030>] xfs_rtallocate_extent_block+0x34c/0x3f4 > [<8028f1e0>] xfs_rtallocate_extent_size+0x108/0x3d4 > [<802901b4>] xfs_rtallocate_extent+0x190/0x1fc > [<80249f0c>] xfs_bmap_rtalloc+0x1bc/0x3f8 > [<8024d430>] xfs_bmapi_allocate+0xec/0x354 You are using the RT device, and it's asking for a realtime bitmap metadata block that is beyond the end of the data partition (the realtime allocator metadata is in the main data partition). That's the bug you need to find, because the oops is just the visible symptom of a deeper problem. i.e. find out why the realtime allocator is asking for a metadata block that doesn't exist.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From victoria.jacobs@fieldseo.com Tue Jan 22 22:38:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AB1817F47 for ; Tue, 22 Jan 2013 22:38:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 992BD8F8033 for ; Tue, 22 Jan 2013 20:38:33 -0800 (PST) X-ASG-Debug-ID: 1358915911-04cb6c3915a0800001-NocioJ Received: from fieldseo.com (mail.fieldseo.com [46.249.58.42]) by cuda.sgi.com with ESMTP id 0TxjgatH8et1MiLO for ; Tue, 22 Jan 2013 20:38:31 -0800 (PST) X-Barracuda-Envelope-From: victoria.jacobs@fieldseo.com X-Barracuda-Apparent-Source-IP: 46.249.58.42 Date: Wed, 23 Jan 2013 04:36:53 +0000 To: xfs@oss.sgi.com From: Victoria Jacobs Subject: Link Suggestion (Proposal) X-Priority: 3 X-ASG-Orig-Subj: Link Suggestion (Proposal) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_506c564553ac1332397b8ee3ec86bc85" X-Barracuda-Connect: mail.fieldseo.com[46.249.58.42] X-Barracuda-Start-Time: 1358915911 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.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120640 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20130123043833.1FA921296118@cuda.sgi.com> --b1_506c564553ac1332397b8ee3ec86bc85 Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit Fellow webmaster, I ran across your site oss.sgi.com while surfing the net and would like to exchange links with you. What I'm offering is a free, fair and beneficial deal in exchange for a backlink. At http://www.fieldseo.com you can find everything from beginner's guides to more advanced topics that will result in real traffic to your site as well. All of this is totally free of charge.   Let me know what you think, as I am looking forward to exchanging links with you.   Sincerely, Victoria Jacobs - fieldseo.com --b1_506c564553ac1332397b8ee3ec86bc85 Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit Fellow webmaster,

    I ran across your site oss.sgi.com while surfing the net and would like to exchange links with you.
    What I'm offering is a free, fair and beneficial deal in exchange for a backlink.

    At http://www.fieldseo.com you can find everything from beginner's guides
    to more advanced topics that will result in real traffic to your site as well.
    All of this is totally free of charge.
     
    Let me know what you think, as I am looking forward to exchanging links with you.
     
    Sincerely,
    Victoria Jacobs - fieldseo.com --b1_506c564553ac1332397b8ee3ec86bc85-- From sgordon18@sbcglobal.net Wed Jan 23 02:01:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=EXTRA_MPART_TYPE,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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 64B4A7F47 for ; Wed, 23 Jan 2013 02:01:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D72648F8035 for ; Wed, 23 Jan 2013 00:01:41 -0800 (PST) X-ASG-Debug-ID: 1358928099-04bdf0231daa260001-NocioJ Received: from fmailhost01.isp.att.net (fmailhost01.isp.att.net [207.115.11.51]) by cuda.sgi.com with ESMTP id 3Rk7CGZ1v3k0YFKT for ; Wed, 23 Jan 2013 00:01:40 -0800 (PST) X-Barracuda-Envelope-From: sgordon18@sbcglobal.net X-Barracuda-Apparent-Source-IP: 207.115.11.51 DKIM-Signature: v=1; q=dns/txt; d=sbcglobal.net; s=dkim02; i=sgordon18@sbcglobal.net; a=rsa-sha256; c=relaxed/relaxed; t=1358928099; h=Content-Type:MIME-Version:Date:Subject:To:From: Message-ID; bh=Nf/19XcyN79U6Kuf+ZHCM0VVxsfq1phBQ151ftWH8aI=; b=Qdc CkBw9pI41xB12apkf/b0jtvYxnIhmBXZHBZ8kU8vwNQoaE/4eyokxEBhrFeAR4YDUnH uBitgeGeAxIbFgBi/3HfCzoXTdxYRNyNNOt0HpHa1Bq91lKoZPFqMB4YBeVrtDMmJoz JAPafGt6RbdM+8YW7EfpWiwTdtRam7eIo0= Received: from erpw (teweco-sk.cust.sloane.cz[213.192.3.66]) by isp.att.net (frfwmhc01) with SMTP id <20130123080131H0100ikh0ne>; Wed, 23 Jan 2013 08:01:37 +0000 X-Originating-IP: [213.192.3.66] Message-ID: <99A4C626F45946B6AFF1F1C32A6FFBE1@nikeh> From: =?windows-1251?B?yOv86O379SDf8O7x6+Di?= To: , , , , , , , , , Subject: =?windows-1251?B?z/Do4+vg+ODl7CDw7vHx6Onx6uj1IGV2ZW50?= =?windows-1251?B?LfHv5fbo4Ovo8fLu4iDt4CDh6Oft5fEt8fLg?= =?windows-1251?B?5ujw7uLq8yDiINji5en24PDo/iDoIMLl6+jq?= =?windows-1251?B?7uHw6PLg7ej+?= Date: Wed, 23 Jan 2013 11:59:44 +0400 X-ASG-Orig-Subj: =?windows-1251?B?z/Do4+vg+ODl7CDw7vHx6Onx6uj1IGV2ZW50?= =?windows-1251?B?LfHv5fbo4Ovo8fLu4iDt4CDh6Oft5fEt8fLg?= =?windows-1251?B?5ujw7uLq8yDiINji5en24PDo/iDoIMLl6+jq?= =?windows-1251?B?7uHw6PLg7ej+?= MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_2062_01CDF961.225A4E60" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 X-Barracuda-Connect: fmailhost01.isp.att.net[207.115.11.51] X-Barracuda-Start-Time: 1358928099 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.40 X-Barracuda-Spam-Status: No, SCORE=0.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, BSF_SC0_TG035a, DKIM_SIGNED, DKIM_VERIFIED, EXTRA_MPART_TYPE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120654 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry -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 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_2062_01CDF961.225A4E60 Content-Type: multipart/alternative; boundary="----=_NextPart_001_2063_01CDF961.225A4E60" ------=_NextPart_001_2063_01CDF961.225A4E60 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C0=E2=F2=EE=F0=F1=EA=E0=FF =F8=EA=EE=EB=E0 event-=EC=E5=ED=E5=E4=E6=E5=F0= =EE=E2 =CA=ED=FF=E7=E5=E2=FA =EF=F0=E8=E3=EB=E0=F8=E0=E5=F2 =E2=EB=E0=E4=E5=EB=FC=F6=E5=E2, =E4=E8=F0=E5= =EA=F2=EE=F0=EE=E2 =E8 =F2=EE=EF-=EC=E5=ED=E5=E4=E6=E5=F0=EE=E2 event-=EA= =EE=EC=EF=E0=ED=E8=E9 =ED=E0 =E1=E8=E7=ED=E5=F1-=F1=F2=E0=E6=E8=F0=EE=E2=EA=F3 =E2 =D8=E2=E5=E9= =F6=E0=F0=E8=FE =E8 =C2=E5=EB=E8=EA=EE=E1=F0=E8=F2=E0=ED=E8=FE! =CD=E0=F1=F2=E0=EB=EE =E2=F0=E5=EC=FF =EF=E5=F0=E5=ED=FF=F2=FC =EE=EF=FB=F2= =EC=E8=F0=EE=E2=FB=F5 event-=EA=EE=EC=EF=E0=ED=E8=E9 =E4=EB=FF =E2=ED=E5= =E4=F0=E5=ED=E8=FF =E2 =F0=EE=F1=F1=E8=E9=F1=EA=E8=E9 event-=E1=E8=E7=ED=E5=F1. =95 =C7=E8=EC=ED=FF=FF =E1=E8=E7=ED=E5=F1-=F8=EA=EE=EB=E0 =EF=F0=EE=E9=E4= =E5=F2 =E2 =C6=E5=ED=E5=E2=E5 (=D8=E2=E5=E9=F6=E0=F0=E8=FF) =E2 =F4=EE=F0= =EC=E0=F2=E5 =F2=E5=EE=F0=E5=F2=E8=F7=E5=F1=EA=EE=E3=EE =EE=E1=F3=F7=E5=ED= =E8=FF =EF=EE =EC=E5=E6=E4=F3=ED=E0=F0=EE=E4=ED=EE=EC=F3 event-=EC=E5=ED=E5= =E4=E6=EC=E5=ED=F2=F3 =F1 =E2=FB=E4=E0=F7=E5=E9 =F1=E5=F0=F2=E8=F4=E8=EA=E0= =F2=E0 =EC=E5=E6=E4=F3=ED=E0=F0=EE=E4=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0, = =E8 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=F5 =E2=F1=F2=F0=E5=F7 =F1 =EF=F0=E5= =E4=F1=F2=E0=E2=E8=F2=E5=EB=FF=EC=E8 =E5=E2=F0=EE=EF=E5=E9=F1=EA=E8=E9 ev= ent-=EA=EE=EC=EF=E0=ED=E8=E9. =C7=E8=EC=ED=E8=E9 =F2=F3=F0 =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED =F1=EE=E2=EC= =E5=F1=F2=ED=EE =F1 =C8=ED=F1=F2=E8=F2=F3=F2=EE=EC =DD=EA=EE=ED=EE=EC=E8=F7= =E5=F1=EA=E8=F5 =CD=E0=F3=EA (=C6=E5=ED=E5=E2=E0) =E8 =C6=E5=ED=E5=E2=F1=EA= =E8=EC =C0=EA=E0=E4=E5=EC=E8=F7=E5=F1=EA=E8=EC =D6=E5=ED=F2=F0=EE=EC. =95 =C2=E5=F1=E5=ED=ED=E8=E9 =F2=F3=F0 =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED = =E2 =F4=EE=F0=EC=E0=F2=E5 =ED=E0=F1=FB=F9=E5=ED=ED=FB=F5 =FD=EA=F1=EA=F3=F0= =F1=E8=E8 =EF=EE =EA=F0=F3=EF=ED=E5=E9=F8=E8=EC event-=EA=EE=EC=EF=E0=ED=E8= =FF=EC =CB=EE=ED=E4=EE=ED=E0 (=C2=E5=EB=E8=EA=EE=E1=F0=E8=F2=E0=ED=E8=FF)= =E8 =E2=F1=F2=F0=E5=F7 =F1 =E7=E0=F0=F3=E1=E5=E6=ED=FB=EC=E8 =EA=EE=EB=EB= =E5=E3=E0=EC=E8, =E2=EA=EB=FE=F7=E0=FF =E7=ED=E0=EA=EE=EC=F1=F2=E2=EE =F1= =E8=ED=ED=EE=E2=E0=F6=E8=FF=EC=E8 event-=E8=ED=E4=F3=F1=F2=F0=E8=E8. =C2=E5=F1=E5=ED=ED=FF=FF =F1=F2=E0=E6=E8=F0=EE=E2=EA=E0 =EE=F0=E3=E0=ED=E8= =E7=EE=E2=E0=ED=E0 =F1=EE=E2=EC=E5=F1=F2=ED=EE =F1 =C1=E8=E7=ED=E5=F1-=F8= =EA=EE=EB=EE=E9 RMA =EF=F0=E8 =EF=EE=E4=E4=E5=F0=E6=EA=E5 CateringConsult= ing.ru. =C2=E7=E3=EB=FF=ED=E8=F2=E5 =ED=E0 =EF=F0=E8=E2=FB=F7=ED=FB=E9 =E1=E8=E7=ED= =E5=F1 =E3=EB=E0=E7=E0=EC=E8 =F8=E2=E5=E9=F6=E0=F0=F1=EA=E8=F5 =E8 =E0=ED= =E3=EB=E8=E9=F1=EA=E8=F5 event-=F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2. =D3=F1= =EF=E5=E9=F2=E5 =E7=E0=F0=E5=E3=E8=F1=F2=F0=E8=F0=EE=E2=E0=F2=FC=F1=FF =ED= =E0 =EF=EE=ED=F0=E0=E2=E8=E2=F8=E8=E9=F1=FF =EA=F3=F0=F1. =C2=CD=C8=CC=C0=CD=C8=C5: =F1=F0=EE=EA=E8 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8= =EE=E3=F0=E0=ED=E8=F7=E5=ED=FB! =C0=E2=F2=EE=F0=F1=EA=E0=FF =F8=EA=EE=EB=E0 event- =EC=E5=ED=E5=E4=E6=E5=F0= =EE=E2 "=CA=ED=FF=E7=E5=E2=DA"=20 =E3. =CC=EE=F1=EA=E2=E0, =EC.=CF=E0=E2=E5=EB=E5=F6=EA=E0=FF (=F0=E0=E4=E8= =E0=EB=FC=ED=E0=FF), =F3=EB.=C4=E5=F0=E1=E5=ED=E5=E2=F1=EA=E0=FF, =E4. 1,= =20 =F2=E5=EB.: (903) 549-92-99 , (925) 517-12-20, (495) 287-90-82 =C2=ED=E8=EC=E0=ED=E8=E5! =C2=F1=E5 =E0=E4=F0=E5=F1=E0 =EF=EE=EB=F3=F7=E5= =ED=FB =E8=E7 =EE=F2=EA=F0=FB=F2=FB=F5 =E8=F1=F2=EE=F7=ED=E8=EA=EE=E2. =C5=F1=EB=E8 =C2=FB =EF=EE =EE=F8=E8=E1=EA=E5 =EF=EE=EB=F3=F7=E8=EB=E8 =ED= =E0=F8=E5 =EF=E8=F1=FC=EC=EE, =E8 =ED=E5 =E6=E5=EB=E0=E5=F2=E5 =E1=EE=EB=FC= =F8=E5 =EF=EE=EB=F3=F7=E0=F2=FC =EE=F2 =ED=E0=F1 =F1=EE=EE=E1=F9=E5=ED=E8= =FF, =EF=EE=E6=E0=EB=F3=E9=F1=F2=E0, =ED=E0=EF=E8=F8=E8=F2=E5 =EE=E1 =FD=F2= =EE=EC =ED=E0 =FF=F9=E8=EA replay@knyazev-shkola.ru =E8 =C2=E0=F8 =E0=E4=F0= =E5=F1 =E0=E2=F2=EE=EC=E0=F2=E8=F7=E5=F1=EA=E8 =E1=F3=E4=E5=F2 =E8=F1=EA=EB= =FE=F7=E5=ED =E8=E7 =F0=E0=F1=F1=FB=EB=EA=E8. ------=_NextPart_001_2063_01CDF961.225A4E60 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    <= SPAN=20 style=3D"FONT-FAMILY: Calibri, sans-serif; COLOR: rgb(31,73,125); F= ONT-SIZE: 11pt"> 

    <= B> =C0=E2=F2=EE=F0=F1=EA=E0=FF= =F8=EA=EE=EB=E0 event-=EC=E5=ED=E5=E4=E6=E5=F0=EE=E2=20 =CA=ED=FF=E7=E5=E2=FA

    &n= bsp;

    =EF=F0=E8=E3=EB=E0=F8=E0=E5= =F2 =E2=EB=E0=E4=E5=EB=FC=F6=E5=E2, =E4=E8=F0=E5=EA=F2=EE=F0=EE=E2=20 =E8 =F2=EE=EF-=EC=E5=ED=E5=E4=E6=E5=F0=EE=E2 event-=EA=EE=EC=EF= =E0=ED=E8=E9

    =ED=E0=20 =E1=E8=E7=ED=E5=F1-=F1=F2=E0=E6=E8=F0=EE=E2=EA=F3 =E2 =D8=E2=E5= =E9=F6=E0=F0=E8=FE =E8 =C2=E5=EB=E8=EA=EE=E1=F0=E8=F2=E0=ED=E8=FE!=

     

    =CD=E0=F1=F2=E0=EB=EE =E2= =F0=E5=EC=FF =EF=E5=F0=E5=ED=FF=F2=FC =EE=EF=FB=F2=20 =EC=E8=F0=EE=E2=FB=F5 event-=EA=EE=EC=EF=E0=ED=E8=E9 =E4=EB=FF= =E2=ED=E5=E4=F0=E5=ED=E8=FF

    =E2 = =F0=EE=F1=F1=E8=E9=F1=EA=E8=E9=20 event-=E1=E8=E7=ED=E5=F1.

    =95 =C7=E8=EC=ED=FF=FF=20 =E1=E8=E7=ED=E5=F1-=F8=EA=EE=EB=E0
     =EF=F0=EE=E9=E4=E5= =F2 =E2 =C6=E5=ED=E5=E2=E5=20 (=D8=E2=E5=E9=F6=E0=F0=E8=FF) =E2 =F4=EE=F0=EC=E0=F2=E5 =F2=E5= =EE=F0=E5=F2=E8=F7=E5=F1=EA=EE=E3=EE =EE=E1=F3=F7=E5=ED=E8=FF =EF=EE =EC=E5= =E6=E4=F3=ED=E0=F0=EE=E4=ED=EE=EC=F3=20 event-=EC=E5=ED=E5=E4=E6=EC=E5=ED=F2=F3 =F1 =E2=FB=E4=E0=F7=E5= =E9 =F1=E5=F0=F2=E8=F4=E8=EA=E0=F2=E0 =EC=E5=E6=E4=F3=ED=E0=F0=EE=E4=ED=EE= =E3=EE =EE=E1=F0=E0=E7=F6=E0, =E8=20 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=F5 =E2=F1=F2=F0=E5=F7 =F1 =EF= =F0=E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=FF=EC=E8 =E5=E2=F0=EE=EF=E5=E9=F1=EA=E8= =E9=20 event-=EA=EE=EC=EF=E0=ED=E8=E9.

    =C7=E8=EC=ED=E8=E9 =F2=F3= =F0 =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED =F1=EE=E2=EC=E5=F1=F2=ED=EE =F1=20 =C8=ED=F1=F2=E8=F2=F3=F2=EE=EC =DD=EA=EE=ED=EE=EC=E8=F7=E5=F1= =EA=E8=F5 =CD=E0=F3=EA (=C6=E5=ED=E5=E2=E0) =E8 =C6=E5=ED=E5=E2=F1=EA=E8=EC= =C0=EA=E0=E4=E5=EC=E8=F7=E5=F1=EA=E8=EC=20 =D6=E5=ED=F2=F0=EE=EC.

    =95 =C2=E5=F1=E5=ED=ED=E8=E9 =F2=F3= =F0 =EE=F0=E3=E0= =ED=E8=E7=EE=E2=E0=ED =E2=20 =F4=EE=F0=EC=E0=F2=E5 =ED=E0=F1=FB=F9=E5=ED=ED=FB=F5 =FD=EA=F1= =EA=F3=F0=F1=E8=E8 =EF=EE =EA=F0=F3=EF=ED=E5=E9=F8=E8=EC event-=EA=EE=EC=EF= =E0=ED=E8=FF=EC =CB=EE=ED=E4=EE=ED=E0=20 (=C2=E5=EB=E8=EA=EE=E1=F0=E8=F2=E0=ED=E8=FF) =E8 =E2=F1=F2=F0= =E5=F7 =F1 =E7=E0=F0=F3=E1=E5=E6=ED=FB=EC=E8 =EA=EE=EB=EB=E5=E3=E0=EC=E8,= =E2=EA=EB=FE=F7=E0=FF=20 =E7=ED=E0=EA=EE=EC=F1=F2=E2=EE =F1 =E8=ED=ED=EE=E2=E0=F6=E8=FF= =EC=E8 event-=E8=ED=E4=F3=F1=F2=F0=E8=E8.

    =C2=E5=F1=E5=ED=ED=FF=FF =F1=F2=E0= =E6=E8=F0=EE=E2=EA=E0 =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED=E0=20 =F1=EE=E2=EC=E5=F1=F2=ED=EE =F1 =C1=E8=E7=ED=E5=F1-=F8=EA=EE=EB= =EE=E9 RMA =EF=F0=E8 =EF=EE=E4=E4=E5=F0=E6=EA=E5=20 CateringConsulting.ru.

    =C2=E7=E3=EB= =FF=ED=E8=F2=E5 =ED=E0=20 =EF=F0=E8=E2=FB=F7=ED=FB=E9 =E1=E8=E7=ED=E5=F1 =E3=EB=E0=E7=E0= =EC=E8 =F8=E2=E5=E9=F6=E0=F0=F1=EA=E8=F5 =E8 =E0=ED=E3=EB=E8=E9=F1=EA=E8=F5= =20 event-=F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2. =D3=F1=EF=E5=E9=F2= =E5 =E7=E0=F0=E5=E3=E8=F1=F2=F0=E8=F0=EE=E2=E0=F2=FC=F1=FF =ED=E0 =EF=EE=ED= =F0=E0=E2=E8=E2=F8=E8=E9=F1=FF=20 =EA=F3=F0=F1.

    =C2=CD=C8=CC=C0=CD=C8=C5: =F1=F0=EE=EA=E8 =F0=E5=E3=E8=F1=F2=F0=E0= =F6=E8=E8 =EE=E3=F0=E0=ED=E8=F7=E5=ED=FB!


    =C0=E2=F2=EE=F0=F1=EA=E0=FF =F8= =EA=EE=EB=E0 event- =EC=E5=ED=E5=E4=E6=E5=F0=EE=E2=20 "=CA=ED=FF=E7=E5=E2=DA" 
    =E3. =CC= =EE=F1=EA=E2=E0,=20 =EC.=CF=E0=E2=E5=EB=E5=F6=EA=E0=FF (=F0=E0=E4=E8=E0=EB=FC=ED=E0= =FF), =F3=EB.=C4=E5=F0=E1=E5=ED=E5=E2=F1=EA=E0=FF, =E4. 1, 
    =F2=E5=EB.: (9= 03) 549-92-99 ,=20 (925) 517-12-20, (495) 287-90-82

    =C2=ED=E8= =EC=E0=ED=E8=E5! =C2=F1=E5 =E0=E4=F0= =E5=F1=E0 =EF=EE=EB=F3=F7=E5=ED=FB =E8=E7=20 =EE=F2=EA=F0=FB=F2=FB=F5 =E8=F1=F2=EE=F7=ED=E8=EA=EE=E2.

    =C5=F1=EB=E8= =C2=FB =EF=EE =EE=F8=E8=E1=EA=E5=20 =EF=EE=EB=F3=F7=E8=EB=E8 =ED=E0=F8=E5 =EF=E8=F1=FC=EC=EE, =E8= =ED=E5 =E6=E5=EB=E0=E5=F2=E5 =E1=EE=EB=FC=F8=E5 =EF=EE=EB=F3=F7=E0=F2=FC= =EE=F2 =ED=E0=F1 =F1=EE=EE=E1=F9=E5=ED=E8=FF,=20 =EF=EE=E6=E0=EB=F3=E9=F1=F2=E0, =ED=E0=EF=E8=F8=E8=F2=E5 =EE=E1= =FD=F2=EE=EC =ED=E0 =FF=F9=E8=EA replay@knyazev-shkola.ru =E8 =C2=E0=F8 =E0=E4= =F0=E5=F1 =E0=E2=F2=EE=EC=E0=F2=E8=F7=E5=F1=EA=E8=20 =E1=F3=E4=E5=F2 =E8=F1=EA=EB=FE=F7=E5=ED =E8=E7=20 =F0=E0=F1=F1=FB=EB=EA=E8.

    =
    ------=_NextPart_001_2063_01CDF961.225A4E60-- ------=_NextPart_000_2062_01CDF961.225A4E60 Content-Type: image/jpeg; name="rflns.jpg" Content-Transfer-Encoding: base64 Content-ID: <9E4B200E5A9043439990CD8770845BAD@nikeh> /9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAHtApIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/Kjl uEg60T7/AC/3fWvEPEHiO9/aG8W3eiaFqF7p/gfS5ntdW1KwmMd5rl0hIktbaT/lnFH/AMtZY/3m R5ceME0AdD4//at8I+CvE03h60k1TxR4oiB36N4esZdUu4D0xL5f7u2/7bSR1hXH7RHjzUdp0r4J eM5YZP8AoI6vpdhKf+2Zua7v4dfDjRfhhoum6R4c02w0fS4kkItrKHyohJx+8/z61uWkO3ULA/8A TOSgDyn/AIaB+Kmdn/CiNc/8KvSP/jtIf2gfioJQn/Ch9c/ef9TVpH/x2vW4P+QhY/7klEH/ACEL H/ckoA8k/wCGg/ioJIx/wojXf3v/AFNWkf8Ax2j/AIaD+Kn7v/ixGu/vf+pq0j/47Xq8P/IS0/8A 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 ------=_NextPart_000_2062_01CDF961.225A4E60-- From dsterba@suse.cz Wed Jan 23 05:14:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C97F27F37 for ; Wed, 23 Jan 2013 05:14:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32466AC001 for ; Wed, 23 Jan 2013 03:14:36 -0800 (PST) X-ASG-Debug-ID: 1358939674-04cbb00c65a5300001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ke58zq8KV8uiNYKJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Jan 2013 03:14:35 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 153DCA4F28 for ; Wed, 23 Jan 2013 12:14:34 +0100 (CET) Received: by ds.suse.cz (Postfix, from userid 10065) id 9E148DA809; Wed, 23 Jan 2013 12:14:33 +0100 (CET) From: David Sterba To: xfs@oss.sgi.com Cc: David Sterba Subject: [PATCH v2] xfstests: make length of diff output configurable Date: Wed, 23 Jan 2013 12:14:33 +0100 X-ASG-Orig-Subj: [PATCH v2] xfstests: make length of diff output configurable Message-Id: <1358939673-7523-1-git-send-email-dsterba@suse.cz> X-Mailer: git-send-email 1.8.0.2 In-Reply-To: <20130122214435.GM2498@dastard> References: <20130122214435.GM2498@dastard> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1358939674 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.2.120666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In commit 11c1d79414e2571 "xfstests: Change the diff output of failed tests", the diff output of a failed test was hardcoded to 10 lines to avoid overly long output and user can get the full output by manually running the diff. However this is not always possible and convenient, eg. in repeated automated tests where the required information is lost after the test round finished. Then the caputred logs do not contain enough informatin for analysis. Introduce the DIFF_LENGTH env variable to tune the diff size, keeping it 10 as deafult and 0 to disable the limit. Signed-off-by: David Sterba --- V1->V2: define DIFF_LENGTH in ./check README | 2 ++ check | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README b/README index d81ede9..b70f75d 100644 --- a/README +++ b/README @@ -63,6 +63,8 @@ Preparing system for tests (IRIX and Linux): - if TEST_LOGDEV and/or TEST_RTDEV, these will always be used. - if SCRATCH_LOGDEV and/or SCRATCH_RTDEV, the USE_EXTERNAL environment variable set to "yes" will enable their use. + - setenv DIFF_LENGTH "number of diff lines to print from a failed test", + by default 10, set to 0 to print the full diff - or add a case to the switch in common.config assigning these variables based on the hostname of your test machine diff --git a/check b/check index 75addb5..c20179c 100755 --- a/check +++ b/check @@ -30,6 +30,8 @@ notrun="" interrupt=true export QA_CHECK_FS=${QA_CHECK_FS:=true} +# number of diff lines from a failed test, 0 for whole output +export DIFF_LENGTH=${DIFF_LENGTH:=10} # by default don't output timestamps timestamp=${TIMESTAMP:=false} @@ -287,7 +289,12 @@ do else echo " - output mismatch (see $seq.out.bad)" mv $tmp.out $seq.out.bad - $diff $seq.out $seq.out.bad | head -n 10 | \ + $diff $seq.out $seq.out.bad | { + if test "$DIFF_LENGTH" -le 0; then + cat + else + head -n "$DIFF_LENGTH" + fi; } | \ sed -e 's/^\(.\)/ \1/' echo " ..." echo " (Run '$diff $seq.out $seq.out.bad' to see the" \ -- 1.8.0.2 From stan@hardwarefreak.com Wed Jan 23 06:35:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CE7177F37 for ; Wed, 23 Jan 2013 06:35:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9001F304064 for ; Wed, 23 Jan 2013 04:35:32 -0800 (PST) X-ASG-Debug-ID: 1358944531-04bdf0231db1b00001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id gaBX2MTn4U0i5FUE for ; Wed, 23 Jan 2013 04:35:31 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E4C0A6C1AB; Wed, 23 Jan 2013 06:35:30 -0600 (CST) Message-ID: <50FFD911.3@hardwarefreak.com> Date: Wed, 23 Jan 2013 06:35:29 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: Alvin Ong , xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files References: <50FE8AEA.7020300@hardwarefreak.com> <20130122220511.GN2498@dastard> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: <20130122220511.GN2498@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1358944531 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 1/22/2013 4:05 PM, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 06:49:46AM -0600, Stan Hoeppner wrote: >> On 1/21/2013 10:22 PM, Alvin Ong wrote: >>> Hi, >>> >>> We are building a solution with a web front end for our users to store >>> large files. >>> Large files starting from the size of 500GB and above and can grow up to >>> 1-2TB's per file. >>> This is the reason we are trying out XFS to see if we can get a test system >>> running. >> >> Tell us more about these files. Is this simply bulk file storage? >> Start at 500GB and append until 2TB? How often will the files be >> appended and at what rate? I.e. will it take 3 days to append from >> 500GB to 2TB or take 3 months? The answer to this dictates how the >> files and filesystem will fragment over time. Constantly expanding with >> additional 6 spindle constituent arrays, LVM concatenation, and >> xfs_growfs may leave you with an undesirable, possibly disastrous, >> fragmentation pattern. > > I'd say it's guaranteed, not a possibility. > >>> We plan to use a 6+2 RAID6 to start off with. Then when it gets filled up >>> to maybe 60-70% we will >>> expand by adding another 6+2 RAID6 to the array. >>> The max we can grow this configuration is up to 252TB usable which should >>> be enough for a year. >>> Our requirements might grow up to 2PB in 2 years time if all goes well. >> >> I'd not attempt growing a single XFS to the scale you're describing, via >> the methods you describe. The odds of catastrophe are too great. > > It's a recipe for disaster and not recommended at all. > >>> So I have been testing all of this out on a VM running 3 vmdk's and using >>> LVM to create a single logical volume of the 3 disks. >>> I noticed that out of sdb, sdc and sdd, files keep getting written to sdc. >>> This is probably due to our web app creating a single folder and all files >>> are written under that folder. >>> This is the nature of the Allocation Group of XFS? Is there a way to avoid >>> this? >> >> Yes. >> >> 1. Don't put all files in a single directory. >> >> 2. Use the inode32 allocator on a filesystem greater than 1TB in size. >> This will cause inodes to be located in the first 1TB and files to be >> allocated round robin across the AGs via rotor stepping. See page 10: >> http://oss.sgi.com/projects/xfs/training/xfs_slides_06_allocators.pdf > > 3: Use a storage layout that is not affected by hotspots due to > filesystem locality. > > That is, build the storage to the scale that you are likely to need > in the future. i.e. use all 112 disks (14x 6+2 RAID = 112 disks) to > begin with and lay the storage and filesystem out optimally > accordingly. I'd build seven 14+2 hardware RAID6 luns (112 disks) > and stripe them in RAID0, setting the XFS stripe unit to be the > width of a hardware RAID6 lun. That way sequential IO to a single > region of the disk still hits every single disk in the array, and > hotspots don't occur > > If you do this, it doesn't matter if you use inode64 or inode32 for > a hotspot perspective, only a file fragmentation perspective. This > is the way XFs has been used for exactly this sort of storage for > the last 15 years.... > >>> As we will have files keep writing to the same disk thus creating a >>> hot spot. >>> Although it might not hurt us that much if we fill up a single RAID6 to >>> 60-70% then adding another RAID6 to the mix. We could go up to a total of >>> 14 RAID6 sets. >> >> Again, you probably don't want to do this. Too many eggs in one basket. >> >> You should investigate using GlusterFS to tie multiple XFS storage >> servers together into a single file tree. > > Another possible solution. You should talk to RedHat (says the > RedHat employee ;).... I get the impression the "grow as you go" mindset here is probably due to budget/cash flow issues, as well as evaluating the system at small scale before committing to going larger. Thus I'd guess building the 112 drive system up front isn't a real possibility. And this is where something like Gluster atop XFS would really come in handy, as it would make "grow as you go" much more feasible, while avoiding the 'game over' fragmentation issue with simply growing XFS in the manner described by the OP. Emmanuel states Gluster is slow, but that's a very relative statement. For clients streaming single large files over GbE or slower links it should be plenty fast. Gluster and similar network file systems tend to be slow with metadata intensive or transactional workloads. >> Running an xfs_repair on a single filesystem denies all access, and with >> a 252TB XFS this could take some time. > > For a filesystem with 1-2TB files, it'll take 30s to run. That's not > an issue. For some reason I was thinking data size instead of metadata. With only a few hundred to low thousand files it would be quick indeed, a non issue. >>> Is LVM a good choice of doing this configuration? Or do you have a better >>> recommendation? >>> The reason we thought LVM would be good was so that we could easily grow >>> XFS. >> >> Why not do the concatenation within the SAN array controller? > > Same problem as LVM concatenation. Hot spots. I was simply suggesting hardware vs software concatenation here unrelated to his current flawed expansion path idea, as his SAN controller probably has some nice features and performance here. >>> Is I was to use the 8-disk RAID6 array with a 256kB stripe size will have a >>> sunit of 512 and a swidth of (8-2)*512=3072. >> >> So a 256KB strip and a 1.5MB stripe. With RAID6 RMW? I wouldn't >> recommend this. > > Large files, sequential IO, there will be no RMW cycles in the RAID. > The write cache of RAID controller will do the aggregation of > individual IOs into full stripe writes just fine. > >> It appears most of your writes will be appends, meaning little >> allocation, which means little stripe aligned write out. Here you are >> trying to optimize for large IOs which would be fine if you had an all >> or mostly allocation workload, but you don't. You have an append heavy >> workload. >> >> Using large strips (stripe units, chunks) with parity RAID, especially >> RAID6, will simply murder your append performance due to massive >> read-modify-write operations on large strips. > > No, that's wrong. sequential IO will always fill full stripes in the > cache, so RMW cycles simple will not happen. Remember that RMW > occurs whenteh cache has to be flushed to the back end disks, not > when writes come in to the front end cache.... > >> With RAID6 with a mostly append workload, you should be using a small >> strip size. This has been discussed here at length and the consensus is >> anything over a 32KB strip size doesn't improve performance, but can >> hurt performance, especially with parity RAID. Thus you should create >> your 6+2 arrays with a 32KB strip and (6*32)=192KB stripe, and create >> your XFS with "-d su=32k,sw=6". This should yield significantly better >> append performance. > > That's a tuning for an IOPS intensive workload, not a large scale, > large file storage workloads. > > While sequential writes are an append workload, it's an append > workload that the RAID controller is optimised to avoid causing RMW > cycles for. As such, the above is bad advice for large files with > sequential IO workloads. Large files, large fielsystem, sequential > IO is ideal for large RAID6 widths.... Yes, of course. WRT XFS you've drilled "allocation=aligned" and "non allocation=unaligned" so thoroughly into my head that I failed to actually think for a second about what the hardware does with this type of large append data stream. I feel a bit silly making this juvenile oversight. Won't happen again. ;) >> External log devices are for systems that modify metadata at rates of >> hundreds of IOs per second. So don't specify a log device. > > Even at hundreds of thousands of IOs per second, external logs don't > provide much in way of benefit thanks to delayed logging. The only > reason for using an external log these days is a fsync heavy or > synchronous write workload. And in most cases a BBWC means even > those worklaods don't need an external log... Which bloke provided us with this journal magic code again? Can't recall his name... ;) -- Stan From dsterba@suse.cz Wed Jan 23 06:40:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 99BCD7F47 for ; Wed, 23 Jan 2013 06:40:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1869BAC001 for ; Wed, 23 Jan 2013 04:40:54 -0800 (PST) X-ASG-Debug-ID: 1358944852-04cb6c3913ae340001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id hy3r9jJziwssNClr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Jan 2013 04:40:53 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 62F24A3A78 for ; Wed, 23 Jan 2013 13:40:52 +0100 (CET) Received: by ds.suse.cz (Postfix, from userid 10065) id D41A7DA809; Wed, 23 Jan 2013 13:40:51 +0100 (CET) From: David Sterba To: xfs@oss.sgi.com Cc: David Sterba Subject: [PATCH] xfstests: enhance ltp/fsx with a timeout option Date: Wed, 23 Jan 2013 13:40:51 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: enhance ltp/fsx with a timeout option Message-Id: <1358944851-14336-1-git-send-email-dsterba@suse.cz> X-Mailer: git-send-email 1.8.0.2 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1358944853 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.2.120672 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- New option T will let fsx run for a given amount of time (in seconds, accepts d/h/m/s modifiers). This option is mutually exclusive with the -N numops option. This can be used in situations when guessing the right number of fsx operations is tedious or just not that important. The test run time is bounded and more suitable for automated testing. Signed-off-by: David Sterba --- ltp/fsx.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 2f1e3e8..94a8f8b 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -140,6 +140,7 @@ long numops = -1; /* -N flag */ int randomoplen = 1; /* -O flag disables it */ int seed = 1; /* -S flag */ int mapped_writes = 1; /* -W flag disables */ +int timeout = 0; /* -T flag */ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int mapped_reads = 1; /* -R flag disables it */ @@ -1150,6 +1151,7 @@ usage(void) -O: use oplen (see -o flag) for every op (default random)\n\ -P: save .fsxlog and .fsxgood files in dirpath (default ./)\n\ -S seed: for random # generator (default 1) 0 gets timestamp\n\ + -T timespec: run for at most timespec (accepts d/h/m/s modifiers)\n\ -W: mapped write operations DISabled\n\ -R: read() system calls only (mapped reads disabled)\n\ -Z: O_DIRECT (use -R, -W, -r and -w too)\n\ @@ -1191,6 +1193,38 @@ getnum(char *s, char **e) return (ret); } +int +gettime(char *s, char **e) +{ + int num; + + *e = (char *) 0; + num = strtol(s, e, 0); + if (*e) + switch (**e) { + case 'd': + case 'D': + num *= 24*60*60; + *e = *e + 1; + break; + case 'h': + case 'H': + num *= 60*60; + *e = *e + 1; + break; + case 'm': + case 'M': + num *= 60; + *e = *e + 1; + break; + case 's': + case 'S': + *e = *e + 1; + break; + } + return (num); +} + #ifdef AIO #define QSZ 1024 @@ -1337,6 +1371,7 @@ main(int argc, char **argv) char *endp; char goodfile[1024]; char logfile[1024]; + time_t start_time; goodfile[0] = 0; logfile[0] = 0; @@ -1348,7 +1383,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHLN:OP:RS:T:WZ")) != EOF) switch (ch) { case 'b': @@ -1455,6 +1490,10 @@ main(int argc, char **argv) numops = getnum(optarg, &endp); if (numops < 0) usage(); + if (timeout > 0) { + fprintf(stdout, "Numops and timeout cannot be used together\n"); + usage(); + } break; case 'O': randomoplen = 0; @@ -1477,6 +1516,20 @@ main(int argc, char **argv) if (seed < 0) usage(); break; + case 'T': + timeout = gettime(optarg, &endp); + if (timeout < 0) { + fprintf(stdout, "Timeout is negative.\n"); + usage(); + } + if (numops > 0) { + fprintf(stdout, "Timeout and numops cannot be used together\n"); + usage(); + } + if (!quiet) + fprintf(stdout, "timeout set to %d seconds\n", + timeout); + break; case 'W': mapped_writes = 0; if (!quiet) @@ -1596,8 +1649,12 @@ main(int argc, char **argv) test_fallocate(); test_punch_hole(); - while (numops == -1 || numops--) + start_time = time(NULL); + while (numops == -1 || numops--) { test(); + if (timeout && time(NULL) - start_time > timeout) + break; + } if (close(fd)) { prterr("close"); -- 1.8.0.2 From jack@suse.cz Wed Jan 23 06:56:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 892327F4E for ; Wed, 23 Jan 2013 06:56:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67F5F8F8035 for ; Wed, 23 Jan 2013 04:56:28 -0800 (PST) X-ASG-Debug-ID: 1358945786-04bdf0231eb2570001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id NTCGaXjtY7Bk5Daz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Jan 2013 04:56:27 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id B591CA3A78; Wed, 23 Jan 2013 13:56:25 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id 530012060F; Wed, 23 Jan 2013 13:56:25 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: tytso@mit.edu, bpm@sgi.com, jlbec@evilplan.org, Jan Kara , xfs@oss.sgi.com, stable@vger.kernel.org Subject: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Date: Wed, 23 Jan 2013 13:56:18 +0100 X-ASG-Orig-Subj: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Message-Id: <1358945780-23661-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1358945780-23661-1-git-send-email-jack@suse.cz> References: <1358945780-23661-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1358945786 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers CC: stable@vger.kernel.org Signed-off-by: Jan Kara --- fs/xfs/xfs_aops.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4111a40..5f707e5 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -86,11 +86,11 @@ xfs_destroy_ioend( } if (ioend->io_iocb) { + inode_dio_done(ioend->io_inode); if (ioend->io_isasync) { aio_complete(ioend->io_iocb, ioend->io_error ? ioend->io_error : ioend->io_result, 0); } - inode_dio_done(ioend->io_inode); } mempool_free(ioend, xfs_ioend_pool); -- 1.7.1 From glommer@parallels.com Wed Jan 23 08:36:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7EC907F37 for ; Wed, 23 Jan 2013 08:36:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4D123304039 for ; Wed, 23 Jan 2013 06:36:18 -0800 (PST) X-ASG-Debug-ID: 1358951776-04bdf0231eb5b30001-NocioJ Received: from mx2.parallels.com (mx2.parallels.com [64.131.90.16]) by cuda.sgi.com with ESMTP id eDdAtUq6xPSGNt7X (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Jan 2013 06:36:17 -0800 (PST) X-Barracuda-Envelope-From: glommer@parallels.com X-Barracuda-Apparent-Source-IP: 64.131.90.16 Received: from [199.115.105.252] (helo=mail.parallels.com) by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.80.1) (envelope-from ) id 1Ty1R1-0007qY-Ex; Wed, 23 Jan 2013 09:36:15 -0500 Received: from straightjacket.localdomain (195.214.232.10) by mail.parallels.com (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.2.247.3; Wed, 23 Jan 2013 06:36:14 -0800 Message-ID: <50FFF571.8080506@parallels.com> Date: Wed, 23 Jan 2013 18:36:33 +0400 From: Glauber Costa User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: , , , , Johannes Weiner Subject: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <50FD6815.90900@parallels.com> <20130121232121.GG2498@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers In-Reply-To: <20130121232121.GG2498@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx2.parallels.com[64.131.90.16] X-Barracuda-Start-Time: 1358951777 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 01/22/2013 03:21 AM, Dave Chinner wrote: > On Mon, Jan 21, 2013 at 08:08:53PM +0400, Glauber Costa wrote: >> On 11/28/2012 03:14 AM, Dave Chinner wrote: >>> [PATCH 09/19] list_lru: per-node list infrastructure >>> >>> This makes the generic LRU list much more scalable by changing it to >>> a {list,lock,count} tuple per node. There are no external API >>> changes to this changeover, so is transparent to current users. >>> >>> [PATCH 10/19] shrinker: add node awareness >>> [PATCH 11/19] fs: convert inode and dentry shrinking to be node >>> >>> Adds a nodemask to the struct shrink_control for callers of >>> shrink_slab to set appropriately for their reclaim context. This >>> nodemask is then passed by the inode and dentry cache reclaim code >>> to the generic LRU list code to implement node aware shrinking. >> >> I have a follow up question that popped up from a discussion between me >> and my very American friend Johnny Wheeler, also known as Johannes >> Weiner (CC'd). I actually remember we discussing this, but don't fully >> remember the outcome. And since I can't find it anywhere, it must have >> been in a media other than e-mail. So I thought it would do no harm in >> at least documenting it... >> >> Why are we doing this per-node, instead of per-zone? >> >> It seems to me that the goal is to collapse all zones of a node into a >> single list, but since the number of zones is not terribly larger than >> the number of nodes, and zones is where the pressure comes from, what do >> we really gain from this? > > The number is quite a bit higher - there are platforms with 5 zones > to a node. The reality is, though, for most platforms slab > allocations come from a single zone - they never come from ZONE_DMA, > ZONE_HIGHMEM or ZONE_MOVEABLE, so there is there is no good reason > for having cache LRUs for these zones. So, two zones at most. > Yes, but one would expect that most of those special zones would be present only in the first node, no? (correct me if I am wrong here). Over that, things should be pretty much addressable. From alvin.ong@medinacomtech.com Wed Jan 23 09:09:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 582BB7F4C for ; Wed, 23 Jan 2013 09:09:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CA608AC002 for ; Wed, 23 Jan 2013 07:09:24 -0800 (PST) X-ASG-Debug-ID: 1358953762-04cb6c3913b3400001-NocioJ Received: from mail-pb0-f52.google.com (mail-pb0-f52.google.com [209.85.160.52]) by cuda.sgi.com with ESMTP id c0WEHuPmDKfgfzkb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Jan 2013 07:09:23 -0800 (PST) X-Barracuda-Envelope-From: alvin.ong@medinacomtech.com X-Barracuda-Apparent-Source-IP: 209.85.160.52 Received: by mail-pb0-f52.google.com with SMTP id ro2so4705032pbb.11 for ; Wed, 23 Jan 2013 07:09:22 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=+Tz0SlWKlsXok4+5Q2bXb6Od6B2KzqD9sOng5zbxV/g=; b=S5uxLXepioMMJr5N37+kKY2Pr+OL3rDT66lESdi5WLSn9FRKfhbFv9iwBSptyObgf8 K32gtFKOa5jLKqHHSqPjzDIpC8g7fC4T6frtXu5i3dZq56CaYvkUT7tgm1myTy+Q58PD H7DUJjTxRyYy3lG58+rWcC3V3LSXIn42zyawpCkl3hG/D8WnuII+GKXXmyWh+ajllkQD f4swr+VMDBnHi9g+0JF9RpxNUkLpS/B2dDKUp+JiLPFLiWLCAij07nK9q/stKDGar6Ac rzdcvhseBUMz9DdzM9v3kj5e3aL1IteJnt6sFoghv8Q5p8ThqNjcXEJcTbSpmIaG3CTc j/ww== X-Received: by 10.69.1.65 with SMTP id be1mr4439032pbd.66.1358953762070; Wed, 23 Jan 2013 07:09:22 -0800 (PST) Received: from [192.168.100.7] ([175.139.199.106]) by mx.google.com with ESMTPS id f9sm1780277paz.12.2013.01.23.07.09.19 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 23 Jan 2013 07:09:21 -0800 (PST) Message-ID: <50FFFD1E.6070500@medinacomtech.com> Date: Wed, 23 Jan 2013 23:09:18 +0800 From: Alvin Ong User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: stan@hardwarefreak.com CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files References: <50FE8AEA.7020300@hardwarefreak.com> <20130122220511.GN2498@dastard> <50FFD911.3@hardwarefreak.com> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: <50FFD911.3@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQlFcZwfdZeeO05Zrptfwxo3LQXWVREjj3ZHsPBAsxYdR2xwruxkhI8fvi2OoYzGgS3qXsoI X-Barracuda-Connect: mail-pb0-f52.google.com[209.85.160.52] X-Barracuda-Start-Time: 1358953762 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=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e Thanks Stan, Dave and Emmanuel for such informative replies. I will take some time to digest this information and make some considerations. As for the files they start at 500GB at a minimum. The rate of the growth is not known as of yet. But it won't be high loads. The idea is sort of like a cloud storage for the customer to dump data. With that said we also do not want to have issues with fragmentation or any failure that could cause data lost in the future. Thanks Alvin On 23-Jan-13 8:35 PM, Stan Hoeppner wrote: > On 1/22/2013 4:05 PM, Dave Chinner wrote: >> On Tue, Jan 22, 2013 at 06:49:46AM -0600, Stan Hoeppner wrote: >>> On 1/21/2013 10:22 PM, Alvin Ong wrote: >>>> Hi, >>>> >>>> We are building a solution with a web front end for our users to store >>>> large files. >>>> Large files starting from the size of 500GB and above and can grow up to >>>> 1-2TB's per file. >>>> This is the reason we are trying out XFS to see if we can get a test system >>>> running. >>> Tell us more about these files. Is this simply bulk file storage? >>> Start at 500GB and append until 2TB? How often will the files be >>> appended and at what rate? I.e. will it take 3 days to append from >>> 500GB to 2TB or take 3 months? The answer to this dictates how the >>> files and filesystem will fragment over time. Constantly expanding with >>> additional 6 spindle constituent arrays, LVM concatenation, and >>> xfs_growfs may leave you with an undesirable, possibly disastrous, >>> fragmentation pattern. >> I'd say it's guaranteed, not a possibility. >> >>>> We plan to use a 6+2 RAID6 to start off with. Then when it gets filled up >>>> to maybe 60-70% we will >>>> expand by adding another 6+2 RAID6 to the array. >>>> The max we can grow this configuration is up to 252TB usable which should >>>> be enough for a year. >>>> Our requirements might grow up to 2PB in 2 years time if all goes well. >>> I'd not attempt growing a single XFS to the scale you're describing, via >>> the methods you describe. The odds of catastrophe are too great. >> It's a recipe for disaster and not recommended at all. >> >>>> So I have been testing all of this out on a VM running 3 vmdk's and using >>>> LVM to create a single logical volume of the 3 disks. >>>> I noticed that out of sdb, sdc and sdd, files keep getting written to sdc. >>>> This is probably due to our web app creating a single folder and all files >>>> are written under that folder. >>>> This is the nature of the Allocation Group of XFS? Is there a way to avoid >>>> this? >>> Yes. >>> >>> 1. Don't put all files in a single directory. >>> >>> 2. Use the inode32 allocator on a filesystem greater than 1TB in size. >>> This will cause inodes to be located in the first 1TB and files to be >>> allocated round robin across the AGs via rotor stepping. See page 10: >>> http://oss.sgi.com/projects/xfs/training/xfs_slides_06_allocators.pdf >> 3: Use a storage layout that is not affected by hotspots due to >> filesystem locality. >> >> That is, build the storage to the scale that you are likely to need >> in the future. i.e. use all 112 disks (14x 6+2 RAID = 112 disks) to >> begin with and lay the storage and filesystem out optimally >> accordingly. I'd build seven 14+2 hardware RAID6 luns (112 disks) >> and stripe them in RAID0, setting the XFS stripe unit to be the >> width of a hardware RAID6 lun. That way sequential IO to a single >> region of the disk still hits every single disk in the array, and >> hotspots don't occur >> >> If you do this, it doesn't matter if you use inode64 or inode32 for >> a hotspot perspective, only a file fragmentation perspective. This >> is the way XFs has been used for exactly this sort of storage for >> the last 15 years.... >> >>>> As we will have files keep writing to the same disk thus creating a >>>> hot spot. >>>> Although it might not hurt us that much if we fill up a single RAID6 to >>>> 60-70% then adding another RAID6 to the mix. We could go up to a total of >>>> 14 RAID6 sets. >>> Again, you probably don't want to do this. Too many eggs in one basket. >>> >>> You should investigate using GlusterFS to tie multiple XFS storage >>> servers together into a single file tree. >> Another possible solution. You should talk to RedHat (says the >> RedHat employee ;).... > I get the impression the "grow as you go" mindset here is probably due > to budget/cash flow issues, as well as evaluating the system at small > scale before committing to going larger. Thus I'd guess building the > 112 drive system up front isn't a real possibility. And this is where > something like Gluster atop XFS would really come in handy, as it would > make "grow as you go" much more feasible, while avoiding the 'game over' > fragmentation issue with simply growing XFS in the manner described by > the OP. > > Emmanuel states Gluster is slow, but that's a very relative statement. > For clients streaming single large files over GbE or slower links it > should be plenty fast. Gluster and similar network file systems tend to > be slow with metadata intensive or transactional workloads. > >>> Running an xfs_repair on a single filesystem denies all access, and with >>> a 252TB XFS this could take some time. >> For a filesystem with 1-2TB files, it'll take 30s to run. That's not >> an issue. > For some reason I was thinking data size instead of metadata. With only > a few hundred to low thousand files it would be quick indeed, a non issue. > >>>> Is LVM a good choice of doing this configuration? Or do you have a better >>>> recommendation? >>>> The reason we thought LVM would be good was so that we could easily grow >>>> XFS. >>> Why not do the concatenation within the SAN array controller? >> Same problem as LVM concatenation. Hot spots. > I was simply suggesting hardware vs software concatenation here > unrelated to his current flawed expansion path idea, as his SAN > controller probably has some nice features and performance here. > >>>> Is I was to use the 8-disk RAID6 array with a 256kB stripe size will have a >>>> sunit of 512 and a swidth of (8-2)*512=3072. >>> So a 256KB strip and a 1.5MB stripe. With RAID6 RMW? I wouldn't >>> recommend this. >> Large files, sequential IO, there will be no RMW cycles in the RAID. >> The write cache of RAID controller will do the aggregation of >> individual IOs into full stripe writes just fine. >> >>> It appears most of your writes will be appends, meaning little >>> allocation, which means little stripe aligned write out. Here you are >>> trying to optimize for large IOs which would be fine if you had an all >>> or mostly allocation workload, but you don't. You have an append heavy >>> workload. >>> >>> Using large strips (stripe units, chunks) with parity RAID, especially >>> RAID6, will simply murder your append performance due to massive >>> read-modify-write operations on large strips. >> No, that's wrong. sequential IO will always fill full stripes in the >> cache, so RMW cycles simple will not happen. Remember that RMW >> occurs whenteh cache has to be flushed to the back end disks, not >> when writes come in to the front end cache.... >> >>> With RAID6 with a mostly append workload, you should be using a small >>> strip size. This has been discussed here at length and the consensus is >>> anything over a 32KB strip size doesn't improve performance, but can >>> hurt performance, especially with parity RAID. Thus you should create >>> your 6+2 arrays with a 32KB strip and (6*32)=192KB stripe, and create >>> your XFS with "-d su=32k,sw=6". This should yield significantly better >>> append performance. >> That's a tuning for an IOPS intensive workload, not a large scale, >> large file storage workloads. >> >> While sequential writes are an append workload, it's an append >> workload that the RAID controller is optimised to avoid causing RMW >> cycles for. As such, the above is bad advice for large files with >> sequential IO workloads. Large files, large fielsystem, sequential >> IO is ideal for large RAID6 widths.... > Yes, of course. WRT XFS you've drilled "allocation=aligned" and "non > allocation=unaligned" so thoroughly into my head that I failed to > actually think for a second about what the hardware does with this type > of large append data stream. I feel a bit silly making this juvenile > oversight. Won't happen again. ;) > >>> External log devices are for systems that modify metadata at rates of >>> hundreds of IOs per second. So don't specify a log device. >> Even at hundreds of thousands of IOs per second, external logs don't >> provide much in way of benefit thanks to delayed logging. The only >> reason for using an external log these days is a fsync heavy or >> synchronous write workload. And in most cases a BBWC means even >> those worklaods don't need an external log... > Which bloke provided us with this journal magic code again? Can't > recall his name... ;) > From bpm@sgi.com Wed Jan 23 16:00:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 7B5257F37 for ; Wed, 23 Jan 2013 16:00:08 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3201AC005; Wed, 23 Jan 2013 14:00:04 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 31F9B4266DC; Wed, 23 Jan 2013 16:00:04 -0600 (CST) Date: Wed, 23 Jan 2013 16:00:04 -0600 From: Ben Myers To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, tytso@mit.edu, jlbec@evilplan.org, xfs@oss.sgi.com, stable@vger.kernel.org Subject: Re: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Message-ID: <20130123220004.GS30652@sgi.com> References: <1358945780-23661-1-git-send-email-jack@suse.cz> <1358945780-23661-3-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358945780-23661-3-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Jan 23, 2013 at 01:56:18PM +0100, Jan Kara wrote: > Running AIO is pinning inode in memory using file reference. Once AIO > is completed using aio_complete(), file reference is put and inode can > be freed from memory. So we have to be sure that calling aio_complete() > is the last thing we do with the inode. > > CC: xfs@oss.sgi.com > CC: Ben Myers > CC: stable@vger.kernel.org > Signed-off-by: Jan Kara Looks good! Reviewed-by: Ben Myers From bpm@sgi.com Wed Jan 23 16:12:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 5ECE07F37 for ; Wed, 23 Jan 2013 16:12:30 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43F6B8F8039; Wed, 23 Jan 2013 14:12:27 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id DE9F24266DC; Wed, 23 Jan 2013 16:12:26 -0600 (CST) Date: Wed, 23 Jan 2013 16:12:26 -0600 From: Ben Myers To: Kamal Dasu Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: xfs: xfs_io oops on _raw_spin_lock Message-ID: <20130123221226.GW27055@sgi.com> References: <20130123013509.GR2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130123013509.GR2498@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Kamal, On Wed, Jan 23, 2013 at 12:35:09PM +1100, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 08:24:02PM -0500, Kamal Dasu wrote: > > I am running a simple test with xfs_io on Kernel 3.3 writing in > > O_DIRECT mode and I get > > > > # /rt.sh > > ++ DEV=/dev/sda2 > > ++ RTDEV=/dev/sda3 > > ++ MNT=/mnt/xfsmnt > > ++ mkdir /mnt/xfsmnt > > ++ mkfs.xfs -f /dev/sda2 -r extsize=2m,rtdev=/dev/sda3 > > meta-data=/dev/sda2 isize=256 agcount=4, agsize=983479 blks > > = sectsz=512 attr=2, projid32bit=0 > > data = bsize=4096 blocks=3933916, imaxpct=25 > > = sunit=0 swidth=0 blks > > naming =version 2 bsize=4096 ascii-ci=0 > > log =internal log bsize=4096 blocks=2560, version=2 > > = sectsz=512 sunit=0 blks, lazy-count=1 > > realtime =/dev/sda3 extsz=2097152 blocks=240089416, > > rtextents=468924 > > Patches are pending in 3.8 to fix the oops, but it won't fix your > problems..... Here is the patch Dave is referring to. http://oss.sgi.com/archives/xfs/2013-01/msg00323.html It prevents xfs_perag_get returning a null pag. Regards, Ben From bpm@sgi.com Wed Jan 23 16:24:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 BF5827F37 for ; Wed, 23 Jan 2013 16:24:45 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 49E42AC003; Wed, 23 Jan 2013 14:24:42 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 007994266DC; Wed, 23 Jan 2013 16:24:41 -0600 (CST) Date: Wed, 23 Jan 2013 16:24:41 -0600 From: Ben Myers To: David Sterba Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfstests: make length of diff output configurable Message-ID: <20130123222441.GX27055@sgi.com> References: <20130122214435.GM2498@dastard> <1358939673-7523-1-git-send-email-dsterba@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358939673-7523-1-git-send-email-dsterba@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) Hi David, On Wed, Jan 23, 2013 at 12:14:33PM +0100, David Sterba wrote: > In commit 11c1d79414e2571 "xfstests: Change the diff output of failed > tests", the diff output of a failed test was hardcoded to 10 lines to > avoid overly long output and user can get the full output by manually > running the diff. However this is not always possible and convenient, > eg. in repeated automated tests where the required information is lost > after the test round finished. Then the caputred logs do not contain > enough informatin for analysis. Ah, sorry for any inconvenience. > Introduce the DIFF_LENGTH env variable to tune the diff size, keeping it > 10 as deafult and 0 to disable the limit. > > Signed-off-by: David Sterba What you have here looks good. Reviewed-by: Ben Myers Regards, Ben From mangmyni.naloj@mail.ru Wed Jan 23 16:34:46 2013 Return-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=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 087C87F37 for ; Wed, 23 Jan 2013 16:34:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D65B08F8049 for ; Wed, 23 Jan 2013 14:34:45 -0800 (PST) X-ASG-Debug-ID: 1358980480-04cb6c3913c5a00001-NocioJ Received: from send.nokladochka.com (send.nokladochka.com [111.67.206.60]) by cuda.sgi.com with ESMTP id LoFLKhYmqkTSbpvx; Wed, 23 Jan 2013 14:34:42 -0800 (PST) X-Barracuda-Envelope-From: mangmyni.naloj@mail.ru X-Barracuda-Apparent-Source-IP: 111.67.206.60 Date: Thu, 24 Jan 2013 02:35:51 +0400 From: =?Windows-1251?B?yuDqIO/u6/P36PL8IPTo7WHtY2/i8/4gY+Jv4e7k8w==?= To: xfs@oss.sgi.com Reply-To: =?Windows-1251?B?yuDqIO/u6/P36PL8IPTo7WHtY2/i8/4gY+Jv4e7k8w==?= Subject: =?Windows-1251?B?Q/Lw4PLl4+joIPPx72X47e7pIObo5+3oIOgg4ejn7WVj4A==?= X-Priority: 3 (Normal) X-ASG-Orig-Subj: =?Windows-1251?B?Q/Lw4PLl4+joIPPx72X47e7pIObo5+3oIOgg4ejn7WVj4A==?= Message-ID: <0220544949.20130124975169@send.nokladochka.com> MIME-Version: 1.0 Content-Type: text/html; charset=windows-1251 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: send.nokladochka.com[111.67.206.60] X-Barracuda-Start-Time: 1358980482 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: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC3_MV0165, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 BSF_SC3_MV0165 Custom rule MV0165 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message

    HA P H HC
    O CO PA!!!

    ao coc oa?
    A o co p cc pe ,
    op a o e!

    Ca ceo c

    K pe pe o o c
    o a p-

    oo e 377 p. +1 o p ec

    ee 099 07-30-777

    From bpm@sgi.com Wed Jan 23 16:55:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 012C87F37 for ; Wed, 23 Jan 2013 16:55:26 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA1138F8039; Wed, 23 Jan 2013 14:55:26 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B455C4266DC; Wed, 23 Jan 2013 16:55:26 -0600 (CST) Date: Wed, 23 Jan 2013 16:55:26 -0600 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end Message-ID: <20130123225526.GY27055@sgi.com> References: <1358772835-21436-1-git-send-email-david@fromorbit.com> <1358772835-21436-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358772835-21436-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Jan 21, 2013 at 11:53:52PM +1100, Dave Chinner wrote: > From: Dave Chinner > > When _xfs_buf_find is passed an out of range address, it will fail > to find a relevant struct xfs_perag and oops with a null > dereference. This can happen when trying to walk a filesystem with a > metadata inode that has a partially corrupted extent map (i.e. the > block number returned is corrupt, but is otherwise intact) and we > try to read from the corrupted block address. > > In this case, just fail the lookup. If it is readahead being issued, > it will simply not be done, but if it is real read that fails we > will get an error being reported. Ideally this case should result > in an EFSCORRUPTED error being reported, but we cannot return an > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > may result in ENOMEM or EIO errors being reported instead. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 56d1614..689d726 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -487,6 +487,7 @@ _xfs_buf_find( > struct rb_node *parent; > xfs_buf_t *bp; > xfs_daddr_t blkno = map[0].bm_bn; > + xfs_daddr_t eofs; > int numblks = 0; > int i; > > @@ -498,6 +499,23 @@ _xfs_buf_find( > ASSERT(!(numbytes < (1 << btp->bt_sshift))); > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > > + /* > + * Corrupted block numbers can get through to here, unfortunately, so we > + * have to check that the buffer falls within the filesystem bounds. > + */ > + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > + if (blkno >= eofs) { Looks fine. Reviewed-by: Ben Myers From harry@uw.edu Wed Jan 23 17:07:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 ED53B7F4C for ; Wed, 23 Jan 2013 17:07:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6D43304048 for ; Wed, 23 Jan 2013 15:07:45 -0800 (PST) X-ASG-Debug-ID: 1358982464-04cbb00c66bed10001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id bqPV65S4brrclFd8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Jan 2013 15:07:44 -0800 (PST) X-Barracuda-Envelope-From: harry@uw.edu X-Barracuda-Apparent-Source-IP: 209.85.220.46 Received: by mail-pa0-f46.google.com with SMTP id kp14so3659808pab.19 for ; Wed, 23 Jan 2013 15:07:44 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding:x-gm-message-state; bh=dbkRNsmeqk3DYZVe/654LbjvFI0BdoMavDZ9hRj+8Ps=; b=Cv1YtVUuBJ5DYr43a8SaFdswEmnFx4xx4LPtE/cmaKl8s4/F1jtHxQt+YJeAlLSFpI Dk+rGw8IOx02eHn0SAdThndmC8tl7EPZOjF69s5HZGaBQjN6OR/kX+rNmv+RrlMxBXBz fK9m0m8YIuWu7NFc2K6RCwY7DcHmF+qSj32k9arWkD7+kCuaN0i2qj9ABu4mPBQFdyHl UABIumAWQilVfdMlGzKYhimU+sTGdBZoerNATHxeRjhG95Ir4yir0n5EFrBnybfK5Qpo tvn+py4R17FUZByEwBqDBfNZX35rKE5H8dIYBkSAnys3dvAKxR9lUrDL0Z5+BcoSjyGh idPg== X-Received: by 10.66.86.71 with SMTP id n7mr8571095paz.77.1358982464098; Wed, 23 Jan 2013 15:07:44 -0800 (PST) Received: from [128.95.176.96] (moist.atmos.washington.edu. [128.95.176.96]) by mx.google.com with ESMTPS id vo6sm13585273pbc.8.2013.01.23.15.07.43 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 23 Jan 2013 15:07:43 -0800 (PST) Message-ID: <51006D3E.6080704@uw.edu> Date: Wed, 23 Jan 2013 15:07:42 -0800 From: Harry Edmon User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Initial mount with inode32 option Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: Initial mount with inode32 option Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQlNR+rpN5ARR9VdjRB1YLqsPkwOGS/acbxRNFNy/TmFT/ysQhrm+7/IZM/Mx4TXsBE0picb X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1358982464 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It appears that "mount -o inode32 /dev/sda1 /mnt" ignores the inode32 option and mounts with inode64. After the partition is mounted I can do "mount -o remount,inode32 /mnt" and it remounts with inode32. But shouldn't there be a way to do the initial mount with inode32? I am running Linux 3.7.3 on an amd architecture. I would like this option since I am using EMC Networker for backups (yes, I know about the complaints). Thanks. -- Dr. Harry Edmon harry@uw.edu, 206-543-0547, FAX: 206-543-0308 Director of IT, College of the Environment and Director of Computing, Dept of Atmospheric Sciences University of Washington, Box 351640, Seattle, WA 98195-1640 From bpm@sgi.com Wed Jan 23 17:22:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 A59937F37 for ; Wed, 23 Jan 2013 17:22:48 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 032D4AC003; Wed, 23 Jan 2013 15:22:45 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D75074266DC; Wed, 23 Jan 2013 17:22:44 -0600 (CST) Date: Wed, 23 Jan 2013 17:22:44 -0600 From: Ben Myers To: Harry Edmon Cc: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130123232244.GZ27055@sgi.com> References: <51006D3E.6080704@uw.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51006D3E.6080704@uw.edu> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Harry, On Wed, Jan 23, 2013 at 03:07:42PM -0800, Harry Edmon wrote: > It appears that "mount -o inode32 /dev/sda1 /mnt" ignores the > inode32 option and mounts with inode64. After the partition is > mounted I can do "mount -o remount,inode32 /mnt" and it remounts > with inode32. But shouldn't there be a way to do the initial mount > with inode32? I am running Linux 3.7.3 on an amd architecture. I > would like this option since I am using EMC Networker for backups > (yes, I know about the complaints). Thanks. # mount -o inode32 /dev/sdb1 /mnt/scratch # grep /dev/sdb1 /proc/mounts /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 # mount -o remount,inode32 /mnt/scratch # grep /dev/sdb1 /proc/mounts /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode32,noquota 0 0 We'll get this fixed. -Ben From david@fromorbit.com Wed Jan 23 17:46:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D0B967F37 for ; Wed, 23 Jan 2013 17:46:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBE358F8037 for ; Wed, 23 Jan 2013 15:46:53 -0800 (PST) X-ASG-Debug-ID: 1358984811-04cbb00c65c0060001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id sOwdzeCL7MnRwfgE for ; Wed, 23 Jan 2013 15:46:51 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ah8NABx1AFF5LA3Z/2dsb2JhbABEhVyyUIYUF3OCHgEBBTocFgoDEAgDDgQGCSUPBSUDDRQTiBm9fBWMWxuEKAOWC5BKgwmBWw Received: from ppp121-44-13-217.lns20.syd6.internode.on.net (HELO dastard) ([121.44.13.217]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Jan 2013 10:16:49 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TyA1p-0008HR-4t; Thu, 24 Jan 2013 10:46:49 +1100 Date: Thu, 24 Jan 2013 10:46:49 +1100 From: Dave Chinner To: Glauber Costa Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com, Johannes Weiner Subject: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers Message-ID: <20130123234649.GV2498@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 00/19] Numa aware LRU lists and shrinkers References: <1354058086-27937-1-git-send-email-david@fromorbit.com> <50FD6815.90900@parallels.com> <20130121232121.GG2498@dastard> <50FFF571.8080506@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50FFF571.8080506@parallels.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1358984811 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Wed, Jan 23, 2013 at 06:36:33PM +0400, Glauber Costa wrote: > On 01/22/2013 03:21 AM, Dave Chinner wrote: > > On Mon, Jan 21, 2013 at 08:08:53PM +0400, Glauber Costa wrote: > >> On 11/28/2012 03:14 AM, Dave Chinner wrote: > >>> [PATCH 09/19] list_lru: per-node list infrastructure > >>> > >>> This makes the generic LRU list much more scalable by changing it to > >>> a {list,lock,count} tuple per node. There are no external API > >>> changes to this changeover, so is transparent to current users. > >>> > >>> [PATCH 10/19] shrinker: add node awareness > >>> [PATCH 11/19] fs: convert inode and dentry shrinking to be node > >>> > >>> Adds a nodemask to the struct shrink_control for callers of > >>> shrink_slab to set appropriately for their reclaim context. This > >>> nodemask is then passed by the inode and dentry cache reclaim code > >>> to the generic LRU list code to implement node aware shrinking. > >> > >> I have a follow up question that popped up from a discussion between me > >> and my very American friend Johnny Wheeler, also known as Johannes > >> Weiner (CC'd). I actually remember we discussing this, but don't fully > >> remember the outcome. And since I can't find it anywhere, it must have > >> been in a media other than e-mail. So I thought it would do no harm in > >> at least documenting it... > >> > >> Why are we doing this per-node, instead of per-zone? > >> > >> It seems to me that the goal is to collapse all zones of a node into a > >> single list, but since the number of zones is not terribly larger than > >> the number of nodes, and zones is where the pressure comes from, what do > >> we really gain from this? > > > > The number is quite a bit higher - there are platforms with 5 zones > > to a node. The reality is, though, for most platforms slab > > allocations come from a single zone - they never come from ZONE_DMA, > > ZONE_HIGHMEM or ZONE_MOVEABLE, so there is there is no good reason > > for having cache LRUs for these zones. So, two zones at most. > > > Yes, but one would expect that most of those special zones would be > present only in the first node, no? (correct me if I am wrong here). As I understand it, every node has an identical zone setup (i.e. a flat array of MAX_NR_ZONES zones in the struct pglist_data), and pages are simply places the in the appropriate zones on each node... Also, IIUC, the behaviour of the zones one each node is architecture dependent, we can't make assumptions that certain zones are only ever used on the first node... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 23 18:14:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 152517F37 for ; Wed, 23 Jan 2013 18:14:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98A2FAC005 for ; Wed, 23 Jan 2013 16:14:04 -0800 (PST) X-ASG-Debug-ID: 1358986442-04cbb00c64c0b90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id JGGvCEvDE0eXB0B4 for ; Wed, 23 Jan 2013 16:14:02 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ah8NAB18AFF5LA3Z/2dsb2JhbABEhVyyUIYUF3OCHgEBBTocIxAIAw4EBgklDwUlAw0UE4gZvXsVkR4DlguQSoMJ Received: from ppp121-44-13-217.lns20.syd6.internode.on.net (HELO dastard) ([121.44.13.217]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Jan 2013 10:44:02 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TyAS8-0008Ke-SG; Thu, 24 Jan 2013 11:14:00 +1100 Date: Thu, 24 Jan 2013 11:14:00 +1100 From: Dave Chinner To: Ben Myers Cc: Harry Edmon , xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130124001400.GW2498@dastard> X-ASG-Orig-Subj: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130123232244.GZ27055@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1358986442 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.2.120718 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 23, 2013 at 05:22:44PM -0600, Ben Myers wrote: > Hi Harry, > > On Wed, Jan 23, 2013 at 03:07:42PM -0800, Harry Edmon wrote: > > It appears that "mount -o inode32 /dev/sda1 /mnt" ignores the > > inode32 option and mounts with inode64. After the partition is > > mounted I can do "mount -o remount,inode32 /mnt" and it remounts > > with inode32. But shouldn't there be a way to do the initial mount > > with inode32? I am running Linux 3.7.3 on an amd architecture. I > > would like this option since I am using EMC Networker for backups > > (yes, I know about the complaints). Thanks. > > # mount -o inode32 /dev/sdb1 /mnt/scratch > # grep /dev/sdb1 /proc/mounts > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 > # mount -o remount,inode32 /mnt/scratch > # grep /dev/sdb1 /proc/mounts > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode32,noquota 0 0 > > We'll get this fixed. That's not necessarily broken. Filesystems under 1TB will always report inode64. filesytsems will only switch to inode32 (regardless of the mount option) when they go above the size that will cause inodes to exceed 32 bits. e.g. a 17TB filesytem: $ sudo mkfs.xfs -f -l size=131072b,sunit=8 /dev/vdc meta-data=/dev/vdc isize=256 agcount=17, agsize=268435455 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=4563402735, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=131072, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 $ sudo mount -o inode32 /dev/vdc /mnt/scratch $ grep /mnt/scratch /proc/mounts /dev/vdc /mnt/scratch xfs rw,relatime,attr2,inode32,noquota 0 0 $ which, as you can see, mounts as inode32 just fine. Let's make that a 500g filesystem on the same device: $ sudo mkfs.xfs -f -l size=131072b,sunit=8 -d size=500g /dev/vdc meta-data=/dev/vdc isize=256 agcount=4, agsize=32768000 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=131072000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=131072, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 $ sudo mount -o inode32 /dev/vdc /mnt/scratch $ grep /mnt/scratch /proc/mounts /dev/vdc /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 $ It reports inode64 just like it should - inode32 was ignored because the filesystem is not large enough to create 64 bit inodes, and so is using the inode64 allocation behaviour. It's been like this for 15 years... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 23 18:22:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9446D7F37 for ; Wed, 23 Jan 2013 18:22:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83EE68F8035 for ; Wed, 23 Jan 2013 16:22:44 -0800 (PST) X-ASG-Debug-ID: 1358986962-04cbb00c65c0f80001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vJXH1n1Sqkg7mO85 for ; Wed, 23 Jan 2013 16:22:42 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ah8NAGh9AFF5LA3Z/2dsb2JhbABEhVyyUIYUF3OCHgEBBTocIxAIAw4EBgklDwUlAw0UE4gZvX4VkR4DlguQSoMJ Received: from ppp121-44-13-217.lns20.syd6.internode.on.net (HELO dastard) ([121.44.13.217]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Jan 2013 10:52:41 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TyAaX-0008Ld-90; Thu, 24 Jan 2013 11:22:41 +1100 Date: Thu, 24 Jan 2013 11:22:41 +1100 From: Dave Chinner To: Ben Myers Cc: Harry Edmon , xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130124002241.GX2498@dastard> X-ASG-Orig-Subj: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <20130124001400.GW2498@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130124001400.GW2498@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1358986962 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.2.120720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 24, 2013 at 11:14:00AM +1100, Dave Chinner wrote: > On Wed, Jan 23, 2013 at 05:22:44PM -0600, Ben Myers wrote: > > Hi Harry, > > > > On Wed, Jan 23, 2013 at 03:07:42PM -0800, Harry Edmon wrote: > > > It appears that "mount -o inode32 /dev/sda1 /mnt" ignores the > > > inode32 option and mounts with inode64. After the partition is > > > mounted I can do "mount -o remount,inode32 /mnt" and it remounts > > > with inode32. But shouldn't there be a way to do the initial mount > > > with inode32? I am running Linux 3.7.3 on an amd architecture. I > > > would like this option since I am using EMC Networker for backups > > > (yes, I know about the complaints). Thanks. > > > > # mount -o inode32 /dev/sdb1 /mnt/scratch > > # grep /dev/sdb1 /proc/mounts > > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 > > # mount -o remount,inode32 /mnt/scratch > > # grep /dev/sdb1 /proc/mounts > > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode32,noquota 0 0 > > > > We'll get this fixed. > > That's not necessarily broken. Filesystems under 1TB will always > report inode64. filesytsems will only switch to inode32 (regardless > of the mount option) when they go above the size that will cause > inodes to exceed 32 bits. FWIW, the remount behaviour displayed above is arguably the bug being displayed - it's the new feature, and it doesn't check whether inode numbers can exceed 32 bits like a real mount does - it just blindly changes the behaviour whether or not it is needed.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Wed Jan 23 22:23:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 439357F37 for ; Wed, 23 Jan 2013 22:23:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30C9B304032 for ; Wed, 23 Jan 2013 20:23:10 -0800 (PST) X-ASG-Debug-ID: 1359001389-04cbb00c66c6c10001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id s7NOPzUgdDbiBuo8 for ; Wed, 23 Jan 2013 20:23:09 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 11C266C1AB; Wed, 23 Jan 2013 22:23:09 -0600 (CST) Message-ID: <5100B72C.9050706@hardwarefreak.com> Date: Wed, 23 Jan 2013 22:23:08 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Alvin Ong CC: xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files References: <50FE8AEA.7020300@hardwarefreak.com> <20130122220511.GN2498@dastard> <50FFD911.3@hardwarefreak.com> <50FFFD1E.6070500@medinacomtech.com> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: <50FFFD1E.6070500@medinacomtech.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1359001389 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 1/23/2013 9:09 AM, Alvin Ong wrote: > Thanks Stan, Dave and Emmanuel for such informative replies. I will take > some time to digest this information and make some considerations. > As for the files they start at 500GB at a minimum. The rate of the > growth is not known as of yet. > But it won't be high loads. The idea is sort of like a cloud storage for > the customer to dump data. So you're going to be using some kind of virtual disk setup for each customer, and these virtual disks are sparse files on XFS? They start as empty 500GB files and you will increase this size over time as they fill up? The user files that each customer uploads could be either small or large, correct? If so then my caution about large strip/stripe RMW cycles may have been justified after all. What customer behavior do you anticipate? I.e. will they be using this resource akin to a local disk, copying individual files up, or more in a backup scenario, where they do a batch copy with some size to the total transfer? If mostly the small file small transfer scenario, then you're probably not going to want the large stripe setup Dave described as you will incur a big RMW penalty. If the transfers are all or mostly multiple megabytes in size then the large stripe may still be ok. > With that said we also do not want to have issues with fragmentation or > any failure that could cause data lost in the future. I'm not familiar enough with sparse files to comment on fragmentation patterns. Others may have some answers/recommendations for you here. -- Stan > Thanks > Alvin > > > On 23-Jan-13 8:35 PM, Stan Hoeppner wrote: >> On 1/22/2013 4:05 PM, Dave Chinner wrote: >>> On Tue, Jan 22, 2013 at 06:49:46AM -0600, Stan Hoeppner wrote: >>>> On 1/21/2013 10:22 PM, Alvin Ong wrote: >>>>> Hi, >>>>> >>>>> We are building a solution with a web front end for our users to store >>>>> large files. >>>>> Large files starting from the size of 500GB and above and can grow >>>>> up to >>>>> 1-2TB's per file. >>>>> This is the reason we are trying out XFS to see if we can get a >>>>> test system >>>>> running. >>>> Tell us more about these files. Is this simply bulk file storage? >>>> Start at 500GB and append until 2TB? How often will the files be >>>> appended and at what rate? I.e. will it take 3 days to append from >>>> 500GB to 2TB or take 3 months? The answer to this dictates how the >>>> files and filesystem will fragment over time. Constantly expanding >>>> with >>>> additional 6 spindle constituent arrays, LVM concatenation, and >>>> xfs_growfs may leave you with an undesirable, possibly disastrous, >>>> fragmentation pattern. >>> I'd say it's guaranteed, not a possibility. >>> >>>>> We plan to use a 6+2 RAID6 to start off with. Then when it gets >>>>> filled up >>>>> to maybe 60-70% we will >>>>> expand by adding another 6+2 RAID6 to the array. >>>>> The max we can grow this configuration is up to 252TB usable which >>>>> should >>>>> be enough for a year. >>>>> Our requirements might grow up to 2PB in 2 years time if all goes >>>>> well. >>>> I'd not attempt growing a single XFS to the scale you're describing, >>>> via >>>> the methods you describe. The odds of catastrophe are too great. >>> It's a recipe for disaster and not recommended at all. >>> >>>>> So I have been testing all of this out on a VM running 3 vmdk's and >>>>> using >>>>> LVM to create a single logical volume of the 3 disks. >>>>> I noticed that out of sdb, sdc and sdd, files keep getting written >>>>> to sdc. >>>>> This is probably due to our web app creating a single folder and >>>>> all files >>>>> are written under that folder. >>>>> This is the nature of the Allocation Group of XFS? Is there a way >>>>> to avoid >>>>> this? >>>> Yes. >>>> >>>> 1. Don't put all files in a single directory. >>>> >>>> 2. Use the inode32 allocator on a filesystem greater than 1TB in size. >>>> This will cause inodes to be located in the first 1TB and files to be >>>> allocated round robin across the AGs via rotor stepping. See page 10: >>>> http://oss.sgi.com/projects/xfs/training/xfs_slides_06_allocators.pdf >>> 3: Use a storage layout that is not affected by hotspots due to >>> filesystem locality. >>> >>> That is, build the storage to the scale that you are likely to need >>> in the future. i.e. use all 112 disks (14x 6+2 RAID = 112 disks) to >>> begin with and lay the storage and filesystem out optimally >>> accordingly. I'd build seven 14+2 hardware RAID6 luns (112 disks) >>> and stripe them in RAID0, setting the XFS stripe unit to be the >>> width of a hardware RAID6 lun. That way sequential IO to a single >>> region of the disk still hits every single disk in the array, and >>> hotspots don't occur >>> >>> If you do this, it doesn't matter if you use inode64 or inode32 for >>> a hotspot perspective, only a file fragmentation perspective. This >>> is the way XFs has been used for exactly this sort of storage for >>> the last 15 years.... >>> >>>>> As we will have files keep writing to the same disk thus creating a >>>>> hot spot. >>>>> Although it might not hurt us that much if we fill up a single >>>>> RAID6 to >>>>> 60-70% then adding another RAID6 to the mix. We could go up to a >>>>> total of >>>>> 14 RAID6 sets. >>>> Again, you probably don't want to do this. Too many eggs in one >>>> basket. >>>> >>>> You should investigate using GlusterFS to tie multiple XFS storage >>>> servers together into a single file tree. >>> Another possible solution. You should talk to RedHat (says the >>> RedHat employee ;).... >> I get the impression the "grow as you go" mindset here is probably due >> to budget/cash flow issues, as well as evaluating the system at small >> scale before committing to going larger. Thus I'd guess building the >> 112 drive system up front isn't a real possibility. And this is where >> something like Gluster atop XFS would really come in handy, as it would >> make "grow as you go" much more feasible, while avoiding the 'game over' >> fragmentation issue with simply growing XFS in the manner described by >> the OP. >> >> Emmanuel states Gluster is slow, but that's a very relative statement. >> For clients streaming single large files over GbE or slower links it >> should be plenty fast. Gluster and similar network file systems tend to >> be slow with metadata intensive or transactional workloads. >> >>>> Running an xfs_repair on a single filesystem denies all access, and >>>> with >>>> a 252TB XFS this could take some time. >>> For a filesystem with 1-2TB files, it'll take 30s to run. That's not >>> an issue. >> For some reason I was thinking data size instead of metadata. With only >> a few hundred to low thousand files it would be quick indeed, a non >> issue. >> >>>>> Is LVM a good choice of doing this configuration? Or do you have a >>>>> better >>>>> recommendation? >>>>> The reason we thought LVM would be good was so that we could easily >>>>> grow >>>>> XFS. >>>> Why not do the concatenation within the SAN array controller? >>> Same problem as LVM concatenation. Hot spots. >> I was simply suggesting hardware vs software concatenation here >> unrelated to his current flawed expansion path idea, as his SAN >> controller probably has some nice features and performance here. >> >>>>> Is I was to use the 8-disk RAID6 array with a 256kB stripe size >>>>> will have a >>>>> sunit of 512 and a swidth of (8-2)*512=3072. >>>> So a 256KB strip and a 1.5MB stripe. With RAID6 RMW? I wouldn't >>>> recommend this. >>> Large files, sequential IO, there will be no RMW cycles in the RAID. >>> The write cache of RAID controller will do the aggregation of >>> individual IOs into full stripe writes just fine. >>> >>>> It appears most of your writes will be appends, meaning little >>>> allocation, which means little stripe aligned write out. Here you are >>>> trying to optimize for large IOs which would be fine if you had an all >>>> or mostly allocation workload, but you don't. You have an append heavy >>>> workload. >>>> >>>> Using large strips (stripe units, chunks) with parity RAID, especially >>>> RAID6, will simply murder your append performance due to massive >>>> read-modify-write operations on large strips. >>> No, that's wrong. sequential IO will always fill full stripes in the >>> cache, so RMW cycles simple will not happen. Remember that RMW >>> occurs whenteh cache has to be flushed to the back end disks, not >>> when writes come in to the front end cache.... >>> >>>> With RAID6 with a mostly append workload, you should be using a small >>>> strip size. This has been discussed here at length and the >>>> consensus is >>>> anything over a 32KB strip size doesn't improve performance, but can >>>> hurt performance, especially with parity RAID. Thus you should create >>>> your 6+2 arrays with a 32KB strip and (6*32)=192KB stripe, and create >>>> your XFS with "-d su=32k,sw=6". This should yield significantly better >>>> append performance. >>> That's a tuning for an IOPS intensive workload, not a large scale, >>> large file storage workloads. >>> >>> While sequential writes are an append workload, it's an append >>> workload that the RAID controller is optimised to avoid causing RMW >>> cycles for. As such, the above is bad advice for large files with >>> sequential IO workloads. Large files, large fielsystem, sequential >>> IO is ideal for large RAID6 widths.... >> Yes, of course. WRT XFS you've drilled "allocation=aligned" and "non >> allocation=unaligned" so thoroughly into my head that I failed to >> actually think for a second about what the hardware does with this type >> of large append data stream. I feel a bit silly making this juvenile >> oversight. Won't happen again. ;) >> >>>> External log devices are for systems that modify metadata at rates of >>>> hundreds of IOs per second. So don't specify a log device. >>> Even at hundreds of thousands of IOs per second, external logs don't >>> provide much in way of benefit thanks to delayed logging. The only >>> reason for using an external log these days is a fsync heavy or >>> synchronous write workload. And in most cases a BBWC means even >>> those worklaods don't need an external log... >> Which bloke provided us with this journal magic code again? Can't >> recall his name... ;) >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From arekm@maven.pl Thu Jan 24 03:00:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EF9167F37 for ; Thu, 24 Jan 2013 03:00:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D067AC00B for ; Thu, 24 Jan 2013 01:00:06 -0800 (PST) X-ASG-Debug-ID: 1359018003-04cb6c3915daf90001-NocioJ Received: from mail-ee0-f47.google.com (mail-ee0-f47.google.com [74.125.83.47]) by cuda.sgi.com with ESMTP id zDMqvcMfZWhQaCRH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Jan 2013 01:00:04 -0800 (PST) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 74.125.83.47 Received: by mail-ee0-f47.google.com with SMTP id e52so4418499eek.34 for ; Thu, 24 Jan 2013 01:00:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=x-received:from:to:subject:date:user-agent:references:in-reply-to :mime-version:content-type:content-transfer-encoding:message-id; bh=k+LeYGh9L20m9Ek+H/WMmzJ86I+/L4Fx6MOWHDtPXw4=; b=q84fkf7M1EclFhL1v5l8Tgb64o1euFfkuVDu9zjNgEQJzeq7LQdtuXziaXQFSWkPkN GyBbu3e/OLbYuiy8F3i5Azln/7+hoW5BuBHqDNlvVndnRbUB4dyUmeHpWObZhUbbIJBb mAqIDb8vaxaaS9GIrwDfaPb0uT9Y0DorgrEyE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:subject:date:user-agent:references:in-reply-to :mime-version:content-type:content-transfer-encoding:message-id :x-gm-message-state; bh=k+LeYGh9L20m9Ek+H/WMmzJ86I+/L4Fx6MOWHDtPXw4=; b=V+O2K1pD06EvLA8LG6Fue43R8Gg8RmnQLnYXCMoerVjT6cKbdXU3ZKw87/VpIJUrHo LthNwkUIjFuXErae5H48h4I6ZqFQppid/7m/wW5dTIlBT7onwADOFd4hrq2lN01qQs33 eryG+k4U4KsceUqL8iS78cD8u1nfS+l0Ssoq0INgakAjmnIje8vxm5Fdn/qnwXuV08Up cbTYeQDSxjDxhn6W0eBT9+cv6HhElouRRpp22tTGQfYIRO+ahrISuUEDvEK9CYgakvTo nnpZJ0yK9u1MdEIwP+dVK69IZtdl0eoOe2BNidPF/9XngdZg8KaWw2rmmMfwQxxx0BfG WsBg== X-Received: by 10.14.219.72 with SMTP id l48mr4296166eep.37.1359018003040; Thu, 24 Jan 2013 01:00:03 -0800 (PST) Received: from t400.localnet ([91.234.176.245]) by mx.google.com with ESMTPS id t4sm15318817eel.0.2013.01.24.01.00.01 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 24 Jan 2013 01:00:01 -0800 (PST) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Date: Thu, 24 Jan 2013 09:59:59 +0100 X-ASG-Orig-Subj: Re: Initial mount with inode32 option User-Agent: KMail/1.13.7 (Linux/3.7.4; KDE/4.9.5; x86_64; ; ) References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <20130124001400.GW2498@dastard> In-Reply-To: <20130124001400.GW2498@dastard> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201301240959.59903.arekm@maven.pl> X-Gm-Message-State: ALoCoQnNbqz1pKbjGlTRycKd1SVTSl9/cG/hICy7D+W5tI9/Hfd6DswEyJBs1EJk4rvWid6Ok74b X-Barracuda-Connect: mail-ee0-f47.google.com[74.125.83.47] X-Barracuda-Start-Time: 1359018003 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.2.120753 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 Thursday 24 of January 2013, Dave Chinner wrote: > which, as you can see, mounts as inode32 just fine. Let's make that > a 500g filesystem on the same device: >=20 > $ sudo mkfs.xfs -f -l size=3D131072b,sunit=3D8 -d size=3D500g /dev/vdc > meta-data=3D/dev/vdc isize=3D256 agcount=3D4, agsize=3D3= 2768000 > blks =3D sectsz=3D512 attr=3D2, projid32bit=3D0 d= ata =3D > bsize=3D4096 blocks=3D131072000, imaxpct=3D25 =3D= =20 > sunit=3D0 swidth=3D0 blks > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > log =3Dinternal log bsize=3D4096 blocks=3D131072, versio= n=3D2 > =3D sectsz=3D512 sunit=3D1 blks, lazy-co= unt=3D1 > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents= =3D0 > $ sudo mount -o inode32 /dev/vdc /mnt/scratch > $ grep /mnt/scratch /proc/mounts > /dev/vdc /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 > $ >=20 > It reports inode64 just like it should - inode32 was ignored because > the filesystem is not large enough to create 64 bit inodes, and so > is using the inode64 allocation behaviour. It's been like this for > 15 years... ;) "Will switch" as in when I mount 500GB fs with inode32 option (/proc/mounts= =20 shows inode64 as in above example), then I do grow lvm under and do=20 xfs_growfs. Will it magically start reporting inode32 (and using inode32=20 allocator) then? > Cheers, >=20 > Dave. =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / maven.pl From 01jay.ly@gmail.com Thu Jan 24 03:48:34 2013 Return-Path: <01jay.ly@gmail.com> X-Spam-Checker-Version: SpamAssassin 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,T_TO_NO_BRKTS_FREEMAIL 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 E08527F37 for ; Thu, 24 Jan 2013 03:48:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0B008F8033 for ; Thu, 24 Jan 2013 01:48:31 -0800 (PST) X-ASG-Debug-ID: 1359020906-04cb6c3914dc150001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id ZR903jYaW0gCa7MT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Jan 2013 01:48:27 -0800 (PST) X-Barracuda-Envelope-From: 01jay.ly@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id t11so2733132wey.14 for ; Thu, 24 Jan 2013 01:48:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=7/jF6a5++8OWda+sKPaRN06hpkBL3JD1XfQtCNxjDLg=; b=JYYXl6ws9piVB0l6Jrhgac1U5pdzAmj9ZeMvQ1dyZOCYD37QA/7ixbZmTYdpvWtDyo O66ge44nmcWhLMyc+dHFYdJn+hEf5nOIvp2YSF2NEEXLoemjwlEp4ubi23gzvkB6+d0s hae0vdcewRCYfgat4+UOT/zi5CL+lIKRpBZgxdQE4hg6NXE2s+408L05POr9qZJy0KEE 2ikFkh6Z2mtS6wdsAig3a1EqU9HnZkH/fYvLISePbyp1WdNClLB090y8kdNptbDa9K9K xPv713HBKLDOz96+J9gLoKt2KRCYTRVTY+l1GA/879bCjAn8e7i7VBK26Lr5LzO6uwPO c6kg== MIME-Version: 1.0 X-Received: by 10.194.109.10 with SMTP id ho10mr1790020wjb.16.1359020905948; Thu, 24 Jan 2013 01:48:25 -0800 (PST) Received: by 10.216.16.103 with HTTP; Thu, 24 Jan 2013 01:48:25 -0800 (PST) Date: Thu, 24 Jan 2013 17:48:25 +0800 Message-ID: Subject: Copy file , file blocks is different From: Homer Li <01jay.ly@gmail.com> X-ASG-Orig-Subj: Copy file , file blocks is different To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bf1985a57679404d405b62a X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1359020907 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120757 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 --047d7bf1985a57679404d405b62a Content-Type: text/plain; charset=UTF-8 Hello, There are 2 file in the xfs device, md5 is the same, but the size is different. I don't know why ....... Does anyone could help me? Server1 is EMC Isilon export from NFS (mount point: A, onefs) Server2 is rack server export from NFS (mount point: B, xfs) Login node could access A and B by NFS client, and then "copy /A/xxx/xxx to /B/xxx/xxx", the file size is different. I Switch to Server3 , and use jfs or ext3, it 's ok. mount point: df -h /export/data1/ Filesystem Size Used Avail Use% Mounted on /dev/sdb 17T 13T 4.1T 76% /export/data1 I don't know why their "Blocks" is different. #find /export/data1 -name 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz |xargs stat File: `/export/data1/data/F12FTSCCKF0542-01_ORYknyE/DGESEP00000760/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz' Size: 287928288 Blocks: 562360 IO Block: 4096 regular file Device: 810h/2064d Inode: 145099 Links: 1 Access: (0555/-r-xr-xr-x) Uid: ( 501/ solexa) Gid: ( 501/ solexa) Access: 2013-01-22 14:11:53.742552293 +0800 Modify: 2013-01-15 06:51:21.650490280 +0800 Change: 2013-01-15 06:51:21.926667534 +0800 File: `/export/data1/data/TEST/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz' Size: 287928288 Blocks: 1048576 IO Block: 4096 regular file Device: 810h/2064d Inode: 234501 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ solexa) Gid: ( 501/ solexa) Access: 2013-01-22 15:47:05.078570059 +0800 Modify: 2013-01-22 15:24:27.774527465 +0800 Change: 2013-01-22 15:24:27.774527465 +0800 Here is jfs status, # stat 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz File: `130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz' Size: 287928288 Blocks: 562360 IO Block: 4096 regular file Device: 810h/2064d Inode: 4 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ solexa) Gid: ( 501/ solexa) Access: 2013-01-24 16:01:49.793750980 +0800 Modify: 2013-01-24 16:02:14.766622939 +0800 Change: 2013-01-24 16:02:14.766622939 +0800 md5: find /export/data1 -name 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz |xargs md5sum f570d91ed71b1cbeac6d594766a3055f /export/data1/data/F12FTSCCKF0542-01_ORYknyE/DGESEP00000760/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz f570d91ed71b1cbeac6d594766a3055f /export/data1/data/TEST/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz Here is the xfs config and system info: #xfs_info /export/data1 meta-data=/dev/sdb isize=256 agcount=32, agsize=137260368 blks = sectsz=512 attr=2 data = bsize=4096 blocks=4392331776, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # cat /etc/redhat-release CentOS release 6.3 (Final) uname -r 2.6.32-279.el6.x86_64 # modinfo xfs filename: /lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko license: GPL description: SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled author: Silicon Graphics, Inc. srcversion: 2D92BBDEE6D42920ECC78EB depends: exportfs vermagic: 2.6.32-279.el6.x86_64 SMP mod_unload modversions -- Best Regards Homer Li --047d7bf1985a57679404d405b62a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hello,

    =C2=A0=C2=A0=C2=A0=C2=A0 There are 2 file in the xfs device,= =C2=A0 md5 is the same,=C2=A0 but the size is different.=C2=A0
    =C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 I don't know why .......
    =C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 Does anyone could help me?


    =C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 Server1 is EMC Isilon export from NFS (mount point: A, onefs)
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Server2 is rack server export from NFS (moun= t point: B, xfs)
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Login node could access = A and B by NFS client, and then=C2=A0 "copy /A/xxx/xxx to /B/xxx/xxx&q= uot;,=C2=A0 the file size is different.
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = I Switch to Server3 , and use jfs or ext3,=C2=A0 it 's ok.

    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mount point:
    df -h /export/data1/ Filesystem=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 Size=C2=A0 Used Avail Use% Mounted on
    /dev/sdb=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 17T=C2=A0=C2=A0 13T=C2=A0 4.1T=C2=A0 76% /export/d= ata1


    I don't know why their "Blocks" is different.=

    #find /export/data1 -name 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz |xargs stat
    =C2=A0 File: `/export/data1/data/F12FTSCCKF0542-01_ORYknyE/DGESEP00000760/130111_I262_FC= D1F5KACXX_L8_ORYknyECRAASE-41/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1= .fq.gz'
    =C2=A0 Size: 287928288 =C2=A0=C2=A0=C2=A0 Blocks: 562360=C2=A0=C2=A0=C2=A0=C2=A0 IO Block: 4096=C2=A0=C2=A0 regular file
    Device: 810h/2064d=C2=A0=C2=A0=C2=A0 Inode: 145099=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 Links: 1
    Access: (0555/-r-xr-xr-x)=C2=A0 Uid: (=C2=A0 501/=C2=A0 solexa)=C2=A0= =C2=A0 Gid: (=C2=A0 501/=C2=A0 solexa)
    Access: 2013-01-22 14:11:53.742552293 +0800
    Modify: 2013-01-15 06:51:21.650490280 +0800
    Change: 2013-01-15 06:51:21.926667534 +0800
    =C2=A0 File: `/export/data1/data/TEST/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.g= z'
    =C2=A0 Size: 287928288 =C2=A0=C2=A0=C2=A0 Blocks: 1048576=C2=A0=C2=A0=C2=A0 IO Block: 4096=C2=A0=C2=A0 regular file
    Device: 810h/2064d=C2=A0=C2=A0=C2=A0 Inode: 234501=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 Links: 1
    Access: (0644/-rw-r--r--)=C2=A0 Uid: (=C2=A0 501/=C2=A0 solexa)=C2=A0= =C2=A0 Gid: (=C2=A0 501/=C2=A0 solexa)
    Access: 2013-01-22 15:47:05.078570059 +0800
    Modify: 2013-01-22 15:24:27.774527465 +0800
    Change: 2013-01-22 15:24:27.774527465 +0800


    Here is jfs st= atus,
    # stat 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz
    = =C2=A0 File: `130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz'
    = =C2=A0 Size: 287928288 =C2=A0=C2=A0=C2=A0 Blocks: 562360=C2=A0=C2=A0=C2=A0= =C2=A0 IO Block: 4096=C2=A0=C2=A0 regular file
    Device: 810h/2064d=C2=A0=C2=A0=C2=A0 Inode: 4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Links: 1
    Access: (0644/-rw-r--r--)=C2=A0 = Uid: (=C2=A0 501/=C2=A0 solexa)=C2=A0=C2=A0 Gid: (=C2=A0 501/=C2=A0 solexa)=
    Access: 2013-01-24 16:01:49.793750980 +0800
    Modify: 2013-01-24 16:02= :14.766622939 +0800
    Change: 2013-01-24 16:02:14.766622939 +0800



    md5:
    find /ex= port/data1 -name 130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz |xargs md5sum
    f570d91ed71b1cbeac6d594766a3055f=C2=A0 /export/data1/data/F12FTSCCKF0542-01_ORYknyE/DGESEP00000760/130111_I262_FCD= 1F5KACXX_L8_ORYknyECRAASE-41/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.= fq.gz
    f570d91ed71b1cbeac6d594766a3055f=C2=A0 /export/data1/data/TEST/130111_I262_FCD1F5KACXX_L8_ORYknyECRAASE-41_1.fq.gz=


    Here is the xfs config and system info:

    #xfs_info /expor= t/data1
    meta-data=3D/dev/sdb=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 isize=3D256=C2=A0=C2=A0=C2=A0 agcount= =3D32, agsize=3D137260368 blks
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D=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=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sectsz=3D512=C2=A0=C2=A0 attr=3D= 2
    data=C2=A0=C2=A0=C2=A0=C2=A0 =3D=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=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 bsize=3D4096=C2=A0=C2=A0 blocks=3D4392331776, imaxpct=3D5
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D=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=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sunit=3D0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 swidth=3D0 blks
    naming=C2=A0=C2=A0 =3Dversion 2=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 bsize=3D4096=C2=A0=C2=A0 ascii-c= i=3D0
    log=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3Dinternal=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 bsize=3D4096= =C2=A0=C2=A0 blocks=3D521728, version=3D2
    =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D=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=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sectsz=3D512=C2=A0=C2=A0 sunit= =3D0 blks, lazy-count=3D1
    realtime =3Dnone=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=C2=A0=C2=A0=C2=A0=C2=A0 extsz=3D4096=C2= =A0=C2=A0 blocks=3D0, rtextents=3D0


    # cat /etc/redhat-release
    CentOS release 6.3 (Final)

    uname -r
    2.6.32-279.el6.x86_64

    # modinfo xfs
    filename:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko
    license:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GPL
    description:=C2=A0=C2=A0=C2=A0 SGI XFS with ACLs, security attributes= , large block/inode numbers, no debug enabled
    author:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Silicon Graph= ics, Inc.
    srcversion:=C2=A0=C2=A0=C2=A0=C2=A0 2D92BBDEE6D42920ECC78EB
    depends:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exportfs
    vermagic:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2.6.32-279.el6.x86_64 S= MP mod_unload modversions



    --
    Best Regards<= br>Homer Li --047d7bf1985a57679404d405b62a-- From david@fromorbit.com Thu Jan 24 04:39:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8811F7F37 for ; Thu, 24 Jan 2013 04:39:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5BD278F8035 for ; Thu, 24 Jan 2013 02:39:40 -0800 (PST) X-ASG-Debug-ID: 1359023978-04bdf0231be18f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id r7HhyJMw4UPdbieq for ; Thu, 24 Jan 2013 02:39:38 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AscXAPgOAVF3DFkE/2dsb2JhbABEhVxpsWyFCASBChZzgh4BAQUjDwFGEAgDDQsCAgUhAgIPBSghE4gZqwGSaBWBDowSgjMyYQOWC4YOA4o4gww Received: from unknown (HELO dastard) ([119.12.89.4]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Jan 2013 21:09:36 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TyKDV-0001KV-LS; Thu, 24 Jan 2013 21:39:33 +1100 Date: Thu, 24 Jan 2013 21:39:33 +1100 From: Dave Chinner To: Arkadiusz =?utf-8?Q?Mi=C5=9Bkiewicz?= Cc: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130124103933.GB2667@dastard> X-ASG-Orig-Subj: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <20130124001400.GW2498@dastard> <201301240959.59903.arekm@maven.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <201301240959.59903.arekm@maven.pl> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1359023978 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.2.120759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 24, 2013 at 09:59:59AM +0100, Arkadiusz Miśkiewicz wrote: > On Thursday 24 of January 2013, Dave Chinner wrote: > > > which, as you can see, mounts as inode32 just fine. Let's make that > > a 500g filesystem on the same device: > > > > $ sudo mkfs.xfs -f -l size=131072b,sunit=8 -d size=500g /dev/vdc > > meta-data=/dev/vdc isize=256 agcount=4, agsize=32768000 > > blks = sectsz=512 attr=2, projid32bit=0 data = > > bsize=4096 blocks=131072000, imaxpct=25 = > > sunit=0 swidth=0 blks > > naming =version 2 bsize=4096 ascii-ci=0 > > log =internal log bsize=4096 blocks=131072, version=2 > > = sectsz=512 sunit=1 blks, lazy-count=1 > > realtime =none extsz=4096 blocks=0, rtextents=0 > > $ sudo mount -o inode32 /dev/vdc /mnt/scratch > > $ grep /mnt/scratch /proc/mounts > > /dev/vdc /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 > > $ > > > > It reports inode64 just like it should - inode32 was ignored because > > the filesystem is not large enough to create 64 bit inodes, and so > > is using the inode64 allocation behaviour. It's been like this for > > 15 years... ;) > > "Will switch" as in when I mount 500GB fs with inode32 option (/proc/mounts > shows inode64 as in above example), then I do grow lvm under and do > xfs_growfs. Will it magically start reporting inode32 (and using inode32 > allocator) then? It is supposed to - there was one flag in the struct xfs_mount m_flags field for the mount option and another for the actual use of the if the size of the filesystem warranted it. And growing the filesystem is supposed to honour the mount option flag when the inode size boundary is crossed. I don't know if that was tested when the latest set of changes went in. I just had a quick look and I suspect it is now broken given that the xfs_set_inode64() function clears both flags.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 24 04:43:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4D0627F4E for ; Thu, 24 Jan 2013 04:43:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E1B6304032 for ; Thu, 24 Jan 2013 02:43:28 -0800 (PST) X-ASG-Debug-ID: 1359024206-04bdf0231ae1a00001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aRkw5YyU0s6PvAUS for ; Thu, 24 Jan 2013 02:43:26 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsAXAPgOAVF3DFkE/2dsb2JhbABEhVyyVYUIBIEKFnOCHgEBBTo/EAgDDQEKCSUPBSghE4gZvWkVjSCCZWEDlguGDgOKOIMM Received: from unknown (HELO dastard) ([119.12.89.4]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Jan 2013 21:13:25 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TyKGh-0001Kj-7p; Thu, 24 Jan 2013 21:42:51 +1100 Date: Thu, 24 Jan 2013 21:42:45 +1100 From: Dave Chinner To: Homer Li <01jay.ly@gmail.com> Cc: xfs@oss.sgi.com Subject: Re: Copy file , file blocks is different Message-ID: <20130124104245.GC2667@dastard> X-ASG-Orig-Subj: Re: Copy file , file blocks is different References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1359024206 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.2.120759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 24, 2013 at 05:48:25PM +0800, Homer Li wrote: > Hello, > > There are 2 file in the xfs device, md5 is the same, but the size is > different. > I don't know why ....... Speculative preallocation. Google "XFS NFS speculative preallocation" - I've explained it plenty of times on this list and don't need to do it again. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Thu Jan 24 05:09:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 789E77F37 for ; Thu, 24 Jan 2013 05:09:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66673304048 for ; Thu, 24 Jan 2013 03:09:31 -0800 (PST) X-ASG-Debug-ID: 1359025770-04cbb00c64d48c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id CQOecCZtWXdAkVKl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:09:30 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OB9TSd000795 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:09:29 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OB9SqI002222 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:09:29 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OB9SFx002106 for ; Thu, 24 Jan 2013 05:09:28 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:09:28 -0800 Message-ID: <5101165E.1090305@oracle.com> Date: Thu, 24 Jan 2013 19:09:18 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 00/13] xfs: kill hard-coded number 128 for transaction space log reservation Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 00/13] xfs: kill hard-coded number 128 for transaction space log reservation 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: 1359025770 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, Now the v3 patch set of killing hard-coded number 128 for transaction space log reservation is ready for review. For testing, according to Dave's comment, I verified the default/patched kernel by comparing the total bytes per transaction as well as the pair values in MAX() against the different combinations of block /log/inode/sector sizes, and they all show the same results to me. Changes of v3 to v2: - Fix itruncate, ifree, link, attrrm, remove, create to show correct results. - Add XFS_SB_LOG_RES() for those transactions that modify the super block on disk. Old patch sets: v2: http://www.spinics.net/lists/xfs/msg15917.html v1: http://www.spinics.net/lists/xfs/msg15499.html Thanks, -Jeff From jeff.liu@oracle.com Thu Jan 24 05:09:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 06EB87F4F for ; Thu, 24 Jan 2013 05:09:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89C4EAC00D for ; Thu, 24 Jan 2013 03:09:54 -0800 (PST) X-ASG-Debug-ID: 1359025790-04bdf0231be25f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EUCGNC5NW5SdIkLd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:09:50 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OB9nLm001005 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:09:50 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OB9nss004858 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:09:49 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OB9neO002287 for ; Thu, 24 Jan 2013 05:09:49 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:09:48 -0800 Message-ID: <51011678.4050701@oracle.com> Date: Thu, 24 Jan 2013 19:09:44 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 01/13] xfs: add a helper to figure out the space log reservation per item Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 01/13] xfs: add a helper to figure out the space log reservation per item 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: 1359025790 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add a new helper xfs_calc_buf_res() to calculate out the transaction space reservations per item. xfs_buf_log_overhead() is used to figure out the extra space for struct xfs_buf_log_format that gets written into the log for every buffer as well as a log opheader, i.e. struct xlog_op_header. Signed-off-by: Jie Liu --- fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06ed520..6c601ea 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -37,14 +37,45 @@ #include "xfs_extent_busy.h" #include "xfs_bmap.h" #include "xfs_quota.h" +#include "xfs_qm.h" #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_log_priv.h" +#include "xfs_buf_item.h" #include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer. Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ + return round_up(sizeof(struct xlog_op_header) + + sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction. size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( + uint nbufs, + uint size) +{ + return nbufs * (size + xfs_buf_log_overhead()); +} /* * Various log reservation values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:10:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3DCE17F4F for ; Thu, 24 Jan 2013 05:10:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FB34AC00B for ; Thu, 24 Jan 2013 03:10:14 -0800 (PST) X-ASG-Debug-ID: 1359025812-04cb6c3913dde60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kFEAlr78n29mvlad (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:10:13 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBACQd001402 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:10:12 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBABtn003254 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:10:12 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBABFZ002531 for ; Thu, 24 Jan 2013 05:10:11 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:10:10 -0800 Message-ID: <5101168E.7080801@oracle.com> Date: Thu, 24 Jan 2013 19:10:06 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c 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: 1359025812 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. Signed-off-by: Jie Liu --- fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- 1 file changed, 111 insertions(+), 127 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 6c601ea..448db93 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -116,18 +116,15 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 2))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 0)))); } /* @@ -179,14 +176,12 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((4 * mp->m_sb.sb_inodesize + - 2 * XFS_DIROP_LOG_RES(mp) + - 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - 3 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 3) + - 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -206,15 +201,12 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -234,15 +226,12 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -264,18 +253,18 @@ xfs_calc_symlink_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 1024 + - 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, 1024)), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -298,18 +287,19 @@ xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -337,16 +327,16 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, 0) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -374,9 +364,9 @@ STATIC uint xfs_calc_growdata_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize * 3 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -393,12 +383,12 @@ STATIC uint xfs_calc_growrtalloc_reservation( struct xfs_mount *mp) { - return 2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - mp->m_sb.sb_inodesize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -410,7 +400,7 @@ STATIC uint xfs_calc_growrtzero_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_blocksize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); } /* @@ -427,11 +417,10 @@ STATIC uint xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_inodesize + - mp->m_sb.sb_blocksize + - mp->m_rsumsize + - 128 * 5; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); } /* @@ -442,7 +431,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -452,7 +441,7 @@ xfs_calc_swrite_reservation( STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -468,13 +457,13 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize * 2 + - mp->m_dirblksize + - XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -492,14 +481,12 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -517,10 +504,9 @@ xfs_calc_attrset_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - 128 * (2 + XFS_DA_NODE_MAXDEPTH); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); } /* @@ -539,16 +525,14 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_DA_NODE_MAXDEPTH + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -558,7 +542,7 @@ STATIC uint xfs_calc_clear_agi_bucket_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } /* -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:11:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0F3457F4C for ; Thu, 24 Jan 2013 05:11:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77148AC00F for ; Thu, 24 Jan 2013 03:11:05 -0800 (PST) X-ASG-Debug-ID: 1359025863-04cb6c3913ddec0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id OIgGzPMyAOCl3DNH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:11:03 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBB2ca005081 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:11:03 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBB2aP010539 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:11:02 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBB1wA003206 for ; Thu, 24 Jan 2013 05:11:01 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:11:01 -0800 Message-ID: <510116C3.503@oracle.com> Date: Thu, 24 Jan 2013 19:10:59 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 04/12] xfs: calculate xfs_qm_write_sb_changes() space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 04/12] xfs: calculate xfs_qm_write_sb_changes() space log reservation at mount time 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: 1359025863 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For the transaction that write the incore superblock changes of quota flags to disk, it would reserve the same log space to clear/reset quota flags transaction, so we can use XFS_TRANS_SBCHANGE_LOG_RES() for it as well. Signed-off-by: Jie Liu --- fs/xfs/xfs_qm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 2e86fa0..5745189 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1582,10 +1582,9 @@ xfs_qm_write_sb_changes( int error; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - if ((error = xfs_trans_reserve(tp, 0, - mp->m_sb.sb_sectsize + 128, 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return error; } -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:11:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4DF317F4C for ; Thu, 24 Jan 2013 05:11:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFB4EAC00B for ; Thu, 24 Jan 2013 03:11:28 -0800 (PST) X-ASG-Debug-ID: 1359025887-04cbb00c64d49d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id GbyAN5qipDgpcU9Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:11:27 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBBQqF005521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:11:27 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBBPX0010995 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:11:26 GMT Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBBP4A008440 for ; Thu, 24 Jan 2013 05:11:25 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:11:25 -0800 Message-ID: <510116D9.7000609@oracle.com> Date: Thu, 24 Jan 2013 19:11:21 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 05/14] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 05/14] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time 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: 1359025887 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For adjusting quota limits transactions, we calculate out the log space reservation at runtime, this patch does it at mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9e3a03b..cebcb7f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -41,6 +41,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ + uint tr_qm_setqlim; /* adjust quota limits */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..9b25992 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -489,8 +489,9 @@ xfs_qm_scall_setqlim( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_disk_dquot_t) + 128, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 1477a75..b825f9e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -557,6 +557,17 @@ xfs_calc_qm_sbchange_reservation( } /* + * Adjusting quota limits. + * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -588,6 +599,7 @@ xfs_trans_init( resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); + resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 4eb1140..8f0645a 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -263,6 +263,7 @@ struct xfs_log_item_desc { #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) +#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:11:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E6F8B7F4C for ; Thu, 24 Jan 2013 05:11:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72B4BAC005 for ; Thu, 24 Jan 2013 03:11:52 -0800 (PST) X-ASG-Debug-ID: 1359025910-04cbb00c65d4a10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id JKBbKrrhD9c9inNC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:11:51 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBBoEi003003 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:11:50 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBBnmw009170 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:11:50 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBBnRs008677 for ; Thu, 24 Jan 2013 05:11:49 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:11:49 -0800 Message-ID: <510116EB.1050902@oracle.com> Date: Thu, 24 Jan 2013 19:11:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 06/13] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 06/13] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time 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: 1359025911 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The disk quota allocation log space reservation is calcuated at runtime. This patch does it at mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_dquot.c | 12 +++--------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 15 +++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index bf27fcc..96d9aae 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -524,15 +524,9 @@ xfs_qm_dqread( if (flags & XFS_QMOPT_DQALLOC) { tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC); error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp), - XFS_WRITE_LOG_RES(mp) + - /* - * Round the chunklen up to the next multiple - * of 128 (buf log item chunk size)). - */ - BBTOB(mp->m_quotainfo->qi_dqchunklen) - 1 + 128, - 0, - XFS_TRANS_PERM_LOG_RES, - XFS_WRITE_LOG_COUNT); + XFS_QM_DQALLOC_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, + XFS_WRITE_LOG_COUNT); if (error) goto error1; cancelflags = XFS_TRANS_RELEASE_LOG_RES; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index cebcb7f..a52f34c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -42,6 +42,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ + uint tr_qm_dqalloc; /* allocate quota on disk */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index b825f9e..95c41dd 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -568,6 +568,20 @@ xfs_calc_qm_setqlim_reservation( } /* + * Allocating quota on disk if needed. + * the write transaction log space: XFS_WRITE_LOG_RES(mp) + * the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( + struct xfs_mount *mp) +{ + return XFS_WRITE_LOG_RES(mp) + + xfs_calc_buf_res(1, + XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -600,6 +614,7 @@ xfs_trans_init( resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); + resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 8f0645a..3ab1fe6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -264,6 +264,7 @@ struct xfs_log_item_desc { #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) +#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:11:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7EF4A7F54 for ; Thu, 24 Jan 2013 05:11:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3EA738F8033 for ; Thu, 24 Jan 2013 03:11:55 -0800 (PST) X-ASG-Debug-ID: 1359025913-04bdf0231ae26d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2H2oeQlBE1V8TWMw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:11:53 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBBqBh003037 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:11:53 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBBpRo011785 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:11:52 GMT Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBBpZh003699 for ; Thu, 24 Jan 2013 05:11:51 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:11:51 -0800 Message-ID: <510116B2.40609@oracle.com> Date: Thu, 24 Jan 2013 19:10:42 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 03/13] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 03/13] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time 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: 1359025913 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The transaction log space for clearing/reseting the quota flags is calculated out at runtime, this patch does it at mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b2bd3a0..b39fa96 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1056,8 +1056,8 @@ xfs_mount_reset_sbqflags( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); xfs_alert(mp, "%s: Superblock update failed!", __func__); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..9e3a03b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -40,6 +40,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtalloc; /* grow realtime allocations */ uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ + uint tr_qm_sbchange; /* change quota flags */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 448db93..1477a75 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -546,6 +546,17 @@ xfs_calc_clear_agi_bucket_reservation( } /* + * Clearing the quotaflags in the superblock. + * the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -576,6 +587,7 @@ xfs_trans_init( resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); + resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index db05654..4eb1140 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -262,7 +262,7 @@ struct xfs_log_item_desc { (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) - +#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:12:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9746D7F4C for ; Thu, 24 Jan 2013 05:12:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5654B8F8033 for ; Thu, 24 Jan 2013 03:12:03 -0800 (PST) X-ASG-Debug-ID: 1359025921-04bdf0231be26e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4BEY2OcGtA1iPuUE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:12:01 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBC0V6006021 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:12:01 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBC07G009445 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:12:00 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBC0OY008755 for ; Thu, 24 Jan 2013 05:12:00 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:12:00 -0800 Message-ID: <510116FB.9070601@oracle.com> Date: Thu, 24 Jan 2013 19:11:55 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 07/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 07/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time 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: 1359025921 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of quota off transaction log space reservation from runtime to mount time Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 10 +++------- fs/xfs/xfs_trans.c | 14 ++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a52f34c..66b5449 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -43,6 +43,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 9b25992..e4204be 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -671,14 +671,10 @@ xfs_qm_log_quotaoff( uint oldsbqflag=0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); - if ((error = xfs_trans_reserve(tp, 0, - sizeof(xfs_qoff_logitem_t) * 2 + - mp->m_sb.sb_sectsize + 128, - 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) goto error0; - } qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); xfs_trans_log_quotaoff_item(tp, qoffi); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 95c41dd..480d48e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -582,6 +582,19 @@ xfs_calc_qm_dqalloc_reservation( } /* + * Turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + * the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2 + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -615,6 +628,7 @@ xfs_trans_init( resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3ab1fe6..747e7d8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -265,6 +265,7 @@ struct xfs_log_item_desc { #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:12:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B014E7F4C for ; Thu, 24 Jan 2013 05:12:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F295AC005 for ; Thu, 24 Jan 2013 03:12:37 -0800 (PST) X-ASG-Debug-ID: 1359025956-04cb6c3915ddf70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LlC1LiQ89oErWJqO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:12:36 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBCZQU003819 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:12:36 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBCYjS012971 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:12:35 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBCYXx010437 for ; Thu, 24 Jan 2013 05:12:34 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:12:25 -0800 USER-AGENT: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 Message-ID: <51011715.6080500@oracle.com> Date: Thu, 24 Jan 2013 03:12:21 -0800 (PST) From: Jeff Liu To: xfs@oss.sgi.com Subject: [PATCH v3 08/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 08/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time 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: 1359025956 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation for end of quotaoff log space reservation from runtime to mount time. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 66b5449..c5abd86 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -44,6 +44,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ + uint tr_qm_equotaoff;/* end of turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index e4204be..2b25980 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -638,8 +638,9 @@ xfs_qm_log_quotaoff_end( tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_qoff_logitem_t) * 2, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_END_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 480d48e..129692b 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -595,6 +595,17 @@ xfs_calc_qm_quotaoff_reservation( } /* + * End of turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -629,6 +640,7 @@ xfs_trans_init( resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); + resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 747e7d8..77ccc36 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -266,6 +266,7 @@ struct xfs_log_item_desc { #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:12:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4C8C87F51 for ; Thu, 24 Jan 2013 05:12:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0D58AC005 for ; Thu, 24 Jan 2013 03:12:43 -0800 (PST) X-ASG-Debug-ID: 1359025961-04cb6c3915ddf90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id yPaFkToJ20mNm9kh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:12:42 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBCeP1006832 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:12:41 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBCeA0007218 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:12:40 GMT Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBCeae004204 for ; Thu, 24 Jan 2013 05:12:40 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:12:40 -0800 Message-ID: <51011721.60103@oracle.com> Date: Thu, 24 Jan 2013 19:12:33 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 09/13] xfs: introduce XFS_SB_LOG_RES() for transactions that modify sb on disk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 09/13] xfs: introduce XFS_SB_LOG_RES() for transactions that modify sb on disk 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: 1359025962 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Introduce a new transaction space reservation XFS_SB_LOG_RES() for those transactions that need to modify the superblock on disk. Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 3 files changed, 14 insertions(+) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index c5abd86..b9b7dbc 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -45,6 +45,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ uint tr_qm_equotaoff;/* end of turn quota off */ + uint tr_sb; /* modify superblock */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 129692b..2f221b8 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -606,6 +606,17 @@ xfs_calc_qm_quotaoff_end_reservation( } /* + * Syncing the incore super block changes to disk. + * the super block to reflect the changes: sector size + */ +STATIC uint +xfs_calc_sb_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -641,6 +652,7 @@ xfs_trans_init( resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); + resp->tr_sb = xfs_calc_sb_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 77ccc36..a150074 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -267,6 +267,7 @@ struct xfs_log_item_desc { #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) #define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) +#define XFS_SB_LOG_RES(mp) ((mp)->m_reservations.tr_sb) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:12:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1327C7F53 for ; Thu, 24 Jan 2013 05:12:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02EE18F8035 for ; Thu, 24 Jan 2013 03:12:44 -0800 (PST) X-ASG-Debug-ID: 1359025963-04cbb00c66d4a90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KxR28awEDI9p5A76 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:12:44 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBCgka006866 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:12:43 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBCg6C007263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:12:42 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBCgiU010501 for ; Thu, 24 Jan 2013 05:12:42 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:12:42 -0800 Message-ID: <51011727.2020009@oracle.com> Date: Thu, 24 Jan 2013 19:12:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 10/13] xfs: make use of XFS_SB_LOG_RES() at xfs_log_sbcount() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 10/13] xfs: make use of XFS_SB_LOG_RES() at xfs_log_sbcount() 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: 1359025964 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_log_sbcount(). Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b39fa96..8ba4adf 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1550,8 +1550,8 @@ xfs_log_sbcount(xfs_mount_t *mp) return 0; tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:12:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 788DF7F51 for ; Thu, 24 Jan 2013 05:12:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05551AC005 for ; Thu, 24 Jan 2013 03:12:55 -0800 (PST) X-ASG-Debug-ID: 1359025974-04cbb00c63d4aa0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id J3aMDFuzJOIEzVBP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:12:54 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBCrXq004102 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:12:54 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBCrn3007661 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:12:53 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBCr5H010594 for ; Thu, 24 Jan 2013 05:12:53 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:12:53 -0800 Message-ID: <51011731.9050202@oracle.com> Date: Thu, 24 Jan 2013 19:12:49 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 11/13] xfs: make use of XFS_SB_LOG_RES() at xfs_mount_log_sb() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 11/13] xfs: make use of XFS_SB_LOG_RES() at xfs_mount_log_sb() 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: 1359025974 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_mount_log_sb(). Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8ba4adf..ae8e8d8 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1912,8 +1912,8 @@ xfs_mount_log_sb( XFS_SB_VERSIONNUM)); tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:13:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C57C87F61 for ; Thu, 24 Jan 2013 05:13:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9472F304053 for ; Thu, 24 Jan 2013 03:13:09 -0800 (PST) X-ASG-Debug-ID: 1359025988-04bdf0231de2780001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id k1LwOH4sOn2pnkC9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:13:08 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBD74Z004478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:13:08 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBD7ij010973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:13:07 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBD6Rn009377 for ; Thu, 24 Jan 2013 05:13:07 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:13:06 -0800 Message-ID: <5101173E.2080306@oracle.com> Date: Thu, 24 Jan 2013 19:13:02 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 12/13] xfs: make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 12/13] xfs: make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() 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: 1359025988 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() Signed-off-by: Jie Liu --- fs/xfs/xfs_fsops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 4beaede..69393e8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -662,8 +662,8 @@ xfs_fs_log_dummy( int error; tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Thu Jan 24 05:13:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2706D7F6A for ; Thu, 24 Jan 2013 05:13:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF963AC005 for ; Thu, 24 Jan 2013 03:13:15 -0800 (PST) X-ASG-Debug-ID: 1359025994-04bdf0231be2790001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id fKIOleYl7edL2NLE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 03:13:14 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OBDDWo007541 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 24 Jan 2013 11:13:14 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OBDC7f013815 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 11:13:13 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OBDC2Q010824 for ; Thu, 24 Jan 2013 05:13:12 -0600 Received: from [192.168.1.102] (/123.119.98.222) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 03:13:12 -0800 Message-ID: <51011743.4060805@oracle.com> Date: Thu, 24 Jan 2013 19:13:07 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v3 13/13] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3 13/13] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET 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: 1359025994 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.2.120761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently, we calculate the attribute set transaction log space reservation at runtime in two parts: 1) XFS_ATTRSET_LOG_RES() which is calculated out at mount time. 2) ((ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))) which is calculated out at runtime since it depend on the extent length in blocks. This patch change the XFS_ATTRSET_LOG_RES(mp) to XFS_ATTRSETM_LOG_RES(mp) that it is still figured out at mount time, and introduce a new XFS_ATTRSETRT_LOG_RES(mp) which would be used to calculate out the unit of the log space reservation for one block. Then we can get the runtime spaces via: XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * ext, so that we don't need to export the xfs_calc_buf_res() function. Signed-off-by: Jie Liu --- fs/xfs/xfs_attr.c | 9 ++++++--- fs/xfs/xfs_mount.h | 3 ++- fs/xfs/xfs_trans.c | 28 ++++++++++++++++++++++++---- fs/xfs/xfs_trans.h | 11 ++++------- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 0ca1f0b..20d114e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -300,9 +300,12 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(args.trans, args.total, - XFS_ATTRSET_LOG_RES(mp, args.total), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) { + error = xfs_trans_reserve(args.trans, args.total, + XFS_ATTRSETM_LOG_RES(mp) + + XFS_ATTRSETRT_LOG_RES(mp) * args.total, + 0, XFS_TRANS_PERM_LOG_RES, + XFS_ATTRSET_LOG_COUNT); + if (error) { xfs_trans_cancel(args.trans, 0); return(error); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b9b7dbc..b715c93 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -34,7 +34,8 @@ typedef struct xfs_trans_reservations { uint tr_addafork; /* cvt inode to attributed trans */ uint tr_writeid; /* write setuid/setgid file */ uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrset; /* set/create an attribute */ + uint tr_attrsetm; /* set/create an attribute at mount time */ + uint tr_attrsetrt; /* set/create an attribute at runtime */ uint tr_attrrm; /* remove an attribute */ uint tr_clearagi; /* clear bad agi unlinked ino bucket */ uint tr_growrtalloc; /* grow realtime allocations */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 2f221b8..62cc6c8 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -490,17 +490,18 @@ xfs_calc_attrinval_reservation( } /* - * Setting an attribute. + * Setting an attribute at mount time. * the inode getting the attribute * the superblock for allocations * the agfs extents are allocated from * the attribute btree * max depth * the inode allocation btree * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below). */ STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + @@ -510,6 +511,24 @@ xfs_calc_attrset_reservation( } /* + * Setting an attribute at runtime, transaction space unit per block. + * the superblock for allocations: sector size + * the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1)); +} + +/* * Removing an attribute. * the inode: inode size * the attribute btree could join: max depth * block size @@ -641,7 +660,8 @@ xfs_trans_init( resp->tr_writeid = xfs_calc_writeid_reservation(mp); resp->tr_addafork = xfs_calc_addafork_reservation(mp); resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrset = xfs_calc_attrset_reservation(mp); + resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index a150074..e99c7e8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -252,15 +252,12 @@ struct xfs_log_item_desc { * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSET_LOG_RES(mp, ext) \ - ((mp)->m_reservations.tr_attrset + \ - (ext * (mp)->m_sb.sb_sectsize) + \ - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) -- 1.7.9.5 From ryan.campbell@gmail.com Thu Jan 24 09:38:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,T_TO_NO_BRKTS_FREEMAIL 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 6A2BB7F37 for ; Thu, 24 Jan 2013 09:38:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 584408F8049 for ; Thu, 24 Jan 2013 07:38:29 -0800 (PST) X-ASG-Debug-ID: 1359041907-04cbb00c66ddff0001-NocioJ Received: from mail-ee0-f53.google.com (mail-ee0-f53.google.com [74.125.83.53]) by cuda.sgi.com with ESMTP id fiSn4FSZz4B39SHs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Jan 2013 07:38:27 -0800 (PST) X-Barracuda-Envelope-From: ryan.campbell@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.53 Received: by mail-ee0-f53.google.com with SMTP id e53so4570918eek.26 for ; Thu, 24 Jan 2013 07:38:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=jKox6fuAYW8QJI7c0fI+5+rIqToErCZaJeYtr57JfZ0=; b=f61OCuoE+CwJwVhOClciR20UIX7JqaSLzSnhPy1SxeWleZlt19gztCTI9M2QUq0h/s jJx0htJqhGC+6qoRgzbnQGIY39g4g1W/27z+Ii6URw5SZbLaU6aQuEWlW6s88hMD5FXa shR6JAtJ/a9PGqCDXb/UceVt9fUbinJ+SAKx22O/Cr6ni5mgxl4qVjcxzdeUpVyebUsO 927KjEp2vR79deFefjZ7Qh+HyluOJA7UGb2yHvp94EAcaZNvdyD1PXGtGgMso+XC6wDc qsGeZCbgnMmgEZVgimDPGAWT0h0z7GAoLU805iDKmvd6Vp3A8oJclmPEaZ7jdeXAPIJk ikmg== MIME-Version: 1.0 X-Received: by 10.14.214.67 with SMTP id b43mr7276433eep.33.1359041906755; Thu, 24 Jan 2013 07:38:26 -0800 (PST) Received: by 10.14.142.5 with HTTP; Thu, 24 Jan 2013 07:38:26 -0800 (PST) Date: Thu, 24 Jan 2013 09:38:26 -0600 Message-ID: Subject: XFS Freezing occasionally hangs From: Ryan Campbell X-ASG-Orig-Subj: XFS Freezing occasionally hangs To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=e89a8f3babd71649e604d40a9ae6 X-Barracuda-Connect: mail-ee0-f53.google.com[74.125.83.53] X-Barracuda-Start-Time: 1359041907 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120779 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 --e89a8f3babd71649e604d40a9ae6 Content-Type: text/plain; charset=ISO-8859-1 We use XFS on EC2 EBS running on Arch Linux (kernel 3.6.7-1-ARCH). Before we take an EC2 snapshot, we call xfs_freeze on the mount so that we can have a consistent snapshot. On instances running for around 30 days, we see the XFS freeze hang, resulting in a skyrocketing load (but not CPU). We can't kill the xfs_freeze process. The only route available is usually to force a reboot of the server without cleaning unmounting. There are backtraces in dmesg complaining both of hung xfs processes, and hung java processes. https://gist.github.com/3d46830eac52df44d30f Is this a known issue? We call xfs_freeze quite often on thousands of XFS volumes, so I wouldn't be surprised if we have encountered an edge case considering how often we do this. Any help appreciated. I'm recampbell on #xfs/freenode. Thanks, Ryan --e89a8f3babd71649e604d40a9ae6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    We use XFS on EC2 EBS running on Arch Linux (kernel 3.6.7-= 1-ARCH). Before we take an EC2 snapshot, we call xfs_freeze on the mount so= that we can have a consistent snapshot.

    On instan= ces running for around 30 days, we see the XFS freeze hang, resulting in a = skyrocketing load (but not CPU). We can't kill the xfs_freeze process. = The only route available is usually to force a reboot of the server without= cleaning unmounting.

    There are backtraces in dmesg complaining b= oth of hung xfs processes, and hung java processes.=A0https://gist.github.com/3d46830eac52df4= 4d30f

    Is this a known issue? We call xfs_freeze q= uite often on thousands of XFS volumes, so I wouldn't be surprised if w= e have encountered an edge case considering how often we do this.

    Any help appreciated. I'm recampbell on= #xfs/freenode.

    Thanks,
    Ryan
    --e89a8f3babd71649e604d40a9ae6-- From harry@uw.edu Thu Jan 24 10:27:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 41CE87F37 for ; Thu, 24 Jan 2013 10:27:42 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FDBE8F8064 for ; Thu, 24 Jan 2013 08:27:38 -0800 (PST) X-ASG-Debug-ID: 1359044854-04bdf0231beea00001-NocioJ Received: from mail-pa0-f53.google.com (mail-pa0-f53.google.com [209.85.220.53]) by cuda.sgi.com with ESMTP id cM4OajWgLczpZpoI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Jan 2013 08:27:34 -0800 (PST) X-Barracuda-Envelope-From: harry@uw.edu X-Barracuda-Apparent-Source-IP: 209.85.220.53 Received: by mail-pa0-f53.google.com with SMTP id hz1so5588468pad.12 for ; Thu, 24 Jan 2013 08:27:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=uQcLxoY3j083fyrEe0FpUGFxy62teIVQFcbirlY55/s=; b=N7lRdymZPJItjHOgsak+qbR08htIBa14ecZDx1uRJC8GNY0u6dTu20q4PXUMsYBk9K iaPK6HCwsGp6HhNchpUNPiPHXtlwge8ipRUIBAlhLEjjw2QDsm+VfmkBWyBtJMAS4w6Y txwXBOut24oxsR5mulHEUfV/QO63GeBaXxShNu+227K4SBKTKkj1RyTnk77lI8GAQASd 98LJzxCxT8qrwufYmtBXT0pCOixT/us93wTDAEcadLJM/8UzdQ8Vvl/KYn9Ig4P9is1T tbLiDIMswp2tum4Q2S+kNCjF3gUxpaccrG0q+jORosq3ZBwKADKho4WJSpizA26/la1g M0XA== X-Received: by 10.66.81.231 with SMTP id d7mr6063099pay.27.1359044854124; Thu, 24 Jan 2013 08:27:34 -0800 (PST) Received: from [128.95.176.96] (moist.atmos.washington.edu. [128.95.176.96]) by mx.google.com with ESMTPS id l8sm15971149pax.9.2013.01.24.08.27.32 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 24 Jan 2013 08:27:33 -0800 (PST) Message-ID: <510160F4.5050101@uw.edu> Date: Thu, 24 Jan 2013 08:27:32 -0800 From: Harry Edmon User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> X-ASG-Orig-Subj: Re: Initial mount with inode32 option In-Reply-To: <20130123232244.GZ27055@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQlZ2ownbbA2VN79C0t8rTGhI4SdTlxCoDIka7btSTDBfE4qV0Wf6dyvK3sy/RFCqxada2EM X-Barracuda-Connect: mail-pa0-f53.google.com[209.85.220.53] X-Barracuda-Start-Time: 1359044854 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I see that some of the discussion on the mailing list has to do with smaller disk partition. I would like this option for big partisions (i.e. 2 TB and greater) so I can have the option to continue compatibility with Networker as I could with older Linux kernels. On 01/23/13 15:22, Ben Myers wrote: > Hi Harry, > > On Wed, Jan 23, 2013 at 03:07:42PM -0800, Harry Edmon wrote: >> It appears that "mount -o inode32 /dev/sda1 /mnt" ignores the >> inode32 option and mounts with inode64. After the partition is >> mounted I can do "mount -o remount,inode32 /mnt" and it remounts >> with inode32. But shouldn't there be a way to do the initial mount >> with inode32? I am running Linux 3.7.3 on an amd architecture. I >> would like this option since I am using EMC Networker for backups >> (yes, I know about the complaints). Thanks. > # mount -o inode32 /dev/sdb1 /mnt/scratch > # grep /dev/sdb1 /proc/mounts > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode64,noquota 0 0 > # mount -o remount,inode32 /mnt/scratch > # grep /dev/sdb1 /proc/mounts > /dev/sdb1 /mnt/scratch xfs rw,relatime,attr2,inode32,noquota 0 0 > > We'll get this fixed. > > -Ben -- Dr. Harry Edmon harry@uw.edu, 206-543-0547, FAX: 206-543-0308 Director of IT, College of the Environment and Director of Computing, Dept of Atmospheric Sciences University of Washington, Box 351640, Seattle, WA 98195-1640 From bpm@sgi.com Thu Jan 24 12:03:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 0A6C67F37 for ; Thu, 24 Jan 2013 12:03:25 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id D15FD8F8037; Thu, 24 Jan 2013 10:03:21 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3EA444266DC; Thu, 24 Jan 2013 12:03:21 -0600 (CST) Date: Thu, 24 Jan 2013 12:03:21 -0600 From: Ben Myers To: Homer Li <01jay.ly@gmail.com> Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: Copy file , file blocks is different Message-ID: <20130124180321.GA27055@sgi.com> References: <20130124104245.GC2667@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130124104245.GC2667@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Homer, On Thu, Jan 24, 2013 at 09:42:45PM +1100, Dave Chinner wrote: > On Thu, Jan 24, 2013 at 05:48:25PM +0800, Homer Li wrote: > > Hello, > > > > There are 2 file in the xfs device, md5 is the same, but the size is > > different. > > I don't know why ....... > > Speculative preallocation. Google "XFS NFS speculative > preallocation" Here's another recent thread where this has been discussed. http://oss.sgi.com/archives/xfs/2013-01/msg00044.html It is a frequent question on the list, so I think we'll be adding it to the XFS FAQ soon. ;) http://xfs.org/index.php/XFS_FAQ Regards, Ben From tinguely@sgi.com Thu Jan 24 12:42:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 94D837F37 for ; Thu, 24 Jan 2013 12:42:49 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5005B8F804B; Thu, 24 Jan 2013 10:42:49 -0800 (PST) Message-ID: <510180AB.1060207@sgi.com> Date: Thu, 24 Jan 2013 12:42:51 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 01/13] xfs: add a helper to figure out the space log reservation per item References: <51011678.4050701@oracle.com> In-Reply-To: <51011678.4050701@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:09, Jeff Liu wrote: > Add a new helper xfs_calc_buf_res() to calculate out the transaction space > reservations per item. xfs_buf_log_overhead() is used to figure out the > extra space for struct xfs_buf_log_format that gets written into the log > for every buffer as well as a log opheader, i.e. struct xlog_op_header. > > > Signed-off-by: Jie Liu > --- Looks good. Reviewed-by: Mark Tinguely From bpm@sgi.com Thu Jan 24 12:55:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 561777F37 for ; Thu, 24 Jan 2013 12:55:16 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFEBEAC00F; Thu, 24 Jan 2013 10:55:15 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 70E664266DC; Thu, 24 Jan 2013 12:55:15 -0600 (CST) Date: Thu, 24 Jan 2013 12:55:15 -0600 From: Ben Myers To: Harry Edmon Cc: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130124185515.GB27055@sgi.com> References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <510160F4.5050101@uw.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <510160F4.5050101@uw.edu> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Harry, On Thu, Jan 24, 2013 at 08:27:32AM -0800, Harry Edmon wrote: > I see that some of the discussion on the mailing list has to do with > smaller disk partition. Dave showed that filesystems which are too small to create 64 bit inodes will report still report an inode allocation policy of inode64 even when inode32 is specified in the mount options. This doesn't mean that 64 bit inodes will be created. > I would like this option for big partisions > (i.e. 2 TB and greater) Lets try a 2TB filesystem: ## create a sparse file by writing a byte at 2 terabyte offset # xfs_io -c "pwrite 2t 1" -f 2t wrote 1/1 bytes at offset 2199023255552 ## make a filesystem in that sparse file # mkfs.xfs 2t meta-data=2t isize=256 agcount=4, agsize=134217728 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=536870912, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=262144, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 ## mount it up with the loop device # mount -o loop,inode32 2t /mnt2 # grep /mnt2 /proc/mounts /dev/loop0 /mnt2 xfs rw,relatime,attr2,inode32,noquota 0 0 ^^^^^^^ It looks like it works as expected on a 2tb filesystem. We specified the inode32 mount option and it reports an inode allocation policy of inode32 on a filesystem that is big enough to create 64 bit inodes. In this situation no 64 bit inodes will be created. > so I can have the option to continue > compatibility with Networker as I could with older Linux kernels. Based upon Dave's comments and the above I think you're in good shape. Looks like I prematurely jumped to the conclusion that we have a problem. Have you run into a compatability issue that you can describe? Thanks, Ben From david@fromorbit.com Thu Jan 24 13:39:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 92AB47F37 for ; Thu, 24 Jan 2013 13:39:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F4D48F804B for ; Thu, 24 Jan 2013 11:39:08 -0800 (PST) X-ASG-Debug-ID: 1359056345-04cb6c3914f43b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CXG3MnX72NEzwHuG for ; Thu, 24 Jan 2013 11:39:06 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkIYAOaMAVF3DFkE/2dsb2JhbABEuDOFCASBCxZzgh4BAQU6NAsQCAMNAQoJJQ8FKCETiBm+JxWNIIJlYQOWC4YOA4o4gww Received: from unknown (HELO dastard) ([119.12.89.4]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2013 06:09:03 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TySdX-0002Un-TW; Fri, 25 Jan 2013 06:38:59 +1100 Date: Fri, 25 Jan 2013 06:38:59 +1100 From: Dave Chinner To: Ben Myers Cc: Harry Edmon , xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option Message-ID: <20130124193859.GE2667@dastard> X-ASG-Orig-Subj: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <510160F4.5050101@uw.edu> <20130124185515.GB27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130124185515.GB27055@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1359056346 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.2.120795 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 24, 2013 at 12:55:15PM -0600, Ben Myers wrote: > Hi Harry, > > On Thu, Jan 24, 2013 at 08:27:32AM -0800, Harry Edmon wrote: > > I see that some of the discussion on the mailing list has to do with > > smaller disk partition. > > Dave showed that filesystems which are too small to create 64 bit inodes will > report still report an inode allocation policy of inode64 even when inode32 is > specified in the mount options. This doesn't mean that 64 bit inodes will be > created. > > > I would like this option for big partisions > > (i.e. 2 TB and greater) > > Lets try a 2TB filesystem: Keep in mind that it is the size of the inodes that determines the offset at which inode32 becomes active due to the encoding that is used to index the inode location. For the default 256 byte inodes, it's 1TB, for 512 byte inodes it is 2TB, 1k inodes is 4TB and 2k inodes it is 8TB.... > ## create a sparse file by writing a byte at 2 terabyte offset > # xfs_io -c "pwrite 2t 1" -f 2t > wrote 1/1 bytes at offset 2199023255552 > > ## make a filesystem in that sparse file > # mkfs.xfs 2t # mkfs.xfs -i size=512 2t meta-data=2t isize=512 agcount=4, agsize=134217728 blks = sectsz=512 attr=2, projid32bit=0 = crc=0 data = bsize=4096 blocks=536870912, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=262144, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount -o loop,inode32 2t /mnt/scr # grep scr /proc/mounts /dev/loop0 /mnt/scr xfs rw,relatime,attr2,inode64,noquota 0 0 ^^^^^^^ Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Thu Jan 24 15:39:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 71D5A7F37 for ; Thu, 24 Jan 2013 15:39:36 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F71F304048; Thu, 24 Jan 2013 13:39:33 -0800 (PST) Message-ID: <5101AA17.7090706@sgi.com> Date: Thu, 24 Jan 2013 15:39:35 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <5101168E.7080801@oracle.com> In-Reply-To: <5101168E.7080801@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:10, Jeff Liu wrote: > Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- > 1 file changed, 111 insertions(+), 127 deletions(-) > > /* > @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - MAX((mp->m_sb.sb_inodesize + > - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + > - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), > - (4 * mp->m_sb.sb_sectsize + > - 4 * mp->m_sb.sb_sectsize + > - mp->m_sb.sb_sectsize + > - XFS_ALLOCFREE_LOG_RES(mp, 4) + > - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + > - 128 * 5 + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, > + XFS_FSB_TO_B(mp, 1))), > + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(5, 0) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + mp->m_in_maxlevels, > + XFS_FSB_TO_B(mp, 0)))); ^^^^ I see the (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevel) headers in the original code, but I still don't see data. I ran the counts for the args of MAX() command and I get a different result: ARG1 ARG2 25728 218752 before 25728 255616 after - second arg is too big as I expected. Some of the other counts don't match for me either. --Mark. From tinguely@sgi.com Thu Jan 24 15:41:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 2B18F7F37 for ; Thu, 24 Jan 2013 15:41:02 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id E1A7B304048; Thu, 24 Jan 2013 13:41:01 -0800 (PST) Message-ID: <5101AA6F.5070600@sgi.com> Date: Thu, 24 Jan 2013 15:41:03 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 03/13] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time References: <510116B2.40609@oracle.com> In-Reply-To: <510116B2.40609@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:10, Jeff Liu wrote: > The transaction log space for clearing/reseting the quota flags is calculated out > at runtime, this patch does it at mount time. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.c | 4 ++-- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_trans.c | 12 ++++++++++++ > fs/xfs/xfs_trans.h | 2 +- > 4 files changed, 16 insertions(+), 3 deletions(-) Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:42:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 736727F37 for ; Thu, 24 Jan 2013 15:42:28 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E503304053; Thu, 24 Jan 2013 13:42:28 -0800 (PST) Message-ID: <5101AAC6.1010403@sgi.com> Date: Thu, 24 Jan 2013 15:42:30 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/12] xfs: calculate xfs_qm_write_sb_changes() space log reservation at mount time References: <510116C3.503@oracle.com> In-Reply-To: <510116C3.503@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:10, Jeff Liu wrote: > For the transaction that write the incore superblock changes of quota > flags to disk, it would reserve the same log space to clear/reset quota > flags transaction, so we can use XFS_TRANS_SBCHANGE_LOG_RES() for it as well. > > > Signed-off-by: Jie Liu > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:43:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 ADE017F37 for ; Thu, 24 Jan 2013 15:43:41 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BA76304048; Thu, 24 Jan 2013 13:43:41 -0800 (PST) Message-ID: <5101AB0F.9000003@sgi.com> Date: Thu, 24 Jan 2013 15:43:43 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 05/14] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time References: <510116D9.7000609@oracle.com> In-Reply-To: <510116D9.7000609@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:11, Jeff Liu wrote: > For adjusting quota limits transactions, we calculate out the log space reservation > at runtime, this patch does it at mount time. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_qm_syscalls.c | 5 +++-- > fs/xfs/xfs_trans.c | 12 ++++++++++++ > fs/xfs/xfs_trans.h | 1 + > 4 files changed, 17 insertions(+), 2 deletions(-) Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:44:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 2399E7F37 for ; Thu, 24 Jan 2013 15:44:42 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4D15304048; Thu, 24 Jan 2013 13:44:41 -0800 (PST) Message-ID: <5101AB4B.9040504@sgi.com> Date: Thu, 24 Jan 2013 15:44:43 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 06/13] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time References: <510116EB.1050902@oracle.com> In-Reply-To: <510116EB.1050902@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:11, Jeff Liu wrote: > The disk quota allocation log space reservation is calcuated at runtime. > This patch does it at mount time. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_dquot.c | 12 +++--------- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_trans.c | 15 +++++++++++++++ > fs/xfs/xfs_trans.h | 1 + > 4 files changed, 20 insertions(+), 9 deletions(-) Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:45:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 A03657F37 for ; Thu, 24 Jan 2013 15:45:57 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F590304048; Thu, 24 Jan 2013 13:45:57 -0800 (PST) Message-ID: <5101AB97.4040208@sgi.com> Date: Thu, 24 Jan 2013 15:45:59 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 07/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time References: <510116FB.9070601@oracle.com> In-Reply-To: <510116FB.9070601@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:11, Jeff Liu wrote: > Convert the calculation of quota off transaction log space reservation > from runtime to mount time > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_qm_syscalls.c | 10 +++------- > fs/xfs/xfs_trans.c | 14 ++++++++++++++ > fs/xfs/xfs_trans.h | 1 + > 4 files changed, 19 insertions(+), 7 deletions(-) > Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:48:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 578E17F37 for ; Thu, 24 Jan 2013 15:48:00 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13AF7304064; Thu, 24 Jan 2013 13:48:00 -0800 (PST) Message-ID: <5101AC12.2010907@sgi.com> Date: Thu, 24 Jan 2013 15:48:02 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 08/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time References: <51011715.6080500@oracle.com> In-Reply-To: <51011715.6080500@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:12, Jeff Liu wrote: > Convert the calculation for end of quotaoff log space reservation from runtime to mount time. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_qm_syscalls.c | 5 +++-- > fs/xfs/xfs_trans.c | 12 ++++++++++++ > fs/xfs/xfs_trans.h | 1 + > 4 files changed, 17 insertions(+), 2 deletions(-) > Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:49:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 055D27F37 for ; Thu, 24 Jan 2013 15:49:01 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id C72AB304032; Thu, 24 Jan 2013 13:49:00 -0800 (PST) Message-ID: <5101AC4E.50307@sgi.com> Date: Thu, 24 Jan 2013 15:49:02 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 09/13] xfs: introduce XFS_SB_LOG_RES() for transactions that modify sb on disk References: <51011721.60103@oracle.com> In-Reply-To: <51011721.60103@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:12, Jeff Liu wrote: > Introduce a new transaction space reservation XFS_SB_LOG_RES() for > those transactions that need to modify the superblock on disk. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_trans.c | 12 ++++++++++++ > fs/xfs/xfs_trans.h | 1 + > 3 files changed, 14 insertions(+) Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:49:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 0FF9F7F37 for ; Thu, 24 Jan 2013 15:49:37 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE126304043; Thu, 24 Jan 2013 13:49:36 -0800 (PST) Message-ID: <5101AC72.9090104@sgi.com> Date: Thu, 24 Jan 2013 15:49:38 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 10/13] xfs: make use of XFS_SB_LOG_RES() at xfs_log_sbcount() References: <51011727.2020009@oracle.com> In-Reply-To: <51011727.2020009@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:12, Jeff Liu wrote: > Make use of XFS_SB_LOG_RES() at xfs_log_sbcount(). > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > return error; Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:50:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 80D567F37 for ; Thu, 24 Jan 2013 15:50:05 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A46B304048; Thu, 24 Jan 2013 13:50:05 -0800 (PST) Message-ID: <5101AC8F.8040103@sgi.com> Date: Thu, 24 Jan 2013 15:50:07 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 11/13] xfs: make use of XFS_SB_LOG_RES() at xfs_mount_log_sb() References: <51011731.9050202@oracle.com> In-Reply-To: <51011731.9050202@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:12, Jeff Liu wrote: > Make use of XFS_SB_LOG_RES() at xfs_mount_log_sb(). > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_mount.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:50:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 950087F37 for ; Thu, 24 Jan 2013 15:50:31 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2217304048; Thu, 24 Jan 2013 13:50:30 -0800 (PST) Message-ID: <5101ACA8.5040706@sgi.com> Date: Thu, 24 Jan 2013 15:50:32 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 12/13] xfs: make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() References: <5101173E.2080306@oracle.com> In-Reply-To: <5101173E.2080306@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:13, Jeff Liu wrote: > Make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_fsops.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Jan 24 15:58:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 55E927F37 for ; Thu, 24 Jan 2013 15:58:55 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8FE2A304032; Thu, 24 Jan 2013 13:58:54 -0800 (PST) Message-ID: <5101AE9F.3010700@sgi.com> Date: Thu, 24 Jan 2013 15:58:55 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/13] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET References: <51011743.4060805@oracle.com> In-Reply-To: <51011743.4060805@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/24/13 05:13, Jeff Liu wrote: > Currently, we calculate the attribute set transaction log space reservation at runtime in > two parts: > 1) XFS_ATTRSET_LOG_RES() which is calculated out at mount time. > > 2) ((ext * (mp)->m_sb.sb_sectsize) + \ > (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ > (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))) > which is calculated out at runtime since it depend on the extent length in blocks. > > This patch change the XFS_ATTRSET_LOG_RES(mp) to XFS_ATTRSETM_LOG_RES(mp) that it is still > figured out at mount time, and introduce a new XFS_ATTRSETRT_LOG_RES(mp) which would be used > to calculate out the unit of the log space reservation for one block. Then we can get the > runtime spaces via: XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * ext, so that > we don't need to export the xfs_calc_buf_res() function. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_attr.c | 9 ++++++--- > fs/xfs/xfs_mount.h | 3 ++- > fs/xfs/xfs_trans.c | 28 ++++++++++++++++++++++++---- > fs/xfs/xfs_trans.h | 11 ++++------- > 4 files changed, 36 insertions(+), 15 deletions(-) > Looks good. Reviewed-by: Mark Tinguely From harry@uw.edu Thu Jan 24 16:05:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 03DDA7F37 for ; Thu, 24 Jan 2013 16:05:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4DBA304032 for ; Thu, 24 Jan 2013 14:05:36 -0800 (PST) X-ASG-Debug-ID: 1359065135-04cb6c3913fa3d0001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id dLHuslEPaRyWoUd6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Jan 2013 14:05:35 -0800 (PST) X-Barracuda-Envelope-From: harry@uw.edu X-Barracuda-Apparent-Source-IP: 209.85.220.46 Received: by mail-pa0-f46.google.com with SMTP id kp14so4393874pab.33 for ; Thu, 24 Jan 2013 14:05:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=Zc7XptQfP76gOhx7PCNo3K2gPfcRQhubJtFtmF9RHC8=; b=iTS4vMm42noS/CW3Ccg9hqYDHecb0rpnoYVp0JzCqVnRRf33rKXPVxqfpjO+RTgWz/ IhlHqo/iFbNguzrzag+SpatLhuzKGc5BT+uPCeV45HsPQNguneATEyTxt47677ENrg5L tgi+tcSIcqh8wZDGRuXNv9FfXL3X4Xl5vrBxBEdnQEUGehs+00aDtNizHAib+VjWjN75 sDb91tSHgBA2ANd2LSgKPolSBlBd5m6hIhPAZ4GpuzCy8un2mT2TpDAwx9A8Md7KmxDm oH6bX/5UmUsSXGngP2u+7cZ3b+8vxpBFhFtnbWdthetKfo8xbis3sIQihWb8u9jUZkpN 3QPQ== X-Received: by 10.66.89.132 with SMTP id bo4mr8330850pab.62.1359065135096; Thu, 24 Jan 2013 14:05:35 -0800 (PST) Received: from [128.95.176.96] (moist.atmos.washington.edu. [128.95.176.96]) by mx.google.com with ESMTPS id v2sm16397406paz.36.2013.01.24.14.05.33 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 24 Jan 2013 14:05:34 -0800 (PST) Message-ID: <5101B02D.9060301@uw.edu> Date: Thu, 24 Jan 2013 14:05:33 -0800 From: Harry Edmon User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: Initial mount with inode32 option References: <51006D3E.6080704@uw.edu> <20130123232244.GZ27055@sgi.com> <510160F4.5050101@uw.edu> <20130124185515.GB27055@sgi.com> X-ASG-Orig-Subj: Re: Initial mount with inode32 option In-Reply-To: <20130124185515.GB27055@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQlt8OkiuqQPDnJ++JV4I99E8EBnWlvwaGmpGGDW+oqf1LxqtuJ46b1runx2jCsU+Ken9Xg1 X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1359065135 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.2.120805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/24/13 10:55, Ben Myers wrote: > Hi Harry, > > On Thu, Jan 24, 2013 at 08:27:32AM -0800, Harry Edmon wrote: >> I see that some of the discussion on the mailing list has to do with >> smaller disk partition. > Dave showed that filesystems which are too small to create 64 bit inodes will > report still report an inode allocation policy of inode64 even when inode32 is > specified in the mount options. This doesn't mean that 64 bit inodes will be > created. > >> I would like this option for big partisions >> (i.e. 2 TB and greater) > Lets try a 2TB filesystem: > > ## create a sparse file by writing a byte at 2 terabyte offset > # xfs_io -c "pwrite 2t 1" -f 2t > wrote 1/1 bytes at offset 2199023255552 > > ## make a filesystem in that sparse file > # mkfs.xfs 2t > meta-data=2t isize=256 agcount=4, agsize=134217728 blks > = sectsz=512 attr=2, projid32bit=0 > data = bsize=4096 blocks=536870912, imaxpct=5 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal log bsize=4096 blocks=262144, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > ## mount it up with the loop device > # mount -o loop,inode32 2t /mnt2 > > # grep /mnt2 /proc/mounts > /dev/loop0 /mnt2 xfs rw,relatime,attr2,inode32,noquota 0 0 > ^^^^^^^ > > It looks like it works as expected on a 2tb filesystem. We specified the > inode32 mount option and it reports an inode allocation policy of inode32 on a > filesystem that is big enough to create 64 bit inodes. In this situation no 64 > bit inodes will be created. > >> so I can have the option to continue >> compatibility with Networker as I could with older Linux kernels. > Based upon Dave's comments and the above I think you're in good shape. Looks > like I prematurely jumped to the conclusion that we have a problem. > > Have you run into a compatability issue that you can describe? > > Thanks, > Ben Yes, I verified that on a 2TB disk the inode32 mount option works as I expect. Thanks for your help. -- Dr. Harry Edmon harry@uw.edu, 206-543-0547, FAX: 206-543-0308 Director of IT, College of the Environment and Director of Computing, Dept of Atmospheric Sciences University of Washington, Box 351640, Seattle, WA 98195-1640 From eflorac@intellique.com Thu Jan 24 16:16:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EF7947F37 for ; Thu, 24 Jan 2013 16:16:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7980304043 for ; Thu, 24 Jan 2013 14:16:11 -0800 (PST) X-ASG-Debug-ID: 1359065768-04cbb00c63f1140001-NocioJ Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id plqWWR5QqssdXOEu for ; Thu, 24 Jan 2013 14:16:09 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.3 Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 0EFAAA623B; Thu, 24 Jan 2013 23:16:03 +0100 (CET) Date: Thu, 24 Jan 2013 23:15:46 +0100 From: Emmanuel Florac To: stan@hardwarefreak.com Cc: Alvin Ong , xfs@oss.sgi.com Subject: Re: Need advice on building a new XFS setup for large files Message-ID: <20130124231546.71017c49@galadriel.home> X-ASG-Orig-Subj: Re: Need advice on building a new XFS setup for large files In-Reply-To: <5100B72C.9050706@hardwarefreak.com> References: <50FE8AEA.7020300@hardwarefreak.com> <20130122220511.GN2498@dastard> <50FFD911.3@hardwarefreak.com> <50FFFD1E.6070500@medinacomtech.com> <5100B72C.9050706@hardwarefreak.com> 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: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1359065768 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.2.120805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Wed, 23 Jan 2013 22:23:08 -0600 vous =C3=A9criviez: > I'm not familiar enough with sparse files to comment on fragmentation > patterns. Others may have some answers/recommendations for you here. I've built servers that are used exactly in the described way. Fragmentation on iSCSI-exported sparse files is, as expected, absolutely horrific. However in virtual web servers environments the expected throughput is low enough to be of little importance in that particular case. If the OP expects higher performance, he will be on quite a tough ride I'm afraid. =20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From elamaran.e@ktr.srmuniv.ac.in Thu Jan 24 19:08:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=TVD_SPACE_RATIO 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 CCF4C7F37 for ; Thu, 24 Jan 2013 19:08:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBAAF8F804B for ; Thu, 24 Jan 2013 17:08:32 -0800 (PST) X-ASG-Debug-ID: 1359076108-04cbb00c63f7230001-NocioJ Received: from mail.tcsion.com (115.112.50.106.static-mumbai.vsnl.net.in [115.112.50.106]) by cuda.sgi.com with ESMTP id rX7rL9VhFTK4XMgN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jan 2013 17:08:30 -0800 (PST) X-Barracuda-Envelope-From: elamaran.e@ktr.srmuniv.ac.in X-Barracuda-Apparent-Source-IP: 115.112.50.106 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.tcsion.com (Postfix) with ESMTP id 040575AF4D0F; Fri, 25 Jan 2013 04:23:30 +0530 (IST) X-Virus-Scanned: amavisd-new at mail.tcsion.com Received: from mail.tcsion.com ([127.0.0.1]) by localhost (mail.tcsion.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ypydh9PkCRVU; Fri, 25 Jan 2013 04:23:29 +0530 (IST) Received: from [115.242.30.245] (unknown [115.242.30.245]) (Authenticated sender: elamaran.e@ktr.srmuniv.ac.in) by mail.tcsion.com (Postfix) with ESMTPSA id 827875AF45A1; Fri, 25 Jan 2013 04:23:07 +0530 (IST) Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: verify To: Recipients X-ASG-Orig-Subj: verify From: elamaran.e@ktr.srmuniv.ac.in Date: Fri, 25 Jan 2013 04:22:58 +0530 Message-Id: <20130124225307.827875AF45A1@mail.tcsion.com> X-Barracuda-Connect: 115.112.50.106.static-mumbai.vsnl.net.in[115.112.50.106] X-Barracuda-Start-Time: 1359076109 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.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA609_NRN, BSF_SC0_SA_TO_FROM_ADDR_MATCH, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120817 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.10 BSF_SC0_SA609_NRN Custom Rule SA609_NRN click here https://docs.google.com/spreadsheet/viewform?formkey=3DdDdMcmphY= Ux2RlF4M3ZrYlRVSUhibXc6MQ From jeff.liu@oracle.com Fri Jan 25 00:20:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3391B7F37 for ; Fri, 25 Jan 2013 00:20:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D452CAC00B for ; Thu, 24 Jan 2013 22:20:03 -0800 (PST) X-ASG-Debug-ID: 1359094802-04bdf0231a112d80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id XNXnZJOq9pXv4XA0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 24 Jan 2013 22:20:02 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0P6K0aR028895 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Jan 2013 06:20:01 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0P6JxI1016900 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 25 Jan 2013 06:20:00 GMT Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0P6JxNE014240; Fri, 25 Jan 2013 00:19:59 -0600 Received: from [10.62.23.131] (/182.92.247.2) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 22:19:59 -0800 Message-ID: <51022401.2040703@oracle.com> Date: Fri, 25 Jan 2013 14:19:45 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <5101168E.7080801@oracle.com> <5101AA17.7090706@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c In-Reply-To: <5101AA17.7090706@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1359094802 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.2.120839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/25/2013 05:39 AM, Mark Tinguely wrote: > On 01/24/13 05:10, Jeff Liu wrote: >> Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. >> >> Signed-off-by: Jie Liu >> --- >> fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- >> 1 file changed, 111 insertions(+), 127 deletions(-) >> >> /* >> @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( >> struct xfs_mount *mp) >> { >> return XFS_DQUOT_LOGRES(mp) + >> - MAX((mp->m_sb.sb_inodesize + >> - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + >> - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), >> - (4 * mp->m_sb.sb_sectsize + >> - 4 * mp->m_sb.sb_sectsize + >> - mp->m_sb.sb_sectsize + >> - XFS_ALLOCFREE_LOG_RES(mp, 4) + >> - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + >> - 128 * 5 + >> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); >> + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >> + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, >> + XFS_FSB_TO_B(mp, 1))), >> + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), >> + XFS_FSB_TO_B(mp, 1)) + >> + xfs_calc_buf_res(5, 0) + >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >> + XFS_FSB_TO_B(mp, 1)) + >> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >> + mp->m_in_maxlevels, >> + XFS_FSB_TO_B(mp, 0)))); > ^^^^ > I see the (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevel) > headers in the original code, but I still don't see data. XFS_FSB_TO_B(mp, 0) == 0, so it only calculates the headers out without the data part. But maybe it's better to replace XFS_FSB_TO_B(mp, 0) with 0 directly. > > I ran the counts for the args of MAX() command and I get a different > result: > > ARG1 ARG2 > 25728 218752 before > 25728 255616 after - second arg is too big as I expected. Strange, there is no 255616 for ARG2 at my old test logs, what's your block/log/inode/sector combination? I have tried the following combinations on yesterday: -b size=512 -n size=4096 xfs_calc_itruncate_reservation_MAX(): left=6144 right=81792 -b size=4096 -n size=4096: xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 -b size=4096 -n size=4096 -i size=2048 xfs_calc_itruncate_reservation_MAX(): left=27520 right=222336 -b size=4096 -n size=65536 -s size=4096 xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 -b size=4096 -n size=4096 -s size=512 xfs_calc_itruncate_reservation_MAX(): left=25728 right=218752 -b size=4096 -n size=65536 -i size=2048 -s size=512 xfs_calc_itruncate_reservation_MAX(): left=27520 right=222336 -b size=4096 -n size=4096 -s size=4096 xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 -b size=4096 -n size=65536 xfs_calc_itruncate_reservation_MAX(): left=25728 right=218752 Thanks, -Jeff > > > Some of the other counts don't match for me either. > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From helpdezk@metu.edu.tr Fri Jan 25 05:45:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-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 6147C7F37 for ; Fri, 25 Jan 2013 05:45:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4394B8F8033 for ; Fri, 25 Jan 2013 03:45:33 -0800 (PST) X-ASG-Debug-ID: 1359114329-04bdf0231b11b090001-w1Z2WR Received: from mail.mail.taisaw.com (mail.taisaw.com [59.120.71.116]) by cuda.sgi.com with ESMTP id mfQc1VYXnW5Cwejo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Jan 2013 03:45:30 -0800 (PST) X-Barracuda-Envelope-From: helpdezk@metu.edu.tr X-Barracuda-Apparent-Source-IP: 59.120.71.116 Authenticated-By: egberthuang Received: from mail.taisaw.com (localhost [127.0.0.1]) (authenticated bits=0) by mail.mail.taisaw.com (8.14.5/8.14.5) with ESMTP id r0PBeOei032464; Fri, 25 Jan 2013 19:40:25 +0800 Received: from 87-98-184-104.kimsufi.com ([87.98.184.104]) by mail.taisaw.com with HTTP (HTTP/1.1 POST); Fri, 25 Jan 2013 19:40:24 +0800 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_eaf62f6c632261bb5db40c704ac73abf" Date: Fri, 25 Jan 2013 19:40:24 +0800 From: System Administrator To: undisclosed-recipients:; Subject: =?UTF-8?Q?=C3=96NEML=C4=B0=3A=20sevgili=20e-posta=20hesab=C4=B1?==?UTF-8?Q?=20kullan=C4=B1c=C4=B1?= Message-ID: <11bd7ebcf357186a56c73c070c032847@mail.taisaw.com> X-ASG-Orig-Subj: =?UTF-8?Q?=C3=96NEML=C4=B0=3A=20sevgili=20e-posta=20hesab=C4=B1?==?UTF-8?Q?=20kullan=C4=B1c=C4=B1?= User-Agent: BOX Solutions Web Mail 2.0/rc 20120925 X-Barracuda-Connect: mail.taisaw.com[59.120.71.116] X-Barracuda-Start-Time: 1359114330 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.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_SC0_SA074b, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA074b Custom Rule SA074b --=_eaf62f6c632261bb5db40c704ac73abf Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Varsayılan yönetici tarafından ayarlanan posta kutunuzun depolama sınırını aştı, şu anda azaldığını ve posta kutunuza yeniden onaylayana kadar yeni posta göndermek veya almak mümkün olmayabilir. Için posta kutunuzu TIKLAYINIZ [1] yeniden doğrulamak: teşekkürler Sistem Yöneticisi Links: ------ [1] http://www.veralcantrottweilers.com/maintenance/ --=_eaf62f6c632261bb5db40c704ac73abf Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

    Varsay=C4=B1lan yönetici taraf=C4=B1ndan ayarlanan posta k= utunuzun depolama s=C4=B1n=C4=B1r=C4=B1n=C4=B1 a=C5=9Ft=C4=B1, =C5=9Fu anda azald=C4=B1=C4=9F=C4=B1n= =C4=B1 ve posta kutun= uza yeniden onaylayan= a kadar yeni posta g&= ouml;ndermek veya almak mümkün = olmayabilir. I&= ccedil;in posta kutunuzu TIKLAYINIZ= yeniden do=C4=9F= rulamak:

    te=C5=9Fekk&uum= l;rler
    Sistem Yöneticisi
    =

    --=_eaf62f6c632261bb5db40c704ac73abf-- From tinguely@sgi.com Fri Jan 25 08:31:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 741AC7F37 for ; Fri, 25 Jan 2013 08:31:33 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 373D38F8035; Fri, 25 Jan 2013 06:31:30 -0800 (PST) Message-ID: <51029744.1020200@sgi.com> Date: Fri, 25 Jan 2013 08:31:32 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <5101168E.7080801@oracle.com> <5101AA17.7090706@sgi.com> <51022401.2040703@oracle.com> In-Reply-To: <51022401.2040703@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/25/13 00:19, Jeff Liu wrote: > On 01/25/2013 05:39 AM, Mark Tinguely wrote: >> On 01/24/13 05:10, Jeff Liu wrote: >>> Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. >>> >>> Signed-off-by: Jie Liu >>> --- >>> fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- >>> 1 file changed, 111 insertions(+), 127 deletions(-) >>> >>> /* >>> @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( >>> struct xfs_mount *mp) >>> { >>> return XFS_DQUOT_LOGRES(mp) + >>> - MAX((mp->m_sb.sb_inodesize + >>> - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + >>> - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), >>> - (4 * mp->m_sb.sb_sectsize + >>> - 4 * mp->m_sb.sb_sectsize + >>> - mp->m_sb.sb_sectsize + >>> - XFS_ALLOCFREE_LOG_RES(mp, 4) + >>> - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + >>> - 128 * 5 + >>> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >>> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >>> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); >>> + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >>> + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, >>> + XFS_FSB_TO_B(mp, 1))), >>> + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + >>> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), >>> + XFS_FSB_TO_B(mp, 1)) + >>> + xfs_calc_buf_res(5, 0) + >>> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >>> + XFS_FSB_TO_B(mp, 1)) + >>> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >>> + mp->m_in_maxlevels, >>> + XFS_FSB_TO_B(mp, 0)))); >> ^^^^ >> I see the (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevel) >> headers in the original code, but I still don't see data. > XFS_FSB_TO_B(mp, 0) == 0, so it only calculates the headers out without the data part. > > But maybe it's better to replace XFS_FSB_TO_B(mp, 0) with 0 directly. > >> >> I ran the counts for the args of MAX() command and I get a different >> result: >> >> ARG1 ARG2 >> 25728 218752 before >> 25728 255616 after - second arg is too big as I expected. > Strange, there is no 255616 for ARG2 at my old test logs, what's your block/log/inode/sector combination? > > I have tried the following combinations on yesterday: > > -b size=512 -n size=4096 xfs_calc_itruncate_reservation_MAX(): left=6144 right=81792 > > -b size=4096 -n size=4096: xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 > > -b size=4096 -n size=4096 -i size=2048 xfs_calc_itruncate_reservation_MAX(): left=27520 right=222336 > > -b size=4096 -n size=65536 -s size=4096 xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 > > -b size=4096 -n size=4096 -s size=512 xfs_calc_itruncate_reservation_MAX(): left=25728 right=218752 > > -b size=4096 -n size=65536 -i size=2048 -s size=512 xfs_calc_itruncate_reservation_MAX(): left=27520 right=222336 > > -b size=4096 -n size=4096 -s size=4096 xfs_calc_itruncate_reservation_MAX(): left=25728 right=251008 > > -b size=4096 -n size=65536 xfs_calc_itruncate_reservation_MAX(): left=25728 right=218752 > > > Thanks, > -Jeff >> >> >> Some of the other counts don't match for me either. >> >> --Mark. >> Sticking a 0 instead of "XFS_FSB_TO_B(mp, 0)" and I get the same numbers for xfs_calc_itruncate_reservation() before and after the patch. Correction to my yesterday email, all the other MAX arguments in the functions in the file are correct. I was using an exiting xfs test partition. It was set up as: meta-data=/dev/sda2 isize=256 agcount=4, agsize=4194432 blks = sectsz=512 attr=2 data = bsize=4096 blocks=16777728, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=8192, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 I will manually review the rest of the calculation functions in this patch and then run tests on differently formatted filesystems. Thank-you, --Mark. From ryan.campbell@gmail.com Fri Jan 25 11:08:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,T_TO_NO_BRKTS_FREEMAIL 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 698FB7F37 for ; Fri, 25 Jan 2013 11:08:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE425AC00F for ; Fri, 25 Jan 2013 09:08:21 -0800 (PST) X-ASG-Debug-ID: 1359133699-04cb6c391211f4f0001-NocioJ Received: from mail-ea0-f177.google.com (mail-ea0-f177.google.com [209.85.215.177]) by cuda.sgi.com with ESMTP id h2aeTdOqQsAWjm6P (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 25 Jan 2013 09:08:20 -0800 (PST) X-Barracuda-Envelope-From: ryan.campbell@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.177] Received: by mail-ea0-f177.google.com with SMTP id n13so251617eaa.36 for ; Fri, 25 Jan 2013 09:08:19 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type; bh=Ad9jreT69rhZ+xbI6NsgBSifDAkClq/seI5q96HZvjE=; b=sqZ6w2OZSWxxMK1nR8lZT5eTfSYCP1UuGrCwAoef1JoSaEUqrrASeHZ36SArloR7BK 0P81MppqBjObQGs2ImpAC0la38M8AnJVjsRXH/EtPEYaSNyXYlobOvoO8RdJWopAijqx y28ZYalKik3H5nrvytYxU/J1LcWDq/ZsICv+Vq7tVpUuXI768SOPo5TGV2Rk+UZoRFIf CwLQz9a4TiKgxv0Es6qKheumB62Hq9ujMflAyfHUldXnR22IrTzXumh/1+D6KphHdY67 il3sXWdW9A9b+MUvaJOaoTk9Zhy+e2AIRpcWbSbDAM9WiJQgKwU13Xgzq3+Q4LHVHXLt lvVg== MIME-Version: 1.0 X-Received: by 10.14.198.198 with SMTP id v46mr5042658een.4.1359133699294; Fri, 25 Jan 2013 09:08:19 -0800 (PST) Received: by 10.14.142.5 with HTTP; Fri, 25 Jan 2013 09:08:19 -0800 (PST) In-Reply-To: References: Date: Fri, 25 Jan 2013 11:08:19 -0600 Message-ID: Subject: Re: XFS Freezing occasionally hangs From: Ryan Campbell X-ASG-Orig-Subj: Re: XFS Freezing occasionally hangs To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b3a7fea59443304d41ff933 X-Barracuda-Connect: mail-ea0-f177.google.com[209.85.215.177] X-Barracuda-Start-Time: 1359133700 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120880 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 --047d7b3a7fea59443304d41ff933 Content-Type: text/plain; charset=ISO-8859-1 Is there any additional information I can provide to debug this issue? We are seeing it quite often. On Thu, Jan 24, 2013 at 9:38 AM, Ryan Campbell wrote: > We use XFS on EC2 EBS running on Arch Linux (kernel 3.6.7-1-ARCH). Before > we take an EC2 snapshot, we call xfs_freeze on the mount so that we can > have a consistent snapshot. > > On instances running for around 30 days, we see the XFS freeze hang, > resulting in a skyrocketing load (but not CPU). We can't kill the > xfs_freeze process. The only route available is usually to force a reboot > of the server without cleaning unmounting. > > There are backtraces in dmesg complaining both of hung xfs processes, and > hung java processes. https://gist.github.com/3d46830eac52df44d30f > > Is this a known issue? We call xfs_freeze quite often on thousands of XFS > volumes, so I wouldn't be surprised if we have encountered an edge case > considering how often we do this. > > Any help appreciated. I'm recampbell on #xfs/freenode. > > Thanks, > Ryan > --047d7b3a7fea59443304d41ff933 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Is there any additional information I can provide to debug= this issue? We are seeing it quite often.
    =

    On Thu, Jan 24, 2013 at 9:38 AM, Ryan Ca= mpbell <ryan.campbell@gmail.com> wrote:
    We use XFS on EC2 EBS runni= ng on Arch Linux (kernel 3.6.7-1-ARCH). Before we take an EC2 snapshot, we = call xfs_freeze on the mount so that we can have a consistent snapshot.
    On instances running for around 30 days, we see the XFS free= ze hang, resulting in a skyrocketing load (but not CPU). We can't kill = the xfs_freeze process. The only route available is usually to force a rebo= ot of the server without cleaning unmounting.

    There are backtraces in dmesg complaining both of hung = xfs processes, and hung java processes.=A0https://gist.github.com/3d46830ea= c52df44d30f

    Is this a known issue? We call xfs_freeze quite often o= n thousands of XFS volumes, so I wouldn't be surprised if we have encou= ntered an edge case considering how often we do this.

    Any help appreciated. I'm recampbell on #xfs/freeno= de.

    Thanks,
    Ryan

    --047d7b3a7fea59443304d41ff933-- From tinguely@sgi.com Fri Jan 25 11:32:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 8179F7F37 for ; Fri, 25 Jan 2013 11:32:42 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 368FA8F804C; Fri, 25 Jan 2013 09:32:39 -0800 (PST) Message-ID: <5102C1B9.8090504@sgi.com> Date: Fri, 25 Jan 2013 11:32:41 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: simplify the fallocate path References: <20121208120812.755863148@bombadil.infradead.org> <20121208121006.286014845@bombadil.infradead.org> <20121210020956.GN15784@dastard> <20121210105211.GA2794@infradead.org> <20130104135638.GA16736@infradead.org> In-Reply-To: <20130104135638.GA16736@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/04/13 07:56, Christoph Hellwig wrote: > On Mon, Dec 10, 2012 at 05:52:12AM -0500, Christoph Hellwig wrote: >> On Mon, Dec 10, 2012 at 01:09:56PM +1100, Dave Chinner wrote: >>> You don't use this flag anywhere ;) >> >> Fixed. >> >>> While I like most of this series, I don't really like the >>> duplication of this piece of code. It seems to me that a simple >>> helper like: >> >> I had that in a previous version, but it seemed uglier than just >> opencoding it. I'll give it another try, maybe I can come up >> with something nicer now. > > I've looked at this and it does not seem to improve the code at all, > unless you have a strong objection I'm going to repost the series > just with the above unused variable removed. > ping? --Mark. From ryan.campbell@gmail.com Fri Jan 25 12:04:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,T_TO_NO_BRKTS_FREEMAIL 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 15CDF7F37 for ; Fri, 25 Jan 2013 12:04:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 03E188F8033 for ; Fri, 25 Jan 2013 10:04:33 -0800 (PST) X-ASG-Debug-ID: 1359137068-04cb6c39151224a0001-NocioJ Received: from mail-ea0-f175.google.com (mail-ea0-f175.google.com [209.85.215.175]) by cuda.sgi.com with ESMTP id t3YiOYHvUfKzEt09 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 25 Jan 2013 10:04:29 -0800 (PST) X-Barracuda-Envelope-From: ryan.campbell@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] Received: by mail-ea0-f175.google.com with SMTP id d1so276544eab.20 for ; Fri, 25 Jan 2013 10:04:28 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type; bh=yK2rmJjvfxfOJ8Bryr7n/IGJUylpXkA/FMAC4feXvqk=; b=twPex3sw51VR1E/SBL0+IxVCpsSjsDoDvSXqgkEa5R8OUQzLFWjb+kQfk3YtnCS3Q1 vdGQJIHj8s0A1vMfrDeZJ7cSdKvhxBYCQG/NEM8GDzQYg/lLnAzAFRdFMd6EODel5aFC rh4llBCvT/nAUEKFw3XlUdbxazu3yATfwANOmseV1XCSapThNXCcuIK8Tm7kWGb6gGCh PjMhaimkp3kJOi038L4Oz6jI+e2kzAKgBJCXgfoiHIIzwp2kbVAAS6S+U/F6J/Iuw8UK 7bziDqtRtm6z0nf9wC8mSgKGyGBhos6WtOiuEG8lbdjRlXwr/5+kzqd3KOu8ygBKiYfi nUQg== MIME-Version: 1.0 X-Received: by 10.14.194.199 with SMTP id m47mr20533498een.11.1359137068567; Fri, 25 Jan 2013 10:04:28 -0800 (PST) Received: by 10.14.142.5 with HTTP; Fri, 25 Jan 2013 10:04:28 -0800 (PST) In-Reply-To: References: Date: Fri, 25 Jan 2013 12:04:28 -0600 Message-ID: Subject: Re: XFS Freezing occasionally hangs From: Ryan Campbell X-ASG-Orig-Subj: Re: XFS Freezing occasionally hangs To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b343a8a2c4ca104d420c2c9 X-Barracuda-Connect: mail-ea0-f175.google.com[209.85.215.175] X-Barracuda-Start-Time: 1359137069 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120884 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 --047d7b343a8a2c4ca104d420c2c9 Content-Type: text/plain; charset=ISO-8859-1 In #xfs, bpm recommended I run echo t > /proc/sysrq-trigger. Here's the output of that command on the host with the stuck xfs_freeze. : https://gist.github.com/4636507 On Fri, Jan 25, 2013 at 11:08 AM, Ryan Campbell wrote: > Is there any additional information I can provide to debug this issue? We > are seeing it quite often. > > > On Thu, Jan 24, 2013 at 9:38 AM, Ryan Campbell wrote: > >> We use XFS on EC2 EBS running on Arch Linux (kernel 3.6.7-1-ARCH). Before >> we take an EC2 snapshot, we call xfs_freeze on the mount so that we can >> have a consistent snapshot. >> >> On instances running for around 30 days, we see the XFS freeze hang, >> resulting in a skyrocketing load (but not CPU). We can't kill the >> xfs_freeze process. The only route available is usually to force a reboot >> of the server without cleaning unmounting. >> >> There are backtraces in dmesg complaining both of hung xfs processes, and >> hung java processes. https://gist.github.com/3d46830eac52df44d30f >> >> Is this a known issue? We call xfs_freeze quite often on thousands of XFS >> volumes, so I wouldn't be surprised if we have encountered an edge case >> considering how often we do this. >> >> Any help appreciated. I'm recampbell on #xfs/freenode. >> >> Thanks, >> Ryan >> > > --047d7b343a8a2c4ca104d420c2c9 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    In #xfs, bpm recommended I run echo t > /proc/sysrq-tri= gger. Here's the output of that command on the host with the stuck xfs_= freeze. :=A0https://gist.github= .com/4636507


    On Fri, Jan 2= 5, 2013 at 11:08 AM, Ryan Campbell <ryan.campbell@gmail.com><= /span> wrote:
    Is there any additional inf= ormation I can provide to debug this issue? We are seeing it quite often.


    =
    On Thu, Jan 24, 2013 at 9:38 AM, Ryan Campbell <= span dir=3D"ltr"><ryan.campbell@gmail.com> wrote:
    We use XFS on EC2 EBS runni= ng on Arch Linux (kernel 3.6.7-1-ARCH). Before we take an EC2 snapshot, we = call xfs_freeze on the mount so that we can have a consistent snapshot.
    On instances running for around 30 days, we see the XFS free= ze hang, resulting in a skyrocketing load (but not CPU). We can't kill = the xfs_freeze process. The only route available is usually to force a rebo= ot of the server without cleaning unmounting.

    There are backtraces in dmesg complaining both of hung = xfs processes, and hung java processes.=A0https://gist.github.com/3d46830ea= c52df44d30f

    Is this a known issue? We call xfs_freeze quite often o= n thousands of XFS volumes, so I wouldn't be surprised if we have encou= ntered an edge case considering how often we do this.

    Any help appreciated. I'm recampbell on #xfs/freeno= de.

    Thanks,
    Ryan


    --047d7b343a8a2c4ca104d420c2c9-- From psusi@ubuntu.com Fri Jan 25 12:32:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9BA8A7F37 for ; Fri, 25 Jan 2013 12:32:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 72AED8F8054 for ; Fri, 25 Jan 2013 10:32:58 -0800 (PST) X-ASG-Debug-ID: 1359138776-04cbb00c63119cf0001-NocioJ Received: from cdptpa-omtalb.mail.rr.com (cdptpa-omtalb.mail.rr.com [75.180.132.120]) by cuda.sgi.com with ESMTP id ETBeWqV3xqeJoMQn for ; Fri, 25 Jan 2013 10:32:56 -0800 (PST) X-Barracuda-Envelope-From: psusi@ubuntu.com X-Barracuda-Apparent-Source-IP: 75.180.132.120 X-Authority-Analysis: v=2.0 cv=acPjbGUt c=1 sm=0 a=/DbS/tiKggfTkRRHPZEB4g==:17 a=Qsx_du5GiBkA:10 a=qvxnG7FKX0EA:10 a=fuADliLKFaoA:10 a=S1A5HrydsesA:10 a=8nJEP1OIZ-IA:10 a=fxJcL_dCAAAA:8 a=3x8ozMF3T7MA:10 a=danhDmx_AAAA:8 a=QfKxxUxMAAAA:8 a=B1pWmxNP4N6xhZcXBxQA:9 a=wPNLvfGTeEIA:10 a=/DbS/tiKggfTkRRHPZEB4g==:117 X-Cloudmark-Score: 0 X-Authenticated-User: X-Originating-IP: 67.78.168.186 Received: from [67.78.168.186] ([67.78.168.186:60902] helo=[10.1.1.235]) by cdptpa-oedge03.mail.rr.com (envelope-from ) (ecelerity 2.2.3.46 r()) with ESMTP id 36/8E-26261-7DFC2015; Fri, 25 Jan 2013 18:32:55 +0000 Message-ID: <5102CFD7.20400@ubuntu.com> Date: Fri, 25 Jan 2013 13:32:55 -0500 From: Phillip Susi User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com CC: linux-fsdevel Subject: XFS dirty after sync/reboot? X-Enigmail-Version: 1.5 X-ASG-Orig-Subj: XFS dirty after sync/reboot? Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cdptpa-omtalb.mail.rr.com[75.180.132.120] X-Barracuda-Start-Time: 1359138776 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.2.120886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 While triaging a bug filed in Ubuntu involving odd reboot failures, it appears that XFS leaves the filesystem in a corrupt state that requires journal playback to fix after a sync or reboot. Grub2 doesn't seem to understand the journal, leading to all kinds of confusion after the reboot. Shouldn't a full sync or remount to r/o flush the journal transactions and leave the fs fully clean? Original bug report: https://launchpad.net/bugs/1103187 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRAs/XAAoJEJrBOlT6nu75gogH/1Q+ej+QBqmzQpPLB9jFbiFs EqDLyV0tJg0R5zF3PRVFC7Qh3IWqDkt0H2aXWnhPVItDjIRIicV51vgtCpxkgxHC HCwheiGwVwXj0GK/Z5OfCyxEupZI9ThLu5rc9hRypMzFMKULW5WRazo5oXZpvZ3E XvNxG3Ey0QbiFjzaClbpWTiTV+kjoeHCnkNQ/cYMLqdKXgkMWuDgCj1q8NkT6AZL z9cJgssxYRdrzAQgjZ9YxUxVpuAIuQQUJxpXZFT7bd7jpsJ109q3i7BQ+j8aZxHW 8Xy2zTWGMZsfxLUHIUvwOXORYz/GXfVkjHOJC6SnqUErInOvMIDPsutIgyFw/LM= =i0Bt -----END PGP SIGNATURE----- From bpm@sgi.com Fri Jan 25 12:45:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 C074E7F37 for ; Fri, 25 Jan 2013 12:45:07 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A7AD8F8037; Fri, 25 Jan 2013 10:45:07 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4BBF64266DC; Fri, 25 Jan 2013 12:45:07 -0600 (CST) Date: Fri, 25 Jan 2013 12:45:07 -0600 From: Ben Myers To: stable@vger.kernel.org Cc: xfs@oss.sgi.com, dchinner@redhat.com Subject: [PATCH] xfs: fix periodic log flushing Message-ID: <20130125184507.GU30652@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) Hi, Please take this patch for -stable in kernels 3.5-3.7. It doesn't have an equivalent upstream commit because the code was removed before the bug was discovered. See f661f1e0bf50 and 7e18530bef6a. Thanks, Ben From: Dave Chinner There is a logic inversion in xfssyncd_worker() which means that the log is not periodically forced or idled correctly. This means that metadata changes aggregated in memory do not get flushed in a timely manner, and hence if filesystem is not cleanly unmounted those changes can be lost. This loss can manifest itself even hours after the changes were made if the filesystem is left to idle without a sync() occurring between the last modification and the crash/shutdown occuring. cc: # 3.7, 3.6, 3.5 Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers --- fs/xfs/xfs_sync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) If people agree the fix is correct, I'll post it to the -stable list for inclusion... diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 9500caf..7bf85e8 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -400,7 +400,7 @@ xfs_sync_worker( * cancel_delayed_work_sync on this work queue before tearing down * the ail and the log in xfs_log_unmount. */ - if (!(mp->m_super->s_flags & MS_ACTIVE) && + if ((mp->m_super->s_flags & MS_ACTIVE) && !(mp->m_flags & XFS_MOUNT_RDONLY)) { /* dgc: errors ignored here */ if (mp->m_super->s_writers.frozen == SB_UNFROZEN && _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From stan@hardwarefreak.com Fri Jan 25 12:50:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 07D227F37 for ; Fri, 25 Jan 2013 12:50:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C88658F8033 for ; Fri, 25 Jan 2013 10:50:26 -0800 (PST) X-ASG-Debug-ID: 1359139826-04cb6c39121239d0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id i9KSQl3iMU6X0A1j for ; Fri, 25 Jan 2013 10:50:26 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id D84526C105 for ; Fri, 25 Jan 2013 12:50:25 -0600 (CST) Message-ID: <5102D3F3.3060605@hardwarefreak.com> Date: Fri, 25 Jan 2013 12:50:27 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: XFS dirty after sync/reboot? References: <5102CFD7.20400@ubuntu.com> X-ASG-Orig-Subj: Re: XFS dirty after sync/reboot? In-Reply-To: <5102CFD7.20400@ubuntu.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1359139826 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 On 1/25/2013 12:32 PM, Phillip Susi wrote: > While triaging a bug filed in Ubuntu involving odd reboot failures, it > appears that XFS leaves the filesystem in a corrupt state that > requires journal playback to fix after a sync or reboot. Grub2 > doesn't seem to understand the journal, leading to all kinds of > confusion after the reboot. > > Shouldn't a full sync or remount to r/o flush the journal transactions > and leave the fs fully clean? > > Original bug report: https://launchpad.net/bugs/1103187 This sounds like the Grub problem mentioned here: http://www.xfs.org/index.php/XFS_FAQ#Q:_Does_GRUB_work_with_XFS.3F -- Stan From bpm@sgi.com Fri Jan 25 12:50:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 C77D47F37 for ; Fri, 25 Jan 2013 12:50:43 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id A122F304066; Fri, 25 Jan 2013 10:50:40 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 7DD064266DC; Fri, 25 Jan 2013 12:50:40 -0600 (CST) Date: Fri, 25 Jan 2013 12:50:40 -0600 From: Ben Myers To: Phillip Susi Cc: xfs@oss.sgi.com, linux-fsdevel Subject: Re: XFS dirty after sync/reboot? Message-ID: <20130125185040.GC27055@sgi.com> References: <5102CFD7.20400@ubuntu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5102CFD7.20400@ubuntu.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Philip, On Fri, Jan 25, 2013 at 01:32:55PM -0500, Phillip Susi wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > While triaging a bug filed in Ubuntu involving odd reboot failures, it > appears that XFS leaves the filesystem in a corrupt state that > requires journal playback to fix after a sync or reboot. Grub2 > doesn't seem to understand the journal, leading to all kinds of > confusion after the reboot. > > Shouldn't a full sync or remount to r/o flush the journal transactions > and leave the fs fully clean? It should. We have a bug in xfs in that area. > Original bug report: https://launchpad.net/bugs/1103187 Try this patch which was recently proposed for 3.5-3.7 stable trees: http://oss.sgi.com/archives/xfs/2012-12/msg00324.html Regards, Ben From tinguely@sgi.com Fri Jan 25 13:20:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 1D6827F37 for ; Fri, 25 Jan 2013 13:20:44 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0A57304077; Fri, 25 Jan 2013 11:20:40 -0800 (PST) Message-ID: <5102DB0B.6010906@sgi.com> Date: Fri, 25 Jan 2013 13:20:43 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <5101168E.7080801@oracle.com> <5101AA17.7090706@sgi.com> <51022401.2040703@oracle.com> In-Reply-To: <51022401.2040703@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/25/13 00:19, Jeff Liu wrote: > On 01/25/2013 05:39 AM, Mark Tinguely wrote: >> > On 01/24/13 05:10, Jeff Liu wrote: >>> >> Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. >>> >> >>> >> Signed-off-by: Jie Liu >>> >> --- >>> >> fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- >>> >> 1 file changed, 111 insertions(+), 127 deletions(-) >>> >> >>> >> /* >>> >> @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( >>> >> struct xfs_mount *mp) >>> >> { >>> >> return XFS_DQUOT_LOGRES(mp) + >>> >> - MAX((mp->m_sb.sb_inodesize + >>> >> - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + >>> >> - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), >>> >> - (4 * mp->m_sb.sb_sectsize + >>> >> - 4 * mp->m_sb.sb_sectsize + >>> >> - mp->m_sb.sb_sectsize + >>> >> - XFS_ALLOCFREE_LOG_RES(mp, 4) + >>> >> - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + >>> >> - 128 * 5 + >>> >> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >>> >> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >>> >> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); >>> >> + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >>> >> + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, >>> >> + XFS_FSB_TO_B(mp, 1))), >>> >> + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + >>> >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), >>> >> + XFS_FSB_TO_B(mp, 1)) + >>> >> + xfs_calc_buf_res(5, 0) + >>> >> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >>> >> + XFS_FSB_TO_B(mp, 1)) + >>> >> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >>> >> + mp->m_in_maxlevels, >>> >> + XFS_FSB_TO_B(mp, 0)))); >> > ^^^^ >> > I see the (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevel) >> > headers in the original code, but I still don't see data. > XFS_FSB_TO_B(mp, 0) == 0, so it only calculates the headers out without the data part. > > But maybe it's better to replace XFS_FSB_TO_B(mp, 0) with 0 directly. > I did verify all the routines in the patch are the same as before. They test the same too. I must have had a bad test file before - XFS_FSB_TO_B(mp, 0) is obviously 0. I would prefer 0 rather than XFS_FSB_TO_B(mp, 0). Looks like the user space bits need to be refactored: http://oss.sgi.com/archives/xfs/2012-12/msg00108.html http://oss.sgi.com/archives/xfs/2012-12/msg00109.html Reviewed-by: Mark Tinguely From sandeen@sandeen.net Fri Jan 25 15:10:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BB9C27F37 for ; Fri, 25 Jan 2013 15:10:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36A17AC00B for ; Fri, 25 Jan 2013 13:10:24 -0800 (PST) X-ASG-Debug-ID: 1359148223-04cbb00c6611f710001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0kLc1NEHK4jUOWsL for ; Fri, 25 Jan 2013 13:10:23 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1A59D63C3C80; Fri, 25 Jan 2013 15:10:23 -0600 (CST) Message-ID: <5102F4BE.6060009@sandeen.net> Date: Fri, 25 Jan 2013 15:10:22 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: =?UTF-8?B?THVrw6HFoSBDemVybmVy?= , hch@infradead.org, xfs@oss.sgi.com Subject: [PATCH V2] xfsprogs: Fix possible unallocated memory access in fiemap References: <1355319059-12111-1-git-send-email-lczerner@redhat.com> <20121212231245.GY16353@dastard> <20121213230608.GI16353@dastard> X-ASG-Orig-Subj: [PATCH V2] xfsprogs: Fix possible unallocated memory access in fiemap In-Reply-To: <20121213230608.GI16353@dastard> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359148223 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.2.120896 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- (Based on original patch by Lukas Czerner & comments by Dave Chinner) Currently we could access unallocated memory in fiemap because we're using uninitialized variable 'fiemap' in fiemap_f(). In fact this has been spotted on x390s machine where xfs_io would segfault. The problem happens in the for cycle which seems to be intended to compute the header item spacing. However at that point the fiemap structure has just been allocated and does not contain any extents yet, so it is entirely useless and it never actually worked. This patch delays the format calculation until the first batch of extents has come in for analysis. Signed-off-by: Eric Sandeen --- diff --git a/io/fiemap.c b/io/fiemap.c index e32a416..e76be97 100644 --- a/io/fiemap.c +++ b/io/fiemap.c @@ -90,6 +90,14 @@ print_verbose( memset(lbuf, 0, sizeof(lbuf)); memset(bbuf, 0, sizeof(bbuf)); + if (*cur_extent == 0) { + printf("%4s: %-*s %-*s %*s %*s\n", _("EXT"), + foff_w, _("FILE-OFFSET"), + boff_w, _("BLOCK-RANGE"), + tot_w, _("TOTAL"), + flg_w, _("FLAGS")); + } + if (lstart != llast) { snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]:", llast, lstart - 1ULL); @@ -157,6 +165,47 @@ print_plain( *last_logical = extent->fe_logical + extent->fe_length; } +/* + * Calculate the proper extent table format based on first + * set of extents + */ +static void +calc_print_format( + struct fiemap *fiemap, + __u64 blocksize, + int *foff_w, + int *boff_w, + int *tot_w, + int *flg_w) +{ + int i; + char lbuf[32]; + char bbuf[32]; + __u64 logical; + __u64 block; + __u64 len; + struct fiemap_extent *extent; + + for (i = 0; i < fiemap->fm_mapped_extents; i++) { + + extent = &fiemap->fm_extents[i]; + logical = extent->fe_logical / blocksize; + len = extent->fe_length / blocksize; + block = extent->fe_physical / blocksize; + + snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]", logical, + logical + len - 1); + snprintf(bbuf, sizeof(bbuf), "%llu..%llu", block, + block + len - 1); + *foff_w = max(*foff_w, strlen(lbuf)); + *boff_w = max(*boff_w, strlen(bbuf)); + *tot_w = max(*tot_w, numlen(len, 10)); + *flg_w = max(*flg_w, numlen(extent->fe_flags, 16)); + if (extent->fe_flags & FIEMAP_EXTENT_LAST) + break; + } +} + int fiemap_f( int argc, @@ -215,38 +264,6 @@ fiemap_f( printf("%s:\n", file->name); - if (vflag) { - for (i = 0; i < fiemap->fm_mapped_extents; i++) { - char lbuf[32]; - char bbuf[32]; - __u64 logical; - __u64 block; - __u64 len; - struct fiemap_extent *extent; - - extent = &fiemap->fm_extents[i]; - logical = extent->fe_logical / blocksize; - len = extent->fe_length / blocksize; - block = extent->fe_physical / blocksize; - - snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]", logical, - logical + len - 1); - snprintf(bbuf, sizeof(bbuf), "%llu..%llu", block, - block + len - 1); - foff_w = max(foff_w, strlen(lbuf)); - boff_w = max(boff_w, strlen(bbuf)); - tot_w = max(tot_w, numlen(len, 10)); - flg_w = max(flg_w, numlen(extent->fe_flags, 16)); - if (extent->fe_flags & FIEMAP_EXTENT_LAST) - break; - } - printf("%4s: %-*s %-*s %*s %*s\n", _("EXT"), - foff_w, _("FILE-OFFSET"), - boff_w, _("BLOCK-RANGE"), - tot_w, _("TOTAL"), - flg_w, _("FLAGS")); - } - while (!last && ((cur_extent + 1) != max_extents)) { if (max_extents) num_extents = min(num_extents, @@ -275,12 +292,18 @@ fiemap_f( struct fiemap_extent *extent; extent = &fiemap->fm_extents[i]; - if (vflag) + if (vflag) { + if (cur_extent == 0) { + calc_print_format(fiemap, blocksize, + &foff_w, &boff_w, + &tot_w, &flg_w); + } + print_verbose(extent, blocksize, foff_w, boff_w, tot_w, flg_w, max_extents, &cur_extent, &last_logical); - else + } else print_plain(extent, lflag, blocksize, max_extents, &cur_extent, &last_logical); From tinguely@sgi.com Fri Jan 25 16:35:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 C2F257F37 for ; Fri, 25 Jan 2013 16:35:27 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DBAC304032; Fri, 25 Jan 2013 14:35:24 -0800 (PST) Message-ID: <510308AE.8090201@sgi.com> Date: Fri, 25 Jan 2013 16:35:26 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: simplify the fallocate path References: <20121208120812.755863148@bombadil.infradead.org> <20121208121006.286014845@bombadil.infradead.org> In-Reply-To: <20121208121006.286014845@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 06:08, Christoph Hellwig wrote: > Call xfs_alloc_file_space or xfs_free_file_space directly from > xfs_file_fallocate instead of going through xfs_change_file_space. > > This simplified the code by removing the unessecary marshalling of the > arguments into an xfs_flock64_t structure and allows removing checks that > are already done in the VFS code. > > Signed-off-by: Christoph Hellwig > > --- > fs/xfs/xfs_file.c | 81 ++++++++++++++++++++++++++++++++------------------ > fs/xfs/xfs_vnodeops.c | 39 ++---------------------- > fs/xfs/xfs_vnodeops.h | 3 + > 3 files changed, 60 insertions(+), 63 deletions(-) patched code looks like: STATIC long xfs_file_fallocate( struct file *file, int mode, loff_t offset, loff_t len) { struct inode *inode = file->f_path.dentry->d_inode; struct xfs_inode *ip = XFS_I(inode); struct xfs_trans *tp; bool setprealloc = false; long error; loff_t new_size = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); if (mode & FALLOC_FL_PUNCH_HOLE) { error = xfs_free_file_space(ip, offset, len); if (error) goto out_unlock; } else { ^^^^^^^^^ vvvvvvvvvvvvvvvv if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { new_size = offset + len; error = -inode_newsize_ok(inode, new_size); if (error) goto out_unlock; } Since there is only the FALLOC_FL_KEEP_SIZE or FALLOC_FL_PUNCH_HOLE bit set and the if statement makes them mutually exclusive, the block highlighted should be for the FALLOC_FL_KEEP_SIZE and shouldn't the comparison would never be true here? Shouldn't it be for the FALLOC_FL_PUNCH_HOLE block? --Mark. From tinguely@sgi.com Fri Jan 25 16:52:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B3D707F37 for ; Fri, 25 Jan 2013 16:52:27 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 902B28F8039; Fri, 25 Jan 2013 14:52:24 -0800 (PST) Message-ID: <51030CAA.4060205@sgi.com> Date: Fri, 25 Jan 2013 16:52:26 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: remove the unused XFS_ATTR_NONBLOCK flag References: <20121208120812.755863148@bombadil.infradead.org> <20121208121005.710569599@bombadil.infradead.org> In-Reply-To: <20121208121005.710569599@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 06:08, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > > --- > fs/xfs/xfs_ioctl.c | 3 --- > fs/xfs/xfs_vnodeops.h | 1 - > 2 files changed, 4 deletions(-) Needs a commit message, but the patch looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Jan 25 16:53:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 6651A7F37 for ; Fri, 25 Jan 2013 16:53:16 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 301D48F8033; Fri, 25 Jan 2013 14:53:16 -0800 (PST) Message-ID: <51030CDE.4090606@sgi.com> Date: Fri, 25 Jan 2013 16:53:18 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: always take the iolock around xfs_setattr_size References: <20121208120812.755863148@bombadil.infradead.org> <20121208121005.902710659@bombadil.infradead.org> In-Reply-To: <20121208121005.902710659@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 06:08, Christoph Hellwig wrote: > There is no reason to conditionally take the iolock inside xfs_setattr_size > when we can let the caller handle it unconditionally, which just incrases > the lock hold time for the case where it was previously taken internally > by a few instructions. > > Signed-off-by: Christoph Hellwig > > --- > fs/xfs/xfs_file.c | 2 +- > fs/xfs/xfs_iops.c | 28 +++++++++++++++------------- > fs/xfs/xfs_vnodeops.c | 3 +-- > fs/xfs/xfs_vnodeops.h | 2 +- > 4 files changed, 18 insertions(+), 17 deletions(-) looks good Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Jan 25 16:57:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 3FBF97F37 for ; Fri, 25 Jan 2013 16:57:10 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0819D304067; Fri, 25 Jan 2013 14:57:10 -0800 (PST) Message-ID: <51030DC7.3070402@sgi.com> Date: Fri, 25 Jan 2013 16:57:11 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: always hold the iolock when calling xfs_change_file_space References: <20121208120812.755863148@bombadil.infradead.org> <20121208121006.098660509@bombadil.infradead.org> In-Reply-To: <20121208121006.098660509@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 12/08/12 06:08, Christoph Hellwig wrote: > Currently fallocate always holds the iolock when calling into > xfs_change_file_space, while the ioctl path lets some of the lower level > functions take it, but leave it out in others. > > This patch makes sure the ioctl path also always holds the iolock and > thus introduces consistent locking for the preallocation operations while > simplifying the code and allowing to kill the now unused XFS_ATTR_NOLOCK > flag. > > Signed-off-by: Christoph Hellwig A first for me, seeing you ADD a lock. :) Looks good. Reviewed-by: Mark Tinguely From david@fromorbit.com Fri Jan 25 18:47:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3AA617F37 for ; Fri, 25 Jan 2013 18:47:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6B84AC008 for ; Fri, 25 Jan 2013 16:47:12 -0800 (PST) X-ASG-Debug-ID: 1359161230-04bdf0231a13cec0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id mHwQZGTR7ictYBHW for ; Fri, 25 Jan 2013 16:47:11 -0800 (PST) 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: Au0ZABMnA1F5LOFU/2dsb2JhbABFDoVPsmWFEQOBARdzgh4BAQU6HCMQCAMYCSUPBSUDChcTiA6+YBWNToNcA5YMkEmCOVI Received: from ppp121-44-225-84.lns20.syd7.internode.on.net (HELO dastard) ([121.44.225.84]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Jan 2013 11:17:10 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TytvH-0006OE-Vu; Sat, 26 Jan 2013 11:47:08 +1100 Date: Sat, 26 Jan 2013 11:47:07 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-ext4@vger.kernel.org, Zheng Liu , xfs@oss.sgi.com Subject: Re: [RESEND][PATCH 2/2 v2] ext4: let us fully support punching hole feature in fallocate Message-ID: <20130126004707.GG2667@dastard> X-ASG-Orig-Subj: Re: [RESEND][PATCH 2/2 v2] ext4: let us fully support punching hole feature in fallocate References: <1358493381-20150-1-git-send-email-wenqing.lz@taobao.com> <1358493381-20150-2-git-send-email-wenqing.lz@taobao.com> <20130125033201.GD28908@thunk.org> <20130125035912.GA15806@gmail.com> <20130125042122.GG28908@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130125042122.GG28908@thunk.org> 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: 1359161230 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.2.120909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc xfs@oss.sgi.com] On Thu, Jan 24, 2013 at 11:21:22PM -0500, Theodore Ts'o wrote: > On Fri, Jan 25, 2013 at 11:59:12AM +0800, Zheng Liu wrote: > > > > I wonder that maybe we need to submit a patch to let xfstest understand > > that a filesystem supports extents or not because after applied this > > patch indirect-based file in ext4 has supported seek_data/hole and hole > > punching. I usually run xfstest automatically, and every time I need > > to check the result of #255 and #285 manually. That is annoying for me. > > I would think the right thing to do is to have xfstests make sure it > understands that fallocate working with FALLOC_FL_PUNCH_HOLE does not > imply that fallocate without the FALLOC_FL_PUNCH_HOLE flag OR'ed in > will work. We already have this capabiity in xfstests via _require_xfs_io_falloc_punch and _require_xfs_io_falloc. That, however, doesn't mean the tests that use these calls do the correct requirement checks. That's the problem with 255 - it doesn't call _require_xfs_io_falloc. As to 285, the seek_sanity_test does it's own check for seek hole/data support, and error out if it fails. This needs to be turned into an equivalent _require_seek_hole_data (e.g. by running "seek_sanity_test -t" to test for support) and 285 needs to the call the _require_seek_hole_data before running the test proper. Please send patches to xfs@oss.sgi.com.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@questar.ac Sat Jan 26 01:29:42 2013 Return-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.3 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF, T_FILL_THIS_FORM_SHORT,T_REMOTE_IMAGE 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 6928A7F37 for ; Sat, 26 Jan 2013 01:29:42 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A72230406A for ; Fri, 25 Jan 2013 23:29:42 -0800 (PST) X-ASG-Debug-ID: 1359185347-04cb6c391213f150001-NocioJ Received: from smtp.zero.jp (smtp2042.zero.jp [211.123.214.31]) by cuda.sgi.com with ESMTP id W8VWWAP4kPCPedoq; Fri, 25 Jan 2013 23:29:08 -0800 (PST) X-Barracuda-Envelope-From: info@questar.ac X-Barracuda-Apparent-Source-IP: 211.123.214.31 Received: from localhost (localhost [127.0.0.1]) by smtp.zero.jp (Postfix) with ESMTP id 915942C30B3; Sat, 26 Jan 2013 16:29:07 +0900 (JST) X-Virus-Scanned: amavisd-new at zero.jp Received: from smtp.zero.jp ([127.0.0.1]) by localhost (smtp.zero.jp [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id bhisDWmqzg+o; Sat, 26 Jan 2013 16:29:07 +0900 (JST) Received: from questar.sakura.ne.jp (www325b.sakura.ne.jp [219.94.155.155]) by smtp5.gmoserver.jp (Postfix) with ESMTPSA id D93E72C30A5; Sat, 26 Jan 2013 16:29:05 +0900 (JST) Date: Sat, 26 Jan 2013 16:29:05 +0900 To: Email From: "Questar.Co" Reply-To: "Questar.Co" Subject: =?utf-8?Q?Khuy=E1=BA=BFn_m=C3=A3i_c=E1=BB=B1c_l=E1=BB=9Bn_d=C3=A0nh_cho_b?= =?utf-8?Q?=E1=BA=A1n._L=C3=A0m_website_ch=E1=BB=89_v=E1=BB=9Bi_99$.?= Message-ID: <0428b907702ba3ebbc2e70534fe01e98@questar.sakura.ne.jp> X-ASG-Orig-Subj: =?utf-8?Q?Khuy=E1=BA=BFn_m=C3=A3i_c=E1=BB=B1c_l=E1=BB=9Bn_d=C3=A0nh_cho_b?= =?utf-8?Q?=E1=BA=A1n._L=C3=A0m_website_ch=E1=BB=89_v=E1=BB=9Bi_99$.?= X-Priority: 3 X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_0428b907702ba3ebbc2e70534fe01e98" X-Barracuda-Connect: smtp2042.zero.jp[211.123.214.31] X-Barracuda-Start-Time: 1359185347 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.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address --b1_0428b907702ba3ebbc2e70534fe01e98 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit To view the message, please use an HTML compatible email viewer! --b1_0428b907702ba3ebbc2e70534fe01e98 Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: 8bit Website Template


    Chúc mừng năm mới!


    Mừng năm mới 2013 chúng tôi muốn giới thiệu với bạn về chương trình khuyến mãi mừng xuân của chúng tôi. Chỉ với 99 USD bạn có thể có ngay một website cá nhân hoặc cho doanh nghiệp của bạn. Khuyến mãi dành cho 20 người đầu tiên liên hệ với chúng tôi, hãy nhanh lên đừng bỏ lỡ cơ hội này/
    Hãy gọi: (08) 54050558 !

    Questar Design

    • Chuyên nghiệp trong việc tạo ra một giao diện thân thiện bằng việc tập trung vào triết lý đơn giản nhưng hiệu quả, chúng tôi chắc chắn rằng có thể giúp doanh nghiệp của bạn truyền đạt thông điệp một cách chính xác đến các khách hàng của bạn.

    • CREATE

    • SOLID BUILD

    • ONLINE SUPPORT

    --b1_0428b907702ba3ebbc2e70534fe01e98-- From info@questar.ac Sat Jan 26 01:29:43 2013 Return-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.3 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF, T_FILL_THIS_FORM_SHORT,T_REMOTE_IMAGE 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 023987F37 for ; Sat, 26 Jan 2013 01:29:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D71FE304066 for ; Fri, 25 Jan 2013 23:29:39 -0800 (PST) X-ASG-Debug-ID: 1359185340-04cbb00c63134b60001-NocioJ Received: from smtp.zero.jp (smtp2042.zero.jp [211.123.214.31]) by cuda.sgi.com with ESMTP id XtbtPEcYQt3jlvy4; Fri, 25 Jan 2013 23:29:01 -0800 (PST) X-Barracuda-Envelope-From: info@questar.ac X-Barracuda-Apparent-Source-IP: 211.123.214.31 Received: from localhost (localhost [127.0.0.1]) by smtp.zero.jp (Postfix) with ESMTP id 628082C309B; Sat, 26 Jan 2013 16:29:00 +0900 (JST) X-Virus-Scanned: amavisd-new at zero.jp Received: from smtp.zero.jp ([127.0.0.1]) by localhost (smtp.zero.jp [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3zIPxyP4JfJP; Sat, 26 Jan 2013 16:29:00 +0900 (JST) Received: from questar.sakura.ne.jp (www325b.sakura.ne.jp [219.94.155.155]) by smtp5.gmoserver.jp (Postfix) with ESMTPSA id AA4332C3091; Sat, 26 Jan 2013 16:28:58 +0900 (JST) Date: Sat, 26 Jan 2013 16:28:58 +0900 To: Email From: "Questar.Co" Reply-To: "Questar.Co" Subject: =?utf-8?Q?Khuy=E1=BA=BFn_m=C3=A3i_c=E1=BB=B1c_l=E1=BB=9Bn_d=C3=A0nh_cho_b?= =?utf-8?Q?=E1=BA=A1n._L=C3=A0m_website_ch=E1=BB=89_v=E1=BB=9Bi_99$.?= Message-ID: <94ae6060cc5c7c59b38b4b2d9b156161@questar.sakura.ne.jp> X-ASG-Orig-Subj: =?utf-8?Q?Khuy=E1=BA=BFn_m=C3=A3i_c=E1=BB=B1c_l=E1=BB=9Bn_d=C3=A0nh_cho_b?= =?utf-8?Q?=E1=BA=A1n._L=C3=A0m_website_ch=E1=BB=89_v=E1=BB=9Bi_99$.?= X-Priority: 3 X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_94ae6060cc5c7c59b38b4b2d9b156161" X-Barracuda-Connect: smtp2042.zero.jp[211.123.214.31] X-Barracuda-Start-Time: 1359185340 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.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address --b1_94ae6060cc5c7c59b38b4b2d9b156161 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit To view the message, please use an HTML compatible email viewer! --b1_94ae6060cc5c7c59b38b4b2d9b156161 Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: 8bit Website Template


    Chúc mừng năm mới!


    Mừng năm mới 2013 chúng tôi muốn giới thiệu với bạn về chương trình khuyến mãi mừng xuân của chúng tôi. Chỉ với 99 USD bạn có thể có ngay một website cá nhân hoặc cho doanh nghiệp của bạn. Khuyến mãi dành cho 20 người đầu tiên liên hệ với chúng tôi, hãy nhanh lên đừng bỏ lỡ cơ hội này/
    Hãy gọi: (08) 54050558 !

    Questar Design

    • Chuyên nghiệp trong việc tạo ra một giao diện thân thiện bằng việc tập trung vào triết lý đơn giản nhưng hiệu quả, chúng tôi chắc chắn rằng có thể giúp doanh nghiệp của bạn truyền đạt thông điệp một cách chính xác đến các khách hàng của bạn.

    • CREATE

    • SOLID BUILD

    • ONLINE SUPPORT

    --b1_94ae6060cc5c7c59b38b4b2d9b156161-- From jeff.liu@oracle.com Sat Jan 26 03:36:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 330E97F37 for ; Sat, 26 Jan 2013 03:36:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F9CC8F8033 for ; Sat, 26 Jan 2013 01:36:42 -0800 (PST) X-ASG-Debug-ID: 1359193000-04cbb00c65139ce0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ZtkwVaJKnBZzWIBW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Sat, 26 Jan 2013 01:36:40 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0Q9adrU005060 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 26 Jan 2013 09:36:40 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0Q9ac8A021106 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 26 Jan 2013 09:36:39 GMT Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0Q9acTl005566; Sat, 26 Jan 2013 03:36:38 -0600 Received: from [192.168.1.103] (/123.119.99.180) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sat, 26 Jan 2013 01:36:38 -0800 Message-ID: <5103A399.3040802@oracle.com> Date: Sat, 26 Jan 2013 17:36:25 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c References: <5101168E.7080801@oracle.com> <5101AA17.7090706@sgi.com> <51022401.2040703@oracle.com> <5102DB0B.6010906@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v3 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c In-Reply-To: <5102DB0B.6010906@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1359193000 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.2.120942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 01/26/2013 03:20 AM, Mark Tinguely wrote: > On 01/25/13 00:19, Jeff Liu wrote: >> On 01/25/2013 05:39 AM, Mark Tinguely wrote: >>>> On 01/24/13 05:10, Jeff Liu wrote: >>>>>> Refine the existing reservations routines with xfs_calc_buf_res() in xfs_trans.c. >>>>>> >>>>>> Signed-off-by: Jie Liu >>>>>> --- >>>>>> fs/xfs/xfs_trans.c | 238 ++++++++++++++++++++++++---------------------------- >>>>>> 1 file changed, 111 insertions(+), 127 deletions(-) >>>>>> >>>>>> /* >>>>>> @@ -148,18 +145,18 @@ xfs_calc_itruncate_reservation( >>>>>> struct xfs_mount *mp) >>>>>> { >>>>>> return XFS_DQUOT_LOGRES(mp) + >>>>>> - MAX((mp->m_sb.sb_inodesize + >>>>>> - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + >>>>>> - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), >>>>>> - (4 * mp->m_sb.sb_sectsize + >>>>>> - 4 * mp->m_sb.sb_sectsize + >>>>>> - mp->m_sb.sb_sectsize + >>>>>> - XFS_ALLOCFREE_LOG_RES(mp, 4) + >>>>>> - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + >>>>>> - 128 * 5 + >>>>>> - XFS_ALLOCFREE_LOG_RES(mp, 1) + >>>>>> - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + >>>>>> - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); >>>>>> + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + >>>>>> + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, >>>>>> + XFS_FSB_TO_B(mp, 1))), >>>>>> + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + >>>>>> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), >>>>>> + XFS_FSB_TO_B(mp, 1)) + >>>>>> + xfs_calc_buf_res(5, 0) + >>>>>> + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), >>>>>> + XFS_FSB_TO_B(mp, 1)) + >>>>>> + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + >>>>>> + mp->m_in_maxlevels, >>>>>> + XFS_FSB_TO_B(mp, 0)))); >>>> ^^^^ >>>> I see the (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevel) >>>> headers in the original code, but I still don't see data. >> XFS_FSB_TO_B(mp, 0) == 0, so it only calculates the headers out without the data part. >> >> But maybe it's better to replace XFS_FSB_TO_B(mp, 0) with 0 directly. >> > > > I did verify all the routines in the patch are the same as before. They > test the same too. I must have had a bad test file before - > XFS_FSB_TO_B(mp, 0) is obviously 0. I would prefer 0 rather than > XFS_FSB_TO_B(mp, 0). > > Looks like the user space bits need to be refactored: > http://oss.sgi.com/archives/xfs/2012-12/msg00108.html > http://oss.sgi.com/archives/xfs/2012-12/msg00109.html Sure, I'll post the user part later. Thanks, -Jeff > > > Reviewed-by: Mark Tinguely > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From JulieAnne.DAVIES@austin.org.au Sat Jan 26 07:36:41 2013 Return-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=LOTTO_AGENT,T_LOTS_OF_MONEY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 D73597F47 for ; Sat, 26 Jan 2013 07:36:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 989658F8033 for ; Sat, 26 Jan 2013 05:36:32 -0800 (PST) X-ASG-Debug-ID: 1359207390-04bdf0231a156860001-w1Z2WR Received: from mail.austin.org.au (mail.austin.org.au [203.0.31.68]) by cuda.sgi.com with ESMTP id snuXqEssLQ3XtbEJ for ; Sat, 26 Jan 2013 05:36:30 -0800 (PST) X-Barracuda-Envelope-From: JulieAnne.DAVIES@austin.org.au X-Barracuda-Apparent-Source-IP: 203.0.31.68 Received: from server105s.armc.org.au (Not Verified[172.27.2.35]) by mail.austin.org.au with MailMarshal (v6,7,2,8378) id ; Sun, 27 Jan 2013 00:34:58 +1100 Received: from server231s.armc.org.au ([172.27.10.231]) by server105s.armc.org.au with Microsoft SMTPSVC(6.0.3790.4675); Sun, 27 Jan 2013 00:37:07 +1100 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: Odpoved na: europrom11@56788.com Date: Sun, 27 Jan 2013 00:32:51 +1100 X-ASG-Orig-Subj: RE: Odpoved na: europrom11@56788.com Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Odpoved na: europrom11@56788.com Thread-Index: Ac37yS/xpWOF5SNkRlWZT6y8jpd9HAAAHOfc References: From: "DAVIES, Julie-Anne" To: "DAVIES, Julie-Anne" X-OriginalArrivalTime: 26 Jan 2013 13:37:07.0483 (UTC) FILETIME=[3C27F6B0:01CDFBCA] X-Barracuda-Connect: mail.austin.org.au[203.0.31.68] X-Barracuda-Start-Time: 1359207390 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.52 X-Barracuda-Spam-Status: No, SCORE=0.52 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, MAILTO_TO_SPAM_ADDR, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120957 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address =20 ________________________________ From: DAVIES, Julie-Anne Sent: Sun 1/27/2013 12:29 AM Subject: Odpoved na: europrom11@56788.com Gratulujeme! V=E1s e-mail bol ocenen=FD s=FAcet 2,000,000.00 EUR v'' Euro= =20tombola Promo'' Held 01. 2013 v Eur=F3pe. E-mail bol vybran=FD prostre= dn=EDctvom n=E1sho adres=E1ra Partner webu. E-mailov=E9 detaily. ........= =20Meno ....... Postov=E9 Pridat .... St=E1tna .... Telef=F3n ... Odpoved na: europrom11@56788.com Odpovedat na reklam=E1ciu. Maria Gabriela Sanchez (Claim Mgr) Euro Tombola Austin Health - 2012 Metropolitan Health Service of the Year ***************************************************************** This email contains confidential information intended only for the person named above and may be subject to legal privilege and confidentiality obligations imposed by legislation or be subject to intellectual property=20 protection or copyright. If you are not the intended recipient, any use, disclosure, copying or distribution of this transmission is prohibited. If you have received this message in error, please notify us immediately by return email and delete the original email and any attachments. Austin Health provides no guarantee that this transmission is free of virus or that it has not been intercepted or altered.=20 ***************************************************************** From bpm@oss.sgi.com Sat Jan 26 09:44:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 8F9387F4C; Sat, 26 Jan 2013 09:44:32 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-18-gced55f3 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 003fd6c8be14a348c56cb1d171605ab13fca906f X-Git-Newrev: ced55f38d6bde7c10a14ea51c2edcd51a98575e3 Message-Id: <20130126154432.8F9387F4C@oss.sgi.com> Date: Sat, 26 Jan 2013 09:44:31 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated ced55f3 xfs: Fix possible use-after-free with AIO 3b19034 xfs: fix shutdown hang on invalid inode during create 4d559a3 xfs: limit speculative prealloc near ENOSPC thresholds 10616b8 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end from 003fd6c8be14a348c56cb1d171605ab13fca906f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ced55f38d6bde7c10a14ea51c2edcd51a98575e3 Author: Jan Kara Date: Wed Jan 23 13:56:18 2013 +0100 xfs: Fix possible use-after-free with AIO Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers CC: stable@vger.kernel.org Signed-off-by: Jan Kara Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 3b19034d4f4554e39ca244fb28962bbf2ccba046 Author: Dave Chinner Date: Mon Jan 21 23:53:55 2013 +1100 xfs: fix shutdown hang on invalid inode during create When the new inode verify in xfs_iread() fails, the create transaction is aborted and a shutdown occurs. The subsequent unmount then hangs in xfs_wait_buftarg() on a buffer that has an elevated hold count. Debug showed that it was an AGI buffer getting stuck: [ 22.576147] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 22.976213] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.376206] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.776325] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck The trace of this buffer leading up to the shutdown (trimmed for brevity) looks like: xfs_buf_init: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 1 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 1 caller xfs_trans_read_buf_map xfs_buf_iorequest: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_iorequest xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_iorequest xfs_buf_iowait: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_ioerror: bno 0x2 len 0x200 hold 1 caller xfs_buf_bio_end_io xfs_buf_iodone: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_ioend xfs_buf_iowait_done: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_trans_brelse: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_buf_item_relse: bno 0x2 nblks 0x1 hold 2 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_relse xfs_buf_unlock: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_trylock: bno 0x2 nblks 0x1 hold 2 caller _xfs_buf_find xfs_buf_find: bno 0x2 len 0x200 hold 2 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 2 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 2 caller xfs_trans_read_buf_map xfs_buf_hold: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_trans_log_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_buf_item_unlock: bno 0x2 len 0x200 hold 3 flags DIRTY liflags ABORTED xfs_buf_unlock: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock xfs_buf_rele: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock And that is the AGI buffer from cold cache read into memory to transaction abort. You can see at transaction abort the bli is dirty and only has a single reference. The item is not pinned, and it's not in the AIL. Hence the only reference to it is this transaction. The problem is that the xfs_buf_item_unlock() call is dropping the last reference to the xfs_buf_log_item attached to the buffer (which holds a reference to the buffer), but it is not freeing the xfs_buf_log_item. Hence nothing will ever release the buffer, and the unmount hangs waiting for this reference to go away. The fix is simple - xfs_buf_item_unlock needs to detect the last reference going away in this case and free the xfs_buf_log_item to release the reference it holds on the buffer. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 4d559a3bcb7383f34334092af07e68fb60910684 Author: Dave Chinner Date: Mon Jan 21 23:53:54 2013 +1100 xfs: limit speculative prealloc near ENOSPC thresholds There is a window on small filesytsems where specualtive preallocation can be larger than that ENOSPC throttling thresholds, resulting in specualtive preallocation trying to reserve more space than there is space available. This causes immediate ENOSPC to be triggered, prealloc to be turned off and flushing to occur. One the next write (i.e. next 4k page), we do exactly the same thing, and so effective drive into synchronous 4k writes by triggering ENOSPC flushing on every page while in the window between the prealloc size and the ENOSPC prealloc throttle threshold. Fix this by checking to see if the prealloc size would consume all free space, and throttle it appropriately to avoid premature ENOSPC... Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Ben Myers commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 Author: Dave Chinner Date: Mon Jan 21 23:53:52 2013 +1100 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end When _xfs_buf_find is passed an out of range address, it will fail to find a relevant struct xfs_perag and oops with a null dereference. This can happen when trying to walk a filesystem with a metadata inode that has a partially corrupted extent map (i.e. the block number returned is corrupt, but is otherwise intact) and we try to read from the corrupted block address. In this case, just fail the lookup. If it is readahead being issued, it will simply not be done, but if it is real read that fails we will get an error being reported. Ideally this case should result in an EFSCORRUPTED error being reported, but we cannot return an error through xfs_buf_read() or xfs_buf_get() so this lookup failure may result in ENOMEM or EIO errors being reported instead. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_buf.c | 20 ++++++++++++++++++++ fs/xfs/xfs_buf_item.c | 12 ++++++++++-- fs/xfs/xfs_iomap.c | 9 +++++++++ fs/xfs/xfs_trace.h | 1 + 5 files changed, 41 insertions(+), 3 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Sat Jan 26 09:44:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id F3F847F50; Sat, 26 Jan 2013 09:44:45 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-18-gced55f3 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 003fd6c8be14a348c56cb1d171605ab13fca906f X-Git-Newrev: ced55f38d6bde7c10a14ea51c2edcd51a98575e3 Message-Id: <20130126154445.F3F847F50@oss.sgi.com> Date: Sat, 26 Jan 2013 09:44:44 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated ced55f3 xfs: Fix possible use-after-free with AIO 3b19034 xfs: fix shutdown hang on invalid inode during create 4d559a3 xfs: limit speculative prealloc near ENOSPC thresholds 10616b8 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end from 003fd6c8be14a348c56cb1d171605ab13fca906f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ced55f38d6bde7c10a14ea51c2edcd51a98575e3 Author: Jan Kara Date: Wed Jan 23 13:56:18 2013 +0100 xfs: Fix possible use-after-free with AIO Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers CC: stable@vger.kernel.org Signed-off-by: Jan Kara Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 3b19034d4f4554e39ca244fb28962bbf2ccba046 Author: Dave Chinner Date: Mon Jan 21 23:53:55 2013 +1100 xfs: fix shutdown hang on invalid inode during create When the new inode verify in xfs_iread() fails, the create transaction is aborted and a shutdown occurs. The subsequent unmount then hangs in xfs_wait_buftarg() on a buffer that has an elevated hold count. Debug showed that it was an AGI buffer getting stuck: [ 22.576147] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 22.976213] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.376206] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.776325] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck The trace of this buffer leading up to the shutdown (trimmed for brevity) looks like: xfs_buf_init: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 1 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 1 caller xfs_trans_read_buf_map xfs_buf_iorequest: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_iorequest xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_iorequest xfs_buf_iowait: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_ioerror: bno 0x2 len 0x200 hold 1 caller xfs_buf_bio_end_io xfs_buf_iodone: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_ioend xfs_buf_iowait_done: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_trans_brelse: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_buf_item_relse: bno 0x2 nblks 0x1 hold 2 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_relse xfs_buf_unlock: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_trylock: bno 0x2 nblks 0x1 hold 2 caller _xfs_buf_find xfs_buf_find: bno 0x2 len 0x200 hold 2 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 2 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 2 caller xfs_trans_read_buf_map xfs_buf_hold: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_trans_log_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_buf_item_unlock: bno 0x2 len 0x200 hold 3 flags DIRTY liflags ABORTED xfs_buf_unlock: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock xfs_buf_rele: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock And that is the AGI buffer from cold cache read into memory to transaction abort. You can see at transaction abort the bli is dirty and only has a single reference. The item is not pinned, and it's not in the AIL. Hence the only reference to it is this transaction. The problem is that the xfs_buf_item_unlock() call is dropping the last reference to the xfs_buf_log_item attached to the buffer (which holds a reference to the buffer), but it is not freeing the xfs_buf_log_item. Hence nothing will ever release the buffer, and the unmount hangs waiting for this reference to go away. The fix is simple - xfs_buf_item_unlock needs to detect the last reference going away in this case and free the xfs_buf_log_item to release the reference it holds on the buffer. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 4d559a3bcb7383f34334092af07e68fb60910684 Author: Dave Chinner Date: Mon Jan 21 23:53:54 2013 +1100 xfs: limit speculative prealloc near ENOSPC thresholds There is a window on small filesytsems where specualtive preallocation can be larger than that ENOSPC throttling thresholds, resulting in specualtive preallocation trying to reserve more space than there is space available. This causes immediate ENOSPC to be triggered, prealloc to be turned off and flushing to occur. One the next write (i.e. next 4k page), we do exactly the same thing, and so effective drive into synchronous 4k writes by triggering ENOSPC flushing on every page while in the window between the prealloc size and the ENOSPC prealloc throttle threshold. Fix this by checking to see if the prealloc size would consume all free space, and throttle it appropriately to avoid premature ENOSPC... Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Ben Myers commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 Author: Dave Chinner Date: Mon Jan 21 23:53:52 2013 +1100 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end When _xfs_buf_find is passed an out of range address, it will fail to find a relevant struct xfs_perag and oops with a null dereference. This can happen when trying to walk a filesystem with a metadata inode that has a partially corrupted extent map (i.e. the block number returned is corrupt, but is otherwise intact) and we try to read from the corrupted block address. In this case, just fail the lookup. If it is readahead being issued, it will simply not be done, but if it is real read that fails we will get an error being reported. Ideally this case should result in an EFSCORRUPTED error being reported, but we cannot return an error through xfs_buf_read() or xfs_buf_get() so this lookup failure may result in ENOMEM or EIO errors being reported instead. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_buf.c | 20 ++++++++++++++++++++ fs/xfs/xfs_buf_item.c | 12 ++++++++++-- fs/xfs/xfs_iomap.c | 9 +++++++++ fs/xfs/xfs_trace.h | 1 + 5 files changed, 41 insertions(+), 3 deletions(-) hooks/post-receive -- XFS development tree From apache@secure.alluresites.com Sat Jan 26 12:20:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 E040B7F37 for ; Sat, 26 Jan 2013 12:20:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C13B8304067 for ; Sat, 26 Jan 2013 10:20:35 -0800 (PST) X-ASG-Debug-ID: 1359224434-04cb6c3912153cd0001-w1Z2WR Received: from secure.alluresites.com (secure.alluresites.com [208.65.200.61]) by cuda.sgi.com with ESMTP id 7sfdgm7AaICzutSK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 26 Jan 2013 10:20:34 -0800 (PST) X-Barracuda-Envelope-From: apache@secure.alluresites.com X-Barracuda-Apparent-Source-IP: 208.65.200.61 Received: from secure.alluresites.com (vds64_centos54 [127.0.0.1]) by secure.alluresites.com (8.13.8/8.13.8) with ESMTP id r0QIKYmI011021 for ; Sat, 26 Jan 2013 13:20:34 -0500 Received: (from apache@localhost) by secure.alluresites.com (8.13.8/8.13.8/Submit) id r0QIKYCt011020; Sat, 26 Jan 2013 13:20:34 -0500 Date: Sat, 26 Jan 2013 13:20:34 -0500 Message-Id: <201301261820.r0QIKYCt011020@secure.alluresites.com> To: linux-xfs@oss.sgi.com Subject: Looking For Supplier From: Chris Jovan X-ASG-Orig-Subj: Looking For Supplier Reply-To: chris.jovan@dr.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Barracuda-Connect: secure.alluresites.com[208.65.200.61] X-Barracuda-Start-Time: 1359224434 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.2.120977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Good Day! Am Chris T. Jovan from United States. I will be pleased to have a discussion with you on my company intended offshore partnership, in which you will stand as a middle man between my company and the supplier of a product in Singapore and Taiwan. If you are genuinely interested, respond immediately with your mobile details. Do contact me. Regards, Mr. Jovan From apache@secure.alluresites.com Sat Jan 26 14:52:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, T_TO_NO_BRKTS_FREEMAIL 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 6601A7F37 for ; Sat, 26 Jan 2013 14:52:56 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA107AC001 for ; Sat, 26 Jan 2013 12:52:52 -0800 (PST) X-ASG-Debug-ID: 1359233571-04cb6c3913156d10001-NocioJ Received: from secure.alluresites.com (secure.alluresites.com [208.65.200.61]) by cuda.sgi.com with ESMTP id fQ1GCkMrOP1cdKLZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 26 Jan 2013 12:52:51 -0800 (PST) X-Barracuda-Envelope-From: apache@secure.alluresites.com X-Barracuda-Apparent-Source-IP: 208.65.200.61 Received: from secure.alluresites.com (vds64_centos54 [127.0.0.1]) by secure.alluresites.com (8.13.8/8.13.8) with ESMTP id r0QKqppf022291 for ; Sat, 26 Jan 2013 15:52:51 -0500 Received: (from apache@localhost) by secure.alluresites.com (8.13.8/8.13.8/Submit) id r0QKqpLi022290; Sat, 26 Jan 2013 15:52:51 -0500 Date: Sat, 26 Jan 2013 15:52:51 -0500 Message-Id: <201301262052.r0QKqpLi022290@secure.alluresites.com> To: xfs@oss.sgi.com Subject: Looking For Supplier From: Chris Jovan X-ASG-Orig-Subj: Looking For Supplier Reply-To: chris.jovan@dr.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Barracuda-Connect: secure.alluresites.com[208.65.200.61] X-Barracuda-Start-Time: 1359233571 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.2.120987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Good Day! Am Chris T. Jovan from United States. I will be pleased to have a discussion with you on my company intended offshore partnership, in which you will stand as a middle man between my company and the supplier of a product in Singapore and Taiwan. If you are genuinely interested, respond immediately with your mobile details. Do contact me. Regards, Mr. Jovan From sandeen@sandeen.net Sat Jan 26 16:40:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 516967F37 for ; Sat, 26 Jan 2013 16:40:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D41530407A for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-ASG-Debug-ID: 1359240034-04cb6c3913158520001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 9dUrovwthgu4m2TJ for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id D0B226520586; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 3/8] libxfs: fix setup_cursor array allocation Date: Sat, 26 Jan 2013 16:40:27 -0600 X-ASG-Orig-Subj: [PATCH 3/8] libxfs: fix setup_cursor array allocation Message-Id: <1359240032-11576-4-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- setup_cursor() wants an array of xfs_agbno_t's, but it allocated a multiple of *pointers* to xfs_agbno_t's. xfs_agbno_t is 4 bytes, so this is harmless other than allocating twice as much memory as needed on a 64-bit machine. Signed-off-by: Eric Sandeen --- repair/phase5.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 7d5cd49..1f71cac 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -206,7 +206,7 @@ setup_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *curs) ASSERT(big_extent_len > 0); - if ((curs->btree_blocks = malloc(sizeof(xfs_agblock_t *) + if ((curs->btree_blocks = malloc(sizeof(xfs_agblock_t) * big_extent_len)) == NULL) do_error(_("could not set up btree block array\n")); -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E4BCA7F37 for ; Sat, 26 Jan 2013 16:40:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3E1E30407A for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04cb6c3912158520001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IM3IEWWgANahlawP for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 085D36520589; Sat, 26 Jan 2013 16:40:34 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 6/8] xfs_fsr: check strdup results properly in initallfs() Date: Sat, 26 Jan 2013 16:40:30 -0600 X-ASG-Orig-Subj: [PATCH 6/8] xfs_fsr: check strdup results properly in initallfs() Message-Id: <1359240032-11576-7-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- initallfs() does 2 strdups, but then checks the result of one of them twice, rather then checking each one. Fix this. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 843f57d..b5aa3db 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -470,10 +470,14 @@ initallfs(char *mtab) fs->dev = strdup(mp->mnt_fsname); fs->mnt = strdup(mp->mnt_dir); - if (fs->mnt == NULL || fs->mnt == NULL) { + if (fs->dev == NULL) { fsrprintf(_("strdup(%s) failed\n"), mp->mnt_fsname); exit(1); } + if (fs->mnt == NULL) { + fsrprintf(_("strdup(%s) failed\n"), mp->mnt_dir); + exit(1); + } mi++; fs++; } -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 30D4A7F37 for ; Sat, 26 Jan 2013 16:40:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6BB3AC002 for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04bdf0231a165240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id U0ZHdCHLAq9kp9J3 for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id EE16A6520588; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 5/8] xfs_fsr: guard against path string overflows Date: Sat, 26 Jan 2013 16:40:29 -0600 X-ASG-Orig-Subj: [PATCH 5/8] xfs_fsr: guard against path string overflows Message-Id: <1359240032-11576-6-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- gettmpname() and getparent() blindly copy strings into a target array; be sure we limit the copy to the size of the target and null terminate it. I don't see a way to get here with a too-long name, since most paths try to open or stat the file already, but it can't hurt to be defensive. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 2db2224..843f57d 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1452,7 +1452,8 @@ gettmpname(char *fname) sprintf(sbuf, "/.fsr%d", getpid()); - strcpy(buf, fname); + strncpy(buf, fname, PATH_MAX); + buf[PATH_MAX] = '\0'; ptr = strrchr(buf, '/'); if (ptr) { *ptr = '\0'; @@ -1476,7 +1477,8 @@ getparent(char *fname) static char buf[PATH_MAX+1]; char *ptr; - strcpy(buf, fname); + strncpy(buf, fname, PATH_MAX); + buf[PATH_MAX] = '\0'; ptr = strrchr(buf, '/'); if (ptr) { if (ptr == &buf[0]) -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 49FAA7F47 for ; Sat, 26 Jan 2013 16:40:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC6F6AC003 for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04cb6c3915158530001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VyGR9hrOSw3qM5K5 for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 24B3C652058B; Sat, 26 Jan 2013 16:40:34 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 8/8] xfs_fsr: remove extraneous close() in fsrallfs() Date: Sat, 26 Jan 2013 16:40:32 -0600 X-ASG-Orig-Subj: [PATCH 8/8] xfs_fsr: remove extraneous close() in fsrallfs() Message-Id: <1359240032-11576-9-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- After the fork(), the parent does a close(fd); on an fd which is long-since closed (prior to the while loop). Just remove it. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 5eaabb5..3d017ca 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -627,7 +627,6 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) break; default: wait(&error); - close(fd); if (WIFEXITED(error) && WEXITSTATUS(error) == 1) { /* child timed out & did fsrall_cleanup */ exit(0); -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 95DDC7F50 for ; Sat, 26 Jan 2013 16:40:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EC18304077 for ; Sat, 26 Jan 2013 14:40:37 -0800 (PST) X-ASG-Debug-ID: 1359240034-04bdf0231d165240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id s6V2Y8kbtJ2G19DH for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id BFBDA6520585; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures Date: Sat, 26 Jan 2013 16:40:26 -0600 X-ASG-Orig-Subj: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures Message-Id: <1359240032-11576-3-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a merge-to-userspace of kernel commit a0041684 xfs: zero allocation_args on the kernel stack When calling xfs_alloc_vextent args.userdata was uninitialized, and if we had args.type==XFS_ALLOCTYPE_START_BNO, this uninit structure member got tested, leading to some random allocator behavior. Signed-off-by: Eric Sandeen --- libxfs/xfs_alloc.c | 1 + libxfs/xfs_bmap.c | 3 +++ libxfs/xfs_ialloc.c | 1 + 3 files changed, 5 insertions(+), 0 deletions(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index a76512d..831040a 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -1788,6 +1788,7 @@ xfs_alloc_fix_freelist( /* * Initialize the args structure. */ + memset(&targs, 0, sizeof(targs)); targs.tp = tp; targs.mp = mp; targs.agbp = agbp; diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5a626b0..883035e 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -2411,6 +2411,7 @@ xfs_bmap_btalloc( * Normal allocation, done through xfs_alloc_vextent. */ tryagain = isaligned = 0; + memset(&args, 0, sizeof(args)); args.tp = ap->tp; args.mp = mp; args.fsbno = ap->rval; @@ -3044,6 +3045,7 @@ xfs_bmap_extents_to_btree( * Convert to a btree with two levels, one record in root. */ XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = mp; args.firstblock = *firstblock; @@ -3205,6 +3207,7 @@ xfs_bmap_local_to_extents( xfs_buf_t *bp; /* buffer for extent block */ xfs_bmbt_rec_host_t *ep;/* extent record pointer */ + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = ip->i_mount; args.firstblock = *firstblock; diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 1fcafb6..f97dc4d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -232,6 +232,7 @@ xfs_ialloc_ag_alloc( /* boundary */ struct xfs_perag *pag; + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 82E177F54 for ; Sat, 26 Jan 2013 16:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 626BF8F8033 for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04bdf0231a165230001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vD9OwdV0jCGs4wJp for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id B24846520584; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 1/8] libhandle: Guard against string overflow in path_to_fspath() Date: Sat, 26 Jan 2013 16:40:25 -0600 X-ASG-Orig-Subj: [PATCH 1/8] libhandle: Guard against string overflow in path_to_fspath() Message-Id: <1359240032-11576-2-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- path_to_fspath does a blind strcpy into an array of MAXPATHLEN; we should be sure to limit this so that it does not go over the size of the array. I don't think I see a way to get here today with a too-long path, but I don't think it'll hurt to be defensive. Signed-off-by: Eric Sandeen --- libhandle/handle.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/libhandle/handle.c b/libhandle/handle.c index b1ec5f2..9a232fa 100644 --- a/libhandle/handle.c +++ b/libhandle/handle.c @@ -158,7 +158,8 @@ path_to_fspath(char *path) if (S_ISREG(statbuf.st_mode) || S_ISDIR(statbuf.st_mode)) return path; - strcpy(dirpath, path); + strncpy(dirpath, path, MAXPATHLEN); + dirpath[MAXPATHLEN-1] = '\0'; return dirname(dirpath); } -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AFCBA7F55 for ; Sat, 26 Jan 2013 16:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51CE3AC003 for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04bdf0231e165240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id x2zJN7chmaDENTiw for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id A54316520583; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 0/8] xfsprogs: misc small fixes Date: Sat, 26 Jan 2013 16:40:24 -0600 X-ASG-Orig-Subj: [PATCH 0/8] xfsprogs: misc small fixes Message-Id: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- A handful of fixes from looking over a Coverity scan. The strncpy fixes (1/8, 5/8) might not be too critical, but I think they can't hurt. The libxfs xfs_alloc_arg initialization (2/8) might clash with Dave's libxfs syncup, it can be dropped if it makes things difficult. Fixes a real bug though. Tested by a quick run through xfstests -g auto Thanks, -Eric [PATCH 1/8] libhandle: Guard against string overflow in path_to_fspath() [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures [PATCH 3/8] libxfs: fix setup_cursor array allocation [PATCH 4/8] xfs_repair: Fix free of uninit ptr in xfs_acl_valid() error path [PATCH 5/8] xfs_fsr: guard against path string overflows [PATCH 6/8] xfs_fsr: check strdup results properly in initallfs() [PATCH 7/8] xfs_fsr: fix attribute no_change_count logic [PATCH 8/8] xfs_fsr: remove extraneous close() in fsrallfs() From sandeen@sandeen.net Sat Jan 26 16:40:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CFCC77F50 for ; Sat, 26 Jan 2013 16:40:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7240EAC004 for ; Sat, 26 Jan 2013 14:40:35 -0800 (PST) X-ASG-Debug-ID: 1359240034-04bdf0231b165240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VRPRehyFJczNTSaO for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id E0A9A6520587; Sat, 26 Jan 2013 16:40:33 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 4/8] xfs_repair: Fix free of uninit ptr in xfs_acl_valid() error path Date: Sat, 26 Jan 2013 16:40:28 -0600 X-ASG-Orig-Subj: [PATCH 4/8] xfs_repair: Fix free of uninit ptr in xfs_acl_valid() error path Message-Id: <1359240032-11576-5-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 This error path: xfs_acl_valid(xfs_acl_disk_t *daclp) { xfs_acl_t *aclp; ... if (daclp == NULL) goto acl_invalid; ... acl_invalid: free(aclp); attempts to free garbage; set it to NULL on init to make it safe. Signed-off-by: Eric Sandeen --- repair/attr_repair.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index bab65b1..ec7f4a3 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -1004,7 +1004,7 @@ process_attributes( static int xfs_acl_valid(xfs_acl_disk_t *daclp) { - xfs_acl_t *aclp; + xfs_acl_t *aclp = NULL; xfs_acl_entry_t *entry, *e; int user = 0, group = 0, other = 0, mask = 0, mask_required = 0; int i, j; -- 1.7.1 From sandeen@sandeen.net Sat Jan 26 16:40:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C89097F54 for ; Sat, 26 Jan 2013 16:40:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5AD0EAC003 for ; Sat, 26 Jan 2013 14:40:39 -0800 (PST) X-ASG-Debug-ID: 1359240034-04cbb00c6414e190001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sRiefl2Qbrw7K6Un for ; Sat, 26 Jan 2013 14:40:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 16A9E652058A; Sat, 26 Jan 2013 16:40:34 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH 7/8] xfs_fsr: fix attribute no_change_count logic Date: Sat, 26 Jan 2013 16:40:31 -0600 X-ASG-Orig-Subj: [PATCH 7/8] xfs_fsr: fix attribute no_change_count logic Message-Id: <1359240032-11576-8-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359240032-11576-1-git-send-email-sandeen@redhat.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359240034 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.2.120993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As it stands today, if no_change_count++ isn't > 10, we will reset it to 0. There's no way to get above 1 (let alone 10) so this isn't working as intended. If we see progress (last_forkoff != tbstat.bs_forkoff) *then* we sould reset the no_change_count counter to 0. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index b5aa3db..5eaabb5 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1099,8 +1099,8 @@ fsr_setup_attr_fork( if (last_forkoff == tbstat.bs_forkoff) { if (no_change_cnt++ > 10) break; - } - no_change_cnt = 0; + } else /* progress! */ + no_change_cnt = 0; last_forkoff = tbstat.bs_forkoff; /* work out which way to grow the fork */ -- 1.7.1 From contato@elocursos.com.br Sat Jan 26 18:35:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.7 required=5.0 tests=FUZZY_CREDIT,HTML_MESSAGE 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 B783B7F50 for ; Sat, 26 Jan 2013 18:35:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3C7430407B for ; Sat, 26 Jan 2013 16:35:38 -0800 (PST) X-ASG-Debug-ID: 1359246936-04cbb00c6614f6f0001-NocioJ Received: from hm1315-39.locaweb.com.br (hm1315-39.locaweb.com.br [201.76.49.195]) by cuda.sgi.com with ESMTP id qEGQ2tZKQ4alDVx6 for ; Sat, 26 Jan 2013 16:35:36 -0800 (PST) X-Barracuda-Envelope-From: contato@elocursos.com.br X-Barracuda-Apparent-Source-IP: 201.76.49.195 Received: from mcbain0008.email.locaweb.com.br (189.126.112.84) by hm1315-38.locaweb.com.br (PowerMTA(TM) v3.5r15) id h0hr5i0nvfoj for ; Sat, 26 Jan 2013 22:35:33 -0200 (envelope-from ) Received: from bart0065.correio.biz (bart0065.correio.biz [186.202.140.212]) by mcbain0008.email.locaweb.com.br (Postfix) with ESMTP id B2F7B23EE5C; Sat, 26 Jan 2013 22:35:32 -0200 (BRST) X-LocaWeb-COR: locaweb_2009_x-mail Received: from n1102367 (unknown [187.2.12.37]) (Authenticated sender: contato@elocursos.com.br) by bart0065.correio.biz (Postfix) with ESMTPA id 35F7C19C354; Sat, 26 Jan 2013 22:35:30 -0200 (BRST) From: "ELOCURSOS" To: Subject: Organize seu Depto FINANCEIRO! Date: Sat, 26 Jan 2013 22:32:43 -0200 X-ASG-Orig-Subj: Organize seu Depto FINANCEIRO! Message-ID: <0e2a01cdfc26$384d9de0$a8e8d9a0$@com.br> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0E2B_01CDFC15.74C4CDE0" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac38JZjXErMrpCQpSICIfn6p5sTHkQ== Content-Language: pt-br X-Virus-Scanned: clamav-milter 0.97.3 at mcbain0008 X-Virus-Status: Clean X-CMAE-Verdict: spam X-CMAE-Score: 100 X-CMAE-Analysis: v=2.0 cv=Oor4PVDt c=0 sm=1 p=r34GwxngAAAA:8 a=vkpRR54kDaGMPv8R+ax2LA==:17 a=JpDFMrIOlGQA:10 a=vdllev7qr0MA:10 a=vkpRR54kDaGMPv8R+ax2LA==:117 X-Barracuda-Connect: hm1315-39.locaweb.com.br[201.76.49.195] X-Barracuda-Start-Time: 1359246936 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_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121001 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_0E2B_01CDFC15.74C4CDE0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Todas as planilhas por apenas R$ 29,90. =20 Clique sobre o nome para assistir o v=EDdeo de apresenta=E7=E3o: Fluxo de caixa Controle di=E1rio de = caixa Controle contas a = receber Controle cobran=E7a por = telefone Controle cart=F5es de = cr=E9dito Planilha calculo de juros Planilha planejamento Todas as planilhas s=E3o elaboradas no sistema de banco de dados, = ap=F3s, atualizadas geram relat=F3rios din=E2micos. Dessa forma os dados s=E3o transformados em informa=E7=F5es =FAteis para a tomada de decis=F5es. =20 =20 Envio todas as planilhas ap=F3s confirma=E7=E3o do deposito. =20 Banco Bradesco Ag 0046-9 C/C 0568009-3 Favor: Silvana Jaqueline Guimar=E3es CPF: 325.250.898-20 =20 Precisando de ajuda para elaborar uma planilha? Conte comigo! =20 -- Grato, Elenildo Verissimo elenildoverissimo@gmail.com contato@elocursos.com.br (19) 8816-0579 | 8155-3931 P Antes de imprimir, pense no Meio Ambiente. ------=_NextPart_000_0E2B_01CDFC15.74C4CDE0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

    Todas as planilhas por apenas R$ 29,90.

     

    Clique sobre o nome para assistir o = v=EDdeo de apresenta=E7=E3o:=

    Fluxo de caixa=

    Controle di=E1rio de = caixa=

    Controle contas a = receber=

    Controle cobran=E7a por = telefone=

    Controle cart=F5es de = cr=E9dito=

    Planilha calculo de = juros=

    Planilha = planejamento

    = Todas as planilhas s=E3o elaboradas no sistema de banco de dados, = ap=F3s, atualizadas geram relat=F3rios din=E2micos. Dessa forma os dados = s=E3o transformados em informa=E7=F5es =FAteis para a tomada de = decis=F5es.

     =

     =

    Envio todas as = planilhas ap=F3s confirma=E7=E3o do deposito.

     

    =

    Banco = Bradesco

    Ag = 0046-9

    C/C = 0568009-3

    Favor: Silvana Jaqueline = Guimar=E3es

    CPF: = 325.250.898-20

     =

    Precisando de ajuda = para elaborar uma planilha? Conte comigo!

     =

    --

    Grato,

    Elenildo Verissimo

    elenildoverissimo@<= /span>gmail.com

    contato@<= /span>elocursos.com.br

    (19) 8816-0579 | 8155-3931

    P  Antes de imprimir, pense no Meio = Ambiente.

    ------=_NextPart_000_0E2B_01CDFC15.74C4CDE0-- From contact-st@stocklottrading.net Sun Jan 27 10:43:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 020047F4C for ; Sun, 27 Jan 2013 10:43:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68927AC002 for ; Sun, 27 Jan 2013 08:43:16 -0800 (PST) X-ASG-Debug-ID: 1359304988-04cb6c391316bca0001-NocioJ Received: from mail-oa0-f41.google.com (mail-oa0-f41.google.com [209.85.219.41]) by cuda.sgi.com with ESMTP id t2Vxtn7VMEi6hiJO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 08:43:08 -0800 (PST) X-Barracuda-Envelope-From: contact-st@stocklottrading.net X-Barracuda-Apparent-Source-IP: 209.85.219.41 Received: by mail-oa0-f41.google.com with SMTP id j6so2079643oag.14 for ; Sun, 27 Jan 2013 08:43:07 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type:x-gm-message-state; bh=jfKeVBrciJ05SXOzfd+Jg/j1vDd7s0UO4f9UZT8MaXQ=; b=BUR/hKZ0aLzravIiwxoMFFU0Ep+Z//OiCXn+tQODtXsvyRyr3Efjkqvl7QlGu1yUcW uT81L7FXaPcDCKwiLSaN1W7R9wC1Mo2Fkagv3a04AbVI70rieet6x1pdZGu2Cmvrvt1P 8qTPidfX9tWT2xlE5PLW2RHqhUCS191RS5rg/9vlJwva6eHZg9zLESkufBPIoOp4Mffm t5sQ8DYOQh9QUPD9bSXvFqRSIZd+2+/Zmx4gVSNu9VPUxhju9pns8J9fW28ITPVQ6YVW hCFcYucossU1w9MhGMqro+D6Zu/vCI0V8sD828A90ATxt8vPQtwJeidFq2HnQLftQeQG gWhA== MIME-Version: 1.0 X-Received: by 10.60.27.199 with SMTP id v7mr9156979oeg.23.1359304987520; Sun, 27 Jan 2013 08:43:07 -0800 (PST) Received: by 10.60.13.167 with HTTP; Sun, 27 Jan 2013 08:43:07 -0800 (PST) In-Reply-To: References: Date: Sun, 27 Jan 2013 23:43:07 +0700 Message-ID: Subject: =?TIS-620?B?otLCtOjHuSC66dK5ICy31ei01A==?= =?TIS-620?B?uSAspM254rQsIM2+0sPst+DB6bm37CAv?= =?TIS-620?B?IHNlbGwgcXVpY2tseSBob3VzZXMsIGxhbmQsIGNvbmRvcywgYXBhcnRtZW50?= From: Stocklot Trading X-ASG-Orig-Subj: =?TIS-620?B?otLCtOjHuSC66dK5ICy31ei01A==?= =?TIS-620?B?uSAspM254rQsIM2+0sPst+DB6bm37CAv?= =?TIS-620?B?IHNlbGwgcXVpY2tseSBob3VzZXMsIGxhbmQsIGNvbmRvcywgYXBhcnRtZW50?= To: Stocklot Trading Content-Type: multipart/alternative; boundary=e89a8fb20078ec4b1604d447da2c X-Gm-Message-State: ALoCoQmWHzXFAF3kpt6fGdTsAISh1eDxix27ySCtYxN63s62V1iRbbp9HvIQxRKjxrt1TGZ++njL X-Barracuda-Connect: mail-oa0-f41.google.com[209.85.219.41] X-Barracuda-Start-Time: 1359304988 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.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_MV0113c, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121059 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --e89a8fb20078ec4b1604d447da2c Content-Type: text/plain; charset=TIS-620 Content-Transfer-Encoding: base64 ICBbaW1hZ2U6IElubGluZSBpbWFnZSAxXQ0KDQoNCsvSoeDBxey51enDuqHHubfo0rkgtenNp6LN zcDRwsHSILMgt9XoudXpIKTQDQoNCuDD1cK5pNizDQoNCrfo0rm31eih08XRp8HNp8vSxdmhpOnS IKvX6c0guunSuSC31ei01LkgpM254rQgzb7Sw+y34MHpubfsIKK50rS51ekNCg0K4MPSwdXF2aGk 6dKq0se16NKnu8PQ4LfIt9XoodPF0afL0iCr1+nNuunSuSC31ei01LkgpM254rQgzb7Sw+y34MHp ubfsDQrjubvD0OC3yOS3wg0KDQrjueCitSChw9in4Le+LCDgqtXCp+PLwegswNngoee1LCDgodLQ ysHYwiwgocPQutXoICzK2MPSybjSudUg4cXQIL7Rt8LSDQosqsW62MPVDQoNCuLNodLKILfV6LTV 4cXQ4LvNw+zgq+e5tey31eio0OS06bzZ6avX6c3ktOngw+fHIOGk6A0KDQrFp7vD0KHSyCCh0brg x+e65Ku17ODD0iogV1dXLlNUT0NLTE9UVFJBRElORy5ORVQgKiAzIOC01825IDMwMCC60rfgt+jS udHpuQ0Kw8fB4qbJs9K30ejH4sWh4rTCIEdvb2dsZSBBZFdvcmRzDQoNCsq546ggtdS0tejNtOjH uSDhxdAgotLCtOjHuQ0KDQqizbqk2LOk6NANCg0K4LvU6cUgLjA4MyAzNjcyIDkxNCAgRU1BSUw6 IGFwcGxlQHN0b2NrbG90dHJhZGluZy5uZXQNCg0KU1RPQ0tMT1RUUkFESU5HLkNPLkxURA0KKldX Vy5TVE9DS0xPVFRSQURJTkcuTkVUKjxodHRwOi8vV1dXLlNUT0NLTE9UVFJBRElORy5ORVQ+DQoN CiC6w9TJ0bcgyrXqzaTF5823IOC3w7S01OmnIKjTodG0DQoNCjkgy8HZ6Lrp0rkgyNTD1Lngt74g OCCrLsjD1bTo0rkgMjIgtrm5IMjD1bmkw9S5t8PsDQoNCrUuutKn4aHpxyDNLrrSp77F1SCoLiDK 2MG3w7vD0qHSwyAxMDU0MA0KDQosLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCws LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCws LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsDQoNClNvcnJ5IGZvciB0aGUgaW5jb252 aWVuY2UgaWYgeW91IGRvbid0IHdpc2ggdG8gcmVjZWl2ZSB0aGlzIGVtYWlsDQoNCkRlYXIgS2h1 bg0KDQpXZSBhcmUgbG9va2luZyBmb3IgY3VzdG9tZXJzIHdobyBzYWxlL2J1eSB0aGVyZSBwcm9w ZXJ0eSBsaWtlDQpob3VzZSxsYW5kLGNvbmRvIGFuZCBhcGFydG1lbnQNCg0KT24gdGhlIG1vbWVu dCB3ZSBoYXZlIHRvIG1hbnkgY3VzdG9tZXJzIHdobyB3YW50IHRvIGJ1eSBhIGhvdXNlLGxhbmQs Y29uZG8NCmFuZCBhcGFydG1lbnQgaW4gVGhhaWxhbmQuDQoNCkluIHRoZSBBcmVhIEJhbmdrb2ss IENoaWFuZyBNYWksIFBodWtldCwgS29oIFNhbXVpLCBLcmFiaSwgU3VyYXQgVGhhbmkgYW5kDQpQ YXR0YXlhLCBDaG9uYnVyaS4NCg0KQ2hhbmNlIHRvIHNlbGwgcXVpY2tseQ0KDQpBZHZlcnRpc2lu ZyBvbiBvdXIgd2Vic2l0ZQ0KKldXVy5TVE9DS0xPVFRSQURJTkcuTkVUKjxodHRwOi8vV1dXLlNU T0NLTE9UVFJBRElORy5ORVQ+DQozIE1vbnRocyAzMDAgQmFodCBpbmNsIGFkdmVydGlzaW5nIHdv cmxkd2lkZSBieSBnb29nbGUgYWR3b3Jkcw0KDQpQbGVhc2UgY29ubmVjdCB1cyBhbmQgc2FsZSBx dWljayB5b3VyIHByb3BlcnR5DQpUaGFuayB5b3UNCg0KUGxlLjA4MyAzNjcyIDkxNCAgRU1BSUw6 IGFwcGxlQHN0b2NrbG90dHJhZGluZy5uZXQNCg0KU3RvY2tsb3QgVHJhZGluZyBDby4sIEx0ZA0K DQo5IE0uU2lyaW50aGVwIDggU29pIFNyaWRhbiAyMiwgU3JpbmFrYXJpbiBSb2FkLCBCYW5nIGth ZW8gQmFuZyBwaGxpLCBTYW11dA0KUHJha2FuLA0KDQpCYW5na29rIDEwNTQwIFRoYWlsYW5kDQoN Cg0KDQoNCg0KLS0gDQoqRkVFTCBGUkVFIFRPIENPTlRBQ1QgVVMgPj4+Pj4+Pj4qIGluZm9Ac3Rv Y2tsb3R0cmFkaW5nLm5ldA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqU3RvY2tsb3QgVHJhZGluZyBDby4sIEx0ZCoNCipDb250 YWN0OiBEYW1pYW4gQmF1bWxlcioNCipUZWw6IDA4NDcyNDEwMjgqDQoqaW5mb0BzdG9ja2xvdHRy YWRpbmcubmV0Kg0KKnd3dy5zdG9ja2xvdHRyYWRpbmcubmV0DQoNCg0KKg0K --e89a8fb20078ec4b1604d447da2c Content-Type: text/html; charset=TIS-620 Content-Transfer-Encoding: quoted-printable

    =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EA=F3=F0=F1=E0:
     
    1. =CF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2= =E0=ED=E8=E5 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =EA=E0=E4=F0=EE=E2=FB=F5= =F1=EB=F3=E6=E1. =20 =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D2=CA =D0=D4.
     
    2. =D3=ED=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E5 =F4=EE= =F0=EC=FB =E8 =EF=F0=E0=E2=E8=EB=E0 =E8=F5 =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF= . =D3=F7=E5=F2 =EA=E0=E4=F0=EE=E2=20 (=EA=E0=F0=F2=EE=F7=EA=E0 =D2-2).
     
    3. =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=E0 =EF=E5=F0=F1= =EE=ED=E0=EB=E0:
    =95 =C4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4= =E8=EC=FB=E5 =E4=EB=FF=20 =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF =F2=F0=F3=E4=EE=E2=FB=F5 =EE=F2=ED=EE=F8=E5= =ED=E8=E9.
    =95 =D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =F0=E0=E1=EE= =F2=EE=E4=E0=F2=E5=EB=E5=E9 =EF=F0=E8 =EF=F0=E8=E5=EC=E5 =ED=E0=20 =F0=E0=E1=EE=F2=F3.
    =95 =CF=EE=E4=E0=F7=E0 =E2=E0=EA=E0=ED=F1=E8=E8 =E8= =EE=F2=EA=E0=E7 =E2 =EF=F0=E8=E5=EC=E5 =ED=E0 =F0=E0=E1=EE=F2=F3.
     
    4. =CF=F0=E0=E2=EE=E2=FB=E5 =F0=E5=E6=E8=EC=FB =F0=E0=F1= =F1=F2=E0=ED=EE=E2=EA=E8 =EA=E0=E4=F0=EE=E2 =E2 =EE=F0=E3=E0=ED=E8=E7=E0=F6= =E8=E8:
    =95=20 =CF=E5=F0=E5=E2=EE=E4 =ED=E0 =E4=F0=F3=E3=F3=FE =EF=EE=F1=F2=EE=FF=ED=ED=F3= =FE =F0=E0=E1=EE=F2=F3 =E8 =EF=E5=F0=E5=EC=E5=F9=E5=ED=E8=E5.
    =95 =D1=EE= =E2=EC=E5=F9=E5=ED=E8=E5 =EF=F0=EE=F4=E5=F1=F1=E8=E9=20 (=E4=EE=EB=E6=ED=EE=F1=F2=E5=E9).
     
    5. =CF=EE=F0=FF=E4=EE=EA =F3=E2=EE=EB=FC=ED=E5=ED=E8=FF= =EF=E5=F0=F1=EE=ED=E0=EB=E0:
    =95 =CF=F0=E5=EA=F0=E0=F9=E5=ED=E8=E5 =F2= =F0=F3=E4=EE=E2=EE=E3=EE=20 =E4=EE=E3=EE=E2=EE=F0=E0 (=F0=E0=E7=EB=E8=F7=ED=FB=E5 =E2=E0=F0=E8=E0=ED=F2= =FB)
    =95 =CF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE =F0=E0=F1=F7=E5=F2=E0. =C2= =FB=F5=EE=E4=ED=EE=E5 =EF=EE=F1=EE=E1=E8=E5.
     
    6. =C2=E8=E4=FB =F2=F0=F3=E4=EE=E2=FB=F5 =E4=EE=E3=EE=E2= =EE=F0=EE=E2. =CE=E1=FF=E7=E0=F2=E5=EB=FC=ED=FB=E5 =E8 =E4=EE=EF=EE=EB=ED= =E8=F2=E5=EB=FC=ED=FB=E5=20 =F3=F1=EB=EE=E2=E8=FF =D2=F0=F3=E4=EE=E2=EE=E3=EE =E4=EE=E3=EE=E2=EE=F0=E0= .
     
    7. =C2=E8=E4=FB =F2=F0=F3=E4=EE=E2=FB=F5 =EA=ED=E8=E6=E5= =EA. =D5=F0=E0=ED=E5=ED=E8=E5 =E8 =F3=F7=E5=F2 =F2=F0=F3=E4=EE=E2=FB=F5 =EA= =ED=E8=E6=E5=EA.=20
               &nb= sp;           &nbs= p;            = ;         =20
    8. =D1=E8=F1=F2=E5=EC=E0 =EE=EF=EB=E0=F2=FB =F2=F0=F3=E4=E0. =C7=E0=F0= =E0=E1=EE=F2=ED=E0=FF =EF=EB=E0=F2=E0. =CF=F0=E5=EC=E8=F0=EE=E2=E0=ED=E8=E5= .
     
    9. =C5=E6=E5=E3=EE=E4=ED=FB=E5 =EE=F2=EF=F3=F1=EA=E0.&n= bsp; =C1=EE=EB=FC=ED=E8=F7=ED=FB=E9 =EB=E8=F1=F2.  =D1=F2=F0=E0=F5=EE= =E2=EE=E9=20 =F1=F2=E0=E6.
     
    10. =CF=E5=F0=E8=EE=E4=E8=F7=E5=F1=EA=E8=E5 =EC=E5=E4=E8= =F6=E8=ED=F1=EA=E8=E5 =EE=E1=F1=EB=E5=E4=EE=E2=E0=ED=E8=FF =F0=E0=E1=EE=F2= =ED=E8=EA=EE=E2. =CD=EE=E2=EE=E5 =E2=20 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E5.
     
    11. =CD=EE=E2=FB=E5 =F1=F0=EE=EA=E8 =F5=F0=E0=ED=E5=ED=E8= =FF =EA=E0=E4=F0=EE=E2=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =CD=EE= =EC=E5=ED=EA=EB=E0=F2=F3=F0=E0=20 =E4=E5=EB.
     
    12. =CF=F0=EE=E2=E5=F0=EA=E8, =EE=F1=F3=F9=E5=F1=F2=E2=EB= =FF=E5=EC=FB=E5 =C3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 =E8=ED=F1=EF= =E5=EA=F6=E8=E5=E9 =F2=F0=F3=E4=E0.=20 =CE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC =E8 =F1=E0=ED=EA=F6=E8=E8 =EF= =F0=E8 =ED=E0=F0=F3=F8=E5=ED=E8=E8 =D2=CA =D0=D4. =CF=EE=F0=FF=E4=EE=EA =EE= =E1=E6=E0=EB=EE=E2=E0=ED=E8=FF. =CE=F2=F1=F2=F0=E0=ED=E5=ED=E8=E5=20 =EE=F2 =F0=E0=E1=EE=F2=FB.
     
    ------------------------------------------------------------= ------
    =CF=CE=20 =CE=CA=CE=CD=D7=C0=CD=C8=C8 =CA=D3=D0=D1=C0 =C2=DB=C4=C0=C5=D2=D1=DF =D3=C4= =CE=D1=D2=CE=C2=C5=D0=C5=CD=C8=C5 =CE =CF=CE=C2=DB=D8=C5=CD=C8=C8=20 =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6=C8=C8.
    --------------------------------= ----------------------------------
     
    =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8= =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE= =20 =F2=E5=EB=E5=F4=EE=ED=F3:
    +7 * =CF=E5=F2=E5=F0=E1=F3=F0=E3 * 642 = ^ o=F7 ^ 89
     
    =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
    =C4=EE=EB=EE=F2=EE=E2= =E0 =C0=ED=ED=E0 =CE=EB=E5=E3=EE=E2=ED=E0
    =EC=E5=ED=E5=E4=E6=E5=F0 =EF= =EE =F0=E0=E1=EE=F2=E5 =F1=20 =EA=EB=E8=E5=ED=F2=E0=EC=E8
    =F2=E5=EB.: 8 * 812 * 6=D72 -- =EE4= 89
    ------=_NextPart_000_0851_01CDFF23.10EB3280-- From david@fromorbit.com Wed Jan 30 22:08:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3A2927F53 for ; Wed, 30 Jan 2013 22:08:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 284678F8039 for ; Wed, 30 Jan 2013 20:08:06 -0800 (PST) X-ASG-Debug-ID: 1359605283-04cbb00c64236750001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ZpYfCEOdR7whwZ5u for ; Wed, 30 Jan 2013 20:08:04 -0800 (PST) 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: AgAFAFLsCVG2/3vK/2dsb2JhbAArGoVfuTwWc4IeAQEEATo0CwULCAMNCwklDwUoIROICwUNLME8kQwDlgyGEQOKOIML Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Jan 2013 14:38:03 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0lRJ-0003pu-O4; Thu, 31 Jan 2013 15:07:53 +1100 Date: Thu, 31 Jan 2013 15:07:48 +1100 From: Dave Chinner To: CAI Qian Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org, linux-kernel Subject: Re: 3.8-rc5 xfs corruption Message-ID: <20130131040748.GH32297@disturbed.disaster> X-ASG-Orig-Subj: Re: 3.8-rc5 xfs corruption Mail-Followup-To: CAI Qian , xfs@oss.sgi.com, linux-xfs@vger.kernel.org, linux-kernel References: <614607656.11545086.1359601991846.JavaMail.root@redhat.com> <473604401.11548931.1359602207833.JavaMail.root@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <473604401.11548931.1359602207833.JavaMail.root@redhat.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: 1359605283 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_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121386 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Jan 30, 2013 at 10:16:47PM -0500, CAI Qian wrote: > Hello, > > (Sorry to post to xfs mailing lists but unsure about which one is the > best for this.) Trimmed to just xfs@oss.sgi.com. > I have seen something like this once during testing on a system with a > EMC VNX FC/multipath back-end. This is a trace from the verifier code that was added in 3.8-rc1 so I doubt it has anything to do with any problem you've seen in the past.... Can you tell us what workload you were running and what hardware you are using as per: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F As it is, if you mounted the filesystem after this problem was detected, log recovery probably propagated it to disk. I'd suggest that you run xfs_repair -n on the device and post the output so we can see if any corruption has actaully made it to disk. If no corruption made it to disk, it's possible that we've got the incorrect verifier attached to the buffer. > [ 3025.063024] ffff8801a0d50000: 2e 2e 2f 2e 2e 2f 75 73 72 2f 6c 69 62 2f 6d 6f ../../usr/lib/mo The start of a block contains a path and the only type of block that can contain this format of metadata is remote symlink block. Remote symlink blocks don't have a verifier attached to them as there is nothing that can currently be used to verify them as correct. I can't see exactly how this can occur as stale buffers have the verifier ops cleared before being returned to the new user, and newly allocated xfs_bufs are zeroed before being initialised. I really need to know what you are doing to be able to get to the bottom of it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 31 00:13:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EAB937F50 for ; Thu, 31 Jan 2013 00:13:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB83E304059 for ; Wed, 30 Jan 2013 22:13:31 -0800 (PST) X-ASG-Debug-ID: 1359612809-04bdf0231a257a00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yjYl7lFWDtAqeKAa for ; Wed, 30 Jan 2013 22:13:29 -0800 (PST) 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: AgAFAOEKClG2/3vK/2dsb2JhbABFhV+5QhZzgh4BAQQBDiwrFAULCAMNAQoJJQ8FKCETG4dwBQ3Bao0ng2UDlgyGEQOKOIMLgVM Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Jan 2013 16:43:27 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0nOj-0004PV-N1; Thu, 31 Jan 2013 17:13:21 +1100 Date: Thu, 31 Jan 2013 17:13:21 +1100 From: Dave Chinner To: Ben Myers Cc: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option Message-ID: <20130131061321.GI32297@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: add agskip=value mount option Mail-Followup-To: Ben Myers , rjohnston@sgi.com, xfs@oss.sgi.com References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> <20130130010430.GE7255@disturbed.disaster> <20130130233203.GP27055@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130130233203.GP27055@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: 1359612809 X-Barracuda-URL: http://192.48.157.11: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.2.121391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 30, 2013 at 05:32:03PM -0600, Ben Myers wrote: > Hey Dave, > > On Wed, Jan 30, 2013 at 12:04:30PM +1100, Dave Chinner wrote: > > On Tue, Jan 29, 2013 at 09:39:15AM -0600, rjohnston@sgi.com wrote: > > > The agskip mount option specifies the allocation group, (AG) for a new > > > file, relative to the start of the last created file. agskip has the > > > opposite effect of the rotorstep system tunable parameter. Each > > > new file to be placed in the location lastAG + agskipValue, > > > where lastAG is the allocation group of the last created file. > > > > > > For example, agskip=3 means each new file will be allocated three AGs away > > > from the starting AG of the most recently created file. > > > > Overall, I'm wondering if this is the right way to approach this > > problem. > > We'll have to make sure we all understand the problem we're trying to solve > with this before going too far. I'm in no doubt about what it is for - I know the exact history of this patch and exactly what problems it was designed to solve because.... > > It only really works correctly (in terms of distribution of > > files/metadata) for fixed volume sizes (i.e. homogenous layouts) - > > the common case where a skip is useful is after growing a filesystem > > onto a new volume. It's rare that the new volume is the same as the > > existing volumes, so it's hard to set a skip value that reliably > > alternates between old and new volumes. > > Based upon what I've read so far on the internal bug when this was introduced, > this is more about being able to utilize all allocation groups in a filesystem > with many concats. ... I was still at SGI when that bug was raised and the ag_skip patch was written for the "Enhanced XFS" module in the NAS product SGI was selling at the time. It was written as a quick stopgap by the NAS product engineers to counter the problems being seen on that product due to the nature of the "concat of stripes" storage configuration that product used. It was never was proposed as an upstream solution because I NACKed it internally. Indeed, at the time I was already well down the path of fixing the problem in XFS in a much more capable way. i.e. this stuff: http://oss.sgi.com/archives/xfs/2009-02/msg00250.html http://oss.sgi.com/archives/xfs/2009-02/msg00253.html And that was planned to replace the agskip hack in the next NAS product release. Unfortunately, once I left SGI nobody picked up the work I was doing and "Enhanced XFS" turned into a zombie. Indeed, agskip was posted back here in 2009 as part of the same code dump as the above patches when the XFS group in Melbourne was let go: http://oss.sgi.com/archives/xfs/2009-02/msg00252.html There's a bit of history to this patch ;) > It's not so much related to balance after growing a > filesystem (which is another interesting problem). The info should be added to > this series and be reposted. Actually, that was one of the problems the patch solved on the NAS product. It was a secondary problem as growing wasn't a common operation, but it was definitely a concern.... > > We talked about this allocation distribution problem last march when > > we met at LSF, and I thought we agreed that pushing > > agskip/agrotorstep mount options upstream was not the way we were > > going to solve this problem after I outlined how I planned to solve > > this problem. > > If we can come up with something better, that's great. But AFAICT the problem > still needs to be addressed. This is just one way to do it. I'm not saynig that it doesn't need to be addressed. I'm just saying the sam ething I said 5 years ago: there's no point pushing it into mainline when far more comprehensive solution is just around the corner.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stefanrin@gmail.com Thu Jan 31 01:35:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 750447F50 for ; Thu, 31 Jan 2013 01:35:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 53DC48F8039 for ; Wed, 30 Jan 2013 23:35:54 -0800 (PST) X-ASG-Debug-ID: 1359617752-04bdf0231a25d900001-NocioJ Received: from mail-ye0-f174.google.com (mail-ye0-f174.google.com [209.85.213.174]) by cuda.sgi.com with ESMTP id ZQ7vPuyWt69BLVS2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 30 Jan 2013 23:35:53 -0800 (PST) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] Received: by mail-ye0-f174.google.com with SMTP id m3so490651yen.5 for ; Wed, 30 Jan 2013 23:35:52 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type; bh=Wdaefn6EQ2545PBJfQfmls8MocxPM1iVlErIT1WkR9A=; b=EasPjzQ/LOMlCKXSoSVyt+LeP0UNC0g9KWj5Xgavs5EqW7BWvDhnjVlCy4pwl6kAOE Ms6sQHAdptE2mTFczNtxaMeW9DleTlWmn3SFJK8CSrqL72nXqDgn6xhNk4mIVYLX/kvB VRj8uqFdzJbfVZTMNaaMmRcXImOxkd2dMmlFvMc00NQcUKMvogwuaUMfOkYbHHXTDZ15 aIrPlbnxvRGF+w2dT8OQ5ErLpeRa/Pwh0cQoAJGTLC1hZQEtt+Qg0cSzzkOqmDAOdq8I FCi9ccMnRK/I5HxYzbpttjR4WZL35OPrUcX4tW79cA+rMG+FBTFpkAV3IUg1ZvlyxW8V u0MA== MIME-Version: 1.0 X-Received: by 10.236.147.174 with SMTP id t34mr9172481yhj.70.1359617752445; Wed, 30 Jan 2013 23:35:52 -0800 (PST) Received: by 10.236.72.97 with HTTP; Wed, 30 Jan 2013 23:35:52 -0800 (PST) In-Reply-To: <20130130234650.GE32297@disturbed.disaster> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> <20130130234650.GE32297@disturbed.disaster> Date: Thu, 31 Jan 2013 08:35:52 +0100 Message-ID: Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: Stefan Ring X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: Tom , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ye0-f174.google.com[209.85.213.174] X-Barracuda-Start-Time: 1359617752 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.2.121397 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 > So the filesystems are unmounted.... > > And this says the filesystem is still mounted. Why? When I last had a problem with shutdown, it was because of mount namespaces. You can unmount all day long, but as long as there is a mount still open in a namespace, nothing will get unmounted. This was on Fedora though; don't know if RHEL 5.x makes use of namespaces. From qcai@redhat.com Thu Jan 31 02:01:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B88DB7F4E for ; Thu, 31 Jan 2013 02:01:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 961C830405F for ; Thu, 31 Jan 2013 00:01:22 -0800 (PST) X-ASG-Debug-ID: 1359619278-04cb6c391224b400001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id mzwHrMzDDf2sf6Et for ; Thu, 31 Jan 2013 00:01:18 -0800 (PST) X-Barracuda-Envelope-From: qcai@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0V81AI1024721; Thu, 31 Jan 2013 03:01:10 -0500 Date: Thu, 31 Jan 2013 03:01:10 -0500 (EST) From: CAI Qian To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org, linux-kernel Message-ID: <2103902716.11642129.1359619270232.JavaMail.root@redhat.com> In-Reply-To: <20130131040748.GH32297@disturbed.disaster> Subject: Re: 3.8-rc5 xfs corruption MIME-Version: 1.0 X-ASG-Orig-Subj: Re: 3.8-rc5 xfs corruption Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.66.13.37] X-Mailer: Zimbra 7.2.0_GA_2669 (ZimbraWebClient - FF3.0 (Linux)/7.2.0_GA_2669) X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1359619278 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121399 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 ----- Original Message ----- > From: "Dave Chinner" > To: "CAI Qian" > Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org, "linux-kernel" > Sent: Thursday, January 31, 2013 12:07:48 PM > Subject: Re: 3.8-rc5 xfs corruption > > On Wed, Jan 30, 2013 at 10:16:47PM -0500, CAI Qian wrote: > > Hello, > > > > (Sorry to post to xfs mailing lists but unsure about which one is > > the > > best for this.) > > Trimmed to just xfs@oss.sgi.com. Thanks for quick response, Dave. > > > I have seen something like this once during testing on a system > > with a > > EMC VNX FC/multipath back-end. > > This is a trace from the verifier code that was added in 3.8-rc1 so > I doubt it has anything to do with any problem you've seen in the > past.... > > Can you tell us what workload you were running and what hardware you > are using as per: > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F This was the system, - AMD Opteron(tm) Processor 4130 (1 socket, 4 cores) - PowerEdge R415 - 8G memory - mptsas local disks Software version, - xfsprogs-3.1.10 The workload was running some fs_mark, syscalls tests, some nfs/cifs connectathon tests, memory, libhugetlbfs tests, and some dynamic debug (Documentation/dynamic-debug-howto.txt) tests. > > As it is, if you mounted the filesystem after this problem was > detected, log recovery probably propagated it to disk. I'd suggest > that you run xfs_repair -n on the device and post the output so we > can see if any corruption has actaully made it to disk. If no > corruption made it to disk, it's possible that we've got the > incorrect verifier attached to the buffer. The system was taken away from me, so I can only occupy it again later if needed. Regards, CAI Qian > > > [ 3025.063024] ffff8801a0d50000: 2e 2e 2f 2e 2e 2f 75 73 72 2f 6c > > 69 62 2f 6d 6f ../../usr/lib/mo > > The start of a block contains a path and the only > type of block that can contain this format of metadata is remote > symlink block. Remote symlink blocks don't have a verifier attached > to them as there is nothing that can currently be used to verify > them as correct. > > I can't see exactly how this can occur as stale buffers have the > verifier ops cleared before being returned to the new user, and > newly allocated xfs_bufs are zeroed before being initialised. I > really need to know what you are doing to be able to get to the > bottom of it.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > From lczerner@redhat.com Thu Jan 31 02:19:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 41C7D7F4E for ; Thu, 31 Jan 2013 02:19:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2A1B330406A for ; Thu, 31 Jan 2013 00:19:28 -0800 (PST) X-ASG-Debug-ID: 1359620367-04cb6c391224c450001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id O9THQ1XtpvjsZGOA for ; Thu, 31 Jan 2013 00:19:27 -0800 (PST) X-Barracuda-Envelope-From: lczerner@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 r0V8JQb4016389 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 31 Jan 2013 03:19:27 -0500 Received: from dhcp-1-104.brq.redhat.com (dhcp-1-104.brq.redhat.com [10.34.1.104]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0V8JN8h002573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 31 Jan 2013 03:19:26 -0500 Date: Thu, 31 Jan 2013 09:19:23 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lukas@dhcp-1-104.brq.redhat.com To: xfs@oss.sgi.com Subject: Xfs fails in xfstests 013 Message-ID: X-ASG-Orig-Subj: Xfs fails in xfstests 013 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.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359620367 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. I've just run xfstest 013 on xfs and it fails with this backtrace Jan 31 03:09:07 rhel6_vm1 kernel: ffff88020b6d1000: 78 78 78 78 78 78 78 78 78 78 2f 78 78 78 78 78 xxxxxxxxxx/xxxxx Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Internal error xfs_bmbt_verify at line 747 of file fs/xfs/xfs_bmap_btree.c. Caller 0xffffffffa025486e Jan 31 03:09:07 rhel6_vm1 kernel: Jan 31 03:09:07 rhel6_vm1 kernel: Pid: 8909, comm: xfsaild/sda Tainted: GF 3.8.0-rc5-orig+ #8 Jan 31 03:09:07 rhel6_vm1 kernel: Call Trace: Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_error_report+0x3f/0x50 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_corruption_error+0x5e/0x90 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bmbt_verify+0x80/0x1d0 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bmbt_write_verify+0xe/0x10 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] _xfs_buf_ioapply+0x65/0x150 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] ? try_to_wake_up+0x2b0/0x2b0 Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bdstrat_cb+0x65/0xd0 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_buf_iorequest+0x4f/0xa0 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bdstrat_cb+0x65/0xd0 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] __xfs_buf_delwri_submit+0x108/0x200 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfsaild_push+0x1b6/0x520 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] xfsaild+0x98/0x130 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfsaild_push+0x520/0x520 [xfs] Jan 31 03:09:07 rhel6_vm1 kernel: [] kthread+0xce/0xe0 Jan 31 03:09:07 rhel6_vm1 kernel: [] ? kthread_freezable_should_stop+0x70/0x70 Jan 31 03:09:07 rhel6_vm1 kernel: [] ret_from_fork+0x7c/0xb0 Jan 31 03:09:07 rhel6_vm1 kernel: [] ? kthread_freezable_should_stop+0x70/0x70 Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Corruption detected. Unmount and run xfs_repair Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): xfs_do_force_shutdown(0x8) called from line 1358 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa0226a85 Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Corruption of in-memory data detected. Shutting down filesystem Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Please umount the filesystem and rectify the problem(s) Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): xfs_log_force: error 5 returned. I can reproduce it every time with xfstest 013 on 3.8.0-rc5. -Lukas From relatsdeficcio@telefonica.net Thu Jan 31 05:37:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 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 372D97F51 for ; Thu, 31 Jan 2013 05:37:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 182E2304059 for ; Thu, 31 Jan 2013 03:37:29 -0800 (PST) X-ASG-Debug-ID: 1359632240-04cbb00c65258730001-NocioJ Received: from telefonica.net (impaqm1.telefonica.net [213.4.138.17]) by cuda.sgi.com with ESMTP id o6dBhDpzzygd4psA for ; Thu, 31 Jan 2013 03:37:21 -0800 (PST) X-Barracuda-Envelope-From: relatsdeficcio@telefonica.net X-Barracuda-Apparent-Source-IP: 213.4.138.17 Received: from IMPmailhost3.adm.correo ([10.20.102.124]) by IMPaqm1.telefonica.net with bizsmtp id ubM11k00S2h2L9m3MbdLVp; Thu, 31 Jan 2013 12:37:20 +0100 Received: from FIX ([83.61.192.209]) by IMPmailhost3.adm.correo with BIZ IMP id ubdK1k00o4XXqCb1jbdKxV; Thu, 31 Jan 2013 12:37:20 +0100 X-Brightmail-Tracker: AAAAAA== X-original-sender: relatsdeficcio@telefonica.net From: "La Lluna en un Cove" Subject: =?iso-8859-1?B?U2VsZWNjaW9uZW0gQXJ0aXN0ZXMgR3LgZmljcw==?= To: "xfs" X-ASG-Orig-Subj: =?iso-8859-1?B?U2VsZWNjaW9uZW0gQXJ0aXN0ZXMgR3LgZmljcw==?= Content-Type: multipart/alternative; charset="iso-8859-1"; boundary="DVnYxJqRQikGJF=_DGVSr2Z61x4eAScjgI" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Organization: LLEUC Date: Thu, 31 Jan 2013 12:37:22 +0100 X-Confirm-Reading-To: relatsdeficcio@telefonica.net Return-Receipt-To: relatsdeficcio@telefonica.net Disposition-Notification-To: relatsdeficcio@telefonica.net X-Barracuda-Connect: impaqm1.telefonica.net[213.4.138.17] X-Barracuda-Start-Time: 1359632241 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.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121413 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20130131113729.9D694106CE00@cuda.sgi.com> This is a multi-part message in MIME format --DVnYxJqRQikGJF=_DGVSr2Z61x4eAScjgI Content-Type: text/plain ; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable "La Lluna en un Cove =B7 Revista de Relats en Catal=E0" Busquem Artistes Gr=E0fics Proc=E9s de selecci=F3 obert Paguem en met=E0l=B7lic per les obres seleccionades Si voleu participar, informeu-vos-en: http://relatslallunaenuncove.blogspot.com Enlla=E7 directe a les instruccions de participaci=F3 (AUTORS LITERARI= S): http://relatslallunaenuncove.blogspot.com.es/p/enviar-relats-per-selec= cio.html Enlla=E7 directe a les instruccions de participaci=F3 (TRADUCTORS): http://relatslallunaenuncove.blogspot.com.es/p/enviament-de-traduccion= s-traductors.html Enlla=E7 directe a les instruccions de participaci=F3 (IL=B7LUSTRADORS= ): http://relatslallunaenuncove.blogspot.com.es/p/enviament-dillustracion= s.html --DVnYxJqRQikGJF=_DGVSr2Z61x4eAScjgI Content-Type: text/html ; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

    "La Lluna en un Cove =B7 R= evista de Relats en Catal=E0"

    Busquem Artistes Gr=E0fics

    =

    Proc=E9s de selecci=F3 obert

    Paguem en met=E0l=B7lic per les obres selecciona= des

     

    Si voleu participar, informeu-vos-en:=

    http://relatslallunaenuncove.blogspot.com<= /P>

     

     

     

     


    Enlla=E7 directe a les instruccions de participaci=F3= (AUTORS LITERARIS):

    http:/= /relatslallunaenuncove.blogspot.com.es/p/enviar-relats-per-seleccio.ht= ml


    Enlla=E7 directe a les instruccions de participaci=F3= (TRADUCTORS):

    http://relatslalluna= enuncove.blogspot.com.es/p/enviament-de-traduccions-traductors.html


    Enlla=E7 directe a les instruccions de participaci=F3= (IL=B7LUSTRADORS):

    http://relatslallunaenuncove.bl= ogspot.com.es/p/enviament-dillustracions.html


     

     

    --DVnYxJqRQikGJF=_DGVSr2Z61x4eAScjgI-- From thomas@habets.se Thu Jan 31 05:44:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D870A7F55 for ; Thu, 31 Jan 2013 05:44:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8900BAC001 for ; Thu, 31 Jan 2013 03:44:00 -0800 (PST) X-ASG-Debug-ID: 1359632637-04bdf0231d273650001-NocioJ Received: from mail-qc0-f172.google.com (mail-qc0-f172.google.com [209.85.216.172]) by cuda.sgi.com with ESMTP id XKhHoea2vIuj2t6L (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 31 Jan 2013 03:43:58 -0800 (PST) X-Barracuda-Envelope-From: thomas@habets.se X-Barracuda-Apparent-Source-IP: 209.85.216.172 Received: by mail-qc0-f172.google.com with SMTP id b25so1226174qca.3 for ; Thu, 31 Jan 2013 03:43:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=habets.se; s=google; h=x-received:mime-version:x-originating-ip:from:date:message-id :subject:to:content-type; bh=HG5sVyTxzgPL1XLMLlbDNUIB/L/PYITrRzvbwJn5NPY=; b=R2Vs3tbU9E6hw5H9O4iYkh/TkIDKQ//uE7T1SlGW9aoxyG8lMKJHs3B0BMI2bgN1yn LZQtaddipaEw4vHoRiUIBRgMX3fxa3Y4MjtwCp2d0AmITj4eM7E2yH+z1ZsWbZCGtoU6 qAxsudzLANVwvJJ21HgxaCM0WxV/48d9YKArQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:mime-version:x-originating-ip:from:date:message-id :subject:to:content-type:x-gm-message-state; bh=HG5sVyTxzgPL1XLMLlbDNUIB/L/PYITrRzvbwJn5NPY=; b=aF7Kdefo6YN84OnsdhYmvM3en05Ay3pZ7hn6gUUMPne5U2qCe/A1VOXAFBhm8VwUTs ooV+6r2AionNEAuYa7ZJI1kP0tyJludePFmSL2yvCrdgqo6GO49f6QuvrmekWrUEKyDt MO1KIwEOlEpSUah6JTcz23Yzf/lXva3zenBcbv62qRVF5FlhCeHSqystZyC4V/mzMfVo VK2TsmWYrSblngp4Z5N053IWD7oktwEs6q+s+19AKoC8233/MC9RakkQi3shKN3Oqduq 2lilpi4cypsNoG98omNRXKoNOvH+vsLzSLbBN0+ADURXBBO6+ExEHZf0mqW2wvd3auSt Sj/Q== X-Received: by 10.224.39.210 with SMTP id h18mr8561265qae.15.1359632637417; Thu, 31 Jan 2013 03:43:57 -0800 (PST) MIME-Version: 1.0 Received: by 10.49.29.98 with HTTP; Thu, 31 Jan 2013 03:43:37 -0800 (PST) X-Originating-IP: [86.169.109.101] From: Thomas Habets Date: Thu, 31 Jan 2013 11:43:37 +0000 Message-ID: Subject: 50% more blocks allocated than needed To: xfs@oss.sgi.com X-ASG-Orig-Subj: 50% more blocks allocated than needed Content-Type: text/plain; charset=UTF-8 X-Gm-Message-State: ALoCoQlIJykqkygvpDhn3oMbcJ3ntsIe6LaLtPKRtDeCU/7+nsr4FzZUPNQl4Iosvure3W3LgybS X-Barracuda-Connect: mail-qc0-f172.google.com[209.85.216.172] X-Barracuda-Start-Time: 1359632638 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.2.121413 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 Hi. I've had some files on an XFS filesystem that use way more blocks than they need. That is, st_size=50MB and st_blocks*512= about 68MB. The files were downloaded with wget on a somewhat unreliable 3G connection (50-500kBps) and sometimes defragging (xfs_fsr) fixes it, but sometimes not. If st_blocks*512_;. ./_" }; } me_t; From macky.sheroiynn@mail.ru Thu Jan 31 07:41:23 2013 Return-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=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C3297F4E for ; Thu, 31 Jan 2013 07:41:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D27D8F8050 for ; Thu, 31 Jan 2013 05:41:19 -0800 (PST) X-ASG-Debug-ID: 1359639675-04bdf0231a278370001-NocioJ Received: from mysql.plihoimal.com (mysql.plihoimal.com [111.67.206.45]) by cuda.sgi.com with ESMTP id oW1Nd6IQgHrlo1Os; Thu, 31 Jan 2013 05:41:16 -0800 (PST) X-Barracuda-Envelope-From: macky.sheroiynn@mail.ru X-Barracuda-Apparent-Source-IP: 111.67.206.45 Date: Thu, 31 Jan 2013 17:42:27 +0400 From: =?Windows-1251?B?ymHqIPPi5evo9+jy/CDq7u3i5fDx6P4g7WEg8eDp8mUg52Eg7uTo7SDsZfH/9g==?= Reply-To: =?Windows-1251?B?ymHqIPPi5evo9+jy/CDq7u3i5fDx6P4g7WEg8eDp8mUg52Eg7uTo7SDsZfH/9g==?= X-Priority: 3 (Normal) Message-ID: <745767562.20130131043164@mysql.plihoimal.com> To: xfs@oss.sgi.com Subject: =?Windows-1251?B?z3BvcPviIOIgyO3y5XDtZfItzODw6uXy6O3j5Q==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?Windows-1251?B?z3BvcPviIOIgyO3y5XDtZfItzODw6uXy6O3j5Q==?= Content-Type: text/html; charset=windows-1251 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mysql.plihoimal.com[111.67.206.45] X-Barracuda-Start-Time: 1359639675 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, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121420 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message

    p ee-

    K e a e e a c co a o ec?

    22 ea 2013
    . e, . ac Oo, 10-a, o. 6
    c. eo "ee"

    (044) 362-7625

    H a


    pa e p- a 550 ac a o c p, o o, a x p a
    oe a.
    H ce oo a e e o p!


    op

    • Cac ao epe-. B e oc a. pa e o o a oe o pe- p oa.
    • p o B ee o pao c e Web-Promo, p ce o Google Analytics, opo a o c c o po.
    • A B ex po Web-Promo, ep cea o Google Adwords Google Analytics, co oa a op o e-.
    • p a pe o SMM K. Hc e oa c SMM. Pa e pe e, a, op pop.


    e epe-

    • O p a ea, e a, c- p oa.

    o ae a, a oe o ca
    • a o a a e a oc
    • co o a ao ep-. 
    • o ao a p oa pea a. 
    o, e ca p oce, e cx aa. 

    SEO – o o a, a pa oo aaa 

    • SEO — c o.
    • oe o o c op? 
    • Ka a pe p p a e? 
    a, o aoe SEO a e c po p po a

    C co (e) a o c c, a ec o e oxo co ce 

    • Oo seo-oa.
    • Ka oe seo-ec c oo e o?
    O eo a ae ca c po p e oo o oc ce..

    Ko a 

    • Ko pa e e.
    • a e co e, a o o c? 
    • o ee e pea pe-. 
    a o o, a oo o p aa o ce oe

    E-mail e – a oop p 

    • C e ca?
    • Oco e o o a. 
    • o o o o e e eo a? 
    a, a o ce c oo e-mail-ap.

    o ce (SMM) – o o a c x e 

    • o oa c -e.
    • o a ap a o? 
    • Ka ee a p? 
    • a ce — ooe aa poa.
    • K e o o? 

    Web-aa – a p e ep 

    • o a o ep?
    • c ce cc. 
    • e a o p ce a?
    • p p — o c a ae?
    • ao, a ep oc o x ce? 
    • Ka a e e oa o oa? 
    a o e Web-a

    C EH 

    • 9:00 ao e
    • 9:30 o cea
    • 18:00 oa c

    O 

    • 1050 p. a o ca
    • oa o a pac e H pe
    • e aa o a o e
    • B oo o: o p, e-p, o e.
    • B a c Wi-Fi
    • p c x e a - a 10%

    EC PB EH 

    (044) 362-7625

    a a


    pc p a e, ec oae a ac, o e eaee x oa.
    o opo oc oe a ce co o apec: E-mail

    From bfoster@redhat.com Thu Jan 31 11:42:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7882F7F4E for ; Thu, 31 Jan 2013 11:42:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 660EC304048 for ; Thu, 31 Jan 2013 09:42:47 -0800 (PST) X-ASG-Debug-ID: 1359654163-04cb6c391327aea0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id N7whEh5VfYPVbZsE; Thu, 31 Jan 2013 09:42:44 -0800 (PST) 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 r0VHgaC0011946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Jan 2013 12:42:36 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0VHgYGO017265; Thu, 31 Jan 2013 12:42:35 -0500 Message-ID: <510AADC5.3000305@redhat.com> Date: Thu, 31 Jan 2013 12:45:41 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Mark Tinguely , xfs@oss.sgi.com, david@fromorbit.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> <20130130060551.GG7255@disturbed.disaster> <5109291E.6090303@sgi.com> <51094423.8000703@redhat.com> <20130130215934.GB32297@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push In-Reply-To: <20130130215934.GB32297@disturbed.disaster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1359654163 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 On 01/30/2013 04:59 PM, Dave Chinner wrote: > On Wed, Jan 30, 2013 at 11:02:43AM -0500, Brian Foster wrote: >> (added Dave and the list back on CC) >> >> On 01/30/2013 09:07 AM, Mark Tinguely wrote: >>> On 01/30/13 00:05, Dave Chinner wrote: >>>> On Tue, Jan 29, 2013 at 03:42:35PM -0500, Brian Foster wrote: ... >> >> Thanks guys. This certainly looks nicer than messing with the lock >> wrapper, but is it susceptible to the same problem? In other words, does >> this fix the problem or just tighten the window? > > That's what I need to think about more - the only difference here is > that we are checking the flag before the down_trylock() instead of > after.... > >> So if the buf lock covers the pinned state (e.g., buffer gets locked, >> added to a transaction, the transaction gets committed and pins and >> unlocks the buffer, IIUC) and the stale state (buf gets locked, added to >> a new transaction and inval'd before the original transaction was >> written ?), but we don't hold the buf lock in xfs_buf_item_push(), how >> can we guarantee the state of either doesn't change between the time we >> check the flags and the time the lock fails? > > ... but the order of them being set and checked may be significant > and hence checking the stale flag first might be sufficient to avoid > the pin count race and hence the log force. Hence this might just > need a pair of memory barriers - one here and one in xfs_buf_stale() > - to ensure that we always see the XBF_STALE flag without needing to > lock the buffer first. > I _think_ I follow your train of thought. If we're racing on the pin check, presumably the lock holder is committing the transaction and we should either already see the buffer being stale, being pinned or we should get the lock (assuming the order is: stale, pinned, unlocked). That aside for a moment, here's some specific tracepoint (some of which I've hacked in) data for when the recursion occurs: xfsalloc/5-3220 [005] 4304.223158: xfs_buf_item_stale: dev 253:3 bno 0x847feb28 len 0x1000 hold 2 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|STALE|PAGES recur 0 refcount 1 bliflags |DIRTY|STALE lidesc 0xffff88067ada5610 liflags IN_AIL smallfile_cli.p-3702 [007] 4304.223209: xfs_buf_item_format_stale: dev 253:3 bno 0x847feb28 len 0x1000 hold 2 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|STALE|PAGES recur 0 refcount 1 bliflags |STALE lidesc 0xffff88067ada5610 liflags IN_AIL ... xfsaild/dm-3-3695 [002] 4304.223217: xfs_buf_item_trylock: dev 253:3 bno 0x847feb28 len 0x1000 hold 2 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|STALE|PAGES recur 0 refcount 1 bliflags |STALE lidesc 0xffff88067ada5610 liflags IN_AIL smallfile_cli.p-3702 [007] 4304.223217: xfs_buf_item_pin: dev 253:3 bno 0x847feb28 len 0x1000 hold 2 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|STALE|PAGES recur 0 refcount 1 bliflags |STALE lidesc 0xffff88067ada5610 liflags IN_AIL ... xfsaild/dm-3-3695 [002] 4304.223219: xfs_buf_cond_lock_log_force: dev 253:3 bno 0x847feb28 len 0x1000 hold 2 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|STALE|PAGES caller xfs_buf_item_trylock [NOTES: - I moved xfs_buf_item_trylock up to after the pinned check but before the trylock. - xfs_buf_item_stale() is in xfs_trans_binval(). This was an oversight, as I was looking at bli_flags, but still illustrates the sequence.] ... so as expected, the buffer is marked stale, we attempt the trylock, the buf is pinned, we run the log force and we're dead. >From the looks of the trace, I'd expect an additional stale check to eliminate the ability to reproduce this, but that doesn't necessarily make it correct of course. Regardless, I'm putting that to the test now and letting it run for a bit while we get this sorted out. I also need to stare at the code some more. My pending questions are: - Is it always reasonable to to assume/consider a stale buf as pinned in the context of xfsaild? - If we currently reproduce the following sequence: A xfsaild stale (!pinned) ==> trylock() pinned (!trylock && pinned && stale) ==> xfs_log_force() (boom) ... what prevents the following sequence from occurring sometime in the future or with some alternate high-level sequence of events? A xfsaild locked (!pinned && !stale) ==> trylock() pinned stale (!trylock && pinned && stale) ==> xfs_log_force() Granted the window is seriously tight, but is there some crazy sequence where we could race with the pin count and the stale state? E.g., I notice some error or forced shutdown sequences mark buffers as stale, etc. Brian ... > Cheers, > > Dave. > From bfoster@redhat.com Thu Jan 31 12:04:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B52B47F4E for ; Thu, 31 Jan 2013 12:04:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94726304067 for ; Thu, 31 Jan 2013 10:04:17 -0800 (PST) X-ASG-Debug-ID: 1359655456-04cb6c391227bb90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VKt8BQGuiRBzMhtw for ; Thu, 31 Jan 2013 10:04:16 -0800 (PST) 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 r0VI4BpL018506 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Jan 2013 13:04:14 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0VI4ALg023643; Thu, 31 Jan 2013 13:04:11 -0500 Message-ID: <510AB2D5.2080600@redhat.com> Date: Thu, 31 Jan 2013 13:07:17 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Thomas Habets CC: xfs@oss.sgi.com Subject: Re: 50% more blocks allocated than needed References: X-ASG-Orig-Subj: Re: 50% more blocks allocated than needed In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1359655456 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 On 01/31/2013 06:43 AM, Thomas Habets wrote: > Hi. > > I've had some files on an XFS filesystem that use way > more blocks than they need. > > That is, st_size=50MB and st_blocks*512= about 68MB. > > The files were downloaded with wget on a somewhat unreliable 3G > connection (50-500kBps) and sometimes defragging (xfs_fsr) fixes it, > but > sometimes not. > > If st_blocks*512 the opposite. So... preallocation? > Yes, here's a thread (one of probably several examples) that discusses the behavior and how the extra space is not permanent, but can hang around for a bit: http://oss.sgi.com/archives/xfs/2012-03/msg00145.html > "df" before and after deleting a bunch of these files shows that the > st_blocks is what it cares about. Would the preallocation (if that's > what it is) be reclaimed if the fs started to run out of space? > I don't think so at the moment, but preallocation is throttled as the filesystem free space becomes more limited. We've recently added speculative prealloc tracking that performs background trimming on a timer controlled via: /proc/sys/fs/xfs/speculative_prealloc_lifetime ... and can be used in the future to explicitly reclaim extra space lying around when the filesystem is full. Brian > If not preallocation, then what? > > Note st_blocks is 134656 and xfs_bmap shows 97663 blocks. > > $ ls -l foo > -rw-r--r-- 1 root root 50000000 Jan 29 01:32 foo > $ du -h foo > 66M foo > $ stat foo > File: `foo' > Size: 50000000 Blocks: 134656 IO Block: 4096 regular file > Device: fe04h/65028d Inode: 68688483 Links: 1 > Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) > Access: 2013-01-30 18:56:18.603278346 +0000 > Modify: 2013-01-29 01:32:51.000000000 +0000 > Change: 2013-01-31 11:38:10.892330145 +0000 > Birth: - > $ xfs_bmap foo > foo: > 0: [0..97663]: 44665840..44763503 > > -- > typedef struct me_s { > char name[] = { "Thomas Habets" }; > char email[] = { "thomas@habets.pp.se" }; > char kernel[] = { "Linux" }; > char *pgpKey[] = { "http://www.habets.pp.se/pubkey.txt" }; > char pgp[] = { "A8A3 D1DD 4AE0 8467 7FDE 0945 286A E90A AD48 E854" }; > char coolcmd[] = { "echo '. ./_&. ./_'>_;. ./_" }; > } me_t; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From stefanrin@gmail.com Thu Jan 31 12:28:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EB1F27F4E for ; Thu, 31 Jan 2013 12:28:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6F16304066 for ; Thu, 31 Jan 2013 10:28:51 -0800 (PST) X-ASG-Debug-ID: 1359656930-04bdf0231d28ff50001-NocioJ Received: from mail-ye0-f181.google.com (mail-ye0-f181.google.com [209.85.213.181]) by cuda.sgi.com with ESMTP id NqsTg1iF1Ckzf8ct (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 31 Jan 2013 10:28:50 -0800 (PST) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.181] Received: by mail-ye0-f181.google.com with SMTP id m11so680054yen.12 for ; Thu, 31 Jan 2013 10:28:50 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type; bh=WCLmQAGraSDniszrp/ypnOsrt12Y77T4i+UIqAvDMTs=; b=Y8ZSBoPvV25jQxM7g9jkaR8BYTLwOwasLRRhKAggfi7w7skAAeK4sadalmt6ZJPZRI lawZYZWA0goZVt3/WVEJb9OQqjKiTPvLkzkFExQVAyKsJZvYZ/pkCI7H4Z7h2dtDGLs+ DpU7upWVDsWGc5FLG14/MoLXKm+eo7+usDFpL2qRhuU0ACYAXw2t3+IyiMfgSPpqqBRM ukY7/PGc/IR4IXxYGDZbpz7pra6C1WYF5H7ufeyggdn0t971jkG1gR8xjiD5Z38oRsbe VYRE3gQUu3XZmV8ND7P/Chnzzq97sWsECJopc16oVKT0nkdOau1R8c7MtfL3a8iv82vQ d+WQ== MIME-Version: 1.0 X-Received: by 10.236.123.98 with SMTP id u62mr11096663yhh.124.1359656930100; Thu, 31 Jan 2013 10:28:50 -0800 (PST) Received: by 10.236.72.97 with HTTP; Thu, 31 Jan 2013 10:28:49 -0800 (PST) In-Reply-To: <510AB2D5.2080600@redhat.com> References: <510AB2D5.2080600@redhat.com> Date: Thu, 31 Jan 2013 19:28:49 +0100 Message-ID: Subject: Re: 50% more blocks allocated than needed From: Stefan Ring X-ASG-Orig-Subj: Re: 50% more blocks allocated than needed To: Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ye0-f181.google.com[209.85.213.181] X-Barracuda-Start-Time: 1359656930 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.2.121441 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 > I don't think so at the moment Really? Even for closed files? I was almost sure that the space would be reclaimed before running out of it. I have only slightly less than 1 year of XFS experience though... From bpm@sgi.com Thu Jan 31 13:08:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 984E87F4E for ; Thu, 31 Jan 2013 13:08:29 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6724F8F804C; Thu, 31 Jan 2013 11:08:26 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 24EEB4266DC; Thu, 31 Jan 2013 13:08:26 -0600 (CST) Date: Thu, 31 Jan 2013 13:08:26 -0600 From: Ben Myers To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: xfs@oss.sgi.com Subject: Re: Xfs fails in xfstests 013 Message-ID: <20130131190826.GQ27055@sgi.com> References: 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.20 (2009-06-14) Hey Lukas, On Thu, Jan 31, 2013 at 09:19:23AM +0100, Lukáš Czerner wrote: > I've just run xfstest 013 on xfs and it fails with this backtrace > > > Jan 31 03:09:07 rhel6_vm1 kernel: ffff88020b6d1000: 78 78 78 78 78 78 78 78 78 78 2f 78 78 78 78 78 xxxxxxxxxx/xxxxx > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Internal error xfs_bmbt_verify at line 747 of file fs/xfs/xfs_bmap_btree.c. Caller 0xffffffffa025486e > Jan 31 03:09:07 rhel6_vm1 kernel: > Jan 31 03:09:07 rhel6_vm1 kernel: Pid: 8909, comm: xfsaild/sda Tainted: GF 3.8.0-rc5-orig+ #8 > Jan 31 03:09:07 rhel6_vm1 kernel: Call Trace: > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_error_report+0x3f/0x50 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_corruption_error+0x5e/0x90 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bmbt_verify+0x80/0x1d0 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bmbt_write_verify+0xe/0x10 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] _xfs_buf_ioapply+0x65/0x150 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? try_to_wake_up+0x2b0/0x2b0 > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_bdstrat_cb+0x65/0xd0 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_buf_iorequest+0x4f/0xa0 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_bdstrat_cb+0x65/0xd0 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] __xfs_buf_delwri_submit+0x108/0x200 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfsaild_push+0x1b6/0x520 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] xfsaild+0x98/0x130 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? xfsaild_push+0x520/0x520 [xfs] > Jan 31 03:09:07 rhel6_vm1 kernel: [] kthread+0xce/0xe0 > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? kthread_freezable_should_stop+0x70/0x70 > Jan 31 03:09:07 rhel6_vm1 kernel: [] ret_from_fork+0x7c/0xb0 > Jan 31 03:09:07 rhel6_vm1 kernel: [] ? kthread_freezable_should_stop+0x70/0x70 > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Corruption detected. Unmount and run xfs_repair > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): xfs_do_force_shutdown(0x8) called from line 1358 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa0226a85 > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Corruption of in-memory data detected. Shutting down filesystem > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Please umount the filesystem and rectify the problem(s) > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): xfs_log_force: error 5 returned. > > > I can reproduce it every time with xfstest 013 on 3.8.0-rc5. I haven't been able to reproduce this with test 013. Could you grab a metadump? Thanks, Ben From jlbec@ftp.linux.org.uk Thu Jan 31 13:32:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1DA987F50 for ; Thu, 31 Jan 2013 13:32:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 071398F8049 for ; Thu, 31 Jan 2013 11:32:06 -0800 (PST) X-ASG-Debug-ID: 1359660724-04cb6c391427e050001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id YxIcbgvwJgfxgSSp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 31 Jan 2013 11:32:05 -0800 (PST) X-Barracuda-Envelope-From: jlbec@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from jlbec by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1U0zrc-0005Fz-AU; Thu, 31 Jan 2013 19:32:00 +0000 Date: Thu, 31 Jan 2013 11:31:57 -0800 From: Joel Becker To: Al Viro Cc: Jan Kara , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: Re: [PATCH 0/4 v2] Fix possible use after free with AIO Message-ID: <20130131193156.GA20817@localhost> X-ASG-Orig-Subj: Re: [PATCH 0/4 v2] Fix possible use after free with AIO Mail-Followup-To: Al Viro , Jan Kara , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com References: <1359502081-20240-1-git-send-email-jack@suse.cz> <20130130144535.GK4503@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130130144535.GK4503@ZenIV.linux.org.uk> X-Burt-Line: Trees are cool. X-Red-Smith: Ninety feet between bases is perhaps as close as man has ever come to perfection. User-Agent: Mutt/1.5.20 (2009-06-14) Sender: Joel Becker X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1359660725 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121444 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Jan 30, 2013 at 02:45:35PM +0000, Al Viro wrote: > On Wed, Jan 30, 2013 at 12:27:57AM +0100, Jan Kara wrote: > > > > Hi, > > > > since nobody seem to have picked up any of the patches (at least > > nobody told me so), I've added acks I received to the patches and I'm > > sending them to Al for merging. Al, can you please merge these? Thanks. > > VFS part (4/4) picked; IMO at least ext* and xfs should go through the > filesystem trees. If ocfs2 folks don't pick fs/ocfs2 part, I'll grab > it as well - not sure how active their tree is these days... I thought akpm had this through -mm. I acked it there. Joel > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- "Same dancers in the same old shoes. You get too careful with the steps you choose. You don't care about winning but you don't want to lose After the thrill is gone." http://www.jlbec.org/ jlbec@evilplan.org From bfoster@redhat.com Thu Jan 31 13:43:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 89A557F51 for ; Thu, 31 Jan 2013 13:43:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73BDD8F8049 for ; Thu, 31 Jan 2013 11:43:03 -0800 (PST) X-ASG-Debug-ID: 1359661382-04cb6c391227e4e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Fkr1qYHs0ltU1y1v for ; Thu, 31 Jan 2013 11:43:02 -0800 (PST) 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 r0VJh1Bs012054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Jan 2013 14:43:01 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0VJh0Mf002049; Thu, 31 Jan 2013 14:43:01 -0500 Message-ID: <510AC9FF.4010007@redhat.com> Date: Thu, 31 Jan 2013 14:46:07 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Stefan Ring CC: Linux fs XFS Subject: Re: 50% more blocks allocated than needed References: <510AB2D5.2080600@redhat.com> X-ASG-Orig-Subj: Re: 50% more blocks allocated than needed In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1359661382 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 On 01/31/2013 01:28 PM, Stefan Ring wrote: >> I don't think so at the moment > > Really? Even for closed files? I was almost sure that the space would > be reclaimed before running out of it. I have only slightly less than > 1 year of XFS experience though... > Note that in most cases preallocation is trimmed on file close. The repeated open-write-close cycle is what causes it to hang around longer (until inode reclaim). Somebody else can chime in if I'm missing something, but my understanding is that we currently run a flush to free up reserved metadata blocks on ENOSPC and retry. The eofblocks functionality provides a mechanism that the out of space conditions can use to free up preallocation, but that part is a work-in-progress. Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From cmaiolino@redhat.com Thu Jan 31 14:13:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 54F927F4E for ; Thu, 31 Jan 2013 14:13:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D783EAC001 for ; Thu, 31 Jan 2013 12:13:25 -0800 (PST) X-ASG-Debug-ID: 1359663204-04cb6c391327f5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id khl0gh5cellxW0a4 for ; Thu, 31 Jan 2013 12:13:25 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0VKDOAq028481 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 31 Jan 2013 15:13:24 -0500 Received: from andromeda.usersys.redhat.com.com (ovpn-113-133.phx2.redhat.com [10.3.113.133]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0VKDNn4005330 for ; Thu, 31 Jan 2013 15:13:23 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] xfsdump: properly set Parent's PID Date: Thu, 31 Jan 2013 15:13:17 -0500 X-ASG-Orig-Subj: [PATCH] xfsdump: properly set Parent's PID Message-Id: <1359663197-30473-1-git-send-email-cmaiolino@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: 1359663204 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 Set parentpid variable to the correct Parent's ID using getppid() instead of getpid() Signed-off-by: Carlos Maiolino --- common/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/main.c b/common/main.c index 980d2d4..848a887 100644 --- a/common/main.c +++ b/common/main.c @@ -198,7 +198,7 @@ main( int argc, char *argv[] ) /* Get the parent's pid. will be used in signal handling * to differentiate parent from children. */ - parentpid = getpid( ); + parentpid = getppid( ); rval = atexit(mlog_exit_flush); assert(rval == 0); -- 1.8.1 From rjohnston@sgi.com Thu Jan 31 14:23:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 E19E67F4E for ; Thu, 31 Jan 2013 14:23:41 -0600 (CST) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay1.corp.sgi.com (Postfix) with ESMTP id D08778F8052; Thu, 31 Jan 2013 12:23:38 -0800 (PST) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 31 Jan 2013 14:23:38 -0600 Message-ID: <510AD2E2.1020309@sgi.com> Date: Thu, 31 Jan 2013 14:24:02 -0600 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Ben Myers , Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> <20130130010430.GE7255@disturbed.disaster> <20130130233203.GP27055@sgi.com> <20130131061321.GI32297@disturbed.disaster> In-Reply-To: <20130131061321.GI32297@disturbed.disaster> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hey Dave, On 01/31/2013 12:13 AM, Dave Chinner wrote: > On Wed, Jan 30, 2013 at 05:32:03PM -0600, Ben Myers wrote: >> Hey Dave, >> >> On Wed, Jan 30, 2013 at 12:04:30PM +1100, Dave Chinner wrote: >>> On Tue, Jan 29, 2013 at 09:39:15AM -0600, rjohnston@sgi.com wrote: >>>> The agskip mount option specifies the allocation group, (AG) for a new >>>> file, relative to the start of the last created file. agskip has the >>>> opposite effect of the rotorstep system tunable parameter. Each >>>> new file to be placed in the location lastAG + agskipValue, >>>> where lastAG is the allocation group of the last created file. >>>> >>>> For example, agskip=3 means each new file will be allocated three AGs away >>>> from the starting AG of the most recently created file. >>> >>> Overall, I'm wondering if this is the right way to approach this >>> problem. >> >> We'll have to make sure we all understand the problem we're trying to solve >> with this before going too far. > > I'm in no doubt about what it is for - I know the exact history of > this patch and exactly what problems it was designed to solve > because.... > >>> It only really works correctly (in terms of distribution of >>> files/metadata) for fixed volume sizes (i.e. homogenous layouts) - >>> the common case where a skip is useful is after growing a filesystem >>> onto a new volume. It's rare that the new volume is the same as the >>> existing volumes, so it's hard to set a skip value that reliably >>> alternates between old and new volumes. >> >> Based upon what I've read so far on the internal bug when this was introduced, >> this is more about being able to utilize all allocation groups in a filesystem >> with many concats. > > ... I was still at SGI when that bug was raised and the ag_skip > patch was written for the "Enhanced XFS" module in the NAS product > SGI was selling at the time. It was written as a quick stopgap by > the NAS product engineers to counter the problems being seen on that > product due to the nature of the "concat of stripes" storage > configuration that product used. > > It was never was proposed as an upstream solution because I NACKed > it internally. Indeed, at the time I was already well down the path > of fixing the problem in XFS in a much more capable way. i.e. this > stuff: > I did not see any references to the patchset you referenced below when I was working on submitting this patchset. Thanks for pointing it out. > http://oss.sgi.com/archives/xfs/2009-02/msg00250.html The patchset (pluggable allocation policies) above looks very promising and I would like to port it to top of tree and use it instead of my agskip proposal. Are there any changes to this patchset we should discuss before I start. Thanks --Rich > http://oss.sgi.com/archives/xfs/2009-02/msg00253.html > > And that was planned to replace the agskip hack in the next NAS > product release. Unfortunately, once I left SGI nobody picked up the > work I was doing and "Enhanced XFS" turned into a zombie. Indeed, > agskip was posted back here in 2009 as part of the same code dump as > the above patches when the XFS group in Melbourne was let go: > > http://oss.sgi.com/archives/xfs/2009-02/msg00252.html > > There's a bit of history to this patch ;) > >> It's not so much related to balance after growing a >> filesystem (which is another interesting problem). The info should be added to >> this series and be reposted. > > Actually, that was one of the problems the patch solved on the NAS > product. It was a secondary problem as growing wasn't a common > operation, but it was definitely a concern.... > >>> We talked about this allocation distribution problem last march when >>> we met at LSF, and I thought we agreed that pushing >>> agskip/agrotorstep mount options upstream was not the way we were >>> going to solve this problem after I outlined how I planned to solve >>> this problem. >> >> If we can come up with something better, that's great. But AFAICT the problem >> still needs to be addressed. This is just one way to do it. > > I'm not saynig that it doesn't need to be addressed. I'm just saying > the sam ething I said 5 years ago: there's no point pushing it into > mainline when far more comprehensive solution is just around the > corner.... > > Cheers, > > Dave. > From sgi-linux-xfs@m.gmane.org Thu Jan 31 14:24:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-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 28CF47F4E for ; Thu, 31 Jan 2013 14:24:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 071D930406B for ; Thu, 31 Jan 2013 12:24:54 -0800 (PST) X-ASG-Debug-ID: 1359663891-04cbb00c66277770001-w1Z2WR Received: from plane.gmane.org (plane.gmane.org [80.91.229.3]) by cuda.sgi.com with ESMTP id b8bk6TKeC1DXGjNi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 31 Jan 2013 12:24:52 -0800 (PST) X-Barracuda-Envelope-From: sgi-linux-xfs@m.gmane.org X-Barracuda-Apparent-Source-IP: 80.91.229.3 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1U10gz-0005TZ-Vv for linux-xfs@oss.sgi.com; Thu, 31 Jan 2013 21:25:06 +0100 Received: from lougher.demon.co.uk ([80.177.127.218]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 31 Jan 2013 21:25:05 +0100 Received: from plougher by lougher.demon.co.uk with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 31 Jan 2013 21:25:05 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Phillip Lougher Subject: Re: Volume fine on =?utf-8?b?eDg2XzY0LA==?= corruption on ARM Date: Thu, 31 Jan 2013 20:19:20 +0000 (UTC) X-ASG-Orig-Subj: Re: Volume fine on =?utf-8?b?eDg2XzY0LA==?= corruption on ARM Lines: 42 Message-ID: References: <20130127225258.GA2287@vicerveza.homeunix.net> <5106FDA5.80409@sandeen.net> <20130128224013.GK2287@vicerveza.homeunix.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: sea.gmane.org User-Agent: Loom/3.14 (http://gmane.org/) X-Loom-IP: 80.177.127.218 (Mozilla/5.0 (X11; Linux x86_64; rv:10.0.11) Gecko/20100101 Firefox/10.0.11 Iceweasel/10.0.11) X-Barracuda-Connect: plane.gmane.org[80.91.229.3] X-Barracuda-Start-Time: 1359663891 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.2.121449 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Lluís Batlle i Rossell viric.name> writes: > > On Mon, Jan 28, 2013 at 04:37:25PM -0600, Eric Sandeen wrote: > > So this was trying to read a dir2 directory metadata leaf block, and it > > didn't find the right magic. > > XFSB is superblock magic . . . > > > > I tested an image which (I think) contains every dir2 format, created on > > x86_64 (under a RHEL6 3.2 kernel) and checked it on ARM (a raspberry pi > > 3.2.24 kernel) so it's not really quite an apples to apples test. > > > > Does the filesystem check clean on x86_64 right after you create it? > > How did you create it? > > Thank you for testing! You mean that your test went fine, right? > > I run: > mkfs.xfs /dev/sdb1 > > Then I copied files to it. After the first crash in the arm, I used >> xfs_repair on the > x86_64. It created many lost+found. Then I tried again in the ARM, and it > crashed again the same way. I have tried to reproduce this using an armv5tel arch (qemu emulation), running a stock 3.7.3 kernel. The test image was created on x86_64 with a stock 3.7.3 kernel, and the test image then booted as the rootfs on the ARM system. No corruption of the filesystem occurred on the ARM, even with parallel file writes/moves to 'encourage' the bug to appear. The unmounted filesystem checked-out OK on the x86_64 using xfs_check. Is there some missing information here or additional actions needed to trigger this bug? Thanks Phillip From bpm@sgi.com Thu Jan 31 14:34:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 9E52F7F4E for ; Thu, 31 Jan 2013 14:34:39 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id C521EAC002; Thu, 31 Jan 2013 12:34:38 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6E0EC4266DC; Thu, 31 Jan 2013 14:34:38 -0600 (CST) Date: Thu, 31 Jan 2013 14:34:38 -0600 From: Ben Myers To: Eric Sandeen Cc: Stan Hoeppner , Fugazzi99 , xfs@oss.sgi.com Subject: Re: [PATCH] xfsdump: zero bs_forkoff, don't fill in the value Message-ID: <20130131203438.GR27055@sgi.com> References: <50EB2073.1040609@gmail.com> <50EB2814.2090500@sandeen.net> <50EB3268.2080004@sandeen.net> <50EB3DF7.3010100@hardwarefreak.com> <20130107213739.GU27055@sgi.com> <50EC567E.2020607@sandeen.net> <50EC57FD.9040601@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EC57FD.9040601@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Eric, On Tue, Jan 08, 2013 at 11:31:41AM -0600, Eric Sandeen wrote: > In xfsdump 3.1.2 I explicitly added the bs_forkoff member > to this structure; I tried to be good and explicitly fill > in a value. However, previously it was initialized to > zero, (by virtue of being missing) and now we're giving it > a value (which is ignored by restore, other than to checksum > it). > > By putting in a non-zero value, I broke checksumming > when an xfsdump with a non-zero forkoff was restored > by an older xfsrestore that doesn't know about the field. > Fill in 0 to fix backwards compatibility. > > Signed-off-by: Eric Sandeen > Reported-by: Fugazzi99 > --- > > diff --git a/dump/content.c b/dump/content.c > index 9a36fe1..ac19021 100644 > --- a/dump/content.c > +++ b/dump/content.c > @@ -4928,7 +4928,7 @@ copy_xfs_bstat(bstat_t *dst, xfs_bstat_t *src) > dst->bs_extents = src->bs_extents; > dst->bs_gen = src->bs_gen; > dst->bs_projid_lo = src->bs_projid_lo; > - dst->bs_forkoff = src->bs_forkoff; > + dst->bs_forkoff = 0; I think I understand this now. A legacy xfs_repair would not have bs_forkoff in read_filehdr xlate_filehdr xlate_bstat IXLATE(bs1, bs2, bs_forkoff); And bs_pad is copied without any translation. This works fine as long as bs_forkoff and bs_projid_hi are 0. In the failure case bs_forkoff was nonzero and changed the checksum because it was not translated. I could not reproduce the checksum failure on a filesystem without xattrs because bs_forkoff was always 0. *** Get set up with an xattr: # touch /mnt/scratch/file # setfattr -h -n user.testattr -v testvalue /mnt/scratch/file *** Dump the filesystem with 3.1.2: # xfsdump - /mnt/scratch > dump-with-attribute-and-3.1.2.out xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.1.2 (dump format 3.0) ... xfsdump: Dump Status: SUCCESS *** Restore with 3.1.0, and print out bs_pad: # xfsrestore -f dump-with-attribute-and-3.1.2.out /mnt/test xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control ... xfsrestore: reading directories read_filehdr pad is 0 0 0 0 0 0 0 0 0 0 0 0 0 0 read_filehdr pad is 0 78 0 0 0 0 0 0 0 0 0 0 0 0 xfsrestore: WARNING: bad file header checksum ... xfsrestore: Restore Status: INCOMPLETE *** Restore with 3.1.0, translating bs_pad where bs_forkoff lives: # xfsrestore -f dump-with-attribute-and-3.1.2.out /mnt/test xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control ... xfsrestore: reading directories read_filehdr pad is 0 0 0 0 0 0 0 0 0 0 0 0 0 0 read_filehdr pad is 78 0 0 0 0 0 0 0 0 0 0 0 0 0 xfsrestore: 1 directories and 1 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files read_filehdr pad is 78 0 0 0 0 0 0 0 0 0 0 0 0 0 read_filehdr pad is 0 0 0 0 0 0 0 0 0 0 0 0 0 0 xfsrestore: restore complete: 0 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/xfsdump/dump-with-attribute-and-3.1.2.out OK (success) xfsrestore: Restore Status: SUCCESS :!quilt di Index: xfsdump/restore/content.c =================================================================== --- xfsdump.orig/restore/content.c +++ xfsdump/restore/content.c @@ -8038,6 +8038,7 @@ read_filehdr( drive_t *drivep, filehdr_t intgen_t nread; intgen_t rval; filehdr_t tmpfh; + int i; nread = read_buf( ( char * )&tmpfh, sizeof( *fhdrp ), @@ -8078,6 +8079,16 @@ read_filehdr( drive_t *drivep, filehdr_t "corrupt file header\n") ); return RV_CORRUPT; } + i = bstatp->bs_pad[0]; + bstatp->bs_pad[0] = bstatp->bs_pad[1]; + bstatp->bs_pad[1] = i; + + printf("%s pad is ", __func__); + for (i = 0; i < 14; i++) { + printf("%x ", bstatp->bs_pad[i]); + } + printf("\n"); + if ( !is_checksum_valid( fhdrp, FILEHDR_SZ )) { mlog( MLOG_NORMAL | MLOG_WARNING, _( "bad file header checksum\n") ); Now all new dumps will have zeroed bs_pad[0,1] so it doesn't matter that they aren't xlated. Your fix looks good. Reviewed-by: Ben Myers I'll pull this in immediately. Thanks, Ben From herton.krzesinski@canonical.com Thu Jan 31 16:11:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0EC917F4E for ; Thu, 31 Jan 2013 16:11:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F20538F8035 for ; Thu, 31 Jan 2013 14:11:39 -0800 (PST) X-ASG-Debug-ID: 1359670298-04cbb00c6327a980001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id 8BAX7ekqdyDWIQJR; Thu, 31 Jan 2013 14:11:38 -0800 (PST) X-Barracuda-Envelope-From: herton.krzesinski@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from 201.47.17.154.dynamic.adsl.gvt.net.br ([201.47.17.154] helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1U12M5-00086y-97; Thu, 31 Jan 2013 22:11:37 +0000 From: Herton Ronaldo Krzesinski To: Jan Kara Cc: xfs@oss.sgi.com, Ben Myers , Herton Ronaldo Krzesinski , kernel-team@lists.ubuntu.com Subject: [ 3.5.y.z extended stable ] Patch "xfs: Fix possible use-after-free with AIO" has been added to staging queue Date: Thu, 31 Jan 2013 20:11:34 -0200 X-ASG-Orig-Subj: [ 3.5.y.z extended stable ] Patch "xfs: Fix possible use-after-free with AIO" has been added to staging queue Message-Id: <1359670294-17925-1-git-send-email-herton.krzesinski@canonical.com> X-Mailer: git-send-email 1.7.9.5 X-Extended-Stable: 3.5 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1359670298 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words This is a note to let you know that I have just added a patch titled xfs: Fix possible use-after-free with AIO to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree which can be found at: http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.5.y-queue If you, or anyone else, feels it should not be added to this tree, please reply to this email. For more information about the 3.5.y.z tree, see https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable Thanks. -Herton ------ >From 4bf193f525ba48ec92bd710b6f2298c24f6c83a6 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 23 Jan 2013 13:56:18 +0100 Subject: [PATCH] xfs: Fix possible use-after-free with AIO commit 4b05d09c18d9aa62d2e7fb4b057f54e5a38963f5 upstream. Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers Signed-off-by: Jan Kara Reviewed-by: Ben Myers Signed-off-by: Ben Myers Signed-off-by: Herton Ronaldo Krzesinski --- fs/xfs/xfs_aops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 8dad722..6868548 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -86,11 +86,11 @@ xfs_destroy_ioend( } if (ioend->io_iocb) { + inode_dio_done(ioend->io_inode); if (ioend->io_isasync) { aio_complete(ioend->io_iocb, ioend->io_error ? ioend->io_error : ioend->io_result, 0); } - inode_dio_done(ioend->io_inode); } mempool_free(ioend, xfs_ioend_pool); -- 1.7.9.5 From david@fromorbit.com Thu Jan 31 18:29:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3CE807F4E for ; Thu, 31 Jan 2013 18:29:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18DD2304075 for ; Thu, 31 Jan 2013 16:29:33 -0800 (PST) X-ASG-Debug-ID: 1359678570-04bdf0231b2a3340001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id jOpJ7OTEsJW6ThDx for ; Thu, 31 Jan 2013 16:29:31 -0800 (PST) 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: AgcFAJILC1G2/3vK/2dsb2JhbABFhV9puGkWc4IeAQEEASMECwFGBQsIAQINCwICBSECAg8FKCETiAsFlEqbAJJXgSOOVoETA5YRhhEDijmDDw Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail05.adl6.internode.on.net with ESMTP; 01 Feb 2013 10:59:30 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U14VU-0006KL-3b; Fri, 01 Feb 2013 11:29:28 +1100 Date: Fri, 1 Feb 2013 11:29:27 +1100 From: Dave Chinner To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: xfs@oss.sgi.com Subject: Re: Xfs fails in xfstests 013 Message-ID: <20130201002927.GJ32297@disturbed.disaster> X-ASG-Orig-Subj: Re: Xfs fails in xfstests 013 Mail-Followup-To: =?utf-8?B?THVrw6HFoQ==?= Czerner , xfs@oss.sgi.com References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1359678570 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.2.121465 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 31, 2013 at 09:19:23AM +0100, Lukáš Czerner wrote: > Hi. > > I've just run xfstest 013 on xfs and it fails with this backtrace > > > Jan 31 03:09:07 rhel6_vm1 kernel: ffff88020b6d1000: 78 78 78 78 78 78 78 78 78 78 2f 78 78 78 78 78 xxxxxxxxxx/xxxxx > Jan 31 03:09:07 rhel6_vm1 kernel: XFS (sda): Internal error xfs_bmbt_verify at line 747 of file fs/xfs/xfs_bmap_btree.c. Caller 0xffffffffa025486e Same problem Cai Qian just reported - a remote symlink with a bmbt verifier attached to it. > I can reproduce it every time with xfstest 013 on 3.8.0-rc5. And the configuration you are testing? I'd suggest that you add an: ASSERT(bp->b_ops == NULL); into xfs_symlink() after the xfs_trans_get_buf() call in the remote symlink crate loop, because the problem occurring implies that the code is getting a new buffer with a stale ops structure on it (though I can't see how that is possible right now). You should probably put the same assert into xfs_inactive_symlink_rmt() between the get buf and the xfs_trans_binval() call, and into xfs_readlink_bmap() after the contents of a symlink are read from disk. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 31 19:26:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 37DFF7F4E for ; Thu, 31 Jan 2013 19:26:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA729AC002 for ; Thu, 31 Jan 2013 17:26:18 -0800 (PST) X-ASG-Debug-ID: 1359681975-04cb6c3913290050001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6sjqQCgRLZtCrEG2 for ; Thu, 31 Jan 2013 17:26:16 -0800 (PST) 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: AgYFAEwZC1G2/3vK/2dsb2JhbAA9CIVfuVMWc4IeAQEEAScTPwULCAMNAQoJJQ8FKCETiAsFwh6NHYNvA5JegzOGEQODPYZ8gw8 Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail05.adl6.internode.on.net with ESMTP; 01 Feb 2013 11:56:13 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U15OM-0006O4-4l; Fri, 01 Feb 2013 12:26:10 +1100 Date: Fri, 1 Feb 2013 12:26:10 +1100 From: Dave Chinner To: Brian Foster Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Message-ID: <20130201012610.GK32297@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Mail-Followup-To: Brian Foster , Mark Tinguely , xfs@oss.sgi.com References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> <20130130060551.GG7255@disturbed.disaster> <5109291E.6090303@sgi.com> <51094423.8000703@redhat.com> <20130130215934.GB32297@disturbed.disaster> <510AADC5.3000305@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <510AADC5.3000305@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1359681975 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.2.121469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 31, 2013 at 12:45:41PM -0500, Brian Foster wrote: > On 01/30/2013 04:59 PM, Dave Chinner wrote: > > On Wed, Jan 30, 2013 at 11:02:43AM -0500, Brian Foster wrote: > >> (added Dave and the list back on CC) > >> > >> On 01/30/2013 09:07 AM, Mark Tinguely wrote: > >>> On 01/30/13 00:05, Dave Chinner wrote: > >>>> On Tue, Jan 29, 2013 at 03:42:35PM -0500, Brian Foster wrote: > ... > >> > >> Thanks guys. This certainly looks nicer than messing with the lock > >> wrapper, but is it susceptible to the same problem? In other words, does > >> this fix the problem or just tighten the window? > > > > That's what I need to think about more - the only difference here is > > that we are checking the flag before the down_trylock() instead of > > after.... > > > >> So if the buf lock covers the pinned state (e.g., buffer gets locked, > >> added to a transaction, the transaction gets committed and pins and > >> unlocks the buffer, IIUC) and the stale state (buf gets locked, added to > >> a new transaction and inval'd before the original transaction was > >> written ?), but we don't hold the buf lock in xfs_buf_item_push(), how > >> can we guarantee the state of either doesn't change between the time we > >> check the flags and the time the lock fails? > > > > ... but the order of them being set and checked may be significant > > and hence checking the stale flag first might be sufficient to avoid > > the pin count race and hence the log force. Hence this might just > > need a pair of memory barriers - one here and one in xfs_buf_stale() > > - to ensure that we always see the XBF_STALE flag without needing to > > lock the buffer first. > > > > I _think_ I follow your train of thought. If we're racing on the pin > check, presumably the lock holder is committing the transaction and we > should either already see the buffer being stale, being pinned or we > should get the lock (assuming the order is: stale, pinned, unlocked). Right, that is the order in which operations occur. Marking a buffer stale happens in the transaction body, the pin and subsequent unlock occur some time later during the transaction commit. > That aside for a moment, here's some specific tracepoint (some of which > I've hacked in) data for when the recursion occurs: .... > ... so as expected, the buffer is marked stale, we attempt the trylock, > the buf is pinned, we run the log force and we're dead. *nod* > From the looks of the trace, I'd expect an additional stale check to > eliminate the ability to reproduce this, but that doesn't necessarily > make it correct of course. Regardless, I'm putting that to the test now > and letting it run for a bit while we get this sorted out. > > I also need to stare at the code some more. My pending questions are: > > - Is it always reasonable to to assume/consider a stale buf as pinned in > the context of xfsaild? A stale buffer in the AIL is either pinned (transaction committed) or on it's way to being pinned (transaction that marked it stale is currently in progress). When the transaction commit completes, the IOP_UNPIN() call will remove the item from the AIL if it is the last reference to the item. Hence we generally do not get unpinned, stale buffers in the AIL because the last reference to the stale buffer is usually the transaction that marked it stale.... > - If we currently reproduce the following sequence: > > A xfsaild > stale > (!pinned) ==> trylock() > pinned > (!trylock && pinned && stale) > ==> xfs_log_force() (boom) > > ... what prevents the following sequence from occurring sometime in the > future or with some alternate high-level sequence of events? > > A xfsaild > locked > (!pinned && !stale) ==> trylock() > pinned > stale > (!trylock && pinned && stale) > ==> xfs_log_force() You can't get that order and trigger the race. If the item is pinned before it is marked stale, that means we will always see pin count because it was pinned by a previous transaction commit. Pinning occurs on the commit of the first transaction commit that inserts the item into the CIL. It doesn't get unpinned until the CIL is checkpointed and inserted into the AIL. Hence the order of operations that marks an uncommitted buffer stale should always be lock->stale->pinned->unlock. However, if the buffer has been previously modified and is in the CIL, you'll see: lock->pinned->CIL insert->unlock.....->lock->stale->unlock If the buffer was modified a while back and the CIL is committed, the buffer will be in the AIL but not the CIL. If the buffer was modified a while back, and then again recently, it will be in both pinned in the CIL and the AIL. Neither of these cases can trigger this problem because the pinned check will fire reliably. Hence the specific case here is the buffer has been previously modified, the CIL committed so it's in the AIL, and we are marking the buffer stale as the first modification of the buffer after it was added to the AIL. IOWs, the order that is of concern is this while the item is in the AIL: lock->stale->pin->CIL insert->unlock So in terms of the xfsaild racing and causing problems, the only case it will occur in is this: Thread 1 xfsaild lock xfs_buf_item_push .... not pinned stale trylock commit pin if(pinned && stale) unlock So what I was asking is whether we can do checks in the order of: smb_mb(); if (stale) return if (pinned) return What I've just realised is that we really don't care if we race in xfs_buf_item_push(). The race that matters is in xfs_buf_trylock() and at that point it is too late to avoid it. So I think your original patch is on the right path but having the xfsaild handle the log force gets rid of most of the nasty cruft it had.... ie. we're going to have to tell xfs_buf_trylock() that we should not do a log force if the lock fails, and return XFS_ITEM_PINNED rather than XFS_ITEM_LOCKED in xfs_buf_item_push().... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Thu Jan 31 19:39:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 21E997F4E for ; Thu, 31 Jan 2013 19:39:38 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC9028F8049; Thu, 31 Jan 2013 17:39:37 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B2CA14266DC; Thu, 31 Jan 2013 19:39:37 -0600 (CST) Date: Thu, 31 Jan 2013 19:39:37 -0600 From: Ben Myers To: Jeff Liu Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Message-ID: <20130201013937.GS27055@sgi.com> References: <51067C69.2020509@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <51067C69.2020509@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Jeff, On Mon, Jan 28, 2013 at 09:26:01PM +0800, Jeff Liu wrote: > Refining the existing reservations with xfs_calc_buf_res() in xfs_trans.c > > Signed-off-by: Jie Liu > CC: Dave Chinner > Reviewed-by: Mark Tinguely ... > --- > fs/xfs/xfs_trans.c | 237 ++++++++++++++++++++++++---------------------------- > 1 file changed, 110 insertions(+), 127 deletions(-) > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c ... > @@ -298,18 +286,19 @@ xfs_calc_create_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - MAX((mp->m_sb.sb_inodesize + > - mp->m_sb.sb_inodesize + > - mp->m_sb.sb_sectsize + > + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + > XFS_FSB_TO_B(mp, 1) + > - XFS_DIROP_LOG_RES(mp) + > - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), > - (3 * mp->m_sb.sb_sectsize + > - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + > - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + > - XFS_ALLOCFREE_LOG_RES(mp, 1) + > - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), > + XFS_FSB_TO_B(mp, 1))), > + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > + mp->m_sb.sb_sectsize + > + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(mp->m_in_maxlevels, > + XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > + XFS_FSB_TO_B(mp, 1)))); > } xfs/xfs_inode_item.c xfs/xfs_trans.c: In function ‘xfs_calc_create_reservation’: xfs/xfs_trans.c:289: warning: comparison of distinct pointer types lacks a cast > /* > @@ -539,16 +524,14 @@ xfs_calc_attrrm_reservation( > struct xfs_mount *mp) > { > return XFS_DQUOT_LOGRES(mp) + > - MAX((mp->m_sb.sb_inodesize + > - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + > + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + > + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, > + XFS_FSB_TO_B(mp, 1)) + > XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + > - 128 * (1 + XFS_DA_NODE_MAXDEPTH + > - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), > - (2 * mp->m_sb.sb_sectsize + > - 2 * mp->m_sb.sb_sectsize + > - mp->m_sb.sb_sectsize + > - XFS_ALLOCFREE_LOG_RES(mp, 2) + > - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); > + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), > + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + > + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), > + XFS_FSB_TO_B(mp, 1)))); > } xfs/xfs_trans.c: In function ‘xfs_calc_attrrm_reservation’: xfs/xfs_trans.c:527: warning: comparison of distinct pointer types lacks a cast Can you fix up those warnings? I think you need only resend patch 2. Thanks, Ben From bpm@sgi.com Thu Jan 31 20:10:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 AF9797F4E for ; Thu, 31 Jan 2013 20:10:52 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E8C8AC001; Thu, 31 Jan 2013 18:10:49 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id DE4A54266DC; Thu, 31 Jan 2013 20:10:48 -0600 (CST) Date: Thu, 31 Jan 2013 20:10:48 -0600 From: Ben Myers To: Andrew Dahl Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfsprogs: Refactor release scripts to conform to using git archive Message-ID: <20130201021048.GT27055@sgi.com> References: <50F44B2E.9050408@sgi.com> <50F44B62.7060504@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F44B62.7060504@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Andrew, On Mon, Jan 14, 2013 at 12:16:02PM -0600, Andrew Dahl wrote: > Refactored release scripts to conform to using git archive > > When generating a release, there is a risk of missing necessary > source files. This is fixed by using git archive, which also > fixes the lack of conformity between the xfs utilities. As well, > some files may be stale during packaging. This is fixed with a > clean at the beginning of release generation. > > Signed-off-by: Andrew Dahl Compared the old 'make dist' with the new one: # diff old.list new.list 129a130 > xfsprogs-3.1.10/.gitignore The only difference in the file list is the addition of .gitignore. > --- > Makefile | 11 ++++++++--- > release.sh | 3 +++ > 2 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/Makefile b/Makefile > index 0bdc5e8..e73af88 100644 > --- a/Makefile > +++ b/Makefile > @@ -29,6 +29,8 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz > > CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh > LSRCFILES = configure.ac release.sh README VERSION $(CONFIGURE) > +SRCTARINC = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ > + m4/ltversion.m4 po/xfsprogs.pot $(CONFIGURE) > > LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ > conftest* built .census install.* install-dev.* *.gz \ > @@ -144,7 +146,10 @@ $(SRCDIR) : $(_FORCE) > rm -fr $@ > mkdir -p $@ > > -$(SRCTAR) : default $(SRCDIR) > - $(Q)$(MAKE) $(MAKEOPTS) source-link > - unset TAPE; $(TAR) -cf - $(SRCDIR) | $(ZIP) --best > $@ && \ > +$(SRCTAR) : default > + $(Q)git archive --prefix=$(SRCDIR)/ --format=tar v$(PKG_VERSION) \ > + -o $(SRCDIR).tar Older versions of git do not support the -o option. I changed this to > $(SRCDIR).tar and it works fine. > + $(Q)$(TAR) --transform "s,^,$(SRCDIR)/," -rf $(SRCARC).tar \ SRCDIR With those changes this looks and works fine. Reviewed-by: Ben Myers -Ben From bpm@sgi.com Thu Jan 31 20:36:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 730D57F4E for ; Thu, 31 Jan 2013 20:36:07 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02A9DAC002; Thu, 31 Jan 2013 18:36:06 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A15744266AC; Thu, 31 Jan 2013 20:36:06 -0600 (CST) Date: Thu, 31 Jan 2013 20:36:06 -0600 From: Ben Myers To: Andrew Dahl Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfsdump: Refactor release scripts to conform to using git archive Message-ID: <20130201023606.GU27055@sgi.com> References: <50F44B2E.9050408@sgi.com> <50F44B87.3040102@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F44B87.3040102@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Andrew, On Mon, Jan 14, 2013 at 12:16:39PM -0600, Andrew Dahl wrote: > Refactored release scripts to conform to using git archive > > When generating a release, there is a risk of some files being > stale, such as configure and the m4/autotools temp files. This > is fixed with a clean at the beginning of the release generation. > In addition, there is no uniformity in the current method of > source tar generation between xfs utilities. Using git archive > solves this issue accross all utilities. > > Signed-off-by: Andrew Dahl Here is the difference between the old 'make dist' and the new one: # diff old.list new.list 99a100 > xfsdump-3.1.2/.gitignore 190d190 < xfsdump-3.1.2/po/xfsdump.pot Adding .gitignore is fine, and xfsdump.pot needn't be in the archive, it is an output file from gettext. > diff --git a/Makefile b/Makefile > index 39881af..23b6a9e 100644 > --- a/Makefile > +++ b/Makefile > @@ -29,6 +29,8 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz > > CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh > LSRCFILES = configure.ac release.sh README VERSION $(CONFIGURE) > +SRCTARINC = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ > + m4/ltversion.m4 $(CONFIGURE) > > LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ > conftest* built .census install.* install-dev.* *.gz \ > @@ -124,7 +126,10 @@ $(SRCDIR) : $(_FORCE) > rm -fr $@ > mkdir -p $@ > > -$(SRCTAR) : default $(SRCDIR) > - $(Q)$(MAKE) $(MAKEOPTS) source-link > - unset TAPE; $(TAR) -cf - $(SRCDIR) | $(ZIP) --best > $@ && \ > +$(SRCTAR) : default > + $(Q)git archive --prefix=$(SRCDIR)/ --format=tar v$(PKG_VERSION) \ > + -o $(SRCDIR).tar Changed this to > $(SRCDIR).tar Reviewed-by: Ben Myers Regards, Ben From bpm@sgi.com Thu Jan 31 20:55:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 DFC7C7F4E for ; Thu, 31 Jan 2013 20:55:56 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id C4A51304066; Thu, 31 Jan 2013 18:55:53 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 8C00D4266DC; Thu, 31 Jan 2013 20:55:53 -0600 (CST) Date: Thu, 31 Jan 2013 20:55:53 -0600 From: Ben Myers To: Andrew Dahl Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfstests: Refactor release scripts to conform to using git archive Message-ID: <20130201025553.GV27055@sgi.com> References: <50F44B2E.9050408@sgi.com> <50F44BA5.9030509@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50F44BA5.9030509@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Andrew, On Mon, Jan 14, 2013 at 12:17:09PM -0600, Andrew Dahl wrote: > Refactored release scripts to conform to using git archive > > When generating a release, there is a risk of some files being > stale, such as configure and the m4/autotools temp files. This > is fixed with a clean at the beginning of release generation. > In addition, there is no uniformity in the current method of > source tar generation between xfs utilities. Using git archive > solves this issue across all utilities. > > Signed-off-by: Andrew Dahl > --- > Makefile | 20 ++++++++++++++++++++ > release.sh | 11 +++++++++-- > 2 files changed, 29 insertions(+), 2 deletions(-) > mode change 100644 => 100755 release.sh > > diff --git a/Makefile b/Makefile > index b68ec11..a0aef85 100644 > --- a/Makefile > +++ b/Makefile > @@ -39,12 +39,17 @@ ifeq ($(HAVE_BUILDDEFS), yes) > include $(TOPDIR)/include/builddefs > endif > > +SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar.gz > + > TESTS = $(shell sed -n -e '/^[0-9][0-9][0-9]*/s/ .*//p' group) > CONFIGURE = configure include/builddefs include/config.h > LSRCFILES = configure configure.ac aclocal.m4 README VERSION > LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ > conftest* check.log check.time > > +ifeq ($(HAVE_BUILDDEFS), yes) > +LDIRT += $(SRCTAR) > +endif > > LIB_SUBDIRS = include lib > TOOL_SUBDIRS = ltp src m4 > @@ -102,3 +107,18 @@ install-dev install-lib: > realclean distclean: clean > $(Q)rm -f $(LDIRT) $(CONFIGURE) > $(Q)rm -rf autom4te.cache Logs > + > +dist: include/builddefs include/config.h default > +ifeq ($(HAVE_BUILDDEFS), no) > + $(Q)$(MAKE) $(MAKEOPTS) -C . $@ > +else > + $(Q)$(MAKE) $(MAKEOPTS) $(SRCTAR) > +endif > + > +$(SRCTAR) : default > + $(Q)git archive --prefix=$(PKG_NAME)-$(PKG_VERSION)/ --format=tar \ > + v$(PKG_VERSION) -o $(PKG_NAME)-$(PKG_VERSION).tar Again, changed this to > $(PKG_NAME)-$(PKG_VERSION).tar And it worked fine. Reviewed-by: Ben Myers Regards, Ben From jeff.liu@oracle.com Thu Jan 31 22:21:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 880527F4E for ; Thu, 31 Jan 2013 22:21:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A8A630407A for ; Thu, 31 Jan 2013 20:21:13 -0800 (PST) X-ASG-Debug-ID: 1359692470-04bdf0231d2a8a90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id rFYKOCeivkI9Tb6o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 31 Jan 2013 20:21:11 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r114L2g0024558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 1 Feb 2013 04:21:02 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r114L1vS019426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 1 Feb 2013 04:21:01 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r114L1ND023475; Thu, 31 Jan 2013 22:21:01 -0600 Received: from [192.168.1.102] (/114.248.199.103) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Jan 2013 20:21:00 -0800 Message-ID: <510B42A6.6040004@oracle.com> Date: Fri, 01 Feb 2013 12:20:54 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com, Mark Tinguely , Dave Chinner Subject: [RESEND][PATCH v4 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Content-Type: text/plain; charset=windows-1252 X-ASG-Orig-Subj: [RESEND][PATCH v4 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Content-Transfer-Encoding: 8bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1359692471 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11: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.2.121481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben and All, This patch is resent to fix two compiling warnings by casting the return value of XFS_FSB_TO_B() to uint. Per Ben's comments: xfs/xfs_trans.c: In function xfs_calc_create_reservation: xfs/xfs_trans.c:289: warning: comparison of distinct pointer types lacks a cast xfs/xfs_trans.c: In function xfs_calc_attrrm_reservation: xfs/xfs_trans.c:527: warning: comparison of distinct pointer types lacks a cast Thanks, -Jeff Refining the existing reservations with xfs_calc_buf_res() in xfs_trans.c Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_trans.c | 240 ++++++++++++++++++++++++---------------------------- 1 file changed, 112 insertions(+), 128 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 6c601ea..a81625c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -116,18 +116,15 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 2))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -148,18 +145,17 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0))); } /* @@ -179,14 +175,12 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((4 * mp->m_sb.sb_inodesize + - 2 * XFS_DIROP_LOG_RES(mp) + - 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - 3 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 3) + - 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -206,15 +200,12 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -234,15 +225,12 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -264,18 +252,18 @@ xfs_calc_symlink_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 1024 + - 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, 1024)), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -298,18 +286,19 @@ xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + (uint)XFS_FSB_TO_B(mp, 1) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -337,16 +326,16 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, 0) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -374,9 +363,9 @@ STATIC uint xfs_calc_growdata_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize * 3 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -393,12 +382,12 @@ STATIC uint xfs_calc_growrtalloc_reservation( struct xfs_mount *mp) { - return 2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - mp->m_sb.sb_inodesize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -410,7 +399,7 @@ STATIC uint xfs_calc_growrtzero_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_blocksize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); } /* @@ -427,11 +416,10 @@ STATIC uint xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_inodesize + - mp->m_sb.sb_blocksize + - mp->m_rsumsize + - 128 * 5; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); } /* @@ -442,7 +430,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -452,7 +440,7 @@ xfs_calc_swrite_reservation( STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -468,13 +456,13 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize * 2 + - mp->m_dirblksize + - XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -492,14 +480,12 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -517,10 +503,9 @@ xfs_calc_attrset_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - 128 * (2 + XFS_DA_NODE_MAXDEPTH); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); } /* @@ -539,16 +524,15 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_DA_NODE_MAXDEPTH + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + + (uint)XFS_FSB_TO_B(mp, + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -558,7 +542,7 @@ STATIC uint xfs_calc_clear_agi_bucket_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } /* -- 1.7.9.5
    3D"Inline

    <= /div>
    =CB=D2=A1=E0=C1=C5=EC=B9=D5=E9=C3=BA=A1=C7=B9=B7=E8=D2=B9 =B5= =E9=CD=A7=A2=CD=CD=C0=D1=C2=C1=D2 =B3 =B7=D5=E8=B9=D5=E9 =A4=D0

    =E0=C3=D5=C2=B9=A4=D8=B3

    =B7=E8=D2=B9=B7=D5= =E8=A1=D3=C5=D1=A7=C1=CD=A7=CB=D2=C5=D9=A1=A4=E9=D2 =AB=D7=E9=CD =BA=E9=D2= =B9 =B7=D5=E8=B4=D4=B9 =A4=CD=B9=E2=B4 =CD=BE=D2=C3=EC=B7=E0=C1=E9=B9=B7=EC= =A2=B9=D2=B4=B9=D5=E9

    =E0=C3=D2=C1=D5=C5= =D9=A1=A4=E9=D2=AA=D2=C7=B5=E8=D2=A7=BB=C3=D0=E0=B7=C8=B7=D5=E8=A1=D3=C5=D1= =A7=CB=D2 =AB=D7=E9=CD=BA=E9=D2=B9 =B7=D5=E8=B4=D4=B9 =A4=CD=B9=E2=B4 =CD= =BE=D2=C3=EC=B7=E0=C1=E9=B9=B7=EC =E3=B9=BB=C3=D0=E0=B7=C8=E4=B7=C2<= /div>
    =E3=B9=E0=A2=B5 =A1=C3=D8=A7=E0=B7=BE, =E0=AA=D5=C2=A7=E3=CB= =C1=E8,=C0=D9=E0=A1=E7=B5, =E0=A1=D2=D0=CA=C1=D8=C2, =A1=C3=D0=BA=D5=E8 ,= =CA=D8=C3=D2=C9=B8=D2=B9=D5 =E1=C5=D0 =BE=D1=B7=C2=D2 ,=AA=C5=BA=D8=C3=D5
    =E2=CD=A1=D2=CA =B7=D5=E8=B4=D5=E1=C5=D0=E0=BB=CD=C3=EC=E0=AB= =E7=B9=B5=EC=B7=D5=E8=A8=D0=E4=B4=E9=BC=D9=E9=AB=D7=E9=CD=E4=B4=E9=E0=C3=E7= =C7 =E1=A4=E8

    =C5=A7=BB=C3=D0=A1= =D2=C8 =A1=D1=BA=E0=C7=E7=BA=E4=AB=B5=EC=E0=C3=D2 WWW.STOCKLOT= TRADING.NET=A0 3 =E0=B4=D7=CD=B9 300 =BA=D2=B7=E0=B7=E8=D2= =B9=D1=E9=B9 =C3=C7=C1=E2=A6=C9=B3=D2=B7=D1=E8=C7=E2=C5=A1=E2=B4=C2 Google = AdWords
    =CA=B9=E3=A8 =B5=D4=B4=B5=E8=CD=B4=E8=C7=B9 =E1=C5=D0 =A2=D2= =C2=B4=E8=C7=B9

    =A2=CD=BA=A4=D8=B3= =A4=E8=D0

    =E0=BB=D4=E9=C5 .083= 3672 914=A0 EMAIL: apple@stocklottrading.net
    STOCKLOTTRADING.CO.LTD=A0 WWW.STOCKLOT= TRADING.NET

    =BA=C3=D4=C9=D1=B7 =CA=B5=EA=CD=A4=C5=E7=CD=B7 =E0=B7=C3=B4=B4=D4=E9=A7 =A8= =D3=A1=D1=B4

    9 =CB=C1=D9=E8=BA=E9=D2=B9 =C8=D4=C3= =D4=B9=E0=B7=BE 8 =AB.=C8=C3=D5=B4=E8=D2=B9 22 =B6=B9=B9 =C8=C3=D5=B9=A4=C3= =D4=B9=B7=C3=EC
    =B5.=BA=D2=A7=E1=A1=E9=C7 =CD.=BA=D2=A7=BE=C5=D5 =A8. =CA=D8=C1=B7=C3=BB=C3= =D2=A1=D2=C3 10540

    <= div style=3D"text-align:center">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,= ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,= ,,,,,,,,,

    Sorry for the inconvience if you d= on't wish to receive this email=A0

    Dear Khun

    We are looking for customers who sa= le/buy there property like house,land,condo and apartment
    On the moment we have to many customers who want to buy a hous= e,land,condo and apartment in Thailand.
    In the Area Bangkok, Chiang Mai, Phuket, Koh Samui, Krabi, Sur= at Thani and Pattaya, Chonburi.
    Chance to sell quickly=A0

    Advertising on our websi= te=A0 WWW.STOCKLOTTRADING.NET=A0 3 Months 300 B= aht incl advertising worldwide by google adwords
    Please connect us and sale quick your property
    Thank you

    Ple.083 3672 914=A0 EMAIL: apple@stocklottrading.net

    Stocklot Trading Co., Ltd
    9 M.Sirinthep 8 Soi Sridan 22, Srinakarin Road, Bang kaeo Bang= phli, Samut Prakan,
    Bangkok 10540 Thailand





    --
    FEEL= FREE TO CONTACT US >>>>>>>>=A0info@stocklottrading.net

    ----------------------------------------------------------------------= ---------------------------------------------
    Stocklot Trading Co., Ltd
    Contact: Damian= Baumler
    <= i>Tel: 0847241028
    --e89a8fb20078ec4b1604d447da2c-- From viric@viric.name Sun Jan 27 16:53:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DF1107F4C for ; Sun, 27 Jan 2013 16:53:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CCFF2304053 for ; Sun, 27 Jan 2013 14:53:08 -0800 (PST) X-ASG-Debug-ID: 1359327184-04cb6c3915173170001-NocioJ Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by cuda.sgi.com with ESMTP id yuueSPyVONjnDWUQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 27 Jan 2013 14:53:05 -0800 (PST) X-Barracuda-Envelope-From: viric@viric.name X-Barracuda-Apparent-Source-IP: 204.13.248.74 Received: from 102.128.79.188.dynamic.jazztel.es ([188.79.128.102] helo=mail.viric.name) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1Tzb60-000BMI-1x for xfs@oss.sgi.com; Sun, 27 Jan 2013 22:53:04 +0000 Received: by mail.viric.name (Postfix, from userid 1000) id 7081343FE31A; Sun, 27 Jan 2013 23:52:58 +0100 (CET) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 188.79.128.102 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX1/twu3r+3j02rnLPKgxfyFM Date: Sun, 27 Jan 2013 23:52:58 +0100 From: =?iso-8859-1?Q?Llu=EDs?= Batlle i Rossell To: xfs@oss.sgi.com Subject: Volume fine on x86_64, corruption on ARM Message-ID: <20130127225258.GA2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Volume fine on x86_64, corruption on ARM MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline X-Accept-Language: ca, es, eo, ru, en, jbo, tokipona User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mho-04-ewr.mailhop.org[204.13.248.74] X-Barracuda-Start-Time: 1359327184 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.2.121084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, I'm using linux 3.7.3 in both machines (x86_64 and armv5tel), and I creat= ed a volume in x86_64 to be the rootfs for the ARM. All fine, until I plugge= d it into the ARM (Log below). Given the corruption, I used xfs_repair in the x86_64, moved a lot of fil= es into lost+found, plugged it back to the ARM, booted, and corruption ag= ain. In the same USB HD, in the same ARM, and this same way, I've used succesf= ully ext4 and btrfs for a long time. Is there any known issue with ARM? Thank you, Llu=EDs. ---------------------- starting systemd... systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA += SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) Welcome to NixOS 0.2pre-4eb2b09-af495e0! Failed to insert module 'autofs4' dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........= &. XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/x= fs_da_btree.c. Caller 0xbf057e68 [] (unwind_backtrace+0x0/0xfc) from [] (dump_stack+0x= 20/0x24) [] (dump_stack+0x20/0x24) from [] (xfs_error_report+0= x64/0x70 [xfs]) [] (xfs_error_report+0x64/0x70 [xfs]) from [] (xfs_co= rruption_error+0x64/0x80 [xfs]) [] (xfs_corruption_error+0x64/0x80 [xfs]) from [] (xf= s_da_read_buf+0x1ac/0x27c [xfs]) [] (xfs_da_read_buf+0x1ac/0x27c [xfs]) from [] (xfs_d= ir2_leaf_readbuf+0x220/0x5f0 [xfs]) [] (xfs_dir2_leaf_readbuf+0x220/0x5f0 [xfs]) from [] = (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) [] (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) from []= (xfs_readdir+0xf0/0x170 [xfs]) [] (xfs_readdir+0xf0/0x170 [xfs]) from [] (xfs_file_r= eaddir+0x58/0x68 [xfs]) [] (xfs_file_readdir+0x58/0x68 [xfs]) from [] (vfs_re= addir+0x8c/0xb0) [] (vfs_readdir+0x8c/0xb0) from [] (sys_getdents64+0x= 78/0xd8) [] (sys_getdents64+0x78/0xd8) from [] (ret_fast_sysca= ll+0x0/0x2c) XFS (sda1): Corruption detected. Unmount and run xfs_repair dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........= &. XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/x= fs_da_btree.c. Caller 0xbf057e68 [] (unwind_backtrace+0x0/0xfc) from [] (dump_stack+0x= 20/0x24) [] (dump_stack+0x20/0x24) from [] (xfs_error_report+0= x64/0x70 [xfs]) [] (xfs_error_report+0x64/0x70 [xfs]) from [] (xfs_co= rruption_error+0x64/0x80 [xfs]) [] (xfs_corruption_error+0x64/0x80 [xfs]) from [] (xf= s_da_read_buf+0x1ac/0x27c [xfs]) [] (xfs_da_read_buf+0x1ac/0x27c [xfs]) from [] (xfs_d= ir2_leaf_readbuf+0x220/0x5f0 [xfs]) [] (xfs_dir2_leaf_readbuf+0x220/0x5f0 [xfs]) from [] = (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) [] (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) from []= (xfs_readdir+0xf0/0x170 [xfs]) [] (xfs_readdir+0xf0/0x170 [xfs]) from [] (xfs_file_r= eaddir+0x58/0x68 [xfs]) [] (xfs_file_readdir+0x58/0x68 [xfs]) from [] (vfs_re= addir+0x8c/0xb0) [] (vfs_readdir+0x8c/0xb0) from [] (sys_getdents64+0x= 78/0xd8) [] (sys_getdents64+0x78/0xd8) from [] (ret_fast_sysca= ll+0x0/0x2c) XFS (sda1): Corruption detected. Unmount and run xfs_repair Failed to load default target: No such file or directory Trying to load rescue target... Failed to load rescue target: No such file or directory systemd-cgroups-agent[1324]: Failed to get D-Bus connection: Failed to co= nnect to socket /org/freedesktop/systemd1/private: Connection refused From sandeen@sandeen.net Sun Jan 27 19:52:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B375E7F4C for ; Sun, 27 Jan 2013 19:52:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A28A38F8049 for ; Sun, 27 Jan 2013 17:52:50 -0800 (PST) X-ASG-Debug-ID: 1359337969-04cbb00c6516b270001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ndcp3yY0MCFhAejJ for ; Sun, 27 Jan 2013 17:52:49 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [192.168.1.104] (c-98-240-249-49.hsd1.mn.comcast.net [98.240.249.49]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E265963C59C4; Sun, 27 Jan 2013 19:52:48 -0600 (CST) References: <20130127225258.GA2287@vicerveza.homeunix.net> Mime-Version: 1.0 (1.0) In-Reply-To: <20130127225258.GA2287@vicerveza.homeunix.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Message-Id: <97703AFC-91DF-4839-BE07-1BE8B8A4AF91@sandeen.net> Cc: "xfs@oss.sgi.com" X-Mailer: iPhone Mail (10A523) From: Eric Sandeen Subject: Re: Volume fine on x86_64, corruption on ARM Date: Sun, 27 Jan 2013 19:52:45 -0600 X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM To: =?utf-8?Q?Llu=C3=ADs_Batlle_i_Rossell?= X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359337969 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.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121093 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars On Jan 27, 2013, at 4:52 PM, Llu=C3=ADs Batlle i Rossell w= rote: > Hello, >=20 > I'm using linux 3.7.3 in both machines (x86_64 and armv5tel), and I create= d > a volume in x86_64 to be the rootfs for the ARM. All fine, until I plugged= it > into the ARM (Log below). >=20 Is it stock 3.7.3 on arm, or are there any patches affecting xfs? There wer= e dodgy arm/xfs patches floating around a few years ago, just want to be sur= e they are not in use in your case... Thanks, Eric > Given the corruption, I used xfs_repair in the x86_64, moved a lot of file= s into lost+found, plugged it back to the ARM, booted, and corruption again.= >=20 > In the same USB HD, in the same ARM, and this same way, I've used succesfu= lly > ext4 and btrfs for a long time. Is there any known issue with ARM? >=20 > Thank you, > Llu=C3=ADs. >=20 > ---------------------- > starting systemd... > systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA +S= YSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) >=20 > Welcome to NixOS 0.2pre-4eb2b09-af495e0! >=20 > Failed to insert module 'autofs4' > dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........&= . > XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/xf= s_da_btree.c. Caller 0xbf057e68 >=20 > [] (unwind_backtrace+0x0/0xfc) from [] (dump_stack+0x2= 0/0x24) > [] (dump_stack+0x20/0x24) from [] (xfs_error_report+0x= 64/0x70 [xfs]) > [] (xfs_error_report+0x64/0x70 [xfs]) from [] (xfs_cor= ruption_error+0x64/0x80 [xfs]) > [] (xfs_corruption_error+0x64/0x80 [xfs]) from [] (xfs= _da_read_buf+0x1ac/0x27c [xfs]) > [] (xfs_da_read_buf+0x1ac/0x27c [xfs]) from [] (xfs_di= r2_leaf_readbuf+0x220/0x5f0 [xfs]) > [] (xfs_dir2_leaf_readbuf+0x220/0x5f0 [xfs]) from [] (= xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) > [] (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) from [] (= xfs_readdir+0xf0/0x170 [xfs]) > [] (xfs_readdir+0xf0/0x170 [xfs]) from [] (xfs_file_re= addir+0x58/0x68 [xfs]) > [] (xfs_file_readdir+0x58/0x68 [xfs]) from [] (vfs_rea= ddir+0x8c/0xb0) > [] (vfs_readdir+0x8c/0xb0) from [] (sys_getdents64+0x7= 8/0xd8) > [] (sys_getdents64+0x78/0xd8) from [] (ret_fast_syscal= l+0x0/0x2c) > XFS (sda1): Corruption detected. Unmount and run xfs_repair > dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........&= . > XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/xf= s_da_btree.c. Caller 0xbf057e68 >=20 > [] (unwind_backtrace+0x0/0xfc) from [] (dump_stack+0x2= 0/0x24) > [] (dump_stack+0x20/0x24) from [] (xfs_error_report+0x= 64/0x70 [xfs]) > [] (xfs_error_report+0x64/0x70 [xfs]) from [] (xfs_cor= ruption_error+0x64/0x80 [xfs]) > [] (xfs_corruption_error+0x64/0x80 [xfs]) from [] (xfs= _da_read_buf+0x1ac/0x27c [xfs]) > [] (xfs_da_read_buf+0x1ac/0x27c [xfs]) from [] (xfs_di= r2_leaf_readbuf+0x220/0x5f0 [xfs]) > [] (xfs_dir2_leaf_readbuf+0x220/0x5f0 [xfs]) from [] (= xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) > [] (xfs_dir2_leaf_getdents+0x12c/0x3ec [xfs]) from [] (= xfs_readdir+0xf0/0x170 [xfs]) > [] (xfs_readdir+0xf0/0x170 [xfs]) from [] (xfs_file_re= addir+0x58/0x68 [xfs]) > [] (xfs_file_readdir+0x58/0x68 [xfs]) from [] (vfs_rea= ddir+0x8c/0xb0) > [] (vfs_readdir+0x8c/0xb0) from [] (sys_getdents64+0x7= 8/0xd8) > [] (sys_getdents64+0x78/0xd8) from [] (ret_fast_syscal= l+0x0/0x2c) > XFS (sda1): Corruption detected. Unmount and run xfs_repair > Failed to load default target: No such file or directory > Trying to load rescue target... > Failed to load rescue target: No such file or directory > systemd-cgroups-agent[1324]: Failed to get D-Bus connection: Failed to con= nect to socket /org/freedesktop/systemd1/private: Connection refused >=20 >=20 >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From david@fromorbit.com Sun Jan 27 20:38:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 030027F4C for ; Sun, 27 Jan 2013 20:38:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E5A508F8039 for ; Sun, 27 Jan 2013 18:38:22 -0800 (PST) X-ASG-Debug-ID: 1359340700-04cb6c3915177650001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ef4ASvDbrPKM5vFy for ; Sun, 27 Jan 2013 18:38:21 -0800 (PST) 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: Av4EAJnjBVF3DFSY/2dsb2JhbABFvmMWc4IeAQEFOj8QCAMNCwklDwUoIROIEL5wkD9hA5YMhg4DgzyGfIML Received: from unknown (HELO disturbed) ([119.12.84.152]) by ipmail07.adl2.internode.on.net with ESMTP; 28 Jan 2013 13:08:19 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1TzchL-0008HQ-LE; Mon, 28 Jan 2013 11:35:43 +1100 Date: Mon, 28 Jan 2013 11:35:42 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures Message-ID: <20130128003542.GB16727@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures Mail-Followup-To: Eric Sandeen , xfs@oss.sgi.com References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> <1359240032-11576-3-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359240032-11576-3-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1359340700 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.2.121095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Jan 26, 2013 at 04:40:26PM -0600, Eric Sandeen wrote: > This is a merge-to-userspace of kernel commit a0041684 > xfs: zero allocation_args on the kernel stack > > When calling xfs_alloc_vextent args.userdata was uninitialized, > and if we had args.type==XFS_ALLOCTYPE_START_BNO, this uninit > structure member got tested, leading to some random allocator > behavior. Got that as part of the kernel-user sync I sent out a couple of weeks back. BTW, perhaps we want to get that sync sorted out before shovelling a bunch of stuff into xfsprogs that will require fixing conflicts in that sync up? Chers, Dave. -- Dave Chinner david@fromorbit.com From esandeen@redhat.com Sun Jan 27 20:41:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6D83E7F4C for ; Sun, 27 Jan 2013 20:41:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 399AE8F8039 for ; Sun, 27 Jan 2013 18:41:37 -0800 (PST) X-ASG-Debug-ID: 1359340895-04bdf0231d184f50001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id xkZqUMl0hP2EsG1R for ; Sun, 27 Jan 2013 18:41:36 -0800 (PST) X-Barracuda-Envelope-From: esandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0S2fS9C001289; Sun, 27 Jan 2013 21:41:28 -0500 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> <1359240032-11576-3-git-send-email-sandeen@redhat.com> <20130128003542.GB16727@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures From: Eric Sandeen MIME-Version: 1.0 In-Reply-To: <20130128003542.GB16727@disturbed.disaster> Message-Id: Date: Sun, 27 Jan 2013 21:41:28 -0500 (EST) To: Dave Chinner Cc: Eric Sandeen , "xfs@oss.sgi.com" X-Mailer: Zimbra 7.2.0_GA_2669 (MobileSync - Apple-iPhone3C1/1001.523) X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1359340895 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.2.121095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Jan 27, 2013, at 8:38 PM, Dave Chinner wrote: > On Sat, Jan 26, 2013 at 04:40:26PM -0600, Eric Sandeen wrote: >> This is a merge-to-userspace of kernel commit a0041684 >> xfs: zero allocation_args on the kernel stack >> >> When calling xfs_alloc_vextent args.userdata was uninitialized, >> and if we had args.type==XFS_ALLOCTYPE_START_BNO, this uninit >> structure member got tested, leading to some random allocator >> behavior. > > Got that as part of the kernel-user sync I sent out a couple of > weeks back. > > BTW, perhaps we want to get that sync sorted out before shovelling > a bunch of stuff into xfsprogs that will require fixing conflicts in > that sync up? > I have no problem with this going 2nd, I can fix up as needed. -Eric > Chers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From gnehzuil.liu@gmail.com Mon Jan 28 01:20:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_TO_NO_BRKTS_FREEMAIL 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 227C97F4C for ; Mon, 28 Jan 2013 01:20:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 106F98F8050 for ; Sun, 27 Jan 2013 23:20:22 -0800 (PST) X-ASG-Debug-ID: 1359357620-04cb6c391517d8f0001-NocioJ Received: from mail-pa0-f50.google.com (mail-pa0-f50.google.com [209.85.220.50]) by cuda.sgi.com with ESMTP id FEThJ07bFk0Hxu3b (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 23:20:21 -0800 (PST) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.50 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] Received: by mail-pa0-f50.google.com with SMTP id hz10so1347279pad.37 for ; Sun, 27 Jan 2013 23:20:20 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer; bh=P7E7DhI6Lz3pwT/K4dnlMRVic7MOa082tm3SQlSKjrY=; b=q/F6Wsktfr0Nm6e8mA2TqLkO82Uk/QcQliI/nw9yN5cck6E3MW+SqgA6qlPcb6LrGe 7EbMz2khhpCCCqhc4FBOaDxCIujixq0Xtzy4Oko90m3mYsjJBy5KC+l7vQm1/mWhVslf UVT9qzBPLy83WiSuTtDqXgZHjqRDxRfW8RfNYQHx+eA+X0ZtoMHVX2KX7DPJaGdV/WTJ LEGf34QKqbdUU2yXuUycRYCtj4kAtJsWkbXGPjXidXkRIZO+1wy4QujEmYrz3o2Ttbj6 gWa7EEDbJONnwC+wCP5yAlBmzdtbD90/ve9UJ5zTs0pLLZSlObmRPNXqRMvdHybbbj7H Csig== X-Received: by 10.68.227.97 with SMTP id rz1mr35242737pbc.54.1359357620490; Sun, 27 Jan 2013 23:20:20 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id t6sm6226006paz.11.2013.01.27.23.20.15 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 23:20:19 -0800 (PST) From: Zheng Liu To: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Dave Chinner Subject: [PATCH 0/4] xfstests: seek data/hole and hole punching improvements Date: Mon, 28 Jan 2013 15:32:47 +0800 X-ASG-Orig-Subj: [PATCH 0/4] xfstests: seek data/hole and hole punching improvements Message-Id: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e X-Barracuda-Connect: mail-pa0-f50.google.com[209.85.220.50] X-Barracuda-Start-Time: 1359357621 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.2.121114 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 Hi all, Here is my first try to improve seek data/hole and hole punching test cases in xfstests. The key issue in 255 and 285 is that they assume that all file systems that are tested support unwritten extent preallocation. Before 3.8 kernel it is correct. But now ext4 file system has ability to seek data/hole and punch a hole for a file w/o unwritten extent. So it is time to improve these test cases. In this patch series it calls _require_xfs_io_falloc in 255 and 285 to make sure that unwritten extent is supprted by tested file system. A new argument '-t' is added into seek_sanity_test to check a file system that supports seek data/hole or not. In the mean time _require_seek_data_hole is defined to be used by all tests. Further two new test cases are created to test seek data/hole and hole punching w/o unwritten extent, which do the same thing like 255 and 285 except that they don't do some test cases which are related to unwritten extent. Any comments or feedbacks are welcome. Thanks, - Zheng Zheng Liu (4): xfstests: check unwritten extent preallocation in 255 xfstests: 295: test fallocate hole punching for all file systems xfstests: check llseek(2) SEEK_DATA/HOLE and unwritten extent preallocation in 285 xfstests: 296: add a seek data/hole test w/o unwritten extent 255 | 3 +- 285 | 7 +- 295 | 68 +++++++++++ 295.out | 307 +++++++++++++++++++++++++++++++++++++++++++++++++ 296 | 57 +++++++++ 296.out | 1 + common.rc | 12 ++ group | 2 + src/seek_sanity_test.c | 46 ++++++-- 9 files changed, 491 insertions(+), 12 deletions(-) mode change 100644 => 100755 285 create mode 100755 295 create mode 100644 295.out create mode 100755 296 create mode 100644 296.out -- 1.7.12.rc2.18.g61b472e From gnehzuil.liu@gmail.com Mon Jan 28 01:20:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_TO_NO_BRKTS_FREEMAIL 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 7EB597F52 for ; Mon, 28 Jan 2013 01:20:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 222A7AC001 for ; Sun, 27 Jan 2013 23:20:27 -0800 (PST) X-ASG-Debug-ID: 1359357626-04bdf0231e18ae40001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id RB6Udt8wTzUdq7db (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 23:20:26 -0800 (PST) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.43] Received: by mail-pa0-f43.google.com with SMTP id fb10so1351157pad.16 for ; Sun, 27 Jan 2013 23:20:26 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=Fl0rTPdNqsWxtFEPFskEdD4bhXktpsnFvvlgNnJNRSc=; b=qtsM5yQutDtHoixmZucPhtW622H+p3Qt24hPdB0AlW28HSGlcuQ+XMWB6TIZK70RAV J7/PUKkAsUlwd1fkPMNUdYfyQO/z598MRR1t6f/t853cUYSIip+0CcC1ltChWUHmuJv+ TG3MmS3uiOv8aKxBPK4J/IY77Bz5IeexNE+Pr3pEBffL/tE/4vRAtfTa55E5NUTNqE1W f0XpWnG9A3Fveu2I4zF7CJtYNL5Zosqo2ywunP3/R6VAh7ijqn+Yacyzo/g70B67jEy4 0QRgANiAIFdP0bPnHYeq2VrUi/k/xpeG3vv87j3mqfseef/Z0gYvcEPwQ1YDuJD81zMN uYYQ== X-Received: by 10.68.227.73 with SMTP id ry9mr34927895pbc.73.1359357626121; Sun, 27 Jan 2013 23:20:26 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id t6sm6226006paz.11.2013.01.27.23.20.21 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 23:20:25 -0800 (PST) From: Zheng Liu To: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Dave Chinner Subject: [PATCH 1/4] xfstests: check unwritten extent preallocation in 255 Date: Mon, 28 Jan 2013 15:32:48 +0800 X-ASG-Orig-Subj: [PATCH 1/4] xfstests: check unwritten extent preallocation in 255 Message-Id: <1359358371-21411-2-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e In-Reply-To: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> References: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1359357626 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.2.121114 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 From: Zheng Liu 255 misses call _require_xfs_io_falloc to check whether a filesystem supports fallocate(2) to preallocate unwritten extents or not. Signed-off-by: Zheng Liu Cc: "Theodore Ts'o" Cc: Dave Chinner --- 255 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/255 b/255 index 0083963..700c3c0 100755 --- a/255 +++ b/255 @@ -1,7 +1,7 @@ #! /bin/bash # FS QA Test No. 255 # -# Test Generic fallocate hole punching +# Test Generic fallocate hole punching w/ unwritten extent # #----------------------------------------------------------------------- # Copyright (c) 2010 Red Hat. All Rights Reserved. @@ -47,6 +47,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux +_require_xfs_io_falloc _require_xfs_io_falloc_punch _require_xfs_io_fiemap -- 1.7.12.rc2.18.g61b472e From gnehzuil.liu@gmail.com Mon Jan 28 01:20:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_TO_NO_BRKTS_FREEMAIL 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 EA6B37F52 for ; Mon, 28 Jan 2013 01:20:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA1DC8F8054 for ; Sun, 27 Jan 2013 23:20:33 -0800 (PST) X-ASG-Debug-ID: 1359357631-04bdf0231a18ae40001-NocioJ Received: from mail-da0-f51.google.com (mail-da0-f51.google.com [209.85.210.51]) by cuda.sgi.com with ESMTP id iY6AMVTYKOBQ2hh4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 23:20:31 -0800 (PST) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.51 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.51] Received: by mail-da0-f51.google.com with SMTP id i30so1107262dad.38 for ; Sun, 27 Jan 2013 23:20:31 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.51] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.51] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=ixUK9o8B01d/J4c2RvL/0GNQPScGE+ibYQcPsNs8eLc=; b=yrtBUrBgsONUemSQCDv234OmSXNC6GmRIONxJw2zlIGs6JT0jYTAsGOV2vQXQE0+Qj OwTdl8SThbOEsK+CrqhHJAsrdFLhhdz/Tpk1fArqCCE9XRA7na9d9mC0W6qHcQxtZZXT pKWZch2M9ORCXeYxWJm/Y5VU3LHiBCtam5+nrY3RPvdG7XtXDAjYmp3k05V5Gct2N9Ur 22mCc/UlFr2ae4v6lgAqlWyLIXclnJNBYN+FaRG7qpr3n9Hfso8rSP7gCivO9hdxXeNg HDvaqYAPXc070wxuDxgoqsmZxImywCzcC64ulaOYEHr3YzhXwuLNRVTNejZym5f+AuKt qI7Q== X-Received: by 10.68.186.197 with SMTP id fm5mr9376999pbc.60.1359357631614; Sun, 27 Jan 2013 23:20:31 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id t6sm6226006paz.11.2013.01.27.23.20.26 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 23:20:31 -0800 (PST) From: Zheng Liu To: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Dave Chinner Subject: [PATCH 2/4] xfstests: 295: test fallocate hole punching for all file systems Date: Mon, 28 Jan 2013 15:32:49 +0800 X-ASG-Orig-Subj: [PATCH 2/4] xfstests: 295: test fallocate hole punching for all file systems Message-Id: <1359358371-21411-3-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e In-Reply-To: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> References: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> X-Barracuda-Connect: mail-da0-f51.google.com[209.85.210.51] X-Barracuda-Start-Time: 1359357631 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.2.121114 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 From: Zheng Liu In 255 it tries to test fallocate hole punching for a file system, but it is only for the file system that supports to preallocate unwritten extents. Recently ext4 file systems will support hole punching feature for a indirect-based file. So a new test case is created to test it. Here this test case does the same thing like 255 except it doesn't try to preallocate some unwritten extents. Certainly all file systems that support hole punching feature and can preallocate unwritten extents also survive in this test case. Signed-off-by: Zheng Liu Cc: "Theodore Ts'o" Cc: Dave Chinner --- 295 | 68 ++++++++++++++ 295.out | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 3 files changed, 376 insertions(+) create mode 100755 295 create mode 100644 295.out diff --git a/295 b/295 new file mode 100755 index 0000000..3df7dc8 --- /dev/null +++ b/295 @@ -0,0 +1,68 @@ +#! /bin/bash +# FS QA Test No. 295 +# +# Test Generic fallocate hole punching w/o unwritten extent +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Alibaba Group. 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 +#----------------------------------------------------------------------- +# +# creator +owner=wenqing.lz@taobao.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_fiemap + +testfile=$TEST_DIR/295.$$ + +# Standard punch hole tests +_test_generic_punch pwrite fpunch fpunch fiemap _filter_hole_fiemap $testfile -F + +# Delayed allocation punch hole tests +_test_generic_punch -d pwrite fpunch fpunch fiemap _filter_hole_fiemap $testfile -F + +# Multi hole punch tests +_test_generic_punch -k pwrite fpunch fpunch fiemap _filter_hole_fiemap $testfile -F + +# Delayed allocation multi punch hole tests +_test_generic_punch -d -k pwrite fpunch fpunch fiemap _filter_hole_fiemap $testfile -F + +# success, all done +status=0 +exit diff --git a/295.out b/295.out new file mode 100644 index 0000000..c4c495f --- /dev/null +++ b/295.out @@ -0,0 +1,307 @@ +QA output created by 295 + 1. into a hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..23]: hole +1: [24..31]: extent +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..23]: hole +1: [24..31]: extent +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 6. data -> hole +0: [0..7]: extent +1: [8..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +5309cc2f1fc5a7f94cf52915caef35bd + 8. unwritten -> hole +0: [0..7]: extent +1: [8..39]: hole +1b3779878366498b28c702ef88c4a773 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +5309cc2f1fc5a7f94cf52915caef35bd + 10. hole -> data -> hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: extent +13535fd4d496bf0b74bb2335aa4d1b31 + 1. into a hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..23]: hole +1: [24..31]: extent +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..23]: hole +1: [24..31]: extent +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 6. data -> hole +0: [0..7]: extent +1: [8..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +5309cc2f1fc5a7f94cf52915caef35bd + 8. unwritten -> hole +0: [0..7]: extent +1: [8..39]: hole +1b3779878366498b28c702ef88c4a773 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +5309cc2f1fc5a7f94cf52915caef35bd + 10. hole -> data -> hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: extent +13535fd4d496bf0b74bb2335aa4d1b31 + 1. into a hole +0: [0..7]: extent +1: [8..39]: hole +5a58e46082be047d0f13bee7974015b9 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: extent +13535fd4d496bf0b74bb2335aa4d1b31 + 1. into a hole +0: [0..7]: extent +1: [8..39]: hole +5a58e46082be047d0f13bee7974015b9 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..39]: extent +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: hole +1: [16..39]: extent +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: extent +13535fd4d496bf0b74bb2335aa4d1b31 diff --git a/group b/group index 505bc7f..a07d7f3 100644 --- a/group +++ b/group @@ -413,3 +413,4 @@ deprecated 292 auto mkfs quick 293 auto quick 294 auto quick +295 auto quick prealloc -- 1.7.12.rc2.18.g61b472e From gnehzuil.liu@gmail.com Mon Jan 28 01:20:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_TO_NO_BRKTS_FREEMAIL 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 DC5AF7F5E for ; Mon, 28 Jan 2013 01:20:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CAC6B8F8054 for ; Sun, 27 Jan 2013 23:20:38 -0800 (PST) X-ASG-Debug-ID: 1359357637-04cb6c391317d910001-NocioJ Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by cuda.sgi.com with ESMTP id hDvbxaIy4HXcrxqt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 23:20:37 -0800 (PST) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.52 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.52] Received: by mail-pa0-f52.google.com with SMTP id fb1so1343263pad.11 for ; Sun, 27 Jan 2013 23:20:37 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.52] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.52] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=HeUGESSVj6wWNYyUl9PYmYWUdidcQrSADNTdwiXmCkk=; b=ATXutGHYvoOBCUktgrmMP89YqyYK2ue2t2wFOo6kX6aHqi+gRvXbTyLLvyYY8sZZi6 iTtOvk8binlCca2coix6Db4ssvmI65J9q4yBLemYgqZ4FQ9G9i6TYRS9YMZMFmOL8U0B ITTMCX37WjXbSiV4WGCqP2jMDiV4ZE2DeXgA8sR84NjnD+xEiEm8rUSyKvqOppTotonW vu/aXa4O1Q8gLcivzBaVBsMDnw4B47yftvsNhvl4diJqJShjlDGRprBfBMJqMLsRVXmQ X2EzFjwSNflmQoTL4sBuWRO1e0GBr/gHqcRqbEf4VaDpiCvpsJ/gfe61sspAoeLzHJwt tvnQ== X-Received: by 10.68.219.67 with SMTP id pm3mr35468855pbc.150.1359357637085; Sun, 27 Jan 2013 23:20:37 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id t6sm6226006paz.11.2013.01.27.23.20.32 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 23:20:36 -0800 (PST) From: Zheng Liu To: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Dave Chinner Subject: [PATCH 3/4] xfstests: check llseek(2) SEEK_DATA/HOLE and unwritten extent preallocation in 285 Date: Mon, 28 Jan 2013 15:32:50 +0800 X-ASG-Orig-Subj: [PATCH 3/4] xfstests: check llseek(2) SEEK_DATA/HOLE and unwritten extent preallocation in 285 Message-Id: <1359358371-21411-4-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e In-Reply-To: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> References: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> X-Barracuda-Connect: mail-pa0-f52.google.com[209.85.220.52] X-Barracuda-Start-Time: 1359357637 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.2.121114 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 From: Zheng Liu In 285 it has its own check for seek data/hole support. This commit turns into an equivalent _require_seek_data_hole. Meanwhile in 285 it doesn't check unwritten extent preallocation. Now ext4 file system has supported seek data/hole for a file w/o unwritten extent. Thus, in 285, it needs to call the _require_xfs_io_falloc to check unwritten extent prealloction. Signed-off-by: Zheng Liu Cc: "Theodore Ts'o" Cc: Dave Chinner --- 285 | 7 +++++-- common.rc | 12 ++++++++++++ src/seek_sanity_test.c | 18 +++++++++++++----- 3 files changed, 30 insertions(+), 7 deletions(-) mode change 100644 => 100755 285 diff --git a/285 b/285 old mode 100644 new mode 100755 index a18fc71..6224673 --- a/285 +++ b/285 @@ -1,7 +1,7 @@ #! /bin/bash # FS QA Test No. 285 # -# SEEK_DATA/SEEK_HOLE sanity tests. +# SEEK_DATA/SEEK_HOLE sanity tests w/ unwritten extent. # # Improved by Jeff.liu@oracle.com # Creater: josef@redhat.com @@ -41,9 +41,12 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux +_require_seek_data_hole +_require_xfs_io_falloc + BASE_TEST_FILE=$TEST_DIR/seek_sanity_testfile -[ -x $here/src/seek_sanity_test ] || _notrun "seek_sanitfy_tester not built" +[ -x $here/src/seek_sanity_test ] || _notrun "seek_sanity_tester not built" _cleanup() { diff --git a/common.rc b/common.rc index 2e8581e..35a5f52 100644 --- a/common.rc +++ b/common.rc @@ -1049,6 +1049,18 @@ _require_sparse_files() esac } +# +# Check if the filesystem supports seek_data/hole. +# +_require_seek_data_hole() +{ + testfile=$TEST_DIR/$$.seek + testseek=`$here/src/seek_sanity_test -t $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null + echo $testseek | grep -q "Kernel does not support" && \ + _notrun "File system does not support llseek(2) SEEK_DATA/HOLE" +} + # check that a FS on a device is mounted # if so, return mount point # diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c index 3897f02..b1ef006 100644 --- a/src/seek_sanity_test.c +++ b/src/seek_sanity_test.c @@ -660,17 +660,25 @@ int main(int argc, char **argv) { int ret = -1; int i = 0; + int opt; + int check_support = 0; int numtests = sizeof(seek_tests) / sizeof(struct testrec); - if (argc != 2) { - fprintf(stdout, "Usage: %s base_file_path\n", argv[0]); - return ret; + while ((opt = getopt(argc, argv, "t")) != -1) { + switch (opt) { + case 't': + check_support++; + break; + default: + fprintf(stdout, "Usage: %s [-t] base_file_path\n", argv[0]); + return ret; + } } - base_file_path = (char *)strdup(argv[1]); + base_file_path = (char *)strdup(argv[optind]); ret = test_basic_support(); - if (ret) + if (ret || check_support) goto out; for (i = 0; i < numtests; ++i) { -- 1.7.12.rc2.18.g61b472e From gnehzuil.liu@gmail.com Mon Jan 28 01:20:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_TO_NO_BRKTS_FREEMAIL 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 B89397F4C for ; Mon, 28 Jan 2013 01:20:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B7BD30405F for ; Sun, 27 Jan 2013 23:20:44 -0800 (PST) X-ASG-Debug-ID: 1359357642-04bdf0231e18ae70001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id 01x8cg10BEflFmAJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Jan 2013 23:20:43 -0800 (PST) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] Received: by mail-pa0-f46.google.com with SMTP id kp14so1341146pab.19 for ; Sun, 27 Jan 2013 23:20:42 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=/HSsKSzmhXWrp8F/n5keOmcvC9NQ+VoIUbJSx18TGpk=; b=pMJUCQsw/KrfAvoGt1d+SoFFD5cSykBrGypEctLZNmhQjxQfa/jgGnhBuIGoJj1AW1 uTtYtJFA/sFBNGA4eBH5OCdh6b0PFFK/2PWuuiJFgXrkjF4TLqYnyjKcyBXUQ+4z4dLn DaM0Dr+ADhKX9OUzysK0cfSM6Wj2QgD2dR0gvqNZQXAZizArXJ5nM4ybPHrr4ICue0CK 4MAF2ncRvlSbDWeQBvnBLYjdS3oUJEvDlPrjU2Oc7G5Zte3aSPOWw27KX9KbaGmz8wGu iP1q0wzMnQLY5xAbAU67Onhg39pS1C5Z5WVSiTHzmdOMz5DNHhbSNAMYyd5qtNWfEWBQ B5JQ== X-Received: by 10.68.227.97 with SMTP id rz1mr35244482pbc.54.1359357642683; Sun, 27 Jan 2013 23:20:42 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id t6sm6226006paz.11.2013.01.27.23.20.37 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 23:20:41 -0800 (PST) From: Zheng Liu To: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Dave Chinner Subject: [PATCH 4/4] xfstests: 296: add a seek data/hole test w/o unwritten extent Date: Mon, 28 Jan 2013 15:32:51 +0800 X-ASG-Orig-Subj: [PATCH 4/4] xfstests: 296: add a seek data/hole test w/o unwritten extent Message-Id: <1359358371-21411-5-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e In-Reply-To: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> References: <1359358371-21411-1-git-send-email-wenqing.lz@taobao.com> X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1359357642 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.2.121114 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 From: Zheng Liu Now ext4 has supported seek data/hole w/o unwritten extent. This commit creates a new test case to do seek data/hole sanity test w/o unwritten extent. All file systems that support seek_data/hole should survive after running this test. Signed-off-by: Zheng Liu Cc: "Theodore Ts'o" Cc: Dave Chinner --- 296 | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 296.out | 1 + group | 1 + src/seek_sanity_test.c | 30 +++++++++++++++++++++----- 4 files changed, 84 insertions(+), 5 deletions(-) create mode 100755 296 create mode 100644 296.out diff --git a/296 b/296 new file mode 100755 index 0000000..8a49a0f --- /dev/null +++ b/296 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 296 +# +# SEEK_DATA/SEEK_HOLE sanity test w/o unwritten extent. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Alibaba Group. 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 +#----------------------------------------------------------------------- +# +# creator +owner=wenqing.lz@taobao.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + eval "rm -f $BASE_TEST_FILE.*" +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fs generic +_supported_os IRIX Linux + +_require_seek_data_hole + +BASE_TEST_FILE=$TEST_DIR/seek_sanity_testfile + +[ -x $here/src/seek_sanity_test ] || _notrun "seek_sanity_tester not built" + +$here/src/seek_sanity_test -u $BASE_TEST_FILE > $seq.full 2>&1 || + _fail "seek sanity check failed!" + +# success, all done +status=0 +exit diff --git a/296.out b/296.out new file mode 100644 index 0000000..7921f57 --- /dev/null +++ b/296.out @@ -0,0 +1 @@ +QA output created by 296 diff --git a/group b/group index a07d7f3..3019924 100644 --- a/group +++ b/group @@ -414,3 +414,4 @@ deprecated 293 auto quick 294 auto quick 295 auto quick prealloc +296 auto rw diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c index b1ef006..bfa5e52 100644 --- a/src/seek_sanity_test.c +++ b/src/seek_sanity_test.c @@ -567,7 +567,16 @@ struct testrec { char *test_desc; }; -struct testrec seek_tests[] = { +struct testrec no_unwritten_seek_tests[] = { + { 1, test01, "Test empty file" }, + { 2, test02, "Test a tiny full file" }, + { 3, test03, "Test a larger full file" }, + { 4, test04, "Test file hole at beg, data at end" }, + { 5, test05, "Test file data at beg, hole at end" }, + { 6, test06, "Test file hole data hole data" }, +}; + +struct testrec full_seek_tests[] = { { 1, test01, "Test empty file" }, { 2, test02, "Test a tiny full file" }, { 3, test03, "Test a larger full file" }, @@ -662,15 +671,20 @@ int main(int argc, char **argv) int i = 0; int opt; int check_support = 0; - int numtests = sizeof(seek_tests) / sizeof(struct testrec); + int dont_unwritten = 0; + int numtests = sizeof(full_seek_tests) / sizeof(struct testrec); + struct testrec *tests = full_seek_tests; - while ((opt = getopt(argc, argv, "t")) != -1) { + while ((opt = getopt(argc, argv, "tu")) != -1) { switch (opt) { case 't': check_support++; break; + case 'u': + dont_unwritten++; + break; default: - fprintf(stdout, "Usage: %s [-t] base_file_path\n", argv[0]); + fprintf(stdout, "Usage: %s [-tu] base_file_path\n", argv[0]); return ret; } } @@ -681,8 +695,14 @@ int main(int argc, char **argv) if (ret || check_support) goto out; + if (dont_unwritten) { + numtests = sizeof(no_unwritten_seek_tests) / + sizeof(struct testrec); + tests = no_unwritten_seek_tests; + } + for (i = 0; i < numtests; ++i) { - ret = run_test(&seek_tests[i]); + ret = run_test(&tests[i]); if (ret) break; } -- 1.7.12.rc2.18.g61b472e From viric@viric.name Mon Jan 28 02:03:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 31D687F4C for ; Mon, 28 Jan 2013 02:03:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1092B8F8050 for ; Mon, 28 Jan 2013 00:03:09 -0800 (PST) X-ASG-Debug-ID: 1359360184-04bdf0231d18bf50001-NocioJ Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by cuda.sgi.com with ESMTP id JRb9OfcTvAGPuYT4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 00:03:05 -0800 (PST) X-Barracuda-Envelope-From: viric@viric.name X-Barracuda-Apparent-Source-IP: 204.13.248.74 Received: from 102.128.79.188.dynamic.jazztel.es ([188.79.128.102] helo=mail.viric.name) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1TzjgG-000JYj-GT; Mon, 28 Jan 2013 08:03:04 +0000 Received: by mail.viric.name (Postfix, from userid 1000) id AA34443FE353; Mon, 28 Jan 2013 09:03:00 +0100 (CET) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 188.79.128.102 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX1/8f+s7qk2JvmaSmVty2+6+ Date: Mon, 28 Jan 2013 09:03:00 +0100 From: =?iso-8859-1?Q?Llu=EDs?= Batlle i Rossell To: Eric Sandeen Cc: "xfs@oss.sgi.com" Subject: Re: Volume fine on x86_64, corruption on ARM Message-ID: <20130128080300.GB2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <97703AFC-91DF-4839-BE07-1BE8B8A4AF91@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <97703AFC-91DF-4839-BE07-1BE8B8A4AF91@sandeen.net> X-Accept-Language: ca, es, eo, ru, en, jbo, tokipona User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mho-04-ewr.mailhop.org[204.13.248.74] X-Barracuda-Start-Time: 1359360185 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.2.121116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jan 27, 2013 at 07:52:45PM -0600, Eric Sandeen wrote: > On Jan 27, 2013, at 4:52 PM, Llu=EDs Batlle i Rossell wrote: >=20 > > Hello, > >=20 > > I'm using linux 3.7.3 in both machines (x86_64 and armv5tel), and I c= reated > > a volume in x86_64 to be the rootfs for the ARM. All fine, until I pl= ugged it > > into the ARM (Log below). > >=20 >=20 > Is it stock 3.7.3 on arm, or are there any patches affecting xfs? Ther= e were > dodgy arm/xfs patches floating around a few years ago, just want to be = sure > they are not in use in your case... Stock 3.7.3. The sheevaplug computer is supported in stock kernel, so I d= on't use any patch. Regards, Llu=EDs. From stan@hardwarefreak.com Mon Jan 28 04:47:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F04477F4C for ; Mon, 28 Jan 2013 04:47:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 809B4AC001 for ; Mon, 28 Jan 2013 02:46:58 -0800 (PST) X-ASG-Debug-ID: 1359370017-04cbb00c6617c370001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id zR9brEEDrXyGSxkC for ; Mon, 28 Jan 2013 02:46:57 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 3922B6C0B5; Mon, 28 Jan 2013 04:46:57 -0600 (CST) Message-ID: <51065721.40102@hardwarefreak.com> Date: Mon, 28 Jan 2013 04:46:57 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Llu=EDs_Batlle_i_Rossell?= CC: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM In-Reply-To: <20130127225258.GA2287@vicerveza.homeunix.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1359370017 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 1/27/2013 4:52 PM, Llus Batlle i Rossell wrote: > ---------------------- > starting systemd... > systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA +SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) > > Welcome to NixOS 0.2pre-4eb2b09-af495e0! > > Failed to insert module 'autofs4' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........&. > XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/xfs_da_btree.c. Caller 0xbf057e68 ... https://wiki.archlinux.org/index.php/Autofs This document outlines the procedure needed to set up AutoFS, a package that provides support for automounting removable media or network shares when they are inserted or accessed. Your HDD is USB. Might the failure of this module to load have something to do with the XFS problems? Forgive me if my lack of experience with this is causing me to ask a stupid question. I've never used, nor will I ever use, XFS with a USB drive. -- Stan From jeff.liu@oracle.com Mon Jan 28 07:25:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 861107F4C for ; Mon, 28 Jan 2013 07:25:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19411AC003 for ; Mon, 28 Jan 2013 05:25:19 -0800 (PST) X-ASG-Debug-ID: 1359379515-04cb6c391418ffc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id u5aG9ins8DLGNPcB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:25:15 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDPEgI004718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:25:15 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDPDDG021415 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:25:14 GMT Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDPDS5011010 for ; Mon, 28 Jan 2013 07:25:13 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:25:13 -0800 Message-ID: <51067C33.6050900@oracle.com> Date: Mon, 28 Jan 2013 21:25:07 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 00/13] xfs: kill hard-coded number 128 for transaction space log reservation Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 00/13] xfs: kill hard-coded number 128 for transaction space log reservation 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: 1359379515 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, There is only one minor fix in this round, please check the change log below. Changes of v4 to v3: - xfs_trans_itruncate_reservation(): s/XFS_FSB_TO_B(mp, 0)/0/ Old patch sets: v3: http://www.spinics.net/lists/xfs/msg16165.html v2: http://www.spinics.net/lists/xfs/msg15917.html v1: http://www.spinics.net/lists/xfs/msg15499.html Thanks, -Jeff From jeff.liu@oracle.com Mon Jan 28 07:25:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A534F7F4C for ; Mon, 28 Jan 2013 07:25:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26CFBAC001 for ; Mon, 28 Jan 2013 05:25:44 -0800 (PST) X-ASG-Debug-ID: 1359379541-04cbb00c63184d00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id pXgWoXtO8Diik6UV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:25:42 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDPeMY005184 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:25:41 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDPdr3022207 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:25:40 GMT Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDPdVk019299 for ; Mon, 28 Jan 2013 07:25:39 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:25:39 -0800 Message-ID: <51067C4F.8050701@oracle.com> Date: Mon, 28 Jan 2013 21:25:35 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 01/13] xfs: add a helper to figure out the space log reservation per item Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 01/13] xfs: add a helper to figure out the space log reservation per item 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: 1359379542 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add a new helper xfs_calc_buf_res() to calcuate out the transaction space reservations per item. xfs_buf_log_overhead() is used to figure out the extra space for struct xfs_buf_log_format that gets written into the log for every buffer as well as a log opheader, i.e. struct xlog_op_header. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_trans.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06ed520..6c601ea 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -37,14 +37,45 @@ #include "xfs_extent_busy.h" #include "xfs_bmap.h" #include "xfs_quota.h" +#include "xfs_qm.h" #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_log_priv.h" +#include "xfs_buf_item.h" #include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer. Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ + return round_up(sizeof(struct xlog_op_header) + + sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction. size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( + uint nbufs, + uint size) +{ + return nbufs * (size + xfs_buf_log_overhead()); +} /* * Various log reservation values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:26:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2B6157F4C for ; Mon, 28 Jan 2013 07:26:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0319AC001 for ; Mon, 28 Jan 2013 05:26:10 -0800 (PST) X-ASG-Debug-ID: 1359379568-04bdf0231d19d6d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xrGMl88hMrIhU6uu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:26:09 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDQ73e027928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:26:08 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDQ7Yi001458 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:26:07 GMT Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDQ7Me011630 for ; Mon, 28 Jan 2013 07:26:07 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:26:06 -0800 Message-ID: <51067C69.2020509@oracle.com> Date: Mon, 28 Jan 2013 21:26:01 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 02/13] xfs: make use of xfs_calc_buf_res() in xfs_trans.c 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: 1359379569 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Refining the existing reservations with xfs_calc_buf_res() in xfs_trans.c Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_trans.c | 237 ++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 127 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 6c601ea..1fc2877 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -116,18 +116,15 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 2))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -148,18 +145,17 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0))); } /* @@ -179,14 +175,12 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((4 * mp->m_sb.sb_inodesize + - 2 * XFS_DIROP_LOG_RES(mp) + - 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - 3 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 3) + - 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -206,15 +200,12 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -234,15 +225,12 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -264,18 +252,18 @@ xfs_calc_symlink_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 1024 + - 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, 1024)), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -298,18 +286,19 @@ xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -337,16 +326,16 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, 0) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -374,9 +363,9 @@ STATIC uint xfs_calc_growdata_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize * 3 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -393,12 +382,12 @@ STATIC uint xfs_calc_growrtalloc_reservation( struct xfs_mount *mp) { - return 2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - mp->m_sb.sb_inodesize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -410,7 +399,7 @@ STATIC uint xfs_calc_growrtzero_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_blocksize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); } /* @@ -427,11 +416,10 @@ STATIC uint xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_inodesize + - mp->m_sb.sb_blocksize + - mp->m_rsumsize + - 128 * 5; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); } /* @@ -442,7 +430,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -452,7 +440,7 @@ xfs_calc_swrite_reservation( STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -468,13 +456,13 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize * 2 + - mp->m_dirblksize + - XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -492,14 +480,12 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -517,10 +503,9 @@ xfs_calc_attrset_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - 128 * (2 + XFS_DA_NODE_MAXDEPTH); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); } /* @@ -539,16 +524,14 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_DA_NODE_MAXDEPTH + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -558,7 +541,7 @@ STATIC uint xfs_calc_clear_agi_bucket_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } /* -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:26:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B3CFB7F4C for ; Mon, 28 Jan 2013 07:26:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55F86AC001 for ; Mon, 28 Jan 2013 05:26:24 -0800 (PST) X-ASG-Debug-ID: 1359379582-04bdf0231b19d6e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id fBMEm9BUbvXwsxQy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:26:23 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDQMXj006099 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:26:22 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDQLjx007385 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:26:21 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDQL69019767 for ; Mon, 28 Jan 2013 07:26:21 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:26:21 -0800 Message-ID: <51067C78.8040607@oracle.com> Date: Mon, 28 Jan 2013 21:26:16 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 03/13] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 03/13] xfs: calculate XFS_TRANS_QM_SBCHANGE space log reservation at mount time 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: 1359379583 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The transaction log space for clearing/reseting the quota flags is calculated out at runtime, this patch can figure it out at mount time. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b2bd3a0..b39fa96 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1056,8 +1056,8 @@ xfs_mount_reset_sbqflags( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); xfs_alert(mp, "%s: Superblock update failed!", __func__); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..9e3a03b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -40,6 +40,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtalloc; /* grow realtime allocations */ uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ + uint tr_qm_sbchange; /* change quota flags */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 1fc2877..236e53e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -545,6 +545,17 @@ xfs_calc_clear_agi_bucket_reservation( } /* + * Clearing the quotaflags in the superblock. + * the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -575,6 +586,7 @@ xfs_trans_init( resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); + resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index db05654..4eb1140 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -262,7 +262,7 @@ struct xfs_log_item_desc { (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) - +#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:26:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5DF9D7F4C for ; Mon, 28 Jan 2013 07:26:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CB8C304043 for ; Mon, 28 Jan 2013 05:26:42 -0800 (PST) X-ASG-Debug-ID: 1359379601-04cb6c3914190070001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mMUR3SEqnj1sS4g0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:26:41 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDQe39028397 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:26:40 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDQdbh008040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:26:40 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDQdj3019962 for ; Mon, 28 Jan 2013 07:26:39 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:26:39 -0800 Message-ID: <51067C8A.10908@oracle.com> Date: Mon, 28 Jan 2013 21:26:34 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 04/13] xfs: calculate xfs_qm_write_sb_changes() space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 04/13] xfs: calculate xfs_qm_write_sb_changes() space log reservation at mount time 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: 1359379601 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For the transaction that write the incore superblock changes of quota flags to disk, it would reserve the same log space to clear/reset quota flags transaction, hence we can use XFS_TRANS_SBCHANGE_LOG_RES() for it as well. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_qm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 2e86fa0..5745189 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1582,10 +1582,9 @@ xfs_qm_write_sb_changes( int error; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); - if ((error = xfs_trans_reserve(tp, 0, - mp->m_sb.sb_sectsize + 128, 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return error; } -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:26:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3E3AB7F51 for ; Mon, 28 Jan 2013 07:26:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 229B78F8052 for ; Mon, 28 Jan 2013 05:26:57 -0800 (PST) X-ASG-Debug-ID: 1359379615-04cbb00c63184dc0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Elb1BuvdNrb6MvkC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:26:56 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDQtLd028589 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:26:55 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDQsBX024276 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:26:54 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDQsGP012113 for ; Mon, 28 Jan 2013 07:26:54 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:26:54 -0800 Message-ID: <51067C99.80906@oracle.com> Date: Mon, 28 Jan 2013 21:26:49 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 05/13] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 05/13] xfs: calcuate XFS_TRANS_QM_SETQLIM space log reservation at mount time 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: 1359379615 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For adjusting quota limits transactions, we calculate out the log space reservation at runtime, this patch does it at mount time. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9e3a03b..cebcb7f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -41,6 +41,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ + uint tr_qm_setqlim; /* adjust quota limits */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..9b25992 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -489,8 +489,9 @@ xfs_qm_scall_setqlim( return 0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_disk_dquot_t) + 128, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 236e53e..3f7fa4b 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -556,6 +556,17 @@ xfs_calc_qm_sbchange_reservation( } /* + * Adjusting quota limits. + * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -587,6 +598,7 @@ xfs_trans_init( resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); + resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 4eb1140..8f0645a 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -263,6 +263,7 @@ struct xfs_log_item_desc { #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) +#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 782C17F4C for ; Mon, 28 Jan 2013 07:27:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 197CCAC001 for ; Mon, 28 Jan 2013 05:27:12 -0800 (PST) X-ASG-Debug-ID: 1359379630-04bdf0231a19d730001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id c7HHymkUTdh2L330 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:10 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDR97i029017 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:10 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDR9me009213 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:09 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDR90r020358 for ; Mon, 28 Jan 2013 07:27:09 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:09 -0800 Message-ID: <51067CA8.4090606@oracle.com> Date: Mon, 28 Jan 2013 21:27:04 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 06/13] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 06/13] xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time 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: 1359379630 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The disk quota allocation log space reservation is calcuated at runtime, this patch does it at mount time. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_dquot.c | 12 +++--------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 15 +++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index bf27fcc..96d9aae 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -524,15 +524,9 @@ xfs_qm_dqread( if (flags & XFS_QMOPT_DQALLOC) { tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC); error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp), - XFS_WRITE_LOG_RES(mp) + - /* - * Round the chunklen up to the next multiple - * of 128 (buf log item chunk size)). - */ - BBTOB(mp->m_quotainfo->qi_dqchunklen) - 1 + 128, - 0, - XFS_TRANS_PERM_LOG_RES, - XFS_WRITE_LOG_COUNT); + XFS_QM_DQALLOC_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, + XFS_WRITE_LOG_COUNT); if (error) goto error1; cancelflags = XFS_TRANS_RELEASE_LOG_RES; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index cebcb7f..a52f34c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -42,6 +42,7 @@ typedef struct xfs_trans_reservations { uint tr_growrtfree; /* grow realtime freeing */ uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ + uint tr_qm_dqalloc; /* allocate quota on disk */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 3f7fa4b..2530937 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -567,6 +567,20 @@ xfs_calc_qm_setqlim_reservation( } /* + * Allocating quota on disk if needed. + * the write transaction log space: XFS_WRITE_LOG_RES(mp) + * the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( + struct xfs_mount *mp) +{ + return XFS_WRITE_LOG_RES(mp) + + xfs_calc_buf_res(1, + XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -599,6 +613,7 @@ xfs_trans_init( resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); + resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 8f0645a..3ab1fe6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -264,6 +264,7 @@ struct xfs_log_item_desc { #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) +#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 889897F50 for ; Mon, 28 Jan 2013 07:27:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 776CA304043 for ; Mon, 28 Jan 2013 05:27:22 -0800 (PST) X-ASG-Debug-ID: 1359379641-04cb6c39121900d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id yLOo9DChp13cdUfL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:21 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDRKcp029177 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:21 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRJj4003157 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:20 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRJeE020466 for ; Mon, 28 Jan 2013 07:27:19 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:19 -0800 Message-ID: <51067CB3.5090505@oracle.com> Date: Mon, 28 Jan 2013 21:27:15 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 07/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 07/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF space log reservation at mount time 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: 1359379641 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation of quota off transaction log space reservation from runtime to mount time. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 10 +++------- fs/xfs/xfs_trans.c | 14 ++++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a52f34c..66b5449 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -43,6 +43,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_sbchange; /* change quota flags */ uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 9b25992..e4204be 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -671,14 +671,10 @@ xfs_qm_log_quotaoff( uint oldsbqflag=0; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); - if ((error = xfs_trans_reserve(tp, 0, - sizeof(xfs_qoff_logitem_t) * 2 + - mp->m_sb.sb_sectsize + 128, - 0, - 0, - XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) goto error0; - } qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); xfs_trans_log_quotaoff_item(tp, qoffi); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 2530937..3d8b20f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -581,6 +581,19 @@ xfs_calc_qm_dqalloc_reservation( } /* + * Turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + * the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2 + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -614,6 +627,7 @@ xfs_trans_init( resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3ab1fe6..747e7d8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -265,6 +265,7 @@ struct xfs_log_item_desc { #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 18FD57F5D for ; Mon, 28 Jan 2013 07:27:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A12DDAC001 for ; Mon, 28 Jan 2013 05:27:29 -0800 (PST) X-ASG-Debug-ID: 1359379648-04cbb00c63184e10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id cyOi8yWp9G6BfGGO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:28 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDRRAq029289 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:27 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRQ8s011079 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:27 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRQq5004739 for ; Mon, 28 Jan 2013 07:27:26 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:26 -0800 Message-ID: <51067CB9.6050801@oracle.com> Date: Mon, 28 Jan 2013 21:27:21 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 08/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 08/13] xfs: calculate XFS_TRANS_QM_QUOTAOFF_END space log reservation at mount time 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: 1359379648 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert the calculation for end of quotaoff log space reservation from runtime to mount time. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm_syscalls.c | 5 +++-- fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 66b5449..c5abd86 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -44,6 +44,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_setqlim; /* adjust quota limits */ uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ + uint tr_qm_equotaoff;/* end of turn quota off */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index e4204be..2b25980 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -638,8 +638,9 @@ xfs_qm_log_quotaoff_end( tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END); - if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_qoff_logitem_t) * 2, - 0, 0, XFS_DEFAULT_LOG_COUNT))) { + error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_END_LOG_RES(mp), + 0, 0, XFS_DEFAULT_LOG_COUNT); + if (error) { xfs_trans_cancel(tp, 0); return (error); } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 3d8b20f..d43e839 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -594,6 +594,17 @@ xfs_calc_qm_quotaoff_reservation( } /* + * End of turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -628,6 +639,7 @@ xfs_trans_init( resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); + resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 747e7d8..77ccc36 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -266,6 +266,7 @@ struct xfs_log_item_desc { #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B15DD7F50 for ; Mon, 28 Jan 2013 07:27:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52DDEAC001 for ; Mon, 28 Jan 2013 05:27:33 -0800 (PST) X-ASG-Debug-ID: 1359379652-04bdf0231a19d760001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id bKE2DkocNa5rJSQH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:32 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDRVsk029325 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:32 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRUHG025379 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:31 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRUD0012516 for ; Mon, 28 Jan 2013 07:27:30 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:30 -0800 Message-ID: <51067CBD.8010703@oracle.com> Date: Mon, 28 Jan 2013 21:27:25 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 09/13] xfs: introduce XFS_SB_LOG_RES() for transactions that modify sb on disk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 09/13] xfs: introduce XFS_SB_LOG_RES() for transactions that modify sb on disk 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: 1359379652 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Introduce a new transaction space reservation XFS_SB_LOG_RES() for those transactions that need to modify the superblock on disk. Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 12 ++++++++++++ fs/xfs/xfs_trans.h | 1 + 3 files changed, 14 insertions(+) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index c5abd86..b9b7dbc 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -45,6 +45,7 @@ typedef struct xfs_trans_reservations { uint tr_qm_dqalloc; /* allocate quota on disk */ uint tr_qm_quotaoff; /* turn quota off */ uint tr_qm_equotaoff;/* end of turn quota off */ + uint tr_sb; /* modify superblock */ } xfs_trans_reservations_t; #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index d43e839..3e4c5f1 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -605,6 +605,17 @@ xfs_calc_qm_quotaoff_end_reservation( } /* + * Syncing the incore super block changes to disk. + * the super block to reflect the changes: sector size + */ +STATIC uint +xfs_calc_sb_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -640,6 +651,7 @@ xfs_trans_init( resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); + resp->tr_sb = xfs_calc_sb_reservation(mp); } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 77ccc36..a150074 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -267,6 +267,7 @@ struct xfs_log_item_desc { #define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) #define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) #define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) +#define XFS_SB_LOG_RES(mp) ((mp)->m_reservations.tr_sb) /* * Various log count values. -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F327B7F5A for ; Mon, 28 Jan 2013 07:27:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D28A28F8050 for ; Mon, 28 Jan 2013 05:27:38 -0800 (PST) X-ASG-Debug-ID: 1359379657-04cb6c39131900f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EjLHMzsSJNkT6z59 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:38 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDRb1s007570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:37 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRaBe010316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:37 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRaDt012563 for ; Mon, 28 Jan 2013 07:27:36 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:36 -0800 Message-ID: <51067CC3.30409@oracle.com> Date: Mon, 28 Jan 2013 21:27:31 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 10/13] xfs: make use of XFS_SB_LOG_RES() at xfs_log_sbcount() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 10/13] xfs: make use of XFS_SB_LOG_RES() at xfs_log_sbcount() 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: 1359379657 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_log_sbcount(). Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b39fa96..8ba4adf 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1550,8 +1550,8 @@ xfs_log_sbcount(xfs_mount_t *mp) return 0; tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C9A157F50 for ; Mon, 28 Jan 2013 07:27:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6BD1FAC001 for ; Mon, 28 Jan 2013 05:27:46 -0800 (PST) X-ASG-Debug-ID: 1359379665-04cbb00c64184e40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id XLSyL5GohgPBLTMw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:45 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDRi9m007709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:45 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRiIx003791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:44 GMT Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRiR9004921 for ; Mon, 28 Jan 2013 07:27:44 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:43 -0800 Message-ID: <51067CCB.8070601@oracle.com> Date: Mon, 28 Jan 2013 21:27:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 11/13] xfs: make use of XFS_SB_LOG_RES() at xfs_mount_log_sb() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 11/13] xfs: make use of XFS_SB_LOG_RES() at xfs_mount_log_sb() 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: 1359379665 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_mount_log_sb(). Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8ba4adf..ae8e8d8 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1912,8 +1912,8 @@ xfs_mount_log_sb( XFS_SB_VERSIONNUM)); tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:27:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9A6CB7F73 for ; Mon, 28 Jan 2013 07:27:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2DCFBAC001 for ; Mon, 28 Jan 2013 05:27:54 -0800 (PST) X-ASG-Debug-ID: 1359379672-04cb6c3915190130001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id tSZDarkAgPB32CrM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:27:53 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDRprT029687 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:27:52 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRpLE011868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:27:51 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRprl012695 for ; Mon, 28 Jan 2013 07:27:51 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:50 -0800 Message-ID: <51067CD2.4020402@oracle.com> Date: Mon, 28 Jan 2013 21:27:46 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 12/13] xfs: make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 12/13] xfs: make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy() 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: 1359379672 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Make use of XFS_SB_LOG_RES() at xfs_fs_log_dummy(). Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_fsops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 4beaede..69393e8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -662,8 +662,8 @@ xfs_fs_log_dummy( int error; tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); - error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, - XFS_DEFAULT_LOG_COUNT); + error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, + XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); return error; -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:28:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6EE527F55 for ; Mon, 28 Jan 2013 07:28:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 10324AC004 for ; Mon, 28 Jan 2013 05:28:02 -0800 (PST) X-ASG-Debug-ID: 1359379681-04bdf0231d19d7c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id MezCVsaaYsysn6Eq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:28:01 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDS08k007971 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:28:01 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDRxs0012139 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:28:00 GMT Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDRxWX005126 for ; Mon, 28 Jan 2013 07:27:59 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:27:58 -0800 Message-ID: <51067CD9.9060107@oracle.com> Date: Mon, 28 Jan 2013 21:27:53 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v4 13/13] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4 13/13] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1359379681 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11: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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently, we calculate the attribute set transaction log space reservation at runtime in two parts: 1) XFS_ATTRSET_LOG_RES() which is calcuated out at mount time. 2) ((ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))) which is calculated out at runtime since it depend on the given extent length in blocks. This patch renamed XFS_ATTRSET_LOG_RES(mp) to XFS_ATTRSETM_LOG_RES(mp) to indicate that it is figured out at mount time. Introduce XFS_ATTRSETRT_LOG_RES(mp) which would be used to calculate out the unit of the log space reservation for one block. In this way, the total runtime space for the given extent length can be figured out by: XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * ext Signed-off-by: Jie Liu CC: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_attr.c | 9 ++++++--- fs/xfs/xfs_mount.h | 3 ++- fs/xfs/xfs_trans.c | 28 ++++++++++++++++++++++++---- fs/xfs/xfs_trans.h | 11 ++++------- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 0ca1f0b..20d114e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -300,9 +300,12 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(args.trans, args.total, - XFS_ATTRSET_LOG_RES(mp, args.total), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) { + error = xfs_trans_reserve(args.trans, args.total, + XFS_ATTRSETM_LOG_RES(mp) + + XFS_ATTRSETRT_LOG_RES(mp) * args.total, + 0, XFS_TRANS_PERM_LOG_RES, + XFS_ATTRSET_LOG_COUNT); + if (error) { xfs_trans_cancel(args.trans, 0); return(error); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b9b7dbc..b715c93 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -34,7 +34,8 @@ typedef struct xfs_trans_reservations { uint tr_addafork; /* cvt inode to attributed trans */ uint tr_writeid; /* write setuid/setgid file */ uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrset; /* set/create an attribute */ + uint tr_attrsetm; /* set/create an attribute at mount time */ + uint tr_attrsetrt; /* set/create an attribute at runtime */ uint tr_attrrm; /* remove an attribute */ uint tr_clearagi; /* clear bad agi unlinked ino bucket */ uint tr_growrtalloc; /* grow realtime allocations */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 3e4c5f1..f8c60e2 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -489,17 +489,18 @@ xfs_calc_attrinval_reservation( } /* - * Setting an attribute. + * Setting an attribute at mount time. * the inode getting the attribute * the superblock for allocations * the agfs extents are allocated from * the attribute btree * max depth * the inode allocation btree * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below). */ STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + @@ -509,6 +510,24 @@ xfs_calc_attrset_reservation( } /* + * Setting an attribute at runtime, transaction space unit per block. + * the superblock for allocations: sector size + * the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1)); +} + +/* * Removing an attribute. * the inode: inode size * the attribute btree could join: max depth * block size @@ -640,7 +659,8 @@ xfs_trans_init( resp->tr_writeid = xfs_calc_writeid_reservation(mp); resp->tr_addafork = xfs_calc_addafork_reservation(mp); resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrset = xfs_calc_attrset_reservation(mp); + resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index a150074..e99c7e8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -252,15 +252,12 @@ struct xfs_log_item_desc { * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSET_LOG_RES(mp, ext) \ - ((mp)->m_reservations.tr_attrset + \ - (ext * (mp)->m_sb.sb_sectsize) + \ - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) #define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) #define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) -- 1.7.9.5 From viric@viric.name Mon Jan 28 07:38:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7AF7D7F50 for ; Mon, 28 Jan 2013 07:38:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A9A0AC001 for ; Mon, 28 Jan 2013 05:38:07 -0800 (PST) X-ASG-Debug-ID: 1359380285-04cbb00c631854a0001-NocioJ Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by cuda.sgi.com with ESMTP id mjzBeDam8AubvZDQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:38:05 -0800 (PST) X-Barracuda-Envelope-From: viric@viric.name X-Barracuda-Apparent-Source-IP: 204.13.248.74 Received: from 102.128.79.188.dynamic.jazztel.es ([188.79.128.102] helo=mail.viric.name) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1TzouS-000IwI-W5; Mon, 28 Jan 2013 13:38:05 +0000 Received: by mail.viric.name (Postfix, from userid 1000) id D3DEC43FE31C; Mon, 28 Jan 2013 14:37:59 +0100 (CET) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 188.79.128.102 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX18tcsBvWepeThqQT1i/HhE9 Date: Mon, 28 Jan 2013 14:37:59 +0100 From: =?iso-8859-1?Q?Llu=EDs?= Batlle i Rossell To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM Message-ID: <20130128133759.GH2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <51065721.40102@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <51065721.40102@hardwarefreak.com> X-Accept-Language: ca, es, eo, ru, en, jbo, tokipona User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mho-04-ewr.mailhop.org[204.13.248.74] X-Barracuda-Start-Time: 1359380285 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 28, 2013 at 04:46:57AM -0600, Stan Hoeppner wrote: > On 1/27/2013 4:52 PM, Llu=EDs Batlle i Rossell wrote: >=20 > > ---------------------- > > starting systemd... > > systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +I= MA +SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) > >=20 > > Welcome to NixOS 0.2pre-4eb2b09-af495e0! > >=20 > > Failed to insert module 'autofs4' > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB......= ....&. > > XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/x= fs/xfs_da_btree.c. Caller 0xbf057e68 > ... > Your HDD is USB. Might the failure of this module to load have > something to do with the XFS problems? I don't think it is related; the failure to load the module is because th= e module isn't there in my kernel. And that happens after the fs has been q= uite used in the boot, it's not mount time. > Forgive me if my lack of experience with this is causing me to ask a > stupid question. I've never used, nor will I ever use, XFS with a USB > drive. Well, I didn't expect it to be any trouble :) I've XFS in other USB drive= s, but before this, I only used them in x86_64. I might stop using XFS there. Thank you, Llu=EDs. From jeff.liu@oracle.com Mon Jan 28 07:38:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 135C37F50 for ; Mon, 28 Jan 2013 07:38:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96E52AC006 for ; Mon, 28 Jan 2013 05:38:29 -0800 (PST) X-ASG-Debug-ID: 1359380308-04cbb00c661854f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 7GHTIQH7o3uDWeE4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:38:28 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0SDcR9b009740 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:38:27 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDcQN4013714 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:38:27 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDcQXc028387 for ; Mon, 28 Jan 2013 07:38:26 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:38:26 -0800 Message-ID: <51067F4B.8000605@oracle.com> Date: Mon, 28 Jan 2013 21:38:19 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 1/2] xfsprogs: sync xfs_calc_buf_res() to the user space Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 1/2] xfsprogs: sync xfs_calc_buf_res() to the user space 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: 1359380308 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Sync the new helper xfs_calc_buf_res() to the user space. Signed-off-by: Jie Liu --- libxfs/xfs_trans.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 635de8f..d7ff1a9 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -23,6 +23,35 @@ kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; /* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer. Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ + return round_up(sizeof(struct xlog_op_header) + + sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction. size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( + uint nbufs, + uint size) +{ + return nbufs * (size + xfs_buf_log_overhead()); +} + +/* * Various log reservation values. * * These are based on the size of the file system block because that is what -- 1.7.9.5 From jeff.liu@oracle.com Mon Jan 28 07:38:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6DA397F5A for ; Mon, 28 Jan 2013 07:38:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D4D2AC003 for ; Mon, 28 Jan 2013 05:38:34 -0800 (PST) X-ASG-Debug-ID: 1359380312-04bdf0231b19ddb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5d8yM1YjpBaEicmX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 05:38:33 -0800 (PST) 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.1/Sentrion-MTA-4.3.1) with ESMTP id r0SDcVFP020724 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 13:38:32 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0SDcVhO026917 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 13:38:31 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0SDcVU4020372 for ; Mon, 28 Jan 2013 07:38:31 -0600 Received: from [192.168.1.103] (/114.248.198.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 05:38:30 -0800 Message-ID: <51067F51.7040904@oracle.com> Date: Mon, 28 Jan 2013 21:38:25 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: [PATCH v2 2/2] xfsprogs: sync transaction log spaces changes to the user space Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 2/2] xfsprogs: sync transaction log spaces changes to the user space 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: 1359380313 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.2.121137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Sync the kernel codes changes regarding transaction log space reservations to the user space. As we have splitted the calculation of attrset log space reservations into mount time and runtime in kernel code, here we need to fix max_attrset_trans_res_adjust() to reflect this change. Signed-off-by: Jie Liu --- include/xfs_mount.h | 3 +- include/xfs_trans.h | 9 +- libxfs/xfs_attr.c | 9 +- libxfs/xfs_trans.c | 265 ++++++++++++++++++++++++++------------------------- mkfs/maxtrres.c | 9 +- 5 files changed, 147 insertions(+), 148 deletions(-) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 94a02e1..9be9a05 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -34,7 +34,8 @@ typedef struct xfs_trans_reservations { uint tr_addafork; /* cvt inode to attributed trans */ uint tr_writeid; /* write setuid/setgid file */ uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrset; /* set/create an attribute */ + uint tr_attrsetm; /* set/create an attribute at mount time */ + uint tr_attrsetrt; /* set/create an attribute at runtime */ uint tr_attrrm; /* remove an attribute */ uint tr_clearagi; /* clear bad agi unlinked ino bucket */ uint tr_growrtalloc; /* grow realtime allocations */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index c2042b7..2870308 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -254,12 +254,9 @@ struct xfs_log_item_desc { #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSET_LOG_RES(mp, ext) \ - ((mp)->m_reservations.tr_attrset + \ - (ext * (mp)->m_sb.sb_sectsize) + \ - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index aaeaec4..eec7f8f 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -275,9 +275,12 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(args.trans, args.total, - XFS_ATTRSET_LOG_RES(mp, args.total), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) { + error = xfs_trans_reserve(args.trans, args.total, + XFS_ATTRSETM_LOG_RES(mp) + + XFS_ATTRSETRT_LOG_RES(mp) * args.total, + 0, XFS_TRANS_PERM_LOG_RES, + XFS_ATTRSET_LOG_COUNT); + if (error) { xfs_trans_cancel(args.trans, 0); return(error); } diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index d7ff1a9..7249196 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -90,18 +90,15 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 2))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -122,18 +119,17 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + - 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0))); } /* @@ -153,14 +149,12 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((4 * mp->m_sb.sb_inodesize + - 2 * XFS_DIROP_LOG_RES(mp) + - 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - 3 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 3) + - 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -180,15 +174,12 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -208,15 +199,12 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_DIROP_LOG_RES(mp) + - 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -238,18 +226,18 @@ xfs_calc_symlink_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 1024 + - 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), - (2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, 1024)), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -272,18 +260,19 @@ xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + XFS_FSB_TO_B(mp, 1) + - XFS_DIROP_LOG_RES(mp) + - 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), - (3 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + - XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_in_maxlevels, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -311,16 +300,16 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, 1) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + - 128 * 5 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, 0) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -348,9 +337,9 @@ STATIC uint xfs_calc_growdata_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize * 3 + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -367,12 +356,12 @@ STATIC uint xfs_calc_growrtalloc_reservation( struct xfs_mount *mp) { - return 2 * mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + - mp->m_sb.sb_inodesize + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -384,7 +373,7 @@ STATIC uint xfs_calc_growrtzero_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_blocksize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); } /* @@ -401,11 +390,10 @@ STATIC uint xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_inodesize + - mp->m_sb.sb_blocksize + - mp->m_rsumsize + - 128 * 5; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); } /* @@ -416,7 +404,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -426,7 +414,7 @@ xfs_calc_swrite_reservation( STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return mp->m_sb.sb_inodesize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); } /* @@ -442,13 +430,13 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize * 2 + - mp->m_dirblksize + - XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + - XFS_ALLOCFREE_LOG_RES(mp, 1) + - 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + - XFS_ALLOCFREE_LOG_COUNT(mp, 1)); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); } /* @@ -466,35 +454,51 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), - (4 * mp->m_sb.sb_sectsize + - 4 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 4) + - 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); } /* - * Setting an attribute. + * Setting an attribute at mount time. * the inode getting the attribute * the superblock for allocations * the agfs extents are allocated from * the attribute btree * max depth * the inode allocation btree * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below). */ STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + - 128 * (2 + XFS_DA_NODE_MAXDEPTH); + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); +} + +/* + * Setting an attribute at runtime, transaction space unit per block. + * the superblock for allocations: sector size + * the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1)); } /* @@ -513,16 +517,14 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((mp->m_sb.sb_inodesize + - XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - 128 * (1 + XFS_DA_NODE_MAXDEPTH + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), - (2 * mp->m_sb.sb_sectsize + - 2 * mp->m_sb.sb_sectsize + - mp->m_sb.sb_sectsize + - XFS_ALLOCFREE_LOG_RES(mp, 2) + - 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); } /* @@ -532,7 +534,7 @@ STATIC uint xfs_calc_clear_agi_bucket_reservation( struct xfs_mount *mp) { - return mp->m_sb.sb_sectsize + 128; + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } /* @@ -560,7 +562,8 @@ xfs_trans_init( resp->tr_writeid = xfs_calc_writeid_reservation(mp); resp->tr_addafork = xfs_calc_addafork_reservation(mp); resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrset = xfs_calc_attrset_reservation(mp); + resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index 33dee52..bf8a2c5 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -34,7 +34,6 @@ max_attrset_trans_res_adjust( int local; int size; int nblks; - int res; /* * Determine space the maximal sized attribute will use, @@ -46,13 +45,9 @@ max_attrset_trans_res_adjust( nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); nblks += XFS_B_TO_FSB(mp, size); nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); - res = XFS_ATTRSET_LOG_RES(mp, nblks); -#if 0 - printf("size = %d nblks = %d res = %d\n", size, nblks, res); -#endif - - mp->m_reservations.tr_attrset = res; + mp->m_reservations.tr_attrsetm = XFS_ATTRSETM_LOG_RES(mp); + mp->m_reservations.tr_attrsetrt = XFS_ATTRSETRT_LOG_RES(mp) * nblks; } static int -- 1.7.9.5 From cmaiolino@redhat.com Mon Jan 28 08:04:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 182A47F47 for ; Mon, 28 Jan 2013 08:04:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id ED034304066 for ; Mon, 28 Jan 2013 06:04:35 -0800 (PST) X-ASG-Debug-ID: 1359381874-04bdf0231e19f650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ORhiVDwxO3yAOS1B for ; Mon, 28 Jan 2013 06:04:34 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0SE4YBm024958 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 09:04:34 -0500 Received: from localhost.localdomain.com (ovpn-113-133.phx2.redhat.com [10.3.113.133]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0SE4Wx4005445 for ; Mon, 28 Jan 2013 09:04:33 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents Date: Mon, 28 Jan 2013 09:04:30 -0500 X-ASG-Orig-Subj: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents Message-Id: <1359381870-30908-1-git-send-email-cmaiolino@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: 1359381874 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 There is no reason to ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); twice, so, remove one of these ASSERT calls Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 66282dc..25226ea 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1396,8 +1396,7 @@ xfs_itruncate_extents( int done = 0; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || - xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); ASSERT(new_size <= XFS_ISIZE(ip)); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(ip->i_itemp != NULL); -- 1.8.1 From tinguely@sgi.com Mon Jan 28 08:09:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 4B0CA7F4C for ; Mon, 28 Jan 2013 08:09:42 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 180B4304048; Mon, 28 Jan 2013 06:09:42 -0800 (PST) Message-ID: <510686A9.3080600@sgi.com> Date: Mon, 28 Jan 2013 08:09:45 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/2] xfsprogs: sync xfs_calc_buf_res() to the user space References: <51067F4B.8000605@oracle.com> In-Reply-To: <51067F4B.8000605@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/28/13 07:38, Jeff Liu wrote: > Sync the new helper xfs_calc_buf_res() to the user space. > > Signed-off-by: Jie Liu > --- > libxfs/xfs_trans.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c > index 635de8f..d7ff1a9 100644 > --- a/libxfs/xfs_trans.c > +++ b/libxfs/xfs_trans.c > @@ -23,6 +23,35 @@ kmem_zone_t *xfs_trans_zone; > kmem_zone_t *xfs_log_item_desc_zone; > > /* > + * A buffer has a format structure overhead in the log in addition > + * to the data, so we need to take this into account when reserving > + * space in a transaction for a buffer. Round the space required up > + * to a multiple of 128 bytes so that we don't change the historical > + * reservation that has been used for this overhead. > + */ > +STATIC uint > +xfs_buf_log_overhead(void) > +{ > + return round_up(sizeof(struct xlog_op_header) + > + sizeof(struct xfs_buf_log_format), 128); > +} > + > +/* > + * Calculate out transaction log reservation per item in bytes. > + * > + * The nbufs argument is used to indicate the number of items that > + * will be changed in a transaction. size is used to tell how many > + * bytes should be reserved per item. > + */ > +STATIC uint > +xfs_calc_buf_res( > + uint nbufs, > + uint size) > +{ > + return nbufs * (size + xfs_buf_log_overhead()); > +} > + > +/* > * Various log reservation values. > * > * These are based on the size of the file system block because that is what Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Mon Jan 28 08:14:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 F1BAC7F47 for ; Mon, 28 Jan 2013 08:14:12 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFC798F8065; Mon, 28 Jan 2013 06:14:09 -0800 (PST) Message-ID: <510687B4.7000902@sgi.com> Date: Mon, 28 Jan 2013 08:14:12 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents References: <1359381870-30908-1-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1359381870-30908-1-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/28/13 08:04, Carlos Maiolino wrote: > There is no reason to ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); twice, so, > remove one of these ASSERT calls > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 66282dc..25226ea 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1396,8 +1396,7 @@ xfs_itruncate_extents( > int done = 0; > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > - xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > ASSERT(new_size<= XFS_ISIZE(ip)); > ASSERT(tp->t_flags& XFS_TRANS_PERM_LOG_RES); > ASSERT(ip->i_itemp != NULL); You removed an XFS_IOLOCK_EXCL assert not a duplicate XFS_ILOCK_EXCL assert. It maybe more obvious if the first assert read: ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(!atomic_read(&VFS_I(ip)->i_count)); ... --Mark Tinguely. From tinguely@sgi.com Mon Jan 28 08:21:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 14E817F47 for ; Mon, 28 Jan 2013 08:21:06 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id D4BBD8F804B; Mon, 28 Jan 2013 06:21:05 -0800 (PST) Message-ID: <51068954.4000205@sgi.com> Date: Mon, 28 Jan 2013 08:21:08 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> <1359240032-11576-3-git-send-email-sandeen@redhat.com> In-Reply-To: <1359240032-11576-3-git-send-email-sandeen@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/26/13 16:40, Eric Sandeen wrote: > This is a merge-to-userspace of kernel commit a0041684 > xfs: zero allocation_args on the kernel stack > > When calling xfs_alloc_vextent args.userdata was uninitialized, > and if we had args.type==XFS_ALLOCTYPE_START_BNO, this uninit > structure member got tested, leading to some random allocator > behavior. > > Signed-off-by: Eric Sandeen > --- I remember seeing this in Dave's: [UBER-PATCH, RFC] xfsprogs: sync libxfs to 3.8-rc2 kernel code http://patchwork.xfs.org/patch/4683/ --Mark. From tinguely@sgi.com Mon Jan 28 09:57:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 97D517F4C for ; Mon, 28 Jan 2013 09:57:10 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66D40304039; Mon, 28 Jan 2013 07:57:07 -0800 (PST) Message-ID: <51069FD6.7030203@sgi.com> Date: Mon, 28 Jan 2013 09:57:10 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/2] xfsprogs: sync transaction log spaces changes to the user space References: <51067F51.7040904@oracle.com> In-Reply-To: <51067F51.7040904@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/28/13 07:38, Jeff Liu wrote: > Sync the kernel codes changes regarding transaction log space reservations > to the user space. > > As we have splitted the calculation of attrset log space reservations into mount > time and runtime in kernel code, here we need to fix max_attrset_trans_res_adjust() > to reflect this change. > > Signed-off-by: Jie Liu > > --- > include/xfs_mount.h | 3 +- > include/xfs_trans.h | 9 +- > libxfs/xfs_attr.c | 9 +- > libxfs/xfs_trans.c | 265 ++++++++++++++++++++++++++------------------------- > mkfs/maxtrres.c | 9 +- > 5 files changed, 147 insertions(+), 148 deletions(-) > For anyone else looking at this. This is basically kernel log reservation patch 2 and 13 combined. > diff --git a/include/xfs_trans.h b/include/xfs_trans.h > index c2042b7..2870308 100644 > --- a/include/xfs_trans.h > +++ b/include/xfs_trans.h > @@ -254,12 +254,9 @@ struct xfs_log_item_desc { > #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) > #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) > #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) > -#define XFS_ATTRSET_LOG_RES(mp, ext) \ > - ((mp)->m_reservations.tr_attrset + \ > - (ext * (mp)->m_sb.sb_sectsize) + \ > - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ > - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) > -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) > +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) > +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) > +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) > #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) ... > index 33dee52..bf8a2c5 100644 > --- a/mkfs/maxtrres.c > +++ b/mkfs/maxtrres.c > @@ -34,7 +34,6 @@ max_attrset_trans_res_adjust( > int local; > int size; > int nblks; > - int res; > > /* > * Determine space the maximal sized attribute will use, > @@ -46,13 +45,9 @@ max_attrset_trans_res_adjust( > nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); > nblks += XFS_B_TO_FSB(mp, size); > nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); > - res = XFS_ATTRSET_LOG_RES(mp, nblks); > > -#if 0 > - printf("size = %d nblks = %d res = %d\n", size, nblks, res); > -#endif > - > - mp->m_reservations.tr_attrset = res; This number used to be the mount portion of constant that was multiplied times args.total. Isn't this value (res) what we want to place into tr_attrsetm like before? and then tr_attrsetrt is from xfs_calc_attrsetrt_reservation()? > + mp->m_reservations.tr_attrsetm = XFS_ATTRSETM_LOG_RES(mp); > + mp->m_reservations.tr_attrsetrt = XFS_ATTRSETRT_LOG_RES(mp) * nblks; > } > > static int --Mark. From cmaiolino@redhat.com Mon Jan 28 10:26:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 72A647F4E for ; Mon, 28 Jan 2013 10:26:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46A738F804C for ; Mon, 28 Jan 2013 08:26:34 -0800 (PST) X-ASG-Debug-ID: 1359390393-04bdf0231b1a69b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IAQsBBe9X9cb9wDc; Mon, 28 Jan 2013 08:26:33 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0SGQW59013900 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Jan 2013 11:26:33 -0500 Received: from andromeda.usersys.redhat.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SGQT7A029516 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 28 Jan 2013 11:26:31 -0500 Date: Mon, 28 Jan 2013 11:26:28 -0500 From: Carlos Maiolino To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents Message-ID: <20130128162628.GA1303@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents References: <1359381870-30908-1-git-send-email-cmaiolino@redhat.com> <510687B4.7000902@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <510687B4.7000902@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359390393 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 Meh, you're right, cheated by my eyes. but the suggestion looks nice to avoid another ones to fall in the same mistake, will send a change to it, thanks Mark On Mon, Jan 28, 2013 at 08:14:12AM -0600, Mark Tinguely wrote: > On 01/28/13 08:04, Carlos Maiolino wrote: > >There is no reason to ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); twice, so, > >remove one of these ASSERT calls > > > >Signed-off-by: Carlos Maiolino > >--- > > fs/xfs/xfs_inode.c | 3 +-- > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > >diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > >index 66282dc..25226ea 100644 > >--- a/fs/xfs/xfs_inode.c > >+++ b/fs/xfs/xfs_inode.c > >@@ -1396,8 +1396,7 @@ xfs_itruncate_extents( > > int done = 0; > > > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > >- ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > >- xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > >+ ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > > ASSERT(new_size<= XFS_ISIZE(ip)); > > ASSERT(tp->t_flags& XFS_TRANS_PERM_LOG_RES); > > ASSERT(ip->i_itemp != NULL); > > You removed an XFS_IOLOCK_EXCL assert not a duplicate > XFS_ILOCK_EXCL assert. It maybe more obvious if the > first assert read: > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || > xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > ... > > --Mark Tinguely. -- Carlos From cmaiolino@redhat.com Mon Jan 28 10:48:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 101F77F50 for ; Mon, 28 Jan 2013 10:48:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 97967AC006 for ; Mon, 28 Jan 2013 08:48:41 -0800 (PST) X-ASG-Debug-ID: 1359391720-04cbb00c6318e860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xG5t35K423qtWRwl for ; Mon, 28 Jan 2013 08:48:40 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0SGmeNK027125 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 11:48:40 -0500 Received: from andromeda.usersys.redhat.com.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SGmcmX006012 for ; Mon, 28 Jan 2013 11:48:39 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() Date: Mon, 28 Jan 2013 11:48:30 -0500 X-ASG-Orig-Subj: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() Message-Id: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359391720 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 An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while readin the code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 66282dc..f7efe77 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1395,9 +1395,10 @@ xfs_itruncate_extents( int error = 0; int done = 0; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); ASSERT(new_size <= XFS_ISIZE(ip)); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(ip->i_itemp != NULL); -- 1.8.1 From cmaiolino@redhat.com Mon Jan 28 10:52:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 483BA7F56 for ; Mon, 28 Jan 2013 10:52:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34212304048 for ; Mon, 28 Jan 2013 08:51:59 -0800 (PST) X-ASG-Debug-ID: 1359391919-04cb6c39151998b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DOc9eQhCgA0XnBnF for ; Mon, 28 Jan 2013 08:51:59 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0SGpwuu023249 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 11:51:58 -0500 Received: from andromeda.usersys.redhat.com.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SGpvZq028955 for ; Mon, 28 Jan 2013 11:51:58 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() [V2] Date: Mon, 28 Jan 2013 11:51:50 -0500 X-ASG-Orig-Subj: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() [V2] Message-Id: <1359391910-4227-1-git-send-email-cmaiolino@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: 1359391919 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 An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while readin the code V2: Fix a doubled assert in i_count left in V1 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 66282dc..b05c361 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1395,9 +1395,9 @@ xfs_itruncate_extents( int error = 0; int done = 0; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); ASSERT(new_size <= XFS_ISIZE(ip)); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(ip->i_itemp != NULL); -- 1.8.1 From gwehrman@sgi.com Mon Jan 28 10:52:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B4E577F58 for ; Mon, 28 Jan 2013 10:52:57 -0600 (CST) Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CCCF304051; Mon, 28 Jan 2013 08:52:57 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 6A66A2B3B5; Mon, 28 Jan 2013 10:52:57 -0600 (CST) Date: Mon, 28 Jan 2013 10:52:57 -0600 From: Geoffrey Wehrman To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() Message-ID: <20130128165257.GB7124@sgi.com> References: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.14 (2007-02-12) On Mon, Jan 28, 2013 at 11:48:30AM -0500, Carlos Maiolino wrote: | An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and | XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while | readin the code | | Signed-off-by: Carlos Maiolino | --- | fs/xfs/xfs_inode.c | 5 +++-- | 1 file changed, 3 insertions(+), 2 deletions(-) | | diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c | index 66282dc..f7efe77 100644 | --- a/fs/xfs/xfs_inode.c | +++ b/fs/xfs/xfs_inode.c | @@ -1395,9 +1395,10 @@ xfs_itruncate_extents( | int error = 0; | int done = 0; | | - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || | + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || | xfs_isilocked(ip, XFS_IOLOCK_EXCL)); | + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); | + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); | ASSERT(new_size <= XFS_ISIZE(ip)); | ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); | ASSERT(ip->i_itemp != NULL); | -- | 1.8.1 NACK. You are changing the logic of the asserts. The original first assert indicates that the ILOCK is always locked. The modified asserts allow eith the ILOCK or the IOLOCK to be locked. This is not correct. Geoffrey From cmaiolino@redhat.com Mon Jan 28 10:53:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4E4047F62 for ; Mon, 28 Jan 2013 10:53:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5BA7AC001 for ; Mon, 28 Jan 2013 08:53:26 -0800 (PST) X-ASG-Debug-ID: 1359392005-04cbb00c6518ec20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id smSzz3KJKnD3r7Ly for ; Mon, 28 Jan 2013 08:53:26 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0SGrPug028940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 11:53:25 -0500 Received: from andromeda.usersys.redhat.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SGrMGs029426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 28 Jan 2013 11:53:24 -0500 Date: Mon, 28 Jan 2013 11:53:21 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() Message-ID: <20130128165321.GA4281@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() References: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1359392005 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 Please discard this patch, I left a doubled assert by mistake, my apologies for that On Mon, Jan 28, 2013 at 11:48:30AM -0500, Carlos Maiolino wrote: > An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and > XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while > readin the code > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 66282dc..f7efe77 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1395,9 +1395,10 @@ xfs_itruncate_extents( > int error = 0; > int done = 0; > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || > xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > ASSERT(new_size <= XFS_ISIZE(ip)); > ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); > ASSERT(ip->i_itemp != NULL); > -- > 1.8.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Mon Jan 28 10:56:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 022A97F5D for ; Mon, 28 Jan 2013 10:56:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2619304051 for ; Mon, 28 Jan 2013 08:56:05 -0800 (PST) X-ASG-Debug-ID: 1359392164-04cb6c3912199ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pv7TVWfZa5IqPIKP; Mon, 28 Jan 2013 08:56:05 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0SGu4oF020367 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Jan 2013 11:56:04 -0500 Received: from andromeda.usersys.redhat.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SGu0O6008753 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 28 Jan 2013 11:56:03 -0500 Date: Mon, 28 Jan 2013 11:56:00 -0500 From: Carlos Maiolino To: Geoffrey Wehrman Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() Message-ID: <20130128165600.GB4281@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() References: <1359391710-3862-1-git-send-email-cmaiolino@redhat.com> <20130128165257.GB7124@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130128165257.GB7124@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359392164 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 On Mon, Jan 28, 2013 at 10:52:57AM -0600, Geoffrey Wehrman wrote: > On Mon, Jan 28, 2013 at 11:48:30AM -0500, Carlos Maiolino wrote: > | An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and > | XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while > | readin the code > | > | Signed-off-by: Carlos Maiolino > | --- > | fs/xfs/xfs_inode.c | 5 +++-- > | 1 file changed, 3 insertions(+), 2 deletions(-) > | > | diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > | index 66282dc..f7efe77 100644 > | --- a/fs/xfs/xfs_inode.c > | +++ b/fs/xfs/xfs_inode.c > | @@ -1395,9 +1395,10 @@ xfs_itruncate_extents( > | int error = 0; > | int done = 0; > | > | - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > | - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > | + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || > | xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > | + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > | + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > | ASSERT(new_size <= XFS_ISIZE(ip)); > | ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); > | ASSERT(ip->i_itemp != NULL); > | -- > | 1.8.1 > > NACK. You are changing the logic of the asserts. The original first > assert indicates that the ILOCK is always locked. The modified asserts > allow eith the ILOCK or the IOLOCK to be locked. This is not correct. > Yeah, makes sense, I thought about a possible logic change, but didn't realize it was really true. Thanks for feedback. forget about this idea then, too much for little gain :) > > Geoffrey -- Carlos From cmaiolino@redhat.com Mon Jan 28 10:57:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 894847F5E for ; Mon, 28 Jan 2013 10:57:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36EB0AC001 for ; Mon, 28 Jan 2013 08:57:18 -0800 (PST) X-ASG-Debug-ID: 1359392237-04bdf0231d1a82e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lvrELDP73UiO2k28 for ; Mon, 28 Jan 2013 08:57:17 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@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 r0SGvHWt025023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 11:57:17 -0500 Received: from andromeda.usersys.redhat.com (ovpn-113-142.phx2.redhat.com [10.3.113.142]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0SGvEKF022560 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 28 Jan 2013 11:57:16 -0500 Date: Mon, 28 Jan 2013 11:57:13 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() [V2] Message-ID: <20130128165713.GC4281@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: re-organize XFS_ILOCK asserts in xfs_itruncate_extents() [V2] References: <1359391910-4227-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359391910-4227-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1359392237 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 Please, discard this patch, changes in logic On Mon, Jan 28, 2013 at 11:51:50AM -0500, Carlos Maiolino wrote: > An logically OR'red assert for check an inode locked in XFS_ILOCK_EXCL and > XFS_IOLOCK_EXCL looks better than the old way, avoiding possible mistakes while > readin the code > > V2: Fix a doubled assert in i_count left in V1 > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 66282dc..b05c361 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1395,9 +1395,9 @@ xfs_itruncate_extents( > int error = 0; > int done = 0; > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL) || > xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); > ASSERT(new_size <= XFS_ISIZE(ip)); > ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); > ASSERT(ip->i_itemp != NULL); > -- > 1.8.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From sandeen@sandeen.net Mon Jan 28 11:10:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 705CF7F5D for ; Mon, 28 Jan 2013 11:10:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5D68C8F8039 for ; Mon, 28 Jan 2013 09:10:47 -0800 (PST) X-ASG-Debug-ID: 1359393046-04cbb00c6318f8b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qtELVN4oKMIEvUBN for ; Mon, 28 Jan 2013 09:10:46 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 22F4063C59C4; Mon, 28 Jan 2013 11:10:46 -0600 (CST) Message-ID: <5106B115.3080203@sandeen.net> Date: Mon, 28 Jan 2013 11:10:45 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Llu=EDs_Batlle_i_Rossell?= CC: Stan Hoeppner , xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <51065721.40102@hardwarefreak.com> <20130128133759.GH2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM In-Reply-To: <20130128133759.GH2287@vicerveza.homeunix.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359393046 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.2.121151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/28/13 7:37 AM, Llus Batlle i Rossell wrote: > On Mon, Jan 28, 2013 at 04:46:57AM -0600, Stan Hoeppner wrote: >> On 1/27/2013 4:52 PM, Llus Batlle i Rossell wrote: >> >>> ---------------------- >>> starting systemd... >>> systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA +SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) >>> >>> Welcome to NixOS 0.2pre-4eb2b09-af495e0! >>> >>> Failed to insert module 'autofs4' >> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>> dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........&. >>> XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/xfs_da_btree.c. Caller 0xbf057e68 >> ... >> Your HDD is USB. Might the failure of this module to load have >> something to do with the XFS problems? I doubt it. > I don't think it is related; the failure to load the module is because the > module isn't there in my kernel. And that happens after the fs has been quite > used in the boot, it's not mount time. > >> Forgive me if my lack of experience with this is causing me to ask a >> stupid question. I've never used, nor will I ever use, XFS with a USB >> drive. > > Well, I didn't expect it to be any trouble :) I've XFS in other USB drives, but > before this, I only used them in x86_64. I might stop using XFS there. It should work, and I'd like to find out why it's not. It used to. :) But I'm a little low on time. Would you be willing to spot-check some older kernels, and see if/when this regressed? Thanks, -Eric > Thank you, > Llus. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@redhat.com Mon Jan 28 14:47:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8FADB7F66 for ; Mon, 28 Jan 2013 14:47:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80059304053 for ; Mon, 28 Jan 2013 12:47:47 -0800 (PST) X-ASG-Debug-ID: 1359406066-04cbb00c6419a230001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id i96FtpDOk3jA48VT for ; Mon, 28 Jan 2013 12:47:46 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0SKli9d003951 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 28 Jan 2013 15:47:44 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0SKlgR8028641 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 28 Jan 2013 15:47:43 -0500 Message-ID: <5106E3EE.2030601@redhat.com> Date: Mon, 28 Jan 2013 14:47:42 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: Ben Myers , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields References: <5092A1DE.10609@redhat.com> <5092A2B6.2000907@redhat.com> <5092A46A.8080909@sandeen.net> <20130122175530.GR27055@sgi.com> <20130122210511.GK2498@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields In-Reply-To: <20130122210511.GK2498@dastard> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359406066 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 1/22/13 3:05 PM, Dave Chinner wrote: > On Tue, Jan 22, 2013 at 11:55:30AM -0600, Ben Myers wrote: >> Hey Eric, >> >> On Thu, Nov 01, 2012 at 11:33:46AM -0500, Eric Sandeen wrote: >>> As xlog_print_trans_inode() stands today, it will error >>> out if more than one flag is set on f->ilf_fields: >>> >>> xlog_print_trans_inode: illegal inode type >>> >>> but this is a perfectly valid case, to have i.e. a data and >>> an attr flag set. >>> >>> Following is a pretty big reworking of the function to >>> handle more than one field type set. >> >> I'm trying to wrap my head around this one. I have a few stupid questions. >> >>> I've tested this by a simple test such as creating one >>> file on an selinux box, so that data+attr is set, and >>> logprinting; I've also tested by running logprint after >>> subsequent xfstest runs (although we hit other bugs that >>> way). >>> >>> Signed-off-by: Eric Sandeen >>> --- >>> >>> V2: Fix subject, sigh. >>> >>> diff --git a/logprint/log_misc.c b/logprint/log_misc.c >>> index e42e108..be2426e 100644 >>> --- a/logprint/log_misc.c >>> +++ b/logprint/log_misc.c >>> @@ -657,97 +657,84 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) >>> >>> /* does anything come next */ >>> op_head = (xlog_op_header_t *)*ptr; >>> - switch (f->ilf_fields & XFS_ILOG_NONCORE) { >>> - case XFS_ILOG_DEXT: { >>> - ASSERT(f->ilf_size == 3); >>> - (*i)++; >>> - xlog_print_op_header(op_head, *i, ptr); >>> - printf(_("EXTENTS inode data\n")); >>> - *ptr += be32_to_cpu(op_head->oh_len); >>> - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { >>> - return 1; >>> - } >>> - break; >>> - } >>> - case XFS_ILOG_DBROOT: { >>> - ASSERT(f->ilf_size == 3); >>> - (*i)++; >>> - xlog_print_op_header(op_head, *i, ptr); >>> - printf(_("BTREE inode data\n")); >>> - *ptr += be32_to_cpu(op_head->oh_len); >>> - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { >>> - return 1; >>> - } >>> + >>> + if (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { >>> + switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { >> >> Here you kept only XFS_ILOG_DEV and XFS_ILOG_UUID... >> >>> + case XFS_ILOG_DEV: >>> + printf(_("DEV inode: no extra region\n")); >>> break; >>> - } >>> - case XFS_ILOG_DDATA: { >>> - ASSERT(f->ilf_size == 3); >>> - (*i)++; >>> - xlog_print_op_header(op_head, *i, ptr); >>> - printf(_("LOCAL inode data\n")); >>> - if (mode == S_IFDIR) { >>> - xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); >>> - } >>> - *ptr += be32_to_cpu(op_head->oh_len); >>> - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { >>> - return 1; >>> - } >>> + case XFS_ILOG_UUID: >>> + printf(_("UUID inode: no extra region\n")); >>> break; >>> + case XFS_ILOG_DEXT: >>> + case XFS_ILOG_DBROOT: >>> + case XFS_ILOG_DDATA: >> >> Do you need to test for these other flags here? > > It's defensive code - ensuring that they never overlap as the fields > are mutually exclusive. i.e if XFS_ILOG_DEV or XFS_ILOG_UUID is > set, the data fork format flags should not be set as the other two > fields indicate the data fork contents.... > >>> + default: >>> + xlog_panic(_("xlog_print_trans_inode: illegal inode type 0x%x"), >>> + f->ilf_fields); >>> } >>> - case XFS_ILOG_AEXT: { >>> - ASSERT(f->ilf_size == 3); >>> + } >>> + >>> + if (f->ilf_fields & (XFS_ILOG_DFORK | XFS_ILOG_AFORK)) { >>> + ASSERT(f->ilf_size <= 4); >> >> Can you explain this ASSERT? I saw only ilf_size == 3 in the old code. Under >> what circumstances can it be 4? Maybe when multiple ilf_fields are set? > > XFS_ILOG_CORE | XFS_ILOG_TIMESTAMP | XFS_ILOG_DFORK | XFS_ILOG_AFORK > >>> + ASSERT((f->ilf_size == 3) || (f->ilf_fields & XFS_ILOG_AFORK)); >> >> I also don't understand this ASSERT. It seems like in the old code all of the >> AFORK related cases had an ASSERT for ilf_size == 3. > > It's valid - if the size is not 3, the the attribute for must be > logged - it's the only way to get 4 format items. > >> >>> + if (f->ilf_fields & XFS_ILOG_DFORK) { >>> (*i)++; >>> xlog_print_op_header(op_head, *i, ptr); >>> - printf(_("EXTENTS inode attr\n")); >>> - *ptr += be32_to_cpu(op_head->oh_len); >>> - if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { >>> - return 1; >>> + >>> + switch (f->ilf_fields & XFS_ILOG_DFORK) { >>> + case XFS_ILOG_DEXT: >>> + printf(_("EXTENTS inode data\n")); >>> + break; >>> + case XFS_ILOG_DBROOT: >>> + printf(_("BTREE inode data\n")); >>> + break; >>> + case XFS_ILOG_DDATA: >>> + printf(_("LOCAL inode data\n")); >>> + if (mode == S_IFDIR) >>> + xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); >>> + break; >>> + case XFS_ILOG_DEV: >>> + case XFS_ILOG_UUID: >> >> ILOG_DEV and ILOG_UUID aren't in ILOG_DFORK. You needn't test for them, correct? > > See above. > > Cheers, > > Dave. > Ben, Mark - Where are we at with this one? We have a partner who is interested in the fix. Do you want anything more from me before it can be merged? Thanks, -Eric From bpm@sgi.com Mon Jan 28 15:31:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 196F57F69 for ; Mon, 28 Jan 2013 15:31:31 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE73430404E; Mon, 28 Jan 2013 13:31:27 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 69A654266DC; Mon, 28 Jan 2013 15:31:27 -0600 (CST) Date: Mon, 28 Jan 2013 15:31:27 -0600 From: Ben Myers To: Eric Sandeen Cc: Dave Chinner , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2 V2] xfs_logprint: Handle multiply-logged inode fields Message-ID: <20130128213127.GD27055@sgi.com> References: <5092A1DE.10609@redhat.com> <5092A2B6.2000907@redhat.com> <5092A46A.8080909@sandeen.net> <20130122175530.GR27055@sgi.com> <20130122210511.GK2498@dastard> <5106E3EE.2030601@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5106E3EE.2030601@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Jan 28, 2013 at 02:47:42PM -0600, Eric Sandeen wrote: > On 1/22/13 3:05 PM, Dave Chinner wrote: > > On Tue, Jan 22, 2013 at 11:55:30AM -0600, Ben Myers wrote: > >> Hey Eric, > >> > >> On Thu, Nov 01, 2012 at 11:33:46AM -0500, Eric Sandeen wrote: > >>> As xlog_print_trans_inode() stands today, it will error > >>> out if more than one flag is set on f->ilf_fields: > >>> > >>> xlog_print_trans_inode: illegal inode type > >>> > >>> but this is a perfectly valid case, to have i.e. a data and > >>> an attr flag set. > >>> > >>> Following is a pretty big reworking of the function to > >>> handle more than one field type set. > >> > >> I'm trying to wrap my head around this one. I have a few stupid questions. > >> > >>> I've tested this by a simple test such as creating one > >>> file on an selinux box, so that data+attr is set, and > >>> logprinting; I've also tested by running logprint after > >>> subsequent xfstest runs (although we hit other bugs that > >>> way). > >>> > >>> Signed-off-by: Eric Sandeen > >>> --- > > Ben, Mark - > > Where are we at with this one? We have a partner who is interested in the fix. > Do you want anything more from me before it can be merged? Hey Eric, I think it's ready to be merged... It looks like you reposted Jan 02 and I replied to the wrong one. If that code isn't significantly different we're good to go. Thanks, Ben From bpm@oss.sgi.com Mon Jan 28 15:39:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 514C77F6C; Mon, 28 Jan 2013 15:39:57 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.8-rc1-19-g2729423 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ced55f38d6bde7c10a14ea51c2edcd51a98575e3 X-Git-Newrev: 2729423cf2ef3ac51d040f24a5ddd84c1b2acc70 Message-Id: <20130128213957.514C77F6C@oss.sgi.com> Date: Mon, 28 Jan 2013 15:39:56 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 2729423 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() from ced55f38d6bde7c10a14ea51c2edcd51a98575e3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2729423cf2ef3ac51d040f24a5ddd84c1b2acc70 Author: Torsten Kaiser Date: Sun Jan 20 10:24:49 2013 +0100 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed xfs_flushinval_pages() and changed its callers to use filemap_write_and_wait() and truncate_pagecache_range() directly. But in xfs_swap_extents() this change accidental switched the argument for 'tip' to 'ip'. This patch switches it back to 'tip' Signed-off-by: Torsten Kaiser Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dfrag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Jan 28 15:40:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 3D0087F76; Mon, 28 Jan 2013 15:40:07 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.8-rc1-19-g2729423 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: ced55f38d6bde7c10a14ea51c2edcd51a98575e3 X-Git-Newrev: 2729423cf2ef3ac51d040f24a5ddd84c1b2acc70 Message-Id: <20130128214007.3D0087F76@oss.sgi.com> Date: Mon, 28 Jan 2013 15:40:06 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 2729423 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() from ced55f38d6bde7c10a14ea51c2edcd51a98575e3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2729423cf2ef3ac51d040f24a5ddd84c1b2acc70 Author: Torsten Kaiser Date: Sun Jan 20 10:24:49 2013 +0100 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed xfs_flushinval_pages() and changed its callers to use filemap_write_and_wait() and truncate_pagecache_range() directly. But in xfs_swap_extents() this change accidental switched the argument for 'tip' to 'ip'. This patch switches it back to 'tip' Signed-off-by: Torsten Kaiser Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dfrag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Jan 28 16:02:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 851577F73; Mon, 28 Jan 2013 16:02:21 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. for-linus-v3.8-rc4-6-g4b05d09 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 37f13561de6039b3a916d1510086030d097dea0f X-Git-Newrev: 4b05d09c18d9aa62d2e7fb4b057f54e5a38963f5 Message-Id: <20130128220221.851577F73@oss.sgi.com> Date: Mon, 28 Jan 2013 16:02:21 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 4b05d09 xfs: Fix possible use-after-free with AIO 9f87832 xfs: fix shutdown hang on invalid inode during create f2a4595 xfs: limit speculative prealloc near ENOSPC thresholds eb17861 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end d26978d xfs: pull up stack_switch check into xfs_bmapi_write 1bee12b xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic from 37f13561de6039b3a916d1510086030d097dea0f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4b05d09c18d9aa62d2e7fb4b057f54e5a38963f5 Author: Jan Kara Date: Wed Jan 23 13:56:18 2013 +0100 xfs: Fix possible use-after-free with AIO Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers CC: stable@vger.kernel.org Signed-off-by: Jan Kara Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 9f87832a82923943aaab38b8d53658af134bbfa4 Author: Dave Chinner Date: Mon Jan 21 23:53:55 2013 +1100 xfs: fix shutdown hang on invalid inode during create When the new inode verify in xfs_iread() fails, the create transaction is aborted and a shutdown occurs. The subsequent unmount then hangs in xfs_wait_buftarg() on a buffer that has an elevated hold count. Debug showed that it was an AGI buffer getting stuck: [ 22.576147] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 22.976213] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.376206] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck [ 23.776325] XFS (vdb): buffer 0x2/0x1, hold 0x2 stuck The trace of this buffer leading up to the shutdown (trimmed for brevity) looks like: xfs_buf_init: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 1 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 1 caller xfs_trans_read_buf_map xfs_buf_iorequest: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_iorequest xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_iorequest xfs_buf_iowait: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_ioerror: bno 0x2 len 0x200 hold 1 caller xfs_buf_bio_end_io xfs_buf_iodone: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_ioend xfs_buf_iowait_done: bno 0x2 nblks 0x1 hold 1 caller _xfs_buf_read xfs_buf_hold: bno 0x2 nblks 0x1 hold 1 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_trans_brelse: bno 0x2 len 0x200 hold 2 recur 0 refcount 1 xfs_buf_item_relse: bno 0x2 nblks 0x1 hold 2 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_relse xfs_buf_unlock: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_rele: bno 0x2 nblks 0x1 hold 1 caller xfs_trans_brelse xfs_buf_trylock: bno 0x2 nblks 0x1 hold 2 caller _xfs_buf_find xfs_buf_find: bno 0x2 len 0x200 hold 2 caller xfs_buf_get_map xfs_buf_get: bno 0x2 len 0x200 hold 2 caller xfs_buf_read_map xfs_buf_read: bno 0x2 len 0x200 hold 2 caller xfs_trans_read_buf_map xfs_buf_hold: bno 0x2 nblks 0x1 hold 2 caller xfs_buf_item_init xfs_trans_read_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_trans_log_buf: bno 0x2 len 0x200 hold 3 recur 0 refcount 1 xfs_buf_item_unlock: bno 0x2 len 0x200 hold 3 flags DIRTY liflags ABORTED xfs_buf_unlock: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock xfs_buf_rele: bno 0x2 nblks 0x1 hold 3 caller xfs_buf_item_unlock And that is the AGI buffer from cold cache read into memory to transaction abort. You can see at transaction abort the bli is dirty and only has a single reference. The item is not pinned, and it's not in the AIL. Hence the only reference to it is this transaction. The problem is that the xfs_buf_item_unlock() call is dropping the last reference to the xfs_buf_log_item attached to the buffer (which holds a reference to the buffer), but it is not freeing the xfs_buf_log_item. Hence nothing will ever release the buffer, and the unmount hangs waiting for this reference to go away. The fix is simple - xfs_buf_item_unlock needs to detect the last reference going away in this case and free the xfs_buf_log_item to release the reference it holds on the buffer. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f2a459565b02b60408f3f2e5ca992a031319712b Author: Dave Chinner Date: Mon Jan 21 23:53:54 2013 +1100 xfs: limit speculative prealloc near ENOSPC thresholds There is a window on small filesytsems where specualtive preallocation can be larger than that ENOSPC throttling thresholds, resulting in specualtive preallocation trying to reserve more space than there is space available. This causes immediate ENOSPC to be triggered, prealloc to be turned off and flushing to occur. One the next write (i.e. next 4k page), we do exactly the same thing, and so effective drive into synchronous 4k writes by triggering ENOSPC flushing on every page while in the window between the prealloc size and the ENOSPC prealloc throttle threshold. Fix this by checking to see if the prealloc size would consume all free space, and throttle it appropriately to avoid premature ENOSPC... Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Ben Myers commit eb178619f930fa2ba2348de332a1ff1c66a31424 Author: Dave Chinner Date: Mon Jan 21 23:53:52 2013 +1100 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end When _xfs_buf_find is passed an out of range address, it will fail to find a relevant struct xfs_perag and oops with a null dereference. This can happen when trying to walk a filesystem with a metadata inode that has a partially corrupted extent map (i.e. the block number returned is corrupt, but is otherwise intact) and we try to read from the corrupted block address. In this case, just fail the lookup. If it is readahead being issued, it will simply not be done, but if it is real read that fails we will get an error being reported. Ideally this case should result in an EFSCORRUPTED error being reported, but we cannot return an error through xfs_buf_read() or xfs_buf_get() so this lookup failure may result in ENOMEM or EIO errors being reported instead. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit d26978dd866dbb3b3a9690f3655a5e735055de89 Author: Brian Foster Date: Thu Jan 17 13:11:29 2013 -0500 xfs: pull up stack_switch check into xfs_bmapi_write The stack_switch check currently occurs in __xfs_bmapi_allocate, which means the stack switch only occurs when xfs_bmapi_allocate() is called in a loop. Pull the check up before the loop in xfs_bmapi_write() such that the first iteration of the loop has consistent behavior. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit 1bee12b8c44d825fb45cd6a13e76c185ed6888b8 Author: Eric Sandeen Date: Wed Jan 16 17:33:53 2013 -0600 xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic 9802182 changed the return value from EWRONGFS (aka EINVAL) to EFSCORRUPTED which doesn't seem to be handled properly by the root filesystem probe. Signed-off-by: Eric Sandeen Tested-by: Sergei Trofimovich Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_bmap.c | 6 +++--- fs/xfs/xfs_buf.c | 20 ++++++++++++++++++++ fs/xfs/xfs_buf_item.c | 12 ++++++++++-- fs/xfs/xfs_iomap.c | 9 +++++++++ fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_trace.h | 1 + 7 files changed, 45 insertions(+), 7 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Jan 28 16:08:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 004277F73; Mon, 28 Jan 2013 16:08:06 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. for-linus-v3.8-rc4-7-g65e3aa7 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 4b05d09c18d9aa62d2e7fb4b057f54e5a38963f5 X-Git-Newrev: 65e3aa77f1b0269720660a6879f6f28d158f54c8 Message-Id: <20130128220807.004277F73@oss.sgi.com> Date: Mon, 28 Jan 2013 16:08:06 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 65e3aa7 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() from 4b05d09c18d9aa62d2e7fb4b057f54e5a38963f5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 65e3aa77f1b0269720660a6879f6f28d158f54c8 Author: Torsten Kaiser Date: Sun Jan 20 10:24:49 2013 +0100 xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed xfs_flushinval_pages() and changed its callers to use filemap_write_and_wait() and truncate_pagecache_range() directly. But in xfs_swap_extents() this change accidental switched the argument for 'tip' to 'ip'. This patch switches it back to 'tip' Signed-off-by: Torsten Kaiser Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dfrag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From sandeen@sandeen.net Mon Jan 28 16:37:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A1B117F76 for ; Mon, 28 Jan 2013 16:37:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 732EC8F804B for ; Mon, 28 Jan 2013 14:37:33 -0800 (PST) X-ASG-Debug-ID: 1359412648-04bdf0231b1b66c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0PobWR535NUBStOF for ; Mon, 28 Jan 2013 14:37:28 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2EDB06099E4C; Mon, 28 Jan 2013 16:37:27 -0600 (CST) Message-ID: <5106FDA5.80409@sandeen.net> Date: Mon, 28 Jan 2013 16:37:25 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Llu=EDs_Batlle_i_Rossell?= CC: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM In-Reply-To: <20130127225258.GA2287@vicerveza.homeunix.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359412648 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.2.121173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/27/13 4:52 PM, Llus Batlle i Rossell wrote: > Hello, > > I'm using linux 3.7.3 in both machines (x86_64 and armv5tel), and I created > a volume in x86_64 to be the rootfs for the ARM. All fine, until I plugged it > into the ARM (Log below). > > Given the corruption, I used xfs_repair in the x86_64, moved a lot of files into lost+found, plugged it back to the ARM, booted, and corruption again. > > In the same USB HD, in the same ARM, and this same way, I've used succesfully > ext4 and btrfs for a long time. Is there any known issue with ARM? > > Thank you, > Llus. > > ---------------------- > starting systemd... > systemd 197 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA +SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ) > > Welcome to NixOS 0.2pre-4eb2b09-af495e0! > > Failed to insert module 'autofs4' > dea96000: 58 46 53 42 00 00 10 00 00 00 00 00 01 bd 26 f0 XFSB..........&. > XFS (sda1): Internal error xfs_da_do_buf(2) at line 2192 of file fs/xfs/xfs_da_btree.c. Caller 0xbf057e68 So this was trying to read a dir2 directory metadata leaf block, and it didn't find the right magic. XFSB is superblock magic . . . I tested an image which (I think) contains every dir2 format, created on x86_64 (under a RHEL6 3.2 kernel) and checked it on ARM (a raspberry pi 3.2.24 kernel) so it's not really quite an apples to apples test. Does the filesystem check clean on x86_64 right after you create it? How did you create it? -Eric From viric@viric.name Mon Jan 28 16:40:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6688F7F78 for ; Mon, 28 Jan 2013 16:40:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11136AC007 for ; Mon, 28 Jan 2013 14:40:19 -0800 (PST) X-ASG-Debug-ID: 1359412817-04bdf0231b1b6780001-NocioJ Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by cuda.sgi.com with ESMTP id 3s7ViymE6BBaPGcc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 14:40:18 -0800 (PST) X-Barracuda-Envelope-From: viric@viric.name X-Barracuda-Apparent-Source-IP: 204.13.248.74 Received: from 102.128.79.188.dynamic.jazztel.es ([188.79.128.102] helo=mail.viric.name) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1TzxNB-000PxZ-JL; Mon, 28 Jan 2013 22:40:17 +0000 Received: by mail.viric.name (Postfix, from userid 1000) id 87D9C43FE329; Mon, 28 Jan 2013 23:40:13 +0100 (CET) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 188.79.128.102 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX1+GF+REWJBriBQDGvHs8YQ+ Date: Mon, 28 Jan 2013 23:40:13 +0100 From: =?iso-8859-1?Q?Llu=EDs?= Batlle i Rossell To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM Message-ID: <20130128224013.GK2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <5106FDA5.80409@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <5106FDA5.80409@sandeen.net> X-Accept-Language: ca, es, eo, ru, en, jbo, tokipona User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mho-04-ewr.mailhop.org[204.13.248.74] X-Barracuda-Start-Time: 1359412818 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.2.121173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 28, 2013 at 04:37:25PM -0600, Eric Sandeen wrote: > So this was trying to read a dir2 directory metadata leaf block, and it= didn't find the right magic. > XFSB is superblock magic . . .=20 >=20 > I tested an image which (I think) contains every dir2 format, created o= n x86_64 > (under a RHEL6 3.2 kernel) and checked it on ARM (a raspberry pi 3.2.24= kernel) > so it's not really quite an apples to apples test. >=20 > Does the filesystem check clean on x86_64 right after you create it? H= ow did you > create it? Thank you for testing! You mean that your test went fine, right? I run: mkfs.xfs /dev/sdb1 Then I copied files to it. After the first crash in the arm, I used xfs_r= epair on the x86_64. It created many lost+found. Then I tried again in the ARM, and it crashed again the same way. Regards, Llu=EDs. From bpm@sgi.com Mon Jan 28 16:42:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 E14237F7B for ; Mon, 28 Jan 2013 16:42:02 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id A1D0A8F804C; Mon, 28 Jan 2013 14:42:02 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 509054266DC; Mon, 28 Jan 2013 16:42:02 -0600 (CST) Date: Mon, 28 Jan 2013 16:42:02 -0600 From: Ben Myers To: Torsten Kaiser Cc: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH]xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() Message-ID: <20130128224202.GE27055@sgi.com> References: <20130120102449.397b3f8b@googlemail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130120102449.397b3f8b@googlemail.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Sun, Jan 20, 2013 at 10:24:49AM +0100, Torsten Kaiser wrote: > From: Torsten Kaiser > > Commit fb59581404ab7ec5075299065c22cb211a9262a9 removed > xfs_flushinval_pages() and changed its callers to use > filemap_write_and_wait() and truncate_pagecache_range() directly. > > But in xfs_swap_extents() this change accidental switched the argument > for 'tip' to 'ip'. This patch switches it back to 'tip' > > Signed-off-by: Torsten Kaiser Looks good. Reviewed-by: Ben Myers Thanks Torsten! From sandeen@sandeen.net Mon Jan 28 16:45:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C07867F83 for ; Mon, 28 Jan 2013 16:45:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DC91AC006 for ; Mon, 28 Jan 2013 14:45:12 -0800 (PST) X-ASG-Debug-ID: 1359413111-04cb6c39131a8450001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MsUBY2fZkDAH3Wlm for ; Mon, 28 Jan 2013 14:45:11 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8D3A26832FEA; Mon, 28 Jan 2013 16:45:11 -0600 (CST) Message-ID: <5106FF76.6080102@sandeen.net> Date: Mon, 28 Jan 2013 16:45:10 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Llu=EDs_Batlle_i_Rossell?= CC: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <5106FDA5.80409@sandeen.net> <20130128224013.GK2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM In-Reply-To: <20130128224013.GK2287@vicerveza.homeunix.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359413111 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.2.121173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/28/13 4:40 PM, Llus Batlle i Rossell wrote: > On Mon, Jan 28, 2013 at 04:37:25PM -0600, Eric Sandeen wrote: >> So this was trying to read a dir2 directory metadata leaf block, and it didn't find the right magic. >> XFSB is superblock magic . . . >> >> I tested an image which (I think) contains every dir2 format, created on x86_64 >> (under a RHEL6 3.2 kernel) and checked it on ARM (a raspberry pi 3.2.24 kernel) >> so it's not really quite an apples to apples test. >> >> Does the filesystem check clean on x86_64 right after you create it? How did you >> create it? > > Thank you for testing! You mean that your test went fine, right? with the simple test on the above machines, yes, it was fine. > I run: > mkfs.xfs /dev/sdb1 > > Then I copied files to it. On the x86_64 machine, right. Just to be sure, can you do an xfs_repair on x86_64 to be sure it's clean at this point? > After the first crash in the arm, I used xfs_repair on the > x86_64. It created many lost+found. capturing the repair output here would be helpful. > Then I tried again in the ARM, and it > crashed again the same way. And by "tried again" do you mean you booted from that filesystem on the arm box, I guess, and then encountered the corruption? -Eric From viric@viric.name Mon Jan 28 16:50:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F258F7F7B for ; Mon, 28 Jan 2013 16:50:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72BB1AC006 for ; Mon, 28 Jan 2013 14:50:20 -0800 (PST) X-ASG-Debug-ID: 1359413417-04cb6c39151a8620001-NocioJ Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by cuda.sgi.com with ESMTP id xifzJowFzDtE9xba (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jan 2013 14:50:18 -0800 (PST) X-Barracuda-Envelope-From: viric@viric.name X-Barracuda-Apparent-Source-IP: 204.13.248.74 Received: from 102.128.79.188.dynamic.jazztel.es ([188.79.128.102] helo=mail.viric.name) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1TzxWo-0004e0-HA; Mon, 28 Jan 2013 22:50:17 +0000 Received: by mail.viric.name (Postfix, from userid 1000) id 99BDB43FE32D; Mon, 28 Jan 2013 23:50:10 +0100 (CET) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 188.79.128.102 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX1929h2zL6z2won2q37DLl6U Date: Mon, 28 Jan 2013 23:50:10 +0100 From: =?iso-8859-1?Q?Llu=EDs?= Batlle i Rossell To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM Message-ID: <20130128225010.GL2287@vicerveza.homeunix.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <5106FDA5.80409@sandeen.net> <20130128224013.GK2287@vicerveza.homeunix.net> <5106FF76.6080102@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <5106FF76.6080102@sandeen.net> X-Accept-Language: ca, es, eo, ru, en, jbo, tokipona User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mho-04-ewr.mailhop.org[204.13.248.74] X-Barracuda-Start-Time: 1359413417 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.2.121175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 28, 2013 at 04:45:10PM -0600, Eric Sandeen wrote: > On 1/28/13 4:40 PM, Llu=EDs Batlle i Rossell wrote: > > On Mon, Jan 28, 2013 at 04:37:25PM -0600, Eric Sandeen wrote: > >> So this was trying to read a dir2 directory metadata leaf block, and= it didn't find the right magic. > >> XFSB is superblock magic . . .=20 > >> > >> I tested an image which (I think) contains every dir2 format, create= d on x86_64 > >> (under a RHEL6 3.2 kernel) and checked it on ARM (a raspberry pi 3.2= .24 kernel) > >> so it's not really quite an apples to apples test. > >> > >> Does the filesystem check clean on x86_64 right after you create it?= How did you > >> create it? > > I run: > > mkfs.xfs /dev/sdb1 > >=20 > > Then I copied files to it.=20 >=20 > On the x86_64 machine, right. Just to be sure, can you do an xfs_repai= r > on x86_64 to be sure it's clean at this point? I don't have the fs anymore... I have that disk in use right now (with ex= t4 finally). But I didn't try to run an xfs_repair straight after writing the files wi= th x86_64. > > After the first crash in the arm, I used xfs_repair on the > > x86_64. It created many lost+found.=20 >=20 > capturing the repair output here would be helpful. ouhm I can't find it now. Sorry. > > Then I tried again in the ARM, and it > > crashed again the same way. >=20 > And by "tried again" do you mean you booted from that filesystem on > the arm box, I guess, and then encountered the corruption? Yes, the same procedure I used in the first case. In the next days I'll try to get some quick test over a loop device or so= , and see if I can reproduce it. Thank you, Llu=EDs. From storm9c1@skymagik.com Mon Jan 28 17:28:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1AD647F76 for ; Mon, 28 Jan 2013 17:28:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AF5AAC006 for ; Mon, 28 Jan 2013 15:28:24 -0800 (PST) X-ASG-Debug-ID: 1359415700-04cbb00c6619ed20001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id clDmZ9K8yVdjZBKK for ; Mon, 28 Jan 2013 15:28:22 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0SNSLo31308; Mon, 28 Jan 2013 18:28:21 -0500 Received: from 192.104.24.222 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Mon, 28 Jan 2013 18:28:18 -0500 (EST) Message-ID: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> Date: Mon, 28 Jan 2013 18:28:18 -0500 (EST) Subject: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: XFS appears to cause strange hang with md raid1 on reboot To: X-Priority: 3 Importance: Normal X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359415702 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.2.121177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dear XFS folks, I have been using XFS for many years, starting on IRIX and then on RedHat 7.2, and now on CentOS/RHEL and Ubuntu. Last time I posted to this mailing list was 12 years ago. :-) I've been a happy customer! I understand that RedHat does not formally support XFS as a root filesystem on RHEL. However, up until now, I've been using it very successfully for years on both CentOS and Ubuntu. On CentOS, I've successfully patched Anaconda since CentOS 5.6 to allow XFS root file system support directly from Anaconda (on both bare metal and Xen VMs). Prior to that, I had code in %post that would simply migrate an ext3 fs to XFS. And I always run md raid1 (except with Xen, since I use mirroring on the dom0). I never use hardware RAID since I want to keep my provisioning as generic as possible. I've deployed many servers using XFS this way and it has always been superior for my workloads.... and superior to ext3, and ext4. ....until CentOS 5.9 came out. Now any systems that are running the stock CentOS 5.9 kernel (including 5.X systems upgraded to this kernel) hang on reboot. If I downgrade to the 5.8 kernel, the problem is resolved. I have taken an engineering approach to testing this problem in efforts to help resolve it. I filed a bug with CentOS, but it's probably not going to go anywhere upstream since RedHat probably won't support XFS on the root filesystem (why I still don't understand, since I fixed the issues with Anaconda for myself and can Kickstart systems with XFS all day long). Therefore I hope anyone here can help. In fact, I was specifically hoping to catch Eric Sandeen's attention since this seems like a pretty serious regression. It's further aggravated by the fact that RedHat stays behind with kernel version and backports modern fixes. I scanned over the 2.6.18-348.el5 (stock 5.9 kernel) changelog, and I see a few suspicious things, but I'm not sure. Much more detail is available here (CentOS bug id 0006217) including steps to reproduce the problem. Also testing with and without md raid. http://bugs.centos.org/view.php?id=6217 The one thing I haven't provided is a traceback. I can provide that if it would be helpful. I am not in a big hurry for help, on the contrary I just want to open up a dialog since perhaps others might be suffering from this. And I want to help resolve it if I can. Any insight is appreciated. -- Tom From sandeen@sandeen.net Mon Jan 28 18:05:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0BF187F7B for ; Mon, 28 Jan 2013 18:05:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE3038F804B for ; Mon, 28 Jan 2013 16:05:36 -0800 (PST) X-ASG-Debug-ID: 1359417934-04bdf0231a1b9360001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id rrVjY4LtqhaFYlmE for ; Mon, 28 Jan 2013 16:05:35 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id ACEF2607B57F; Mon, 28 Jan 2013 18:05:34 -0600 (CST) Message-ID: <5107124E.70607@sandeen.net> Date: Mon, 28 Jan 2013 18:05:34 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Tom CC: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot In-Reply-To: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359417934 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.2.121179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/28/13 5:28 PM, Tom wrote: > > Dear XFS folks, > > I have been using XFS for many years, starting on IRIX and then on RedHat > 7.2, and now on CentOS/RHEL and Ubuntu. Last time I posted to this > mailing list was 12 years ago. :-) I've been a happy customer! > > I understand that RedHat does not formally support XFS as a root filesystem > on RHEL. That's correct. However, I have run xfs root on Centos5, and am currently running xfs root on RHEL6. On md raid1 in both instances. ;) > However, up until now, I've been using it very successfully for > years on both CentOS and Ubuntu. On CentOS, I've successfully patched > Anaconda since CentOS 5.6 to allow XFS root file system support directly > from Anaconda (on both bare metal and Xen VMs). Prior to that, I had code > in %post that would simply migrate an ext3 fs to XFS. And I always run > md raid1 (except with Xen, since I use mirroring on the dom0). I never use > hardware RAID since I want to keep my provisioning as generic as possible. > > I've deployed many servers using XFS this way and it has always been > superior for my workloads.... and superior to ext3, and ext4. > > ....until CentOS 5.9 came out. Now any systems that are running the stock > CentOS 5.9 kernel (including 5.X systems upgraded to this kernel) hang > on reboot. If I downgrade to the 5.8 kernel, the problem is resolved. Just to be absolutely sure, do you have any xfs-kmod or kmod-xfs installed? If so, remove it. > I have taken an engineering approach to testing this problem in efforts > to help resolve it. I filed a bug with CentOS, but it's probably not > going to go anywhere upstream since RedHat probably won't support XFS on > the root filesystem (why I still don't understand, since I fixed the > issues with Anaconda for myself and can Kickstart systems with XFS all > day long). It's for non-technical reasons. > Therefore I hope anyone here can help. In fact, I was specifically hoping > to catch Eric Sandeen's attention since this seems like a pretty serious > regression. It's further aggravated by the fact that RedHat stays behind > with kernel version and backports modern fixes. I scanned over the > 2.6.18-348.el5 (stock 5.9 kernel) changelog, and I see a few suspicious > things, but I'm not sure. > > Much more detail is available here (CentOS bug id 0006217) including steps > to reproduce the problem. Also testing with and without md raid. > http://bugs.centos.org/view.php?id=6217 so it's hanging on the way down I guess? I see: "md: md1 switched to read-only mode" Was that there before? > The one thing I haven't provided is a traceback. I can provide that if it > would be helpful. of course it would be . . . I don't see anything obvious between the two kernels you mention, and I can't spend a ton of time digging into this, since most of my day is taken up supporting the RHEL customers who pay my salary, nudge nudge. ;) I'd look at the kernel changelogs for xfs & md, and see if anything seems plausible. Maybe diff the sources & see what changed, etc. -Eric > I am not in a big hurry for help, on the contrary I just want to open up > a dialog since perhaps others might be suffering from this. And I want to > help resolve it if I can. > > Any insight is appreciated. > > -- Tom > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bounces+428665-37c9-xfs=oss.sgi.com@sendgrid.info Mon Jan 28 19:58:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=FREEMAIL_FROM, HTML_IMAGE_RATIO_04,HTML_MESSAGE,MIME_HTML_ONLY,T_DKIM_INVALID, T_TO_NO_BRKTS_FREEMAIL 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 C1E787F4E for ; Mon, 28 Jan 2013 19:58:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AD90AC004 for ; Mon, 28 Jan 2013 17:58:43 -0800 (PST) X-ASG-Debug-ID: 1359424720-04cb6c39131aeca0001-NocioJ Received: from o6.shared.sendgrid.net (o6.shared.sendgrid.net [74.63.236.217]) by cuda.sgi.com with SMTP id RhOh1lfSyr8grQEH for ; Mon, 28 Jan 2013 17:58:40 -0800 (PST) X-Barracuda-Envelope-From: bounces+428665-37c9-xfs=oss.sgi.com@sendgrid.info X-Barracuda-Apparent-Source-IP: 74.63.236.217 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=to:subject :from:reply-to:mime-version:list-unsubscribe:content-type :content-transfer-encoding; s=smtpapi; bh=gM/aYmc4UX38/mnRzVQTGp voE7Y=; b=VpE+EmrlSiqm5E6t+xRI+4V1XEx0hhBOeITls7MD7ocQCywU3uVtrA eVq00M3vhDa9rM7VBmEGqWkZKg+4n1RvskO2cBSe+Xnevx4a830v4Dgy9KKm1c8/ DydVFLYQtOz0MKkfjgMff36us2rAo9T5A4fvM4OZrrU8lw66k60Oo= Received: by 10.8.40.38 with SMTP id mf22.12101.510729434 Mon, 28 Jan 2013 19:43:31 -0600 (CST) Received: from app2.wesender.com (unknown [174.121.154.12]) by mi23 (SG) with ESMTP id 51072943.6520.5e4e83 for ; Mon, 28 Jan 2013 19:43:31 -0600 (CST) To: xfs@oss.sgi.com Subject: =?UTF-8?B?VOG6v3QgbsSDbSBuYXkgdOG6t25nIHPhur9wIGfDrCDEkcOieT8=?= Message-ID: <317ff80971ef1425c7736de8c71502e0@app2.wesender.com> X-ASG-Orig-Subj: =?UTF-8?B?VOG6v3QgbsSDbSBuYXkgdOG6t25nIHPhur9wIGfDrCDEkcOieT8=?= Date: Tue, 29 Jan 2013 01:40:09 +0000 From: "=?UTF-8?B?UXXDoCB0cuG7sWMgdHV54bq/bg==?=" Reply-To: quatang1107@gmail.com MIME-Version: 1.0 X-Mailer-LID: 10 List-Unsubscribe: X-Mailer-RecptId: 190784 X-Mailer-SID: 37 X-Mailer-Sent-By: 2 Content-Type: text/html; charset="UTF-8" content-transfer-encoding: quoted-printable X-Sendgrid-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3dczpHTHdRZX9X+jIMUpE881bWp977T7OIMoLNKiKMuNCTpGps4XLMKW4+nlJnFVEXjx5Vps/jd80VTwOgaxjNv X-Barracuda-Connect: o6.shared.sendgrid.net[74.63.236.217] X-Barracuda-Start-Time: 1359424720 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: 2.27 X-Barracuda-Spam-Status: No, SCORE=2.27 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_COMMENT_TEXT_2K, BSF_SC3_MV0164, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121187 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.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0164 Custom rule MV0164 0.10 BSF_SC0_COMMENT_TEXT_2K Custom Rule BSF_SC0_COMMENT_TEXT_2K =0D =0D =0D =0D Gi=E1=BB=8F qu=C3=A0 m=E1=BB=B9=0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    N=E1=BA=BFu b=E1=BA=A1n không xem =C4=91=C6=B0=E1=BB= =A3c email, <= font=0D color=3D"#454545">Vào =C4=91ây=0D =C4=91ê xem online=0D =0D =0D =0D =0D =0D =0D =0D =0D
     
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D
    Xem website=0D       |     &nbs= p;Quà t=E1=BA=BFt=0D     |     Liên h=E1=BB=87=0D       
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    =0D

    Kiarna Vineyards Holiday Selection M751

    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
     
     
    =0D

    Gi=E1=BB=8F quà t=E1=BA=BFt cao c=E1=BA=A5p Kiarna nh=E1=BA=ADp=0D kh=E1=BA=A9u nguyên gi=E1=BB=8F t=E1=BB=AB M=E1=BB=B9, v=E1=BA=ADn ch= uy=E1=BB=85n mi=E1=BB=85n phí=0D trên toàn Qu=E1=BB=91c, Gi=E1=BB=8F quà cao c=E1=BA=A5p= =C4=91=C6=B0=E1=BB=A3c=0D =C4=91óng gói sang tr=E1=BB=8Dng, =C4=91=E1=BA=B9p m=E1=BA=AF= t, b=E1=BA=A3o =C4=91=E1=BA=A3m an=0D toàn

    =0D

    Kích th=C6=B0=E1=BB=9Bc : 38 x 18 x 33 cm

    =0D
     
    =0D =0D =0D =0D =0D =0D =0D =0D
    Giá2.240.000=C4=91
    =0D
     
    =0D
    <= a=0D href=3D"http://app2.wesender.com/link.php?M=3D190784&N=3D37&L=3D24&F=3DH"= =0D target=3D"_blank">
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D
    Gi=E1=BB=8F quà cao c=E1=BA=A5p
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    M764
    Callister=0D Cellars Double Delight
    1.880.000=C4=91
    31 x 18 x 33 cm
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    M728
    Vintners Path= =0D Holidayy Quartet
    3.510.000=C4=91
    38 x 31 x 28 cm
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    M510
    Rocky Mountain= =0D Chocolate Tower
    809.000=C4=91
     
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    Gi=E1= =BB=8F=0D quà cao c=E1=BA=A5p nh=E1=BA=ADp t=E1=BB=AB M=E1=BB=B9

    S=E1=BA=A3n ph=E1=BA=A9m gi=E1=BB=8F quà t=E1=BA=BFt cao c=E1=BA= =A5p nh=E1=BA=ADp t=E1=BB=AB M=E1=BB=B9=0D có giá bán không quà =C4=91=E1=BA=AFt nh= =C6=B0ng l=E1=BA=A1i=0D r=E1=BA=A5t sang tr=E1=BB=8Dng, phù h=E1=BB=A3p v=E1=BB=9Bi dù= ;ng làm=0D quà bi=E1=BA=BFu c=E1=BA=A5p trên, ng=C6=B0=E1=BB=9Di thâ= ;n anh em và=0D b=E1=BA=A1n bè. Ch=E1=BA=AFc h=E1=BA=B3n khi m=E1=BB=9F món q= uà ra ng=C6=B0=E1=BB=9Di=0D nh=E1=BA=ADn s=E1=BA=BD r=E1=BA=A5t vui và c=E1=BA=A3m nh=E1=BA=ADn = rõ thành=0D ý c=E1=BB=A7a ng=C6=B0=E1=BB=9Di t=E1=BA=B7ng.

    =0D

    Gi=E1=BB=8F quà =C4=91=C6=B0=E1=BB=A3c nh=E1=BA=ADp kh=E1=BA=A9u = nguyên gi=E1=BB=8F t=E1=BB=AB M=E1=BB=B9,=0D V=E1=BA=ADn chuy=E1=BB=85n Mi=E1=BB=85n phí trên toàn Q= u=E1=BB=91c, s=E1=BA=A3n=0D ph=E1=BA=A9m =C4=91=C6=B0=E1=BB=A3c =C4=91óng gói c=E1=BA=A9n= th=E1=BA=ADn Quý=0D khách hoàn toàn yên tâm v=E1=BB=81 kh&acir= c;u=0D v=E1=BA=ADn chuy=E1=BB=83n.

    =0D

    Món quà sang tr=E1=BB=8Dng =C4=91=E1=BA= =A7y thành=0D ý.

    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D
    Danh m=E1=BB=A5c quà t=E1=BA=B7ng
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    Qu&agrav= e;=0D t=E1=BA=BFt
    Qu&agrav= e;=0D t=E1=BA=B7ng b=E1=BB=91 m=E1=BA=B9
    Qu&agrav= e;=0D t=E1=BA=B7ng b=E1=BA=A1n gái
    Qu&agrav= e;=0D t=E1=BA=B7ng b=E1=BA=A1n trai
    Qu&agrav= e;=0D t=E1=BA=B7ng cho bé
    Qu&agrav= e;=0D ngày valentine
    Qu&agrav= e;=0D sinh nh=E1=BA=ADt
    Qu&agrav= e;=0D t=E1=BA=B7ng s=E1=BA=BFp
    =0D
     
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D
    =0D
    =0D =0D =0D =0D =0D =0D =0D
    =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D =0D
    If you have no more interest in receiving our news, unsubscribe.
    © Copyright 2013 by Quatructuyen.com=0D
    info@quatructuyen.com | Tel: 0466733463
    =0D
    =0D
    =0D
    Click=0D v=C3=A0o =C4=91=C3=A2y =C4=91=E1=BB=83 b=E1=BB=8F =C4=91=C4=83ng k=C3=BD=0D From david@fromorbit.com Mon Jan 28 21:31:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1542A7F4E for ; Mon, 28 Jan 2013 21:31:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA6BC304059 for ; Mon, 28 Jan 2013 19:31:08 -0800 (PST) X-ASG-Debug-ID: 1359430266-04cb6c39151b0770001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Dt0b1vAtLDnk8SEc for ; Mon, 28 Jan 2013 19:31:07 -0800 (PST) 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: Av8EAElBB1G2/3vK/2dsb2JhbABEvloWc4IeAQEEAScTPwULCAMNAQoJJQ8FKCETiAsFsDaQGJAkYQOWDIYOA4M8hnyDCw Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail07.adl2.internode.on.net with ESMTP; 29 Jan 2013 14:01:06 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U01ub-00081U-Dt; Tue, 29 Jan 2013 14:31:05 +1100 Date: Tue, 29 Jan 2013 14:31:05 +1100 From: Dave Chinner To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents Message-ID: <20130129033105.GD7255@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unneeded ASSERT from xfs_itruncate_extents Mail-Followup-To: Carlos Maiolino , xfs@oss.sgi.com References: <1359381870-30908-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359381870-30908-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1359430266 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.2.121193 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 28, 2013 at 09:04:30AM -0500, Carlos Maiolino wrote: > There is no reason to ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); twice, so, > remove one of these ASSERT calls Second assert is for the IOLOCK, not the ILOCK.... > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 66282dc..25226ea 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1396,8 +1396,7 @@ xfs_itruncate_extents( > int done = 0; > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || > - xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + ASSERT(!atomic_read(&VFS_I(ip)->i_count)); The code is correct. The ASSERT is testing the locking constraints on the XFS_IOLOCK_EXCL. That is, if xfs_itruncate_extents() is called in the VFS inode reclaim path (i.e. via xfs_inactive()), the IO lock is not used (throws lockdep warnings). Hence the ASSERT is checking that if we hold an inode reference, we are also holding the IO lock. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Mon Jan 28 21:47:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9CDCA7F4E for ; Mon, 28 Jan 2013 21:47:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E5F6AC001 for ; Mon, 28 Jan 2013 19:47:48 -0800 (PST) X-ASG-Debug-ID: 1359431266-04bdf0231b1bf6d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id evOprDPKICXMhEJs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 28 Jan 2013 19:47:47 -0800 (PST) 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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0T3ljbj016300 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 29 Jan 2013 03:47:46 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0T3ljIe016655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 29 Jan 2013 03:47:45 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0T3liPN029817; Mon, 28 Jan 2013 21:47:44 -0600 Received: from [192.168.1.103] (/221.223.96.144) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 28 Jan 2013 19:47:44 -0800 Message-ID: <51074659.2090700@oracle.com> Date: Tue, 29 Jan 2013 11:47:37 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/2] xfsprogs: sync transaction log spaces changes to the user space References: <51067F51.7040904@oracle.com> <51069FD6.7030203@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v2 2/2] xfsprogs: sync transaction log spaces changes to the user space In-Reply-To: <51069FD6.7030203@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 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: 1359431266 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.2.121193 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Mark, On 01/28/2013 11:57 PM, Mark Tinguely wrote: > On 01/28/13 07:38, Jeff Liu wrote: >> Sync the kernel codes changes regarding transaction log space reservations >> to the user space. >> >> As we have splitted the calculation of attrset log space reservations into mount >> time and runtime in kernel code, here we need to fix max_attrset_trans_res_adjust() >> to reflect this change. >> >> Signed-off-by: Jie Liu >> >> --- >> include/xfs_mount.h | 3 +- >> include/xfs_trans.h | 9 +- >> libxfs/xfs_attr.c | 9 +- >> libxfs/xfs_trans.c | 265 ++++++++++++++++++++++++++------------------------- >> mkfs/maxtrres.c | 9 +- >> 5 files changed, 147 insertions(+), 148 deletions(-) >> > > For anyone else looking at this. This is basically kernel log > reservation patch 2 and 13 combined. > > >> diff --git a/include/xfs_trans.h b/include/xfs_trans.h >> index c2042b7..2870308 100644 >> --- a/include/xfs_trans.h >> +++ b/include/xfs_trans.h >> @@ -254,12 +254,9 @@ struct xfs_log_item_desc { >> #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) >> #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) >> #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) >> -#define XFS_ATTRSET_LOG_RES(mp, ext) \ >> - ((mp)->m_reservations.tr_attrset + \ >> - (ext * (mp)->m_sb.sb_sectsize) + \ >> - (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ >> - (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) >> -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) >> +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) >> +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) >> +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) >> #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) > > ... > >> index 33dee52..bf8a2c5 100644 >> --- a/mkfs/maxtrres.c >> +++ b/mkfs/maxtrres.c >> @@ -34,7 +34,6 @@ max_attrset_trans_res_adjust( >> int local; >> int size; >> int nblks; >> - int res; >> >> /* >> * Determine space the maximal sized attribute will use, >> @@ -46,13 +45,9 @@ max_attrset_trans_res_adjust( >> nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); >> nblks += XFS_B_TO_FSB(mp, size); >> nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); >> - res = XFS_ATTRSET_LOG_RES(mp, nblks); >> >> -#if 0 >> - printf("size = %d nblks = %d res = %d\n", size, nblks, res); >> -#endif >> - >> - mp->m_reservations.tr_attrset = res; > > This number used to be the mount portion of constant that was > multiplied times args.total. > > Isn't this value (res) what we want to place into tr_attrsetm > like before? This is not because we have to figure out the max transaction space reservations for the attrset at first, and then it will be used for the max trans space reservations by mount... The old attrset includes both mount(attrsetm) and realtime(attrsetrt), that's why I splitted them as below. > > and then tr_attrsetrt is from xfs_calc_attrsetrt_reservation()? > >> + mp->m_reservations.tr_attrsetm = XFS_ATTRSETM_LOG_RES(mp); >> + mp->m_reservations.tr_attrsetrt = XFS_ATTRSETRT_LOG_RES(mp) * nblks; >> } >> I have tested it by putting printf statement to max_attrset_trans_res_adjust(), and verified that the "res = XFS_ATTRSET_LOG_RES(mp, nblks)" is equal to the "XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * nblks". Thanks, -Jeff From eguan@redhat.com Mon Jan 28 22:01:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1B0547F4E for ; Mon, 28 Jan 2013 22:01:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B7C78F8050 for ; Mon, 28 Jan 2013 20:00:57 -0800 (PST) X-ASG-Debug-ID: 1359432056-04cb6c39151b0d70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5TizCmHg3TFwWEHF for ; Mon, 28 Jan 2013 20:00:57 -0800 (PST) X-Barracuda-Envelope-From: eguan@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 r0T40rA0016428 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jan 2013 23:00:56 -0500 Received: from localhost ([10.66.13.231]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0T40pna017149 for ; Mon, 28 Jan 2013 23:00:53 -0500 Date: Tue, 29 Jan 2013 12:00:51 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: Re: [PATCH v3] xfstests 295: test xfs direct IO nested transaction deadlock Message-ID: <20130129040051.GE2768@eguan-t400.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests 295: test xfs direct IO nested transaction deadlock References: <1358836828-32517-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1358836828-32517-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1359432057 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 On Tue, Jan 22, 2013 at 02:40:28PM +0800, Eryu Guan wrote: > Regression test case for commit: > > 437a255 xfs: fix direct IO nested transaction deadlock. > > Signed-off-by: Eryu Guan Hi, any comments on this version? Thanks, Eryu > --- > v3: > 1. rename TESTDIR to STRESS_DIR > 2. decrease variable by using "let" > 3. call wait instead of sync after killing all fsstress processes > 4. rebase on top of master > v2: > 1. drop generic freeze vs fsstress test, 068 has done this > 2. remove unnecessary _scratch_unmount > 3. rm $seq.full before _scratch_mkfs_xfs > 4. remove unnecessary sleep > 5. remove unnecessary output > 6. run fixed number(10) of iterations of freeze/thaw cycles > 7. remove from dangerous group > > 295 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 295.out | 3 +++ > group | 1 + > 3 files changed, 92 insertions(+) > create mode 100644 295 > create mode 100644 295.out > > diff --git a/295 b/295 > new file mode 100644 > index 0000000..57aa63c > --- /dev/null > +++ b/295 > @@ -0,0 +1,88 @@ > +#! /bin/bash > +# FS QA Test No. 295 > +# > +# Test freeze/unfreeze file system randomly under fsstress > +# Regression test for commit: > +# 437a255 xfs: fix direct IO nested transaction deadlock. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 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 > +#----------------------------------------------------------------------- > +# > +# creator > +owner=eguan@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > +_supported_fs xfs > +_supported_os IRIX Linux > + > +_require_scratch > +_require_freeze > + > +rm -f $seq.full > +_scratch_mkfs_xfs -d agcount=16,su=256k,sw=12 -l su=256k,size=2560b >/dev/null 2>&1 > +_scratch_mount >/dev/null 2>&1 > + > +STRESS_DIR="$SCRATCH_MNT/testdir" > +mkdir -p $STRESS_DIR > + > +$FSSTRESS_PROG -d $STRESS_DIR -n 100 -p 1000 $FSSTRESS_AVOID >/dev/null 2>&1 & > + > +# Freeze/unfreeze file system randomly > +echo "Start freeze/unfreeze randomly" | tee -a $seq.full > +LOOP=10 > +while [ $LOOP -gt 0 ];do > + TIMEOUT=`expr $RANDOM % 5` > + sleep $TIMEOUT > + echo "* Freeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -f $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: freeze filesystem failed" | tee -a $seq.full > + fi > + TIMEOUT=`expr $RANDOM % 3` > + sleep $TIMEOUT > + echo "* Unfreeze file system after sleeping $TIMEOUT seconds" >>$seq.full > + xfs_freeze -u $SCRATCH_MNT > + if [ $? -ne 0 ];then > + echo " - Error: unfreeze filesystem failed" | tee -a $seq.full > + fi > + let LOOP=$LOOP-1 > +done > +echo "Test done" | tee -a $seq.full > +killall -q $FSSTRESS_PROG > +wait > + > +_check_scratch_fs > +status=0 > +exit > diff --git a/295.out b/295.out > new file mode 100644 > index 0000000..ab4f99b > --- /dev/null > +++ b/295.out > @@ -0,0 +1,3 @@ > +QA output created by 295 > +Start freeze/unfreeze randomly > +Test done > diff --git a/group b/group > index 505bc7f..6578540 100644 > --- a/group > +++ b/group > @@ -413,3 +413,4 @@ deprecated > 292 auto mkfs quick > 293 auto quick > 294 auto quick > +295 auto freeze > -- > 1.7.11.7 From stan@hardwarefreak.com Mon Jan 28 23:21:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8038F7F4E for ; Mon, 28 Jan 2013 23:21:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 623688F8039 for ; Mon, 28 Jan 2013 21:21:07 -0800 (PST) X-ASG-Debug-ID: 1359436863-04bdf0231b1c1280001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id mTa49Fd3Mwr4diKX for ; Mon, 28 Jan 2013 21:21:03 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C3D206C105; Mon, 28 Jan 2013 23:21:02 -0600 (CST) Message-ID: <51075C42.4050404@hardwarefreak.com> Date: Mon, 28 Jan 2013 23:21:06 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Eric Sandeen CC: =?ISO-8859-1?Q?Llu=EDs_Batlle_i_Rossell?= , xfs@oss.sgi.com Subject: Re: Volume fine on x86_64, corruption on ARM References: <20130127225258.GA2287@vicerveza.homeunix.net> <5106FDA5.80409@sandeen.net> <20130128224013.GK2287@vicerveza.homeunix.net> <5106FF76.6080102@sandeen.net> X-ASG-Orig-Subj: Re: Volume fine on x86_64, corruption on ARM In-Reply-To: <5106FF76.6080102@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1359436863 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 1/28/2013 4:45 PM, Eric Sandeen wrote: > On 1/28/13 4:40 PM, Llus Batlle i Rossell wrote: >> I run: >> mkfs.xfs /dev/sdb1 >> >> Then I copied files to it. > > On the x86_64 machine, right. Just to be sure, can you do an xfs_repair > on x86_64 to be sure it's clean at this point? Worth considering, the move may not be the problem but simply a manifestation of it. Creating the filesystem directly on the Shiva plug and testing it may be instructive at this point as well. -- Stan From dinos9gb@gmail.com Tue Jan 29 02:03:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 494DF7F4E for ; Tue, 29 Jan 2013 02:03:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0912AC001 for ; Tue, 29 Jan 2013 00:03:13 -0800 (PST) X-ASG-Debug-ID: 1359446587-04cbb00c661ad6d0001-w1Z2WR Received: from mail-oa0-f45.google.com (mail-oa0-f45.google.com [209.85.219.45]) by cuda.sgi.com with ESMTP id wWYkV9ruERIbwpVO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 29 Jan 2013 00:03:07 -0800 (PST) X-Barracuda-Envelope-From: dinos9gb@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] Received: by mail-oa0-f45.google.com with SMTP id o6so142469oag.32 for ; Tue, 29 Jan 2013 00:03:07 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=Eh2cB66q2UM7igHgPfJ3KtetLieSxzx0aDhb1KpgHTU=; b=oTQqfr2Jb0Mpmfk0n0ENBLoyG9T+yGAckMplMS8+fAj6HWjBQWXyyC26PssN5VpEsI udkdXzKNRZPvsvyo+gsvBQZNRuP7Nb2N3H9PY1W0iJz1B/CK5MjH1r32bfPlzPnXeMY+ vBAvhpupVyeHq8+9FymvxwEDBREQkHIcPvy1rsRAkvg5WAfdWSPkm3+m+sMiwi8owCvv 3fXs/9/xoBCG/BwEjN+hbnEjA09Gqh0uQ5LPFdl6Ro5OdA2GWBJGzHgyJ8Aqdvj+Wcav P+QHQSbxo7O8zH/2F8gEKQGrkHownLzlMvIEq8cb1VIJLrf7gn7BViCUwz2JRedhc9hi Rbyw== MIME-Version: 1.0 X-Received: by 10.60.26.234 with SMTP id o10mr34048oeg.116.1359446586754; Tue, 29 Jan 2013 00:03:06 -0800 (PST) Received: by 10.60.21.73 with HTTP; Tue, 29 Jan 2013 00:03:06 -0800 (PST) Date: Tue, 29 Jan 2013 16:03:06 +0800 Message-ID: Subject: dog supply From: 3U Pet Supply X-ASG-Orig-Subj: dog supply To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=e89a8f83a4d9e51b2d04d468d217 X-Barracuda-Connect: mail-oa0-f45.google.com[209.85.219.45] X-Barracuda-Start-Time: 1359446587 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --e89a8f83a4d9e51b2d04d468d217 Content-Type: text/plain; charset=ISO-8859-1 Hi, this is Jeff Wu from China. We are a factory which produces pet clothes, pet harness, pet leash and pet toys. Please let me know if you are interested to buy from us, thanks! Best regards, Jeff Wu --e89a8f83a4d9e51b2d04d468d217 Content-Type: text/html; charset=ISO-8859-1

    Hi, this is Jeff Wu from China.
    We are a factory which produces pet clothes, pet harness, pet leash and pet toys.
    Please let me know if you are interested to buy from us, thanks!

    Best regards,
    Jeff Wu



    --e89a8f83a4d9e51b2d04d468d217-- From korkmaz@toplumailgonderimi.com Tue Jan 29 03:15:54 2013 Return-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=HTML_IMAGE_RATIO_04, HTML_MESSAGE,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 8CFA47F4E for ; Tue, 29 Jan 2013 03:15:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 51D068F8050 for ; Tue, 29 Jan 2013 01:15:51 -0800 (PST) X-ASG-Debug-ID: 1359450947-04bdf0231a1c9b50001-w1Z2WR Received: from mx40.epostagitti.com (mx40.epostagitti.com [79.171.21.40]) by cuda.sgi.com with ESMTP id yCQ9y8XCjqlAXVWV for ; Tue, 29 Jan 2013 01:15:47 -0800 (PST) X-Barracuda-Envelope-From: korkmaz@toplumailgonderimi.com X-Barracuda-Apparent-Source-IP: 79.171.21.40 From: "=?iso-8859-9?B?QnVyc2Egx2nnZWsgTWFnYXphc/0=?=" Subject: =?iso-8859-9?B?MTQg3nViYXQgU2V2Z2lsaWxlciBH/G78IMdp52Vrc2l6IE9sbWF6?= To: "linux-xfs" X-ASG-Orig-Subj: =?iso-8859-9?B?MTQg3nViYXQgU2V2Z2lsaWxlciBH/G78IMdp52Vrc2l6IE9sbWF6?= Content-Type: multipart/alternative; boundary="EvG7eCp4ZxFZmXaJFlcF9h=_8YyK8X2GK5" MIME-Version: 1.0 Organization: =?iso-8859-9?B?QnVyc2Egx2nnZWsgTWFnYXphc/0=?= Date: Tue, 29 Jan 2013 11:15:58 +0200 Message-ID: <0.0.27.980.1CDFE00AD951DB8.0@mx40.epostagitti.com> X-Barracuda-Connect: mx40.epostagitti.com[79.171.21.40] X-Barracuda-Start-Time: 1359450947 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.17 X-Barracuda-Spam-Status: No, SCORE=0.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format --EvG7eCp4ZxFZmXaJFlcF9h=_8YyK8X2GK5 Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline De=F0eri TL =DDndirimli100.00 TL =20 =20 =20 =20 Pel=FC=FE Oyuncak Ay=FDlar =D6zellikle bir ili=FEkinin her an=FDnda =F6= nem arzeden m=FCthi=FE icatlard=FDr.=DD=FEte burada bu icatlar=FD yapt= =FD=F0=FD =E7i=E7eklerle dahada g=FCzelle=FEtiren Bursa =C7i=E7ek Ma=F0= azas=FD bir ili=FEkinin sembolzm dolay=FDndaki g=F6stergeleri,o ili=FE= kinin bayra=F0=FD,anlam ve ehemiyetini belirten sanca=F0=FD olan pel=FC= =FE ay=FDlar=FD =E7i=E7eklerle tanzim eder ve sunar.. 46.00 TL Sat=FDn Al + 47.00 TL Sat=FDn Al + 49.00 TL Sat=FDn Al + 49.00 TL Sat=FDn Al + Mail Listemizden =E7=FDkmak i=E7in l=FCtfen info@bursacicekmagazasi.co= m adresine "Listeden =E7=FDkmak istiyorum" konu ba=FEl=FDkl=FD bo=FE m= ail at=FDn=FDz. --EvG7eCp4ZxFZmXaJFlcF9h=_8YyK8X2GK5 Content-Type: text/html; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline

     

     


     


    De=F0eri TL
    =DDndirimli 100.00 TL

    =20
     
     

     

    Pel=FC=FE Oyuncak Ay=FDlar =D6= zellikle bir ili=FEkinin her an=FDnda =F6nem arzeden m=FCthi=FE icatla= rd=FDr.=DD=FEte burada bu icatlar=FD yapt=FD=F0=FD =E7i=E7eklerle daha= da g=FCzelle=FEtiren Bursa =C7i=E7ek Ma=F0azas=FD bir ili=FEkinin semb= olzm dolay=FDndaki g=F6stergeleri,o ili=FEkinin bayra=F0=FD,anlam = ; ve ehemiyetini belirten sanca=F0=FD olan pel=FC=FE ay=FDlar=FD =E7i=E7= eklerle tanzim eder ve sunar..





    46.00 TL Sat=FDn Al +

    47.00 TL Sat=FDn Al +

    =
    49.00 TL Sat=FDn Al +

    49.00 TL Sat=FDn Al +

    Mail Listemizden =E7=FDkmak i=E7in l=FCtfen info@bursacicekmagazas= i.com adresine "Listeden =E7=FDkmak istiyorum" konu ba=FEl=FDkl=FD bo=FE= mail at=FDn=FDz.
    --EvG7eCp4ZxFZmXaJFlcF9h=_8YyK8X2GK5-- From news@deals-media.com Tue Jan 29 06:26:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_RATIO_02, 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 636CF7F50 for ; Tue, 29 Jan 2013 06:26:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF172AC004 for ; Tue, 29 Jan 2013 04:26:28 -0800 (PST) X-ASG-Debug-ID: 1359462384-04cb6c39121bfac0001-NocioJ Received: from deals-media.com (a68.deals-media.com [178.33.171.68]) by cuda.sgi.com with SMTP id loHhMHmklD13S4GQ for ; Tue, 29 Jan 2013 04:26:25 -0800 (PST) X-Barracuda-Envelope-From: news@deals-media.com X-Barracuda-Apparent-Source-IP: 178.33.171.68 DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; s=mail;d=deals-media.com; h=from:sender:to:date:message-id:subject:mime-version:content-type; bh=U+ytcZAvHlKI9Lb3pRERKqk75tE=; b=Ny0O3AFD8Hl0hSg2yKYs7tc9C1Ugmd4XFWHLKAlBm6PupQve+fXLtp/zF9VjjEywU4zeciQ5 ptEP/p3G0YIrAISVJQHlmG7UYwKJms2RJqlAaHGTLbTE3Lahv3+b03JvhxPbxhOx/oTUJp/o xyp37OgWCPqVgWCR4vjR20kDMWQ= DomainKey-Signature: a=rsa-sha1; q=dns; c=simple; s=mail;d=deals-media.com; h=from:sender:to:date:message-id:subject:mime-version:content-type; b=Q1ZMKCGpDz3qulS3xlwlQ9SgnBM6aWJEhTDCpvpqvPWHEpwNXynmiAxfuGOmTVQUREWvK/0P ZA4K563NOyreYJt5II8ppvBr7lnhhrxySA5FRZVptViLI8u8jHjFhP3j91Ji1j1W4cCCTneR ZVVy+rKGX/vBip7OT1dX/4Y8EXI= List-Unsubscribe: http://deals-media.com/tr/index.aspx?id=e82e7e9bf13761c9f3c4f4bd71c75f601d16c36baebd69b3f0b74f4472bb8de5c14d5f0595cf6393 From: Lacoste Sender: Lacoste Reply-To: Lacoste To: xfs@oss.sgi.com Date: Tue, 29 Jan 2013 12:25:47 GMT Organization: deals-media.com Message-ID: Subject: =?utf-8?Q?Jusqu'=C3=A0_50%_de_r=C3=A9duction_sur_une_s=C3=A9lection=20?= =?utf-8?Q?d'articles?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?Jusqu'=C3=A0_50%_de_r=C3=A9duction_sur_une_s=C3=A9lection=20?= =?utf-8?Q?d'articles?= X-Mailer: devMail.Net (3.0.1854.22234-6) Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 X-Barracuda-Connect: a68.deals-media.com[178.33.171.68] X-Barracuda-Start-Time: 1359462384 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.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121228 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 77u/PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlv bmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQo8aHRtbD4N CiAgICA8aGVhZD4NCiAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250 ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KICAgICAgICA8bWV0YSBodHRwLWVxdWl2 PSJjb250ZW50LWxhbmd1YWdlIiBjb250ZW50PSJmciI+DQogICAgICAgIDx0aXRsZT5MQUNPU1RF PC90aXRsZT4NCiAgICAgICAgPHN0eWxlIHR5cGU9IuKAnXRleHQvY3Nz4oCdIj4NCiAgICAgICAg ICAgIC5SZWFkTXNnQm9keQ0KICAgICAgICAgICAgeyB3aWR0aDogMTAwJTt9DQogICAgICAgICAg ICAuRXh0ZXJuYWxDbGFzcw0KICAgICAgICAgICAge3dpZHRoOiAxMDAlO30NCiAgICAgICAgPC9z dHlsZT4NCiAgICA8L2hlYWQ+DQogICAgPGJvZHkgc3R5bGU9Im1hcmdpbjowIj48ZGl2IGFsaWdu PSJjZW50ZXIiPjxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9IjIiPlNpIGNlIG1lc3NhZ2UgbmUg cydhZmZpY2hlIHBhcyBjb3JyZWN0ZW1lbnQsIDxhICBocmVmPSJodHRwOi8vZGVhbHMtbWVkaWEu Y29tL3RyL21pcnJvci5hc3B4P2lkPWU4MmU3ZTliZjEzNzYxYzlmM2M0ZjRiZDcxYzc1ZjYwZWQ1 OWEwMDE2NDM1NzMyMzM3MzY3YzBmYTdkYmZlN2NkNGJiYWI0MmQ2ODhjNmY0NWJjMDExZGY5NDZi ODA0YyI+U3VpdmV6IGNlIGxpZW48L2E+PC9mb250PjwvZGl2Pg0KICAgICAgICA8dGFibGUgd2lk dGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgYmdj b2xvcj0iI2ZmZmZmZiI+DQogICAgICAgICAgICA8dGJvZHk+DQogICAgICAgICAgICAgICAgPHRy Pg0KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPg0KICAgICAgICAgICAgICAg ICAgICA8dGFibGUgd2lkdGg9IjcwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNw YWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0g VE9QIE5BViAtLS0+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 dGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iNzAwIiBi b3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8dGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDx0YWJsZSB3aWR0aD0iNzAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGlu Zz0iMCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 dGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNw eD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MDgwOGNjYWM2MGMxNDJkNmJkNzYx M2ZlYzkzNjRiMTZjZjE0NDk5MGViZWEzOTU1NCIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0 LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUiIHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0 eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdodDowOyBjb2xvcjojMzMzIiBib3JkZXI9IjAi IHNyYz0iaHR0cDovL21haWwtdG91c2Fzc3VyLmNvbS9OZXRBZmZpbGlhdGlvbi90b3Vzc2Fzc3Vy X2xhY29zdGVfZmljaGllcnMvbWFpbDQ3XzhfMC5qcGciIHdpZHRoPSI3MDAiIGhlaWdodD0iODki IGFsdD0iSnVzcXUnw6AgNTAlIGRlIHLDqWR1Y3Rpb24gc3VyIHVuZSBzw6lsZWN0aW9uIGQnYXJ0 aWNsZXMiPjwvYT48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8L3Rib2R5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iNzAwIiBib3JkZXI9IjAi IGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9k ZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3 MWM3NWY2MDc4ODM0NWI4OWI1ZjViY2Y5MTY3MmVlNDMxZWUxZWFkODM2NDcyMGM3MzRiM2YxZSIg dGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUi IHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdo dDowOyIgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxp YXRpb24vdG91c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzEuanBnIiB3aWR0aD0i NzUiIGhlaWdodD0iMjEiPjwvYT48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRp YS5jb20vdHIvaW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MDVm YTVjYjZmMzU4ZDRjMTg0NjNlMmE0MTdlYmNhNDVhZDdhNjYwOGI1ZmFmOGQ5YiIgdGFyZ2V0PSJf YmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUiIHJlX3Rhcmdl dD0iX2JsYW5rIj48aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdodDowOyIgYm9y ZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxpYXRpb24vdG91 c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzIuanBnIiB3aWR0aD0iNzQiIGhlaWdo dD0iMjEiPjwvYT48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRpYS5jb20vdHIv aW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MGZjMTUyYjBlM2E3 YmFjODU5MDE2NjYxMWUzMGQxOTNmNmYxYTA3ZmU0ODYzMmUzZiIgdGFyZ2V0PSJfYmxhbmsiIHN0 eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUiIHJlX3RhcmdldD0iX2JsYW5r Ij48aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdodDowOyIgYm9yZGVyPSIwIiBz cmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxpYXRpb24vdG91c3Nhc3N1cl9s YWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzMuanBnIiB3aWR0aD0iODUiIGhlaWdodD0iMjEiPjwv YT48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNw eD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MDVkOGI2Y2E1OWYyYTk3MjkxZmY4 MGJlOTFmMmRhMTRmNGVmYjdlMzE3MGQ0NjhkNiIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0 LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUiIHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0 eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdodDowOyIgYm9yZGVyPSIwIiBzcmM9Imh0dHA6 Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxpYXRpb24vdG91c3Nhc3N1cl9sYWNvc3RlX2Zp Y2hpZXJzL21haWw0N184XzQuanBnIiB3aWR0aD0iODQiIGhlaWdodD0iMjEiPjwvYT48L3RkPg0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 dGQ+PGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNweD9pZD1lODJl N2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MDE5YzZiMzU5ZWI2MTkxMjMwN2Q5MWNlNTBiNDBl NGJkYzg3YzkzOTRlOTg0NDMxMyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRp b246bm9uZTsgYm9yZGVyOm5vbmUiIHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0eWxlPSJkaXNw bGF5OmJsb2NrOyBsaW5lLWhlaWdodDowOyIgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRv dXNhc3N1ci5jb20vTmV0QWZmaWxpYXRpb24vdG91c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21h aWw0N184XzUuanBnIiB3aWR0aD0iMTA5IiBoZWlnaHQ9IjIxIj48L2E+PC90ZD4NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhICBo cmVmPSJodHRwOi8vZGVhbHMtbWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3 NjFjOWYzYzRmNGJkNzFjNzVmNjAyYzYwMTdlYTA3MmExZTc4NGZmOWQyMjljNWQ5NzA0YjgwZDc1 NzBmZjU3Yzg5ZDEiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7 IGJvcmRlcjpub25lIiByZV90YXJnZXQ9Il9ibGFuayI+PGltZyBzdHlsZT0iZGlzcGxheTpibG9j azsgbGluZS1oZWlnaHQ6MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIu Y29tL05ldEFmZmlsaWF0aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF82 LmpwZyIgd2lkdGg9Ijk3IiBoZWlnaHQ9IjIxIj48L2E+PC90ZD4NCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhICBocmVmPSJodHRw Oi8vZGVhbHMtbWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3NjFjOWYzYzRm NGJkNzFjNzVmNjA3NjY0MGM3MjQyZjU0NjZiMTM4MzlhNDk4NWZmOGU3YTQ1Zjk0NWYxODE5ZTRi NDkiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGJvcmRlcjpu b25lIiByZV90YXJnZXQ9Il9ibGFuayI+PGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgbGluZS1o ZWlnaHQ6MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIuY29tL05ldEFm ZmlsaWF0aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF83LmpwZyIgd2lk dGg9IjY4IiBoZWlnaHQ9IjIxIj48L2E+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhICBocmVmPSJodHRwOi8vZGVhbHMt bWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3NjFjOWYzYzRmNGJkNzFjNzVm NjAyZDZiYzBhYTE3YzdlYWQzYjAxM2MzZjcxM2Q0ZDU5NmQ1ODk0MjVmZGFjM2U0Y2EiIHRhcmdl dD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGJvcmRlcjpub25lIiByZV90 YXJnZXQ9Il9ibGFuayI+PGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgbGluZS1oZWlnaHQ6MDsi IGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIuY29tL05ldEFmZmlsaWF0aW9u L3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF84LmpwZyIgd2lkdGg9IjEwOCIg aGVpZ2h0PSIyMSI+PC9hPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDwvdGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDwvdGFibGU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+DQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLSBFTkQgVE9QIE5BViAtLS0+DQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgPCEtLS0gQ29udGVudCAtLS0+DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFj aW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8dGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRy Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBz dHlsZT0iZGlzcGxheTpibG9jazsgbGluZS1oZWlnaHQ6MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRw Oi8vbWFpbC10b3VzYXNzdXIuY29tL05ldEFmZmlsaWF0aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9m aWNoaWVycy9tYWlsNDdfOF85LmpwZyIgd2lkdGg9IjcwMCIgaGVpZ2h0PSI0OCIgYWx0PSJKdXNx dSfDoCA1MCUgZGUgcsOpZHVjdGlvbiBzdXIgdW5lIHPDqWxlY3Rpb24gZCdhcnRpY2xlcyI+PC90 ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7 IGxpbmUtaGVpZ2h0OjA7IiBib3JkZXI9IjAiIHNyYz0iaHR0cDovL21haWwtdG91c2Fzc3VyLmNv bS9OZXRBZmZpbGlhdGlvbi90b3Vzc2Fzc3VyX2xhY29zdGVfZmljaGllcnMvbWFpbDQ3XzhfMTAu anBnIiB3aWR0aD0iNzAwIiBoZWlnaHQ9IjI1NiIgYWx0PSJKdXNxdSfDoCA1MCUgZGUgcsOpZHVj dGlvbiBzdXIgdW5lIHPDqWxlY3Rpb24gZCdhcnRpY2xlcyI+PC90ZD4NCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPHRkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5Pg0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRk PjxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGxpbmUtaGVpZ2h0OjA7IiBib3JkZXI9IjAiIHNy Yz0iaHR0cDovL21haWwtdG91c2Fzc3VyLmNvbS9OZXRBZmZpbGlhdGlvbi90b3Vzc2Fzc3VyX2xh Y29zdGVfZmljaGllcnMvbWFpbDQ3XzhfMTEuanBnIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjE3MiI+ PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgPHRkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9 IjAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPHRib2R5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhICBocmVmPSJo dHRwOi8vZGVhbHMtbWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3NjFjOWYz YzRmNGJkNzFjNzVmNjAwZjAxYzJlNzJlNjZjM2ViNGRiYzZhMzg4ZGZmOGNhZDhkZTMyNDk5NmE4 OTRjYTQiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGJvcmRl cjpub25lIiByZV90YXJnZXQ9Il9ibGFuayI+PGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgbGlu ZS1oZWlnaHQ6MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIuY29tL05l dEFmZmlsaWF0aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF8xMi5qcGci IHdpZHRoPSIxODIiIGhlaWdodD0iMzEiIGFsdD0iVsOKVEVNRU5UUyBIT01NRSI+PC9hPjwvdGQ+ DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSAgaHJlZj0iaHR0 cDovL2RlYWxzLW1lZGlhLmNvbS90ci9pbmRleC5hc3B4P2lkPWU4MmU3ZTliZjEzNzYxYzlmM2M0 ZjRiZDcxYzc1ZjYwZTc0MWYwMGY1NDVjMzdmZjI1NTFiZjM1YTYzOWJkYjg2MDFmNmEzM2IyZmRl NmM0IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyBib3JkZXI6 bm9uZSIgcmVfdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGxpbmUt aGVpZ2h0OjA7IiBib3JkZXI9IjAiIHNyYz0iaHR0cDovL21haWwtdG91c2Fzc3VyLmNvbS9OZXRB ZmZpbGlhdGlvbi90b3Vzc2Fzc3VyX2xhY29zdGVfZmljaGllcnMvbWFpbDQ3XzhfMTMuanBnIiB3 aWR0aD0iMTgyIiBoZWlnaHQ9IjI2IiBhbHQ9IlbDilRFTUVOVFMgRkVNTUUiPjwvYT48L3RkPg0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6 Ly9kZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0 YmQ3MWM3NWY2MDVhYTg2YTAxNzdkZWRhZDA5ZjhhMzM2MDU1MWQ0MWQxYWFmZjc1MzkyOTg2ZTQx NyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5v bmUiIHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhl aWdodDowOyIgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZm aWxpYXRpb24vdG91c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzE0LmpwZyIgd2lk dGg9IjE4MiIgaGVpZ2h0PSIyOCIgYWx0PSJWw4pURU1FTlRTIEVORkFOVCI+PC9hPjwvdGQ+DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSAgaHJlZj0iaHR0cDov L2RlYWxzLW1lZGlhLmNvbS90ci9pbmRleC5hc3B4P2lkPWU4MmU3ZTliZjEzNzYxYzlmM2M0ZjRi ZDcxYzc1ZjYwMDgxOTE3OTk1NDcwZDJmZGM4YTY5MDNlY2U4NGM0YjExMjllYTg0MzViM2JjZWI0 IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyBib3JkZXI6bm9u ZSIgcmVfdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGxpbmUtaGVp Z2h0OjA7IiBib3JkZXI9IjAiIHNyYz0iaHR0cDovL21haWwtdG91c2Fzc3VyLmNvbS9OZXRBZmZp bGlhdGlvbi90b3Vzc2Fzc3VyX2xhY29zdGVfZmljaGllcnMvbWFpbDQ3XzhfMTUuanBnIiB3aWR0 aD0iMTgyIiBoZWlnaHQ9IjI5IiBhbHQ9IkNIQVVTU1VSRVMgSE9NTUUiPjwvYT48L3RkPg0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgIGhyZWY9Imh0dHA6Ly9k ZWFscy1tZWRpYS5jb20vdHIvaW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3 MWM3NWY2MGU5ZjBlOWU5YmRmODkyM2Y4YWRjMGE0Nzk5ZWFhZWExMGQzNDhkZTY5NmFjZjhiNyIg dGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsgYm9yZGVyOm5vbmUi IHJlX3RhcmdldD0iX2JsYW5rIj48aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBsaW5lLWhlaWdo dDowOyIgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxp YXRpb24vdG91c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzE2LmpwZyIgd2lkdGg9 IjE4MiIgaGVpZ2h0PSIyOCIgYWx0PSJDSEFVU1NVUkVTIEZFTU1FIj48L2E+PC90ZD4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhICBocmVmPSJodHRwOi8vZGVh bHMtbWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3NjFjOWYzYzRmNGJkNzFj NzVmNjA5YWRiMWYxOTNkY2QyNDY5MGIzNDM1NDU4NGUwNTY1NzllN2RmNzJmMTliNzBhMmEiIHRh cmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGJvcmRlcjpub25lIiBy ZV90YXJnZXQ9Il9ibGFuayI+PGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgbGluZS1oZWlnaHQ6 MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIuY29tL05ldEFmZmlsaWF0 aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF8xNy5qcGciIHdpZHRoPSIx ODIiIGhlaWdodD0iMzAiIGFsdD0iQUNDRVNTT0lSRVMiPjwvYT48L3RkPg0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8L3Rib2R5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBzdHlsZT0iZGlzcGxheTpibG9j azsgbGluZS1oZWlnaHQ6MDsiIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vbWFpbC10b3VzYXNzdXIu Y29tL05ldEFmZmlsaWF0aW9uL3RvdXNzYXNzdXJfbGFjb3N0ZV9maWNoaWVycy9tYWlsNDdfOF8x OC5qcGciIHdpZHRoPSIyNjAiIGhlaWdodD0iMTcyIj48L3RkPg0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5Pg0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 dGQ+PGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgbGluZS1oZWlnaHQ6MDsgY29sb3I6IzMzMyIg Ym9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9tYWlsLXRvdXNhc3N1ci5jb20vTmV0QWZmaWxpYXRpb24v dG91c3Nhc3N1cl9sYWNvc3RlX2ZpY2hpZXJzL21haWw0N184XzE5LmpwZyIgd2lkdGg9IjcwMCIg aGVpZ2h0PSIxODYiIGFsdD0iSnVzcXUnw6AgNTAlIGRlIHLDqWR1Y3Rpb24gc3VyIHVuZSBzw6ls ZWN0aW9uIGQnYXJ0aWNsZXMiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJv ZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLSBFTkQgQ09OVEVOVCAtLS0t Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgICAgICAgICAgICAg PC90YWJsZT4NCiAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICA8L3Ry Pg0KICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgPC90YWJsZT4NCiAgICAgICAgPHN0eWxl Pg0KICAgICAgICAgICAgQG1lZGlhIHByaW50eyNfdCB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCgn aHR0cHM6Ly8zZGNtMXdvdi5lbWx0cmsuY29tLzNkY20xd292P3AmZD0nKTt9fSBkaXYuT3V0bG9v a01lc3NhZ2VIZWFkZXIge2JhY2tncm91bmQtaW1hZ2U6dXJsKCdodHRwczovLzNkY20xd292LmVt bHRyay5jb20vM2RjbTF3b3Y/ZiZkPScpfSB0YWJsZS5tb3otZW1haWwtaGVhZGVycy10YWJsZSB7 YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2h0dHBzOi8vM2RjbTF3b3YuZW1sdHJrLmNvbS8zZGNtMXdv dj9mJmQ9Jyl9IGJsb2NrcXVvdGUgI190IHtiYWNrZ3JvdW5kLWltYWdlOnVybCgnaHR0cHM6Ly8z ZGNtMXdvdi5lbWx0cmsuY29tLzNkY20xd292P2YmZD0nKX0gI01haWxDb250YWluZXJCb2R5ICNf dCB7YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2h0dHBzOi8vM2RjbTF3b3YuZW1sdHJrLmNvbS8zZGNt MXdvdj9mJmQ9Jyl9DQogICAgICAgIDwvc3R5bGU+DQogICAgICAgIDxkaXYgaWQ9Il90Ij48L2Rp dj4NCiAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vM2RjbTF3b3YuZW1sdHJrLmNvbS8zZGNtMXdv dj9kPSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYm9yZGVyPSIwIj4NCiAgICAgICAgPGltZyBzcmM9 Imh0dHA6Ly9hY3Rpb24ubWV0YWZmaWxpYXRpb24uY29tL3N1aXZpLnBocD90YWZmPVM0NDQ2NzUy N0E1RjIyRjgiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCI+DQogICAgPGRpdiBhbGln bj0iY2VudGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBzaXplPSIyIj48YSBocmVmPSJtYWlsdG86 cmFkb3VhbnJhZmlrQHlhaG9vLmZyIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGZvbnQt d2VpZ2h0OmJvbGQ7IGNvbG9yOiMwMDAiPlNpZ25hbGV6IGNvbW1lIEFCVVM8L2E+PC9mb250Pjwv ZGl2Pg0KPGRpdiBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBzaXplPSIyIj5Q b3VyIHZvdXMgZMOpc2Fib25uZXIgZGVzIG5ld3NsZXR0ZXIgYm9ucyBwbGFucyA8YSAgaHJlZj0i aHR0cDovL2RlYWxzLW1lZGlhLmNvbS90ci9pbmRleC5hc3B4P2lkPWU4MmU3ZTliZjEzNzYxYzlm M2M0ZjRiZDcxYzc1ZjYwZTExMWE3YmUzNTNjNTE2OGVlYTgyN2Y0Zjk4N2JkN2E3MzYyNGMxM2Mx Y2VjYTA1Ij5TdWl2ZXogY2UgbGllbjwvYT48L2ZvbnQ+PC9kaXY+DQoNCjxkaXYgYWxpZ249ImNl bnRlciI+PGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iMiI+UG91ciBuZSBwbHVzIHJlY2V2b2ly IGQnb2ZmcmVzIGRlIG5vdHJlIHBhcnQgPGEgIGhyZWY9Imh0dHA6Ly9kZWFscy1tZWRpYS5jb20v dHIvaW5kZXguYXNweD9pZD1lODJlN2U5YmYxMzc2MWM5ZjNjNGY0YmQ3MWM3NWY2MDFkMTZjMzZi YWViZDY5YjNmMGI3NGY0NDcyYmI4ZGU1YzE0ZDVmMDU5NWNmNjM5MyI+IFN1aXZleiBjZSBsaWVu IDwvYT48L2ZvbnQ+PC9kaXY+PGltZyBoZWlnaHQ9JzEnIHdpZHRoPScxJyBhbHQ9Jycgc3JjPSdo dHRwOi8vZGVhbHMtbWVkaWEuY29tL3RyL2luZGV4LmFzcHg/aWQ9ZTgyZTdlOWJmMTM3NjFjOWYz YzRmNGJkNzFjNzVmNjBhMzlkYmQ0OWQzNmI2NWUxOTUxMTQ1ODQ4MjI1NDE1ZTNlMjM5YzgyNTU5 MzNmMjYnPjwvYm9keT4NCjwvaHRtbD4= From dylan@totbb.net Tue Jan 29 06:52:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3DEE97F51 for ; Tue, 29 Jan 2013 06:52:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16F9B30406A for ; Tue, 29 Jan 2013 04:52:03 -0800 (PST) X-ASG-Debug-ID: 1359463918-04cbb00c651b60e0001-NocioJ Received: from vip.neoweb.ru (vip.neoweb.ru [81.176.232.100]) by cuda.sgi.com with ESMTP id MEcwTREgHG3xpG8D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 04:52:00 -0800 (PST) X-Barracuda-Envelope-From: dylan@totbb.net X-Barracuda-Apparent-Source-IP: 81.176.232.100 Received: from loft2120.serverloft.de ([85.25.176.169]:55915) by vip.neoweb.ru with esmtpa (Exim 4.80) (envelope-from ) id 1U0Af4-0006SS-I4; Tue, 29 Jan 2013 16:51:39 +0400 Message-ID: Reply-To: =?windows-1251?B?yu7t9OXw5e326P8gIszo4/Dg9uju7e376SDz?= =?windows-1251?B?9+XyIOjt7vHy8ODt7fv1IOPw4Obk4O0i?= From: =?windows-1251?B?yu7t9OXw5e326P8gIszo4/Dg9uju7e376SDz?= =?windows-1251?B?9+XyIOjt7vHy8ODt7fv1IOPw4Obk4O0i?= To: , , , Subject: =?windows-1251?B?z/Dg4ujr4CDy8PPk7vPx8vDu6fHy4uAg5Ov/?= =?windows-1251?B?IOjt7vHy8ODt7fv1IPDg4e7y7ejq7uI=?= Date: Tue, 29 Jan 2013 15:51:46 +0300 X-ASG-Orig-Subj: =?windows-1251?B?z/Dg4ujr4CDy8PPk7vPx8vDu6fHy4uAg5Ov/?= =?windows-1251?B?IOjt7vHy8ODt7fv1IPDg4e7y7ejq7uI=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_17AF_01CDFE38.8AF8B070" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vip.neoweb.ru X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - totbb.net X-Get-Message-Sender-Via: vip.neoweb.ru: authenticated_id: info@glcards.ru X-Barracuda-Connect: vip.neoweb.ru[81.176.232.100] X-Barracuda-Start-Time: 1359463920 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_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121231 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_17AF_01CDFE38.8AF8B070 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=D3=C4=C0: =C2 =EE=F2= =E4=E5=EB =EA=E0=E4=F0=EE=E2 =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =E2=F1=E5=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2= =EA=E0=E4=F0=EE=E2=FB=F5 =F1=EB=F3=E6=E1 =ED=E0 =EF=EE=EF=F3=EB=FF=F0=ED= =F3=FE =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=FE =E2 =D1=E0=ED=EA=F2-=CF=E5=F2=E5= =F0=E1=F3=F0=E3=E5: =CC=C8=C3=D0=C0=D6=C8=CE=CD=CD=DB=C9 =D3=D7=C5=D2.=D4=C7-109 =CA=E0=EA =F3=F1=F2=F0=EE=E8=F2=FC =ED=E0 =F0=E0=E1=EE=F2=F3 =E8=ED=EE=F1= =F2=F0=E0=ED=ED=EE=E3=EE =E3=F0=E0=E6=E4=E0=ED=E8=ED=E0. =C8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2= =E2=E5 =E2 2013 =E3=EE=E4=F3. ________________________________________ 11 =F4=E5=E2=F0=E0=EB=FF 2013 =E3=EE=E4=E0, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0= =E1=F3=F0=E3 =D6=E5=ED=F2=F0 =EE=E1=F3=F7=E5=ED=E8=FF: =CF=E5=F2=E5=F0=E1=F3=F0= =E3 64--2 .. =CE=D7 35 =20 =D1=EF=E8=F1=EE=EA =ED=E5=EA=EE=F2=EE=F0=FB=F5 =E2=EE=EF=F0=EE=F1=EE=E2: (=CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =E2=FB=F1=FB=EB=E0=E5=F2=F1= =FF =EF=EE =E7=E0=EF=F0=EE=F1=F3) 1. =CF=F0=E0=E2=EE=E2=EE=E5 =EF=EE=EB=EE=E6=E5=ED=E8=E5. 2. =D0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0= =E0=E1=EE=F2=ED=E8=EA=EE=E2. 3. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E8=ED=EE=F1=F2=F0=E0= =ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2. 4. =CF=EE=F0=FF=E4=EE=EA =F2=F0=F3=E4=EE=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0 =E8= =ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =E3=F0=E0=E6=E4=E0=ED: - =CE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FF = =EF=EE =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=EC=F3 =F3=F7=E5=F2=F3 =E8=ED=EE=F1= =F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2. - =CF=F0=E0=EA=F2=E8=EA=E0 =EF=EE=EB=F3=F7=E5=ED=E8=FF =F0=E0=E7=F0=E5=F8= =E5=ED=E8=E9 =ED=E0 =F0=E0=E1=EE=F2=F3. - =D3=E2=E5=E4=EE=EC=EB=E5=ED=E8=E5 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=E5=EC= =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5 =EE=F0=E3=E0=ED=EE=E2 =EE = =EF=F0=E8=E5=EC=E5 =ED=E0 =F0=E0=E1=EE=F2=F3 =E8=ED=EE=F1=F2=F0=E0=ED=F6=E5= =E2, =EE =F0=E0=F1=F2=EE=F0=E6=E5=ED=E8=E8 =F2=F0=F3=E4=EE=E2=EE=E3=EE =E4= =EE=E3=EE=E2=EE=F0=E0, =EE =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E8 =EE= =F2=EF=F3=F1=EA=EE=E2 =E1=E5=E7 =F1=EE=F5=F0=E0=ED=E5=ED=E8=FF =E7=E0=F0=EF= =EB=E0=F2=FB. - =C4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=EB=FF= =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF =E8 =EF=EE=E4=E0=F7=E8 =F3=E2=E5=E4=EE=EC= =EB=E5=ED=E8=FF. - =D1=ED=FF=F2=E8=E5 =E2=F0=E5=EC=E5=ED=ED=EE =EF=F0=E5=E1=FB=E2=E0=FE=F9= =E5=E3=EE =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE =F1=EE=F2=F0=F3=E4=ED=E8=EA= =E0 =F1 =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=E3=EE =F3=F7=E5=F2=E0. - =CF=E5=F0=E5=F5=EE=E4 =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE =F0=E0=E1=EE= =F2=ED=E8=EA=E0 =EA =E4=F0=F3=E3=EE=EC=F3 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB= =FE. 5. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E2=FB=F1=EE=EA=EE=EA= =E2=E0=EB=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=F5 =F1=EF=E5=F6=E8=E0=EB=E8= =F1=F2=EE=E2. =CA=E2=EE=F2=FB =ED=E0 =EF=F0=E0=E2=EE =F0=E0=E1=EE=F2=FB. 6. =CF=E5=ED=F1=E8=EE=ED=ED=EE=E5 =F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5. =CD=E0= =EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5. =CA=E0=E4=F0=EE=E2=FB=E9 =F3=F7=E5= =F2. =D2=F0=F3=E4=EE=E2=EE=E9 =E4=EE=E3=EE=E2=EE=F0. 7. =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E2 =D0=D4 =E3=F0=E0=E6=E4=E0= =ED =C1=E5=EB=EE=F0=F3=F1=F1=E8=E8 =E8 =CA=E0=E7=E0=F5=F1=F2=E0=ED=E0. 8. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =EF=F0=E8 =ED=E0=EF=F0= =E0=E2=EB=E5=ED=E8=E8 =E8=ED=EE=F1=F2=F0=E0=ED=F6=E0 =E2 =EA=EE=EC=E0=ED=E4= =E8=F0=EE=E2=EA=F3 =E8=EB=E8 =F1=EB=F3=E6=E5=E1=ED=F3=FE =EF=EE=E5=E7=E4=EA= =F3. =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =E2 =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8 =EE=E1=F0=E0=F9=E0= =E9=F2=E5=F1=FC: 8 ( 8I2 ) 6=D7=3D2 - 0=F7 -- =E75 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =CE=EA=F3=ED=E5=E2=E0 =D2=E0=F2=FC=FF=ED=E0 =C0=EB=E5=EA=F1=E5=E5=E2=ED=E0 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E3= =EE =F6=E5=ED=F2=F0=E0 =D2=E5=EB =E4=EB=FF =E7=E0=EA=E0=E7=EE=E2 8 { 812 } 6=D7.2 = __ =CE4 -. =E75 =20 *=C7=E0=EF=F0=E0=F8=E8=E2=E0=E9=F2=E5 =F1=EF=E8=F1=EE=EA =E2=F1=E5=F5 =E4= =EE=F1=F2=F3=EF=ED=FB=F5 =EE=E1=F3=F7=E0=FE=F9=E8=F5 =EA=F3=F0=F1=EE=E2! ------=_NextPart_000_17AF_01CDFE38.8AF8B070 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
               &n= bsp;           &nb= sp;           &nbs= p;            = ; =20 =CA=D3=C4=C0: =C2 =EE=F2=E4=E5=EB =EA=E0=E4=F0=EE=E2
     

    =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =E2=F1=E5=F5 =F0=E0=E1=EE=F2=ED=E8= =EA=EE=E2 =EA=E0=E4=F0=EE=E2=FB=F5 =F1=EB=F3=E6=E1 =ED=E0 =EF=EE=EF=F3=EB= =FF=F0=ED=F3=FE =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=FE =E2=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5:
     

    =CC=C8=C3=D0=C0=D6=C8=CE=CD=CD=DB=C9 =D3=D7=C5=D2.=D4=C7-109
    = =CA=E0=EA =F3=F1=F2=F0=EE=E8=F2=FC =ED=E0 =F0=E0=E1=EE=F2=F3 =E8=ED=EE=F1= =F2=F0=E0=ED=ED=EE=E3=EE=20 =E3=F0=E0=E6=E4=E0=ED=E8=ED=E0.
    =C8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E7=E0= =EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E5 =E2 2013=20 =E3=EE=E4=F3.
    ________________________________________
    11 =F4=E5=E2= =F0=E0=EB=FF 2013 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
     

    =D6=E5=ED=F2=F0 =EE=E1=F3=F7=E5=ED=E8=FF: =CF=E5=F2=E5=F0= =E1=F3=F0=E3 64--2 .. =CE=D7 35

    =D1=EF=E8=F1=EE=EA =ED=E5=EA=EE=F2=EE=F0=FB=F5 =E2=EE=EF=F0=EE=F1= =EE=E2:
    (=CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =E2=FB=F1=FB=EB= =E0=E5=F2=F1=FF =EF=EE=20 =E7=E0=EF=F0=EE=F1=F3)
     
    1. =CF=F0=E0=E2=EE=E2=EE=E5 =EF=EE=EB=EE=E6=E5=ED=E8=E5.
     
    2. =D0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5= =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2.
     
    3. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E8=ED=EE=F1=F2= =F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2.
     
    4. =CF=EE=F0=FF=E4=EE=EA =F2=F0=F3=E4=EE=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0= =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =E3=F0=E0=E6=E4=E0=ED:
    - =CE=E1=FF=E7= =E0=ED=ED=EE=F1=F2=E8=20 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FF =EF=EE =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED= =EE=EC=F3 =F3=F7=E5=F2=F3 =E8=ED=EE=F1=F2=F0=E0=ED=ED=FB=F5 =F0=E0=E1=EE=F2= =ED=E8=EA=EE=E2.
    - =CF=F0=E0=EA=F2=E8=EA=E0=20 =EF=EE=EB=F3=F7=E5=ED=E8=FF =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =F0=E0=E1= =EE=F2=F3.
    - =D3=E2=E5=E4=EE=EC=EB=E5=ED=E8=E5 =F0=E0=E1=EE=F2=EE=E4=E0= =F2=E5=EB=E5=EC =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5=20 =EE=F0=E3=E0=ED=EE=E2 =EE =EF=F0=E8=E5=EC=E5 =ED=E0 =F0=E0=E1=EE=F2=F3 =E8= =ED=EE=F1=F2=F0=E0=ED=F6=E5=E2, =EE =F0=E0=F1=F2=EE=F0=E6=E5=ED=E8=E8 =F2= =F0=F3=E4=EE=E2=EE=E3=EE =E4=EE=E3=EE=E2=EE=F0=E0, =EE=20 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E8 =EE=F2=EF=F3=F1=EA=EE=E2 =E1=E5= =E7 =F1=EE=F5=F0=E0=ED=E5=ED=E8=FF =E7=E0=F0=EF=EB=E0=F2=FB.
    - =C4=EE=EA= =F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=EB=FF=20 =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF =E8 =EF=EE=E4=E0=F7=E8 =F3=E2=E5=E4=EE=EC=EB= =E5=ED=E8=FF.
    - =D1=ED=FF=F2=E8=E5 =E2=F0=E5=EC=E5=ED=ED=EE =EF=F0=E5=E1= =FB=E2=E0=FE=F9=E5=E3=EE =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE=E3=EE=20 =F1=EE=F2=F0=F3=E4=ED=E8=EA=E0 =F1 =EC=E8=E3=F0=E0=F6=E8=EE=ED=ED=EE=E3=EE= =F3=F7=E5=F2=E0.
    - =CF=E5=F0=E5=F5=EE=E4 =E8=ED=EE=F1=F2=F0=E0=ED=ED=EE= =E3=EE =F0=E0=E1=EE=F2=ED=E8=EA=E0 =EA =E4=F0=F3=E3=EE=EC=F3=20 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FE.
     
    5. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =E2=FB=F1=EE=EA= =EE=EA=E2=E0=EB=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=F5 =F1=EF=E5=F6=E8=E0= =EB=E8=F1=F2=EE=E2. =CA=E2=EE=F2=FB =ED=E0 =EF=F0=E0=E2=EE=20 =F0=E0=E1=EE=F2=FB.
     
    6. =CF=E5=ED=F1=E8=EE=ED=ED=EE=E5 =F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5.= =CD=E0=EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5. =CA=E0=E4=F0=EE=E2=FB=E9 = =F3=F7=E5=F2. =D2=F0=F3=E4=EE=E2=EE=E9=20 =E4=EE=E3=EE=E2=EE=F0.
     
    7. =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E2 =D0=D4 =E3=F0=E0=E6=E4= =E0=ED =C1=E5=EB=EE=F0=F3=F1=F1=E8=E8 =E8 =CA=E0=E7=E0=F5=F1=F2=E0=ED=E0.=
     
    8. =CC=E8=E3=F0=E0=F6=E8=EE=ED=ED=FB=E9 =F3=F7=E5=F2 =EF=F0=E8 =ED=E0= =EF=F0=E0=E2=EB=E5=ED=E8=E8 =E8=ED=EE=F1=F2=F0=E0=ED=F6=E0 =E2 =EA=EE=EC=E0= =ED=E4=E8=F0=EE=E2=EA=F3 =E8=EB=E8=20 =F1=EB=F3=E6=E5=E1=ED=F3=FE =EF=EE=E5=E7=E4=EA=F3.
     

    =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5= =E3=E8=F1=F2=F0=E0=F6=E8=E8 =E2 =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8 =EE=E1=F0= =E0=F9=E0=E9=F2=E5=F1=FC:
    8 ( 8I2 ) 6=D7=3D2 - 0=F7 -- =E75
    =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
    =CE=EA=F3=ED=E5=E2=E0 =D2=E0=F2=FC= =FF=ED=E0 =C0=EB=E5=EA=F1=E5=E5=E2=ED=E0
    =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2= =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E3=EE=20 =F6=E5=ED=F2=F0=E0
    =D2=E5=EB =E4=EB=FF =E7=E0=EA=E0=E7=EE=E2 8 { 812 } 6=D7.2= __ =CE4 -. =E75

    *=C7=E0=EF=F0=E0=F8=E8=E2=E0=E9=F2=E5 =F1=EF=E8=F1=EE=EA =E2=F1=E5= =F5 =E4=EE=F1=F2=F3=EF=ED=FB=F5 =EE=E1=F3=F7=E0=FE=F9=E8=F5=20 =EA=F3=F0=F1=EE=E2!
    ------=_NextPart_000_17AF_01CDFE38.8AF8B070-- From bpm@sgi.com Tue Jan 29 09:18:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 B14637F53 for ; Tue, 29 Jan 2013 09:18:36 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6755030407A; Tue, 29 Jan 2013 07:18:33 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3E4FA4266DC; Tue, 29 Jan 2013 09:18:33 -0600 (CST) Date: Tue, 29 Jan 2013 09:18:33 -0600 From: Ben Myers To: Tom Cc: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot Message-ID: <20130129151833.GF27055@sgi.com> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Tom, On Mon, Jan 28, 2013 at 06:28:18PM -0500, Tom wrote: > I have been using XFS for many years, starting on IRIX and then on RedHat > 7.2, and now on CentOS/RHEL and Ubuntu. Last time I posted to this > mailing list was 12 years ago. :-) I've been a happy customer! I'm glad to hear it! ;) > Much more detail is available here (CentOS bug id 0006217) including steps > to reproduce the problem. Also testing with and without md raid. > http://bugs.centos.org/view.php?id=6217 > > The one thing I haven't provided is a traceback. I can provide that if it > would be helpful. I took a brief look at your report. I think a traceback would be helpful. echo t > /proc/sysrq-trigger should do the trick. You're in the middle of unmount so you might need to go serial console to capture the output. Your report metions freeze/thaw. This is an area where we've had deadlocks in the past, so I wouldn't be surprised if that is what you're hitting. We'll have to see. Thanks, Ben From rjohnston@sgi.com Tue Jan 29 09:39:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 661377F55 for ; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 502D730407A for ; Tue, 29 Jan 2013 07:39:15 -0800 (PST) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 38325AB8ED9F; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Message-Id: <20130129153915.105853779@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Tue, 29 Jan 2013 09:39:16 -0600 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfstests: add test for agskip mount option References: <20130129153914.801475275@sgi.com> Content-Disposition: inline; filename=xfstests-add-agskip-test.patch Signed-off-by: Rich Johnston --- 295 | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 295.out | 2 group | 1 3 files changed, 150 insertions(+) Index: b/295 =================================================================== --- /dev/null +++ b/295 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 295 +# +# Test agskip mount options +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 SGI. 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 +#----------------------------------------------------------------------- +# +# +# This test is a modified version of agskip test written by Alain Renaud. +# +# Phase 1: Create an xfs filesystem with AGCOUNT=32 and verify that the +# AGCOUNT is 32. +# Phase 2: Mount the filesystem with AGSKIP=3. +# Phase 3: Verify that the AGSKIP is working correctly: +# Create a file that spans more than one AG (size=1.5 * AGSIZE) +# Create another file that is less than AGSIZE. +# Use xfs_bmap to verify that the second extent is at location +# previous_AG+1. +# Continue creating/verifying that the AG's are created 3 AG's +# apart +# +# creator +owner=rjohnston@sgi.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +rm -f $seq.full +_require_scratch + +BLK_SIZE=4096 +AGCOUNT=32 +AGSKIP=3 + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux + +echo "Phase 1: mkfs the filesystem" >> $seq.full 2>&1 +echo "DEBUG: agcount=${AGCOUNT}" >> $seq.full 2>&1 +_scratch_mkfs_xfs " -dagcount=${AGCOUNT}" \ + >> $seq.full 2>&1 || _fail "mkfs_xfs failed" + +# Get fs agcount +_agcount=$( xfs_db -r -c 'sb 0' -c 'print' ${SCRATCH_DEV} | \ + awk '$1 == "agcount" { print $3 }' ) >> $seq.full 2>&1 +_agblocks=$( xfs_db -r -c 'sb 0' -c 'print' ${SCRATCH_DEV} | \ + awk '$1 == "agblocks" { print $3 }' ) >> $seq.full 2>&1 + +# Print size in meg +_agsize=$(( _agblocks * ${BLK_SIZE} / 1024 / 1024 )) >> $seq.full 2>&1 + +if [[ "${_agcount}" -ne ${AGCOUNT} ]] +then + echo "ERROR: agcount(${_agcount}) value is incorrect " >> $seq.full 2>&1 + exit +fi + +echo "Phase 2: mount filesystem with agskip option" >> $seq.full 2>&1 +echo "DEBUG: agskip=${AGSKIP} " >> $seq.full 2>&1 + +# mount +_scratch_mount "-o agskip=${AGSKIP}" >> $seq.full 2>&1 \ + || _fail "xfs_mount failed" + +echo "Phase 3: test agskip option" +mkdir ${SCRATCH_MNT}/agskip-${AGSKIP}.dir >> $seq.full 2>&1 \ + || _fail "mkdir failed" + +# make the first file with 2 extents +FSIZE=$(( ${_agsize} + ( ${_agsize} / 2 ))) +FILE=${SCRATCH_MNT}/agskip-${AGSKIP}.dir/file-0 +echo "DEBUG: making first file with size = ${FSIZE}m" >> $seq.full 2>&1 +xfs_mkfile ${FSIZE}m ${FILE} >> $seq.full 2>&1 \ + || _fail "failed to make file ${FILE}" + +agvalue=$( xfs_bmap -v ${FILE} | awk '$1 == "0:" { print $4 }') + +# make sure that the second extent is at location AG+1 +_agtmp=$( xfs_bmap -v ${FILE} | awk '$1 == "1:" { print $4 }') + +if [[ $(( ( agvalue + 1 ) % AGCOUNT )) -ne ${_agtmp} ]] +then + echo -n "ERROR: The AG location of extent-1=${_agtmp}" >> $seq.full 2>&1 + echo " as where extent-0=${agvalue}" >> $seq.full 2>&1 + exit +fi + +_cmpt=1 +while [[ ${_cmpt} -lt 25 ]] +do + FILE=${SCRATCH_MNT}/agskip-${AGSKIP}.dir/file-${_cmpt} + if ! xfs_mkfile 10m ${FILE} + then + echo "ERROR: failed to make file ${FILE}" >> $seq.full 2>&1 + exit + fi + _agtmp=$( xfs_bmap -v ${FILE} | awk '$1 == "0:" { print $4 }') + if [[ $(( ( agvalue + AGSKIP ) % AGCOUNT )) -ne ${_agtmp} ]] + then + echo "ERROR: The AG location of file ${FILE} not at AG+${AGSKIP}" \ + >> $seq.full 2>&1 + echo " old AG == ${agvalue} new AG == ${_agtmp}" >> $seq.full 2>&1 + exit + fi + agvalue=${_agtmp} + let _cmpt++ +done + +echo "# unmounting scratch" >> $seq.full 2>&1 +${UMOUNT_PROG} ${SCRATCH_MNT} >>$seq.full 2>&1 || _fail "unmount failed" + +# success, all done +status=0 +_cleanup +exit Index: b/295.out =================================================================== --- /dev/null +++ b/295.out @@ -0,0 +1,2 @@ +QA output created by 295 +Phase 3: test agskip option Index: b/group =================================================================== --- a/group +++ b/group @@ -413,3 +413,4 @@ deprecated 292 auto mkfs quick 293 auto quick 294 auto quick +294 auto mount From rjohnston@sgi.com Tue Jan 29 09:39:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 8415C7F5A for ; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DA5E8F8039 for ; Tue, 29 Jan 2013 07:39:15 -0800 (PST) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 54B67AB8ED9E; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Message-Id: <20130129153915.237058478@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Tue, 29 Jan 2013 09:39:17 -0600 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 3/3] --- sys-utils/mount.8 | 12 ++++++++++++ 1 file changed, 12 insertions(+) References: <20130129153914.801475275@sgi.com> Content-Disposition: inline; filename=util-linux-add-xfs-agskip-mount-option.patch Index: b/sys-utils/mount.8 =================================================================== --- a/sys-utils/mount.8 +++ b/sys-utils/mount.8 @@ -2587,6 +2587,18 @@ None. .SH "Mount options for xfs" .TP +.BI agskip= value +Specifies the allocation group, (AG) for a new file, relative to the +start of the last created file. agskip has the opposite effect of the +rotorstep system tunable parameter. Each new file to be placed in the +location lastAG + agskipValue, where lastAG is the allocation group +of the last created file. + +For example, agskip=3 means each new file will be allocated three AGs +away from the starting AG of the most recently created file. + +The agskip mount option disables the rotorstep system tunable parameter. +.TP .BI allocsize= size Sets the buffered I/O end-of-file preallocation size when doing delayed allocation writeout (default size is 64KiB). From rjohnston@sgi.com Tue Jan 29 09:39:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 68C647F58 for ; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42761304032 for ; Tue, 29 Jan 2013 07:39:15 -0800 (PST) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 1792FAB8ED9E; Tue, 29 Jan 2013 09:39:15 -0600 (CST) Message-Id: <20130129153914.976867239@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Tue, 29 Jan 2013 09:39:15 -0600 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: add agskip=value mount option References: <20130129153914.801475275@sgi.com> Content-Disposition: inline; filename=xfs-add-agskip-mount-option.patch The agskip mount option specifies the allocation group, (AG) for a new file, relative to the start of the last created file. agskip has the opposite effect of the rotorstep system tunable parameter. Each new file to be placed in the location lastAG + agskipValue, where lastAG is the allocation group of the last created file. For example, agskip=3 means each new file will be allocated three AGs away from the starting AG of the most recently created file. The agskip mount option disables the rotorstep system tunable parameter. Signed-off-by: Rich Johnston --- fs/xfs/xfs_alloc.c | 35 ++++++++++++++++++++++++++++------- fs/xfs/xfs_filestream.c | 8 +++++++- fs/xfs/xfs_mount.c | 1 + fs/xfs/xfs_mount.h | 4 +++- fs/xfs/xfs_super.c | 13 ++++++++++++- 5 files changed, 51 insertions(+), 10 deletions(-) Index: b/fs/xfs/xfs_alloc.c =================================================================== --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2365,12 +2365,20 @@ xfs_alloc_vextent( * Try near allocation first, then anywhere-in-ag after * the first a.g. fails. */ - if ((args->userdata == XFS_ALLOC_INITIAL_USER_DATA) && - (mp->m_flags & XFS_MOUNT_32BITINODES)) { - args->fsbno = XFS_AGB_TO_FSB(mp, - ((mp->m_agfrotor / rotorstep) % - mp->m_sb.sb_agcount), 0); - bump_rotor = 1; + if (args->userdata == XFS_ALLOC_INITIAL_USER_DATA) { + if (mp->m_flags & XFS_MOUNT_AGSKIP) { + spin_lock(&mp->m_agfrotor_lock); + args->fsbno = XFS_AGB_TO_FSB(mp, + mp->m_agfrotor, 0); + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) + % mp->m_sb.sb_agcount; + spin_unlock(&mp->m_agfrotor_lock); + } else if (mp->m_flags & XFS_MOUNT_32BITINODES) { + args->fsbno = XFS_AGB_TO_FSB(mp, + ((mp->m_agfrotor / rotorstep) % + mp->m_sb.sb_agcount), 0); + bump_rotor = 1; + } } args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); args->type = XFS_ALLOCTYPE_NEAR_BNO; @@ -2385,8 +2393,21 @@ xfs_alloc_vextent( /* * Start with the last place we left off. */ - args->agno = sagno = (mp->m_agfrotor / rotorstep) % + if (mp->m_flags & XFS_MOUNT_AGSKIP) { + /* + * The spinlock makes the combined assignment + * of args->fsbno and mp->m_agfrotor atomic. + * mp->m_agfrotor can not be advanced until + * args->fsbno is assigned. + */ + spin_lock(&mp->m_agfrotor_lock); + sagno = mp->m_agfrotor; + spin_unlock(&mp->m_agfrotor_lock); + } else { + sagno = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; + } + args->agno = sagno; args->type = XFS_ALLOCTYPE_THIS_AG; flags = XFS_ALLOC_FLAG_TRYLOCK; } else if (type == XFS_ALLOCTYPE_FIRST_AG) { Index: b/fs/xfs/xfs_filestream.c =================================================================== --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -622,7 +622,13 @@ xfs_filestream_associate( * Set the starting AG using the rotor for inode32, otherwise * use the directory inode's AG. */ - if (mp->m_flags & XFS_MOUNT_32BITINODES) { + if (mp->m_flags & XFS_MOUNT_AGSKIP) { + spin_lock(&mp->m_agfrotor_lock); + startag = mp->m_agfrotor; + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) + % mp->m_sb.sb_agcount; + spin_unlock(&mp->m_agfrotor_lock); + } else if (mp->m_flags & XFS_MOUNT_32BITINODES) { rotorstep = xfs_rotorstep; startag = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; mp->m_agfrotor = (mp->m_agfrotor + 1) % Index: b/fs/xfs/xfs_mount.c =================================================================== --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -768,6 +768,7 @@ STATIC void xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) { mp->m_agfrotor = mp->m_agirotor = 0; + spin_lock_init(&mp->m_agfrotor_lock); spin_lock_init(&mp->m_agirotor_lock); mp->m_maxagi = mp->m_sb.sb_agcount; mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG; Index: b/fs/xfs/xfs_mount.h =================================================================== --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -119,6 +119,7 @@ typedef struct xfs_mount { char *m_logname; /* external log device name */ int m_bsize; /* fs logical block size */ xfs_agnumber_t m_agfrotor; /* last ag where space found */ + spinlock_t m_agfrotor_lock;/* .. and lock protecting it */ xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ spinlock_t m_agirotor_lock;/* .. and lock protecting it */ xfs_agnumber_t m_maxagi; /* highest inode alloc group */ @@ -203,6 +204,7 @@ typedef struct xfs_mount { struct shrinker m_inode_shrink; /* inode reclaim shrinker */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ + int m_agskip; /* extent allocation stride */ struct workqueue_struct *m_data_workqueue; struct workqueue_struct *m_unwritten_workqueue; @@ -246,7 +248,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams allocator */ #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ - +#define XFS_MOUNT_AGSKIP (1ULL << 26) /* extent allocation stride */ /* * Default minimum read and write sizes. Index: b/fs/xfs/xfs_super.c =================================================================== --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -114,7 +114,7 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed logging disabled */ #define MNTOPT_DISCARD "discard" /* Discard unused blocks */ #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ - +#define MNTOPT_AGSKIP "agskip" /* initial extent allocation stride */ /* * Table driven mount option parser. * @@ -383,6 +383,15 @@ xfs_parseargs( } else if (!strcmp(this_char, "irixsgid")) { xfs_warn(mp, "irixsgid is now a sysctl(2) variable, option is deprecated."); + } else if (!strcmp(this_char, MNTOPT_AGSKIP)) { + if (!value || !*value) { + xfs_warn(mp, + "%s option requires an argument", + this_char); + return EINVAL; + } + mp->m_flags |= XFS_MOUNT_AGSKIP; + mp->m_agskip = simple_strtoul(value, &eov, 10); } else { xfs_warn(mp, "unknown mount option [%s].", this_char); return EINVAL; @@ -567,6 +576,8 @@ xfs_showargs( if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT)) seq_puts(m, "," MNTOPT_NOQUOTA); + if (mp->m_flags & XFS_MOUNT_AGSKIP) + seq_printf(m, "," MNTOPT_AGSKIP "=%d", mp->m_agskip); return 0; } From rjohnston@sgi.com Tue Jan 29 09:39:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 57CA77F62 for ; Tue, 29 Jan 2013 09:39:18 -0600 (CST) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay1.corp.sgi.com (Postfix) with ESMTP id 321DC8F8039 for ; Tue, 29 Jan 2013 07:39:15 -0800 (PST) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id EC973AAEABDF; Tue, 29 Jan 2013 09:39:14 -0600 (CST) Message-Id: <20130129153914.801475275@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Tue, 29 Jan 2013 09:39:14 -0600 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 0/3] Add agskip=value mount option This series will: 1. Add agskip=value mount option to xfs 2. Add agkip mount option test to xfstests 3. Add agskip mount option to the mount.8 manpage (util-linux) --Rich From bpm@sgi.com Tue Jan 29 09:42:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 244B07F5A for ; Tue, 29 Jan 2013 09:42:54 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D773AC001; Tue, 29 Jan 2013 07:42:50 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1B3CC4266DC; Tue, 29 Jan 2013 09:42:50 -0600 (CST) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 3.8-rc6 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20130129154250.1B3CC4266DC@whiskey.americas.sgi.com> Date: Tue, 29 Jan 2013 09:42:50 -0600 (CST) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these fixes for XFS. Here are fixes for returning EFSCORRUPTED on probe of a non-xfs filesystem, the stack switch in xfs_bmapi_allocate, a crash in _xfs_buf_find, speculative preallocation as the filesystem nears ENOSPC, an unmount hang, a race with AIO, and a regression with xfs_fsr. Thanks, Ben The following changes since commit 37f13561de6039b3a916d1510086030d097dea0f: xfs: recalculate leaf entry pointer after compacting a dir2 block (2013-01-16 16:08:55 -0600) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/for-linus-v3.8-rc6 for you to fetch changes up to 65e3aa77f1b0269720660a6879f6f28d158f54c8: xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() (2013-01-28 16:05:10 -0600) ---------------------------------------------------------------- xfs: bugfixes for 3.8-rc6 - fix return value when filesystem probe finds no XFS magic, a regression introduced in 9802182. - fix stack switch in __xfs_bmapi_allocate by moving the check for stack switch up into xfs_bmapi_write. - fix oops in _xfs_buf_find by validating that the requested block is within the filesystem bounds. - limit speculative preallocation near ENOSPC. - fix an unmount hang in xfs_wait_buftarg by freeing the xfs_buf_log_item in xfs_buf_item_unlock. - fix a possible use after free with AIO. - fix xfs_swap_extents after removal of xfs_flushinval_pages, a regression introduced in fb59581404a. ---------------------------------------------------------------- Brian Foster (1): xfs: pull up stack_switch check into xfs_bmapi_write Dave Chinner (3): xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end xfs: limit speculative prealloc near ENOSPC thresholds xfs: fix shutdown hang on invalid inode during create Eric Sandeen (1): xfs: Do not return EFSCORRUPTED when filesystem probe finds no XFS magic Jan Kara (1): xfs: Fix possible use-after-free with AIO Torsten Kaiser (1): xfs: Fix xfs_swap_extents() after removal of xfs_flushinval_pages() fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_bmap.c | 6 +++--- fs/xfs/xfs_buf.c | 20 ++++++++++++++++++++ fs/xfs/xfs_buf_item.c | 12 ++++++++++-- fs/xfs/xfs_dfrag.c | 4 ++-- fs/xfs/xfs_iomap.c | 9 +++++++++ fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_trace.h | 1 + 8 files changed, 47 insertions(+), 9 deletions(-) From dave.kleikamp@oracle.com Tue Jan 29 10:24:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 222F57F4C for ; Tue, 29 Jan 2013 10:24:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 10BF18F804C for ; Tue, 29 Jan 2013 08:24:22 -0800 (PST) X-ASG-Debug-ID: 1359476660-04cb6c39131c6e20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Uijy3TPYyLa2plmg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 08:24:21 -0800 (PST) X-Barracuda-Envelope-From: dave.kleikamp@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.1/Sentrion-MTA-4.3.1) with ESMTP id r0TGOHsU012183 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 29 Jan 2013 16:24:17 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0TGOGAb015577 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 29 Jan 2013 16:24:16 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0TGOGZv015186; Tue, 29 Jan 2013 10:24:16 -0600 Received: from shaggy-t410.oracle.com (/99.156.91.244) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 29 Jan 2013 08:24:16 -0800 Received: by shaggy-t410.oracle.com (Postfix, from userid 1000) id 1A345242C19; Tue, 29 Jan 2013 10:24:14 -0600 (CST) From: Dave Kleikamp To: Alexander Viro Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Zach Brown , "Maxim V. Patlasov" , Dave Kleikamp , Ben Myers , Alex Elder , xfs@oss.sgi.com Subject: [PATCH V6 25/30] xfs: add support for read_iter and write_iter Date: Tue, 29 Jan 2013 10:23:38 -0600 X-ASG-Orig-Subj: [PATCH V6 25/30] xfs: add support for read_iter and write_iter Message-Id: <1359476623-10544-26-git-send-email-dave.kleikamp@oracle.com> X-Mailer: git-send-email 1.8.1.1 In-Reply-To: <1359476623-10544-1-git-send-email-dave.kleikamp@oracle.com> References: <1359476623-10544-1-git-send-email-dave.kleikamp@oracle.com> X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1359476660 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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Dave Kleikamp Cc: Ben Myers Cc: Alex Elder Cc: xfs@oss.sgi.com --- fs/xfs/xfs_file.c | 51 ++++++++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 67284ed..c5d74e8 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -225,10 +225,9 @@ xfs_file_fsync( } STATIC ssize_t -xfs_file_aio_read( +xfs_file_read_iter( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos) { struct file *file = iocb->ki_filp; @@ -249,9 +248,7 @@ xfs_file_aio_read( if (file->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - ret = generic_segment_checks(iovp, &nr_segs, &size, VERIFY_WRITE); - if (ret < 0) - return ret; + size = iov_iter_count(iter); if (unlikely(ioflags & IO_ISDIRECT)) { xfs_buftarg_t *target = @@ -304,7 +301,7 @@ xfs_file_aio_read( trace_xfs_file_read(ip, size, pos, ioflags); - ret = generic_file_aio_read(iocb, iovp, nr_segs, pos); + ret = generic_file_read_iter(iocb, iter, pos); if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); @@ -620,10 +617,9 @@ restart: STATIC ssize_t xfs_file_dio_aio_write( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos, - size_t ocount) + size_t count) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -631,7 +627,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; - size_t count = ocount; int unaligned_io = 0; int iolock; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? @@ -691,8 +686,8 @@ xfs_file_dio_aio_write( } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); - ret = generic_file_direct_write(iocb, iovp, - &nr_segs, pos, &iocb->ki_pos, count, ocount); + ret = generic_file_direct_write_iter(iocb, iter, + pos, &iocb->ki_pos, count); out: xfs_rw_iunlock(ip, iolock); @@ -705,10 +700,9 @@ out: STATIC ssize_t xfs_file_buffered_aio_write( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos, - size_t ocount) + size_t count) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -717,7 +711,6 @@ xfs_file_buffered_aio_write( ssize_t ret; int enospc = 0; int iolock = XFS_IOLOCK_EXCL; - size_t count = ocount; xfs_rw_ilock(ip, iolock); @@ -730,7 +723,7 @@ xfs_file_buffered_aio_write( write_retry: trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); - ret = generic_file_buffered_write(iocb, iovp, nr_segs, + ret = generic_file_buffered_write_iter(iocb, iter, pos, &iocb->ki_pos, count, 0); /* @@ -751,10 +744,9 @@ out: } STATIC ssize_t -xfs_file_aio_write( +xfs_file_write_iter( struct kiocb *iocb, - const struct iovec *iovp, - unsigned long nr_segs, + struct iov_iter *iter, loff_t pos) { struct file *file = iocb->ki_filp; @@ -762,17 +754,15 @@ xfs_file_aio_write( struct inode *inode = mapping->host; struct xfs_inode *ip = XFS_I(inode); ssize_t ret; - size_t ocount = 0; + size_t count = 0; XFS_STATS_INC(xs_write_calls); BUG_ON(iocb->ki_pos != pos); - ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (ret) - return ret; + count = iov_iter_count(iter); - if (ocount == 0) + if (count == 0) return 0; sb_start_write(inode->i_sb); @@ -783,10 +773,9 @@ xfs_file_aio_write( } if (unlikely(file->f_flags & O_DIRECT)) - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, ocount); + ret = xfs_file_dio_aio_write(iocb, iter, pos, count); else - ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, - ocount); + ret = xfs_file_buffered_aio_write(iocb, iter, pos, count); if (ret > 0) { ssize_t err; @@ -1416,8 +1405,8 @@ const struct file_operations xfs_file_operations = { .llseek = xfs_file_llseek, .read = do_sync_read, .write = do_sync_write, - .aio_read = xfs_file_aio_read, - .aio_write = xfs_file_aio_write, + .read_iter = xfs_file_read_iter, + .write_iter = xfs_file_write_iter, .splice_read = xfs_file_splice_read, .splice_write = xfs_file_splice_write, .unlocked_ioctl = xfs_file_ioctl, -- 1.8.1.1 From dave.kleikamp@oracle.com Tue Jan 29 10:26:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B2AF57F4E for ; Tue, 29 Jan 2013 10:26:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9DD1A8F8050 for ; Tue, 29 Jan 2013 08:26:15 -0800 (PST) X-ASG-Debug-ID: 1359476772-04cb6c39151c6f40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id MwzEGBBhJjNueB5z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 08:26:12 -0800 (PST) X-Barracuda-Envelope-From: dave.kleikamp@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.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0TGOLnI031415 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 29 Jan 2013 16:24:22 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0TGOJSE015660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 29 Jan 2013 16:24:19 GMT Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0TGOHj3013816; Tue, 29 Jan 2013 10:24:17 -0600 Received: from shaggy-t410.oracle.com (/99.156.91.244) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 29 Jan 2013 08:24:17 -0800 Received: by shaggy-t410.oracle.com (Postfix, from userid 1000) id EF22813800D; Tue, 29 Jan 2013 10:24:13 -0600 (CST) From: Dave Kleikamp To: Alexander Viro Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Zach Brown , "Maxim V. Patlasov" , Dave Kleikamp , Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov , v9fs-developer@lists.sourceforge.net, Chris Mason , linux-btrfs@vger.kernel.org, Sage Weil , ceph-devel@vger.kernel.org, Jan Kara , linux-ext4@vger.kernel.org, Andrew Morton , Andreas Dilger , Jaegeuk Kim , linux-f2fs-devel@lists.sourceforge.net, OGAWA Hirofumi , Miklos Szeredi , fuse-devel@lists.sourceforge.net, Steven Whitehouse , cluster-devel@redhat.com, jfs-discussion@lists.sourceforge.net, Trond Myklebust , linux-nfs@vger.kernel.org, KONISHI Ryusuke , linux-nilfs@vger.kernel.org, Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Ben Myers , Alex Elder , xfs@oss.sgi.com, linux-mm@kvack.org Subject: [PATCH V6 09/30] dio: Convert direct_IO to use iov_iter Date: Tue, 29 Jan 2013 10:23:22 -0600 X-ASG-Orig-Subj: [PATCH V6 09/30] dio: Convert direct_IO to use iov_iter Message-Id: <1359476623-10544-10-git-send-email-dave.kleikamp@oracle.com> X-Mailer: git-send-email 1.8.1.1 In-Reply-To: <1359476623-10544-1-git-send-email-dave.kleikamp@oracle.com> References: <1359476623-10544-1-git-send-email-dave.kleikamp@oracle.com> X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1359476772 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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Change the direct_IO aop to take an iov_iter argument rather than an iovec. This will get passed down through most filesystems so that only the __blockdev_direct_IO helper need be aware of whether user or kernel memory is being passed to the function. Signed-off-by: Dave Kleikamp Cc: Eric Van Hensbergen Cc: Ron Minnich Cc: Latchesar Ionkov Cc: v9fs-developer@lists.sourceforge.net Cc: Alexander Viro Cc: linux-fsdevel@vger.kernel.org Cc: Chris Mason Cc: linux-btrfs@vger.kernel.org Cc: Sage Weil Cc: ceph-devel@vger.kernel.org Cc: Jan Kara Cc: linux-ext4@vger.kernel.org Cc: Andrew Morton Cc: Andreas Dilger Cc: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net Cc: OGAWA Hirofumi Cc: Miklos Szeredi Cc: fuse-devel@lists.sourceforge.net Cc: Steven Whitehouse Cc: cluster-devel@redhat.com Cc: jfs-discussion@lists.sourceforge.net Cc: Trond Myklebust Cc: linux-nfs@vger.kernel.org Cc: KONISHI Ryusuke Cc: linux-nilfs@vger.kernel.org Cc: Mark Fasheh Cc: Joel Becker Cc: ocfs2-devel@oss.oracle.com Cc: reiserfs-devel@vger.kernel.org Cc: Ben Myers Cc: Alex Elder Cc: xfs@oss.sgi.com Cc: linux-mm@kvack.org --- Documentation/filesystems/Locking | 4 +-- Documentation/filesystems/vfs.txt | 4 +-- fs/9p/vfs_addr.c | 8 ++--- fs/block_dev.c | 8 ++--- fs/btrfs/inode.c | 61 ++++++++++++++++++++++++--------------- fs/ceph/addr.c | 3 +- fs/direct-io.c | 19 ++++++------ fs/ext2/inode.c | 8 ++--- fs/ext3/inode.c | 15 ++++------ fs/ext4/ext4.h | 3 +- fs/ext4/indirect.c | 16 +++++----- fs/ext4/inode.c | 23 +++++++-------- fs/f2fs/data.c | 4 +-- fs/fat/inode.c | 10 +++---- fs/fuse/file.c | 11 +++++-- fs/gfs2/aops.c | 7 ++--- fs/hfs/inode.c | 7 ++--- fs/hfsplus/inode.c | 6 ++-- fs/jfs/inode.c | 7 ++--- fs/nfs/direct.c | 13 +++++---- fs/nilfs2/inode.c | 8 ++--- fs/ocfs2/aops.c | 8 ++--- fs/reiserfs/inode.c | 7 ++--- fs/udf/file.c | 3 +- fs/udf/inode.c | 10 +++---- fs/xfs/xfs_aops.c | 13 ++++----- include/linux/fs.h | 18 ++++++------ include/linux/nfs_fs.h | 3 +- mm/filemap.c | 13 +++++++-- mm/page_io.c | 8 +++-- 30 files changed, 165 insertions(+), 163 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index f48e0c6..509bf38 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -190,8 +190,8 @@ prototypes: int (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, int); void (*freepage)(struct page *); - int (*direct_IO)(int, struct kiocb *, const struct iovec *iov, - loff_t offset, unsigned long nr_segs); + int (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, + loff_t offset); int (*get_xip_mem)(struct address_space *, pgoff_t, int, void **, unsigned long *); int (*migratepage)(struct address_space *, struct page *, struct page *); diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index e3869098..abe11d8 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -569,8 +569,8 @@ struct address_space_operations { int (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, int); void (*freepage)(struct page *); - ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, - loff_t offset, unsigned long nr_segs); + ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, + loff_t offset); struct page* (*get_xip_page)(struct address_space *, sector_t, int); /* migrate the contents of a page to the specified target */ diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 0ad61c6..e70f239 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -239,9 +239,8 @@ static int v9fs_launder_page(struct page *page) * v9fs_direct_IO - 9P address space operation for direct I/O * @rw: direction (read or write) * @iocb: target I/O control block - * @iov: array of vectors that define I/O buffer + * @iter: array of vectors that define I/O buffer * @pos: offset in file to begin the operation - * @nr_segs: size of iovec array * * The presence of v9fs_direct_IO() in the address space ops vector * allowes open() O_DIRECT flags which would have failed otherwise. @@ -255,8 +254,7 @@ static int v9fs_launder_page(struct page *page) * */ static ssize_t -v9fs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, - loff_t pos, unsigned long nr_segs) +v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) { /* * FIXME @@ -265,7 +263,7 @@ v9fs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, */ p9_debug(P9_DEBUG_VFS, "v9fs_direct_IO: v9fs_direct_IO (%s) off/no(%lld/%lu) EINVAL\n", iocb->ki_filp->f_path.dentry->d_name.name, - (long long)pos, nr_segs); + (long long)pos, iter->nr_segs); return -EINVAL; } diff --git a/fs/block_dev.c b/fs/block_dev.c index 172f849..df8aa76 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -157,14 +157,14 @@ blkdev_get_block(struct inode *inode, sector_t iblock, } static ssize_t -blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, - loff_t offset, unsigned long nr_segs) +blkdev_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, + loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset, - nr_segs, blkdev_get_block, NULL, NULL, 0); + return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iter, + offset, blkdev_get_block, NULL, NULL, 0); } int __sync_blockdev(struct block_device *bdev, int wait) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index cc93b23..b4672d3f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6576,8 +6576,7 @@ free_ordered: } static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { int seg; int i; @@ -6591,46 +6590,60 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io goto out; /* Check the memory alignment. Blocks cannot straddle pages */ - for (seg = 0; seg < nr_segs; seg++) { - addr = (unsigned long)iov[seg].iov_base; - size = iov[seg].iov_len; - end += size; - if ((addr & blocksize_mask) || (size & blocksize_mask)) - goto out; + if (iov_iter_has_iovec(iter)) { + const struct iovec *iov = iov_iter_iovec(iter); + + for (seg = 0; seg < iter->nr_segs; seg++) { + addr = (unsigned long)iov[seg].iov_base; + size = iov[seg].iov_len; + end += size; + if ((addr & blocksize_mask) || (size & blocksize_mask)) + goto out; - /* If this is a write we don't need to check anymore */ - if (rw & WRITE) - continue; + /* If this is a write we don't need to check anymore */ + if (rw & WRITE) + continue; - /* - * Check to make sure we don't have duplicate iov_base's in this - * iovec, if so return EINVAL, otherwise we'll get csum errors - * when reading back. - */ - for (i = seg + 1; i < nr_segs; i++) { - if (iov[seg].iov_base == iov[i].iov_base) + /* + * Check to make sure we don't have duplicate iov_base's + * in this iovec, if so return EINVAL, otherwise we'll + * get csum errors when reading back. + */ + for (i = seg + 1; i < iter->nr_segs; i++) { + if (iov[seg].iov_base == iov[i].iov_base) + goto out; + } + } + } else if (iov_iter_has_bvec(iter)) { + struct bio_vec *bvec = iov_iter_bvec(iter); + + for (seg = 0; seg < iter->nr_segs; seg++) { + addr = (unsigned long)bvec[seg].bv_offset; + size = bvec[seg].bv_len; + end += size; + if ((addr & blocksize_mask) || (size & blocksize_mask)) goto out; } - } + } else + BUG(); + retval = 0; out: return retval; } static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, - offset, nr_segs)) + if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iter, offset)) return 0; return __blockdev_direct_IO(rw, iocb, inode, BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, - iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, + iter, offset, btrfs_get_blocks_direct, NULL, btrfs_submit_direct, 0); } diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 064d1a6..2a3eefc 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -1198,8 +1198,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping, * never get called. */ static ssize_t ceph_direct_io(int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t pos, unsigned long nr_segs) + struct iov_iter *iter, loff_t pos) { WARN_ON(1); return -EINVAL; diff --git a/fs/direct-io.c b/fs/direct-io.c index cf5b44b..b97a202 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -1047,9 +1047,9 @@ static inline int drop_refcount(struct dio *dio) */ static inline ssize_t do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, - struct block_device *bdev, const struct iovec *iov, loff_t offset, - unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, - dio_submit_t submit_io, int flags) + struct block_device *bdev, struct iov_iter *iter, loff_t offset, + get_block_t get_block, dio_iodone_t end_io, dio_submit_t submit_io, + int flags) { int seg; size_t size; @@ -1065,6 +1065,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, size_t bytes; struct buffer_head map_bh = { 0, }; struct blk_plug plug; + const struct iovec *iov = iov_iter_iovec(iter); + unsigned long nr_segs = iter->nr_segs; if (rw & WRITE) rw = WRITE_ODIRECT; @@ -1283,9 +1285,9 @@ out: ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, - struct block_device *bdev, const struct iovec *iov, loff_t offset, - unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, - dio_submit_t submit_io, int flags) + struct block_device *bdev, struct iov_iter *iter, loff_t offset, + get_block_t get_block, dio_iodone_t end_io, dio_submit_t submit_io, + int flags) { /* * The block device state is needed in the end to finally @@ -1299,9 +1301,8 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, prefetch(bdev->bd_queue); prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES); - return do_blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, - nr_segs, get_block, end_io, - submit_io, flags); + return do_blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset, + get_block, end_io, submit_io, flags); } EXPORT_SYMBOL(__blockdev_direct_IO); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 6363ac6..f1d65f5 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -833,18 +833,16 @@ static sector_t ext2_bmap(struct address_space *mapping, sector_t block) } static ssize_t -ext2_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, - loff_t offset, unsigned long nr_segs) +ext2_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - ext2_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ext2_get_block); if (ret < 0 && (rw & WRITE)) - ext2_write_failed(mapping, offset + iov_length(iov, nr_segs)); + ext2_write_failed(mapping, offset + iov_iter_count(iter)); return ret; } diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index b176d42..c31fbea 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -1855,8 +1855,7 @@ static int ext3_releasepage(struct page *page, gfp_t wait) * VFS code falls back into buffered path in that case so we are safe. */ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; @@ -1864,10 +1863,10 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb, handle_t *handle; ssize_t ret; int orphan = 0; - size_t count = iov_length(iov, nr_segs); + size_t count = iov_iter_count(iter); int retries = 0; - trace_ext3_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw); + trace_ext3_direct_IO_enter(inode, offset, count, rw); if (rw == WRITE) { loff_t final_size = offset + count; @@ -1891,15 +1890,14 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb, } retry: - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - ext3_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ext3_get_block); /* * In case of error extending write may have instantiated a few * blocks outside i_size. Trim these off again. */ if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + count; if (end > isize) ext3_truncate_failed_direct_write(inode); @@ -1942,8 +1940,7 @@ retry: ret = err; } out: - trace_ext3_direct_IO_exit(inode, offset, - iov_length(iov, nr_segs), rw, ret); + trace_ext3_direct_IO_exit(inode, offset, count, rw, ret); return ret; } diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 8462eb3..6af5f9e 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2098,8 +2098,7 @@ extern void ext4_da_update_reserve_space(struct inode *inode, extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, struct ext4_map_blocks *map, int flags); extern ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs); + struct iov_iter *iter, loff_t offset); extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk); extern void ext4_ind_truncate(struct inode *inode); diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index 20862f9..d396143 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c @@ -772,8 +772,7 @@ out: * VFS code falls back into buffered path in that case so we are safe. */ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; @@ -781,7 +780,7 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, handle_t *handle; ssize_t ret; int orphan = 0; - size_t count = iov_length(iov, nr_segs); + size_t count = iov_iter_count(iter); int retries = 0; if (rw == WRITE) { @@ -825,18 +824,17 @@ retry: goto locked; } ret = __blockdev_direct_IO(rw, iocb, inode, - inode->i_sb->s_bdev, iov, - offset, nr_segs, - ext4_get_block, NULL, NULL, 0); + inode->i_sb->s_bdev, iter, + offset, ext4_get_block, NULL, NULL, 0); inode_dio_done(inode); } else { locked: - ret = blockdev_direct_IO(rw, iocb, inode, iov, - offset, nr_segs, ext4_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, + offset, ext4_get_block); if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if (end > isize) ext4_truncate_failed_write(inode); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index cbfe13b..9a0515f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3072,13 +3072,12 @@ retry: * */ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; ssize_t ret; - size_t count = iov_length(iov, nr_segs); + size_t count = iov_iter_count(iter); int overwrite = 0; get_block_t *get_block_func = NULL; int dio_flags = 0; @@ -3086,7 +3085,7 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, /* Use the old path for reads and writes beyond i_size. */ if (rw != WRITE || final_size > inode->i_size) - return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); + return ext4_ind_direct_IO(rw, iocb, iter, offset); BUG_ON(iocb->private == NULL); @@ -3144,8 +3143,8 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, dio_flags = DIO_LOCKING; } ret = __blockdev_direct_IO(rw, iocb, inode, - inode->i_sb->s_bdev, iov, - offset, nr_segs, + inode->i_sb->s_bdev, iter, + offset, get_block_func, ext4_end_io_dio, NULL, @@ -3196,8 +3195,7 @@ retake_lock: } static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; @@ -3213,13 +3211,12 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, if (ext4_has_inline_data(inode)) return 0; - trace_ext4_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw); + trace_ext4_direct_IO_enter(inode, offset, iov_iter_count(iter), rw); if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) - ret = ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs); + ret = ext4_ext_direct_IO(rw, iocb, iter, offset); else - ret = ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); - trace_ext4_direct_IO_exit(inode, offset, - iov_length(iov, nr_segs), rw, ret); + ret = ext4_ind_direct_IO(rw, iocb, iter, offset); + trace_ext4_direct_IO_exit(inode, offset, iov_iter_count(iter), rw, ret); return ret; } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 7bd22a2..387735b 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -654,7 +654,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping, } static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; @@ -663,7 +663,7 @@ static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb, return 0; /* Needs synchronization with the cleaner */ - return blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, + return blockdev_direct_IO(rw, iocb, inode, iter, offset, get_data_block_ro); } diff --git a/fs/fat/inode.c b/fs/fat/inode.c index f8f4916..3ef01e5 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -185,8 +185,7 @@ static int fat_write_end(struct file *file, struct address_space *mapping, } static ssize_t fat_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -203,7 +202,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb, * * Return 0, and fallback to normal buffered write. */ - loff_t size = offset + iov_length(iov, nr_segs); + loff_t size = offset + iov_iter_count(iter); if (MSDOS_I(inode)->mmu_private < size) return 0; } @@ -212,10 +211,9 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb, * FAT need to use the DIO_LOCKING for avoiding the race * condition of fat_get_block() and ->truncate(). */ - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - fat_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, fat_get_block); if (ret < 0 && (rw & WRITE)) - fat_write_failed(mapping, offset + iov_length(iov, nr_segs)); + fat_write_failed(mapping, offset + iov_iter_count(iter)); return ret; } diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 27d10ca..c8391d3 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -2149,17 +2149,22 @@ static ssize_t fuse_loop_dio(struct file *filp, const struct iovec *iov, static ssize_t -fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, - loff_t offset, unsigned long nr_segs) +fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t offset) { ssize_t ret = 0; struct file *file = NULL; loff_t pos = 0; + /* + * We'll eventually want to work with both iovec and bvec + */ + BUG_ON(!iov_iter_has_iovec(iter)); + file = iocb->ki_filp; pos = offset; - ret = fuse_loop_dio(file, iov, nr_segs, &pos, rw); + ret = fuse_loop_dio(file, iov_iter_iovec(iter), iter->nr_segs, &pos, + rw); return ret; } diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 30de4f2..06020cf 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -995,8 +995,7 @@ static int gfs2_ok_for_dio(struct gfs2_inode *ip, int rw, loff_t offset) static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; @@ -1020,8 +1019,8 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb, if (rv != 1) goto out; /* dio not valid, fall back to buffered i/o */ - rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, - offset, nr_segs, gfs2_get_block_direct, + rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, + offset, gfs2_get_block_direct, NULL, NULL, 0); out: gfs2_glock_dq(&gh); diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index d47f116..2a87ba4 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -124,15 +124,14 @@ static int hfs_releasepage(struct page *page, gfp_t mask) } static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - hfs_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, hfs_get_block); /* * In case of error extending write may have instantiated a few @@ -140,7 +139,7 @@ static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb, */ if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if (end > isize) hfs_write_failed(mapping, end); diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index 799b336..c87b26c 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -120,14 +120,14 @@ static int hfsplus_releasepage(struct page *page, gfp_t mask) } static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, hfsplus_get_block); /* @@ -136,7 +136,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb, */ if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if (end > isize) hfsplus_write_failed(mapping, end); diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index b7dc47b..41cde89 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -330,15 +330,14 @@ static sector_t jfs_bmap(struct address_space *mapping, sector_t block) } static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = file->f_mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - jfs_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, jfs_get_block); /* * In case of error extending write may have instantiated a few @@ -346,7 +345,7 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, */ if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if (end > isize) jfs_write_failed(mapping, end); diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 0bd7a55..bceb47e 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -112,7 +112,7 @@ static inline int put_dreq(struct nfs_direct_req *dreq) * nfs_direct_IO - NFS address space operation for direct I/O * @rw: direction (read or write) * @iocb: target I/O control block - * @iov: array of vectors that define I/O buffer + * @iter: array of vectors that define I/O buffer * @pos: offset in file to begin the operation * @nr_segs: size of iovec array * @@ -121,22 +121,25 @@ static inline int put_dreq(struct nfs_direct_req *dreq) * shunt off direct read and write requests before the VFS gets them, * so this method is only ever called for swap. */ -ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t pos, unsigned long nr_segs) +ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, + loff_t pos) { #ifndef CONFIG_NFS_SWAP dprintk("NFS: nfs_direct_IO (%s) off/no(%Ld/%lu) EINVAL\n", iocb->ki_filp->f_path.dentry->d_name.name, - (long long) pos, nr_segs); + (long long) pos, iter->nr_segs); return -EINVAL; #else + const struct iovec *iov = iov_iter_iovec(iter); + VM_BUG_ON(iocb->ki_left != PAGE_SIZE); VM_BUG_ON(iocb->ki_nbytes != PAGE_SIZE); if (rw == READ || rw == KERNEL_READ) - return nfs_file_direct_read(iocb, iov, nr_segs, pos, + return nfs_file_direct_read(iocb, iov, iter->nr_segs, pos, rw == READ ? true : false); - return nfs_file_direct_write(iocb, iov, nr_segs, pos, + return nfs_file_direct_write(iocb, iov, iter->nr_segs, pos, rw == WRITE ? true : false); #endif /* CONFIG_NFS_SWAP */ } diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 6b49f14..fe42d83 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -262,8 +262,8 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping, } static ssize_t -nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, - loff_t offset, unsigned long nr_segs) +nilfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, + loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -274,7 +274,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, return 0; /* Needs synchronization with the cleaner */ - size = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, + size = blockdev_direct_IO(rw, iocb, inode, iter, offset, nilfs_get_block); /* @@ -283,7 +283,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, */ if (unlikely((rw & WRITE) && size < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if (end > isize) nilfs_write_failed(mapping, end); diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 6577432..ed100d5 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -621,9 +621,8 @@ static int ocfs2_releasepage(struct page *page, gfp_t wait) static ssize_t ocfs2_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, + loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; @@ -640,8 +639,7 @@ static ssize_t ocfs2_direct_IO(int rw, return 0; return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, - iov, offset, nr_segs, - ocfs2_direct_IO_get_blocks, + iter, offset, ocfs2_direct_IO_get_blocks, ocfs2_dio_end_io, NULL, 0); } diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 95d7680..52400b9 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -3067,14 +3067,13 @@ static int reiserfs_releasepage(struct page *page, gfp_t unused_gfp_flags) /* We thank Mingming Cao for helping us understand in great detail what to do in this section of the code. */ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, reiserfs_get_blocks_direct_io); /* @@ -3083,7 +3082,7 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, */ if (unlikely((rw & WRITE) && ret < 0)) { loff_t isize = i_size_read(inode); - loff_t end = offset + iov_length(iov, nr_segs); + loff_t end = offset + iov_iter_count(iter); if ((end > isize) && inode_newsize_ok(inode, isize) == 0) { truncate_setsize(inode, isize); diff --git a/fs/udf/file.c b/fs/udf/file.c index 77b5953..c4164dc 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -119,8 +119,7 @@ static int udf_adinicb_write_end(struct file *file, } static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, unsigned long nr_segs) + struct iov_iter *iter, loff_t offset) { /* Fallback to buffered I/O. */ return 0; diff --git a/fs/udf/inode.c b/fs/udf/inode.c index cbae1ed..5843111 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -145,19 +145,17 @@ static int udf_write_begin(struct file *file, struct address_space *mapping, return ret; } -static ssize_t udf_direct_IO(int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, unsigned long nr_segs) +static ssize_t udf_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, + loff_t offset) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; ssize_t ret; - ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, - udf_get_block); + ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, udf_get_block); if (unlikely(ret < 0 && (rw & WRITE))) - udf_write_failed(mapping, offset + iov_length(iov, nr_segs)); + udf_write_failed(mapping, offset + iov_iter_count(iter)); return ret; } diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4111a40..63895e7 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1409,9 +1409,8 @@ STATIC ssize_t xfs_vm_direct_IO( int rw, struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, - unsigned long nr_segs) + struct iov_iter *iter, + loff_t offset) { struct inode *inode = iocb->ki_filp->f_mapping->host; struct block_device *bdev = xfs_find_bdev_for_inode(inode); @@ -1419,7 +1418,7 @@ xfs_vm_direct_IO( ssize_t ret; if (rw & WRITE) { - size_t size = iov_length(iov, nr_segs); + size_t size = iov_iter_count(iter); /* * We cannot preallocate a size update transaction here as we @@ -1431,15 +1430,13 @@ xfs_vm_direct_IO( if (offset + size > XFS_I(inode)->i_d.di_size) ioend->io_isdirect = 1; - ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov, - offset, nr_segs, + ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset, xfs_get_blocks_direct, xfs_end_io_direct_write, NULL, 0); if (ret != -EIOCBQUEUED && iocb->private) goto out_destroy_ioend; } else { - ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov, - offset, nr_segs, + ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset, xfs_get_blocks_direct, NULL, NULL, 0); } diff --git a/include/linux/fs.h b/include/linux/fs.h index eb564d1..44cd365 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -456,8 +456,8 @@ struct address_space_operations { void (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, gfp_t); void (*freepage)(struct page *); - ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, - loff_t offset, unsigned long nr_segs); + ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, + loff_t offset); int (*get_xip_mem)(struct address_space *, pgoff_t, int, void **, unsigned long *); /* @@ -2520,16 +2520,16 @@ enum { void dio_end_io(struct bio *bio, int error); ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, - struct block_device *bdev, const struct iovec *iov, loff_t offset, - unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, - dio_submit_t submit_io, int flags); + struct block_device *bdev, struct iov_iter *iter, loff_t offset, + get_block_t get_block, dio_iodone_t end_io, dio_submit_t submit_io, + int flags); static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, - struct inode *inode, const struct iovec *iov, loff_t offset, - unsigned long nr_segs, get_block_t get_block) + struct inode *inode, struct iov_iter *iter, loff_t offset, + get_block_t get_block) { - return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, - offset, nr_segs, get_block, NULL, NULL, + return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, + offset, get_block, NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES); } #endif diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 1cc2568..4913e3c 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -444,8 +444,7 @@ extern int nfs3_removexattr (struct dentry *, const char *name); /* * linux/fs/nfs/direct.c */ -extern ssize_t nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t, - unsigned long); +extern ssize_t nfs_direct_IO(int, struct kiocb *, struct iov_iter *, loff_t); extern ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos, bool uio); diff --git a/mm/filemap.c b/mm/filemap.c index 753ec48..d428020 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1409,11 +1409,15 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, goto out; /* skip atime */ size = i_size_read(inode); if (pos < size) { + size_t bytes = iov_length(iov, nr_segs); retval = filemap_write_and_wait_range(mapping, pos, - pos + iov_length(iov, nr_segs) - 1); + pos + bytes - 1); if (!retval) { + struct iov_iter iter; + + iov_iter_init(&iter, iov, nr_segs, bytes, 0); retval = mapping->a_ops->direct_IO(READ, iocb, - iov, pos, nr_segs); + &iter, pos); } if (retval > 0) { *ppos = pos + retval; @@ -2037,6 +2041,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, ssize_t written; size_t write_len; pgoff_t end; + struct iov_iter iter; if (count != ocount) *nr_segs = iov_shorten((struct iovec *)iov, *nr_segs, count); @@ -2068,7 +2073,9 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, } } - written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); + iov_iter_init(&iter, iov, *nr_segs, write_len, 0); + + written = mapping->a_ops->direct_IO(WRITE, iocb, &iter, pos); /* * Finally, try again to invalidate clean pages which might have been diff --git a/mm/page_io.c b/mm/page_io.c index 78eee32..33da274 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -208,6 +208,9 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) .iov_base = kmap(page), .iov_len = PAGE_SIZE, }; + struct iov_iter iter; + + iov_iter_init(&iter, &iov, 1, PAGE_SIZE, 0); init_sync_kiocb(&kiocb, swap_file); kiocb.ki_pos = page_file_offset(page); @@ -215,9 +218,8 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) kiocb.ki_nbytes = PAGE_SIZE; unlock_page(page); - ret = mapping->a_ops->direct_IO(KERNEL_WRITE, - &kiocb, &iov, - kiocb.ki_pos, 1); + ret = mapping->a_ops->direct_IO(KERNEL_WRITE, &kiocb, &iter, + kiocb.ki_pos); kunmap(page); if (ret == PAGE_SIZE) { count_vm_event(PSWPOUT); -- 1.8.1.1 From sandeen@sandeen.net Tue Jan 29 11:59:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 534277F67 for ; Tue, 29 Jan 2013 11:59:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E956BAC006 for ; Tue, 29 Jan 2013 09:59:52 -0800 (PST) X-ASG-Debug-ID: 1359482391-04bdf0231e1d8a50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EnoLEGo8N9vK6lze for ; Tue, 29 Jan 2013 09:59:51 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 65FFA603202F; Tue, 29 Jan 2013 11:59:51 -0600 (CST) Message-ID: <51080E17.1070103@sandeen.net> Date: Tue, 29 Jan 2013 11:59:51 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: rjohnston@sgi.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] Add agskip=value mount option References: <20130129153914.801475275@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 0/3] Add agskip=value mount option In-Reply-To: <20130129153914.801475275@sgi.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359482391 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.2.121251 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 1/29/13 9:39 AM, rjohnston@sgi.com wrote: > This series will: > > 1. Add agskip=value mount option to xfs > 2. Add agkip mount option test to xfstests > 3. Add agskip mount option to the mount.8 manpage (util-linux) You left out: Why? :) -Eric > --Rich > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Tue Jan 29 12:49:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 BC8E97F4E for ; Tue, 29 Jan 2013 12:49:22 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 166DEAC001; Tue, 29 Jan 2013 10:49:18 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B30F04266DC; Tue, 29 Jan 2013 12:49:18 -0600 (CST) Date: Tue, 29 Jan 2013 12:49:18 -0600 From: Ben Myers To: Eric Sandeen Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: [PATCH 2/8] libxfs: initialize xfs_alloc_arg structures Message-ID: <20130129184918.GG27055@sgi.com> References: <1359240032-11576-1-git-send-email-sandeen@redhat.com> <1359240032-11576-3-git-send-email-sandeen@redhat.com> <20130128003542.GB16727@disturbed.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Sun, Jan 27, 2013 at 09:41:28PM -0500, Eric Sandeen wrote: > On Jan 27, 2013, at 8:38 PM, Dave Chinner wrote: > > > On Sat, Jan 26, 2013 at 04:40:26PM -0600, Eric Sandeen wrote: > >> This is a merge-to-userspace of kernel commit a0041684 > >> xfs: zero allocation_args on the kernel stack > >> > >> When calling xfs_alloc_vextent args.userdata was uninitialized, > >> and if we had args.type==XFS_ALLOCTYPE_START_BNO, this uninit > >> structure member got tested, leading to some random allocator > >> behavior. > > > > Got that as part of the kernel-user sync I sent out a couple of > > weeks back. > > > > BTW, perhaps we want to get that sync sorted out before shovelling > > a bunch of stuff into xfsprogs that will require fixing conflicts in > > that sync up? > > > I have no problem with this going 2nd, I can fix up as needed. We need to do another userspace release to resolve the backward compatability issue for Fugazzi and missing source file in xfsprogs for Arkadiusz before shovelling in that ueber patch. If any of these patches are bug fixes appropriate for a release within the next week or so, give a heads up. Thanks, Ben From bfoster@redhat.com Tue Jan 29 14:41:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 97ACC7F4E for ; Tue, 29 Jan 2013 14:41:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7782F304032 for ; Tue, 29 Jan 2013 12:41:59 -0800 (PST) X-ASG-Debug-ID: 1359492118-04cb6c39151ce030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8CemN2FJV1q2F0iY for ; Tue, 29 Jan 2013 12:41:58 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0TKfuYM002243 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 29 Jan 2013 15:41:58 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0TKftB7020738 for ; Tue, 29 Jan 2013 15:41:56 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 870C0120098; Tue, 29 Jan 2013 15:42:37 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Date: Tue, 29 Jan 2013 15:42:35 -0500 X-ASG-Orig-Subj: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Message-Id: <1359492157-30521-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1359492118 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, This patchset fixes a spinlock recursion we've reproduced initially on RHEL kernels[1]. The problem is that we issue an xfs_log_force() via xfs_buf_trylock() with the xa_lock held and ultimately drive down into xlog_assign_tail_lsn(), which attempts to reacquire xa_lock[2]. Note that this lockup was difficult to reproduce and I was not able to reproduce on an upstream kernel without a hack to comment out the pinned buf check in xfs_buf_item_push() (presumably because the log force itself only happens when the buf is pinned, so the window here is tight). This patchset is what I'm testing to avoid the lockup, but I'm posting this RFC to get some early thoughts: - Patch 1 - Creates a flag to conditionally force the log in xfs_buf_trylock(). The alternative I considered is to pull out the check and log force and sprinkle that code amongst the trylock callers. - Patch 2 - Utilizes the flag created in patch 1 and duplicates the log force in xfs_buf_item_push() after dropping xa_lock. The change in patch 2 makes me wonder how important the immediate flush is in the context of xfsaild_push(), where we already pend up a flush if the item is pinned. IOWs, I wonder if replacing what I have now with something like the following would be acceptable and cleaner: if (!__xfs_buf_trylock(bp, false)) { if (xfs_buf_ispinned(bp) return XFS_ITEM_PINNED; return XFS_ITEM_LOCKED; } Thoughts appreciated. Brian [1] - http://bugzilla.redhat.com/show_bug.cgi?id=896224 [2] - stacktrace: BUG: spinlock recursion on CPU#5, xfsaild/dm-3/2690 Pid: 2690, comm: xfsaild/dm-3 Not tainted 3.8.0-rc1+ #46 Call Trace: [] spin_dump+0x8a/0x8f [] spin_bug+0x21/0x26 [] do_raw_spin_lock+0x101/0x150 [] _raw_spin_lock+0xe/0x10 [] xlog_assign_tail_lsn+0x25/0x50 [xfs] [] xlog_state_release_iclog+0x86/0xd0 [xfs] [] xlog_write+0x569/0x710 [xfs] [] xlog_cil_push+0x29c/0x3c0 [xfs] [] ? xfs_buf_get_map+0xf2/0x1b0 [xfs] [] xlog_cil_force_lsn+0x157/0x160 [xfs] [] ? xfs_buf_read_map+0x31/0x130 [xfs] [] ? xfs_trans_read_buf_map+0x279/0x4b0 [xfs] [] ? __kmalloc+0x15d/0x1b0 [] _xfs_log_force+0x6d/0x290 [xfs] [] ? xfs_iflush_cluster+0x25f/0x3d0 [xfs] [] xfs_log_force+0x39/0xc0 [xfs] [] xfs_buf_trylock+0xd0/0xe0 [xfs] [] xfs_buf_item_push+0x39/0xd0 [xfs] [] ? xfs_inode_item_push+0x8f/0x140 [xfs] [] xfsaild+0x2e1/0x6e0 [xfs] [] ? __wake_up_common+0x58/0x90 [] ? xfs_trans_ail_cursor_first+0xc0/0xc0 [xfs] [] kthread+0xd8/0xe0 [] ? flush_kthread_work+0x150/0x150 [] ret_from_fork+0x7c/0xb0 [] ? flush_kthread_work+0x150/0x150 Brian Foster (2): xfs: conditionally force log on trylock failure of pinned/stale buf xfs: drop xa_lock around log force in xfs_buf_item push fs/xfs/xfs_buf.c | 8 +++++--- fs/xfs/xfs_buf.h | 3 ++- fs/xfs/xfs_buf_item.c | 10 +++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) -- 1.7.7.6 From bfoster@redhat.com Tue Jan 29 14:42:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 251897F53 for ; Tue, 29 Jan 2013 14:42:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12068304032 for ; Tue, 29 Jan 2013 12:42:01 -0800 (PST) X-ASG-Debug-ID: 1359492121-04cbb00c651c3530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vFdBVXs9gkdlyoGB for ; Tue, 29 Jan 2013 12:42:01 -0800 (PST) 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 r0TKfwDK015470 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 29 Jan 2013 15:42:01 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0TKft6Q021052 for ; Tue, 29 Jan 2013 15:41:58 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AB579120097; Tue, 29 Jan 2013 15:42:37 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC 1/2] xfs: conditionally force log on trylock failure of pinned/stale buf Date: Tue, 29 Jan 2013 15:42:36 -0500 X-ASG-Orig-Subj: [PATCH RFC 1/2] xfs: conditionally force log on trylock failure of pinned/stale buf Message-Id: <1359492157-30521-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1359492157-30521-1-git-send-email-bfoster@redhat.com> References: <1359492157-30521-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: 1359492121 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 xfs_force_log() is not safe from all contexts. Add a flag parameter to xfs_buf_trylock() to specify when the force is appropriate and create a macro to preserve current behavior. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf.c | 8 +++++--- fs/xfs/xfs_buf.h | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index fbbb9eb..2e04a44 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -943,15 +943,17 @@ xfs_buf_rele( * to push on stale inode buffers. */ int -xfs_buf_trylock( - struct xfs_buf *bp) +__xfs_buf_trylock( + struct xfs_buf *bp, + bool force_log) { int locked; locked = down_trylock(&bp->b_sema) == 0; if (locked) XB_SET_OWNER(bp); - else if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) + else if (force_log && + atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) xfs_log_force(bp->b_target->bt_mount, 0); trace_xfs_buf_trylock(bp, _RET_IP_); diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 433a12e..667b723 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -258,7 +258,8 @@ extern void xfs_buf_free(xfs_buf_t *); extern void xfs_buf_rele(xfs_buf_t *); /* Locking and Unlocking Buffers */ -extern int xfs_buf_trylock(xfs_buf_t *); +#define xfs_buf_trylock(bp) __xfs_buf_trylock(bp, true) +extern int __xfs_buf_trylock(xfs_buf_t *, bool); extern void xfs_buf_lock(xfs_buf_t *); extern void xfs_buf_unlock(xfs_buf_t *); #define xfs_buf_islocked(bp) \ -- 1.7.7.6 From bfoster@redhat.com Tue Jan 29 14:42:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 73C867F54 for ; Tue, 29 Jan 2013 14:42:02 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5347E304032 for ; Tue, 29 Jan 2013 12:41:59 -0800 (PST) X-ASG-Debug-ID: 1359492118-04cb6c39121ce020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cHCj4PnUxMJFNK6c for ; Tue, 29 Jan 2013 12:41:58 -0800 (PST) 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 r0TKfucx001781 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 29 Jan 2013 15:41:58 -0500 Received: from bfoster.bfoster (dhcp-191-48.bos.redhat.com [10.16.191.48]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0TKftSM012946 for ; Tue, 29 Jan 2013 15:41:56 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A30A8120095; Tue, 29 Jan 2013 15:42:37 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC 2/2] xfs: drop xa_lock around log force in xfs_buf_item push Date: Tue, 29 Jan 2013 15:42:37 -0500 X-ASG-Orig-Subj: [PATCH RFC 2/2] xfs: drop xa_lock around log force in xfs_buf_item push Message-Id: <1359492157-30521-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1359492157-30521-1-git-send-email-bfoster@redhat.com> References: <1359492157-30521-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: 1359492118 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 If the trylock fails and the buffer is pinned and stale, the resulting xfs_log_force() can lead to lock recursion on the ailp xa_lock. Call __xfs_buf_trylock() to attempt the buf lock with xa_lock held, but to avoid the log force. We subsequently pull the check and log force up into xfs_buf_item_push() where we can drop and reacquire xa_lock appropriately. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf_item.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 9c4c050..7b6e98a 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -469,8 +469,16 @@ xfs_buf_item_push( if (xfs_buf_ispinned(bp)) return XFS_ITEM_PINNED; - if (!xfs_buf_trylock(bp)) + + if (!__xfs_buf_trylock(bp, false)) { + if (atomic_read(&bp->b_pin_count) && + (bp->b_flags & XBF_STALE)) { + spin_unlock(&lip->li_ailp->xa_lock); + xfs_log_force(bp->b_target->bt_mount, 0); + spin_lock(&lip->li_ailp->xa_lock); + } return XFS_ITEM_LOCKED; + } ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); -- 1.7.7.6 From sandeen@sandeen.net Tue Jan 29 14:45:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A670E7F50 for ; Tue, 29 Jan 2013 14:45:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82FCF8F8033 for ; Tue, 29 Jan 2013 12:45:35 -0800 (PST) X-ASG-Debug-ID: 1359492334-04bdf0231d1dd3d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id aj0lJeo36EupsNZZ for ; Tue, 29 Jan 2013 12:45:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C272B63BEEAB; Tue, 29 Jan 2013 14:45:33 -0600 (CST) Message-ID: <510834ED.2080404@sandeen.net> Date: Tue, 29 Jan 2013 14:45:33 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: rjohnston@sgi.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: add agskip=value mount option In-Reply-To: <20130129153914.976867239@sgi.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359492334 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.2.121261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 1/29/13 9:39 AM, rjohnston@sgi.com wrote: Please do inline if possible? But anyway, although I've not looked at the patch itself yet, please also add this to Documentation/filesystems/xfs.txt And not just the "what" but the "why" - why would a person use this? And how would they select the value? Thanks, -Eric From bpm@sgi.com Tue Jan 29 14:56:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 6950F7F54 for ; Tue, 29 Jan 2013 14:56:22 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id BDDD2AC001; Tue, 29 Jan 2013 12:56:18 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6FAD84266DC; Tue, 29 Jan 2013 14:56:18 -0600 (CST) Date: Tue, 29 Jan 2013 14:56:18 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 0/4] xfs_logprint tests & fixes Message-ID: <20130129205618.GH27055@sgi.com> References: <50E4BBAC.9030604@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50E4BBAC.9030604@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Eric, On Wed, Jan 02, 2013 at 04:58:52PM -0600, Eric Sandeen wrote: > Resending in a straightforward series Reviewed-by: Ben Myers Applied this series. Thanks, Ben From sandeen@sandeen.net Tue Jan 29 14:57:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CEFC67F54 for ; Tue, 29 Jan 2013 14:57:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C3588F804B for ; Tue, 29 Jan 2013 12:57:21 -0800 (PST) X-ASG-Debug-ID: 1359493039-04bdf0231e1dd8c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KF2BZVFr5kmOjKBg for ; Tue, 29 Jan 2013 12:57:19 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E968163BEEAB; Tue, 29 Jan 2013 14:57:18 -0600 (CST) Message-ID: <510837AE.4020807@sandeen.net> Date: Tue, 29 Jan 2013 14:57:18 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: rjohnston@sgi.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: add agskip=value mount option In-Reply-To: <20130129153914.976867239@sgi.com> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359493039 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.2.121263 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 1/29/13 9:39 AM, rjohnston@sgi.com wrote: > The agskip mount option specifies the allocation group, (AG) for a new > file, relative to the start of the last created file. agskip has the > opposite effect of the rotorstep system tunable parameter. Each > new file to be placed in the location lastAG + agskipValue, > where lastAG is the allocation group of the last created file. > > For example, agskip=3 means each new file will be allocated three AGs away > from the starting AG of the most recently created file. > > The agskip mount option disables the rotorstep system tunable parameter. > > Signed-off-by: Rich Johnston > --- > fs/xfs/xfs_alloc.c | 35 ++++++++++++++++++++++++++++------- > fs/xfs/xfs_filestream.c | 8 +++++++- > fs/xfs/xfs_mount.c | 1 + > fs/xfs/xfs_mount.h | 4 +++- > fs/xfs/xfs_super.c | 13 ++++++++++++- > 5 files changed, 51 insertions(+), 10 deletions(-) > > Index: b/fs/xfs/xfs_alloc.c > =================================================================== > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -2365,12 +2365,20 @@ xfs_alloc_vextent( > * Try near allocation first, then anywhere-in-ag after > * the first a.g. fails. > */ > - if ((args->userdata == XFS_ALLOC_INITIAL_USER_DATA) && > - (mp->m_flags & XFS_MOUNT_32BITINODES)) { > - args->fsbno = XFS_AGB_TO_FSB(mp, > - ((mp->m_agfrotor / rotorstep) % > - mp->m_sb.sb_agcount), 0); > - bump_rotor = 1; > + if (args->userdata == XFS_ALLOC_INITIAL_USER_DATA) { > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { > + spin_lock(&mp->m_agfrotor_lock); Hm, this seems like a bigger deal than the m_agirotor_lock, no? That one got taken for dir creation or for AG sips, but this is taken for every new file? Also, I guess I had expected that this might cause new dirs to rotor around, but it looks like with this option,there is no locality of files in dirs (just like there is not with inode32, IIRC). Is that correct? (and is that desired?) > + args->fsbno = XFS_AGB_TO_FSB(mp, > + mp->m_agfrotor, 0); > + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) > + % mp->m_sb.sb_agcount; > + spin_unlock(&mp->m_agfrotor_lock); > + } else if (mp->m_flags & XFS_MOUNT_32BITINODES) { > + args->fsbno = XFS_AGB_TO_FSB(mp, > + ((mp->m_agfrotor / rotorstep) % > + mp->m_sb.sb_agcount), 0); > + bump_rotor = 1; > + } > } > args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); > args->type = XFS_ALLOCTYPE_NEAR_BNO; > @@ -2385,8 +2393,21 @@ xfs_alloc_vextent( > /* > * Start with the last place we left off. > */ > - args->agno = sagno = (mp->m_agfrotor / rotorstep) % > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { tabs please > + /* > + * The spinlock makes the combined assignment > + * of args->fsbno and mp->m_agfrotor atomic. > + * mp->m_agfrotor can not be advanced until > + * args->fsbno is assigned. > + */ > + spin_lock(&mp->m_agfrotor_lock); > + sagno = mp->m_agfrotor; > + spin_unlock(&mp->m_agfrotor_lock); tabs please > + } else { > + sagno = (mp->m_agfrotor / rotorstep) % > mp->m_sb.sb_agcount; > + } > + args->agno = sagno; > args->type = XFS_ALLOCTYPE_THIS_AG; > flags = XFS_ALLOC_FLAG_TRYLOCK; > } else if (type == XFS_ALLOCTYPE_FIRST_AG) { > Index: b/fs/xfs/xfs_filestream.c > =================================================================== > --- a/fs/xfs/xfs_filestream.c > +++ b/fs/xfs/xfs_filestream.c > @@ -622,7 +622,13 @@ xfs_filestream_associate( > * Set the starting AG using the rotor for inode32, otherwise > * use the directory inode's AG. > */ > - if (mp->m_flags & XFS_MOUNT_32BITINODES) { > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { > + spin_lock(&mp->m_agfrotor_lock); > + startag = mp->m_agfrotor; > + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) > + % mp->m_sb.sb_agcount; > + spin_unlock(&mp->m_agfrotor_lock); > + } else if (mp->m_flags & XFS_MOUNT_32BITINODES) { > rotorstep = xfs_rotorstep; > startag = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; > mp->m_agfrotor = (mp->m_agfrotor + 1) % > Index: b/fs/xfs/xfs_mount.c > =================================================================== > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -768,6 +768,7 @@ STATIC void > xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) > { > mp->m_agfrotor = mp->m_agirotor = 0; > + spin_lock_init(&mp->m_agfrotor_lock); > spin_lock_init(&mp->m_agirotor_lock); > mp->m_maxagi = mp->m_sb.sb_agcount; > mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG; > Index: b/fs/xfs/xfs_mount.h > =================================================================== > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -119,6 +119,7 @@ typedef struct xfs_mount { > char *m_logname; /* external log device name */ > int m_bsize; /* fs logical block size */ > xfs_agnumber_t m_agfrotor; /* last ag where space found */ > + spinlock_t m_agfrotor_lock;/* .. and lock protecting it */ > xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ > spinlock_t m_agirotor_lock;/* .. and lock protecting it */ > xfs_agnumber_t m_maxagi; /* highest inode alloc group */ > @@ -203,6 +204,7 @@ typedef struct xfs_mount { > struct shrinker m_inode_shrink; /* inode reclaim shrinker */ > int64_t m_low_space[XFS_LOWSP_MAX]; > /* low free space thresholds */ > + int m_agskip; /* extent allocation stride */ Not sure I grok that comment. But then we don't have a real description yet anyway - just be sure it matches the described behavior, I guess? > > struct workqueue_struct *m_data_workqueue; > struct workqueue_struct *m_unwritten_workqueue; > @@ -246,7 +248,7 @@ typedef struct xfs_mount { > #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams > allocator */ > #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ > - > +#define XFS_MOUNT_AGSKIP (1ULL << 26) /* extent allocation stride */ > > /* > * Default minimum read and write sizes. > Index: b/fs/xfs/xfs_super.c > =================================================================== > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -114,7 +114,7 @@ mempool_t *xfs_ioend_pool; > #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed logging disabled */ > #define MNTOPT_DISCARD "discard" /* Discard unused blocks */ > #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ > - > +#define MNTOPT_AGSKIP "agskip" /* initial extent allocation stride */ tabs please > /* > * Table driven mount option parser. > * > @@ -383,6 +383,15 @@ xfs_parseargs( > } else if (!strcmp(this_char, "irixsgid")) { > xfs_warn(mp, > "irixsgid is now a sysctl(2) variable, option is deprecated."); > + } else if (!strcmp(this_char, MNTOPT_AGSKIP)) { > + if (!value || !*value) { > + xfs_warn(mp, > + "%s option requires an argument", > + this_char); > + return EINVAL; > + } > + mp->m_flags |= XFS_MOUNT_AGSKIP; > + mp->m_agskip = simple_strtoul(value, &eov, 10); > } else { > xfs_warn(mp, "unknown mount option [%s].", this_char); > return EINVAL; > @@ -567,6 +576,8 @@ xfs_showargs( > > if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT)) > seq_puts(m, "," MNTOPT_NOQUOTA); > + if (mp->m_flags & XFS_MOUNT_AGSKIP) > + seq_printf(m, "," MNTOPT_AGSKIP "=%d", mp->m_agskip); > > return 0; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From storm9c1@skymagik.com Tue Jan 29 15:13:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7EF0A7F59 for ; Tue, 29 Jan 2013 15:13:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DF62304059 for ; Tue, 29 Jan 2013 13:13:55 -0800 (PST) X-ASG-Debug-ID: 1359494034-04cb6c39131ced70002-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id vjv5jFgiayYKtcaf for ; Tue, 29 Jan 2013 13:13:54 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0TLDuc17390; Tue, 29 Jan 2013 16:13:56 -0500 Received: from 192.104.24.222 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Tue, 29 Jan 2013 16:13:54 -0500 (EST) Message-ID: <25999.192.104.24.222.1359494034.squirrel@secure.skymagik.net> Date: Tue, 29 Jan 2013 16:13:54 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: In-Reply-To: <20130129151833.GF27055@sgi.com> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> X-Priority: 3 Importance: Normal Cc: , X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359494034 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.2.121263 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header In a previous message, Ben Myers wrote: > > I took a brief look at your report. I think a traceback would be > helpful. > > echo t > /proc/sysrq-trigger should do the trick. You're in the middle > of unmount so you might need to go serial console to capture the output. > Your report metions freeze/thaw. This is an area where we've had > deadlocks in the past, so I wouldn't be surprised if that is what you're > hitting. We'll have to see. > Hi Ben, Sure. If I do a reboot, and let it go through the motions, then I let it hang for more than 120 seconds, sometimes it displays a traceback on it's own. If not, I can trigger it from the serial console (though probably with break-t instead since this happens at the very end of the shutdown sequence, so no access to the shell). I'll have access to the test systems tonight and will get a traceback. I'll also post what is displayed during the shutdown process right before the hang. Thanks again for your help. -- Tom From bpm@sgi.com Tue Jan 29 15:33:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 6B8297F47 for ; Tue, 29 Jan 2013 15:33:46 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46FF58F804C; Tue, 29 Jan 2013 13:33:43 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 24E714266DC; Tue, 29 Jan 2013 15:33:43 -0600 (CST) Date: Tue, 29 Jan 2013 15:33:43 -0600 From: Ben Myers To: Andrew Dahl Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfstests: SGI license update Message-ID: <20130129213343.GI27055@sgi.com> References: <50E47A64.3020003@sgi.com> <50EC640C.7020106@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50EC640C.7020106@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Andrew, On Tue, Jan 08, 2013 at 12:23:08PM -0600, Andrew Dahl wrote: > Updated SGI license in looptest.c > > Signed-off-by: Andrew Dahl Reviewed-by: Ben Myers Applied. From Optimale_pro_intense@digital-connect.fr Tue Jan 29 15:36:22 2013 Return-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.3 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF, T_DKIM_INVALID,T_FRT_ADULT2,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-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 A67407F4C for ; Tue, 29 Jan 2013 15:36:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 393F4AC008 for ; Tue, 29 Jan 2013 13:36:20 -0800 (PST) X-ASG-Debug-ID: 1359495373-04bdf0231b1deb40001-w1Z2WR Received: from ipsmgbeg.wess-media.com (ipsmgbeg.wess-media.com [82.97.20.146]) by cuda.sgi.com with ESMTP id 0gbb0qpmNcm5QL0r for ; Tue, 29 Jan 2013 13:36:13 -0800 (PST) X-Barracuda-Envelope-From: Optimale_pro_intense@digital-connect.fr X-Barracuda-Apparent-Source-IP: 82.97.20.146 DKIM-Signature: v=1; a=rsa-sha1; c=simple; d=digital-connect.fr; h=to :subject:date:from:reply-to:list-unsubscribe:message-id :mime-version:content-type; s=smtp1; bh=4O5zcnbb6dDcmqS1uCm1gSiM J88=; b=nMX58L7iDzymPEAy1NKqvpkf6IES6ptyiPaXH4fHz/Ikkwoc9h4zxHbv ZsHFwS6ReQ7qJNpMEXexNhIZGAPeWp+u7/ynz4jv3hOaV8DicFaoex6FLGoJKbA+ UTHZfQIrDKqdW68ppjwZpTLPdFoo6BSL0dtt4fcPHzE7/aYr9PI= DomainKey-Signature: a=rsa-sha1; c=simple; d=digital-connect.fr; h=to :subject:date:from:reply-to:list-unsubscribe:message-id :mime-version:content-type; q=dns; s=smtp1; b=b7d4XEEU6nzifMsJmo GBnIqGU5vCYFLKP4EOz+jaPbmdIjb9Eo65T9ktK8ZX9ODbjRpsIh8qM1J8rdbNf2 il7qSYN3meJTkkICMJrm9pii9pIWW4uY6NV85Ku6MqhmShsD1OLWENlu6yb5IHrF Q8KDICU0Dsym5aiO9UEQrW0sQ= To: linux-xfs Subject: =?utf-8?Q?Un_acc=C3=A8s_internet_haut_d=C3=A9but_pro_au_bureau_jusqu'a_20?= =?utf-8?Q?_m=C3=A9ga?= Date: Tue, 29 Jan 2013 21:27:54 +0100 X-ASG-Orig-Subj: =?utf-8?Q?Un_acc=C3=A8s_internet_haut_d=C3=A9but_pro_au_bureau_jusqu'a_20?= =?utf-8?Q?_m=C3=A9ga?= From: Optimale Pro Intense Reply-To: Optimale Pro Intense X-campaign_id: 3992957475443083183719661496_34 X-uid_id_m: bGludXgteGZzQG9zcy5zZ2kuY29t=966 List-Unsubscribe: Message-ID: <084c4879f1f1076dda3338d421a74f3f@digital-connect.fr> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Part1_084c4879f1f1076dda3338d421a74f3f" X-Barracuda-Connect: ipsmgbeg.wess-media.com[82.97.20.146] X-Barracuda-Start-Time: 1359495373 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.24 X-Barracuda-Spam-Status: No, SCORE=2.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MPART_ALT_DIFF, URIBL_WS_SURBL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121264 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 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 2.10 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist [URIs: digital-connect.fr] --Part1_084c4879f1f1076dda3338d421a74f3f Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: quoted-printable Pour visualiser et se d=C3=A9sabonner ce message, =20 Veuillez, copier puis coller, l'adresse URL compl=C3=A8te ci-dessous dans= la barre d'adresse de votre navigateur et appuyer sur la touche "Entr=C3=A9e= " de votre clavier. - - - - - - - - - - - - - - - - -=20 http://app.digital-connect.fr/v/?camp=3D3992957475443083183719661496_34&m= s=3DbGludXgteGZzQG9zcy5zZ2kuY29t - - - - - - - - - - - - - - - - -=20 --Part1_084c4879f1f1076dda3338d421a74f3f Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: quoted-printable Un acc=C3=A8s internet haut d=C3=A9but pro au bureau jusqu'a 20 m=C3= =A9ga =
    Si cet email ne s’affiche pas correctement, suivez ce lien.
    3D"Optimale
    3D""
    3D"O=
    =
    3D"Un<= /td>
    3D"79euros
    3D"a=
    =20 = 3D""
    3D"Les
    3D"les
    3D""
    3D"" 3D"rappel 3D""
    <= tr>
    3D""
    Offre soumise à conditions valables en France métr= opolitaine réservée aux professionnels (sur fournitures de = justificatifs d'activité professionnelle) sous réserve d'&e= acute;ligibilité et de compatibilité technique et gé= ographique, et sous réserve de couverture EDGE/3G/3G , Wi-Fi et GP= RS. Les conditions spécifiques et les conditions g&eacut e;nérales d'utilisation des options et services de l'offre sont d= isponibles sur orangepro.fr - La fiche tarifaire en vigueur de l'offre es= t disponible auprès de votre interlocuteur commercial habituel ou = sur orangepro.fr - Voix sur IP, Peer to Peer, streaming vidéo inte= rdits. Le piratage nuit à la création artistique.
    (1) = Durée d'engagement 12mois
    (2) 20€ht/mois offerts pendant = 3 mois : Remise applicable pendant les 3 premiers mois pour toute souscri= ption entre le 05/04/12 et le 06/06/12 d'une offre Optimale pro intense. = Offre réservée aux nouveaux abonnés
    (3) Dé= ;bit dédié internet jusqu'à 20 Méga, selon l'= offre détenue. Débit internet dédié de 512 kb= /s jusqu'à 20 Mb/s en débit descendant et jusqu'à 80= 0kb/s en débit remontant avec livebox compatible, selon l'é= quipement et la localisation géogr aphique du client, sous réserve d'utilisation d'un ordinateur com= patible. Incompatible avec les modems USB, les modems Ethernet et avec l'= option joueurs. Les débits annoncés sont des débits = IP.
    (4) Appels voix illimités 24h/24 7j/7 vers les fixes en Fr= ance métropolitaine et vers les fixes internationaux de plus de 10= 0 pays depuis le téléphone par internet branché sur = la livebox et le téléphone classique. 8 h max/ appel (hors = n° spéciaux, n° services, n° IP à tarification = spécifique et n° en cours de portabilité).
    (5) Forf= ait d'appels illimités depuis les deux lignes fixes vers les mobil= es en France métropolitaine et de plus de 100 destinations. Les co= mmunications illimitées ne sont autorisées que dans la limi= te de 500 correspondants différents par mois
    (6) Liste des des= tinations bénéficiant d'app els illimités : Açores, Afrique du Sud, Alaska, Allemagne,= Andorre, Angleterre (hors n°s prémium commençant par 4= 4870 et 44871), Argentine, Australie, Autriche, Bahamas, BahreÏn, Ba= léares, Bangladesh, Belgique, Bermudes, Brésil, Bruné= ;i, Bulgarie, Canada, Canaries, Chili, Chine, Christmas Islands, Chypre, = Chypre ( Turque ), Colombie, Corée du Sud, Crête, Croatie, D= anemark, Ecosse, Espagne, Estonie, Etats-Unis, Finlande, France mé= tropolitaine, Gibraltar, Grèce, Guadeloupe, Guam, Guernesey, Guyan= e, HawaÏ, Hong Kong, Hongrie, Iles d'Aland, Ile de Pâques, Ile= s Mariannes du Nord (SaÏpan), Iles Vierges américaines, Inde,= Irlande, Irlande du Nord, Islande, Israël, Italie, Japon, Jersey, J= ordanie, Lettonie,Liechstenstein, Lituanie, Luxembourg, Macao, Macé= ;doine, Madère, Malaisie, Malte, Maroc(exclus des appels en illimi= té du Maroc les numéros &ag rave; mobilité réduite commençant par 212526;212527= ,212533, 212534;212546 qui bénéficient de la tarification v= ers mobile), Martinique, Mayotte, Mexique, Monaco, Norvège, Nouvel= le Zélande, Panama, Pays de Galles, Pays Bas, Pérou, Pologn= e, Portugal, Puerto Rico, République Dominicaine, Républiqu= e Tchèque, Réunion, Roumanie, Russie, Saint Pierre et Mique= lon, Saint Barthelemy, Saint Martin, San Marin, Sardaigne, Sicile, Singap= our, Slovaquie, Slovenie, Suède, Suisse, TaÏwan, Tasmanie, Th= aÏlande, Turquie, Vatican, Vénézuela.
    (7) Ré= ;tablissement du service téléphonique les jours ouvrables, = du lundi au samedi, de 8h à 18h (hors dimanches et jours fé= riés), dans les ?24h chrono? qui suivent l'enregistrement de la si= gnalisation.
    (8) Appel gratuit depuis une ligne fixe Orange et depui= s la ligne par Internet de votre offre Op timale pro internet. Si l'appel est passé depuis une ligne d'un a= utre opérateur, consultez ses tarifs. - Le temps d'attente avant l= a mise en relation avec votre conseiller est gratuit, puis facturation au= prix d'une communication locale depuis une ligne fixe Orange et depuis l= a ligne par Internet de votre offre Optimale pro internet. Si l'appel est= passé depuis une ligne d'un autre opérateur, consultez ses= tarifs.
    (9) Option incluse et activée sur demande du client a= vec les forfaits Internet et téléphone pro, Internet everyw= here pro, et Internet pro solo, permettant de disposer d'un service d'adr= esse IP fixe. L'IP fixe est une adresse IP qui changera pas de valeur &ag= rave; chaque connexion et qui est attribué de manière exclu= sive au client.
    (10) Option Nom de Domaine fournie sur demande, &agra= ve; compter du jour de la souscription à une offre internet haut d= ébit pro. Sous réserve d'ac tivation du service Nom de domaine pro, dans les conditions tarifaires e= n vigueur à la date d'activation et dans la limite de la dur&eacut= e;e du contrat internet haut débit pro orange. Frais d'activation = du service inclus en France métropolitaine uniquement. Pour les DO= M, frais d'activation de 5€ HT à la souscription puis disponi= ble pendant toute la durée de votre abonnement à l'offre in= ternet haut débit pro ou bas débit pro
    3D""3D"" Pour se d&eacu= te;sabonner : Suivez ce lien.
    Si ce message vous a causé = un quelconque dérangement, nous vous prions de nous en excuser. --Part1_084c4879f1f1076dda3338d421a74f3f-- From storm9c1@skymagik.com Tue Jan 29 15:48:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8B4C87F4C for ; Tue, 29 Jan 2013 15:48:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B7F28F804C for ; Tue, 29 Jan 2013 13:48:01 -0800 (PST) X-ASG-Debug-ID: 1359496080-04cb6c39121cfcd0001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id g360j9QqB4xCm4Xr for ; Tue, 29 Jan 2013 13:48:00 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0TLlx318263; Tue, 29 Jan 2013 16:47:59 -0500 Received: from 192.104.24.222 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Tue, 29 Jan 2013 16:47:59 -0500 (EST) Message-ID: <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> Date: Tue, 29 Jan 2013 16:47:59 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: In-Reply-To: <5107124E.70607@sandeen.net> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <5107124E.70607@sandeen.net> X-Priority: 3 Importance: Normal Cc: X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359496080 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.2.121267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header In a previous message, Eric Sandeen wrote: > > That's correct. However, I have run xfs root on Centos5, and am > currently running xfs root on RHEL6. On md raid1 in both instances. ;) > Eric, Try it with 5.9 and md raid1. I bet you won't be running it very much longer. ;-) Unless of course you can't reproduce it. > > Just to be absolutely sure, do you have any xfs-kmod or kmod-xfs > installed? If so, remove it. > No kmod. I only use the kmod on 32-bit platforms. As you know, it is not needed on 64-bit. This system is a freshly kickstarted system with only about 200 packages installed (minimal base system just for stability testing): [root@test9][/root]# rpm -qa | fgrep xfs xfsprogs-2.9.4-1.el5.centos xfsdump-2.2.46-1.el5.centos [root@test9][/root]# rpm -qa | fgrep kmod [root@test9][/root]# uname -a Linux test9.xxxx.xxx 2.6.18-348.el5 #1 SMP Tue Jan 8 17:53:53 EST 2013 x86_6 4 x86_64 x86_64 GNU/Linux >> (why I still don't understand, >> since I fixed the issues with Anaconda for myself and can Kickstart >> systems with XFS all day long). > > It's for non-technical reasons. > Hmmm, yeah, well I do understand. ;-) Just drives me nuts. > > so it's hanging on the way down I guess? > > I see: "md: md1 switched to read-only mode" > > Was that there before? Yes. It's the very last thing printed when using any newer 5.X system. Then it's supposed to physically reboot or shutdown. But this is where it hangs. I will reply back to the xfs list (to a message from Ben) later tonight with some more output from the serial console including a traceback. I'll also add these details in the open CentOS bug. > > I don't see anything obvious between the two kernels you mention, and I > can't spend a ton of time digging into this, since most of my day is > taken up supporting the RHEL customers who pay my salary, nudge nudge. > ;) Any help is appreciated. Finding this bug may possibly help ferret out another more possibly nefarious bug, which is why I don't need instant gratification here. I'm only looking to assist with the solution, not cause more stress. The "company" that I work for from 9-5 has an extensive RHEL 5.X and 6.X deployment with Satellite, channels, full support, the whole nine yards. They don't color outside the lines as I do -- they use ext3 for the root filesystem instead. Their loss. :-) So don't worry, said "company" "gives" plenty to the "cause". ;-) However, after 5pm, I do unrelated personal work and projects unrelated to said "company", and one of those things is working with CentOS and Ubuntu. Using XFS quite extensively. > > I'd look at the kernel changelogs for xfs & md, and see if anything > seems plausible. Maybe diff the sources & see what changed, etc. > Yeah, I took a half-hearted look already. But didn't diff any source code yet. I saw a freeze/thaw change and a few other md changes that were suspect. But haven't had a chance to dig deeper. Thanks again. -- Tom From sandeen@sandeen.net Tue Jan 29 15:55:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 944897F4C for ; Tue, 29 Jan 2013 15:55:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 20E4CAC006 for ; Tue, 29 Jan 2013 13:55:17 -0800 (PST) X-ASG-Debug-ID: 1359496516-04cb6c39151cff90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nWuqZ2mA5Sb4lij0 for ; Tue, 29 Jan 2013 13:55:16 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9EEAC63BEEAB; Tue, 29 Jan 2013 15:55:16 -0600 (CST) Message-ID: <51084544.6050907@sandeen.net> Date: Tue, 29 Jan 2013 15:55:16 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Tom CC: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <5107124E.70607@sandeen.net> <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot In-Reply-To: <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> X-Enigmail-Version: 1.5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1359496516 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.2.121267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/29/13 3:47 PM, Tom wrote: > In a previous message, Eric Sandeen wrote: ... >> I don't see anything obvious between the two kernels you mention, and I >> can't spend a ton of time digging into this, since most of my day is >> taken up supporting the RHEL customers who pay my salary, nudge nudge. >> ;) > > Any help is appreciated. Finding this bug may possibly help > ferret out another more possibly nefarious bug, which is why I don't > need instant gratification here. I'm only looking to assist with the > solution, not cause more stress. > > The "company" that I work for from 9-5 has an extensive RHEL 5.X and 6.X > deployment with Satellite, channels, full support, the whole nine yards. > They don't color outside the lines as I do -- they use ext3 for the root > filesystem instead. Their loss. :-) > > So don't worry, said "company" "gives" plenty to the "cause". ;-) > > However, after 5pm, I do unrelated personal work and projects unrelated > to said "company", and one of those things is working with CentOS and > Ubuntu. Using XFS quite extensively. Sorry for hassling you ;) >> >> I'd look at the kernel changelogs for xfs & md, and see if anything >> seems plausible. Maybe diff the sources & see what changed, etc. >> > > Yeah, I took a half-hearted look already. But didn't diff any source > code yet. I saw a freeze/thaw change and a few other md changes that > were suspect. But haven't had a chance to dig deeper. I'd suspect the md changes were the trigger, though maybe it reveals an xfs problem. I don't see anything in xfs that changed which should be causing this. The backtrace will help, I think. Thanks, -Eric > Thanks again. > > -- Tom > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From storm9c1@skymagik.com Tue Jan 29 16:25:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A07587F4E for ; Tue, 29 Jan 2013 16:25:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 805458F8035 for ; Tue, 29 Jan 2013 14:25:28 -0800 (PST) X-ASG-Debug-ID: 1359498327-04bdf0231d1dfd50001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id a6pVcojWWe4c80O5 for ; Tue, 29 Jan 2013 14:25:27 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0TMPQv19445; Tue, 29 Jan 2013 17:25:26 -0500 Received: from 192.104.24.222 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Tue, 29 Jan 2013 17:25:26 -0500 (EST) Message-ID: <22819.192.104.24.222.1359498326.squirrel@secure.skymagik.net> Date: Tue, 29 Jan 2013 17:25:26 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: In-Reply-To: <51084544.6050907@sandeen.net> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <5107124E.70607@sandeen.net> <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> <51084544.6050907@sandeen.net> X-Priority: 3 Importance: Normal Cc: X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359498327 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.2.121269 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header In a previous message, Eric Sandeen wrote: > > Sorry for hassling you ;) > Nah, no problem, I think we all know what it's like in corporate America........ Besides, when hassled, I hassle right on back -- just to ensure that I'm taking a full participating role in the love. :-D Again, your help is appreciated and I'll be happy to give back as much as I can. I've been committed to XFS for 15 years, and RedHat for even longer (way before CentOS existed). And Linux longer yet! For the SGI engineers on this list, I do miss IRIX though... it will always have a special place in my heart -- if only that OS and its tools could have been open sourced... -- Tom From bpm@sgi.com Tue Jan 29 16:39:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 7C4EE7F4E for ; Tue, 29 Jan 2013 16:39:36 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4EAB88F804C; Tue, 29 Jan 2013 14:39:36 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2CBAF4266DC; Tue, 29 Jan 2013 16:39:36 -0600 (CST) Date: Tue, 29 Jan 2013 16:39:36 -0600 From: Ben Myers To: Tom Cc: sandeen@sandeen.net, xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot Message-ID: <20130129223936.GK27055@sgi.com> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <5107124E.70607@sandeen.net> <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> <51084544.6050907@sandeen.net> <22819.192.104.24.222.1359498326.squirrel@secure.skymagik.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <22819.192.104.24.222.1359498326.squirrel@secure.skymagik.net> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Jan 29, 2013 at 05:25:26PM -0500, Tom wrote: > For the SGI engineers on this list, I do miss IRIX though... it will > always have a special place in my heart -- if only that OS and its tools > could have been open sourced... I'm getting all choked up... From tinguely@sgi.com Tue Jan 29 16:41:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 873517F4E for ; Tue, 29 Jan 2013 16:41:36 -0600 (CST) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 660408F8050; Tue, 29 Jan 2013 14:41:36 -0800 (PST) Message-ID: <51085022.9020701@sgi.com> Date: Tue, 29 Jan 2013 16:41:38 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1359492157-30521-1-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 01/29/13 14:42, Brian Foster wrote: > Hi all, > > This patchset fixes a spinlock recursion we've reproduced initially on RHEL > kernels[1]. The problem is that we issue an xfs_log_force() via > xfs_buf_trylock() with the xa_lock held and ultimately drive down into > xlog_assign_tail_lsn(), which attempts to reacquire xa_lock[2]. > > Note that this lockup was difficult to reproduce and I was not able to > reproduce on an upstream kernel without a hack to comment out the pinned buf > check in xfs_buf_item_push() (presumably because the log force itself only > happens when the buf is pinned, so the window here is tight). Interesting. So this a result of a change of the b_pin_count between xfs_buf_ispinned() and xfs_buf_trylock() tests in xfs_buf_item_push()? > > This patchset is what I'm testing to avoid the lockup, but I'm posting this RFC > to get some early thoughts: > > - Patch 1 - Creates a flag to conditionally force the log in xfs_buf_trylock(). > The alternative I considered is to pull out the check and log force and > sprinkle that code amongst the trylock callers. > - Patch 2 - Utilizes the flag created in patch 1 and duplicates the log force > in xfs_buf_item_push() after dropping xa_lock. > > The change in patch 2 makes me wonder how important the immediate flush is in > the context of xfsaild_push(), where we already pend up a flush if the item is > pinned. IOWs, I wonder if replacing what I have now with something like the > following would be acceptable and cleaner: > > if (!__xfs_buf_trylock(bp, false)) { > if (xfs_buf_ispinned(bp) > return XFS_ITEM_PINNED; > return XFS_ITEM_LOCKED; This looks better to me that patch 2. > } > > Thoughts appreciated. > > Brian > > [1] - http://bugzilla.redhat.com/show_bug.cgi?id=896224 > [2] - stacktrace: > > BUG: spinlock recursion on CPU#5, xfsaild/dm-3/2690 > Pid: 2690, comm: xfsaild/dm-3 Not tainted 3.8.0-rc1+ #46 > Call Trace: > [] spin_dump+0x8a/0x8f > [] spin_bug+0x21/0x26 > [] do_raw_spin_lock+0x101/0x150 > [] _raw_spin_lock+0xe/0x10 > [] xlog_assign_tail_lsn+0x25/0x50 [xfs] > [] xlog_state_release_iclog+0x86/0xd0 [xfs] > [] xlog_write+0x569/0x710 [xfs] > [] xlog_cil_push+0x29c/0x3c0 [xfs] > [] ? xfs_buf_get_map+0xf2/0x1b0 [xfs] > [] xlog_cil_force_lsn+0x157/0x160 [xfs] > [] ? xfs_buf_read_map+0x31/0x130 [xfs] > [] ? xfs_trans_read_buf_map+0x279/0x4b0 [xfs] > [] ? __kmalloc+0x15d/0x1b0 > [] _xfs_log_force+0x6d/0x290 [xfs] > [] ? xfs_iflush_cluster+0x25f/0x3d0 [xfs] > [] xfs_log_force+0x39/0xc0 [xfs] > [] xfs_buf_trylock+0xd0/0xe0 [xfs] > [] xfs_buf_item_push+0x39/0xd0 [xfs] > [] ? xfs_inode_item_push+0x8f/0x140 [xfs] > [] xfsaild+0x2e1/0x6e0 [xfs] > [] ? __wake_up_common+0x58/0x90 > [] ? xfs_trans_ail_cursor_first+0xc0/0xc0 [xfs] > [] kthread+0xd8/0xe0 > [] ? flush_kthread_work+0x150/0x150 > [] ret_from_fork+0x7c/0xb0 > [] ? flush_kthread_work+0x150/0x150 > > Brian Foster (2): > xfs: conditionally force log on trylock failure of pinned/stale buf > xfs: drop xa_lock around log force in xfs_buf_item push > > fs/xfs/xfs_buf.c | 8 +++++--- > fs/xfs/xfs_buf.h | 3 ++- > fs/xfs/xfs_buf_item.c | 10 +++++++++- > 3 files changed, 16 insertions(+), 5 deletions(-) > --Mark. From bpm@sgi.com Tue Jan 29 16:44:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 E0C987F47 for ; Tue, 29 Jan 2013 16:44:23 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA0BE30406A; Tue, 29 Jan 2013 14:44:20 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 983A74266DC; Tue, 29 Jan 2013 16:44:20 -0600 (CST) Date: Tue, 29 Jan 2013 16:44:20 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs-oss , =?iso-8859-1?Q?fugazzi=AE?= Subject: Re: [PATCH] xfstests: test dump/restore of file capabilities Message-ID: <20130129224420.GL27055@sgi.com> References: <50E61CC3.1000108@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <50E61CC3.1000108@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Eric, On Thu, Jan 03, 2013 at 06:05:23PM -0600, Eric Sandeen wrote: > xfsrestore isn't properly restoring file capabilities; it restores > them, but then chowns the file, which removes the caps: > > Call Trace: > [] xfs_xattr_set+0x118/0x120 [xfs] > [] generic_removexattr+0x80/0x90 > [] cap_inode_killpriv+0x28/0x30 > [] security_inode_killpriv+0x16/0x20 > [] notify_change+0x18f/0x330 > [] chown_common+0x60/0xa0 > [] sys_fchown+0x80/0xd0 > [] system_call_fastpath+0x16/0x1b > > This test demonstrates the problem. > > Reported-by: fugazzi > Signed-off-by: Eric Sandeen This looks good to me. Reviewed-by: Ben Myers -Ben From jack@suse.cz Tue Jan 29 17:28:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 09C0B7F4C for ; Tue, 29 Jan 2013 17:28:19 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD7B18F804C for ; Tue, 29 Jan 2013 15:28:18 -0800 (PST) X-ASG-Debug-ID: 1359502096-04bdf0231d1e1330001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Zk5HsEEczoYwKOHl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 15:28:17 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 40377A398E; Wed, 30 Jan 2013 00:28:16 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id 9779D20669; Wed, 30 Jan 2013 00:28:05 +0100 (CET) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: [PATCH 0/4 v2] Fix possible use after free with AIO Date: Wed, 30 Jan 2013 00:27:57 +0100 X-ASG-Orig-Subj: [PATCH 0/4 v2] Fix possible use after free with AIO Message-Id: <1359502081-20240-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1359502097 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi, since nobody seem to have picked up any of the patches (at least nobody told me so), I've added acks I received to the patches and I'm sending them to Al for merging. Al, can you please merge these? Thanks. Honza From jack@suse.cz Tue Jan 29 17:28:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 859027F4C for ; Tue, 29 Jan 2013 17:28:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D36A4AC004 for ; Tue, 29 Jan 2013 15:28:18 -0800 (PST) X-ASG-Debug-ID: 1359502096-04cbb00c641c76f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 9DD5r8e83AWDWKNU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 15:28:17 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 9C9BDA51C9; Wed, 30 Jan 2013 00:28:16 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id A2FDF2066B; Wed, 30 Jan 2013 00:28:05 +0100 (CET) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com, Jan Kara , Joel Becker , stable@vger.kernel.org Subject: [PATCH 3/4] ocfs2: Fix possible use-after-free with AIO Date: Wed, 30 Jan 2013 00:28:00 +0100 X-ASG-Orig-Subj: [PATCH 3/4] ocfs2: Fix possible use-after-free with AIO Message-Id: <1359502081-20240-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359502081-20240-1-git-send-email-jack@suse.cz> References: <1359502081-20240-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1359502097 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: Joel Becker CC: ocfs2-devel@oss.oracle.com CC: stable@vger.kernel.org Acked-by: Jeff Moyer Signed-off-by: Jan Kara --- fs/ocfs2/aops.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 6577432..340bd02 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -593,9 +593,9 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, level = ocfs2_iocb_rw_locked_level(iocb); ocfs2_rw_unlock(inode, level); + inode_dio_done(inode); if (is_async) aio_complete(iocb, ret, 0); - inode_dio_done(inode); } /* -- 1.7.1 From jack@suse.cz Tue Jan 29 17:28:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9085D7F4E for ; Tue, 29 Jan 2013 17:28:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DAFD6AC006 for ; Tue, 29 Jan 2013 15:28:18 -0800 (PST) X-ASG-Debug-ID: 1359502096-04cbb00c651c76f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id URXJ3LTZR4dmzlqT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 15:28:17 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 83A92A51B6; Wed, 30 Jan 2013 00:28:16 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id 9D25420668; Wed, 30 Jan 2013 00:28:05 +0100 (CET) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com, Jan Kara , Ben Myers , stable@vger.kernel.org Subject: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Date: Wed, 30 Jan 2013 00:27:59 +0100 X-ASG-Orig-Subj: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Message-Id: <1359502081-20240-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359502081-20240-1-git-send-email-jack@suse.cz> References: <1359502081-20240-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1359502097 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: xfs@oss.sgi.com CC: Ben Myers CC: stable@vger.kernel.org Reviewed-by: Ben Myers Acked-by: Jeff Moyer Signed-off-by: Jan Kara --- fs/xfs/xfs_aops.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4111a40..5f707e5 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -86,11 +86,11 @@ xfs_destroy_ioend( } if (ioend->io_iocb) { + inode_dio_done(ioend->io_inode); if (ioend->io_isasync) { aio_complete(ioend->io_iocb, ioend->io_error ? ioend->io_error : ioend->io_result, 0); } - inode_dio_done(ioend->io_inode); } mempool_free(ioend, xfs_ioend_pool); -- 1.7.1 From jack@suse.cz Tue Jan 29 17:28:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B0CAF7F52 for ; Tue, 29 Jan 2013 17:28:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D5F38F804C for ; Tue, 29 Jan 2013 15:28:18 -0800 (PST) X-ASG-Debug-ID: 1359502096-04cb6c39121d2060001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Q3FJn3w5NfMN03Iq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 15:28:17 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 4DA1CA3B99; Wed, 30 Jan 2013 00:28:16 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id A82002066C; Wed, 30 Jan 2013 00:28:05 +0100 (CET) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com, Jan Kara , Christoph Hellwig , Jens Axboe , Jeff Moyer , stable@vger.kernel.org Subject: [PATCH 4/4] fs: Fix possible use-after-free with AIO Date: Wed, 30 Jan 2013 00:28:01 +0100 X-ASG-Orig-Subj: [PATCH 4/4] fs: Fix possible use-after-free with AIO Message-Id: <1359502081-20240-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359502081-20240-1-git-send-email-jack@suse.cz> References: <1359502081-20240-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1359502097 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: Christoph Hellwig CC: Jens Axboe CC: Jeff Moyer CC: stable@vger.kernel.org Acked-by: Jeff Moyer Signed-off-by: Jan Kara --- fs/direct-io.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index cf5b44b..f853263 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -261,9 +261,9 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is dio->end_io(dio->iocb, offset, transferred, dio->private, ret, is_async); } else { + inode_dio_done(dio->inode); if (is_async) aio_complete(dio->iocb, ret, 0); - inode_dio_done(dio->inode); } return ret; -- 1.7.1 From jack@suse.cz Tue Jan 29 17:28:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C47597F53 for ; Tue, 29 Jan 2013 17:28:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AFADB8F8052 for ; Tue, 29 Jan 2013 15:28:18 -0800 (PST) X-ASG-Debug-ID: 1359502096-04cbb00c661c76f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id B4SV5lctFihmZtHA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 15:28:17 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 7577FA50E4; Wed, 30 Jan 2013 00:28:16 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id 9B3D4205BC; Wed, 30 Jan 2013 00:28:05 +0100 (CET) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com, Jan Kara , "Theodore Ts'o" , stable@vger.kernel.org Subject: [PATCH 1/4] ext4: Fix possible use-after-free with AIO Date: Wed, 30 Jan 2013 00:27:58 +0100 X-ASG-Orig-Subj: [PATCH 1/4] ext4: Fix possible use-after-free with AIO Message-Id: <1359502081-20240-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1359502081-20240-1-git-send-email-jack@suse.cz> References: <1359502081-20240-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1359502097 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Running AIO is pinning inode in memory using file reference. Once AIO is completed using aio_complete(), file reference is put and inode can be freed from memory. So we have to be sure that calling aio_complete() is the last thing we do with the inode. CC: linux-ext4@vger.kernel.org CC: "Theodore Ts'o" CC: stable@vger.kernel.org Reviewed-by: Carlos Maiolino Acked-by: Jeff Moyer Signed-off-by: Jan Kara --- fs/ext4/inode.c | 2 +- fs/ext4/page-io.c | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index cbfe13b..ba06638 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2977,9 +2977,9 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { ext4_free_io_end(io_end); out: + inode_dio_done(inode); if (is_async) aio_complete(iocb, ret, 0); - inode_dio_done(inode); return; } diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 0016fbc..b42d04f 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -103,14 +103,13 @@ static int ext4_end_io(ext4_io_end_t *io) "(inode %lu, offset %llu, size %zd, error %d)", inode->i_ino, offset, size, ret); } - if (io->iocb) - aio_complete(io->iocb, io->result, 0); - - if (io->flag & EXT4_IO_END_DIRECT) - inode_dio_done(inode); /* Wake up anyone waiting on unwritten extent conversion */ if (atomic_dec_and_test(&EXT4_I(inode)->i_unwritten)) wake_up_all(ext4_ioend_wq(inode)); + if (io->flag & EXT4_IO_END_DIRECT) + inode_dio_done(inode); + if (io->iocb) + aio_complete(io->iocb, io->result, 0); return ret; } -- 1.7.1 From bpm@sgi.com Tue Jan 29 18:57:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 9FA967F4E for ; Tue, 29 Jan 2013 18:57:00 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 073228F8039; Tue, 29 Jan 2013 16:56:57 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D70704266DC; Tue, 29 Jan 2013 18:56:56 -0600 (CST) Date: Tue, 29 Jan 2013 18:56:56 -0600 From: Ben Myers To: Jan Kara Cc: Al Viro , stable@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: Re: [PATCH 2/4] xfs: Fix possible use-after-free with AIO Message-ID: <20130130005656.GM27055@sgi.com> References: <1359502081-20240-1-git-send-email-jack@suse.cz> <1359502081-20240-3-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359502081-20240-3-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Jan, On Wed, Jan 30, 2013 at 12:27:59AM +0100, Jan Kara wrote: > Running AIO is pinning inode in memory using file reference. Once AIO > is completed using aio_complete(), file reference is put and inode can > be freed from memory. So we have to be sure that calling aio_complete() > is the last thing we do with the inode. > > CC: xfs@oss.sgi.com > CC: Ben Myers > CC: stable@vger.kernel.org > Reviewed-by: Ben Myers > Acked-by: Jeff Moyer > Signed-off-by: Jan Kara We picked this up in the xfs tree. Sorry to keep you hanging. Regards, Ben From david@fromorbit.com Tue Jan 29 19:04:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 48A657F4E for ; Tue, 29 Jan 2013 19:04:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 833D0AC001 for ; Tue, 29 Jan 2013 17:04:39 -0800 (PST) X-ASG-Debug-ID: 1359507876-04cbb00c641c9900001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id RDwZXrIEGvPQkd5F for ; Tue, 29 Jan 2013 17:04:37 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggFAIhwCFG2/3vK/2dsb2JhbABEhV65JRZzgh4BAQQBJxM/BQsIAw0LCSUPBSg0G4dwBcFEkChhA5YMhhEDijiDC4FUJA Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Jan 2013 11:34:32 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0M6I-0002Dl-O4; Wed, 30 Jan 2013 12:04:30 +1100 Date: Wed, 30 Jan 2013 12:04:30 +1100 From: Dave Chinner To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option Message-ID: <20130130010430.GE7255@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: add agskip=value mount option Mail-Followup-To: rjohnston@sgi.com, xfs@oss.sgi.com References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130129153914.976867239@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1359507876 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.2.121279 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Jan 29, 2013 at 09:39:15AM -0600, rjohnston@sgi.com wrote: > The agskip mount option specifies the allocation group, (AG) for a new > file, relative to the start of the last created file. agskip has the > opposite effect of the rotorstep system tunable parameter. Each > new file to be placed in the location lastAG + agskipValue, > where lastAG is the allocation group of the last created file. > > For example, agskip=3 means each new file will be allocated three AGs away > from the starting AG of the most recently created file. What problem is this intended to solve? What are the limits to useful values of the mount option for solving that problem? > The agskip mount option disables the rotorstep system tunable parameter. I think that's wrong. The both can co-exist, and I can see use cases where you'd actually want both to be active on inode32 systems. Specifying the size of the skip between each "rotorstep" should not disable the number of files in each rotorstep.... > Signed-off-by: Rich Johnston > --- > fs/xfs/xfs_alloc.c | 35 ++++++++++++++++++++++++++++------- > fs/xfs/xfs_filestream.c | 8 +++++++- > fs/xfs/xfs_mount.c | 1 + > fs/xfs/xfs_mount.h | 4 +++- > fs/xfs/xfs_super.c | 13 ++++++++++++- > 5 files changed, 51 insertions(+), 10 deletions(-) > > Index: b/fs/xfs/xfs_alloc.c > =================================================================== > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -2365,12 +2365,20 @@ xfs_alloc_vextent( > * Try near allocation first, then anywhere-in-ag after > * the first a.g. fails. > */ > - if ((args->userdata == XFS_ALLOC_INITIAL_USER_DATA) && > - (mp->m_flags & XFS_MOUNT_32BITINODES)) { > - args->fsbno = XFS_AGB_TO_FSB(mp, > - ((mp->m_agfrotor / rotorstep) % > - mp->m_sb.sb_agcount), 0); > - bump_rotor = 1; > + if (args->userdata == XFS_ALLOC_INITIAL_USER_DATA) { > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { > + spin_lock(&mp->m_agfrotor_lock); > + args->fsbno = XFS_AGB_TO_FSB(mp, > + mp->m_agfrotor, 0); > + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) > + % mp->m_sb.sb_agcount; > + spin_unlock(&mp->m_agfrotor_lock); Why are you changing the inode64 allocator behaviour like this? The whole point of inode64 is that it allocates data close to the owner inode and this breaks that association. Perhaps this modification to the initial data allocation should still only be applied to the inode32 allocator. Indeed, if we want the inode64 allocator to have this behaviour, then we should be applying the agskip parameter to the inode allocator, not the data extent allocator. i.e to the agirotor in xfs_ialloc_next_ag(). This will retain the data/metadata locality properties of the inode64 allocator, yet still give the benefits of an agskip allocation parameter to move the locality of entire directories. .... > @@ -2385,8 +2393,21 @@ xfs_alloc_vextent( > /* > * Start with the last place we left off. > */ > - args->agno = sagno = (mp->m_agfrotor / rotorstep) % > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { > + /* > + * The spinlock makes the combined assignment > + * of args->fsbno and mp->m_agfrotor atomic. > + * mp->m_agfrotor can not be advanced until > + * args->fsbno is assigned. > + */ > + spin_lock(&mp->m_agfrotor_lock); > + sagno = mp->m_agfrotor; > + spin_unlock(&mp->m_agfrotor_lock); There's whitespace damage there, and the comment doesn't make any sense. Reading mp->m_agfrotor will always be an atomic access. Also, there's nothing to stop you getting the "wrong" rotor value here. i.e. thread 1 thread 2 lock calc agfrotor unlock lock calc agfrotor unlock lock sagno = agfrotor unlock lock sagno = agfrotor unlock And hence both allocations end up with the same start AG at twice the distance of the skip value. I doubt this is what you intend. .... > @@ -622,7 +622,13 @@ xfs_filestream_associate( > * Set the starting AG using the rotor for inode32, otherwise > * use the directory inode's AG. > */ > - if (mp->m_flags & XFS_MOUNT_32BITINODES) { > + if (mp->m_flags & XFS_MOUNT_AGSKIP) { > + spin_lock(&mp->m_agfrotor_lock); > + startag = mp->m_agfrotor; > + mp->m_agfrotor = (mp->m_agfrotor + mp->m_agskip) > + % mp->m_sb.sb_agcount; > + spin_unlock(&mp->m_agfrotor_lock); > + } else if (mp->m_flags & XFS_MOUNT_32BITINODES) { > rotorstep = xfs_rotorstep; > startag = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; > mp->m_agfrotor = (mp->m_agfrotor + 1) % Please encapsulate all this agf rotor stuff in helper functions so we don't duplicate logic all over the place... .... > + } else if (!strcmp(this_char, MNTOPT_AGSKIP)) { > + if (!value || !*value) { > + xfs_warn(mp, > + "%s option requires an argument", > + this_char); > + return EINVAL; > + } > + mp->m_flags |= XFS_MOUNT_AGSKIP; > + mp->m_agskip = simple_strtoul(value, &eov, 10); > } else { Hmmm. You don't validate whether the agskip option is valid for the current filesystem configuration. What is a valid value for an arbitrary configuration, and how can the filesystem validate it is sensible? > xfs_warn(mp, "unknown mount option [%s].", this_char); > return EINVAL; > @@ -567,6 +576,8 @@ xfs_showargs( > > if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT)) > seq_puts(m, "," MNTOPT_NOQUOTA); > + if (mp->m_flags & XFS_MOUNT_AGSKIP) > + seq_printf(m, "," MNTOPT_AGSKIP "=%d", mp->m_agskip); > > return 0; > } Overall, I'm wondering if this is the right way to approach this problem. It only really works correctly (in terms of distribution of files/metadata) for fixed volume sizes (i.e. homogenous layouts) - the common case where a skip is useful is after growing a filesystem onto a new volume. It's rare that the new volume is the same as the existing volumes, so it's hard to set a skip value that reliably alternates between old and new volumes. We talked about this allocation distribution problem last march when we met at LSF, and I thought we agreed that pushing agskip/agrotorstep mount options upstream was not the way we were going to solve this problem after I outlined how I planned to solve this problem. Indeed, I already have prototype patches for the AG control ioctls that allow the xfs_spaceman program that associate an AG with an "allocation zone" (an "AZ") and partially written kernel patches that implement AZs, per-AZ agi/agf rotors and higher level AZ iteration in the allocator. (It also allows specification of per-AZ stripe unit/stripe width and other allocation control parameters but those details are little outside the scope of this particular discussion.) IOWs, I'm close to having a significantly more capable and flexible solution to this problem that doesn't require new mount options to be added or on-disk format changes to be made. As such, I'm not sure that we want to introduce a mount option that is only a partial solution to the problem. We basically can't remove mount options once they have been added, so introducing a new mount option just to mark it deprecated in 6 months time seems like a bad idea.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From storm9c1@skymagik.com Tue Jan 29 21:16:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1A1ED7F4E for ; Tue, 29 Jan 2013 21:16:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D019130404E for ; Tue, 29 Jan 2013 19:16:25 -0800 (PST) X-ASG-Debug-ID: 1359515780-04bdf0231b1e5ae0001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id ftBE4rW7tEIL44dE for ; Tue, 29 Jan 2013 19:16:20 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0U3GMI23755; Tue, 29 Jan 2013 22:16:22 -0500 Received: from 75.149.17.233 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Tue, 29 Jan 2013 22:16:20 -0500 (EST) Message-ID: <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> Date: Tue, 29 Jan 2013 22:16:20 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: In-Reply-To: <20130129151833.GF27055@sgi.com> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> X-Priority: 3 Importance: Normal X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359515780 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.2.121287 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, I've update the CentOS bug (http://bugs.centos.org/view.php?id=6217) with the following information: -- More detail about the hang including traceback -- Using 5.9 kernel (348) without md raid: Please stand by while rebooting the system... md: stopping all md devices. Synchronizing SCSI cache for disk sda: Restarting system. .. machine restart (reboots normally) With md raid1: Unmounting pipe file systems: Unmounting file systems: Please stand by while rebooting the system... md: stopping all md devices. md: md2 switched to read-only mode. md: md1 switched to read-only mode. (hang) Traceback: INFO: task reboot:2063 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. reboot D ffff810037df37e0 0 2063 1 19 (NOTLB) ffff81005890ba08 0000000000000082 ffff81005890ba58 ffff81005beb1ea0 0000000000000001 0000000000000007 ffff810058d67040 ffff810037df37e0 000000596dd8a1e6 0000000000003df4 ffff810058d67228 000000008008d76f Call Trace: [] __wake_up+0x38/0x4f [] md_write_start+0xf2/0x108 [] autoremove_wake_function+0x0/0x2e [] get_page_from_freelist+0x380/0x442 [] :raid1:make_request+0x38/0x5d8 [] generic_make_request+0x211/0x228 [] mempool_alloc+0x31/0xe7 [] vsnprintf+0x5d7/0xb54 [] submit_bio+0xe6/0xed [] :xfs:_xfs_buf_ioapply+0x1f2/0x254 [] :xfs:xfs_buf_iorequest+0x39/0x64 [] :xfs:xfs_bdstrat_cb+0x36/0x3a [] :xfs:xfs_bwrite+0x5e/0xba [] :xfs:xfs_syncsub+0x119/0x226 [] :xfs:xfs_fs_sync_super+0x33/0xdd [] quota_sync_sb+0x2e/0xf0 [] __fsync_super+0x1b/0x9e [] fsync_super+0x9/0x16 [] fsync_bdev+0x2a/0x3b [] invalidate_partition+0x28/0x40 [] do_md_stop+0xa0/0x2ec [] md_notify_reboot+0x5f/0x120 [] notifier_call_chain+0x20/0x32 [] blocking_notifier_call_chain+0x22/0x36 [] kernel_restart_prepare+0x18/0x29 [] kernel_restart+0x9/0x46 [] sys_reboot+0x146/0x1c7 [] hrtimer_try_to_cancel+0x4a/0x53 [] hrtimer_cancel+0xc/0x16 [] do_nanosleep+0x47/0x70 [] hrtimer_nanosleep+0x58/0x118 [] hrtimer_wakeup+0x0/0x22 [] sigprocmask+0xb7/0xdb [] sys_nanosleep+0x4c/0x62 [] system_call+0x7e/0x83 Filesystem Size Used Avail Use% Mounted on /dev/md3 4.9G 784M 4.2G 16% / /dev/md2 108M 11M 97M 11% /boot tmpfs 689M 0 689M 0% /dev/shm [root@test9][/root]# swapon -s Filename Type Size Used Priority /dev/md1 partition 2947832 0 -1 [root@test9][/root]# cat /proc/mdstat Personalities : [raid1] md2 : active raid1 sdb1[1] sda1[0] 128384 blocks [2/2] [UU] md1 : active raid1 sdb2[1] sda2[0] 2947840 blocks [2/2] [UU] md3 : active raid1 sdb3[1] sda3[0] 5116608 blocks [2/2] [UU] unused devices: From tytso@thunk.org Tue Jan 29 21:51:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DFD6E7F4E for ; Tue, 29 Jan 2013 21:51:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA8EB8F8050 for ; Tue, 29 Jan 2013 19:51:31 -0800 (PST) X-ASG-Debug-ID: 1359517890-04cb6c39131d6fb0001-NocioJ Received: from imap.thunk.org (li9-11.members.linode.com [67.18.176.11]) by cuda.sgi.com with ESMTP id APkz3h7EHcgb0S7v (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 29 Jan 2013 19:51:30 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 67.18.176.11 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1U0Ohr-0000CE-BU; Wed, 30 Jan 2013 03:51:27 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id E702D3258A7; Tue, 29 Jan 2013 22:51:25 -0500 (EST) Date: Tue, 29 Jan 2013 22:51:25 -0500 From: Theodore Ts'o To: Jan Kara Cc: Al Viro , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com, stable@vger.kernel.org Subject: Re: [PATCH 1/4] ext4: Fix possible use-after-free with AIO Message-ID: <20130130035125.GB25006@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] ext4: Fix possible use-after-free with AIO References: <1359502081-20240-1-git-send-email-jack@suse.cz> <1359502081-20240-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359502081-20240-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) 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: li9-11.members.linode.com[67.18.176.11] X-Barracuda-Start-Time: 1359517890 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121291 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Jan 30, 2013 at 12:27:58AM +0100, Jan Kara wrote: > Running AIO is pinning inode in memory using file reference. Once AIO > is completed using aio_complete(), file reference is put and inode can > be freed from memory. So we have to be sure that calling aio_complete() > is the last thing we do with the inode. > > CC: linux-ext4@vger.kernel.org > CC: "Theodore Ts'o" > CC: stable@vger.kernel.org > Reviewed-by: Carlos Maiolino > Acked-by: Jeff Moyer > Signed-off-by: Jan Kara I've picked up the ext4 change. Sorry for not getting to this sooner. - Ted From anonymous@vps155.lnx.vps.isx.net.nz Tue Jan 29 23:10:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=HTML_IMAGE_ONLY_12, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY,T_REMOTE_IMAGE 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 CB0FA7F4E for ; Tue, 29 Jan 2013 23:10:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D4898F8050 for ; Tue, 29 Jan 2013 21:10:10 -0800 (PST) X-ASG-Debug-ID: 1359522608-04bdf0231a1e7a00001-NocioJ Received: from server2.greengecko.co.nz (server2.ddm.co.nz [210.5.53.148]) by cuda.sgi.com with ESMTP id 0y8GwngrC2ec67D1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 21:10:09 -0800 (PST) X-Barracuda-Envelope-From: anonymous@vps155.lnx.vps.isx.net.nz X-Barracuda-Apparent-Source-IP: 210.5.53.148 Received: (qmail 14213 invoked by uid 33); 30 Jan 2013 15:17:34 +1300 Date: 30 Jan 2013 15:17:34 +1300 To: xfs@oss.sgi.com Subject: -- Your 2012 Benefit -- From: Australian Taxation Office X-ASG-Orig-Subj: -- Your 2012 Benefit -- Message-Id: <1307461003.23@emailn.de> MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit X-Barracuda-Connect: server2.ddm.co.nz[210.5.53.148] X-Barracuda-Start-Time: 1359522608 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: 2.68 X-Barracuda-Spam-Status: No, SCORE=2.68 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_ONLY_12, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.63 HTML_IMAGE_ONLY_12 BODY: HTML: images with 800-1200 bytes of words 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag http://www.ato.gov.au/solutionImages/ATOlogo_.gif

    We at the Australian Taxation Office would like to inform you that, you have qualified for 2013,
    subsidy benefits.

    Simply reply to this secure message with the following details below
    and you will be notified shortly.


    Family Name:
    Given Name/s:
    Address:
    Suburb/Town:
    State/Territory:
    Postcode:
    Tax File Number:
    Date of Birth (DD/MM/YYYY):
    Telephone Number:


    2013 Commonwealth of Australia | Australian Taxation Office From david@fromorbit.com Wed Jan 30 00:06:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4D00D7F4E for ; Wed, 30 Jan 2013 00:06:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3C9978F8052 for ; Tue, 29 Jan 2013 22:05:57 -0800 (PST) X-ASG-Debug-ID: 1359525954-04cb6c39131d95e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KXfgaN2ajUVIZuwO for ; Tue, 29 Jan 2013 22:05:54 -0800 (PST) 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: AggFALO2CFG2/3vK/2dsb2JhbAA8CIVeuS4Wc4IeAQEFJxM/EAgDDQEGBAklDwUoIRMbh3XBK40ag28DlgyGEQODPIZ8gws Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Jan 2013 16:35:53 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0Qnv-0008OX-Vs; Wed, 30 Jan 2013 17:05:51 +1100 Date: Wed, 30 Jan 2013 17:05:51 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Message-ID: <20130130060551.GG7255@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Mail-Followup-To: Brian Foster , xfs@oss.sgi.com References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359492157-30521-1-git-send-email-bfoster@redhat.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: 1359525954 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.2.121299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 29, 2013 at 03:42:35PM -0500, Brian Foster wrote: > Hi all, > > This patchset fixes a spinlock recursion we've reproduced initially on RHEL > kernels[1]. The problem is that we issue an xfs_log_force() via > xfs_buf_trylock() with the xa_lock held and ultimately drive down into > xlog_assign_tail_lsn(), which attempts to reacquire xa_lock[2]. > > Note that this lockup was difficult to reproduce and I was not able to > reproduce on an upstream kernel without a hack to comment out the pinned buf > check in xfs_buf_item_push() (presumably because the log force itself only > happens when the buf is pinned, so the window here is tight). > > This patchset is what I'm testing to avoid the lockup, but I'm posting this RFC > to get some early thoughts: > > - Patch 1 - Creates a flag to conditionally force the log in xfs_buf_trylock(). > The alternative I considered is to pull out the check and log force and > sprinkle that code amongst the trylock callers. > - Patch 2 - Utilizes the flag created in patch 1 and duplicates the log force > in xfs_buf_item_push() after dropping xa_lock. > > The change in patch 2 makes me wonder how important the immediate flush is in > the context of xfsaild_push(), where we already pend up a flush if the item is > pinned. IOWs, I wonder if replacing what I have now with something like the > following would be acceptable and cleaner: > > if (!__xfs_buf_trylock(bp, false)) { > if (xfs_buf_ispinned(bp) > return XFS_ITEM_PINNED; > return XFS_ITEM_LOCKED; > } > > Thoughts appreciated. I haven't had time to really think about this, but I'll say up front that I don't really like the fix. The log force in xfs_buf_trylock() was added here: commit 90810b9e82a36c3c57c1aeb8b2918b242a130b26 Author: Dave Chinner Date: Tue Nov 30 15:16:16 2010 +1100 xfs: push stale, pinned buffers on trylock failures As reported by Nick Piggin, XFS is suffering from long pauses under highly concurrent workloads when hosted on ramdisks. The problem is that an inode buffer is stuck in the pinned state in memory and as a result either the inode buffer or one of the inodes within the buffer is stopping the tail of the log from being moved forward. The system remains in this state until a periodic log force issued by xfssyncd causes the buffer to be unpinned. The main problem is that these are stale buffers, and are hence held locked until the transaction/checkpoint that marked them state has been committed to disk. When the filesystem gets into this state, only the xfssyncd can cause the async transactions to be committed to disk and hence unpin the inode buffer. This problem was encountered when scaling the busy extent list, but only the blocking lock interface was fixed to solve the problem. Extend the same fix to the buffer trylock operations - if we fail to lock a pinned, stale buffer, then force the log immediately so that when the next attempt to lock it comes around, it will have been unpinned. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig And the initial commit that introduced this dependency was this: commit ed3b4d6cdc81e8feefdbfa3c584614be301b6d39 Author: Dave Chinner Date: Fri May 21 12:07:08 2010 +1000 xfs: Improve scalability of busy extent tracking .... The only problem with this approach is that when a metadata buffer is marked stale (e.g. a directory block is removed), then buffer remains pinned and locked until the log goes to disk. The issue here is that if that stale buffer is reallocated in a subsequent transaction, the attempt to lock that buffer in the transaction will hang waiting the log to go to disk to unlock and unpin the buffer. Hence if someone tries to lock a pinned, stale, locked buffer we need to push on the log to get it unlocked ASAP. Effectively we are trading off a guaranteed log force for a much less common trigger for log force to occur. .... So essentially what is happening here is that we are trying to lock a stale buffer in the AIL to flush it. Well, we can't flush it from the AIL, and indeed the next line of code is this: if (!xfs_buf_trylock(bp)) return XFS_ITEM_LOCKED; >>>>> ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); The only reason this ASSERT is not firing is that we are failing to lock stale buffers. Hence we are relying on the failed lock to force the log, instead of detecting that we need to force the log after we drop the AIL lock and letting the caller handle it. So, wouldn't a better solution be to do something like simply like: + if (bp->b_flags & XBF_STALE) + return XFS_ITEM_PINNED; + if (!xfs_buf_trylock(bp)) return XFS_ITEM_LOCKED; Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Wed Jan 30 02:54:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A365B7F4E for ; Wed, 30 Jan 2013 02:54:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33D12AC001 for ; Wed, 30 Jan 2013 00:54:53 -0800 (PST) X-ASG-Debug-ID: 1359536091-04cbb00c661d2340001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 2xJCNGVWPklJfa6Z for ; Wed, 30 Jan 2013 00:54:52 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C3CE86C0B9 for ; Wed, 30 Jan 2013 02:54:51 -0600 (CST) Message-ID: <5108DFE0.2060908@hardwarefreak.com> Date: Wed, 30 Jan 2013 02:54:56 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <5107124E.70607@sandeen.net> <20821.192.104.24.222.1359496079.squirrel@secure.skymagik.net> <51084544.6050907@sandeen.net> <22819.192.104.24.222.1359498326.squirrel@secure.skymagik.net> X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot In-Reply-To: <22819.192.104.24.222.1359498326.squirrel@secure.skymagik.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1359536092 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 1/29/2013 4:25 PM, Tom wrote: > For the SGI engineers on this list, I do miss IRIX though... it will > always have a special place in my heart -- if only that OS and its tools > could have been open sourced... Much of the differentiating/unique technology has been. XFS and its user space tools obviously. Lesser known is that Paul Jackson and others at SGI contributed the basic NUMA scalability code to Linux during the Linux Scalability Effort in the early 2000s, based heavily on IRIX concepts. This included cpumemsets, directly taken from IRIX IIRC, which evolved into Linux mainline cpusets. This effort was necessary to get Linux to scale on Altix NUMALink systems with up to 512 sockets, as well as IBM's Xeon based x440 NUMA box with up to 16 sockets, HP's cell based Itanium systems w/32 sockets, and clones of HP's cell design used by the likes of Bull, Unisys, NEC, and others. This work later turned out to be of great benefit to the market at large, as the underpinnings were already in place when AMD launched Opteron, whose 2/4/8 socket platforms use HT NUMA interconnects. Same for Intel when it finally went NUMA with QuickPath. This infrastructure also allowed for a relatively easy implementation of multi-core support on single and multi-socket systems. AIUI, from articles, not first hand experience, is that what did not make it into Linux was the tendency of some SGI engineers to write bloated inefficient code with unnecessarily large data structures. This occurred because IRIX developers were working on 8-32 CPU systems (or larger) with 8-32GB (or more) of RAM, and weren't concerned with single processor performance or memory efficiency, as they had massive resources available. When the scalability concepts were brought over to Linux, they were bolted onto the mantra of maximum single processor performance and small memory footprint, and we got the best of both worlds, without the previous IRIX overhead. I recall reading an article from that period which described an early Linux porting effort to Origin/MIPS. This was a 16-way machine used as a development mule to get Linux working on NUMALink, ready for Altix/Itanium. It was described that even before any NUMA scalability work began, with a large number of operations the stock SMP Linux kernel was much faster than IRIX on this 16 CPU origin box. "Amazing" is a description I recall. It had been assumed Linux would be a dog since it was optimized for small systems. It turns out it worked just as well on the big ones, due to said small system optimizations. So in some respects it's probably better that IRIX simply was abandoned, with some of the best parts making it into Linux. -- Stan From viro@ftp.linux.org.uk Wed Jan 30 08:45:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9DC807F4E for ; Wed, 30 Jan 2013 08:45:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E4DEAC001 for ; Wed, 30 Jan 2013 06:45:41 -0800 (PST) X-ASG-Debug-ID: 1359557138-04bdf0231d21aa90001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id qG3szGro0F77ZLqC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Jan 2013 06:45:39 -0800 (PST) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1U0Yut-0005Tv-Qq; Wed, 30 Jan 2013 14:45:35 +0000 Date: Wed, 30 Jan 2013 14:45:35 +0000 From: Al Viro To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: Re: [PATCH 0/4 v2] Fix possible use after free with AIO Message-ID: <20130130144535.GK4503@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH 0/4 v2] Fix possible use after free with AIO References: <1359502081-20240-1-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1359502081-20240-1-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1359557139 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Jan 30, 2013 at 12:27:57AM +0100, Jan Kara wrote: > > Hi, > > since nobody seem to have picked up any of the patches (at least > nobody told me so), I've added acks I received to the patches and I'm > sending them to Al for merging. Al, can you please merge these? Thanks. VFS part (4/4) picked; IMO at least ext* and xfs should go through the filesystem trees. If ocfs2 folks don't pick fs/ocfs2 part, I'll grab it as well - not sure how active their tree is these days... From bfoster@redhat.com Wed Jan 30 10:05:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 92E827F4E for ; Wed, 30 Jan 2013 10:05:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 71BFD8F804B for ; Wed, 30 Jan 2013 08:05:07 -0800 (PST) X-ASG-Debug-ID: 1359561906-04cb6c3914210dc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pQvhsr5474PA1MAu; Wed, 30 Jan 2013 08:05:06 -0800 (PST) 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 r0UG4sjj002575 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Jan 2013 11:04:55 -0500 Received: from laptop.bfoster (vpn-56-97.rdu2.redhat.com [10.10.56.97]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0UG4rDm001004 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 30 Jan 2013 11:04:54 -0500 Message-ID: <51094423.8000703@redhat.com> Date: Wed, 30 Jan 2013 11:02:43 -0500 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Mark Tinguely CC: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> <20130130060551.GG7255@disturbed.disaster> <5109291E.6090303@sgi.com> X-ASG-Orig-Subj: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push In-Reply-To: <5109291E.6090303@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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: 1359561906 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 (added Dave and the list back on CC) On 01/30/2013 09:07 AM, Mark Tinguely wrote: > On 01/30/13 00:05, Dave Chinner wrote: >> On Tue, Jan 29, 2013 at 03:42:35PM -0500, Brian Foster wrote: ... > >> So essentially what is happening here is that we are trying to lock >> a stale buffer in the AIL to flush it. Well, we can't flush it from >> the AIL, and indeed the next line of code is this: >> >> if (!xfs_buf_trylock(bp)) >> return XFS_ITEM_LOCKED; >> >>>>>>> ASSERT(!(bip->bli_flags& XFS_BLI_STALE)); >> >> The only reason this ASSERT is not firing is that we are failing to >> lock stale buffers. Hence we are relying on the failed lock to force >> the log, instead of detecting that we need to force the log after we >> drop the AIL lock and letting the caller handle it. >> >> So, wouldn't a better solution be to do something like simply like: >> >> + if (bp->b_flags& XBF_STALE) >> + return XFS_ITEM_PINNED; >> + >> if (!xfs_buf_trylock(bp)) >> return XFS_ITEM_LOCKED; ... > Thanks guys. This certainly looks nicer than messing with the lock wrapper, but is it susceptible to the same problem? In other words, does this fix the problem or just tighten the window? I'm going to go back to my original reproduction case and enable some select tracepoints to try and get a specific sequence of events, but given the code as it is, the problem seems to be that the buffer goes from !pinned to pinned between the time we actually check for pinned and try the buf lock. So if the buf lock covers the pinned state (e.g., buffer gets locked, added to a transaction, the transaction gets committed and pins and unlocks the buffer, IIUC) and the stale state (buf gets locked, added to a new transaction and inval'd before the original transaction was written ?), but we don't hold the buf lock in xfs_buf_item_push(), how can we guarantee the state of either doesn't change between the time we check the flags and the time the lock fails? > Makes sense. It would prevent the lock recursion. The more that I think > about, we do not want to release xa_lock during an AIL scan. > FWIW, the other log item abstractions appear to use this model (e.g., xfs_inode_item_push()), where it appears safe to drop xa_lock once the actual object lock/ref is acquired and reacquire xa_lock before returning. It looks like this behavior was introduced in: 43ff2122 xfs: on-stack delayed write buffer lists Brian > We would still want to see if the buffer is re-pinned (and not STALE) to > the AIL. > > --Mark. From scampbell@museum.vic.gov.au Wed Jan 30 11:37:07 2013 Return-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=EXTRA_MPART_TYPE, TVD_PH_BODY_ACCOUNTS_PRE 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 30BAD7F4E for ; Wed, 30 Jan 2013 11:37:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6D45AC004 for ; Wed, 30 Jan 2013 09:37:03 -0800 (PST) X-ASG-Debug-ID: 1359567416-04cb6c3914215dd0001-NocioJ Received: from ironport.museum.vic.gov.au (ironport.museum.vic.gov.au [136.154.202.225]) by cuda.sgi.com with ESMTP id Buh3DK5EHwFpsYXF for ; Wed, 30 Jan 2013 09:36:57 -0800 (PST) X-Barracuda-Envelope-From: scampbell@museum.vic.gov.au X-Barracuda-Apparent-Source-IP: 136.154.202.225 X-IronPort-AV: E=Sophos;i="4.84,569,1355058000"; d="scan'208,145";a="3040828" Received: from rakali.mv.vic.gov.au ([136.154.22.125]) by ironport1.mv.vic.gov.au with ESMTP; 31 Jan 2013 04:36:55 +1100 Received: from RAKALI.mv.vic.gov.au ([136.154.22.125]) by RAKALI.mv.vic.gov.au ([136.154.22.125]) with mapi; Thu, 31 Jan 2013 04:36:24 +1100 From: "Campbell, Sarah" To: "info@webadmin.com" Content-Class: urn:content-classes:message Date: Thu, 31 Jan 2013 04:36:23 +1100 Subject: Re: Your Webmail Account Certificate expired on the 29th-01-2013 Thread-Topic: Your Webmail Account Certificate expired on the 29th-01-2013 X-ASG-Orig-Subj: Re: Your Webmail Account Certificate expired on the 29th-01-2013 Thread-Index: AQHN/xBSQbJpPrc1PUeuOvKSQ9DVbg== Message-ID: Accept-Language: en-US, en-AU Content-Language: en-AU X-MS-Has-Attach: yes X-MS-TNEF-Correlator: acceptlanguage: en-US, en-AU Content-Type: multipart/related; boundary="_002_FD0FCA1296784949899C8D4F9DB52312151F274215RAKALImvvicgo_"; type="text/plain" MIME-Version: 1.0 X-Barracuda-Connect: ironport.museum.vic.gov.au[136.154.202.225] X-Barracuda-Start-Time: 1359567416 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: 2.02 X-Barracuda-Spam-Status: No, SCORE=2.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_MV0174, EXTRA_MPART_TYPE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121344 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 2.00 BSF_SC7_MV0174 Custom rule MV0174 --_002_FD0FCA1296784949899C8D4F9DB52312151F274215RAKALImvvicgo_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable ATTN: Web Account Owner, Your Webmail account Certificate expired on the 29th-01-2013, This may inte= rrupt your email delivery configuration, and account POP settings, page error when sen= ding message. To re-new your webmail Certificate, Please take a second to update your rec= ords by following the reference link below https://docs.google.com/a/insidehighered.com/spreadsheet/viewform?formkey= =3DdDhGaXFLY0E4bVZxdHlMZkFRdlhsN0E6MQ<= https://docs.google.com/a/insidehighered.com/spreadsheet/viewform?formkey= =3DdDdOVWhBVC02TG1LWDdFRGNCMnVmTWc6MQ> Once the information provided matches what is on our record, Your account will work as normal after the verification process, and Your webmail Account Certificate will be re-newed. Sincerely, Mail Service Team. Museums Board of Victoria ABN 63 640 679 155 is endorsed as a Deductible Gi= ft Recipient. All gifts of $2 or more are tax deductible. [cid:image8127cf.jpg@7411d467.d6394655] Melbourne Museum Major Tourist Attraction museumvictoria.com.au This e-mail is solely for the named addressee and may be confidential. You = should only read, disclose, transmit, copy, distribute, act in reliance on = or commercialise the contents if you are authorised to do so. If you are no= t the intended recipient of this e-mail, please notify postmaster@museum.vi= c.gov.au by email immediately, or not= ify the sender and then destroy any copy of this message. Views expressed i= n this email are those of the individual sender, except where specifically = stated to be those of an officer of Museum Victoria. Museum Victoria does n= ot represent, warrant or guarantee that the integrity of this communication= has been maintained nor that it is free from errors, virus or interference= . Please consider the environment before printing this email. --_002_FD0FCA1296784949899C8D4F9DB52312151F274215RAKALImvvicgo_ Content-Type: image/jpeg; name="image8127cf.jpg@7411d467.d6394655" Content-Description: image8127cf.jpg@7411d467.d6394655 Content-Disposition: inline; filename="image8127cf.jpg@7411d467.d6394655"; size=2845; creation-date="Wed, 30 Jan 2013 17:36:27 GMT"; modification-date="Wed, 30 Jan 2013 17:36:27 GMT" Content-ID: Content-Transfer-Encoding: base64 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 --_002_FD0FCA1296784949899C8D4F9DB52312151F274215RAKALImvvicgo_-- From bpm@sgi.com Wed Jan 30 12:18:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 2054E7F4E for ; Wed, 30 Jan 2013 12:18:50 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5D74304075; Wed, 30 Jan 2013 10:18:46 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A7A814266DC; Wed, 30 Jan 2013 12:18:46 -0600 (CST) Date: Wed, 30 Jan 2013 12:18:46 -0600 From: Ben Myers To: Eric Sandeen Cc: xfs-oss , =?iso-8859-1?Q?fugazzi=AE?= Subject: Re: [PATCH] xfstests: test dump/restore of file capabilities Message-ID: <20130130181846.GN27055@sgi.com> References: <50E61CC3.1000108@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <50E61CC3.1000108@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Jan 03, 2013 at 06:05:23PM -0600, Eric Sandeen wrote: > xfsrestore isn't properly restoring file capabilities; it restores > them, but then chowns the file, which removes the caps: > > Call Trace: > [] xfs_xattr_set+0x118/0x120 [xfs] > [] generic_removexattr+0x80/0x90 > [] cap_inode_killpriv+0x28/0x30 > [] security_inode_killpriv+0x16/0x20 > [] notify_change+0x18f/0x330 > [] chown_common+0x60/0xa0 > [] sys_fchown+0x80/0xd0 > [] system_call_fastpath+0x16/0x1b > > This test demonstrates the problem. > > Reported-by: fugazzi > Signed-off-by: Eric Sandeen Applied. From SRS0=HPZi=LX=wellsfargo.com=customeralert@srs.kundenserver.de Wed Jan 30 13:56:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=HTML_IMAGE_ONLY_16, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E04A47F4E for ; Wed, 30 Jan 2013 13:56:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61ACEAC004 for ; Wed, 30 Jan 2013 11:56:49 -0800 (PST) X-ASG-Debug-ID: 1359575802-04cb6c39152254f0001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.9]) by cuda.sgi.com with ESMTP id pZA9QBCyL4FrO6MN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 30 Jan 2013 11:56:43 -0800 (PST) X-Barracuda-Envelope-From: SRS0=HPZi=LX=wellsfargo.com=customeralert@srs.kundenserver.de X-Barracuda-Apparent-Source-IP: 212.227.17.9 Received: from icpu2579.kundenserver.de (infong-es95.1and1.es [212.227.221.19]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0LuFoB-1V1eFK3WUx-011nBu; Wed, 30 Jan 2013 20:56:41 +0100 Received: from 41.71.147.187 (IP may be forged by CGI script) by icpu2579.kundenserver.de with HTTP id 4AQlpl-1UFxhJ3F4i-00Jpch; Wed, 30 Jan 2013 20:56:41 +0100 X-Sender-Info: <424687285@icpu2579.kundenserver.de> Date: Wed, 30 Jan 2013 20:56:41 +0100 Message-Id: <4AQlpl-1UFxhJ3F4i-00Jpch@icpu2579.kundenserver.de> Precedence: bulk To: xfs@oss.sgi.com Subject: Verify Your Online Banking Information From: Wells Fargo Bank X-ASG-Orig-Subj: Verify Your Online Banking Information MIME-Version: 1.0 Content-Type: text/html X-Provags-ID: V02:K0:yBTM1fPFHq8fK2v5T+LYShEHLFU0LRizF7uZYAv7GY9 G6d+YFAyuFcv3GxEN2bHgbaJfk8GweCX/IdM9MvgawCgeO90L0 JO5BI/E78D+9Kg51PBhTyOx6aVhPi2cGWyomduEZrWgMFMm09t JjEq4GdAQ6MYCFFd2eiIFqNgeYmmZS2+tSo7IVZKqJEP12UGCj t2xPdMb5wg3SDl5tq9vllrtKCGNJLiVJsGczfjS+oRU/laGAUj GkFPr1zt/ZvjDyBDxqOQXQwyidfJsLbZT2z1eRh51O4XfC/aAV 8YWWpYCrFgQqz/fQNrmsLkkMX9OjP+uHT3BYfIhO3MpISo0a0u uq6jwHMUM21SNllx1rDKpZq9zKyR4CbNgK13Rtv3ba6StwPuVC WyjAeG3VYZQnoR4g4U3muQ0+Hcmq/3uFuiBoJ8kFddmqgbhLkC hceN8pQJ4R3iEKNreWwGjR4xWvxwa44YPj6GBy1/bLCHVWfBFl ZnDTFeealUOcv5ecrio9CjPxOHpfzo9Ik17OFvPFQ== X-Barracuda-Connect: moutng.kundenserver.de[212.227.17.9] X-Barracuda-Start-Time: 1359575803 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.83 X-Barracuda-Spam-Status: No, SCORE=0.83 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_IMAGE_ONLY_16, HTML_MESSAGE, MIME_HTML_ONLY, TVD_PH_SUBJ_META X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121354 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TVD_PH_SUBJ_META TVD_PH_SUBJ_META 0.20 BSF_SC0_SA038b Custom Rule SA038b Wells Fargo Letter

    Wells Fargo logo

    Dear Valuable Customers,

    Your new statement is now available online

    The new statement for your account is now available to view online.

    To access your statement, go to Statements and Documents.

    Keeping your financial information secure is one of our most important responsibilities.


    Wells Fargo Security Team
    (If you have questions about your account, please refer to the contact information on your statement. )
    (For questions about viewing your statements online, Wells Fargo Customer Service is available 24 hours a day, 7 days a week at 1-800-956-4442 or by secure email.)

    From SRS0=HPZi=LX=wellsfargo.com=customeralert@srs.kundenserver.de Wed Jan 30 14:27:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=HTML_IMAGE_ONLY_16, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F1BD47F4E for ; Wed, 30 Jan 2013 14:27:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DEC16304059 for ; Wed, 30 Jan 2013 12:27:26 -0800 (PST) X-ASG-Debug-ID: 1359577644-04cb6c3914227000001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.171]) by cuda.sgi.com with ESMTP id C44no2RsoauJHqRG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 30 Jan 2013 12:27:25 -0800 (PST) X-Barracuda-Envelope-From: SRS0=HPZi=LX=wellsfargo.com=customeralert@srs.kundenserver.de X-Barracuda-Apparent-Source-IP: 212.227.126.171 Received: from icpu2579.kundenserver.de (infong-es95.1and1.es [212.227.221.19]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0Lq2eS-1Ue7sC0kK0-00dkLc; Wed, 30 Jan 2013 21:27:24 +0100 Received: from 41.71.147.187 (IP may be forged by CGI script) by icpu2579.kundenserver.de with HTTP id 4Ar8QH-1U7I4y0SqW-00B61l; Wed, 30 Jan 2013 21:27:24 +0100 X-Sender-Info: <424687285@icpu2579.kundenserver.de> Date: Wed, 30 Jan 2013 21:27:24 +0100 Message-Id: <4Ar8QH-1U7I4y0SqW-00B61l@icpu2579.kundenserver.de> Precedence: bulk To: xfs@oss.sgi.com Subject: Verify Your Online Banking Information From: Wells Fargo Bank X-ASG-Orig-Subj: Verify Your Online Banking Information MIME-Version: 1.0 Content-Type: text/html X-Provags-ID: V02:K0:LJdaMkW7myRGlw9KLzXxpMQQB4+9zfIKeNKQ8zR37EV ijCiohPqV4SXGZOS0Sj49m50pPU3Co75xdGoSM4dkq/UL0QIo8 8EQA/Yb26+PqRy9S/EzQrTtf2KFeIZnuIa7PKbJvZUr7dPCKwZ 6GbFW+CVLkj/FPcPsEma+5/A5LyhS8q1wo2E6yIMPB0uCM7+v5 5PGgLSss0zAnBNFnMHqTaE6WVH10t/7luqrXHonYe20df/kI11 8k9GM8HQc3XVzWq/TCRST5MZe5f/Ghb+Z8+69veA4U/qfwH6Z4 0cx4iwFyB+6oZtLxIP81jWa2sy8zRD+DDXHZSy99ludP2BajW2 oXT8oUSdPhwLTn9R5iNy5BUVDgPK6yHWICo6bVlCzHKI8D+ClY jg+BzIdc0qWRi1ZZF5Wc0H1mV2VN0HkP+d2aB7WmfHf+h93S+S 0wbftpxgayw0Ays4CI+mNdCwSyU57sFb/4PS1wJKiE9NDCgu18 JqB7jgb80T2bbOB/CrSYtbuArVKg8nqPo6kCjomww== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.171] X-Barracuda-Start-Time: 1359577645 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.83 X-Barracuda-Spam-Status: No, SCORE=0.83 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_IMAGE_ONLY_16, HTML_MESSAGE, MIME_HTML_ONLY, TVD_PH_SUBJ_META X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121356 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TVD_PH_SUBJ_META TVD_PH_SUBJ_META 0.20 BSF_SC0_SA038b Custom Rule SA038b Wells Fargo Letter

    Wells Fargo logo

    Dear Valuable Customers,

    Your new statement is now available online

    The new statement for your account is now available to view online.

    To access your statement, go to Statements and Documents.

    Keeping your financial information secure is one of our most important responsibilities.


    Wells Fargo Security Team
    (If you have questions about your account, please refer to the contact information on your statement. )
    (For questions about viewing your statements online, Wells Fargo Customer Service is available 24 hours a day, 7 days a week at 1-800-956-4442 or by secure email.)

    From jayden@cox.net Wed Jan 30 14:59:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F0BDA7F4E for ; Wed, 30 Jan 2013 14:59:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FA44AC004 for ; Wed, 30 Jan 2013 12:59:08 -0800 (PST) X-ASG-Debug-ID: 1359579545-04bdf0231e239a60001-NocioJ Received: from mx.kvazar-micro.ru (mx.kvazar-micro.ru [212.248.90.203]) by cuda.sgi.com with ESMTP id vNFRSQSrRUnYheuT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Jan 2013 12:59:07 -0800 (PST) X-Barracuda-Envelope-From: jayden@cox.net X-Barracuda-Apparent-Source-IP: 212.248.90.203 Received: from loft2120.serverloft.de ([85.25.176.169] helo=static-ip-85-25-182-79.inaddr.ip-pool.com) by mx.kvazar-micro.ru with esmtpa (Exim 4.69) (envelope-from ) id 1U0ekK-0005AF-Iv; Thu, 31 Jan 2013 00:59:04 +0400 Message-ID: <47C559E168E747C6A9B230944A47A30B@fjikg> Reply-To: =?windows-1251?B?0PPq7uLu5Ojy5ev8IPHy8O7o8uXr/O379SDv?= =?windows-1251?B?8O7l6vLu4g==?= From: =?windows-1251?B?0PPq7uLu5Ojy5ev8IPHy8O7o8uXr/O379SDv?= =?windows-1251?B?8O7l6vLu4g==?= To: , , , Subject: =?windows-1251?B?ze7i++Ug8vDl4e7i4O3o/yD96vHv6/Pg8uD2?= =?windows-1251?B?6Ogg5+Tg7ejpIOgg8e7u8PPm5e3o6Q==?= Date: Wed, 30 Jan 2013 12:59:00 -0800 X-ASG-Orig-Subj: =?windows-1251?B?ze7i++Ug8vDl4e7i4O3o/yD96vHv6/Pg8uD2?= =?windows-1251?B?6Ogg5+Tg7ejpIOgg8e7u8PPm5e3o6Q==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0505_01CDFEE9.9268A8E0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mx.kvazar-micro.ru[212.248.90.203] X-Barracuda-Start-Time: 1359579546 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_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121358 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_0505_01CDFEE9.9268A8E0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =ED=E0 =FD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB=E9= =CA=D3=D0=D1 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6=C8= =C8: =C3=D0=C0=C4=CE=D1=D2=D0=CE=C8=D2=C5=CB=DC=CD=CE=C5 =C7=C0=CA=CE=CD=CE=C4= =C0=D2=C5=CB=DC=D1=D2=C2=CE =C2 2013 =C3=CE=C4=D3 =CD=CE=D0=CC=C0=D2=C8=C2=CD=C0=DF =C1=C0=C7=C0 =D1=D2=D0=CE=C8=D2=C5=CB=DC= =D1=D2=C2=C0 =CD=EE=E2=FB=E5 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF =FD=EA=F1=EF=EB=F3=E0=F2=E0= =F6=E8=E8 =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9 I8 - 2l =F4=E5=E2=F0=E0=EB=FF 2OI=E7 =E3=EE=E4=E0, =D1=E0=ED=EA=F2-=CF=E5= =F2=E5=F0=E1=F3=F0=E3 =CD=E5=EA=EE=F2=EE=F0=FB=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=EE=E3=F0=E0=EC=EC= =FB: 1. =C8=E7=EC=E5=ED=E5=ED=E8=FF =C3=F0=E0=E4=EE=F1=F2=F0=EE=E8=F2=E5=EB=FC= =ED=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =E2 2O1=C7 =E3=EE=E4=F3. 2. =CD=EE=E2=FB=E5 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF =FD=EA=F1=EF=EB=F3=E0=F2= =E0=F6=E8=E8 =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9 3. =C2=E7=E0=E8=EC=EE=EE=F2=ED=EE=F8=E5=ED=E8=E5 =F3=F7=E0=F1=F2=ED=E8=EA= =EE=E2 =E8=ED=E2=E5=F1=F2=E8=F6=E8=EE=ED=ED=EE-=F1=F2=F0=EE=E8=F2=E5=EB=FC= =ED=EE=E3=EE =EF=F0=EE=F6=E5=F1=F1=E0. 4. =CD=EE=F0=EC=E0=F2=E8=E2=ED=E0=FF =E1=E0=E7=E0 =E4=E5=FF=F2=E5=EB=FC=ED= =EE=F1=F2=E8 =E7=E0=F1=F2=F0=EE=E9=F9=E8=EA=E0, =F2=E5=F5=ED=E8=F7=E5=F1=EA= =EE=E3=EE =E7=E0=EA=E0=E7=F7=E8=EA=E0. 5. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 6. =D1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC =F2=E5=F5= =ED=E8=F7=E5=F1=EA=EE=E3=EE =E7=E0=EA=E0=E7=F7=E8=EA=E0. 7. =CE =F1=E8=F1=F2=E5=EC=E5 =E8 =F1=F2=F0=F3=EA=F2=F3=F0=E5 =E3=EE=F1=F3= =E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5 =ED=E0=E4=E7=EE=F0=ED=FB=F5 =EE=F0=E3=E0= =ED=EE=E2, =E8=F5 =E7=E0=E4=E0=F7=E0=F5, =F4=F3=ED=EA=F6=E8=FF=F5 =E8 =EF= =F0=E0=E2=E0=F5. =CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =E2=FB=F1=FB=EB=E0=E5=F2=F1= =FF =EF=EE =E7=E0=EF=F0=EE=F1=F3. =CE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE= =F2=E5=EB=E5=F4=EE=ED=F3: +7 ( =CF=E5=F2=E5=F0=E1=F3=F0=E3 ) 6=D72 * 0=F7 .. =E77 = =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC =EA =C2=E0=EC =E8 =C2=E0=F8=E5=E9 =F0=E0=E1= =EE=F2=E5, =F1=EE=F2=F0=F3=E4=ED=E8=EA=E8 =D6=E5=ED=F2=F0=E0 =CF=EE=E4=E3=EE=F2=EE=E2= =EA=E8 =D1=EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2 =F2=E5=EB.: +7 ( =CF=E5=F2=E5=F0=E1=F3=F0=E3 ) 642 - o=F7 .= . =C77 =20 ------=_NextPart_000_0505_01CDFEE9.9268A8E0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    =CF=F0=E8=E3=EB=E0=F8=E0=E5= =EC =ED=E0 =FD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB=E9 =CA=D3=D0=D1=20 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6=C8=C8:<= /DIV>
     
    =C3=D0=C0=C4=CE=D1=D2=D0=CE= =C8=D2=C5=CB=DC=CD=CE=C5 =C7=C0=CA=CE=CD=CE=C4=C0=D2=C5=CB=DC=D1=D2=C2=CE= =C2=20 2013 =C3=CE=C4=D3
    =CD=CE=D0=CC=C0=D2=C8=C2=CD=C0=DF =C1=C0=C7=C0 =D1=D2= =D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=C0
    =CD=EE=E2=FB=E5 =F2=F0=E5=E1=EE=E2=E0= =ED=E8=FF =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8=20 =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9
     
    I8 -=20 2l =F4=E5=E2=F0=E0=EB=FF=20 2OI=E7 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
     
    =CD=E5=EA=EE=F2=EE=F0=FB=E5= =E2=EE=EF=F0=EE=F1=FB =EF=F0=EE=E3=F0=E0=EC=EC=FB:
    1.=20 =C8=E7=EC=E5=ED=E5=ED=E8=FF =C3=F0=E0=E4=EE=F1=F2=F0=EE=E8=F2=E5=EB=FC=ED= =EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =E2=20 2O1=C7 =E3=EE=E4=F3.
    2. =CD=EE=E2=FB=E5=20 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E7=E4= =E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9
    3. =C2=E7=E0=E8=EC=EE=EE= =F2=ED=EE=F8=E5=ED=E8=E5 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2=20 =E8=ED=E2=E5=F1=F2=E8=F6=E8=EE=ED=ED=EE-=F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE= =E3=EE =EF=F0=EE=F6=E5=F1=F1=E0.
    4. =CD=EE=F0=EC=E0=F2=E8=E2=ED=E0=FF = =E1=E0=E7=E0 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8=20 =E7=E0=F1=F2=F0=EE=E9=F9=E8=EA=E0, =F2=E5=F5=ED=E8=F7=E5=F1=EA=EE=E3=EE =E7= =E0=EA=E0=E7=F7=E8=EA=E0.
    5. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =EF=F0= =EE=E5=EA=F2=ED=EE=E9=20 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8
    6. =D1=F2=F0=EE=E8=F2=E5=EB=FC=ED= =FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC =F2=E5=F5=ED=E8=F7=E5=F1=EA=EE=E3=EE =E7=E0= =EA=E0=E7=F7=E8=EA=E0.
    7. =CE =F1=E8=F1=F2=E5=EC=E5=20 =E8 =F1=F2=F0=F3=EA=F2=F3=F0=E5 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB= =F5 =ED=E0=E4=E7=EE=F0=ED=FB=F5 =EE=F0=E3=E0=ED=EE=E2, =E8=F5 =E7=E0=E4=E0= =F7=E0=F5, =F4=F3=ED=EA=F6=E8=FF=F5 =E8=20 =EF=F0=E0=E2=E0=F5.
     
    =CF=EE=EB=ED=E0=FF =EF=F0=EE= =E3=F0=E0=EC=EC=E0 =E2=FB=F1=FB=EB=E0=E5=F2=F1=FF =EF=EE =E7=E0=EF=F0=EE=F1= =F3.=20 =CE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:
    +7= ( =CF=E5=F2=E5=F0=E1=F3=F0=E3 ) 6=D72 * 0=F7 .. =E77
     
    =D1 =F3=E2=E0=E6=E5=ED=E8=E5= =EC =EA =C2=E0=EC =E8 =C2=E0=F8=E5=E9=20 =F0=E0=E1=EE=F2=E5,
    =F1=EE=F2=F0=F3=E4=ED=E8=EA=E8 =D6=E5=ED=F2=F0=E0 = =CF=EE=E4=E3=EE=F2=EE=E2=EA=E8=20 =D1=EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2
    =F2=E5=EB.:  +7 ( =CF=E5= =F2=E5=F0=E1=F3=F0=E3 ) 642 - o=F7 .. =C77
    ------=_NextPart_000_0505_01CDFEE9.9268A8E0-- From david@fromorbit.com Wed Jan 30 15:59:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CC4AD7F4E for ; Wed, 30 Jan 2013 15:59:42 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C9D18F8039 for ; Wed, 30 Jan 2013 13:59:39 -0800 (PST) X-ASG-Debug-ID: 1359583176-04bdf0231e23c9e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id k2fYKZJULA2EXHiz for ; Wed, 30 Jan 2013 13:59:37 -0800 (PST) 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: Ap8EAPaWCVGWy/cZ/2dsb2JhbAA9CLs8g2lzgh4BAQQBJxM/BQsIAw4KCSUPBSghLodwBcIHjRwBgw5hA5JagzKJUIZ8gwuBUw Received: from j23res25.anu.edu.au (HELO disturbed) ([150.203.247.25]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Jan 2013 08:29:36 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0fgs-0001vp-Fk; Thu, 31 Jan 2013 08:59:34 +1100 Date: Thu, 31 Jan 2013 08:59:34 +1100 From: Dave Chinner To: Brian Foster Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Message-ID: <20130130215934.GB32297@disturbed.disaster> X-ASG-Orig-Subj: Re: [PATCH RFC 0/2] fix spinlock recursion on xa_lock in xfs_buf_item_push Mail-Followup-To: Brian Foster , Mark Tinguely , xfs@oss.sgi.com References: <1359492157-30521-1-git-send-email-bfoster@redhat.com> <20130130060551.GG7255@disturbed.disaster> <5109291E.6090303@sgi.com> <51094423.8000703@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51094423.8000703@redhat.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: 1359583177 X-Barracuda-URL: http://192.48.157.11: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.2.121362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Jan 30, 2013 at 11:02:43AM -0500, Brian Foster wrote: > (added Dave and the list back on CC) > > On 01/30/2013 09:07 AM, Mark Tinguely wrote: > > On 01/30/13 00:05, Dave Chinner wrote: > >> On Tue, Jan 29, 2013 at 03:42:35PM -0500, Brian Foster wrote: > ... > > > >> So essentially what is happening here is that we are trying to lock > >> a stale buffer in the AIL to flush it. Well, we can't flush it from > >> the AIL, and indeed the next line of code is this: > >> > >> if (!xfs_buf_trylock(bp)) > >> return XFS_ITEM_LOCKED; > >> > >>>>>>> ASSERT(!(bip->bli_flags& XFS_BLI_STALE)); > >> > >> The only reason this ASSERT is not firing is that we are failing to > >> lock stale buffers. Hence we are relying on the failed lock to force > >> the log, instead of detecting that we need to force the log after we > >> drop the AIL lock and letting the caller handle it. > >> > >> So, wouldn't a better solution be to do something like simply like: > >> > >> + if (bp->b_flags& XBF_STALE) > >> + return XFS_ITEM_PINNED; > >> + > >> if (!xfs_buf_trylock(bp)) > >> return XFS_ITEM_LOCKED; > ... > > > > Thanks guys. This certainly looks nicer than messing with the lock > wrapper, but is it susceptible to the same problem? In other words, does > this fix the problem or just tighten the window? That's what I need to think about more - the only difference here is that we are checking the flag before the down_trylock() instead of after.... > So if the buf lock covers the pinned state (e.g., buffer gets locked, > added to a transaction, the transaction gets committed and pins and > unlocks the buffer, IIUC) and the stale state (buf gets locked, added to > a new transaction and inval'd before the original transaction was > written ?), but we don't hold the buf lock in xfs_buf_item_push(), how > can we guarantee the state of either doesn't change between the time we > check the flags and the time the lock fails? ... but the order of them being set and checked may be significant and hence checking the stale flag first might be sufficient to avoid the pin count race and hence the log force. Hence this might just need a pair of memory barriers - one here and one in xfs_buf_stale() - to ensure that we always see the XBF_STALE flag without needing to lock the buffer first. > > Makes sense. It would prevent the lock recursion. The more that I think > > about, we do not want to release xa_lock during an AIL scan. > > > > FWIW, the other log item abstractions appear to use this model (e.g., > xfs_inode_item_push()), where it appears safe to drop xa_lock once the > actual object lock/ref is acquired and reacquire xa_lock before > returning. Right. We can't hold the AIL while doing blocking lock operations because the AIL lock is an innermost lock. That's fundamentally the cause of this problem - the trylock is doing more work that we can allow in the context that it is being called in... We also do not hold the AIL lock for the entire traversal as long holds of the AIL lock result in serialisation across the entire transaction subsystem. A successful IOP_PUSH() typically drops and reacquires the AIL lock, but a failure doesn't. Hence we limit the number of failed pushes under a single traversal so that we don't spend a long time holding the lock doing no work and instead back off and try again later.... Cheers, Dave. -- Dave Chinner david@fromorbit.come From bpm@sgi.com Wed Jan 30 16:51:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 860F47F4E for ; Wed, 30 Jan 2013 16:51:28 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55C988F8050; Wed, 30 Jan 2013 14:51:25 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2D73D4266DC; Wed, 30 Jan 2013 16:51:25 -0600 (CST) Date: Wed, 30 Jan 2013 16:51:25 -0600 From: Ben Myers To: Tom Cc: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot Message-ID: <20130130225125.GO27055@sgi.com> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Tom, On Tue, Jan 29, 2013 at 10:16:20PM -0500, Tom wrote: > I've update the CentOS bug (http://bugs.centos.org/view.php?id=6217) with > the following information: > > > -- More detail about the hang including traceback -- > > Using 5.9 kernel (348) without md raid: > Please stand by while rebooting the system... > md: stopping all md devices. > Synchronizing SCSI cache for disk sda: > Restarting system. > .. > machine restart > (reboots normally) > > > With md raid1: > Unmounting pipe file systems: > Unmounting file systems: > Please stand by while rebooting the system... > md: stopping all md devices. > md: md2 switched to read-only mode. > md: md1 switched to read-only mode. > (hang) > > Traceback: > INFO: task reboot:2063 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > reboot D ffff810037df37e0 0 2063 1 19 > (NOTLB) > ffff81005890ba08 0000000000000082 ffff81005890ba58 ffff81005beb1ea0 > 0000000000000001 0000000000000007 ffff810058d67040 ffff810037df37e0 > 000000596dd8a1e6 0000000000003df4 ffff810058d67228 000000008008d76f > Call Trace: > [] __wake_up+0x38/0x4f > [] md_write_start+0xf2/0x108 > [] autoremove_wake_function+0x0/0x2e > [] get_page_from_freelist+0x380/0x442 > [] :raid1:make_request+0x38/0x5d8 > [] generic_make_request+0x211/0x228 > [] mempool_alloc+0x31/0xe7 > [] vsnprintf+0x5d7/0xb54 > [] submit_bio+0xe6/0xed I think you should consider copying linux-raid@vger.kernel.org. Did you have a chance to get the sysrq output? It would be helpful to see the other tasks on your machine. Regards, Ben From bpm@sgi.com Wed Jan 30 17:32:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_RP_MATCHES_RCVD 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 35DD67F4E for ; Wed, 30 Jan 2013 17:32:07 -0600 (CST) Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F9A68F8039; Wed, 30 Jan 2013 15:32:04 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D0BD74266DC; Wed, 30 Jan 2013 17:32:03 -0600 (CST) Date: Wed, 30 Jan 2013 17:32:03 -0600 From: Ben Myers To: Dave Chinner Cc: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: add agskip=value mount option Message-ID: <20130130233203.GP27055@sgi.com> References: <20130129153914.801475275@sgi.com> <20130129153914.976867239@sgi.com> <20130130010430.GE7255@disturbed.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130130010430.GE7255@disturbed.disaster> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Wed, Jan 30, 2013 at 12:04:30PM +1100, Dave Chinner wrote: > On Tue, Jan 29, 2013 at 09:39:15AM -0600, rjohnston@sgi.com wrote: > > The agskip mount option specifies the allocation group, (AG) for a new > > file, relative to the start of the last created file. agskip has the > > opposite effect of the rotorstep system tunable parameter. Each > > new file to be placed in the location lastAG + agskipValue, > > where lastAG is the allocation group of the last created file. > > > > For example, agskip=3 means each new file will be allocated three AGs away > > from the starting AG of the most recently created file. > > Overall, I'm wondering if this is the right way to approach this > problem. We'll have to make sure we all understand the problem we're trying to solve with this before going too far. > It only really works correctly (in terms of distribution of > files/metadata) for fixed volume sizes (i.e. homogenous layouts) - > the common case where a skip is useful is after growing a filesystem > onto a new volume. It's rare that the new volume is the same as the > existing volumes, so it's hard to set a skip value that reliably > alternates between old and new volumes. Based upon what I've read so far on the internal bug when this was introduced, this is more about being able to utilize all allocation groups in a filesystem with many concats. It's not so much related to balance after growing a filesystem (which is another interesting problem). The info should be added to this series and be reposted. > We talked about this allocation distribution problem last march when > we met at LSF, and I thought we agreed that pushing > agskip/agrotorstep mount options upstream was not the way we were > going to solve this problem after I outlined how I planned to solve > this problem. If we can come up with something better, that's great. But AFAICT the problem still needs to be addressed. This is just one way to do it. > Indeed, I already have prototype patches for the AG control ioctls > that allow the xfs_spaceman program that associate an AG with an > "allocation zone" (an "AZ") and partially written kernel > patches that implement AZs, per-AZ agi/agf rotors and higher level AZ > iteration in the allocator. > > (It also allows specification of per-AZ stripe unit/stripe width and > other allocation control parameters but those details are little > outside the scope of this particular discussion.) Cool. > IOWs, I'm close to having a significantly more capable and flexible > solution to this problem that doesn't require new mount options to > be added or on-disk format changes to be made. As such, I'm not sure > that we want to introduce a mount option that is only a partial > solution to the problem. We basically can't remove mount options > once they have been added, so introducing a new mount option just to > mark it deprecated in 6 months time seems like a bad idea.... I'm looking forward to seeing it. ;) In the meantime we'll get a conversation started as to how to resolve this particular problem.... once we have a better understanding of it. Regards, Ben From david@fromorbit.com Wed Jan 30 17:47:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6860D7F50 for ; Wed, 30 Jan 2013 17:47:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C35BFAC001 for ; Wed, 30 Jan 2013 15:46:59 -0800 (PST) X-ASG-Debug-ID: 1359589617-04cb6c391222fbb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id z33UeBCCECsyQRQ8 for ; Wed, 30 Jan 2013 15:46:58 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av8EAPKuCVG2/3vK/2dsb2JhbABFvxAWc4IeAQEEATo/BQsIAw0LCSUPBSghE4gLBcF6kCthA5YMhhEDijiDCw Received: from unknown (HELO disturbed) ([182.255.123.202]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Jan 2013 10:16:56 +1030 Received: from dave by disturbed with local (Exim 4.80) (envelope-from ) id 1U0hMg-0002rR-Ra; Thu, 31 Jan 2013 10:46:50 +1100 Date: Thu, 31 Jan 2013 10:46:50 +1100 From: Dave Chinner To: Tom Cc: xfs@oss.sgi.com Subject: Re: XFS appears to cause strange hang with md raid1 on reboot Message-ID: <20130130234650.GE32297@disturbed.disaster> X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot Mail-Followup-To: Tom , xfs@oss.sgi.com References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1359589617 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.2.121368 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jan 29, 2013 at 10:16:20PM -0500, Tom wrote: > With md raid1: > Unmounting pipe file systems: > Unmounting file systems: So the filesystems are unmounted.... > Please stand by while rebooting the system... > md: stopping all md devices. > md: md2 switched to read-only mode. > md: md1 switched to read-only mode. > (hang) > > Traceback: > INFO: task reboot:2063 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > reboot D ffff810037df37e0 0 2063 1 19 > (NOTLB) > ffff81005890ba08 0000000000000082 ffff81005890ba58 ffff81005beb1ea0 > 0000000000000001 0000000000000007 ffff810058d67040 ffff810037df37e0 > 000000596dd8a1e6 0000000000003df4 ffff810058d67228 000000008008d76f > Call Trace: > [] __wake_up+0x38/0x4f > [] md_write_start+0xf2/0x108 > [] autoremove_wake_function+0x0/0x2e > [] get_page_from_freelist+0x380/0x442 > [] :raid1:make_request+0x38/0x5d8 > [] generic_make_request+0x211/0x228 > [] mempool_alloc+0x31/0xe7 > [] vsnprintf+0x5d7/0xb54 > [] submit_bio+0xe6/0xed > [] :xfs:_xfs_buf_ioapply+0x1f2/0x254 > [] :xfs:xfs_buf_iorequest+0x39/0x64 > [] :xfs:xfs_bdstrat_cb+0x36/0x3a > [] :xfs:xfs_bwrite+0x5e/0xba > [] :xfs:xfs_syncsub+0x119/0x226 > [] :xfs:xfs_fs_sync_super+0x33/0xdd > [] quota_sync_sb+0x2e/0xf0 > [] __fsync_super+0x1b/0x9e > [] fsync_super+0x9/0x16 > [] fsync_bdev+0x2a/0x3b > [] invalidate_partition+0x28/0x40 > [] do_md_stop+0xa0/0x2ec And this says the filesystem is still mounted. Why? Cheers, Dave. -- Dave Chinner david@fromorbit.com From lizefan@huawei.com Wed Jan 30 20:11:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 36D6F7F4E for ; Wed, 30 Jan 2013 20:11:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11C9E304059 for ; Wed, 30 Jan 2013 18:11:26 -0800 (PST) X-ASG-Debug-ID: 1359598281-04bdf0231b248250001-NocioJ Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [119.145.14.65]) by cuda.sgi.com with ESMTP id FgOywGMS5TUHRFID for ; Wed, 30 Jan 2013 18:11:22 -0800 (PST) X-Barracuda-Envelope-From: lizefan@huawei.com X-Barracuda-Apparent-Source-IP: 119.145.14.65 Received: from 172.24.2.119 (EHLO szxeml212-edg.china.huawei.com) ([172.24.2.119]) by szxrg02-dlp.huawei.com (MOS 4.3.4-GA FastPath queued) with ESMTP id AWN06360; Thu, 31 Jan 2013 10:10:29 +0800 (CST) Received: from SZXEML413-HUB.china.huawei.com (10.82.67.152) by szxeml212-edg.china.huawei.com (172.24.2.181) with Microsoft SMTP Server (TLS) id 14.1.323.7; Thu, 31 Jan 2013 10:10:16 +0800 Received: from [10.135.68.215] (10.135.68.215) by smtpscn.huawei.com (10.82.67.152) with Microsoft SMTP Server (TLS) id 14.1.323.7; Thu, 31 Jan 2013 10:10:17 +0800 Message-ID: <5109D289.1050708@huawei.com> Date: Thu, 31 Jan 2013 10:10:17 +0800 From: Li Zefan User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Al Viro CC: Jan Kara , , , , Subject: Re: [PATCH 0/4 v2] Fix possible use after free with AIO References: <1359502081-20240-1-git-send-email-jack@suse.cz> <20130130144535.GK4503@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH 0/4 v2] Fix possible use after free with AIO In-Reply-To: <20130130144535.GK4503@ZenIV.linux.org.uk> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.135.68.215] X-CFilter-Loop: Reflected X-Barracuda-Connect: szxga02-in.huawei.com[119.145.14.65] X-Barracuda-Start-Time: 1359598281 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121378 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 2013/1/30 22:45, Al Viro wrote: > On Wed, Jan 30, 2013 at 12:27:57AM +0100, Jan Kara wrote: >> >> Hi, >> >> since nobody seem to have picked up any of the patches (at least >> nobody told me so), I've added acks I received to the patches and I'm >> sending them to Al for merging. Al, can you please merge these? Thanks. > > VFS part (4/4) picked; IMO at least ext* and xfs should go through the > filesystem trees. If ocfs2 folks don't pick fs/ocfs2 part, I'll grab > it as well - not sure how active their tree is these days... I would say just grab it. We've been sending bug fixes to ocfs2 mailing list since Aug 2012, but none was pushed into upstream. From storm9c1@skymagik.com Wed Jan 30 20:30:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 37B5C7F4E for ; Wed, 30 Jan 2013 20:30:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B76C4AC002 for ; Wed, 30 Jan 2013 18:30:14 -0800 (PST) X-ASG-Debug-ID: 1359599410-04cbb00c6422e8d0001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id 2I8dZ6NUXosrxOMX for ; Wed, 30 Jan 2013 18:30:10 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0V2UCB13961; Wed, 30 Jan 2013 21:30:12 -0500 Received: from 75.149.17.233 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Wed, 30 Jan 2013 21:30:10 -0500 (EST) Message-ID: <45702.75.149.17.233.1359599410.squirrel@secure.skymagik.net> Date: Wed, 30 Jan 2013 21:30:10 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: In-Reply-To: <20130130234650.GE32297@disturbed.disaster> References: <32271.192.104.24.222.1359415698.squirrel@secure.skymagik.net> <20130129151833.GF27055@sgi.com> <42720.75.149.17.233.1359515780.squirrel@secure.skymagik.net> <20130130234650.GE32297@disturbed.disaster> X-Priority: 3 Importance: Normal X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359599410 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.2.121380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In a previous message, Dave Chinner wrote: > > And this says the filesystem is still mounted. Why? > Good question. As mentioned in the CentOS bug report, this is a freshly Kickstarted CentOS 5.9 system, staged with minimal packages. I'm not running any third party daemons or anything like that. I could wipe the system and re-kickstart it again over and over, and the problem will exist with 5.9 and the 348 kernel. I can also repeat this on any x86 based platform with nothing special, no hardware RAID controllers, just generic SATA or SCSI disks. Doesn't happen with any previous CentOS kernels. Also mentioned, if I take a 5.8 system, which is running correctly, and upgrade the kernel from 308 to 348, the problem shows up with the new kernel. If I downgrade 5.9 to 308, the problem is resolved as well. Also if I use ext3 with md raid1, there is no problem either. That's why in my mind, all roads lead to some interaction between XFS and md raid. Of course I could be off with that assessment. My next email will contain the "sysrq t" output that Ben requested. Thanks! -- Tom From storm9c1@skymagik.com Wed Jan 30 20:34:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BC7A87F4E for ; Wed, 30 Jan 2013 20:34:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A82F630405F for ; Wed, 30 Jan 2013 18:34:36 -0800 (PST) X-ASG-Debug-ID: 1359599673-04cb6c3913236360001-NocioJ Received: from thunder.skymagik.net (thunder.skymagik.net [76.75.207.68]) by cuda.sgi.com with ESMTP id 2r2LKPeEWDVCyWtx for ; Wed, 30 Jan 2013 18:34:33 -0800 (PST) X-Barracuda-Envelope-From: storm9c1@skymagik.com X-Barracuda-Apparent-Source-IP: 76.75.207.68 Received: (from www@localhost) by thunder.skymagik.net (8.11.6/8.11.6/SkyMagik) id r0V2YXN14130; Wed, 30 Jan 2013 21:34:33 -0500 Received: from 75.149.17.233 (SquirrelMail authenticated user storm9c1) by secure.skymagik.net with HTTP; Wed, 30 Jan 2013 21:34:33 -0500 (EST) Message-ID: <45719.75.149.17.233.1359599673.squirrel@secure.skymagik.net> Date: Wed, 30 Jan 2013 21:34:33 -0500 (EST) Subject: Re: XFS appears to cause strange hang with md raid1 on reboot From: "Tom" X-ASG-Orig-Subj: Re: XFS appears to cause strange hang with md raid1 on reboot To: X-Priority: 3 Importance: Normal X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: thunder.skymagik.net[76.75.207.68] X-Barracuda-Start-Time: 1359599673 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.2.121380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In a previous message, Ben Myers wrote: > Hi Tom, > Hi Ben, > > I think you should consider copying linux-raid@vger.kernel.org. > That will be next if you think it's appropriate. Problem is that we know how the RHEL/CentOS kernel is... > Did you have a chance to get the sysrq output? It would be helpful to > see the other tasks on your machine. Your wish is my command: Script started on Wed 30 Jan 2013 09:12:25 PM EST Stopping sshd: [ OK ] Shutting down postfix: [ OK ] Shutting down ntpd: [ OK ] Killing mdmonitor: [ OK ] Stopping mcstransd: [ OK ] Stopping portmap: [ OK ] Shutting down restorecond: [ OK ] Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Starting killall: [ OK ] Sending all processes the TERM signal... Sending all processes the KILL signal... Saving random seed: Syncing hardware clock to system time Turning off swap: Unmounting pipe file systems: Unmounting file systems: Please stand by while rebooting the system... md: stopping all md devices. md: md2 switched to read-only mode. md: md1 switched to read-only mode. telnet> send brk t SysRq : Show State sibling task PC pid father child younger older init S ffff810005e36420 0 1 0 2 (NOTLB) ffff81005be95a28 0000000000000086 00000000000002d0 ffff81005acfc3b4 0000000000000292 000000000000000a ffff81005be8c7a0 ffffffff8031cb60 000000444e0246a5 0000000000002014 ffff81005be8c988 0000000088061262 Call Trace: [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] do_select+0x3dc/0x43c [] __pollwait+0x0/0xe2 [] default_wake_function+0x0/0xe [] avc_alloc_node+0x3a/0x187 [] avc_has_perm_noaudit+0x213/0x38a [] avc_has_perm+0x46/0x58 [] avc_has_perm+0x46/0x58 [] inode_has_perm+0x56/0x63 [] __link_path_walk+0xf10/0xf39 [] core_sys_select+0x1bc/0x265 [] mntput_no_expire+0x19/0x89 [] cp_new_stat+0xe5/0xfd [] sys_select+0x153/0x17c [] system_call+0x7e/0x83 migration/0 S 0000000000000000 0 2 1 3 (L-TLB) ffff81005be99ea0 0000000000000046 ffff81005be8c040 ffff81005be8c078 ffffffff8031c800 0000000000000001 ffff81005be8c040 ffff81005be8e7e0 00000004ce553f1e 000000000000056a ffff81005be8c228 000000005be95cc0 Call Trace: [] migration_thread+0x1a1/0x239 [] migration_thread+0x0/0x239 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 ksoftirqd/0 S ffff810005e36420 0 3 1 4 2 (L-TLB) ffff81005be9ded0 0000000000000046 ffff81005be8e7e0 ffff810037fef820 0000003cd0ba4d94 000000000000000a ffff81005be8e7e0 ffffffff8031cb60 0000003fec6ce025 000000000000759f ffff81005be8e9c8 000000008008e8b8 Call Trace: [] ksoftirqd+0x0/0xbf [] ksoftirqd+0x3b/0xbf [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 watchdog/0 S ffff810005e36420 0 4 1 5 3 (L-TLB) ffff81005be9fec0 0000000000000046 0000000000000000 ffff810037d104d0 ffffffffffffffff 0000000000000001 ffff81005be8e080 ffffffff8031cb60 000000444e9a79f3 0000000000000197 ffff81005be8e268 00000000800a8484 Call Trace: [] watchdog+0x0/0x5f [] watchdog+0x4f/0x5f [] watchdog+0x0/0x5f [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 events/0 S ffff810005e36420 0 5 1 6 4 (L-TLB) ffff81005b907e70 0000000000000046 ffff810005e38920 ffff810005e38950 0000000300000000 000000000000000a ffff810037fef820 ffffffff8031cb60 00000044547f155f 000000000000950c ffff810037fefa08 000000008002e4bc Call Trace: [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 khelper S ffff810037d34780 0 6 1 19 5 (L-TLB) ffff810037f4be70 0000000000000046 ffff8100560bdcc8 ffff810037f4a000 0000000300000000 000000000000000a ffff810037fef0c0 ffff810059d80820 0000000ff1eecf8d 0000000000007485 ffff810037fef2a8 000000008002e4bc Call Trace: [] __call_usermodehelper+0x0/0x4f [] run_workqueue+0xcd/0xfb [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kthread S ffff810037d34740 0 19 1 23 2050 6 (L-TLB) ffff81005b911e70 0000000000000046 000000000000072e ffff810057275d68 0000000300000000 000000000000000a ffff810037fc87e0 ffff810059490860 0000000eb6ada09a 0000000000000eba ffff810037fc89c8 000000008002e4bc Call Trace: [] keventd_create_kthread+0x0/0xc4 [] run_workqueue+0xcd/0xfb [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kblockd/0 S ffff810037dfb820 0 23 19 24 (L-TLB) ffff81005b973e70 0000000000000046 ffffffff801554bc ffffffff8014a6e7 0000000300000000 000000000000000a ffff81005b969860 ffff810037dfb820 0000003fec6c5835 0000000000000f02 ffff81005b969a48 000000008002e4bc Call Trace: [] cfq_kick_queue+0x0/0x89 [] elv_next_request+0x168/0x178 [] cfq_kick_queue+0x0/0x89 [] run_workqueue+0xcd/0xfb [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kacpid S ffff810037fef0c0 0 24 19 127 23 (L-TLB) ffff81005b975e70 0000000000000046 ffff81005b96bc40 ffff81005b96bc48 0000000300000000 0000000000000001 ffff81005b969100 ffff810037fef0c0 00000004de51fab8 00000000000023cb ffff81005b9692e8 000000008002e4bc Call Trace: [] bind_to_cpu0+0x0/0x62 [] run_workqueue+0xcd/0xfb [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 cqueue/0 S ffff810037fef0c0 0 127 19 130 24 (L-TLB) ffff810037df3e70 0000000000000046 00000004e0693e36 0000000000000000 ffff810037fc87e0 0000000000000001 ffff810037df47a0 ffff810037fef0c0 00000004e069e550 00000000000008a5 ffff810037df4988 000000008031c800 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] request_module+0x0/0x14d [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 khubd S 0000000000000282 0 130 19 132 127 (L-TLB) ffff81005b9a3e10 0000000000000046 ffffffff8008f34a 8000018000000000 ffff81005b144800 000000000000000a ffff810037df8080 ffff81005bac70c0 00000005c414c5b0 0000000000003798 ffff810037df8268 000000005b1412a0 Call Trace: [] default_wake_function+0x0/0xe [] hub_port_status+0x59/0xcf [] keventd_create_kthread+0x0/0xc4 [] hub_thread+0xa83/0xb01 [] autoremove_wake_function+0x0/0x2e [] hub_thread+0x0/0xb01 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] request_module+0x0/0x14d [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] klist_drivers_get+0x0/0xc [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kseriod S 0000000000000282 0 132 19 202 130 (L-TLB) ffff810037dafe90 0000000000000046 0000000000008080 ffffffff8011481b ffffffff80351640 000000000000000a ffff810037dfb0c0 ffff810058fe2040 0000000bf55568a9 000000000001e65e ffff810037dfb2a8 00000000881cb950 Call Trace: [] sysfs_make_dirent+0x1b/0x85 [] driver_create_file+0x31/0x39 [] keventd_create_kthread+0x0/0xc4 [] serio_thread+0x29c/0x2e7 [] autoremove_wake_function+0x0/0x2e [] serio_thread+0x0/0x2e7 [] kthread+0xfe/0x132 [] request_module+0x0/0x14d [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] selinux_d_instantiate+0x0/0x14 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 khungtaskd S ffff810005e36420 0 202 19 203 132 (L-TLB) ffff81005baede60 0000000000000046 ffff81005baeddd0 ffffffff8008ed60 00000004e1c15ef4 000000000000000a ffff81005bacb860 ffffffff8031cb60 0000003ca8be31a6 0000000000002e7a ffff81005bacba48 000000005bacb898 Call Trace: [] __activate_task+0x56/0x6d [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] watchdog+0x4b/0x1a3 [] watchdog+0x0/0x1a3 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 pdflush S ffff810037fc87e0 0 203 19 204 202 (L-TLB) ffff81005baefe70 0000000000000046 ffff81005bacb100 ffff81005be95d60 0000000000000282 0000000000000001 ffff81005bacb100 ffff810037fc87e0 00000004e1c1e550 000000000000084c ffff81005bacb2e8 000000008008e8b8 Call Trace: [] task_rq_lock+0x3d/0x6f [] guarantee_online_cpus+0x59/0x87 [] keventd_create_kthread+0x0/0xc4 [] pdflush+0x0/0x1fb [] pdflush+0xed/0x1fb [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 pdflush S ffff810005e36420 0 204 19 205 203 (L-TLB) ffff81005baf3e70 0000000000000046 0000000000000000 ffffffff8032c100 0000000000000286 000000000000000a ffff81005bacc7a0 ffffffff8031cb60 000000438fd6cfea 0000000000000895 ffff81005bacc988 0000000000000282 Call Trace: [] wb_kupdate+0x161/0x16a [] keventd_create_kthread+0x0/0xc4 [] pdflush+0x0/0x1fb [] pdflush+0xed/0x1fb [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kswapd0 S ffff810037fc87e0 0 205 19 206 204 (L-TLB) ffff81005baf5dd0 0000000000000046 ffff81005bacc040 ffff810000014000 0000000000000282 0000000000000001 ffff81005bacc040 ffff810037fc87e0 00000004e1c367bd 0000000000000b35 ffff81005bacc228 0000000000000000 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] kswapd+0x12c/0x495 [] thread_return+0x62/0xfe [] autoremove_wake_function+0x0/0x2e [] keventd_create_kthread+0x0/0xc4 [] kswapd+0x0/0x495 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 aio/0 S ffff810005e36420 0 206 19 348 205 (L-TLB) ffff81005baf7e70 0000000000000046 00000004e1c39d2a 0000000000000000 ffff810037fc87e0 0000000000000001 ffff81005bad67e0 ffffffff8031cb60 00000004e1c78cec 0000000000000917 ffff81005bad69c8 000000008031c800 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kpsmoused S 0000000000000282 0 348 19 365 206 (L-TLB) ffff81005b099e70 0000000000000046 000000059b4e55f1 0000000000000000 ffff810037fc87e0 0000000000000009 ffff81005b06c860 ffff81005b06c100 000000059b50f97d 00000000000009cd ffff81005b06ca48 000000008031c800 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] request_module+0x0/0x14d [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfs_mru_cache S 0000000000000282 0 365 19 366 348 (L-TLB) ffff81005b39be70 0000000000000046 00000005c5c42f44 0000000000000000 ffff810037fc87e0 0000000000000007 ffff81005b0657e0 ffff81005bac7820 00000005c5c443bf 0000000000000726 ffff81005b0659c8 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfslogd/0 S 0000000000000282 0 366 19 367 365 (L-TLB) ffff81005b39de70 0000000000000046 ffff81005b2da400 ffff81005b1b9a80 0000000300000000 000000000000000a ffff81005b065080 ffff810058b25080 0000003fec06893f 0000000000001235 ffff81005b065268 000000008002e4bc Call Trace: [] :xfs:xfs_buf_iodone_work+0x0/0x6a [] run_workqueue+0xcd/0xfb [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfsdatad/0 S ffff810005e36420 0 367 19 376 366 (L-TLB) ffff81005b3a1e70 0000000000000046 0000000000000000 0000000000000001 0000000300000000 000000000000000a ffff81005b068820 ffffffff8031cb60 0000003fd568cbf7 0000000000001498 ffff81005b068a08 000000008002e4bc Call Trace: [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 ata/0 S 0000000000000282 0 376 19 377 367 (L-TLB) ffff81005ac03e70 0000000000000046 00000000fffb825b 00000001800638a7 0000000300000000 000000000000000a ffff81005bac7820 ffff81005b06c100 00000006122b8b9e 0000000000070d1d ffff81005bac7a08 000000008002e4bc Call Trace: [] :libata:ata_pio_task+0x0/0xd7 [] run_workqueue+0xcd/0xfb [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 ata_aux S 0000000000000282 0 377 19 380 376 (L-TLB) ffff81005ac05e70 0000000000000046 00000005c8415ad8 0000000000000000 ffff810037fc87e0 0000000000000003 ffff81005b0740c0 ffff81005b06c100 00000005c8417824 0000000000000288 ffff81005b0742a8 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 scsi_eh_0 S 0000000000000282 0 380 19 381 377 (L-TLB) ffff81005b9d5e60 0000000000000046 ffff81005be16fc8 ffffffff8008d76f 0000000300000000 0000000000000005 ffff81005b0680c0 ffff81005b074820 00000005dabf7fba 0000000000008ca1 ffff81005b0682a8 000000008002e4bc Call Trace: [] __wake_up_common+0x3e/0x68 [] :scsi_mod:__scsi_iterate_devices+0x56/0x6f [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x6a/0x4ce [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x0/0x4ce [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] do_exit+0x925/0x931 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 scsi_eh_1 S 0000000000000282 0 381 19 382 380 (L-TLB) ffff81005b2cbe60 0000000000000046 ffff81005b28afc8 ffffffff8008d76f 0000000300000000 0000000000000008 ffff81005b071080 ffff81005b074820 00000005ece5556e 00000000000070e6 ffff81005b071268 000000008002e4bc Call Trace: [] __wake_up_common+0x3e/0x68 [] :scsi_mod:__scsi_iterate_devices+0x56/0x6f [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x6a/0x4ce [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x0/0x4ce [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 scsi_eh_2 S 0000000000000282 0 382 19 383 381 (L-TLB) ffff81005b2c7e60 0000000000000046 ffff81005b2cefc8 ffffffff8008d76f 0000000300000000 000000000000000a ffff81005bac70c0 ffff81005b074820 00000005ff8dbbf1 0000000000005494 ffff81005bac72a8 000000008002e4bc Call Trace: [] __wake_up_common+0x3e/0x68 [] :scsi_mod:__scsi_iterate_devices+0x56/0x6f [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x6a/0x4ce [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x0/0x4ce [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] do_exit+0x925/0x931 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 scsi_eh_3 S 0000000000000282 0 383 19 388 382 (L-TLB) ffff81005b3e7e60 0000000000000046 ffff81005b282fc8 ffffffff8008d76f 0000000300000000 000000000000000a ffff81005b06c100 ffff81005b074820 00000006122d75fa 0000000000004a1e ffff81005b06c2e8 000000008002e4bc Call Trace: [] __wake_up_common+0x3e/0x68 [] :scsi_mod:__scsi_iterate_devices+0x56/0x6f [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x6a/0x4ce [] keventd_create_kthread+0x0/0xc4 [] :scsi_mod:scsi_error_handler+0x0/0x4ce [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kstriped S 0000000000000282 0 388 19 399 383 (L-TLB) ffff81005ac23e70 0000000000000046 00000006137fb3c8 0000000000000000 ffff810037fc87e0 0000000000000007 ffff81005bac07e0 ffff81005b06f040 00000006137fd135 00000000000006d0 ffff81005bac09c8 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 md3_raid1 S ffff810005e36420 0 399 19 402 388 (L-TLB) ffff81005beb1e40 0000000000000046 ffff81005be959c8 ffff81000617bd00 0000000000000246 000000000000000a ffff810037dfb820 ffffffff8031cb60 00000040674952a4 0000000000000480 ffff810037dfba08 0000000000007000 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x1e/0xad [] prepare_to_wait+0x34/0x61 [] md_thread+0xc4/0x10e [] autoremove_wake_function+0x0/0x2e [] md_thread+0x0/0x10e [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 md1_raid1 S 0000000000000282 0 402 19 405 399 (L-TLB) ffff81005beb7e40 0000000000000046 ffff81005be959c8 ffff81005ba9ef00 0000000000000246 000000000000000a ffff81005b074820 ffff81005a07d7e0 0000004067491c2e 00000000000006e4 ffff81005b074a08 000000008008eb43 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x1e/0xad [] prepare_to_wait+0x34/0x61 [] md_thread+0xc4/0x10e [] autoremove_wake_function+0x0/0x2e [] md_thread+0x0/0x10e [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 md2_raid1 S 0000000000000282 0 405 19 406 402 (L-TLB) ffff81005ac45e40 0000000000000046 ffff81005be959c8 ffff81005ba9ed00 0000000000000246 000000000000000a ffff81005b2a9100 ffff81005a07d7e0 0000004066228847 000000000000090b ffff81005b2a92e8 000000008008eb43 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x1e/0xad [] prepare_to_wait+0x34/0x61 [] md_thread+0xc4/0x10e [] autoremove_wake_function+0x0/0x2e [] md_thread+0x0/0x10e [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfsbufd S ffff810005e36420 0 406 19 407 405 (L-TLB) ffff81005acf5e60 0000000000000046 0000000000000008 0000000000000001 00000000589057c0 000000000000000a ffff81005b0717e0 ffffffff8031cb60 0000004438c41ed2 000000000000029e ffff81005b0719c8 0000000000000086 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] :xfs:xfsbufd+0x4e/0xe6 [] :xfs:xfsbufd+0x0/0xe6 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfsaild S ffff810005e36420 0 407 19 408 406 (L-TLB) ffff81005ad6de60 0000000000000046 ffff81005ad6ddd0 ffffffff8008ed60 0000000acc805abe 000000000000000a ffff81005b2a9860 ffffffff8031cb60 0000004433f247e2 00000000000002b0 ffff81005b2a9a48 000000005b2a9898 Call Trace: [] __activate_task+0x56/0x6d [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] :xfs:xfsaild+0x33/0x77 [] :xfs:xfsaild+0x0/0x77 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 xfssyncd S ffff810005e36420 0 408 19 434 407 (L-TLB) ffff81005adc1e50 0000000000000046 ffff81005b1b9600 ffff81005b2da400 ffff81005b2da4a8 000000000000000a ffff810037df87e0 ffffffff8031cb60 0000004299bccd8b 00000000000007ff ffff810037df89c8 000000008806c185 Call Trace: [] keventd_create_kthread+0x0/0xc4 [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] :xfs:xfssyncd+0x29/0x138 [] :xfs:xfssyncd+0x0/0x138 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] selinux_d_instantiate+0x0/0x14 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kauditd S 0000000000000282 0 434 19 845 408 (L-TLB) ffff81005abafe90 0000000000000046 ffff81005ab8e7e0 ffff81005ab8e7e0 ffff81005ab8e7e0 0000000000000009 ffff81005ab8e7e0 ffff810037fc8080 0000000b6309ec99 000000000000058e ffff81005ab8e9c8 0000000080063002 Call Trace: [] __wake_up+0x38/0x4f [] keventd_create_kthread+0x0/0xc4 [] kauditd_thread+0x146/0x17d [] default_wake_function+0x0/0xe [] kauditd_thread+0x0/0x17d [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kedac S ffff810005e36420 0 845 19 1459 434 (L-TLB) ffff81005a07fe70 0000000000000046 0000000000000016 ffffffff8022f6ef 0000000000000246 000000000000000a ffff810059d800c0 ffffffff8031cb60 000000442c1795b2 000000000000046c ffff810059d802a8 0000000000000000 Call Trace: [] pci_conf1_read+0xcc/0xd7 [] keventd_create_kthread+0x0/0xc4 [] :edac_mc:edac_kernel_thread+0x0/0xfb [] schedule_timeout+0x8a/0xad [] process_timeout+0x0/0x5 [] :edac_mc:edac_kernel_thread+0xd3/0xfb [] :edac_mc:edac_kernel_thread+0x0/0xfb [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kmpathd/0 S 0000000000000282 0 1459 19 1460 845 (L-TLB) ffff8100588bfe70 0000000000000046 0000000d1b7a2dfd 0000000000000000 ffff810037fc87e0 0000000000000003 ffff81005a5460c0 ffff81005a2d9080 0000000d1b7a449b 0000000000000461 ffff81005a5462a8 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 kmpath_handle S 0000000000000282 0 1460 19 1834 1459 (L-TLB) ffff81005a58de70 0000000000000046 0000000d1b7a75b6 0000000000000000 ffff810037fc87e0 0000000000000003 ffff81005bac0080 ffff81005a2d9080 0000000d1b7a966a 00000000000002e6 ffff81005bac0268 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 rpciod/0 S 0000000000000282 0 1834 19 1460 (L-TLB) ffff810056c21e70 0000000000000046 0000000eac2d4565 0000000000000000 ffff810037fc87e0 0000000000000008 ffff810059f15080 ffff810059f3d860 0000000eac2d600a 000000000000077d ffff810059f15268 0000000000000000 Call Trace: [] thread_return+0x62/0xfe [] recalc_sigpending_and_wake+0x9/0x1a [] do_sigaction+0x14d/0x199 [] keventd_create_kthread+0x0/0xc4 [] worker_thread+0x0/0x122 [] worker_thread+0xc0/0x122 [] default_wake_function+0x0/0xe [] keventd_create_kthread+0x0/0xc4 [] keventd_create_kthread+0x0/0xc4 [] kthread+0xfe/0x132 [] child_rip+0xa/0x11 [] keventd_create_kthread+0x0/0xc4 [] kthread+0x0/0x132 [] child_rip+0x0/0x11 reboot D ffff810037dfb820 0 2050 1 19 (NOTLB) ffff81005ab37a08 0000000000000082 ffff81005ab37a58 ffff81005beb1ea0 0000000000000001 0000000000000007 ffff81005a07d7e0 ffff810037dfb820 0000004067494e24 00000000000031f6 ffff81005a07d9c8 000000008008d76f Call Trace: [] __wake_up+0x38/0x4f [] md_write_start+0xf2/0x108 [] autoremove_wake_function+0x0/0x2e [] :raid1:make_request+0x38/0x5d8 [] generic_make_request+0x211/0x228 [] mempool_alloc+0x31/0xe7 [] vsnprintf+0x5d7/0xb54 [] submit_bio+0xe6/0xed [] :xfs:_xfs_buf_ioapply+0x1f2/0x254 [] :xfs:xfs_buf_iorequest+0x39/0x64 [] :xfs:xfs_bdstrat_cb+0x36/0x3a [] :xfs:xfs_bwrite+0x5e/0xba [] :xfs:xfs_syncsub+0x119/0x226 [] :xfs:xfs_fs_sync_super+0x33/0xdd [] quota_sync_sb+0x2e/0xf0 [] __fsync_super+0x1b/0x9e [] fsync_super+0x9/0x16 [] fsync_bdev+0x2a/0x3b [] invalidate_partition+0x28/0x40 [] do_md_stop+0xa0/0x2ec [] md_notify_reboot+0x5f/0x120 [] notifier_call_chain+0x20/0x32 [] blocking_notifier_call_chain+0x22/0x36 [] kernel_restart_prepare+0x18/0x29 [] kernel_restart+0x9/0x46 [] sys_reboot+0x146/0x1c7 [] hrtimer_try_to_cancel+0x4a/0x53 [] hrtimer_cancel+0xc/0x16 [] do_nanosleep+0x47/0x70 [] hrtimer_nanosleep+0x58/0x118 [] hrtimer_wakeup+0x0/0x22 [] sigprocmask+0xb7/0xdb [] sys_nanosleep+0x4c/0x62 [] system_call+0x7e/0x83 telnet> quit Connection closed. Script done on Wed 30 Jan 2013 09:13:47 PM EST From qcai@redhat.com Wed Jan 30 21:16:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 71C627F4E for ; Wed, 30 Jan 2013 21:16:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01B7FAC001 for ; Wed, 30 Jan 2013 19:16:49 -0800 (PST) X-ASG-Debug-ID: 1359602208-04cbb00c642306e0001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id LXqB7LszWobDnexv for ; Wed, 30 Jan 2013 19:16:48 -0800 (PST) X-Barracuda-Envelope-From: qcai@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0V3GlMl024769; Wed, 30 Jan 2013 22:16:48 -0500 Date: Wed, 30 Jan 2013 22:16:47 -0500 (EST) From: CAI Qian To: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Cc: linux-kernel Message-ID: <473604401.11548931.1359602207833.JavaMail.root@redhat.com> In-Reply-To: <614607656.11545086.1359601991846.JavaMail.root@redhat.com> Subject: 3.8-rc5 xfs corruption MIME-Version: 1.0 X-ASG-Orig-Subj: 3.8-rc5 xfs corruption Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.66.13.37] X-Mailer: Zimbra 7.2.0_GA_2669 (ZimbraWebClient - FF3.0 (Linux)/7.2.0_GA_2669) X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1359602208 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.2.121382 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, (Sorry to post to xfs mailing lists but unsure about which one is the best for this.) I have seen something like this once during testing on a system with a EMC VNX FC/multipath back-end. Kernel config file is here, http://people.redhat.com/qcai/stable/.config [ 3025.063024] ffff8801a0d50000: 2e 2e 2f 2e 2e 2f 75 73 72 2f 6c 69 62 2f 6d 6f ../../usr/lib/mo [ 3025.071743] XFS (dm-1): Internal error xfs_bmbt_verify at line 747 of file fs/xfs/xfs_bmap_btree.c. Caller 0xffffffffa01c375e [ 3025.071743] [ 3025.084589] Pid: 275, comm: xfsaild/dm-1 Tainted: GF 3.8.0-rc5 #1 [ 3025.091636] Call Trace: [ 3025.094176] [] xfs_error_report+0x3f/0x50 [xfs] [ 3025.100415] [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] [ 3025.107163] [] xfs_corruption_error+0x5e/0x90 [xfs] [ 3025.113744] [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] [ 3025.120495] [] xfs_bmbt_verify+0x76/0x1c0 [xfs] [ 3025.126737] [] ? xfs_bmbt_write_verify+0xe/0x10 [xfs] [ 3025.133481] [] ? xfs_bdstrat_cb+0x65/0xd0 [xfs] [ 3025.139714] [] xfs_bmbt_write_verify+0xe/0x10 [xfs] [ 3025.146287] [] _xfs_buf_ioapply+0x5e/0x370 [xfs] [ 3025.152565] [] ? try_to_wake_up+0x2d0/0x2d0 [ 3025.158442] [] ? xfs_bdstrat_cb+0x65/0xd0 [xfs] [ 3025.164669] [] xfs_buf_iorequest+0x4a/0xa0 [xfs] [ 3025.170979] [] xfs_bdstrat_cb+0x65/0xd0 [xfs] [ 3025.177032] [] __xfs_buf_delwri_submit+0x171/0x1e0 [xfs] [ 3025.184038] [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] [ 3025.191491] [] ? xfs_trans_ail_cursor_first+0x80/0xb0 [xfs] [ 3025.198755] [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] [ 3025.206030] [] xfsaild+0x222/0x5e0 [xfs] [ 3025.211665] [] ? xfs_trans_ail_cursor_first+0xb0/0xb0 [xfs] [ 3025.218890] [] kthread+0xc0/0xd0 [ 3025.223784] [] ? kthread_create_on_node+0x120/0x120 [ 3025.230317] [] ret_from_fork+0x7c/0xb0 [ 3025.235721] [] ? kthread_create_on_node+0x120/0x120 [ 3025.242248] XFS (dm-1): Corruption detected. Unmount and run xfs_repair [ 3025.248865] XFS (dm-1): xfs_do_force_shutdown(0x8) called from line 1340 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa0197411 Does this ring any bell? Regards, CAI Qian From info@hotenergi.ru Wed Jan 30 21:52:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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,RCVD_NUMERIC_HELO 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 DCABB7F51 for ; Wed, 30 Jan 2013 21:52:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F2538F8039 for ; Wed, 30 Jan 2013 19:52:14 -0800 (PST) X-ASG-Debug-ID: 1359604330-04bdf0231e24e8e0001-NocioJ Received: from zabavnikov.ru (zabavnikov.ru [62.109.19.20]) by cuda.sgi.com with ESMTP id Bj8k1WE0j3GkPcRa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Jan 2013 19:52:12 -0800 (PST) X-Barracuda-Envelope-From: info@hotenergi.ru X-Barracuda-Apparent-Source-IP: 62.109.19.20 Received: from [121.8.152.242] (helo=121.8.152.246) by zabavnikov.ru with esmtpa (Exim 4.80.1 (FreeBSD)) (envelope-from ) id 1U0lBu-0006d3-IO; Thu, 31 Jan 2013 07:52:08 +0400 Message-ID: Reply-To: =?windows-1251?B?yO3x7+Xq8u7wIO/uIOrg5PDg7C4gyu7s6PLl?= =?windows-1251?B?8iDv7iDy8PPk8w==?= From: =?windows-1251?B?yO3x7+Xq8u7wIO/uIOrg5PDg7C4gyu7s6PLl?= =?windows-1251?B?8iDv7iDy8PPk8w==?= To: , , , Subject: =?windows-1251?B?0vDz5O7i7uUg5+Dq7u3u5ODy5ev88fLi7iDi?= =?windows-1251?B?IDIwMTMg4+7k8w==?= Date: Wed, 30 Jan 2013 19:50:33 -0800 X-ASG-Orig-Subj: =?windows-1251?B?0vDz5O7i7uUg5+Dq7u3u5ODy5ev88fLi7iDi?= =?windows-1251?B?IDIwMTMg4+7k8w==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0851_01CDFF23.10EB3280" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 Sender: info@hotenergi.ru X-Barracuda-Connect: zabavnikov.ru[62.109.19.20] X-Barracuda-Start-Time: 1359604331 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.26 X-Barracuda-Spam-Status: No, SCORE=1.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121386 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. ------=_NextPart_000_0851_01CDFF23.10EB3280 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D6=E5=ED=F2=F0 =EE=E1=F0=E0=E7=EE=E2=E0=F2=E5=EB=FC= =ED=FB=F5 =F3=F1=EB=F3=E3 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 =E8 =CB=E5= =ED=E8=ED=E3=F0=E0=E4=F1=EA=EE=E9 =EE=E1=EB=E0=F1=F2=E8 = =20 =20 =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =EA=F3=F0=F1 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2=E0=EB= =E8=F4=E8=EA=E0=F6=E8=E8: =20 =CA=C0=C4=D0=CE=C2=CE=C5 =C4=C5=CB=CE=CF=D0=CE=C8=C7= =C2=CE=C4=D1=D2=C2=CE. =20 =C2=E5=E4=E5=ED=E8=E5 =EB=E8=F7=ED=FB=F5 =E4=E5=EB =F0= =E0=E1=EE=F2=ED=E8=EA=EE=E2. =CF=F0=E8=EC=E5=ED=E5=ED=E8=E5 =F2=F0=F3=E4=EE=E2=EE=E3=EE = =EA=EE=E4=E5=EA=F1=E0 =E2 2=EEI=C7 =E3=EE=E4=F3. 25 - 26 =F4=E5=E2=F0=E0=EB=FF 20I=E7 =E3=EE=E4=E0, =D1=E0=ED= =EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 ------------------------------------------ =20 =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EA=F3=F0=F1=E0: 1. =CF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =E4=E5= =FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =EA=E0=E4=F0=EE=E2=FB=F5 =F1=EB=F3=E6=E1. = =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D2=CA =D0=D4.=20 2. =D3=ED=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E5 =F4=EE=F0=EC=FB =E8 =EF=F0= =E0=E2=E8=EB=E0 =E8=F5 =E7=E0=EF=EE=EB=ED=E5=ED=E8=FF. =D3=F7=E5=F2 =EA=E0= =E4=F0=EE=E2 (=EA=E0=F0=F2=EE=F7=EA=E0 =D2-2).=20 3. =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=E0 =EF=E5=F0=F1=EE=ED=E0=EB=E0: =95 =C4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=EB= =FF =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF =F2=F0=F3=E4=EE=E2=FB=F5 =EE=F2=ED=EE=F8= =E5=ED=E8=E9. =95 =D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =F0=E0=E1=EE=F2=EE=E4=E0=F2= =E5=EB=E5=E9 =EF=F0=E8 =EF=F0=E8=E5=EC=E5 =ED=E0 =F0=E0=E1=EE=F2=F3. =95 =CF=EE=E4=E0=F7=E0 =E2=E0=EA=E0=ED=F1=E8=E8 =E8 =EE=F2=EA=E0=E7 =E2 =EF= =F0=E8=E5=EC=E5 =ED=E0 =F0=E0=E1=EE=F2=F3.=20 4. =CF=F0=E0=E2=EE=E2=FB=E5 =F0=E5=E6=E8=EC=FB =F0=E0=F1=F1=F2=E0=ED=EE=E2= =EA=E8 =EA=E0=E4=F0=EE=E2 =E2 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E8: =95 =CF=E5=F0=E5=E2=EE=E4 =ED=E0 =E4=F0=F3=E3=F3=FE =EF=EE=F1=F2=EE=FF=ED= =ED=F3=FE =F0=E0=E1=EE=F2=F3 =E8 =EF=E5=F0=E5=EC=E5=F9=E5=ED=E8=E5. =95 =D1=EE=E2=EC=E5=F9=E5=ED=E8=E5 =EF=F0=EE=F4=E5=F1=F1=E8=E9 (=E4=EE=EB= =E6=ED=EE=F1=F2=E5=E9).=20 5. =CF=EE=F0=FF=E4=EE=EA =F3=E2=EE=EB=FC=ED=E5=ED=E8=FF =EF=E5=F0=F1=EE=ED= =E0=EB=E0: =95 =CF=F0=E5=EA=F0=E0=F9=E5=ED=E8=E5 =F2=F0=F3=E4=EE=E2=EE=E3=EE =E4=EE=E3= =EE=E2=EE=F0=E0 (=F0=E0=E7=EB=E8=F7=ED=FB=E5 =E2=E0=F0=E8=E0=ED=F2=FB) =95 =CF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE =F0=E0=F1=F7=E5=F2=E0. =C2=FB=F5= =EE=E4=ED=EE=E5 =EF=EE=F1=EE=E1=E8=E5. 6. =C2=E8=E4=FB =F2=F0=F3=E4=EE=E2=FB=F5 =E4=EE=E3=EE=E2=EE=F0=EE=E2. =CE= =E1=FF=E7=E0=F2=E5=EB=FC=ED=FB=E5 =E8 =E4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED= =FB=E5 =F3=F1=EB=EE=E2=E8=FF =D2=F0=F3=E4=EE=E2=EE=E3=EE =E4=EE=E3=EE=E2=EE= =F0=E0.=20 7. =C2=E8=E4=FB =F2=F0=F3=E4=EE=E2=FB=F5 =EA=ED=E8=E6=E5=EA. =D5=F0=E0=ED= =E5=ED=E8=E5 =E8 =F3=F7=E5=F2 =F2=F0=F3=E4=EE=E2=FB=F5 =EA=ED=E8=E6=E5=EA= .=20 =20 8. =D1=E8=F1=F2=E5=EC=E0 =EE=EF=EB=E0=F2=FB =F2=F0=F3=E4=E0. =C7=E0=F0=E0= =E1=EE=F2=ED=E0=FF =EF=EB=E0=F2=E0. =CF=F0=E5=EC=E8=F0=EE=E2=E0=ED=E8=E5.= =20 9. =C5=E6=E5=E3=EE=E4=ED=FB=E5 =EE=F2=EF=F3=F1=EA=E0. =C1=EE=EB=FC=ED=E8= =F7=ED=FB=E9 =EB=E8=F1=F2. =D1=F2=F0=E0=F5=EE=E2=EE=E9 =F1=F2=E0=E6. 10. =CF=E5=F0=E8=EE=E4=E8=F7=E5=F1=EA=E8=E5 =EC=E5=E4=E8=F6=E8=ED=F1=EA=E8= =E5 =EE=E1=F1=EB=E5=E4=EE=E2=E0=ED=E8=FF =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2. = =CD=EE=E2=EE=E5 =E2 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E5. 11. =CD=EE=E2=FB=E5 =F1=F0=EE=EA=E8 =F5=F0=E0=ED=E5=ED=E8=FF =EA=E0=E4=F0= =EE=E2=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =CD=EE=EC=E5=ED=EA=EB=E0= =F2=F3=F0=E0 =E4=E5=EB. 12. =CF=F0=EE=E2=E5=F0=EA=E8, =EE=F1=F3=F9=E5=F1=F2=E2=EB=FF=E5=EC=FB=E5 = =C3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 =E8=ED=F1=EF=E5=EA=F6=E8=E5= =E9 =F2=F0=F3=E4=E0. =CE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC =E8 =F1= =E0=ED=EA=F6=E8=E8 =EF=F0=E8 =ED=E0=F0=F3=F8=E5=ED=E8=E8 =D2=CA =D0=D4. =CF= =EE=F0=FF=E4=EE=EA =EE=E1=E6=E0=EB=EE=E2=E0=ED=E8=FF. =CE=F2=F1=F2=F0=E0=ED= =E5=ED=E8=E5 =EE=F2 =F0=E0=E1=EE=F2=FB. ------------------------------------------------------------------ =CF=CE =CE=CA=CE=CD=D7=C0=CD=C8=C8 =CA=D3=D0=D1=C0 =C2=DB=C4=C0=C5=D2=D1=DF= =D3=C4=CE=D1=D2=CE=C2=C5=D0=C5=CD=C8=C5 =CE =CF=CE=C2=DB=D8=C5=CD=C8=C8 = =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6=C8=C8. ------------------------------------------------------------------ =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5=EB=E5=F4= =EE=ED=F3: +7 * =CF=E5=F2=E5=F0=E1=F3=F0=E3 * 642 ^ o=F7 ^ 89 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =C4=EE=EB=EE=F2=EE=E2=E0 =C0=ED=ED=E0 =CE=EB=E5=E3=EE=E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =EF=EE =F0=E0=E1=EE=F2=E5 =F1 =EA=EB=E8=E5=ED=F2= =E0=EC=E8 =F2=E5=EB.: 8 * 812 * 6=D72 -- =EE4 89 =20 ------=_NextPart_000_0851_01CDFF23.10EB3280 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
              &nbs= p;         =20 =D6=E5=ED=F2=F0 =EE=E1=F0=E0=E7=EE=E2=E0=F2=E5=EB=FC=ED=FB=F5=20 =F3=F1=EB=F3=E3
             =    =E3.=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 =E8 =CB=E5=ED=E8=ED=E3=F0=E0= =E4=F1=EA=EE=E9=20 =EE=E1=EB=E0=F1=F2=E8        &nbs= p;            = ;    =20
               &nb= sp;  =20
               &nb= sp;           &nbs= p; =20 =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1=20 =ED=E0
              &nb= sp;         =20 =EA=F3=F0=F1 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8= =E8:   
     

             &n= bsp;           =20 =CA=C0=C4=D0=CE=C2=CE=C5 =C4=C5=CB=CE=CF=D0=CE=C8=C7=C2=CE=C4=D1=D2=C2=CE= .      =20
               &nb= sp;       =20 =C2=E5=E4=E5=ED=E8=E5 =EB=E8=F7=ED=FB=F5 =E4=E5=EB=20 =F0=E0=E1=EE=F2=ED=E8=EA=EE=E2.
          &n= bsp;      =20 =CF=F0=E8=EC=E5=ED=E5=ED=E8=E5 =F2=F0=F3=E4=EE=E2=EE=E3=EE =EA=EE=E4=E5=EA= =F1=E0 =E2=20 2=EEI=C7 =E3=EE=E4=F3.
     
              =   =20 25 - 26 =F4=E5=E2=F0=E0=EB=FF 20I=E7 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
        &n= bsp;       =20 ------------------------------------------
        &nb= sp;