packages (LINUX_3_0): kernel/kernel-small_fixes.patch - xfs fixes (will be ...

arekm arekm at pld-linux.org
Tue Dec 13 07:23:59 CET 2011


Author: arekm                        Date: Tue Dec 13 06:23:59 2011 GMT
Module: packages                      Tag: LINUX_3_0
---- Log message:
- xfs fixes (will be in 3.0.14 probably)

---- Files affected:
packages/kernel:
   kernel-small_fixes.patch (1.43.2.11 -> 1.43.2.12) 

---- Diffs:

================================================================
Index: packages/kernel/kernel-small_fixes.patch
diff -u packages/kernel/kernel-small_fixes.patch:1.43.2.11 packages/kernel/kernel-small_fixes.patch:1.43.2.12
--- packages/kernel/kernel-small_fixes.patch:1.43.2.11	Fri Dec  9 21:20:44 2011
+++ packages/kernel/kernel-small_fixes.patch	Tue Dec 13 07:23:54 2011
@@ -963,3 +963,150 @@
 1.7.4.1
 
 
+Subject: [PATCH 1/2] xfs: fix nfs export of 64-bit inodes numbers on 32-bit
+	kernels
+
+commit c29f7d457ac63311feb11928a866efd2fe153d74 upstream.
+
+The i_ino field in the VFS inode is of type unsigned long and thus can't
+hold the full 64-bit inode number on 32-bit kernels.  We have the full
+inode number in the XFS inode, so use that one for nfs exports.  Note
+that I've also switched the 32-bit file handles types to it, just to make
+the code more consistent and copy & paste errors less likely to happen.
+
+Reported-by: Guoquan Yang <ygq51 at hotmail.com>
+Reported-by: Hank Peng <pengxihan at gmail.com>
+Signed-off-by: Christoph Hellwig <hch at lst.de>
+Signed-off-by: Ben Myers <bpm at sgi.com>
+
+diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c
+index f4f878f..fed3f3c 100644
+--- a/fs/xfs/linux-2.6/xfs_export.c
++++ b/fs/xfs/linux-2.6/xfs_export.c
+@@ -98,22 +98,22 @@ xfs_fs_encode_fh(
+ 	switch (fileid_type) {
+ 	case FILEID_INO32_GEN_PARENT:
+ 		spin_lock(&dentry->d_lock);
+-		fid->i32.parent_ino = dentry->d_parent->d_inode->i_ino;
++		fid->i32.parent_ino = XFS_I(dentry->d_parent->d_inode)->i_ino;
+ 		fid->i32.parent_gen = dentry->d_parent->d_inode->i_generation;
+ 		spin_unlock(&dentry->d_lock);
+ 		/*FALLTHRU*/
+ 	case FILEID_INO32_GEN:
+-		fid->i32.ino = inode->i_ino;
++		fid->i32.ino = XFS_I(inode)->i_ino;
+ 		fid->i32.gen = inode->i_generation;
+ 		break;
+ 	case FILEID_INO32_GEN_PARENT | XFS_FILEID_TYPE_64FLAG:
+ 		spin_lock(&dentry->d_lock);
+-		fid64->parent_ino = dentry->d_parent->d_inode->i_ino;
++		fid64->parent_ino = XFS_I(dentry->d_parent->d_inode)->i_ino;
+ 		fid64->parent_gen = dentry->d_parent->d_inode->i_generation;
+ 		spin_unlock(&dentry->d_lock);
+ 		/*FALLTHRU*/
+ 	case FILEID_INO32_GEN | XFS_FILEID_TYPE_64FLAG:
+-		fid64->ino = inode->i_ino;
++		fid64->ino = XFS_I(inode)->i_ino;
+ 		fid64->gen = inode->i_generation;
+ 		break;
+ 	}
+
+_______________________________________________
+xfs mailing list
+xfs at oss.sgi.com
+http://oss.sgi.com/mailman/listinfo/xfs
+Subject: [PATCH 2/2] xfs: avoid synchronous transactions when deleting attr
+	blocks
+
+commit 859f57ca00805e6c482eef1a7ab073097d02c8ca upstream.
+
+[slightly different from the upstream version because of a previous cleanup]
+
+Currently xfs_attr_inactive causes a synchronous transactions if we are
+removing a file that has any extents allocated to the attribute fork, and
+thus makes XFS extremely slow at removing files with out of line extended
+attributes. The code looks a like a relict from the days before the busy
+extent list, but with the busy extent list we avoid reusing data and attr
+extents that have been freed but not commited yet, so this code is just
+as superflous as the synchronous transactions for data blocks.
+    
+Signed-off-by: Christoph Hellwig <hch at lst.de>
+Reported-by: Bernd Schubert <bernd.schubert at itwm.fraunhofer.de>
+Reviewed-by: Dave Chinner <dchinner at redhat.com>
+Signed-off-by: Alex Elder <aelder at sgi.com>
+
+diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c
+index 01d2072..99d4011 100644
+--- a/fs/xfs/xfs_attr.c
++++ b/fs/xfs/xfs_attr.c
+@@ -822,17 +822,9 @@ xfs_attr_inactive(xfs_inode_t *dp)
+ 	error = xfs_attr_root_inactive(&trans, dp);
+ 	if (error)
+ 		goto out;
+-	/*
+-	 * signal synchronous inactive transactions unless this
+-	 * is a synchronous mount filesystem in which case we
+-	 * know that we're here because we've been called out of
+-	 * xfs_inactive which means that the last reference is gone
+-	 * and the unlink transaction has already hit the disk so
+-	 * async inactive transactions are safe.
+-	 */
+-	if ((error = xfs_itruncate_finish(&trans, dp, 0LL, XFS_ATTR_FORK,
+-				(!(mp->m_flags & XFS_MOUNT_WSYNC)
+-				 ? 1 : 0))))
++
++	error = xfs_itruncate_finish(&trans, dp, 0LL, XFS_ATTR_FORK, 0);
++	if (error)
+ 		goto out;
+ 
+ 	/*
+diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
+index e546a33..a175933 100644
+--- a/fs/xfs/xfs_bmap.c
++++ b/fs/xfs/xfs_bmap.c
+@@ -3785,19 +3785,11 @@ xfs_bmap_compute_maxlevels(
+  * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi
+  * caller.  Frees all the extents that need freeing, which must be done
+  * last due to locking considerations.  We never free any extents in
+- * the first transaction.  This is to allow the caller to make the first
+- * transaction a synchronous one so that the pointers to the data being
+- * broken in this transaction will be permanent before the data is actually
+- * freed.  This is necessary to prevent blocks from being reallocated
+- * and written to before the free and reallocation are actually permanent.
+- * We do not just make the first transaction synchronous here, because
+- * there are more efficient ways to gain the same protection in some cases
+- * (see the file truncation code).
++ * the first transaction.
+  *
+  * Return 1 if the given transaction was committed and a new one
+  * started, and 0 otherwise in the committed parameter.
+  */
+-/*ARGSUSED*/
+ int						/* error */
+ xfs_bmap_finish(
+ 	xfs_trans_t		**tp,		/* transaction pointer addr */
+diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
+index c6888a4..5715279 100644
+--- a/fs/xfs/xfs_inode.c
++++ b/fs/xfs/xfs_inode.c
+@@ -1528,15 +1528,7 @@ xfs_itruncate_finish(
+ 				xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
+ 			}
+ 		}
+-	} else if (sync) {
+-		ASSERT(!(mp->m_flags & XFS_MOUNT_WSYNC));
+-		if (ip->i_d.di_anextents > 0)
+-			xfs_trans_set_sync(ntp);
+ 	}
+-	ASSERT(fork == XFS_DATA_FORK ||
+-		(fork == XFS_ATTR_FORK &&
+-			((sync && !(mp->m_flags & XFS_MOUNT_WSYNC)) ||
+-			 (sync == 0 && (mp->m_flags & XFS_MOUNT_WSYNC)))));
+ 
+ 	/*
+ 	 * Since it is possible for space to become allocated beyond
+
+_______________________________________________
+xfs mailing list
+xfs at oss.sgi.com
+http://oss.sgi.com/mailman/listinfo/xfs
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-small_fixes.patch?r1=1.43.2.11&r2=1.43.2.12&f=u



More information about the pld-cvs-commit mailing list