[kernel] r5733 - in dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian: . patches patches/series

Simon Horman horms at costa.debian.org
Wed Feb 8 03:14:46 UTC 2006


Author: horms
Date: Wed Feb  8 03:14:43 2006
New Revision: 5733

Added:
   dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-bad-inodes.diff
Modified:
   dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog
   dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-13
Log:
  * [XFS] fix handling of bad inodes
    This patch is needed for 194_xfs-inode-race.diff which was included in
    2.4.27-12
    194_xfs-bad-inodes.diff
    (closes: #343970)


Modified: dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog
==============================================================================
--- dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog	(original)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog	Wed Feb  8 03:14:43 2006
@@ -35,7 +35,13 @@
     See CVE-2004-2607
     200_net_sdla_xfer_leak.diff
 
- -- Simon Horman <horms at verge.net.au>  Fri,  6 Jan 2006 14:58:06 +0900
+  * [XFS] fix handling of bad inodes
+    This patch is needed for 194_xfs-inode-race.diff which was included in
+    2.4.27-12
+    194_xfs-bad-inodes.diff
+    (closes: #343970)
+
+ -- Simon Horman <horms at debian.org>  Wed,  8 Feb 2006 12:05:39 +0900
 
 kernel-source-2.4.27 (2.4.27-12) unstable; urgency=low
 

Added: dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-bad-inodes.diff
==============================================================================
--- (empty file)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-bad-inodes.diff	Wed Feb  8 03:14:43 2006
@@ -0,0 +1,246 @@
+# Debian
+# Date: Fri, 14 Oct 2005 16:20:27 +0900
+# Maintainer: Horms <horms at debian.org>
+# Changes: Mnone
+# Reported: http://lists.debian.org/debian-kernel/2005/10/msg00410.html
+# Notes: Does not seem to related to 2.6
+# Security: CAN-NOMATCH
+# Notes: Required by 194_xfs-inode-race.diff
+#
+# Upstream
+# Fixed-In: 2.4.29-pre1
+# ChangeLog: http://www.kernel.org/pub/linux/kernel/v2.4/ChangeLog-2.4.29
+# Patch: # http://linux.bkbits.net:8080/linux-2.4/cset@1.1448.45.8?nav=index.html|src/|src/fs|src/fs/xfs|src/fs/xfs/linux-2.4|related/fs/xfs/linux-2.4/xfs_vnode.h
+
+
+diff -Naru a/fs/xfs/linux-2.4/xfs_iops.c b/fs/xfs/linux-2.4/xfs_iops.c
+--- a/fs/xfs/linux-2.4/xfs_iops.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/linux-2.4/xfs_iops.c	2006-02-07 18:59:35 -08:00
+@@ -173,8 +173,9 @@
+ 				 */
+ 				teardown.d_inode = ip = LINVFS_GET_IP(vp);
+ 				teardown.d_name = dentry->d_name;
+-				remove_inode_hash(ip);
+-				make_bad_inode(ip);
++
++				vn_mark_bad(vp);
++
+ 				if (S_ISDIR(mode))
+ 					VOP_RMDIR(dvp, &teardown, NULL, err2);
+ 				else
+diff -Naru a/fs/xfs/linux-2.4/xfs_super.c b/fs/xfs/linux-2.4/xfs_super.c
+--- a/fs/xfs/linux-2.4/xfs_super.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/linux-2.4/xfs_super.c	2006-02-07 18:59:35 -08:00
+@@ -129,8 +129,7 @@
+ 	vnode_t			*vp = LINVFS_GET_VP(inode);
+ 
+ 	if (vp->v_type == VNON) {
+-		remove_inode_hash(inode);
+-		make_bad_inode(inode);
++		vn_mark_bad(vp);
+ 	} else if (S_ISREG(inode->i_mode)) {
+ 		inode->i_op = &linvfs_file_inode_operations;
+ 		inode->i_fop = &linvfs_file_operations;
+@@ -211,20 +210,16 @@
+ 		bhv_insert(VN_BHV_HEAD(vp), inode_bhv);
+ 	}
+ 
+-	vp->v_type = IFTOVT(ip->i_d.di_mode);
+-
+-	/* Have we been called during the new inode create process,
+-	 * in which case we are too early to fill in the Linux inode.
+-	 */
+-	if (vp->v_type == VNON)
+-		return;
+-
+-	xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
+-
+-	/* For new inodes we need to set the ops vectors,
+-	 * and unlock the inode.
++	/*
++	 * We need to set the ops vectors, and unlock the inode, but if
++	 * we have been called during the new inode create process, it is
++	 * too early to fill in the Linux inode.  We will get called a
++	 * second time once the inode is properly set up, and then we can
++	 * finish our work.
+ 	 */
+-	if (unlock && (inode->i_state & I_NEW)) {
++	if (ip->i_d.di_mode != 0 && unlock && (inode->i_state & I_NEW)) {
++		vp->v_type = IFTOVT(ip->i_d.di_mode);
++		xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
+ 		xfs_set_inodeops(inode);
+ 		unlock_new_inode(inode);
+ 	}
+diff -Naru a/fs/xfs/linux-2.4/xfs_vnode.c b/fs/xfs/linux-2.4/xfs_vnode.c
+--- a/fs/xfs/linux-2.4/xfs_vnode.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/linux-2.4/xfs_vnode.c	2006-02-07 18:59:35 -08:00
+@@ -186,8 +186,7 @@
+ 	 * returning NULL here is OK.
+ 	 */
+ 	if (inode->i_state & I_NEW) {
+-		remove_inode_hash(inode);
+-		make_bad_inode(inode);
++		vn_mark_bad(vp);
+ 		unlock_new_inode(inode);
+ 		iput(inode);
+ 		return NULL;
+diff -Naru a/fs/xfs/linux-2.4/xfs_vnode.h b/fs/xfs/linux-2.4/xfs_vnode.h
+--- a/fs/xfs/linux-2.4/xfs_vnode.h	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/linux-2.4/xfs_vnode.h	2006-02-07 18:59:35 -08:00
+@@ -594,6 +594,23 @@
+ 		(LINVFS_GET_IP(vp)->i_ctime = (__int32_t)(tvp)->tv_sec)
+ 
+ /*
++ * Dealing with bad inodes
++ */
++static inline void vn_mark_bad(struct vnode *vp)
++{
++	struct inode *inode = LINVFS_GET_IP(vp);
++
++	remove_inode_hash(inode);
++	make_bad_inode(inode);
++}
++
++static inline int VN_BAD(struct vnode *vp)
++{
++	return is_bad_inode(LINVFS_GET_IP(vp));
++}
++
++
++/*
+  * Some useful predicates.
+  */
+ #define	VN_MAPPED(vp)	((LINVFS_GET_IP(vp)->i_mapping->i_mmap != NULL) || \
+diff -Naru a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
+--- a/fs/xfs/xfs_iget.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/xfs_iget.c	2006-02-07 18:59:35 -08:00
+@@ -457,8 +457,7 @@
+ 			error = xfs_iget_core(vp, mp, tp, ino,
+ 						lock_flags, ipp, bno);
+ 			if (error) {
+-				remove_inode_hash(inode);
+-				make_bad_inode(inode);
++				vn_mark_bad(vp);
+ 				if (inode->i_state & I_NEW)
+ 					unlock_new_inode(inode);
+ 				iput(inode);
+@@ -582,12 +581,8 @@
+ 
+ 	vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address);
+ 
+-	/* We shouldn't get here without this being true, but just in case */
+-	if (inode->i_state & I_NEW) {
+-		remove_inode_hash(inode);
+-		make_bad_inode(inode);
++	if (inode->i_state & I_NEW)
+ 		unlock_new_inode(inode);
+-	}
+ 	if (lock_flags)
+ 		xfs_iunlock(ip, lock_flags);
+ 	VN_RELE(vp);
+diff -Naru a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c
+--- a/fs/xfs/xfs_vfsops.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/xfs_vfsops.c	2006-02-07 18:59:35 -08:00
+@@ -1053,6 +1053,11 @@
+ 			continue;
+ 		}
+ 
++		if (VN_BAD(vp)) {
++			ip = ip->i_mnext;
++			continue;
++		}
++
+ 		if (XFS_FORCED_SHUTDOWN(mp) && !(flags & SYNC_CLOSE)) {
+ 			XFS_MOUNT_IUNLOCK(mp);
+ 			kmem_free(ipointer, sizeof(xfs_iptr_t));
+diff -Naru a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
+--- a/fs/xfs/xfs_vnodeops.c	2006-02-07 18:59:35 -08:00
++++ b/fs/xfs/xfs_vnodeops.c	2006-02-07 18:59:35 -08:00
+@@ -1611,7 +1611,7 @@
+ 	 * If the inode is already free, then there can be nothing
+ 	 * to clean up here.
+ 	 */
+-	if (ip->i_d.di_mode == 0) {
++	if (ip->i_d.di_mode == 0 || VN_BAD(vp)) {
+ 		ASSERT(ip->i_df.if_real_bytes == 0);
+ 		ASSERT(ip->i_df.if_broot_bytes == 0);
+ 		return VN_INACTIVE_CACHE;
+@@ -3808,11 +3808,17 @@
+ 	vnode_t		*vp;
+ 
+ 	vp = BHV_TO_VNODE(bdp);
++	ip = XFS_BHVTOI(bdp);
+ 
+ 	vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
+ 
+ 	ASSERT(!VN_MAPPED(vp));
+-	ip = XFS_BHVTOI(bdp);
++
++	/* bad inode, get out here ASAP */
++	if (VN_BAD(vp)) {
++		xfs_ireclaim(ip);
++		return 0;
++	}
+ 
+ 	if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) {
+ 		if (ip->i_d.di_size > 0) {
+@@ -3890,8 +3896,12 @@
+ 	int		sync_mode)
+ {
+ 	xfs_ihash_t	*ih = ip->i_hash;
++	vnode_t		*vp = XFS_ITOV_NULL(ip);
+ 	int		error;
+ 
++	if (vp && VN_BAD(vp))
++		return 0;
++
+ 	/* The hash lock here protects a thread in xfs_iget_core from
+ 	 * racing with us on linking the inode back with a vnode.
+ 	 * Once we have the XFS_IRECLAIM flag set it will not touch
+@@ -3899,8 +3909,7 @@
+ 	 */
+ 	write_lock(&ih->ih_lock);
+ 	if ((ip->i_flags & XFS_IRECLAIM) ||
+-	    (!(ip->i_flags & XFS_IRECLAIMABLE) &&
+-	      (XFS_ITOV_NULL(ip) == NULL))) {
++	    (!(ip->i_flags & XFS_IRECLAIMABLE) && vp == NULL)) {
+ 		write_unlock(&ih->ih_lock);
+ 		if (locked) {
+ 			xfs_ifunlock(ip);
+# This is a BitKeeper generated diff -Nru style patch.
+#
+# ChangeSet
+#   2004/09/28 14:46:52+10:00 hch at sgi.com 
+#   [XFS] fix handling of bad inodes
+#   
+#   SGI Modid: xfs-linux:xfs-kern:179634a
+#   Signed-off-by: Nathan Scott <nathans at sgi.com>
+# 
+# fs/xfs/linux-2.4/xfs_iops.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +3 -2
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/linux-2.4/xfs_super.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +10 -15
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/linux-2.4/xfs_vnode.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +1 -2
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/linux-2.4/xfs_vnode.h
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +17 -0
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/xfs_iget.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +2 -7
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/xfs_vfsops.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +5 -0
+#   [XFS] fix handling of bad inodes
+# 
+# fs/xfs/xfs_vnodeops.c
+#   2004/09/28 14:46:45+10:00 hch at sgi.com +13 -4
+#   [XFS] fix handling of bad inodes
+# 

Modified: dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-13
==============================================================================
--- dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-13	(original)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-13	Wed Feb  8 03:14:43 2006
@@ -2,3 +2,4 @@
 + 198_fs-lock-lease-log-spam.diff
 + 199_net-ipv6-flowlabel-refcnt.diff
 + 200_net_sdla_xfer_leak.diff
++ 194_xfs-bad-inodes.diff



More information about the Kernel-svn-changes mailing list