From jblunck@suse.de Mon Nov 2 04:06:59 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2A6x09032757 for ; Mon, 2 Nov 2009 04:06:59 -0600 X-ASG-Debug-ID: 1257156431-5cdd02fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 974BA1B38376; Mon, 2 Nov 2009 02:07:11 -0800 (PST) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BAFmdhoqSU390FV1; Mon, 02 Nov 2009 02:07:11 -0800 (PST) Received: from relay1.suse.de (relay-ext.suse.de [195.135.221.8]) by mx2.suse.de (Postfix) with ESMTP id 954FB8A95F; Mon, 2 Nov 2009 11:07:10 +0100 (CET) From: Jan Blunck To: linux-fsdevel@vger.kernel.org Cc: Matthew Wilcox , linux-kernel@vger.kernel.org, Jan Blunck , Alex Elder , xfs-masters@oss.sgi.com, Christoph Hellwig , Dave Chinner , Eric Sandeen , Niv Sardi , Felix Blyakher , xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 27/27] BKL: Remove BKL from xfs Subject: [PATCH 27/27] BKL: Remove BKL from xfs Date: Mon, 2 Nov 2009 11:05:07 +0100 Message-Id: <1257156307-24175-28-git-send-email-jblunck@suse.de> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1257156307-24175-1-git-send-email-jblunck@suse.de> References: <1257156307-24175-1-git-send-email-jblunck@suse.de> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1257156432 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean BKL is only used in fill_super. It is safe to remove it. Signed-off-by: Jan Blunck --- fs/xfs/linux-2.6/xfs_super.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 7426166..18a4b8e 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1412,8 +1412,6 @@ xfs_fs_fill_super( int flags = 0, error = ENOMEM; char *mtpt = NULL; - lock_kernel(); - mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); if (!mp) goto out; @@ -1508,7 +1506,6 @@ xfs_fs_fill_super( kfree(mtpt); xfs_itrace_exit(XFS_I(sb->s_root->d_inode)); - unlock_kernel(); return 0; out_filestream_unmount: @@ -1525,7 +1522,6 @@ xfs_fs_fill_super( kfree(mtpt); kfree(mp); out: - unlock_kernel(); return -error; fail_vnrele: -- 1.6.4.2 From jblunck@suse.de Mon Nov 2 04:06:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.8 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_24, J_CHICKENPOX_43,J_CHICKENPOX_45,J_CHICKENPOX_64,J_CHICKENPOX_66, LOCAL_GNU_PATCH autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2A6q6t032742 for ; Mon, 2 Nov 2009 04:06:52 -0600 X-ASG-Debug-ID: 1257156424-620901de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E2B153621; Mon, 2 Nov 2009 02:07:04 -0800 (PST) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id BC97xJygbh21F3Ms; Mon, 02 Nov 2009 02:07:04 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 0CC5D8E8CC; Mon, 2 Nov 2009 11:07:01 +0100 (CET) From: Jan Blunck To: linux-fsdevel@vger.kernel.org Cc: Matthew Wilcox , linux-kernel@vger.kernel.org, Jan Blunck , Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov , Abhishek Kulkarni , Al Viro , James Morris , Andrew Morton , Alexey Dobriyan , Christoph Hellwig , Roman Zippel , David Howells , Ian Kent , Jeff Moyer , "Sergey S. Kostyliov" , Greg Kroah-Hartman , "Tigran A. Aivazian" , Eric Sesterhenn , Qinghuang Feng , Chris Mason , Yan Zheng , Sage Weil , Steve French , Jeff Layton , Jan Harkes , co@suse.de, da@cs.cmu.edu, Joel Becker , Coly Li , David VomLehn , Sukadev Bhattiprolu , Alan Cox , Serge Hallyn , Tyler Hicks , Dustin Kirkland , Boaz Harrosh , Benny Halevy , Jan Kara , Andreas Dilger , "Theodore Ts'o" , OGAWA Hirofumi , Denis Karpov , Miklos Szeredi , Csaba Henk , Tejun Heo , Jens Axboe , Steven Whitehouse , Jeff Dike , KOSAKI Motohiro , Nick Piggin , Wolfgang Illmeyer , Mikulas Patocka , Alessio Igor Bogani , Roel Kluin , William Irwin , Mel Gorman , David Woodhouse , Dave Kleikamp , Masayuki Hamaguchi , Trond Myklebust , Petr Vandrovec , Thomas Gleixner , Chuck Lever , "J. Bruce Fields" , Neil Brown , KONISHI Ryusuke , Jiro SEKIBA , Anton Altaparmakov , Mark Fasheh , Sunil Mushran , Bob Copeland , Anders Larsen , Wu Fengguang , Matt Mackall , Jeff Mahoney , Bernd Schmidt , Julia Lawall , Phillip Lougher , "Eric W. Biederman" , Arte m Bityutskiy , Adrian Hunter , Marcin Slusarz , Pekka Enberg , Clemens Ladisch , Evgeniy Dushistov , Alex Elder , xfs-masters@oss.sgi.com, Dave Chinner , Eric Sandeen , Niv Sardi , Felix Blyakher , v9fs-developer@lists.sourceforge.net, linux-afs@lists.infradead.org, autofs@linux.kernel.org, linux-btrfs@vger.kernel.org, linux-cifs-client@lists.samba.org, samba-technical@lists.samba.org, codalist@TELEMANN.coda.cs.cmu.edu, ecryptfs-devel@lists.launchpad.net, osd-dev@open-osd.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, cluster-devel@redhat.com, user-mode-linux-devel@lists.sourceforge.net, user-mode-linux-user@lists.sourceforge.net, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, linux-nfs@vger.kernel.org, users@nilfs.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-karma-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/27] BKL: Push down BKL from do_new_mount() to the filesystems get_sb/fill_super operation Subject: [PATCH 01/27] BKL: Push down BKL from do_new_mount() to the filesystems get_sb/fill_super operation Date: Mon, 2 Nov 2009 11:04:41 +0100 Message-Id: <1257156307-24175-2-git-send-email-jblunck@suse.de> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1257156307-24175-1-git-send-email-jblunck@suse.de> References: <1257156307-24175-1-git-send-email-jblunck@suse.de> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1257156426 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I've read through all the code formerly covered by the BKL inside do_kern_mount() and have satisfied myself that it doesn't need the BKL any more. do_kern_mount() is already called without the BKL when mounting the rootfs and in nfsctl. do_kern_mount() calls vfs_kern_mount(), which is called from various places without BKL: simple_pin_fs(), nfs_do_clone_mount() through nfs_follow_mountpoint(), afs_mntpt_do_automount() through afs_mntpt_follow_link(). Both later functions are actually the filesystems follow_link inode operation. vfs_kern_mount() is calling the specified get_sb function and lets the filesystem do its job by calling the given fill_super function. Therefore I think it is safe to push down the BKL from the VFS to the low-level filesystems get_sb/fill_super operation. Signed-off-by: Jan Blunck Cc: Matthew Wilcox --- fs/9p/vfs_super.c | 9 ++++++++- fs/adfs/super.c | 8 +++++++- fs/affs/super.c | 9 ++++++++- fs/afs/super.c | 5 +++++ fs/autofs4/inode.c | 4 ++++ fs/befs/linuxvfs.c | 4 ++++ fs/bfs/inode.c | 9 ++++++++- fs/binfmt_misc.c | 6 +++++- fs/btrfs/super.c | 8 +++++++- fs/cifs/cifsfs.c | 12 ++++++++++-- fs/coda/inode.c | 8 +++++++- fs/configfs/mount.c | 5 +++++ fs/cramfs/inode.c | 8 +++++++- fs/devpts/inode.c | 13 +++++++++++-- fs/ecryptfs/main.c | 3 +++ fs/efs/super.c | 10 ++++++++-- fs/exofs/super.c | 7 ++++++- fs/ext2/super.c | 10 ++++++++-- fs/ext3/super.c | 9 ++++++++- fs/ext4/super.c | 9 ++++++--- fs/fat/namei_msdos.c | 6 +++++- fs/fat/namei_vfat.c | 6 +++++- fs/freevxfs/vxfs_super.c | 7 ++++++- fs/fuse/control.c | 9 ++++++++- fs/fuse/inode.c | 5 +++++ fs/gfs2/ops_fstype.c | 9 +++++++++ fs/hfs/super.c | 8 +++++++- fs/hfsplus/super.c | 8 +++++++- fs/hostfs/hostfs_kern.c | 4 ++++ fs/hpfs/super.c | 8 +++++++- fs/hppfs/hppfs.c | 4 ++++ fs/hugetlbfs/inode.c | 12 ++++++++++-- fs/isofs/inode.c | 8 +++++++- fs/jffs2/super.c | 11 +++++++++-- fs/jfs/super.c | 14 ++++++++++++-- fs/libfs.c | 10 +++++++++- fs/minix/inode.c | 8 +++++++- fs/namespace.c | 2 -- fs/ncpfs/inode.c | 8 +++++++- fs/nfs/super.c | 19 +++++++++++++++++++ fs/nfsd/nfsctl.c | 7 ++++++- fs/nilfs2/super.c | 9 ++++++++- fs/ntfs/super.c | 5 +++++ fs/ocfs2/dlm/dlmfs.c | 8 +++++++- fs/ocfs2/super.c | 5 +++++ fs/omfs/inode.c | 7 ++++++- fs/openpromfs/inode.c | 4 ++++ fs/proc/root.c | 9 ++++++++- fs/qnx4/inode.c | 8 +++++++- fs/ramfs/inode.c | 5 +++++ fs/reiserfs/super.c | 4 ++++ fs/romfs/super.c | 9 ++++++++- fs/smbfs/inode.c | 5 +++++ fs/squashfs/super.c | 6 ++++++ fs/sysfs/mount.c | 6 ++++++ fs/sysv/super.c | 24 +++++++++++++++++++----- fs/ubifs/super.c | 5 +++++ fs/udf/super.c | 8 +++++++- fs/ufs/super.c | 5 +++++ fs/xfs/linux-2.6/xfs_super.c | 4 ++++ 60 files changed, 412 insertions(+), 53 deletions(-) diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 14a8644..4156a0c 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -106,11 +106,15 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, struct p9_fid *fid; int retval = 0; + lock_kernel(); + P9_DPRINTK(P9_DEBUG_VFS, " \n"); v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); - if (!v9ses) + if (!v9ses) { + unlock_kernel(); return -ENOMEM; + } fid = v9fs_session_init(v9ses, dev_name, data); if (IS_ERR(fid)) { @@ -155,6 +159,7 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); simple_set_mnt(mnt, sb); + unlock_kernel(); return 0; free_stat: @@ -167,12 +172,14 @@ clunk_fid: close_session: v9fs_session_close(v9ses); kfree(v9ses); + unlock_kernel(); return retval; release_sb: p9stat_free(st); kfree(st); deactivate_locked_super(sb); + unlock_kernel(); return retval; } diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 6910a98..e94f111 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c @@ -351,11 +351,15 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) struct adfs_sb_info *asb; struct inode *root; + lock_kernel(); + sb->s_flags |= MS_NODIRATIME; asb = kzalloc(sizeof(*asb), GFP_KERNEL); - if (!asb) + if (!asb) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = asb; /* set default options */ @@ -473,6 +477,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) goto error; } else sb->s_root->d_op = &adfs_dentry_operations; + unlock_kernel(); return 0; error_free_bh: @@ -480,6 +485,7 @@ error_free_bh: error: sb->s_fs_info = NULL; kfree(asb); + unlock_kernel(); return -EINVAL; } diff --git a/fs/affs/super.c b/fs/affs/super.c index 104fdcb..135f0d3 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -298,6 +298,8 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) u8 sig[4]; int ret = -EINVAL; + lock_kernel(); + save_mount_options(sb, data); pr_debug("AFFS: read_super(%s)\n",data ? (const char *)data : "no options"); @@ -307,8 +309,10 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) sb->s_flags |= MS_NODIRATIME; sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; mutex_init(&sbi->s_bmlock); @@ -316,6 +320,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) &blocksize,&sbi->s_prefix, sbi->s_volume, &mount_flags)) { printk(KERN_ERR "AFFS: Error parsing options\n"); + unlock_kernel(); return -EINVAL; } /* N.B. after this point s_prefix must be released */ @@ -486,6 +491,7 @@ got_root: sb->s_root->d_op = &affs_dentry_operations; pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); + unlock_kernel(); return 0; /* @@ -500,6 +506,7 @@ out_error_noinode: kfree(sbi->s_prefix); kfree(sbi); sb->s_fs_info = NULL; + unlock_kernel(); return ret; } diff --git a/fs/afs/super.c b/fs/afs/super.c index e1ea1c2..108fb3e 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c @@ -294,12 +294,15 @@ static int afs_fill_super(struct super_block *sb, void *data) struct inode *inode = NULL; int ret; + lock_kernel(); + _enter(""); /* allocate a superblock info record */ as = kzalloc(sizeof(struct afs_super_info), GFP_KERNEL); if (!as) { _leave(" = -ENOMEM"); + unlock_kernel(); return -ENOMEM; } @@ -329,6 +332,7 @@ static int afs_fill_super(struct super_block *sb, void *data) sb->s_root = root; _leave(" = 0"); + unlock_kernel(); return 0; error_inode: @@ -342,6 +346,7 @@ error: sb->s_fs_info = NULL; _leave(" = %d", ret); + unlock_kernel(); return ret; } diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 69c8142..3adaba9 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c @@ -323,6 +323,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) struct autofs_sb_info *sbi; struct autofs_info *ino; + lock_kernel(); + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); if (!sbi) goto fail_unlock; @@ -418,6 +420,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) * Success! Install the root dentry now to indicate completion. */ s->s_root = root; + unlock_kernel(); return 0; /* @@ -439,6 +442,7 @@ fail_free: kfree(sbi); s->s_fs_info = NULL; fail_unlock: + unlock_kernel(); return -EINVAL; } diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 33baf27..f2aa193 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -759,6 +759,8 @@ befs_fill_super(struct super_block *sb, void *data, int silent) const unsigned long sb_block = 0; const off_t x86_sb_off = 512; + lock_kernel(); + save_mount_options(sb, data); sb->s_fs_info = kmalloc(sizeof (*befs_sb), GFP_KERNEL); @@ -867,6 +869,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) befs_sb->nls = load_nls_default(); } + unlock_kernel(); return 0; /*****************/ unacquire_bh: @@ -877,6 +880,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) unacquire_none: sb->s_fs_info = NULL; + unlock_kernel(); return ret; } diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 6f60336..4bff506 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c @@ -356,9 +356,13 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) long ret = -EINVAL; unsigned long i_sblock, i_eblock, i_eoff, s_size; + lock_kernel(); + info = kzalloc(sizeof(*info), GFP_KERNEL); - if (!info) + if (!info) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = info; sb_set_blocksize(s, BFS_BSIZE); @@ -463,6 +467,7 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) kfree(info->si_imap); kfree(info); s->s_fs_info = NULL; + unlock_kernel(); return -EIO; } @@ -484,12 +489,14 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) } dump_imap("read_super", s); mutex_init(&info->bfs_lock); + unlock_kernel(); return 0; out: brelse(bh); kfree(info); s->s_fs_info = NULL; + unlock_kernel(); return ret; } diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index c4e8353..ca0e22d 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c @@ -695,9 +695,13 @@ static int bm_fill_super(struct super_block * sb, void * data, int silent) [3] = {"register", &bm_register_operations, S_IWUSR}, /* last one */ {""} }; - int err = simple_fill_super(sb, 0x42494e4d, bm_files); + int err; + + lock_kernel(); + err = simple_fill_super(sb, 0x42494e4d, bm_files); if (!err) sb->s_op = &s_ops; + unlock_kernel(); return err; } diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 752a546..e5cd2cf 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -480,13 +480,17 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags, fmode_t mode = FMODE_READ; int error = 0; + lock_kernel(); + if (!(flags & MS_RDONLY)) mode |= FMODE_WRITE; error = btrfs_parse_early_options(data, mode, fs_type, &subvol_name, &fs_devices); - if (error) + if (error) { + unlock_kernel(); return error; + } error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices); if (error) @@ -555,6 +559,7 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags, mnt->mnt_root = root; kfree(subvol_name); + unlock_kernel(); return 0; error_s: @@ -563,6 +568,7 @@ error_close_devices: btrfs_close_devices(fs_devices); error_free_subvol_name: kfree(subvol_name); + unlock_kernel(); return error; } diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 9a5e4f5..09ccb9d 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -596,22 +596,30 @@ cifs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) { int rc; - struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL); + struct super_block *sb; + + lock_kernel(); + + sb = sget(fs_type, NULL, set_anon_super, NULL); cFYI(1, ("Devname: %s flags: %d ", dev_name, flags)); - if (IS_ERR(sb)) + if (IS_ERR(sb)) { + unlock_kernel(); return PTR_ERR(sb); + } sb->s_flags = flags; rc = cifs_read_super(sb, data, dev_name, flags & MS_SILENT ? 1 : 0); if (rc) { deactivate_locked_super(sb); + unlock_kernel(); return rc; } sb->s_flags |= MS_ACTIVE; simple_set_mnt(mnt, sb); + unlock_kernel(); return 0; } diff --git a/fs/coda/inode.c b/fs/coda/inode.c index 830f51a..d081fc5 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c @@ -147,6 +147,8 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) int error; int idx; + lock_kernel(); + idx = get_device_index((struct coda_mount_data *) data); /* Ignore errors in data, for backward compatibility */ @@ -158,11 +160,13 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) vc = &coda_comms[idx]; if (!vc->vc_inuse) { printk("coda_read_super: No pseudo device\n"); + unlock_kernel(); return -EINVAL; } if ( vc->vc_sb ) { printk("coda_read_super: Device already mounted\n"); + unlock_kernel(); return -EBUSY; } @@ -196,7 +200,8 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) sb->s_root = d_alloc_root(root); if (!sb->s_root) goto error; - return 0; + unlock_kernel(); + return 0; error: if (root) @@ -204,6 +209,7 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) if (vc) vc->vc_sb = NULL; + unlock_kernel(); return -EINVAL; } diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c index 8421cea..5b2e06e 100644 --- a/fs/configfs/mount.c +++ b/fs/configfs/mount.c @@ -71,6 +71,8 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) struct inode *inode; struct dentry *root; + lock_kernel(); + sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = CONFIGFS_MAGIC; @@ -87,6 +89,7 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) inc_nlink(inode); } else { pr_debug("configfs: could not get root inode\n"); + unlock_kernel(); return -ENOMEM; } @@ -94,12 +97,14 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) if (!root) { pr_debug("%s: could not get root dentry!\n",__func__); iput(inode); + unlock_kernel(); return -ENOMEM; } config_group_init(&configfs_root_group); configfs_root_group.cg_item.ci_dentry = root; root->d_fsdata = &configfs_root; sb->s_root = root; + unlock_kernel(); return 0; } diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index dd3634e..13e696a 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -227,11 +227,15 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent) struct cramfs_sb_info *sbi; struct inode *root; + lock_kernel(); + sb->s_flags |= MS_RDONLY; sbi = kzalloc(sizeof(struct cramfs_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; /* Invalidate the read buffers on mount: think disk change.. */ @@ -308,10 +312,12 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent) iput(root); goto out; } + unlock_kernel(); return 0; out: kfree(sbi); sb->s_fs_info = NULL; + unlock_kernel(); return -EINVAL; } diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index d5f8c96..e206eef 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -24,6 +24,7 @@ #include #include #include +#include /* just for lock_kernel() */ #define DEVPTS_DEFAULT_MODE 0600 /* @@ -363,17 +364,23 @@ static int devpts_get_sb(struct file_system_type *fs_type, struct pts_mount_opts opts; struct super_block *s; + lock_kernel(); + error = parse_mount_options(data, PARSE_MOUNT, &opts); - if (error) + if (error) { + unlock_kernel(); return error; + } if (opts.newinstance) s = sget(fs_type, NULL, set_anon_super, NULL); else s = sget(fs_type, compare_init_pts_sb, set_anon_super, NULL); - if (IS_ERR(s)) + if (IS_ERR(s)) { + unlock_kernel(); return PTR_ERR(s); + } if (!s->s_root) { s->s_flags = flags; @@ -391,6 +398,7 @@ static int devpts_get_sb(struct file_system_type *fs_type, if (error) goto out_dput; + unlock_kernel(); return 0; out_dput: @@ -398,6 +406,7 @@ out_dput: out_undo_sget: deactivate_locked_super(s); + unlock_kernel(); return error; } diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index c6ac85d..fdc7bda 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -600,6 +600,8 @@ static int ecryptfs_get_sb(struct file_system_type *fs_type, int flags, int rc; struct super_block *sb; + lock_kernel(); + rc = get_sb_nodev(fs_type, flags, raw_data, ecryptfs_fill_super, mnt); if (rc < 0) { printk(KERN_ERR "Getting sb failed; rc = [%d]\n", rc); @@ -621,6 +623,7 @@ out_abort: dput(sb->s_root); /* aka mnt->mnt_root, as set by get_sb_nodev() */ deactivate_locked_super(sb); out: + unlock_kernel(); return rc; } diff --git a/fs/efs/super.c b/fs/efs/super.c index f049428..0981141 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -249,9 +249,13 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) struct inode *root; int ret = -EINVAL; - sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL); - if (!sb) + lock_kernel(); + + sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL); + if (!sb) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = sb; s->s_magic = EFS_SUPER_MAGIC; @@ -319,12 +323,14 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) goto out_no_fs; } + unlock_kernel(); return 0; out_no_fs_ul: out_no_fs: s->s_fs_info = NULL; kfree(sb); + unlock_kernel(); return ret; } diff --git a/fs/exofs/super.c b/fs/exofs/super.c index 9f500de..ea045b8 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c @@ -297,9 +297,13 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) struct osd_obj_id obj; int ret; + lock_kernel(); + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; /* use mount options to fill superblock */ @@ -399,6 +403,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) out: if (or) osd_end_request(or); + unlock_kernel(); return ret; free_sbi: diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 1a9ffee..5af1775 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -745,15 +745,18 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) __le32 features; int err; + lock_kernel(); + + err = -ENOMEM; sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); if (!sbi) - return -ENOMEM; + goto failed_unlock; sbi->s_blockgroup_lock = kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); if (!sbi->s_blockgroup_lock) { kfree(sbi); - return -ENOMEM; + goto failed_unlock; } sb->s_fs_info = sbi; sbi->s_sb_block = sb_block; @@ -1063,6 +1066,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) ext2_warning(sb, __func__, "mounting ext3 filesystem as ext2"); ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY); + unlock_kernel(); return 0; cantfind_ext2: @@ -1086,6 +1090,8 @@ failed_sbi: sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); +failed_unlock: + unlock_kernel(); return ret; } diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 7a520a8..38261a5 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -1568,14 +1568,19 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) __le32 features; int err; + lock_kernel(); + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sbi->s_blockgroup_lock = kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); if (!sbi->s_blockgroup_lock) { kfree(sbi); + unlock_kernel(); return -ENOMEM; } sb->s_fs_info = sbi; @@ -1992,6 +1997,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) "writeback"); lock_kernel(); + unlock_kernel(); return 0; cantfind_ext3: @@ -2022,6 +2028,7 @@ out_fail: kfree(sbi->s_blockgroup_lock); kfree(sbi); lock_kernel(); + unlock_kernel(); return ret; } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 312211e..9db81d2 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2328,14 +2328,19 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) int err; unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; + lock_kernel(); + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sbi->s_blockgroup_lock = kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); if (!sbi->s_blockgroup_lock) { kfree(sbi); + unlock_kernel(); return -ENOMEM; } sb->s_fs_info = sbi; @@ -2913,7 +2918,6 @@ no_journal: ext4_msg(sb, KERN_INFO, "mounted filesystem with%s", descr); - lock_kernel(); return 0; cantfind_ext4: @@ -2959,7 +2963,6 @@ out_fail: sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); - lock_kernel(); return ret; } diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index bbc94ae..31dd072 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c @@ -662,12 +662,16 @@ static int msdos_fill_super(struct super_block *sb, void *data, int silent) { int res; + lock_kernel(); res = fat_fill_super(sb, data, silent, &msdos_dir_inode_operations, 0); - if (res) + if (res) { + unlock_kernel(); return res; + } sb->s_flags |= MS_NOATIME; sb->s_root->d_op = &msdos_dentry_operations; + unlock_kernel(); return 0; } diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index f565f24..12961b8 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -1044,15 +1044,19 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent) { int res; + lock_kernel(); res = fat_fill_super(sb, data, silent, &vfat_dir_inode_operations, 1); - if (res) + if (res) { + unlock_kernel(); return res; + } if (MSDOS_SB(sb)->options.name_check != 's') sb->s_root->d_op = &vfat_ci_dentry_ops; else sb->s_root->d_op = &vfat_dentry_ops; + unlock_kernel(); return 0; } diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index 1e8af93..b8b7821 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c @@ -148,7 +148,7 @@ static int vxfs_remount(struct super_block *sb, int *flags, char *data) * The superblock on success, else %NULL. * * Locking: - * We are under the bkl and @sbp->s_lock. + * We are under @sbp->s_lock. */ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) { @@ -159,11 +159,14 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) struct inode *root; int ret = -EINVAL; + lock_kernel(); + sbp->s_flags |= MS_RDONLY; infp = kzalloc(sizeof(*infp), GFP_KERNEL); if (!infp) { printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n"); + unlock_kernel(); return -ENOMEM; } @@ -236,6 +239,7 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) goto out_free_ilist; } + unlock_kernel(); return 0; out_free_ilist: @@ -245,6 +249,7 @@ out_free_ilist: out: brelse(bp); kfree(infp); + unlock_kernel(); return ret; } diff --git a/fs/fuse/control.c b/fs/fuse/control.c index 3773fd6..8d769f7 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c @@ -10,6 +10,7 @@ #include #include +#include /* just for lock_kernel() */ #define FUSE_CTL_SUPER_MAGIC 0x65735543 @@ -297,9 +298,13 @@ static int fuse_ctl_fill_super(struct super_block *sb, void *data, int silent) struct fuse_conn *fc; int err; + lock_kernel(); + err = simple_fill_super(sb, FUSE_CTL_SUPER_MAGIC, &empty_descr); - if (err) + if (err) { + unlock_kernel(); return err; + } mutex_lock(&fuse_mutex); BUG_ON(fuse_control_sb); @@ -309,10 +314,12 @@ static int fuse_ctl_fill_super(struct super_block *sb, void *data, int silent) if (err) { fuse_control_sb = NULL; mutex_unlock(&fuse_mutex); + unlock_kernel(); return err; } } mutex_unlock(&fuse_mutex); + unlock_kernel(); return 0; } diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 1a822ce..5690279 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -20,6 +20,7 @@ #include #include #include +#include /* Only for lock_kernel() */ MODULE_AUTHOR("Miklos Szeredi "); MODULE_DESCRIPTION("Filesystem in Userspace"); @@ -919,6 +920,8 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) int err; int is_bdev = sb->s_bdev != NULL; + lock_kernel(); + err = -EINVAL; if (sb->s_flags & MS_MANDLOCK) goto err; @@ -1022,6 +1025,7 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) fuse_send_init(fc, init_req); + unlock_kernel(); return 0; err_unlock: @@ -1036,6 +1040,7 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) err_fput: fput(file); err: + unlock_kernel(); return err; } diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 52fb6c0..76415fe 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -1120,9 +1120,12 @@ static int fill_super(struct super_block *sb, void *data, int silent) struct gfs2_holder mount_gh; int error; + lock_kernel(); + sdp = init_sbd(sb); if (!sdp) { printk(KERN_WARNING "GFS2: can't alloc struct gfs2_sbd\n"); + unlock_kernel(); return -ENOMEM; } @@ -1211,6 +1214,7 @@ static int fill_super(struct super_block *sb, void *data, int silent) gfs2_glock_dq_uninit(&mount_gh); gfs2_online_uevent(sdp); + unlock_kernel(); return 0; fail_threads: @@ -1240,6 +1244,7 @@ fail: gfs2_delete_debugfs_file(sdp); kfree(sdp); sb->s_fs_info = NULL; + unlock_kernel(); return error; } @@ -1268,10 +1273,12 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags, struct path path; int error; + lock_kernel(); error = kern_path(dev_name, LOOKUP_FOLLOW, &path); if (error) { printk(KERN_WARNING "GFS2: path_lookup on %s returned error %d\n", dev_name, error); + unlock_kernel(); return error; } s = sget(&gfs2_fs_type, test_meta_super, set_meta_super, @@ -1279,11 +1286,13 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags, path_put(&path); if (IS_ERR(s)) { printk(KERN_WARNING "GFS2: gfs2 mount does not exist\n"); + unlock_kernel(); return PTR_ERR(s); } sdp = s->s_fs_info; mnt->mnt_sb = s; mnt->mnt_root = dget(sdp->sd_master_dir); + unlock_kernel(); return 0; } diff --git a/fs/hfs/super.c b/fs/hfs/super.c index f7fcbe4..a2e19ff 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -381,9 +381,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) struct inode *root_inode; int res; + lock_kernel(); + sbi = kzalloc(sizeof(struct hfs_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; INIT_HLIST_HEAD(&sbi->rsrc_inodes); @@ -429,6 +433,7 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_root->d_op = &hfs_dentry_operations; /* everything's okay */ + unlock_kernel(); return 0; bail_iput: @@ -437,6 +442,7 @@ bail_no_root: printk(KERN_ERR "hfs: get root inode failed.\n"); bail: hfs_mdb_put(sb); + unlock_kernel(); return res; } diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 43022f3..824f57a 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -312,9 +312,13 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) struct nls_table *nls = NULL; int err = -EINVAL; + lock_kernel(); + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; INIT_HLIST_HEAD(&sbi->rsrc_inodes); @@ -459,11 +463,13 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) out: unload_nls(sbi->nls); sbi->nls = nls; + unlock_kernel(); return 0; cleanup: hfsplus_put_super(sb); unload_nls(nls); + unlock_kernel(); return err; } diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 032604e..5eb2c26 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -968,6 +968,8 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) char *host_root_path, *req_root = d; int err; + lock_kernel(); + sb->s_blocksize = 1024; sb->s_blocksize_bits = 10; sb->s_magic = HOSTFS_SUPER_MAGIC; @@ -1016,6 +1018,7 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) goto out; } + unlock_kernel(); return 0; out_put: @@ -1023,6 +1026,7 @@ out_put: out_free: kfree(host_root_path); out: + unlock_kernel(); return err; } diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index f2feaa0..a7b348a 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c @@ -477,11 +477,15 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) int o; + lock_kernel(); + save_mount_options(s, options); sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = sbi; sbi->sb_bmp_dir = NULL; @@ -666,6 +670,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) root->i_blocks = 5; hpfs_brelse4(&qbh); } + unlock_kernel(); return 0; bail4: brelse(bh2); @@ -677,6 +682,7 @@ bail0: kfree(sbi->sb_cp_table); s->s_fs_info = NULL; kfree(sbi); + unlock_kernel(); return -EINVAL; } diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index a5089a6..6263973 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c @@ -712,6 +712,8 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent) struct vfsmount *proc_mnt; int err = -ENOENT; + lock_kernel(); + proc_mnt = do_kern_mount("proc", 0, "proc", NULL); if (IS_ERR(proc_mnt)) goto out; @@ -731,6 +733,7 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent) if (!sb->s_root) goto out_iput; + unlock_kernel(); return 0; out_iput: @@ -738,6 +741,7 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent) out_mntput: mntput(proc_mnt); out: + unlock_kernel(); return(err); } diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 87a1258..53be2b9 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -32,6 +32,7 @@ #include #include #include +#include /* Only for lock_kernel() */ #include @@ -824,6 +825,7 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent) struct hugetlbfs_config config; struct hugetlbfs_sb_info *sbinfo; + lock_kernel(); save_mount_options(sb, data); config.nr_blocks = -1; /* No limit on size by default */ @@ -833,12 +835,16 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent) config.mode = 0755; config.hstate = &default_hstate; ret = hugetlbfs_parse_options(data, &config); - if (ret) + if (ret) { + unlock_kernel(); return ret; + } sbinfo = kmalloc(sizeof(struct hugetlbfs_sb_info), GFP_KERNEL); - if (!sbinfo) + if (!sbinfo) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbinfo; sbinfo->hstate = config.hstate; spin_lock_init(&sbinfo->stat_lock); @@ -863,9 +869,11 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent) goto out_free; } sb->s_root = root; + unlock_kernel(); return 0; out_free: kfree(sbinfo); + unlock_kernel(); return -ENOMEM; } diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 6b4dcd4..7c501d5 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -571,11 +571,15 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) int table, error = -EINVAL; unsigned int vol_desc_start; + lock_kernel(); + save_mount_options(s, data); sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = sbi; if (!parse_options((char *)data, &opt)) @@ -895,6 +899,7 @@ root_found: kfree(opt.iocharset); + unlock_kernel(); return 0; /* @@ -934,6 +939,7 @@ out_freesbi: kfree(opt.iocharset); kfree(sbi); s->s_fs_info = NULL; + unlock_kernel(); return error; } diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 9a80e8e..622bd51 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c @@ -148,14 +148,19 @@ static const struct super_operations jffs2_super_operations = static int jffs2_fill_super(struct super_block *sb, void *data, int silent) { struct jffs2_sb_info *c; + int ret; + + lock_kernel(); D1(printk(KERN_DEBUG "jffs2_get_sb_mtd():" " New superblock for device %d (\"%s\")\n", sb->s_mtd->index, sb->s_mtd->name)); c = kzalloc(sizeof(*c), GFP_KERNEL); - if (!c) + if (!c) { + unlock_kernel(); return -ENOMEM; + } c->mtd = sb->s_mtd; c->os_priv = sb; @@ -177,7 +182,9 @@ static int jffs2_fill_super(struct super_block *sb, void *data, int silent) #ifdef CONFIG_JFFS2_FS_POSIX_ACL sb->s_flags |= MS_POSIXACL; #endif - return jffs2_do_fill_super(sb, data, silent); + ret = jffs2_do_fill_super(sb, data, silent); + unlock_kernel(); + return ret; } static int jffs2_get_sb(struct file_system_type *fs_type, diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 2234c73..329d7b6 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -425,14 +425,20 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) s64 newLVSize = 0; int flag, ret = -EINVAL; + lock_kernel(); + jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags); - if (!new_valid_dev(sb->s_bdev->bd_dev)) + if (!new_valid_dev(sb->s_bdev->bd_dev)) { + unlock_kernel(); return -EOVERFLOW; + } sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; sbi->sb = sb; sbi->uid = sbi->gid = sbi->umask = -1; @@ -442,6 +448,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) if (!parse_options((char *) data, sb, &newLVSize, &flag)) { kfree(sbi); + unlock_kernel(); return -EINVAL; } sbi->flag = flag; @@ -452,6 +459,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) if (newLVSize) { printk(KERN_ERR "resize option for remount only\n"); + unlock_kernel(); return -EINVAL; } @@ -527,6 +535,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, sb->s_maxbytes); #endif sb->s_time_gran = 1; + unlock_kernel(); return 0; out_no_root: @@ -548,6 +557,7 @@ out_kfree: if (sbi->nls_tab) unload_nls(sbi->nls_tab); kfree(sbi); + unlock_kernel(); return ret; } diff --git a/fs/libfs.c b/fs/libfs.c index 219576c..3484040 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -11,6 +11,7 @@ #include #include #include +#include /* Only for lock_kernel() */ #include @@ -422,6 +423,8 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files struct dentry *dentry; int i; + lock_kernel(); + s->s_blocksize = PAGE_CACHE_SIZE; s->s_blocksize_bits = PAGE_CACHE_SHIFT; s->s_magic = magic; @@ -429,8 +432,10 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files s->s_time_gran = 1; inode = new_inode(s); - if (!inode) + if (!inode) { + unlock_kernel(); return -ENOMEM; + } /* * because the root inode is 1, the files array must not contain an * entry at index 1 @@ -444,6 +449,7 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files root = d_alloc_root(inode); if (!root) { iput(inode); + unlock_kernel(); return -ENOMEM; } for (i = 0; !files->name || files->name[0]; i++, files++) { @@ -469,10 +475,12 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files d_add(dentry, inode); } s->s_root = root; + unlock_kernel(); return 0; out: d_genocide(root); dput(root); + unlock_kernel(); return -ENOMEM; } diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 74ea82d..b8aa0a6 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -147,9 +147,13 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) struct minix_sb_info *sbi; int ret = -EINVAL; + lock_kernel(); + sbi = kzalloc(sizeof(struct minix_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = sbi; BUILD_BUG_ON(32 != sizeof (struct minix_inode)); @@ -265,6 +269,7 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) else if (sbi->s_mount_state & MINIX_ERROR_FS) printk("MINIX-fs: mounting file system with errors, " "running fsck is recommended\n"); + unlock_kernel(); return 0; out_iput: @@ -314,6 +319,7 @@ out_bad_sb: out: s->s_fs_info = NULL; kfree(sbi); + unlock_kernel(); return ret; } diff --git a/fs/namespace.c b/fs/namespace.c index bdc3cb4..3f95497 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1647,9 +1647,7 @@ static int do_new_mount(struct path *path, char *type, int flags, if (!capable(CAP_SYS_ADMIN)) return -EPERM; - lock_kernel(); mnt = do_kern_mount(type, flags, name, data); - unlock_kernel(); if (IS_ERR(mnt)) return PTR_ERR(mnt); diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index cf98da1..a020d86 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -445,10 +445,14 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) #endif struct ncp_entry_info finfo; + lock_kernel(); + data.wdog_pid = NULL; server = kzalloc(sizeof(struct ncp_server), GFP_KERNEL); - if (!server) + if (!server) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = server; error = -EFAULT; @@ -695,6 +699,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) if (!sb->s_root) goto out_no_root; sb->s_root->d_op = &ncp_root_dentry_operations; + unlock_kernel(); return 0; out_no_root: @@ -729,6 +734,7 @@ out: put_pid(data.wdog_pid); sb->s_fs_info = NULL; kfree(server); + unlock_kernel(); return error; } diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 90be551..1f97aad 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1877,6 +1877,8 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) options->version <= 6)))) return 0; + lock_kernel(); + data = kzalloc(sizeof(*data), GFP_KERNEL); if (data == NULL) return -ENOMEM; @@ -2184,6 +2186,7 @@ out: out_free_fh: kfree(mntfh); kfree(data); + unlock_kernel(); return error; out_err_nosb: @@ -2227,6 +2230,8 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, }; int error; + lock_kernel(); + dprintk("--> nfs_xdev_get_sb()\n"); /* create a new volume representation */ @@ -2281,17 +2286,20 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, security_sb_clone_mnt_opts(data->sb, s); dprintk("<-- nfs_xdev_get_sb() = 0\n"); + unlock_kernel(); return 0; out_err_nosb: nfs_free_server(server); out_err_noserver: dprintk("<-- nfs_xdev_get_sb() = %d [error]\n", error); + unlock_kernel(); return error; error_splat_super: deactivate_locked_super(s); dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); + unlock_kernel(); return error; } @@ -2475,6 +2483,8 @@ static int nfs4_remote_get_sb(struct file_system_type *fs_type, }; int error = -ENOMEM; + lock_kernel(); + mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL); if (data == NULL || mntfh == NULL) goto out_free_fh; @@ -2534,6 +2544,7 @@ out: security_free_mnt_opts(&data->lsm_opts); out_free_fh: kfree(mntfh); + unlock_kernel(); return error; out_free: @@ -2794,6 +2805,8 @@ static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, }; int error; + lock_kernel(); + dprintk("--> nfs4_referral_get_sb()\n"); /* create a new volume representation */ @@ -2847,17 +2860,20 @@ static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, security_sb_clone_mnt_opts(data->sb, s); dprintk("<-- nfs4_referral_get_sb() = 0\n"); + unlock_kernel(); return 0; out_err_nosb: nfs_free_server(server); out_err_noserver: dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error); + unlock_kernel(); return error; error_splat_super: deactivate_locked_super(s); dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); + unlock_kernel(); return error; } @@ -2873,6 +2889,8 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, struct vfsmount *root_mnt; int error; + lock_kernel(); + dprintk("--> nfs4_referral_get_sb()\n"); export_path = data->mnt_path; @@ -2890,6 +2908,7 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, out: dprintk("<-- nfs4_referral_get_sb() = %d%s\n", error, error != 0 ? " [error]" : ""); + unlock_kernel(); return error; } diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 5c01fc1..dcaef52 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -1347,7 +1347,12 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) #endif /* last one */ {""} }; - return simple_fill_super(sb, 0x6e667364, nfsd_files); + int ret; + + lock_kernel(); + ret = simple_fill_super(sb, 0x6e667364, nfsd_files); + unlock_kernel(); + return ret; } static int nfsd_get_sb(struct file_system_type *fs_type, diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 644e667..3448ec3 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c @@ -1059,9 +1059,13 @@ nilfs_get_sb(struct file_system_type *fs_type, int flags, struct the_nilfs *nilfs; int err, need_to_close = 1; + lock_kernel(); + sd.bdev = open_bdev_exclusive(dev_name, flags, fs_type); - if (IS_ERR(sd.bdev)) + if (IS_ERR(sd.bdev)) { + unlock_kernel(); return PTR_ERR(sd.bdev); + } /* * To get mount instance using sget() vfs-routine, NILFS needs @@ -1142,6 +1146,7 @@ nilfs_get_sb(struct file_system_type *fs_type, int flags, if (need_to_close) close_bdev_exclusive(sd.bdev, flags); simple_set_mnt(mnt, s); + unlock_kernel(); return 0; failed_unlock: @@ -1150,6 +1155,7 @@ nilfs_get_sb(struct file_system_type *fs_type, int flags, failed: close_bdev_exclusive(sd.bdev, flags); + unlock_kernel(); return err; cancel_new: @@ -1163,6 +1169,7 @@ nilfs_get_sb(struct file_system_type *fs_type, int flags, * We must finish all post-cleaning before this call; * put_nilfs() needs the block device. */ + unlock_kernel(); return err; } diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 80b0477..ab09c02 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c @@ -2723,6 +2723,8 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) struct inode *tmp_ino; int blocksize, result; + lock_kernel(); + /* * We do a pretty difficult piece of bootstrap by reading the * MFT (and other metadata) from disk into memory. We'll only @@ -2746,6 +2748,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) ntfs_error(sb, "Allocation of NTFS volume structure " "failed. Aborting mount..."); lockdep_on(); + unlock_kernel(); return -ENOMEM; } /* Initialize ntfs_volume structure. */ @@ -2933,6 +2936,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) sb->s_export_op = &ntfs_export_ops; lock_kernel(); lockdep_on(); + unlock_kernel(); return 0; } ntfs_error(sb, "Failed to allocate root directory."); @@ -3053,6 +3057,7 @@ err_out_now: kfree(vol); ntfs_debug("Failed, returning -EINVAL."); lockdep_on(); + unlock_kernel(); return -EINVAL; } diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 02bf178..58ce813 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -528,21 +528,27 @@ static int dlmfs_fill_super(struct super_block * sb, struct inode * inode; struct dentry * root; + lock_kernel(); + sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = DLMFS_MAGIC; sb->s_op = &dlmfs_ops; inode = dlmfs_get_root_inode(sb); - if (!inode) + if (!inode) { + unlock_kernel(); return -ENOMEM; + } root = d_alloc_root(inode); if (!root) { iput(inode); + unlock_kernel(); return -ENOMEM; } sb->s_root = root; + unlock_kernel(); return 0; } diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index c0e48ae..fab815f 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -986,6 +986,8 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) char nodestr[8]; struct ocfs2_blockcheck_stats stats; + lock_kernel(); + mlog_entry("%p, %p, %i", sb, data, silent); if (!ocfs2_parse_options(sb, data, &parsed_options, 0)) { @@ -1172,6 +1174,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) atomic_set(&osb->vol_state, VOLUME_DISABLED); wake_up(&osb->osb_mount_event); mlog_exit(status); + unlock_kernel(); return status; } } @@ -1186,6 +1189,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) ocfs2_orphan_scan_start(osb); mlog_exit(status); + unlock_kernel(); return status; read_super_error: @@ -1201,6 +1205,7 @@ read_super_error: } mlog_exit(status); + unlock_kernel(); return status; } diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index f3b7c15..ddfbb22 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c @@ -416,11 +416,15 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent) sector_t start; int ret = -EINVAL; + lock_kernel(); + save_mount_options(sb, (char *) data); sbi = kzalloc(sizeof(struct omfs_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; @@ -525,6 +529,7 @@ out_brelse_bh2: out_brelse_bh: brelse(bh); end: + unlock_kernel(); return ret; } diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index ffcd04f..50dc4be 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -386,6 +386,8 @@ static int openprom_fill_super(struct super_block *s, void *data, int silent) struct op_inode_info *oi; int ret; + lock_kernel(); + s->s_flags |= MS_NOATIME; s->s_blocksize = 1024; s->s_blocksize_bits = 10; @@ -405,6 +407,7 @@ static int openprom_fill_super(struct super_block *s, void *data, int silent) s->s_root = d_alloc_root(root_inode); if (!s->s_root) goto out_no_root_dentry; + unlock_kernel(); return 0; out_no_root_dentry: @@ -412,6 +415,7 @@ out_no_root_dentry: ret = -ENOMEM; out_no_root: printk("openprom_fill_super: get root inode failed\n"); + unlock_kernel(); return ret; } diff --git a/fs/proc/root.c b/fs/proc/root.c index b080b79..6384680 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -18,6 +18,7 @@ #include #include #include +#include /* For lock_kernel() only */ #include "internal.h" @@ -43,6 +44,8 @@ static int proc_get_sb(struct file_system_type *fs_type, struct pid_namespace *ns; struct proc_inode *ei; + lock_kernel(); + if (proc_mnt) { /* Seed the root directory with a pid so it doesn't need * to be special in base.c. I would do this earlier but @@ -60,14 +63,17 @@ static int proc_get_sb(struct file_system_type *fs_type, ns = current->nsproxy->pid_ns; sb = sget(fs_type, proc_test_super, proc_set_super, ns); - if (IS_ERR(sb)) + if (IS_ERR(sb)) { + unlock_kernel(); return PTR_ERR(sb); + } if (!sb->s_root) { sb->s_flags = flags; err = proc_fill_super(sb); if (err) { deactivate_locked_super(sb); + unlock_kernel(); return err; } @@ -83,6 +89,7 @@ static int proc_get_sb(struct file_system_type *fs_type, } simple_set_mnt(mnt, sb); + unlock_kernel(); return 0; } diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index d2cd179..18640ce 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c @@ -253,9 +253,13 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) struct qnx4_sb_info *qs; int ret = -EINVAL; + lock_kernel(); + qs = kzalloc(sizeof(struct qnx4_sb_info), GFP_KERNEL); - if (!qs) + if (!qs) { + unlock_kernel(); return -ENOMEM; + } s->s_fs_info = qs; sb_set_blocksize(s, QNX4_BLOCK_SIZE); @@ -303,6 +307,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) brelse(bh); + unlock_kernel(); return 0; outi: @@ -312,6 +317,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) outnobh: kfree(qs); s->s_fs_info = NULL; + unlock_kernel(); return ret; } diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index a6090aa..9b3983f 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c @@ -35,6 +35,7 @@ #include #include #include +#include /* Only for lock_kernel() */ #include #include "internal.h" @@ -220,6 +221,8 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent) struct dentry *root; int err; + lock_kernel(); + save_mount_options(sb, data); fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL); @@ -253,11 +256,13 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent) goto fail; } + unlock_kernel(); return 0; fail: kfree(fsi); sb->s_fs_info = NULL; iput(inode); + unlock_kernel(); return err; } diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index f0ad05f..f32bf62 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1608,6 +1608,8 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) char *qf_names[MAXQUOTAS] = {}; unsigned int qfmt = 0; + lock_kernel(); + save_mount_options(s, data); sbi = kzalloc(sizeof(struct reiserfs_sb_info), GFP_KERNEL); @@ -1852,6 +1854,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) init_waitqueue_head(&(sbi->s_wait)); spin_lock_init(&sbi->bitmap_lock); + unlock_kernel(); return (0); error: @@ -1872,6 +1875,7 @@ error: kfree(sbi); s->s_fs_info = NULL; + unlock_kernel(); return errval; } diff --git a/fs/romfs/super.c b/fs/romfs/super.c index c117fa8..7342617 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -468,6 +468,8 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent) size_t len; int ret; + lock_kernel(); + #ifdef CONFIG_BLOCK if (!sb->s_mtd) { sb_set_blocksize(sb, ROMBSIZE); @@ -484,8 +486,10 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent) /* read the image superblock and check it */ rsb = kmalloc(512, GFP_KERNEL); - if (!rsb) + if (!rsb) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = (void *) 512; ret = romfs_dev_read(sb, 0, rsb, 512); @@ -535,15 +539,18 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent) if (!sb->s_root) goto error_i; + unlock_kernel(); return 0; error_i: iput(root); error: + unlock_kernel(); return -EINVAL; error_rsb_inval: ret = -EINVAL; error_rsb: + unlock_kernel(); return ret; } diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index 1c4c8f0..c3c9044 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c @@ -500,6 +500,8 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) void *mem; static int warn_count; + lock_kernel(); + if (warn_count < 5) { warn_count++; printk(KERN_EMERG "smbfs is deprecated and will be removed" @@ -615,6 +617,7 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) smb_new_dentry(sb->s_root); + unlock_kernel(); return 0; out_no_root: @@ -635,9 +638,11 @@ out_wrong_data: out_no_data: printk(KERN_ERR "smb_fill_super: missing data argument\n"); out_fail: + unlock_kernel(); return -EINVAL; out_no_server: printk(KERN_ERR "smb_fill_super: cannot allocate struct smb_sb_info\n"); + unlock_kernel(); return -ENOMEM; } diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 6c197ef..23cea83 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -78,11 +78,14 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent) u64 lookup_table_start; int err; + lock_kernel(); + TRACE("Entered squashfs_fill_superblock\n"); sb->s_fs_info = kzalloc(sizeof(*msblk), GFP_KERNEL); if (sb->s_fs_info == NULL) { ERROR("Failed to allocate squashfs_sb_info\n"); + unlock_kernel(); return -ENOMEM; } msblk = sb->s_fs_info; @@ -286,6 +289,7 @@ allocate_root: TRACE("Leaving squashfs_fill_super\n"); kfree(sblk); + unlock_kernel(); return 0; failed_mount: @@ -299,12 +303,14 @@ failed_mount: kfree(sb->s_fs_info); sb->s_fs_info = NULL; kfree(sblk); + unlock_kernel(); return err; failure: kfree(msblk->stream.workspace); kfree(sb->s_fs_info); sb->s_fs_info = NULL; + unlock_kernel(); return -ENOMEM; } diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c index 4974995..2e5a870 100644 --- a/fs/sysfs/mount.c +++ b/fs/sysfs/mount.c @@ -18,6 +18,7 @@ #include #include #include +#include /* Only for lock_kernel() */ #include "sysfs.h" @@ -45,6 +46,8 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) struct inode *inode; struct dentry *root; + lock_kernel(); + sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = SYSFS_MAGIC; @@ -58,6 +61,7 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) mutex_unlock(&sysfs_mutex); if (!inode) { pr_debug("sysfs: could not get root inode\n"); + unlock_kernel(); return -ENOMEM; } @@ -66,10 +70,12 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) if (!root) { pr_debug("%s: could not get root dentry!\n",__func__); iput(inode); + unlock_kernel(); return -ENOMEM; } root->d_fsdata = &sysfs_root; sb->s_root = root; + unlock_kernel(); return 0; } diff --git a/fs/sysv/super.c b/fs/sysv/super.c index 5a903da..145d949 100644 --- a/fs/sysv/super.c +++ b/fs/sysv/super.c @@ -357,7 +357,9 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent) struct sysv_sb_info *sbi; unsigned long blocknr; int size = 0, i; - + + lock_kernel(); + BUILD_BUG_ON(1024 != sizeof (struct xenix_super_block)); BUILD_BUG_ON(512 != sizeof (struct sysv4_super_block)); BUILD_BUG_ON(512 != sizeof (struct sysv2_super_block)); @@ -365,8 +367,10 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent) BUILD_BUG_ON(64 != sizeof (struct sysv_inode)); sbi = kzalloc(sizeof(struct sysv_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sbi->s_sb = sb; sbi->s_block_base = 0; @@ -409,8 +413,10 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent) if (bh && bh1) { sbi->s_bh1 = bh1; sbi->s_bh2 = bh; - if (complete_read_super(sb, silent, size)) + if (complete_read_super(sb, silent, size)) { + unlock_kernel(); return 0; + } } brelse(bh1); @@ -419,6 +425,7 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent) printk("oldfs: cannot read superblock\n"); failed: kfree(sbi); + unlock_kernel(); return -EINVAL; Eunknown: @@ -442,14 +449,18 @@ static int v7_fill_super(struct super_block *sb, void *data, int silent) struct v7_super_block *v7sb; struct sysv_inode *v7i; + lock_kernel(); + if (440 != sizeof (struct v7_super_block)) panic("V7 FS: bad super-block size"); if (64 != sizeof (struct sysv_inode)) panic("sysv fs: bad i-node size"); sbi = kzalloc(sizeof(struct sysv_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sbi->s_sb = sb; sbi->s_block_base = 0; @@ -487,13 +498,16 @@ static int v7_fill_super(struct super_block *sb, void *data, int silent) sbi->s_bh1 = bh; sbi->s_bh2 = bh; - if (complete_read_super(sb, silent, 1)) + if (complete_read_super(sb, silent, 1)) { + unlock_kernel(); return 0; + } failed: brelse(bh2); brelse(bh); kfree(sbi); + unlock_kernel(); return -EINVAL; } diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 333e181..04a0fc9 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -2029,6 +2029,8 @@ static int ubifs_get_sb(struct file_system_type *fs_type, int flags, struct super_block *sb; int err; + lock_kernel(); + dbg_gen("name %s, flags %#x", name, flags); /* @@ -2040,6 +2042,7 @@ static int ubifs_get_sb(struct file_system_type *fs_type, int flags, if (IS_ERR(ubi)) { ubifs_err("cannot open \"%s\", error %d", name, (int)PTR_ERR(ubi)); + unlock_kernel(); return PTR_ERR(ubi); } ubi_get_volume_info(ubi, &vi); @@ -2077,12 +2080,14 @@ static int ubifs_get_sb(struct file_system_type *fs_type, int flags, ubi_close_volume(ubi); simple_set_mnt(mnt, sb); + unlock_kernel(); return 0; out_deact: deactivate_locked_super(sb); out_close: ubi_close_volume(ubi); + unlock_kernel(); return err; } diff --git a/fs/udf/super.c b/fs/udf/super.c index 9d1b8c2..fa6f8db 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -1866,6 +1866,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) struct kernel_lb_addr rootdir, fileset; struct udf_sb_info *sbi; + lock_kernel(); + uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); uopt.uid = -1; uopt.gid = -1; @@ -1874,8 +1876,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) uopt.dmode = UDF_INVALID_MODE; sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); - if (!sbi) + if (!sbi) { + unlock_kernel(); return -ENOMEM; + } sb->s_fs_info = sbi; @@ -2021,6 +2025,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) goto error_out; } sb->s_maxbytes = MAX_LFS_FILESIZE; + unlock_kernel(); return 0; error_out: @@ -2041,6 +2046,7 @@ error_out: kfree(sbi); sb->s_fs_info = NULL; + unlock_kernel(); return -EINVAL; } diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 5faed79..31ad198 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -646,6 +646,8 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) unsigned maxsymlen; int ret = -EINVAL; + lock_kernel(); + uspi = NULL; ubh = NULL; flags = 0; @@ -1107,6 +1109,7 @@ magic_found: goto failed; UFSD("EXIT\n"); + unlock_kernel(); return 0; dalloc_failed: @@ -1118,10 +1121,12 @@ failed: kfree(sbi); sb->s_fs_info = NULL; UFSD("EXIT (FAILED)\n"); + unlock_kernel(); return ret; failed_nomem: UFSD("EXIT (NOMEM)\n"); + unlock_kernel(); return -ENOMEM; } diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 18a4b8e..7426166 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1412,6 +1412,8 @@ xfs_fs_fill_super( int flags = 0, error = ENOMEM; char *mtpt = NULL; + lock_kernel(); + mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); if (!mp) goto out; @@ -1506,6 +1508,7 @@ xfs_fs_fill_super( kfree(mtpt); xfs_itrace_exit(XFS_I(sb->s_root->d_inode)); + unlock_kernel(); return 0; out_filestream_unmount: @@ -1522,6 +1525,7 @@ xfs_fs_fill_super( kfree(mtpt); kfree(mp); out: + unlock_kernel(); return -error; fail_vnrele: -- 1.6.4.2 From michael.monnerie@is.it-management.at Mon Nov 2 05:05:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2B5MVZ035634 for ; Mon, 2 Nov 2009 05:05:24 -0600 X-ASG-Debug-ID: 1257159931-388400d80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 082BE14CD492 for ; Mon, 2 Nov 2009 03:05:31 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id dESBNfPtkuUiHIFw for ; Mon, 02 Nov 2009 03:05:31 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id BD780C3AB09 for ; Mon, 2 Nov 2009 12:05:28 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 7F71940016F for ; Mon, 2 Nov 2009 12:05:28 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Date: Mon, 2 Nov 2009 12:05:27 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <4AEC2CF4.8040703@aol.com> <4AEC4BAA.20606@aol.com> <20091031174836.3fc9505b@galadriel.home> In-Reply-To: <20091031174836.3fc9505b@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911021205.28006@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257159933 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13520 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Samstag 31 Oktober 2009 Emmanuel Florac wrote: > Another trick is to mkfs the drive with su and sw matching the > underlying RAID, for instance for a 15 drives RAID6 with 64K stripe > use something like (beware, unverified syntax from memory): > > mkfs -t xfs -d su=65536,sw=15 /dev/sdXX I believe for a 15 drive RAID-6, where 2 disks are used for redundancy, the correct mkfs would be: mkfs -t xfs -d su=65536,sw=13 /dev/sdXX That is, you tell XFS how many *data disks* there are, not how many disks the RAID uses, because the important thing is that XFS should distribute it's metadata over different disks. One thing you could try: Each 2 minutes, create a new dir and store new files there. It could well be that XFS becomes slower when having a certain amount of files in a dir. If you change the dir, and now everything writes without drops, that should be the problem. If you can't change the dir for your application, start a small batch job that moves the files to another dir, or removes them. Another thing to try is if it would help to turn disk cache writes *on*, despite all warnings if the FAQ. That could also give an idea where to look at next time. mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From info@globalnetstore.com Mon Nov 2 11:03:29 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.8 required=5.0 tests=BAYES_50,HTML_IMAGE_ONLY_32, HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2H3Sei072780 for ; Mon, 2 Nov 2009 11:03:28 -0600 X-ASG-Debug-ID: 1257181419-1a2900870000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail2.globalnetstore.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 4961314CF4A8 for ; Mon, 2 Nov 2009 09:03:39 -0800 (PST) Received: from mail2.globalnetstore.com (mail2.globalnetstore.com [208.53.152.59]) by cuda.sgi.com with SMTP id XCmzRQXozIjqR3hV for ; Mon, 02 Nov 2009 09:03:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; d=globalnetstore.com; s=dkim; t=1257181419; bh=u4ShdIYJA9XzawYaf4A5PT9iGcs=; h=To:From:Reply-To:Subject:Date:MIME-Version:List-Unsubscribe: Content-type; b=WgzfShsWG/wN64zJbg2J99dx/eolVjfz/4GV/n0AmwMtylu3w53lW3XCSLsj7W3zT iK38kCJkplnM1ipqnrcD3HiPFV6EgZp/Iyx9qQ4HaqKYyldw1GhsSCg3qBJNODzC94 iWvDR/FvIQrnWeU4+oXuIVU15ZODDUopLPQIqIr4= To: "linux-xfs" From: "Stathmore's Who's Who" Reply-To: X-ASG-Orig-Subj: Jakob - Your Recent Nomination to Strathmore's Who's Who Subject: Jakob - Your Recent Nomination to Strathmore's Who's Who Date: Mon, 02 Nov 2009 12:03:39 -0500 MIME-Version: 1.0 List-Unsubscribe: Content-type: multipart/alternative; boundary="----------030700010607050800090606"; X-Barracuda-Connect: mail2.globalnetstore.com[208.53.152.59] X-Barracuda-Start-Time: 1257181420 Message-Id: <20091102170339.4961314CF4A8@cuda.sgi.com> X-Barracuda-Bayes: INNOCENT GLOBAL 0.4463 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.32 X-Barracuda-Spam-Status: No, SCORE=1.32 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_IMAGE_ONLY_32, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13541 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.32 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ------------030700010607050800090606 Content-type: text/plain Jakob, It is my pleasure to inform you that on September 24th, 2009 your information was reviewed and accepted for inclusion in the 2009/2010 edition of our registry. Strathmore's Whos Who each year, recognizes and selects key executives, professionals and organizations in all disciplines and industries for outstanding business and professional achievements. This recognition is shared by those who have reached a distinguished level of success in their chosen profession. Please take a moment to complete the invitation by clicking on the link below. We ask that you complete it carefully, as it will be reviewed by our editorial department. http://www.formdesk.com/pgn6/STR ** Please complete the online link by October 10th. Strathmore's Whos Who is pleased to inform you that there are no fees or dues to be included in the publication. On behalf of the CEO and our esteemed staff, we wish you continued success. Sincerely, J. Edward Simmons Vice President, Research Division Strathmore's Whos Who 26 Bond St. Westbury NY 11590 Thanks ------------030700010607050800090606 Content-Type: text/html

Jakob,

It is my pleasure to inform you that on September 24th, 2009 your information was reviewed and accepted for inclusion in the 2009/2010 edition of our registry.

Strathmore's Whos Who each year, recognizes and selects key executives, professionals and organizations in all disciplines and industries for outstanding business and professional achievements.

This recognition is shared by those who have reached a distinguished level of success in their chosen profession.

Please take a moment to complete the invitation by clicking on the link below. We ask that you complete it carefully, as it will be reviewed by our editorial department.

http://www.formdesk.com/pgn6/STR

** Please complete the online link by October 10th.

Strathmore's Whos Who is pleased to inform you that there are no fees or dues to be included in the publication.

On behalf of the CEO and our esteemed staff, we wish you continued success.

Sincerely,

J. Edward Simmons
Vice President, Research Division

Strathmore's Whos Who
26 Bond St.
Westbury NY 11590

Thanks

We only support ethical email marketing. To remove yourself from future mailings, please visit here to use our automated removal system. You will be removed from our mailing database within seven (7) days. 10510
Thanks

------------030700010607050800090606-- From eflorac@intellique.com Mon Nov 2 11:52:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2HqgKv078986 for ; Mon, 2 Nov 2009 11:52:42 -0600 X-ASG-Debug-ID: 1257184370-4d3102e80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp2-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 26971180B3D5 for ; Mon, 2 Nov 2009 09:52:53 -0800 (PST) Received: from smtp2-g21.free.fr (smtp2-g21.free.fr [212.27.42.2]) by cuda.sgi.com with ESMTP id GvamCvdpdq1ECvU7 for ; Mon, 02 Nov 2009 09:52:53 -0800 (PST) Received: from smtp2-g21.free.fr (localhost [127.0.0.1]) by smtp2-g21.free.fr (Postfix) with ESMTP id 15A884B00DD; Mon, 2 Nov 2009 18:52:47 +0100 (CET) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp2-g21.free.fr (Postfix) with ESMTP id E6A2F4B0056; Mon, 2 Nov 2009 18:52:44 +0100 (CET) Date: Mon, 2 Nov 2009 18:52:49 +0100 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Message-ID: <20091102185249.0da8e388@harpe.intellique.com> In-Reply-To: <200911021205.28006@zmi.at> References: <4AEC2CF4.8040703@aol.com> <4AEC4BAA.20606@aol.com> <20091031174836.3fc9505b@galadriel.home> <200911021205.28006@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.1 (GTK+ 2.16.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp2-g21.free.fr[212.27.42.2] X-Barracuda-Start-Time: 1257184376 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13546 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 2 Nov 2009 12:05:27 +0100 Michael Monnerie =E9crivait: > I believe for a 15 drive RAID-6, where 2 disks are used for > redundancy, the correct mkfs would be: > mkfs -t xfs -d su=3D65536,sw=3D13 /dev/sdXX Yes you're right, I replied a bit too quickly :) > Another thing to try is if it would help to turn disk cache writes > *on*, despite all warnings if the FAQ.=20 The 3Ware is so slow it's almost unusable without write cache. I bet he already uses it anyway. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Intellique ------------------------------------------------------------------------ From aelder@sgi.com Mon Nov 2 12:46:23 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2IkNep082790 for ; Mon, 2 Nov 2009 12:46:23 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3555AC003; Mon, 2 Nov 2009 10:46:33 -0800 (PST) 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: [PATCH] xfstests: add another quotaoff testcase to 220 Date: Mon, 2 Nov 2009 12:46:33 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE56@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091030093155.GA9329@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfstests: add another quotaoff testcase to 220 Thread-Index: AcpZR6hwObLW6KXRQo+/xSOHs3aRgwCpNifA From: "Alex Elder" To: "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > Add the quotafile space remove regression test from Ryota Yamauchi to > testcase 220. Looks good. This tests the actual problem reported by Ryota Yamauchi. > Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder > Index: xfstests-dev/220 > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- xfstests-dev.orig/220 2009-10-30 09:16:52.000000000 +0000 > +++ xfstests-dev/220 2009-10-30 09:29:19.000000000 +0000 > @@ -1,10 +1,10 @@ > #! /bin/sh > # FS QA Test No. 220 > # > -# Test that turning quotas off on a mounted filesystem doesn't crash > -# the system. > +# Test quota off handling. > # > -# Based on a bug report from Utako Kusaka . > +# Based on bug reports from Utako Kusaka and > +# Ryota Yamauchi . > # > = #----------------------------------------------------------------------- > # Copyright (c) 2009 Christoph Hellwig. All Rights Reserved. > @@ -67,5 +67,19 @@ xfs_quota -x -c off $SCRATCH_DEV > # and unmount (this used to crash) > umount $SCRATCH_DEV >=20 > + > +# create scratch filesystem > +_scratch_mkfs_xfs >/dev/null 2>&1 > + > +# mount with quotas enabled > +_scratch_mount -o uquota > + > +# turn off quota and remove space allocated to the quota files > +# (this used to give wrong ENOSYS returns in 2.6.31) > +xfs_quota -x -c off -c remove $SCRATCH_DEV > + > +# and unmount again > +umount $SCRATCH_DEV > + > status=3D0 > exit $status >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Mon Nov 2 13:00:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2J0uHS084001 for ; Mon, 2 Nov 2009 13:00:56 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79A70AC004; Mon, 2 Nov 2009 11:01:06 -0800 (PST) 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: [PATCH] xfststests 220: test for prealloc/delalloc/reserved spacerecapture Date: Mon, 2 Nov 2009 13:01:05 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE58@cf--amer001e--3.americas.sgi.com> In-Reply-To: <4AC4FC13.3050505@redhat.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfststests 220: test for prealloc/delalloc/reserved spacerecapture Thread-Index: AcpCysh2YvuJTV0uSryK+4+GQVJ71QZI7fcQ From: "Alex Elder" To: "Eric Sandeen" Cc: "ext4 development" , "xfs-oss" X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > Test writing and removing a file in a loop; filesize is 64m, > filesystem size is 256m. Loop 16 times each for buffered and > direct. >=20 > ext4 hits enospc after a couple loops. >=20 > Signed-off-by: Eric Sandeen > --- Dumb nit mentioned below, but otherwise looks good. Also note that you'll need to use a different test number now--like 221. Reviewed-by: Alex Elder > (note this has the sized mkfs infra from the previous patch this week > since that patch needed more work w.r.t. modifying existing tests) >=20 > diff --git a/common.rc b/common.rc > index 761170d..8d0cd4e 100644 > --- a/common.rc > +++ b/common.rc > @@ -237,6 +237,27 @@ _scratch_mkfs_options() > echo $SCRATCH_OPTIONS $MKFS_OPTIONS $* $SCRATCH_DEV > } >=20 > +# arg 1 is size in bytes, arg 2 is (optional) blocksize > +_scratch_mkfs_sized() > +{ > + fssz=3D$1 > + bsz=3D$2 > + [ -z "$bsz" ] && bsz=3D4096 > + let blocks=3D$fssz/$bsz > + > + case $FSTYP in > + xfs) > + _scratch_mkfs_xfs -d size=3D$fssz -b size=3D$bsz 2>&1 = >>$here/$seq.full > + ;; > + ext2|ext3|ext4) > + /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS -b $bsz $SCRATCH_DEV = $blocks=20 > 2>&1>>$here/$seq.full + ;; > + *) > + _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_sized" > + ;; > + esac > +} > + > _scratch_mkfs_xfs() > { > # extra mkfs options can be added by tests >=20 > diff --git a/220 b/220 > new file mode 100755 > index 0000000..55982b7 > --- /dev/null > +++ b/220 > @@ -0,0 +1,76 @@ > +#! /bin/sh > +# FS QA Test No. 220 > +# > +# Test for prealloc space leaks by rewriting the same file in a loop > +# > = +#-----------------------------------------------------------------------= > +# Copyright (c) 2009 Eric Sandeen. 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=3Dsandeen@sandeen.net > + > +seq=3D`basename $0` > +echo "QA output created by $seq" > + > +here=3D`pwd` > +tmp=3D/tmp/$$ > +status=3D1 # failure is the default! > +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common.rc > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux IRIX > +_require_scratch > + > +# real QA test starts here So which is it, here or above that the "real QA test starts"? > +rm -f $seq.full > + > +umount $SCRATCH_DEV 2>/dev/null > +let fssize=3D256*1024*1024 > +echo "--> mkfs 256m filesystem" > +_scratch_mkfs_sized $fssize >> $seq.full 2>&1 > +_scratch_mount > + > +loops=3D16 > + > +echo "--> $loops buffered 64m writes in a loop" > +for I in `seq 1 $loops`; do > + echo -n "$I " > + xfs_io -F -f -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full > + rm -f $SCRATCH_MNT/test > +done > + > +echo > +umount $SCRATCH_DEV > +_scratch_mount > + > +echo "--> $loops direct 64m writes in a loop" > +for I in `seq 1 $loops`; do > + echo -n "$I " > + xfs_io -F -f -d -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full > + rm -f $SCRATCH_MNT/test > +done > + > +echo > +umount $SCRATCH_DEV > + > +status=3D0 > +exit > diff --git a/220.out b/220.out > new file mode 100644 > index 0000000..497a585 > --- /dev/null > +++ b/220.out > @@ -0,0 +1,6 @@ > +QA output created by 220 > +--> mkfs 256m filesystem > +--> 16 buffered 64m writes in a loop > +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 > +--> 16 direct 64m writes in a loop > +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 > diff --git a/group b/group > index 7cea01d..9b8a401 100644 > --- a/group > +++ b/group > @@ -329,3 +329,4 @@ prealloc > 217 log metadata auto > 218 auto fsr quick > 219 auto quota quick > +220 enospc auto quick >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Mon Nov 2 13:15:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2JFH2x085088 for ; Mon, 2 Nov 2009 13:15:17 -0600 X-ASG-Debug-ID: 1257189330-4b1f01180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B8F51180BD65; Mon, 2 Nov 2009 11:15:30 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AlGlSVqshnpxS6y3; Mon, 02 Nov 2009 11:15:30 -0800 (PST) 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.13.8/8.13.8) with ESMTP id nA2JFTmg031817; Mon, 2 Nov 2009 14:15:29 -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 nA2JFP9l031898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Nov 2009 14:15:28 -0500 Message-ID: <4AEF2FCD.4090707@redhat.com> Date: Mon, 02 Nov 2009 13:15:25 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Alex Elder CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfststests 220: test for prealloc/delalloc/reserved spacerecapture Subject: Re: [PATCH] xfststests 220: test for prealloc/delalloc/reserved spacerecapture References: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE58@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE58@cf--amer001e--3.americas.sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed 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: 1257189330 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Alex Elder wrote: > Eric Sandeen wrote: >> Test writing and removing a file in a loop; filesize is 64m, >> filesystem size is 256m. Loop 16 times each for buffered and >> direct. >> >> ext4 hits enospc after a couple loops. >> >> Signed-off-by: Eric Sandeen >> --- > > > Dumb nit mentioned below, but otherwise looks good. > Also note that you'll need to use a different test > number now--like 221. > > Reviewed-by: Alex Elder > > ... >> +# real QA test starts here >> +_supported_fs generic >> +_supported_os Linux IRIX >> +_require_scratch >> + >> +# real QA test starts here > > So which is it, here or above that the "real QA test starts"? It depends on how you measure the starting point, and in fact by measuring, you may affect the outcome of that measurement ... it could be both at the same time! -Eric Heisenberg From william@netproteus.net Mon Nov 2 14:02:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=BAYES_00,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2K2A6E088661 for ; Mon, 2 Nov 2009 14:02:11 -0600 X-ASG-Debug-ID: 1257192141-0dbf019f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f221.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7072C14D0413 for ; Mon, 2 Nov 2009 12:02:22 -0800 (PST) Received: from mail-ew0-f221.google.com (mail-ew0-f221.google.com [209.85.219.221]) by cuda.sgi.com with ESMTP id l2h0A7v1kGtcyPVm for ; Mon, 02 Nov 2009 12:02:22 -0800 (PST) Received: by ewy21 with SMTP id 21so5057057ewy.8 for ; Mon, 02 Nov 2009 12:02:21 -0800 (PST) MIME-Version: 1.0 Received: by 10.216.90.9 with SMTP id d9mr65224wef.201.1257192141040; Mon, 02 Nov 2009 12:02:21 -0800 (PST) X-Originating-IP: [83.166.71.4] Date: Mon, 2 Nov 2009 20:02:20 +0000 Message-ID: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> X-ASG-Orig-Subj: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Subject: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. From: William Lewis To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0016e6da7de3fb2da1047768daae X-Barracuda-Connect: mail-ew0-f221.google.com[209.85.219.221] X-Barracuda-Start-Time: 1257192143 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016e6da7de3fb2da1047768daae Content-Type: text/plain; charset=ISO-8859-1 Hi, I am in the process of setting up an XFS file system on underlying hardware consisting of a 3ware 9550SXU (+ battery backup module) and 4 x Seagate ST31500341AS 1.5TB hard drives in Raid 5 configuration. Reading your FAQ at http://xfs.org/index.php/XFS_FAQ I understand that it is advisable to mount the file system with nobarrier to improve performance. However going on to read about recommended settings for write cache, the advice for 3ware hardware doesn't seem to account for the fact that there are 2 levels of write cache in play, that in the 3ware card itself protected by the battery and the write cache of the disks themselves, which as far as I can understand is also protected by the battery backup (in the correct storage modes - balanced/protection) because the 3ware card uses write journaling to keep track of pending write operations in the disks' cache. Therefore unless I am misunderstanding something the most benefit is to be gained by mounting with nobarrier and having the write cache turned on? One thing I am not clear about is if nobarrier interacts with the page cache at all and if the lack of barrier leaves you with a situation in which pending writes can be lost from main memory on power failure? Thanks in advance for any clarification you can provide. Regards Will Lewis --0016e6da7de3fb2da1047768daae Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi,

I am in the process of setting up an XFS file system on underlyi= ng hardware consisting of a 3ware 9550SXU (+ battery backup module) and 4 x= Seagate ST31500341AS 1.5TB hard drives in Raid 5 configuration.

Reading your FAQ at http://xfs= .org/index.php/XFS_FAQ I understand that it is advisable to mount the f= ile system with nobarrier to improve performance. However going on to read = about recommended settings for write cache, the advice for 3ware hardware d= oesn't seem to account for the fact that there are 2 levels of write ca= che in play, that in the 3ware card itself protected by the battery and the= write cache of the disks themselves, which as far as I can understand is a= lso protected by the battery backup (in the correct storage modes - balance= d/protection) because the 3ware card uses write journaling to keep track of= pending write operations in the disks' cache. Therefore unless I am mi= sunderstanding something the most benefit is to be gained by mounting with = nobarrier and having the write cache turned on?

One thing I am not clear about is if nobarrier interacts with the page = cache at all and if the lack of barrier leaves you with a situation in whic= h pending writes can be lost from main memory on power failure?

Thanks in advance for any clarification you can provide.

Regards
=
Will Lewis
--0016e6da7de3fb2da1047768daae-- From aelder@sgi.com Mon Nov 2 14:33:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2KXpGd091489 for ; Mon, 2 Nov 2009 14:33:52 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72B17AC008; Mon, 2 Nov 2009 12:34:02 -0800 (PST) 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: [PATCH] xfs: I/O completion handlers must use NOFS allocations Date: Mon, 2 Nov 2009 14:34:01 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5B@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091019040003.GA21115@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: I/O completion handlers must use NOFS allocations Thread-Index: AcpQchCAk8Ba56CpQRWbxrqJPuWXawLiHbSw From: "Alex Elder" To: "Christoph Hellwig" Cc: "Thomas Neumann" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > When complention I/O requests we must not allow the memory allocator = to > recurse into the filesystem, as we might deadlock on waiting for the > I/O completion otherwise. The only thing currently allocting normal > GFP_KERNEL memory is the allocation of the transaction structure for = the > unwritten extent conversion. Add a memflags argument to = _xfs_trans_alloc > to allow controlling the allocator behaviour. >=20 > Signed-off-by: Christoph Hellwig > Reported-by: Thomas Neumann > Tested-by: Thomas Neumann This looks good. It's kind of too bad the GFP_ flag argument had to be added, but I can't think of a cleaner way than the way you did it. I have one minor suggestion on wording used in a comment, but the code looks correct to me. I verified that--as you say--the only place we're doing an allocation in an I/O completion handler (i.e., a function called via io_end->io_work->func) is in xfs_iomap_write_unwritten(), so this fix should cover the only case. Sorry it took so long to get to this. Reviewed-by: Alex Elder > Index: linux-2.6/fs/xfs/xfs_fsops.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_fsops.c 2009-10-16 23:08:25.170027882 = +0200 > +++ linux-2.6/fs/xfs/xfs_fsops.c 2009-10-16 23:09:22.904256700 +0200 > @@ -611,7 +611,7 @@ xfs_fs_log_dummy( > xfs_inode_t *ip; > int error; >=20 > - tp =3D _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1); > + tp =3D _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); > error =3D xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, = 0); > if (error) { > xfs_trans_cancel(tp, 0); > Index: linux-2.6/fs/xfs/xfs_iomap.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_iomap.c 2009-10-16 23:10:14.342278346 = +0200 > +++ linux-2.6/fs/xfs/xfs_iomap.c 2009-10-16 23:12:08.148004392 +0200 > @@ -860,8 +860,15 @@ xfs_iomap_write_unwritten( > * set up a transaction to convert the range of extents > * from unwritten to real. Do allocations in a loop until > * we have covered the range passed in. > + * > + * Note that we opencoding the transaction allocation here > + * to pass KM_NOFS - we can't risk to recurse back into How about, "we can't risk recursing back into" > + * the filesystem here as we might be asked to write out > + * the same inode that we complete here and might deadlock > + * on the iolock. > */ > - tp =3D xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE); > + xfs_wait_for_freeze(mp, SB_FREEZE_TRANS); > + tp =3D _xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE, KM_NOFS); > tp->t_flags |=3D XFS_TRANS_RESERVE; > error =3D xfs_trans_reserve(tp, resblks, > XFS_WRITE_LOG_RES(mp), 0, > Index: linux-2.6/fs/xfs/xfs_mount.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_mount.c 2009-10-16 23:08:25.147024815 = +0200 > +++ linux-2.6/fs/xfs/xfs_mount.c 2009-10-16 23:09:25.127005437 +0200 > @@ -1471,7 +1471,7 @@ xfs_log_sbcount( > if (!xfs_sb_version_haslazysbcount(&mp->m_sb)) > return 0; >=20 > - tp =3D _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT); > + tp =3D _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); > error =3D xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, > XFS_DEFAULT_LOG_COUNT); > if (error) { > Index: linux-2.6/fs/xfs/xfs_trans.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_trans.c 2009-10-16 23:08:25.117003816 = +0200 > +++ linux-2.6/fs/xfs/xfs_trans.c 2009-10-16 23:08:58.202005942 +0200 > @@ -236,19 +236,20 @@ xfs_trans_alloc( > uint type) > { > xfs_wait_for_freeze(mp, SB_FREEZE_TRANS); > - return _xfs_trans_alloc(mp, type); > + return _xfs_trans_alloc(mp, type, KM_SLEEP); > } >=20 > xfs_trans_t * > _xfs_trans_alloc( > xfs_mount_t *mp, > - uint type) > + uint type, > + uint memflags) > { > xfs_trans_t *tp; >=20 > atomic_inc(&mp->m_active_trans); >=20 > - tp =3D kmem_zone_zalloc(xfs_trans_zone, KM_SLEEP); > + tp =3D kmem_zone_zalloc(xfs_trans_zone, memflags); > tp->t_magic =3D XFS_TRANS_MAGIC; > tp->t_type =3D type; > tp->t_mountp =3D mp; > Index: linux-2.6/fs/xfs/xfs_trans.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_trans.h 2009-10-16 23:08:25.127003692 = +0200 > +++ linux-2.6/fs/xfs/xfs_trans.h 2009-10-16 23:09:04.726256000 +0200 > @@ -924,7 +924,7 @@ 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); > +xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, uint); > xfs_trans_t *xfs_trans_dup(xfs_trans_t *); > int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, > uint, uint); >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Mon Nov 2 15:10:22 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2LAM0c094004 for ; Mon, 2 Nov 2009 15:10:22 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 69E128F8050; Mon, 2 Nov 2009 13:10:33 -0800 (PST) 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: [PATCH] xfs: fix mmap_sem vs iolock lock order inversion inxfs_free_eofblocks Date: Mon, 2 Nov 2009 15:10:33 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5C@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091019040346.GB21115@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: fix mmap_sem vs iolock lock order inversion inxfs_free_eofblocks Thread-Index: AcpQcg8MZ3qG2Av4SZSGwI82xVJoXQLjSOzw From: "Alex Elder" To: "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > When xfs_free_eofblocks is called from ->release the VM might already > hold the mmap_sem, but in the write path we take the iolock before > taking the mmap_sem in the generic write code. >=20 > Switch xfs_free_eofblocks to only trylock the iolock if called from = ->release > and skip trimming the prellocated blocks in that case. We'll still = free > them later on the final iput. >=20 > Signed-off-by: Christoph Hellwig I have a minor suggestion below, but it looks correct to me. I tried to get a better idea of what the conditions were where mmap_sem would be held by VM when ->release gets called, but didn't get to the bottom of that. If it is easily characterized you could mention it in comments. Reviewed-by: Alex Elder > Index: xfs/fs/xfs/xfs_rw.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- xfs.orig/fs/xfs/xfs_rw.h 2009-10-14 17:30:02.396028076 +0200 > +++ xfs/fs/xfs/xfs_rw.h 2009-10-14 17:30:20.472287472 +0200 > @@ -37,13 +37,6 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_ > } >=20 > /* > - * Flags for xfs_free_eofblocks > - */ > -#define XFS_FREE_EOF_LOCK (1<<0) > -#define XFS_FREE_EOF_NOLOCK (1<<1) > - > - > -/* > * helper function to extract extent size hint from inode > */ > STATIC_INLINE xfs_extlen_t > Index: xfs/fs/xfs/xfs_vnodeops.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- xfs.orig/fs/xfs/xfs_vnodeops.c 2009-10-14 17:30:13.363024201 +0200 > +++ xfs/fs/xfs/xfs_vnodeops.c 2009-10-14 17:35:39.314256388 +0200 > @@ -709,6 +709,11 @@ xfs_fsync( > } >=20 > /* > + * Flags for xfs_free_eofblocks > + */ > +#define XFS_FREE_EOF_TRYLOCK (1<<0) This is really a Boolean in the place it's used, rather than a flags mask. Unless you have plans to add other flags, maybe just don't bother defining this, and pass a zero/non-zero for a renamed argument to xfs_free_eofblocks(). (I mention this again below, in that context.) > +/* > * This is called by xfs_inactive to free any blocks beyond eof > * when the link count isn't zero and by xfs_dm_punch_hole() when > * punching a hole to EOF. > @@ -726,7 +731,6 @@ xfs_free_eofblocks( > xfs_filblks_t map_len; > int nimaps; > xfs_bmbt_irec_t imap; > - int use_iolock =3D (flags & XFS_FREE_EOF_LOCK); >=20 > /* > * Figure out if there are any blocks beyond the end > @@ -768,14 +772,19 @@ xfs_free_eofblocks( > * cache and we can't > * do that within a transaction. > */ > - if (use_iolock) > + if (flags & XFS_FREE_EOF_TRYLOCK) { If you rename "flag" to "skip_ok" (or maybe "try_lock": if (skip_ok && ! xfs_ilock_nowait(...)) { xfs_trans_cancel(); return 0; } else xfs_ilock(...); if (try_lock) > + if (!xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) { > + xfs_trans_cancel(tp, 0); > + return 0; > + } > + } else { > xfs_ilock(ip, XFS_IOLOCK_EXCL); > + } > error =3D xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE, > ip->i_size); > if (error) { > xfs_trans_cancel(tp, 0); > - if (use_iolock) > - xfs_iunlock(ip, XFS_IOLOCK_EXCL); > + xfs_iunlock(ip, XFS_IOLOCK_EXCL); > return error; > } >=20 > @@ -812,8 +821,7 @@ xfs_free_eofblocks( > error =3D xfs_trans_commit(tp, > XFS_TRANS_RELEASE_LOG_RES); > } > - xfs_iunlock(ip, (use_iolock ? (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL) > - : XFS_ILOCK_EXCL)); > + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL); > } > return error; > } > @@ -1113,7 +1121,17 @@ xfs_release( > (ip->i_df.if_flags & XFS_IFEXTENTS)) && > (!(ip->i_d.di_flags & > (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { > - error =3D xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK); > + > + /* > + * If we can't get the iolock just skip truncating > + * the blocks past EOF because we could deadlock > + * with the mmap_sem otherwise. We'll get another > + * chance to drop them once the last reference to > + * the inode is dropped, so we'll never leak blocks > + * permanently. > + */ > + error =3D xfs_free_eofblocks(mp, ip, > + XFS_FREE_EOF_TRYLOCK); > if (error) > return error; > } > @@ -1184,7 +1202,7 @@ xfs_inactive( > (!(ip->i_d.di_flags & > (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || > (ip->i_delayed_blks !=3D 0)))) { > - error =3D xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK); > + error =3D xfs_free_eofblocks(mp, ip, 0); > if (error) > return VN_INACTIVE_CACHE; > } >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jpiszcz@lucidpixels.com Mon Nov 2 15:29:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2LSxZk095032 for ; Mon, 2 Nov 2009 15:28:59 -0600 X-ASG-Debug-ID: 1257197352-4c9703d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10D4B1B398CA for ; Mon, 2 Nov 2009 13:29:12 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id CWvhHsoB5gVkyujH for ; Mon, 02 Nov 2009 13:29:12 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 199C6805324F; Mon, 2 Nov 2009 16:29:12 -0500 (EST) Date: Mon, 2 Nov 2009 16:29:12 -0500 (EST) From: Justin Piszcz To: William Lewis cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Subject: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. In-Reply-To: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> Message-ID: References: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1257197353 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2 Nov 2009, William Lewis wrote: > Hi, > > I am in the process of setting up an XFS file system on underlying hardware > consisting of a 3ware 9550SXU (+ battery backup module) and 4 x Seagate > ST31500341AS 1.5TB hard drives in Raid 5 configuration. > > Reading your FAQ at http://xfs.org/index.php/XFS_FAQ I understand that it is > advisable to mount the file system with nobarrier to improve performance. > However going on to read about recommended settings for write cache, the > advice for 3ware hardware doesn't seem to account for the fact that there > are 2 levels of write cache in play, that in the 3ware card itself protected > by the battery and the write cache of the disks themselves, which as far as > I can understand is also protected by the battery backup (in the correct > storage modes - balanced/protection) because the 3ware card uses write > journaling to keep track of pending write operations in the disks' cache. > Therefore unless I am misunderstanding something the most benefit is to be > gained by mounting with nobarrier and having the write cache turned on? > > One thing I am not clear about is if nobarrier interacts with the page cache > at all and if the lack of barrier leaves you with a situation in which > pending writes can be lost from main memory on power failure? > > Thanks in advance for any clarification you can provide. > > Regards > > Will Lewis > I am also curious, I have a 16 drive RAID-6 configuration on a 9650SE-16ML and using -o nobarrier or mounting normal the speed/benchmarks seemed to be the same. Either barriers are not enabled by default for 3ware RAID arrays or they make no difference in performance? Justin. From sandeen@sandeen.net Mon Nov 2 15:31:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2LVK7j095166 for ; Mon, 2 Nov 2009 15:31:20 -0600 X-ASG-Debug-ID: 1257197493-686303b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 190F25653F for ; Mon, 2 Nov 2009 13:31:33 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 7feg9qW21MG2aXPs for ; Mon, 02 Nov 2009 13:31:33 -0800 (PST) Received: from liberator.sandeen.net (sandeen.net [209.173.210.139]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 52E79AAE3B1; Mon, 2 Nov 2009 15:31:31 -0600 (CST) Message-ID: <4AEF4FB2.1050504@sandeen.net> Date: Mon, 02 Nov 2009 15:31:30 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: William Lewis CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Subject: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. References: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> In-Reply-To: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1257197494 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean William Lewis wrote: > Hi, > > I am in the process of setting up an XFS file system on underlying > hardware consisting of a 3ware 9550SXU (+ battery backup module) and 4 x > Seagate ST31500341AS 1.5TB hard drives in Raid 5 configuration. > > Reading your FAQ at http://xfs.org/index.php/XFS_FAQ I understand that > it is advisable to mount the file system with nobarrier to improve > performance. However going on to read about recommended settings for > write cache, the advice for 3ware hardware doesn't seem to account for > the fact that there are 2 levels of write cache in play, that in the > 3ware card itself protected by the battery and the write cache of the > disks themselves, which as far as I can understand is also protected by > the battery backup (in the correct storage modes - balanced/protection) > because the 3ware card uses write journaling to keep track of pending > write operations in the disks' cache. Therefore unless I am > misunderstanding something the most benefit is to be gained by mounting > with nobarrier and having the write cache turned on? If the write caches won't go away - or will be fully/gracefully destaged before they do, then nobarrier should be safe. > One thing I am not clear about is if nobarrier interacts with the page > cache at all and if the lack of barrier leaves you with a situation in > which pending writes can be lost from main memory on power failure? nobarrier has no interaction with the OS page cache; all the "barrier" option (the default) does is enforce ordering for journal IO*, and in practice it does this by flushing the cache at points in time. -Eric *well, I think it flushes the drive cache on fsync, too, for data integrity (vs. the metadata integrity for the journal IO ordering) > Thanks in advance for any clarification you can provide. > > Regards > > Will Lewis > > > ------------------------------------------------------------------------ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon Nov 2 15:34:23 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2LYMEU095343 for ; Mon, 2 Nov 2009 15:34:23 -0600 X-ASG-Debug-ID: 1257197675-129300d00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1242B14D0ADB for ; Mon, 2 Nov 2009 13:34:35 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id Yb6o2wt9qDo2Evag for ; Mon, 02 Nov 2009 13:34:35 -0800 (PST) Received: from liberator.sandeen.net (sandeen.net [209.173.210.139]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id CD397AAE3B1; Mon, 2 Nov 2009 15:34:34 -0600 (CST) Message-ID: <4AEF506A.8060803@sandeen.net> Date: Mon, 02 Nov 2009 15:34:34 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: "AndrewL733@aol.com" CC: Emmanuel Florac , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files References: <4AEC2CF4.8040703@aol.com> <20091031151825.46210b6a@galadriel.home> <4AEC4BAA.20606@aol.com> In-Reply-To: <4AEC4BAA.20606@aol.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1257197676 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean AndrewL733@aol.com wrote: > >> Maybe you should try mounting the XFS filesystem with these options : >> nobarrier,noatime >> >> > Thanks. Already doing that -- 3ware controller does not support > barriers, so that's automatically ruled out (you see a message in the > syslog when mounting the filesystem that barriers will not be used). > Already mounting with "noatime". Also have been trying "filestreams". Filestreams is really only useful if you have multiple threads writing in this manner - for example 2 different movie streams. Normally an allocation group is chosen for all new files in a directory, so if you have 2 streams to 2 directories you are writing to 2 ag's ... all is good until those ags get full and things spill over. At that point you may wind up interleaving those files from both streams in a 3rd ag. the filestreams option more or less locks out the new ag from other streams, so that stuff stays segregated. If this is your situation (multiple streams, each to their own directory), then filestreams may help. I think for a single stream of files, for a single video source, it won't matter. -Eric From jpiszcz@lucidpixels.com Mon Nov 2 15:45:58 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2Ljwt1095854 for ; Mon, 2 Nov 2009 15:45:58 -0600 X-ASG-Debug-ID: 1257198370-5abd038a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8FCF41D8BF43 for ; Mon, 2 Nov 2009 13:46:10 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id WEj9GQz1DvfjSksc for ; Mon, 02 Nov 2009 13:46:10 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 096A7805324C; Mon, 2 Nov 2009 16:46:10 -0500 (EST) Date: Mon, 2 Nov 2009 16:46:10 -0500 (EST) From: Justin Piszcz To: Dave Chinner cc: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.31+2.6.31.4: XFS - All I/O locks up to D-state after 24-48 hours (sysrq-t+w available) Subject: Re: 2.6.31+2.6.31.4: XFS - All I/O locks up to D-state after 24-48 hours (sysrq-t+w available) In-Reply-To: Message-ID: References: <20091019030456.GS9464@discord.disaster> <20091020003358.GW9464@discord.disaster> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1257198371 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 26 Oct 2009, Justin Piszcz wrote: > > > On Thu, 22 Oct 2009, Justin Piszcz wrote: > >> >> Any other ideas? >> >> Currently stuck on 2.6.30.9.. (no issues, no lockups)-- Box normally has no >> load at all either.. Has anyone else reported similar problems? >> >> Justin. >> > > -- > > Currently running 2.6.31-rc1 for 2 days now, no crashes, will go to -rc2 > later today and wait another 48 hours. > > Justin. > > Kernel report: 2.6.31-rc1: no crash - uptime 2+ days 2.6.31-rc2: no crash - uptime 2+ days 2.6.31-rc3: no crash - uptime 2+ days 2.6.31-rc4: no crash but network kept dropping out 2.6.31-rc5: cannot test, service owner needs host available 2.6.31-rc6: cannot test, service owner needs host available 2.6.31-rc7: cannot test, service owner needs host available 2.6.31-rc8: cannot test, service owner needs host available 2.6.31-rc9: cannot test, service owner needs host available 2.6.31.x: locks up D-state It would be somewhere between -rc4 and 2.6.31.x. Justin. From AndrewL733@aol.com Mon Nov 2 15:50:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2LodUa096087 for ; Mon, 2 Nov 2009 15:50:39 -0600 X-ASG-Debug-ID: 1257198652-7aae00cf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mxout-08.mxes.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D5A95566D0 for ; Mon, 2 Nov 2009 13:50:52 -0800 (PST) Received: from mxout-08.mxes.net (mxout-08.mxes.net [216.86.168.183]) by cuda.sgi.com with ESMTP id m53XAiL6GFLuG3FF for ; Mon, 02 Nov 2009 13:50:52 -0800 (PST) Received: from [192.168.1.144] (unknown [209.94.131.238]) by smtp.mxes.net (Postfix) with ESMTPA id 567A7509D9; Mon, 2 Nov 2009 16:50:49 -0500 (EST) Message-ID: <4AEF5438.5050801@aol.com> Date: Mon, 02 Nov 2009 16:50:48 -0500 From: "AndrewL733@aol.com" User-Agent: Thunderbird 2.0.0.23 (X11/20090822) MIME-Version: 1.0 To: Emmanuel Florac CC: Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files References: <4AEC2CF4.8040703@aol.com> <4AEC4BAA.20606@aol.com> <20091031174836.3fc9505b@galadriel.home> <200911021205.28006@zmi.at> <20091102185249.0da8e388@harpe.intellique.com> In-Reply-To: <20091102185249.0da8e388@harpe.intellique.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mxout-08.mxes.net[216.86.168.183] X-Barracuda-Start-Time: 1257198652 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >> I believe for a 15 drive RAID-6, where 2 disks are used forredundancy, the correct mkfs would be: >> mkfs -t xfs -d su=65536,sw=13 /dev/sdXX >> > > Yes you're right, I replied a bit too quickly :) > > > >> Another thing to try is if it would help to turn disk cache writes >> *on*, despite all warnings if the FAQ. >> Thank you for your suggestions. Yes I have write caching enabled. And I have StorSave set to "Performance". And I have a UPS on the system at all times! The information about barriers was useful. In years past I was running much older firmware for the 3ware 9650 cards and that did not support barriers. But it is true the current firmware does support barriers. I also believe the 3ware StorSave "Performance" setting will disable barriers as well -- at least it makes the card ignore FUA commands. Anyway, I have mounted the XFS filesystem with the "nobarrier" flag and I'm still seeing the same behavior. If you want to take a closer look at what I mean, please go to this link: http://sites.google.com/site/andrewl733info/xfs_and_dpx At this point, I have tried the following -- and none of these approaches seems to fix the problem: -- preallocation of DPX files -- reservation of DXP files (Make 10,000 zero-byte files named 0000001.dpx through 0010000.dpx) -- creating xfs filesystem with external log device (also a 16-drive RAID array, because that's what I have available) -- mounting with large logbsize -- mounting with more logbufs -- mounting with larger allocsize Again, I want to point out that I don't have any problem with the underlying RAID device. On Linux itself, I get Bonnie++ scores of around 740 MB/sec reading and 650 MB/sec writing, minimum. Over 10 Gigabit Ethernet, I can write uncompressed HD streams (160 MB/sec) and I can read 2K DPX files (300+ MB/sec). DD shows similar results. My gut feeling is that XFS is falling over after creating a certain number of new files. Because the DPX format creates one file for every frame (30 files/sec), it's not really a video stream. It's really like making 30 photoshop files per second. It seems as if some resource that XFS needs is being used up after a certain number of files are created, and that it is very disruptive and costly to get more of that resource. Why ext3 and ext4 can keep going past 60,000 files and xfs falls over after 4000 or 5000 files, I do not understand. From aelder@sgi.com Mon Nov 2 15:55:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2LtQTh096290 for ; Mon, 2 Nov 2009 15:55:26 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F9BB304075; Mon, 2 Nov 2009 13:55:35 -0800 (PST) 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: [PATCH] xfs: reset the i_iolock lock class in the reclaim path Date: Mon, 2 Nov 2009 15:54:02 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5D@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091019040526.GC21115@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: reset the i_iolock lock class in the reclaim path Thread-Index: AcpQcg52Kz2JU195SYiNJj0dLdp9SwLkXrjw From: "Alex Elder" To: "Christoph Hellwig" Cc: "Peter Zijlstra" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > The iolock is used for protecting reads, writes and block truncates = against > each other. We have two classes of callers, the first one is induced = by > a file operation and requires a reference to the inode be held and not > dropped after the operation is done: >=20 > - xfs_vm_vmap, xfs_vn_fallocate, xfs_read, xfs_write, = xfs_splice_read, > xfs_splice_write and xfs_setattr are all implementations of VFS = methods > that require a live inode > - xfs_getbmap and xfs_swap_extents are ioctl subcommand for which the > same is true > - xfs_truncate_file is only called on quota inodes just returned from = xfs_iget > - xfs_sync_inode_data does the lock just after an igrab() > - xfs_filestream_associate and xfs_filestream_new_ag take the iolock = on the > parent inode of an inode which by VFS rules must be referenced >=20 > And we have various calls to truncate blocks past EOF or the whole = file when > dropping the last reference to an inode. Unfortunately lockdep = complains > when we do memory allocations that can recurse into the filesystem in = the > first class because the second class happens to take the same lock. = To avoid > this re-init the iolock in the beginning of xfs_fs_clear_inode to get > a new lock class. >=20 >=20 > Signed-off-by: Christoph Hellwig Looks good. The comment in xfs_fs_clear_inode() is very informative, but it may be emphasizing a lot of detail that doesn't really help the reader at this spot in the code. What about wording something more like this: The iolock is used by the file system to coordinate reads, writes, and block truncates. Up to this point the lock protected concurrent accesses by users of the inode. But from here forward we're doing some final processing of the inode because we're done with it, and although we reuse the iolock for protection it is really a distinct lock class (in the lockdep sense) from before. To keep lockdep happy (and basically indicate what we are doing), we explicitly re-init the iolock here. Reviewed-by: Alex Elder > Index: xfs/fs/xfs/linux-2.6/xfs_super.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-10-14 = 17:24:31.356278624 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-10-19 06:03:05.771006625 = +0200 > @@ -999,7 +999,6 @@ xfs_fs_inode_init_once( >=20 > mrlock_init(&ip->i_lock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, > "xfsino", ip->i_ino); > - mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); > } >=20 > /* > @@ -1101,6 +1100,22 @@ xfs_fs_clear_inode( > XFS_STATS_INC(vn_remove); > XFS_STATS_DEC(vn_active); >=20 > + /* > + * The iolock is used for protecting reads, writes and block = truncates > + * against each other. We have two classes of callers, the first = one > + * is induced by a file operation and requires a reference to the > + * inode be held and not dropped after the operation is done, and > + * second we have various calls to truncate blocks past EOF or for = the > + * whole file when dropping the last reference to an inode. > + * Unfortunately lockdep complains when we do memory allocations = that > + * can recurse into the filesystem in the first class because the > + * second class happens to take the same lock. To avoid this > + * reinitialize the iolock in the beginning of xfs_fs_clear_inode to > + * get a new lock class. > + */ > + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); > + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); > + > xfs_inactive(ip); > } >=20 > Index: xfs/fs/xfs/xfs_iget.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- xfs.orig/fs/xfs/xfs_iget.c 2009-10-14 17:25:26.733004131 +0200 > +++ xfs/fs/xfs/xfs_iget.c 2009-10-14 17:28:26.272274357 +0200 > @@ -73,6 +73,9 @@ xfs_inode_alloc( > ASSERT(atomic_read(&ip->i_pincount) =3D=3D 0); > ASSERT(!spin_is_locked(&ip->i_flags_lock)); > ASSERT(completion_done(&ip->i_flush)); > + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); > + > + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); >=20 > /* initialise the xfs inode */ > ip->i_ino =3D ino; >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From michael.monnerie@is.it-management.at Mon Nov 2 15:58:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2LwO1V096646 for ; Mon, 2 Nov 2009 15:58:24 -0600 X-ASG-Debug-ID: 1257199116-131100030000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 782441BA48A7 for ; Mon, 2 Nov 2009 13:58:37 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id bGYD32ew7SzFJEht for ; Mon, 02 Nov 2009 13:58:37 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id DB4E4C02700 for ; Mon, 2 Nov 2009 22:58:35 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id A100040016F for ; Mon, 2 Nov 2009 22:58:35 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Date: Mon, 2 Nov 2009 22:58:35 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <4AEC2CF4.8040703@aol.com> <200911021205.28006@zmi.at> <20091102185249.0da8e388@harpe.intellique.com> In-Reply-To: <20091102185249.0da8e388@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911022258.35164@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257199117 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Montag 02 November 2009 Emmanuel Florac wrote: > The 3Ware is so slow it's almost unusable without write cache. I bet > he already uses it anyway. Don't mix up the controller write cache vs. disk write cache. The controller write cache should be on whenever you have a BBM installed, because this brings real performance, while the disk write cache should always be off in a production environment, because you will loose data on power fail, which nobody can recognize (the controller believes the sectors to be written already...) Hence my suggestion for turning on the disk write cache just to see if it makes a difference. mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From michael.monnerie@is.it-management.at Mon Nov 2 16:08:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2M8Gss097132 for ; Mon, 2 Nov 2009 16:08:17 -0600 X-ASG-Debug-ID: 1257199709-1310007f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DD7E180C066 for ; Mon, 2 Nov 2009 14:08:29 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id SOARbVnotIZMtPbn for ; Mon, 02 Nov 2009 14:08:29 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id EC018C02700 for ; Mon, 2 Nov 2009 23:08:26 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id B719B40016F for ; Mon, 2 Nov 2009 23:08:26 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Subject: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Date: Mon, 2 Nov 2009 23:08:26 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> In-Reply-To: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911022308.26282@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257199710 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Montag 02 November 2009 William Lewis wrote: > Reading your FAQ at http://xfs.org/index.php/XFS_FAQ I understand > that it is advisable to mount the file system with nobarrier to > improve performance. I edited that part, so I'll answer. > However going on to read about recommended > settings for write cache, the advice for 3ware hardware doesn't seem > to account for the fact that there are 2 levels of write cache in > play, that in the 3ware card itself protected by the battery and the > write cache of the disks themselves, There are 2 different caches. One in the controller, on on the disks. > which as far as I can understand > is also protected by the battery backup (in the correct storage modes > - balanced/protection) because the 3ware card uses write journaling > to keep track of pending write operations in the disks' cache. I can't believe it's possible for the controller to know when a disk write is actually on disk while the disk write cache is on. There are lots of disk who plainly *lie* about that fact. I've seen a web page once with a listing of disks who lie - quiet long. I don't find the link ATM, maybe googling helps. > Therefore unless I am misunderstanding something the most benefit is > to be gained by mounting with nobarrier and having the write cache > turned on? If you care about your data, don't turn on the disk write cache. I wonder why there's not a single disk vendor building a disk with a small battery buffer that is able to keep the disk spinning until it can savely empty disk cache to platters. Would be a real performance benefit in server environments. > One thing I am not clear about is if nobarrier interacts with the > page cache at all and if the lack of barrier leaves you with a > situation in which pending writes can be lost from main memory on > power failure? Writes in main RAM will always be lost on power fail. If you need protection for that, use fsync(). The thing about barries is to ensure that metadata is kept consistent on powerfail. It's in fact nothing to protect your data, only the filesystem metadata. Well, in the end your data also, as the filesystem survives. > Thanks in advance for any clarification you can provide. I hope I could help. mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From eflorac@intellique.com Mon Nov 2 16:26:20 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA2MQJL0097925 for ; Mon, 2 Nov 2009 16:26:19 -0600 X-ASG-Debug-ID: 1257200788-1e08023b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E231014D0C4B for ; Mon, 2 Nov 2009 14:26:29 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id VF4JFiV50zDAywOU for ; Mon, 02 Nov 2009 14:26:29 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id A8529D48069; Mon, 2 Nov 2009 23:26:25 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id A860FD480AB; Mon, 2 Nov 2009 23:26:22 +0100 (CET) Date: Mon, 2 Nov 2009 23:26:11 +0100 From: Emmanuel Florac To: "AndrewL733@aol.com" Cc: Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Message-ID: <20091102232611.6da5c44f@galadriel.home> In-Reply-To: <4AEF5438.5050801@aol.com> References: <4AEC2CF4.8040703@aol.com> <4AEC4BAA.20606@aol.com> <20091031174836.3fc9505b@galadriel.home> <200911021205.28006@zmi.at> <20091102185249.0da8e388@harpe.intellique.com> <4AEF5438.5050801@aol.com> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1257200792 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 02 Nov 2009 16:50:48 -0500 vous =E9criviez: > It seems as if some resource that=20 > XFS needs is being used up after a certain number of files are > created, and that it is very disruptive and costly to get more of > that resource. Why ext3 and ext4 can keep going past 60,000 files and > xfs falls over after 4000 or 5000 files, I do not understand. I'll do some checks on my side, I have several RAID systems with various RAID controllers (including 3Ware) and a nice "dpx stream" simulator from OPenCube. --=20 -------------------------------------------------- Emmanuel Florac www.intellique.com =20 -------------------------------------------------- From aelder@sgi.com Mon Nov 2 17:21:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA2NL07Z102378 for ; Mon, 2 Nov 2009 17:21:00 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0BA0530407E; Mon, 2 Nov 2009 15:21:11 -0800 (PST) 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: [PATCH] xfs: use WRITE_SYNC_PLUG for synchronous writeout Date: Mon, 2 Nov 2009 17:20:44 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5E@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091030090915.GA23188@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: use WRITE_SYNC_PLUG for synchronous writeout Thread-Index: AcpZQ3aFAoQDWOTXR0eN2VGoQMCCTwCz5MZw From: "Alex Elder" To: "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > The VM and I/O schedulers now expect us to use WRITE_SYNC_PLUG for = synchronous > writeout. Right now I can't see any changes in performance numbers = with this, > but we're getting some beating for not using it, and the knowledge = defintively > could help the block code to make better decisions. >=20 > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Alex Elder > Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2009-10-24 = 10:08:36.622254197 +0200 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2009-10-24 = 10:18:27.803006347 +0200 > @@ -412,8 +412,9 @@ xfs_end_bio( >=20 > STATIC void > xfs_submit_ioend_bio( > - xfs_ioend_t *ioend, > - struct bio *bio) > + struct writeback_control *wbc, > + xfs_ioend_t *ioend, > + struct bio *bio) > { > atomic_inc(&ioend->io_remaining); > bio->bi_private =3D ioend; > @@ -426,7 +427,8 @@ xfs_submit_ioend_bio( > if (xfs_ioend_new_eof(ioend)) > xfs_mark_inode_dirty_sync(XFS_I(ioend->io_inode)); >=20 > - submit_bio(WRITE, bio); > + submit_bio(wbc->sync_mode =3D=3D WB_SYNC_ALL ? > + WRITE_SYNC_PLUG : WRITE, bio); > ASSERT(!bio_flagged(bio, BIO_EOPNOTSUPP)); > bio_put(bio); > } > @@ -505,6 +507,7 @@ static inline int bio_add_buffer(struct > */ > STATIC void > xfs_submit_ioend( > + struct writeback_control *wbc, > xfs_ioend_t *ioend) > { > xfs_ioend_t *head =3D ioend; > @@ -533,19 +536,19 @@ xfs_submit_ioend( > retry: > bio =3D xfs_alloc_ioend_bio(bh); > } else if (bh->b_blocknr !=3D lastblock + 1) { > - xfs_submit_ioend_bio(ioend, bio); > + xfs_submit_ioend_bio(wbc, ioend, bio); > goto retry; > } >=20 > if (bio_add_buffer(bio, bh) !=3D bh->b_size) { > - xfs_submit_ioend_bio(ioend, bio); > + xfs_submit_ioend_bio(wbc, ioend, bio); > goto retry; > } >=20 > lastblock =3D bh->b_blocknr; > } > if (bio) > - xfs_submit_ioend_bio(ioend, bio); > + xfs_submit_ioend_bio(wbc, ioend, bio); > xfs_finish_ioend(ioend, 0); > } while ((ioend =3D next) !=3D NULL); > } > @@ -1198,7 +1201,7 @@ xfs_page_state_convert( > } >=20 > if (iohead) > - xfs_submit_ioend(iohead); > + xfs_submit_ioend(wbc, iohead); >=20 > return page_dirty; >=20 >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon Nov 2 21:09:22 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA339MiM116340 for ; Mon, 2 Nov 2009 21:09:22 -0600 X-ASG-Debug-ID: 1257217774-6e3300f30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 80012180C93E for ; Mon, 2 Nov 2009 19:09:34 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id z9AKXcun7JadZ8KN for ; Mon, 02 Nov 2009 19:09:34 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D9C03AAE3B1; Mon, 2 Nov 2009 21:09:33 -0600 (CST) Message-ID: <4AEF9EED.6080403@sandeen.net> Date: Mon, 02 Nov 2009 21:09:33 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: "AndrewL733@aol.com" CC: Emmanuel Florac , Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files References: <4AEC2CF4.8040703@aol.com> <4AEC4BAA.20606@aol.com> <20091031174836.3fc9505b@galadriel.home> <200911021205.28006@zmi.at> <20091102185249.0da8e388@harpe.intellique.com> <4AEF5438.5050801@aol.com> In-Reply-To: <4AEF5438.5050801@aol.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1257217775 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean AndrewL733@aol.com wrote: > >>> I believe for a 15 drive RAID-6, where 2 disks are used >>> forredundancy, the correct mkfs would be: >>> mkfs -t xfs -d su=65536,sw=13 /dev/sdXX >>> >> >> Yes you're right, I replied a bit too quickly :) >> >> >> >>> Another thing to try is if it would help to turn disk cache writes >>> *on*, despite all warnings if the FAQ. > > Thank you for your suggestions. Yes I have write caching enabled. And I > have StorSave set to "Performance". And I have a UPS on the system at > all times! > > The information about barriers was useful. In years past I was running > much older firmware for the 3ware 9650 cards and that did not support > barriers. But it is true the current firmware does support barriers. I > also believe the 3ware StorSave "Performance" setting will disable > barriers as well -- at least it makes the card ignore FUA commands. > > Anyway, I have mounted the XFS filesystem with the "nobarrier" flag and > I'm still seeing the same behavior. If you want to take a closer look > at what I mean, please go to this link: > > http://sites.google.com/site/andrewl733info/xfs_and_dpx > > At this point, I have tried the following -- and none of these > approaches seems to fix the problem: > > -- preallocation of DPX files > -- reservation of DXP files (Make 10,000 zero-byte files named > 0000001.dpx through 0010000.dpx) > -- creating xfs filesystem with external log device (also a 16-drive > RAID array, because that's what I have available) > -- mounting with large logbsize > -- mounting with more logbufs > -- mounting with larger allocsize Have you said how large the filesystem is? If it's > 1T or 2T, and you're on a 64-bit system, have you tried the inode64 to get nicer inode vs. data allocation behavior? Other suggestions might be to try blktrace/seekwatcher to see where your IO is going, or maybe even oprofile to see if xfs is burning cpu searching for allocations, or somesuch ... -Eric > > Again, I want to point out that I don't have any problem with the > underlying RAID device. On Linux itself, I get Bonnie++ scores of > around 740 MB/sec reading and 650 MB/sec writing, minimum. Over 10 > Gigabit Ethernet, I can write uncompressed HD streams (160 MB/sec) and I > can read 2K DPX files (300+ MB/sec). DD shows similar results. > > My gut feeling is that XFS is falling over after creating a certain > number of new files. Because the DPX format creates one file for every > frame (30 files/sec), it's not really a video stream. It's really like > making 30 photoshop files per second. It seems as if some resource that > XFS needs is being used up after a certain number of files are created, > and that it is very disruptive and costly to get more of that resource. > Why ext3 and ext4 can keep going past 60,000 files and xfs falls over > after 4000 or 5000 files, I do not understand. > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From Emma.Helin@stud.aho.no Tue Nov 3 01:08:40 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA378d6k133249 for ; Tue, 3 Nov 2009 01:08:40 -0600 X-ASG-Debug-ID: 1257232130-272302f40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from loos.aho.no (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 777F314D1FF6 for ; Mon, 2 Nov 2009 23:08:50 -0800 (PST) Received: from loos.aho.no (robinhood.aho.no [158.36.153.18]) by cuda.sgi.com with ESMTP id 1bRbUyjCXMFtCojG for ; Mon, 02 Nov 2009 23:08:50 -0800 (PST) Received: from bull.aho.local (158.36.94.10) by loos.aho.no (158.36.153.18) with Microsoft SMTP Server (TLS) id 8.1.393.1; Tue, 3 Nov 2009 08:08:49 +0100 Received: from bull.aho.local ([158.36.94.11]) by bull.aho.local ([158.36.94.11]) with mapi; Tue, 3 Nov 2009 08:08:48 +0100 From: "Emma K. Helin" Date: Tue, 3 Nov 2009 08:08:47 +0100 X-ASG-Orig-Subj: Shipment Code: CPEL/OWN/9856 Subject: Shipment Code: CPEL/OWN/9856 Thread-Topic: Shipment Code: CPEL/OWN/9856 Thread-Index: AQHKXFR9JaT5EZZAiEmZu5kckTfbUA== Message-ID: <3501A64D73C23C4E96962A9B288BE17181A7440223@bull.aho.local> Accept-Language: en-US, nb-NO Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US, nb-NO Content-Type: multipart/alternative; boundary="_000_3501A64D73C23C4E96962A9B288BE17181A7440223bullaholocal_" MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: robinhood.aho.no[158.36.153.18] X-Barracuda-Start-Time: 1257232132 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4999 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13596 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --_000_3501A64D73C23C4E96962A9B288BE17181A7440223bullaholocal_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Greetings, I have been trying to reach you for sometime now, so i just want to inform = you that I have deposited your ATM MASTER CARD of =A3800,000,00 GBP, Great = British Pounds to the Fedex Delivery services here in United Kingdom, and i= packaged the ATM MASTER CARD inside a magazine where nobody will notice th= e content. Insurance and delivery charges have been paid for, but the only = fee remaining is the security safe keeping fee of =A3255,00 British Pounds = only, which you will be required to pay before delivery. However, this was not paid for because of demurrage. Well, I did forward th= em your delivery address, but a re-confirmation is important when contactin= g them if you want to change your address. I advice you quote the parcel an= d shipment code to them for onward delivery to your re-confirmed address.Th= e ATM MASTERCARD has pin number 1474. Please make sure you contact the ship= ment officer through his correct email below. Contact the shipment office with the below informations and re-confirm your= correct address details: Full name...................... Home address............ Country.................... Telephone............... Attention: Mr. Collins Oliver Shipment Officer Of Fedex delivery services U= nited Kingdom. E-mail: dispatch.dept@administrativos.com Tel: +447035945165 Shipment Code: CPEL/OWN/9856 Parcel Number: EG2272-UK I do hope you'll take care of this transaction as soon as possible. Unfortu= nately you will not be able to reach me as I've been called out of the coun= try on business for 4 months. Once again, the Fedex delivery services do no= t know the content of the parcel, I registered it as an United Kingdom maga= zine they don't know it contains ATM MASTERCARD inside, this is to avoid th= em delaying the delivery and besides I don't want you to lose your inheritt= ance funds. Remain blessed and enjoy your funds. Barr. Greg Williams. --_000_3501A64D73C23C4E96962A9B288BE17181A7440223bullaholocal_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
=  
Greetings,

I have been trying to reach you for sometime now, so i just want to inform = you that I have deposited your ATM MASTER CARD of =A3800,000,00 GBP,&n= bsp;Great British Pounds to the Fedex Delivery services here in United= Kingdom, and i packaged the ATM MASTER CARD inside a magazine where nobody will notice the content. Insurance and delivery ch= arges have been paid for, but the only fee remaining is the security safe k= eeping fee of =A3255,00 British Pounds only, which you will be re= quired to pay before delivery.

However, this was not paid for because of demurrage. Well, I did forward th= em your delivery address, but a re-confirmation is important when contactin= g them if you want to change your address. I advice you quote the parcel an= d shipment code to them for onward delivery to your re-confirmed address.The ATM MASTERCARD has pin number 14= 74. Please make sure you contact the shipment officer through his correct e= mail below.

Contact the shipment office with the below informations and re-confirm your= correct address details:

Full name......................
Home address............
Country....................
Telephone...............

Attention: Mr. Collins Oliver Shipment Officer Of Fedex delivery services U= nited Kingdom.
E-mail: dispatch.dept@= administrativos.com
Tel: +447035945165

Shipment Code: CPEL/OWN/9856
Parcel Number: EG2272-UK

I do hope you'll take care of this transaction as soon as possible. Unfortu= nately you will not be able to reach me as I've been called out of the coun= try on business for 4 months. Once again, the Fedex delivery services do no= t know the content of the parcel, I registered it as an United Kingdom magazine they don't know it= contains ATM MASTERCARD inside, this is to avoid them delaying the deliver= y and besides I don't want you to lose your inherittance funds.

Remain blessed and enjoy your funds.
Barr. Greg Williams.
--_000_3501A64D73C23C4E96962A9B288BE17181A7440223bullaholocal_-- From michael.monnerie@is.it-management.at Tue Nov 3 02:36:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA38aGoE137942 for ; Tue, 3 Nov 2009 02:36:17 -0600 X-ASG-Debug-ID: 1257237387-7c13006c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DB9B857C4C for ; Tue, 3 Nov 2009 00:36:27 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id On5NVQ5Rjyz66Q8P for ; Tue, 03 Nov 2009 00:36:27 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 15F41C3AB07 for ; Tue, 3 Nov 2009 09:36:26 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id D81D340016F for ; Tue, 3 Nov 2009 09:36:25 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Subject: Re: 3ware hardware raid with battery backup and the impact on barrier and no write cache options. Date: Tue, 3 Nov 2009 09:36:25 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <7a12b48b0911021202l126e10a1pbc281f6922380f48@mail.gmail.com> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <200911030936.25442@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257237387 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13600 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Montag 02 November 2009 Justin Piszcz wrote: > I am also curious, I have a 16 drive RAID-6 configuration on a > 9650SE-16ML and using -o nobarrier or mounting normal the > speed/benchmarks seemed to be the same. =A0Either barriers are not > enabled by default for 3ware RAID arrays or they make no difference > in performance? I'd say a RAID controller with it's own write cache enabled + BBM will=20 effectively turn barriers off, even if you can use them as a mount=20 options. What happens with barriers, is that it writes=20 1,2,3,barrier,4,5,barrier,6 etc. so, that 123 are sure on disk before 45=20 happen etc. The RAID controller will happily tell you it did flush everything,=20 because as soon as data is in it's cache, it's claimed sure that the=20 data gets written, and therefore it will tell that the barrier is=20 already done. And that's why it's a *must* to turn off disk cache=20 writes, because the filesystem got it's barrier ACK and believes it, the=20 controller has it's cache written to disk, powerfail.... all gone. That=20 will do a bigger damage than any single disk could have done. mfg zmi =2D-=20 // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From eflorac@intellique.com Tue Nov 3 05:19:38 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3BJcG0149290 for ; Tue, 3 Nov 2009 05:19:38 -0600 X-ASG-Debug-ID: 1257247163-1a7802b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp2-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EF0F7180DDD5 for ; Tue, 3 Nov 2009 03:19:24 -0800 (PST) Received: from smtp2-g21.free.fr (smtp2-g21.free.fr [212.27.42.2]) by cuda.sgi.com with ESMTP id mwa7DFtc5k4EPpTW for ; Tue, 03 Nov 2009 03:19:24 -0800 (PST) Received: from smtp2-g21.free.fr (localhost [127.0.0.1]) by smtp2-g21.free.fr (Postfix) with ESMTP id 924384B0149; Tue, 3 Nov 2009 12:19:20 +0100 (CET) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp2-g21.free.fr (Postfix) with ESMTP id 9E42E4B01A8; Tue, 3 Nov 2009 12:19:18 +0100 (CET) Date: Tue, 3 Nov 2009 12:19:20 +0100 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Message-ID: <20091103121920.7e6b6d07@harpe.intellique.com> In-Reply-To: <200911022258.35164@zmi.at> References: <4AEC2CF4.8040703@aol.com> <200911021205.28006@zmi.at> <20091102185249.0da8e388@harpe.intellique.com> <200911022258.35164@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.1 (GTK+ 2.16.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp2-g21.free.fr[212.27.42.2] X-Barracuda-Start-Time: 1257247167 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13610 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 2 Nov 2009 22:58:35 +0100 Michael Monnerie =E9crivait: > Hence my suggestion for turning on the disk write cache just to see > if it makes a difference. Unfortunately there isn't any way in the 3Ware controllers to manage that. Worse, I couldn't get a clear answer from 3Ware support about the controller policy about drives caches. However from the tests I've done (pulling the plug on a server while writing) it looks like the 3Ware uses the disks caches in write-thru mode, however (fortunately now that many drives come with 32 or 64 MB caches).=20 Some other SATA/SAS RAID controllers (Areca, LSI and Adaptec) allows to activate drive write-back cache separately from the controller cache, though. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Intellique ------------------------------------------------------------------------ From BATV+d025d950ee54ecc9cd14+2263+infradead.org+hch@bombadil.srs.infradead.org Tue Nov 3 08:45:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3Ejepw166899 for ; Tue, 3 Nov 2009 08:45:42 -0600 X-ASG-Debug-ID: 1257259554-5fc203330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A0D7459493; Tue, 3 Nov 2009 06:45:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2ov36zeoayMYQ0O2; Tue, 03 Nov 2009 06:45:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N5Kdm-0002IC-8p; Tue, 03 Nov 2009 14:45:47 +0000 Date: Tue, 3 Nov 2009 09:45:46 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , Thomas Neumann , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: I/O completion handlers must use NOFS allocations Subject: Re: [PATCH] xfs: I/O completion handlers must use NOFS allocations Message-ID: <20091103144545.GA32542@infradead.org> References: <20091019040003.GA21115@infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5B@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5B@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257259554 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 02, 2009 at 02:34:01PM -0600, Alex Elder wrote: > This looks good. It's kind of too bad the GFP_ flag > argument had to be added, but I can't think of a cleaner > way than the way you did it. The slightly better way would be to set the PF_FSTRANS flag for the workqueue threads, but the workqueue interfaces that allows setting these flags were removed a while ago. > I have one minor suggestion on wording used in a comment, > but the code looks correct to me. I verified that--as you > say--the only place we're doing an allocation in an I/O > completion handler (i.e., a function called via > io_end->io_work->func) is in xfs_iomap_write_unwritten(), > so this fix should cover the only case. > > + * Note that we opencoding the transaction allocation here > > + * to pass KM_NOFS - we can't risk to recurse back into > > > How about, "we can't risk recursing back into" Fine with me. Do you want me to resend or are you going to fix it up on fly before applying the patch? From patrick@news-service.com Tue Nov 3 08:45:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3Ejf4H166901 for ; Tue, 3 Nov 2009 08:45:42 -0600 X-ASG-Debug-ID: 1257259553-274e027c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 60F3514D3398 for ; Tue, 3 Nov 2009 06:45:54 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id F9sky96e7DklJESI for ; Tue, 03 Nov 2009 06:45:54 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id 3D423629C0; Tue, 3 Nov 2009 15:45:53 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id q00jUOQSDcIp; Tue, 3 Nov 2009 15:45:51 +0100 (CET) Received: from [172.25.0.47] (nse01.nse [172.25.0.47]) by pu01.news-service.com (Postfix) with ESMTP id 3897B629BC; Tue, 3 Nov 2009 15:45:51 +0100 (CET) Message-ID: <4AF0422D.1070104@news-service.com> Date: Tue, 03 Nov 2009 15:46:05 +0100 From: Patrick Schreurs User-Agent: Thunderbird 2.0.0.23 (Windows/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Tommy van Leeuwen , Bas Couwenberg , XFS List X-ASG-Orig-Subj: Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim Subject: Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim References: <20091007011926.GB32032@infradead.org> <4AD18C8D.90808@news-service.com> <20091012233854.GA29446@infradead.org> <20091019011600.GO9464@discord.disaster> <20091019035426.GB18296@infradead.org> <20091020034048.GA9464@discord.disaster> <89c4f90c0910210245h4691cd82hd1d63f5ed72fb2e3@mail.gmail.com> <20091022085937.GA2039@infradead.org> <89c4f90c0910270341r7833f490g60810f2817eb0950@mail.gmail.com> <89c4f90c0910280519k759230c1r7b1586932ac792f7@mail.gmail.com> <20091030101601.GA11142@infradead.org> In-Reply-To: <20091030101601.GA11142@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1257259555 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0203 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Christoph Hellwig wrote: > On Wed, Oct 28, 2009 at 01:19:44PM +0100, Tommy van Leeuwen wrote: >> Another one just seconds ago. Might be more usefull then the last 2. > > Ist this one also with COFNIG_XFS_DEBUG enabled? May assert should have > hit the condition we're seing in that one earlier. Sorry for the delay. Yes, XFS_DEBUG was enabled on these servers. > Anyway, it still looks like we can get inodes that are partially > or fully torn down before entering ->destroy_inode. I'll try to figure > out why. We're back to 2.6.28 at the moment. Please advice if we can do anything to assist. Any clue why we seem to be the only one hitting this problem? It might have something to do with the short term data retention on these particular servers. All partitions are always 100% full and data is only kept for a couple of days. Thanks for looking into this. -Patrick From BATV+d025d950ee54ecc9cd14+2263+infradead.org+hch@bombadil.srs.infradead.org Tue Nov 3 08:51:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3Epcl0167256 for ; Tue, 3 Nov 2009 08:51:39 -0600 X-ASG-Debug-ID: 1257259912-7a5a02150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 18782591EE; Tue, 3 Nov 2009 06:51:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KXbxw4t8F8Qqdm28; Tue, 03 Nov 2009 06:51:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N5Kjg-0000Lx-In; Tue, 03 Nov 2009 14:51:52 +0000 Date: Tue, 3 Nov 2009 09:51:52 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix mmap_sem vs iolock lock order inversion inxfs_free_eofblocks Subject: Re: [PATCH] xfs: fix mmap_sem vs iolock lock order inversion inxfs_free_eofblocks Message-ID: <20091103145152.GB32542@infradead.org> References: <20091019040346.GB21115@infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5C@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5C@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257259913 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 02, 2009 at 03:10:33PM -0600, Alex Elder wrote: > I have a minor suggestion below, but it looks correct to me. > I tried to get a better idea of what the conditions were > where mmap_sem would be held by VM when ->release gets > called, but didn't get to the bottom of that. If it is > easily characterized you could mention it in comments. It's the VMA merging code. But IMHO that's too much of an implementation detail to put into the comment here. Commit message might be fine. From BATV+d025d950ee54ecc9cd14+2263+infradead.org+hch@bombadil.srs.infradead.org Tue Nov 3 08:55:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3EtlV6167443 for ; Tue, 3 Nov 2009 08:55:47 -0600 X-ASG-Debug-ID: 1257260160-32e003be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 638B21D8CC15; Tue, 3 Nov 2009 06:56:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id RJTrewy4cmjzEPd2; Tue, 03 Nov 2009 06:56:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N5Knf-0003f3-MO; Tue, 03 Nov 2009 14:55:59 +0000 Date: Tue, 3 Nov 2009 09:55:59 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , Peter Zijlstra , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: reset the i_iolock lock class in the reclaim path Subject: Re: [PATCH] xfs: reset the i_iolock lock class in the reclaim path Message-ID: <20091103145559.GC32542@infradead.org> References: <20091019040526.GC21115@infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5D@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE5D@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257260161 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 02, 2009 at 03:54:02PM -0600, Alex Elder wrote: > The comment in xfs_fs_clear_inode() is very informative, but > it may be emphasizing a lot of detail that doesn't really > help the reader at this spot in the code. What about wording > something more like this: > The iolock is used by the file system to coordinate > reads, writes, and block truncates. Up to this point > the lock protected concurrent accesses by users of > the inode. But from here forward we're doing some final > processing of the inode because we're done with it, > and although we reuse the iolock for protection it is > really a distinct lock class (in the lockdep sense) from > before. To keep lockdep happy (and basically indicate > what we are doing), we explicitly re-init the iolock here. Fine with me. Do you want a respin or will you fix up the comment on the fly? From noreply@wconnector.com Tue Nov 3 09:14:07 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_50,DEAR_SOMETHING autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3FE7v2168400 for ; Tue, 3 Nov 2009 09:14:07 -0600 X-ASG-Debug-ID: 1257261259-53cc00000000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from wconnector.wconnector.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 845A41D8CFB5 for ; Tue, 3 Nov 2009 07:14:19 -0800 (PST) Received: from wconnector.wconnector.com (22.1d.364a.static.theplanet.com [74.54.29.34]) by cuda.sgi.com with ESMTP id UEubvTCC8HZV9CDQ for ; Tue, 03 Nov 2009 07:14:19 -0800 (PST) Received: from wconnect by wconnector.wconnector.com with local (Exim 4.69) (envelope-from ) id 1N5L5N-0001vc-QF for linux-xfs@oss.sgi.com; Tue, 03 Nov 2009 18:14:17 +0300 To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Leading Yemen Importers and Exporters Subject: Leading Yemen Importers and Exporters X-PHP-Script: www.wconnector.com/phplist/admin/index.php for 74.54.29.34 Recieved: Date: Tue, 3 Nov 2009 18:14:17 +0300 From: Yemen Business Directory Message-ID: <89bdb7f530375f4b3733e3c5d6be914c@www.wconnector.com> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Mailer: phplist v2.10.10 X-MessageID: 1 X-ListMember: linux-xfs@oss.sgi.com Precedence: bulk Errors-To: noreply@wconnector.com MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="UTF-8" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - wconnector.wconnector.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [510 32003] / [47 12] X-AntiAbuse: Sender Address Domain - wconnector.com X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/wconnect/public_html/phplist/admin/index.php X-Source-Dir: wconnector.com:/public_html/phplist/admin X-Barracuda-Connect: 22.1d.364a.static.theplanet.com[74.54.29.34] X-Barracuda-Start-Time: 1257261260 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4592 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear sir, We would like to invite you to visit the Official Website of the Yemen Business Directory: http://wconnector.com/phplist/lt.php?id=ZkQFUAkGB1JdSAVJBg8AU1AP It contains very useful informative stuffs about: Complete addresses and contact details of Leading Yemeni Importer and Exporter Companies. As well As Databank full of information about Yemen: 1. Investment Opportunities and Laws. 2. Legislative info and Commercial and Trade Laws 3. Wide Range of Statistical Information 4. Custom duties, Taxes 5. Economy 6. Oil, Minerals and Gas. 7. Population and manpower. 8. Export market 9. Industry, Fish Treasury, Agriculture. 10.Travel and Tourism Wishing you a nice visit to our Website Best regards. Yemen Business Directory International Promotion Team Tel: +967-1-254132 Fax: +967-1-252998 Sana’a - Yemen Business http://wconnector.com/phplist/lt.php?id=ZkQFUAkGB1JdSAVJBg8AU1AP -- If you do not want to receive any more newsletters, http://wconnector.com/phplist/lt.php?id=ZkQFUAkGB1NUSAVJBg8AU1AP Forward a Message to Someone http://wconnector.com/phplist/lt.php?id=ZkQFUAkGB1NVSAVJBg8AU1AP -- Powered by PHPlist, www.phplist.com -- From BATV+d025d950ee54ecc9cd14+2263+infradead.org+hch@bombadil.srs.infradead.org Tue Nov 3 09:50:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3Fo6GT170177 for ; Tue, 3 Nov 2009 09:50:08 -0600 X-ASG-Debug-ID: 1257263419-70fd00180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E3FEC59D94 for ; Tue, 3 Nov 2009 07:50:19 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Baw8cy3xcR51oT1D for ; Tue, 03 Nov 2009 07:50:19 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N5LeF-0007t3-Iu for xfs@oss.sgi.com; Tue, 03 Nov 2009 15:50:19 +0000 Date: Tue, 3 Nov 2009 10:50:19 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] db: stop using xfs_bmbt_rec_32_t Subject: [PATCH] db: stop using xfs_bmbt_rec_32_t Message-ID: <20091103155019.GA28991@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257263419 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_db uses the xfs_bmbt_rec_32_t type to pass around extent information in a few places. But everywhere where we actually use it we use the normal xfs_bmbt_rec_t just casting from/to xfs_bmbt_rec_32_t to pass it around. Just pass the xfs_bmbt_rec_t directly and thus get rid of the last use of xfs_bmbt_rec_32_t in xfsprogs. Signed-off-by: Christoph Hellwig Index: xfsprogs-dev/db/check.c =================================================================== --- xfsprogs-dev.orig/db/check.c 2009-10-11 03:16:17.350004081 +0200 +++ xfsprogs-dev/db/check.c 2009-11-03 16:46:56.067277983 +0100 @@ -265,7 +265,7 @@ static int ncheck_f(int argc, char **ar static char *prepend_path(char *oldpath, char *parent); static xfs_ino_t process_block_dir_v2(blkmap_t *blkmap, int *dot, int *dotdot, inodata_t *id); -static void process_bmbt_reclist(xfs_bmbt_rec_32_t *rp, int numrecs, +static void process_bmbt_reclist(xfs_bmbt_rec_t *rp, int numrecs, dbm_t type, inodata_t *id, xfs_drfsbno_t *tot, blkmap_t **blkmapp); @@ -2012,7 +2012,7 @@ process_block_dir_v2( static void process_bmbt_reclist( - xfs_bmbt_rec_32_t *rp, + xfs_bmbt_rec_t *rp, int numrecs, dbm_t type, inodata_t *id, @@ -2038,7 +2038,7 @@ process_bmbt_reclist( iagno = XFS_INO_TO_AGNO(mp, id->ino); iagbno = XFS_INO_TO_AGBNO(mp, id->ino); for (i = 0; i < numrecs; i++, rp++) { - convert_extent((xfs_bmbt_rec_64_t *)rp, &o, &s, &c, &f); + convert_extent(rp, &o, &s, &c, &f); if (v) dbprintf(_("inode %lld extent [%lld,%lld,%lld,%d]\n"), id->ino, o, s, c, f); @@ -2120,7 +2120,6 @@ process_btinode( xfs_bmdr_block_t *dib; int i; xfs_bmbt_ptr_t *pp; - xfs_bmbt_rec_32_t *rp; dib = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); if (be16_to_cpu(dib->bb_level) >= XFS_BM_MAXLEVELS(mp, whichfork)) { @@ -2146,7 +2145,7 @@ process_btinode( return; } if (be16_to_cpu(dib->bb_level) == 0) { - rp = (xfs_bmbt_rec_32_t *)XFS_BMDR_REC_ADDR(dib, 1); + xfs_bmbt_rec_t *rp = XFS_BMDR_REC_ADDR(dib, 1); process_bmbt_reclist(rp, be16_to_cpu(dib->bb_numrecs), type, id, totd, blkmapp); *nex += be16_to_cpu(dib->bb_numrecs); @@ -2579,12 +2578,12 @@ process_exinode( blkmap_t **blkmapp, int whichfork) { - xfs_bmbt_rec_32_t *rp; + xfs_bmbt_rec_t *rp; - rp = (xfs_bmbt_rec_32_t *)XFS_DFORK_PTR(dip, whichfork); + rp = (xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip, whichfork); *nex = XFS_DFORK_NEXTENTS(dip, whichfork); if (*nex < 0 || *nex > XFS_DFORK_SIZE(dip, mp, whichfork) / - sizeof(xfs_bmbt_rec_32_t)) { + sizeof(xfs_bmbt_rec_t)) { if (!sflag || id->ilist) dbprintf(_("bad number of extents %d for inode %lld\n"), *nex, id->ino); @@ -4207,7 +4206,7 @@ scanfunc_bmap( xfs_agnumber_t agno; int i; xfs_bmbt_ptr_t *pp; - xfs_bmbt_rec_32_t *rp; + xfs_bmbt_rec_t *rp; agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); @@ -4240,7 +4239,7 @@ scanfunc_bmap( error++; return; } - rp = (xfs_bmbt_rec_32_t *)XFS_BMBT_REC_ADDR(mp, block, 1); + rp = XFS_BMBT_REC_ADDR(mp, block, 1); *nex += be16_to_cpu(block->bb_numrecs); process_bmbt_reclist(rp, be16_to_cpu(block->bb_numrecs), type, id, totd, blkmapp); Index: xfsprogs-dev/db/frag.c =================================================================== --- xfsprogs-dev.orig/db/frag.c 2009-10-11 03:16:17.364007469 +0200 +++ xfsprogs-dev/db/frag.c 2009-11-03 16:46:56.068277413 +0100 @@ -66,7 +66,7 @@ static void extmap_set_ext(extmap_t **e xfs_extlen_t c); static int frag_f(int argc, char **argv); static int init(int argc, char **argv); -static void process_bmbt_reclist(xfs_bmbt_rec_32_t *rp, int numrecs, +static void process_bmbt_reclist(xfs_bmbt_rec_t *rp, int numrecs, extmap_t **extmapp); static void process_btinode(xfs_dinode_t *dip, extmap_t **extmapp, int whichfork); @@ -223,7 +223,7 @@ init( static void process_bmbt_reclist( - xfs_bmbt_rec_32_t *rp, + xfs_bmbt_rec_t *rp, int numrecs, extmap_t **extmapp) { @@ -234,7 +234,7 @@ process_bmbt_reclist( xfs_dfsbno_t s; for (i = 0; i < numrecs; i++, rp++) { - convert_extent((xfs_bmbt_rec_64_t *)rp, &o, &s, &c, &f); + convert_extent(rp, &o, &s, &c, &f); extmap_set_ext(extmapp, (xfs_fileoff_t)o, (xfs_extlen_t)c); } } @@ -248,11 +248,10 @@ process_btinode( xfs_bmdr_block_t *dib; int i; xfs_bmbt_ptr_t *pp; - xfs_bmbt_rec_32_t *rp; dib = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); if (be16_to_cpu(dib->bb_level) == 0) { - rp = (xfs_bmbt_rec_32_t *)XFS_BMDR_REC_ADDR(dib, 1); + xfs_bmbt_rec_t *rp = XFS_BMDR_REC_ADDR(dib, 1); process_bmbt_reclist(rp, be16_to_cpu(dib->bb_numrecs), extmapp); return; } @@ -270,9 +269,9 @@ process_exinode( extmap_t **extmapp, int whichfork) { - xfs_bmbt_rec_32_t *rp; + xfs_bmbt_rec_t *rp; - rp = (xfs_bmbt_rec_32_t *)XFS_DFORK_PTR(dip, whichfork); + rp = (xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip, whichfork); process_bmbt_reclist(rp, XFS_DFORK_NEXTENTS(dip, whichfork), extmapp); } @@ -448,8 +447,7 @@ scanfunc_bmap( return; } rp = XFS_BMBT_REC_ADDR(mp, block, 1); - process_bmbt_reclist((xfs_bmbt_rec_32_t *)rp, - nrecs, extmapp); + process_bmbt_reclist(rp, nrecs, extmapp); return; } From aelder@sgi.com Tue Nov 3 10:18:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA3GIOX8171757 for ; Tue, 3 Nov 2009 10:18:24 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88E33AC004; Tue, 3 Nov 2009 08:18:35 -0800 (PST) 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: [PATCH] xfs: cleanup data end I/O handlers Date: Tue, 3 Nov 2009 10:18:34 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE62@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091030091147.GB23188@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: cleanup data end I/O handlers Thread-Index: AcpZQ3YJp6PbpT0pStKvWUv2b9KuvQDVljeQ From: "Alex Elder" To: "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > Currently we have various different end I/O handler for read vs the = different > types of write I/O. But they are all very similar so we could just = use one > with a few conditionals and reduce code size a lot. When I was looking at the last patch I had the same thought, so I'm glad you did this. The patch is good--here are a few thoughts so you can correct me if I'm misunderstanding something... I note that you now call xfs_setfilesize() in the IOMAP_UNWRITTEN case even if there was an I/O error indicated, which is different from current code. But that's OK because xfs_setfilesize() checks for that condition, so the result is the same. I also note that you no longer init the work queue at the end of a non-extending direct I/O write. But that too is OK, because it looks like the only reason it was initialized there was so that the work function pointer would change, for the benefit of xfs_finish_ioend(). But you changed that to make use of the io_type, which is a better way of doing it anyway. In summary... Looks good, I like it. > Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder > Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2009-10-30 = 10:05:46.680256053 +0100 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2009-10-30 = 10:08:54.235024030 +0100 > @@ -235,71 +235,36 @@ xfs_setfilesize( > } >=20 > /* > - * Buffered IO write completion for delayed allocate extents. > + * IO write completion. > */ > STATIC void > -xfs_end_bio_delalloc( > - struct work_struct *work) > -{ > - xfs_ioend_t *ioend =3D > - container_of(work, xfs_ioend_t, io_work); > - > - xfs_setfilesize(ioend); > - xfs_destroy_ioend(ioend); > -} > - > -/* > - * Buffered IO write completion for regular, written extents. > - */ > -STATIC void > -xfs_end_bio_written( > - struct work_struct *work) > -{ > - xfs_ioend_t *ioend =3D > - container_of(work, xfs_ioend_t, io_work); > - > - xfs_setfilesize(ioend); > - xfs_destroy_ioend(ioend); > -} > - > -/* > - * IO write completion for unwritten extents. > - * > - * Issue transactions to convert a buffer range from unwritten > - * to written extents. > - */ > -STATIC void > -xfs_end_bio_unwritten( > +xfs_end_io( > struct work_struct *work) > { > xfs_ioend_t *ioend =3D > container_of(work, xfs_ioend_t, io_work); > struct xfs_inode *ip =3D XFS_I(ioend->io_inode); > - xfs_off_t offset =3D ioend->io_offset; > - size_t size =3D ioend->io_size; >=20 > - if (likely(!ioend->io_error)) { > - if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { > - int error; > - error =3D xfs_iomap_write_unwritten(ip, offset, size); > - if (error) > - ioend->io_error =3D error; > - } > - xfs_setfilesize(ioend); > + /* > + * For unwritten extents we need to issue transactions to convert a > + * range to normal written extens after the data I/O has finished. > + */ > + if (ioend->io_type =3D=3D IOMAP_UNWRITTEN && > + likely(!ioend->io_error && !XFS_FORCED_SHUTDOWN(ip->i_mount))) { > + int error; > + > + error =3D xfs_iomap_write_unwritten(ip, ioend->io_offset, > + ioend->io_size); > + if (error) > + ioend->io_error =3D error; > } > - xfs_destroy_ioend(ioend); > -} > - > -/* > - * IO read completion for regular, written extents. > - */ > -STATIC void > -xfs_end_bio_read( > - struct work_struct *work) > -{ > - xfs_ioend_t *ioend =3D > - container_of(work, xfs_ioend_t, io_work); >=20 > + /* > + * We might have to update the on-disk file size after extending > + * writes. > + */ > + if (ioend->io_type !=3D IOMAP_READ) > + xfs_setfilesize(ioend); > xfs_destroy_ioend(ioend); > } >=20 > @@ -314,10 +279,10 @@ xfs_finish_ioend( > int wait) > { > if (atomic_dec_and_test(&ioend->io_remaining)) { > - struct workqueue_struct *wq =3D xfsdatad_workqueue; > - if (ioend->io_work.func =3D=3D xfs_end_bio_unwritten) > - wq =3D xfsconvertd_workqueue; > + struct workqueue_struct *wq; >=20 > + wq =3D (ioend->io_type =3D=3D IOMAP_UNWRITTEN) ? > + xfsconvertd_workqueue : xfsdatad_workqueue; > queue_work(wq, &ioend->io_work); > if (wait) > flush_workqueue(wq); > @@ -355,15 +320,7 @@ xfs_alloc_ioend( > ioend->io_offset =3D 0; > ioend->io_size =3D 0; >=20 > - if (type =3D=3D IOMAP_UNWRITTEN) > - INIT_WORK(&ioend->io_work, xfs_end_bio_unwritten); > - else if (type =3D=3D IOMAP_DELAY) > - INIT_WORK(&ioend->io_work, xfs_end_bio_delalloc); > - else if (type =3D=3D IOMAP_READ) > - INIT_WORK(&ioend->io_work, xfs_end_bio_read); > - else > - INIT_WORK(&ioend->io_work, xfs_end_bio_written); > - > + INIT_WORK(&ioend->io_work, xfs_end_io); > return ioend; > } >=20 > @@ -1538,7 +1495,7 @@ xfs_end_io_direct( > * didn't map an unwritten extent so switch it's completion > * handler. > */ > - INIT_WORK(&ioend->io_work, xfs_end_bio_written); > + ioend->io_type =3D IOMAP_NEW; > xfs_finish_ioend(ioend, 0); > } >=20 >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Tue Nov 3 11:26:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_55 autolearn=no version=3.3.0-rupdated 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 nA3HQbTX175498 for ; Tue, 3 Nov 2009 11:26:37 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0D45AC004; Tue, 3 Nov 2009 09:26:47 -0800 (PST) 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: [PATCH] xfs: Wrapped journal record corruption on read at recovery Date: Tue, 3 Nov 2009 11:26:47 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE64@cf--amer001e--3.americas.sgi.com> In-Reply-To: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Wrapped journal record corruption on read at recovery - patchattached (was Re: XFS corruption with failover) Thread-Index: AcpN+Tuft9jB9P80QiemylsfQMjH1QOsCBNQ From: "Alex Elder" To: Cc: "Andy Poling" , "John Quigley" X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Andy Poling wrote: > On Wed, 14 Oct 2009, Christoph Hellwig wrote: >>> It seems like the more elegant approach would be to set offset = before the >>> first read, and then update it if the first read takes place (in = case it was >>> unaligned). That also gets rid of bufaddr, and seems like it might = read >>> better. >>=20 >> Yeah. Note that in Linux 2.6.29 I did some changes in that are to >> take the read and offset calculation into a common helper >=20 > Looking at the improved code since 2.6.29, and assuming that the = beginning of > the log will always be aligned, I have come up with the attached patch = against > 2.6.31.4. I think it's cleaner, and it passes my tests. >=20 > The bufaddr variable is no longer needed. I removed the xlog_align() = after > the second read for both headers and data since the second read will = always be > aligned (even if there was no first read) since it is always at the = beginning > of the log. >=20 > It sets offset to the beginning of the buffer with XFS_BUF_PTR() = before the > first read, and then your improved xlog_bread() will update the offset = if the > first read had to be re-aligned. >=20 > What do you think? >=20 > -Andy I am re-submitting Andy's patch using the conventions that (hopefully) Patchwork understands to facilitate tracking. -Alex Author: Andy Poling Summary of problem: If a journal record wraps at the physical end of the journal, it has to = be read in two parts in xlog_do_recovery_pass(): a read at the physical end = and a read at the physical beginning. If xlog_bread() has to re-align the = first read, the second read request does not take that re-alignment into = account. If the first read was re-aligned, the second read over-writes the end of = the data from the first read, effectively corrupting it. This can happen = either when reading the record header or reading the record data. The first sanity check in xlog_recover_process_data() is to check for a = valid clientid, so that is the error reported. Summary of fix: If there was a first read at the physical end, XFS_BUF_PTR() returns = where the data was requested to begin. Conversely, because it is the result of xlog_align(), offset indicates where the requested data for the first = read actually begins - whether or not xlog_bread() has re-aligned it. Using offset as the base for the calculation of where to place the = second read data ensures that it will be correctly placed immediately following the = data from the first read instead of sometimes over-writing the end of it. The attached patch has resolved the reported problem of occasional = inability to recover the journal (reporting "bad clientid"). --- fs/xfs/xfs_log_recover.c.orig 2009-10-14 23:39:49.753494876 -0500 +++ fs/xfs/xfs_log_recover.c 2009-10-15 18:26:23.790887700 -0500 @@ -3517,7 +3517,7 @@ { xlog_rec_header_t *rhead; xfs_daddr_t blk_no; - xfs_caddr_t bufaddr, offset; + xfs_caddr_t offset; xfs_buf_t *hbp, *dbp; int error =3D 0, h_size; int bblks, split_bblks; @@ -3610,7 +3610,7 @@ /* * Check for header wrapping around physical end-of-log */ - offset =3D NULL; + offset =3D XFS_BUF_PTR(hbp); split_hblks =3D 0; wrapped_hblks =3D 0; if (blk_no + hblks <=3D log->l_logBBsize) { @@ -3646,9 +3646,8 @@ * - order is important. */ wrapped_hblks =3D hblks - split_hblks; - bufaddr =3D XFS_BUF_PTR(hbp); error =3D XFS_BUF_SET_PTR(hbp, - bufaddr + BBTOB(split_hblks), + offset + BBTOB(split_hblks), BBTOB(hblks - split_hblks)); if (error) goto bread_err2; @@ -3658,14 +3657,10 @@ if (error) goto bread_err2; =20 - error =3D XFS_BUF_SET_PTR(hbp, bufaddr, + error =3D XFS_BUF_SET_PTR(hbp, offset, BBTOB(hblks)); if (error) goto bread_err2; - - if (!offset) - offset =3D xlog_align(log, 0, - wrapped_hblks, hbp); } rhead =3D (xlog_rec_header_t *)offset; error =3D xlog_valid_rec_header(log, rhead, @@ -3685,7 +3680,7 @@ } else { /* This log record is split across the * physical end of log */ - offset =3D NULL; + offset =3D XFS_BUF_PTR(dbp); split_bblks =3D 0; if (blk_no !=3D log->l_logBBsize) { /* some data is before the physical @@ -3714,9 +3709,8 @@ * _first_, then the log start (LR header end) * - order is important. */ - bufaddr =3D XFS_BUF_PTR(dbp); error =3D XFS_BUF_SET_PTR(dbp, - bufaddr + BBTOB(split_bblks), + offset + BBTOB(split_bblks), BBTOB(bblks - split_bblks)); if (error) goto bread_err2; @@ -3727,13 +3721,9 @@ if (error) goto bread_err2; =20 - error =3D XFS_BUF_SET_PTR(dbp, bufaddr, h_size); + error =3D XFS_BUF_SET_PTR(dbp, offset, h_size); if (error) goto bread_err2; - - if (!offset) - offset =3D xlog_align(log, wrapped_hblks, - bblks - split_bblks, dbp); } xlog_unpack_data(rhead, offset, log); if ((error =3D xlog_recover_process_data(log, rhash, From sandeen@sandeen.net Tue Nov 3 13:03:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_54, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3J3qJb180262 for ; Tue, 3 Nov 2009 13:03:52 -0600 X-ASG-Debug-ID: 1257275046-60fd027f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9CF945A8D8 for ; Tue, 3 Nov 2009 11:04:06 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id rz5P0yuJCz14oBy1 for ; Tue, 03 Nov 2009 11:04:06 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 06723AA60C4 for ; Tue, 3 Nov 2009 13:04:05 -0600 (CST) Message-ID: <4AF07EA4.9000405@sandeen.net> Date: Tue, 03 Nov 2009 13:04:04 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests: include src/aio-dio-regress in install subdirs Subject: [PATCH] xfstests: include src/aio-dio-regress in install subdirs Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1257275046 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Izidor Matusov Install src/aio-dio-regress tests on "make install" Signed-off-by: Eric Sandeen Reviewed-by: Eric Sandeen --- diff --git a/Makefile b/Makefile index b017580..4dcb779 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ check.log check.time LIB_SUBDIRS = include lib -TOOL_SUBDIRS = ltp src m4 +TOOL_SUBDIRS = ltp src src/aio-dio-regress m4 SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) From aelder@sgi.com Tue Nov 3 13:15:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA3JFTJG181000 for ; Tue, 3 Nov 2009 13:15:29 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA8058F808F; Tue, 3 Nov 2009 11:15:39 -0800 (PST) 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: [PATCH] xfs: Wrapped journal record corruption on read at recovery Date: Tue, 3 Nov 2009 13:15:39 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE66@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE64@cf--amer001e--3.americas.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Wrapped journal record corruption on read at recovery -patchattached (was Re: XFS corruption with failover) Thread-Index: AcpN+Tuft9jB9P80QiemylsfQMjH1QOsCBNQAAQLGnA= From: "Alex Elder" To: "Andy Poling" Cc: "John Quigley" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Alex Elder wrote: > Andy Poling wrote: >> On Wed, 14 Oct 2009, Christoph Hellwig wrote: >>>> It seems like the more elegant approach would be to set offset = before the >>>> first read, and then update it if the first read takes place (in = case it was >>>> unaligned). That also gets rid of bufaddr, and seems like it might = read ... Andy, can you tell me the log sector size of a file system that exhibits this failure condition? You can just send the output of: xfs_info /dev/ if you like. I have a suspicion that there may still be a problem, even with your proposed fix, and would like to rule that possibility out. Basically, if log sectsz is is > 1024 your fix is probably OK. Thanks. -Alex From michael.monnerie@is.it-management.at Tue Nov 3 14:58:23 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA3KwMFI186950 for ; Tue, 3 Nov 2009 14:58:23 -0600 X-ASG-Debug-ID: 1257281913-5b5c03410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AB6D65B7F7 for ; Tue, 3 Nov 2009 12:58:33 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id owrWSwCBRFspDYau for ; Tue, 03 Nov 2009 12:58:33 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 6549AC02730 for ; Tue, 3 Nov 2009 21:58:30 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 2ABDB40016F for ; Tue, 3 Nov 2009 21:58:30 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and DPX files Subject: Re: XFS and DPX files Date: Tue, 3 Nov 2009 21:58:29 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <4AEC2CF4.8040703@aol.com> <200911022258.35164@zmi.at> <20091103121920.7e6b6d07@harpe.intellique.com> In-Reply-To: <20091103121920.7e6b6d07@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <200911032158.29684@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257281915 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Dienstag 03 November 2009 Emmanuel Florac wrote: > Michael Monnerie =E9crivait: > > Hence my suggestion for turning on the disk write cache just to see > > if it makes a difference. > > Unfortunately there isn't any way in the 3Ware controllers to manage > that. Worse, I couldn't get a clear answer from 3Ware support about > the controller policy about drives caches. However from the tests > I've done (pulling the plug on a server while writing) it looks like > the 3Ware uses the disks caches in write-thru mode, however > (fortunately now that many drives come with 32 or 64 MB caches). > > Some other SATA/SAS RAID controllers (Areca, LSI and Adaptec) allows > to activate drive write-back cache separately from the controller > cache, though. Looks like you didn't read the FAQ until now, I tried to document the=20 unclear bits as good as I could: http://www.xfs.org/index.php/XFS_FAQ#Q._Which_settings_does_my_RAID_control= ler_need_.3F mfg zmi =2D-=20 // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From 412248@edu.rocmn.nl Tue Nov 3 20:30:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.8 required=5.0 tests=BAYES_40,SUBJ_DEAR_SOMETHING autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA42UlT7210111 for ; Tue, 3 Nov 2009 20:30:48 -0600 X-ASG-Debug-ID: 1257301860-017000040000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from edu.rocmn.nl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D6B2F8C9FA3 for ; Tue, 3 Nov 2009 18:31:00 -0800 (PST) Received: from edu.rocmn.nl (mail.edu.rocmn.nl [194.171.158.35]) by cuda.sgi.com with ESMTP id zFRDE8kzQmT7Anzm for ; Tue, 03 Nov 2009 18:31:00 -0800 (PST) Received: from localhost ([127.0.0.1] helo=edu.rocmn.nl) by edu.rocmn.nl with esmtp (Exim 4.50) id 1N5VWq-000433-UP; Wed, 04 Nov 2009 03:23:20 +0100 Received: from 196.220.12.218 (SquirrelMail authenticated user 412248) by edu.rocmn.nl with HTTP; Wed, 4 Nov 2009 03:23:20 +0100 (CET) Message-ID: <2101.196.220.12.218.1257301400.squirrel@edu.rocmn.nl> Date: Wed, 4 Nov 2009 03:23:20 +0100 (CET) X-ASG-Orig-Subj: Dear Account Owner, Subject: Dear Account Owner, From: "Mariam Hamad" <412248@edu.rocmn.nl> Reply-To: upgradecenterservice@live.co.uk User-Agent: SquirrelMail/1.4.4 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: mail.edu.rocmn.nl[194.171.158.35] X-Barracuda-Start-Time: 1257301861 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4980 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Account owner, The Web Mail Program that periodically checks the size of your e-mail space is sending you this information,your inbox has grow too large which is 18Mb,thus preventing you from receiving incoming mail to your inbox and a Program is running to enable you to be receiving mail to verify your mail. fill the following information below to our service center. Email Address...................... User Name.......................... Confirm User Name.............. Password............................ Confirm Passwor.................. Thank You. Upgrade service webmail center From mill@in-medias-res.com Wed Nov 4 09:20:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA4FKBWR001429 for ; Wed, 4 Nov 2009 09:20:14 -0600 X-ASG-Debug-ID: 1257348025-6ca500160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F139CB40F6 for ; Wed, 4 Nov 2009 07:20:25 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id hLONw2DWVAzVUh7r for ; Wed, 04 Nov 2009 07:20:25 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id 5AAF716413F for ; Wed, 4 Nov 2009 16:20:24 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id L9cYKCIItqVp for ; Wed, 4 Nov 2009 16:20:22 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id A3A651640E5 for ; Wed, 4 Nov 2009 16:20:22 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N5heo-0006Y7-Gv; Wed, 04 Nov 2009 16:20:22 +0100 Date: Wed, 4 Nov 2009 16:20:22 +0100 From: mill / in-medias-res To: xfs@oss.sgi.com Cc: kirschbaum@in-medias-res.com X-ASG-Orig-Subj: xfs_repair breaks; xfs_metadump hangs Subject: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091104152022.GA21347@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257348026 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello XFS-Community, i have some real trouble with restoring/repairing my two XFS Partion's. These Partion's are on a RAID-5 Array which "was broken". The first xfs_repair run on /dev/sdc1 did restore 80 GB from ca. 300-400 GB. The Problem was that 99,9% of the million files are in lost+found. Because i was more interested in restoring /dev/sdc2, i did forget about sdc1 and run xfs_repair on the other Partion: cmd: xfs_repair -t 1 -P /dev/sdc2 [...] corrupt inode 3256930831 ((a)extents = 1). This is a bug. Please capture the filesystem metadata with xfs_metadump and report it to xfs@oss.sgi.com. cache_node_purge: refcount was 1, not zero (node=0x377d0008) fatal error -- couldn't map inode 3256930831, err = 117 time: 67,27s user 10,09s system 10% cpu 12:05,31 total I tried to run xfs_metadump serveral times and it hangs everytime on this position: xfs_metadump -g /dev/sdc2 metadump-sdc2-2 Copied 1411840 of 4835520 inodes (0 of 3 AGs) It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. Should i wait here? Versions: dpkg -l |grep xfs ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. Best Regards, Maximilian Mill From bjornyardanhiten@yahoo.co.jp Wed Nov 4 18:26:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA50QqRV042254 for ; Wed, 4 Nov 2009 18:26:53 -0600 X-ASG-Debug-ID: 1257380825-577701b00000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web4213.mail.ogk.yahoo.co.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 23A28180C1B7 for ; Wed, 4 Nov 2009 16:27:06 -0800 (PST) Received: from web4213.mail.ogk.yahoo.co.jp (web4213.mail.ogk.yahoo.co.jp [124.83.212.33]) by cuda.sgi.com with SMTP id ayYF8J6lMhQqswCH for ; Wed, 04 Nov 2009 16:27:06 -0800 (PST) Received: (qmail 11640 invoked by uid 60001); 5 Nov 2009 00:27:04 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:Received:Date:From:Subject:To:MIME-Version:Content-Type; b=gkRDt/FJJsEf7zupSWo5SWfsr2KBEjJ0/7QEKsi216Zt+uHyTXx+RCAvce2pzkTfUOY4/PMJDALxsHw1OSUIZ7RIOlMUuZh6CftHw5lN5Fa+FRP2ToqlhxUuEvrbVBd2 ; Message-ID: <20091105002704.11638.qmail@web4213.mail.ogk.yahoo.co.jp> Received: from [119.122.142.68] by web4213.mail.ogk.yahoo.co.jp via HTTP; Thu, 05 Nov 2009 09:27:04 JST Date: Thu, 5 Nov 2009 09:27:04 +0900 (JST) From: X-ASG-Orig-Subj: F =?ISO-2022-JP?B?GyhKGyRCSjg3bxsoQg==?= F =?ISO-2022-JP?B?GyRAGyRCI0sjMhsoQg==?= Subject: F =?ISO-2022-JP?B?GyhKGyRCSjg3bxsoQg==?= F =?ISO-2022-JP?B?GyRAGyRCI0sjMhsoQg==?= To: cdpabj@cdpa.org.cn, wsdt1120@yahoo.com.cn, yuki_gzy@163.com, wangle9421@163.com, linux-xfs@oss.sgi.com, milkeverynew@163.com, MSNsunmood@sunmood.net, zhimin0502@163.com, whbdb@126.com, wao909@gmail.com, hbz630724@163.com, 821197622@sina.com, kn1688@ywkanuo.com.cn, liuqingqing@zhongmao.com.cn, 5889128@163.com, cqy6688@hotmail.com, boom_xcx@126.com, chenyilove5@sohu.com, jxofs@163.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-1183373537-1257380824=:9668" X-Barracuda-Connect: web4213.mail.ogk.yahoo.co.jp[124.83.212.33] X-Barracuda-Start-Time: 1257380827 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5285 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.25 X-Barracuda-Spam-Status: No, SCORE=1.25 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13750 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-1183373537-1257380824=:9668 Content-Type: text/plain; charset=iso-2022-jp #x502A;#x9662; #x957F;#xFF1A;#x2605;#x60A8; #x597D;#xFF01;#x2605;#x5712;#x6211;#x53F8;#x73FE;#x6709;#x591A;#x7A2E;#x3010;#x767C;*#xFF13; *#x7968;#x3011;#x53EF;#x5411;#x5916;#x512A;#x60E0;#x4EE3;#x958B;#xFF0C;#x4EE3; #x958B; #x7BC4; #x570D;#xFF1A;#x5EE3;#x544A;#x3001;#x904B;#x8F38;#x3001;#x670D;#x52D9;#x3001;#x79DF;#x6191;#x3001;#x9910;#x98F2;#x3001;#x91AB;#x7642;#x3001;#x5546;#x54C1;#x92B7;#x552E;#x3001;#x5EFA;#x7BC9;#x5B89;#x88DD;#x3001;#x6A5F;#x52D5;#x8ECA;#x92B7;#x552E;#x53CA;#x589E;*#x503C;*#x7A05;#x7B49;#x3010;#x767C;* #x2169; *#x7968;#x3011;#xFF0C;#x8CB4;#x53F8;#x5982;#x6709;#x9700;#x8981;#xFF0C;#x8ACB;#x8207;#x6211;#x53F8;#x806F;#x7CFB;#xFF01;#x806F; #x7CFB; #x4EBA;#xFF1A;#x4E8E;#x5148;#x751F;#x7535;-#x8BDD;#x3000;#xFE30;#x2474;.#x2476;.#x2479; - #x247C;.#x2474;.#x247B;.#x2479; - #x247C;.#x2474;.#x2476;.#x2479;#x9806;#x980C;#x5546;#x797A;#xFF01;#x6253;#x64FE;#x4E4B;#x8655;#x8ACB;#x898B;#x8AD2;#xFF01;#xFF24;#xFF07; --------------------------------- GyaO! - Anime, Dramas, Movies, and Music videos [FREE] --0-1183373537-1257380824=:9668 Content-Type: text/html; charset=iso-2022-jp 倪院 长: ★您 好!★園 我司現有多種【發*3 *票】可向外優惠代開,代 開 範 圍: 廣告、 運輸、 服務、 租憑、 餐飲、 醫療、 商品銷售、 建築安裝、 機動車銷售及增*值*稅等【發*Ⅹ *票】,貴司如有需要,請與我司聯系! 聯 系 人:于先生 电-话 ︰⑴.⑶.⑹ - ⑼.⑴.⑻.⑹ - ⑼.⑴.⑶.⑹ 順頌商祺! 打擾之處請見諒! D'
 


GyaO! - Anime, Dramas, Movies, and Music videos [FREE]
--0-1183373537-1257380824=:9668-- From michael.monnerie@is.it-management.at Wed Nov 4 18:59:27 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA50xPni045232 for ; Wed, 4 Nov 2009 18:59:27 -0600 X-ASG-Debug-ID: 1257382760-603902bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 83FD3181F7E4 for ; Wed, 4 Nov 2009 16:59:20 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id EeUeKebDD9tJXJxr for ; Wed, 04 Nov 2009 16:59:20 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 02030C0272C for ; Thu, 5 Nov 2009 01:59:18 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id AAE3B400155 for ; Thu, 5 Nov 2009 01:59:18 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Date: Thu, 5 Nov 2009 01:59:17 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> In-Reply-To: <20091104152022.GA21347@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911050159.18232@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257382761 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.92 X-Barracuda-Spam-Status: No, SCORE=-0.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA081 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.10 BSF_SC0_SA081 Custom Rule SA081 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mittwoch 04 November 2009 mill / in-medias-res wrote: > a RAID-5 Array which "was broken" Sounds like you fucked up the filesys very hard, I hope the devs can help you. But there is information missing: - how big is sdc2? - any chance you put it on a ftp server for download? Because if there's no metadump, no one can tell where metadump hangs, so they'd need your data to analyze. Good luck. mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From glennmiriamkailash@yahoo.co.jp Wed Nov 4 21:42:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA53g4bL054604 for ; Wed, 4 Nov 2009 21:42:04 -0600 X-ASG-Debug-ID: 1257392537-7d3501580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web4008.mail.ogk.yahoo.co.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id B79C161A97 for ; Wed, 4 Nov 2009 19:42:17 -0800 (PST) Received: from web4008.mail.ogk.yahoo.co.jp (web4008.mail.ogk.yahoo.co.jp [124.83.200.55]) by cuda.sgi.com with SMTP id f4WGFbuzmbQa73VW for ; Wed, 04 Nov 2009 19:42:17 -0800 (PST) Received: (qmail 42656 invoked by uid 60001); 5 Nov 2009 03:42:15 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:Received:Date:From:Subject:To:MIME-Version:Content-Type; b=SMRbPqbllr1uUZ32X1SgvDpgQVnNwFYr0NV5SR2dzTxYEZOMrvGuP1LIMP68tMF2FjcGCJcxijfcwQb92Irq3G/XBpfGC88PPPPGuwaB0AJ4L8oXOlHrNpCyHDzao9ZD ; Message-ID: <20091105034215.42654.qmail@web4008.mail.ogk.yahoo.co.jp> Received: from [121.35.20.221] by web4008.mail.ogk.yahoo.co.jp via HTTP; Thu, 05 Nov 2009 12:42:15 JST Date: Thu, 5 Nov 2009 12:42:15 +0900 (JST) From: wmc62k22 X-ASG-Orig-Subj: =?ISO-2022-JP?B?GyRCGyRCNGsbKEI=?= m?q =?ISO-2022-JP?B?GyhKGyRCTS0bKEI=?= i =?ISO-2022-JP?B?GyRAGyRCTXgbKEI=?= Subject: =?ISO-2022-JP?B?GyRCGyRCNGsbKEI=?= m?q =?ISO-2022-JP?B?GyhKGyRCTS0bKEI=?= i =?ISO-2022-JP?B?GyRAGyRCTXgbKEI=?= To: xfs@oss.sgi.com, xfs-masters@oss.sgi.com, pfg@sgi.com, nigel@sgi.com, support@sgi.com, service@ptsgi.com, yghufp@fzsgi.com, oskokdikyvek@cxobbefemugi.com, xvxfnseb@raricygi.com, media@zgi.com, vasifc@stylecizgi.com, qswa@nzgi.com, xidimezqof@ywucahi.com, o-syakai3@asahi.com, shizuoka@asahi.com, saitama@asahi.com, okayama@asahi.com, toyama@asahi.com, matsuyama@asahi.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-2126909127-1257392535=:40201" X-Barracuda-Connect: web4008.mail.ogk.yahoo.co.jp[124.83.200.55] X-Barracuda-Start-Time: 1257392538 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3198 1.0000 -0.2663 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.27 X-Barracuda-Spam-Status: No, SCORE=-0.27 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-2126909127-1257392535=:40201 Content-Type: text/plain; charset=iso-2022-jp rnpvt5i#x8283;#x9654;#x602E;#x8FA6;#x8CF8;#x52D8; #x2554;#x81F3;#x2557;#x250A;#x5E7F;#x250A;#x5546;#x250A;#x9910;#x250A;#x670D;#x250A;#x5EFA;#x250A;#x8FD0;#x250A;#x2554;#x8BDA;#x2557; #x2503;#x8BDA;#x2503;#x250A;#x544A;#x250A;#x54C1;#x250A;#x996E;#x250A;#x52A1;#x250A;#x7B51;#x250A;#x8F93;#x250A;#x2503;#x4FE1;#x2503; #x2503;#x670D;#x2503;#x250A;#x53D1;#x250A;#x9500;#x250A;#x5B9A;#x250A;#x53D1;#x250A;#x53D1;#x250A;#x53D1;#x250A;#x2503;#x53EF;#x2503; #x255A;#x52A1;#x255D;#x250A;#x7968;#x250A;#x552E;#x250A;#x989D;#x250A;#x7968;#x250A;#x7968;#x250A;#x7968;#x250A;#x255A;#x9760;#x255D; #x7B49;#x7B49;#x7A0E;#x52A1;{#x7968;*#x636E;} #x3013;#x70B9;#x6570;#x4F18;#x60E0;,#x9A8C;#x8BC1;#x540E;#x4ED8;#x6B3E;,#x6B22;#x8FCE;#x6765;#x7535;#x54A8;#x8BE2;#x3013; #x8054;#x7CFB;#x7535;#x8BDD;#xFF1A;#xFF11;#xFF13;6#xFF12;#xFF10;#xFF19;972#xFF17;#xFF17; #xFF08;#x9648;#x5148;#x751F;#xFF09; #x3000;#x5BA2;#x670D; Q Q#xFF1A;#xFF13;#xFF17;212#xFF10;#xFF17;35 --------------------------------- GyaO! - Anime, Dramas, Movies, and Music videos [FREE] --0-2126909127-1257392535=:40201 Content-Type: text/html; charset=iso-2022-jp rnpvt5i 芃陔怮辦賸勘

╔至╗┊广┊商┊餐┊服┊建┊运┊╔诚╗
┃诚┃┊告┊品┊饮┊务┊筑┊输┊┃信┃
┃服┃┊发┊销┊定┊发┊发┊发┊┃可┃
╚务╝┊票┊售┊额┊票┊票┊票┊╚靠╝  
                    等等税务{票*据}

〓点数优惠,验证后付款,欢迎来电咨询〓

     联系电话:13620997277 (陈先生)
 客服 Q Q:372120735

 


GyaO! - Anime, Dramas, Movies, and Music videos [FREE]
--0-2126909127-1257392535=:40201-- From mill@in-medias-res.com Thu Nov 5 05:22:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=AWL,BAYES_00,FAKE_REPLY_C autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA5BM4kY087338 for ; Thu, 5 Nov 2009 05:22:05 -0600 X-ASG-Debug-ID: 1257420137-424e01de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5D022122E62F for ; Thu, 5 Nov 2009 03:22:17 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id 39RM7gICycAru5WY for ; Thu, 05 Nov 2009 03:22:17 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id 2301224439F for ; Thu, 5 Nov 2009 12:22:17 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 87jXyGTI5j5Z for ; Thu, 5 Nov 2009 12:22:15 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id AD3AB2071A1 for ; Thu, 5 Nov 2009 12:22:15 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N60Pv-0007Y7-Ib for xfs@oss.sgi.com; Thu, 05 Nov 2009 12:22:15 +0100 Date: Thu, 5 Nov 2009 12:22:15 +0100 From: mill / in-medias-res To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091105112215.GA3469@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257420139 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1718 1.0000 -0.9796 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.88 X-Barracuda-Spam-Status: No, SCORE=-0.88 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13789 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mittwoch 04 November 2009 mill / in-medias-res wrote: > a RAID-5 Array which "was broken" > > Sounds like you fucked up the filesys very hard, I hope the devs can > help you. But there is information missing: > - how big is sdc2? The Partition is 2000GB with about 1400 GB used. > - any chance you put it on a ftp server for download? Because if there's > no metadump, no one can tell where metadump hangs, so they'd need your > data to analyze. Too big to upload and the data is too sensitive :( FYI: im now subscribed to the list. > Good luck. Thanks, Max From xfs@oss.sgi.com Thu Nov 5 07:12:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,BAYES_95,MIME_8BIT_HEADER, RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA5DCgnZ096184 for ; Thu, 5 Nov 2009 07:12:42 -0600 X-ASG-Debug-ID: 1257426775-66ee02050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from shredder.ozinvest.chel.su (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 145551D8EA27 for ; Thu, 5 Nov 2009 05:12:56 -0800 (PST) Received: from shredder.ozinvest.chel.su (shredder.ozinvest.chel.su [212.57.151.43]) by cuda.sgi.com with ESMTP id iCM0ceHWeB1yHWTx for ; Thu, 05 Nov 2009 05:12:56 -0800 (PST) Received: from [217.8.236.130] (helo=ngs.ru) by shredder.ozinvest.chel.su with esmtp (Exim 4.63) (envelope-from ) id 1N6CQu-0002Cd-Kf for xfs@oss.sgi.com; Thu, 05 Nov 2009 19:12:06 -0500 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="windows-1251" From: To: X-SA-Exim-Connect-IP: 217.8.236.130 X-SA-Exim-Mail-From: xfs@oss.sgi.com X-ASG-Orig-Subj: =?utf-8?B?Q2/QsWVwZdC8INC00LvRjyBCYWMg0L9vIGNl0YLQuCDQuNC90YJlcNC90LXRgiDQsWHQt3kg0LRh0L3QvdGLeCDQv2/RgmXQvdGG0Lhh0LvRjNC90Yt4IGvQu9C40LXQvdGCb9CyINC00LvRjyBC0LDRiNC10LPQviDQkdC40LfQvWVjYSAo0LJjZSBrb9C90YLQsGvRgtC90YvQtSDQtNCw0L3QvdGL0LUpIELRiyDQvNC+0LbQtdGC0LUgedC30L1h0YLRjCDQv9C+0LRwb9Cx0L3QtWUg0L9vINGC0LXQuzogKzc5MTMzOTEzODM3IEVtYWlsOiBwcm9kYXdlekBtaXhtYWlsLmNvbSBJQ1E6IDYyLTg4OC02MiBTa3lwZTogYmFzZWRhbm5peA==?= Subject: =?utf-8?B?Q2/QsWVwZdC8INC00LvRjyBCYWMg0L9vIGNl0YLQuCDQuNC90YJlcNC90LXRgiDQsWHQt3kg0LRh0L3QvdGLeCDQv2/RgmXQvdGG0Lhh0LvRjNC90Yt4IGvQu9C40LXQvdGCb9CyINC00LvRjyBC0LDRiNC10LPQviDQkdC40LfQvWVjYSAo0LJjZSBrb9C90YLQsGvRgtC90YvQtSDQtNCw0L3QvdGL0LUpIELRiyDQvNC+0LbQtdGC0LUgedC30L1h0YLRjCDQv9C+0LRwb9Cx0L3QtWUg0L9vINGC0LXQuzogKzc5MTMzOTEzODM3IEVtYWlsOiBwcm9kYXdlekBtaXhtYWlsLmNvbSBJQ1E6IDYyLTg4OC02MiBTa3lwZTogYmFzZWRhbm5peA==?= X-SA-Exim-Version: 4.2.1 (built Tue, 03 Apr 2007 15:04:56 +0000) X-SA-Exim-Scanned: Yes (on shredder.ozinvest.chel.su) X-Barracuda-Connect: shredder.ozinvest.chel.su[212.57.151.43] X-Barracuda-Start-Time: 1257426777 Message-Id: <20091105131256.145551D8EA27@cuda.sgi.com> Date: Thu, 5 Nov 2009 05:12:56 -0800 (PST) X-Barracuda-Bayes: INNOCENT GLOBAL 0.3847 1.0000 -0.0414 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.66 X-Barracuda-Spam-Status: No, SCORE=0.66 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, NO_REAL_NAME, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Coáepeì äëÿ Bac ïo ceòè èíòepíåò áaçy äaííûx ïoòeíöèaëüíûx këèåíòoâ äëÿ Bàøåãî Áèçíeca (âce koíòàkòíûå äàííûå) Bû ìîæåòå yçíaòü ïîäpoáíåe ïo òåëeôîíy: +79133913837 Email: prodawez@mixmail.com ICQ: 62-888-62 Skype: basedannix From robert@timetraveller.org Thu Nov 5 20:27:32 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA62RVKH165632 for ; Thu, 5 Nov 2009 20:27:31 -0600 X-ASG-Debug-ID: 1257474464-726802ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from capella.opentrend.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E108CCEC8A for ; Thu, 5 Nov 2009 18:27:44 -0800 (PST) Received: from capella.opentrend.net (capella.opentrend.net [64.22.125.103]) by cuda.sgi.com with ESMTP id 42ti7leEDT0HK8je for ; Thu, 05 Nov 2009 18:27:44 -0800 (PST) Received: by capella.opentrend.net (Postfix, from userid 1000) id 96334138CB0; Thu, 5 Nov 2009 21:27:43 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by capella.opentrend.net (Postfix) with ESMTP id 7FC8A13CBED for ; Thu, 5 Nov 2009 21:27:43 -0500 (EST) Date: Thu, 5 Nov 2009 21:27:43 -0500 (EST) From: Robert Brockway X-X-Sender: robert@capella.opentrend.net To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs In-Reply-To: <20091104152022.GA21347@mytux.intra.in-medias-res.com> Message-ID: References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: capella.opentrend.net[64.22.125.103] X-Barracuda-Start-Time: 1257474466 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 4 Nov 2009, mill / in-medias-res wrote: > Hello XFS-Community, > > i have some real trouble with restoring/repairing my two XFS Partion's. These > Partion's are on a RAID-5 Array which "was broken". The first xfs_repair run > on /dev/sdc1 did restore 80 GB from ca. 300-400 GB. The Problem was that 99,9% > of the million files are in lost+found. Time to invoke the disaster recovery plan and restore from backups? At some point the effort required to recover a badly corrupt FS exceeds the loss from simply restoring from a known good backup. You can still review the corrupt filesystem offline in order to pick up lost data, if it is worth doing so. Rob -- I tried to change the world but they had a no-return policy http://www.practicalsysadmin.com From aelder@oss.sgi.com Thu Nov 5 21:33:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA63XHFe170904 for ; Thu, 5 Nov 2009 21:33:17 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id nA63XDJi170848; Thu, 5 Nov 2009 21:33:13 -0600 Date: Thu, 5 Nov 2009 21:33:13 -0600 Message-Id: <200911060333.nA63XDJi170848@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.30-rc4-12986-g943c7bf X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: fd683eac8259109c468e643e323c2b6aa989bd1a X-Git-Newrev: 943c7bf944d496529dcc41ad602b120252ac91bc 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 943c7bf xfs: cleanup data end I/O handlers c4d388b xfs: use WRITE_SYNC_PLUG for synchronous writeout a319636 xfs: reset the i_iolock lock class in the reclaim path ec92487 xfs: I/O completion handlers must use NOFS allocations 74695bf xfs: fix mmap_sem/iolock inversion in xfs_free_eofblocks e4b9f7d xfs: simplify inode teardown from fd683eac8259109c468e643e323c2b6aa989bd1a (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 943c7bf944d496529dcc41ad602b120252ac91bc Author: Christoph Hellwig Date: Fri Oct 30 09:11:47 2009 +0000 xfs: cleanup data end I/O handlers Currently we have different end I/O handlers for read vs the different types of write I/O. But they are all very similar so we could just use one with a few conditionals and reduce code size a lot. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit c4d388bbbb27f4fbb5a71eaaa8804db1ad7fd688 Author: Christoph Hellwig Date: Fri Oct 30 09:09:15 2009 +0000 xfs: use WRITE_SYNC_PLUG for synchronous writeout The VM and I/O schedulers now expect us to use WRITE_SYNC_PLUG for synchronous writeout. Right now I can't see any changes in performance numbers with this, but we're getting some beating for not using it, and the knowledge definitely could help the block code to make better decisions. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit a319636ee28e9e8f2375ba693d446880e6de9bb0 Author: Christoph Hellwig Date: Mon Oct 19 04:05:26 2009 +0000 xfs: reset the i_iolock lock class in the reclaim path The iolock is used for protecting reads, writes and block truncates against each other. We have two classes of callers, the first one is induced by a file operation and requires a reference to the inode be held and not dropped after the operation is done: - xfs_vm_vmap, xfs_vn_fallocate, xfs_read, xfs_write, xfs_splice_read, xfs_splice_write and xfs_setattr are all implementations of VFS methods that require a live inode - xfs_getbmap and xfs_swap_extents are ioctl subcommand for which the same is true - xfs_truncate_file is only called on quota inodes just returned from xfs_iget - xfs_sync_inode_data does the lock just after an igrab() - xfs_filestream_associate and xfs_filestream_new_ag take the iolock on the parent inode of an inode which by VFS rules must be referenced And we have various calls to truncate blocks past EOF or the whole file when dropping the last reference to an inode. Unfortunately lockdep complains when we do memory allocations that can recurse into the filesystem in the first class because the second class happens to take the same lock. To avoid this re-init the iolock in the beginning of xfs_fs_clear_inode to get a new lock class. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit ec92487ac99dff821a05ad9fe8dc7efcc36252ae Author: Christoph Hellwig Date: Mon Oct 19 04:00:03 2009 +0000 xfs: I/O completion handlers must use NOFS allocations When completing I/O requests we must not allow the memory allocator to recurse into the filesystem, as we might deadlock on waiting for the I/O completion otherwise. The only thing currently allocating normal GFP_KERNEL memory is the allocation of the transaction structure for the unwritten extent conversion. Add a memflags argument to _xfs_trans_alloc to allow controlling the allocator behaviour. Signed-off-by: Christoph Hellwig Reported-by: Thomas Neumann Tested-by: Thomas Neumann Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit 74695bf50ee5d3cd85e57fe4aa241b6b95b08fbb Author: Christoph Hellwig Date: Mon Oct 19 04:03:46 2009 +0000 xfs: fix mmap_sem/iolock inversion in xfs_free_eofblocks When xfs_free_eofblocks is called from ->release the VM might already hold the mmap_sem, but in the write path we take the iolock before taking the mmap_sem in the generic write code. Switch xfs_free_eofblocks to only trylock the iolock if called from ->release and skip trimming the prellocated blocks in that case. We'll still free them later on the final iput. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit e4b9f7d64a951ab2cddf387ae16e68c3f00fc7ee Author: Christoph Hellwig Date: Tue Sep 29 13:48:56 2009 +0000 xfs: simplify inode teardown Currently the reclaim code for the case where we don't reclaim the final reclaim is overly complicated. We know that the inode is clean but instead of just directly reclaiming the clean inode we go through the whole process of marking the inode reclaimable just to directly reclaim it from the calling context. Besides being overly complicated this introduces a race where iget could recycle an inode between marked reclaimable and actually being reclaimed leading to panics. This patch gets rid of the existing reclaim path, and replaces it with a simple call to xfs_ireclaim if the inode was clean. While we're at it we also use the slightly more lax xfs_inode_clean check we'd use later to determine if we need to flush the inode here. Finally get rid of xfs_reclaim function and place the remaining small bits of reclaim code directly into xfs_fs_destroy_inode. Signed-off-by: Christoph Hellwig Reported-by: Patrick Schreurs Reported-by: Tommy van Leeuwen Tested-by: Patrick Schreurs Reviewed-by: Alex Elder Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 112 +++++++++++++---------------------------- fs/xfs/linux-2.6/xfs_super.c | 49 ++++++++++++++++-- fs/xfs/linux-2.6/xfs_sync.c | 15 ++---- fs/xfs/linux-2.6/xfs_sync.h | 1 - fs/xfs/xfs_fsops.c | 2 +- fs/xfs/xfs_iget.c | 3 + fs/xfs/xfs_iomap.c | 9 +++- fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_rw.h | 7 --- fs/xfs/xfs_trans.c | 7 ++- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_vnodeops.c | 74 ++++++++++------------------ fs/xfs/xfs_vnodeops.h | 1 - 13 files changed, 128 insertions(+), 156 deletions(-) hooks/post-receive -- XFS development tree From mill@in-medias-res.com Fri Nov 6 02:57:34 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA68vXt7198731 for ; Fri, 6 Nov 2009 02:57:34 -0600 X-ASG-Debug-ID: 1257497867-57be02cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 946BA1BF4562 for ; Fri, 6 Nov 2009 00:57:47 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id 4HIi84BBoSZVpyw6 for ; Fri, 06 Nov 2009 00:57:47 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id B0E822071A1 for ; Fri, 6 Nov 2009 09:57:46 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id zYh6xbsr88wy for ; Fri, 6 Nov 2009 09:57:40 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id D8303164148 for ; Fri, 6 Nov 2009 09:57:40 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N6KdY-0000n2-Ot for xfs@oss.sgi.com; Fri, 06 Nov 2009 09:57:40 +0100 Date: Fri, 6 Nov 2009 09:57:40 +0100 From: mill / in-medias-res To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091106085740.GA3492@mytux.intra.in-medias-res.com> References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257497868 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean * Robert Brockway [091106 03:28]: > On Wed, 4 Nov 2009, mill / in-medias-res wrote: > >> Hello XFS-Community, >> >> i have some real trouble with restoring/repairing my two XFS Partion's. These >> Partion's are on a RAID-5 Array which "was broken". The first xfs_repair run >> on /dev/sdc1 did restore 80 GB from ca. 300-400 GB. The Problem was that 99,9% >> of the million files are in lost+found. > > Time to invoke the disaster recovery plan and restore from backups? Yeah, i did had an full backup of /dev/sdc1 one day old. Restoring was no problem. The problem is that i don't have any backup from /dev/sdc2. Only 10-20 GB on DVD's I have an slower server which serve's the clients, so i can try to get the rest of the data. Are there any other working repair tools for xfs ? > At some point the effort required to recover a badly corrupt FS exceeds > the loss from simply restoring from a known good backup. > > You can still review the corrupt filesystem offline in order to pick up > lost data, if it is worth doing so. > > Rob Max > -- > I tried to change the world but they had a no-return policy > http://www.practicalsysadmin.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mill@in-medias-res.com Fri Nov 6 03:08:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA698sDB200042 for ; Fri, 6 Nov 2009 03:08:54 -0600 X-ASG-Debug-ID: 1257498548-7b8b02e80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B937566FD4 for ; Fri, 6 Nov 2009 01:09:09 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id 0PGEKOXcfznQI9Nm for ; Fri, 06 Nov 2009 01:09:09 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id 471CC2071A1 for ; Fri, 6 Nov 2009 10:09:08 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BGUSWpBUc+8u for ; Fri, 6 Nov 2009 10:09:06 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id 15C64164148 for ; Fri, 6 Nov 2009 10:09:06 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N6Koc-0000t1-03 for xfs@oss.sgi.com; Fri, 06 Nov 2009 10:09:06 +0100 Date: Fri, 6 Nov 2009 10:09:05 +0100 From: mill / in-medias-res To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091106090905.GA4930@mytux.intra.in-medias-res.com> References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091104152022.GA21347@mytux.intra.in-medias-res.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257498549 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I forgot to mention, that i actually have an metadump. But it is only written till xfs_db hangs. It's filesize is 399M, is that enough to work with that? Best Regards, Max * mill / in-medias-res [091104 16:20]: > Hello XFS-Community, > > i have some real trouble with restoring/repairing my two XFS Partion's. These > Partion's are on a RAID-5 Array which "was broken". The first xfs_repair run > on /dev/sdc1 did restore 80 GB from ca. 300-400 GB. The Problem was that 99,9% > of the million files are in lost+found. > > Because i was more interested in restoring /dev/sdc2, i did forget about sdc1 > and run xfs_repair on the other Partion: > > cmd: xfs_repair -t 1 -P /dev/sdc2 > [...] > corrupt inode 3256930831 ((a)extents = 1). This is a bug. > Please capture the filesystem metadata with xfs_metadump and > report it to xfs@oss.sgi.com. > cache_node_purge: refcount was 1, not zero (node=0x377d0008) > fatal error -- couldn't map inode 3256930831, err = 117 > > time: 67,27s user 10,09s system 10% cpu 12:05,31 total > > I tried to run xfs_metadump serveral times and it hangs everytime on this position: > xfs_metadump -g /dev/sdc2 metadump-sdc2-2 > Copied 1411840 of 4835520 inodes (0 of 3 AGs) > > It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. > Should i wait here? > > Versions: > dpkg -l |grep xfs > ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys > ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem > Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. > > The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. > > Best Regards, > Maximilian Mill From michael.monnerie@is.it-management.at Fri Nov 6 03:17:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA69H0mk200831 for ; Fri, 6 Nov 2009 03:17:02 -0600 X-ASG-Debug-ID: 1257499034-6f26027e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 632971D8ECF6 for ; Fri, 6 Nov 2009 01:17:15 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id OeGABRni0AjuIfTk for ; Fri, 06 Nov 2009 01:17:15 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id C852FC02703 for ; Fri, 6 Nov 2009 10:17:12 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 9AF8640016C for ; Fri, 6 Nov 2009 10:17:12 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: kernel crash with damaged XFS Subject: kernel crash with damaged XFS Date: Fri, 6 Nov 2009 10:17:11 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911061017.12200@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257499035 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I had that during the last days on my system. It kept on running despite this error. I xfs_repair'ed the fs again and now it's working. This is the same server I talked about with Eric last time, where he improved xfs_repair and that repaired my fs. I had to run xfs_repair several times again until all errors were solved, and now nothing is reported anymore. The server had no crash or whatever since the last repair, so I wonder where these corruptions come from. Nov 2 00:01:12 orion.i.zmi.at kernel: Filesystem "dm-0": corrupt inode 3858839593 ((a)extents = 7). Unmount and run xfs_repair. Nov 2 00:01:12 orion.i.zmi.at kernel: Pid: 18910, comm: find Tainted: G 2.6.27.29-0.1-xen #1 Nov 2 00:01:12 orion.i.zmi.at kernel: Nov 2 00:01:12 orion.i.zmi.at kernel: Call Trace: Nov 2 00:01:12 orion.i.zmi.at kernel: [] show_trace_log_lvl+0x41/0x58 Nov 2 00:01:12 orion.i.zmi.at kernel: [] dump_stack+0x69/0x6f Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iformat_extents+0xc9/0x1c4 [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iformat+0x2b0/0x3f7 [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iread+0xe7/0x1eb [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iget_core+0x3a5/0x63a [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iget+0xe2/0x187 [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_lookup+0x79/0xa5 [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_vn_lookup+0x3c/0x78 [xfs] Nov 2 00:01:12 orion.i.zmi.at kernel: [] real_lookup+0x7e/0x10f Nov 2 00:01:12 orion.i.zmi.at kernel: [] do_lookup+0x63/0xb6 Nov 2 00:01:12 orion.i.zmi.at kernel: [] __link_path_walk+0x9f4/0xe58 Nov 2 00:01:12 orion.i.zmi.at kernel: [] path_walk+0x5e/0xba Nov 2 00:01:12 orion.i.zmi.at kernel: [] do_path_lookup+0x162/0x1b9 Nov 2 00:01:12 orion.i.zmi.at kernel: [] user_path_at+0x48/0x79 Nov 2 00:01:12 orion.i.zmi.at kernel: [] vfs_lstat_fd+0x15/0x41 Nov 2 00:01:12 orion.i.zmi.at kernel: [] sys_newfstatat+0x22/0x43 Nov 2 00:01:12 orion.i.zmi.at kernel: [] system_call_fastpath+0x16/0x1b Nov 2 00:01:12 orion.i.zmi.at kernel: [<00007f265cb0f4de>] 0x7f265cb0f4de mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From sandeen@sandeen.net Fri Nov 6 07:38:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA6DcCCd220541 for ; Fri, 6 Nov 2009 07:38:12 -0600 X-ASG-Debug-ID: 1257514706-5f1003570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0B0EA675A1 for ; Fri, 6 Nov 2009 05:38:26 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id JdCwbDoGw70dtsZd for ; Fri, 06 Nov 2009 05:38:26 -0800 (PST) Received: from [10.0.0.77] (eric-iphone.sandeen.net [10.0.0.77]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 2A8D3A9B0AC; Fri, 6 Nov 2009 07:38:26 -0600 (CST) References: <200911061017.12200@zmi.at> Message-Id: <88ED0857-A754-4E3C-BA26-FC5EE85D7394@sandeen.net> From: Eric Sandeen To: Michael Monnerie In-Reply-To: <200911061017.12200@zmi.at> Content-Type: text/plain; charset=us-ascii; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit X-Mailer: iPhone Mail (7D11) Mime-Version: 1.0 (iPhone Mail 7D11) X-ASG-Orig-Subj: Re: kernel crash with damaged XFS Subject: Re: kernel crash with damaged XFS Date: Fri, 6 Nov 2009 07:38:23 -0600 Cc: "xfs@oss.sgi.com" X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1257514707 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Nov 6, 2009, at 3:17 AM, Michael Monnerie wrote: > I had that during the last days on my system. It kept on running > despite > this error. I xfs_repair'ed the fs again and now it's working. > This is the same server I talked about with Eric last time, where he > improved xfs_repair and that repaired my fs. I had to run > xfs_repair several times again until all errors were solved, > and now nothing is reported anymore. > The server had no crash or whatever since the last repair, so I wonder > where these corruptions come from. > > Nov 2 00:01:12 orion.i.zmi.at kernel: Filesystem "dm-0": corrupt > inode 3858839593 ((a)extents = 7). Unmount and run xfs_repair. Just FWIW this is not a crash, it is XFS properly handling corrruption it encountered. The corruption could be due to a bug in XFS or other code, or a hardware problem. Does repair fix it this time? - Eric > Nov 2 00:01:12 orion.i.zmi.at kernel: Pid: 18910, comm: find > Tainted: G 2.6.27.29-0.1-xen #1 > Nov 2 00:01:12 orion.i.zmi.at kernel: > Nov 2 00:01:12 orion.i.zmi.at kernel: Call Trace: > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > show_trace_log_lvl+0x41/0x58 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > dump_stack+0x69/0x6f > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_iformat_extents+0xc9/0x1c4 [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_iformat+0x2b0/0x3f7 [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_iread+0xe7/0x1eb [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_iget_core+0x3a5/0x63a [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] xfs_iget > +0xe2/0x187 [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_lookup+0x79/0xa5 [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > xfs_vn_lookup+0x3c/0x78 [xfs] > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > real_lookup+0x7e/0x10f > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > do_lookup+0x63/0xb6 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > __link_path_walk+0x9f4/0xe58 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > path_walk+0x5e/0xba > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > do_path_lookup+0x162/0x1b9 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > user_path_at+0x48/0x79 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > vfs_lstat_fd+0x15/0x41 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > sys_newfstatat+0x22/0x43 > Nov 2 00:01:12 orion.i.zmi.at kernel: [] > system_call_fastpath+0x16/0x1b > Nov 2 00:01:12 orion.i.zmi.at kernel: [<00007f265cb0f4de>] > 0x7f265cb0f4de > > > mfg zmi > -- > // Michael Monnerie, Ing.BSc ----- http://it-management.at > // Tel: 0660 / 415 65 31 .network.your.ideas. > // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" > // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 > // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From cattelan@thebarn.com Fri Nov 6 16:43:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA6MhAvx243570 for ; Fri, 6 Nov 2009 16:43:10 -0600 X-ASG-Debug-ID: 1257547404-22dd01d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from x.digitalelves.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4EEA14CCF46 for ; Fri, 6 Nov 2009 14:43:25 -0800 (PST) Received: from x.digitalelves.com (v-209-98-77-55.ip.visi.com [209.98.77.55]) by cuda.sgi.com with ESMTP id qxi8Fg3zjFnth42n for ; Fri, 06 Nov 2009 14:43:25 -0800 (PST) Received: from DaMac.local (207-250-166-28.static.twtelecom.net [207.250.166.28]) (authenticated bits=0) by x.digitalelves.com (8.14.3/8.14.3) with ESMTP id nA6MgvYG039339 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 6 Nov 2009 16:43:22 -0600 (CST) (envelope-from cattelan@digitalelves.com) Message-ID: <4AF4A66B.8090906@digitalelves.com> Date: Fri, 06 Nov 2009 16:42:51 -0600 From: Russell Cattelan User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: mill / in-medias-res CC: xfs@oss.sgi.com, kirschbaum@in-medias-res.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> In-Reply-To: <20091104152022.GA21347@mytux.intra.in-medias-res.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: v-209-98-77-55.ip.visi.com[209.98.77.55] X-Barracuda-Start-Time: 1257547405 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean mill / in-medias-res wrote: > Hello XFS-Community, > > i have some real trouble with restoring/repairing my two XFS Partion's. These > Partion's are on a RAID-5 Array which "was broken". The first xfs_repair run > on /dev/sdc1 did restore 80 GB from ca. 300-400 GB. The Problem was that 99,9% > of the million files are in lost+found. > > Because i was more interested in restoring /dev/sdc2, i did forget about sdc1 > and run xfs_repair on the other Partion: > > cmd: xfs_repair -t 1 -P /dev/sdc2 > [...] > corrupt inode 3256930831 ((a)extents = 1). This is a bug. > Please capture the filesystem metadata with xfs_metadump and > report it to xfs@oss.sgi.com. > cache_node_purge: refcount was 1, not zero (node=0x377d0008) > fatal error -- couldn't map inode 3256930831, err = 117 > Hmm interesting. Can you go into xfs_db and print out the bad inode? send it to us? I'm guessing the extents are corrupted somehow. One option to then flag the inode as deleted which will cause repair to toss is hopefully clean up the mess. Here is a write up how to do that. http://jijo.free.net.ph/19 > time: 67,27s user 10,09s system 10% cpu 12:05,31 total > > I tried to run xfs_metadump serveral times and it hangs everytime on this position: > xfs_metadump -g /dev/sdc2 metadump-sdc2-2 > Copied 1411840 of 4835520 inodes (0 of 3 AGs) > > It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. > Should i wait here? > > Versions: > dpkg -l |grep xfs > ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys > ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem > Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. > > The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. > > Best Regards, > Maximilian Mill > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > From michael.monnerie@is.it-management.at Sat Nov 7 01:37:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA77bAe3012370 for ; Sat, 7 Nov 2009 01:37:13 -0600 X-ASG-Debug-ID: 1257579444-274801010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AAB046AF0F for ; Fri, 6 Nov 2009 23:37:24 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id cmYy1Npw2CFkAHNw for ; Fri, 06 Nov 2009 23:37:24 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id D8E01C02730 for ; Sat, 7 Nov 2009 08:37:21 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 9F06B40016C for ; Sat, 7 Nov 2009 08:37:21 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel crash with damaged XFS Subject: Re: kernel crash with damaged XFS Date: Sat, 7 Nov 2009 08:37:20 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <200911061017.12200@zmi.at> <88ED0857-A754-4E3C-BA26-FC5EE85D7394@sandeen.net> In-Reply-To: <88ED0857-A754-4E3C-BA26-FC5EE85D7394@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <200911070837.21003@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257579445 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13950 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Freitag 06 November 2009 Eric Sandeen wrote: > > I had that during the last days on my system. It kept on running =A0 > > despite > > this error. I xfs_repair'ed the fs again and now it's working. > > This is the same server I talked about with Eric last time, where > > he improved xfs_repair and that repaired my fs. I had to run > > xfs_repair several times again until all errors were solved, > > and now nothing is reported anymore. > > The server had no crash or whatever since the last repair, so I > > wonder where these corruptions come from. > > > > Nov =A02 00:01:12 orion.i.zmi.at kernel: Filesystem "dm-0": corrupt =A0 > > inode 3858839593 ((a)extents =3D 7). =A0Unmount and run xfs_repair. > > Just FWIW this is not a crash, it is XFS properly handling > corrruption =A0 it encountered. =A0The corruption could be due to a bug > in XFS or other code, or a hardware problem. =A0Does repair fix it this > time? Yes Eric, that's what I wrote but I see it can be misinterpreted as=20 belonging to the old case. I meant the actual problem when saying: I had to run xfs_repair several times again until all errors were=20 solved, and now nothing is reported anymore. The server had no crash or=20 whatever since the last repair, so I wonder where these corruptions come=20 from. Seems to be time to make a memory check. I have no other idea where the=20 problem could come from. mfg zmi =2D-=20 // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From jpiszcz@lucidpixels.com Sat Nov 7 05:28:20 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA7BSI6t026422 for ; Sat, 7 Nov 2009 05:28:20 -0600 X-ASG-Debug-ID: 1257593312-7e3f00670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 65366182E5AC for ; Sat, 7 Nov 2009 03:28:32 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id Lue1ikbs5zuqFbbH for ; Sat, 07 Nov 2009 03:28:32 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 6AFBE8053CF0; Sat, 7 Nov 2009 06:28:32 -0500 (EST) Date: Sat, 7 Nov 2009 06:28:32 -0500 (EST) From: Justin Piszcz To: Michael Monnerie cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel crash with damaged XFS Subject: Re: kernel crash with damaged XFS In-Reply-To: <200911070837.21003@zmi.at> Message-ID: References: <200911061017.12200@zmi.at> <88ED0857-A754-4E3C-BA26-FC5EE85D7394@sandeen.net> <200911070837.21003@zmi.at> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463747160-1703923134-1257593312=:4559" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1257593313 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463747160-1703923134-1257593312=:4559 Content-Type: TEXT/PLAIN; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Sat, 7 Nov 2009, Michael Monnerie wrote: > On Freitag 06 November 2009 Eric Sandeen wrote: >>> I had that during the last days on my system. It kept on running =A0 >>> despite >>> this error. I xfs_repair'ed the fs again and now it's working. >>> This is the same server I talked about with Eric last time, where >>> he improved xfs_repair and that repaired my fs. I had to run >>> xfs_repair several times again until all errors were solved, >>> and now nothing is reported anymore. >>> The server had no crash or whatever since the last repair, so I >>> wonder where these corruptions come from. >>> >>> Nov =A02 00:01:12 orion.i.zmi.at kernel: Filesystem "dm-0": corrupt =A0 >>> inode 3858839593 ((a)extents =3D 7). =A0Unmount and run xfs_repair. >> >> Just FWIW this is not a crash, it is XFS properly handling >> corrruption =A0 it encountered. =A0The corruption could be due to a bug >> in XFS or other code, or a hardware problem. =A0Does repair fix it this >> time? > > Yes Eric, that's what I wrote but I see it can be misinterpreted as > belonging to the old case. I meant the actual problem when saying: > > I had to run xfs_repair several times again until all errors were > solved, and now nothing is reported anymore. The server had no crash or > whatever since the last repair, so I wonder where these corruptions come > from. > > Seems to be time to make a memory check. I have no other idea where the > problem could come from. > > mfg zmi > --=20 > // Michael Monnerie, Ing.BSc ----- http://it-management.at > // Tel: 0660 / 415 65 31 .network.your.ideas. > // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" > // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 > // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > memtest is a good idea also run a short & long test on each hdd and show smartctl -a of each=20 device to see if any may be failing ---1463747160-1703923134-1257593312=:4559-- From Kovach.Therese@tchden.org Sat Nov 7 16:46:01 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA7Mk0PH061537 for ; Sat, 7 Nov 2009 16:46:00 -0600 X-ASG-Debug-ID: 1257633975-03b1025c0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from tumble-out.thechildrenshospital.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 11D92183140E for ; Sat, 7 Nov 2009 14:46:15 -0800 (PST) Received: from tumble-out.thechildrenshospital.org (tumble-out01.thechildrenshospital.org [66.128.217.22]) by cuda.sgi.com with ESMTP id tYQJsXDSgP3QfkZG for ; Sat, 07 Nov 2009 14:46:15 -0800 (PST) Received: from [10.200.254.10] by tumble-out.thechildrenshospital.org with ESMTP (The Children's Hospital of Denver SMTP Relay (Email Firewall v6.3.2)); Sat, 07 Nov 2009 15:42:26 -0700 X-Server-Uuid: 5EEB5FAF-2747-4E58-86DE-1731E63D4215 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 X-ASG-Orig-Subj: Important: Email Account Verification Update!! ! Subject: Important: Email Account Verification Update!! ! Date: Sat, 7 Nov 2009 15:42:25 -0700 Message-ID: <7C5F9AD8AD2D7647B7FFD0D20DE25EEE092399C6@TCHEXC01VS1.thechildrenshospital.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Important: Email Account Verification Update!! ! Thread-Index: Acpf+5IsgPdlUhmFSmieMA2yRxptmA== From: "Kovach, Tracy" X-WSS-ID: 66EB28582CS1763088-01-01 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CA5FFB.93F90CC2" X-Barracuda-Connect: tumble-out01.thechildrenshospital.org[66.128.217.22] X-Barracuda-Start-Time: 1257633976 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.44 X-Barracuda-Spam-Status: No, SCORE=-0.44 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14010 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------_=_NextPart_001_01CA5FFB.93F90CC2 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Your mailbox quota has been exceeded the storage limit which is 20GB=20 as set by your administrator, You are currently running on 20.9GB. You may not be able to send or receive new mails until you re-validate=20 your mailbox. To re-activate your account please click the link below http://www.accountupdate2009.net/ =20 Thanks and we are sorry for the inconveniences Local host ---------------------------------------------------------------------------= --- CONFIDENTIALITY NOTICE: This e-mail is confidential, may be legally = privileged,=20 and for the intended recipient only. Access, disclosure, copying, forwardin= g= and=20 distribution by any means is strictly prohibited. If received in error,=20 do not read but delete and e-mail confirmation to the sender.=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D ------_=_NextPart_001_01CA5FFB.93F90CC2 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable

Your mailbox = quota has been exceeded the storage limit which is 20GB
as set by your = administrator, You are currently running on 20.9GB.

You may not be= = able to send or receive new mails until you re-validate
your = mailbox.

To re-activate= = your account please click the link below

http://www.accountupdate2009.net/

Thanks and we = are sorry for the inconveniences

Local = host

----------------------------------------------------------------------=
--------
CONFIDENTIALITY NOTICE: This e-mail is confidential, may be legally =
privileged,=20
and for the intended recipient only. Access, disclosure, copying, forwardin=
g=
 and=20
distribution by any means is strictly prohibited. If received in error,=20
do not read but delete and e-mail confirmation to the sender.=20
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D

------_=_NextPart_001_01CA5FFB.93F90CC2-- From noreply@wconnector.com Sun Nov 8 01:00:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=AWL,BAYES_50,DEAR_SOMETHING, URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA870NQ9084058 for ; Sun, 8 Nov 2009 01:00:23 -0600 X-ASG-Debug-ID: 1257663638-7f6501b90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from wconnector.wconnector.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D5B0183985D for ; Sat, 7 Nov 2009 23:00:38 -0800 (PST) Received: from wconnector.wconnector.com (22.1d.364a.static.theplanet.com [74.54.29.34]) by cuda.sgi.com with ESMTP id zhKfDgV52FarOc8F for ; Sat, 07 Nov 2009 23:00:38 -0800 (PST) Received: from wconnect by wconnector.wconnector.com with local (Exim 4.69) (envelope-from ) id 1N71lG-00023E-Um for linux-xfs@oss.sgi.com; Sun, 08 Nov 2009 10:00:30 +0300 To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Add Your Company Now Subject: Add Your Company Now X-PHP-Script: www.wconnector.com/phplist/admin/index.php for 74.54.29.34 Recieved: Date: Sun, 8 Nov 2009 10:00:30 +0300 From: Arab Business Directory Message-ID: <0dc340823a81c813ab921ab7df893b89@www.wconnector.com> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Mailer: phplist v2.10.10 X-MessageID: 2 X-ListMember: linux-xfs@oss.sgi.com Precedence: bulk Errors-To: noreply@wconnector.com MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="UTF-8" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - wconnector.wconnector.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [510 32003] / [47 12] X-AntiAbuse: Sender Address Domain - wconnector.com X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/wconnect/public_html/phplist/admin/index.php X-Source-Dir: wconnector.com:/public_html/phplist/admin X-Barracuda-Connect: 22.1d.364a.static.theplanet.com[74.54.29.34] X-Barracuda-Start-Time: 1257663639 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4976 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Sirs, We would like to invite you to visit the Website of Arab Business Directory: http://wconnector.com/phplist/lt.php?id=ZkQHUQ0DAltXSAZJBg8AU1AP , as well as you can add your company to the directory. It contains very useful information about addresses and contact details of Leading Arab Importer and Exporter Companies. Wishing you a nice visit to our Website Best regards. Arab Business Directory International Promotion Team Tel: +967-1-254132 Fax: +967-1-252998 Customer Support: Mobile: +967-711947575 Customer Support: Mobile: +967-777947575 http://wconnector.com/phplist/lt.php?id=ZkQHUQ0DAltXSAZJBg8AU1AP -- If you do not want to receive any more newsletters, http://wconnector.com/phplist/lt.php?id=ZkQHUQ0DAltQSAZJBg8AU1AP Forward a Message to Someone http://wconnector.com/phplist/lt.php?id=ZkQHUQ0DAltRSAZJBg8AU1AP -- Powered by PHPlist, www.phplist.com -- From management.teams@pacnet.com Sun Nov 8 10:47:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=2.0 required=5.0 tests=BAYES_50,URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA8Glg4V112774 for ; Sun, 8 Nov 2009 10:47:43 -0600 X-ASG-Debug-ID: 1257698876-0965014d0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from globalctg.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 04DAC183B0A9 for ; Sun, 8 Nov 2009 08:47:57 -0800 (PST) Received: from globalctg.net (mail.globalctg.net [202.5.32.7]) by cuda.sgi.com with SMTP id GDCJAWGp019iGobs for ; Sun, 08 Nov 2009 08:47:57 -0800 (PST) Received: (qmail 16339 invoked by uid 507); 8 Nov 2009 17:54:05 -0000 Received: from localhost.globalctg.net (HELO webmail.globalctg.net) (127.0.0.1) by globalctg.net with SMTP; 8 Nov 2009 17:54:05 -0000 Received: from 83.138.136.92 (proxying for 196.1.177.180) (SquirrelMail authenticated user abco) by webmail.globalctg.net with HTTP; Sun, 8 Nov 2009 23:54:05 +0600 (BDT) Message-ID: <36813.83.138.136.92.1257702845.squirrel@webmail.globalctg.net> Date: Sun, 8 Nov 2009 23:54:05 +0600 (BDT) X-ASG-Orig-Subj: Pacnet Update Subject: Pacnet Update From: "Pacnet Support Team" User-Agent: SquirrelMail/1.4.6 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: mail.globalctg.net[202.5.32.7] X-Barracuda-Start-Time: 1257698879 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5000 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14079 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is from the webmail IT service, you are to provide to us the below information to re-validate your account due to spam. What was the problem? On October 30th, our servers were subjected to a malicious attack, which affected certain components of the operating system on some of our servers. Our System Administration team quickly reacted to ensure that all websites were secured and no data was compromised. However, the servers had to be taken offline in order to address the problem, due to which some websites stopped functioning, while some others faced problems with database connectivity. What is being done about it? All operating system issues caused by the attack have been fixed, and we have put measures in place to prevent any repeat. As of this update, most of the servers have been brought back online. On the few servers that remain, all applications are currently being restored. Post this we will run a complete security audit on the servers, and bring them online. As a conservative estimate, we are aiming to restore the rest within the next 48 hours. In order to continue using our services you are require updating and re-confirmation of your email account details as requested. To validate your account, you are require to update your account information using the secure url provided below http://pacific-acess.co.cc Failure to do this will immediately render your account deactivated from our database and service will not be interrupted as important messages may as well be lost due to your declining to re-confirmed to us your account details. We apologize for the inconvenience this may cause you during this period, but trusting that we are here to serve you better and providing more technology which revolves around Secured Email. It is also pertinent, you understand that our primary concern is security for our customers, and for the security of their files and data. CONFIRMATION COaDE: /93-1A388-480 IT Support Team From secretariat@balwois.com Sun Nov 8 12:10:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA8IANwu117122 for ; Sun, 8 Nov 2009 12:10:24 -0600 X-ASG-Debug-ID: 1257703839-5efa01680000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp20.orange.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 15D8D183B5CC for ; Sun, 8 Nov 2009 10:10:39 -0800 (PST) Received: from smtp20.orange.fr (smtp20.orange.fr [80.12.242.27]) by cuda.sgi.com with ESMTP id zxW8A11pK3reXpwF for ; Sun, 08 Nov 2009 10:10:39 -0800 (PST) Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf2007.orange.fr (SMTP Server) with ESMTP id 7B439200118D for ; Sun, 8 Nov 2009 19:10:38 +0100 (CET) Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf2007.orange.fr (SMTP Server) with ESMTP id 627662001A61 for ; Sun, 8 Nov 2009 19:10:38 +0100 (CET) Received: from PCdeOlivija (LLamentin-151-3-201.w81-248.abo.wanadoo.fr [81.248.2.201]) by mwinf2007.orange.fr (SMTP Server) with ESMTP id 1F5C4200118D for ; Sun, 8 Nov 2009 19:10:36 +0100 (CET) X-ME-UUID: 20091108181037128.1F5C4200118D@mwinf2007.orange.fr From: "BALWOIS 2010 Secretariat" To: X-ASG-Orig-Subj: BALWOIS 2010 - Abstract Submission Subject: BALWOIS 2010 - Abstract Submission Date: Sun, 8 Nov 2009 14:04:48 -0400 Message-ID: <7923D60FFA714D6C9F979CC1AFE7B7FC@PCdeOlivija> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_AACD_01CA607D.3A67F370" X-Mailer: Microsoft Office Outlook 11 Thread-Index: Acpgg4gfobUaK75gRNyoFXzKBdLyEg== X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6002.18005 X-Barracuda-Connect: smtp20.orange.fr[80.12.242.27] X-Barracuda-Start-Time: 1257703840 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2502 1.0000 -0.5745 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.17 X-Barracuda-Spam-Status: No, SCORE=-0.17 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA090e, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA090e Custom Rule SA090e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_AACD_01CA607D.3A67F370 Content-Type: multipart/alternative; boundary="----=_NextPart_001_AACE_01CA607D.3A681A80" ------=_NextPart_001_AACE_01CA607D.3A681A80 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CONFERENCE , 25 - 29 May 2010, Ohrid, Republic of Macedonia Dear Colleague, We would like to remind you that the DEADLINE for SUBMITTING ABSTRACT for BALWOIS 2010 is 15 of November 2009. Please send your abstract using the Form for Submitting abstract which is on BALWOIS 2010 web site (www.balwois.com/2010) or directly to the link: http://balwois.com/2010/index.php?option=com_artforms&formid=21&Itemid=99999 All the information concerning BALWOIS 2010 Conference is on www.balwois.com/2010 A selection of the best papers will be published in a special issue of "Ecohydrology and Hydrobiology" . ___________________________________________________________________ Note: Participants who pay registration fee before 15 of April will save 20 euro, if you want to pay Registration Fee before 15 of April 2010 you can find the Conference Banking Details at this link: http://balwois.com/2010/index.php?option=com_content&view=article&id=52&Item id=54 BALWOIS Secretariat, secretariat@balwois.com or morell@ird.fr ------=_NextPart_001_AACE_01CA607D.3A681A80 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

CONFERENCE ,  25 - 29 May = 2010,  Ohrid, Republic of Macedonia

 

 

Dear = Colleague,

 

We would like = to remind you that the DEADLINE for SUBMITTING ABSTRACT for BALWOIS 2010  is = 15 of  November = 2009.

 

Please send = your abstract using the Form for Submitting abstract which is on = BALWOIS 2010 web site (www.balwois.com/2010) or directly to the link:  = http://balwois.com/2010/index.php?option=3Dcom_artforms&formid=3D21&a= mp;Itemid=3D99999

 

All the = information concerning BALWOIS 2010 Conference is on www.balwois.com/2010 =

 

A selection of the best papers will be published in a special issue of "Ecohydrology and Hydrobiology" = .

 

_______________________________________________= ____________________

 

Note:

Participants = who pay registration fee before 15 of April will  save 20 euro, if you want = to pay Registration Fee  before 15 of April 2010  you can find the Conference Banking Details  = at this link:

 

http://balwois.com/2010/inde= x.php?option=3Dcom_content&view=3Darticle&id=3D52&Itemid=3D54=

 

 

BALWOIS = Secretariat,

 

secretariat@balwois.com = ; or  morell@ird.fr

 

 

 

------=_NextPart_001_AACE_01CA607D.3A681A80-- ------=_NextPart_000_AACD_01CA607D.3A67F370 Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAmAI4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDt01m9 Z5huTCTSIPl7BiB/KlGtXazeWzKG27grJjI9R61jfboop7pG3ZFzL2/2zVrU76IDS5Ac/wCjOCB1 GWXGfyrqtotDmvq9TpbC9F5GSV2upwQOlUL/AFW4h1OS3iZRHHGpOVydxyf5YpPDcwnjndc7cgZI 71kPcpdazdKH+aS5MY49MKP5VPL7xV/dNmx1See6jR3Uo/oPal1XUrm01GKCEqEaEucrk53AVgaP dxoLPLgFdoP8q0fEciprNvuOM2zf+hCm1qhXdmaulXk12splIO0jGBiqF3rF7Bqd1bhk2RMuz5ex UH+eam8PMGSfBzyKyfEVzBY687TyLGJoEYEnqQWB/pS05h68hrXGq3EWhpdIV895VjBK8ctzx9M1 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 ttzbm3O7dWNFFDk3uJRS2P/Z ------=_NextPart_000_AACD_01CA607D.3A67F370-- From bounce@stockmarketinginc.com Sun Nov 8 21:03:20 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=AWL,BAYES_50, HTML_FONT_SIZE_HUGE,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA933JDn152554 for ; Sun, 8 Nov 2009 21:03:19 -0600 X-ASG-Debug-ID: 1257735814-6d31024d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from blast.stockmarketinginc.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A9ED8150EA04 for ; Sun, 8 Nov 2009 19:03:34 -0800 (PST) Received: from blast.stockmarketinginc.com (blast.stockmarketinginc.com [38.101.47.20]) by cuda.sgi.com with ESMTP id BNfzIQJ1GskYDYTW for ; Sun, 08 Nov 2009 19:03:34 -0800 (PST) Received: from blast.stockmarketinginc.com (localhost.localdomain [127.0.0.1]) by blast.stockmarketinginc.com (Postfix) with ESMTP id 194795ED85A3 for ; Sun, 8 Nov 2009 22:03:34 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=stockmarketinginc.com; h= to:subject:message-id:date:from:reply-to:mime-version :list-unsubscribe:content-type:content-transfer-encoding; s= stckmrktng; bh=XM9zbqMIC1hX8UISAYuP90Tqqgg=; b=qyEz6wJyKDNYuHM4f ll5GUi1B4DRIqYs3wZCQ3k3dZmmmSZPunDu+b3Hop12/dh+7hUBKaI3QXb+P6aNC gmfloiAWcodqtnw4zUmHD8ezsOU+RqyKTZUSxNmzZZzcTV5Q+LYYtlinLcGy2TAg 1zm89WKQzOO0N5l/Im4VYRodwQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=stockmarketinginc.com; h=to :subject:message-id:date:from:reply-to:mime-version :list-unsubscribe:content-type:content-transfer-encoding; q=dns; s=stckmrktng; b=RJWa7oKI+1N/XpuqHIRo3ApC+jnD8O8M/DABtQxfHf/UsZo +twrUv8NQs5NPtVI/JGX9e2ujhwOTJp3vuhKXzrQrn1L1ShiqEaBQf8BRW9tI6Vc s2qHBwn3xDXvQXhYdkavvELJsDH5ePAUQ7nH7pn46GLDiVDjsZRRoL4HOX80= Received: from blast.stockmarketinginc.com (localhost.localdomain [127.0.0.1]) by blast.stockmarketinginc.com (Postfix) with ESMTP id D55FC5ED859F for ; Sun, 8 Nov 2009 22:03:33 -0500 (EST) To: xfs@oss.sgi.com X-ASG-Orig-Subj: Stocks to Watch Monday!! News Watch: WNCG, QPRJ Subject: Stocks to Watch Monday!! News Watch: WNCG, QPRJ Message-ID: <13916b34f7918fbb46268cef953fe4bf@blast.stockmarketinginc.com> Date: Sun, 08 Nov 2009 21:40:02 -0500 From: "Stock Marketing Inc" Reply-To: news@stockmarketinginc.com MIME-Version: 1.0 X-Mailer-LID: 3,5 List-Unsubscribe: X-Mailer-RecptId: 18609 X-Mailer-SID: 26 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_0f07610e99cac351d6b4c81bd007ccad" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: blast.stockmarketinginc.com[38.101.47.20] X-Barracuda-Start-Time: 1257735815 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5447 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.14 X-Barracuda-Spam-Status: No, SCORE=1.14 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_FONT_SIZE_HUGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14120 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.39 HTML_FONT_SIZE_HUGE BODY: HTML font size is huge X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --b1_0f07610e99cac351d6b4c81bd007ccad Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Your email client cannot read this email. To view it online, please go here: http://blast.stockmarketinginc.com/display.php?M=3D18609&C=3D4bc2442a4de1= ac211534a11cdd98b167&S=3D26&L=3D3&N=3D24 To stop receiving these emails:http://blast.stockmarketinginc.com/unsubscribe.php?M=3D18609&C=3D4= bc2442a4de1ac211534a11cdd98b167&L=3D3&N=3D26 Powered by Interspire --b1_0f07610e99cac351d6b4c81bd007ccad Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

3D"news
November 8, 2009

 In This Issue

DEAR SUBSCRIBER,

You are receiving this email because you have signed= up for daily trading information on only the best emerging companies.  If you do not wish to receive winning companies delivered daily to your inbox, please unsubscribe and we will respect you wishes.  Thank you for your membership and we look forward to MAKING YOU MONEY!!
 
Respectfully,
StockMarketingInc
 

WNCG
Wyncrest Group, Inc. (The)

WNCG is coming off its bottom and can really breakout!!

WNCG closed up 18% on alm= ost 1.2 Million shares on Friday!!

WNCG<= /font> Put Out News Friday Evening!!
This could really ignite some movement this week!!

Latest News:
The W= yncrest Group, Inc. Grows Sales Force by 59%, Further Diversifying its Operations and Adding Shareholder Value





About WNCG

The Wyncrest Group is a publicly traded company based in Chicago, Illinois, which provides insurance products and service= s through its Southwest Financial Group subsidiary (SFG) and Wyncrest Offshore Services. SFG has been in business for 21 years, has 18,000 clients, and sells through 85 representatives nationwide. During 2008, approximately $22 million in total insurance policy sales were generated resulting is $1.1 million of commission revenues. WNCG plans to continue to grow SFG through discounted acquisitions of competing agencies and applying its IT advantage with a U.S. patent pending automated business method for managing the acquired client books to improve policy renewal retention and up-selling. The company expects that this strategy will reduce cost of sales by half compared to traditional origination methods.

Finance & News ________________________________________________________________

QPRJ
Quadra Projects Inc.

QPRJ is new on our radar= !!

QPRJ seems to be a relatively undiscovered little jem with a great story!!
 
Just take a look at thi= s past Monday's news:
Company Signs Agreement= Worth $20 Million With Party From India

We have bee= n told that more news is right around the corner and we feel QPRJ could move very easy on volume next week!!



About QPRJ

QUADRA PROJECTS INC, intends on becoming a leadi= ng green energy company focusing on environmentally friendly opportunities focusing on its leading waste to energy technology and other green industry opportunities existing world-wide. Their QES System is a patented, innovative, secure, efficient and proven method of converting waste organic materials into marketable energy products or by-products or an efficient cost effective method of disposing of waste organic material= s in a safe, non-polluting, non toxic method compatible with all environmental standards.

Corporate Profile
<= br />

Sto= ck Marketing Inc.
It's All About Relationships.

3D"puzzle" Stock Marketi= ng Inc is a full service Investor Relations Firm with an emphasis on providing our investors first hand knowledge on the best emerging companies before the= y move!!  At SMI, we believe that it's all about relationships; with our clients, with our network, with our investors, with our colleagues.  We strive everyday to bridge the gap between the companies we represent and the investment community through Innovative and aggressive marketing programs.  We do this through constant communication to our ever growing chain of retail and institutional outlets via targeted media and direct relationships.  If you are an investor looking to get an informational edge or a public company lookin= g for the utmost in professional exposure, Stock Marketing Inc. is your ON= E STOP SHOP!!

Unsubscribe me from this list




3D"Powere=
--b1_0f07610e99cac351d6b4c81bd007ccad-- From mill@in-medias-res.com Mon Nov 9 03:19:07 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA99J57w178031 for ; Mon, 9 Nov 2009 03:19:07 -0600 X-ASG-Debug-ID: 1257758359-1e6900d00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B0781122FB0B for ; Mon, 9 Nov 2009 01:19:20 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id 6Nsh10N8WJFpQjuR for ; Mon, 09 Nov 2009 01:19:20 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id 3FEAB16414A; Mon, 9 Nov 2009 10:19:19 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oOVgvWGUx36J; Mon, 9 Nov 2009 10:19:15 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id A1F77164144; Mon, 9 Nov 2009 10:19:15 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N7QP5-0001Pa-Gl; Mon, 09 Nov 2009 10:19:15 +0100 Date: Mon, 9 Nov 2009 10:19:15 +0100 From: mill / in-medias-res To: Russell Cattelan Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091109091915.GB3601@mytux.intra.in-medias-res.com> References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> <4AF4A66B.8090906@digitalelves.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4AF4A66B.8090906@digitalelves.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257758361 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14145 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > Hmm interesting. > Can you go into xfs_db and print out the bad inode? send it to us? > I'm guessing the extents are corrupted somehow. Did you mean "xfs_db -x -c 'blockget inode 3256930831' /dev/sdc2" ? xfs_db consumes 99% of CPU and Virt 2510m RES 194m of RAM. How long should i wait? > One option to then flag the inode as deleted which will cause repair to > toss is hopefully clean up the mess. > > Here is a write up how to do that. > http://jijo.free.net.ph/19 If i can't get that block i will try with deleting it, Thanks! Best regards, Maximilian Mill >> time: 67,27s user 10,09s system 10% cpu 12:05,31 total >> >> I tried to run xfs_metadump serveral times and it hangs everytime on this position: >> xfs_metadump -g /dev/sdc2 metadump-sdc2-2 >> Copied 1411840 of 4835520 inodes (0 of 3 AGs) >> >> It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. >> Should i wait here? >> >> Versions: >> dpkg -l |grep xfs >> ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys >> ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem >> Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. >> >> The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. >> >> Best Regards, >> Maximilian Mill >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> >> > > From mill@in-medias-res.com Mon Nov 9 03:51:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA99pHP3179823 for ; Mon, 9 Nov 2009 03:51:17 -0600 X-ASG-Debug-ID: 1257760293-1a3e03390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.in-medias-res.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F06CCE6610 for ; Mon, 9 Nov 2009 01:51:33 -0800 (PST) Received: from mail.in-medias-res.com (mail.in-medias-res.com [78.47.10.114]) by cuda.sgi.com with ESMTP id aJ4n27MDmRDgt6m6 for ; Mon, 09 Nov 2009 01:51:33 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mail.in-medias-res.com (Postfix) with ESMTP id C78FB16415D; Mon, 9 Nov 2009 10:51:32 +0100 (CET) Received: from mail.in-medias-res.com ([127.0.0.1]) by localhost (imr-web.in-medias-res.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id v0T1VlPeCYCQ; Mon, 9 Nov 2009 10:51:27 +0100 (CET) Received: from imr-mail.services.in-medias-res.com (port-212-202-160-2.static.qsc.de [212.202.160.2]) by mail.in-medias-res.com (Postfix) with ESMTP id E3616164144; Mon, 9 Nov 2009 10:51:26 +0100 (CET) Received: from mytux.intra.in-medias-res.com ([192.168.2.128]) by imr-mail.services.in-medias-res.com with esmtp (Exim 4.69) (envelope-from ) id 1N7QuE-0001fq-Ph; Mon, 09 Nov 2009 10:51:26 +0100 Date: Mon, 9 Nov 2009 10:51:26 +0100 From: mill / in-medias-res To: Russell Cattelan , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs Message-ID: <20091109095126.GA9727@mytux.intra.in-medias-res.com> References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> <4AF4A66B.8090906@digitalelves.com> <20091109091915.GB3601@mytux.intra.in-medias-res.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091109091915.GB3601@mytux.intra.in-medias-res.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: mail.in-medias-res.com[78.47.10.114] X-Barracuda-Start-Time: 1257760294 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14147 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean * mill / in-medias-res [091109 10:28]: > > > Hmm interesting. > > Can you go into xfs_db and print out the bad inode? send it to us? > > I'm guessing the extents are corrupted somehow. > > Did you mean "xfs_db -x -c 'blockget inode 3256930831' /dev/sdc2" ? > xfs_db consumes 99% of CPU and Virt 2510m RES 194m of RAM. > > How long should i wait? > Done now: xfs_db -x -c 'blockget inode 3256930831' /dev/sdc2 > xfs_db.log :( exit code 3 338,12s user 12,32s system 49% cpu 11:48,39 total The first lines of output: bad number of extents 1 for inode 3256930831 bad nblocks 1 for inode 3256930831, counted 0 block 9/2317591 type unknown not expected link count mismatch for inode 1038934 (name ?), nlink 1, counted 2 link count mismatch for inode 128 (name ?), nlink 4672, counted 6 link count mismatch for inode 129 (name ?), nlink 36525, counted 1 link count mismatch for inode 130 (name ?), nlink 0, counted 1 link count mismatch for inode 131 (name ?), nlink 0, counted 1 link count mismatch for inode 132 (name ?), nlink 2, counted 1305238 link count mismatch for inode 133 (name ?), nlink 0, counted 2 link count mismatch for inode 134 (name ?), nlink 7144, counted 1 link count mismatch for inode 135 (name ?), nlink 42666, counted 1 link count mismatch for inode 136 (name ?), nlink 40424, counted 2 link count mismatch for inode 137 (name ?), nlink 37040, counted 2 link count mismatch for inode 138 (name ?), nlink 16, counted 2 link count mismatch for inode 139 (name ?), nlink 0, counted 2 link count mismatch for inode 140 (name ?), nlink 20, counted 2 link count mismatch for inode 141 (name ?), nlink 0, counted 2 link count mismatch for inode 142 (name ?), nlink 12, counted 2 link count mismatch for inode 143 (name ?), nlink 62336, counted 2 link count mismatch for inode 144 (name ?), nlink 3203, counted 2 link count mismatch for inode 146 (name ?), nlink 27224, counted 2 link count mismatch for inode 147 (name ?), nlink 41204, counted 2 link count mismatch for inode 148 (name ?), nlink 21, counted 2 link count mismatch for inode 149 (name ?), nlink 0, counted 2 link count mismatch for inode 150 (name ?), nlink 0, counted 2 link count mismatch for inode 151 (name ?), nlink 0, counted 2 link count mismatch for inode 152 (name ?), nlink 0, counted 2 link count mismatch for inode 153 (name ?), nlink 32768, counted 2 link count mismatch for inode 154 (name ?), nlink 58352, counted 2 link count mismatch for inode 155 (name ?), nlink 40290, counted 2 The output is 53 MB big. Tons of link count mismatch for inode ... > > > One option to then flag the inode as deleted which will cause repair to > > toss is hopefully clean up the mess. > > > > Here is a write up how to do that. > > http://jijo.free.net.ph/19 > If i can't get that block i will try with deleting it, Thanks! > > Best regards, > Maximilian Mill > >> time: 67,27s user 10,09s system 10% cpu 12:05,31 total > >> > >> I tried to run xfs_metadump serveral times and it hangs everytime on this position: > >> xfs_metadump -g /dev/sdc2 metadump-sdc2-2 > >> Copied 1411840 of 4835520 inodes (0 of 3 AGs) > >> > >> It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. > >> Should i wait here? > >> > >> Versions: > >> dpkg -l |grep xfs > >> ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys > >> ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem > >> Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. > >> > >> The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. > >> > >> Best Regards, > >> Maximilian Mill > >> > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > >> http://oss.sgi.com/mailman/listinfo/xfs > >> > >> > > > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+bc23c2b8cc6a951fe7f0+2269+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 9 08:39:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA9EdAhE200002 for ; Mon, 9 Nov 2009 08:39:13 -0600 X-ASG-Debug-ID: 1257777567-600101c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 86E906F077 for ; Mon, 9 Nov 2009 06:39:28 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KjBeeWEEO1I7ruXy for ; Mon, 09 Nov 2009 06:39:28 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N7VOx-0006z1-Nt; Mon, 09 Nov 2009 14:39:27 +0000 Date: Mon, 9 Nov 2009 09:39:27 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests: include src/aio-dio-regress in install subdirs Subject: Re: [PATCH] xfstests: include src/aio-dio-regress in install subdirs Message-ID: <20091109143927.GA26325@infradead.org> References: <4AF07EA4.9000405@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4AF07EA4.9000405@sandeen.net> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257777568 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 03, 2009 at 01:04:04PM -0600, Eric Sandeen wrote: > From: Izidor Matusov > > Install src/aio-dio-regress tests on "make install" > > Signed-off-by: Eric Sandeen > Reviewed-by: Eric Sandeen Looks good. From aelder@sgi.com Mon Nov 9 12:04:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nA9I4g8L213838 for ; Mon, 9 Nov 2009 12:04:42 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4689E3040CE; Mon, 9 Nov 2009 10:04:57 -0800 (PST) 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: [PATCH] xfs: Wrapped journal record corruption on read at recovery Date: Mon, 9 Nov 2009 12:04:57 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE9E@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE66@cf--amer001e--3.americas.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Wrapped journal record corruption on read at recovery-patchattached (was Re: XFS corruption with failover) Thread-Index: AcpN+Tuft9jB9P80QiemylsfQMjH1QOsCBNQAAQLGnABK2DCkA== From: "Alex Elder" To: "Andy Poling" Cc: "John Quigley" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Alex Elder wrote: > Alex Elder wrote: >> Andy Poling wrote: >>> On Wed, 14 Oct 2009, Christoph Hellwig wrote: >>>>> It seems like the more elegant approach would be to set offset = before the >>>>> first read, and then update it if the first read takes place (in = case it was >>>>> unaligned). That also gets rid of bufaddr, and seems like it = might read ... >=20 >=20 > Andy, can you tell me the log sector > size of a file system that exhibits > this failure condition? >=20 > You can just send the output of: > xfs_info /dev/ > if you like. I have a suspicion > that there may still be a problem, > even with your proposed fix, and > would like to rule that possibility > out. Basically, if log sectsz is > is > 1024 your fix is probably OK. Nevermind, I think all is well with your patch. I'll respond to your other posting with my positive review shortly. -Alex > Thanks. >=20 > -Alex >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Mon Nov 9 12:05:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_55 autolearn=no version=3.3.0-rupdated 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 nA9I5qpV213928 for ; Mon, 9 Nov 2009 12:05:52 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 905D98F80DC; Mon, 9 Nov 2009 10:06:07 -0800 (PST) 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: [PATCH] xfs: Wrapped journal record corruption on read at recovery Date: Mon, 9 Nov 2009 12:06:07 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE9F@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AE64@cf--amer001e--3.americas.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Wrapped journal record corruption on read at recovery -patchattached (was Re: XFS corruption with failover) Thread-Index: AcpN+Tuft9jB9P80QiemylsfQMjH1QOsCBNQAS92IAA= From: "Alex Elder" To: "Andy Poling" Cc: "John Quigley" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Alex Elder wrote: > Andy Poling wrote: >> On Wed, 14 Oct 2009, Christoph Hellwig wrote: >>>> It seems like the more elegant approach would be to set offset = before the >>>> first read, and then update it if the first read takes place (in = case it was >>>> unaligned). That also gets rid of bufaddr, and seems like it might = read >>>> better. >>>=20 >>> Yeah. Note that in Linux 2.6.29 I did some changes in that are to >>> take the read and offset calculation into a common helper >>=20 >> Looking at the improved code since 2.6.29, and assuming that the = beginning of >> the log will always be aligned, I have come up with the attached = patch against >> 2.6.31.4. I think it's cleaner, and it passes my tests. >>=20 >> The bufaddr variable is no longer needed. I removed the xlog_align() = after >> the second read for both headers and data since the second read will = always be >> aligned (even if there was no first read) since it is always at the = beginning of the log. >>=20 >> It sets offset to the beginning of the buffer with XFS_BUF_PTR() = before the >> first read, and then your improved xlog_bread() will update the = offset if the >> first read had to be re-aligned. >>=20 >> What do you think? The patch looks good. Reviewed-by: Alex Elder >> -Andy >=20 > I am re-submitting Andy's patch using the conventions that > (hopefully) Patchwork understands to facilitate tracking. >=20 > -Alex >=20 > Author: Andy Poling >=20 > Summary of problem: >=20 > If a journal record wraps at the physical end of the journal, it has = to be > read in two parts in xlog_do_recovery_pass(): a read at the physical = end and a > read at the physical beginning. If xlog_bread() has to re-align the = first > read, the second read request does not take that re-alignment into = account. > If the first read was re-aligned, the second read over-writes the end = of the > data from the first read, effectively corrupting it. This can happen = either > when reading the record header or reading the record data. >=20 > The first sanity check in xlog_recover_process_data() is to check for = a valid > clientid, so that is the error reported. >=20 >=20 > Summary of fix: >=20 > If there was a first read at the physical end, XFS_BUF_PTR() returns = where the > data was requested to begin. Conversely, because it is the result of > xlog_align(), offset indicates where the requested data for the first = read > actually begins - whether or not xlog_bread() has re-aligned it. >=20 > Using offset as the base for the calculation of where to place the = second read > data ensures that it will be correctly placed immediately following = the data > from the first read instead of sometimes over-writing the end of it. >=20 > The attached patch has resolved the reported problem of occasional = inability > to recover the journal (reporting "bad clientid"). >=20 >=20 > --- fs/xfs/xfs_log_recover.c.orig 2009-10-14 23:39:49.753494876 -0500 > +++ fs/xfs/xfs_log_recover.c 2009-10-15 18:26:23.790887700 -0500 > @@ -3517,7 +3517,7 @@ > { > xlog_rec_header_t *rhead; > xfs_daddr_t blk_no; > - xfs_caddr_t bufaddr, offset; > + xfs_caddr_t offset; > xfs_buf_t *hbp, *dbp; > int error =3D 0, h_size; > int bblks, split_bblks; > @@ -3610,7 +3610,7 @@ > /* > * Check for header wrapping around physical end-of-log > */ > - offset =3D NULL; > + offset =3D XFS_BUF_PTR(hbp); > split_hblks =3D 0; > wrapped_hblks =3D 0; > if (blk_no + hblks <=3D log->l_logBBsize) { > @@ -3646,9 +3646,8 @@ > * - order is important. > */ > wrapped_hblks =3D hblks - split_hblks; > - bufaddr =3D XFS_BUF_PTR(hbp); > error =3D XFS_BUF_SET_PTR(hbp, > - bufaddr + BBTOB(split_hblks), > + offset + BBTOB(split_hblks), > BBTOB(hblks - split_hblks)); > if (error) > goto bread_err2; > @@ -3658,14 +3657,10 @@ > if (error) > goto bread_err2; >=20 > - error =3D XFS_BUF_SET_PTR(hbp, bufaddr, > + error =3D XFS_BUF_SET_PTR(hbp, offset, > BBTOB(hblks)); > if (error) > goto bread_err2; > - > - if (!offset) > - offset =3D xlog_align(log, 0, > - wrapped_hblks, hbp); > } > rhead =3D (xlog_rec_header_t *)offset; > error =3D xlog_valid_rec_header(log, rhead, > @@ -3685,7 +3680,7 @@ > } else { > /* This log record is split across the > * physical end of log */ > - offset =3D NULL; > + offset =3D XFS_BUF_PTR(dbp); > split_bblks =3D 0; > if (blk_no !=3D log->l_logBBsize) { > /* some data is before the physical > @@ -3714,9 +3709,8 @@ > * _first_, then the log start (LR header end) > * - order is important. > */ > - bufaddr =3D XFS_BUF_PTR(dbp); > error =3D XFS_BUF_SET_PTR(dbp, > - bufaddr + BBTOB(split_bblks), > + offset + BBTOB(split_bblks), > BBTOB(bblks - split_bblks)); > if (error) > goto bread_err2; > @@ -3727,13 +3721,9 @@ > if (error) > goto bread_err2; >=20 > - error =3D XFS_BUF_SET_PTR(dbp, bufaddr, h_size); > + error =3D XFS_BUF_SET_PTR(dbp, offset, h_size); > if (error) > goto bread_err2; > - > - if (!offset) > - offset =3D xlog_align(log, wrapped_hblks, > - bblks - split_bblks, dbp); > } > xlog_unpack_data(rhead, offset, log); > if ((error =3D xlog_recover_process_data(log, rhash, >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sgi-linux-xfs@lo.gmane.org Mon Nov 9 14:45:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA9Kj5eA223245 for ; Mon, 9 Nov 2009 14:45:08 -0600 X-ASG-Debug-ID: 1257799514-5c4c03cd0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 107C6CEAEA6 for ; Mon, 9 Nov 2009 12:45:14 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id CRw0k1vXr1q7ih0u for ; Mon, 09 Nov 2009 12:45:14 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.50) id 1N7b6r-000773-Es for linux-xfs@oss.sgi.com; Mon, 09 Nov 2009 21:45:09 +0100 Received: from adsl-068-016-104-079.sip.asm.bellsouth.net ([68.16.104.79]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 09 Nov 2009 21:45:09 +0100 Received: from ecashin by adsl-068-016-104-079.sip.asm.bellsouth.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 09 Nov 2009 21:45:09 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Ed Cashin X-ASG-Orig-Subj: NULL mp->m_log in 2.6.31 xfs_log_move_tail Subject: NULL mp->m_log in 2.6.31 xfs_log_move_tail Date: Mon, 09 Nov 2009 15:39:32 -0500 Lines: 138 Message-ID: <87ws1z8mbf.fsf@coraid.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: adsl-068-016-104-079.sip.asm.bellsouth.net User-Agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3 (gnu/linux) Cancel-Lock: sha1:vUjJbt3X+2JR1hFc1rV2rztxRnU= Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1257799516 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14187 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A colleague has seen oopses in 2.6.31 when an XFS is mounted on an AoE target that becomes unresponsive and is marked as "down" by the aoe driver. The aoe driver starts failing all new I/O requests after failing all current requests when the device is down. I looked at the trace (included below) and put in the following check: --- linux-2.6.31/fs/xfs/xfs_log.c.20091009 2009-10-09 16:49:23.062989234 -0400 +++ linux-2.6.31/fs/xfs/xfs_log.c 2009-10-09 16:49:39.766738875 -0400 @@ -822,6 +822,7 @@ xfs_log_move_tail(xfs_mount_t *mp, xlog_t *log = mp->m_log; int need_bytes, free_bytes, cycle, bytes; + BUG_ON(!log); if (XLOG_FORCED_SHUTDOWN(log)) return; ... and subsequent tests showed the BUG_ON being triggered. I meant to gather more information but have gotten sidetracked, so I'm posting this information now in the hopes that it is helpful. I/O error in filesystem ("etherd/e8.1") meta-data dev etherd/e8.1 block 0x1bf0862 ("xlog_iodone") error 5 buf count 1024 xfs_force_shutdown(etherd/e8.1,0x2) called from line 1044 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa03e79bf Filesystem "etherd/e8.1": Log I/O Error Detected. Shutting down filesystem: etherd/e8.1 Please umount the filesystem, and rectify the problem(s) XFS: Unable to update superblock counters. Freespace may not be correct on next mount. ------------[ cut here ]------------ kernel BUG at fs/xfs/xfs_log.c:825! invalid opcode: 0000 [#1] SMP last sysfs file: /sys/devices/virtual/block/etherd!e8.33/state CPU 1 Modules linked in: aoe xfs exportfs bridge stp llc bnep sco l2cap bluetooth rfkill sunrpc ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 p4_clockmod freq_table speedstep_lib dm_multipath uinput ixgbe e1000e i5k_amb e1000 hwmon i5000_edac ppdev iTCO_wdt iTCO_vendor_support edac_core parport_pc dca mdio i2c_i801 parport floppy pcspkr shpchp ata_generic pata_acpi radeon ttm drm i2c_algo_bit i2c_core [last unloaded: aoe] Pid: 21300, comm: umount Not tainted 2.6.31 #1 X7DB8 RIP: 0010:[] [] xfs_log_move_tail+0x34/0x174 [xfs] RSP: 0018:ffff88006e985b08 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffff88006e985ba8 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88007542c540 RBP: ffff88006e985b48 R08: ffff88007b101900 R09: ffffffff817a21d8 R10: ffff880019379c00 R11: 00000000860c2753 R12: ffff88007542c180 R13: 0000000000000000 R14: ffff88007b101900 R15: 0000000000000000 FS: 00007f089e005740(0000) GS:ffff880001a6f000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 00007f089d6d69ce CR3: 00000000765ae000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process umount (pid: 21300, threadinfo ffff88006e984000, task ffff88006d8f0000) Stack: 0000000000000000 00000000860c2753 ffff88006e985b48 ffff88007b101900 <0> ffff88007542c180 ffff88007b101900 ffff88007b101900 0000000000000000 <0> ffff88006e985b88 ffffffffa03f4e9d ffff88006e985b88 00000000860c2753 Call Trace: [] xfs_trans_ail_delete+0x82/0xf4 [xfs] [] xfs_buf_iodone+0x40/0x63 [xfs] [] xfs_buf_do_callbacks+0x3c/0x5f [xfs] [] xfs_buf_iodone_callbacks+0x136/0x175 [xfs] [] xfs_buf_iodone_work+0x63/0x86 [xfs] [] xfs_buf_ioend+0x93/0xb7 [xfs] [] xfs_bioerror+0x56/0x76 [xfs] [] xfs_bdstrat_cb+0x48/0x67 [xfs] [] xfs_buf_iostrategy+0x2a/0x47 [xfs] [] xfs_flush_buftarg+0xa1/0x125 [xfs] [] xfs_free_buftarg+0x32/0x8f [xfs] [] xfs_close_devices+0x77/0x94 [xfs] [] xfs_fs_put_super+0xb1/0xe8 [xfs] [] generic_shutdown_super+0x69/0xf2 [] kill_block_super+0x3a/0x6a [] deactivate_super+0x68/0x95 [] mntput_no_expire+0xc6/0x114 [] sys_umount+0x2f2/0x337 [] system_call_fastpath+0x16/0x1b Code: 55 41 54 53 48 83 ec 18 0f 1f 44 00 00 65 48 8b 04 25 28 00 00 00 48 89 45 c8 31 c0 48 8b 9f 40 01 00 00 49 89 f5 48 85 db 75 04 <0f> 0b eb fe f6 43 20 08 0f 85 0f 01 00 00 48 85 f6 75 19 48 8d RIP [] xfs_log_move_tail+0x34/0x174 [xfs] RSP ---[ end trace 838ac7bc7c8a18c8 ]--- ------------[ cut here ]------------ WARNING: at kernel/exit.c:895 do_exit+0x54/0x6da() Hardware name: X7DB8 Modules linked in: aoe xfs exportfs bridge stp llc bnep sco l2cap bluetooth rfkill sunrpc ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 p4_clockmod freq_table speedstep_lib dm_multipath uinput ixgbe e1000e i5k_amb e1000 hwmon i5000_edac ppdev iTCO_wdt iTCO_vendor_support edac_core parport_pc dca mdio i2c_i801 parport floppy pcspkr shpchp ata_generic pata_acpi radeon ttm drm i2c_algo_bit i2c_core [last unloaded: aoe] Pid: 21300, comm: umount Tainted: G D 2.6.31 #1 Call Trace: [] warn_slowpath_common+0x8d/0xbb [] warn_slowpath_null+0x27/0x3d [] do_exit+0x54/0x6da [] oops_end+0xc8/0xe7 [] die+0x6d/0x8c [] do_trap+0x124/0x147 [] ? atomic_notifier_call_chain+0x26/0x3c [] do_invalid_op+0xa9/0xc9 [] ? xfs_log_move_tail+0x34/0x174 [xfs] [] ? trace_hardirqs_off_thunk+0x3a/0x6c [] invalid_op+0x1b/0x20 [] ? xfs_log_move_tail+0x34/0x174 [xfs] [] xfs_trans_ail_delete+0x82/0xf4 [xfs] [] xfs_buf_iodone+0x40/0x63 [xfs] [] xfs_buf_do_callbacks+0x3c/0x5f [xfs] [] xfs_buf_iodone_callbacks+0x136/0x175 [xfs] [] xfs_buf_iodone_work+0x63/0x86 [xfs] [] xfs_buf_ioend+0x93/0xb7 [xfs] [] xfs_bioerror+0x56/0x76 [xfs] [] xfs_bdstrat_cb+0x48/0x67 [xfs] [] xfs_buf_iostrategy+0x2a/0x47 [xfs] [] xfs_flush_buftarg+0xa1/0x125 [xfs] [] xfs_free_buftarg+0x32/0x8f [xfs] [] xfs_close_devices+0x77/0x94 [xfs] [] xfs_fs_put_super+0xb1/0xe8 [xfs] [] generic_shutdown_super+0x69/0xf2 [] kill_block_super+0x3a/0x6a [] deactivate_super+0x68/0x95 [] mntput_no_expire+0xc6/0x114 [] sys_umount+0x2f2/0x337 [] system_call_fastpath+0x16/0x1b ---[ end trace 838ac7bc7c8a18c9 ]--- [root@stuart srrd]# -- Ed Cashin Find experimental aoe Linux driver patches at http://coraid.typepad.com/aoe_linux_proving_grounds/ From BATV+bc23c2b8cc6a951fe7f0+2269+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 9 15:05:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA9L53wx224119 for ; Mon, 9 Nov 2009 15:05:05 -0600 X-ASG-Debug-ID: 1257800720-604c00770000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 39C3170F99 for ; Mon, 9 Nov 2009 13:05:20 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5AR1sOwdGdxwAGWI for ; Mon, 09 Nov 2009 13:05:20 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N7bQN-0003Ad-Fb; Mon, 09 Nov 2009 21:05:19 +0000 Date: Mon, 9 Nov 2009 16:05:19 -0500 From: Christoph Hellwig To: Ed Cashin Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Subject: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Message-ID: <20091109210519.GA9698@infradead.org> References: <87ws1z8mbf.fsf@coraid.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87ws1z8mbf.fsf@coraid.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257800721 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 09, 2009 at 03:39:32PM -0500, Ed Cashin wrote: > A colleague has seen oopses in 2.6.31 when an XFS is mounted on an AoE > target that becomes unresponsive and is marked as "down" by the aoe > driver. The aoe driver starts failing all new I/O requests after > failing all current requests when the device is down. And the oops happens when unmounting the devices? That's at least how the trace looks like. If that's the case I suspect we tear down the log a bit too early - I'll do an audit of the log shutdown path how this could happen. From BATV+bc23c2b8cc6a951fe7f0+2269+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 9 15:16:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA9LG3hR224550 for ; Mon, 9 Nov 2009 15:16:03 -0600 X-ASG-Debug-ID: 1257801380-5b57012d0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F3C3471202 for ; Mon, 9 Nov 2009 13:16:20 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id M0V4boa9YqwzgIcx for ; Mon, 09 Nov 2009 13:16:20 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N7bb2-000663-MT; Mon, 09 Nov 2009 21:16:20 +0000 Date: Mon, 9 Nov 2009 16:16:20 -0500 From: Christoph Hellwig To: Ed Cashin Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Subject: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Message-ID: <20091109211620.GA22777@infradead.org> References: <87ws1z8mbf.fsf@coraid.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87ws1z8mbf.fsf@coraid.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1257801380 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 09, 2009 at 03:39:32PM -0500, Ed Cashin wrote: > A colleague has seen oopses in 2.6.31 when an XFS is mounted on an AoE > target that becomes unresponsive and is marked as "down" by the aoe > driver. The aoe driver starts failing all new I/O requests after > failing all current requests when the device is down. > > I looked at the trace (included below) and put in the following check: Given that you seem to be able to reproduce it can you see if the patch below helps: Index: linux-2.6/fs/xfs/xfs_log.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_log.c 2009-11-09 22:09:08.858026060 +0100 +++ linux-2.6/fs/xfs/xfs_log.c 2009-11-09 22:13:13.958255857 +0100 @@ -1602,6 +1602,8 @@ xlog_dealloc_log(xlog_t *log) xlog_in_core_t *iclog, *next_iclog; int i; + xfs_flush_buftarg(log->l_mp->m_logdev_targp, 1); + iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { sv_destroy(&iclog->ic_force_wait); From sgi-linux-xfs@lo.gmane.org Mon Nov 9 15:42:12 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nA9LgBDS225565 for ; Mon, 9 Nov 2009 15:42:11 -0600 X-ASG-Debug-ID: 1257802947-6bef01920000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 71F0F70BB6 for ; Mon, 9 Nov 2009 13:42:27 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id PGzDOI9TOJ3Xmbet for ; Mon, 09 Nov 2009 13:42:27 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.50) id 1N7c0C-000808-VQ for linux-xfs@oss.sgi.com; Mon, 09 Nov 2009 22:42:20 +0100 Received: from adsl-068-016-104-079.sip.asm.bellsouth.net ([68.16.104.79]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 09 Nov 2009 22:42:20 +0100 Received: from ecashin by adsl-068-016-104-079.sip.asm.bellsouth.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 09 Nov 2009 22:42:20 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Ed Cashin X-ASG-Orig-Subj: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Subject: Re: NULL mp->m_log in 2.6.31 xfs_log_move_tail Date: Mon, 09 Nov 2009 16:41:58 -0500 Lines: 36 Message-ID: <87fx8n8jfd.fsf@coraid.com> References: <87ws1z8mbf.fsf@coraid.com> <20091109211620.GA22777@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Complaints-To: usenet@ger.gmane.org Cc: ecashin@coraid.com X-Gmane-NNTP-Posting-Host: adsl-068-016-104-079.sip.asm.bellsouth.net User-Agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3 (gnu/linux) Cancel-Lock: sha1:r/vqIqPDbxJrkW6NI1hmHa/KbwI= Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1257802948 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14190 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig writes: > On Mon, Nov 09, 2009 at 03:39:32PM -0500, Ed Cashin wrote: >> A colleague has seen oopses in 2.6.31 when an XFS is mounted on an AoE >> target that becomes unresponsive and is marked as "down" by the aoe >> driver. The aoe driver starts failing all new I/O requests after >> failing all current requests when the device is down. >> >> I looked at the trace (included below) and put in the following check: > > Given that you seem to be able to reproduce it can you see if the patch > below helps: > > Index: linux-2.6/fs/xfs/xfs_log.c > =================================================================== > --- linux-2.6.orig/fs/xfs/xfs_log.c 2009-11-09 22:09:08.858026060 +0100 > +++ linux-2.6/fs/xfs/xfs_log.c 2009-11-09 22:13:13.958255857 +0100 > @@ -1602,6 +1602,8 @@ xlog_dealloc_log(xlog_t *log) > xlog_in_core_t *iclog, *next_iclog; > int i; > > + xfs_flush_buftarg(log->l_mp->m_logdev_targp, 1); > + > iclog = log->l_iclog; > for (i=0; il_iclog_bufs; i++) { > sv_destroy(&iclog->ic_force_wait); > Thanks. I am not sure when we'll be able to try it, because the one who discovered this issue is not currently available, but I'll try to fit it in one way or another. A lot of folks using AoE use XFS. -- Ed Cashin http://www.coraid.com/ http://noserose.net/e/ From cattelan@thebarn.com Mon Nov 9 19:25:35 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAA1PZsh235304 for ; Mon, 9 Nov 2009 19:25:35 -0600 X-ASG-Debug-ID: 1257816351-4b9b01780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from x.digitalelves.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D28DA71B06 for ; Mon, 9 Nov 2009 17:25:51 -0800 (PST) Received: from x.digitalelves.com (v-209-98-77-55.ip.visi.com [209.98.77.55]) by cuda.sgi.com with ESMTP id zRJrlNYN6RFAscXU for ; Mon, 09 Nov 2009 17:25:51 -0800 (PST) Received: from strip.x.thebarn.com (localhost [IPv6:::1]) (authenticated bits=0) by x.digitalelves.com (8.14.3/8.14.3) with ESMTP id nAA1PiZp037155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 9 Nov 2009 19:25:49 -0600 (CST) (envelope-from cattelan@thebarn.com) Message-ID: <4AF8C118.5080903@thebarn.com> Date: Mon, 09 Nov 2009 19:25:44 -0600 From: Russell Cattelan User-Agent: Thunderbird 2.0.0.12 (Macintosh/20080213) MIME-Version: 1.0 To: mill / in-medias-res CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair breaks; xfs_metadump hangs Subject: Re: xfs_repair breaks; xfs_metadump hangs References: <20091104152022.GA21347@mytux.intra.in-medias-res.com> <4AF4A66B.8090906@digitalelves.com> <20091109091915.GB3601@mytux.intra.in-medias-res.com> <20091109095126.GA9727@mytux.intra.in-medias-res.com> In-Reply-To: <20091109095126.GA9727@mytux.intra.in-medias-res.com> X-Enigmail-Version: 0.96.0 Content-Type: multipart/mixed; boundary="------------010209000806090502080506" X-Barracuda-Connect: v-209-98-77-55.ip.visi.com[209.98.77.55] X-Barracuda-Start-Time: 1257816351 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. --------------010209000806090502080506 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 mill / in-medias-res wrote: > * mill / in-medias-res [091109 10:28]: >>> Hmm interesting. >>> Can you go into xfs_db and print out the bad inode? send it to us? >>> I'm guessing the extents are corrupted somehow. >> Did you mean "xfs_db -x -c 'blockget inode 3256930831' /dev/sdc2" ? >> xfs_db consumes 99% of CPU and Virt 2510m RES 194m of RAM. >> >> How long should i wait? I was thinking just the inode xfs_db -x -c 'inode 3256930831' -c 'p' /dev/sdc2 >> > Done now: > xfs_db -x -c 'blockget inode 3256930831' /dev/sdc2 > xfs_db.log :( > exit code 3 > 338,12s user 12,32s system 49% cpu 11:48,39 total > The first lines of output: > bad number of extents 1 for inode 3256930831 > bad nblocks 1 for inode 3256930831, counted 0 > block 9/2317591 type unknown not expected > link count mismatch for inode 1038934 (name ?), nlink 1, counted 2 > link count mismatch for inode 128 (name ?), nlink 4672, counted 6 > link count mismatch for inode 129 (name ?), nlink 36525, counted 1 > link count mismatch for inode 130 (name ?), nlink 0, counted 1 > link count mismatch for inode 131 (name ?), nlink 0, counted 1 > link count mismatch for inode 132 (name ?), nlink 2, counted 1305238 > link count mismatch for inode 133 (name ?), nlink 0, counted 2 > link count mismatch for inode 134 (name ?), nlink 7144, counted 1 > link count mismatch for inode 135 (name ?), nlink 42666, counted 1 > link count mismatch for inode 136 (name ?), nlink 40424, counted 2 > link count mismatch for inode 137 (name ?), nlink 37040, counted 2 > link count mismatch for inode 138 (name ?), nlink 16, counted 2 > link count mismatch for inode 139 (name ?), nlink 0, counted 2 > link count mismatch for inode 140 (name ?), nlink 20, counted 2 > link count mismatch for inode 141 (name ?), nlink 0, counted 2 > link count mismatch for inode 142 (name ?), nlink 12, counted 2 > link count mismatch for inode 143 (name ?), nlink 62336, counted 2 > link count mismatch for inode 144 (name ?), nlink 3203, counted 2 > link count mismatch for inode 146 (name ?), nlink 27224, counted 2 > link count mismatch for inode 147 (name ?), nlink 41204, counted 2 > link count mismatch for inode 148 (name ?), nlink 21, counted 2 > link count mismatch for inode 149 (name ?), nlink 0, counted 2 > link count mismatch for inode 150 (name ?), nlink 0, counted 2 > link count mismatch for inode 151 (name ?), nlink 0, counted 2 > link count mismatch for inode 152 (name ?), nlink 0, counted 2 > link count mismatch for inode 153 (name ?), nlink 32768, counted 2 > link count mismatch for inode 154 (name ?), nlink 58352, counted 2 > link count mismatch for inode 155 (name ?), nlink 40290, counted 2 > The output is 53 MB big. Tons of link count mismatch for inode ... Hmm that is not a good sign. That would suggest a big chunk of inodes go corrupted. I might be working looking at a few of the inodes and see if any pattern shows up. > > >>> One option to then flag the inode as deleted which will cause repair to >>> toss is hopefully clean up the mess. >>> >>> Here is a write up how to do that. >>> http://jijo.free.net.ph/19 >> If i can't get that block i will try with deleting it, Thanks! >> >> Best regards, >> Maximilian Mill >>>> time: 67,27s user 10,09s system 10% cpu 12:05,31 total >>>> >>>> I tried to run xfs_metadump serveral times and it hangs everytime on this position: >>>> xfs_metadump -g /dev/sdc2 metadump-sdc2-2 >>>> Copied 1411840 of 4835520 inodes (0 of 3 AGs) >>>> >>>> It runs till 2 days on the same inode and xfs_db consumes 99% of CPU. >>>> Should i wait here? >>>> >>>> Versions: >>>> dpkg -l |grep xfs >>>> ii xfsdump 3.0.2~bpo50+1 Administrative utilities for the XFS filesys >>>> ii xfsprogs 3.0.4~bpo50+1 Utilities for managing the XFS filesystem >>>> Distribution: Debian lenny with xfsprogs, xfsdump backport from unstable. >>>> >>>> The xfs_repair with stock Debian Lenny version also does crash at inode 3256930831. >>>> >>>> Best Regards, >>>> Maximilian Mill >>>> >>>> _______________________________________________ >>>> xfs mailing list >>>> xfs@oss.sgi.com >>>> http://oss.sgi.com/mailman/listinfo/xfs >>>> >>>> >>> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (Darwin) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkr4wRcACgkQNRmM+OaGhBiOEQCfTiGW5yBzo4mKL6LJlWMPhrCM F3gAn2MbX5E1RpO1wOQ08ZOxSFq3QoNi =fVoe -----END PGP SIGNATURE----- --------------010209000806090502080506 Content-Type: text/x-vcard; charset=utf-8; name="cattelan.vcf" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cattelan.vcf" begin:vcard fn:Russell Cattelan n:Cattelan;Russell email;internet:cattelan@thebarn.com tel;cell:612 805 3144 x-mozilla-html:FALSE version:2.1 end:vcard --------------010209000806090502080506-- From info@pushbuttonemailer2.com Tue Nov 10 00:16:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAYES_50 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAA6GDlB253188 for ; Tue, 10 Nov 2009 00:16:13 -0600 X-ASG-Debug-ID: 1257833790-7dd802c30000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pushbuttonemailer2.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E4F93720C6 for ; Mon, 9 Nov 2009 22:16:30 -0800 (PST) Received: from pushbuttonemailer2.com (pushbuttonemailer2.com [208.43.204.98]) by cuda.sgi.com with ESMTP id vbOhKVJXhIkGdSjA for ; Mon, 09 Nov 2009 22:16:30 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=pushbuttonemailer2.com; h=Received:To:Subject:From:Reply-To:MIME-Version:X-Mailer:Content-Type:Content-Transfer-Encoding:Message-Id:Date; b=tWU5bHdjlnarRC6psRrLp8SUw/JCvTFXi2LoOZZf21lR/KW1XZRudviXAbkFKpSqEiC5gt47lUlHIOiTeMlD90+tU2fqMCX/sMc2IRYVBbNuUmFqjveX425GSwnH8nVm; Received: from billp2 by plate.arvixe.com with local (Exim 4.69) (envelope-from ) id 1N7k1l-0002Ut-RP for linux-xfs@oss.sgi.com; Mon, 09 Nov 2009 22:16:29 -0800 To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Push Button Emailer Subject: Push Button Emailer From: Bill Phillips Reply-To: MIME-Version: 1.0 X-Mailer: GMailer 1.2 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Mon, 09 Nov 2009 22:16:29 -0800 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - plate.arvixe.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [585 585] / [47 12] X-AntiAbuse: Sender Address Domain - pushbuttonemailer2.com X-Barracuda-Connect: pushbuttonemailer2.com[208.43.204.98] X-Barracuda-Start-Time: 1257833790 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5343 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.16 X-Barracuda-Spam-Status: No, SCORE=1.16 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Load Your List and Send Your Sales Message to 4,000 to 10,000 People EVERYDAY With The Push Of A Button!!!! • Load YOUR List • Write YOUR Message • Push A Button!!! 4,000 Emails Per Day... 120,000 Emails Per Month!!! 10,000 Emails Per Day...300,000 Emails Per Month!!! To be remove from our list, just reply with the word remove in the subject line. From sbshepherd@ymail.com Tue Nov 10 12:24:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE, UNPARSEABLE_RELAY autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAAIOTu9042647 for ; Tue, 10 Nov 2009 12:24:29 -0600 X-ASG-Debug-ID: 1257877485-4b0f004e0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp101.prem.mail.ac4.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id BB74DCFC8E8 for ; Tue, 10 Nov 2009 10:24:45 -0800 (PST) Received: from smtp101.prem.mail.ac4.yahoo.com (smtp101.prem.mail.ac4.yahoo.com [76.13.13.40]) by cuda.sgi.com with SMTP id viIC6usbkHYQgwH5 for ; Tue, 10 Nov 2009 10:24:45 -0800 (PST) Received: (qmail 76943 invoked from network); 10 Nov 2009 18:24:44 -0000 Received: from adsl-217-125-105.asm.bellsouth.net (sbshepherd@68.217.125.105 with login) by smtp101.prem.mail.ac4.yahoo.com with SMTP; 10 Nov 2009 10:24:43 -0800 PST X-Yahoo-SMTP: q_iQ9CGswBDWnfaDdDweA5p0bKjGVP7HPTihrghQ1G3J X-YMail-OSG: iIhuoRsVM1k.pN23nRM54c7zxaYj0C.QCn_ICDYtsv9gfE7wBGKPqYNY1ZvB4vaIKhFCtxQY84PDX0NLjJq5MU2R7zcUVDphIDY.ESiWodvy27wkqKJ4fAZjwd9VrHWGIJqqmcowYk_i4Lt.Z6qlmlr5cZ9UTZqwadZ0YIdkq6obaUXpu8455jK10JwclD5BH0.yffH12B.Ww9e.tfhb_y4K1L6ThgexduPXsUO1obxqwiOiDqUq.1ljB_yjDZpl3jrcJb1vgQ1rIDaLTp0dq6NIt51byFRmL43EkPcvylXHkeqYTYKkacO7gum6xCZWGydLpczk3w-- X-Yahoo-Newman-Property: ymail-3 From: "Scott Shepherd" To: X-ASG-Orig-Subj: EHS Document Management Made Simple for Less Subject: EHS Document Management Made Simple for Less Date: Tue, 10 Nov 2009 13:23:23 -0500 Message-ID: <0d5d01ca6232$feabcfc0$fc036f40$@com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0D5E_01CA6209.15D5C7C0" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Acph2G6Vhh72DrPoRsmRRO3cLVDfdA== Content-Language: en-us X-Barracuda-Connect: smtp101.prem.mail.ac4.yahoo.com[76.13.13.40] X-Barracuda-Start-Time: 1257877486 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_0D5E_01CA6209.15D5C7C0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit EHS Professionals, Are you being asked to provide more MSDS support with less? Let us show you how. No software, no risk, just simple reliable MSDS management. Go to www.OnlineMSDS.com today for more info. We offer more features and benefits than any other comparable solution on the market at a lower price. Guaranteed. Our Online MSDS Solution is robust enough to handle the complexities of managing global MSDSs and related information in a secure environment as well as one that is also very simple, intuitive and user friendly. It will help you comply with all Hazcom regulations. Related product information such as videos, music and images can also be loaded and used for safety training, product demos, technical information, brochures, etc. Visit www.OnlineMSDS.com to learn how we can simplify your MSDS management for less today. Scott Shepherd, Manager IMTEK Environmental Corporation I www.OnlineMSDS.com sbshepherd@ymail.com I 770.335.5586 I o 770.667.8683 I Skype EnviroPro ---------------------------------------------------------------------------- ---------------------------------------------------------------- Sustainability & EHS Management Solutions Made Simple for Less ------=_NextPart_000_0D5E_01CA6209.15D5C7C0 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

EHS Professionals,

Are you being asked to provide more MSDS support with less? Let us show you = how. No software, no risk, just simple reliable MSDS management. Go to www.OnlineMSDS.com today for more info. We offer more features and benefits than any other comparable solution on the market at a lower = price. Guaranteed.

 

Our Online MSDS Solution is robust enough to handle the complexities of managing global = MSDSs and related information in a secure environment as well as one that is also = very simple, intuitive and user friendly. It will help you comply with all = Hazcom regulations.

 

Related product information such as videos, music and images can also be loaded = and used for safety training, product demos, technical information, = brochures, etc.

 

Visit www.OnlineMSDS.com to learn how we can simplify = your MSDS management for less today.

 

Scott Shepherd, Manager 

IMTEK Environmental Corporation I www.OnlineMSDS.com

sbshepherd@ymail.com I 770.335.5586 I o 770.667.8683 I Skype = EnviroPro

---------------------------------------------------------= -------------------------------------------------------------------------= ----------

Sustainability & EHS Management Solutions Made Simple for Less

 

------=_NextPart_000_0D5E_01CA6209.15D5C7C0-- From michael.monnerie@is.it-management.at Wed Nov 11 09:31:46 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nABFVisn149705 for ; Wed, 11 Nov 2009 09:31:46 -0600 X-ASG-Debug-ID: 1257953520-336703910000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1673ED09183 for ; Wed, 11 Nov 2009 07:32:00 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id xy9h38Y6d2gpKSVF for ; Wed, 11 Nov 2009 07:32:00 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 9FE32C0047F for ; Wed, 11 Nov 2009 16:31:57 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 70D63400178 for ; Wed, 11 Nov 2009 16:31:57 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: xfs_repair question: "wrong" order of AG checks OK? Subject: xfs_repair question: "wrong" order of AG checks OK? Date: Wed, 11 Nov 2009 16:31:56 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911111631.56993@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257953522 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I did an xfs_repair now, and everything was OK. But strange was, in Phase 4 the AGs were not checked in order: AG 2 AG 1 AG 0 AG 3 AG 4 AG 5 Is that normal? mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From nscott@aconex.com Wed Nov 11 16:17:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nABMHLrC186248 for ; Wed, 11 Nov 2009 16:17:21 -0600 X-ASG-Debug-ID: 1257977858-42d102f90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from postoffice2.aconex.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA347185FAD1 for ; Wed, 11 Nov 2009 14:17:38 -0800 (PST) Received: from postoffice2.aconex.com (mail.aconex.com [203.89.202.182]) by cuda.sgi.com with ESMTP id u5giLS2UiXvh2Q08 for ; Wed, 11 Nov 2009 14:17:38 -0800 (PST) Received: from postoffice.aconex.com (localhost [127.0.0.1]) by postoffice2.aconex.com (Spam & Virus Firewall) with ESMTP id B0B5F86BAB7; Thu, 12 Nov 2009 09:17:36 +1100 (EST) Received: from postoffice.aconex.com (postoffice.yarra.acx [192.168.102.1]) by postoffice2.aconex.com with ESMTP id 3KDA83xVk6xToXxf; Thu, 12 Nov 2009 09:17:36 +1100 (EST) Received: from gatekeeper.aconex.com (gatekeeper.yarra.acx [192.168.102.10]) by postoffice.aconex.com (Postfix) with ESMTP id 4286BA50280; Thu, 12 Nov 2009 09:15:58 +1100 (EST) Received: from localhost (localhost.localdomain [127.0.0.1]) by gatekeeper.aconex.com (Postfix) with ESMTP id 91B4CC7B99; Thu, 12 Nov 2009 09:17:36 +1100 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at gatekeeper.yarra.acx Received: from gatekeeper.aconex.com ([127.0.0.1]) by localhost (gatekeeper.aconex.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uck3bwvmu3cL; Thu, 12 Nov 2009 09:17:31 +1100 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by gatekeeper.aconex.com (Postfix) with ESMTP id CF8DFC7A7B; Thu, 12 Nov 2009 09:17:31 +1100 (EST) Date: Thu, 12 Nov 2009 09:17:31 +1100 (EST) From: Nathan Scott To: Michael Monnerie Cc: linux-xfs@oss.sgi.com Message-ID: <475457384.356771257977851793.JavaMail.root@mail-au.aconex.com> In-Reply-To: <200911111631.56993@zmi.at> X-ASG-Orig-Subj: Re: xfs_repair question: "wrong" order of AG checks OK? Subject: Re: xfs_repair question: "wrong" order of AG checks OK? MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [203.89.192.141] X-Mailer: Zimbra 5.0.18_GA_3011.RHEL5_64 (ZimbraWebClient - [unknown] (Linux)/5.0.18_GA_3011.RHEL5_64) X-Barracuda-Connect: mail.aconex.com[203.89.202.182] X-Barracuda-Start-Time: 1257977859 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean ----- "Michael Monnerie" wrote: > I did an xfs_repair now, and everything was OK. But strange was, in > Phase 4 the AGs were not checked in order: > AG 2 > AG 1 > AG 0 > AG 3 > AG 4 > AG 5 > > Is that normal? Could be xfs_repair running with multiple threads in parallel? cheers. -- Nathan From michael.monnerie@is.it-management.at Wed Nov 11 17:29:09 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nABNT76J193137 for ; Wed, 11 Nov 2009 17:29:09 -0600 X-ASG-Debug-ID: 1257982163-59c301d30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97870185FF69 for ; Wed, 11 Nov 2009 15:29:23 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id gB7G7MU8Dknufiq8 for ; Wed, 11 Nov 2009 15:29:23 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 5E977C02731 for ; Thu, 12 Nov 2009 00:29:22 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 33FF0400178 for ; Thu, 12 Nov 2009 00:29:22 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair question: "wrong" order of AG checks OK? Subject: Re: xfs_repair question: "wrong" order of AG checks OK? Date: Thu, 12 Nov 2009 00:29:21 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <475457384.356771257977851793.JavaMail.root@mail-au.aconex.com> In-Reply-To: <475457384.356771257977851793.JavaMail.root@mail-au.aconex.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911120029.21845@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257982164 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mittwoch 11 November 2009 Nathan Scott wrote: > Could be xfs_repair running with multiple threads in parallel? Would it ever do that? There's no performance advantage in that, as that operation is disk I/O bound, isn't it? mfg zmi -- // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From nscott@aconex.com Wed Nov 11 18:22:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC0MpE2198263 for ; Wed, 11 Nov 2009 18:22:51 -0600 X-ASG-Debug-ID: 1257985388-7cd401c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from postoffice2.aconex.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 99B2E1860184 for ; Wed, 11 Nov 2009 16:23:09 -0800 (PST) Received: from postoffice2.aconex.com (mail.aconex.com [203.89.202.182]) by cuda.sgi.com with ESMTP id 7kY3G8IeRX4r7QRO for ; Wed, 11 Nov 2009 16:23:09 -0800 (PST) Received: from postoffice.aconex.com (localhost [127.0.0.1]) by postoffice2.aconex.com (Spam & Virus Firewall) with ESMTP id A50DA5BD606; Thu, 12 Nov 2009 11:23:07 +1100 (EST) Received: from postoffice.aconex.com (postoffice.yarra.acx [192.168.102.1]) by postoffice2.aconex.com with ESMTP id wkwx1PHz1DGsEpJa; Thu, 12 Nov 2009 11:23:07 +1100 (EST) Received: from gatekeeper.aconex.com (gatekeeper.yarra.acx [192.168.102.10]) by postoffice.aconex.com (Postfix) with ESMTP id 0BC9DA50280; Thu, 12 Nov 2009 11:21:29 +1100 (EST) Received: from localhost (localhost.localdomain [127.0.0.1]) by gatekeeper.aconex.com (Postfix) with ESMTP id 73C944FD84; Thu, 12 Nov 2009 11:23:07 +1100 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at gatekeeper.yarra.acx Received: from gatekeeper.aconex.com ([127.0.0.1]) by localhost (gatekeeper.aconex.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vH0jq+PewJUq; Thu, 12 Nov 2009 11:23:03 +1100 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by gatekeeper.aconex.com (Postfix) with ESMTP id 607B64FD82; Thu, 12 Nov 2009 11:23:03 +1100 (EST) Date: Thu, 12 Nov 2009 11:23:03 +1100 (EST) From: Nathan Scott To: Michael Monnerie Cc: xfs@oss.sgi.com Message-ID: <1047569616.363721257985383289.JavaMail.root@mail-au.aconex.com> In-Reply-To: <200911120029.21845@zmi.at> X-ASG-Orig-Subj: Re: xfs_repair question: "wrong" order of AG checks OK? Subject: Re: xfs_repair question: "wrong" order of AG checks OK? MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [203.89.192.141] X-Mailer: Zimbra 5.0.18_GA_3011.RHEL5_64 (ZimbraWebClient - [unknown] (Linux)/5.0.18_GA_3011.RHEL5_64) X-Barracuda-Connect: mail.aconex.com[203.89.202.182] X-Barracuda-Start-Time: 1257985389 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Status: Clean ----- "Michael Monnerie" wrote: > On Mittwoch 11 November 2009 Nathan Scott wrote: > > Could be xfs_repair running with multiple threads in parallel? > > Would it ever do that? There's no performance advantage in that, as > that operation is disk I/O bound, isn't it? Be worth reading the paper here: http://xfs.org/index.php/XFS_Papers_and_Documentation -> "Fixing XFS Filesystems Faster" cheers. -- Nathan From michael.monnerie@is.it-management.at Wed Nov 11 18:51:57 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC0pv5l200924 for ; Wed, 11 Nov 2009 18:51:57 -0600 X-ASG-Debug-ID: 1257987134-11ba02170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv1.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7CFC57C06B for ; Wed, 11 Nov 2009 16:52:14 -0800 (PST) Received: from mailsrv1.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id LiGAlraEMjgVsp6u for ; Wed, 11 Nov 2009 16:52:14 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv1.zmi.at (Postfix) with ESMTP id 27ED4C02731 for ; Thu, 12 Nov 2009 01:52:12 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id D204C400178 for ; Thu, 12 Nov 2009 01:52:11 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair question: "wrong" order of AG checks OK? Subject: Re: xfs_repair question: "wrong" order of AG checks OK? Date: Thu, 12 Nov 2009 01:52:10 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.31.4-ZMI; KDE/4.1.3; x86_64; ; ) References: <1047569616.363721257985383289.JavaMail.root@mail-au.aconex.com> In-Reply-To: <1047569616.363721257985383289.JavaMail.root@mail-au.aconex.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <200911120152.11201@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1257987135 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14382 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Donnerstag 12 November 2009 Nathan Scott wrote: > http://xfs.org/index.php/XFS_Papers_and_Documentation > =A0 =A0-> "Fixing XFS Filesystems Faster" Quite a fun to read, especially the comparison with ext3. Thanks for the link. mfg zmi =2D-=20 // Michael Monnerie, Ing.BSc ----- http://it-management.at // Tel: 0660 / 415 65 31 .network.your.ideas. // PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import" // Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4 // Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4 From xfs@tlinx.org Wed Nov 11 20:38:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC2cKu9210316 for ; Wed, 11 Nov 2009 20:38:20 -0600 X-ASG-Debug-ID: 1257993518-7cc901420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 52BA2D12D71 for ; Wed, 11 Nov 2009 18:38:38 -0800 (PST) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [64.81.245.74]) by cuda.sgi.com with ESMTP id fZTqOafCcctkSIkK for ; Wed, 11 Nov 2009 18:38:38 -0800 (PST) Received: from [192.168.3.11] (Athena [192.168.3.11]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC2cZbQ002047 for ; Wed, 11 Nov 2009 18:38:37 -0800 Message-ID: <4AFB752F.2080307@tlinx.org> Date: Wed, 11 Nov 2009 18:38:39 -0800 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22) Gecko/20090605 Lightning/0.9 Thunderbird/2.0.0.22 ThunderBrowse/3.2.6.5 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: xfsdump/restore? Performance ... Subject: xfsdump/restore? Performance ... X-Stationery: 0.4.10 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[64.81.245.74] X-Barracuda-Start-Time: 1257993518 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dunno if xfsdump/restore are considered that important with bacula being adverted as being xfs-compat, but something I found that speeds up and xfsdump/restore, or, especially, using xfsdump/restore to copy a file system -- I put 'mbuffer' in between them and gave it 1mb buffers, and used about 1024 of them. My fs->fs copy rate went up by 50%. An equivalent amount of data took about 2700++ seconds with direction pipe from xfsdump|xfsrestore, but with a buffer between them, that dropped to about 1800+. Maybe xfsdump/restore need some larger buffers? I was also thinking -- I'm not sure how xfsrestore restores files, but does it take each file as it comes, and then restores it, or does it cache the handles to the directories in the previous path? Usually wouldn't be noticeable, but if it has to walk through directories that have lots of files, might save some lookup time. If both were multithreaded -- with one thread for buffer management while the other could do disk I/O -- or is that the infamous '-Y' option that has yet to be implemented on linux? :-) Don't know how much interest there is in these utils, but thought I'd mention the benefit of a big buffer... Same goes for restore and dump I presume, separately. I.e. if xfsdump always does output to mbuffer and mbuffer writes to disk or to Xzip (X=g,bz,lz). Maybe write's are sufficiently well buffered by the kernel, that only restores would benefit -- with mbuffer reading a backup file, but if those utils are used, there are some good possibilities for performance improvements... -linda From c3woutso@serv01.siteground169.com Wed Nov 11 22:59:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAYES_50 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC4xqCn221659 for ; Wed, 11 Nov 2009 22:59:52 -0600 X-ASG-Debug-ID: 1258002009-48d003740000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from serv01.siteground169.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6E1491860C37 for ; Wed, 11 Nov 2009 21:00:10 -0800 (PST) Received: from serv01.siteground169.com (ns1.siteground169.com [67.15.211.9]) by cuda.sgi.com with ESMTP id WedTCD3TxnqIK5fr for ; Wed, 11 Nov 2009 21:00:10 -0800 (PST) Received: from localhost ([127.0.0.1]:35980 helo=serv01.siteground169.com) by serv01.siteground169.com with smtp (Exim 4.69) (envelope-from ) id 1N8Rmz-0004Ty-I9 for linux-xfs@oss.sgi.com; Wed, 11 Nov 2009 23:00:09 -0600 To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: software / web development Subject: software / web development Recieved: Date: Wed, 11 Nov 2009 23:00:09 -0600 From: 3W-Outsource|Sunita Message-ID: X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Mailer: phplist v2.10.10 X-MessageID: 6 X-ListMember: linux-xfs@oss.sgi.com Precedence: bulk MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="UTF-8" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - serv01.siteground169.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - serv01.siteground169.com X-Barracuda-Connect: ns1.siteground169.com[67.15.211.9] X-Barracuda-Start-Time: 1258002010 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4921 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14398 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean **Hello** I am Sunita From India. Are you looking for software development desktop/web application/web design or outsourcing your work load in software development?? then we are the best solution for it. *Key Benefits in our relations.* We use only highly skilled and experienced developers. We can handle projects of any size or complexity. All of our developers have a minimum of 5 years of experience in programming. We have a portfolio of existing UK companies and understand how they operate. * Kind Regards Sunita Marketing Director 3w-outsource A-4 Vidyva Vihar Padmnabhpur Durg Chhattisgarh India +917882344623 * Email: sunita@3w-outsource.com Website: http://www.3w-outsource.com -- If you do not want to receive any more Emails, http://3w-outsource.com/sendemail/?p=unsubscribe&uid=779dcd1e2bc4a728d3745f939e69175f Forward a Message to Someone http://3w-outsource.com/sendemail/?p=forward&uid=779dcd1e2bc4a728d3745f939e69175f&mid=6 -- Powered by PHPlist, www.phplist.com -- From press.club.international@gmail.com Thu Nov 12 00:13:22 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=BAYES_50,RCVD_IN_BSP_OTHER autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC6DM4o228397 for ; Thu, 12 Nov 2009 00:13:22 -0600 X-ASG-Debug-ID: 1258006420-130b01990000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from vmta22.birthdayalarm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C0ACA7B33A for ; Wed, 11 Nov 2009 22:13:40 -0800 (PST) Received: from vmta22.birthdayalarm.com (vmta22.birthdayalarm.com [38.99.45.42]) by cuda.sgi.com with ESMTP id amgycOiTCVFh0CYU for ; Wed, 11 Nov 2009 22:13:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dk; d=birthdayalarm.com; h=Date:From:Sender:To:Message-ID:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding; i=service@noreply.BirthdayAlarm.com; bh=Wuw3u6deHOoltenLG4OkRfpX+I0=; b=HV2Bdndp52R2Z/CKS8UPqm02AM7/E8dK3eeoN6C2VfyrUocLsdy6k8JlW8e2ATVZ06wfSP3zDTK6 i9YJYKXXmBolrtcRJpp03xRyIfptrpTCOuhJTm9isDJY7yi0uHHImfOa1So5k/DZQYwSlfJe8u7a ebfHDh9ivW8qVShrQjQ= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dk; d=birthdayalarm.com; b=evz12ZXO5/cY+lpM/u3TDpwXMzRP4PGiSMUkhVrmkLt2F6PHPatt2PsRj8rGPM4ENZs+X8rq9Q05 jAFugXxTV1yWuGEnHLhff0l2Jt/M8m8siPVNCxi7YzqpSOMnwpvgSssQhz4y9p90jP/qn78By7ZH Apz/klsBHgYQEUK0pFo=; Received: by vmta22.birthdayalarm.com id hvejps0im3o9 for ; Thu, 12 Nov 2009 06:13:50 +0000 (envelope-from ) Date: Thu, 12 Nov 2009 06:14:18 +0000 (UTC) From: Asha Anu Sender: "service@noreply.BirthdayAlarm.com" To: xfs@oss.sgi.com Message-ID: <939431648.6376351258006458548.JavaMail.batch@lpc04> X-ASG-Orig-Subj: Updating my calendar Subject: Updating my calendar MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Email-Type: E067 X-Barracuda-Connect: vmta22.birthdayalarm.com[38.99.45.42] X-Barracuda-Start-Time: 1258006420 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5997 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14402 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Kindly click on: http://www.birthdayalarm.com/bd2/85853215a308707420b1483972789c475320931d1386 Yours sincerely, Customer Support Team Spell check test: PRESSURE ON MAOS SON TO EXPLAIN THE LIVE Tv LINK From sandy@crosshandstraining.org.uk Thu Nov 12 02:10:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.5 required=5.0 tests=AWL,BAYES_50,HTML_MESSAGE, MIME_8BIT_HEADER,URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAC8ARAY234720 for ; Thu, 12 Nov 2009 02:10:28 -0600 X-ASG-Debug-ID: 1258013444-7a5700640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from DS4386.ds4386.dedicated.turbodns.co.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 577297CD49 for ; Thu, 12 Nov 2009 00:10:44 -0800 (PST) Received: from DS4386.ds4386.dedicated.turbodns.co.uk (server4386.dedicated.webfusion.co.uk [212.241.182.110]) by cuda.sgi.com with ESMTP id 8rWkyRBuUClOxHzf for ; Thu, 12 Nov 2009 00:10:44 -0800 (PST) Received: from host81-139-82-253.in-addr.btopenworld.com ([81.139.82.253]) by ds4386.dedicated.turbodns.co.uk with MailEnable ESMTP; Thu, 12 Nov 2009 07:54:52 +0000 From: "Sandra Keating" X-ASG-Orig-Subj: =?ISO-8859-1?B?ozk5IHAucC4gZm9yIHByYWN0aWNhbCAmIGVmZmVjdGl2ZSB0cmFpbmluZw==?= Subject: =?ISO-8859-1?B?ozk5IHAucC4gZm9yIHByYWN0aWNhbCAmIGVmZmVjdGl2ZSB0cmFpbmluZw==?= X-Direct-Mail-Bounce: X21WW0ZX-V7W9-4699-Z34Z-294U355V447U; xfs@oss.sgi.com Message-id: <1D4D4153-9C96-4BD0-8FBC-5977396E53B6@crosshandstraining.org.uk> MIME-Version: 1.0 Date: Thu, 12 Nov 2009 07:54:34 +0000 To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=Direct-Mail-MIME-Boundary-2 X-Barracuda-Connect: server4386.dedicated.webfusion.co.uk[212.241.182.110] X-Barracuda-Start-Time: 1258013445 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2791 1.0000 -0.4395 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC7_SA_HREF_WWW_MISMATCH, BSF_SC7_SA_SUB_MISMATCH_FR, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.50 BSF_SC7_SA_SUB_MISMATCH_FR BODY: Custom Phishing Mismatch 0.50 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Direct-Mail-MIME-Boundary-2 Content-Type: text/plain; format=flowed; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Hello We have some last minute places available on these one-day training courses= running before Christmas, starting from =A399 p.p.=A0 We have trained over 10,000 individuals in the past 10 years. Nearly 1,000 = organisations consider us to be their trainer of choice, because we consist= ently offer affordable, practical and effective training, with observable a= nd measurable outcomes. You can book=A0securely online at www.crosshandstraining.org.uk or if you p= refer,=A0 by telephone on 01584 890970, or by email to bookings=40crosshand= straining.org.uk. All of our workshops run from 10am to 4.30pm and our venu= es are centrally located. We can also deliver any of our training on-site i= f you have a group of people and want to save on travel and accommodation c= osts. Facilitation Skills - Birmingham, 17th November; London, 18th November This workshop is aimed at delegates who are responsible for facilitating a = group of people. It is ideal for those who want practical tips on how to de= al with groups and the way in which they interact, on how to maximise a gro= up=92s potential and the right tools to use to generate and evaluate ideas = within a group and help the decision making process and to design and manag= e team and project reviews. Public Speaking & PowerPoint Presentations - Birmingham, 17th November This workshop is aimed at delegates who are interested in the theories and = practices of communication, as well as emotional responses to speaking in p= ublic, and who want to develop these, and their PowerPoint presentation ski= lls. The workshop will provide ample opportunities for participants to rese= arch topics of their own choosing and to practice effective public speaking= and to develop an engaging and interesting PowerPoint presentation to acco= mpany their speech. Delegates are asked to bring along a brief =5Bno more t= han 10 minutes=5D presentation which has been recently used. Each delegate = will be given an opportunity to present this to the group, whereupon feedba= ck will be given and practical ways in which to improve. This may take the = form of help with your slides, your presentation technique, or simply ideas= to help you create a slicker, more effective presentation.=A0 Writing Press Releases - London, 19th November This is an ideal training course for those who want to use press releases a= s a technique for publicising an event or calling attention to an issue. Th= roughout the workshop delegates will develop the skills to produce a well-w= ritten, well-distributed and well-timed press release, and to appreciate th= at it is not difficult or expensive to produce, yet can be effective and us= eful. The key to writing an effective press release is getting it read and = the information published. With these objectives in mind, this module is de= signed to equip delegates with the most important elements of the press rel= ease, which are a clear and engaging text, careful selection of recipients,= and good timing of release. Effective Training Skills - train the trainer - Geneva, 1st December This workshop is ideal for those who are required to effectively train empl= oyees, colleagues or clients in an interesting, engaging and confident mann= er, in a way that is practical and which will help delegates to gain new sk= ills, knowledge and understanding. Crisis Communication & Media Management Strategies - Geneva, 1st December This workshop combines advanced media skills with crisis communication tact= ics and is aimed at those at the highest level within the organisation who = will already have significant experience in dealing with the media. By the = end of the workshop the following areas will be covered, through practical = activities and individual endeavour: - a better awareness of media communic= ation problems and good practice; familiarity with the latest organisationa= l communication systems; demonstrating good practice in handling real probl= ems with media; how to develop media strategies for prevention; how to mana= ge high profile media events and crises and how to handle bad news/adverse = publicity. Media Strategies & Campaigns - Geneva, 2nd December This workshop is aimed at individuals and organisations who want to get the= media working for them and with them.=A0 Working with the media is an effe= ctive way to influence attitudes and opinions about your programme, issue o= r product. In this workshop we aim to help you develop and manage a media r= elations campaign, which is one of the most effective ways to reach your ta= rget audience. This workshop is ideal if you or your colleagues have a camp= aign to run or a new product to launch and you would like to harness the me= dia to full effect. Team Building & Group Dynamics - Geneva, 2nd December This workshop is aimed at those of who are responsible for a group of peopl= e and you want some practical tips on how to deal with conflict resolution,= anger management, team building and relationships within the group. If you= need the skills to get your group working better together, then this works= hop is an excellent way to start the ball rolling. Presentation & Communication Skills - Geneva, 4th December Individuals and organisations who want to improve the way they present and = communicate - both formally and informally - for effectiveness and profitab= ility.=A0 Through the use of group work and individual activities, this wor= kshop provides every participant with an opportunity to practice the techni= ques and skills needed to prepare and deliver a great presentation, and int= roduces the wide number of sources of noise or interference that can enter = into the communication process. Kind regards, Sales & Marketing Team, www.crosshandstraining.org.uk crosshands ltd, coreley, shropshire sy8 3ar, t: 01584 890970; incorporated = in england & wales. company registration: 3136393 VAT registration: 682 112= 6 51 You have been sent this mail because we understand that you wish to receive= information about our training services, however, if this is incorrect, or= you no longer wish to receive mail, please email remove=40crosshandstraini= ng.org.uk and your details will be removed immediately. =A0 =A0 =A0 =A0 --Direct-Mail-MIME-Boundary-2 Content-Type: text/html; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable
H= ello
W= e have some last minute places available on these one-day training courses = running before Christmas, starting from &=23xa3;99 p.p.&=23xa0;
W= e have trained over 10,000 individuals in the past 10 years. Nearly 1,000 o= rganisations consider us to be their trainer of choice, because we consiste= ntly offer affordable, practical and effective training, with observable an= d measurable outcomes. 
Y= ou can book&=23xa0;securely online at ww= w.crosshandstraining.org.uk or if you prefer,&=23xa0; by telephone on 0= 1584 890970, or by email to bookings=40crosshandstraining.org.uk. All of our workshops= run from 10am to 4.30pm and our venues are centrally located. We can also = deliver any of our training on-site if you have a group of people and want = to save on travel and accommodation costs.
<= b>Facilitation Skills - Birmingham, 17th November; London, 18th Novembe= r
T= his workshop is aimed at delegates who are responsible for facilitating a g= roup of people. It is ideal for those who want practical tips on how to dea= l with groups and the way in which they interact, on how to maximise a grou= p&=23x2019;s potential and the right tools to use to generate and evaluate = ideas within a group and help the decision making process and to design and= manage team and project reviews.
<= b>Public Speaking & PowerPoint Presentations - Birmingham, 17th Nov= ember
T= his workshop is aimed at delegates who are interested in the theories and p= ractices of communication, as well as emotional responses to speaking in pu= blic, and who want to develop these, and their PowerPoint presentation skil= ls. The workshop will provide ample opportunities for participants to resea= rch topics of their own choosing and to practice effective public speaking = and to develop an engaging and interesting PowerPoint presentation to accom= pany their speech. Delegates are asked to bring along a brief =5Bno more th= an 10 minutes=5D presentation which has been recently used. Each delegate w= ill be given an opportunity to present this to the group, whereupon feedbac= k will be given and practical ways in which to improve. This may take the f= orm of help with your slides, your presentation technique, or simply ideas = to help you create a slicker, more effective presentation.&=23xa0;
<= b>Writing Press Releases - London, 19th November
T= his is an ideal training course for those who want to use press releases as= a technique for publicising an event or calling attention to an issue. Thr= oughout the workshop delegates will develop the skills to produce a well-wr= itten, well-distributed and well-timed press release, and to appreciate tha= t it is not difficult or expensive to produce, yet can be effective and use= ful. The key to writing an effective press release is getting it read and t= he information published. With these objectives in mind, this module is des= igned to equip delegates with the most important elements of the press rele= ase, which are a clear and engaging text, careful selection of recipients, = and good timing of release.
<= b>Effective Training Skills - train the trainer - Geneva, 1st December<= /div>
T= his workshop is ideal for those who are required to effectively train emplo= yees, colleagues or clients in an interesting, engaging and confident manne= r, in a way that is practical and which will help delegates to gain new ski= lls, knowledge and understanding.
<= b>Crisis Communication & Media Management Strategies - Geneva, 1st = December
T= his workshop combines advanced media skills with crisis communication tacti= cs and is aimed at those at the highest level within the organisation who w= ill already have significant experience in dealing with the media. By the e= nd of the workshop the following areas will be covered, through practical a= ctivities and individual endeavour: - a better awareness of media communica= tion problems and good practice; familiarity with the latest organisational= communication systems; demonstrating good practice in handling real proble= ms with media; how to develop media strategies for prevention; how to manag= e high profile media events and crises and how to handle bad news/adverse p= ublicity.
<= b>Media Strategies & Campaigns - Geneva, 2nd December
T= his workshop is aimed at individuals and organisations who want to get the = media working for them and with them.&=23xa0; Working with the media is an = effective way to influence attitudes and opinions about your programme, iss= ue or product. In this workshop we aim to help you develop and manage a med= ia relations campaign, which is one of the most effective ways to reach you= r target audience. This workshop is ideal if you or your colleagues have a = campaign to run or a new product to launch and you would like to harness th= e media to full effect.
<= b>Team Building & Group Dynamics - Geneva, 2nd December
T= his workshop is aimed at those of who are responsible for a group of people= and you want some practical tips on how to deal with conflict resolution, = anger management, team building and relationships within the group. If you = need the skills to get your group working better together, then this worksh= op is an excellent way to start the ball rolling.
<= b>Presentation & Communication Skills - Geneva, 4th December
=
I= ndividuals and organisations who want to improve the way they present and c= ommunicate - both formally and informally - for effectiveness and profitabi= lity.&=23xa0; Through the use of group work and individual activities, this= workshop provides every participant with an opportunity to practice the te= chniques and skills needed to prepare and deliver a great presentation, and= introduces the wide number of sources of noise or interference that can en= ter into the communication process.
K= ind regards,
S= ales & Marketing Team, www.crosshand= straining.org.uk
c= rosshands ltd, coreley, shropshire sy8 3ar, t: 01584 890970; incorporated i= n england & wales. company registration: 3136393 VAT registration: 682 = 1126 51
Y= ou have been sent this mail because we understand that you wish to receive = information about our training services, however, if this is incorrect, or = you no longer wish to receive mail, please email remove=40crosshandstraining.org.uk and = your details will be removed immediately.
&= =23xa0;
&= =23xa0;
&= =23xa0;
&= =23xa0;
= --Direct-Mail-MIME-Boundary-2-- From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 04:03:58 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_21, J_CHICKENPOX_61,J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65, J_CHICKENPOX_66,J_CHICKENPOX_71 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACA3puE240951 for ; Thu, 12 Nov 2009 04:03:58 -0600 X-ASG-Debug-ID: 1258020250-219a01090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73AFC1D932A7; Thu, 12 Nov 2009 02:04:10 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Ahce1pw7EvFe2Gyz; Thu, 12 Nov 2009 02:04:10 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8WXA-0006gJ-58; Thu, 12 Nov 2009 10:04:08 +0000 Date: Thu, 12 Nov 2009 05:04:08 -0500 From: Christoph Hellwig To: Alex Elder Cc: Barry Naujok , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue Subject: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue Message-ID: <20091112100408.GA25058@infradead.org> References: <20090902175840.740632507@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEB@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEB@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258020250 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Oct 21, 2009 at 12:12:33PM -0500, Alex Elder wrote: > - Is this code worthy of putting into a library, so other > XFS user space can use it? We can do this if we need it - git even tracks history over renames. > - Is the radix tree code worth putting into a library and > saving, for similar reasons (I didn't look at that code). I don't think we hould keep dead core around. We can resurrect it from git history if needed (don't think we'll need it though). > - I accept that this uses less memory for sparsely populated > key space than radix trees; but it would be nice if that > could be characterized a bit more precisely (i.e., what > will the range of values that'll be represented be, just > how sparse is it, and at what point does this really > pay off?). > - Related to the previous one--it would be good to have > a little info about why the value 7 was chosen as the > number of keys per node. Perhaps I just don't know > enough of the history (or content of the upcoming > patches). Maybe Barry still remembers some of this. I've added his current personal address to the Cc list. > - A number of external interfaces defined are not used > in the (current) xfs_repair code. (That's OK, but > they could be removed if they're never expected to > to be used--e.g. btree_peek_prev(), and btree_peek_next()). True. Although having the commited first and then removed would at least assure we have it in the git history so we can easily find it again. > > +#include > > +#include "btree.h" > > + > > + > > Note that the value of BTREE_KEY_MAX *must* be greater than 2, or > this code will not work. Maybe nobody should be trying to use 2 > here anyway, but I would like to see a comment, e.g., /* Must be 3 or more */ Thanks, I've added a comment to the updated version of the patch. > > pthread_mutex_lock(&args->lock); > > - while (!args->queuing_done || args->primary_io_queue.height) { > > There is a btree_is_empty(btree_root) function, you might > as well use it here (it is clearer what you're doing anyway). Indeed, changed. > > - ASSERT(args->primary_io_queue.height == 0); > > - ASSERT(args->secondary_io_queue.height == 0); > > btree_is_empty() would be better here also. > > > + ASSERT(btree_find(args->primary_io_queue, 0, NULL) == NULL); > > + ASSERT(btree_find(args->secondary_io_queue, 0, NULL) == NULL); Fixed up as well. Current version of the patch below: -- Subject: repair: use a btree instead of a radix tree for the prefetch queue From: Barry Naujok Currently the prefetch queue in xfs_repair uses a radix tree implementation derived from the Linux kernel one to manage it's prefetch queue. The radix tree implement is not very memory efficient for sparse indices, so replace it with a btree implementation that is much more efficient. This is not that important for the prefetch queue but will be very important for the next memory optimization patches which need a tree to store things like the block map which are very sparse, and we do not want to deal with two tree implementations (or rather three given that we still have avl.c around) Signed-off-by: Barry Naujok Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Index: xfsprogs-dev/repair/Makefile =================================================================== --- xfsprogs-dev.orig/repair/Makefile 2009-11-12 10:49:49.029254650 +0100 +++ xfsprogs-dev/repair/Makefile 2009-11-12 10:53:01.087004222 +0100 @@ -9,15 +9,15 @@ LSRCFILES = README LTCOMMAND = xfs_repair -HFILES = agheader.h attr_repair.h avl.h avl64.h bmap.h dinode.h dir.h \ - dir2.h err_protos.h globals.h incore.h protos.h rt.h \ - progress.h scan.h versions.h prefetch.h radix-tree.h threads.h +HFILES = agheader.h attr_repair.h avl.h avl64.h bmap.h btree.h \ + dinode.h dir.h dir2.h err_protos.h globals.h incore.h protos.h rt.h \ + progress.h scan.h versions.h prefetch.h threads.h -CFILES = agheader.c attr_repair.c avl.c avl64.c bmap.c dino_chunks.c \ - dinode.c dir.c dir2.c globals.c incore.c \ +CFILES = agheader.c attr_repair.c avl.c avl64.c bmap.c btree.c \ + dino_chunks.c dinode.c dir.c dir2.c globals.c incore.c \ incore_bmc.c init.c incore_ext.c incore_ino.c phase1.c \ phase2.c phase3.c phase4.c phase5.c phase6.c phase7.c \ - progress.c prefetch.c radix-tree.c rt.c sb.c scan.c threads.c \ + progress.c prefetch.c rt.c sb.c scan.c threads.c \ versions.c xfs_repair.c LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) Index: xfsprogs-dev/repair/btree.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfsprogs-dev/repair/btree.c 2009-11-12 10:54:07.733011893 +0100 @@ -0,0 +1,1238 @@ +/* + * Copyright (c) 2007, Silicon Graphics, Inc. Barry Naujok + * 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 + */ + +#include +#include "btree.h" + +/* + * Maximum number of keys per node. Must be greater than 2 for the code + * to work. + */ +#define BTREE_KEY_MAX 7 +#define BTREE_KEY_MIN (BTREE_KEY_MAX / 2) + +#define BTREE_PTR_MAX (BTREE_KEY_MAX + 1) + +struct btree_node { + unsigned long num_keys; + unsigned long keys[BTREE_KEY_MAX]; + struct btree_node *ptrs[BTREE_PTR_MAX]; +}; + +struct btree_cursor { + struct btree_node *node; + int index; +}; + +struct btree_root { + struct btree_node *root_node; + struct btree_cursor *cursor; /* track path to end leaf */ + int height; + /* lookup cache */ + int keys_valid; /* set if the cache is valid */ + unsigned long cur_key; + unsigned long next_key; + void *next_value; + unsigned long prev_key; + void *prev_value; +#ifdef BTREE_STATS + struct btree_stats { + unsigned long num_items; + unsigned long max_items; + int alloced; + int cache_hits; + int cache_misses; + int lookup; + int find; + int key_update; + int value_update; + int insert; + int delete; + int inc_height; + int dec_height; + int shift_prev; + int shift_next; + int split; + int merge_prev; + int merge_next; + int balance_prev; + int balance_next; + } stats; +#endif +}; + + +static struct btree_node * +btree_node_alloc(void) +{ + return calloc(1, sizeof(struct btree_node)); +} + +static void +btree_node_free( + struct btree_node *node) +{ + free(node); +} + +static void +btree_free_nodes( + struct btree_node *node, + int level) +{ + int i; + + if (level) + for (i = 0; i <= node->num_keys; i++) + btree_free_nodes(node->ptrs[i], level - 1); + btree_node_free(node); +} + +static void +__btree_init( + struct btree_root *root) +{ + memset(root, 0, sizeof(struct btree_root)); + root->height = 1; + root->cursor = calloc(1, sizeof(struct btree_cursor)); + root->root_node = btree_node_alloc(); + ASSERT(root->root_node); +#ifdef BTREE_STATS + root->stats.max_items = 1; + root->stats.alloced += 1; +#endif +} + +static void +__btree_free( + struct btree_root *root) +{ + btree_free_nodes(root->root_node, root->height - 1); + free(root->cursor); + root->height = 0; + root->cursor = NULL; + root->root_node = NULL; +} + +void +btree_init( + struct btree_root **root) +{ + *root = calloc(1, sizeof(struct btree_root)); + __btree_init(*root); +} + +void +btree_clear( + struct btree_root *root) +{ + __btree_free(root); + __btree_init(root); +} + +void +btree_destroy( + struct btree_root *root) +{ + __btree_free(root); + free(root); +} + +int +btree_is_empty( + struct btree_root *root) +{ + return root->root_node->num_keys == 0; +} + +static inline void +btree_invalidate_cursor( + struct btree_root *root) +{ + root->cursor[0].node = NULL; + root->keys_valid = 0; +} + +static inline unsigned long +btree_key_of_cursor( + struct btree_cursor *cursor, + int height) +{ + while (cursor->node->num_keys == cursor->index && --height > 0) + cursor++; + return cursor->node->keys[cursor->index]; +} + +static void * +btree_get_prev( + struct btree_root *root, + unsigned long *key) +{ + struct btree_cursor *cur = root->cursor; + int level = 0; + struct btree_node *node; + + if (cur->index > 0) { + if (key) + *key = cur->node->keys[cur->index - 1]; + return cur->node->ptrs[cur->index - 1]; + } + + /* else need to go up and back down the tree to find the previous */ + + while (cur->index == 0) { + if (++level == root->height) + return NULL; + cur++; + } + + /* the key is in the current level */ + if (key) + *key = cur->node->keys[cur->index - 1]; + + /* descend back down the right side to get the pointer */ + node = cur->node->ptrs[cur->index - 1]; + while (level--) + node = node->ptrs[node->num_keys]; + return node; +} + +static void * +btree_get_next( + struct btree_root *root, + unsigned long *key) +{ + struct btree_cursor *cur = root->cursor; + int level = 0; + struct btree_node *node; + + while (cur->index == cur->node->num_keys) { + if (++level == root->height) + return NULL; + cur++; + } + if (level == 0) { + if (key) { + cur->index++; + *key = btree_key_of_cursor(cur, root->height); + cur->index--; + } + return cur->node->ptrs[cur->index + 1]; + } + + node = cur->node->ptrs[cur->index + 1]; + while (--level > 0) + node = node->ptrs[0]; + if (key) + *key = node->keys[0]; + return node->ptrs[0]; +} + +/* + * Lookup/Search functions + */ + +static int +btree_do_search( + struct btree_root *root, + unsigned long key) +{ + unsigned long k = 0; + struct btree_cursor *cur = root->cursor + root->height; + struct btree_node *node = root->root_node; + int height = root->height; + int key_found = 0; + int i; + + while (--height >= 0) { + cur--; + for (i = 0; i < node->num_keys; i++) + if (node->keys[i] >= key) { + k = node->keys[i]; + key_found = 1; + break; + } + cur->node = node; + cur->index = i; + node = node->ptrs[i]; + } + root->keys_valid = key_found; + if (!key_found) + return 0; + + root->cur_key = k; + root->next_value = NULL; /* do on-demand next value lookup */ + root->prev_value = btree_get_prev(root, &root->prev_key); + return 1; +} + +static int +btree_search( + struct btree_root *root, + unsigned long key) +{ + if (root->keys_valid && key <= root->cur_key && + (!root->prev_value || key > root->prev_key)) { +#ifdef BTREE_STATS + root->stats.cache_hits++; +#endif + return 1; + } +#ifdef BTREE_STATS + root->stats.cache_misses++; +#endif + return btree_do_search(root, key); +} + +void * +btree_find( + struct btree_root *root, + unsigned long key, + unsigned long *actual_key) +{ +#ifdef BTREE_STATS + root->stats.find += 1; +#endif + if (!btree_search(root, key)) + return NULL; + + if (actual_key) + *actual_key = root->cur_key; + return root->cursor->node->ptrs[root->cursor->index]; +} + +void * +btree_lookup( + struct btree_root *root, + unsigned long key) +{ +#ifdef BTREE_STATS + root->stats.lookup += 1; +#endif + if (!btree_search(root, key) || root->cur_key != key) + return NULL; + return root->cursor->node->ptrs[root->cursor->index]; +} + +void * +btree_peek_prev( + struct btree_root *root, + unsigned long *key) +{ + if (!root->keys_valid) + return NULL; + if (key) + *key = root->prev_key; + return root->prev_value; +} + +void * +btree_peek_next( + struct btree_root *root, + unsigned long *key) +{ + if (!root->keys_valid) + return NULL; + if (!root->next_value) + root->next_value = btree_get_next(root, &root->next_key); + if (key) + *key = root->next_key; + return root->next_value; +} + +static void * +btree_move_cursor_to_next( + struct btree_root *root, + unsigned long *key) +{ + struct btree_cursor *cur = root->cursor; + int level = 0; + + while (cur->index == cur->node->num_keys) { + if (++level == root->height) + return NULL; + cur++; + } + cur->index++; + if (level == 0) { + if (key) + *key = btree_key_of_cursor(cur, root->height); + return cur->node->ptrs[cur->index]; + } + + while (--level >= 0) { + root->cursor[level].node = cur->node->ptrs[cur->index]; + root->cursor[level].index = 0; + cur--; + } + if (key) + *key = cur->node->keys[0]; + return cur->node->ptrs[0]; +} + +void * +btree_lookup_next( + struct btree_root *root, + unsigned long *key) +{ + void *value; + + if (!root->keys_valid) + return NULL; + + root->prev_key = root->cur_key; + root->prev_value = root->cursor->node->ptrs[root->cursor->index]; + + value = btree_move_cursor_to_next(root, &root->cur_key); + if (!value) { + btree_invalidate_cursor(root); + return NULL; + } + root->next_value = NULL; /* on-demand next value fetch */ + if (key) + *key = root->cur_key; + return value; +} + +static void * +btree_move_cursor_to_prev( + struct btree_root *root, + unsigned long *key) +{ + struct btree_cursor *cur = root->cursor; + int level = 0; + + while (cur->index == 0) { + if (++level == root->height) + return NULL; + cur++; + } + cur->index--; + if (key) /* the key is in the current level */ + *key = cur->node->keys[cur->index]; + while (level > 0) { + level--; + root->cursor[level].node = cur->node->ptrs[cur->index]; + root->cursor[level].index = root->cursor[level].node->num_keys; + cur--; + } + return cur->node->ptrs[cur->index]; +} + +void * +btree_lookup_prev( + struct btree_root *root, + unsigned long *key) +{ + void *value; + + if (!root->keys_valid) + return NULL; + + value = btree_move_cursor_to_prev(root, &root->cur_key); + if (!value) + return NULL; + root->prev_value = btree_get_prev(root, &root->prev_key); + root->next_value = NULL; /* on-demand next value fetch */ + if (key) + *key = root->cur_key; + return value; +} + +void * +btree_uncached_lookup( + struct btree_root *root, + unsigned long key) +{ + /* cursor-less (ie. uncached) lookup */ + int height = root->height - 1; + struct btree_node *node = root->root_node; + int i; + int key_found = 0; + + while (height >= 0) { + for (i = 0; i < node->num_keys; i++) + if (node->keys[i] >= key) { + key_found = node->keys[i] == key; + break; + } + node = node->ptrs[i]; + height--; + } + return key_found ? node : NULL; +} + +/* Update functions */ + +static inline void +btree_update_node_key( + struct btree_root *root, + struct btree_cursor *cursor, + int level, + unsigned long new_key) +{ + int i; + +#ifdef BTREE_STATS + root->stats.key_update += 1; +#endif + + cursor += level; + for (i = level; i < root->height; i++) { + if (cursor->index < cursor->node->num_keys) { + cursor->node->keys[cursor->index] = new_key; + break; + } + cursor++; + } +} + +int +btree_update_key( + struct btree_root *root, + unsigned long old_key, + unsigned long new_key) +{ + if (!btree_search(root, old_key) || root->cur_key != old_key) + return ENOENT; + + if (root->next_value && new_key >= root->next_key) + return EINVAL; + + if (root->prev_value && new_key <= root->prev_key) + return EINVAL; + + btree_update_node_key(root, root->cursor, 0, new_key); + + return 0; +} + +int +btree_update_value( + struct btree_root *root, + unsigned long key, + void *new_value) +{ + if (!new_value) + return EINVAL; + + if (!btree_search(root, key) || root->cur_key != key) + return ENOENT; + +#ifdef BTREE_STATS + root->stats.value_update += 1; +#endif + root->cursor->node->ptrs[root->cursor->index] = new_value; + + return 0; +} + +/* + * Cursor modification functions - used for inserting and deleting + */ + +static struct btree_cursor * +btree_copy_cursor_prev( + struct btree_root *root, + struct btree_cursor *dest_cursor, + int level) +{ + struct btree_cursor *src_cur = root->cursor + level; + struct btree_cursor *dst_cur; + int l = level; + int i; + + if (level >= root->height) + return NULL; + + while (src_cur->index == 0) { + if (++l >= root->height) + return NULL; + src_cur++; + } + for (i = l; i < root->height; i++) + dest_cursor[i] = *src_cur++; + + dst_cur = dest_cursor + l; + dst_cur->index--; + while (l-- >= level) { + dest_cursor[l].node = dst_cur->node->ptrs[dst_cur->index]; + dest_cursor[l].index = dest_cursor[l].node->num_keys; + dst_cur--; + } + return dest_cursor; +} + +static struct btree_cursor * +btree_copy_cursor_next( + struct btree_root *root, + struct btree_cursor *dest_cursor, + int level) +{ + struct btree_cursor *src_cur = root->cursor + level; + struct btree_cursor *dst_cur; + int l = level; + int i; + + if (level >= root->height) + return NULL; + + while (src_cur->index == src_cur->node->num_keys) { + if (++l >= root->height) + return NULL; + src_cur++; + } + for (i = l; i < root->height; i++) + dest_cursor[i] = *src_cur++; + + dst_cur = dest_cursor + l; + dst_cur->index++; + while (l-- >= level) { + dest_cursor[l].node = dst_cur->node->ptrs[dst_cur->index]; + dest_cursor[l].index = 0; + dst_cur--; + } + return dest_cursor; +} + +/* + * Shift functions + * + * Tries to move items in the current leaf to its sibling if it has space. + * Used in both insert and delete functions. + * Returns the number of items shifted. + */ + +static int +btree_shift_to_prev( + struct btree_root *root, + int level, + struct btree_cursor *prev_cursor, + int num_children) +{ + struct btree_node *node; + struct btree_node *prev_node; + int num_remain; /* # of keys left in "node" */ + unsigned long key; + int i; + + if (!prev_cursor || !num_children) + return 0; + + prev_node = prev_cursor[level].node; + node = root->cursor[level].node; + + ASSERT(num_children > 0 && num_children <= node->num_keys + 1); + + if ((prev_node->num_keys + num_children) > BTREE_KEY_MAX) + return 0; + +#ifdef BTREE_STATS + root->stats.shift_prev += 1; +#endif + + num_remain = node->num_keys - num_children; + ASSERT(num_remain == -1 || num_remain >= BTREE_KEY_MIN); + + /* shift parent keys around */ + level++; + if (num_remain > 0) + key = node->keys[num_children - 1]; + else + key = btree_key_of_cursor(root->cursor + level, + root->height - level); + while (prev_cursor[level].index == prev_cursor[level].node->num_keys) { + level++; + ASSERT(level < root->height); + } + prev_node->keys[prev_node->num_keys] = + prev_cursor[level].node->keys[prev_cursor[level].index]; + prev_cursor[level].node->keys[prev_cursor[level].index] = key; + + /* copy pointers and keys to the end of the prev node */ + for (i = 0; i < num_children - 1; i++) { + prev_node->keys[prev_node->num_keys + 1 + i] = node->keys[i]; + prev_node->ptrs[prev_node->num_keys + 1 + i] = node->ptrs[i]; + } + prev_node->ptrs[prev_node->num_keys + 1 + i] = node->ptrs[i]; + prev_node->num_keys += num_children; + + /* move remaining pointers/keys to start of node */ + if (num_remain >= 0) { + for (i = 0; i < num_remain; i++) { + node->keys[i] = node->keys[num_children + i]; + node->ptrs[i] = node->ptrs[num_children + i]; + } + node->ptrs[i] = node->ptrs[num_children + i]; + node->num_keys = num_remain; + } else + node->num_keys = 0; + + return num_children; +} + +static int +btree_shift_to_next( + struct btree_root *root, + int level, + struct btree_cursor *next_cursor, + int num_children) +{ + struct btree_node *node; + struct btree_node *next_node; + int num_remain; /* # of children left in node */ + int i; + + if (!next_cursor || !num_children) + return 0; + + node = root->cursor[level].node; + next_node = next_cursor[level].node; + + ASSERT(num_children > 0 && num_children <= node->num_keys + 1); + + if ((next_node->num_keys + num_children) > BTREE_KEY_MAX) + return 0; + + num_remain = node->num_keys + 1 - num_children; + ASSERT(num_remain == 0 || num_remain > BTREE_KEY_MIN); + +#ifdef BTREE_STATS + root->stats.shift_next += 1; +#endif + + /* make space for "num_children" items at beginning of next-leaf */ + i = next_node->num_keys; + next_node->ptrs[num_children + i] = next_node->ptrs[i]; + while (--i >= 0) { + next_node->keys[num_children + i] = next_node->keys[i]; + next_node->ptrs[num_children + i] = next_node->ptrs[i]; + } + + /* update keys in parent and next node from parent */ + do { + level++; + ASSERT(level < root->height); + } while (root->cursor[level].index == + root->cursor[level].node->num_keys); + + next_node->keys[num_children - 1] = + root->cursor[level].node->keys[root->cursor[level].index]; + root->cursor[level].node->keys[root->cursor[level].index] = + node->keys[node->num_keys - num_children]; + + /* copy last "num_children" items from node into start of next-node */ + for (i = 0; i < num_children - 1; i++) { + next_node->keys[i] = node->keys[num_remain + i]; + next_node->ptrs[i] = node->ptrs[num_remain + i]; + } + next_node->ptrs[i] = node->ptrs[num_remain + i]; + next_node->num_keys += num_children; + + if (num_remain > 0) + node->num_keys -= num_children; + else + node->num_keys = 0; + + return num_children; +} + +/* + * Insertion functions + */ + +static struct btree_node * +btree_increase_height( + struct btree_root *root) +{ + struct btree_node *new_root; + struct btree_cursor *new_cursor; + + new_cursor = realloc(root->cursor, (root->height + 1) * + sizeof(struct btree_cursor)); + if (!new_cursor) + return NULL; + root->cursor = new_cursor; + + new_root = btree_node_alloc(); + if (!new_root) + return NULL; + +#ifdef BTREE_STATS + root->stats.alloced += 1; + root->stats.inc_height += 1; + root->stats.max_items *= BTREE_PTR_MAX; +#endif + + new_root->ptrs[0] = root->root_node; + root->root_node = new_root; + + root->cursor[root->height].node = new_root; + root->cursor[root->height].index = 0; + + root->height++; + + return new_root; +} + +static int +btree_insert_item( + struct btree_root *root, + int level, + unsigned long key, + void *value); + + +static struct btree_node * +btree_split( + struct btree_root *root, + int level, + unsigned long key, + int *index) +{ + struct btree_node *node = root->cursor[level].node; + struct btree_node *new_node; + int i; + + new_node = btree_node_alloc(); + if (!new_node) + return NULL; + + if (btree_insert_item(root, level + 1, node->keys[BTREE_KEY_MIN], + new_node) != 0) { + btree_node_free(new_node); + return NULL; + } + +#ifdef BTREE_STATS + root->stats.alloced += 1; + root->stats.split += 1; +#endif + + for (i = 0; i < BTREE_KEY_MAX - BTREE_KEY_MIN - 1; i++) { + new_node->keys[i] = node->keys[BTREE_KEY_MIN + 1 + i]; + new_node->ptrs[i] = node->ptrs[BTREE_KEY_MIN + 1 + i]; + } + new_node->ptrs[i] = node->ptrs[BTREE_KEY_MIN + 1 + i]; + new_node->num_keys = BTREE_KEY_MAX - BTREE_KEY_MIN - 1; + + node->num_keys = BTREE_KEY_MIN; + if (key < node->keys[BTREE_KEY_MIN]) + return node; /* index doesn't change */ + + /* insertion point is in new node... */ + *index -= BTREE_KEY_MIN + 1; + return new_node; +} + +static int +btree_insert_shift_to_prev( + struct btree_root *root, + int level, + int *index) +{ + struct btree_cursor tmp_cursor[root->height]; + int n; + + if (*index <= 0) + return -1; + + if (!btree_copy_cursor_prev(root, tmp_cursor, level + 1)) + return -1; + + n = MIN(*index, (BTREE_PTR_MAX - tmp_cursor[level].node->num_keys) / 2); + if (!n || !btree_shift_to_prev(root, level, tmp_cursor, n)) + return -1; + + *index -= n; + return 0; +} + +static int +btree_insert_shift_to_next( + struct btree_root *root, + int level, + int *index) +{ + struct btree_cursor tmp_cursor[root->height]; + int n; + + if (*index >= BTREE_KEY_MAX) + return -1; + + if (!btree_copy_cursor_next(root, tmp_cursor, level + 1)) + return -1; + + n = MIN(BTREE_KEY_MAX - *index, + (BTREE_PTR_MAX - tmp_cursor[level].node->num_keys) / 2); + if (!n || !btree_shift_to_next(root, level, tmp_cursor, n)) + return -1; + return 0; +} + +static int +btree_insert_item( + struct btree_root *root, + int level, + unsigned long key, + void *value) +{ + struct btree_node *node = root->cursor[level].node; + int index = root->cursor[level].index; + int i; + + if (node->num_keys == BTREE_KEY_MAX) { + if (btree_insert_shift_to_prev(root, level, &index) == 0) + goto insert; + if (btree_insert_shift_to_next(root, level, &index) == 0) + goto insert; + if (level == root->height - 1) { + if (!btree_increase_height(root)) + return ENOMEM; + } + node = btree_split(root, level, key, &index); + if (!node) + return ENOMEM; + } +insert: + ASSERT(index <= node->num_keys); + + i = node->num_keys; + node->ptrs[i + 1] = node->ptrs[i]; + while (--i >= index) { + node->keys[i + 1] = node->keys[i]; + node->ptrs[i + 1] = node->ptrs[i]; + } + + node->num_keys++; + node->keys[index] = key; + + if (level == 0) + node->ptrs[index] = value; + else + node->ptrs[index + 1] = value; + + return 0; +} + + + +int +btree_insert( + struct btree_root *root, + unsigned long key, + void *value) +{ + int result; + + if (!value) + return EINVAL; + + if (btree_search(root, key) && root->cur_key == key) + return EEXIST; + +#ifdef BTREE_STATS + root->stats.insert += 1; + root->stats.num_items += 1; +#endif + + result = btree_insert_item(root, 0, key, value); + + btree_invalidate_cursor(root); + + return result; +} + + +/* + * Deletion functions + * + * Rather more complicated as deletions has 4 ways to go once a node + * ends up with less than the minimum number of keys: + * - move remainder to previous node + * - move remainder to next node + * (both will involve a parent deletion which may recurse) + * - balance by moving some items from previous node + * - balance by moving some items from next node + */ + +static void +btree_decrease_height( + struct btree_root *root) +{ + struct btree_node *old_root = root->root_node; + + ASSERT(old_root->num_keys == 0); + +#ifdef BTREE_STATS + root->stats.alloced -= 1; + root->stats.dec_height += 1; + root->stats.max_items /= BTREE_PTR_MAX; +#endif + root->root_node = old_root->ptrs[0]; + btree_node_free(old_root); + root->height--; +} + +static int +btree_merge_with_prev( + struct btree_root *root, + int level, + struct btree_cursor *prev_cursor) +{ + if (!prev_cursor) + return 0; + + if (!btree_shift_to_prev(root, level, prev_cursor, + root->cursor[level].node->num_keys + 1)) + return 0; + +#ifdef BTREE_STATS + root->stats.merge_prev += 1; +#endif + return 1; +} + +static int +btree_merge_with_next( + struct btree_root *root, + int level, + struct btree_cursor *next_cursor) +{ + if (!next_cursor) + return 0; + + if (!btree_shift_to_next(root, level, next_cursor, + root->cursor[level].node->num_keys + 1)) + return 0; + +#ifdef BTREE_STATS + root->stats.merge_next += 1; +#endif + return 1; +} + +static int +btree_balance_with_prev( + struct btree_root *root, + int level, + struct btree_cursor *prev_cursor) +{ + struct btree_cursor *root_cursor = root->cursor; + + if (!prev_cursor) + return 0; + ASSERT(prev_cursor[level].node->num_keys > BTREE_KEY_MIN); + +#ifdef BTREE_STATS + root->stats.balance_prev += 1; +#endif + /* + * Move some nodes from the prev node into the current node. + * As the shift operation is a right shift and is relative to + * the root cursor, make the root cursor the prev cursor and + * pass in the root cursor as the next cursor. + */ + + root->cursor = prev_cursor; + if (!btree_shift_to_next(root, level, root_cursor, + (prev_cursor[level].node->num_keys + 1 - BTREE_KEY_MIN) / 2)) + abort(); + root->cursor = root_cursor; + + return 1; +} + +static int +btree_balance_with_next( + struct btree_root *root, + int level, + struct btree_cursor *next_cursor) +{ + struct btree_cursor *root_cursor = root->cursor; + + if (!next_cursor) + return 0; + assert(next_cursor[level].node->num_keys > BTREE_KEY_MIN); + +#ifdef btree_stats + root->stats.balance_next += 1; +#endif + /* + * move some nodes from the next node into the current node. + * as the shift operation is a left shift and is relative to + * the root cursor, make the root cursor the next cursor and + * pass in the root cursor as the prev cursor. + */ + + root->cursor = next_cursor; + if (!btree_shift_to_prev(root, level, root_cursor, + (next_cursor[level].node->num_keys + 1 - BTREE_KEY_MIN) / 2)) + abort(); + root->cursor = root_cursor; + + return 1; + +} + +static void +btree_delete_key( + struct btree_root *root, + int level); + +/* + * btree_delete_node: + * + * Return 0 if it's done or 1 if the next level needs to be collapsed + */ +static void +btree_delete_node( + struct btree_root *root, + int level) +{ + struct btree_cursor prev_cursor[root->height]; + struct btree_cursor next_cursor[root->height]; + struct btree_cursor *pc; + struct btree_cursor *nc; + + /* + * the node has underflowed, grab or merge keys/items from a + * neighbouring node. + */ + + if (level == root->height - 1) { + if (level > 0 && root->root_node->num_keys == 0) + btree_decrease_height(root); + return; + } + + pc = btree_copy_cursor_prev(root, prev_cursor, level + 1); + if (!btree_merge_with_prev(root, level, pc)) { + nc = btree_copy_cursor_next(root, next_cursor, level + 1); + if (!btree_merge_with_next(root, level, nc)) { + /* merging failed, try redistrubution */ + if (!btree_balance_with_prev(root, level, pc) && + !btree_balance_with_next(root, level, nc)) + abort(); + return; /* when balancing, then the node isn't freed */ + } + } + +#ifdef BTREE_STATS + root->stats.alloced -= 1; +#endif + btree_node_free(root->cursor[level].node); + + btree_delete_key(root, level + 1); +} + +static void +btree_delete_key( + struct btree_root *root, + int level) +{ + struct btree_node *node = root->cursor[level].node; + int index = root->cursor[level].index; + + node->num_keys--; + if (index <= node->num_keys) { + /* + * if not deleting the last item, shift higher items down + * to cover the item being deleted + */ + while (index < node->num_keys) { + node->keys[index] = node->keys[index + 1]; + node->ptrs[index] = node->ptrs[index + 1]; + index++; + } + node->ptrs[index] = node->ptrs[index + 1]; + } else { + /* + * else update the associated parent key as the last key + * in the leaf has changed + */ + btree_update_node_key(root, root->cursor, level + 1, + node->keys[node->num_keys]); + } + /* + * if node underflows, either merge with sibling or rebalance + * with sibling. + */ + if (node->num_keys < BTREE_KEY_MIN) + btree_delete_node(root, level); +} + +void * +btree_delete( + struct btree_root *root, + unsigned long key) +{ + void *value; + + value = btree_lookup(root, key); + if (!value) + return NULL; + +#ifdef BTREE_STATS + root->stats.delete += 1; + root->stats.num_items -= 1; +#endif + + btree_delete_key(root, 0); + + btree_invalidate_cursor(root); + + return value; +} + +#ifdef BTREE_STATS +void +btree_print_stats( + struct btree_root *root, + FILE *f) +{ + unsigned long max_items = root->stats.max_items * + (root->root_node->num_keys + 1); + + fprintf(f, "\tnum_items = %lu, max_items = %lu (%lu%%)\n", + root->stats.num_items, max_items, + root->stats.num_items * 100 / max_items); + fprintf(f, "\talloced = %d nodes, %lu bytes, %lu bytes per item\n", + root->stats.alloced, + root->stats.alloced * sizeof(struct btree_node), + root->stats.alloced * sizeof(struct btree_node) / + root->stats.num_items); + fprintf(f, "\tlookup = %d\n", root->stats.lookup); + fprintf(f, "\tfind = %d\n", root->stats.find); + fprintf(f, "\tcache_hits = %d\n", root->stats.cache_hits); + fprintf(f, "\tcache_misses = %d\n", root->stats.cache_misses); + fprintf(f, "\tkey_update = %d\n", root->stats.key_update); + fprintf(f, "\tvalue_update = %d\n", root->stats.value_update); + fprintf(f, "\tinsert = %d\n", root->stats.insert); + fprintf(f, "\tshift_prev = %d\n", root->stats.shift_prev); + fprintf(f, "\tshift_next = %d\n", root->stats.shift_next); + fprintf(f, "\tsplit = %d\n", root->stats.split); + fprintf(f, "\tinc_height = %d\n", root->stats.inc_height); + fprintf(f, "\tdelete = %d\n", root->stats.delete); + fprintf(f, "\tmerge_prev = %d\n", root->stats.merge_prev); + fprintf(f, "\tmerge_next = %d\n", root->stats.merge_next); + fprintf(f, "\tbalance_prev = %d\n", root->stats.balance_prev); + fprintf(f, "\tbalance_next = %d\n", root->stats.balance_next); + fprintf(f, "\tdec_height = %d\n", root->stats.dec_height); +} +#endif Index: xfsprogs-dev/repair/btree.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfsprogs-dev/repair/btree.h 2009-11-12 10:53:01.091025964 +0100 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2007 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 _BTREE_H +#define _BTREE_H + + +struct btree_root; + +void +btree_init( + struct btree_root **root); + +void +btree_destroy( + struct btree_root *root); + +int +btree_is_empty( + struct btree_root *root); + +void * +btree_lookup( + struct btree_root *root, + unsigned long key); + +void * +btree_find( + struct btree_root *root, + unsigned long key, + unsigned long *actual_key); + +void * +btree_peek_prev( + struct btree_root *root, + unsigned long *key); + +void * +btree_peek_next( + struct btree_root *root, + unsigned long *key); + +void * +btree_lookup_next( + struct btree_root *root, + unsigned long *key); + +void * +btree_lookup_prev( + struct btree_root *root, + unsigned long *key); + +int +btree_insert( + struct btree_root *root, + unsigned long key, + void *value); + +void * +btree_delete( + struct btree_root *root, + unsigned long key); + +int +btree_update_key( + struct btree_root *root, + unsigned long old_key, + unsigned long new_key); + +int +btree_update_value( + struct btree_root *root, + unsigned long key, + void *new_value); + +void +btree_clear( + struct btree_root *root); + +#ifdef BTREE_STATS +void +btree_print_stats( + struct btree_root *root, + FILE *f); +#endif + +#endif /* _BTREE_H */ Index: xfsprogs-dev/repair/init.c =================================================================== --- xfsprogs-dev.orig/repair/init.c 2009-11-12 10:49:49.051263879 +0100 +++ xfsprogs-dev/repair/init.c 2009-11-12 10:53:01.092013310 +0100 @@ -26,7 +26,6 @@ #include "dir.h" #include "incore.h" #include "prefetch.h" -#include "radix-tree.h" #include static pthread_key_t dirbuf_key; @@ -151,5 +150,4 @@ xfs_init(libxfs_init_t *args) ts_create(); ts_init(); increase_rlimit(); - radix_tree_init(); } Index: xfsprogs-dev/repair/prefetch.c =================================================================== --- xfsprogs-dev.orig/repair/prefetch.c 2009-11-12 10:49:49.056254319 +0100 +++ xfsprogs-dev/repair/prefetch.c 2009-11-12 11:01:42.533256209 +0100 @@ -1,6 +1,7 @@ #include #include #include "avl.h" +#include "btree.h" #include "globals.h" #include "agheader.h" #include "incore.h" @@ -14,7 +15,6 @@ #include "threads.h" #include "prefetch.h" #include "progress.h" -#include "radix-tree.h" int do_prefetch = 1; @@ -129,10 +129,8 @@ pf_queue_io( pthread_mutex_lock(&args->lock); if (fsbno > args->last_bno_read) { - radix_tree_insert(&args->primary_io_queue, fsbno, bp); - if (!B_IS_INODE(flag)) - radix_tree_tag_set(&args->primary_io_queue, fsbno, 0); - else { + btree_insert(args->primary_io_queue, fsbno, bp); + if (B_IS_INODE(flag)) { args->inode_bufs_queued++; if (args->inode_bufs_queued == IO_THRESHOLD) pf_start_io_workers(args); @@ -154,7 +152,7 @@ pf_queue_io( #endif ASSERT(!B_IS_INODE(flag)); XFS_BUF_SET_PRIORITY(bp, B_DIR_META_2); - radix_tree_insert(&args->secondary_io_queue, fsbno, bp); + btree_insert(args->secondary_io_queue, fsbno, bp); } pf_start_processing(args); @@ -407,7 +405,7 @@ pf_batch_read( pf_which_t which, void *buf) { - struct radix_tree_root *queue; + struct btree_root *queue; xfs_buf_t *bplist[MAX_BUFS]; unsigned int num; off64_t first_off, last_off, next_off; @@ -415,27 +413,25 @@ pf_batch_read( int i; int inode_bufs; unsigned long fsbno; + unsigned long max_fsbno; char *pbuf; - queue = (which != PF_SECONDARY) ? &args->primary_io_queue - : &args->secondary_io_queue; + queue = (which != PF_SECONDARY) ? args->primary_io_queue + : args->secondary_io_queue; - while (radix_tree_lookup_first(queue, &fsbno) != NULL) { - - if (which != PF_META_ONLY) { - num = radix_tree_gang_lookup_ex(queue, - (void**)&bplist[0], fsbno, - fsbno + pf_max_fsbs, MAX_BUFS); - ASSERT(num > 0); - ASSERT(XFS_FSB_TO_DADDR(mp, fsbno) == - XFS_BUF_ADDR(bplist[0])); - } else { - num = radix_tree_gang_lookup_tag(queue, - (void**)&bplist[0], fsbno, - MAX_BUFS / 4, 0); - if (num == 0) - return; + while (btree_find(queue, 0, &fsbno) != NULL) { + max_fsbno = fsbno + pf_max_fsbs; + num = 0; + + bplist[0] = btree_lookup(queue, fsbno); + while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) { + if (which != PF_META_ONLY || + !B_IS_INODE(XFS_BUF_PRIORITY(bplist[num]))) + num++; + bplist[num] = btree_lookup_next(queue, &fsbno); } + if (!num) + return; /* * do a big read if 25% of the potential buffer is useful, @@ -467,7 +463,7 @@ pf_batch_read( } for (i = 0; i < num; i++) { - if (radix_tree_delete(queue, XFS_DADDR_TO_FSB(mp, + if (btree_delete(queue, XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bplist[i]))) == NULL) do_error(_("prefetch corruption\n")); } @@ -570,8 +566,7 @@ pf_io_worker( return NULL; pthread_mutex_lock(&args->lock); - while (!args->queuing_done || args->primary_io_queue.height) { - + while (!args->queuing_done || !btree_is_empty(args->primary_io_queue)) { #ifdef XR_PF_TRACE pftrace("waiting to start prefetch I/O for AG %d", args->agno); #endif @@ -696,8 +691,8 @@ pf_queuing_worker( #endif pthread_mutex_lock(&args->lock); - ASSERT(args->primary_io_queue.height == 0); - ASSERT(args->secondary_io_queue.height == 0); + ASSERT(btree_is_empty(args->primary_io_queue)); + ASSERT(btree_is_empty(args->secondary_io_queue)); args->prefetch_done = 1; if (args->next_args) @@ -755,8 +750,8 @@ start_inode_prefetch( args = calloc(1, sizeof(prefetch_args_t)); - INIT_RADIX_TREE(&args->primary_io_queue, 0); - INIT_RADIX_TREE(&args->secondary_io_queue, 0); + btree_init(&args->primary_io_queue); + btree_init(&args->secondary_io_queue); if (pthread_mutex_init(&args->lock, NULL) != 0) do_error(_("failed to initialize prefetch mutex\n")); if (pthread_cond_init(&args->start_reading, NULL) != 0) @@ -835,6 +830,8 @@ cleanup_inode_prefetch( pthread_cond_destroy(&args->start_reading); pthread_cond_destroy(&args->start_processing); sem_destroy(&args->ra_count); + btree_destroy(args->primary_io_queue); + btree_destroy(args->secondary_io_queue); free(args); } Index: xfsprogs-dev/repair/prefetch.h =================================================================== --- xfsprogs-dev.orig/repair/prefetch.h 2009-11-12 10:49:49.062253827 +0100 +++ xfsprogs-dev/repair/prefetch.h 2009-11-12 10:53:01.098026017 +0100 @@ -3,7 +3,6 @@ #include #include "incore.h" -#include "radix-tree.h" extern int do_prefetch; @@ -14,8 +13,8 @@ typedef struct prefetch_args { pthread_mutex_t lock; pthread_t queuing_thread; pthread_t io_threads[PF_THREAD_COUNT]; - struct radix_tree_root primary_io_queue; - struct radix_tree_root secondary_io_queue; + struct btree_root *primary_io_queue; + struct btree_root *secondary_io_queue; pthread_cond_t start_reading; pthread_cond_t start_processing; int agno; Index: xfsprogs-dev/repair/radix-tree.c =================================================================== --- xfsprogs-dev.orig/repair/radix-tree.c 2009-11-12 10:49:49.070276497 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,805 +0,0 @@ -/* - * Copyright (C) 2001 Momchil Velikov - * Portions Copyright (C) 2001 Christoph Hellwig - * Copyright (C) 2005 SGI, Christoph Lameter - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include "radix-tree.h" - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -#endif - -#define RADIX_TREE_MAP_SHIFT 6 -#define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT) -#define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1) - -#ifdef RADIX_TREE_TAGS -#define RADIX_TREE_TAG_LONGS \ - ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) -#endif - -struct radix_tree_node { - unsigned int count; - void *slots[RADIX_TREE_MAP_SIZE]; -#ifdef RADIX_TREE_TAGS - unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; -#endif -}; - -struct radix_tree_path { - struct radix_tree_node *node; - int offset; -}; - -#define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) -#define RADIX_TREE_MAX_PATH (RADIX_TREE_INDEX_BITS/RADIX_TREE_MAP_SHIFT + 2) - -static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH]; - -/* - * Radix tree node cache. - */ - -#define radix_tree_node_alloc(r) ((struct radix_tree_node *) \ - calloc(1, sizeof(struct radix_tree_node))) -#define radix_tree_node_free(n) free(n) - -#ifdef RADIX_TREE_TAGS - -static inline void tag_set(struct radix_tree_node *node, unsigned int tag, - int offset) -{ - *((__uint32_t *)node->tags[tag] + (offset >> 5)) |= (1 << (offset & 31)); -} - -static inline void tag_clear(struct radix_tree_node *node, unsigned int tag, - int offset) -{ - __uint32_t *p = (__uint32_t*)node->tags[tag] + (offset >> 5); - __uint32_t m = 1 << (offset & 31); - *p &= ~m; -} - -static inline int tag_get(struct radix_tree_node *node, unsigned int tag, - int offset) -{ - return 1 & (((const __uint32_t *)node->tags[tag])[offset >> 5] >> (offset & 31)); -} - -/* - * Returns 1 if any slot in the node has this tag set. - * Otherwise returns 0. - */ -static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag) -{ - int idx; - for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { - if (node->tags[tag][idx]) - return 1; - } - return 0; -} - -#endif - -/* - * Return the maximum key which can be store into a - * radix tree with height HEIGHT. - */ -static inline unsigned long radix_tree_maxindex(unsigned int height) -{ - return height_to_maxindex[height]; -} - -/* - * Extend a radix tree so it can store key @index. - */ -static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) -{ - struct radix_tree_node *node; - unsigned int height; -#ifdef RADIX_TREE_TAGS - char tags[RADIX_TREE_MAX_TAGS]; - int tag; -#endif - - /* Figure out what the height should be. */ - height = root->height + 1; - while (index > radix_tree_maxindex(height)) - height++; - - if (root->rnode == NULL) { - root->height = height; - goto out; - } - -#ifdef RADIX_TREE_TAGS - /* - * Prepare the tag status of the top-level node for propagation - * into the newly-pushed top-level node(s) - */ - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - tags[tag] = 0; - if (any_tag_set(root->rnode, tag)) - tags[tag] = 1; - } -#endif - do { - if (!(node = radix_tree_node_alloc(root))) - return -ENOMEM; - - /* Increase the height. */ - node->slots[0] = root->rnode; - -#ifdef RADIX_TREE_TAGS - /* Propagate the aggregated tag info into the new root */ - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - if (tags[tag]) - tag_set(node, tag, 0); - } -#endif - node->count = 1; - root->rnode = node; - root->height++; - } while (height > root->height); -out: - return 0; -} - -/** - * radix_tree_insert - insert into a radix tree - * @root: radix tree root - * @index: index key - * @item: item to insert - * - * Insert an item into the radix tree at position @index. - */ -int radix_tree_insert(struct radix_tree_root *root, - unsigned long index, void *item) -{ - struct radix_tree_node *node = NULL, *slot; - unsigned int height, shift; - int offset; - int error; - - /* Make sure the tree is high enough. */ - if ((!index && !root->rnode) || - index > radix_tree_maxindex(root->height)) { - error = radix_tree_extend(root, index); - if (error) - return error; - } - - slot = root->rnode; - height = root->height; - shift = (height-1) * RADIX_TREE_MAP_SHIFT; - - offset = 0; /* uninitialised var warning */ - do { - if (slot == NULL) { - /* Have to add a child node. */ - if (!(slot = radix_tree_node_alloc(root))) - return -ENOMEM; - if (node) { - node->slots[offset] = slot; - node->count++; - } else - root->rnode = slot; - } - - /* Go a level down */ - offset = (index >> shift) & RADIX_TREE_MAP_MASK; - node = slot; - slot = node->slots[offset]; - shift -= RADIX_TREE_MAP_SHIFT; - height--; - } while (height > 0); - - if (slot != NULL) - return -EEXIST; - - ASSERT(node); - node->count++; - node->slots[offset] = item; -#ifdef RADIX_TREE_TAGS - ASSERT(!tag_get(node, 0, offset)); - ASSERT(!tag_get(node, 1, offset)); -#endif - return 0; -} - -static inline void **__lookup_slot(struct radix_tree_root *root, - unsigned long index) -{ - unsigned int height, shift; - struct radix_tree_node **slot; - - height = root->height; - if (index > radix_tree_maxindex(height)) - return NULL; - - shift = (height-1) * RADIX_TREE_MAP_SHIFT; - slot = &root->rnode; - - while (height > 0) { - if (*slot == NULL) - return NULL; - - slot = (struct radix_tree_node **) - ((*slot)->slots + - ((index >> shift) & RADIX_TREE_MAP_MASK)); - shift -= RADIX_TREE_MAP_SHIFT; - height--; - } - - return (void **)slot; -} - -/** - * radix_tree_lookup_slot - lookup a slot in a radix tree - * @root: radix tree root - * @index: index key - * - * Lookup the slot corresponding to the position @index in the radix tree - * @root. This is useful for update-if-exists operations. - */ -void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index) -{ - return __lookup_slot(root, index); -} - -/** - * radix_tree_lookup - perform lookup operation on a radix tree - * @root: radix tree root - * @index: index key - * - * Lookup the item at the position @index in the radix tree @root. - */ -void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index) -{ - void **slot; - - slot = __lookup_slot(root, index); - return slot != NULL ? *slot : NULL; -} - -/** - * raid_tree_first_key - find the first index key in the radix tree - * @root: radix tree root - * @index: where the first index will be placed - * - * Returns the first entry and index key in the radix tree @root. - */ -void *radix_tree_lookup_first(struct radix_tree_root *root, unsigned long *index) -{ - unsigned int height, shift; - struct radix_tree_node *slot; - unsigned long i; - - height = root->height; - *index = 0; - if (height == 0) - return NULL; - - shift = (height-1) * RADIX_TREE_MAP_SHIFT; - slot = root->rnode; - - for (; height > 1; height--) { - for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { - if (slot->slots[i] != NULL) - break; - } - ASSERT(i < RADIX_TREE_MAP_SIZE); - - *index |= (i << shift); - shift -= RADIX_TREE_MAP_SHIFT; - slot = slot->slots[i]; - } - for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { - if (slot->slots[i] != NULL) { - *index |= i; - return slot->slots[i]; - } - } - return NULL; -} - -#ifdef RADIX_TREE_TAGS - -/** - * radix_tree_tag_set - set a tag on a radix tree node - * @root: radix tree root - * @index: index key - * @tag: tag index - * - * Set the search tag (which must be < RADIX_TREE_MAX_TAGS) - * corresponding to @index in the radix tree. From - * the root all the way down to the leaf node. - * - * Returns the address of the tagged item. Setting a tag on a not-present - * item is a bug. - */ -void *radix_tree_tag_set(struct radix_tree_root *root, - unsigned long index, unsigned int tag) -{ - unsigned int height, shift; - struct radix_tree_node *slot; - - height = root->height; - if (index > radix_tree_maxindex(height)) - return NULL; - - shift = (height - 1) * RADIX_TREE_MAP_SHIFT; - slot = root->rnode; - - while (height > 0) { - int offset; - - offset = (index >> shift) & RADIX_TREE_MAP_MASK; - if (!tag_get(slot, tag, offset)) - tag_set(slot, tag, offset); - slot = slot->slots[offset]; - ASSERT(slot != NULL); - shift -= RADIX_TREE_MAP_SHIFT; - height--; - } - - return slot; -} - -/** - * radix_tree_tag_clear - clear a tag on a radix tree node - * @root: radix tree root - * @index: index key - * @tag: tag index - * - * Clear the search tag (which must be < RADIX_TREE_MAX_TAGS) - * corresponding to @index in the radix tree. If - * this causes the leaf node to have no tags set then clear the tag in the - * next-to-leaf node, etc. - * - * Returns the address of the tagged item on success, else NULL. ie: - * has the same return value and semantics as radix_tree_lookup(). - */ -void *radix_tree_tag_clear(struct radix_tree_root *root, - unsigned long index, unsigned int tag) -{ - struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; - struct radix_tree_node *slot; - unsigned int height, shift; - void *ret = NULL; - - height = root->height; - if (index > radix_tree_maxindex(height)) - goto out; - - shift = (height - 1) * RADIX_TREE_MAP_SHIFT; - pathp->node = NULL; - slot = root->rnode; - - while (height > 0) { - int offset; - - if (slot == NULL) - goto out; - - offset = (index >> shift) & RADIX_TREE_MAP_MASK; - pathp[1].offset = offset; - pathp[1].node = slot; - slot = slot->slots[offset]; - pathp++; - shift -= RADIX_TREE_MAP_SHIFT; - height--; - } - - ret = slot; - if (ret == NULL) - goto out; - - do { - if (!tag_get(pathp->node, tag, pathp->offset)) - goto out; - tag_clear(pathp->node, tag, pathp->offset); - if (any_tag_set(pathp->node, tag)) - goto out; - pathp--; - } while (pathp->node); -out: - return ret; -} - -#endif - -static unsigned int -__lookup(struct radix_tree_root *root, void **results, unsigned long index, - unsigned int max_items, unsigned long *next_index) -{ - unsigned int nr_found = 0; - unsigned int shift, height; - struct radix_tree_node *slot; - unsigned long i; - - height = root->height; - if (height == 0) - goto out; - - shift = (height-1) * RADIX_TREE_MAP_SHIFT; - slot = root->rnode; - - for ( ; height > 1; height--) { - - for (i = (index >> shift) & RADIX_TREE_MAP_MASK ; - i < RADIX_TREE_MAP_SIZE; i++) { - if (slot->slots[i] != NULL) - break; - index &= ~((1UL << shift) - 1); - index += 1UL << shift; - if (index == 0) - goto out; /* 32-bit wraparound */ - } - if (i == RADIX_TREE_MAP_SIZE) - goto out; - - shift -= RADIX_TREE_MAP_SHIFT; - slot = slot->slots[i]; - } - - /* Bottom level: grab some items */ - for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) { - index++; - if (slot->slots[i]) { - results[nr_found++] = slot->slots[i]; - if (nr_found == max_items) - goto out; - } - } -out: - *next_index = index; - return nr_found; -} - -/** - * radix_tree_gang_lookup - perform multiple lookup on a radix tree - * @root: radix tree root - * @results: where the results of the lookup are placed - * @first_index: start the lookup from this key - * @max_items: place up to this many items at *results - * - * Performs an index-ascending scan of the tree for present items. Places - * them at *@results and returns the number of items which were placed at - * *@results. - * - * The implementation is naive. - */ -unsigned int -radix_tree_gang_lookup(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned int max_items) -{ - const unsigned long max_index = radix_tree_maxindex(root->height); - unsigned long cur_index = first_index; - unsigned int ret = 0; - - while (ret < max_items) { - unsigned int nr_found; - unsigned long next_index; /* Index of next search */ - - if (cur_index > max_index) - break; - nr_found = __lookup(root, results + ret, cur_index, - max_items - ret, &next_index); - ret += nr_found; - if (next_index == 0) - break; - cur_index = next_index; - } - return ret; -} - -/** - * radix_tree_gang_lookup_ex - perform multiple lookup on a radix tree - * @root: radix tree root - * @results: where the results of the lookup are placed - * @first_index: start the lookup from this key - * @last_index: don't lookup past this key - * @max_items: place up to this many items at *results - * - * Performs an index-ascending scan of the tree for present items starting - * @first_index until @last_index up to as many as @max_items. Places - * them at *@results and returns the number of items which were placed - * at *@results. - * - * The implementation is naive. - */ -unsigned int -radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned long last_index, - unsigned int max_items) -{ - const unsigned long max_index = radix_tree_maxindex(root->height); - unsigned long cur_index = first_index; - unsigned int ret = 0; - - while (ret < max_items && cur_index < last_index) { - unsigned int nr_found; - unsigned long next_index; /* Index of next search */ - - if (cur_index > max_index) - break; - nr_found = __lookup(root, results + ret, cur_index, - max_items - ret, &next_index); - ret += nr_found; - if (next_index == 0) - break; - cur_index = next_index; - } - return ret; -} - -#ifdef RADIX_TREE_TAGS - -static unsigned int -__lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, - unsigned int max_items, unsigned long *next_index, unsigned int tag) -{ - unsigned int nr_found = 0; - unsigned int shift; - unsigned int height = root->height; - struct radix_tree_node *slot; - - shift = (height - 1) * RADIX_TREE_MAP_SHIFT; - slot = root->rnode; - - while (height > 0) { - unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; - - for ( ; i < RADIX_TREE_MAP_SIZE; i++) { - if (tag_get(slot, tag, i)) { - ASSERT(slot->slots[i] != NULL); - break; - } - index &= ~((1UL << shift) - 1); - index += 1UL << shift; - if (index == 0) - goto out; /* 32-bit wraparound */ - } - if (i == RADIX_TREE_MAP_SIZE) - goto out; - height--; - if (height == 0) { /* Bottom level: grab some items */ - unsigned long j = index & RADIX_TREE_MAP_MASK; - - for ( ; j < RADIX_TREE_MAP_SIZE; j++) { - index++; - if (tag_get(slot, tag, j)) { - ASSERT(slot->slots[j] != NULL); - results[nr_found++] = slot->slots[j]; - if (nr_found == max_items) - goto out; - } - } - } - shift -= RADIX_TREE_MAP_SHIFT; - slot = slot->slots[i]; - } -out: - *next_index = index; - return nr_found; -} - -/** - * radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree - * based on a tag - * @root: radix tree root - * @results: where the results of the lookup are placed - * @first_index: start the lookup from this key - * @max_items: place up to this many items at *results - * @tag: the tag index (< RADIX_TREE_MAX_TAGS) - * - * Performs an index-ascending scan of the tree for present items which - * have the tag indexed by @tag set. Places the items at *@results and - * returns the number of items which were placed at *@results. - */ -unsigned int -radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned int max_items, - unsigned int tag) -{ - const unsigned long max_index = radix_tree_maxindex(root->height); - unsigned long cur_index = first_index; - unsigned int ret = 0; - - while (ret < max_items) { - unsigned int nr_found; - unsigned long next_index; /* Index of next search */ - - if (cur_index > max_index) - break; - nr_found = __lookup_tag(root, results + ret, cur_index, - max_items - ret, &next_index, tag); - ret += nr_found; - if (next_index == 0) - break; - cur_index = next_index; - } - return ret; -} - -#endif - -/** - * radix_tree_shrink - shrink height of a radix tree to minimal - * @root radix tree root - */ -static inline void radix_tree_shrink(struct radix_tree_root *root) -{ - /* try to shrink tree height */ - while (root->height > 1 && - root->rnode->count == 1 && - root->rnode->slots[0]) { - struct radix_tree_node *to_free = root->rnode; - - root->rnode = to_free->slots[0]; - root->height--; - /* must only free zeroed nodes into the slab */ -#ifdef RADIX_TREE_TAGS - tag_clear(to_free, 0, 0); - tag_clear(to_free, 1, 0); -#endif - to_free->slots[0] = NULL; - to_free->count = 0; - radix_tree_node_free(to_free); - } -} - -/** - * radix_tree_delete - delete an item from a radix tree - * @root: radix tree root - * @index: index key - * - * Remove the item at @index from the radix tree rooted at @root. - * - * Returns the address of the deleted item, or NULL if it was not present. - */ -void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) -{ - struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; - struct radix_tree_path *orig_pathp; - struct radix_tree_node *slot; - unsigned int height, shift; - void *ret = NULL; -#ifdef RADIX_TREE_TAGS - char tags[RADIX_TREE_MAX_TAGS]; - int nr_cleared_tags; - int tag; -#endif - int offset; - - height = root->height; - if (index > radix_tree_maxindex(height)) - goto out; - - shift = (height - 1) * RADIX_TREE_MAP_SHIFT; - pathp->node = NULL; - slot = root->rnode; - - for ( ; height > 0; height--) { - if (slot == NULL) - goto out; - - pathp++; - offset = (index >> shift) & RADIX_TREE_MAP_MASK; - pathp->offset = offset; - pathp->node = slot; - slot = slot->slots[offset]; - shift -= RADIX_TREE_MAP_SHIFT; - } - - ret = slot; - if (ret == NULL) - goto out; - - orig_pathp = pathp; - -#ifdef RADIX_TREE_TAGS - /* - * Clear all tags associated with the just-deleted item - */ - nr_cleared_tags = 0; - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - tags[tag] = 1; - if (tag_get(pathp->node, tag, pathp->offset)) { - tag_clear(pathp->node, tag, pathp->offset); - if (!any_tag_set(pathp->node, tag)) { - tags[tag] = 0; - nr_cleared_tags++; - } - } - } - - for (pathp--; nr_cleared_tags && pathp->node; pathp--) { - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - if (tags[tag]) - continue; - - tag_clear(pathp->node, tag, pathp->offset); - if (any_tag_set(pathp->node, tag)) { - tags[tag] = 1; - nr_cleared_tags--; - } - } - } -#endif - /* Now free the nodes we do not need anymore */ - for (pathp = orig_pathp; pathp->node; pathp--) { - pathp->node->slots[pathp->offset] = NULL; - pathp->node->count--; - - if (pathp->node->count) { - if (pathp->node == root->rnode) - radix_tree_shrink(root); - goto out; - } - - /* Node with zero slots in use so free it */ - radix_tree_node_free(pathp->node); - } - root->rnode = NULL; - root->height = 0; -out: - return ret; -} - -#ifdef RADIX_TREE_TAGS -/** - * radix_tree_tagged - test whether any items in the tree are tagged - * @root: radix tree root - * @tag: tag to test - */ -int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag) -{ - struct radix_tree_node *rnode; - rnode = root->rnode; - if (!rnode) - return 0; - return any_tag_set(rnode, tag); -} -#endif - -static unsigned long __maxindex(unsigned int height) -{ - unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; - unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; - - if (tmp >= RADIX_TREE_INDEX_BITS) - index = ~0UL; - return index; -} - -static void radix_tree_init_maxindex(void) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++) - height_to_maxindex[i] = __maxindex(i); -} - -void radix_tree_init(void) -{ - radix_tree_init_maxindex(); -} Index: xfsprogs-dev/repair/radix-tree.h =================================================================== --- xfsprogs-dev.orig/repair/radix-tree.h 2009-11-12 10:49:49.077254201 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2001 Momchil Velikov - * Portions Copyright (C) 2001 Christoph Hellwig - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifndef __XFS_SUPPORT_RADIX_TREE_H__ -#define __XFS_SUPPORT_RADIX_TREE_H__ - -#define RADIX_TREE_TAGS - -struct radix_tree_root { - unsigned int height; - struct radix_tree_node *rnode; -}; - -#define RADIX_TREE_INIT(mask) { \ - .height = 0, \ - .rnode = NULL, \ -} - -#define RADIX_TREE(name, mask) \ - struct radix_tree_root name = RADIX_TREE_INIT(mask) - -#define INIT_RADIX_TREE(root, mask) \ -do { \ - (root)->height = 0; \ - (root)->rnode = NULL; \ -} while (0) - -#ifdef RADIX_TREE_TAGS -#define RADIX_TREE_MAX_TAGS 2 -#endif - -int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); -void *radix_tree_lookup(struct radix_tree_root *, unsigned long); -void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); -void *radix_tree_lookup_first(struct radix_tree_root *, unsigned long *); -void *radix_tree_delete(struct radix_tree_root *, unsigned long); -unsigned int -radix_tree_gang_lookup(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned int max_items); -unsigned int -radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned long last_index, - unsigned int max_items); - -void radix_tree_init(void); - -#ifdef RADIX_TREE_TAGS -void *radix_tree_tag_set(struct radix_tree_root *root, - unsigned long index, unsigned int tag); -void *radix_tree_tag_clear(struct radix_tree_root *root, - unsigned long index, unsigned int tag); -int radix_tree_tag_get(struct radix_tree_root *root, - unsigned long index, unsigned int tag); -unsigned int -radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, - unsigned long first_index, unsigned int max_items, - unsigned int tag); -int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); -#endif - -#endif /* __XFS_SUPPORT_RADIX_TREE_H__ */ From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 04:09:38 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_35 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACA9cWl241285 for ; Thu, 12 Nov 2009 04:09:38 -0600 X-ASG-Debug-ID: 1258020597-2feb00b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 779C61D9331F; Thu, 12 Nov 2009 02:09:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gnAVpgaTSxRaAxyi; Thu, 12 Nov 2009 02:09:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8Wcn-0007UO-5Q; Thu, 12 Nov 2009 10:09:57 +0000 Date: Thu, 12 Nov 2009 05:09:57 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/14] repair: use single prefetch queue Subject: Re: [PATCH 07/14] repair: use single prefetch queue Message-ID: <20091112100957.GB25058@infradead.org> References: <20090902175840.934778714@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEC@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEC@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258020597 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Oct 21, 2009 at 12:48:35PM -0500, Alex Elder wrote: > The following hunk doesn't really do anything but change whitespace. > It'd be nice if those changes (when there's a bunch like this) were > limited to a separate no-op patch. Agreed. There were lots of hunk like that in Barry's original patches and I though I caught them all, but this one was left over. Updated patch below: -- Subject: repair: use single prefetch queue From: Barry Naujok We don't need two prefetch queues as we guarantee execution in order anyway. Signed-off-by: Barry Naujok Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Index: xfsprogs-dev/repair/prefetch.c =================================================================== --- xfsprogs-dev.orig/repair/prefetch.c 2009-11-12 11:01:42.533256209 +0100 +++ xfsprogs-dev/repair/prefetch.c 2009-11-12 11:07:32.068006860 +0100 @@ -128,8 +128,9 @@ pf_queue_io( pthread_mutex_lock(&args->lock); + btree_insert(args->io_queue, fsbno, bp); + if (fsbno > args->last_bno_read) { - btree_insert(args->primary_io_queue, fsbno, bp); if (B_IS_INODE(flag)) { args->inode_bufs_queued++; if (args->inode_bufs_queued == IO_THRESHOLD) @@ -152,7 +153,6 @@ pf_queue_io( #endif ASSERT(!B_IS_INODE(flag)); XFS_BUF_SET_PRIORITY(bp, B_DIR_META_2); - btree_insert(args->secondary_io_queue, fsbno, bp); } pf_start_processing(args); @@ -405,7 +405,6 @@ pf_batch_read( pf_which_t which, void *buf) { - struct btree_root *queue; xfs_buf_t *bplist[MAX_BUFS]; unsigned int num; off64_t first_off, last_off, next_off; @@ -416,19 +415,22 @@ pf_batch_read( unsigned long max_fsbno; char *pbuf; - queue = (which != PF_SECONDARY) ? args->primary_io_queue - : args->secondary_io_queue; - - while (btree_find(queue, 0, &fsbno) != NULL) { - max_fsbno = fsbno + pf_max_fsbs; + for (;;) { num = 0; - - bplist[0] = btree_lookup(queue, fsbno); + if (which == PF_SECONDARY) { + bplist[0] = btree_find(args->io_queue, 0, &fsbno); + max_fsbno = MIN(fsbno + pf_max_fsbs, + args->last_bno_read); + } else { + bplist[0] = btree_find(args->io_queue, + args->last_bno_read, &fsbno); + max_fsbno = fsbno + pf_max_fsbs; + } while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) { if (which != PF_META_ONLY || !B_IS_INODE(XFS_BUF_PRIORITY(bplist[num]))) num++; - bplist[num] = btree_lookup_next(queue, &fsbno); + bplist[num] = btree_lookup_next(args->io_queue, &fsbno); } if (!num) return; @@ -463,7 +465,7 @@ pf_batch_read( } for (i = 0; i < num; i++) { - if (btree_delete(queue, XFS_DADDR_TO_FSB(mp, + if (btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bplist[i]))) == NULL) do_error(_("prefetch corruption\n")); } @@ -566,7 +568,7 @@ pf_io_worker( return NULL; pthread_mutex_lock(&args->lock); - while (!args->queuing_done || !btree_is_empty(args->primary_io_queue)) { + while (!args->queuing_done || !btree_is_empty(args->io_queue)) { #ifdef XR_PF_TRACE pftrace("waiting to start prefetch I/O for AG %d", args->agno); #endif @@ -691,8 +693,7 @@ pf_queuing_worker( #endif pthread_mutex_lock(&args->lock); - ASSERT(btree_is_empty(args->primary_io_queue)); - ASSERT(btree_is_empty(args->secondary_io_queue)); + ASSERT(btree_is_empty(args->io_queue)); args->prefetch_done = 1; if (args->next_args) @@ -750,8 +751,7 @@ start_inode_prefetch( args = calloc(1, sizeof(prefetch_args_t)); - btree_init(&args->primary_io_queue); - btree_init(&args->secondary_io_queue); + btree_init(&args->io_queue); if (pthread_mutex_init(&args->lock, NULL) != 0) do_error(_("failed to initialize prefetch mutex\n")); if (pthread_cond_init(&args->start_reading, NULL) != 0) @@ -830,8 +830,7 @@ cleanup_inode_prefetch( pthread_cond_destroy(&args->start_reading); pthread_cond_destroy(&args->start_processing); sem_destroy(&args->ra_count); - btree_destroy(args->primary_io_queue); - btree_destroy(args->secondary_io_queue); + btree_destroy(args->io_queue); free(args); } Index: xfsprogs-dev/repair/prefetch.h =================================================================== --- xfsprogs-dev.orig/repair/prefetch.h 2009-11-12 10:53:01.098026017 +0100 +++ xfsprogs-dev/repair/prefetch.h 2009-11-12 11:07:01.807004122 +0100 @@ -13,8 +13,7 @@ typedef struct prefetch_args { pthread_mutex_t lock; pthread_t queuing_thread; pthread_t io_threads[PF_THREAD_COUNT]; - struct btree_root *primary_io_queue; - struct btree_root *secondary_io_queue; + struct btree_root *io_queue; pthread_cond_t start_reading; pthread_cond_t start_processing; int agno; From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 04:18:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.8 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_14, J_CHICKENPOX_32,J_CHICKENPOX_33,J_CHICKENPOX_61,J_CHICKENPOX_62, J_CHICKENPOX_73,LOCAL_GNU_PATCH autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACAI3iT241794 for ; Thu, 12 Nov 2009 04:18:03 -0600 X-ASG-Debug-ID: 1258021102-219c01730000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 641FA1D9335E; Thu, 12 Nov 2009 02:18:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id p3hao2Lc4EU6sAiD; Thu, 12 Nov 2009 02:18:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8Wkv-0000YL-Te; Thu, 12 Nov 2009 10:18:21 +0000 Date: Thu, 12 Nov 2009 05:18:21 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , Barry Naujok , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/14] repair: track logical to physical block mapping moreeffeciently Subject: Re: [PATCH 09/14] repair: track logical to physical block mapping moreeffeciently Message-ID: <20091112101821.GC25058@infradead.org> References: <20090902175841.284697389@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEE@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEE@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258021102 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Oct 21, 2009 at 02:06:19PM -0500, Alex Elder wrote: > Christoph Hellwig wrote: > > Currently we track the logical to physical block mapping by a structure which > > contains an array of physicial blocks. This is extremly efficient and is > > Should this be "extremely inefficient?" > > > replaced with the normal starblock storage we use in the kernel and on disk > > in this patch. > > While you're at fixing the above comment, maybe just re-word this > sentence because I don't really grok it very well... Thanks, updated in the version below. > > + ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_ATTR_FORK); > > + > > if (nex < 1) > > nex = 1; > > - if ((blkmap = malloc(BLKMAP_SIZE(nex))) == NULL) { > > - do_warn(_("malloc failed in blkmap_alloc (%u bytes)\n"), > > - BLKMAP_SIZE(nex)); > > - return blkmap; > > + > > + key = whichfork ? ablkmap_key : dblkmap_key; > > + blkmap = pthread_getspecific(key); > > + if (!blkmap || blkmap->naexts < nex) { > > + blkmap = realloc(blkmap, BLKMAP_SIZE(nex)); > > Does the above really have to be a realloc() call, or can > it simply be a free()/malloc() instead? Also, could the > existing ts_alloc() function be adjusted to accomodate the > usage here? It has to be a realloc, we need to keep the existing content. We really need to do the growing based on the existing size, so ts_alloc doesn't fit. We could try to introduce a ts_realloc, but I'm not sure it's worth it. > > { > > - blkent_t **entp; > > - xfs_extnum_t i; > > - > > - if (blkmap == NULL) > > - return; > > - for (i = 0, entp = blkmap->ents; i < blkmap->nents; i++, entp++) > > - free(*entp); > > - free(blkmap); > > + /* nothing to do! - keep the memory around for the next inode */ > > Nobody ever frees it though, either. I guess it gets done at > exit but I like things tidy (could arrange for a destructor > function to be called, at pthread_key_create() time). This would complicate things quite a bit, and it would actually cause a lot more malloc/free cycles that potentially slow repair down. Right now we only have to allocate the map if the next inode has a larger extent map than the previously processed one, which means we can safe a lot of malloc/free cycles. Which still can be quite slow in multi-threaded programs. -- Subject: repair: track logical to physical block mapping more effeciently From: Barry Naujok Currently we track the logical to physical block mapping by a structure which contains an array of physicial blocks. This is extremly inefficient and is replaced with the normal startblock, length extent descriptors. In addition also use thread-local storage for the block map, this is possible because repair only processes one inode at a given time per thread, and the block map does not have to outlive the processing of a single inode. The combination of those factors means we can use pthread thread-local storage to store the block map, and we can re-use the allocation over and over again. This should be ported over to xfs_db eventually, or even better we could try to share the code. [hch: added a small fix in blkmap_set_ext to not call memmove unless needed] Signed-off-by: Barry Naujok Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Index: xfsprogs-dev/repair/bmap.c =================================================================== --- xfsprogs-dev.orig/repair/bmap.c 2009-10-19 01:55:18.807285612 +0200 +++ xfsprogs-dev/repair/bmap.c 2009-11-12 11:17:04.371006486 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001,2005,2008 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -21,106 +21,46 @@ #include "bmap.h" /* - * Block mapping code taken from xfs_db. - */ - -/* - * Append an extent to the block entry. - */ -void -blkent_append( - blkent_t **entp, - xfs_dfsbno_t b, - xfs_dfilblks_t c) -{ - blkent_t *ent; - size_t size; - int i; - - ent = *entp; - size = BLKENT_SIZE(c + ent->nblks); - if ((*entp = ent = realloc(ent, size)) == NULL) { - do_warn(_("realloc failed in blkent_append (%u bytes)\n"), - size); - return; - } - for (i = 0; i < c; i++) - ent->blks[ent->nblks + i] = b + i; - ent->nblks += c; -} - -/* - * Make a new block entry. - */ -blkent_t * -blkent_new( - xfs_dfiloff_t o, - xfs_dfsbno_t b, - xfs_dfilblks_t c) -{ - blkent_t *ent; - int i; - - if ((ent = malloc(BLKENT_SIZE(c))) == NULL) { - do_warn(_("malloc failed in blkent_new (%u bytes)\n"), - BLKENT_SIZE(c)); - return ent; - } - ent->nblks = c; - ent->startoff = o; - for (i = 0; i < c; i++) - ent->blks[i] = b + i; - return ent; -} - -/* - * Prepend an extent to the block entry. + * Track the logical to physical block mapping for inodes. + * + * Repair only processes one inode at a given time per thread, and the + * block map does not have to outlive the processing of a single inode. + * + * The combination of those factors means we can use pthreads thread-local + * storage to store the block map, and we can re-use the allocation over + * and over again. */ -void -blkent_prepend( - blkent_t **entp, - xfs_dfsbno_t b, - xfs_dfilblks_t c) -{ - int i; - blkent_t *newent; - blkent_t *oldent; - oldent = *entp; - if ((newent = malloc(BLKENT_SIZE(oldent->nblks + c))) == NULL) { - do_warn(_("malloc failed in blkent_prepend (%u bytes)\n"), - BLKENT_SIZE(oldent->nblks + c)); - *entp = newent; - return; - } - newent->nblks = oldent->nblks + c; - newent->startoff = oldent->startoff - c; - for (i = 0; i < c; i++) - newent->blks[i] = b + c; - for (; i < oldent->nblks + c; i++) - newent->blks[i] = oldent->blks[i - c]; - free(oldent); - *entp = newent; -} +pthread_key_t dblkmap_key; +pthread_key_t ablkmap_key; -/* - * Allocate a block map. - */ blkmap_t * blkmap_alloc( - xfs_extnum_t nex) + xfs_extnum_t nex, + int whichfork) { + pthread_key_t key; blkmap_t *blkmap; + ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_ATTR_FORK); + if (nex < 1) nex = 1; - if ((blkmap = malloc(BLKMAP_SIZE(nex))) == NULL) { - do_warn(_("malloc failed in blkmap_alloc (%u bytes)\n"), - BLKMAP_SIZE(nex)); - return blkmap; + + key = whichfork ? ablkmap_key : dblkmap_key; + blkmap = pthread_getspecific(key); + if (!blkmap || blkmap->naexts < nex) { + blkmap = realloc(blkmap, BLKMAP_SIZE(nex)); + if (!blkmap) { + do_warn(_("malloc failed in blkmap_alloc (%u bytes)\n"), + BLKMAP_SIZE(nex)); + return NULL; + } + pthread_setspecific(key, blkmap); + blkmap->naexts = nex; } - blkmap->naents = nex; - blkmap->nents = 0; + + blkmap->nexts = 0; return blkmap; } @@ -131,14 +71,7 @@ void blkmap_free( blkmap_t *blkmap) { - blkent_t **entp; - xfs_extnum_t i; - - if (blkmap == NULL) - return; - for (i = 0, entp = blkmap->ents; i < blkmap->nents; i++, entp++) - free(*entp); - free(blkmap); + /* nothing to do! - keep the memory around for the next inode */ } /* @@ -149,20 +82,18 @@ blkmap_get( blkmap_t *blkmap, xfs_dfiloff_t o) { - blkent_t *ent; - blkent_t **entp; + bmap_ext_t *ext = blkmap->exts; int i; - for (i = 0, entp = blkmap->ents; i < blkmap->nents; i++, entp++) { - ent = *entp; - if (o >= ent->startoff && o < ent->startoff + ent->nblks) - return ent->blks[o - ent->startoff]; + for (i = 0; i < blkmap->nexts; i++, ext++) { + if (o >= ext->startoff && o < ext->startoff + ext->blockcount) + return ext->startblock + (o - ext->startoff); } return NULLDFSBNO; } /* - * Get a chunk of entries from a block map. + * Get a chunk of entries from a block map - only used for reading dirv2 blocks */ int blkmap_getn( @@ -172,93 +103,62 @@ blkmap_getn( bmap_ext_t **bmpp, bmap_ext_t *bmpp_single) { - bmap_ext_t *bmp; - blkent_t *ent; - xfs_dfiloff_t ento; - blkent_t **entp; + bmap_ext_t *bmp = NULL; + bmap_ext_t *ext; int i; int nex; if (nb == 1) { - /* + /* * in the common case, when mp->m_dirblkfsbs == 1, * avoid additional malloc/free overhead */ bmpp_single->startblock = blkmap_get(blkmap, o); - bmpp_single->blockcount = 1; - bmpp_single->startoff = 0; - bmpp_single->flag = 0; - *bmpp = bmpp_single; - return (bmpp_single->startblock != NULLDFSBNO) ? 1 : 0; + goto single_ext; } - for (i = nex = 0, bmp = NULL, entp = blkmap->ents; - i < blkmap->nents; - i++, entp++) { - ent = *entp; - if (ent->startoff >= o + nb) + ext = blkmap->exts; + nex = 0; + for (i = 0; i < blkmap->nexts; i++, ext++) { + + if (ext->startoff >= o + nb) break; - if (ent->startoff + ent->nblks <= o) + if (ext->startoff + ext->blockcount <= o) continue; - for (ento = ent->startoff; - ento < ent->startoff + ent->nblks && ento < o + nb; - ento++) { - if (ento < o) - continue; - if (bmp && - bmp[nex - 1].startoff + bmp[nex - 1].blockcount == - ento && - bmp[nex - 1].startblock + bmp[nex - 1].blockcount == - ent->blks[ento - ent->startoff]) - bmp[nex - 1].blockcount++; - else { - bmp = realloc(bmp, ++nex * sizeof(*bmp)); - if (bmp == NULL) { - do_warn(_("blkmap_getn realloc failed" - " (%u bytes)\n"), - nex * sizeof(*bmp)); - continue; - } - bmp[nex - 1].startoff = ento; - bmp[nex - 1].startblock = - ent->blks[ento - ent->startoff]; - bmp[nex - 1].blockcount = 1; - bmp[nex - 1].flag = 0; - } + + /* + * if all the requested blocks are in one extent (also common), + * use the bmpp_single option as well + */ + if (!bmp && o >= ext->startoff && + o + nb <= ext->startoff + ext->blockcount) { + bmpp_single->startblock = + ext->startblock + (o - ext->startoff); + goto single_ext; } + + /* + * rare case - multiple extents for a single dir block + */ + bmp = malloc(nb * sizeof(bmap_ext_t)); + if (!bmp) + do_error(_("blkmap_getn malloc failed (%u bytes)\n"), + nb * sizeof(bmap_ext_t)); + + bmp[nex].startblock = ext->startblock + (o - ext->startoff); + bmp[nex].blockcount = MIN(nb, ext->blockcount - + (bmp[nex].startblock - ext->startblock)); + o += bmp[nex].blockcount; + nb -= bmp[nex].blockcount; + nex++; } *bmpp = bmp; return nex; -} - -/* - * Make a block map larger. - */ -void -blkmap_grow( - blkmap_t **blkmapp, - blkent_t **entp, - blkent_t *newent) -{ - blkmap_t *blkmap; - size_t size; - int i; - int idx; - blkmap = *blkmapp; - idx = (int)(entp - blkmap->ents); - if (blkmap->naents == blkmap->nents) { - size = BLKMAP_SIZE(blkmap->nents + 1); - if ((*blkmapp = blkmap = realloc(blkmap, size)) == NULL) { - do_warn(_("realloc failed in blkmap_grow (%u bytes)\n"), - size); - return; - } - blkmap->naents++; - } - for (i = blkmap->nents; i > idx; i--) - blkmap->ents[i] = blkmap->ents[i - 1]; - blkmap->ents[idx] = newent; - blkmap->nents++; +single_ext: + bmpp_single->blockcount = nb; + bmpp_single->startoff = 0; /* not even used by caller! */ + *bmpp = bmpp_single; + return (bmpp_single->startblock != NULLDFSBNO) ? 1 : 0; } /* @@ -268,12 +168,12 @@ xfs_dfiloff_t blkmap_last_off( blkmap_t *blkmap) { - blkent_t *ent; + bmap_ext_t *ext; - if (!blkmap->nents) + if (!blkmap->nexts) return NULLDFILOFF; - ent = blkmap->ents[blkmap->nents - 1]; - return ent->startoff + ent->nblks; + ext = blkmap->exts + blkmap->nexts - 1; + return ext->startoff + ext->blockcount; } /* @@ -285,73 +185,45 @@ blkmap_next_off( xfs_dfiloff_t o, int *t) { - blkent_t *ent; - blkent_t **entp; + bmap_ext_t *ext; - if (!blkmap->nents) + if (!blkmap->nexts) return NULLDFILOFF; if (o == NULLDFILOFF) { *t = 0; - ent = blkmap->ents[0]; - return ent->startoff; + return blkmap->exts[0].startoff; } - entp = &blkmap->ents[*t]; - ent = *entp; - if (o < ent->startoff + ent->nblks - 1) + ext = blkmap->exts + *t; + if (o < ext->startoff + ext->blockcount - 1) return o + 1; - entp++; - if (entp >= &blkmap->ents[blkmap->nents]) + if (*t >= blkmap->nexts - 1) return NULLDFILOFF; (*t)++; - ent = *entp; - return ent->startoff; + return ext[1].startoff; } /* - * Set a block value in a block map. + * Make a block map larger. */ -void -blkmap_set_blk( - blkmap_t **blkmapp, - xfs_dfiloff_t o, - xfs_dfsbno_t b) +static blkmap_t * +blkmap_grow( + blkmap_t **blkmapp) { - blkmap_t *blkmap; - blkent_t *ent; - blkent_t **entp; - blkent_t *nextent; - - blkmap = *blkmapp; - for (entp = blkmap->ents; entp < &blkmap->ents[blkmap->nents]; entp++) { - ent = *entp; - if (o < ent->startoff - 1) { - ent = blkent_new(o, b, 1); - blkmap_grow(blkmapp, entp, ent); - return; - } - if (o == ent->startoff - 1) { - blkent_prepend(entp, b, 1); - return; - } - if (o >= ent->startoff && o < ent->startoff + ent->nblks) { - ent->blks[o - ent->startoff] = b; - return; - } - if (o > ent->startoff + ent->nblks) - continue; - blkent_append(entp, b, 1); - if (entp == &blkmap->ents[blkmap->nents - 1]) - return; - ent = *entp; - nextent = entp[1]; - if (ent->startoff + ent->nblks < nextent->startoff) - return; - blkent_append(entp, nextent->blks[0], nextent->nblks); - blkmap_shrink(blkmap, &entp[1]); - return; + pthread_key_t key = dblkmap_key; + blkmap_t *blkmap = *blkmapp; + + if (pthread_getspecific(key) != blkmap) { + key = ablkmap_key; + ASSERT(pthread_getspecific(key) == blkmap); } - ent = blkent_new(o, b, 1); - blkmap_grow(blkmapp, entp, ent); + + blkmap->naexts += 4; + blkmap = realloc(blkmap, BLKMAP_SIZE(blkmap->naexts)); + if (blkmap == NULL) + do_error(_("realloc failed in blkmap_grow\n")); + *blkmapp = blkmap; + pthread_setspecific(key, blkmap); + return blkmap; } /* @@ -364,46 +236,23 @@ blkmap_set_ext( xfs_dfsbno_t b, xfs_dfilblks_t c) { - blkmap_t *blkmap; - blkent_t *ent; - blkent_t **entp; + blkmap_t *blkmap = *blkmapp; xfs_extnum_t i; - blkmap = *blkmapp; - if (!blkmap->nents) { - blkmap->ents[0] = blkent_new(o, b, c); - blkmap->nents = 1; - return; - } - entp = &blkmap->ents[blkmap->nents - 1]; - ent = *entp; - if (ent->startoff + ent->nblks == o) { - blkent_append(entp, b, c); - return; - } - if (ent->startoff + ent->nblks < o) { - ent = blkent_new(o, b, c); - blkmap_grow(blkmapp, &blkmap->ents[blkmap->nents], ent); - return; - } - for (i = 0; i < c; i++) - blkmap_set_blk(blkmapp, o + i, b + i); -} + if (blkmap->nexts == blkmap->naexts) + blkmap = blkmap_grow(blkmapp); -/* - * Make a block map smaller. - */ -void -blkmap_shrink( - blkmap_t *blkmap, - blkent_t **entp) -{ - int i; - int idx; + for (i = 0; i < blkmap->nexts; i++) { + if (blkmap->exts[i].startoff > o) { + memmove(blkmap->exts + i + 1, + blkmap->exts + i, + sizeof(bmap_ext_t) * (blkmap->nexts - i)); + break; + } + } - free(*entp); - idx = (int)(entp - blkmap->ents); - for (i = idx + 1; i < blkmap->nents; i++) - blkmap->ents[i] = blkmap->ents[i - 1]; - blkmap->nents--; + blkmap->exts[i].startoff = o; + blkmap->exts[i].startblock = b; + blkmap->exts[i].blockcount = c; + blkmap->nexts++; } Index: xfsprogs-dev/repair/bmap.h =================================================================== --- xfsprogs-dev.orig/repair/bmap.h 2009-10-19 01:55:18.824256628 +0200 +++ xfsprogs-dev/repair/bmap.h 2009-11-12 11:12:12.138274565 +0100 @@ -16,59 +16,41 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - * Block mapping code taken from xfs_db. - */ +#ifndef _XFS_REPAIR_BMAP_H +#define _XFS_REPAIR_BMAP_H /* - * Block map entry. + * Extent descriptor. */ -typedef struct blkent { +typedef struct bmap_ext { xfs_dfiloff_t startoff; - xfs_dfilblks_t nblks; - xfs_dfsbno_t blks[1]; -} blkent_t; -#define BLKENT_SIZE(n) \ - (offsetof(blkent_t, blks) + (sizeof(xfs_dfsbno_t) * (n))) + xfs_dfsbno_t startblock; + xfs_dfilblks_t blockcount; +} bmap_ext_t; /* * Block map. */ typedef struct blkmap { - int naents; - int nents; - blkent_t *ents[1]; + int naexts; + int nexts; + bmap_ext_t exts[1]; } blkmap_t; -#define BLKMAP_SIZE(n) \ - (offsetof(blkmap_t, ents) + (sizeof(blkent_t *) * (n))) -/* - * Extent descriptor. - */ -typedef struct bmap_ext { - xfs_dfiloff_t startoff; - xfs_dfsbno_t startblock; - xfs_dfilblks_t blockcount; - int flag; -} bmap_ext_t; +#define BLKMAP_SIZE(n) \ + (offsetof(blkmap_t, exts) + (sizeof(bmap_ext_t) * (n))) -void blkent_append(blkent_t **entp, xfs_dfsbno_t b, - xfs_dfilblks_t c); -blkent_t *blkent_new(xfs_dfiloff_t o, xfs_dfsbno_t b, xfs_dfilblks_t c); -void blkent_prepend(blkent_t **entp, xfs_dfsbno_t b, - xfs_dfilblks_t c); -blkmap_t *blkmap_alloc(xfs_extnum_t); +blkmap_t *blkmap_alloc(xfs_extnum_t nex, int whichfork); void blkmap_free(blkmap_t *blkmap); + +void blkmap_set_ext(blkmap_t **blkmapp, xfs_dfiloff_t o, + xfs_dfsbno_t b, xfs_dfilblks_t c); + xfs_dfsbno_t blkmap_get(blkmap_t *blkmap, xfs_dfiloff_t o); int blkmap_getn(blkmap_t *blkmap, xfs_dfiloff_t o, - xfs_dfilblks_t nb, bmap_ext_t **bmpp, + xfs_dfilblks_t nb, bmap_ext_t **bmpp, bmap_ext_t *bmpp_single); -void blkmap_grow(blkmap_t **blkmapp, blkent_t **entp, - blkent_t *newent); xfs_dfiloff_t blkmap_last_off(blkmap_t *blkmap); xfs_dfiloff_t blkmap_next_off(blkmap_t *blkmap, xfs_dfiloff_t o, int *t); -void blkmap_set_blk(blkmap_t **blkmapp, xfs_dfiloff_t o, - xfs_dfsbno_t b); -void blkmap_set_ext(blkmap_t **blkmapp, xfs_dfiloff_t o, - xfs_dfsbno_t b, xfs_dfilblks_t c); -void blkmap_shrink(blkmap_t *blkmap, blkent_t **entp); + +#endif /* _XFS_REPAIR_BMAP_H */ Index: xfsprogs-dev/repair/dinode.c =================================================================== --- xfsprogs-dev.orig/repair/dinode.c 2009-10-19 01:55:18.842284064 +0200 +++ xfsprogs-dev/repair/dinode.c 2009-11-12 11:12:12.143274713 +0100 @@ -2050,7 +2050,7 @@ process_inode_data_fork( *nextents = 1; if (dinoc->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) - *dblkmap = blkmap_alloc(*nextents); + *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents = 0; switch (dinoc->di_format) { @@ -2172,14 +2172,14 @@ process_inode_attr_fork( err = process_lclinode(mp, agno, ino, dino, XFS_ATTR_FORK); break; case XFS_DINODE_FMT_EXTENTS: - ablkmap = blkmap_alloc(*anextents); + ablkmap = blkmap_alloc(*anextents, XFS_ATTR_FORK); *anextents = 0; err = process_exinode(mp, agno, ino, dino, type, dirty, atotblocks, anextents, &ablkmap, XFS_ATTR_FORK, check_dups); break; case XFS_DINODE_FMT_BTREE: - ablkmap = blkmap_alloc(*anextents); + ablkmap = blkmap_alloc(*anextents, XFS_ATTR_FORK); *anextents = 0; err = process_btinode(mp, agno, ino, dino, type, dirty, atotblocks, anextents, &ablkmap, Index: xfsprogs-dev/repair/init.c =================================================================== --- xfsprogs-dev.orig/repair/init.c 2009-11-12 11:11:41.025026345 +0100 +++ xfsprogs-dev/repair/init.c 2009-11-12 11:12:12.143274713 +0100 @@ -24,19 +24,24 @@ #include "pthread.h" #include "avl.h" #include "dir.h" +#include "bmap.h" #include "incore.h" #include "prefetch.h" #include +/* TODO: dirbuf/freemap key usage is completely b0rked - only used for dirv1 */ static pthread_key_t dirbuf_key; static pthread_key_t dir_freemap_key; static pthread_key_t attr_freemap_key; +extern pthread_key_t dblkmap_key; +extern pthread_key_t ablkmap_key; + static void ts_alloc(pthread_key_t key, unsigned n, size_t size) { void *voidp; - voidp = malloc((n)*(size)); + voidp = calloc(n, size); if (voidp == NULL) { do_error(_("ts_alloc: cannot allocate thread specific storage\n")); /* NO RETURN */ @@ -52,6 +57,9 @@ ts_create(void) pthread_key_create(&dirbuf_key, NULL); pthread_key_create(&dir_freemap_key, NULL); pthread_key_create(&attr_freemap_key, NULL); + + pthread_key_create(&dblkmap_key, NULL); + pthread_key_create(&ablkmap_key, NULL); } void From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 04:20:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACAKg5l241942 for ; Thu, 12 Nov 2009 04:20:42 -0600 X-ASG-Debug-ID: 1258021261-50d200de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A6B157D0D3; Thu, 12 Nov 2009 02:21:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Df0kHt0ktjUqo08l; Thu, 12 Nov 2009 02:21:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8WnU-00018S-QJ; Thu, 12 Nov 2009 10:21:00 +0000 Date: Thu, 12 Nov 2009 05:21:00 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , Barry Naujok , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/14] repair: cleanup helpers for tracking block usage Subject: Re: [PATCH 10/14] repair: cleanup helpers for tracking block usage Message-ID: <20091112102100.GD25058@infradead.org> References: <20090902175841.479553130@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADF0@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADF0@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258021261 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Oct 21, 2009 at 02:33:05PM -0500, Alex Elder wrote: > > + switch (state != XR_E_UNKNOWN) { > > BUG. You mean "if (state != XR_E_UNKNOWN)"??? Oops, yes. From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 04:25:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACAPHxC242180 for ; Thu, 12 Nov 2009 04:25:17 -0600 X-ASG-Debug-ID: 1258021535-545602010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 893F9D14602; Thu, 12 Nov 2009 02:25:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id THoKyIWYDAFr1krp; Thu, 12 Nov 2009 02:25:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8Wrv-00020V-3H; Thu, 12 Nov 2009 10:25:35 +0000 Date: Thu, 12 Nov 2009 05:25:35 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , Barry Naujok , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/14] repair: switch block usage bitmap to a btree Subject: Re: [PATCH 12/14] repair: switch block usage bitmap to a btree Message-ID: <20091112102535.GA5154@infradead.org> References: <20090902175841.875447973@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADFE@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADFE@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258021536 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Oct 22, 2009 at 11:22:42AM -0500, Alex Elder wrote: > I have a few minor things I would like to see changed at some > point, but nothing looks obviously incorrect so I'll wait and > post a patch against this once it's committed. > > Here are a couple other general thoughts: > - One minor concern is that the btree code has cases in which > the peek routines don't work (when the keys_valid flag in the > btree root is zero) and this code doesn't check for that. > I'll just assume for now that never happens here. It should not happen, but yes - making this explicit would be good. > - The bitfield code used for the real-time volume map is > generally useful and could be separated into its own module. Not sure. It's really a crufty leftover. It should probably also use a btree instead, but I fear any effort spent on the RT subvolume is pretty much wasted anyway. From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 09:58:23 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACFwKTK003231 for ; Thu, 12 Nov 2009 09:58:22 -0600 X-ASG-Debug-ID: 1258041519-08f600c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC97D1862FE3 for ; Thu, 12 Nov 2009 07:58:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dzw9inNXmviakRGb for ; Thu, 12 Nov 2009 07:58:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8c4F-0008D0-DP for xfs@oss.sgi.com; Thu, 12 Nov 2009 15:58:39 +0000 Date: Thu, 12 Nov 2009 10:58:39 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/14] repair memory usage reductions Subject: Re: [PATCH 00/14] repair memory usage reductions Message-ID: <20091112155839.GA31050@infradead.org> References: <20090902175531.469184575@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090902175531.469184575@bombadil.infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258041519 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The remaining patches with the updates suggested by Alex are now available in the repair-speedup-20091112 branch of the kernel.org xfsprogs-dev git repository: http://git.kernel.org/?p=fs/xfs/xfsprogs-dev.git git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 10:04:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACG430L003610 for ; Thu, 12 Nov 2009 10:04:03 -0600 X-ASG-Debug-ID: 1258041861-5bae02e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 65730D15BF3 for ; Thu, 12 Nov 2009 08:04:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5sBAGZny7ofuTYNH for ; Thu, 12 Nov 2009 08:04:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8c9k-0001NM-F9; Thu, 12 Nov 2009 16:04:20 +0000 Date: Thu, 12 Nov 2009 11:04:20 -0500 From: Christoph Hellwig To: Nathan Scott Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] mkfs: add discard support Subject: Re: [PATCH] mkfs: add discard support Message-ID: <20091112160420.GB31050@infradead.org> References: <20091007011850.GA32032@infradead.org> <1157959921.9631254878431584.JavaMail.root@mail-au.aconex.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1157959921.9631254878431584.JavaMail.root@mail-au.aconex.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258041862 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Adding the discard helper to the platform headers now causes the build to fail for some external users of the xfs headers because off64_t doesn't exist without the large file configure magic. E.g. for xfstests: checking xfs/xfs.h usability... no checking xfs/xfs.h presence... yes configure: WARNING: xfs/xfs.h: present but cannot be compiled configure: WARNING: xfs/xfs.h: check for missing prerequisite headers? configure: WARNING: xfs/xfs.h: see the Autoconf documentation configure: WARNING: xfs/xfs.h: section "Present But Cannot Be Compiled" configure: WARNING: xfs/xfs.h: proceeding with the compiler's result checking for xfs/xfs.h... no commenting out the discard helper fixes this. We might be able to just switch to a int64_t or similar instead, even if that's a bit ugly. From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 11:54:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACHsaSP010113 for ; Thu, 12 Nov 2009 11:54:37 -0600 X-ASG-Debug-ID: 1258048495-49c0032c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 32D91D1958E for ; Thu, 12 Nov 2009 09:54:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zVqxRyZIJb6gK0KY for ; Thu, 12 Nov 2009 09:54:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8dsl-0000Hc-MJ; Thu, 12 Nov 2009 17:54:55 +0000 Date: Thu, 12 Nov 2009 12:54:55 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: XFS status update for October 2009 Subject: XFS status update for October 2009 Message-ID: <20091112175455.GA32539@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258048496 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In October we saw the Linux 2.6.32 merge window with a major XFS update. This update includes a refactoring of the inode allocator which also allows for speedups for very large filesystems, major sync fixes, updates to the fsync and O_SYNC handling which merge the two code paths into a single and more efficient one, a workaround for the VFS time stamp behavior, and of course various smaller fixes. A couple of additional fixes have been queued up for the next merge window. On the userspace side there has been a healthy activity on xfsprogs: mkfs can now discard unused sectors on SSDs and thinly provisioned storage devices and use the more generic libblkid for topology information and filesystems detection instead of the older libdisk, and the build system gained some updates to make the source package generation simpler and shared for different package types. A patch has been out to the list but yet committed to add symbol versioning to the libhandle library to make future ABI additions easier. The xfstests package only saw some minor activity with a new test case and small build system fixes. New minor releases of xfsprogs and xfsdump were tagged but not formally released after additional discussion. Instead a new major xfsprogs release is planned for next month. From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 13:06:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACJ6cNO015218 for ; Thu, 12 Nov 2009 13:06:41 -0600 X-ASG-Debug-ID: 1258052817-317902fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B5580D1DC3D for ; Thu, 12 Nov 2009 11:06:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xUvBVaKMVWwjrbA8 for ; Thu, 12 Nov 2009 11:06:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8f0T-0008Of-3P for xfs@oss.sgi.com; Thu, 12 Nov 2009 19:06:57 +0000 Date: Thu, 12 Nov 2009 14:06:57 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: check for not fully initialized inodes in xfs_ireclaim Subject: [PATCH] xfs: check for not fully initialized inodes in xfs_ireclaim Message-ID: <20091112190657.GA32110@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258052817 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add an assert for inodes not added to the inode cache in xfs_ireclaim, to make sure we're not going to introduce something like the famous nfsd inode cache bug again. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2009-11-12 17:10:20.216276486 +0100 +++ xfs/fs/xfs/xfs_iget.c 2009-11-12 17:13:27.565003964 +0100 @@ -514,17 +514,21 @@ xfs_ireclaim( { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); XFS_STATS_INC(xs_ig_reclaims); /* - * Remove the inode from the per-AG radix tree. It doesn't matter - * if it was never added to it because radix_tree_delete can deal - * with that case just fine. + * Remove the inode from the per-AG radix tree. + * + * Because radix_tree_delete won't complain even if the item was never + * added to the tree assert that it's been there before to catch + * problems with the inode life time early on. */ pag = xfs_get_perag(mp, ip->i_ino); write_lock(&pag->pag_ici_lock); - radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino)); + ASSERT(radix_tree_lookup(&pag->pag_ici_root, agino)); + radix_tree_delete(&pag->pag_ici_root, agino); write_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); From BATV+2c9f98a1cc69030df3d7+2272+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 12 13:09:14 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACJ9Ds2015595 for ; Thu, 12 Nov 2009 13:09:14 -0600 X-ASG-Debug-ID: 1258052972-417101ec0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 41B87D1DCC8 for ; Thu, 12 Nov 2009 11:09:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id t7yHJ8UZ23YNmfb5 for ; Thu, 12 Nov 2009 11:09:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N8f2x-0000DY-0q; Thu, 12 Nov 2009 19:09:31 +0000 Date: Thu, 12 Nov 2009 14:09:31 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: david@fromorbit.com X-ASG-Orig-Subj: [PATCH] xfs: improve metadata I/O merging in the elevator Subject: [PATCH] xfs: improve metadata I/O merging in the elevator Message-ID: <20091112190930.GB32110@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258052973 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I had the patch below from Dave in my queue for a while, but previously couldn't really reproduce his numbers. After some discussions of the bio types I've reteseted it again and can see constant improvements when using cfq on my large array box with it (5-10% for the sequential create workloads), but still nothing on deadline. Given that people also want it for better marking in blktrace it might be time to put it in. Comments? -- From: Dave Chinner Subject: xfs: improve metadata I/O merging in the elevator Change all async metadata buffers to use [READ|WRITE]_META I/O types so that the I/O doesn't get issued immediately. This allows merging of adjacent metadata requests but still prioritises them over bulk data. This shows a 10-15% improvement in sequential create speed of small files. Don't include the log buffers in this classification - leave them as sync types so they are issued immediately. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2009-11-12 17:10:19.852253847 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2009-11-12 17:13:55.334003777 +0100 @@ -1177,10 +1177,14 @@ _xfs_buf_ioapply( if (bp->b_flags & XBF_ORDERED) { ASSERT(!(bp->b_flags & XBF_READ)); rw = WRITE_BARRIER; - } else if (bp->b_flags & _XBF_RUN_QUEUES) { + } else if (bp->b_flags & XBF_LOG_BUFFER) { ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); bp->b_flags &= ~_XBF_RUN_QUEUES; rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC; + } else if (bp->b_flags & _XBF_RUN_QUEUES) { + ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); + bp->b_flags &= ~_XBF_RUN_QUEUES; + rw = (bp->b_flags & XBF_WRITE) ? WRITE : READ_META; } else { rw = (bp->b_flags & XBF_WRITE) ? WRITE : (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2009-11-12 17:10:19.857278370 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2009-11-12 17:13:55.334003777 +0100 @@ -55,6 +55,7 @@ typedef enum { XBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ XBF_ORDERED = (1 << 11), /* use ordered writes */ XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ + XBF_LOG_BUFFER = (1 << 13), /* this is a buffer used for the log */ /* flags used only as arguments to access routines */ XBF_LOCK = (1 << 14), /* lock requested */ Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2009-11-12 17:10:20.267254560 +0100 +++ xfs/fs/xfs/xfs_log.c 2009-11-12 17:13:55.335004184 +0100 @@ -1524,6 +1524,7 @@ xlog_sync(xlog_t *log, XFS_BUF_ZEROFLAGS(bp); XFS_BUF_BUSY(bp); XFS_BUF_ASYNC(bp); + bp->b_flags |= XBF_LOG_BUFFER; /* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case. @@ -1561,6 +1562,7 @@ xlog_sync(xlog_t *log, XFS_BUF_ZEROFLAGS(bp); XFS_BUF_BUSY(bp); XFS_BUF_ASYNC(bp); + bp->b_flags |= XBF_LOG_BUFFER; if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) XFS_BUF_ORDERED(bp); dptr = XFS_BUF_PTR(bp); From SRS0+Mqth+70+fromorbit.com=david@internode.on.net Thu Nov 12 17:46:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nACNkTuT038653 for ; Thu, 12 Nov 2009 17:46:30 -0600 X-ASG-Debug-ID: 1258069606-11b702750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AD4BC82C68 for ; Thu, 12 Nov 2009 15:46:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id u9DeByGqIVSNOMt1 for ; Thu, 12 Nov 2009 15:46:47 -0800 (PST) Received: from discord (unverified [121.44.122.247]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8277882-1927428 for multiple; Fri, 13 Nov 2009 10:16:45 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N8jND-0001PV-AC; Fri, 13 Nov 2009 10:46:43 +1100 Date: Fri, 13 Nov 2009 10:46:43 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Alex Elder , Barry Naujok , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue Subject: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue Message-ID: <20091112234643.GJ25494@discord.disaster> References: <20090902175840.740632507@bombadil.infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE83ADEB@cf--amer001e--3.americas.sgi.com> <20091112100408.GA25058@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091112100408.GA25058@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1258069608 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Nov 12, 2009 at 05:04:08AM -0500, Christoph Hellwig wrote: > On Wed, Oct 21, 2009 at 12:12:33PM -0500, Alex Elder wrote: > > - Related to the previous one--it would be good to have > > a little info about why the value 7 was chosen as the > > number of keys per node. Perhaps I just don't know > > enough of the history (or content of the upcoming > > patches). I think I can answer this one: > +/* > + * Maximum number of keys per node. Must be greater than 2 for the code > + * to work. > + */ > +#define BTREE_KEY_MAX 7 > +#define BTREE_KEY_MIN (BTREE_KEY_MAX / 2) > + > +#define BTREE_PTR_MAX (BTREE_KEY_MAX + 1) > + > +struct btree_node { > + unsigned long num_keys; > + unsigned long keys[BTREE_KEY_MAX]; > + struct btree_node *ptrs[BTREE_PTR_MAX]; > +}; BTREE_KEY_MAX = 7 results in a btree_node exactly filling a 64 byte cacheline on 32 bit, and 2 cachelines on 64 bit. Cacheline aligned and sized nodes minimises the number of cache misses when traversing/searching the btree.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bnaujok@optusnet.com.au Thu Nov 12 18:17:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00, MSGID_FROM_MTA_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAD0HdXR041264 for ; Thu, 12 Nov 2009 18:17:39 -0600 X-ASG-Debug-ID: 1258071476-74c401ae0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail07.syd.optusnet.com.au (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5496F1867D1C; Thu, 12 Nov 2009 16:17:56 -0800 (PST) Received: from mail07.syd.optusnet.com.au (mail07.syd.optusnet.com.au [211.29.132.188]) by cuda.sgi.com with ESMTP id mpBoCgVytM5YsZ9M; Thu, 12 Nov 2009 16:17:56 -0800 (PST) Received: from localhost.localdomain (webmail09.syd.optusnet.com.au [211.29.132.123]) by mail07.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id nAD0Heww013746; Fri, 13 Nov 2009 11:17:41 +1100 Message-Id: <200911130017.nAD0Heww013746@mail07.syd.optusnet.com.au> Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.420 (Entity 5.420) Received: from 203-206-165-193.perm.iinet.net.au ([203.206.165.193]) by webmail09.syd.optusnet.com.au with http (user=bnaujok@optusnet.com.au); Fri, 13 Nov 2009 11:17:40 +1100 From: Barry Naujok To: Christoph Hellwig Cc: Alex Elder , Barry Naujok , xfs@oss.sgi.com Date: Fri, 13 Nov 2009 11:17:40 +1100 X-ASG-Orig-Subj: Re: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue Subject: Re: Re: [PATCH 06/14] repair: use a btree instead of a radix tree for theprefetch queue X-Barracuda-Connect: mail07.syd.optusnet.com.au[211.29.132.188] X-Barracuda-Start-Time: 1258071478 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.53 X-Barracuda-Spam-Status: No, SCORE=-0.53 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > Christoph Hellwig wrote: > > On Wed, Oct 21, 2009 at 12:12:33PM -0500, Alex Elder wrote: > > - I accept that this uses less memory for sparsely populated > > key space than radix trees; but it would be nice if that > > could be characterized a bit more precisely (i.e., what > > will the range of values that'll be represented be, just > > how sparse is it, and at what point does this really > > pay off?). > > - Related to the previous one--it would be good to have > > a little info about why the value 7 was chosen as the > > number of keys per node. Perhaps I just don't know > > enough of the history (or content of the upcoming > > patches). > > Maybe Barry still remembers some of this. I've added his current > personal address to the Cc list. Radix tree was instantly dismissed as during my early testing, it actually used more memory than the original flat array on a large filesystem! I experimented with different values for the key, it didn't make a huge difference. A short node involves less memory copying and more node splitting and merging and tree traversals. Bigger nodes, a lot more memory copying when inserting and deleting entries. No clear winner - can tune it for specific workloads though (and what Dave Chinner said is correct too and started as my basis). Barry. From sasayaki_fukuyama@mail.goo.ne.jp Fri Nov 13 03:00:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=BAYES_50,TVD_SPACE_RATIO autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAD90f3t085443 for ; Fri, 13 Nov 2009 03:00:42 -0600 X-ASG-Debug-ID: 1258102856-706b00000000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.goo.ne.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 13F7583A8A for ; Fri, 13 Nov 2009 01:00:57 -0800 (PST) Received: from mail.goo.ne.jp ([124.234.110.142]) by cuda.sgi.com with SMTP id YGZDHgIswCtAdwhq for ; Fri, 13 Nov 2009 01:00:57 -0800 (PST) To: From: =?iso-2022-jp?B?GyRCM3Q8MEBoSipFajtxJTslXyVKITwhJkohOzMbKEI=?= X-ASG-Orig-Subj: =?iso-2022-jp?B?RlgbJEI8K0YwR2RHYyU3JTklRiVgIVYbKEJpIEJhbmRzGyRCIVdMNT1+R1tJWyQsPTVLdiRLJE89KiRvJGokPSQmJEckOSEqGyhC?= Subject: =?iso-2022-jp?B?RlgbJEI8K0YwR2RHYyU3JTklRiVgIVYbKEJpIEJhbmRzGyRCIVdMNT1+R1tJWyQsPTVLdiRLJE89KiRvJGokPSQmJEckOSEqGyhC?= MIME-Version: 1.0 Reply-To: Date: Fri, 13 Nov 2009 18:00:57 +0900 Content-Type:text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[124.234.110.142] X-Barracuda-Start-Time: 1258102859 Message-Id: <20091113090057.13F7583A8A@cuda.sgi.com> X-Barracuda-Bayes: INNOCENT GLOBAL 0.1213 1.0000 -1.2666 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.17 X-Barracuda-Spam-Status: No, SCORE=-0.17 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14501 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean $B!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a(B $B"!3t<0@hJ*Ej;q%a!<%k%;%_%J!<"!(B $B!X%+%j%9%^Ej;q%3%s%5%k%?%s%H!!J!;3(B $BN40lO:$N$5$5$d$-!Y(B $B!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a(B $B$3$s$K$A$O!#(B $BEj;q%3%s%5%k%?%s%H$NJ!;3(B $BN40lO:$G$9!#(B $BA02s;d$,(BFX$B$K4X$9$k!HM-1W>pJs!I$H$7$F(B $B$4>R2p$5$;$F$$$?$@$-$^$7$?(B $B#F#X$N<+F0GdGc%7%9%F%`!V(Bi Bands$B!J%"%$%P%s%:!K!W$NL5=~G[I[$,(B $BEv=iL5NA$*;n$7HG$NG[I[?tNL#3#0#0K\$NM=Dj$r(B $B$4MWK>$,Hs>o$KB?$$$?$a#1#0#0#0K\$K6[5^A}OH$7$^$7$?$,(B $B:#=5Kv$K$b=*$o$j$=$&$G$9!#(B $B"*(B http://www.ibands-fx.com/demo.html $B$9$G$KL5NA$*;n$7HG$r;n$7$F$$$?$@$$$F$*$j$^$9J}$+$i(B $B!V@55,HG$N9XF~$O4{$K7h$a$F$*$j$^$9!*!W(B $B!V@55,HG$O$$$DH/Gd$G$9$+!)!)!W(B $B$H$$$&%a!<%k$b$?$/$5$s$"$k$=$&$G$9$,!"(B $B@55,HG$NHNGd$O!"(B $BL5NA$*;n$7HG$r;n$7$F$$$?$@$$$?J}$@$1$K$7$+HNGd$7$^$;$s!#(B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $B$4G$5$l$kJ}$O(B http://cancellation333.com/ryuichiro/tourokukaijyo.html ------------------------------------------------------------ From favour_agurma@ecunet.org Fri Nov 13 06:16:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_73, J_CHICKENPOX_74,MISSING_HEADERS autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nADCFxxe101661 for ; Fri, 13 Nov 2009 06:16:00 -0600 X-ASG-Debug-ID: 1258114577-16f602bc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail2.ecunet.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1FF7ED22631 for ; Fri, 13 Nov 2009 04:16:17 -0800 (PST) Received: from mail2.ecunet.org (mail2.ecunet.org [72.250.175.188]) by cuda.sgi.com with ESMTP id x6USxqGxRE41YNdA for ; Fri, 13 Nov 2009 04:16:17 -0800 (PST) Received: from ecunet.org (ecunet-mail-1 [192.168.0.90]) by mail2.ecunet.org (8.13.8/8.13.8) with ESMTP id nADBmLNe027010; Fri, 13 Nov 2009 06:48:21 -0500 Received-SPF: pass (ecunet.org: 192.168.0.92 is whitelisted) receiver=ecunet.org; client-ip=192.168.0.92; helo=ecunet-web-1.ecunet.org; envelope-from=favour_agurma@ecunet.org; x-software=spfmilter 0.97 http://www.acme.com/software/spfmilter/ with libspf2-1.0.0; Received: from ecunet-web-1.ecunet.org (ecunet-web-1 [192.168.0.92]) by ecunet.org (8.14.1/8.14.1) with ESMTP id nADCAdv8001819; Fri, 13 Nov 2009 07:10:39 -0500 Received: from ecunet-web-1.ecunet.org (localhost.localdomain [127.0.0.1]) by ecunet-web-1.ecunet.org (8.13.8/8.13.8) with ESMTP id nADCAec5004952; Fri, 13 Nov 2009 07:10:40 -0500 Received: (from httpd@localhost) by ecunet-web-1.ecunet.org (8.13.8/8.13.8/Submit) id nADCATKw004888; Fri, 13 Nov 2009 07:10:29 -0500 Date: Fri, 13 Nov 2009 07:10:29 -0500 Message-Id: <200911131210.nADCATKw004888@ecunet-web-1.ecunet.org> From: favour_agurma@ecunet.org Bcc: X-ASG-Orig-Subj: hello my dear Subject: hello my dear X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.0 (ecunet.org [192.168.0.90]); Fri, 13 Nov 2009 07:10:39 -0500 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: ClamAV version 0.92, clamav-milter version 0.92 on ecunet-mail-1 X-Virus-Status: Clean X-Barracuda-Connect: mail2.ecunet.org[72.250.175.188] X-Barracuda-Start-Time: 1258114579 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4678 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, NO_REAL_NAME, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header hello my dear How are you doing today, hope fine? My name is favour. I just came across your profile here and after going through it l found you interesting hope you don't mind. If you feel like knowing more about me and for me to send you my picture,you can send me mail at (agurmafavour@yahoo.com Hope to hear from you soon and remember that distance or colour doesn't matter but real love matters,have a nice day. miss favour From rogerios@urbi.com.br Fri Nov 13 16:33:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nADMXWQM139664 for ; Fri, 13 Nov 2009 16:33:33 -0600 X-ASG-Debug-ID: 1258151629-5a0a01cc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from muttley.urbi.com.br (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B4F6C884BD; Fri, 13 Nov 2009 14:33:50 -0800 (PST) Received: from muttley.urbi.com.br (smtp.urbi.com.br [200.152.50.27]) by cuda.sgi.com with ESMTP id Ksa2eBtKLZU38fZy; Fri, 13 Nov 2009 14:33:50 -0800 (PST) Received: from urbi.com.br (mx.urbi.com.br [200.152.50.20]) by muttley.urbi.com.br (8.12.11/8.12.11) with ESMTP id nABFGbIQ013050; Wed, 11 Nov 2009 13:16:37 -0200 From: "rogerios" Reply-To: mr.johnsonloanlender01@gmail.com X-ASG-Orig-Subj: new dawn Subject: new dawn Date: Wed, 11 Nov 2009 15:16:36 +0000 Message-Id: <20091111143616.M4625@live.com> X-Mailer: Open WebMail 2.51 20050627 X-OriginatingIP: 41.220.75.16 (rogerios) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Barracuda-Connect: smtp.urbi.com.br[200.152.50.27] X-Barracuda-Start-Time: 1258151632 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From ux80k5ke@sina.com Fri Nov 13 19:19:38 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_50,HTML_MESSAGE, MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAE1JarM148668 for ; Fri, 13 Nov 2009 19:19:38 -0600 X-ASG-Debug-ID: 1258161591-1ac100210000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail2-121.sinamail.sina.com.cn (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B8CE31878869 for ; Fri, 13 Nov 2009 17:19:52 -0800 (PST) Received: from mail2-121.sinamail.sina.com.cn (r2-121.sinamail.sina.com.cn [60.28.2.121]) by cuda.sgi.com with ESMTP id 5WMQzHdT0FsLfFCF for ; Fri, 13 Nov 2009 17:19:52 -0800 (PST) Received: by mail2-121.sinamail.sina.com.cn (Postfix, from userid 99) id C58F72F715C; Sat, 14 Nov 2009 09:19:50 +0800 (CST) Received: from ux80k5ke@sina.com([113.91.12.51]) by mail2-121.sinamail.sina.com.cn via HTTP; Sat, 14 Nov 2009 09:19:50 +0800 (CST) Date: Sat, 14 Nov 2009 09:19:50 +0800 From: ux80k5ke@sina.com To: linthan@163.com X-ASG-Orig-Subj: =?UTF-8?B?5byA5ouT6L+b5Y+W7oKL?= Subject: =?UTF-8?B?5byA5ouT6L+b5Y+W7oKL?= MIME-Version: 1.0 X-Priority: 3 X-MessageID: 1258161590.76.91169 X-OriginaIP: 60.28.2.121 X-Mailer: Sina WebMail 4.0 Content-Type: multipart/mixed; boundary="=-sinamail_mix_a6cce1b291f94e5366e9c624ab1a23cd" Message-Id: <20091114011950.C58F72F715C@mail2-121.sinamail.sina.com.cn> X-Barracuda-Connect: r2-121.sinamail.sina.com.cn[60.28.2.121] X-Barracuda-Start-Time: 1258161595 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5045 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14564 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --=-sinamail_mix_a6cce1b291f94e5366e9c624ab1a23cd Content-Type: multipart/alternative; boundary="=-sinamail_alt_23dd624e6e23c44d5694fc0ed6d12afe" --=-sinamail_alt_23dd624e6e23c44d5694fc0ed6d12afe Content-Type: text/plain; charset=GBK Content-Transfer-Encoding: base64 Content-Disposition: inline v6rN2L34yKGwzSA= --=-sinamail_alt_23dd624e6e23c44d5694fc0ed6d12afe Content-Type: text/html; charset=GBK Content-Transfer-Encoding: base64 Content-Disposition: inline v6rN2L34yKGwzSA= --=-sinamail_alt_23dd624e6e23c44d5694fc0ed6d12afe-- --=-sinamail_mix_a6cce1b291f94e5366e9c624ab1a23cd Content-Type: image/pjpeg; name="=?GBK?B?Yi5qcGc=?=" Content-Disposition: attachment; filename="=?GBK?B?Yi5qcGc=?=" Content-Transfer-Encoding: base64 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 yLn/2Q== --=-sinamail_mix_a6cce1b291f94e5366e9c624ab1a23cd-- From liuming421@gmail.com Fri Nov 13 22:05:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAE455oA156536 for ; Fri, 13 Nov 2009 22:05:05 -0600 X-ASG-Debug-ID: 1258171524-447802110000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-px0-f199.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10C9089260 for ; Fri, 13 Nov 2009 20:05:24 -0800 (PST) Received: from mail-px0-f199.google.com (mail-px0-f199.google.com [209.85.216.199]) by cuda.sgi.com with ESMTP id s5ODQ71mWZA5UrtQ for ; Fri, 13 Nov 2009 20:05:24 -0800 (PST) Received: by pxi37 with SMTP id 37so2652345pxi.20 for ; Fri, 13 Nov 2009 20:05:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=ddAxbAaFjrN6tOHW+TxAu9bdXmj79MbM05i5PCNm7g4=; b=xUoQbZ2aMw3YcV87qALf+/Eah80TYWl5uE3yjAfhA+F0n2531nazGgl9HxUt9RJOms JAYfMFMGmjqZKTJcQWdPOKPcpNVcJDk6ICkcg+o6AWeuY13Zd7Ag45ZFROSQLL1uK9WQ yHbuokWGqsYVmfLdjMkggs/V0cAf2B/gUYRM0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=i7xEzBEH1vCVSDEMBSBLhCxeo3i/vxIz8PUmlaT09eVTeUMQ+eb/VDtLC1qhaGUbwg BfsAhhIiQqZcQgNRJUlF5VQs5btFf58buD3zh3NnsASIRStAGZBuKavi5xR1wkOab5zl AVkaoxZbG54YSi/PygagdxR/eBhJhziTvIGaA= MIME-Version: 1.0 Received: by 10.114.164.20 with SMTP id m20mr8809948wae.216.1258171523704; Fri, 13 Nov 2009 20:05:23 -0800 (PST) Date: Sat, 14 Nov 2009 12:05:23 +0800 Message-ID: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> X-ASG-Orig-Subj: install xfs Subject: install xfs From: ming liu To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001636e0b98dbca65904784ce29c X-Barracuda-Connect: mail-px0-f199.google.com[209.85.216.199] X-Barracuda-Start-Time: 1258171525 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4926 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14574 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001636e0b98dbca65904784ce29c Content-Type: text/plain; charset=ISO-8859-1 In 32-bit operating system to install xfs do? --001636e0b98dbca65904784ce29c Content-Type: text/html; charset=ISO-8859-1 In 32-bit operating system to install xfs do? --001636e0b98dbca65904784ce29c-- From eflorac@intellique.com Sat Nov 14 03:54:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAE9sASY175912 for ; Sat, 14 Nov 2009 03:54:11 -0600 X-ASG-Debug-ID: 1258192464-639f00310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0EA4889565 for ; Sat, 14 Nov 2009 01:54:28 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id qQtz5ZAipoqn64oD for ; Sat, 14 Nov 2009 01:54:28 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id 74806D480F7; Sat, 14 Nov 2009 10:54:21 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id 6CFF1D480AB; Sat, 14 Nov 2009 10:54:19 +0100 (CET) Date: Sat, 14 Nov 2009 10:54:17 +0100 From: Emmanuel Florac To: ming liu Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: install xfs Subject: Re: install xfs Message-ID: <20091114105417.29066860@galadriel.home> In-Reply-To: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> References: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1258192470 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14596 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sat, 14 Nov 2009 12:05:23 +0800 vous =E9criviez: > In 32-bit operating system to install xfs do? All Linux distributions except RedHat and derivatives (CentOS, Fedora) come with XFS included. --=20 -------------------------------------------------- Emmanuel Florac www.intellique.com =20 -------------------------------------------------- From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHf3r193821 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215482-75e503ac0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3CC9E1D976F2 for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oNHHZyjUjttFLOxA for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK5-0004X7-T7 for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:01 +0000 Message-Id: <20091114161801.818601601@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:21 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/7] xfs: uninline xfs_get_extsz_hint Subject: [PATCH 4/7] xfs: uninline xfs_get_extsz_hint References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-uninline-xfs_get_extsz_hint X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215482 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This function is too large to efficiently be inlined. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2009-11-12 17:14:15.278004428 +0100 +++ xfs/fs/xfs/xfs_rw.c 2009-11-12 17:18:33.311004263 +0100 @@ -336,3 +336,25 @@ xfs_bwrite( } return (error); } + +/* + * helper function to extract extent size hint from inode + */ +xfs_extlen_t +xfs_get_extsz_hint( + struct xfs_inode *ip) +{ + xfs_extlen_t extsz; + + if (unlikely(XFS_IS_REALTIME_INODE(ip))) { + extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) + ? ip->i_d.di_extsize + : ip->i_mount->m_sb.sb_rextsize; + ASSERT(extsz); + } else { + extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) + ? ip->i_d.di_extsize : 0; + } + + return extsz; +} Index: xfs/fs/xfs/xfs_rw.h =================================================================== --- xfs.orig/fs/xfs/xfs_rw.h 2009-11-09 17:06:46.116004228 +0100 +++ xfs/fs/xfs/xfs_rw.h 2009-11-12 17:18:33.311004263 +0100 @@ -37,27 +37,6 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_ } /* - * helper function to extract extent size hint from inode - */ -STATIC_INLINE xfs_extlen_t -xfs_get_extsz_hint( - xfs_inode_t *ip) -{ - xfs_extlen_t extsz; - - if (unlikely(XFS_IS_REALTIME_INODE(ip))) { - extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) - ? ip->i_d.di_extsize - : ip->i_mount->m_sb.sb_rextsize; - ASSERT(extsz); - } else { - extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) - ? ip->i_d.di_extsize : 0; - } - return extsz; -} - -/* * Prototypes for functions in xfs_rw.c. */ extern int xfs_write_clear_setuid(struct xfs_inode *ip); @@ -69,5 +48,6 @@ extern int xfs_read_buf(struct xfs_mount struct xfs_buf **bpp); extern void xfs_ioerror_alert(char *func, struct xfs_mount *mp, xfs_buf_t *bp, xfs_daddr_t blkno); +extern xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); #endif /* __XFS_RW_H__ */ From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHf9U193815 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215481-75e303b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B265C1D976F2 for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oOheXPTJMnw97I4b for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK5-0004V4-BR for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:01 +0000 Message-Id: <20091114161801.238873282@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:18 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/7] xfs: remove IO_ISAIO Subject: [PATCH 1/7] xfs: remove IO_ISAIO References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-IO_ISAIO X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215481 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean We set this flag for all read/write I/O since early Linux 2.6.x. Remove it as it has lost it's purpose long ago. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2009-10-11 14:25:17.496003686 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2009-11-12 17:14:06.160023109 +0100 @@ -52,7 +52,7 @@ xfs_file_aio_read( loff_t pos) { struct file *file = iocb->ki_filp; - int ioflags = IO_ISAIO; + int ioflags = 0; BUG_ON(iocb->ki_pos != pos); if (unlikely(file->f_flags & O_DIRECT)) @@ -71,7 +71,7 @@ xfs_file_aio_write( loff_t pos) { struct file *file = iocb->ki_filp; - int ioflags = IO_ISAIO; + int ioflags = 0; BUG_ON(iocb->ki_pos != pos); if (unlikely(file->f_flags & O_DIRECT)) Index: xfs/fs/xfs/linux-2.6/xfs_lrw.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.c 2009-11-12 17:10:19.909278501 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_lrw.c 2009-11-12 17:14:06.161003891 +0100 @@ -255,8 +255,6 @@ xfs_read( iocb->ki_pos = *offset; ret = generic_file_aio_read(iocb, iovp, segs, *offset); - if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO)) - ret = wait_on_sync_kiocb(iocb); if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); @@ -774,9 +772,6 @@ write_retry: current->backing_dev_info = NULL; - if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO)) - ret = wait_on_sync_kiocb(iocb); - isize = i_size_read(inode); if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) *offset = isize; Index: xfs/fs/xfs/linux-2.6/xfs_vnode.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_vnode.h 2009-11-12 17:10:19.942276910 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_vnode.h 2009-11-12 17:14:06.161003891 +0100 @@ -36,7 +36,6 @@ struct attrlist_cursor_kern; /* * Flags for read/write calls - same values as IRIX */ -#define IO_ISAIO 0x00001 /* don't wait for completion */ #define IO_ISDIRECT 0x00004 /* bypass page cache */ #define IO_INVIS 0x00020 /* don't update inode timestamps */ From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_74 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHfHQ193823 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215482-6848002b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6CA621D976FA for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oQCcAfr36cw6QzzB for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK6-0004Xk-2f for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:02 +0000 Message-Id: <20091114161801.978180093@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:22 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/7] xfs: kill the STATIC_INLINE macro Subject: [PATCH 5/7] xfs: kill the STATIC_INLINE macro References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-STATIC_INLINE X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215482 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove our own STATIC_INLINE macro. For small function inside implementation files just use STATIC and let gcc inline it, and for those in headers do the normal static inline - they are all small enough to be inlined for debug builds, too. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2009-11-12 17:10:19.847273603 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2009-11-12 17:18:51.342254266 +0100 @@ -337,7 +337,7 @@ xfs_map_blocks( return -xfs_iomap(XFS_I(inode), offset, count, flags, mapp, &nmaps); } -STATIC_INLINE int +STATIC int xfs_iomap_valid( xfs_iomap_t *iomapp, loff_t offset) Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2009-11-12 17:13:55.334003777 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2009-11-12 17:18:51.343279047 +0100 @@ -149,7 +149,7 @@ page_region_mask( return mask; } -STATIC_INLINE void +STATIC void set_page_region( struct page *page, size_t offset, @@ -161,7 +161,7 @@ set_page_region( SetPageUptodate(page); } -STATIC_INLINE int +STATIC int test_page_region( struct page *page, size_t offset, @@ -1113,7 +1113,7 @@ xfs_bdwrite( xfs_buf_delwri_queue(bp, 1); } -STATIC_INLINE void +STATIC void _xfs_buf_ioend( xfs_buf_t *bp, int schedule) Index: xfs/fs/xfs/support/debug.h =================================================================== --- xfs.orig/fs/xfs/support/debug.h 2009-09-02 02:34:18.083957167 +0200 +++ xfs/fs/xfs/support/debug.h 2009-11-12 17:18:51.346291303 +0100 @@ -41,10 +41,6 @@ extern void assfail(char *expr, char *f, # define STATIC static noinline #endif -#ifndef STATIC_INLINE -# define STATIC_INLINE static inline -#endif - #else /* DEBUG */ #define ASSERT(expr) \ @@ -54,19 +50,5 @@ extern void assfail(char *expr, char *f, # define STATIC noinline #endif -/* - * We stop inlining of inline functions in debug mode. - * Unfortunately, this means static inline in header files - * get multiple definitions, so they need to remain static. - * This then gives tonnes of warnings about unused but defined - * functions, so we need to add the unused attribute to prevent - * these spurious warnings. - */ -#ifndef STATIC_INLINE -# define STATIC_INLINE static __attribute__ ((unused)) noinline -#endif - #endif /* DEBUG */ - - #endif /* __XFS_SUPPORT_DEBUG_H__ */ Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2009-11-12 17:10:20.365276128 +0100 +++ xfs/fs/xfs/xfs_attr_leaf.c 2009-11-12 17:18:51.352004530 +0100 @@ -98,7 +98,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_att * If namespace bits don't match return 0. * If all match then return 1. */ -STATIC_INLINE int +STATIC int xfs_attr_namesp_match(int arg_flags, int ondisk_flags) { return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2009-11-12 17:10:20.092263270 +0100 +++ xfs/fs/xfs/xfs_bmap_btree.c 2009-11-12 17:18:51.355004214 +0100 @@ -98,8 +98,7 @@ xfs_bmdr_to_bmbt( * This code must be in sync with the routines xfs_bmbt_get_startoff, * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state. */ - -STATIC_INLINE void +STATIC void __xfs_bmbt_get_all( __uint64_t l0, __uint64_t l1, Index: xfs/fs/xfs/xfs_filestream.h =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.h 2009-08-27 03:51:46.093856009 +0200 +++ xfs/fs/xfs/xfs_filestream.h 2009-11-12 17:18:51.357025561 +0100 @@ -79,7 +79,7 @@ extern ktrace_t *xfs_filestreams_trace_b * the cache that reference per-ag array elements that have since been * reallocated. */ -STATIC_INLINE int +static inline int xfs_filestream_peek_ag( xfs_mount_t *mp, xfs_agnumber_t agno) @@ -87,7 +87,7 @@ xfs_filestream_peek_ag( return atomic_read(&mp->m_perag[agno].pagf_fstrms); } -STATIC_INLINE int +static inline int xfs_filestream_get_ag( xfs_mount_t *mp, xfs_agnumber_t agno) @@ -95,7 +95,7 @@ xfs_filestream_get_ag( return atomic_inc_return(&mp->m_perag[agno].pagf_fstrms); } -STATIC_INLINE int +static inline int xfs_filestream_put_ag( xfs_mount_t *mp, xfs_agnumber_t agno) @@ -122,7 +122,7 @@ int xfs_filestream_new_ag(struct xfs_bma /* filestreams for the inode? */ -STATIC_INLINE int +static inline int xfs_inode_is_filestream( struct xfs_inode *ip) { Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2009-11-09 17:06:46.115004101 +0100 +++ xfs/fs/xfs/xfs_ialloc.c 2009-11-12 17:18:51.362006363 +0100 @@ -425,7 +425,7 @@ xfs_ialloc_ag_alloc( return 0; } -STATIC_INLINE xfs_agnumber_t +STATIC xfs_agnumber_t xfs_ialloc_next_ag( xfs_mount_t *mp) { Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2009-11-12 17:10:20.296276205 +0100 +++ xfs/fs/xfs/xfs_mount.c 2009-11-12 17:18:51.367005882 +0100 @@ -2123,7 +2123,7 @@ xfs_icsb_destroy_counters( mutex_destroy(&mp->m_icsb_mutex); } -STATIC_INLINE void +STATIC void xfs_icsb_lock_cntr( xfs_icsb_cnts_t *icsbp) { @@ -2132,7 +2132,7 @@ xfs_icsb_lock_cntr( } } -STATIC_INLINE void +STATIC void xfs_icsb_unlock_cntr( xfs_icsb_cnts_t *icsbp) { @@ -2140,7 +2140,7 @@ xfs_icsb_unlock_cntr( } -STATIC_INLINE void +STATIC void xfs_icsb_lock_all_counters( xfs_mount_t *mp) { @@ -2153,7 +2153,7 @@ xfs_icsb_lock_all_counters( } } -STATIC_INLINE void +STATIC void xfs_icsb_unlock_all_counters( xfs_mount_t *mp) { Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2009-09-16 14:36:18.022004650 +0200 +++ xfs/fs/xfs/xfs_mount.h 2009-11-12 17:18:51.369006416 +0100 @@ -387,13 +387,13 @@ xfs_put_perag(struct xfs_mount *mp, xfs_ * Per-cpu superblock locking functions */ #ifdef HAVE_PERCPU_SB -STATIC_INLINE void +static inline void xfs_icsb_lock(xfs_mount_t *mp) { mutex_lock(&mp->m_icsb_mutex); } -STATIC_INLINE void +static inline void xfs_icsb_unlock(xfs_mount_t *mp) { mutex_unlock(&mp->m_icsb_mutex); From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_22, J_CHICKENPOX_25 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHgkq193827 for ; Sat, 14 Nov 2009 10:17:44 -0600 X-ASG-Debug-ID: 1258215482-335501420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0484914DD44B for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id o0nJvNzD7vO9fFXG for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK6-0004Yn-En for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:02 +0000 Message-Id: <20091114161802.343652891@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:24 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/7] xfs: cleanup dmapi macros in the umount path Subject: [PATCH 7/7] xfs: cleanup dmapi macros in the umount path References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=unmount-dmapi-cleanup X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215483 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stop the flag saving as we never mangle those in the unmount path, and hide all the weird arguents to the dmapi code inside the XFS_SEND_PREUNMOUNT / XFS_SEND_UNMOUNT macros. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-11-12 17:10:19.920254621 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-11-12 17:23:54.929032604 +0100 @@ -1131,8 +1131,6 @@ xfs_fs_put_super( struct super_block *sb) { struct xfs_mount *mp = XFS_M(sb); - struct xfs_inode *rip = mp->m_rootip; - int unmount_event_flags = 0; xfs_syncd_stop(mp); @@ -1148,20 +1146,7 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } -#ifdef HAVE_DMAPI - if (mp->m_flags & XFS_MOUNT_DMAPI) { - unmount_event_flags = - (mp->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? - 0 : DM_FLAGS_UNWANTED; - /* - * Ignore error from dmapi here, first unmount is not allowed - * to fail anyway, and second we wouldn't want to fail a - * unmount because of dmapi. - */ - XFS_SEND_PREUNMOUNT(mp, rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, unmount_event_flags); - } -#endif + XFS_SEND_PREUNMOUNT(mp); /* * Blow away any referenced inode in the filestreams cache. @@ -1172,10 +1157,7 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - if (mp->m_flags & XFS_MOUNT_DMAPI) { - XFS_SEND_UNMOUNT(mp, rip, DM_RIGHT_NULL, 0, 0, - unmount_event_flags); - } + XFS_SEND_UNMOUNT(mp); xfs_unmountfs(mp); xfs_freesb(mp); Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2009-11-12 17:18:51.369006416 +0100 +++ xfs/fs/xfs/xfs_mount.h 2009-11-12 17:23:01.626024632 +0100 @@ -93,6 +93,9 @@ typedef struct xfs_dmops { xfs_send_unmount_t xfs_send_unmount; } xfs_dmops_t; +#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ + (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) + #define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) #define XFS_SEND_MMAP(mp, vma,fl) \ @@ -101,12 +104,24 @@ typedef struct xfs_dmops { (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_PREUNMOUNT(mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT,mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) #define XFS_SEND_MOUNT(mp,right,path,name) \ (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_UNMOUNT(mp, ip,right,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl) +#define XFS_SEND_PREUNMOUNT(mp) \ +do { \ + if (mp->m_flags & XFS_MOUNT_DMAPI) { \ + (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ + (mp)->m_rootip, DM_RIGHT_NULL, \ + (mp)->m_rootip, DM_RIGHT_NULL, \ + NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ + } \ +} while (0) +#define XFS_SEND_UNMOUNT(mp) \ +do { \ + if (mp->m_flags & XFS_MOUNT_DMAPI) { \ + (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ + DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ + } \ +} while (0) #ifdef HAVE_PERCPU_SB From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHfHq193824 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215482-75e703d50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 934AB1D976F2 for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8F4Pp2lBCAf4UNPg for ; Sat, 14 Nov 2009 08:18:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK6-0004YH-99 for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:02 +0000 Message-Id: <20091114161802.164659630@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/7] xfs: remove incorrect sparse annotation for xfs_iget_cache_miss Subject: [PATCH 6/7] xfs: remove incorrect sparse annotation for xfs_iget_cache_miss References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-sparse-fix X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215482 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_iget_cache_miss does not get called with the pag_ici_lock held, so the __releases annotation is incorrect. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2009-11-12 17:13:27.565003964 +0100 +++ xfs/fs/xfs/xfs_iget.c 2009-11-12 17:19:14.801254179 +0100 @@ -293,7 +293,7 @@ xfs_iget_cache_miss( struct xfs_inode **ipp, xfs_daddr_t bno, int flags, - int lock_flags) __releases(pag->pag_ici_lock) + int lock_flags) { struct xfs_inode *ip; int error; From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_65 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHfv4193817 for ; Sat, 14 Nov 2009 10:17:47 -0600 X-ASG-Debug-ID: 1258215481-3ce402f40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DACD089D09 for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Uy8nbzKLJxbhx5g0 for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK5-0004Vb-Gt for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:01 +0000 Message-Id: <20091114161801.411213050@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:19 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read Subject: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xfs_buf_read X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215481 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The two interfaces are highl confusing as they do have a flags argument which gets ignored and replaced with default flags. Switch the few remaining callers to use xfs_buf_get_flags and xfs_buf_read_flags instead and remove these wrappers. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2009-11-12 17:13:55.334003777 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2009-11-12 17:17:21.873006402 +0100 @@ -189,13 +189,8 @@ extern xfs_buf_t *_xfs_buf_find(xfs_buft extern xfs_buf_t *xfs_buf_get_flags(xfs_buftarg_t *, xfs_off_t, size_t, xfs_buf_flags_t); -#define xfs_buf_get(target, blkno, len, flags) \ - xfs_buf_get_flags((target), (blkno), (len), XBF_LOCK | XBF_MAPPED) - extern xfs_buf_t *xfs_buf_read_flags(xfs_buftarg_t *, xfs_off_t, size_t, xfs_buf_flags_t); -#define xfs_buf_read(target, blkno, len, flags) \ - xfs_buf_read_flags((target), (blkno), (len), XBF_LOCK | XBF_MAPPED) extern xfs_buf_t *xfs_buf_get_empty(size_t, xfs_buftarg_t *); extern xfs_buf_t *xfs_buf_get_noaddr(size_t, xfs_buftarg_t *); Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2009-11-12 17:10:20.286254746 +0100 +++ xfs/fs/xfs/xfs_log_recover.c 2009-11-12 17:14:15.274004198 +0100 @@ -2206,6 +2206,7 @@ xlog_recover_do_buffer_trans( xfs_daddr_t blkno; int len; ushort flags; + uint buf_flags; buf_f = (xfs_buf_log_format_t *)item->ri_buf[0].i_addr; @@ -2246,12 +2247,11 @@ xlog_recover_do_buffer_trans( } mp = log->l_mp; - if (flags & XFS_BLI_INODE_BUF) { - bp = xfs_buf_read_flags(mp->m_ddev_targp, blkno, len, - XFS_BUF_LOCK); - } else { - bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, 0); - } + buf_flags = XFS_BUF_LOCK; + if (!(flags & XFS_BLI_INODE_BUF)) + buf_flags |= XFS_BUF_MAPPED; + + bp = xfs_buf_read_flags(mp->m_ddev_targp, blkno, len, buf_flags); if (XFS_BUF_ISERROR(bp)) { xfs_ioerror_alert("xlog_recover_do..(read#1)", log->l_mp, bp, blkno); Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2009-11-12 17:10:20.326254256 +0100 +++ xfs/fs/xfs/xfs_rw.c 2009-11-12 17:14:15.278004428 +0100 @@ -277,10 +277,10 @@ xfs_read_buf( xfs_buf_t *bp; int error; - if (flags) - bp = xfs_buf_read_flags(target, blkno, len, flags); - else - bp = xfs_buf_read(target, blkno, len, flags); + if (!flags) + flags = XBF_LOCK | XBF_MAPPED; + + bp = xfs_buf_read_flags(target, blkno, len, flags); if (!bp) return XFS_ERROR(EIO); error = XFS_BUF_GETERROR(bp); Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2009-11-12 17:15:17.097272663 +0100 +++ xfs/fs/xfs/xfs_fsops.c 2009-11-12 17:16:53.487005554 +0100 @@ -200,9 +200,9 @@ xfs_growfs_data_private( /* * AG freelist header block */ - bp = xfs_buf_get(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + bp = xfs_buf_get_flags(mp->m_ddev_targp, + XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), + XFS_FSS_TO_BB(mp, 1), XBF_LOCK | XBF_MAPPED); agf = XFS_BUF_TO_AGF(bp); memset(agf, 0, mp->m_sb.sb_sectsize); agf->agf_magicnum = cpu_to_be32(XFS_AGF_MAGIC); @@ -232,9 +232,9 @@ xfs_growfs_data_private( /* * AG inode header block */ - bp = xfs_buf_get(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + bp = xfs_buf_get_flags(mp->m_ddev_targp, + XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), + XFS_FSS_TO_BB(mp, 1), XBF_LOCK | XBF_MAPPED); agi = XFS_BUF_TO_AGI(bp); memset(agi, 0, mp->m_sb.sb_sectsize); agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC); @@ -256,9 +256,9 @@ xfs_growfs_data_private( /* * BNO btree root block */ - bp = xfs_buf_get(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), - BTOBB(mp->m_sb.sb_blocksize), 0); + bp = xfs_buf_get_flags(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), + BTOBB(mp->m_sb.sb_blocksize), XBF_LOCK | XBF_MAPPED); block = XFS_BUF_TO_BLOCK(bp); memset(block, 0, mp->m_sb.sb_blocksize); block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC); @@ -277,9 +277,9 @@ xfs_growfs_data_private( /* * CNT btree root block */ - bp = xfs_buf_get(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), - BTOBB(mp->m_sb.sb_blocksize), 0); + bp = xfs_buf_get_flags(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), + BTOBB(mp->m_sb.sb_blocksize), XBF_LOCK | XBF_MAPPED); block = XFS_BUF_TO_BLOCK(bp); memset(block, 0, mp->m_sb.sb_blocksize); block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC); @@ -299,9 +299,9 @@ xfs_growfs_data_private( /* * INO btree root block */ - bp = xfs_buf_get(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), - BTOBB(mp->m_sb.sb_blocksize), 0); + bp = xfs_buf_get_flags(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), + BTOBB(mp->m_sb.sb_blocksize), XBF_LOCK | XBF_MAPPED); block = XFS_BUF_TO_BLOCK(bp); memset(block, 0, mp->m_sb.sb_blocksize); block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHfcu193819 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215481-4d1e01f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0F0E989D0D for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UeMY8lfFLoxPBFeu for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK5-0004WL-NK for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:01 +0000 Message-Id: <20091114161801.612419979@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:20 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/7] xfs: rename xfs_attr_fetch to xfs_attr_get_int Subject: [PATCH 3/7] xfs: rename xfs_attr_fetch to xfs_attr_get_int References: <20091114161717.233372584@bombadil.infradead.org> Content-Disposition: inline; filename=xfs_attr_get_int X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215482 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Using a totally different name for the lowlevel get operation does not fit the _int convention used in the rest of the attr code, so rename it. While we're at it also fix the prototype to use the normal convention and mark it static as it's never used outside of xfs_attr.c. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2009-11-12 17:10:20.047264798 +0100 +++ xfs/fs/xfs/xfs_attr.c 2009-11-12 17:18:17.703273473 +0100 @@ -123,9 +123,13 @@ xfs_inode_hasattr( * Overall external interface routines. *========================================================================*/ -int -xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, - char *value, int *valuelenp, int flags) +STATIC int +xfs_attr_get_int( + struct xfs_inode *ip, + struct xfs_name *name, + char *value, + int *valuelenp, + int flags) { xfs_da_args_t args; int error; @@ -188,7 +192,7 @@ xfs_attr_get( return error; xfs_ilock(ip, XFS_ILOCK_SHARED); - error = xfs_attr_fetch(ip, &xname, value, valuelenp, flags); + error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); xfs_iunlock(ip, XFS_ILOCK_SHARED); return(error); } Index: xfs/fs/xfs/xfs_attr.h =================================================================== --- xfs.orig/fs/xfs/xfs_attr.h 2009-11-12 17:10:20.056254911 +0100 +++ xfs/fs/xfs/xfs_attr.h 2009-11-12 17:18:17.703273473 +0100 @@ -131,7 +131,6 @@ typedef struct xfs_attr_list_context { */ int xfs_attr_calc_size(struct xfs_inode *, int, int, int *); int xfs_attr_inactive(struct xfs_inode *dp); -int xfs_attr_fetch(struct xfs_inode *, struct xfs_name *, char *, int *, int); int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_list_int(struct xfs_attr_list_context *); From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:17:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGHe5t193813 for ; Sat, 14 Nov 2009 10:17:43 -0600 X-ASG-Debug-ID: 1258215481-4d2101f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 737C689D09 for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IqDMf5Xg8Dk8W5LD for ; Sat, 14 Nov 2009 08:18:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LK5-0004UU-4r for xfs@oss.sgi.com; Sat, 14 Nov 2009 16:18:01 +0000 Message-Id: <20091114161717.233372584@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Sat, 14 Nov 2009 11:17:17 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/7] assorted cleanups Subject: [PATCH 0/7] assorted cleanups X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215481 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series has a couple of minor cleanups which have been lingering around in my tree for a while. None of them should cause any change in behaviour. From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:19:14 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGJEU1194000 for ; Sat, 14 Nov 2009 10:19:14 -0600 X-ASG-Debug-ID: 1258215575-45a6022e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3B81C89D0F for ; Sat, 14 Nov 2009 08:19:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 3vyi7tKnD2jy5ICN for ; Sat, 14 Nov 2009 08:19:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LLa-0006y3-0I; Sat, 14 Nov 2009 16:19:34 +0000 Date: Sat, 14 Nov 2009 11:19:33 -0500 From: Christoph Hellwig To: Emmanuel Florac Cc: ming liu , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: install xfs Subject: Re: install xfs Message-ID: <20091114161933.GA17658@infradead.org> References: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> <20091114105417.29066860@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114105417.29066860@galadriel.home> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215575 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 10:54:17AM +0100, Emmanuel Florac wrote: > Le Sat, 14 Nov 2009 12:05:23 +0800 vous ?criviez: > > > In 32-bit operating system to install xfs do? > > All Linux distributions except RedHat and derivatives (CentOS, > Fedora) come with XFS included. Fedora comes with XFS included for a long time. And even RHEL5 comes with XFS kernel support, although on x86_64 and only supported if you sign over your first born to Red Hat. I'm sure CentOS will have a more liberal policy for the same codebase given that they support external XFS modules for a long time. From BATV+d1f995eacf6bdcc44143+2274+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 14 10:21:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGL63U194113 for ; Sat, 14 Nov 2009 10:21:08 -0600 X-ASG-Debug-ID: 1258215687-4d2001f50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E15C89BB4 for ; Sat, 14 Nov 2009 08:21:27 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bGACdRA1BMdhFkOG for ; Sat, 14 Nov 2009 08:21:27 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9LNO-0001s7-OW; Sat, 14 Nov 2009 16:21:26 +0000 Date: Sat, 14 Nov 2009 11:21:26 -0500 From: Christoph Hellwig To: Patrick Schreurs Cc: Christoph Hellwig , Tommy van Leeuwen , Bas Couwenberg , XFS List X-ASG-Orig-Subj: Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim Subject: Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim Message-ID: <20091114162126.GB17658@infradead.org> References: <20091012233854.GA29446@infradead.org> <20091019011600.GO9464@discord.disaster> <20091019035426.GB18296@infradead.org> <20091020034048.GA9464@discord.disaster> <89c4f90c0910210245h4691cd82hd1d63f5ed72fb2e3@mail.gmail.com> <20091022085937.GA2039@infradead.org> <89c4f90c0910270341r7833f490g60810f2817eb0950@mail.gmail.com> <89c4f90c0910280519k759230c1r7b1586932ac792f7@mail.gmail.com> <20091030101601.GA11142@infradead.org> <4AF0422D.1070104@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4AF0422D.1070104@news-service.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258215687 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 03, 2009 at 03:46:05PM +0100, Patrick Schreurs wrote: > We're back to 2.6.28 at the moment. Please advice if we can do anything > to assist. > > Any clue why we seem to be the only one hitting this problem? It might > have something to do with the short term data retention on these > particular servers. All partitions are always 100% full and data is only > kept for a couple of days. Sorry for the lack of updates, been travelling and working a lot and didn't have much time to look at your screen dumps. I really wish where the magic offset for the NULL pointer dereference comes from. The 100% full might be a pretty good hint that is has to deal with ENOSPC handling somewhere. I don't know of anything you can help me with for now, but will come back as soon as I have something more. From eflorac@intellique.com Sat Nov 14 10:38:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEGcNEq195358 for ; Sat, 14 Nov 2009 10:38:24 -0600 X-ASG-Debug-ID: 1258216718-684701350000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C9A331D9767A for ; Sat, 14 Nov 2009 08:38:41 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id 5SCwXuUyfcltpE0f for ; Sat, 14 Nov 2009 08:38:41 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id 756BED4800D; Sat, 14 Nov 2009 17:38:34 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id 721BDD4815D; Sat, 14 Nov 2009 17:38:32 +0100 (CET) Date: Sat, 14 Nov 2009 17:38:19 +0100 From: Emmanuel Florac To: Christoph Hellwig Cc: ming liu , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: install xfs Subject: Re: install xfs Message-ID: <20091114173819.6a23b654@galadriel.home> In-Reply-To: <20091114161933.GA17658@infradead.org> References: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> <20091114105417.29066860@galadriel.home> <20091114161933.GA17658@infradead.org> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1258216723 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14617 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sat, 14 Nov 2009 11:19:33 -0500 vous =E9criviez: > Fedora comes with XFS included for a long time. And even RHEL5 comes > with XFS kernel support, although on x86_64 and only supported if you > sign over your first born to Red Hat. Wow, hell froze over. I never understood why redhat refused to include XFS for so long, and simply decided to ditch redhat and derivatives ages ago (no xfs? no mp3? grotesque rpm dependancies? you must be friggin kidding). --=20 -------------------------------------------------- Emmanuel Florac www.intellique.com =20 -------------------------------------------------- From sandeen@sandeen.net Sat Nov 14 11:09:27 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEH9RoF196912 for ; Sat, 14 Nov 2009 11:09:27 -0600 X-ASG-Debug-ID: 1258218586-037f011b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7C98B89E3B for ; Sat, 14 Nov 2009 09:09:47 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id OCa2pyGfRnYw3vXj for ; Sat, 14 Nov 2009 09:09:47 -0800 (PST) Received: from liberator.sandeen.net (sandeen.net [209.173.210.139]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 9E623A9B0AC; Sat, 14 Nov 2009 11:09:46 -0600 (CST) Message-ID: <4AFEE45D.1050709@sandeen.net> Date: Sat, 14 Nov 2009 11:09:49 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: install xfs Subject: Re: install xfs References: <6fccb1d70911132005x43d02e39u9f161ecbce325c61@mail.gmail.com> <20091114105417.29066860@galadriel.home> <20091114161933.GA17658@infradead.org> <20091114173819.6a23b654@galadriel.home> In-Reply-To: <20091114173819.6a23b654@galadriel.home> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1258218587 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14619 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac wrote: > Le Sat, 14 Nov 2009 11:19:33 -0500 vous écriviez: > >> Fedora comes with XFS included for a long time. And even RHEL5 comes >> with XFS kernel support, although on x86_64 and only supported if you >> sign over your first born to Red Hat. > > Wow, hell froze over. I never understood why redhat refused to include > XFS for so long, and simply decided to ditch redhat and derivatives > ages ago (no xfs? no mp3? grotesque rpm dependancies? you must be > friggin kidding). Red Hat and Fedora can't ship the patented mp3 codec. And enterprise distributions routinely choose a subset of kernel options that they can support well for their customers. But now I'm getting OT, so probably won't reply further. :) -Eric From sbshepherd@ymail.com Sat Nov 14 13:17:34 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=AWL,BANG_GUAR,BAYES_50, HTML_MESSAGE,UNPARSEABLE_RELAY autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAEJHX1h206018 for ; Sat, 14 Nov 2009 13:17:34 -0600 X-ASG-Debug-ID: 1258226272-35d2013d0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp106.prem.mail.ac4.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 156C112C94AF for ; Sat, 14 Nov 2009 11:17:52 -0800 (PST) Received: from smtp106.prem.mail.ac4.yahoo.com (smtp106.prem.mail.ac4.yahoo.com [76.13.13.45]) by cuda.sgi.com with SMTP id 9MJz5vmmuFzm3tFH for ; Sat, 14 Nov 2009 11:17:52 -0800 (PST) Received: (qmail 86392 invoked from network); 14 Nov 2009 19:17:51 -0000 Received: from adsl-217-7-68.asm.bellsouth.net (sbshepherd@68.217.7.68 with login) by smtp106.prem.mail.ac4.yahoo.com with SMTP; 14 Nov 2009 11:17:51 -0800 PST X-Yahoo-SMTP: q_iQ9CGswBDWnfaDdDweA5p0bKjGVP7HPTihrghQ1G3J X-YMail-OSG: a0h8rk0VM1mXvqy1LVm.oA8JAIkmO8rXOI1cawiSvWWyW_kMD3IL6UGINV8FwKC5Vtm0zJLsh54uLsq6j2W.h2z0tw8vAa_FQKnfnfIQ9KW1NXFZ2evfQ0CBG2iWGcofGjvI_dzZSMaDHAW8IeEATyEmWILNaqIf28A5IlK40ynn2qrZAFDTjogqS_p5k078VljMlkrLJYhrsalLx1TRYZaskF0qSnv_ZxKtds.jpyr9cfqKdPU.GJs657O6fSKWK792JudTPU5..C3mBSLxfxUdWhDKh4vPOApnLXZYyIbzVT1TY87fsDYk2ovkvdSNjVDwl7utKg4mjcgSGUGgW4sE0J14asg_CE4o0Q-- X-Yahoo-Newman-Property: ymail-3 From: "Scott Shepherd" To: X-ASG-Orig-Subj: MSDS Compliance Tool With the Benefits of Cloud Computing Subject: MSDS Compliance Tool With the Benefits of Cloud Computing Date: Sat, 14 Nov 2009 14:16:44 -0500 Message-ID: <14fc01ca655f$24513240$6cf396c0$@com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_14FD_01CA6535.3B7B2A40" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AcplXG6lfqb0FgM4T72dbaqKlvtpDQ== Content-Language: en-us x-cr-hashedpuzzle: ANG2 Ayr7 BFOE By0R B1mV Cma6 DoDt E1yl FBeX FOrp F6O/ GQiO GkdC HURd HajV ISrU;1;bABpAG4AdQB4AC0AeABmAHMAQABvAHMAcwAuAHMAZwBpAC4AYwBvAG0A;Sosha1_v1;7;{29E2F9C2-31AF-442F-8B95-B43A8302AEFE};cwBiAHMAaABlAHAAaABlAHIAZABAAHkAbQBhAGkAbAAuAGMAbwBtAA==;Sat, 14 Nov 2009 19:16:16 GMT;TQBTAEQAUwAgAEMAbwBtAHAAbABpAGEAbgBjAGUAIABUAG8AbwBsACAAVwBpAHQAaAAgAHQAaABlACAAQgBlAG4AZQBmAGkAdABzACAAbwBmACAAQwBsAG8AdQBkACAAQwBvAG0AcAB1AHQAaQBuAGcA x-cr-puzzleid: {29E2F9C2-31AF-442F-8B95-B43A8302AEFE} X-Barracuda-Connect: smtp106.prem.mail.ac4.yahoo.com[76.13.13.45] X-Barracuda-Start-Time: 1258226273 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2346 1.0000 -0.6508 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BANG_GUAR, HTML_MESSAGE, SARE_SXLIFE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 1.07 SARE_SXLIFE BODY: Talks about your sex life 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_14FD_01CA6535.3B7B2A40 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit EHS Professionals, In order to provide cost effective programs, we need your help in forwarding this information to the Environmental, Health and Safety managers. Please help us help your company lower operating costs. Are you being asked to provide more MSDS compliance management with less? Are you interested in the benefits of cloud computing? The attached document is our Power Point Presentation providing a Quick overview of our program. We are available as your partner to provide a lower cost more efficient solution to your MSDS document work load. We have come up with an application to make MSDS document compliance management more beneficial than ever. We invite you to review our program. No software, no risk, just simple reliable MSDS management. Go to www.OnlineMSDS.com today for more info. We offer more features and benefits than any other comparable solution on the market at a lower price, Guaranteed! Our Online MSDS Solution is robust enough to handle the complexities of managing global MSDSs and Safety Training programs. For our international customers we can communicate using Skype at no cost, works like instant messaging. We provide close personal assistance during startup and training. For those companies that already have a program in place, we offer to assist you through the transition progress. We also offer 50 employee safety and environmental training courses, at no additional cost as an incentive to move data to our superior program. Visit www.OnlineMSDS.com to learn how we can simplify your MSDS management for less today. Scott Shepherd, Manager IMTEK Environmental Corporation I www.OnlineMSDS.com sbshepherd@ymail.com I 770.335.5586 I o 770.667.8683 I Skype EnviroPro ---------------------------------------------------------------------------- ---------------------------------------------------------------- Sustainability & EHS Management Solutions Made Simple for Less ------=_NextPart_000_14FD_01CA6535.3B7B2A40 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

EHS Professionals,

In order to provide cost effective programs, we need your help in = forwarding this information to the Environmental, Health and Safety managers.  = Please help us help your company lower operating costs.

 

Are you being asked to provide more MSDS compliance management with less? =   Are you interested in the benefits of cloud computing?

 

The attached document is our Power Point Presentation = providing a Quick overview of our program.

 

We are available as your partner to provide a lower cost more efficient = solution to your MSDS document work load.  We have come up with an = application to make MSDS document compliance management more beneficial than ever.  We = invite you to review our program.  

 

No software, no risk, just simple reliable MSDS management. Go to www.OnlineMSDS.com today for more info. We offer more features and benefits than any other comparable solution on the market at a lower = price, Guaranteed!

 

Our Online MSDS Solution is robust enough to handle the complexities of = managing global MSDSs and Safety Training programs.  For our international = customers we can communicate using Skype at no cost, works like instant messaging.  =

 

We provide close personal assistance during startup and training.  For = those companies that already have a program in place, we offer to assist you = through the transition progress.  We also offer 50 employee safety and = environmental training courses, at no additional cost as an incentive to move data to = our superior program.    

 

Visit www.OnlineMSDS.com to learn how we can simplify = your MSDS management for less today. 

Scott Shepherd, Manager 

IMTEK Environmental Corporation I www.OnlineMSDS.com

sbshepherd@ymail.com I 770.335.5586 I o 770.667.8683 I Skype = EnviroPro

---------------------------------------------------------= -------------------------------------------------------------------------= ----------

Sustainability & EHS Management Solutions Made Simple for Less

 

 

------=_NextPart_000_14FD_01CA6535.3B7B2A40-- From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:04:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG34rhc073754 for ; Sun, 15 Nov 2009 21:04:53 -0600 X-ASG-Debug-ID: 1258340712-7e9000c30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6FF11188108E for ; Sun, 15 Nov 2009 19:05:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id AWTLiMP9AL9oGFp9 for ; Sun, 15 Nov 2009 19:05:13 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8317610-1927428 for multiple; Mon, 16 Nov 2009 13:35:11 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9rtt-0002V5-Mp; Mon, 16 Nov 2009 14:05:09 +1100 Date: Mon, 16 Nov 2009 14:05:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: remove IO_ISAIO Subject: Re: [PATCH 1/7] xfs: remove IO_ISAIO Message-ID: <20091116030509.GB9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.238873282@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161801.238873282@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1258340714 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:18AM -0500, Christoph Hellwig wrote: > We set this flag for all read/write I/O since early Linux 2.6.x. > Remove it as it has lost it's purpose long ago. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+6gd8+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:14:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3EuSa074681 for ; Sun, 15 Nov 2009 21:14:56 -0600 X-ASG-Debug-ID: 1258341315-6c5b019a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9773881DCE for ; Sun, 15 Nov 2009 19:15:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 2OWdCLUuh5TCnv3b for ; Sun, 15 Nov 2009 19:15:15 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8418634-1927428 for multiple; Mon, 16 Nov 2009 13:45:14 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9s3c-0002Va-M4; Mon, 16 Nov 2009 14:15:12 +1100 Date: Mon, 16 Nov 2009 14:15:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read Subject: Re: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read Message-ID: <20091116031512.GC9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.411213050@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161801.411213050@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1258341317 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:19AM -0500, Christoph Hellwig wrote: > The two interfaces are highl confusing as they do have a flags argument > which gets ignored and replaced with default flags. Switch the few remaining > callers to use xfs_buf_get_flags and xfs_buf_read_flags instead and remove > these wrappers. > > Signed-off-by: Christoph Hellwig Personally I would have dropped the *_flags from the function names as well (so everything calls xfs_buf_get() or xfs_buf_read()) but it doesn't really matter.... > /* > * BNO btree root block > */ > - bp = xfs_buf_get(mp->m_ddev_targp, > - XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), > - BTOBB(mp->m_sb.sb_blocksize), 0); > + bp = xfs_buf_get_flags(mp->m_ddev_targp, > + XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), > + BTOBB(mp->m_sb.sb_blocksize), XBF_LOCK | XBF_MAPPED); That looks wider than 80 columns. Same for the other conversions, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:16:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3Gijo074848 for ; Sun, 15 Nov 2009 21:16:44 -0600 X-ASG-Debug-ID: 1258341424-487203470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DACB118812A3 for ; Sun, 15 Nov 2009 19:17:04 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id Gf7grsCUbD6EhYl7 for ; Sun, 15 Nov 2009 19:17:04 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8318304-1927428 for multiple; Mon, 16 Nov 2009 13:47:03 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9s5O-0002Vo-Ti; Mon, 16 Nov 2009 14:17:02 +1100 Date: Mon, 16 Nov 2009 14:17:02 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: rename xfs_attr_fetch to xfs_attr_get_int Subject: Re: [PATCH 3/7] xfs: rename xfs_attr_fetch to xfs_attr_get_int Message-ID: <20091116031702.GD9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.612419979@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161801.612419979@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1258341425 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:20AM -0500, Christoph Hellwig wrote: > Using a totally different name for the lowlevel get operation does not > fit the _int convention used in the rest of the attr code, so rename it. > > While we're at it also fix the prototype to use the normal convention > and mark it static as it's never used outside of xfs_attr.c. > > Signed-off-by: Christoph Hellwig Looks OK. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+yw0H+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:18:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3I48x074989 for ; Sun, 15 Nov 2009 21:18:04 -0600 X-ASG-Debug-ID: 1258341503-5c3102f30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7C79A8BED3 for ; Sun, 15 Nov 2009 19:18:24 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id weHOC5JjoiCqjnTN for ; Sun, 15 Nov 2009 19:18:24 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8428028-1927428 for multiple; Mon, 16 Nov 2009 13:48:22 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9s6e-0002Vx-O8; Mon, 16 Nov 2009 14:18:20 +1100 Date: Mon, 16 Nov 2009 14:18:20 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: uninline xfs_get_extsz_hint Subject: Re: [PATCH 4/7] xfs: uninline xfs_get_extsz_hint Message-ID: <20091116031820.GE9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.818601601@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161801.818601601@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1258341505 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:21AM -0500, Christoph Hellwig wrote: > This function is too large to efficiently be inlined. > > Signed-off-by: Christoph Hellwig Makes sense. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+1DfK+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:20:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3Kf0B075248 for ; Sun, 15 Nov 2009 21:20:41 -0600 X-ASG-Debug-ID: 1258341660-1aee00120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 94E5C1881058 for ; Sun, 15 Nov 2009 19:21:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id JEdCJpGmcevxij3F for ; Sun, 15 Nov 2009 19:21:01 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8348402-1927428 for multiple; Mon, 16 Nov 2009 13:50:59 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9s9C-0002W9-0F; Mon, 16 Nov 2009 14:20:58 +1100 Date: Mon, 16 Nov 2009 14:20:57 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: kill the STATIC_INLINE macro Subject: Re: [PATCH 5/7] xfs: kill the STATIC_INLINE macro Message-ID: <20091116032057.GF9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.978180093@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161801.978180093@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1258341662 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:22AM -0500, Christoph Hellwig wrote: > Remove our own STATIC_INLINE macro. For small function inside implementation > files just use STATIC and let gcc inline it, and for those in headers do the > normal static inline - they are all small enough to be inlined for debug > builds, too. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:21:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3Ltkh075373 for ; Sun, 15 Nov 2009 21:21:55 -0600 X-ASG-Debug-ID: 1258341735-0dca00270000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EB6D58BFC0 for ; Sun, 15 Nov 2009 19:22:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id TdRFiRhZf3WUpBbj for ; Sun, 15 Nov 2009 19:22:15 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8318508-1927428 for multiple; Mon, 16 Nov 2009 13:52:14 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9sAO-0002WJ-Rn; Mon, 16 Nov 2009 14:22:12 +1100 Date: Mon, 16 Nov 2009 14:22:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: remove incorrect sparse annotation for xfs_iget_cache_miss Subject: Re: [PATCH 6/7] xfs: remove incorrect sparse annotation for xfs_iget_cache_miss Message-ID: <20091116032212.GG9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161802.164659630@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161802.164659630@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1258341736 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:23AM -0500, Christoph Hellwig wrote: > xfs_iget_cache_miss does not get called with the pag_ici_lock held, so > the __releases annotation is incorrect. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:29:10 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3TA8G076307 for ; Sun, 15 Nov 2009 21:29:10 -0600 X-ASG-Debug-ID: 1258342169-1aa800640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 599FF1881368 for ; Sun, 15 Nov 2009 19:29:30 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id tY99qfJcDDZV4ZmA for ; Sun, 15 Nov 2009 19:29:30 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8318852-1927428 for multiple; Mon, 16 Nov 2009 13:59:29 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9sHP-0002Wc-DY; Mon, 16 Nov 2009 14:29:27 +1100 Date: Mon, 16 Nov 2009 14:29:27 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: cleanup dmapi macros in the umount path Subject: Re: [PATCH 7/7] xfs: cleanup dmapi macros in the umount path Message-ID: <20091116032927.GH9467@discord.disaster> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161802.343652891@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091114161802.343652891@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1258342171 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Nov 14, 2009 at 11:17:24AM -0500, Christoph Hellwig wrote: > Stop the flag saving as we never mangle those in the unmount path, and hide all > the weird arguents to the dmapi code inside the XFS_SEND_PREUNMOUNT / > XFS_SEND_UNMOUNT macros. > > Signed-off-by: Christoph Hellwig Nice cleanup. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+6gd8+74+fromorbit.com=david@internode.on.net Sun Nov 15 21:50:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAG3o4XW078518 for ; Sun, 15 Nov 2009 21:50:05 -0600 X-ASG-Debug-ID: 1258343423-1030009e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CAAC68BF8B for ; Sun, 15 Nov 2009 19:50:23 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id NAz1AoZxMRilIpcm for ; Sun, 15 Nov 2009 19:50:23 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8541286-1927428 for multiple; Mon, 16 Nov 2009 14:20:21 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1N9sbb-0002Xj-FQ; Mon, 16 Nov 2009 14:50:19 +1100 Date: Mon, 16 Nov 2009 14:50:19 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: improve metadata I/O merging in the elevator Subject: Re: [PATCH] xfs: improve metadata I/O merging in the elevator Message-ID: <20091116035019.GI9467@discord.disaster> References: <20091112190930.GB32110@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091112190930.GB32110@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1258343424 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Nov 12, 2009 at 02:09:31PM -0500, Christoph Hellwig wrote: > I had the patch below from Dave in my queue for a while, but previously > couldn't really reproduce his numbers. After some discussions of the > bio types I've reteseted it again and can see constant improvements when > using cfq on my large array box with it (5-10% for the sequential create > workloads), but still nothing on deadline. Given that people also want > it for better marking in blktrace it might be time to put it in. > > Comments? Definitely should be done, but.... It looks like the patch you posted isn't quite doing what was intended - async write buffers are being classified as WRITE, not WRITE_META. That means we get more write combining in the elevator (performance increase) like with WRITE_META, but don't get the faster dispatch (latency reduction) by using the META queue to keep the metadata writeback separate from the bulk data writeback. That may be why deadline is not showing any improvement... FWIW, the original patch here: http://oss.sgi.com/archives/xfs/2008-01/msg00630.html uses WRITE_META, but it looks like you've taken bits of this patch: http://oss.sgi.com/archives/xfs/2008-01/msg00653.html and added the log buffer marking to this patch and accidentally dropped the WRITE_META marking. i.e. this: > + } else if (bp->b_flags & _XBF_RUN_QUEUES) { > + ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); > + bp->b_flags &= ~_XBF_RUN_QUEUES; > + rw = (bp->b_flags & XBF_WRITE) ? WRITE : READ_META; I think should be: + rw = (bp->b_flags & XBF_WRITE) ? WRITE_META : READ_META; Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+cf8331b38129cc2ac9af+2276+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 16 05:03:16 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGB3DbG122839 for ; Mon, 16 Nov 2009 05:03:15 -0600 X-ASG-Debug-ID: 1258369413-1f0302120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 48E3F1D980EE for ; Mon, 16 Nov 2009 03:03:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id nelqFc2HyBrdL7uW for ; Mon, 16 Nov 2009 03:03:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9zMp-0005Se-8K; Mon, 16 Nov 2009 11:03:31 +0000 Date: Mon, 16 Nov 2009 06:03:31 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read Subject: Re: [PATCH 2/7] xfs: remove xfs_buf_get / xfs_buf_read Message-ID: <20091116110331.GA19835@infradead.org> References: <20091114161717.233372584@bombadil.infradead.org> <20091114161801.411213050@bombadil.infradead.org> <20091116031512.GC9467@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091116031512.GC9467@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258369415 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 16, 2009 at 02:15:12PM +1100, Dave Chinner wrote: > On Sat, Nov 14, 2009 at 11:17:19AM -0500, Christoph Hellwig wrote: > > The two interfaces are highl confusing as they do have a flags argument > > which gets ignored and replaced with default flags. Switch the few remaining > > callers to use xfs_buf_get_flags and xfs_buf_read_flags instead and remove > > these wrappers. > > > > Signed-off-by: Christoph Hellwig > > Personally I would have dropped the *_flags from the function names > as well (so everything calls xfs_buf_get() or xfs_buf_read()) but > it doesn't really matter.... Maybe. The issue would be if we forward-port some code that expects it can pass random crap in the flags field will get different behaviour now. Then again it'll blow up fast enough to notice.. > > + XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), > > + BTOBB(mp->m_sb.sb_blocksize), XBF_LOCK | XBF_MAPPED); > > That looks wider than 80 columns. Same for the other conversions, > too. I'll fix it. From BATV+cf8331b38129cc2ac9af+2276+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 16 05:05:02 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGB51ST123009 for ; Mon, 16 Nov 2009 05:05:02 -0600 X-ASG-Debug-ID: 1258369523-4c26005d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 989468CD1E for ; Mon, 16 Nov 2009 03:05:23 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4h0CkXhzGf8vmOgK for ; Mon, 16 Nov 2009 03:05:23 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1N9zOd-0006QS-21; Mon, 16 Nov 2009 11:05:23 +0000 Date: Mon, 16 Nov 2009 06:05:23 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: improve metadata I/O merging in the elevator Subject: Re: [PATCH] xfs: improve metadata I/O merging in the elevator Message-ID: <20091116110523.GB19835@infradead.org> References: <20091112190930.GB32110@infradead.org> <20091116035019.GI9467@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091116035019.GI9467@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258369523 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 16, 2009 at 02:50:19PM +1100, Dave Chinner wrote: > Definitely should be done, but.... > > It looks like the patch you posted isn't quite doing what was > intended - async write buffers are being classified as WRITE, not > WRITE_META. That means we get more write combining in the elevator > (performance increase) like with WRITE_META, but don't get the > faster dispatch (latency reduction) by using the META queue to keep > the metadata writeback separate from the bulk data writeback. > That may be why deadline is not showing any improvement... > > FWIW, the original patch here: > > http://oss.sgi.com/archives/xfs/2008-01/msg00630.html > > uses WRITE_META, but it looks like you've taken bits of this > patch: Indeed. I'l re-add the write-side markings and will re-bench and re-submit. From baggins@sith.mimuw.edu.pl Mon Nov 16 05:56:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGBuced127204 for ; Mon, 16 Nov 2009 05:56:39 -0600 X-ASG-Debug-ID: 1258372618-6d1c024d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sith.mimuw.edu.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D7B88CA5D for ; Mon, 16 Nov 2009 03:56:59 -0800 (PST) Received: from sith.mimuw.edu.pl (sith.mimuw.edu.pl [193.0.96.4]) by cuda.sgi.com with ESMTP id ewUf4PLwKhwCtjHF for ; Mon, 16 Nov 2009 03:56:59 -0800 (PST) Received: by sith.mimuw.edu.pl (Postfix, from userid 1062) id AD2A8447B1640; Mon, 16 Nov 2009 12:57:02 +0100 (CET) Date: Mon, 16 Nov 2009 12:57:02 +0100 From: Jan Rekorajski To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS bug in log recover with quota (bugzilla id 855) Subject: XFS bug in log recover with quota (bugzilla id 855) Message-ID: <20091116115702.GN23522@sith.mimuw.edu.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Operating-System: Linux 2.6.29.4 x86_64 User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: sith.mimuw.edu.pl[193.0.96.4] X-Barracuda-Start-Time: 1258372619 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I was hit by a bug in linux 2.6.31 when XFS is not able to recover the log after a crash if fs was mounted with quotas. Gory details in XFS bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=855. It looks like wrong struct is used in buffer length check, and the following patch should fix the problem. xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 bytes long, and this is exactly what I see in system logs - "XFS: dquot too small (104) in xlog_recover_do_dquot_trans." --- linux-2.6.31.5/fs/xfs/xfs_log_recover.c.orig 2009-11-01 23:59:52.194846209 +0100 +++ linux-2.6.31.5/fs/xfs/xfs_log_recover.c 2009-11-16 12:47:11.601490963 +0100 @@ -1980,7 +1980,7 @@ "XFS: NULL dquot in %s.", __func__); goto next; } - if (item->ri_buf[i].i_len < sizeof(xfs_dqblk_t)) { + if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { cmn_err(CE_ALERT, "XFS: dquot too small (%d) in %s.", item->ri_buf[i].i_len, __func__); @@ -2636,7 +2636,7 @@ "XFS: NULL dquot in %s.", __func__); return XFS_ERROR(EIO); } - if (item->ri_buf[1].i_len < sizeof(xfs_dqblk_t)) { + if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { cmn_err(CE_ALERT, "XFS: dquot too small (%d) in %s.", item->ri_buf[1].i_len, __func__); -- Jan Rekorajski | ALL SUSPECTS ARE GUILTY. PERIOD! bagginsmimuw.edu.pl | OTHERWISE THEY WOULDN'T BE SUSPECTS, WOULD THEY? BOFH, MANIAC | -- TROOPS by Kevin Rubio From BATV+cf8331b38129cc2ac9af+2276+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 16 07:08:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGD84YM139650 for ; Mon, 16 Nov 2009 07:08:04 -0600 X-ASG-Debug-ID: 1258376905-1f3f03c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D6B951D98537 for ; Mon, 16 Nov 2009 05:08:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id p4kjH1zZNDPuFvBi for ; Mon, 16 Nov 2009 05:08:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NA1Jg-0007Yo-U7; Mon, 16 Nov 2009 13:08:24 +0000 Date: Mon, 16 Nov 2009 08:08:24 -0500 From: Christoph Hellwig To: Jan Rekorajski Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS bug in log recover with quota (bugzilla id 855) Subject: Re: XFS bug in log recover with quota (bugzilla id 855) Message-ID: <20091116130824.GA27442@infradead.org> References: <20091116115702.GN23522@sith.mimuw.edu.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091116115702.GN23522@sith.mimuw.edu.pl> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258376905 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 16, 2009 at 12:57:02PM +0100, Jan Rekorajski wrote: > Hi, > I was hit by a bug in linux 2.6.31 when XFS is not able to recover the > log after a crash if fs was mounted with quotas. Gory details in XFS > bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=855. > > It looks like wrong struct is used in buffer length check, and the following > patch should fix the problem. > > xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 bytes > long, and this is exactly what I see in system logs - "XFS: dquot too small > (104) in xlog_recover_do_dquot_trans." Yikes, great brown paperbag bug. Indeed, as per xfs_qm_dquot_logitem_format() we only log the xfs_disk_dquot_t and not the full xfs_dqblk_t. Felix, can you try to get this to Linus before .32 as this is clearly a regression. I'll also put the writing of more quota testcases including testing the log recovery even higher on my todo list. Reviewed-by: Christoph Hellwig > --- linux-2.6.31.5/fs/xfs/xfs_log_recover.c.orig 2009-11-01 23:59:52.194846209 +0100 > +++ linux-2.6.31.5/fs/xfs/xfs_log_recover.c 2009-11-16 12:47:11.601490963 +0100 > @@ -1980,7 +1980,7 @@ > "XFS: NULL dquot in %s.", __func__); > goto next; > } > - if (item->ri_buf[i].i_len < sizeof(xfs_dqblk_t)) { > + if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { > cmn_err(CE_ALERT, > "XFS: dquot too small (%d) in %s.", > item->ri_buf[i].i_len, __func__); > @@ -2636,7 +2636,7 @@ > "XFS: NULL dquot in %s.", __func__); > return XFS_ERROR(EIO); > } > - if (item->ri_buf[1].i_len < sizeof(xfs_dqblk_t)) { > + if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { > cmn_err(CE_ALERT, > "XFS: dquot too small (%d) in %s.", > item->ri_buf[1].i_len, __func__); > > -- > Jan Rekorajski | ALL SUSPECTS ARE GUILTY. PERIOD! > bagginsmimuw.edu.pl | OTHERWISE THEY WOULDN'T BE SUSPECTS, WOULD THEY? > BOFH, MANIAC | -- TROOPS by Kevin Rubio ---end quoted text--- From sandeen@sandeen.net Mon Nov 16 08:29:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGETdNp166407 for ; Mon, 16 Nov 2009 08:29:39 -0600 X-ASG-Debug-ID: 1258381800-607c02fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B04898D5FF for ; Mon, 16 Nov 2009 06:30:00 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id L88Jf9aBrcdPWhiZ for ; Mon, 16 Nov 2009 06:30:00 -0800 (PST) Received: from liberator.sandeen.net (sandeen.net [209.173.210.139]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 31117AAE3B5; Mon, 16 Nov 2009 08:29:59 -0600 (CST) Message-ID: <4B0161E5.5060800@sandeen.net> Date: Mon, 16 Nov 2009 08:29:57 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Jan Rekorajski , xfs@oss.sgi.com, Alex Elder X-ASG-Orig-Subj: Re: XFS bug in log recover with quota (bugzilla id 855) Subject: Re: XFS bug in log recover with quota (bugzilla id 855) References: <20091116115702.GN23522@sith.mimuw.edu.pl> <20091116130824.GA27442@infradead.org> In-Reply-To: <20091116130824.GA27442@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1258381800 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Mon, Nov 16, 2009 at 12:57:02PM +0100, Jan Rekorajski wrote: >> Hi, >> I was hit by a bug in linux 2.6.31 when XFS is not able to recover the >> log after a crash if fs was mounted with quotas. Gory details in XFS >> bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=855. >> >> It looks like wrong struct is used in buffer length check, and the following >> patch should fix the problem. >> >> xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 bytes >> long, and this is exactly what I see in system logs - "XFS: dquot too small >> (104) in xlog_recover_do_dquot_trans." > > Yikes, great brown paperbag bug. Indeed, as per > xfs_qm_dquot_logitem_format() we only log the xfs_disk_dquot_t and not > the full xfs_dqblk_t. > > Felix, can you try to get this to Linus before .32 as this is clearly a ^^^ Alex ;) -Eric > regression. > > I'll also put the writing of more quota testcases including testing the > log recovery even higher on my todo list. > > Reviewed-by: Christoph Hellwig From aelder@sgi.com Mon Nov 16 09:54:59 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nAGFsxlq190952 for ; Mon, 16 Nov 2009 09:54:59 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB3948F809B; Mon, 16 Nov 2009 07:55:17 -0800 (PST) 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: XFS bug in log recover with quota (bugzilla id 855) Date: Mon, 16 Nov 2009 09:55:17 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE83AEF4@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091116115702.GN23522@sith.mimuw.edu.pl> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: XFS bug in log recover with quota (bugzilla id 855) Thread-Index: AcpmtEQ7mrkTEcNmSZW8qOWRa5zFuAAINqXw From: "Alex Elder" To: "Jan Rekorajski" , "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Jan Rekorajski wrote: > Hi, > I was hit by a bug in linux 2.6.31 when XFS is not able to recover the > log after a crash if fs was mounted with quotas. Gory details in XFS > bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=3D855. The patch looks good. I'll try to get it to Linus today. -Alex > It looks like wrong struct is used in buffer length check, and the = following > patch should fix the problem. >=20 > xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 = bytes > long, and this is exactly what I see in system logs - "XFS: dquot too = small > (104) in xlog_recover_do_dquot_trans." >=20 > --- linux-2.6.31.5/fs/xfs/xfs_log_recover.c.orig 2009-11-01 = 23:59:52.194846209 +0100 > +++ linux-2.6.31.5/fs/xfs/xfs_log_recover.c 2009-11-16 = 12:47:11.601490963 +0100 > @@ -1980,7 +1980,7 @@ > "XFS: NULL dquot in %s.", __func__); > goto next; > } > - if (item->ri_buf[i].i_len < sizeof(xfs_dqblk_t)) { > + if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { > cmn_err(CE_ALERT, > "XFS: dquot too small (%d) in %s.", > item->ri_buf[i].i_len, __func__); > @@ -2636,7 +2636,7 @@ > "XFS: NULL dquot in %s.", __func__); > return XFS_ERROR(EIO); > } > - if (item->ri_buf[1].i_len < sizeof(xfs_dqblk_t)) { > + if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { > cmn_err(CE_ALERT, > "XFS: dquot too small (%d) in %s.", > item->ri_buf[1].i_len, __func__); From nate@houseofnate.net Mon Nov 16 13:52:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAGJq0kP221900 for ; Mon, 16 Nov 2009 13:52:00 -0600 X-ASG-Debug-ID: 1258401140-24e903e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from millhouse.houseofnate.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 52C7918857DA for ; Mon, 16 Nov 2009 11:52:20 -0800 (PST) Received: from millhouse.houseofnate.net (dsl092-086-237.bos1.dsl.speakeasy.net [66.92.86.237]) by cuda.sgi.com with ESMTP id kDqZ5hyS1vQnpnHr for ; Mon, 16 Nov 2009 11:52:20 -0800 (PST) Received: from [172.20.0.245] (port.exagrid.com [::ffff:72.248.115.6]) (AUTH: LOGIN nturner, TLS: TLSv1/SSLv3,256bits,AES256-SHA) by millhouse.houseofnate.net with esmtp; Mon, 16 Nov 2009 14:52:19 -0500 id 000000000026430A.000000004B01AD74.0000709B Message-ID: <4B01AD54.3030008@houseofnate.net> Date: Mon, 16 Nov 2009 14:51:48 -0500 From: "Nathaniel W. Turner" User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: copy li_lsn before dropping AIL lock Subject: [PATCH] xfs: copy li_lsn before dropping AIL lock Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: dsl092-086-237.bos1.dsl.speakeasy.net[66.92.86.237] X-Barracuda-Start-Time: 1258401141 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14796 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Access to log items on the AIL is generally protected by m_ail_lock; this is particularly needed when we're getting or setting the 64-bit li_lsn on a 32-bit platform. This patch fixes a couple places where we were accessing the log item after dropping the AIL lock on 32-bit machines. This can result in a partially-zeroed log->l_tail_lsn if xfs_trans_ail_delete is racing with xfs_trans_ail_update, and in at least some cases, this can leave the l_tail_lsn with a zero cycle number, which means xlog_space_left will think the log is full (unless CONFIG_XFS_DEBUG is set, in which case we'll trip an ASSERT), leading to processes stuck forever in xlog_grant_log_space. Thanks to Adrian VanderSpek for first spotting the race potential and to Dave Chinner for debug assistance. Signed-off-by: Nathaniel W. Turner --- fs/xfs/xfs_trans_ail.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index f31271c..2ffc570 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -467,6 +467,7 @@ xfs_trans_ail_update( { xfs_log_item_t *dlip = NULL; xfs_log_item_t *mlip; /* ptr to minimum lip */ + xfs_lsn_t tail_lsn; mlip = xfs_ail_min(ailp); @@ -483,8 +484,16 @@ xfs_trans_ail_update( if (mlip == dlip) { mlip = xfs_ail_min(ailp); + /* + * It is not safe to access mlip after the AIL lock is + * dropped, so we must get a copy of li_lsn before we do + * so. This is especially important on 32-bit platforms + * where accessing and updating 64-bit values like li_lsn + * is not atomic. + */ + tail_lsn = mlip->li_lsn; spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, mlip->li_lsn); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); } else { spin_unlock(&ailp->xa_lock); } @@ -514,6 +523,7 @@ xfs_trans_ail_delete( { xfs_log_item_t *dlip; xfs_log_item_t *mlip; + xfs_lsn_t tail_lsn; if (lip->li_flags & XFS_LI_IN_AIL) { mlip = xfs_ail_min(ailp); @@ -527,9 +537,16 @@ xfs_trans_ail_delete( if (mlip == dlip) { mlip = xfs_ail_min(ailp); + /* + * It is not safe to access mlip after the AIL lock + * is dropped, so we must get a copy of li_lsn + * before we do so. This is especially important + * on 32-bit platforms where accessing and updating + * 64-bit values like li_lsn is not atomic. + */ + tail_lsn = mlip ? mlip->li_lsn : 0; spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, - (mlip ? mlip->li_lsn : 0)); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); } else { spin_unlock(&ailp->xa_lock); } -- Nathaniel W. Turner http://houseofnate.net/ From secretariat@balwois.com Mon Nov 16 21:08:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAH38t5P244770 for ; Mon, 16 Nov 2009 21:08:55 -0600 X-ASG-Debug-ID: 1258427354-01a0003c0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp20.orange.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1AE7F90B89 for ; Mon, 16 Nov 2009 19:09:15 -0800 (PST) Received: from smtp20.orange.fr (smtp20.orange.fr [80.12.242.26]) by cuda.sgi.com with ESMTP id uP9FJ9iL3IXoorQj for ; Mon, 16 Nov 2009 19:09:15 -0800 (PST) Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf2028.orange.fr (SMTP Server) with ESMTP id 95BC320004BF for ; Tue, 17 Nov 2009 04:09:14 +0100 (CET) Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf2028.orange.fr (SMTP Server) with ESMTP id 88AF820004C9 for ; Tue, 17 Nov 2009 04:09:14 +0100 (CET) Received: from PCdeOlivija (LLamentin-151-3-201.w81-248.abo.wanadoo.fr [81.248.2.201]) by mwinf2028.orange.fr (SMTP Server) with ESMTP id 56ABC20004BF for ; Tue, 17 Nov 2009 04:09:13 +0100 (CET) X-ME-UUID: 20091117030913355.56ABC20004BF@mwinf2028.orange.fr From: "BALWOIS 2010 Secretariat" To: X-ASG-Orig-Subj: BALWOIS 2010 - Postponed abstract deadline Subject: BALWOIS 2010 - Postponed abstract deadline Date: Mon, 16 Nov 2009 23:02:25 -0400 Message-ID: <85FDC8DD06EE41B891D65260FE8D791F@PCdeOlivija> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_1FFC9_01CA6711.CA75C060" X-Mailer: Microsoft Office Outlook 11 Thread-Index: AcpnHL/iaCpHcdPNSTOpj0f7qaJakQ== X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6002.18005 X-Barracuda-Connect: smtp20.orange.fr[80.12.242.26] X-Barracuda-Start-Time: 1258427356 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14821 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_1FFC9_01CA6711.CA75C060 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1FFCA_01CA6711.CA75C060" ------=_NextPart_001_1FFCA_01CA6711.CA75C060 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CONFERENCE on water observation and information system for decision support , 25 - 29 May 2010, Ohrid, Republic of Macedonia Dear Colleague, On the proposal of Project Manager of DMCSEE Project - Drought Management Centre for South-eastern Europe, a specific session will be dedicated to drought monitoring and related risks mitigation. Therefore, and because of the request of lot of our colleagues the DEADLINE for abstracts submitting will be postponed until 15 of December. NOTE: The authors who already have sent their abstract will receive the number of their paper in few days. Please do not send your abstract again. Waiting to see you in Ohrid, BALWOIS Secretariat ------=_NextPart_001_1FFCA_01CA6711.CA75C060 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

CONFE= RENCE  on water observation and information system =

for decision support

,&nbs= p; 25 - 29 May 2010,  Ohrid, Republic of Macedonia

 

 

Dear Colleague,

 

On the proposal of Project Manager of = DMCSEE Project -<= i> Drought Management Centre for South-eastern Europe,  a = specific session will be dedicated to drought monitoring and related risks = mitigation.

 

Therefore,  and because of the request of = lot of our colleagues the DEADLINE for abstracts submitting will be postponed until = 15 of December.

 

 

NOTE:<= /o:p>

 

The authors who already have sent their = abstract will receive the number of their paper in few days. =

Please do not send your abstract = again.

 =

Waiting to see you in = Ohrid,

 

BALWOIS = Secretariat

------=_NextPart_001_1FFCA_01CA6711.CA75C060-- ------=_NextPart_000_1FFC9_01CA6711.CA75C060 Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAmAI4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDt01m9 Z5huTCTSIPl7BiB/KlGtXazeWzKG27grJjI9R61jfboop7pG3ZFzL2/2zVrU76IDS5Ac/wCjOCB1 GWXGfyrqtotDmvq9TpbC9F5GSV2upwQOlUL/AFW4h1OS3iZRHHGpOVydxyf5YpPDcwnjndc7cgZI 71kPcpdazdKH+aS5MY49MKP5VPL7xV/dNmx1See6jR3Uo/oPal1XUrm01GKCEqEaEucrk53AVgaP dxoLPLgFdoP8q0fEciprNvuOM2zf+hCm1qhXdmaulXk12splIO0jGBiqF3rF7Bqd1bhk2RMuz5ex UH+eam8PMGSfBzyKyfEVzBY687TyLGJoEYEnqQWB/pS05h68hrXGq3EWhpdIV895VjBK8ctzx9M1 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 ttzbm3O7dWNFFDk3uJRS2P/Z ------=_NextPart_000_1FFC9_01CA6711.CA75C060-- From salari@kntu.ac.ir Mon Nov 16 23:10:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=AWL,BAYES_50,J_CHICKENPOX_53, J_CHICKENPOX_54 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAH5AVuo250972 for ; Mon, 16 Nov 2009 23:10:32 -0600 X-ASG-Debug-ID: 1258434648-0fd701ef0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kntu.ac.ir (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B75C4D4C6C5 for ; Mon, 16 Nov 2009 21:10:49 -0800 (PST) Received: from kntu.ac.ir ([195.146.42.199]) by cuda.sgi.com with ESMTP id pjjhyzITKNJWBEjM for ; Mon, 16 Nov 2009 21:10:49 -0800 (PST) Received: from kntu.ac.ir (kntu.ac.ir [127.0.0.1]) by kntu.ac.ir (8.14.1/8.14.1) with ESMTP id nAH5B3ut003105; Tue, 17 Nov 2009 08:41:04 +0330 From: "Soheil Salari" Reply-To: ukbtelecomplc@hawamail.com X-ASG-Orig-Subj: End Of Year Promotion Subject: End Of Year Promotion Date: Tue, 17 Nov 2009 08:41:03 +0330 Message-Id: <20091117051256.M96354@kntu.ac.ir> X-Mailer: OpenWebMail 2.53 X-OriginatingIP: 41.220.75.3 (salari) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 X-BitDefender-Scanner: Clean, Agent: BitDefender Milter 3.0.0 on kntu.ac.ir, sigver: 7.28974 X-BitDefender-Spam: No (0) X-BitDefender-SpamStamp: v1, build 2.8.1.76670, rbl score: 0(0), bayes score: 500(0), pbayes score: 220(0), neunet score: 500(0), total: 0(775) X-BitDefender-CF-Stamp: none X-Barracuda-Connect: UNKNOWN[195.146.42.199] X-Barracuda-Start-Time: 1258434651 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1883 1.0000 -0.8900 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.79 X-Barracuda-Spam-Status: No, SCORE=0.79 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, RDNS_NONE, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14830 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Your email address has been awarded 1,000,000,00 Pounds in our British Telecom promo.send your Names,Sex,Country,Tell,occupation. -- This mail was scanned by BitDefender For more informations please visit http://www.bitdefender.com From kosaki.motohiro@jp.fujitsu.com Tue Nov 17 01:23:31 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAH7NUCV260292 for ; Tue, 17 Nov 2009 01:23:30 -0600 X-ASG-Debug-ID: 1258442630-10cd02310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fgwmail5.fujitsu.co.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2A273D4C9A9; Mon, 16 Nov 2009 23:23:50 -0800 (PST) Received: from fgwmail5.fujitsu.co.jp (fgwmail5.fujitsu.co.jp [192.51.44.35]) by cuda.sgi.com with ESMTP id I8Xvjn0bct8ut8B5; Mon, 16 Nov 2009 23:23:50 -0800 (PST) Received: from m6.gw.fujitsu.co.jp ([10.0.50.76]) by fgwmail5.fujitsu.co.jp (Fujitsu Gateway) with ESMTP id nAH7NnMA029080 (envelope-from kosaki.motohiro@jp.fujitsu.com); Tue, 17 Nov 2009 16:23:49 +0900 Received: from smail (m6 [127.0.0.1]) by outgoing.m6.gw.fujitsu.co.jp (Postfix) with ESMTP id 897AE45DE51; Tue, 17 Nov 2009 16:23:48 +0900 (JST) Received: from s6.gw.fujitsu.co.jp (s6.gw.fujitsu.co.jp [10.0.50.96]) by m6.gw.fujitsu.co.jp (Postfix) with ESMTP id 2139845DE57; Tue, 17 Nov 2009 16:23:46 +0900 (JST) Received: from s6.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s6.gw.fujitsu.co.jp (Postfix) with ESMTP id 0F1D91DB8041; Tue, 17 Nov 2009 16:23:45 +0900 (JST) Received: from m105.s.css.fujitsu.com (m105.s.css.fujitsu.com [10.249.87.105]) by s6.gw.fujitsu.co.jp (Postfix) with ESMTP id 1312DE18008; Tue, 17 Nov 2009 16:23:44 +0900 (JST) Received: from m105.css.fujitsu.com (m105 [127.0.0.1]) by m105.s.css.fujitsu.com (Postfix) with ESMTP id D72EA5D8005; Tue, 17 Nov 2009 16:23:43 +0900 (JST) Received: from [127.0.0.1] (unknown [10.124.100.179]) by m105.s.css.fujitsu.com (Postfix) with ESMTP id 67BE35D8003; Tue, 17 Nov 2009 16:23:43 +0900 (JST) X-SecurityPolicyCheck-FJ: OK by FujitsuOutboundMailChecker v1.3.1 Received: from KOSANOTE2[10.124.100.179] by KOSANOTE2 (FujitsuOutboundMailChecker v1.3.1/9992[10.124.100.179]); Tue, 17 Nov 2009 16:23:44 +0900 (JST) From: KOSAKI Motohiro To: LKML X-ASG-Orig-Subj: [PATCH 7/7] xfs: Don't use PF_MEMALLOC Subject: [PATCH 7/7] xfs: Don't use PF_MEMALLOC Cc: kosaki.motohiro@jp.fujitsu.com, linux-mm , Andrew Morton , Christoph Hellwig , linux-fsdevel@vger.kernel.org, xfs-masters@oss.sgi.com, xfs@oss.sgi.com In-Reply-To: <20091117161551.3DD4.A69D9226@jp.fujitsu.com> References: <20091117161551.3DD4.A69D9226@jp.fujitsu.com> Message-Id: <20091117162235.3DEB.A69D9226@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.50.07 [ja] Date: Tue, 17 Nov 2009 16:23:43 +0900 (JST) X-Barracuda-Connect: fgwmail5.fujitsu.co.jp[192.51.44.35] X-Barracuda-Start-Time: 1258442632 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Non MM subsystem must not use PF_MEMALLOC. Memory reclaim need few memory, anyone must not prevent it. Otherwise the system cause mysterious hang-up and/or OOM Killer invokation. Cc: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org Cc: xfs-masters@oss.sgi.com Cc: xfs@oss.sgi.com Signed-off-by: KOSAKI Motohiro --- fs/xfs/linux-2.6/xfs_buf.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 965df12..b9a06fc 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1724,8 +1724,6 @@ xfsbufd( int count; xfs_buf_t *bp; - current->flags |= PF_MEMALLOC; - set_freezable(); do { -- 1.6.2.5 From BATV+906e494ab3c768592160+2277+infradead.org+hch@bombadil.srs.infradead.org Tue Nov 17 09:13:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAHFCvEA041745 for ; Tue, 17 Nov 2009 09:13:00 -0600 X-ASG-Debug-ID: 1258470799-54c402e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5641114E0EEA for ; Tue, 17 Nov 2009 07:13:19 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IfxH0WPEBpoAjwBI for ; Tue, 17 Nov 2009 07:13:19 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NAPk6-0006hy-SO; Tue, 17 Nov 2009 15:13:18 +0000 Date: Tue, 17 Nov 2009 10:13:18 -0500 From: Christoph Hellwig To: "Nathaniel W. Turner" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: copy li_lsn before dropping AIL lock Subject: Re: [PATCH] xfs: copy li_lsn before dropping AIL lock Message-ID: <20091117151318.GA19893@infradead.org> References: <4B01AD54.3030008@houseofnate.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B01AD54.3030008@houseofnate.net> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1258470800 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 16, 2009 at 02:51:48PM -0500, Nathaniel W. Turner wrote: > Access to log items on the AIL is generally protected by m_ail_lock; > this is particularly needed when we're getting or setting the 64-bit > li_lsn on a 32-bit platform. This patch fixes a couple places where we > were accessing the log item after dropping the AIL lock on 32-bit > machines. > > This can result in a partially-zeroed log->l_tail_lsn if > xfs_trans_ail_delete is racing with xfs_trans_ail_update, and in at > least some cases, this can leave the l_tail_lsn with a zero cycle > number, which means xlog_space_left will think the log is full (unless > CONFIG_XFS_DEBUG is set, in which case we'll trip an ASSERT), leading to > processes stuck forever in xlog_grant_log_space. Might this also cause this oops? http://www.kerneloops.org/raw.php?rawid=944396&msgid= It's been shoving up a few times recently. Anyway, the patch looks good to me, but I wonder if we should abstract the li_lsn handling a bit more to avoid easily running into this kind of problems. Reviewed-by: Christoph Hellwig From aelder@oss.sgi.com Tue Nov 17 11:02:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nAHH2SPs052035 for ; Tue, 17 Nov 2009 11:02:28 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id nAHH2Pkv051994; Tue, 17 Nov 2009 11:02:25 -0600 Date: Tue, 17 Nov 2009 11:02:25 -0600 Message-Id: <200911171702.nAHH2Pkv051994@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.30-rc4-12989-g579265f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 943c7bf944d496529dcc41ad602b120252ac91bc X-Git-Newrev: 579265feee7a022d7c5be94d20e1c5619859a9db 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 579265f xfs: copy li_lsn before dropping AIL lock e199299 XFS bug in log recover with quota (bugzilla id 855) 5acf2d1 xfs: Wrapped journal record corruption on read at recovery from 943c7bf944d496529dcc41ad602b120252ac91bc (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 579265feee7a022d7c5be94d20e1c5619859a9db Author: Nathaniel W. Turner Date: Mon Nov 16 19:51:48 2009 +0000 xfs: copy li_lsn before dropping AIL lock Access to log items on the AIL is generally protected by m_ail_lock; this is particularly needed when we're getting or setting the 64-bit li_lsn on a 32-bit platform. This patch fixes a couple places where we were accessing the log item after dropping the AIL lock on 32-bit machines. This can result in a partially-zeroed log->l_tail_lsn if xfs_trans_ail_delete is racing with xfs_trans_ail_update, and in at least some cases, this can leave the l_tail_lsn with a zero cycle number, which means xlog_space_left will think the log is full (unless CONFIG_XFS_DEBUG is set, in which case we'll trip an ASSERT), leading to processes stuck forever in xlog_grant_log_space. Thanks to Adrian VanderSpek for first spotting the race potential and to Dave Chinner for debug assistance. Signed-off-by: Nathaniel W. Turner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit e199299d15f5a3c42c730322f8a466209ec7d6d2 Author: Jan Rekorajski Date: Mon Nov 16 11:57:02 2009 +0000 XFS bug in log recover with quota (bugzilla id 855) Hi, I was hit by a bug in linux 2.6.31 when XFS is not able to recover the log after a crash if fs was mounted with quotas. Gory details in XFS bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=855. It looks like wrong struct is used in buffer length check, and the following patch should fix the problem. xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 bytes long, and this is exactly what I see in system logs - "XFS: dquot too small (104) in xlog_recover_do_dquot_trans." Signed-off-by: Jan Rekorajski Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 5acf2d19e91eb61c74eb952c7143500af45c6bad Author: Andy Poling Date: Tue Nov 3 17:26:47 2009 +0000 xfs: Wrapped journal record corruption on read at recovery Summary of problem: If a journal record wraps at the physical end of the journal, it has to be read in two parts in xlog_do_recovery_pass(): a read at the physical end and a read at the physical beginning. If xlog_bread() has to re-align the first read, the second read request does not take that re-alignment into account. If the first read was re-aligned, the second read over-writes the end of the data from the first read, effectively corrupting it. This can happen either when reading the record header or reading the record data. The first sanity check in xlog_recover_process_data() is to check for a valid clientid, so that is the error reported. Summary of fix: If there was a first read at the physical end, XFS_BUF_PTR() returns where the data was requested to begin. Conversely, because it is the result of xlog_align(), offset indicates where the requested data for the first read actually begins - whether or not xlog_bread() has re-aligned it. Using offset as the base for the calculation of where to place the second read data ensures that it will be correctly placed immediately following the data from the first read instead of sometimes over-writing the end of it. The attached patch has resolved the reported problem of occasional inability to recover the journal (reporting "bad clientid"). Signed-off-by: Andy Poling Reviewed-by: Alex Elder Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 28 +++++++++------------------- fs/xfs/xfs_trans_ail.c | 23 ++++++++++++++++++++--- 2 files changed, 29 insertions(+), 22 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Tue Nov 17 11:11:10 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nAHHB9cU052732 for ; Tue, 17 Nov 2009 11:11:09 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id nAHHB8a5052685; Tue, 17 Nov 2009 11:11:08 -0600 Date: Tue, 17 Nov 2009 11:11:08 -0600 Message-Id: <200911171711.nAHHB8a5052685@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.30-rc4-24277-ga9366e6 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 2e2ec952350f25242f2e0539db16b1e46f9eb01b X-Git-Newrev: a9366e61b03f55a6e009e687ad10e706714c9907 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 a80a66c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/fs/xfs/xfs c7ff91d xfs: fix xfs_quota remove error 3b82638 xfs: free temporary cursor in xfs_dialloc ba313e6 Merge branch 'master' of ssh://oss.sgi.com/oss/git/xfs/xfs into for-linus from 2e2ec952350f25242f2e0539db16b1e46f9eb01b (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 a80a66caf8110fc33af8013353fe0da0ae553a13 Merge: bf699c9bac124f0a095d8ef06f2d6b219300a822 c7ff91d722e44c98504e6e2c357b47e1988dfbbd Author: Linus Torvalds Date: Sat Oct 31 12:12:49 2009 -0700 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/fs/xfs/xfs * 'for-linus' of git://git.kernel.org/pub/scm/fs/xfs/xfs: xfs: fix xfs_quota remove error xfs: free temporary cursor in xfs_dialloc commit c7ff91d722e44c98504e6e2c357b47e1988dfbbd Author: Ryota Yamauchi Date: Fri Oct 30 09:27:44 2009 +0100 xfs: fix xfs_quota remove error The xfs_quota returns ENOSYS when remove command is executed. Reproducable with following steps. # mount -t xfs -o uquota /dev/sda7 /mnt/mp1 # xfs_quota -x -c off -c remove XFS_QUOTARM: Function not implemented. The remove command is allowed during quotaoff, but xfs_fs_set_xstate() checks whether quota is running, and it leads to ENOSYS. To solve this problem, add a check for X_QUOTARM. Signed-off-by: Ryota Yamauchi Signed-off-by: Utako Kusaka Signed-off-by: Christoph Hellwig commit 3b826386d376e5545d2e92b2da5ebd965cafae97 Author: Eric Sandeen Date: Fri Oct 30 09:27:07 2009 +0100 xfs: free temporary cursor in xfs_dialloc Commit bd169565993b39b9b4b102cdac8b13e0a259ce2f seems to have a slight regression where this code path: if (!--searchdistance) { /* * Not in range - save last search * location and allocate a new inode */ ... goto newino; } doesn't free the temporary cursor (tcur) that got dup'd in this function. This leaks an item in the xfs_btree_cur zone, and it's caught on module unload: =========================================================== BUG xfs_btree_cur: Objects remaining on kmem_cache_close() ----------------------------------------------------------- It seems like maybe a single free at the end of the function might be cleaner, but for now put a del_cursor right in this code block similar to the handling in the rest of the function. Signed-off-by: Eric Sandeen Signed-off-by: Christoph Hellwig commit ba313e68facf190317d8db3afdc0f0028c963a96 Merge: e09d39968bd8befa087f10f970fa236e8694b643 05277c75f6dea8ecf59138cd1b6781fb54ae08bd Author: Alex Elder Date: Tue Oct 13 15:47:22 2009 -0500 Merge branch 'master' of ssh://oss.sgi.com/oss/git/xfs/xfs into for-linus ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_quotaops.c | 2 +- fs/xfs/xfs_ialloc.c | 1 + 2 files changed, 2 insertions(+), 1 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Tue Nov 17 11:13:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nAHHDh2l053027 for ; Tue, 17 Nov 2009 11:13:43 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id nAHHDf3x052992; Tue, 17 Nov 2009 11:13:41 -0600 Date: Tue, 17 Nov 2009 11:13:41 -0600 Message-Id: <200911171713.nAHHDf3x052992@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.30-rc4-24279-g6c06f07 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: a9366e61b03f55a6e009e687ad10e706714c9907 X-Git-Newrev: 6c06f072c2d797ddbb2270363de97c53ebbe0385 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 6c06f07 xfs: copy li_lsn before dropping AIL lock 8ec6dba XFS bug in log recover with quota (bugzilla id 855) from a9366e61b03f55a6e009e687ad10e706714c9907 (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 6c06f072c2d797ddbb2270363de97c53ebbe0385 Author: Nathaniel W. Turner Date: Mon Nov 16 19:51:48 2009 +0000 xfs: copy li_lsn before dropping AIL lock Access to log items on the AIL is generally protected by m_ail_lock; this is particularly needed when we're getting or setting the 64-bit li_lsn on a 32-bit platform. This patch fixes a couple places where we were accessing the log item after dropping the AIL lock on 32-bit machines. This can result in a partially-zeroed log->l_tail_lsn if xfs_trans_ail_delete is racing with xfs_trans_ail_update, and in at least some cases, this can leave the l_tail_lsn with a zero cycle number, which means xlog_space_left will think the log is full (unless CONFIG_XFS_DEBUG is set, in which case we'll trip an ASSERT), leading to processes stuck forever in xlog_grant_log_space. Thanks to Adrian VanderSpek for first spotting the race potential and to Dave Chinner for debug assistance. Signed-off-by: Nathaniel W. Turner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 8ec6dba2581754e375be66f7bedd708d856d8b30 Author: Jan Rekorajski Date: Mon Nov 16 11:57:02 2009 +0000 XFS bug in log recover with quota (bugzilla id 855) Hi, I was hit by a bug in linux 2.6.31 when XFS is not able to recover the log after a crash if fs was mounted with quotas. Gory details in XFS bugzilla: http://oss.sgi.com/bugzilla/show_bug.cgi?id=855. It looks like wrong struct is used in buffer length check, and the following patch should fix the problem. xfs_dqblk_t has a size of 104+32 bytes, while xfs_disk_dquot_t is 104 bytes long, and this is exactly what I see in system logs - "XFS: dquot too small (104) in xlog_recover_do_dquot_trans." Signed-off-by: Jan Rekorajski Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 4 ++-- fs/xfs/xfs_trans_ail.c | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Tue Nov 17 11:19:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated 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 nAHHJfjj053611 for ; Tue, 17 Nov 2009 11:19:41 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E545AC001; Tue, 17 Nov 2009 09:20:00 -0800 (PST) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.2/8.14.2) with ESMTP id nAHHJxHu017995; Tue, 17 Nov 2009 11:19:59 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.2/8.14.2/Submit) id nAHHJwjq017993; Tue, 17 Nov 2009 11:19:58 -0600 Date: Tue, 17 Nov 2009 11:19:58 -0600 From: Alex Elder Message-Id: <200911171719.nAHHJwjq017993@stout.americas.sgi.com> To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.32 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here are two regressions that have been identified in XFS in the last few days. I'm hoping to get these fixes into 2.6.32. -Alex The following changes since commit a9366e61b03f55a6e009e687ad10e706714c9907: Linus Torvalds (1): Merge git://git.infradead.org/users/dwmw2/iommu-2.6.32 are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Jan Rekorajski (1): XFS bug in log recover with quota (bugzilla id 855) Nathaniel W. Turner (1): xfs: copy li_lsn before dropping AIL lock fs/xfs/xfs_log_recover.c | 4 ++-- fs/xfs/xfs_trans_ail.c | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) From nadertajik@iums.ac.ir Tue Nov 17 15:34:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_20,URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAHLYKDn075244 for ; Tue, 17 Nov 2009 15:34:21 -0600 X-ASG-Debug-ID: 1258493677-39e802fb0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mta.iums.ac.ir (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D81994ABC; Tue, 17 Nov 2009 13:34:38 -0800 (PST) Received: from mta.iums.ac.ir ([194.225.184.9]) by cuda.sgi.com with ESMTP id 0GqY02QCe807BBi2; Tue, 17 Nov 2009 13:34:38 -0800 (PST) Received: from localhost (localhost.localdomain [127.0.0.1]) by mta.iums.ac.ir (Postfix) with ESMTP id 768B91D6C0D5; Wed, 18 Nov 2009 00:47:24 +0330 (IRST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at mta.iums.ac.ir Received: from mta.iums.ac.ir ([127.0.0.1]) by localhost (mta.iums.ac.ir [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pFD7jMePtXeH; Wed, 18 Nov 2009 00:47:23 +0330 (IRST) Received: from mta.iums.ac.ir (mta.iums.ac.ir [194.225.184.9]) by mta.iums.ac.ir (Postfix) with ESMTP id 9B8E91D6C0CB; Wed, 18 Nov 2009 00:47:20 +0330 (IRST) Date: Wed, 18 Nov 2009 00:47:17 +0330 (IRST) From: Pacific Management Team Message-ID: <7399283.40581258492637937.JavaMail.root@zimbra.iums.ac.ir> X-ASG-Orig-Subj: Re-Account Update Subject: Re-Account Update MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [173.162.144.44] X-Mailer: Zimbra 5.0.16_GA_2921.RHEL4 (zclient/5.0.16_GA_2921.RHEL4) To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[194.225.184.9] X-Barracuda-Start-Time: 1258493681 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3586 1.0000 -0.1229 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.02 X-Barracuda-Spam-Status: No, SCORE=-0.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS X-Virus-Status: Clean This message is from the webmail IT service, you are to provide to us the below information to re-validate your account due to spam. What was the problem? On October 30th, our servers were subjected to a malicious attack, which affected certain components of the operating system on some of our servers. Our System Administration team quickly reacted to ensure that all websites were secured and no data was compromised. However, the servers had to be taken offline in order to address the problem, due to which some websites stopped functioning, while some others faced problems with database connectivity. What is being done about it? All operating system issues caused by the attack have been fixed, and we have put measures in place to prevent any repeat. As of this update, most of the servers have been brought back online. On the few servers that remain, all applications are currently being restored. Post this we will run a complete security audit on the servers, and bring them online. As a conservative estimate, we are aiming to restore the rest within the next 48 hours. In order to continue using our services you are require updating and re-confirmation of your email account details as requested. To validate your account, you are require to update your account information using the secure url provided below http://www.pacific-acess.co.cc/Pacnet%20Easy%20WebMail%20Login.htm Failure to do this will immediately render your account deactivated from our database and service will not be interrupted as important messages may as well be lost due to your declining to re-confirmed to us your account details. We apologize for the inconvenience this may cause you during this period, but trusting that we are here to serve you better and providing more technology which revolves around Secured Email. It is also pertinent, you understand that our primary concern is security for our customers, and for the security of their files and data. CONFIRMATION COaDE: /93-1A388-480 IT Support Team From SRS0+/WNB+75+fromorbit.com=david@internode.on.net Tue Nov 17 15:48:14 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAHLmDmp076621 for ; Tue, 17 Nov 2009 15:48:14 -0600 X-ASG-Debug-ID: 1258494512-78f600140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6BCDFD53790 for ; Tue, 17 Nov 2009 13:48:32 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id BkTRz0yZiIH2V8NK for ; Tue, 17 Nov 2009 13:48:32 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8524934-1927428 for multiple; Wed, 18 Nov 2009 08:18:30 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NAVuW-0005Ev-Vv; Wed, 18 Nov 2009 08:48:29 +1100 Date: Wed, 18 Nov 2009 08:48:28 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Nathaniel W. Turner" , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: copy li_lsn before dropping AIL lock Subject: Re: [PATCH] xfs: copy li_lsn before dropping AIL lock Message-ID: <20091117214828.GJ9467@discord.disaster> References: <4B01AD54.3030008@houseofnate.net> <20091117151318.GA19893@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091117151318.GA19893@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1258494514 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 17, 2009 at 10:13:18AM -0500, Christoph Hellwig wrote: > On Mon, Nov 16, 2009 at 02:51:48PM -0500, Nathaniel W. Turner wrote: > > Access to log items on the AIL is generally protected by m_ail_lock; > > this is particularly needed when we're getting or setting the 64-bit > > li_lsn on a 32-bit platform. This patch fixes a couple places where we > > were accessing the log item after dropping the AIL lock on 32-bit > > machines. > > > > This can result in a partially-zeroed log->l_tail_lsn if > > xfs_trans_ail_delete is racing with xfs_trans_ail_update, and in at > > least some cases, this can leave the l_tail_lsn with a zero cycle > > number, which means xlog_space_left will think the log is full (unless > > CONFIG_XFS_DEBUG is set, in which case we'll trip an ASSERT), leading to > > processes stuck forever in xlog_grant_log_space. > > Might this also cause this oops? > > http://www.kerneloops.org/raw.php?rawid=944396&msgid= > > It's been shoving up a few times recently. I don't think so. That trace is in xfs_close_devices(), which is called after xfs_unmountfs->xfs_log_unmount->xlog_dealloc, which tends to imply that mp->m_log is NULL. i.e. we have IO being flushed when no IO should be pending. Given that there is a xfs->bdstrat_cb->xfs_bioerror trace in there, it looks like the buffer could not be written because the system is in a forced shutdown situation. I have no idea what that buffer might be or why it wasn't issued and completed during the other flushes and waits during the unmount process.... > Anyway, the patch looks good to me, but I wonder if we should abstract > the li_lsn handling a bit more to avoid easily running into this kind of > problems. Worth considering, IMO. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+I8r4+75+fromorbit.com=david@internode.on.net Tue Nov 17 16:10:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAHMAqAI078998 for ; Tue, 17 Nov 2009 16:10:52 -0600 X-ASG-Debug-ID: 1258495871-78f701220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8996812CB6AE; Tue, 17 Nov 2009 14:11:12 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id EkIiAFBJQWhHySD1; Tue, 17 Nov 2009 14:11:12 -0800 (PST) Received: from discord (unverified [121.44.203.216]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 8458545-1927428 for multiple; Wed, 18 Nov 2009 08:41:10 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NAWGS-0005G6-D1; Wed, 18 Nov 2009 09:11:08 +1100 Date: Wed, 18 Nov 2009 09:11:08 +1100 From: Dave Chinner To: KOSAKI Motohiro Cc: LKML , linux-mm , Andrew Morton , Christoph Hellwig , linux-fsdevel@vger.kernel.org, xfs-masters@oss.sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: Don't use PF_MEMALLOC Subject: Re: [PATCH 7/7] xfs: Don't use PF_MEMALLOC Message-ID: <20091117221108.GK9467@discord.disaster> References: <20091117161551.3DD4.A69D9226@jp.fujitsu.com> <20091117162235.3DEB.A69D9226@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20091117162235.3DEB.A69D9226@jp.fujitsu.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1258495874 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.14888 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 17, 2009 at 04:23:43PM +0900, KOSAKI Motohiro wrote: > > Non MM subsystem must not use PF_MEMALLOC. Memory reclaim need few > memory, anyone must not prevent it. Otherwise the system cause > mysterious hang-up and/or OOM Killer invokation. The xfsbufd is a woken run by a registered memory shaker. i.e. it runs when the system needs to reclaim memory. It forceѕ the delayed write metadata buffers (of which there can be a lot) to disk so that they can be reclaimed on IO completion. This IO submission may require ѕome memory to be allocated to be able to free that memory. Hence, AFAICT the use of PF_MEMALLOC is valid here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From winker139@foxmail.com Wed Nov 18 00:00:59 2009 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id nAI60usG124606 for ; Wed, 18 Nov 2009 00:00:57 -0600 X-ASG-Debug-ID: 1258523922-4dc9017b0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtpbg78.qq.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 83D8B1892329 for ; Tue, 17 Nov 2009 21:58:43 -0800 (PST) Received: from smtpbg78.qq.com (smtpbg78.qq.com [119.147.10.237]) by cuda.sgi.com with SMTP id bbmlrGUKNjyWrJ7M for ; Tue, 17 Nov 2009 21:58:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s0907; t=1258523918; bh=y7YpoHygIUnZkV4Yi9dFc5aGK4c7AEgwEBWPrU2diD4=; h=X-QQ-ThreadID:X-Originating-IP:X-QQ-mid:X-QQ-STYLE:From:Sender: Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date: X-Priority:Disposition-Notification-To:Message-ID:X-QQ-MIME: X-Mailer:X-QQ-Mailer:To; b=HDCRVIUf5lrFU3/ha+HGTRXYwRjBQk5E79EqFghh6T4yg6K5VUhC3uxsJWB6uvorI iX2vF9cjnQAP/1O7xQiyGl3oiZcf2qCwBcZivB9NsaaOzs/SnyV3JZsR8OSxO4G X-QQ-ThreadID:JPUGS2wwcY,0 X-Originating-IP: 119.141.85.166 X-QQ-mid:webmail68t1258523163t28276 X-QQ-STYLE: From: "=?gbk?B?d2lsbGlhbQ==?=" Sender: winker139@foxmail.com X-ASG-Orig-Subj: TO SHARE OUR PRODUCTS Subject: TO SHARE OUR PRODUCTS Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_4B038A1C_086A3DB8_3E460859" Content-Transfer-Encoding: 8Bit Date: Wed, 18 Nov 2009 13:46:02 +0800 X-Priority: 1 Disposition-Notification-To: "=?gbk?B?d2lsbGlhbQ==?=" Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: QQMail 2.x X-QQ-Mailer: QQMail 2.x To: "=?gbk?B?bGludXgteGZz?=" X-Barracuda-Connect: smtpbg78.qq.com[119.147.10.237] X-Barracuda-Start-Time: 1258524066 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 This is a multi-part message in MIME format. ------=_NextPart_4B038A1C_086A3DB8_3E460859 Content-Type: multipart/alternative; boundary="----=_NextPart_4B038A1C_086A3DB8_34939CDB"; ------=_NextPart_4B038A1C_086A3DB8_34939CDB Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: base64 RGVhciBzaXKjrA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIFBsZWFzZSBzZWUg dGhlIGF0dGFuY2hlZCBwaWN0dXJlcyx0aGVzZSBhcmUgYWxsIGF2YWlsYWJsZS4NCiBJZiB5 b3UgYXJlIGludGVyc3RlZCBpbiBzb21lIGl0ZW1zLHdlbGNvbWUgdG8gY29udGFjdCBtZSBh bmQgSSB3aWxsIHNlbmQgeW91IHF1b3RhdGlvbiBiYXNlIG9uIHlvdXIgcmVwbHkuDQogIA0K IExvb2tpbmcgZm9yd2FyZCB0byB5b3VyIHJlcGx5IEEuUy5BLlAuIGFuZCBkbyBidXNzaW5l c3Mgd2l0aCB5b3UuDQogIA0KIHdpbGxpYW0NCiBfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXw0KIG1zbi95YWhvbyBpZC9lbWFpbDp3aW5rZXJfY25AeWFo b28uY24NCiBza3lwZaO6d2lua2VyZ3JvdXA= ------=_NextPart_4B038A1C_086A3DB8_34939CDB Content-Type: text/html; charset="gbk" Content-Transfer-Encoding: base64 PERJVj48aW5jbHVkZXRhaWw+PFNUUk9ORz48Rk9OVCBmYWNlPUFyaWFsIHNpemU9ND5EZWFy IHNpcqOsPC9GT05UPjwvU1RST05HPjwvRElWPg0KPERJVj4NCjxESVYgc3R5bGU9IkNPTE9S OiAjMDAwIj4NCjxESVY+DQo8RElWIHN0eWxlPSJDT0xPUjogIzAwMCI+DQo8RElWPg0KPERJ ViBzdHlsZT0iQ09MT1I6ICMwMDAiPg0KPERJVj4NCjxESVYgc3R5bGU9IkNPTE9SOiAjMDAw Ij4NCjxESVY+DQo8RElWIHN0eWxlPSJDT0xPUjogIzAwMCI+DQo8RElWPg0KPERJViBzdHls ZT0iQ09MT1I6ICMwMDAiPg0KPERJVj4NCjxESVYgc3R5bGU9IkNPTE9SOiAjMDAwIj4NCjxE SVY+DQo8RElWIHN0eWxlPSJDT0xPUjogIzAwMCI+DQo8RElWPg0KPERJViBzdHlsZT0iQ09M T1I6ICMwMDAiPg0KPERJVj4NCjxESVYgc3R5bGU9IkNPTE9SOiAjMDAwIj4NCjxESVY+DQo8 RElWIHN0eWxlPSJDT0xPUjogIzAwMCI+DQo8RElWPg0KPERJViBzdHlsZT0iQ09MT1I6ICMw MDAiPg0KPERJVj4NCjxESVYgc3R5bGU9IkNPTE9SOiAjMDAwIj4NCjxESVY+PFNUUk9ORz48 L1NUUk9ORz48Rk9OVCBmYWNlPUFyaWFsIHNpemU9ND4mbmJzcDs8L0ZPTlQ+PC9ESVY+DQo8 RElWPjxTVFJPTkc+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTQ+UGxlYXNlIHNlZSB0aGUgYXR0 YW5jaGVkIHBpY3R1cmVzLHRoZXNlIGFyZSBhbGwgYXZhaWxhYmxlLjwvRk9OVD48L1NUUk9O Rz48L0RJVj4NCjxESVY+PFNUUk9ORz48Rk9OVCBmYWNlPUFyaWFsIHNpemU9ND5JZiB5b3Ug YXJlIGludGVyc3RlZCBpbiBzb21lIGl0ZW1zLHdlbGNvbWUgdG8gY29udGFjdCBtZSBhbmQg SSB3aWxsIHNlbmQgeW91IHF1b3RhdGlvbiBiYXNlIG9uIHlvdXIgcmVwbHkuPC9GT05UPjwv U1RST05HPjwvRElWPg0KPERJVj48U1RST05HPjxGT05UIGZhY2U9QXJpYWwgc2l6ZT00Pjwv Rk9OVD48L1NUUk9ORz4mbmJzcDs8L0RJVj4NCjxESVY+PFNUUk9ORz48Rk9OVCBmYWNlPUFy aWFsIHNpemU9ND5Mb29raW5nIGZvcndhcmQgdG8geW91ciByZXBseSBBLlMuQS5QLiBhbmQg ZG8gYnVzc2luZXNzIHdpdGggeW91LjwvRk9OVD48L1NUUk9ORz48L0RJVj4NCjxESVY+PEZP TlQgZmFjZT1BcmlhbCBzaXplPTQ+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJVj48U1RST05H PjxGT05UIGZhY2U9QXJpYWwgc2l6ZT00PndpbGxpYW08L0ZPTlQ+PC9TVFJPTkc+PC9ESVY+ DQo8RElWPjxTVFJPTkc+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTQ+X19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX188L0ZPTlQ+PC9TVFJPTkc+PC9ESVY+DQo8 RElWPjxTVFJPTkc+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTQ+bXNuL3lhaG9vIGlkL2VtYWls Ondpbmtlcl9jbkB5YWhvby5jbjwvRk9OVD48L1NUUk9ORz48L0RJVj4NCjxESVY+PFNUUk9O Rz48Rk9OVCBmYWNlPUFyaWFsIHNpemU9ND5za3lwZaO6d2lua2VyZ3JvdXA8L0ZPTlQ+PC9T VFJPTkc+PC9ESVY+DQo8RElWPjxTVFJPTkc+PEZPTlQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9T VFJPTkc+Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj4mbmJzcDs8L0RJ Vj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvaW5jbHVkZXRhaWw+PC9ESVY+ ------=_NextPart_4B038A1C_086A3DB8_34939CDB-- ------=_NextPart_4B038A1C_086A3DB8_3E460859 Content-Type: application/octet-stream; charset="gbk"; name="=?gbk?B?M0QgUFVaWkxFLmpwZw==?=" Content-Disposition: attachment; filename="=?gbk?B?M0QgUFVaWkxFLmpwZw==?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM DAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsN FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAAR CAC2A1wDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KidyHxmm+Y2etAE9FQLIxzz3p+8+tA ElFR7z60bz60ASUVHvPrRvPrQBJRUW8jvS7z60ASUVHvPrRvPrQK5JRUe5qN59aBklFR7z60 bz60ASUVHvPrRvPrQBJRUe8+tG8+tAElFR7z60bz60ASUVHvPrRvPrQBJRUe8+tG8+tAElFR 7z60bz60ASUVHvPrRvPrQBJRUe8+tG8+tAElFR7z60bz60ASUVHvPrT1ORQBl+Jf+QdD/wBf tp/6UR1q1leJf+QdD/1+2n/pRHWmzhetADqKZ5o9DQJQT3oAfRTd496N496AHUU3ePejePeg B1FN3j3o3j3oAdRTd496N496AHUU3ePejePegB1FN3j3o3j3oAdRTd496N496AHUU3ePejeP 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 Vabuf//Z ------=_NextPart_4B038A1C_086A3DB8_3E460859 Content-Type: application/octet-stream; charset="gbk"; name="42424.jpg" Content-Disposition: attachment; filename="42424.jpg" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM DAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsN FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAAR CAKnAf0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDn2AZye+anhQBcnr0NRMFJGetWFTOB7flX 1V7I/K4J3uKFG/HbH5mgKA3TOafyT2I44p6qB7kHp6ULa5rYiZNzDPA6ZFOWL5SB3HXPFPGT 16+uKXqeOnrinqgtYTZjIHPtUcilSARyeuKmIIJI+n1prMDkDPXBNSjayZAF3EHGB61YjUHa R1xUT/d56dhVgPwpA5x6Vp5GS31EECEgknntTZYyxO0fhUzsFAycn0poOflGDzWdjSyuVyMY JABx0phHfgZ6HHerXlrgkjGfxoCAMDVXFy6lYb/kOM8c4pYxhic4yelTbNuDnAoRPlyMDJpP VFOIjPjlQMeg60RFQ2CeTSOQBwN1CAknbjI9qkSVyy5BAI+764xUB68N+YqRwSMYwB61EFIT BOSe2KNC4jQ24jtjimnBPAGQelO2N1PGfSkwCeM4FWD1FXLMB1HQ02bpgdhg09Du46UyQHkH B47UtgsMRFYDg47kVGQrkAHORnPtUwPOe4GKBGFx2PamwsCoS2OAuPyra8L+GLnxPfiC3UlF 5klxwi1T0nS59Y1GC0hUtJIccDgDqSfyr3DR7a28M6VFY2iBUHMsh6yN3b/63tXy2c5ssBDk p6ze3l5n1GS5S8bP2k17i/EdpHh+x8N6ckNtHtfHzyk5Lf4fSrz+FNY1azW4tdOmnikGUdRw w9qzpb4yRN82PevoDwGzP4B0p0IMxtBsJ6bgDj9a/O8HR/tCtKVdtvc/R68/qVOKppW2seEt 8MPFU/Eekyqo7llBPHua1bb4T+I5WYyWaRA/35VH8vwr1K1m8UPbPKiS/aLi1QlJVVVhmETB to9N6j67/arUeqeJBFEjWEWTD80rsF+fy1xkZ7NvB+g9a9f+zMO90zCeKrpaSieeW3we1eMM 8k8EZC5ABJ59P/r1wsttba3aGG5jWWJlxz1H09K+ndO+1Np1sdSEUd4QPNWM5QHPGD+VfNMl n5bOFJjdSQy49+9ebj8NTwfJOjdMrCV5YlzhVszxHxl4Rm8N3gYAvav9xxzj2Nc1LIu0gcgd hXv2safFqlhJbXKcMOh6fUGvCPEekTeH7+a3kGF6xk9xivs8izZ4yPsaz99fj/wT4nPcn+qv 6xQXuvddjOZ8nBJ/LOKaDtXHHNRqefcipDx+JxX2dkj4qSYifKQOTmrILFDj5e/JqOAHdng/ 41KMc5wWFA4ppDTuLA9R60piVjz8vc8U7B6nBPv2od1OcEjikl1EtNxCq4wBz61Hn5OTgg4q cADk1GynDsOQeaZdintGTnkGrESfKR09/wCVR/Nu2gipgdqnnA9BTauJKzFBK4AP6U0cA9cm lJ5ABGOvNAZm9AalaDje4h+ReOV75pANp68HtSlScs3YZxTlAbjGR3yKSKs2yIn5s856c1ET gkkc5zxUxPB7EnjNQsu0E5yB+VN23He2wMTuBzULjBOAMGn5+4cjGfSmAbsk+vSgXn3GnkNk ZHp6U1cdCOnXipGTfjoOeBSqNh44oa0E1qRnBb7p9hSsuFwD17U9cq2AOPagt8oPTPaosNa3 ImOcccCm5JwCB17U9uTUTDIx39qob0HK6gHPr1zUe/LcjI60HJAGfmpGGMHvTehDeiGy4DYP DGvnf9rcEf8ACKZP/P30/wC2NfRDvkEdT3wa+dv2thtPhQen2v8A9o1yYm3sWj0cv/3qHz/J n1tjGHxs9MVLE277xGT0NMJZhgde9TR52n0ruWsTxIvawbQGzkY6AU9cDBPHOOOtMC8nHHbN PCEAH154pGrVgCYbrn2NCn5sAZ7ZNKXzx1NKw6Dr9aNW9QS0AkEFRkEetMDbeB+AqQhhnoR7 UxkyvynHtRsJ7ke75jnOanD9NvI7YquAw3H8MGpxjKjpVPuEX1Bm3EZz9aVWGQfTjFAGG6YH WnbWC47jmpbKYxywx8oAp/PGCMeg700EhRzilQ5HPJ6GhDEcAr6j8qF5xwcY456U5PXtj9aF JPTilsi1ruRv9w5PH8qdEnYHABpME5zz7CpEU+nbvSJWmwv8OffpTGUEAk8H9KlKAZGR9MUx 1OBjv2NFrlbog+4TtJAA7+tDlWHQk9CKeUOSCTnHXtTTGGwD1PWr3El3EDfKOe9N2e5wfSpo 4yjDkYodME9ceppNlLUYFUNn+tIIyyZB69KeF2r04PY12fgHwuLqQaldp/o0J+SNhw7j+grg xuMhgqDqze34no4PBzxtZUoLff0Ol8EeHB4b0v7VLxf3SfMCOUTsPxq/cTl1y3zY6DpVq6nZ mOzOTVLy+TkZPXrX4risTPE1pV6j1Z+04TDQw1GNKmtEQDfIpVs4r3bw3Kg8BaCkkssaTW5U eXIEZdrFs8/5xXiMcLMw4P8A9Y12ui+M7/S9KtNMFpa3MMG4RtPHkgEkkfqRXZgMRTw03Op1 RhjsPPEU0oHp9/Ypfl4Xa92NuR3W4C7QXznr7D86kt9Gtb6/8t4nlDmWU77gkAttBXA7YH4f jXA3XxL1qCzup1t7SIxRPJgR5BwM8/lXD6N+0x4h0jUydWsre6tWwMQp5TJ/P1r6H+1aDel/ uPB/syvbRI+i11EyWsqXewNHuZxGeU2njHqa5q/0PT9YdQhjnyiny5RtdQcnO4exHHt71Q8J fFzwv4gWYW9wLS4nO4xXZ25P16dST+NXntPLuvLZMaaluJJbsHO8KCScjp2/Ku1VKOIje6aP KdLEYeSS0Z5p8QNH0/w7rUdhBI0q+UHZZOqEk4Gfpz+NeW+PfCS67pbzQHdcwjcvqQO1dH4g 1WfxBr15qL7le4kLbW7L0UfgAB+FUleaHAGc9lPavhvrDo4p1aWlnofc/V/a0FSra3Wp8/gt FNtdcODjFWWOxRg9K6/4i+FWhuTqVpGQr/61FHQ+tcVG2QMgjHf0r9gy7HQx9FVY79UfjWZY CpgMRKnLbo/IuIRtAIzxninLgj6dTUcb7iBu4HrU8a8YzgY/CvX6HmRQ1/njGOoNJkDB28e/ NK0fHXvmiNSep+maDOSu7oUIpHK4Pb3qO4fy0A24FTAbST6VFPtC9CcUFtNIroDkMKsouM85 78GogCrDjGOo709RjIB/MUExumNZTuyRu9M0Akt2AHWnf3gTg+tKo7Z5IoWhcbpiHlt3GMVG hOX2jmpCrYOf16imqCrngnjrmlYG3zDZVZx6fWopVLEHgj0zVllB4zUZBEg2j2waTNHHqQbd p2YAFRoMHkd/Wp2XJ4znNMCksDnihaIzsJtLDJ5PQGlxzyScnNSlCeAePQUx04KjkU9egWts QtwcY5xyajKgqQM1K6EDOfamHIAyeM9Km3YRHnIHHfio5FCn5Sc9qlJIAGCCKiLZBGOaeqYb oTcMnuTUZbHXApZGLDrgg81G/PJ59qH3B6jXAUmvnn9rU7m8Kn/r6/8AaNfQrE5zmvnj9rHr 4W5z/wAfX/tGufFfwZf11O/L/wDeofP8mfX8aYABx+fNPQHLZyfemglW7e3FSxkAdeh610q/ Q8WCGbMZIHJHSnp16frmkJ2nkk8UqbRyOKuzsXy9RcBTzyR2pRllJB9elMcDIwQPTPpQz4xg 89xUlJ6DnUiMcDAPOaFXcmeMnvTd/wApycD0NMEhLEDtzTtoFlfUJF3n6DFWMZUBuPaoBkHp ye5qfYBnnrjg02NIApPBxz6UuwBe49/6UqcMuRytJIxLHvnpmswaSDbgcHn1NAxnlfmJ65pF xJkY4FOc4zgYx3oYXuxAdzcAD1o6OTjntSqRkZ7ntQpw5xg+vqKYXYw5O7g568VLGTyMc0gx uJwakRBt3cHpk0XVy13DbjkcmmiMsD82e9SkcYxz61ERxkn9KbdlYu2gwJlv/rU9LcA56H36 UqsAevJwaDKUY7TkjjFJO2gWGFRlefypCVUgkkjPQ8ZoLE8YANdP4R8BXfiiYyMGhsVxvmI6 +y+prmr4mnh4OdR2R0UMPVxU1CkrtlPwt4Vm8Q3JIylrH/rJfTjoPc16va2C20EcQGyOJdqo Owrf0zwxBp9kkFvEY4IhhUxkk9yfU+9SjRm3ZYEL34r8ozPMKuPqNvSK2X6n6xlmAp4ClyrW T3ZzMtq+4KwyOTwalg03z8NjI7+ldJPpCsg9O2BVW5nsfD9objUriK1t1GS8rhQK8Fw5tj3O flVyK10zaBhTgDJNUvEmv6R4L09tR1e5S1tkB5PLMfRQOSa8k+JH7VmnaIsln4dgF7ODgXEi nb7bV6n8cCvANZ1LxJ8T79r3Xr2UREZSPdyB6DHA/CvcwOT4jFtOS5Yni4zNqWGTSd2ek+Pf 2jtY8cST2GgZ0PSQD++VA80uOgJxxn0H51j6F8dw/k2XjDTmjf7v2+FMq5x1YDpWNaadBY2w ghj8uMdAoqG80iK6X94m5T7V9pHIMN7Pkd7nx6z+uql4aI9lsIYb2IXui3yXMJ5BicMCPSux 0bxnqmm2T2r3EqWsoKSxgnbg9c18mppeqeGLo3Wg3klqwO4xA/K31Fdr4d/aBltpksfEtl5B bj7TF0+pr5XHZJiMK/aU/eXlufTYTO8NiUo1dH+B9KwiK6VWjYEYzxVyO0XHQFe9edeHfGNp qCRvZ3Mc6EcPGfmH1Fdjp+vCWMb2DAn7yjp+FfLyhZ2krH0ympJOL0NKfSYLmBkkUSKwO5TX jXjfwBNoE7XNshezY54/gz2Ne4RSpcAMhBGOoPen3tpDqFvJDPGJI3GD716OBx9XL6qnT26r uedjsFSx9J06nyfY+ZIhtzhfm+lSLyMjp1Jr0Hxh8NJ7DfdacvmQnLFF6qPauAaExMysNrDs RX67gcfSxsOaD17dUfk2Ny6vgZ8s1p0YmzIHBzjrQBzk46YzjNKjZwQcY5xSrwwBO4dzXpnl jQCG+U7vemTbcgHP/wBepCQMYGeeajkUs5z1oeopbaDUXnOc++KcVAHPUevepY1CpyTz044q KQc9cjHrSC1tRMZ6c4PQ0oBDdBmk5HOCPfNOZgCeh4zQUrdRhAAwTjPQ1Ikaqoz1qN08wfTt UiAKMdT2oFH4hm4At7nrTZBu7nrnmns3z9AcjrTGX5SO9J2uW9HboMcZzwCfSmIgVSR9Rmng EuSTgjoO1NwVBOdo7imtrE36jWbkDNG4lccDn8TTgckdfcij5QuM4IpXJ1exC4IPGPfNMK88 mpnYH1+lREg+5zSuVaxDI3H90ioi4OCTnHFTSISD/M1Xl65PT2NNGbutRjnPI4A9KjJwDu6Y pWIAOD0NMBDAnt6UhX7DWbceCAK+fP2s2DDwpj/p6/8AaNfQRIYkdDXz5+1mcjwrjp/pX/tG scV/Bl/XU9DLn/tcPn+TPr4LtCkjNPUqVJbAHHFMiG9sA4PXJqXywe+cc10rY8iO2hGz7icZ BzxSg7unGPahlzLjoOozUijOMcZ9PWr6D9SMLvc55470cKzAg5GWpduAOmac0a43fh+FLQaV tRoXdk+vrSKuMgAg+9TA/MRj8qjdMnpzQmN3YDqOfrVgIGGM4PXBqNVUMPUc/WpcZYZznFRu 9SktRI4/m459aeIyeev9KFBIA+6AegqVZNrHgEYpdR7sjjjJJ556ZpDCB94kn2qZW2AdjTiR txwe/wCFVca3IfIyeMj6ULFhc4wfSrCn04A6E0jnDZX8fegdupCYiGzg81KsRC9CKAQWJH5e lWF+7/iayuUtVYhEQ+U9qY8O7gdzwMVbGNo/pTTGXcAAk/3QOc0nJbstXeiKgtyckUsWnvcs sUSNI7thVUZJNd/4V+FOp64qzXA/s2zdQfMmHzsP9lOp/QV7B4a8FaZ4Ttj9htx9ofhrqYbp W9QOyj6V4ONzmhhfdp+9Ly2+bPoMHk9avaVRcsTzPwT8FXmZLvXt0SAApZg/M3pv9B7da9hs tLs7CFIookiiQYSNBhVHpinhWCHAwemMcmligk2ZfKoOpNfn+LxtbGS5qrv27I+6w2Fp4SHJ SRWmmVZGUDH0qc3FtaW8k13IkUKAFmY4AHrXnXxJ+OXhj4d28iefHfXyAkwROMKfVm6AV8e/ Er9pDxF8S7trLTW3wEkBIsrAnvnqx+tRhsHWxUl7Nad+hdfGUqEbyZ9E/F79qHRfC7T2ugNH ebBg3T8Rg452/wB45r5d1vx54r+Kt+ZJZZ/IbpNPwAPRE6CoPD3w5lv7gX+ssbyY4wH+6nsB 0r0W102G0jVIkCgDrX22CyWjRtKprI+RxebVK14w0RyGheB4LA+dKWnuCMs8vLGugjszEoAT 8K01i3kjHPrmrsNkqgtycYr6mFNJe6fNSm5O7ZlQadnkrgGpjabVCkfhWsFAGAMdqhKDjnNb JWIMGfTOSwyQO1YWreH4dRTbNEMYxgiu5eMNnpj26VVnsFPABPFQ4KSCMmtjyT+xtX8J3AuN HuXjjU7vJY/L+Hp+Feg+Cvj4sdwlnrcTWsoO3zCeCfqev6VNPY4B3DiuV1/wfbakpwgDEE4A xXiY3K6GK1kte57WDzOvhWlF3XY+l9A8VW97EsttcBlI6qf5jtXXWWtCTAkAUE/eHT86+FLH UfEfw/ug9hO81sP+WEpJAHt3H8vavYPAf7QWn6k8dpqDGyucgYf7p/x/D8q+FxeS1sO+aPvI +5wec0MT7kvdZ9PrIsg3Ah8jHtXLeJfh9YeII3kixa3ZPDAYB9qZofiKC7hjlinR1PQociuj hvRKMs23PPFeNSrVcLU56bs0exVpU8RTcaiumeE674N1Lw/Ky3EBMX/PRRlTWNtIBAFfS8sK XKGOVVljbjaea43XvhfZX5aWyP2eXnK9ia+5wXESdo4pfNHxGN4d1csM/kzxdQQTycdcmmli cnnPY109/wCB9T0+6WBoCxY4Vl6GrC/DLX+GFiXB/iRlPX8a+shjMPVV4zTPj54HEU5OMoM5 I71jHPy4/CkKfLg9etbmseG9R0RlivrGa3OcfvEIB/Gs1odox3/pXUpJq6ZzOnKLtJFX7oJ5 +lNdSGzyB7VYMagc5JzzTSoHIAxirT1JatoQbi2OMipSpVQMge2M0qKpx069adIhL9eMUdQW xBIMkH0oK5G0A881PsG4rnjFMcY7ZPSpua2uiLALHPHtTTzgYyD6VNtU5Gfr7U0xgAckc0ES WhC3BOBx6UjEKhGME+lSsm729sUOmQAR36E9KBWsrFWQ/d4BFRP8qZHQnrVxwoyCuAOPrVcr jjG2kiWrMrN8w54qGXC//Xqw42DOOe9QSYbgHI9D3ppkS7Fc8nOMjNIcBSOemeKVkAHvnpSH DAe1Dd3YhaETHdyOM8E18+ftYgAeFcf9PX/tGvobywzhVyR1xXz1+1muxvCwyT/x9f8AtGuf Eu9F/wBdT0suX+1Qfr+TPsC3XqcYzzUqgr178Uy3O4dNv1qWIgSHAB5xXcePG3QjZCzdulPQ ZxnIGfypzqVORzSqgO3sevBpGlhoXJOcc+lKy4T+gpwG38TxilI2pnvSYdBmDnBOf6Uq5bce mOlBTaQR16805c5OaEiorWxEATw3GOmO1TEEsOcdqCMMOOakWMckd/SnaxVrMFjYHB5+tIPl bAqXyiQCOuOtOQLkZ6+tZ+Y2N57DjFPx91iPzp4TAB/KlA3Dngjv3obC4zHtim+WM+hqdUJ4 UFhnp616L4K+Dl/4iSG6uwLS0Y5+YfO49h2rGrWp0Y803Y6aVCpWdoK55nEMcnr2IqxgMAAM v7V6lefB9dR8Q3Om6WsiJbbQ00hyCWGQMdc454r0nwb8CLPQmFxcp588fJadQTnjGF6D8a8K ec4dK9O8n2PcoZJXnL3/AHV3PEPC/wANtW8RbHMQtLU/8tpeM/QdTXtPhD4X6P4cRH8o3F6B k3E43MD7L0X+dekt4WjZEWNCVA+bI5b2q6uirHG4BAccfQ18tisZisU2pu0eyPqsLl2HwqTi rvuzmU01cZA2kjBPU1MdHbP3SF4qfxN4h0bwXaPca1fRafEilvnPzMccADuTXyJ8bf23lsop tN8OEwEnaXXDTOeef9kdPevLhSdV+zpq7/rc9GdWNNXm7I+g/HPxJ8O/Dy3Ml/dpJdclbWM7 pD/h+NfG/wAYf2xdR1+SfTdEJiibKeRaty2ePnkH8hXiGqax4m+Jt88l5cTQ20rbigY5cY/i J5Ndb4T+HNtpqqfLCk8ljX0WDyTXnr/cfN4vN9OWicpa+G9a8cXH2nWJ5BAx3C2U4X8fX8a9 O8PeDrbSbdEjjVenQVv2mnRW0ahV5H8WKupHnAIOa+wpUo00lFHzE6sqrbk7ldYxEoAG0Dji npHvIBBNXIrUuwyCR796tLa7OnB7V0wWpyORRjtBGoYDn0qZhhcdM8n3qZxkYzgA0nl8dzxW q3IKuCcnvUZ4wTxgVbeMtkKeKhWBS3YVQabEcS5Xr0FEkaqCPTpmrKxD86a6L7E1K3KWhnzQ 70OQcVmT2RQZx24redOAP5ioXhABxhvY0nsJO2xyl1pqXUe2RAST1NcV4h8BRXW90UBm7ivW GsSwO7GPaqU1lgsCCfY1jOCehtFs8n0Dxn4o+HFwDDO91bIR+6lYnj68/rmvePh7+0PpXiFU trxxZXn/ADzk4BP+fSuKuPCo1YmOGFppH4CquTn0xW1oX7J02oldS1pZrCzJ+SGMYkY+pJ6D 8K+ZzPBYScXOej8j6rLcZiqT5Y6rzPoPTteimgEkUoZHHYgj8DW3BeJcKNrDkdM8V5A/gbVP CiqdJkfykAVbdzkFQOv14rT0zxp9lmSG/jbT7o4z5n3DXwU8NKm9HdH21KvGotdGepPFHOhj lAljPY+tULjS7uNQ+mXpt5EORGw3KfYj04qrpWvRShd7fe/iUjn3FbYdZPLWF9zOQFNZR5ou yNZRjJXaNzw5pn/CUeGM65bRtKJmUo67l4PBXPbFc7rfwP0e7DC3gaFmGQyNwp+hr04JHb2I RB/qkA4PXFUnkkChmYqGbGBxn2r6WnialGKUZHy1bD060ndHz74g+A+rWTobKRLuN2C4J2sM 9/pXBeJPDV34ZvHt7qPhs7XxwwFfYFzG/wAs7fLsiJUev19+tYGr+GbHxNZNHdQCTeuMMg3A 4xkccGvZoZvNSSqq6PJr5ZTkm4aM+RFILDPB9QOlL95iOpx1HavV9R+AV4kjnT76KZMkqs3y sR+WK4TW/BOseGT/AMTCyeFTwHIyp+hr6WGKpVdIyPnp4StTd2tDC35yCeneoNxySDk5qRht IIHJpp610p9znsGX25z7GmgnJOetLgOmDwT1qPbyMHpQiJLqKG5OBk9M015CxAxkingYOepx 3qBuWByfoKTI1GtIXGCcEjmmMSQOp/pQ2GcjPJ6GlKkqDnaMcilYhoilJK54/Cq8g9hwMnNT MQqA9c1DN1y2MHmrIavqQMOSBwAaAg47UsiZOevuaa3ygD1pkjkO3kHpXzv+1ycnwocY/wCP v/2jX0Mq4PrjrXzz+1x97wr6f6X/AO0a5sT/AAZf11PTy1WxMPn+TPrqAbTzg8YzVqL5j93p 3xVaPJ8zHTp+B7flVmA9Mn5s9u1dzPHhG2w4hi+eAKVTgdMn17UrOGYknkd8UxWznnIoWpqP xg4A7ZFPVSUyBk561EJCTyDyMetPQjd6+lAR1dh5XBJyM46U0YIxgj3penU4HWmEc/KcZ65p Lcu2ogU8np+FW1TqSPfpUaRgY6jipgDkgEYpsY9F+XnntmhhhhgYoiGeAPm9q9B8F/B7V/Fc K3bslnZEjDzA5b1wK5alWFJc03ZG1OhOvJKCucVZafcapNHb20TzSyHakaDJJr1LSPgNdfZ4 ptXmNtI7YEEQyw68k9O1ereC/h/pngpCsCrczE/66RRuX6eldDrKmSSCZH+SNstnjPb8q+Wx mbO7VE+owuUxj71XVnIeEfg5ovh+NWmt0upy2fNnAbbzxgf56V2dsIYfMRR8gG0YHQ1CJWu3 beQTjIAPX/69WbTbFZ/NgEt1I7185VxNSu7zZ71OjClG0FZFz4fxxR6trUSwL5mEk83aCzZG Bz14213KaSscDtIPvHJ7kn1rz7TbwaJrtteXE621rtInkfhQmCQSewB71xnxW/bJ8K+CkntN EdNc1QLtVlbMSH19+1Q6lOnFcx2LmkvdPZ9b1Kx8OafJeXtzFZWoHzSTMFH4E96+Z/ih+1pa 2zPpvhG1+23RGxrxh8ufUCvDfEnjrxn8b9Q8/VL6aO1zlIQSqKP9kdB1611fhjwZp+ipHFJa ASkZMjgs2fX3rilKdSWukfxNr2XmeF/E+1+K3j7Unu7m3up4ZiTvSQMSCc568fhXCaR8Jrmy u/8AiZ20qXG7BEyEEH8a+5orS8t7bcVP2YAlSowvpitK28I2t7ZiWaSGXcmWjkwxxXs4XMIY ePKoKx42Jwbra8zufJumeGoNPiUeWAR2A5rTW1EY+VMDHevqIfC7wpdQFZbXZK3GYxtGce1Y WofAjR7p08ia7s88nGJFx+VfQ083w70ldHiVMtqJe6eCRRlz0GBxgVbt7PgZ5Newv+z5NFGZ LTUUkAGf3keMH86oy/BLW4wxjms5lzgMJNuffBFd9PMMLLXnOCeCxEHpE818psdhjpQYyFJP 4V2l78LvEFiPms/OIGcRHJArJufCOsWQ/e6Zdrkbs+Sx/pXfHE0pL3ZI4pYarHeLOcMJwD0H YUKhxwOBWvcaLfWy5ks7hP8AfiYfzFVUtJ3cosLs3ZQDk/hW6qQtozN0pX2KLRZbg9etNaLD YOD7V0cHgvW7lQ8el3PIyAYyCa0LL4YeIb0mMae8TDr5xCfzrN4ijHeSLWHqy2izihCwbaB3 7CnCLcCGHI68V6rZ/ArU5IQ93dwwDOW2AtgfpXT6d8E9EgkUz3F1eZwVBARR9cc1w1cyw0Pt XO6nl1ea1Vj5/lgLcKCT2xVrTfDGpasypaWc1ywPPloSB9TX1BZeCdA0dgbWxtBNjG4pnH4n NaotfsyqFWKOLrsjAG4/SvNq5yrWpxv6nfTyjrOR88aV8GNbv5cTGHT1/wCmp3E/gM/riums PgbpVoS+o35upQR8sXyqe/NetXE7+ZtSz2dQTnqKa32KMq0kO+T1HQH6f1ryZ5niKnWy8j1K eX0KetrnO6X4a0fw3biKzt7eKTaBtVV3d/vHrmtS6gIQ75gHJ+VWPbj8uau/ZLZoPOG+IEZX PLA+oqK20OKWNXkuJmU9dy4JJry5VJTd5PU9GKUVZIwpfC6GF7pnik6nJb2/z+VcDrHgWHxB DJJd+WqgZDd8jsK9Yu7Gztt019eLb2kfZztAHXqTXG+Ifih4Ysd0GnQnWLhRhEgXMY47uePy 5rO7N1otDxtfDmv+GWaSxmF3Z7v9RIDkfTNep/A+6bxPqtxJdRSwpYKu5JB/GTxz9Af0rkfE 3izUdQgeS3hs9OjXIKQkvLxk5ycDt716j8HtJGjeEIZJA32i/dr2Zn4Y9kz7YAOPel7ON+ax brvl5UztMr5khZsgDOF6dagjf7dFKGAWNCGX+n9KggWe/lYRxmOMAZz6ZxWrFbCCBlKjAcMT 603e2hlsQTuZ7LeWIUYjG71B54+pqu99GYkADKw5I9R7CotQWZYoSwMabcnPucmqOpSxwiKW PdKy8bF6jrRBitctsqTuJQoE5Odi8hx3H1qDUIbW+jkieIXCtwYpQME9v1qFLpboRSxwL9pT kjJ5GTgg/wCNWobw3U6iOJIplB68ZrpVR8yIdNNWPKPE/wAEbe/upJ9MlFs20n7O/r7V5Nrv g/VPD0hW9tZEA6SAZQ/Q19X3DNfNsJWKeMnDKuO3f/GqdzYfai6X0a4A+86DY/rkGvZoZpUp 6SV0eRXy6nP4dD5D2kZ3D8qiwXOQvfBNe4eOPg9FIReaUnkOy/8AHspyrH1X0ryPVtAvtF2C 9tpLUOMrvUjP0r6Shi6VeN4vfofOV8LUo3utDMkX727ABquMb8+g61ZlUvHwOR0qsOIjgjP+ f/r11bo8+1tyJlCsWOeetB6YHfjFKMdMY705tuNvQ8EVV7k2K8o2Jk8E+tV5RyM8ircq/IQQ CPSqsjkMvORTJatoRPgn0A46U0jgDHTkU5mBGSMHPJpChK9MgjsaEZ7hgMA3b0NfO/7XfXwp 2/4+/wD2jX0QqLjBx0r52/a5OT4U5/5+/wD2jXPif4T/AK6np5d/vMPn+TPrtckHsPpT4zyB kZpowHC9eOlKA2cgH05rsPJRIrjLZHT170sa/dOcY9aaVHJyPbPQU6MHaMnpyar0KQ8jd0P0 qVVK4IxnvmoljDO2OBxUygYx1GetJjsMlYYPOTRGNxXK4+tOaNcrwCT1q7pekXmr3yW1pBJc 3DcCONSSfwpOSSuzSMXJ2RCi4HA9q3/DPgvUvFF2kNnayOGODKykRr9Wr0/wF8AXcw3mvMCh XP2NDzgj+I9q9ithFpka2dlAsUaKECxrgAegr5/F5tCj7lPVn0GFymdS0qmiOA8G/BjSPDyR XGqbdR1FefKzmJD2+temI0cUTZGG4AA4C9his+S7aMtGsSvPjBzxg49eKVH+zwYKM0rnJ77c mvkq+Lq15c0mfV0sLToR5YIfdyLHbxxxSkzSEEtjIxnpRfxm7tjCjbiV++OgI5qLUIxHaLGr gz4wGPAHtUkZ+xLCiSASHg4OefU9a4pPV6G60Fsx5iORuR1X5lPHQda0rc4tyHOG4wT3qgC0 dySAMupYEdT61MDus2LkK2Rj3qE2twY3UbSO7s5oLxd9rPGY2X1U5Br4aT4XQ+HvHeoafeRt I9vcssSydSmflPvkYr7ieR5RDEBgDOCa+fP2lvDOqaRq+l+JdKlZN7C0uUIyC3JjY/8Ajw/A Ut33HGVmauj6DbG2VIbCOCVQBuByCa6SPSru4iRHgKxg7RJgAj6GvOvB/jzxVEiRf2FZ3rAY 3CORSePx9/0ruo/jANKzFqXh+6jdhkCzYSD3JDbcfr0qPZu+pbmuhtWvhe9t1dmlSSA46t1H GePzrU/sq3iG6GVt2PuKvvms3S/if4euXj82aSwebgR3cbR85PGcbf17110A0/UIxLaNG+cN uRww6D0puPQzbMjz4cBBF5EjDiRhnv3FWIlu4Y9jb5Ezy3QHr/8AWrRmtml+XZFz/EBz+tMX TrlQYzKskbckbuP/AK1UqbaM7lM2I2l45lBwSEDZIqETW8sRBiKynjdnrj1q++jIACjSq3YD p17Gh1bAj+zCNyTlwDkVfKDRCGmjhVJY1EY6OwAP4Uy6u44ow8ReSTPHGF6/Wp7i1nhjBaYM gBwC2f0/EVTlMSKpaPEjZ5J+Xp6fnR70dL2FZMjuJJhGZZrdHjHO4gEH3zUMi2cTF4YFSUnG /YP/ANdWJUukiIaZWjGSqk5Bz/s/nQWaaMJBaNJIFyHRST7nirU57XZLguxKizwQk7Y8kdh7 VHcSQbiNjbjySOwp0WgahdxeYI50OOjIQx/Ol/4R7XBGAkJUZ6Oy4Ix3PWtEpPVFJIY94qx7 hNubqB6f4Ugmu5IVdfL2BsEj3/8A1VPbeEtT8vMlvChx0jlA7Y5OKpXXhy8hJSZoiTnYik7V xz/L+VJ861aHZEMmpoFYJbnzDwrgY59RVfZHKMmSdZAOUA3GtjSdEmtY9slyScEZxux9M8Ul 9faL4fgefULuCFP4nncKM0kr79B3KFnp1/OjeXchUByAGI/P1q+LKS3i4aPfgFnIBH4VwWof HOyjdofDWkza2oyBImIYF6dWPJ/AEVwOs+OvE+vtJDqd39jjZt32TTQUwMD5WkzuI5PTFaKN +hDlY9e1XxzoHhssupX0Mt1jiCEb5CB7Lz/SvPfFHxt1O6uGg0XTFsYv4bi8GXdcHoueO3X8 q5vw/wCDJtV3tYQi0yVMhkk5J7ksepyR37iujs/Ddtpc7xarEt7KEDCNT90dBnHTHOfwrZQX UXMkcne2F94ov45Z5bvVbtBuMdw2VUg5+VOnp2rWh8KysYLbVGFtbBg25uCoUkZHfsOPSt50 S6vf+JNZvHIUxIqkmQMVxwf0qtdaewmiXVmmU7CUVz8y8HHH5cfyq0lF6Cu3qNtPCNnd6lpq 2bGcu67t427FH3mI9h/npXrVrZfbLhliJjs4soO2QB/hVDwRoFtYWjXZ5e5wAzjBEY5AA985 9+PStqON5n2qFigTOFHU49a5qkr6FQ2JLWHbEyRfLGF6+o9TUdxcmRFiUYRiOfzpI52llMUW AmD8x6n6+1RzIWVgrN8uBkevtXO3ZWRoVrxhMzCdjsAyMngfrWPeiO21GOfdHLE8ZHycg+vI H4Vp3Ej3rtFI2XX7rPgA/U8VhSpb2948F6SxAHyBgSh/E9/TOa2UbRFJ9C01xHFcCWziEYwV djhip9P/ANYpxu5r+NmgCRzrxJ5a4zz7VTbVH0kOIo1NuST8/O/PbB//AF0i3Vz5TTR7o43+ aNovl29seue9ElZji7lxprjUJSs5ERGSJC20fjU8yG3ZYb1l2EHaS3PTt+OKzvKk1LdKzKZi NwRnA47kA0kKC73R3VygEXyoTyw9sDrxjtUSel0Xo0W7cL9siVJS8TDbtdOn19MYNcr8WfBp 17Sg8AbzI3+Ut+XHtXXaNHb2F1JdPvlTdtQfdU+/6Cqet6zHNP8AZhtMTckKfm/Pt0op4v6v UjrqY1KKqxa6HyhrFjc6VPJbToY5F4INZ2TsA4zXt/xG+H8ms+Ze2gCSrghXbhhwP0/pXi97 btaymKVCsinBHvX6Dg8XDEQTR8PjMLKhPVaFJFLE5z17CnfePHp3pA+HK9RmhsiTIHXmvQ8z zVvcHXDNx2z1qqpxjrx2qaRyxbPB6Gqz43kdu+KaV2E2hCN2SRkZyeaYQTgAYp7rkUwjKnB4 q9jJi7Rg564r51/a5/5lP1/0v/2jX0VjGDjrXzp+1x/zKn/b3/7RrmxP8GXy/M9HL1/tUPn+ TPr9B85bO49Kd93cOvvTIzzzkj1FOKhXPPHbjrXVax5UUOCb+MEDjGTUkYYg5OecA+lRx7mJ HFSDhVDdM8YqykPY4IAPPtQr5BHK/SgjBJOeSOfSm/wn1FTfUpao2vC3hq68Wavb6fZjMjnk 9lXux+lfVXhPwTpvhaGG3tLeFbiJBuuGQBznqS3WvJv2bdIEms39+/y+XF5S/wC0Sc4H5V7V qt41tdWxAKBn2MW718Vm2Kk6vsk9EfaZThoqmqjWrLVxC88wjifcvcjufyqOJmsJGgR2WXuQ MEewpb2Ke0AMTKC/DAdvyqoJH0+cSOSDJ93eOBXzco3dz6RJbFqG5SCRi6CWdvQdPQmkgliQ yySb2kbJHPT8KhW+QXBMyeZIw+XtuP5e47VXtbi1kuJbiRpCM7SikbSeRgc4xxzmtErGbbGz TxjTXdpnEqg7AykkkZGTVaO0uotPS+uAxeMhsAn5uR7Aev8AjViK3WaWe7klVIuipIcY9sel QWlle3h3YwsfCkDA2+nGf6UrXEdD9oe5gM4C8LwAOAPao5l3W2cEAsBz24zVXTNUe7geNAoE ZHykcEep/XvVlpiXITKqSCATwfYVk7X3Ktctn92YRt3SEZPfNct8SfDw8VeEtQssqbnYJIXb s4bIwa6aeYRTCTIJYDCqOFqlHbPqTySOvyjnbn9am7hsTY+evC2o/YzHHa3nlys3lN5mV9uo 6d69AbR544/tDTw3FwgyIy4f6Z9P8DXJ/EiytvB3jdZFtNtvfp5qFBhVfO1uPXgMfqa6Dw4l rfaYlzPqHlKzcKi5c8Hv2611Wur9zG+pNP4Zm1mw+0XNuVQLudZE4AODgHsRx+VYN54fCMI9 PtvsQJwJrKR45MdMnB9T7dK7ofadSjk8udlSIbVkEgVcZ5Bz+NUV1W6sJGsgqSqmVc7dwYnP AOM8DP5inyp6EuTRz6JqWj27zaf4i1Lz1jDEXEwmjPfGGz/SpIvFvj2zgSWR9PuowuWEkJUn A5xhhx17VsWMGm+Sxu1kM7sWaAMNoU9DjrwP51HZ6W9/C0kVyjRo4G6Rgu0AngZ9s/Wr5Ipa BzmSnxm16zy1xpdrcAY5jdo+ccjnP4DFdFD8Ym+zLJPokwkOfkgnRiQOpwcflWejxRmbTZ7O G5eI/NLKn8PTIP4E49D3qlY+FdOvLFpjMtvMWwfOc/Kfb24NCp+Y+a5Yb9oCH7Rsfw5qcce4 gklCQBnsD3xV9PjtpDxL/wAS7UUZhnaYlJHrzux+tYVqwifyktIpY0YsJHTJcEkDB654/WoY YNCinWOe0m3s+3ClQqc9eeT3/AGlyXFz32O1g+KmjanGrQx3TyH+F7VgufQHGP8A9Vek6TfR SWcTwD91IokQjuCM14LG95LbK2nbhHFwpQcHJAOfp/StiD4oajpVjFY2y25ltYgkk0qsw64G Bx0AGee/tWsIqGzuS5nqdzqeqrqbRQQxta4I3tnIOBz155J/Kq/m668rs8saxMAAhA+TpkjA 5/i4PtXlXh7XfF+q6nbahqGqRpYfaFWUWyKqbAy7sjBIyM9816M3xl8DxzyJL4h01ohgARyM z++QBVSts2XGWmxpaPLfwyTSXlys/mKu1FbhCBzjgdaz/GOoz6Zpb3q26y7ZFABJyN2Vz+Ga 8W0BNV1i2F1b39+yvIQssV0+U5CkkZ7c/lV2DXJdJgt7a5uDf3w3faPtMrSZ5+UDc315+lU9 VYV3fUZqGpeM9fjLWV2be2Y/KLRctgEjrgntXMv4Vsnu5G1uaa9vd+FYuXboThiwOP8AE11O nW8mpqZ7WcLEW2rGrBSreo/X3xTLM6bC8x1RTd3KOMssmCQFO49OcH+dZvkhuL3mYlj4aOpy smnDFopwyZAOc/5/HNaOnWdtYzS21xCtzJExGJGI2/KCehGTUkcceozyvYTosQZmEZcIckcZ B/zkmn21xZ6dFOboJf3IO4/veOmTkjqecfgad49WRaSexds4f7Reaa2xBASf3RYLsxgAfmDT IEWLUZkuYRcSE7EJcggDaecVnaY66sbuaK5hgjfc0cckqrtHUdTU2n6tp9kkkeoTpcTCR2zH OBwcYOee3b2NJzSVrl+zl2Zdt4TNeSSWEbxRiIblUbskknt14A/KobS1PiDxDbW19nz8Dbv+ 8EB+bP4DFUZ9WtEMk1jeRRQZICNKNzYUYzyP8+la/wANYG1HXdQ1Z5Fn8kmNZT6tg8+nH/oV T7SMdmXySS1Wh6htigkRTwqYVRjjAHSqQWS9lCodkIPQcCkubhZpVRny2eMEc47/AEzxTvJf zCm7Chs5PO7/AD/hXNLXctIcGFrxHhl2kM56n6VQuL6W3VDArLnkKq9/TvTt8JuXRnDpCSWy eAcnjH1NZlxcy200kuCc5+6SF9uOlKNmy7EF2bjUreW4dXRUySI1J6d8Af0qvBHHNC5mu1e8 cdTuxgZwM+uAPyqVrLUVT7QlxI6spUJg/L7Y9ff9KptoyJZC5W4ikCnMnOTyO2OSPxrZW6GT TGrqBt9LKyW4eNcqGYHcv159+mKmt57u3xCfNkjztK87Pr+HtUt1LBNpi/Z42kuUQBT13e4G Mj6UxL6fUoo7Lahul53RqM4/unoc9OuKl67BbUgfQZrFFuEljKl8BiwOz6nPH5VcXS7P7P5a TB5pv4VU7jnqRkVXltJLG5EV67xRSAgo24tnqDjr39K29NtIrFlu0kE7sCIWA+XkAlugJ9MG s20XG/Qs3DRWVvHFGoEcQIwe57knp2ri9U1KB5ikcC7sjc+4Ltzxx+lbXijUp9N02aVSpnbG 07Rwc8fWuX0aVRJ511EZppWwqk7Rnkc8ZxSiNM2by7ivLTyEhdpgPmIPf6Yya8H+Jvhoafd/ bYUKxSk7gT0P+cV7pbtDb3EnnyMnI+VQW3kgZAA6/j6VxXxM0xtbsrjahAiUscDGABXqZfWd KsvM4sbh1VpPujwDBDNimgsWDdBTlTa7qG6HFI3p0YV94nc+DasyJ8YOcfyqAqS/fpzViXIQ 5GCO4qvj5xk4x7VtFGD10Y9twUHp6YqL7nAGPelZgRgH8aRgdo5zzTaJ+YMR07186ftdfe8K ev8Apef/ACDX0SxCuAeTXzr+1ySf+EUz/wBPf/tGuXFaUpf11PRy9f7VC/n+TPr+IkngDjnN P25IYEepFRggAADHrUicxkkgE9q7LHmLXQcowCDj5qmH3eeTUYBCkY5HenqCVOOlHUaFOWJ4 z+NK3UqR1pOQ3ynAIpyK0sqqvVuOKTtYuKuz6L/Z+gktfCVxNIB887FBjnGBXo/iJWudKysW JUG4H3HINY/gay/s7wtpURjUSCJQyjjnHOa6e9BdVCRhoiOQ3P4HFfmmNmqlaculz9HwkPZ0 ox7Iw7WeQ6FBqe1iHQH5uNxNRyXc67LuaXfCB8yNnBJ7DP19qqpBI8s+mIZUWNd0fP8ACeo/ Crl0kl7CkT+X5S5BjbkKOpJ9Dwe9cMe53NrcfcTpfzRGSNY44QSzRnaADz9D09aYkEN9qClZ DDAi/wCr256nOcgdee1WNSMV2tvAsflxqd25W5+p/PtRdCOR4ILaTBb73mLnfx3x/WtNjNtD JLRZr52iZfs5TGNwAHuRx+tVbeS6Z5be2LbFbapT7rHuSfr7Gp9QtTJdRwWkiyhvvhDk5GBx wePbFMUXekAwIX3PydwPy57fn9Khq+lhpgmpvZbrdRHIy8O+AWb8hn8h2rVFxBIiqqsZQcnA HA/n/wDqrGGpRaYnltB5lw/LNjAGfxwDx1PpWjpN1bx2wZgwkcbgpGePUmspqw00aDsolZ5F +UAFRz+tJBIDBIY2OzGQv8Q5qFrgRSQqZP3fQ89RmiBDbzS+Wcx8jceT+PpTWrCRg+PPB1t4 x0cRTKGuIW3wkABt3oD2B6H615lBP4ZtYyTe3dtPGTG6PKoaNxwVI28HIIr21VSSMkjed3IN fNvx++HA03xQmuWRnit9Vk3XSq5CpKByQMYG4AfjmuerTnNpU3qdWHqwp3VRXR06a94ajTB1 y4AJyym5wCfXG01IPFvh2HLJrl6WGBua7H5/cryKPwDFex7LWaUSOcAyTZ3E9PwrUvvhX/Zs LSrOJ9oG+GGYlucY/wA+9SsJXk7cy/E6XisOn8H5Hfz+JfDVxIZZNUupZsEGT7ST8vpwtOh8 SeE44yG1e5GfmIWaQgH8F9zzXm0fw5mSUPPazR2yDdI7uePYe/NDfDqbUJ4FtIxAkmCpZy25 c+p9v501hK6duZGbxlC1uU9Kfxd4ObzAdTumz13SyEH0/pVceLfBDkhrq6c55/eOPr35/GvP 734ato0u+aSC6Xf5QSNyw3e+D6npUX/CtUmuwGVLeMqWyWODj/JP4VosFUa+NE/XqO3Iz0ce J/BSh9t1eKSchg8nX/vqqx17wcSzG8nmyc7mVyw+uX5rzy4+HH2OdIomN4HzlwSQDUkXw9ia 8ZbrdCo+7tJw3r37cVX1CokrzEsfT/lO5k8W+EYYitvd3MIzk4ZgG4/36qP4i8Gtkm6mDNyS I/8AF+a49vhxDcXKxWsYuIyMnIJK8fX6fjT/APhXkNpPItzaruJCojHBJ65/Q0vqM5faL/tC n/Idc3inwXCn/H9cs38KiLC59T+8FU18W+DUlJKAE9zBn6/8tK5S0+Gp1a/n+xwqwVc7c/d4 75x/n60n/CBrp9zNbXVsslwMALyOMc/59atYKb+0Sswg9onWS+MfBaj91JOMD7pth1/7+1Rk 8S+D5Sp8y5yeuIVA/wDQ6wrD4Zya1cyyWlsiQKPusQuGwMcn/OasQ/D+OwlltZ7aGWZWwTIP 9nPH5/nmqjl8l9oFmMUvhNFPEngtTmSS6OTn5IE/X5qgTxb4SjkYvC8i+pRQ38zVa1+GB1Ka eW3jt0iBK+U+Bg8+vFVbbwClrcyx3cMLyqTwvGMHGOn+TUvAyv8AENZin9k2k8d+DgCPs9y3 OcKsY/qarS/EHwusrg2k7Jng7kB9u1RWHw2m1KeQ2dvEYFbGCq5HH/1v51NY+A7Wz8xLqGGS 4U/PwOAByOPqP1pfUWm/e/Af9o3fwkR+InheNlItGPqHdOf0p8HxP8Mxu3m2WVI+TE6jH1G3 n9Kkt/hk980ssMImjJAQxoDtzn2z2pbbwPp0cbLeRnzUY8xqAeODnjt/jU/Uejl+BazJv7I7 T/H2h69qdpptjpxlu7qVYo184Y3E8E4UnA6n2zX0RoenWfhfShaW8SeWSZJWLZ3OQAf5dK8t +DPw3gtb2bXHVRBFI0NsgHTjBPv1wPqa9fljUoNwChV2jJ6e+fWnTw/sb6nPXxLrpK1imREy M8UOMgNtxkk+o/Wo9QuXSeBdwjmIUsFGdpPJGfbilnmcuViUlQuzcoGc46j8c/lVZI4muSCu 9EJMods/VQecnOB+dbyaWpzJdxGf7LbfZ4h+9J8xhIBux/jWXNfXd3ILHfuCnKkRn5TznsP6 1dmnlgkNwkPzSH5GVMnH5cDj0xVSS3v74NMITCQMFI1CGQjqcD3FVGGhMmrkkUVzZ3Bt5E8q OQgylsgnB/z271JNZR2UyBriP7PIM43ZLAHpgHH8qr21rc3quZ9oljI2BmH5AMfy5pba1juZ cXNwUZWyhyTt9c4z7dfStHGyMbvUluo0gmhltgJUC7VVhjB6cgn+XWm3MhMsUkaBGAxLFHnc WP15xx+oo+3w6fePbRRrKCR5pJAUfQD6nnAyap3ss9o7yWDJGXYsGh6sD7j8ajZj1FGnnV7h op5lTa2xFJz9eMEevYY9q6RFEIgtYlQwxrtQuSTj3rP0iyj/AHU4x9sMbO65wck9+/c/rWjN cSWlsVCoskhAGR90fQ9/zrJyu9S9ji/GGpNdyom1THbtyo/i4/M1R01xqFx9oulECxqQwjGF x1xtz/M1LrduTJDFI+6SWUyyZ+8FB7/Wpbm6hnljtIojFGG+XeQ2R69ABnPQfnWke6IvYeks OqaokcCMY1X/AJbbSB7k520uvWDSfJbSIxKfM6YO4/njFONpbjy4baR5Zd2HcKRx36/0H+Na htpNLnVhzLIMAtyBx71rF2d1uKburHyT4hsH0vWru3fAZXPI6Gs0L8xB616B8Z9OmtPGUk0y IBcIrqVHB45zXBIuOxz6Gv0TDz56UZd0fBYmLhVlEjlG1MHAqo447fWrso+XHGQKrkAZBwB7 CulbanK43ZBIrdFOcUJkP09/rTmy2cE455PakIyqjHTuKsxl6DOSSQBXzr+1yCD4UBOf+Pv/ ANo19GHJK9MZr50/a66+FAf+nv8A9o1z4pfuZfL8z0cv/wB5h8/yZ9fL0GBnHrUxTcgyuO/F QIf3hUjI65qzHyGw3FdZ40dxpJ9wKdFkqc4/CkBXnnOR1zT4xhOfp9aVzTZjygJz27YrY8Ga euq+JNOtWjLo86hlHdc5NZBA3YB/+tXonwNsYbrxgjzM26KNnjAPfpzXLiKns6UpeR6GFh7S tGPmfStlDFbxxoVwCMgLTWupbeQFcGMsQY9vWpoU8lVRiSwXIPrUV08ktoQqRiborYIwffmv zWq+x+hQ0Ob1O5urPxFaNGX8ucPE6Jz1AIz7cVpXNzJ/Z7RFAP4WAHzNntVS8Ny0M/llWuI1 3qXQHDDpitC1vvO09JfJRmnXzWYsflGOD0/nXNCSbszaWxXluoHsltoQyS4Cs+Qce3HPbvV2 5tlWGKOORZJQB0yAOegOP5VTgNpa24UtIsp5CkcIeffrz2FXRaBLIMsiG56xoxIHXqc9Pzrd XfUy6lWS1ksLgSoc3DYUopHA9fX8zSyyTWDRzEP5kg+RMZA9c8Ypy2dwsYu50G/JZYw33j/9 am+bcKr3EjPsjbJDnqT0/D6/lRsUUYtkV0ZrmNZZP4WPysx+uP6VJFJFJPJctJJAqsAV28n2 HGabeTm4mtppx+7UEFl+ULn6D6U24hiv508uVooVBKl8bcD9KzaUbpga9tGLuN3BLxqM/L0x U/nKj7Sm4MMZx6is/TUcOIYcyQnLBhzk59PTnjirdwzWU6ADKswDAL0yf0rJuy0KvcmSHKO6 /Nzk56qM/wD6q574kaKPFfhO509SEndMozcAODlf14roFBhEzxkBR1IOfwNVLvF3bYVQCHAZ c8VV7K4rHyx4f8QDR/Os54yl3ErRsccq2en6da7W0uJ/sqGa5iaT76K2c9R+XQfrW18W/AEE G3xDa28YlRdt2qLjcoGA/A5I757fSuX8HeHpNVtRJ9oRIiCiqzHcT2OMdPf3rojK60M5b6Gv eXut6vZD7RGz2QYEqyYVcYOfpjP1zU03iGJrER29qsb4Cq4zn3B/HNUzomtXTyiNZC8AaKNg 2VK4xwB7uR+H0q2mnfZrCWGe23TJFsaQNj5sdfoev41slbRmUncY91NZATy+S8YQNsV95zgk FgSe3T61Hq/iRdUMCvbRwoWx5sACkDsDxg9BUI8GX7adLdyMiKFcpG0oDuuewz+H41m3V7Ld WOwWyCMjCkcMMccnjOTVxSv3IRrX08egXFve20iTyLkFEII6HOePXAqtdasus3dv/aBZEXC+ cyc8HJ+uSfyAqC80JrWKK5DRuIQjEK4LZIz0+nPNVLy4uNS2b1WCItuQgDgEZx09K3W2moWN F7rT9NntbjSbmaSQ7kk3qVYA+nP+ePSpbjULOS5M2qI0pVcoF+8xAwOT044rNuNPOnqtxFNF cOpICp1Bx9P85qK6gmvLy2k1KY7P7wOT+ffjP5Ckr3El3NSB7Se+aGw4hKITC2CQeev4/wAh SJe21jcOt/GXuDlgpJBAb1P4frWRcxRSXUUWluySSfeBPzHqOCPYj86ebFrG/L34dg4AjUnu BgDp64q1a1hJJGil3b6jqEotUMcSjmFm4BJ65P1/WnRaq+mxXEU0CT3RckmbnClu/wCBrOa3 iutUSGyRoDhmcZ6AAHk/hS29u2n3t0t5H9pDAMqtyAB24P1/Sk/IRIl3LqlzcMgygJPllsDP AGPz/WhdXj06SaK9tPtcmWfO7GBk57H/ADmoLe3bUbpnsVMSbfuH8P8A62aRIhE80d7byTys rfKvYcZ5x6Y4qZ3TNEWLS8l1JZPscPkxZ+5jBBAb/wCvS6drVnFLKl3am5kV8FgxGOuT0Iz0 /GoLPT7nUQTY203kqzHhTkHnH8zUcFlBAGS7jk88cEoACoA6ng/lSb5gSL9pqT3UkjWkTJaK +UAByP8APNRw3sOszQ2Z8176VxF8oB5J7+mMGqlsbq1WT7LFKYA6lSh56kYNdz8OPBxihOu3 sOy7uMi2jbkouOXP1HH/AOusZOyuzVLod9oenwaFpNnYxt8kIwxbkucck+5PNLd3X2llWEER gYLHHXOefzqO5QwRpJIwXKY4PP4Y9qpTztJGsEJ+THzEdc45z+tcl7vU3UbE81/J5y28QGcD cyHrgc4pUv7bTLUrPC7PM24g4yCRjGB9M/iazYpY23MiCRU++7989FB6DOM89h71Wv7u71OT yljEbIASq5HGex55Gf51nH3nctuysXrzV9RjkCwoVQcBgMr1xjjp+VUdRtdQj2Xu+WYqckg8 A+g9PxpYnupP9Bd5UiY5VnbofQc/oMVdTTpIna3nBSJx85LcDHQ/qPUVu9rGFyH+xZfKkkEq sB8zgOCwb05/Gi/W0itGkS5T7SI/mCg4HqRwfboaLy2/sdw011E0BHAVy25c9hzycj246c1W lgtoZ4ZzcebG+SoEZJGO3Qdweue9EbktkdpHaxWoh2ym4Klg7MAWOenPI69am097ryzuiDRv hF+X5l9SMjj8DS3b2kaQyxKzksP3ZIwhwcHHOByOfSpG1WW6jFvujjMeSXiUdOnJB/Wk+o+h qW8L2FtJIr/O5CxsMfdH0qpeyyWc/muzMrbdiyNwW54/lVh7Ga2sYG24SNcDJ+8e9UhPe6ko Z22wrlmB7AZ4/l2rGK1G3ocpqUk0+qyGRhI2dvTHboKszJblBHHu88EZeTGeecDv271DDcxt c3NwY/MYt+7XPQdjU9rPbQJi5lczyKXwPuj8ema1Yty29kbC2e5Zka5X5lSMjcKvWwmWTfPk qBkqTyCc/Wkj0zz7JrwbnxgnCnGR0x/k1bAnnVXkIjRl3YQfdwe1Smr3BrSx4j+0VZk6jpl0 iMsbIUOeQD16149kjIPr3NfR/wAe7cT+C2uIP3scUyFmOcrnj+eK+bxlo+v1xX3eWT58Ol2P jszgo1m11GykADByTniq78+gGeasNkqB0NVmQbjg5GM5r2UeQ7oafvcdaHGR9aeq4ViT17Cm sVX7w+lO5D8yNyducjr6185/tcZx4Tz/ANPf/tGvowgcjHuM186ftd9fCnr/AKX/AO0a58V/ Bl/XU7svX+0w+f5M+vlXLEGrEQCqQTjJ7VBFjf6H1qZOQRntXZex5KVkKuMlR93HQ0IcCmqC rYYj04pYkLIcnoe1FjUl5GTnrjmvav2fLMltTn2ZIUKr7f0zXioz82emPxr6N/Z/tXh8HzyM 6ky3JKIByAABz+NePmkuXDtdz2MtjzV0+x6kGKRZOXcccnmk1B3ljVY41Rh1K55H40/e4PG3 du5GKq6kJbhcqpQjrsGP/wBVfATZ9vEwLrzLmURl2IGQwB654q/oVxAmmxPPGwZf3Sop7jj+ lY1+rvKZ5HP7sgBTwfr+YrS0We2nhV5HYAPn5e/6+9cVN++zd/CWLOzt5DJLcSbULMVR1O4j n8hz3NWkiVo2klnXbztA788ACmpBG1000k2yDoIwuD07f/WxVRLQ3ssrpPGLUnB3sOPT/PNd ibZiSLFc3skj+X5ca/8ALXORj0GPx71G0tzd/KrukaKAA/oPr/hUEVlLLOLaFi8SDh1JGc4y e/p7VYkknheSFGfA5OM/Nx/Ie9Q0MryXZ1GExqi+SCMAj5j78cj8ajm8gR+VErhwQNxyQfYn OcflUizPBCIvKiWQjDZP44/WkEkH2cZjfzOpI5A496VnJASQeZZMiJJHI5YB/L7D068fnmrb 3D248uUOWl4APYY61lx2pSyNxFMJCmXTeeT7AUtnIyR/a5tyqOdhySxz6c+/eplqUjReWSK5 RchQwwRnOe1WkSJ0cIMSkbsYqF5JbsCUIkZAyCqZOBg4psR3zDJ8vIOc8dazV4sdgltYb6za G5jEsTqUkRh95SORg15Nc6BJ4M1qRJWMWktzBMVyCM8DjqRXsFvJtLrK24DONorO1zQrbW9N kt7hRNE/3WPVD2I9D1/M1pB8u60IkjjtNad/3FhcvLGC0m9T1YjOP1PX8qsWN1HZySwXNssl xkltxzx04x7ED8K5O0tNT0rWJ9O8wROhHmEHau0H73Xpj3roLGN9Oc/a4vtc7LvDB+MkknOD 9a7opWsYW00FvLSG8tnlE8ccbMxiV3IOfbHbOT+NZ32uG60u5tfs0REcexW2DdxxuB71YvYE 1S4uApW0jK4EbsBjJ5H8vzqCwupdO32qW0ExRn82R1yzg9OewyCe9VH8TNDZPCCTaRDOXjwI 1ldTLhmAyMY/MVXu7KC5sJEFvEkOFRSBtfA4z+Jq/b6dJqWlO7XUcIkLgCSTaQo5OB1P3u3q KrS61IbSWAW0W1EETOUO8t6g/TFVZsehVuPCdvaaZDIL0SzqiNsGeTjPJxjIrP1DT5tWghll kl+zbs9OFBHHX3xgVsjTY4vDZnF0jyCPeIieSQf/AKx/nVVdV1C7tIPNb9yzCNk24UY4yB/n tVx7kvTREF14csoLqEWM8ktwZCoLqB7Ajn6n8KdN4d+wXdrLqIkNsVVgjZ+9nIwe3/160b22 sfsiy27TpcJ5ajgAA5HIOfXj9annivZ5rZ79ZGtxJl9x6HjoenUD8verW1w2RlXOi22oanFD ZQSwykOZVY7s5GMZxz1x0706LTf+Ed1UefCGMobZHISwGD6/l+Va92bea6SOzjkS4k+/lhlu fXj1/WqcsZsLwLqEck0DZMaE4PQjt0//AF1otdQXkUY7BtS1U/YI/LjUKGgXrn8evTvViGOG K7mTUrcvODhUHyMFOOvB9CfwqSFEmvCLOCRN6gSR5ycjGO3Pt7U2CGC1uZRqKzSTBflXG1sc cfTr/k1Dau7saTC3tXe4nksRI0AZsRRjPzDocD6n8TTYI7BTO90ji4YDJUjjrnPr2+uaZCjy XFydOeRrfc2I1OfmyDyPzNV7eO3a5mW5klE5IQRxru5PqPy/Osm7rcvqanhizbU75rOEPHaI xO/PO0E8e55Ir0CaeO2IjQDaigADoBj/AD+VZfh/R20zTltzxM53SkdfYH6fzyamZk+1MqLk BvvNz05/wrjnLojojEbcyi4uWkmJwfkAHpWVqF09zIqlMQg4VFGC2TgfXnNXbm6gtC0sjhcD dtbqx9AP0/GqdhdXN5M06QjCg+WhXgZx834dB9TWL3t1NfMSK7fT45EiRWTaQd+SdxI4B4x/ +r0qlJLqlrKZXLLCfmQwjH4Z4/T8q0Z5r2XMOwRyZ3AogzjpycDNQKkskgs7iSUxyH5t3B+v P+HetYxa0MpO+pHDodzqJ/tCRXLlAzbWzt6kH05/rVy0j3iQNdRvJECEBcDIHbjHI9sGlWwu bfGChiA+WXzAAV/z/M1najbGRs2UifZw+GKsPlPcHv8Az7dK0WvQzJLRY9WugZpkHVYiORt7 g4yOeetOhkso2aKffICwAKcbDnjbnAz+Panz2VotkzQyiLaACADlcjqPY+xxULfYxasFkkku QuOONxHGOTnPTqKW70EWUuIba9cwK0khOBJMMoRwcdRnkevrUoR76ZGKRxwMw3KBgN+PeorT VRbIsf2MMowuTz+R/wDretWbCKZJZbi/ErFULKEXJOfQdD+f4VnJtaItEl1Bc3e5dyYHG9j0 56A//XqpLPKbOaCOQtCmVYqxyxHc/wD16ebX7XcSiJysaDJDts5yc59PzFUHSa7uXictJbR8 MQeCenXP0qFsrA9TM0+NFknklX5QuAAeWx6VasNNhu4TcXLxw+YcASYDYB5A79B2qoWZbhUK YijBDEDnP51d02zbVt3lELFGSoLHAHHcZ605eY0tC9ZAvYsqSSKqD5QGxjHb9KuJcSTxqvk+ UDjJz1GaqTSPa4W3YiBMqATjPuauefC1mRbqxZh99sdf6dKmNr2F0sYfxHtoD4L1hWjEsRti WVGBxjn9K+SFDEMPX0r7L1LT1l0m4huInME0DxuCDyCMcetfG0+Y3kHUhiOK+vyeXuyifOZp D4WMLAbe3bmopFwzE8gHgingFnAz7mmuFZTz3r6eLPnfJkfAXA598UjjKnvxwD2pzL8h5zyO abzgtmrsZuw1wO+On1r5w/a6GD4U/wC3v/2jX0bJg9Opr5x/a4/5lT/t7/8AaNc2Jd6Mv66n ZgH/ALTBev5M+wjjO3rinxfOCe2elRE4fjgipYXxJnOPQ12O55SWo9gDk570sfyqe9OfkDt/ SmoBtPX3oRrElCbn5JII6CvqT4NW6Wvw+08oq7ndnbH8XPX9K+YLeMNIDnORnB9K+tPh6iW3 gjRjHCEzCCUBzg187nEmqSj5n0GUxvUk/I6iHKzBsbg5JxnpVS6EwmaSNmCjJGO1XUIQBsED Gciqc0s8UTEuyjuAeCPpXxU0up9bE4vW4jNcysGy7jLLnpjvVrQhBNEkYZkEbZyQDnI5qPU7 aG2LSq6sin5lJ5ANVNKv7d7+5tkV/mT5dhwyj/Jrgd1K6OpJuJ1M/lXd5CqS7UTuRx9frSXk IkuVjt5AY+SwbqT69RVdBCLRVilaRyBl8cAccfjRqaw20EUaTlJTgMx4UDJ4B/8ArV1Rd1oY WaEkiaKbbA/mvITuaNgR9Pp1p7C5sWEJd0kkPzZBLKPy6/hVJ7b7IW8p4zeEDCKwLAep5z+Z 70+O2urZPtkgeJDyS3O4+g7DnHr9aNUMlt5TbyvLcxq7E4j3Lhjx9ferEDROzSTQFg33VUja Tj34/LNVPtU9xKJZl3qMvl1GFAxwOmP/AK9WprmKdkJj2KgyQpPAx3qk7isVXsSZ5mNxHDDL hQsjYCew7D8jTZ7eeQhIS4EfAAOVbj0706eSK6uI8gxxjIXd0Of8/hSEPHtjgn3o+QWQkcdu OPfmo8wTFk1uQH7JhMg7Sqj5z6989McYq/dCNVjMZG4AF1I57Y/rWdd3L6QqyyRLN5nI3DJH +cVbttRtVjeeRiCxPyLySePXHrSavbuWmXYLjfOAwBVjz6gH0oY+Z5gB+QfxDvjrmqKMsP7x CfLZh1zkE9v5VaiuBhWAODnoO2OhqU9dQaOU8f8AhZNesUlgDR3UJI2/89V7p+p/OuR0O/bS 5sXcZZdhWOOQ4CnkDPfHQfnXq6R/aG2tgORlVJ44rg/Hfhwwz/23aDeIPnntxk5x/EP6iuil Ud0mYyj2Me6uP7Y1v5IhbBUXcHOFxlu59cflU9vevpRntgsVwWHmhpfmGOmB/jWBp+sf8JBf WywpHC2SpAY7WBwM8/T+dbbM2izKZFiumnjKoNwIUA5x1rqUm9GY2DSrMatHdSq8MKu2FEj4 Kk8+o/yKfptymmo9pHHBcSof3hdck9O/4ZzToLN9TuHMDRWyLGN6FuA2cA/lUNjI2i3txZmK GeY4cs/I29MA59a13VkJK2o2906D+yVjknVFbOFPLbdvOD+NIupXsmjrHGUcf6sjaM5BJyDj Pt16CmNbxXryS3EyWwDYw5z83U4/HNFp4guLWCWKMKIIs4Eaj5h0/T/GkncGtLsn1EWFto2V vGaWFQRHjOGHanXtleskb3PmLHIwL5Y469P0HSq1tHp66Y0t3I/mKGYgYCpz0z+BrSvpr+Ww LyiT7NgFlP3doHH41qnckg1Robi6t0sy8d1vwhZj0HPp/sk/XFNuLSXS5opb+ErbLj92Orcn pj3P86mv7yzuriKO1hkR2ZfLlZslgTg9uDjNJfW0trdwzX0cptTwxJ+90P8AP+lDXQrdFKS4 +1aii6XC6MwbzUJOT+OPTPvyetL5PkXha/DpwAAxw3vye3OPwqOQxXV3AunwPbSOrLIhyWB5 7j2P60POj3zLqRkjaNMLkdevTNRLVvsCXRFb7Q1rNNFpzXDWxLEmM4bOSRnH6VreEIVhuX1L UkIYSERgcFjzliPz/Om6LYbHkuI3dLFfvuMq0jHHGc+3NLqs7XM2+NxxwkZ4VR6/Wuec9LG9 ODlqdONUW7dmMh8s5YdgB/WqFzqiW9vJ5Lb2OQJG9QPSuXOoXcUDguY4wdrKowCfSo4WudZu Ut4cjglpMfKF/CuSWiudNi4iNqd089wXlgVunPzei11Md1e2Nr5kKrHlAUCLnjA4wfTpj1pt hpzJFHbQxpH5YBVsH5z3J9+9LKLpw9u8rrAwwwdiMfT3/LNaQiupjKV9CokGo6pNJcOXEJHz bRgL1/T/ADmrtvZR6hCgkkRXXKKsj8MPQ98/l0qJ7F7ZYzFcBASF3FgQR3H/ANb3qHWPs2j2 0jx3AMjkLtjyWXP+R3xWhG468Fq+6zjukRg2xgTwM49B61DDbQWkkiSv5afdAi4AOMZHNUI4 LAxSTefJ5in5sLyT0OPz56Vp2xspLVyWMUqpyGXlh6Yz15pPUCacwWcvl+YbgFccoDuz65xU Hl21rNFMGlaMfOEcDavoOuB/+v1pLCeGcCB0nYbj+94zn2/Lp2qWHU/sbPH9jMyL2lP8hkU7 30C1iZbn+0GjS1hjinx8piyRggY79fp7VbtbNo7cxTMYnJAYMe/U549/SstVvrhzNBGy2smM Kg2qo6YPb/8AXWpcyQw2ILszTMu7rnb9TmsJ6DStqVbqKOW4EcLhwT8yuMfTtU1zMdHhihty G35DFGBK4x2H40SW0C2Yk8zMu0YYgkL2yf8AOeapGwkit4j56ZGMEtkkj/PoKpJ6CuY08pBe Lbl2k5kJ5xVm1IuJY7e2Z3UHJIQn5vyJHSqV/MxupHIyZOFOeBVuK2htICIy8jsQZDHnoQMg Vm3d3NOhbuDJbBrVWDMuGYkc5PYdT6/lV20aNYNuN1ztO1WOFB+p5qmyz2syedBuJUEMx5GO ueg9etWbcQyW6MZAkjYOwA5B9yP8alSSehDHlbn7KGlykZIZtw7+nWvlH4gaVDovjHVbSBt0 KzsyY9Dzj9cV9YvNcSWJEhMiddvoPwr5v+NOlfYfG8s6lWiuIhKpB7gBWz+Iz+NfRZTPlquP dHjZjC9K558mGc4J6evWiT7rjHGe9O5MnbBHX0pj5A9sjkV9pE+Td0tCJlGD9c9afEoIyOT3 pgHz98Z4+tOVhkDGOapsxvqQTcPz+lfOP7XXXwp/29/+0a+kLjAJwODXzd+1wTnwoD1Auv8A 2jWGJ/gv+up24H/eofP8mfX+1ccdelOi78UjfKcDqehNTRoWyBn8e1dz0PKh3Fl/h9Klhbb2 ABxxTZF+RcnBXpxUqJlQQeBQ30OheRatow1xGmD85AJA9a+xNAhhsNHsoNhCLAuFHHavkrw5 HHJr1hG+TGZUBA6kZr7AtVjgRY3JAVPlAPNfJ51J+7FH02Ux0lIfA4RGUKemQ2arXnm+UVkb dG3BU/d/nVoENDIoJ39s1U1CNpIo0uHLIP73QV8nN2R9JA5nXobW1hDjEitwyZ5/GuV0u5ij 8W2kZLLHKGMnXIAGce/411niRIoUSQgPEc5C9+K82/tNR4ztFA3xoo3exb/CuCbtI7YXeiPX 7K6snlmykkb5GEYck+v+fwqukFvDG0txcEheFVl4Puf/AK9Ev2cQII7fEmQ7y55Bx9M/1pJZ VurtMuIYhH125OO59en8q2i+hztGbaW/m3DSyToFDcljjJzxwe/4VaEF5qE7M6nYoO1icgAd P88VVcWst6GgZooiCoLoeSc88cfnU48oRpHbyrIp+8Omee2R9e1W5BuXHu5Z1NupzEpwBt4b jv69P/rVK4UW/kugXC/NsJ3Z9sdKrss+nLGUkwzHGxeoGPzqVp5LW3DNtllkOPnHTjrS33G0 QNNbFWhQOZFwHb72P69PWlubeOOFGEiCdPnUdD1Ht9aLNoUWSV4g7E52wn7xPfn+dRyWcc4m MsqxqSQVcEn6cZ/pQ3cmwtxFcS2zTv8AMq889D/n61QW8juWhMi+SoGSyDaF/LH+RzVyOGW6 LLExkULhD3HTP+f1qhBqZ+1z2iIrRoPLfI+8c8nIBOOlTa1io6G8ohcxxxnCsuSX6j3/AJVT u5ZLKUIjZY9NrA5H4VDf3Fu0cUUb7Ji23BHLAAgjPpk9/SnSLJGqwsCquPlbHT/61KeiuaR1 NBLuOTYx/dngt6HPBFMnv4bZHVo96cgKOQaxntGu2fzJmikH/fS/Wlh0m6hHmpcCReBkilzK wSicB468LLby/wBpaTD9lBffLEg4jHc8cAZNZdncGDZJcSRzBRsRN+V5xnOPp+teutbJLIGY 8MpLEdD65FeWeNvBP/CJ36anC6tpZfPlZzt74J9Dzz7Yrrpz5tDmlG2ptQyJqOo20MKpbYjY sM4V8EHPP49fSnOG0u8leQRzmVQU53Dbn69etZFrrUN5NZxpDHHM7ctGxIxj3rTvZmsbiN3S GaNlKqoIIDfh744rfyI8zMe2Gu38rhobaBV5RyQpJIHHXPUVY/tC5095bC1CFUYEHAyQevao TcC71PbGIrbanL9F46j+f5U/TWn069kUPBcswB3lA4xgYxn8K1iQy1ZwWN1aSpPuhmcl9i8j G0cHJ6kk9vWpZZrx9ORYmaSEEDlcqQD/APrP4VQsPImu7r7RcNC7OBgJ0Ht+f61LBe6g+myr amR4kyEbdlepPI+tXe5DNNn05ntzDAfODKUZjkE9xwOxP5Cor9ZbK+iF8GFqwLNEg6n16del QXF9ZvbwPHC6XCqFB7F8Yx+tLeNcQMFv42aNgdre+ck5I9qPUdijJex315ELCGWCQoSRnv3A Ixnj1pNOtH1fVxbXXnBlAxuU5C9Mk+nGPwp1xIEu4msFk3tkNGpGUJyuAR6g9fetiO6a2j8i JxNdMNrzjkk56D6cVM58sbmkI3Zb1KJLSxht4mxaoSojZgS3ufU1ks0jkFD8qclitWYoX84/ aZl83GAzdsHpipmkuLhjHbALGvyh8c//AK68+T6s60uhl3OnyXdzDDl522/cA4Xp19K6fSbN tHifyo1ckfO+zk8ngZ7f571R00yRSNb20atMB+9kAyWz2HX/APXV4mV0EE0/lIwP3zyvt1pq N3dhKVlYmvYXukeSNsYGSNwGMetQQxrfqhknUSDgljwRxxn15PeomEVpNGPO/dsCX2nIZT1p 1yLVI4vJlZlc7SwXBXvz7f8A1q2SOa9x9rJbQCc3MpUgkJtBBBz2rJhe2u7wyyKZ1U7VUcY/ pVvX7u3FsY1SQythio/iHT8KpSPDNb7FgCShQECthsY5FTe+hSLD3FvbX7eWjyowJGTwSePc 9+3oKfN9m8+3MKu6EliikfK2Onp1qLz4YI1ge2xniLZwd3YY/wAe9X9PuI4lEcqRiRhyjA5U 9h7/AMqbsxtJkjtbvAgt4SrkneCT1xx2/SmS3E1+HhjjQXGclkHJ9uvJ/wARUb6lJpqMzRhl 34OU3Bj1xzTBFe5lvJ2KWx+aPPygj0J6U4pMErIkW1uIblY3dlVuJNxwccZ9PbtV0GFruVZW CxKgyvTt0qARpcwyXj3KSyqgBVf4Rng1LceRHbhhiW4YBxjGB6c+v4cZrOaV79hrRFs3FpbN cSOrtG4ysXdvYdSO1Urm5tby7NukZhZVIClwwX15FTXU6PFzGX24JbODnHT6dah1Oe3gTzFR hIBt/A4z6+gp9NSLHL6gPKu2Qt5gGFVs5GfWtMukSKkc4SRvlKg8j1Pasq7dYbsmQfLnJVep P4/nUtqkckqziRVKKcAn5/Y4xnHBrCSN7aGza3BKSJIGkYZVVJ4Az7GprVY7qENhUzzjIGf5 9qzIr5bfU3ExaUSgbcHHzelaUKsplYKoh+6Dggg/nUQfQzdx63Uxt5Ykz5S9ivb2OP61418d NMVbPSb8MNy+ZA24/MRwR/WvaYLjaHiijSQEcu3Bryn456e//CMWNyvzKtz8xGQOVP8AWvay +XLXjqefi1ejI8KUkEH0zgU3jy3GeecCnSe2AfSmyAr1Gc9PWvvFZnx0rJkW0+XuxzuBpZAH cyE4z94e9B3AYzxmhhlmHatGznejuV53BG0EdCa+bv2td3/FKbhg/wClD/0TX0jMAQOMV83f tbf8yr/299f+2Nc+I/gy/rqdeB/3qHz/ACZ9grycHOexq1ajL5Izzjj1qoF+UbvWrdoMcjrX c9jyoX6j5lwc5zmpIGCq2RjkYzUcynDjrg1PbqC3AzjGaRprc6z4e2cN94v02K4OyIuG+Uc5 7D86+q7fylDLIx8wDA96+Y/hLbreeMLUtkbELKfcCvpZJN9qSGDSjjBzz9a+NziV6iTPr8rX 7pvzJGlZIyBzID09Kbdk3uBOx453NwMUq5bC5/eZBJ96SeIXUpMrbQoyGJwK+anoz3YnK6/O kbTQyETgoSgUnFeO6NqQbxzcQON0YljGcDKgHmvZdYCqzRxRGRSRuY/X8a8Iu5hY/FmWJFxH KyYXnrt/xzXBU73O+kfQ8dzAJjKY1BdQF+Y4/wA/5NQzLGbaZBCSWBKkHAx9TUUs6yLbwCFS EUFuxJ78n0FSNqkEl2mV/d7SAQSePc+/r+VaQ6MwkjKb7JHGquZpp5YzhcZKe3XI59Kkgjt7 SzDzSBpSDjAJJxnlsD+Zqruht9auN8floyAbU/QcY/I+9SxPFcXY2EW8Q4G7Hb36d66Ha1yV qX7WzaZFmeVQ5PMm/wDl/k0yN7yVwzM+BywfGMe1MSNJ50S3kMm4HBYnJ/Pn+tWGhntX+zgu YmYsQjjr7/qfrUrUrXYRpGmcStBH5Y9OCR0/zn8qrStHf7EKvbBWOEbkEfhj+tSyRzWpMBzu bnJXJweg6fSm282IXE1qVkTOXHHGTg8VGqWwiWSFraILazhvMUhmU4xg9B0rI06Y6fNOk2JL iR93mSHI2+vUVYvXltEE8cysMALGDz049TVCyjnnu5r67j81lwF3ttJ9s9ab1V2NaFnUZbWw ghdmdZAxZcH5R1656c+gzT9GF1NK07t5yKCSw6bvTp04rNurqK7u3W7Bh2qNrp0PpjB68jrU +nM8t6IbZW8oDbhuDnPLHr/nvxQ9R9Dbui9x/pLY4QbwFBJHp2qC2laSF2EhZNwKpnB49qp6 hqwtAtrK/wAmduAvp3J/xP4VI8sb+RNaYMWfm29Mk4z06VMk73RUdUXUvxIr5XkHAYYx+Iqt qVgmo6bLBdBZIZQQxI6Ht/n2prziOdlmjVGJw2Byf88UJGXO+OYED5sDr170bbCtc8n8Q2dx oF4tqQiGRx5FyoOGXP8AMZ5rSScac0dzIY7kKSoQHI3D1565rs9d0i08Q6PNaTIFm6xPj7jd mHpzXkX2a50a9xdk/uXMboW4Y5789K7YS5onNKNmdVcXMWs3FusgjspAGZmzhT/nj8qjt3uN PvZEtnWQzAAyE5wAT0z9TUNvdLrNxEPJjgYknK/KpGB7+tTssmiXUYgkilMq8Og3DjnP6mt+ ZtWMrdR8FnDc3V3c3d0IZZcKEVSwPXnjp0/lT7K6u7W2MVrvCqSFABG89Dn9Px+tVNsN/ezT yzC246qDz0C4A7U61ubqye6gt53eJGBDKcA5Hp+Jq1fZk+hoia2bSYAwcXRGd3G0tyM/l/Oo dTa8QxtdiQQbt8u4dzwfb/8AVTIxa3Gml5GKzkbtoAwGz09au22m3bEXF87tACCsec72Hf2A qZSSGot7E9rZppcY1BPMjd1J8uQgkE8Z9/8A69Q2Rln3vGoQA53FsEZ/kaL9VvWQsSz9lJ6C pII7loo1IRIlJbAGAD6n9RXI5XOyEeVFpmgsYBMpW4uPuqhBP1JzRJfSaZGJCiPcsuI4tpAT rk/l0plxJDYWxkZPMnBxGrKcE/8A1uKyoLq5vJyJifnIy4UZH44/rWcW5O5Unym3YWdwy/aH cnPzHHG38q0o40uy9xLMrTY55IGcdjgis+y08xvG0sg8tl5JIyR7Yq9dpb2yJsLujc7VGNv1 /wD11v6GLdyv/oc7Dc0q4YqJc8A59Sc/lU0Fw1kJNsAeJVJbzDgEU64eK4gjeG2zKrjchb9S MZ/Cm6tqEt3F9hWJBMybty8YHofX8ataasgymu2kvp7nygsbH5Qew/T0qUXUiXTTLCkW8Aru Gc/n+NV/38v+ikkYUEnpjHpVlI52aS3M/wAoTDbnC4PT8Kz1e5Reg+06jfJeC3VEUbTtA4Of 0rQkM91ieOMhk6/IC2fyHH1qjAj6eXgkuVjZk+dc4K80yQS2l1HGZEAkB5V88Y6jB/z6U7aa i9B0VnfasYhO6jymygkYAv7ckH9ai8j7VPLbvMI4h94AkkEc9R0p81uLJImS4EqSfN5wOeB/ 9f1FSzJDBaLLHIXLtjYUOV6fl9elVaydhp3FezgaJrRX8sAfdAwG56/lSWc0QujktsCZ+c/e I4/+v+Bp2pNHALeSN/3TrlgRyuODxWfBPBeW3yIXfcwO4YAw2Bj8vwrmbbZra6Nqxulj8+d4 htLYRXGRk9Sf51XvJknupxIuEYA5Tpn6flUpZjahIo9mzA2kbvm//XUOpTS7DhU+VvmCjn3+ taKXVGXU5bVGzOz9Cx6DrgVPbWQvXNyiuLdOMscY+vNQ37JLM0gBjAIUkj/PpUljbS3jHyhu ROjDt69j6VjUVtzVbFi+na4eJ5BvAHyhBjbjpW5p2dTiQooeMAbkHYjqTwfaufN0VnSB1RAM AsPbvWjpkTJMwilcRucnBxjn6is4tXsjN6GjBKLUSosHmNkKW6gfh09q4n4y6dLe+ArqWP5/ KmjkKqMYXdg/zrtFlS2VknQrI4ycAH8TmsvxBDcXvhnVIYd2xrdwqMMq3fH1ruw03CtGXmc9 Vc9No+TjwM7s03fv4JJHalkBDMDwR1/OmDAEYHXNfo8dT4eekgjI2kdSD3oclX4GfWmRnBAI yCc9aRg5O4Y5Fa7mLRBKFUEg59K+cf2uPveFf+3r/wBo19HTKFDEgCvnD9rc5fwseeftR5/7 Y1hif4Uv66nRgf8AeofP8mfZCoGAJA57VPaqFY8ZweTVVMltvGFFXYxlTz2z1ru6HlQa0Qr/ ADvJ1GOfrToPmkOOQKaxClupzTVO3ccc49eTUNtG0T134CWSy6pqcxYK8cACk9iT/wDWr3aC Tbb5jUGUsATt6e9eP/s+Rt9h1NjjGYwDj73Xj9a9hgi2rmJgGDZIxmvhMyk5YiWp9tl6tQjc ldiJFeIqXLYYYzTAv2ud2kKoE4+Y4yfapFIQo6gHcTuzTdu8yPuA9BnH9a8iVj1Foc9q+ofZ IJAIfO2556ce3rXznELm4+NKteqfLCB1B+X5QM/1NfROs3KrbyN5ZO1dq4zkk9OleD3E8q/E 7MwV2jgUIuOQpJyD9cV5tW2x3UWe42d2IpZXaIZkRUU9/Uk+vH9aZb3qWyC3jgTMmfmYcAZI 4561HHd+csKoiiKEc9jkdTnPSpnvNsjT+WrrH8xCrwo4wARVwstiJb3KepzIkToYEbcAJGY8 9egH5fWohcWjKR5chnMeB1+UEdxUkt5N9pNy0QudoyQn3c+xH9M1BFdQi9F1eKI4Qo3smMZ9 MHOPxraKfUhdjSQQxWKEybZCp2jbjB9Tjgf1p8Fu72sc0kwDL0KtgsQD0/8A1Cm5gu7tJVDR HaB83OBx3/qKBBG10UR8xYx83ynPXPP9c02rLQRMUljia7ckqiYxIAdxz3//AF04ytI7TTQ7 xtAyvBOegzxioYwxYRoxkVRgBDkZ7kVO0kksTqUBVflIXgk49vapi9QZmtH9ouJir+TCx3fO SMe47VFNcTeWYEPmbDhR1D/y60urlCIViUxndkufp7ciqd3M2mygQzCOY8HYRnp39Cfzo0Gu 5Xn1Hzrk2q2yAIwWV+uDnoM9e3St2MW8Z3pKzOQNxPGB6DrXMw3LWt4JZot5kIUN9335x1/P FbN69s1mUeVoiwJUY4/P/wDXVp66DZg6o9w9+m3KrI4QZUlgCcdx6/St60/0RGje33cduPlr AtLRbe6iliZfMjYt8x6t3GO/T3rej1AiRZLlNxaPIGAB79e34VbsCeg77UsTxhwskIAWNh94 exPf61Iros2bd0dzz97kZ9ayYpVuGnY4jQ8MHbbjsOSf5DNEcYn2+SVDYwvUb8eh9fasHGxq tUab7ZUYPhZG+Xd2/KuR8X+FBqUQurRN97DlijDKzKM/KPeullmaNgtxH+8CgjHX6VKrtHIo H72IjleoOema0UuXUiS0PHYdYN5eQ2xt1tmD4c5wce+a3RN/Zd1bywLFcBgUXDB1BPr/AJ7V L8T/AA6gRNTs1CSlxHMV9B91uPyP4VzlpPNp7xzq8czZK7Q2QOep/HH512RkraHG9DdUx3+o s16kNrhRyi45HGcfj+pptrPLpN1MLScOuxX8xecnpjHpzVH7Z/a1wgkZYhEjEybdoIwOwHXn 9K1fCejy3GqPaWlwroFVpZlGFVfx/wA9atyaW5PLd3Rf8P6RHqFutzcmRFV8sB0Yhun5DB+l bt47X8ojA8i3QY2k4GPx71YdjKUht03RoDtUdB/jUCW6W4eS6bzGGW29TntxXHOpzs6oxS1I vs8EEw8mPzMAfO/88Vb+yGe4aW5A2JgBRkAAY4GPX/GoNPhlun/cqIABuZ2OcfQ+uDU91cLb W5jESSxKMYdyW6detZJSbsVJ2Of1KW4vboyxR+XEuFCD+HHGOaksNMudSZAZlTZwAeM/yzVa ea8tMctFg8BFwMH1q/Z23k2omEiMGbB2Als56Vu2r2M27mppAjt5XilY5UfJgZ6cYzx+lWbS fZJKJLcBM5AkbJ+vB/nUcQja2V41JORuUsMD34P8+auqZL2ICNACh3SKnzcfmatGd9CE3lxY iaaKNFB+YDbknjp3z69KyLpLi8M15JG0atztGFxVjWTc3ca2YuwgU52lgDn068fnWYgRJ5Le ZwkcacoTy3P4nj61SEkMntWkYzmYSFVBZQRkZP8An1q3Bp0Mjb/O3O2FfOc5I6+4qCOBIZn8 w+ZCqkDZ0Iq5pMFubiRpTJGrN8rDAx6GoVr2Nb6F68srU25uUfe6jac7gRjuP8RVdo7e4t/N NwC6JypBAYDv0wasxiFrhhK7tET5e5R3B478n9frTdlrJesgMkkanaVUYzn3z+prS2mpmhuk C3a2Jkld2RPMAYYxkA49R+PvUuly2z21y7KyvGQ/Azj2x27dBjrVeeS1srl1RGcRfKFU4Jzy cf5xVnToYHvJI2XdEAVzjgjOTkZrN76FpIrXSpc2JnB+WPqxGDk+lZ995VpFDDa73kgwTISO SeeBjoDkD2rorxYLm0uFTOdp4AwfXPv0Nct9q5eVUAhEeC55+b8Dj0/SsHubqzRq6Rr155TN gsXbBkA5HHPb+lWL+aa3WRsAu/K7xxWPozTXEixD7v3iw4B5rW1R3uWjkdpD5Yxg8YGPyrWL ujKSVzlr+4bYiNnzGO48U+0uHjIjgfdCPmLIMZPvz9P1qtqZ3swb5HJxgntVnT1jsywhm8yR zgqmVP8AMVjJu5S8hYp995BC5O9uNx4x371t2rfYZVMJYNJ0ZRnp9BXNOqNKoYN5h+6e47DP 610cTm0uFc+Wysdo3cgfrisotXsRMu2UquxlnkMR5BYg8/UD8asoJMSxW5KAHDHGQeMc9c1U UR3d0Jd4Q55BI2g45q9GfsrhEMcgHJLgHv2/xrb4WmYtaHx7rsT2ut6jE5G5J3U/99GsyZtp UjpjNdZ8V9PksPG2prJH5Ylk81SOhBHUVx0pKoFyc8V+l4efPTjLuj4fELkqND4mDTMevJx9 KjefYDgYGeaSFijAHsccVG68AZ5J5rsVjhk+w2ebchB6dq+cv2ryd3hgHoPtWP8AyDX0I+Dn 1HpXz1+1a25vDGR0+1f+0awxP8GXy/M6cA74qHz/ACZ9neYrFcAqN3U1Kj/KxU9OpxVSMhwp 564xU6PliF6dMZrrep5sSdiScjJxz+NKctHkEDj0pFJ2ke3FLwqAHtjAz0qeY2R9CfARAfCF xkgFZSQcjk4H8q9QiZothyr5zkelcN8F4Y4/h/bN5IjbL5Ibl8nOTXciMJFFsjyGO7Oa/Pca +atNrufd4RWoxQ9W2ODCVZcHJz0NNWKOO3eVmJLnqec+1SJuiRkRC3y/ezUKQFIBvyxY9Ceo /KvMvrY7kY3iZnaw8uOPEx5Vwc9Oe9eH6lbix+INtPIPMWSNcAjqQT17969q8YKZI4VjRlA4 PPb9K8V8dxG213THZRJuLRlQeexFcdWOp2Uj1/TJojE9wkaJIQMOMgfz54qOWWWNDZLHHE5D MybAc+g69vQfjUOj3i3NnbhIgEiUErySfyqVdUlvZEumiQxpuJ2r2Hbjr9PzqoPdIJLUikup mRLVcKu1eTGN0hPOB3wP/wBdQRTsu6L7MqmQAbj+eB/gBUkd/cXQkuURZCBnLphenQcYI+nH 1qJLqdDHc3DJcbVywYYLfl1HT/69aEli6uobdPshgYyFNzMpwRjHbGT9TTp2t0sY41uP3jIC uxchefXGKzLi/klJe4j8yMEMZUGFHp6j8s9Ku6ai/b3kmAikKDIzu6jsep+nfvQ5WBKyL6wC 2gR0YGVlHG7nHv8AWrcSy2qgyAMX5APb/PrVO3jSaWT5lCg78N/D/T+tJH9peR5EHmGMlgOg IpabiG36QRwb2VjLklN38J9s/wCFc5cWrPG0zSqu358g/ePXv/ICtq+uop0E86lAy4O0de2O o6Vzd9LHcXrqkoWFcEbwFx+PGen0p3ZSJYrqd5Yry4jaSFMnDjqB02/l0AqxfyxX9zHO05tY QBnbzjnpWTG8+oXKQRSt9lh2p8o3Bv8AOOuPyrd1O5jubYxrCnlRvtDA9cH69P0rRK0roTMZ BFe6wkds7rGhByfl+p68fnXVSbUtlM4GxAQSn8+2a5WSaGOW3SNmkZnXnnHuB1PX2rd1C532 n2eXKqnULkH396pP3hNaaGTJFJe3bRWUf7lRuO0Dgn1AB7f/AK60NMlMiSW4CNACFJGCSeM4 5yK57UkQOILSZmaXBZWG1SB9Tz1rc0fUI9P08RTIykMVZg2dp98cUSV3oUnZF51e3xBL+9Cc efnk0l040/DQE4YducH3qnqt/wDZG3s67BghmLEH2471kx6gVu98CO7jI4OTnrkColBdS0jQ nZr2dkB8tiAZEbowP/1q868T6DL4Yv0vLb97aCTHlnP7s+hz1713zS3d224WMm9uWeVcKfcU p0X7eph1CWCONvk2nIY+gAwc0RnZ2M5xTRw2kyTa3qFlasY2kAI/dqF3E+oAx2z+FegW2mpo mlrbW7iNnbDt3c96z9B8NDQBcSS3NvNePIUjdRgpH247k8/kK01MenhZLjfLO2QC38Q69a0n US0REI6XLMcTw27t0DDYJG4IHfHp2qBp4dkcKYuXdvmc8qnp/I1Xv72S68kOq4IO1Y26fUfl U+bfS7VWuSI5XGQuzDqOf51hvpubWJ77UYliWO0XdhsMVGBkd8c8Vn395PfwGG3EaXKkNwM5 H5mmNdRwHzrba6sAA7DAP5n9KpFLzUUe4LHZg5SJenvnnit4qy0OeTvuV1jnmYW11KyKxBKN yc/0roLJbezVYHgkdRxuGAB79P51zMVzskdpXLzcDB5Jx25rp45kvVRjar9uwAHzuyP5cexq U9WwdzTtlOm3DyeSJImACljkkevPSm6leHTYTKHEe87lJPXPpUUkzyDybmXa6ruVWOMge3/1 653WbiK7aOMsQo5OFP5c/wD162Wq1IsNSzhUyXizAuzkcckHr0/yKlu7mKeMxRF5XyAW8sHd 2/CoNOsDPtP2dhDx1IGB2xx+mKvRh7CaUPBiIHGXXduHUA46fpSfkUtCMSQQWrbIiZEA2YfI B757frTdOvZLoF5LUn1+baP89Pak1Vik0aRQiGOcBh3yO3J+tS6PcTfY5oT+8kUHb8g+U+v+ fyqOpVtLl+4lDJEyWxyd28bjg88E5/D270qTJeQLIkZWYOVkAPB4yM+n8jRY304VYSPMJB42 AjI75xx0PIPbpS216ba2lh8vfvBwAMMCe5P588g1tG+xJFM8F/JGxhbz0fbhOM+3b05B9K1D JA11C6KcPyQuDg46Z/z+lUbN4zaeXJH+9dWYMD8xIwMEY5/pU0coNlGuCk4bBzySD1/z+NRI ETandRaXG6o6nYrHeThs84ri7HU1OkeWiEzE+Xl/u469/wAPpzXTaxbJe3MA3qUkU9T04wc1 xttIIrI2uB5wLByQcqQccf571yzetzqhqjZ8KrcC8dHYshwmR6nNbmoeda+ZEJCjAEMmMkfW ua8LTSHVp3RigGCcfTB4rdW0ZLmaZkbYwJDN0yf0/P8AKtaburmU1qczrkio6HacoME461Mk QtYfOQo8q4KqBkrnrn0qn4ibySqtliSWJU/pRb6e89jBO1xgMN2wtyQPYn/Csal2JbBFdsNR /es0kzH5SR6/hXV20IhnjdkKqSMITgHI6muF+1GbUAZMJJn5dvrXbx2k8LxzNGXhGMjHP/66 iOpMy/JEJrgSqqxtnmMElf5/1qaK9Nm/lzQByxJ25Iwe3TNQyLHPKvlRFBnayk9R+VMSNbJ3 W6h3g8bD3GPUjj8q3dkrGd7niX7RFkx1fT7zy2SKWFo+vQg/4GvHJJMsMnOCM+9fQfx4sDde F4prVCYLecFyRyNwP9a+ePvO+Dnmvusrqc+Hj5HyGY0+Sq33HsMNy2ccmopSBgAHOM/nSyn5 sZz702QjLducCvbR4j2K8oA4AwfWvnv9qsf8iuc9ftX/ALRr6DdSAB2zXz5+1UMHwx9br/2j WGJ/gy/rqdeA1xcH6/kz7GR9pXHYj8aljk2yEt0I/Kq8RyVJ9fWlDZkyTgd+K7GjzorQvK2d 2SenalV9529Bnj34qAEbwM9RxTrfD3PzLkZ4HTJrKS0NIb6n1z8OUEfgXSPLhEYNuhKg98cn 8etdRGFRY8rkH0NZXh+KO00iw2Q7I/s6Dywc4G0VoQp5Yw2eQTnNfm9WTdSTP0KikoJEjP5b FQMsRkcUpkFusPmhsH15qJgxRlZjuI4NIswjdVm3M23IwCa5XvodCMjxDLLJLuTKLxzgc/l+ FeKfEMmHULG8fa8hmyBnGM//AKq9n1u6lQy7AqqAcb+9eKfEa1AtMsd5EqFSOmSRXNU+I66T s7HfeFtTaOxkcQx75iChxwAAAx/z+taUVxLbxrblShZixCgKXxnj/PFYvhe+lvra18lE8pQA uFyRjgnP+f0roZpri8KThziNt+xAMAAdMY//AFfpSjpqVLexTmvbxBBbz7sSDLBMEsTwMnHP fngU2+v7q1QWqLsBBZ3UA7s/hk/oKjha71G6N0RI5iO5gz5I9fr/AJxUET6jqM6zMZUwfnR2 yR7+/H4fWt7ak7aEkWpXMFtBbDaolJ3PgEsM8Dpk/h6da14bpZrcWUkCpLt3K7dxnoMfyFY1 it9qN6HzI7LkkkkjrwB7D8BxWmrXF5PvUvJODt+b7qgeg/w496hq2gnoTv5YGzexmPVXGMY9 cf54pk6JbgBHDMxBdFOMen0/WoLLU0Z3TUYCjk7Ts4DD0PapLhIEmkKfuIiuCGJOPoRz+QpJ W1YzP1K0kgmSN2Ply/ODuyykfieoz/8AWrC1tba3vI41DM0jBWJ4wMfU/ma2BayagZihyqv8 rMQMenX8vWsy4EbW8sU8JW5U4C54J7EfX86ad9CkV7bzYZzb2srfvCRIEPTp7/1/wrekElpC lu0almXO51zz6f8A1/esXw+hSL7UGRJgWCiTIZmGePbp7VqWV3cxJJdTAuhOSGG5WY89fw9f wrRb6kNFaOO3hsi0km2aJiW+b7rdOefWr0txPb26/Ij+YBtZj14qCWUzXZkmASMRYYqNu4Z6 YGB+VaUrwSWwnikjwgIUHkEY7d8ik7qRW6OavGsbWF3lnYXITCRqnyg9v1/HiktLe/WNpUQF ZE5RMMR7ntnrxWrDpkcry310gt485G5Dj8PWo9T1tLeBLSzAQZG+Zxywxzx2HNN+RK0RyC+G p5ZzJdTkKX5iXGcZ78100dxp1j+42yQSY6omSR0znOazZrg2Lqto4keT5naIbDn8v14qWKAX cj/2hIIj1DjLlv1rVRS+IbmXz4gbTyRbL5y98pv/AJg+gpsUkmqFpTOLV/7sj4z7CobRjp0k 0dogdT82TGCCD06g/TrmkhszfySzAxxM2Pkd9uD37/pVcqMpMsW2sPayGF4hJt+Uu+7II7jF TWwunjllj3yRsSS2Plx+I49Krw3n2dSBbxzxJkO7ryPdT27/AKVCY7lVE6bjEfugehHp360n BMFKwn2m3juRMYm82MYG0hoz35Gc+naqjapA92y3paJ84GVLfjxV9FshbMvmMz4yIyCw98Hp WVcXQmQi5iheMjC7hgoe2DmsuTlehfNc1rCbyRJ5WDbg4DHoxPp+NNuLKaCKSeacxZQqHA4A PHp/WmBrwW1tZvsjgbhJCAuTnkZ45/GmzC1hD24kcMpxhcsQf8+9UpGbjqVtEhi/tC32gTnJ HzDiuo1bU4tFuV2P5s7j/VpyI/qepPtWDbtF4bs5HlVnvJSdrKfuZ7Y71X0F96tJLaMxkYlX bcTn1/zkdKlRbLkbsNzkG9lVpGbOQ+Bt9qypdYl1DUUFnbD/AH2G4fqOavrPNHaXUMqgO3QI Mc1N4f0u6gjYPcfZ45FwSB37cD/CtUraGfqLK2oyQKuQgj++yIBke+BxSyLf3EIUzqFzwMgE /T9OKr6nrekaLJsad7qcA7fLbHtWNLrEep3CoqskKLuKoeRnsTR6Ba5HeNLc3jl5i6x/eJYZ B6VqWKTW0aTKzMWOUdDxxxjjvx9frXORCGSWdBJhQcKxH511VhYo2mRgSh1hBYIRyB7ZpXRb Wli1dzzWzNNP5m9yGjbPftj9eaeZri21CR9m0OQ+3A2k46H39vQ8VCBLPZhg3yRschD+WfT/ AB9KliF1NBbSIWRVyg75A9c849u3vVpW3M3sSxyldXLvCqRvwSTyB+vc8frSm6SOG5eRGVwc KDj5h6ADpUGoz3csULcKYxlpNo69sgYycfniiW4gebbOuc4UsgyASBniolpsUh7wRz2onjfL xqrNggfKa5LVJoH1KfaEVztII4xx3rpHiS682LzB5Y+UDP3jnpmvNPGVxPo+uXgjUuBGG2nj bx0/lXPU2OmmdP8AD+J7rUNQLnC7uWz93866a4M9yGQNMFHAG7K+vSuH+DrXEmn3cshMk1xL lUbOVwMAj8zXaXQlgP2dSyGQksuSdv49+taU7WRjLc5PxHNuBMi/LnAC0y13Xts8wYQR9B5r 7cD/APX7VP4itxHJDHKMhB8w9fas6wTe8kaHaq8hWO3HHPp2NTURcUmV1k3altmdSAcKy969 Bt7yZrWMuXkAAMjcHHbpzXnFoqtfOjME2nav49ea72ymne3ijZtwIAAbp6cVlFGczaupoiqt DIzs2BwAMVEqSrKk07sUAIG453EntyaZPMkSk27M8gH3cHHOOmTz3qvNPdXzx+c7SJnPXHH5 /pW9jJIzvH1rLeeEtWjto3LtbsSjBSWA5IFfJezZKQSSM85r7QnnVlVEWR2ZSoBBA5/E5718 c6mjQ6peKwAYTOpwMDIY8V9Rks9JRPn81h8MilIcMO5zUbMPmJzjNK+AwJ+6DnPrTGYFS2MA 819Uj5mSK0rhecZr58/aoOf+EYOP+fr/ANo19DSnjOepz9a+ev2qOnhfjr9qP/oqscT/AAX/ AF1OnAK2Jj8/yZ9gdGGOQMcZoU5l5BINR8le3Hb2qaMHIBHGK7b9zyYq+xZVstkjPFXfDqCT X7BJE81TcRkx5xuG4cVUTBiGTjjqK6D4ZW6XXj/Ro5EEiNcL8pPpzXPXly05PsjuoRvUivM+ uVCW3lo6EKRwMjjinJKF+RmOWB2mhQLdhE6HHPTHFKQMMP4wOK/MG23c+/Ww5WcQsg+aUYwD 3olcFw0koVxxzjn9KiDfKWXBlOBzR9m8yWR5GAOMdcf1qW0jRGJqFzdAS+Ww8s5UqxGcep5r xz4iRiy0+cs25ldQDnq2RXtN9cB7OZRDkFTsZc/hn8a8S+Iyk6Xc7/mwwYBu5yK5Zq+x1U9T rPAV9NZaUz7URGwEkKcj1PQ9cfX866Jp72GzZl8xY52424OMev49vz71yPgu7ub7TbW0hk8h Ik5RR97J6/5PpXcGS8vbk2/mMmwbQFxg4Pp279PxqlfoOW5SuLW+tbeFd7vGzFySec9vb15/ nUVzBNY2TLcTssc5DbA2D+Xpx+NWjb3l/cSo8pchvk+bt27/AP6qy20uW6u543ALjOJmIIwO M+nT16VrfqIc9tcxWiCPeEZgWAPOM8HH4d6tx21zY2odGYLJgBWfJx39+apxW5vbp4VkRum1 s4wB1PJ6e5p6RG5upIkdHbOQ5bjaOO/b35xTt0BO5buYJI7RCSEeTueeOfz5rNmv7sGKzeNU 3A4mIzkei84FWfsbSXLJE6zA42BWHIxjr3/E1VWxfUbh0LDeGGxlbhcfz/Soa0LTHMklvLDD G+1y3MbcEj+hqDUre5SUJEqll5IDAkn09uPU8VZsJInv5JJZPKmiXYwXD7+w246j9KiaMMtx LLP8ik7CAQ/PIH5/QcUlq9BO6Zl3LrHIj2sLxMrgsrjqe/y9D+Va9sP7XMUVu20oPni3fdJ7 4/8ArfjWdb6fqEuLqzZZD0EUmPvdQQO/61eljfRwz3xafUJOSpO0Yx0fAz+HFVZlbaEMml6j c6h5SMggVhuK4AHuW9fbmtCNLSwtf3EZeUMf3rNxn6d/xrP0qWTUZnSPZBFHyEjYKi/qBUsu sGwLWskKyherbyD+HIqkm9SL8o/UrSSaJ7qWQEbd+EIyPw/Kuc1LUftcCwJbiLzGGXVssB6n k/0q1Ha3F5K0sM6DOdpJAIGenUZqk2qOZDb+XG5PG4/ePbI54/KuiKsTzE0VjHp22Szud8wP QLjvyc4H9auRzLd3Sm8Z87cBs7mOT/nms23Qne8DqZkHCquPzOP8avxy+a3l3cxkK8qzLwPw p+pDWpdj36dPtjKyxMASzRg7vbBph083cks6OqqTwhcArjsBkD06UxpZdKDeSySgj+JPl/I4 x3qdbG4mWWaLJUEcKQQvtRZvYi+o2HyWtm823MpUcyk8Z+hH9RUMUc8aFhMxZ/4QeO4HGcEY J7VYFzC1jtk2+ec5PygNz3H5VC1xeCDyzK+fulCeB+GfSmtNBFK7hhjhYo3zd0PU/if6Ux9U eSHy/IRZeCjZYjr0Izj8qLxIoYzIJA20j7nDHnvxVS7nlvHQQwbJBnaVOflx71LWthonheVZ EEhZYWxu3/T6+/oKvLdQaTiYBJSfmjZHyGPqT0/Ose1NxJdmK9lLRryrSNxn35OO9a1hHE10 YZxuGPlZVLAfrn8jWLV3c0T0K19cS33lzJbiPkklue3X/Oa0bSOe+tY2+aJlPIjwob34+vtU LpPHdEW8sZtgMYZeBn860tKtrGKbdPdrJMhwQg4X2GaL67CsWRZPqFtHJJKQkRCOVbLY7dc9 fxrK8YeKYLCwa0hYvduCNqjgDoCcGqviLxbbaRE9tZriWTIUD+ZrltE0ie4vp7u5kDyMCDk5 O4+n04pp62QkurLdno7m0hnZQxbq5BBPFaNxNZ2OmYSLZd5KYU8bTg8/5I4qD7RetLIIg0oU bWDfw8daratO77IZUBdFAZtu0g9/61o9EkC3LWkpavdokqlo5QAWH8OevfmuhtIYLy4khS4C xECMBsgZ6cnv2H+Nc5ocazSb3tyUVRz0zj09e9bs0sBZPLdoVYhigXLZ+o/nj601uD1L0FjF HdPbrMqsV2lQ3U5/+t7Z9qfayzR29ykbN94MwQkkds/y5/OqflRR3kDRyhTI4ycYPuPxxj0P XrV63s0g1P8AckOZASHQ9c+nvT3VhNdCNpriSx8skOhcEOxHQjnn34GOlV5pEvLiJtrIQSXB 4zg/5PPTmpt8to8sRUyKwJ8tuST6g/57g1LYSxRWDebEFwN4lVsgH0/yah9you2qFvAqW0Yi ICMMjJ5Xtg14V8WPE66fr81uZAZ5o1ZWY84PpXtzvC9qzDO6JSwVhjjr06f/AK6+Wfi1ctd+ MRPIBNGirhR6dcZ/GuOu+VXOqnG2p9A+BLM2fh+0dG/eBA5YnuetdSsIjC3SBUC+hzk/59qh 8HyWer+HYJgypFNErDy+RjaP/wBVW30RZYX+ZSoPBJxnvXRHZJHPLU43xUdzpI5PzuOpz8ve sa7dXCSQKySD16Ef/qxVjxVdzTXCRoTgdMdAO9Ur64iksSYonjfABctn8OBxUztYtaIbpqLP M0eQCfukng+td7pkskVogISRANqjbjPXv19a4TQIluLd02gSRHO71Brt7CZ4bdUJjKgkHgbu n14rKF9zKRsm2tRbBlmVihzsA5A/KmS3srwnZgRAcDGM9/TNRW9oktvt3IWxnaSNx/D2pXln MHlwlMN0TA3Z7cmtUiLWRbFzFHErK/mSjDBNuMfjjn9a+V/ipbCy8e6yhi8kmcyMo9WAYn8S c19QLatHbGZ5VZQNxA++Pwx/WvnL46Sq/jeZ1iETPDG5bOQ2R1/T9K97KJWruN+h5WZRTonn Uj/NgHjvTZHwOPTFIz/NgcUzkgHPHrX2i8z46Y1nDkjPAr57/an6+GOc/wDH1/7Sr355Cd31 6mvn/wDalOf+EYz/ANPX/tKssT/CZvl7/wBpj8/yZ9fhslTxkcEA1KjAOfmxjnFU1bPy989K mjIz3z19q7rWPKjoaAyIwScf/rrtvgtbxy/EPTlZC+N+GB+6dpwa4VSCigncTzXo/wAA4vtX jwqVywt3ZQDjBGOeledjW/YTt2PUwetaHqfTUW2IvGQS46e1NJO1ixXzRwAOtAjAMmARJ04P FV8tszvDTKMf/X7V+cStfQ+7SJ13QsX4YluVpskJk8ydztQ9O+P0pslyIGjLDzN55A5pk+fI O/8A1bc8cjFTLuUjL1W4t47MiJVErfdU7eR3I6V5T8QoGOk3UrOGwu8Bup+lema3OtraoISS Dxl1PHH45rznx4k1/pztKV2iIjaMKTkHn9K5pJ6I6YkHw+1G7m09ZoSQyKcBFGccZOa7y3gm NjNcRs3zLg7sjOe3J+v9a87+F19I+hxxxs6q5y23jnnH1/8Ar13xsbgfZ4JMiNxkljzk55x1 weuM1UGuW6Lk7Cmwm+xNJE4XeCE3kZY9x1/+tUL2JgtXuTMkMrjasZYNx3z68fh0qeeNBqC2 6usibdhBP3WHv0NQXNglzdi2SZWjxsOOh6+vXn8Paui+hn1K7QwJbPcPOEmYEIA2dw7nj69T +VSNZKlkbkzLGWXbhcsScc5/D19qTUNOS3voY/MRioCkK3AI7g9vrUcpsLZ4oUu8opKkbSMn 2J/LJznFDlfcdx8Age0B89FkKlVHIx7/AE9zQYY4rYySzhGwVAHAbjv+XeqtxcWUN6kccrOY gWYoPlOQPr+dUmli1i5bBigUMFDyNgsfpj+dZrV2NboTUb22iih2/JdjlGQZ/P2pbzUb2GKK eeOMWysHIjZWdh9Knti0jSQmGNkHyu/lDcevfGf1pW0ZRH50ckCIqHKZ+Y85xitVFJ67kudy k3i+W+dILW0mtuNkbGXdv7BicDHHbtVK6hvLVkNyxKA5Cbsk++avTXUcMbKIfJ5IUq5PIHp6 9am0bQibo30rb4UYMVOPnJrVxS2MnIsWkLmKNEh8qXAYgngj0Bz1pkt09jcNFLbfaWcZIBIA 59jWlqY/tG6jgiQIQu8Rg53Z+o+n51T8x9DaV79GkwoWGJjzx9B79x2qtE7om/c51rQXXmyK 8cALEBXYKc+gqGxumhlkXyA+0FfMY5P4VHdq+r3U85YQQOQcM2Aoz9R+tW7aX+z4xFGglC9X PUk88fQj3qXoJk2nwiC382KdfPOW24+b27f1q1BJLdPF9rYInXc44X2PHP61RtbAEAvcLEWJ wrDn+X+HWtHMj22Lht0ZI5IwBj3xzSGidJxYZCbLmJgcbcgY544wamtBNfeZIpIjB+Vc/d9e 1QxsLQjaFukkz/F8oqYPIGeW3JERIARV4zjnP50XsxEKajbTQvD5LxnOVlaTkn/dxSXd1dlU jlZvLfg7geMd8gf1q2IrUWxKBvOPVMHBPHvVKXUbi+HksoKPjBCgFc++KrS9xFa6gTTVDMyS oGwVU5P41RNwJrrMduYpecnJOV7dauapbRaWY2eQNjOdrZ7dOv8AhWXFNPezEwqYiB8znGR/ Kk7MZcii+3yHfIkezpJI3X8SamUmx81GYOSAQynIx+NV7e3a6LyTPH5mcDcwGf1FSxPF9lki ZD5oJwy/dI7DrzUoaRPNqyrHHEISkq/dZyMfT0/KoZYLgxL5cv2d25JCgBv0/rSX7GZrQrbK lwBlipzkdM1Ddy3lxKE3gNEMjCgEg9ugz+tS0nqOL6GefD8f2gy3c7NMX+bIOT7qR2rSvxDF axOkiKh4Gev19+lNtYdm6G4JiXk/Pn5SeD/nFQ3lsLm5VVIkVCMSLyG9/ahSS3KfkT6dFdwX fnoWYn5g2cBu/wCRFZF5dT3E8p2rgnJAHC9q3dXtRp+ngxSB5ZBgSM/TqMCs/Q7BxfRGSQKD yXDdQf5VTabJNzSZ44dHa3ZDIyqMMQRyf51ZiuLeayfeuyWPDLsPUe/+Oagbz9Ku1jCtIzZJ SQgqAfr9aZBdPZXTyTxqwaTDbgQSMe349OnpWq6WEWUSN7NiSyvGAfmGeD9KvB42jtLlG3bh tyeCp61DZfZ5LqYIkgjdCvJ4BznpTBElwkjiRmaHJ2MMEnOCR2/z0qFuJsdcTy22oNLcMdxc HLDhh6YxyCPz7cileaKK7YvbbolO0KHOcH0/PrVbUnu1igVjIsQ3BUUZweo7cdeg9KfNJ9vs 4jLCMq23eH2nt39+BnoabvuNb6kOriKHzYRKDEVJxt9e3t7/AKYr5n+INrt1C5JGX37cV9Ha qkcqFlJjdAFZM5yO1fPHjlhd+Lbi0iBZjIoUAckkCuCur6HXT0R6j+zhrkkml32nzkiKxZWU 9cq+ePwwfzr0jVtTi3NBASsfX5iB+ozXL/CnwFJ4M0GeW6fdcXWHcgcIMcAfTNW/FNxbxwPs Yu54Zj0rognFJdjnbTZhX8pn1GSNcYXjI71DqNyi2ZjWBQqZDP3ziq1puuLjMStuPO1TyQKW +kEVnMsgYueCB0HtWTd2aW0sO8ONtkyqkBRlgT1Feh2d1DBaFTGJc9G5yfoOn51wfhy2jnt1 XaxdR+nrXZaPKkFs8UkbOSSN393j2HNFNaaGM99DTtbVljkm+UIMHr8x/DP9KamoySQmGGL5 D96QZzjp1/Glj043kRnjhZlXgNkgA/lxT4mhtYikqPvJ6k/KDn06/rWjViGStYPPbFw+1e5H fnPc+1eA/tEwImv2MyIyl7RQSe+1iK97ltJUQzR4IfjeWz2+leKftIRxNb6LcJlZhvidcjkc HNetlcrYleZ5+PV6DPECcydwAccUPIqgKOQDmoBLtc8Y9BTJG3EelfexPiJbg/zZGOBXgP7U eM+GsD/n6/8AaVe9SNyeeD2rwP8AahOT4a6Z/wBJ/wDaVc+J/hSNsB/vUPn+TPrgAlgTnNSK /GOaijY7S3OakUY4HUnOa9B6nmxeqL0bbgowOnevWf2c7WKXxZdTEkyR2pKgEjqRxXkithPQ 4r2P9m63Vr/WZPnEqRJhh0wT/jXlZhLlw0j2cDG9eJ76LuKWUpEW80H5h2olm8uRguDJxkHg moUlaBN0Q82bODxwKlSQSymbA8wD5h0z+Ffnibvufbjv3aFQwyWyRj1qsCXTy5m2qehYcCpP kh3KQ28jIIFO2yThBLL84HR+Bmoew0cl4ouo0m+ywou4YYsQAv8ASuN8S239pGRmAELIRhRg DHB/rXZatfxtqQSOA3KgkHBPWuZ1yyntrSW8vT5IXgA8fL7cVjI6IWPNvhjNJfKlrbMwHPls D6E/4V7Db2E91dTeZKI0TLFywHTof8814Z8F7xrq9uDa52xPIPlPQc4/pXt9pbTR6bJcF1hd sDDMFJHcevbtUUbuNzWpuGn2JDT/AGiVdqDmTOST2459fwotZrezLNPMXkz8m0bi3Hb/ADgV YurZJbG3Hn7PMOVRVz34wP6e2TVwabmKFbhSgxuYuMvn+n1NbtvoZblGxWDU5WjnaRpQdwRE +due/p+NWpdMttLtyssUYZiSqsMhPYn/AD0rStpYoIyYmjRXPdgWI/r+Vc/qGpS6jK6TRhIu UAC4bOM5zSV9hX1sYOr3UqJstJEKTsdyoMYI9TgetRafZrbyDzytv8vyjy2O71OMZqzc39nZ tKYijvF6LySfw/xoivDfsjzsiADCkpjAHboK3i7IL3NHT5/sBkZQJIWG4v5XXj8SKjMKzq7R zRKHy+GYhhx0Az1qazm22sjQbLiA/fVo88duMc1BHbpdsWVkhd26SNsA+n6/lVJ3I6lG8u0u FVPsqIeFDs53+vr7dK3YNOlsreIJKjAqGkQNhm+oycenSs+zufIvChRC6jDyZzzjtk1rRQva wi6LxtEq7mYYB9eRn8OlU3qJvoZ99NFLPHsjMEirlgcksPQcCue1YyJMs1yCwxtiickEfpVj VdabVpglugjZjtzjG78ccVAdM+wwrJcjMSHcqvk5PtQnrqLoUzE2pXKr5QijVTlC2Pxzx/k1 biuRp8exFilYDjecjr9ahubkXYijt4jb5bt3+nTFRMDpsYIWOYk4A3ZA+uD/AFpaXKui9ZQr ctK0kgtiTyGY8+mKstPLNbSQSRjyFygKgA44wc/0qK1Z9QlaSQRwrtwct8vP41bSb7MkkDRi ROvmd+fSk9dRXsSogsZo5Hb7RER91Wzk4/H+VLFK6PI0AeOH72xR/PpSQx/ZxGxxNG5HyBuR 9etWfMuILn9wCtuRyv8AjS3YNkawr9lZhLtYclccj9MfrUNzqMtzaukaRhmPyyKAD055zmny yWl4jfZpdrqQzLtI3fQ9+1VZbg3o+zxRrG7cBkPHTvzxVpCRiXcTmRBKpAxk85/HNPM/2edh ZllG0bjxnPp0qW8iGmnypUO0fdycZOe3FUmunSfbCRsGHJK5z7VO+g79ixZ20l3K0zlA7ZJU tj9OKsxz2lxbiBtzTY4YcA/hnNUbOF5YjLwpOW2k9BzWjG9tNEiwbxPgEc4UkEenf8KmQD5p 7gxJNEojdchmUZPHas42VzqTNM3zE/KwPU+h/wAir1zdXNvbyTI23H31UZ571RjjukHnq5Ct 8wYD7p9//wBdVHYNhEszJId86rJnZtfuOP8A69ammSW6B1liL9mKtjjj2wfpWWLOMRNIksW4 DL+ufX6Vft7i2aDAVxOAMEYAft9aGk1ctOxX1ayikczRRbEJHyl+o9R/9artusFrYySR5Ezf KVccqB396zL7UppXSDyQshb5cfw/5+lb1haxTo0czIh243bgCT6HsfrWabTKa5kQzaeHh+2h 1l+QK2HwQcen8vWkY3k8McnQRjaGk+bjtkn/ADxUE9gJC1tLM0aFgI8crnjBJHY/1ogi+z3T LHOobbsbEn9Py/8ArVu5K2pmlY1GfbDaTFcyr/rGB2hvf+VWkggkncI5iU9Rjjn1PpUNpbyQ LNZMSwCh/mUHHrz+HSllnXEOD5TNhSMZGQeDUx1FrcFE9ul5DDh4SmGU8gn0/wDr9ahTUTBa G1mWOYMuflGCp/zn2qrf2UljqX2iGR0DYZfLb7x9sd/5VIJpYruSSQLGzjePlBA7YxVW8wKN 1KiWrpKnlyPli24k/SuI+Enhux1nxb4g1u5USy27iOBWHQkHcfrgcfU11+tX8c8zyLDiEjhc 8e5Fc98HdStk03xMEl8xxqOVwOCNox/WuVq81c6V8J6DretqsUNp5QVccGPqDj61wetzrGQi tvIOG5rX1nWnmkQSQo8jY2tGxOOO/bpXMXki/awAQRnkH171s9IkJajrZnZwYkBZs5BPaqeu PLZptkBAfhckZFW43KuEXKuc/MOi89Kytejltli3rkM3yr1x6muN7GtzrPDNslzASivuRcN7 g9K6uwhSCN1mhEhJ+/kf4Vy/hwDYXhLAoo3L/e9DXV6fewmF4Z1ImJ/hIrWOhyy3JYoblVec SMBlsKOlX4Z7WS2cM7GQ5OMcZ9+ev4VRkmdVLRqVV85CtkEdPWpIbq3h6MQ6tgqORwfWq1Jb LUSzvnL/ACY4THymvI/2ktN87wzpt3GMSQ3DLIGBztK9Qc8/dFevC4u5YTGjME7oDwf0rzH9 oOyW58DqwlUSQ3CsF7jgjH616OBdsRBs5MV71CS8j5fWT5zgZAODzS78krnj1pqjAboRTSzA gAZ96/QVqj4KWm4jYPUe9eEftQ/8yz/28/8AtKvd8t5mfyxXg/7UH3vDX/bz/wC0qxxP8F/L 8zpwH+9R+f5M+twQDgA09WBP3R6ZpiDnPUYPFOH3hgYr0HseYkWxIXjxj9K9z/Zst8w6xNuI b5FGDgYrwcseVz26CvdP2acvBq4QuCChYDoRg/rxXiZn/u0kj28t/jo9u84xon2YhpA2SXBx jv16062JyZCvzEhSOn6VXDEFWhI8wHJQjipYGIG9xiQ8EDgV+fre7PtVsSvIkKSKOXxwKgcS yyeawA8tc9OMn6H+dTycpvVlaZMAqapaokot5ZN2A4Ax1AHf/PtVNrZAjChmtNt5eKm6WLkO cYBPHTrmuA127l1EtJJIwRzuwR1P/wBau5124NjpNvbWgMk0rbiG7D1xmuMv7SQZM7Et90I/ 0rnlsdMdzyH4O3j6f4u1+wChIZpPNyv8OGIx9OlfQcelz3DwKrBYWTfIHP3c4xx7/wCFfPHw 8tZLj4qXTwN5Fowl81c843Aj9c/nX07dyiOwi2LsyckDAOR0Of8A69c1JtKyOiaulcswNBpr KkKF5tpDPzkHvgdqrvemKfEsBJcHbvzg9+uM1mO0MmTDc/vcDGFIAJx26Zq9ZaebKDzZUaWL OcSHGea7I+ZzN9ghgjvbmVzIsKIvIdto79+/f9Kw9Snmt7iWC3BYRHl9m7P0OP8ACukmJldd sYixyATgD9awtRka1d0t0jeR/mJC7gP0rUi5zckcDRK8wCTAFiAp49Kizc3ZTzWYQH5iSOFq 3LdiKSU3MgUucYUbjjuaraddXN9cSCNy9sowU6LjPBNJabDudFp5+y25azlDs33ldOg+mOfy ps0cV9NLIdtvJ0IOVGcA8DirRMZh32uDKuB8yjntxyc0Q4uLvfcyAEADJGM+2AKCXuSafcwW gdbiONtvy+cSffpz0rK1JLi7hMccytABub5gC3Pp1rRuNVaN3QQxtb/3n7+uORWZFGrw+ZvT dI25dxAIHY4+nYetXF2RnzXdjOkuLYWRIhSOTHyyAkbfrmo57KYRGaXcYepBOVP6U+7v7VlO bYSPtCmTkcjnOKkis5bqITsGCFfvZA49MU72Qyjc3UbxLDHbCIseHUk5/SmQbNKcOpDuTtKA 5x9eaJ7qGOKTyrQA4AEgOc/hTVjOnzCcFJH6bQc5+oqXZMEaMROqlW/d2qKpJPRec89etW4Z GtyYSqzR7c+aO/0qnb3D3M0azeVEgDEkDav41oR3DxsscUcckbLndnt6DpVWsO5NbxtarDLn zYXP3QfmNWrqdraGQplEfnb1+tQxpHCibRvRjzjrUf2iZp5gH/0cLgDGT+dT1Arywi3i8xJI 3AwCFILfiBTZJVig2pEIpxk/fOTUxtXt1WVdjRngBec/rVK/na5+WG38p/7w5z+PaqvfURlX jNBhrh32gfKPeq8E+122gMgOcsM5FJfq0YAuGO1fu55NRwXCxsVRQ0Qzk/3qRXQsJA7DzcFT 656CtJTbqFa3fLqd21h9emayFtnWUTFmEedpbrgelaHmJHsltm80E4CkY/yKd0yixJPLJb3B T7rKBtX5sHPXmqH2WWAgTKdj4VnbgYz/APWq7EJbtrhAvlvKg+6e9QSW32UG2uHLANvBIz9a SF1Iri3jtZItkqPAzYC55J64NWZZYLaOOSCPJBwVJ4B9eD71QhhtxdOZXMiscqQfpzzVwMlr M/2dftQYD72cD+o/CqugM68vnub5JFQwtGATsHGe3errxXF1Es07rkjLBm5+uM1Su7qVdTmW INHHJgYHT/PFTNp6RbP34K5HAbJJ9MVCV2VextafqFmIXjdTNkZOQO3p0Of04qc6THMrTwfJ IF34bnt1P51jReRbtC1sJJChA8tuiD1GM/nWvHeyuA5UJtJJUdMH+dRNNK8S009DQlR7CaCW KQkyqFKjJBJ6k/jVKOU+aY5VJnUlkZR1zwRj17VqSORbRyxuxQnKEcFf8n+dZl3ObbVEmeMc jJXoT6gdulaxkZPRld4nvyJ4ZVcxAsYwcY/z+lMDXc1orZdFjbgkAkDPI/8ArVUllRtZ8oz+ RDjBYHGc1PEk1jMYEY7ypUvnKsMd/Xsfyq22D1Mq+vkksZAy75EYgvnjHvXA/BbU1kt/E2FE aG7E0a/XP/667TVbn7Ho900ifwOfl6hvWvNPg39pjk1dYyBGoyAeDuwa5Jte2ibq3Ken313P J0iSM9DKOtYcsmy+HlpvIxyRwatXE100aiZ2ZCSTuPA9hVNLjbd5iXk8fN+Vaz0QkyYEQwOz kiXt3ArI1iGRJYS5+VjnPYmtlFi8uR5yd7Nwp6f54rGvQ7zwEjIJ4I5HWuZ+6U+x2+gptHyE nI6Cuh09YmLiYmN1Odqrn8+RWH4dkdI99u+dyYIHUEGugtoVkluDNIsOGx3wcHqOK2hZ2ucs iybmRIGWEsi5xtzkGmS2EU1rIBIRIynjGecfpTLaeWItFANqJzyM5/SpbS0FxD5klyiTOSVV hgn6cfT86u2pKepNZXrxp5bAMuSMN97pnrXHfHXSBefDi+EHzPEyS4zyuG579MZrsIb5oodj RBkX5SzH5unWud+J9q+pfDrXHgy0/kE4XknHJH6GujDTtWg13MKy5qckfG7krlOhoAODzg+t AX945OeTz78UwnAwema/RVqj4Ge44vtcDqa8J/ahOT4a/wC3n/2lXubDDY6ntXhf7T+D/wAI ycYz9p/9pVjif4bOnAf7zD5/kz65VgynGfypITukIA57GgHHTr7d6FPluc/kRXoI85bk6sOh HJBWveP2bUUWWrOspRxIgc5wCuDjv65rwNH/AHqg8c9favoP9muDbpesOrEM0iqe2VxXjZpp h5M9rLVzV0z19riMbSh/eDsfun8al++DKVG5jjK9qgZViXfH8zg8pjmp8D5ZApBkOPoa+Cjo z7Ic0pt03nDsTyvc1Rm8thJJO7CEkfLk4qzMqLkkbgx5PTmqlwiEzeawjgTDAvyM+3+FTLV2 ZcTB8QagyyW5tXbBGPMKMCAPQYOK5HVd03m3E+d/QA8dK6uG9WO4n2+U6L0aQDac9MdPpXL+ J1a4aeUgom3Kr/d49BWck5RNk1seKeEW+wfEW3ky0cU8piwO5OSAfyFe/T6jfLeCFQfJU/Jk A7u3ucfl1r5p8drPpdvFf27lJLe4hnDDgYEi5/8AHSa+nLeO5tLZJE5eZFwGAO3gEnnOK56C S0ZrOTasLb6nbWhiszC29iGdt2AnPGPXNbEdo7wvPHI3XkkYyPTt/WsW18uO4eW9UrI5AUrw c9R1x7VoCK4u5SbZiV646bR69Oc/UV3aXOcs3B+32RjYeSwxjZyDx3/XtWRqaNpw3Qsk0zLg 8ZAHucVsPftbWckUsSgY2ll69PrWJeQCaJXVw8qqSEB+YAe1LTYjqc9I4luXlujsBTaCiEZ/ lUWl+dIJYYWJtQ2OBww9+9Ov5HllUyKFRAei1BFJL9pYWrSeScH5Mrk+4z/OpT7FHUWuoW0j HyDIZl/gY4QEe5P9KuTxNcQxfaNpCEHdjpis/TobRUCuXE4P3ScDP51pw3Mr2629xMxDc7CB gDPaq2IIY5BY52RrdxsN25v5DpWLNatfzvPFMsOWwEdwCDk5AORW1cN9ikP2XbMrruIcfKP1 Fc/LZrqd48jOE2nO0tgA+1VFqxFiDz44MI9us20Hc7cZJ/z+lQfZ725DSRSfJyRnAIqaa6Gn FoWCzksSSSSB6Y5+neqS6XJqTb0kUKMfI7AbT7U1oMQ3iQwNshVmXgyH1FMW2aFVuJJ0O0h9 oPzE9+Kf5q2imBkWVkOWc/yHNRmyWaHe8iRlugJ5/Ks0V1NBbltS2eYiRDP3lGDgdM1bt98E g+zlJkcZOOQP/r1mW2oedEsMiYQkDeFxtA9TWtEFsXjMZW4RwQWDcD/PSr6AXbeKKyVHcna5 J45xVeDczvGTuhzuDkdj3pzutsqNLuET5ZSB0z6U+MbIpAV3xy8AnqKS7DG3U1tbRhYZEmiB wdjdTVC8njmixCjxv35z9KtXVrHZSRtIu9OhGc5JxiqGpNELMyWyujZ+YcA4/CtJKxJi3aGa fNxM3BC/Nk/nTYpVt0dVjWVAMA+9JcbriVpJ5QrngbuhpkM42YEeARhGHXNL0LWpet4jFgyA qjn5yfunFWFkiiZHgcSAAjbzWescom/fsdjHLEnIJ9quARWlwrRMJxIPQjH6VDdtyo7lsqxu I3w0cfAZQf8A9VLJZi5uCJZBJIflG484+tMMjB3b5lt5BwmOM/5FR6XCWhuHkk2svzK+c5X6 04ie4ls9jA8kMjsr5Pzn5gP14qOO/lLsFjQ2y5GWXJI6celQS+RcQHy2LMOcEcmp5by3SARL biOQgbWGeT7j8qu2ginH5k10UGUjYdT2Har5ihgux5rO4ZchU6D0OapLFJLchZXGFAbk4Hp1 qwqw2lyyyF3AOAVI+UetSmXvqXoZEinZ7Z2lwuN03PHpinTJc3JEnCIo5VOAcc5Az+lVIbua 2d/syr5XBDdc1J9lmBS6cvIm8MepKrjnPX+lRJuw0b9hfJGvksnmw5yrZwADzirF5bTBTuQP Cp5805KD0B64/lWVEIws0abmYNlWA4I9KtWV5PcMIXb951UABSR6Vmt7gnd6mVrCwywl1OyU kA9wR2NVpoPstrHMGEvyhS6t39P1rpL3T7ZYyrIY5ZOCeoBH0rFuraVreaJP9XuXAU7vfIro Uk0TaxzPi2/ln0y8laEIGjCjK4znr/OuH+GNqZdU1l0lKbNm0A85w1dx4l82bQHVhvjaUKHI xkelcb8ObWODV9YkkfYfMWPHoNprkqK9SLXQ2j8J1V3C9umZ3MjHohOarxu32kuv7tyM4XkA UXny3JER87HANLayvb3DYOZGGdwOCK1krq4kaUMkMQbzYhNI3YnGPfisK72tqYkjLbM4UEdD W7bzxTO0txlfXbjn86y1tkuNXKRn90oJXA9B0/OsWuoM6jSE8u4VonVxInPpn8q6G3AvXYGZ YztG7ewVc/jWJpKiS3iZQoePgjGOueDW3ZLHO/lnCyAdOg9a2ikjmbJzKLKXy42jZu5YZ/Kl 0+zefMks6oCflLNjB9B0qC7A0+UlEErHkhySPzFJHbnU2ZjhdvRS2AMe5I/yKdrdSdkXVuEi YxOgZEz8zE7sn+fWsnXrKW88Nam0TgSPbyCM46EqcVo5VEdHTzdpXcUPI79e9Nu4W/sidYpW QNEygA4BOOM/pWlJ2mmyJK6sfEErE3cpYEYYjHvUGdw54AOeamv9yX1wr4yZDk++agfbyP8A Jr9Ig7o+Aqr32K7bTnOe1eF/tOHP/CNf9vP/ALSr28kq554rw79pr/mW+c/8fP8A7SrPE/wm dGB/3qPz/Jn1yhwODk+1KxPmZI/H1NRoxVeePUUMSXJwRj17V6S0PNi72JiyhxkZPXkd6+if 2cozBoWrzq0iE3Cq23oRtzXzjuLOG4G09zzX0p+z950Xgu5ljP8ArLpgVA+9hVrw82fLhnY9 3K/41j1OOQR4dD53zDKE4Iz+FOZ3jV3ONzH5VPQU0EQIuwLLuOHQdAafnajMOQDlF6Yr4NJr c+xH+RHEcMT+8YMCozzVa9s3vI/K3KiBuS3Ge/qKuJHlSzH5iMqD2qjfRz3sSrtVZQfudj/O k77jiYEQSzubgJAky7gCQGz+Y4rivGqSJZSSElWkDEH2zyK9Et4ILEyRspklAJYjt2HbmvMv Gt99oDKx2xoWwF4GCazktLGyR5F8RNMbUPBmpohKSfZn2OOx2k5r3LwDdtc+B/DuoyPvkmtI nZC24tlR1ryfxcI7XwPrVxOW2Jau3ynnG05Arb/Zf1Ntd+B3hu6L5uEV4SWOTlXIweenHHtU RRTetj1yeeK4uN9yOB0aMbAv4ce1X7SKOWdTCr7T/DkZJx1OM1Te7WTa1yjG3Qg/IAuD+Qqa 3votXlBghEbA7Nu/duGM/wCfpW72Mn2Jpbp43ljmiSQjlt+eevHWuZvWg2ySACNmdv4sEH0r cv5/sLSrcRecfcspA9OMVyeqTpczMwKQRhtqoeMcfrVaWFsZkupvIwjfZHF3O3HTvmrVs5uZ vLsxIV2gsY+CDn2PTpWaN12BEvyRE7STxxV6zuGgljgsJHWVjtZicZx2FZg9dTrtN8qyDRXR kEoOWYYOP1q20kqxsxHm2/RcdMf41Ug2Qhftauzsvy5JXH1z9KjnmnjR44C3kYwuTkUmiGTT 36eUTbMpcAbUZKwpd87ss2y35OBjhj09atPc2sdu6QzMtyg4LjPP51myXMt6RHLI0qEf6xuo H5dBWisTcqTXBsXAiVJt+DnOVHqe3pTlmGoO8jFI9oxjO1R7gk/5zTnhjsn3wSLcc4ZT1H6C qsrjUpArKLfYCcLlVz6mne71GJd3a2M4WJFnYgEs3I/nTLfy5wz3DCIk4AYn9BSs4sZMxokx b+I/MBimSL9skeS42QA4Cnsf0qWuqGOsbpkd4QoeADH3evXJ6V0ChLHyjAqzK3DAnketYVtd SWP7uJN8SkgkD72fQ1u24igWOdGDjoYyemfWmloMldYw8Tu7GI/wjmpCHe3ePapQn5HHUVWg hCOsrNmGVjz6UskzLHLExEah9qsBz60JdhX0GPH9mlCToywkg5xgk9qo64++1Z7cPg4GW61f jH2QoXkMkDPkYYEZ/wAao+ILxvsq/Z8BSw5PUYq27aIFYwGga7+aVtrns1OlkQBYo4scYU+9 EDGR5jKwDH5ic4P4UXDiSVRGhBzhWB9qTdihYU/0hRPIwTqMjOPpVyW4htgjKnnA4+bGMD/G qAiWCYtNIy8AKTk4q5LIkNoQVEyKwO5Tx+VZyehUdy2YWmiCMWETkFRngCpCFtvPhk2+XtGN pzkenWoYJJXto0cjym5Hb6VNbCJL7yJYxh1IUjBOOuataLUNylNLbxSQtChdwPu4xg+lKLpr iRWhhjSeNcHGT/Oq93cw2N2Vh/foerNx+FRi8lyZrKBolPcHB/OtE9CWTFJJ5T9plCMvAL9/ xpscluhdZdzZY/vB09utVxHLeCSW6nUOVzt7ilE8C2oRRh9vB/vmoRa1Rq2uoeRBt8obWP8A EMnnuD+NWVs5Y5oXkMhicEHcPlIzTbPUJZIo08mMlgqqAvI/Grz2syMouGZAy5UN0JFTNagi A3KrGIVyJVJA9/Sp2he4KrKclRn0yKhZTiOSMAyRNkjqRjvU00M2pRCWMsrIP4Bjn3xTsifI kfLYd5VVm9WwePrUM+pwhEhjiZmU5EgJG09OPbk1TFkZ45pJJFjlUEmNyASfaqltcwWwxsdX BBXcBh/X8c0Ndi0+hB4qtLiHTIUZ8wl/vHiuP8NQ20XiXW90mw+ZHtHYAIf6n9K6jxLqM91Z RRzOwDNhUf8ApXJeHJLU+J9dSQFXCofqNrY/rWUt0XF6M1Jt5A2FVhLHLY5IqMAPOPKyj9FI PNJdzSqiIcpDngetPtwC4kGFc/dXNDY0XLWTZI8V4SpHIJOCaTS1/wCJ3I8I3xqNw3d+Oajj 3w3rtPGzAr0bj8a0tEgja4eQ5CZOM9qzWujM5I0dLmaI+YoH+syV6559K6KTbfupWLy5sfdA Pzdu4rmdNRlndwu4b/mCjiujuA0gHlp5bjHOecVa2MGriOZLKciaHDEbVjf6Z6Y9P5UsUkl/ NII0CLjHl565/D69qjZXZt86khRgBun4f571NG3m7Yo4dgA6AZyfy5q22hFq3lRN6XSneMAF eOM9+lNWSYNJ5BZYjwQOQfrSW6lHkjnVvMCkDbgkcjilZ5Y2AjOxVGfmG4N0zntVRve4n3R8 V+L3WTxBqA8oRSLcSB1XgKQxBFY5IY+mK6j4sMp8f67iNYWF3IrBRgFgxyR9etck7cjng1+i UHeET4LEpqpL1HyHPA45rw79pjI/4RvP/Tz/AO0q9uztJI6CvEP2l2yPDfr/AKT/AO0qrEfw n/XU1wP+8x+f5M+t4l3FWY4IpZdoGQST1qNGzjuPeiUKQC3Xrn0r00eZF6IUSAPnG737V9Zf A61aH4d2Mkce1ZC5IxnPP3vyr5Libc5H4DFfZPwwt1XwDo/kkpE0A3AtxnvXzedu1FLzPo8o jeo5X6HR2sLaeEDETK+dxRen1xTLdnCuXJZScop6GnTyrbyxQKgmQrnIOce9SxgxxhnJJU7g qnj6V8ZG7ep9aWD8mV3AnGQO+Kpyxm8Kny2DY5UZ/wAKssBkzucSIuML3FQ3E8ssBdI9j4wV XPPpVy1XkSjJuBbQO6Sq0rAfMV/h44ryLxVcrelihCxrwMdDXqOpXCRq0cjA3LD5nUA59ieM V5r4ptfLQIx++Rn+lc029kbx3OM+JiW8Hwq12W7Z1gW1feyYzyNvH4kVg/sMa3DqPwxutMjJ +02N2/mKx+9vJYFfw4/Cuk+Lsat8GvEXnZ+zJatxjOfT9cV5H/wT/u431HxPZl/KlxFKHDY3 DDAj9P1qopezujOT/eWPsYtJfRBJSot9uCFTaB+OMn86mfyJXVbWXa+OR0Y/Tqcc01rmaeyM L26iED5gRz+YHNRxyW7MIbFmkn/6aEdO+OT6egoduULJMjvnksH3zReacHAkBGOOpxg//qrk 9UlW9uPNlxErN3PHPpXV6sk9pbjzE81OiowPH5DpXKzRx3k5klaOIKM46KP580t0LcpnzWjZ ICBH93gdR61Lawh5I1hDCTdhWb9fpVe4kleV4YJfLiXI+To2f51e0wxzIqRkiTIUSnoDRZ9R bI661hksUi+1B3gkG1Sn3h754pLuSaKWX7OrNb9gfu9PrT2DWCRiVyUyMRjGTn14qC/+0mJk ikZID1IJBH1ORxRoLczX+zCJgwIk5IXtn0PNUryWaUGIp8jdTj+oHStVzEVdLg5lPVUxx7nn isbzrg+bEznyiSoU9x+FFhWKMwjgdZYpt0ittChT/h0oBM7LHIiqAfmdU2g/WpriGKGNpI5B LKoG1FGMn64qu9zdXibJEMKNwWVMY+p71drhbQSXZZnzYnEpJ2/Lkjr6H/69V0X7fLJJcAxo Bwdvy/lVuaRIQHjIkkzgLt4Hvz1qAM88qm5JSMcBlX+gpXVtSiaFzY7obckx5BLBeta0TxeT FJECWJ+eNqoRmSKUCyckbeWHX8q0IX3wBgoN0vJUjr+NLzK6Fi2VMmTd8jP0A4Bpro0tu0Lj JZiFYdaI41Z97DaGbHHQGpBFI9qIcDeCdrZ5PtVq1zN6FFLIWLmOZTHGWBPy859QKoasRBEv lfvgTkMRwKva3etD5dq4KdzlcsCe1ULwG3BhhCyLwct24ql5DMYIY4mnkKg9SDQ92vmiOOJk c85ByMVJeWZ+zO8nGMEjPP0xUSMsm0wIyOV5zzx7Un2KRKY0eRRPL04G7rU6XEdvaywiISIM nfnofaqogWVsyyAHpljVuN4/JWERbuAN3TBzWbStqNbltWl8i2ikbMT8cjhT9asRJBbahDvJ 68EHPt/Wgo1zarFJwVGUyMAVAUEMyJMMuCCpXkdafQe7M3UNlvPMFQSfMeWGCfpSSQzQQ5Vm QnsOmKfrFyv2poxDn5gM88HNTSW4MJDSnYeoycVstieplzpEgRkmz8wBxkkn6elWTPbssQgh zLG/Kt09M8U6GGGO4MhYTIU4VeB170iP5M00tvCVUggEjODUpdQWhrw6lcX+2KBAkyndhRjI /qat2scpWWOfKugLRqTg57/y9qy4JLu8YzRgxgDaUQYz7/rV+0D3CvNKR58QAG5vmIHf60Mv csJI8TLJCB3D7+9Tm4lRVeHKK3Jxn8jTI5ljuGZDvjdemfu89Kzbme+WYhGMiYKhM/Lz369f fFCVyb3Kt7YPcec0VwpG3e+W+YA96uRy2z2SxqGkuIwpUkAg/wBagk0xYbZykysDhmGeVzzg 1PLd20FgqQK3njscYOKq2moJnNa/cSandSI0hYRLhc9j/hXKaVdrF4t1ceWGkRY4wR3XYx/q a7GyQXUd27A+bzxj5e9cjbqU8T3sZiTcQoR17/ICf5muXzNrlz790mQGJ5x1rQWJYmJdtrYG B2FVIY3W8xACzgZJWr9tHCJGa5JLdMdiaUvIBLiN7e5V5gxifkEngn2/St3SYlWyEbsUf3HL A1iXkbh1LbijHABx+FbqBp7fIdVkXao3cZ681MFfUzkLpRZWeTkfMRzXR3U1uNpj3GQAfe4/ I5rntJQtFJKxPDFcD/P0rcRrcqoQlpAvAIPPHr361rFaaGTZDKrR/fkaRAc5HX6fnWlbTRTs qQoyFsZRsbj9MVQ8uWU7ZGZ4wARnp9BU81zFGiG3L7zgcjB69uacvMkuIfJuMT7iSCFbB9O4 ppvVt9wWHzsjcS2QP057CpopVS4CzPhSPvSHP19aryzi2kl2Is24krtJxj04FVFaknyL8Z2S b4g6vMEMZaX5lxjJwOf5VxDEHBz045r0f4/bB47udqMpdEJz64rzZhxz+HtX6BhnelF+R8Ti 4pVpeo7cNvIz/WvEv2lVwPDfv9p/9pV7UQcfhXif7ShyfDvOR/pP/tKtsQv3LZOB/wB6j8/y Z9aRkbuCafI42kDG70IqJAM5xwetSMRuxjivTR5kVdDUBEoxyW7V9m+BLhofAmjK/wAge3Uk NwFJFfHWlW/23V7a3VdxkkVQMdea+2hp6xadbWmMQIqhc8gKBXy+dytCMT6nJ46yY/ztsgUA TA5ycnA/MA1ahUhFZiXXqo7VVG2wkSNB5iMCchcD+QqxCCkQDksf4T7e1fIxvc+plpsTbG8s uwBfGCMVBcoVTzImZCBxGmQ36YqZhhnl3KxGMg1UuLdricSo7RxgYwDz/Tiqb7kR3Ma48iJJ Z7vcpAJIwev04xXmWvXUmr6gULgIzDqMAAV6Z4mkihsGDbhxuIxkHHr6dq8ysYm1PU1Zgsa9 fRa5WtTpjY5346sbb4E+J3QsqC1KEDnGWC5/WvnX9gyaT/ha13DuxEbNpGAPXaeg/P8AnX0b +0TutfgH4wjVlVPIVC+M7syLwOK8R/YF8Jw3Or+JNcmm8mWCJLaIngANkuR79K2hpBpnNO/t U0fY+o63Pd7ra2BSMjaxCnpntx/WnWlvFBCwheV7gjIZwcfz/pVmzyv7kQ7oEBUnbjeOn3sU 63ht7cMIJeQeEP3R7f8A1qnfRmmxm3CXO15rgO0bNwrZGT6/5NY2rSJdRpmLyEXOdpOD+ddH qcJS3MsoZkJ6FjyfauZvbhrvEPlLGo5JB6j3ol3J6mQXZPMjtRjcBllHWtnSUhtbMgIfOHIc 4Iz+VYzMVlK2+7GMkqMc49K1tLaFIADGztwPMzwDWSY7I3UtZoNktyh8tvvDrv8A0FSySPGw +yubcHrFnn69BVa4WaKEyujNb4Clv73HbA60OgkTKR+VNwdu8liP0qtyOliOcJAS07Orv1WP nj1PIrLlW5mUrFzCBgAHqP8AGr5YliL2JlkIwMZyR781QZmDNHbPIIsdEIOT6GmgtbUqGG0E DlJ9sw6Iw4yPeqskl6xKyAGE+3A/SpTHBDMUmLs4BYKDkA+/NDxXk0R2CTyyBxn5cVSuFrIg LRqP3TNJNwFBGAD7VMRMyA3bP5a55bt7dajkmt4IW2hzNgAMR8optvFeSIJLkN9n3bjuJx+F S9RpGhBGxVfsZkVz1J6j6datRGVCxm4n6gHOW9Kh+1+bHGtojpLuxljjP0xU8CSRho7ovvdc ozcn9frT6lFgYnxIW2K3BHYGp/OY2o2qQ0XOV6moIQJAS7hdwxgetLceZNbxPb5Vh8h2HB9j U3syLXMNiJr/ADdsyEkAN1Of1q3PM1lIwjiEwXgk56H6VG8Aku1a5J84noec+nWmz6g8Vxgo AmDuTaOmPfkVulfYGZd3bMyyyH7pOTzzjNVYJWKExggDg+tXJ7N5YjK4PljB4PAHXHSqPnFZ iIMoh5O6od7ldBfsyyB5GmVWHzbWPJ+lW4LtSgREy5I2nPWqYjjxvdixzllB5q1bTC4ZVhh8 uUElvpSH0uaVvPNcOsckmE7lxj8M05og7yxs2yVRkd+KgMs162xgN6dCeM/yqzFiKLzMBrhM hk9RntT5WgM7VQXtldYsPxlwMkdqZb2rywgSy4Hck961pJcLIphUQyLtBPUE/wD16wofMe48 q5lWNo/lVWJ5q9tg3LEixWdwc/vQ+Msp7e1VxeTxhygBiPUbQQwPenRzrGWV1DgnG4HpUsl1 MqpbGMASfICByvvT+Qraly0gu47WKVZHRPvFRwBx0OKupZpbBrgSeYWYFwuCVz7enWqi2T2x iDtkMQGJOAfWrsaxWUoaHEkDcZU5PuMVMrpXKHxyqvmxbCySHhgcYrM867M08e9vJ37WXtj1 rUWUMpTyQuWJDgcmqAtridXjM4CyEkc4we1VEVrgbN7TliGhb5Ww2e3TjpUMmoWUZ/0UOJMF cMOBx1GKsmze2UCRxNaEHO1twJH+TWVdXMcW+WCNiVUj95zj9arcVtQ0eSD7FP5kjeYc/KRw a4psrruFA8t+jDt8tdjpkcQsWaSTc2CWXbz+FcQLhjrWAMpG/PPUFD/UiuVrWxutWbEMpimA g4wOT0JNXrFYi77vm54Yjpx1rNhgaVC5Hlr1AzyTWtpghRnS4VmY91P3R27c0pDfYbcwzxmN 33KrE7T157f5966CxQXVmzFwJVAAyeSMf/WrDnVmaKJXZonbKZH4jFbdoWNtI6oN5O3APcD0 pQZnLYk0ffiQruWNj07E1qiG2eNJfMUSEdFHOPyrO0wt9nYqTsZjuXOMetWhHaSLtD7dvY9Q M/8A661V7GJJNey+Vt2lUYgcLyPxxSzrE9shjb5056YH5/lTWd9iosYEf05P44oEEE0Uhjlx Ko4Ugj6c4xUyV9wRoWEiXLhJnXfGuNzEAe3JxTGItHZXRpVznj+H86qWETXM21yvmKOhB56+ lWp44oFIkBBJ4KruIHuOKqLIa7Hy7+0HefavHkibNoiiRQcckckfzry92IHOSewr0v8AaAvI rnx5N5aj5IkQMBgkYzz+deYbhxxz6V9/grqjC/Y+Kxv8aRMCSPXArxT9pE5Hhz/t4/8AaVez hsIexxXi37R/Tw6PT7R/7SroxH8JmeB/3qPz/Jn1mWOV4yevFSO+cjgnGM1DHkHOeKfkYOOc 9RXpo8qDOg8Ayrb+NtGkdEkVblCwb7pGRX2lOAqxK6OUIBGDkD8K+H/CkTzeJNNjR/nadAPb 5hX2vZReZZ2okO7aNpfnIIA9fwr4/PVdxPscnd4SJSxikyAZIyOjjGP606LMKLvIcE8AHsfS iVVtXVVPmb+z8f5/Ko0BWEu77jn5PmzjJ7V8xDfU+jepLt3I8h4YEbyOciq95LLPIfs7NEgG Pl+XHscEVYB+z2+8gMzEBlHU1Xk80yM0O6NOM4/kaHva4omLq9nA9pKbhgLgqxwRnP6HH51w Xhi3a6vplGAF6E8ZzmvQNRs7eZXllkVT/ErHr1/GuJt7UW+ruUX5DwVHBPpXPUumbR03OL/a iK2fwC8UwKA0jrEgPXBMqjr9M1xP7DmmNF4BnYiKBpLiSTzJMDcMhe/XpXX/ALXIeH4I6vbY Cu3lyHnnCyL+vH86x/2NLZW+HMKPIgIVnDjtmRuO3tVxdo7mLX7xs+gIXnhzEpXCDncobd34 PWmi1htwyrOwc/N5YGOT2zgfrUiTSI7xxhDEmMEqCxB98VXzZz8Hf5oOdxQbc5Bxn1pp33Hc jv4pRZ7pY2ZeOZM9PauevWldFiSFbdcnLEnkevIH6V091DI8O+ZmKhcnf90D6ZxXOavcpIqR wowDEgMcYI754GOlNptWQIxpB5cix27kj7xK8ZPpW5pP2aGNokiLSDDBuoz+Xr71jSOIrhEt 5FJOCTGc5Poa2tMuY7a3EUiFph96RV+6foPwrFKyBmkdMlQedMSEJ+ZAQd3f0qKfZdho40WM 54IY8+xqNbS4XDCTJPJbdz78Vde4WeAosCwHghlJzn3BrRa6kWujOuonsthuVYJjCjnP64qm s3ny7rRHRcbjt4YHPfFX9ThKogkYPGCRt3deOvSsdpVWVYbY/Z1b76qfvD64pW0DYgnEasxk RmfJLFTg1MBez28rQgmA84QnAGBwR+dNeJbSdfMXzmcAbT+fpUcqmV3CSCHDfdYgAde9Wuw7 XKgkjHHlu7pwXByuRz0qzb2s72wZx+76k9j6UCeOxHlGJLhgM5J6E0W9tJMN8kqKueNxCkD0 A70BqW82/wBmjEMTLK5wjEjH1/SraB1lUTb2XBA46H2qvHLH5GY4ju6Kx9enIxVi1aaBEa4D bGOSck4OO2aV2PoOZCyANjcwwoA44pz+ZA8MkXmI+ApCHj3zTxuaQOQGI+6tLN56kvEzJE2S T/kUJag9EZsvzXe+Q4ncnCnmmXF4CjxN5R3cZP3h9ef6Us1ukLrK043gA4/iqe6aCVWZ7f8A fkAq+PvcHrWi9SOhiz2LxEs7fuy2GPY/jWXdP5U7LCCVGfvd61riAgIZAyRn7+7j8qztQkiW LfAWfnncMUpDWhEIRBGjtJuAbnHXPpV6C8ZGzbR7Gx8xxzWTAAJVMpO1RnHdj7VoJdt5u+2w UwMlhk59D2oRZeWKW4beWCv6EgZ96t2zROm/DedHjKnowPXFUrWGW7/fD5m67TxgfQ1cHlgJ IjElcb0UYyO4B70O4LVjb2+ZXWMx7oScjPUH2rM1iwma8S4kdY1ddp9B6VqT3Swfu9qupGQX PIB9OarXtpd39jLA8peMnKg9Bg5496trQkotNFHAEVCzbcKwHU1ILi5uSsZ4c4+bpt49arQT xSWygRqLkOoHPBPp0z2NWC1zckQ7VWUksCF5IGB1p3urjuXorMpKIrrIjb5stzz6+9WVSOyn B3LKsiEDYcDn6+n4VXgsSyBbtkgCqQhbtmpYjFZFopiZcNtVlzx75+mah2WgIs+bIxjhWMb1 +45GN3eqDyXOoTmKVFiBO4sflA9qnjeWZ0QHZIDlDzux/wDqpblLzUJmhJAZSRnAXd/KqXmD FlB0+ALKxdeo2OGH1HasPVdSi+xMsIJM5Cndj5fUfWtB7dNPjliv2IBJ2KG+ZPzxj8653WJo nuLe1Rj5QO5pGPJxwKT0CLuatrLaw6exBzIFIK9Cfp6159ptwJdfkdVwvmyRbW74Awf8+td3 DHBEiuJDcDaflAAH48Zry7wtdSy3jl+JBqNwEA6FQWFc9R31RvHc79lLKilQGLcIOTWtpsUc CyCWEvKfm9/5VhWW+9v8EnOPwH0rp7V47eIwzRGVwuS5PKD64qLtasT0M1WMN9EVYsGbKBhn FahdxbPchcA9dvXisZXMWowhFLEklN3OOK1rht0YmAwrEDAPTseKcL2uZyLukMTats4jcg5U cir0cNvKgVXjjlbPBHPr6VT0iZ4YmCDch+bDLnGeo6Gllskmk3mUQPuLY6ZOK2VmYkiXU+DE u1sKM5X5uvc1eitoFhO2VCxxuQD5v5fTvWeuomOTy4og4GVLHk1a0+1DoGWaPPDFc/N/9eqk rj6EkEJnuSm0q685VuoqSWSK3JWbdG3Zs5B96W4ZzdQPFmNtp3EE80yeI3UxErpHtGMs2M/j URS2E0fK3x4lt5fH9y8JIUIm4A8ZA5rzZsnkV6V+0FFBb+O5EiA3GFDIVORu/wD1V5qr9M9M cZr9BwmtKPofFY3+NIejcE/yrxf9o1t3/CPdf+Xjr/2yr2XJHIzivF/2iiSPDwPP/Hxz/wB+ 63xH8KX9dTPA/wC8w+f5M+sQcKcADHY96eGO30PWoeenTPpUit8pzngc16t9DxonUfDCxbUf HOkxptGJw5B9Bz/SvsiOKOxbErAIxyc/oa+UfgRp327x/aNuAMKtJtYdeP8A69fWzW3noU3g bAMbznIr4nPJ3qxXZH22TxtSb8xjTCNsRqZ0f+8cAH6UySMRkbvvEnbn+VWbFlCkMBv6cjA/ CoHXEiEk7SSE5z+VfMJ6n0DHJiNQWBc5wwHXpVbzrhp90JdYT6d6uCdYE+bDHd82OTVYu6F2 Rm8thlRjNaSFF20Mq7hiW3kZnVnHJ3MM/kDXNXsYmnXyYWGwbmY/xVuXNpndMcjHJZznjPTr WdD5U0d0kEZWZyAXAH3McY4yO9c8uhojyb9p6xGq/B3WolBM8MXmhWPUKQT+gNYX7HVukXga NBKip5W/zJGAAJY8fXNXf2mrVf8AhTmuuxk+VFYDdg7RIn+P6VU/ZCSOb4eRKsqRMoDeY5x1 zx1HeiHwq3cn7bTPfIppbUyRAK7dN5+YnjoDTrawhEe52/f7c7QOlOjuHtJmhCByejsobv2z z0pypasju0xWQZ/dYwT364/rWi1YIoXj3P2MpMWKYAIZsZ+nP9K5/V5VkCQ28Aizk7h6flW7 dXkskeCrSgjlSOFx6c/0rIvzGyokUBiY5BY4xVaPUnqZMcAsbnbEQ0rfNuU5IP1rW02eGCNv ORpJy53EcACs9W+wy7omVpXGdw524q3poiV5TdBpJm+Y7SMcjvUIq1y9FaSTBplY7M7vM3Y2 ipG1BJ7Yw7DG/IDhjknnseKdZ2bXCGUyYQEsMHoPQD/69SzXqNE6/Z1XjaZM/MP1xTuR5GfJ A1nExn2sp5+U5PvVOd45oxHbw+UxOQTzke/9asvavDAzl1IwTyQWI7cdfSq8t45h8mOJIgzA Fl6++Tmm12AhKx2ig5inboqqQQD+HSqkzfbZ8syxBQM7c7c9Kt3KrBErJtlkB5VDk/jUJuJL po/NiWIKDkhSB+tDKTIUuDYyhY0Fyx/ibkfhzUlrAbxvMeVYyx+UNwfwqJg1pL/o2xyed23P 9KntozKwM8oi3H7jMRj6ULWzY3uX4bqKGAoIQXXgEZyD64pyW88CJPJGxhJG5m7/AE4qMXMc SKjxhmyQGYnJ9+tMe2mRDK0n7okZww/Iik9B+ZpI+P3jYI6ADjj1/KqtxJNBdDa8jJgqUXOP xHSrSEkKWUYPA47VRkvJ2ZoXbCH5QwHI/HHT8a0ijN6lS9gBhMjygoMZIbLD8M/0qeS+hmhT yomEwGQDzx61WuLGS3mSSVQF4VsEEnFH2xAkclvGd65xuOQPfirVkCGXk01ywimJMQ53tkke w5PpVG5hSBHRMSNIp57CpWiluubqf7g+++QSc/SlLraSsIysxYAgjpUtLqIwrSSNW3z5KsOF PX8KtxX7QMwgj/cg5ywzuqggX7WxmZo4gxO0dvpV0Xptk2pCGjf5Q+MsoPvWaNS/aRXMg+0p hmOSVJ6D9av+aiRRPE2T/FGRVEW0tuPPM2ABgseePT1qaG7jkIkijkJTgoRgMD1xVPbQhFoX yp+7lhjKlT82DuAqo8cyEnzJPLbqufl6/X+lWZ71PLVHtw6EZDEE4HPp71G5lDECQ7ZAOBwA K1T01QrmXNAlhcmHG5jiRCpGG9qsiSe4jWMKIpcnLqMZFPv9NNrClxuE2w43Bic/X8aalxLe xpGwCOpzmMdRx+dJCTLNjEqPtuW2Ig+Uuc4z9alK2yAxuRIVOQ6N90Y65xVXyfNci7yiRcKz 8Y6//Wp0ItraV45laXJyGjweMds1L11KXoTRCVise/ayHKMPvfh3p99DeXkqSQqZWUDKqOW9 x/jTIJJX2RBumfLkB5PP86kmEtyVZHbeo2spOM+/86pabDZUxsmY3zEvjGByR/LtWDqQguNa UN+7hRBhlGTmtSR/37td3Lh2PO09PTPIrHee3m1razlIkQBSRlifWpYluasNpDaxXEiHzSUy OMCvC/htfXE+va/bXEyyvaa1MiBDzGjDiverZXW2nigVZY3Undt4J/pXyn8FpLmH4ieNLe8Z 0uBexF0ftl3P9KylFuEtDRNqSPozTYPNuSpYRqDyxOAfxromlWzjeIqJGY5znoKwrC382QMx CRjOMnrWpcskKMAolUr97PT6VhZ2savuilHIYJo3J3kOSu49ia1JmU3ceCBEp5XsCf8AP61B aWqXGiu28G4iOVB79Tin2M63F2sgUKr4Ur6GrjtY55GxYytalgiRlGwW3jP5VFLZPdnc0qxg n+NsZq1BMbQMzGOVWP8AFwOv4VWuozOzh2CKg2ruOMH8+lbaoyvqNiuvsjNFGscxXje3Xp2p 0EMgAdJkSTdnaSQf51Vt7po2k8tAVA+93P0/SrtpZO0ZlEhL4yUYnI69s090PY045zNDHPEP KmiO1uevvim3LmfIJUE9cnFUrW7f7XEYeHAwysOG96tTQNeFjKoVQOg4Bojo9RNrc+U/j0Ej 8fXMYYuPLRmOcgHHIHt0rzncCOB7V6n+0Xp9vbeMYJYjl3t1DqPUE4NeUqwHP6GvvcG06MfQ +JxiftpXJAcDB/SvG/2i/wDmXv8At4/9pV7EjbueDivG/wBoo5fQf+3j/wBp10Yj+E/66k4H /eYfP8mfV/JJxx9aXBB64GOmKajduh9aR25P1r1UeMlZI9r/AGZtOiufE1/MXAmht8KMZGCe TX0wvlqGBkG9RkfNgmvmv9mCZ49e1XaQC1thhjPG7tX0hFbBSQZACVyGPOR6V8BnDbxLR99l ith4sRLny0GICQ+c7j71E9tIkayynBJO0d6Wac3CpHGhDDGG7H9P61LIjLGhbPPQk555r56O skeu3ZESOkagkb2Y4YA9/eqss88Mci4Cx4O3jJ+tWFKwfMw3bj8x6nNZl1dXERl4V4ycDIyR 9K2le7QRM25spFhUsymNiNzE84zzkVBcTwWti8luh808KvGPw/Op/s7yu8gbgcOd/UfzpNcn ijiijgVgT8oUj27c1zvXVlrc+df2v7mWx+Dk5aUtJPNDGM+hkXP6ZrV/ZMst/gGBFVIBEikm Q46rn1Hf+dea/t16nMLfw7pxnYwTSyMy9ztUenpur1v9l+3Enh5YnULKkKElm2gZ455HPBq3 FJRaCKTcj2eO4ksX2GOOR05PAYnPpk1WHlFZZHdPMfJCMef5U5rsWs8kawiRe5k+b8Bz/jUU lrbSpJ8wR2Jba+ST+hAp2ZGtzPmluHLhpW8tfvAHge1Ur+eCSz8qBfnYj5iAeM+varckt3cL tBxChwVbAGB+FZ8kkSKAkcmQcK3VelVtsUtihLttZlCsrs3T2rTgKL+8uEMpY84YLVO9QWRi mG1pHO3BwSM98flUsczLclrgkpgBc4+aleyB+Ru20DXSM0RAUDAH939KibUdglxAhwWUn+L6 gZxVeNJb1iIIy6A/KuOn6VYDmFfLcK7A4Yn8uOaE+5BmNab4hKZlV2GTHn5jz0xUV3ezSxGJ YAqeoX5vz6VZe0DIztcIhOcAn5wO2Kpm4uGhaNCAgBUADLN+OKdr6iKnlraiOUXEbSRgAIOo 6daW7mlnj3zH5AcjgAL+VRtp1uIxIz+ZImG2YH480y7uJryP9+SIQQxDcbR7UJX1KSsDXcao ogJ809TgAgVasdk7M11IQ5OQAP6VlSTQSSItqz+Zn+L+lX7eNmlD3LOoIwPX9TWavfQ0sjTm uJolKCFZEGcFl5/A1GsLrGs5ZOQNytyT7EUglnjkZY/mhHAJXO79Dj8KI7Rk/eLIhHUxs3zD 8O9PcPI0I8yhVxtyML7VDPcGZVhlARi2AdoBBx3P9ac0pMeUG1tu5QarPP8A2jIoZQsxzgqM Ej3roizNsgks1tXzcH925zhj970PSqqlPMd7XcGPA384/DmrTAWwWO6+QDooGTnPYcZqtNKl vOPs7KQyg7iv9KGr6kIr3SXF6w3yIgTqX+XP8hVZ5Rp9w5ZBcM2NoBO38xVsJLqDyEsFOcFR hQf1qhcXEVvIFdPN2khvQU0tAMu+O7UZGJ2Rt0U1prqTtCFEcYBUKPl5HvWbqIJukZsLEUBA FW7WSe7gSMgRoeN4ABHtmslvY0WxbhVo3V2kHkufm+bPHp7VZKRW8iS25aQZOVbAx+tVIIBb OC8uUbjCsGz71YVzC263QNGR8wlzk/5z61TZJpxXkP2EJNF+6yxSQ/w/X8ap5uirLn5ScLhe mTinW92q2Do67CWyjZxye3PbNRG8vZiIpPlVgFBVcEH8vr3rVPTUTY86NNbwmS43LG2cc/ex VCG6m+0CCD5j94MBz16fWrkVkbeRfOnk2McMxOQfcGsvUpjaXMSQMWIfAZeCe2KlrqgW5pPD JMFMzeW6jC+aeOfU0tsYoZGjm/0hlbnyyMKOO/NQxLJcQ5nlaMjhQ5x+B/8A10yzFrbXLJcS Mr78Fo8ZH60PyHcvzHawRP3aNzG+PunPrRJZPdrvDMzxcuEGSD61HPePJG0axjysnB25OAOv 1+lRz2088EnkszyoBnk5+tLbYooyvAitE7ZlcEng4+tZ9ukMmqtLKPLhCgLxnnGKuxW8cKs8 0pMx6r6cVUtHM+oKXxHbrzjbnJxSavuJbm4lwtkwjtnV2bJDAZGDXzh4btktPjB4wth8ly+o RSOTkkqVZhz6V76ZZIp8wBWDDO/ZkD8K+fTez2n7R+u2lypUXBgljYDqBEAP1JpaNNMptJo9 4ssHaZSqoOhx3qeSbyYpUV1lidc7h0HsKr2zqRi4JA7EjJFR3bxhSYCsiP8Ae7EH+lYS2tc3 eiNfRfLbRplbcJlOQw/iFLpGW2I5VEZiQzdEpdF8pdDkffjAIIPByCaboVwv2sx3GFhmOdzD IBqoqzRyvU3IblraVoiqzoy5ySSCM/h7VUmb7fcuwkWOMfwseAfrmrk5GmyDCrNHICcBvlFZ tzK97MCF8lVBBUnjJwf8/WtJJNGS3JbS6NtGUXY8aZXcy85HPBq3bQF4RJFOByc5bBB+map2 DvCjRoEeMMfvLnnHPNXrOFGRwsi7nOcE4OcelOLtGxTd0IZtk8MqJtmVs/7J9a1L8/a4Y1jU o+MsM8Z/z/OsoyGREXyvLmU5Aznd9RV5JTNGqoNjnPmcZ49BSjuS9D5v/aY09LTXdKnD/vXg YSRnqADwfpya8YBDjAHA64617P8AtNxka7pUpkLO0DBlPXhuv45/SvFlc7RwBX3OBdqET5DH fx5DwdgIUds46Zrx79of/mX/APt4/wDadevF+O+K8e/aEYN/YGDkf6Rz/wB+668R/CZz4H/e or1/Jn1gu49c4oOSCW6etPTnjtimseo6+1es9zxVqe1/sxzSReINRWNlG6DkEA8ZHFfRqXEV vHhzjjKkc4NfPH7MOniTVdQuQ2HCBOPc9P0r6MiFvFGBJwxBPy+vpX59m7viZH3+WprDxGQS BoWBUI7HCnOSal8ldm18Z5I7nNMjmF1mNlCljw3IPFPWOSPer/LIBx3OP1r5+nZtXPXloiGU rbKu7LZPJB5rIup5YfOUJui5bBXJ/PBrVcrGPMbLDOGxWdc/aLiZvK2NET/q2wTn+n4VrJ6h DYr2+mlYhcCRFDclS3K5A6iqGt3FoZlNsWZkH3SePbHPtVyOylKNcPKpYDBjXP5CsGe5MiyX CW0h284bnGBXNzaamsU2fCn7ZHiF9Y+I9rYMXItUwG/2mxnA+gFfUnwN0x7fSIFjdSzQAlnO 3dz0Jr4j+P8Araa98XtUkiLbluAh5434GcegzX3T8K40/sSyQsIx5Yw5HGMd/wAK2qJpRMqT fvHo0V69pJIAqSMvGZBntztGageCG6Ry0whd23BWXc2cfTjtTZL9NNHBEpDYDSDA/U0tlD9r SSZ5Fj3NkCXqevQYP+RTS6ocmUzLeCFoo8rEAQ2Mc/5+tVop4bW0Kxq8ky5y5wwDVYkv7r/U oHVFB5Vc5H5f1qnHJDFC3mbxKBkrgbQfQ571bVtwKs9sBELmQqzL/DnOT6kZ/pRNulljeZ8I gwuwAZPp/Oqd2HijBl/1h52Dr7dKn8qS4iiklXZCpGMcYqU7jtobdsi3syQwQkArkg+/r1p9 9ePpZMARJXIyWYHA+nT/ACafBaRXMsS25ZBj50bq341X1KeTTrxRIRIzAAK3QfkR/OqtZXEu xWMUdwheaUQBjhQeufbis9bq5iYwQgCJSV+YZZh9cf5xV6ZkuJBJKvkqP4WGQfoKilupbGVh ZkMi4yygDOR0xVaklVGtLS0/fO6ykbvLAyPpnPFUnjmu4izGQxDk5OFx2q0HtFDm6LCV8syq w7+vNVRbTzmR/MzCoOCDwB6VL1KWxHGYHlCwW/lscfOa2Z4EsUiLqWhc4G08/nWdbXPmQMsU SICuA3fH0q/Fax2sQ8yQSkjBjDDJOO4qH3RoixbzSQuz25xFjlZBuYnj60slsjIZkdUf73ll 8N7/AFptqZDDutSYSgIdQckjPWmmLMTOsgS4/u5Jzz2o9SW9SzFcCW0+0KhXKg7SeT/nJqG5 B1AxiM7ZFPzCMdf51I1zIlsksUalhgbTz3qO5uJjOJ4IihU/MFHP5nFbRVtWZy3KkVuhTZOx TZwjsD/SqC+ZaTsIk3gsCXYAA8Vrz41BDLcOISeMEdT096w7m9+zlo1IO0878enaqI9CR9Pu LsNPkDcc7ScY+lZxNvuJkjZ25wwI2n2qzd2s3kiVpCABw2e2Kr/aYRGVjQ+YD0GME4o1exaK Wqylp4XkG1Sn3PTnpTLV5b5GQyeUqn+I4WpdYeWRIPOOVU9SOaq2kH2mV9zrGN3CscZrJp3K NOB1s2IYi5fHCjkAfWtE3ZhbMKYgbGdwzj2rGhktbc7GV2GSNw/pwatrqLwttADQHnGMg+9a R0RNzRh+ZchFkV1Z1DDODQZ7ma1WKQruOWVyuCvHTNNjibegV2VH+ZW9PpUk0NzcKVDlnTux OW9PritIkszhbT2z7LhhHCfm29SffpVTV44oVPl/OXUOCOMd6uLbO7EXMmzado4zx37f0puq rFbRgY3lcjI6dKl7CTux9kP7QgRmmVZgoUhzjP69fxqQwQu4juGKyn+NRkfSs/RoWu7RDjEh 6q3U47ir3mQ28QSZj5g+9gAjI7ZpbIp7l6KVbe28uOIYGSuR8wGOoqBbSWQMjbt+CV568nn+ VTWt2LmJS6RnGAnUFfTjv+VPZH5XJZhyoJ7/AOfpQ9RrQyboQ2yhLmUpK2Tjvj39KoWrm6vY 1cBbYNuU45GKdqlniXz7qUBXYjHpils5GmkSMKEiPA4Ax+OKl3YJmw3k2kga3kWSRxzgcfli vlr4k6rd2P7S0cswHk3EESEouOAoINfSt3IttclonRyRgMOQB3r5I+Putzt8Y9Pldgn2SSOM ugwSpUZP61tSp8/MvIyqvl5X5n0/AywRrubzVbJAU5H51X+0I8zxRqRDKMHPVSKp6VqKPa2z hQ6yR556dKiJE146jgNzj3rga6HZJ6Hd6NHEPD+/dnk5HvnvVezTEvzcxu3cdKv+HmVtLjZF 3qQf3fQ5HrVeGL97hyVhLcDsv+TWq0Zz3fQ2GnW2kEgInRTgbW4/GqLytqFxgRpGEyW2nj/P FWLhFtCsiSrNGxwUVuM1B5rXSpGMQ7c79nQ/rmtGiL2YtrcTWi7bcJJGGz93duHer0amWNZI 2QTdSvfOP1FU7aaS3Ypb4k+XcQBw1WWtgArRygyfe2A8ioQ5PUknkaaCKRE2Tqc59ef/AK1T 2TyOrlBskJ+cimTyrLZiRUZJgN209Dio7C5cu8kZKyfxbR39RVre6BI+fv2m7eY6xpc7yBiY 3Qknngj/ABrxHeSTjkCvfv2otKlmTStTySQ7QOPqMg/+OmvnneyyFT0zjivtcA70Ynx2YJqu 2Ts5AyehryH9oEYGgcY/4+P/AGnXrMhKoR1Oa8i+PpJGg5Of9ef/AEXXdiP4TMcD/vUPn+TP rMscjsB2FKM/MRnJ9aTcTkEYI/KhSSQO30r1GjwYvU+jP2ctIUaDcXQH7yWfazDjhQMY/Ovb 2kihWP5WkUjtwc+teafBCxNt4E01Suzzt0nIwSMnBr0ueQzQosGWfoQVr81zKpzVpSP0nBR5 aUV5DYv9IkDQ7lC5J55q0ZlaUEnLYwcnmobZJIskDDYwU7H6VH8uVCHG48nPQ+leVTdtDvk7 kFzF5aybXXcPvJ3P1qpPI7qhtN9vPnLrnGemBx1rQuo875TgSjKgNzvNYNxfXFzgvEIXHyjy 2PA96hu17FRRpmzSOxcyP5c38URHP596wPETiw0K5khgCv5RJcH8jXQvEkenRs7iQo3RT+Vc L8d/Ev8AwjXw8vrox+Xtt3dlzgMAM4/lULWSQ27Jn5aa1ejXfHl5c7gi3V+zhichQ0hxz7Cv 0m8B2qJpdnbl0/dxhfMJwCMYByDX5m+H7I6j4i0+2DFWlnSPcByMsBX6eeArIRadbQvh0ChQ /PBx1PtXXXaTikY4d3i2dZa3U1lciLyo7oMN4dzlQPzHr60TqswaW4nEEbPtw3APPpzxTpJX 0abdsF0rAjeOQB+YrOmB1Kcyyy+SoXhW6Yz6c+tZw8zR6lmy1CeFDHDHG0UbfKcdffpx371n zXFraSsZmLyg79qcgH3qeG6liU2tqpVVIBZR94nqf0rOd4bEkTxPIy8vtPGT6/StNZDIGt/N 33MjBcfMNzDLenFShnvY4fMB+zg7m4xj8eP61CLSW4jLTbEUgsAThto9B/8AWqdJnntkj3bY 2IzhQAMdecVmnboO9jUea3dFW3JMjEKwY8sMev51WuUfTZ1eRVduih/mC8/X/PNJPFALRRas ZJt2cuRk/Q5PFV5oXtGjmm2ls42dQOT2/KrTtqSmwuZY7i5824CxRhAMoucnrxVZ51S5VbKR gh5Lgd88Z54qe5Z70xtPIsSqM5EfXg9hj1qrIzqY4rVjkrmR0zk4P14p62HYrbY0uT9qEkkr YZlU4GfcU2Owe8JkRikQyNpIHHtU5i2XBFyC0zZLKpwMepqKPTnuQZPOVV2kgEgYGOOKa01J uLDMURYoolKsCu8n5uvJxn61bjhigtlkMyyvGRuGT/nrTIbhfs7WqqTuAUuB8x7etWIbFbeN HeZZtgCtGP68fzpJ9C1dl2xZrk7o4fJIB3LGTlx/nNNax8wyOJPKfOWQ9T9KtrMl0oWDKFc7 kBPOPSoGsN7zzM+ZQc7e4ApMTILuUpbrLEoLbhhTikaaZf3sBCFsLIsY2nd/SppLiMQLIinz E5MfqPamLdNGGa3TyVYgkZ/TpW0TN+RXubNbn95JJHFORja5AJ+n+FYd5OILPyFJmkHWRieu a3ZrIXEbSKypnnBcFh7gf/WrAv7lFhKJGzyEYDn1obuJCRWjxKj3JOw4ySOD+lMuhBFLGtsN 8mSDkH5femWi4iInlOzORk8g+tJMqW84khxJIQcMy/L/AJ6Ula1hvQq6zHNLaJ5xBVWPPAzn p6VTs4TO7FnWNcfczyR7Vd1QzXVkJHYfK33QMA471kxxeY4ldigHZM5xUPcvoa3mWUibDEzO Ojk4yfy/rVm3nmiVYpY1KH5QNuNv0NUnvIpyBBCyzfw7hjI9elSQXF3POIbhyq9pH/h4qlqS X0t5UmEcjEJ1TLfypZ7aW7DEScqeMNg9OuKhkjRW8qV9pQ7kJ6EYP/1qkmh3xrMjKCuQ5OPl bnNVHQTBo18ovLOglxko55PXpUDTRzaW4di0icg4z+HNF3bxfZmZZV2ry23IIqa3axezlWES JMBk7uA/0HXP1rVp2IRQ0lS25gwEyMeM4PrkVenWyMbFpSXwPlPRzxWXZFxdyy52sCOF6kfS tWU2sqCWJGEqsCY3P8v8MVjH1LZoJdmaKOPy1jOMJtAJyAev/wCqoXu7maNbeQkgN8rZOfp/ OokvpJo3WICG4ByPLOePz61BCLnUJDFO6DYDy/U/Xmh2Workl7FFcReXeMFJGAHGTn6VTYnz IoQBGu7qABwPf3qa5tI5WUTSKrJgBcbh7dqrXMuYzCh3FeN3Q0X0Q0JcxR20yyMVkLDIw2R/ OvjP9o27Nz47u52RYjDMIzsPoBz+NfY0Dx2jmTeszkcFea+MfjyxvPFWtNIAjC5PAH4V6OCj zSn6HHinZR9T6P0u5NrZWJQ71Nuud306Vp6RJ5uoRyAfIp3H2BrifC3iA3mh6TdJnZLbRF0P PO2u48MjOoOzZELAqR6Z57V5NnfU9Byukeh+GXFtDKNolibtkgiljKrekMf3Eh3JkdKNBu/s 1tIkkRdGbIfPSlbEMoSVt0TE7c9vStPQy1sT3EIhbeJEkQYACt1PFNe4achBEIF5yV/zxTI9 ifOJVmGeFHT9aJHlvRsVUiB6lTgfnmqtpdmdwEhtT+5O8AFnCHrweK0Et4jGJYD+8UbigGCK oRK1qzJCVZmwSV5BHQirUioIklikBkz8yYwRzzWUbXsWyz5wm2+Wp3nGQwqCGSeO8kePCMB8 2FyD+FSq4utr24McgP3WoheSZjKPlcfK6gA5qlYaeh4r+0/FdzaHpl4eIxOyOB0yV4PHrg18 5LIduT8x619KftNR3B8L2Mq5WAXRDDP+ycV8znPynr9K+0yz+Ar+Z8jmMX7a5K0gIzjOa8m+ PrBv7BwMD9+B/wCQ69VJ/wA9q8o+PQwug8g/6/p/2zrvxH8JnPgtMTD5/kz6zJywBwcU4Lgn Iwaacbh1NKvLAe9epL4T5+m7u59kfD+0uLbwVoKXGRObZGIbHAPI/Su3+0CKJDEv7zvkda5D wAZ5fCHh1roES/ZU5PpjA/TFdYZUK7FUJLnhsdea/KcVK9SV+7P1CglyRSGZF5OXI2Oo9MA0 DyzH+7IyevHSgec84WYsOMgkdaHYMfkwM9QeK56aV9DomKnkl9k0iB26Bj1qpLCjyOPLAPRZ B1x9KcbWHcjyNxjhsZwfTpSzXXkq0KRK/wDtHAP86TVtSlsNMC2Fqr/fO7OF6H6188/tqeJ/ 7P8Ah7qUEaAeYiWrBjnHmMpJHvha+i1kNtbRPt8wgkla+RP2+NRWPwva26gI1xqAGOudkZz+ GcU6UW6iSJqP3Gz4p8H3KWXi3Sp2UlI7qNmUHBxuFfqH4E2ro9uCd0LKcgDkH64r8pbZtlwj 91OeK/TT4Zau1/4UsFjIfMCtz97kDPNdGIjaSuZ4V3i0d1eX+66W3tHLN1KkbgDTxcRHal2k m48fulJY/hxVKGGKzcNbyYumHG8Y/I55/KrFySI42vQdx4Mg5waxibtWIku5LNMWkzeR1wON 3159KqK1vaoZJgz3B5KBR8v55qWbzo2VLAlVAz+7wM1C0aRSlZkMszcsRxt9z1qmrMRWFhPe DzHkVYzzjPJH0zVqRnhto4wzfZmGzHU/nS/Zxt8yRwF5K4747AURzSTK5UbYlI4YYx70neQ1 qOkkSaGJY0dXB+9JjJ6dD+FV7yP7K0cq4kkJ5VSCAfX61p3rW8lp8h2HOAxOcn06Vm3MnlpE 8TieQ/KQnRfxpNB6DHvJfMBuQdpX5RgDJ/CoZyZ5QIC4YD5+Oc9v61DdTNbPE1zmZyCFUsc+ vXk+1VbphdFwieVERhg7jHvknrTT1Ei5FPFG2HH2i5LFiz9h6e9OW1V1ZpJ1VnHEYzuAx2A4 9arafeSW8i28UAmy2S5HGPbFXYoFuWaaSTZjP7sjnjt0pj2H28sgjEQtgsbYj3FcuD65qy8X 2FBMZllJ48tG6/WpEkknQx+WIwwwSowwH1qOSA6eqzmQTjOMRtxn/azVNah8JNFK93xEojbu EJ/x/rSlUZXlUn7RnLgd8f59ajt7h9QV5bSMRunDpGST165yTj8aajqD5qn96PvJ/wDXqbNb CbHSyiNjIo2uo+aLHvSCWSO6JiTy4yMMmAcH3qWd0aWSRgA42jYRyVNVppCLkmHcqMOpGeeO uen6da1jqTsRXNgzRefnyickncDj8Kwr14o0O1TvByGxwT+VbFxbzBRMQTBjO/tk9uh/nWRf XNp5L+UpMgOQB0605aaEop2Ay0qzOMDBXcOnr60PdJZzMkSJIO+en9KbaQq0+6eTyw3A3DpU 8dxFaF1SLzQDy+4jP0AqFJWsNlLUWe6sWnbckZYbV6baxo51inieXdtJI2jJz+VamoQytYh5 BgbuDnqOvpWSskS3MbyZEWcbO9Ek76FR1RorN58oS3Ro5VXJHce46e1WAk9w+25lCsuPmkfr x3Ofeq8Uy7y9qCoPG8Hn6Z4qRbM3k7PJKizk7RuPUfX8+9PbVk3NCGJH3JJKDMo+Un8KncpP BmRhsHD4zzVG32yRmOVyJ0BG7HBqyZI3hVZMlMYYgYxg8GrUhEUsNrbLHOJ2ljYk7AMZx2I/ L86bBeWv2yIxRsXyS0RPHpnA9qJBbRTbQDOjqGIBxj1/H8DSm4S1vVNpbhBszvdt232Iwen5 Vqm3uZopTExX/n4CgHlRxnJ9K0Y7hS0csURV/R/mI5/lVPWW8+T7SVHAG4KMAt34HQZq3pt0 yxGaFVCMoDBhux7Vg1rc03RYuLp71keFNhAGfLHHf/OM1DFaTXTh5ZOVJUNI33h2p85mnG6M GCMn+AEd/wD61AsGZWkMib8Etk88VT2JTKl7HC6eVcTBWznco3Y9jVMyiOAiOPdgbSxPJz04 q1cWcEqMjlgx5zjIP6/0oFqZVEBiDAgbXHBUUmP0G2tmtjbh8h2Iwozn86+K/jxfG98Y6zvR Y2FwykIMDI4z+ma+4Lu1/swjPzZ+6u7OD+dfC/x5vxdeOdak8tIiJ2QqvQFflP8AKvQwFlKS 8jhxnwo7f4Sa0+oeFdOWMFRD+4fJ4yDjP5V7t4WYRXjGT/VsuPYEdDXzp8ElabRLSM7QpkdV x/ECc8/y/Cvo7RIQrKSSd6Yx/te9cM178kjqpyvBXPQdLaOzhdZ13LkkNjNR3QdDGJsFG4B9 BSW88UdnGskX7xAQGJ60+HewXznbZ6NyFrJ3vZFp3RPEsFuEYEORxjHWmCcXbCMRCAZzlG4P P1pH2QtuRxL254H9Kd53nIqBFTjkr0/Gq2JvqM+bT5FWEq0jnkjkYq+IwIVljZUlHzlP51kW 5liuZDHhtmAeMgD2NbEVqLmBnWVRJy5QnBzWa03ZVxS/mypJEvlsOcdqRZHExmXGCdrgDvRD cGUfux5UqcFTz+lRL5jMzrkMCBIBVLQR5p+0zAbrwDbzrkol2hYemVIr5XySwOODX118ddLb UfhlqUsXzfZ2Sc/7IBwePoTXyGzEYHUD86+wyuV6Vj5jMU1VTfYl4BANeUfHr/mBc8fv8f8A kOvU97HHp6V5X8eCT/YRP/Tf/wBp16eI/hM48DriY/P8mfWQ75GRU0MTvIqjAYnAyaTIUkDB JHPHSliJeVVxg+1elN3R4NOKUkj7X8GRnTPDmkQSj5o7WNWIbOflHeumc74gq8g4wQOQK53w bFJ/wj2meeNzJbRbiDnIKjFbkc0qxME5i6Lhea/KMS/3knLufqFH4UPaLycB5OOgPWkfdIU4 2vnB4oijW3ijZidvQr1IppYvMBjAGeemayptW0NpaiGBLcBpWwj5I46VEl0sEpXy1ZQPvdcn 9KS7ESEBn3J14bJFR2rqJNkJR4z1J7VMrSKiTwz+WEMiFyxJZR/n3r4o/bxunuLTRI0izD50 0zyKeQTwoPH1r7XmUWr78q7DnHrXw7+25rE32LR4ljKxTFy7t7ncB/n0row+lWLRFb+Gz43J 2ygAc56193/sr+MDq/hDTYxKDcW4a3lT129P0wa+DpPv9c19Vfsdyr/ZeslZds8dxHIEHXbt IJBrsxME48xyYZ2kfZix2zL+7ZklUYGfu5/OkuN4jUTA+UpXBOck5HTmora9tPJ27jHI43fL gZOO9N86Vkd7iZ1jIOc87cdxz/SuCL1PRdrkN5M6SmK08wlv4gctnHsf61BIjW8im4h8yQj7 pB/Poat3Dx3LIlozS72O7zMZ9u5qjciXTZgs4aRuoRjggfkP1q3dqxG4yaN7q6BJjjjA2x7j twM9Ooq5a5WIQqcJuC7XXG7069e3eqhRbm4aVpBEoGAJCeD9ake6uImKQYK42sQuSfXnFQkC 13FvrmBwLe2TBzlpG5/Lj+tV7/EASK3KNO/OckYHoOOaRnFuXQIVcgh3zis+aaOFvlbdKFwC F6fU+tXsKxIbf7H+9lwzsCBHnv8AhVW5BvsltttFGnJBOP6nNK8QglM5ffKOfLHJYmkuDJdI HnQLGp6bAo9h70PVFD9OeSzPl2rFgwz5hAOfbkcVo28ESySeb+7lYn5QM5981X02GWSSEWYY cYOeGOemMHpW1a2sSOwulMdx6bOT9fxojsGjQwTSmJkkRliY7QAP1zj+tIwFviQSpNEfvKr7 gDwcdeKddztHthkXETZQY/xx/WoBDFbxiXzI3XIG1WP680lvYqxIqtOwayYRMgyyKCPp15Pf vUYj8mOOZWDSM48xV9x/nvT4t7OGt0EAXhlQ9Tjv04ptrbRw3CuGD7z8yqfun34qupmySUrE shY5kTggjBK02SYWbMwUPHIM/MB/jT50WPcWA3qdrgnkDsahaQReYoYND1+fgjP41pFJaE9T OeN5YTJtLLjhieCOvT8qy9Rntbe2LQszlThAc/z71qSySokkRUld3QHAYevU/wAqytVt4IYk 8l/NZTgZX9c496bjZXFYrSxmUI8j4YgAbgeP0qe3WJ4yDEW2g89OaqypNfSbpWRQBtGePyFW 7GeHyRGYCGTAWTP86zW5TMnUnnZQJMpGDgqex+lZWREBMEL5PCnOP06Vo6izm7drhyI0YtjG P61RVSIhKR8vYVMmC0RfjurjzGltA9umcjaeT9TxUsNqZjvedVnZSSi8N/Sqcc96LcNbM6xn +IDgj35qxFbxiDc0xkkA3EZIP4dq1vsQXIzGsabA4kTkH+906g96sidWkRxGVUjbIOwz3FUV lgkQGFH81QGCkj5uvNWkmVNriMBD8pUnp7/pT5bdA2Fja3gmkiSFpEJGW4AAPToOOlMW9ayn PlxoyO+75wGDDnpkexq6lzHHEVlhBJHEmQAPwxVNtVmZREY4/lJTlRuBzjr/AIZrVLQy9Cvq ET3Nv9qf5IjyVXAqxpN0fsgxGJrYnoQC2emRUN/YXMFmxkOEIyWI7e3+e9Gh6i0FrFE5/cM2 1AV4HPXNYy0LWxLMNRhJZGkKsSUR2+Ug1ZjgW2hDtMpyfmAOSKrahNfed9nkdtrY4foB6j/G l8mODyi0qNGxwQuTkj/PpVON+gE81zCOFiO7PCjvTxPIx2lREvoBgUxbtAR5MREnJIPOOfoK b5r3O0OwU9+AA38qzaZaGToLeTzZD5xx8qK2Rn1OK+DfjpdJc+OddaNdgN3Jwe2Dz+ua+7b3 ZYBiR5jnoBzx9a+Bvi1cLceN9ZlYblN5K+1u/wA5ODXoYBXctDhxeqSPSvg1GYvDumOpG8Bj +O4nH5V9EaLEslwyJk+YoZDjv3zXzp8HZ/tWgRyptUGUkqnReTwPbFfSGkwqY4yDsygZXHrX HNcs2dEPhOuWWOe2jQwjzSMbifzzQiSwxxxzElTjO89B/k0Ryo8XzLtnx8rE5FSX29oFM8hK /wB49ulZpdS0MuAkO0xEyHPTHBpftL3AUKoQ7c5ToevvTFiWN1MThz6bcA+3NLeO0wVEhEZw c7OBjnvVNpLUTZHDK+nxOIxuLNluMg/Q1pW0iiESOdkvLFazLeY2TRRxkMWb5v4utaskGIhK rKJM52k8kelZLsPcdNcxpcwTQjZMBhs/xfhS75WlaVG25GHXsaBFDcwlkRjLjIGeh9qrqZd2 efMj4ZfamNGN8TbFr74ea+lsC0v2V3Kg+g5H6V8Rl9hIDZNfc3jJS/grW5YQTN9kkIC9fumv hhztYDAB719XlH8OS8z53M0uaLHk7gOxry3465C6GD0Hn4/8h16hvG8rj6V5f8demh/9t/8A 2nXs4h/umjzsD/vMfn+TPrcZxz09u9TWURnu4o1YLlgNx7c1XLZwo61NaIz3UaRttcsBXpTX us8Kl70kkfcXhu1NjoNlCrhzFBGM/wB4YH6Vs2252LQgxdyOuaz/AA1aAaVp0cxHmLbIuRzu wB0rWEIMihSUPt3+tfkta7m7n6fT0ikRrHHEC+PmJyyDrzVeZWd2TG0ZOGq8yiJRKDvKn5kF U7tWllX5iqFhwexrKOljZ6lT7NBFGWY5b+IDrUwh+UeQgAYYfPOKiWILM+GG9eq9c1ZuZGSI eWCgOGOKGtblISaP7Fay4AkynU+hFfBf7cWqG7v9PiyBHHIyDHGSqqP6mvubWbh4NNI/5ZSb VYY6DNfnT+2jfy3XxChgkBQRRs4TPTcfT6LXThYp10jGvb2bufO7ryece9fRn7HmpRrr2q2D th5YA6c+h5H6ivnIkAA/0r1P9nDWY9K+JumySMyJKrw7lOMFhxn2zivWrU3Km7Hm0HaokfoP 4fkglsA077GhOCdvBHOM49K0rYXk4LRsZICeBjK/z/pWL4anSVbi1uVZOQwYe34jrW9HeSPO Y7JZJ0ROQg5OfavFsexa42WK3SBvscjNKF4BbOT3wcmsx7M2aNNcZMAPyq/Tn8AatvqFqkmZ XeKXpt3fKD9M/wBKpXFtILVZJDiLO4r6/wCeKoSuhzbNRG75LaNB91iSP6mmxySQy7LaUJuG 5mTAyfpxUKSC9aE5WOMDJYAnH15NW50TTSs1tuzJhWdfk/oP6UNWF1KN3dCzmCvEskz9ck8H t0pkcUENvvk8wyyZfaBxn3z/AIUs081tMZJIw07jcruM4Uf59aq3Ny0UjSTLuZs4QHAJH+RR ZteQ1qV4nhc792ZgSVB7Gp7hLjYJJWYxg5Yk5C+w7VTtI4z5jylt0hLbFGeMd/b3q/BaSyQ/ aHAHUjcwyQOgA+mPzpx8xmjZQSXHltAGSUOM5PLD8vr/APXrTjjMDvHqAeI8hVzhv6cVFYE3 Vko8pLQEgqVJOe/PJq5cKsUyLdjAK4jK4JA5z6UK+xN7soX7tJprQxZaNeQxXOR0POKjgSC0 jS5aZLgLhHjUYweOv61Jc3L2iyxQDzIHBJLZOQfwOPzrGs7hbCdtyiVgwzGH5GfX0qG/e1KR vuBFOstsnlIyncqEj8D0qtaQofMCsHEhOD6HPep9pjnaa1GyMrho8Hr9f/rVDEqRgxhgzMc7 l6Amrs0ydCGQGJxO/A+64JyeOnHfrTlCfv4JkEtu3zqemM+wFIsas7tI5O47H74PrSRwrCJl 2bnP3HPYcnp+NbrzJYx1mFskD5jicYU9FGfQEf1rJvbP7BYRuWimA+VfLZWwcY5IqxE1wSkN 1JLh8Ab2zg4+gx0PSqus2ktlbqJCCDyDg8/n+NPdakLsZ0VpNew+eCqKuQRuxjHtmprdoTCF 8vLnpJu6ke3/ANes6Dfc+ezFkjB4AyAp79varKzxwp+6Vt+QASBhh3PFZMvyMrV3eWaQudyj kA9s1SjEmA8gKqBwvqavXbmS5aWdgsanpjnn8BVVnyRISWQdFB68VMk+g1sPge6ntFMe5Ixl cZ+XHcn/ACant4IbeJHWXeVYZRV2gjqOf/r1R01ZJhMS2yFmIJY4XHX6ccdvxq+Gt7ZVlWYX HVQANuPXPAq9bIkuJcIZlaK38uVeRltw9CegrQR/NXztq4I/eYGQKyEvvMcPBCIWUDeU5GfX n/69XbeZnjaVSQG4KrjBPp/nFU11Fa5ajlEOUddxAyhXqwI6U2Wee8kFuiKZW6FAMqe315x2 qFWmEsap/rEO5GI6e3vUzPeXlwhgjxKg3N5a4znPPTj8q1i7GW2pVaxnWWWO4lKxgE/OPvH2 4HpUFjfMth5CKrxGQqoKcqc8HOPb1qyQUlZLifYqYVB1PJ5z/OqYuULmCK3UyBtqSqRuyT2q JWeqNEX763mnlSGbftIDEs3CnHPr/SohapZ3CmaZZI2AwqHdk+3X2qXVLe4luIYJJP3Ua53u x4PpmqhENlJKtwTMgxtCnP45Iq0hF6C/WYFrNcDZtJYglalhglvQZJdsYHHJwCf0rLi1YIXS zixG38Tck+3+NX4ma4jLzMkTFsBC/T6VnLyBXK995VojkqZj3AzwK/Pb4mXCz+KdWeLOxrmT BPX7xr791PV4LayuAI2l8pWLHtjHavzv8ZXYvtYu5AeJZmcZ9zmvQwStzP0OLF62R7N8GNNa x8MWk5ckySO2McEZxj8wa+lPCzxzWpjQHbkmNu5Hoa8I+Fts0ngnTF5+SPJB9yTXtvhGQCBe SufukHpXBUblOV2ddNcsUjshNvjw8SliMBwe9SLam3A84MI2OWDDIOf/ANdIlypt8SR7CcYc DJH1pu6TiKUHyzjIznH0/KoS0BFxhFbyhkPmjd0GRn86pXdx9rmCiMxLkkkMSKuTtHAAfNEg zx/nFZVzctdJtRVi/vEHINS/MRJbSLBc7YsMccsBmtD55lEnmpGzHO1jz9BWRYKFuD5TbsDJ Zf8A69bTKsgy5WBjwM96EjQuRsjxpLET5ijlSO/tVeeRluGkDESEfNjjIpLDeV+Q4lQlWU9/ epp7ZrpiWxHIqkgjjNKN+okZHjIuPBGszWzFZ1tZCGQ8qcV8PTcyM2Oc8ivtLxzBNL8P9ba1 z5v2Z+FHOccivimRiXb5u/cV9RlatCWvU+ezNXlFAgJYknj+VeX/ABybcNE44/f/APtOvTkJ HB6flXmPxx/5gn/bb/2nXs1/4TPPwS/2iL9fyZ9dr8pHFTaYN2owA9d449efWqxPv9a3fA+m Sat4u0q1iUvvuE3YGcLnk4r1KslGm2zxcOuarFLufbOkWirpdmwcGEKAox90Y4xWgQLjZGPk APXPJqojvBapFw0CEAYHSlDNICu0GLOScc1+UVJKUmfpcdi2Ds3oCBIvr3qpdlnJk2hAOoXm rTGJRtZ9pAyMVVl3SMNx4PcdxXO1Zo1eiK4giLSD+Pggj1q0JbiIAoFBxnrVNJVMskZwSOQR 3q8JpFG8KC+ORRJOxRieKJnTSJzt+ZQGYDtyOfyr8y/2sNRm1L42eIZZQyIHRY89NuwYx+tf pvr12G0S9x807RMVHUcjgV+VP7RL3J+KuurcOWLSI6knJClFI/Su/Bq9W9+hx4iXuWPOPxrf 8G6w2g67ZX6DPkSrIR6gHmuYUlR1zWlppxPGW5GcEete643ujyIyammfpp4R1iO4NrexqTbz JnknOCOPyrq7aXzb0rAHE7EkhjjI9M1598LSkukwtE+bfarQk8g8f/Xr0F5hFG8iwvHIx+V1 5xz06ewr5pq0rI+jWupHqUselF454xPcM24hiRjj27/WqL25ujG6yCM7cDzMf1qS9gaAtcSR h0TGFBz+HHvRckTwJImyDGQVwcfnnNLRdRtEf2kpG0ZG+MjGUXbn8abK0EO/yZG83bwGXAH/ ANf8Kdma3Igi2uo+bcASD7ZxxTINOhJfzVkV2+fYnQf4/lQpK2oW7lGEXShrqZmdOwdd24/j /wDXqG8eSVlllTzVT5RhQMfkB61sixECtM0qg56k7SP8+lZ91qBuGVftOY1JJ3tx+Xar5tAs NsE37pZ4mVXOwIn8X/1ufeti10JJ5hIZ1jjOCqHIK+3WseyvWuH3lS0S5AX7oPbOa2LS9mup lxDFEFXIZnOMfhjP51g5al2RtNbj7KsZVVUAjI4J+tVrofYZFy+6M/d8sqSPy6Vnz3NyEOJ/ MDcMFACjnpn8qiMtwrlvLSVMj5WYg009CeVF77QryMIwrxnJbzFDHOfxrEW1FvrbSyqGRudn OcH/ACKuC9lZ3kSFrcKCSB82fb/Ip+jlZtQaaeQO4XiMnms3K7uVbTQnuDJb5FuStuQMr0I7 EdBkfh2pjwxW7GHktjcOexrdaOEAvFGIVlG0gc8/lWTfWTWzMgYMQAQO9dKaMWrblJY9p3SO CBhGY/oaWZleKVHU+ehz6bsUmVdWaU/KQFdjkkU2T54pFG43CHJIPDDt/k1qk9yCK5vHuo1h KoJ8bvl27voR/U1h6pA1nFIZ12IDlFIwSfXGBWzNdPcwRuPlnX72AQCOO2TjpWNqkpurZzJO 2yPgZOSDnp1NVurEx30MCKSSSSWQt5duQNxPTH+f51aaWG32tFI0hA24OcL9OtQ2Sm586IKT AeOeQPelujBbSB4f3pdeSVOB+nNKOmhTV2QOWLZnOxANuSOeaq7izoxfEAGAvqanf98zSzsF B+UDGAeOtV2ZpQDvKQqOhHTik4saK1s3m3kiu3lW7Hd83IrXVrayAaPF1vHfCgc9+hrGtSn9 oiWRmEBBRcAZB9e38621jS03/ZokmDYOXB9Pb6+tJNdRsctzLKWltY3jiB5VPXj8x+Jq7HHL GnnvvIk+96f571QgF4N08ReJd2dqcgfXmrsUZVRKz4WQ4kwc4z29ulaPVEp6FhYrguI1dy2N 0Z7j2B7/AOeKVGupYJdxIKHkDv8ApUYh3kQtJtK/cO/AI9jTZQVdycrNEcEbsbsd6SWupm2R tHHOm65cGdsnZ+vXBFV1mPmrFDEUkyGDYyf8/hVgWVqFaXz18xfmK46Z98VBPcuZyYE/eKAG frxjk+mc1dklcE+he1GCS+EJeTY8akF3OM5Pr/8AXqi1zFbQmG6aSSVG2gKuTtq/BFJqMMRm KxkDku3B/E45qlOLb7RNHKpkdSQGAwFGOPyoWw7CWd9KqjyoU8pTuBb5gw/HOOn6VM2nlrN5 CURyMlS3zfhUNrc3EEfCgwFeFXoQe/fnv2qjqEu6EFpfQEA5YfhSEtWZnjHWFsvB2qPbRtJs tnwSfmztP8q/PvVphJf56gt2719t/F6/ng+F+staL9mZUBMoPJUsAR+Wa+G7ld18vqW4Ar0s OvcfmceJ+KNz65+E8SHQLUCM7Ps0a4J6fL1/WvUfCbCMNbuoyGwCD93/AD/WuB+FKINKtsph ZY1UDP3SOP6V6DpKrbahJHInDAc/jXlte8zsT91HYPO74GBjHXHT/GlMToi5k8yLG0qeo4pi 3L+QqOE2gdR1596cLd7fZvA5GC3Y01FWE3YmmlgjhDRsJQARs75yPWsm8uDMMeUsSjqwPFXr uGGMFhIJF9KxLl2kwHGxAenQH2qZLUI6q7NLRkwzNbknnJY1srGsgPntjdwNwrLsInjiLWuU GOmavQsJTuncRvn7p549alqyK8iSy3x3LbeSrYOc/MK1JFa/AXAWReQBWLYzOuoukZ3ADKsO jA1qRk3LbOAwGfl4zUrRaj2Zj6vprXOkalCpKTvE6sOnO018M3cJgupUbhgxBHpX6AXFh9uD 7WO/aVJzyRXwn40tDYeLdWt+B5V1IhH0Y19DlUviR4eZLSMjJVQoO4nOeleYfG85Gif9t/8A 2nXpeQznnHsK8z+N3/MFHp53/tOvoa/8Jnm4T/eYr1/Jn12Gz1P4V0/w01WXRvHWk3ERwfNV CMZyCQCPyrmlGeemK0fDrSxa5ZPEdsomTa2PuncOa9DEK9KS7o8HC3jVi/M+6Nqyp5iMwUjJ U+tWImV8FCCrL8wNJpsZm062c8uVBJ9eKnSMxgbBtctg5HFfk70k0j9OWqIJiiqgYHDjjb3p skTvGdx+UcjtxUrARNnIbHVc8/WiVGlhKjKKTwBzisepr0M23kj3MMZIGQw9fSkYXNxciVHZ EHylVOAfrTCCkuwLuU5ycdK0YBLCC6dcYbFavYlOxWniWJXzGWDLuBr8o/2oYxH8Xtack73K FgT0OP8ADFfrJIrQKSAXLAkKWzzX5RftVsj/ABc1Mf8ALUgGRv8AayePyxXbgre1WnQ5MTbk Z48jHGDxWhZYVlYdRyKzkJ4BH1Naliny8DjtX0EVqeE3qj7M/Zi8bXV/4ZFrlGazPl4Pdeoz +or6Gt9Uv76wZxEhjUc4wCMV8V/staqbPxPc25yBcRcLu4JU+n0Jr7Q0qKGRZFDYbAZTmvAx cFCoz6LDz9pBMZFK91Cd6bQOSOxp880/2cLLCqohyGNMMyRb4lTcBxv6Z/D8ala13QbpCAu7 nkHj0x1rzeZHWTRGdgrxDYw6qxAz6YqSRTaBvPJEznJ7n86lSeFIo1jiEL4zkdx+dJPJNtEc YWQkZ2r8wH1NK99hGDf7pZAFY7VHJA6mkh0sYaR9scK8Bn6k9a19sNnun1CQ7hwsUfy9v64r nNS1xL66MaOY4+VjXHbsKvr5DvroXxL58bJGSIFGTkenc1dhuIo7JcKF3NkHPJwKzbGzu47P zpmKwYwybvlIzn8afc3z3VwmYESFDgbeD+JpbBcux3E7N5cRLhuenP5EUh2SSlZGxIeqnnv7 dKS0Dy7lwIIwMbmO7P1NWbEWysyOpkJOQ5yB+H/6qpJBzWRMl1DJbGPyWidBuV1Of0qw0c6r CbktJGeIy39KmGhtLGZIj5kOOVxlR+PalFl9miR9wKDgqBuyKzlpsCZSkLR+Z5SmNfQ8g/X8 6hjvZAqJNh2KnEg4z9a0rhlmzsXyzjoeSf5VgXBjEvlZAkX+HP8AnFax2Il5FmKIx3BcgYJA G7p7UO6m1mkR2WRGyVAzkfWmW7okbpOdoGMMec9+alt5LaaBXG4jd82Pf3rojLUyloivePFO oeCLyJkHYk/XAOMevFczqrz3VuEupZJGiGd8hzwT612N1axysr2XyNn5gxB59eAK5XxOJWQL I0bPyzMgCZHv06U+ZPYUFpY5y1mky8PWHcO3Ax36VPe3Bt2j2lZXZeMAED9KbpxZrdlVRt35 3gc/nTr24iiddpVnIOcnPT86Iu2xVupWjlF6ZJLhliJ4xjrj0BFLJPHOkbEYhTkLjkmo1MUk bSSqBuJKgEc1Vv5bsKpMeYAcgDGPz709JasaJYCs96kjkiFT2rpIEa3MphRGiPJLjcT+J6Vx wv7oY8uMW8a8ljzuNbunX9/JbqqNHIm3GGQg5Pfiocb6jNi20i42efvMZfKnjgj0qGexjtnV iVEbfK+Dn86ljl1OJQHnhaNupCDIOPT/ABFSyu8kOwIsshPKkEH9KNtSdNjNNmplwtxwp+RV XIB/wq/DFHdrJM0n79AA6EHnB7H8+Kp5aAyboipHzErzimxX0QMcin5s7SGPWquyLXFuYoIm aYOSoONoGCaXTd7O0kQaFsZdxyc+g6H8qkLQzzBmty+MA5cj8OKlkubmzUm1jCR/wKMZx6HP 9B2rRO+hGwX0iyxCcOpc8YdtuTjsMjmufuNWgjVQQZZXJ3Ff4f0q41uHjdprkLKckphgPp6U 9IbJo1CxLgYAc9frVcyWxfqVA2oSRq8zCGAjbt7e/wCNOhtI2LNEfPdTgJjH4+4q7AtmrDlX RyQTnrV2N7JJRJG7lyoGw8AEdP51Cdt0HQ8D/afv7u08EwW7IiRzTbX2cZ2jr+tfIGmrJe6x CkKGRy4Cgeua+zf2qWS/8DSyZVXikUrkdecEf59K+Rvh3HnxrY89JMivTpvlpXXmedV96qk9 j65+HSmO2SEjY2Awz6/5xXo8koZ4pXUbwNr7ePoa5bwtZLLbo0WBMoDKcfe9a7CJWmSQBAWI IcY78V5lurPQSNyG4dIFWRVcY4YDkelWMbQhlTMbcnmsmxuJYoliOJIRwpx0q9ISIs+bkYwA Gzj68/0ppGbWpU1KWETsY38wjpxxmssM7zr9oBcZ4Spbu7jt8hFZn6DPI+tQ6Oh88y5DnsOo FTYq9tTpIHZkUW6bAR822pEiV5iJ+COA3eoYt8wbaACMZXOMikZiJMS5ZsYG080kxXLG0WWp Rm3bcrjIYdM1ZlMonQZ2tjKleM1T+QqjwkbD0J9a0pJHnjSNwDnnNKxZNZXAlUlTiUdcdSa+ IvikkkXjrWlm4l+1Pu/Ovs5rRoJ2idijdVY9xXx/8a7KSy+IeqJJ8zM4kDD+IEV7eV6TlqeT mEbwTOHWTB5Nea/Gtiy6LnGP32P/AByvRomB+8Oteb/Gnrowxj/Xcf8AfFfSV9KTR42D/wB5 j8/yZ9ibARgjJ9adayvbTqyEqwIIPoc0zzMt6Ckz26k9DXrvVWPn6crNWPrn4IeNbzxV4WCX Ay1q/ll88nAFejrcu06x7CAOQeleFfssMz2WtR5yishUZ6Hv/SvdgJWYAgYxyM81+Y4+lGni ZxR+kYSo6lGMpblkYDNuT5/QjrTdjNEATtJUdB3pYMxoO3PUjNNuA7SfONqf3lP9K8qKabR3 GWzLFdMvf3qdbllD5O0N1GKi1FQH3IoPHB7CoZBPcKxDbl4DAL+tdEl7tzK+pcu9mAHBbjge tfkh+01qkep/GnxLJEf3a3Hl8HIyAAf1r9X9SZ7LTXkbLfu26dSccV+QPxdlFz8RfEEi9JLu Rxn3au/LknUbOXFStDyOOibLYzW1ZrgLzxWMqdDkVt2bfd4yPSvpIpJnz8nrc9T+CV8NL8ca bNuKjcR14OQa+69Cnh3NbyYjDJuSRhkYI6V+e/hSWS31GykiAV1lXaffIr708OTS3eiWl0ED TINuc5rxs0haUZHuYGfNB36HQl2hneNRvCjrjrn0qIER/IzEOw3YxzUKaxtmU9HJ+bPUVFPP FBIHkYyO7ElQeV9K+fkrK563Nc3tOgk1W52umyNO4zwKtatq1roG9bZlecjJx2qC41Sa30Hc GK7sbePujNchcIbrAJADKQ27+Kptd6AmQte3WsztJMfNk3cKfugVd0uzit5Nrb2mJw2Bgjio bFDayNHboGfG7fjPPtmtCyiFu3lzRlpJOXAOOK1bsthEhhD27u8oAXhR0/SqMJMkLMxbZkkK xwOvaruoSWyRk79sa9FI6DpisSyuEmuX86QRwq3yEjqPb3oTVthXNxXadVMi+TEuCpX6frUr zFXAhkIAHO5f5UWhubuzEj4EQG0LnhfwpzqXG1YwFPIYZz6dKfkJ2ZJp+pyWLsJmIYjI3dwa 2oZoZ4d8chkIG4ptA/X0rn5rOKSPczb8Dkdx/hVOCW404skZ8yIYPzdRUctwRv3nmvMHjGwD uvFZNzGqSbnPz4zxyevetNdQku40Rn8yM8bwMbeKrXtr9mJJYShgcEEcURve3QV7EMcZfzo3 J6DNJHAnJt2aMhfmCnr+FNtpDIHBOTjqfyqSWFpZ1aEkOByBxn361u1qTcomOUlgJ/JccAsu ePw+lcf4nu7meQxl0k2/J8g2hh7Y6V24ZH8wyDynOFIx1/zmuHvI3e6kCKAgO00r2ALe2jt7 aCIPIJG6/Nwf8Kl8i0tZRkLLMRkE84FV7pZB8kKZYEjceh9eajRJbaYEDeVAOQMhfatVsNu5 cC2sVsxZPLyThAP84qncEvHHPs2jgDHTFV5rg5dpOJHOQoHSopppI40aeT5Rwqj26CjyIbGT ymbLOwRVAUAD71dPptxK1lGhXbGR949uP5Vyn2gXBaR/lUDgAcE+tdJoImuo1E7ARsOMj7tJ 2G3oXUWBGVmmDrux8nJNSmRFJktkZlGQQ7Z2j8Ka0cNlKu7Mylcjb/8AXqL7UIVDWsfzdH3c kfXtVabC3VwlkEw3LGBKMglBkfX3FUZYxKjSCISHbyANu33/AM+tX1lllLSRR+Uf4sc81HJN O+5o0AAGOOrGhJPRE3ZlNLdWShrdPOibnDc8iqEmvXxnIMcgQcbAOorci1F42ZtimPOHTvmp vtJUeZHGAr8429eeRTb12BPTUwW1C5uEBS12ovXc3OaydQvL2dvK4jUdEHX8cVvazqMU0TBx 5an+EtWNb3IB8wR+ZjnLdh2xVA32HWqXSqrF1hYkAAir0kzIpDzvvPdAAAPWizso7sK9xMXO 4sEzx0rSEsVtCwMaHI445H41ejY2fMn7TurXX2TTrbz5GiYOzAnrggLkfnXgPgHI8VWrIxVg +Vb0Ney/tLTzP4jELr+6WEbO/c15H8NVX/hKoQ2CMkfoa9XRUErdDynLmrWPsfwTq/yKHXaF Aw6mvSbCeNwJFf7wGRXj3hJZJNOEsbfc+Vl6/SvRdFugbcMRuUdc9jXi8tkepE6FbaUbijFo 2PIx0qo2leVHkSncmcktz1zSxXborGKYhc8qQaiuZZpOPkLd1INUthdSuU+1yeSke/JwX6V0 ljp0VpCogTJHB3KR0+tYUUskDqkciktxhV5H41vWwu0KsLgkk87kGKm/Lqx6FmSATsN6BSM9 OAai+yJE+3aZWPYNwPei+mu1IAljZWXjCYqGxvpoZCZoBLjgYbFTe+wi29m/kM8YwmMkdaks Z3mRYZiNz42vjFPbVIckYMIYYIcDB/GqkiPa3Ee9w0ZI2nsPalFa7D3NEwYmMLnK/wAJY9DX yx+01pDWHjS3uBgpNbqcg55BIr6sB89kSRi2OFY8gV80/tUadLFrOnSht0LQkDHQEMcivVy1 /v0edjVekzwgMQ/HIHIxXnHxpOf7GP8A12/9p16EG2Ny2a87+M2NujHGP9d/7JX1Nf8Ahs8L B/7zD5/kz7FCrg8bvSowMv6D1NSjpzTdoyckDvg17KPm4q9j239mTWFtNf1Gx3HfcxDbz12n mvpeEF3VSTuzlcdxXyD8ArnyPiVpg8xUD71bPQ5U19gR7fk+fcGBPXP4V8Bm9PkxHN3R9/lc 3LDpPoOePyVPzEr3BpWBAbjoOD/SkkdUwwOcn7vWpSVkRht4r57W57L2Me9QrG3lglW5I64p LNxtkLtyBggGrc8bGIMvGM/lVO7t0kjdkJEin73TNbvWJmvMyPGV0mn6HM8smYhGxBzyeOMV +RHxNbf451pu32uX/wBCNfpx8YTPpWhXV7PIHSKMsF3EjOO49K/MvX7KTU9XubuTAeeRpGHb JOa9bLYNyk0efjZLlSOVRMgFOa1rBunBzTv7KbPAq5bWLIowfwr31G0jwnJXOj8PT+TPBL18 tw35HNfbXwy8Rpf6OrW53W9wuQD1UiviPSYPLjyRXs3wk+JS+Fy1nfgtZuwKuvWM9/wrnxuG daF47o6sLiY0ajjJ6M+m9YhkniTe6qo5LDuKzvD2sR2uob7iFZ4egZucVVsvGHh/VLRtmoxy kL90Hrn+VcLr/wAXdB8PzTIrPcyDICQjIBHbPSvllh6lR8qifQ+2hFc0noe669dR3FinkSb4 WfeduNvpWUVDhAygKMkkDt714r8PvjPb6trM9vehLO3kXegeTgY7E17RZ+I7PV7FTBLBJE3I CsD/AC5qauGqUXZoKdWNRXixJp4YpoY4Fbc3LP0/CrMe6Asw2zyMfu53AD3Nc5N4l0qG68ue 8htn3nJaQBsd85qtf/FvwnotxJv1aOVos5EeTjnp05/CnGjUnpGLHKrFbs1dWkeV2e4xGAuQ vTPsBUeh2JuJZLidhFAnKr179q8z8R/tGaFduzRLPcBQcAIF3dcAV51rH7R3iG6iMdksNiqt 8rouWA/l0rsp5fXnurGFTGUobs+s5bi2idi9wsUMeANw/wAOtTpeKFBhlTYR1OMsPr2r4M1v 4ha7rkkb3ep3Em0YUCQgD8BVG18VavZuDDqFwhByMSHg13RyiTSblqcTzGD6H6CfJFsaNlds gmInkj/CpbmAXbEwoYnK5KDkn8a+BtN+I/iHSL2O6t9YulljI2lpSw/EHOa9R8PftW61YTw/ b7WG4hz85j+R8Hrjt+FYVcpqR1pu5tDHU5+R9LJavZ+Yw3eSH+ZM9R61e3xyI/JZWXhlPANc L4e+MvhzxbpyPDex21y67pILhtpGOoz0NdFDrUKSExYaJsNnsa8uVKdN2kjtjUjJXTuPgkw7 qBh85GK0TM1xITEN0mOijP41gSlnmeSPgE5FaVpO8rAqv70LyB3pyXYcdWPCidiPuHdn7uTW DqlubdwiAdeR6104VWDM7CBs916muY8R6gY7hljG5wcFyOvArNDRSuFjnKJHkHPJH+NMum+z BYIApkYAk56e3enqFW0iEZJm9cCiSH7MSdgMjjjcOg+lWloIyjCIV3FNzMevbOetVtTtNgjc g7mzge9akhihhcyMQ4JwOwpjptgS5dAp9T603YSRzM5MJjjb/XStwuO1dTayyWttGsrFE25+ Ycg+1cnPKbzV2mXG8Hj2rfiblftMm/aANinOO3rVtW1KNtLyJCCUafI6ggYFJJJyXt/3cWO3 OfrWPDfLC4zEHhzwT1wO9WYru4jBZPlj6DH8QxTtcS0RfkLuwljLbdoxg4GajePzcN5qiU9V P8hWVI7sWkQj5QN3zcj1qYXcTMjbmXbzsI5pcotWPcLlmVirKDuXPX6VE7TQoTFLuGP73TPq KlcwTZcAoeuOuRVfEchUsCFBwQO9OwtjCu7dZ7jaAWYnOSeDWlb6a7spmcbDj5E5BxUMsqTX aqEESA53t6Vda8WJsQAynaMCn5DRddA8YFvGEkx0PY1laqt7GjrI2fXaOT7VegSa8B80iIn+ Fj1NLeNFaIyM29gOMmmmD6nxj8Y7v7b4v1FGcsiuFCk/dIABH55riPA9v5Hii1YdC2K3fGty t94j1K4T7k1xI4Hp8xrP8MI0euWhQZJkAA/GvpalNex+R4amnVufSfgi4EAMIY7j05616Zoi sUAUFXBzt9fxrzPw/AlvfRDOEbBWvS9Ln2hSnD54znBNfMyV9T2UzcMQYsFhKMx5qtNDdSMA UIUn72MVpprS3KqskSwuDywHWrJvUD87duegPH4UkmikzLt7IQsrBSZPVvWtpLiSNkE+dp4z zxTZ5oti+V97/aqCZ2QKZydnY4yRWej0K3LOpTxQ+W0eZSe2OBVaKZ58qcRjrT22yIFibecH kDpVaJC85EknI4weOKT0Y0XVhQ48whgR68VHPE0SFQdyHDAMeB9KkSFEyhbHzcMORRGVYmJ8 A9m6giqWi0CwzT75GJjml8or/eOOO9eC/tL36SXGnQxMkg2ljtOcc17vcWEE27e2Meo4NfJH xpleLxzqFuHbyUcbVPAAIHSvYy2ClV5l0PNxztSa7nCrgliFyRXnnxmORo+P+m3H/fFehoME kHk1518ZPu6Pzk/vv/ZK+lrr90zwcJZYmKv3/Jn2LuPGOMcYoOWAOQPrTN/y460jEkgE8dQK 9ix83HuT2t/Ppl5Hc28rRSxkMHU4IIr3HwL+0h9iWKDxBG0qDGLmLG4D3HevBZPm3fqaglO9 SoOK4sThqWJjaoj0MNjKuGleD0Purwx8TND8YFYtOvYppsZ8rOGI+hrq2IRT3zyK/ObTdev/ AA7qEN3Z3EkE8R3I6MRg1718MP2liZWtvEsoEWP3c6jocdxXyWJyiVP3qTuj6vDZnCtpPRn0 1FKs0RXI3EE4Pf2qnb3ChyGU8H+71FZPhvxPY+Io1m064juIWzl0Odp9K20IxIxTBHQnjmvE nFqTUketF9Ty39oa0jvvCU9pbAvLcDYcdQO/0r8+tV0E295LEVAZWIr9NfFmlpeWM8kqInlI SAe59q/PLxRbga/fjlAszgD8TXuZNK8px6HkZnLljFnAy6UM/cx9BTDpoUBsYrqPs+33xxUE tqjnOMj16V9Lyps+a57sybW08sD0960Yoiq9hinCDsvSpFiZVx296dtSZS1uQO7wsCpKlj1z 1qpM7MSCDWm8WFGMmqbw4YBzyf0quUuM2ythtgIyCKt2es3mmENBcywn/YbFRvHxhTn3FQEb evNZOKlozojJrUkuNRuLiXzJJXdiclmOTUNxK8pyWyT3prYLgYIHWmiPac569qShZlc19xu1 sHGRQyblOPxqTDfd5HuDQcbOByO9W1Yh6ldYwTkg/Sn7Tt49akjjYtkZ5q9DZYTJ5HvxVJGb mlojMKcdCOKilUqPmP5V0BtYyhBGBVW409GQkZB9DVKGoufXUyhM0QUIeM5r0n4f/GHU/Dii znke6sywOyRixX6HqK88ltdg7iqp3xSAgkEd6561GNT3ZI6qdeUNYs++vDOq22saXHOhDRSx hlY+h6Vv2wDMCPmYDkV4F8APHVpfaFHo91dqt9DkKGIBZc5XH54r2+JzJIzRt86qMY6mvjMR RdKbifU0qilFMuTSJtbftjkJ5LdD/hXJatOJbsxxqGwfmOPyxXSiDfAzyyqjk4wepNc9IwaZ ljVeMglh+tcfK76I2uKBHa2gIJaQDABHH41UuldG809TnA7Z9qtYRYfmcKxGQprMu5gZS7yM VB5Gf5U4od0RKrXMrGQ8Fs9OpqfX5orDSlllBC4yADjdT7W5t7KNrm5bCY4AIH6mvDfi78bb KRDa6XMLl1JUMvKj3966aWHnUnojKpUjFas7fT7tFYzyMqFiScnit3TvEukozxPPDK+cFfNA bP0r4xu/GusXZkE2oTujEnYZDj8qyDqly0/mGV95Oc55r1o4DR3Z5jx0V0Pv43UbWhGE+YdM dPesq4un2uIp8gnaQDxXxzpfxQ8S6WJFj1W4+cYOX3Z/OprP4s+I7CUzJqM5Y9mO4fken4VP 1CUdmbxxkGrn11BEVORI7E8MuOtW4ZlLA+Ud6dBnj8q+WdO/aC8SWzr5kkUwyc70GfzFdtov 7S8bRJFqWnsrLwZoGGT+BrGeCqp9zRYqDeh7n/ay+YSkIXb14702TUTcyK8cYR8fMQODXm2i /GPw5rtyI5Lx7V2ZUUTIRkk4/rXotlDbzjck+4fwsp4rlnSlDdG8Zxk9GQXSNLOFc4BGOF61 oWcMkMe+FRscjBAzmqxgjRi8rMZCei4q5aC8khDK4WNfugVi0XzXLUdvvX52VJST8p71ha9c xRQSBlLkKQWPHbtW03lNCZGbDnuB+dcj4kle5t7lQvlx7TmRh0HrTgruwpPS58fa3GrandFe B5r4/M0zRyLPUrefAxG4bBHXmnX6BbuUZ3AMcN689ahtnYS5AyBX1/JzQ5T5ty5Z3PpC3VDb 2t4vTHIA5U13enS+baxnGG7Nn9a+eNM+LNxZWH2SW3SRduN5J4r2b4eeOtJ1bSI45LmJZv8A nm5AZfzr5uvhatJXktD3IVYz2Z2sRlD7J2IB/i61aWJIsusgYA9M81Tlmt4XHlzRyRHgbXBF WopIU2vG6yEHBAP8647W3N76GlZ3Syt5RG1j0yauTRDeu/LKc/L3zWV5iSnDMiPnhgavwPja 0hEg/wB7Oaz5epSdh0bNHMGifIzyD2FLqeXcSMdvy8ECiZEDxmH5DjBLHFSKPtEDCUk4HFRK N0UnqLp91FPEIpV5wQCB1okj2OAUKEZAx/Ks+3lIhaNM5QnDY5FWl1BrmIRuQZRyH9aa2LZZ gmhmgfzFIccFR3r5F+Ol6L7x/fHGBFiIA9wPX86+sTOXTcqYf2r5F+MUrzeP9WLjkS4wR7Cv dyxr2j9Dx8ybVJepxcYG7I6eleefGY5GjcY/13/slehx9T9O1ed/GT/mD8/89uP++K+hxCvS bPFwX+8Q+f5M+vEO4noRnilBPGfpimpgEBQeaaMhm7969hHzkHZDn259T65pjgBcg8+vrSMc uQRwR60xvvcdql7FqykVrnnPHWqMkRTJTvWi/wAzYPSoXUHI6GspI0i7NnY/CT4o3fw61Z5d 3mW0wCyxEZBAPX6ivtHwr4u07xRpkV/ZyJJbzLnryp9CO1fnjJCQeD3rY0HxprPhmUNYX01v tOcI5AJ9x3rxcZgI4j3k7M9/B5j7FctTVH314zmNtoN25bIER5A9q/Ovxac6/elOhlZv1r1H VP2jPEupaE9hNMkjMm0ybfm/GvHL2V57hpGy7Oclia5ctwNTDTlKfUrMMZTrwjGBWOQOKjK5 GPzqaQHaQBUXfjr3r29meHF2ZHtUN7+lG0l/1BoYDdg8H1qQDCg9aAvdjCm0jJ4NQywAsTwD VluV6Uu3cuGGRV9Ck7MzGj2bQp68YqIxE++PWtUwbvm6Y7etDW65yorOxtzmS1qSAe3qaiMT cYHAOa2HhAHXNQvabgOnSosVGehmCLcCOp70+K3JZQRWh9lA68HFSLDtXb2z6UJdx89lZFeO 0IZTgYFWUjI7jB/OnKoX5R1oYE4yMVquyMHuNZcN2xjvUUp4B6e2amI5PvTGjDgkinez1Gt9 SB4lcDtn1qjcWqFSRV9wM7c84zio3VT8pHXvilY0gzKtrufTpleCVldDwR1H416R4O/aE1zw 6dl67ahAMBfMbDDnnnr+def3FqoUlRn3rNltiw2jg1hVownpJXR20sTOHwn1roH7RHhnW7VP tMrabcM+14puQvuCKivfjp4WsPkW9Sd2BJ2qxH6V8hPG0bZy3FRSykkHJB715Ly6k3dHpxx0 7arU+ldY+P8ApMVvMYy9zMFLLjgE9hnFeXaz8etbv5H8kx2y/wAOwEke/JrzR29T+BqBiA2M ZBrSlhKUFaxlPFzmrG7rXjnW9dx9u1K4ulByA7kgfQdK56aVnZmP5mlOOW7U3g/Q11uKWxyu bl1IwGYZJ4pCoPTOKewG0jpz0oCjPHLVVr6maWo05wMcUxxx1qVl3MASc00xqo68+tSVcaiF cc5pzgjGDTgnP16+1LKgUg9fSgUW7DVlZXGCcj0rqtD+I+teH5Fe21CYDG0ozblb6g1ybABs 55pWQ5HHvUSipaM0jUas09j2iL9o/VzbKslpbNIBjeVPP4ZqvJ+0NryzK0aQLGDyu05P45ry BGAzu45qVTk8ciso4an1iX9aqNWue92v7Sks8K/atPiyBj5GNZPiX47XOsafcWUECxJMhUuD 0HtxXjoGDjOD7U+OksLSvzKJo8VUStcmmYyncxxmn244+Xj1qA4OBnFWYs7eea70rHI5BJHz nOB7VKk0kP3WI+hxQRgimnk4PTtSkrjjI0bbX76BvkvJUI54citzTfibrdhIubyWRDwQ7E5F ceBgnjrUihcYP51lKlFr3lc0VWS1TPU4fi6+Iy/nb24O1uK6nQvi4hTY1+Ym64lGRXgwHPJw al37GJyQcVyvBUmtNDWONnHRs+nYviDcXcYAuoJTyQQRz+IpR8T5dP8AnkmgcAdGfp+tfMK3 80AGx2H0NJJfTOmS7Hn1rm/s5X+I6VmCT2PprT/jPp8N863ciBXOcR8jNdToXiuw1eVvsco+ Yh0+vcV8crIzgljn61q6H4rvvD93HNaTMpRgdvUHHtSll0Le4y1mDb95aH2l58kwYjAPevkT 4mvLJ421TzslxOwOfr/hivW/DHxz02/gSPUg9nchcF05Vz/SvGfHF5Hf+I725iYtHK5cE9qr A0J0JyU0Z46rGpTXKzEAy23PvXnPxm+7o3PP77P/AI5XosZJzkcV538aFAOjkHOfO/8AZK9a v/BZ5mCd8TH5/kz64U7eQcUBuSR3FRI2TliOnBp4faSMV7Gx86noJIQRgD6GowcDJ6nkilYY GRk96jLMVBPU8Yot1K8xrKGY84zUZHyYByM8mnBsEHBGKQ/PwcYqGtRw1TIZASp+nFQPEQo5 was5PToKZk5OBn3qbX0NYLUzZVOT8vI71UlXLHaOfWtOQcnnH1qlMpUdcGo