r4449 - 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
Fri Oct 14 07:27:20 UTC 2005


Author: horms
Date: 2005-10-14 07:27:18 +0000 (Fri, 14 Oct 2005)
New Revision: 4449

Added:
   dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-inode-race.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-12
Log:
[SECURITY] XFS: Handle inode creation race

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	2005-10-14 06:43:10 UTC (rev 4448)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog	2005-10-14 07:27:18 UTC (rev 4449)
@@ -79,8 +79,13 @@
     [SECURITY] Avoid 'names_cache' memory leak with CONFIG_AUDITSYSCALL
     From 2.6.13.4
 
- -- Simon Horman <horms at debian.org>  Tue, 11 Oct 2005 19:46:58 +0900
+  * 194_xfs-inode-race.diff
+    [SECURITY] XFS: Handle inode creation race
+    CAN-NOMATCH
+    Links in Patch file
 
+ -- Simon Horman <horms at debian.org>  Fri, 14 Oct 2005 16:23:08 +0900
+
 kernel-source-2.4.27 (2.4.27-11) unstable; urgency=low
 
   [ Simon Horman ]

Added: dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-inode-race.diff
===================================================================
--- dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-inode-race.diff	2005-10-14 06:43:10 UTC (rev 4448)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/194_xfs-inode-race.diff	2005-10-14 07:27:18 UTC (rev 4449)
@@ -0,0 +1,461 @@
+# Debian
+# Date: Fri, 14 Oct 2005 16:20:27 +0900
+# Maintainer: Horms <horms at debian.org>
+# Changes: Minor Backport
+# Reported: http://lists.debian.org/debian-kernel/2005/10/msg00410.html
+# Notes: Does not seem to related to 2.6
+# Security: CAN-NOMATCH
+#
+# 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.21?nav=index.html|src/|src/fs|src/fs/xfs|related/fs/xfs/xfs_inode.c
+
+--- from-0001/fs/xfs/linux-2.4/xfs_ioctl.c
++++ to-work/fs/xfs/linux-2.4/xfs_ioctl.c	2005-10-14 16:01:02.000000000 +0900
+@@ -276,7 +276,7 @@ xfs_vget_fsop_handlereq(
+ 	/*
+ 	 * Get the XFS inode, building a vnode to go with it.
+ 	 */
+-	error = xfs_iget(mp, NULL, ino, XFS_ILOCK_SHARED, &ip, 0);
++	error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
+ 	if (error)
+ 		return error;
+ 	if (ip == NULL)
+--- from-0001/fs/xfs/linux-2.4/xfs_super.c
++++ to-work/fs/xfs/linux-2.4/xfs_super.c	2005-10-14 16:01:02.000000000 +0900
+@@ -226,6 +226,10 @@ xfs_initialize_vnode(
+ 	 */
+ 	if (unlock && (inode->i_state & I_NEW)) {
+ 		xfs_set_inodeops(inode);
++
++		ip->i_flags &= ~XFS_INEW;
++		barrier();
++
+ 		unlock_new_inode(inode);
+ 	}
+ }
+--- from-0001/fs/xfs/quota/xfs_qm.c
++++ to-work/fs/xfs/quota/xfs_qm.c	2005-10-14 16:01:02.000000000 +0900
+@@ -1765,7 +1765,7 @@ xfs_qm_dqusage_adjust(
+ 	 * the case in all other instances. It's OK that we do this because
+ 	 * quotacheck is done only at mount time.
+ 	 */
+-	if ((error = xfs_iget(mp, NULL, ino, XFS_ILOCK_EXCL, &ip, bno))) {
++	if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) {
+ 		*res = BULKSTAT_RV_NOTHING;
+ 		return (error);
+ 	}
+@@ -1980,14 +1980,14 @@ xfs_qm_init_quotainos(
+ 		    mp->m_sb.sb_uquotino != NULLFSINO) {
+ 			ASSERT(mp->m_sb.sb_uquotino > 0);
+ 			if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
+-					     0, &uip, 0)))
++					     0, 0, &uip, 0)))
+ 				return XFS_ERROR(error);
+ 		}
+ 		if (XFS_IS_GQUOTA_ON(mp) &&
+ 		    mp->m_sb.sb_gquotino != NULLFSINO) {
+ 			ASSERT(mp->m_sb.sb_gquotino > 0);
+ 			if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
+-					     0, &gip, 0))) {
++					     0, 0, &gip, 0))) {
+ 				if (uip)
+ 					VN_RELE(XFS_ITOV(uip));
+ 				return XFS_ERROR(error);
+--- from-0001/fs/xfs/quota/xfs_qm_syscalls.c
++++ to-work/fs/xfs/quota/xfs_qm_syscalls.c	2005-10-14 16:01:02.000000000 +0900
+@@ -404,7 +404,7 @@ xfs_qm_scall_trunc_qfiles(
+ 	}
+ 
+ 	if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) {
+-		error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, &qip, 0);
++		error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip, 0);
+ 		if (! error) {
+ 			(void) xfs_truncate_file(mp, qip);
+ 			VN_RELE(XFS_ITOV(qip));
+@@ -412,7 +412,7 @@ xfs_qm_scall_trunc_qfiles(
+ 	}
+ 
+ 	if ((flags & XFS_DQ_GROUP) && mp->m_sb.sb_gquotino != NULLFSINO) {
+-		error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, &qip, 0);
++		error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0);
+ 		if (! error) {
+ 			(void) xfs_truncate_file(mp, qip);
+ 			VN_RELE(XFS_ITOV(qip));
+@@ -555,11 +555,13 @@ xfs_qm_scall_getqstat(
+ 		gip = mp->m_quotainfo->qi_gquotaip;
+ 	}
+ 	if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) {
+-		if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, &uip, 0) == 0)
++		if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
++					0, 0, &uip, 0) == 0)
+ 			tempuqip = B_TRUE;
+ 	}
+ 	if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) {
+-		if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, &gip, 0) == 0)
++		if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
++					0, 0, &gip, 0) == 0)
+ 			tempgqip = B_TRUE;
+ 	}
+ 	if (uip) {
+@@ -1326,7 +1328,7 @@ xfs_qm_internalqcheck_adjust(
+ 	ipreleased = B_FALSE;
+  again:
+ 	lock_flags = XFS_ILOCK_SHARED;
+-	if ((error = xfs_iget(mp, NULL, ino, lock_flags, &ip, bno))) {
++	if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip, bno))) {
+ 		*res = BULKSTAT_RV_NOTHING;
+ 		return (error);
+ 	}
+--- from-0001/fs/xfs/xfs_iget.c
++++ to-work/fs/xfs/xfs_iget.c	2005-10-14 16:02:49.000000000 +0900
+@@ -169,6 +169,7 @@ xfs_iget_core(
+ 	xfs_mount_t	*mp,
+ 	xfs_trans_t	*tp,
+ 	xfs_ino_t	ino,
++	uint		flags,
+ 	uint		lock_flags,
+ 	xfs_inode_t	**ipp,
+ 	xfs_daddr_t	bno)
+@@ -180,7 +181,6 @@ xfs_iget_core(
+ 	ulong		version;
+ 	int		error;
+ 	/* REFERENCED */
+-	int		newnode;
+ 	xfs_chash_t	*ch;
+ 	xfs_chashlist_t	*chl, *chlnew;
+ 	SPLDECL(s);
+@@ -193,11 +193,22 @@ again:
+ 
+ 	for (ip = ih->ih_next; ip != NULL; ip = ip->i_next) {
+ 		if (ip->i_ino == ino) {
++			/*
++			 * If INEW is set this inode is being set up
++			 * we need to pause and try again.
++			 */
++			if (ip->i_flags & XFS_INEW) {
++				read_unlock(&ih->ih_lock);
++				delay(1);
++				XFS_STATS_INC(xs_ig_frecycle);
+ 
+-			inode_vp = XFS_ITOV_NULL(ip);
++				goto again;
++			}
+ 
++			inode_vp = XFS_ITOV_NULL(ip);
+ 			if (inode_vp == NULL) {
+-				/* If IRECLAIM is set this inode is
++				/*
++				 * If IRECLAIM is set this inode is
+ 				 * on its way out of the system,
+ 				 * we need to pause and try again.
+ 				 */
+@@ -250,14 +261,15 @@ again:
+ 			XFS_STATS_INC(xs_ig_found);
+ 
+ finish_inode:
+-			if (lock_flags != 0) {
+-				xfs_ilock(ip, lock_flags);
+-			}
+-
+-			newnode = (ip->i_d.di_mode == 0);
+-			if (newnode) {
++			if (ip->i_d.di_mode == 0) {
++				if (!(flags & IGET_CREATE))
++					return ENOENT;
+ 				xfs_iocore_inode_reinit(ip);
+ 			}
++	
++			if (lock_flags != 0)
++				xfs_ilock(ip, lock_flags);
++
+ 			ip->i_flags &= ~XFS_ISTALE;
+ 
+ 			vn_trace_exit(vp, "xfs_iget.found",
+@@ -293,6 +305,11 @@ finish_inode:
+ 	if (lock_flags != 0) {
+ 		xfs_ilock(ip, lock_flags);
+ 	}
++		
++	if ((ip->i_d.di_mode == 0) && !(flags & IGET_CREATE)) {
++		xfs_idestroy(ip);
++		return ENOENT;
++	}
+ 
+ 	/*
+ 	 * Put ip on its hash chain, unless someone else hashed a duplicate
+@@ -324,6 +341,7 @@ finish_inode:
+ 	ih->ih_next = ip;
+ 	ip->i_udquot = ip->i_gdquot = NULL;
+ 	ih->ih_version++;
++	ip->i_flags |= XFS_INEW;
+ 
+ 	write_unlock(&ih->ih_lock);
+ 
+@@ -404,8 +422,6 @@ finish_inode:
+ 
+ 	XFS_MOUNT_IUNLOCK(mp);
+ 
+-	newnode = 1;
+-
+  return_ip:
+ 	ASSERT(ip->i_df.if_ext_max ==
+ 	       XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t));
+@@ -434,6 +450,7 @@ xfs_iget(
+ 	xfs_mount_t	*mp,
+ 	xfs_trans_t	*tp,
+ 	xfs_ino_t	ino,
++	uint		flags,
+ 	uint		lock_flags,
+ 	xfs_inode_t	**ipp,
+ 	xfs_daddr_t	bno)
+@@ -454,8 +471,8 @@ retry:
+ 		if (inode->i_state & I_NEW) {
+ inode_allocate:
+ 			vn_initialize(inode);
+-			error = xfs_iget_core(vp, mp, tp, ino,
+-						lock_flags, ipp, bno);
++			error = xfs_iget_core(vp, mp, tp, ino, flags,
++					lock_flags, ipp, bno);
+ 			if (error) {
+ 				remove_inode_hash(inode);
+ 				make_bad_inode(inode);
+@@ -582,6 +599,11 @@ xfs_iput_new(xfs_inode_t	*ip,
+ 
+ 	vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address);
+ 
++	if ((ip->i_d.di_mode == 0)) {
++		ASSERT(!(ip->i_flags & XFS_IRECLAIMABLE));
++		vn_mark_bad(vp);
++	}
++
+ 	/* We shouldn't get here without this being true, but just in case */
+ 	if (inode->i_state & I_NEW) {
+ 		remove_inode_hash(inode);
+--- from-0001/fs/xfs/xfs_inode.c
++++ to-work/fs/xfs/xfs_inode.c	2005-10-14 16:01:02.000000000 +0900
+@@ -1156,7 +1156,8 @@ xfs_ialloc(
+ 	 * This is because we're setting fields here we need
+ 	 * to prevent others from looking at until we're done.
+ 	 */
+-	error = xfs_trans_iget(tp->t_mountp, tp, ino, XFS_ILOCK_EXCL, &ip);
++	error = xfs_trans_iget(tp->t_mountp, tp, ino,
++			IGET_CREATE, XFS_ILOCK_EXCL, &ip);
+ 	if (error != 0) {
+ 		return error;
+ 	}
+--- from-0001/fs/xfs/xfs_inode.h
++++ to-work/fs/xfs/xfs_inode.h	2005-10-14 16:01:02.000000000 +0900
+@@ -381,6 +381,7 @@ void xfs_ifork_next_set(xfs_inode_t *ip,
+ #define XFS_IRECLAIM    0x0008  /* we have started reclaiming this inode    */
+ #define XFS_ISTALE	0x0010	/* inode has been staled */
+ #define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */
++#define XFS_INEW	0x0040
+ 
+ /*
+  * Flags for inode locking.
+@@ -465,6 +466,9 @@ xfs_inode_t *xfs_bhvtoi(struct bhv_desc 
+ /*
+  * xfs_iget.c prototypes.
+  */
++
++#define IGET_CREATE	1
++
+ void		xfs_ihash_init(struct xfs_mount *);
+ void		xfs_ihash_free(struct xfs_mount *);
+ void		xfs_chash_init(struct xfs_mount *);
+@@ -473,7 +477,7 @@ xfs_inode_t	*xfs_inode_incore(struct xfs
+ 				  struct xfs_trans *);
+ void            xfs_inode_lock_init(xfs_inode_t *, struct vnode *);
+ int		xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
+-			 uint, xfs_inode_t **, xfs_daddr_t);
++			 uint, uint, xfs_inode_t **, xfs_daddr_t);
+ void		xfs_iput(xfs_inode_t *, uint);
+ void		xfs_iput_new(xfs_inode_t *, uint);
+ void		xfs_ilock(xfs_inode_t *, uint);
+--- from-0001/fs/xfs/xfs_itable.c
++++ to-work/fs/xfs/xfs_itable.c	2005-10-14 16:01:02.000000000 +0900
+@@ -102,7 +102,7 @@ xfs_bulkstat_one(
+ 		/* We're not being passed a pointer to a dinode.  This happens
+ 		 * if BULKSTAT_FG_IGET is selected.  Do the iget.
+ 		 */
+-		error = xfs_iget(mp, NULL, ino, XFS_ILOCK_SHARED, &ip, bno);
++		error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, bno);
+ 		if (error) {
+ 			*stat = BULKSTAT_RV_NOTHING;
+ 			return error;
+--- from-0001/fs/xfs/xfs_log_recover.c
++++ to-work/fs/xfs/xfs_log_recover.c	2005-10-14 16:01:02.000000000 +0900
+@@ -3251,7 +3251,7 @@ xlog_recover_process_iunlinks(
+ 				xfs_buf_relse(agibp);
+ 
+ 				ino = XFS_AGINO_TO_INO(mp, agno, agino);
+-				error = xfs_iget(mp, NULL, ino, 0, &ip, 0);
++				error = xfs_iget(mp, NULL, ino, 0, 0, &ip, 0);
+ 				ASSERT(error || (ip != NULL));
+ 
+ 				if (!error) {
+--- from-0001/fs/xfs/xfs_mount.c
++++ to-work/fs/xfs/xfs_mount.c	2005-10-14 16:01:02.000000000 +0900
+@@ -976,7 +976,7 @@ xfs_mountfs(
+ 	 * Get and sanity-check the root inode.
+ 	 * Save the pointer to it in the mount structure.
+ 	 */
+-	error = xfs_iget(mp, NULL, sbp->sb_rootino, XFS_ILOCK_EXCL, &rip, 0);
++	error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0);
+ 	if (error) {
+ 		cmn_err(CE_WARN, "XFS: failed to read root inode");
+ 		goto error3;
+--- from-0001/fs/xfs/xfs_rtalloc.c
++++ to-work/fs/xfs/xfs_rtalloc.c	2005-10-14 16:01:02.000000000 +0900
+@@ -149,7 +149,7 @@ xfs_growfs_rt_alloc(
+ 		/*
+ 		 * Lock the inode.
+ 		 */
+-		if ((error = xfs_trans_iget(mp, tp, ino, XFS_ILOCK_EXCL, &ip)))
++		if ((error = xfs_trans_iget(mp, tp, ino, 0, XFS_ILOCK_EXCL, &ip)))
+ 			goto error_exit;
+ 		XFS_BMAP_INIT(&flist, &firstblock);
+ 		/*
+@@ -189,7 +189,7 @@ xfs_growfs_rt_alloc(
+ 			/*
+ 			 * Lock the bitmap inode.
+ 			 */
+-			if ((error = xfs_trans_iget(mp, tp, ino, XFS_ILOCK_EXCL,
++			if ((error = xfs_trans_iget(mp, tp, ino, 0, XFS_ILOCK_EXCL,
+ 					&ip)))
+ 				goto error_exit;
+ 			/*
+@@ -2040,7 +2040,7 @@ xfs_growfs_rt(
+ 		/*
+ 		 * Lock out other callers by grabbing the bitmap inode lock.
+ 		 */
+-		if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino,
++		if ((error = xfs_trans_iget(mp, tp, 0, mp->m_sb.sb_rbmino,
+ 				XFS_ILOCK_EXCL, &ip)))
+ 			goto error_exit;
+ 		ASSERT(ip == mp->m_rbmip);
+@@ -2055,7 +2055,7 @@ xfs_growfs_rt(
+ 		 * Get the summary inode into the transaction.
+ 		 */
+ 		if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino,
+-				XFS_ILOCK_EXCL, &ip)))
++				0, XFS_ILOCK_EXCL, &ip)))
+ 			goto error_exit;
+ 		ASSERT(ip == mp->m_rsumip);
+ 		/*
+@@ -2175,7 +2175,7 @@ xfs_rtallocate_extent(
+ 	/*
+ 	 * Lock out other callers by grabbing the bitmap inode lock.
+ 	 */
+-	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, XFS_ILOCK_EXCL, &ip);
++	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, XFS_ILOCK_EXCL, &ip);
+ 	if (error) {
+ 		return error;
+ 	}
+@@ -2238,7 +2238,7 @@ xfs_rtfree_extent(
+ 	/*
+ 	 * Synchronize by locking the bitmap inode.
+ 	 */
+-	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, XFS_ILOCK_EXCL, &ip);
++	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, XFS_ILOCK_EXCL, &ip);
+ 	if (error) {
+ 		return error;
+ 	}
+@@ -2346,12 +2346,12 @@ xfs_rtmount_inodes(
+ 	sbp = &mp->m_sb;
+ 	if (sbp->sb_rbmino == NULLFSINO)
+ 		return 0;
+-	error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, &mp->m_rbmip, 0);
++	error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip, 0);
+ 	if (error)
+ 		return error;
+ 	ASSERT(mp->m_rbmip != NULL);
+ 	ASSERT(sbp->sb_rsumino != NULLFSINO);
+-	error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, &mp->m_rsumip, 0);
++	error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip, 0);
+ 	if (error) {
+ 		vnode_t		*rbmvp;		/* vnode for bitmap file */
+ 		vmap_t		vmap;		/* vmap to delete vnode */
+@@ -2388,7 +2388,7 @@ xfs_rtpick_extent(
+ 	__uint64_t	seq;		/* sequence number of file creation */
+ 	__uint64_t	*seqp;		/* pointer to seqno in inode */
+ 
+-	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, XFS_ILOCK_EXCL, &ip);
++	error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, XFS_ILOCK_EXCL, &ip);
+ 	if (error)
+ 		return error;
+ 	ASSERT(ip == mp->m_rbmip);
+--- from-0001/fs/xfs/xfs_trans.h
++++ to-work/fs/xfs/xfs_trans.h	2005-10-14 16:01:02.000000000 +0900
+@@ -1007,7 +1007,7 @@ void		xfs_trans_stale_inode_buf(xfs_tran
+ void		xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint);
+ void		xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *);
+ int		xfs_trans_iget(struct xfs_mount *, xfs_trans_t *,
+-			       xfs_ino_t , uint, struct xfs_inode **);
++			       xfs_ino_t , uint, uint, struct xfs_inode **);
+ void		xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint);
+ void		xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *);
+ void		xfs_trans_ihold_release(xfs_trans_t *, struct xfs_inode *);
+--- from-0001/fs/xfs/xfs_trans_inode.c
++++ to-work/fs/xfs/xfs_trans_inode.c	2005-10-14 16:01:02.000000000 +0900
+@@ -95,6 +95,7 @@ xfs_trans_iget(
+ 	xfs_mount_t	*mp,
+ 	xfs_trans_t	*tp,
+ 	xfs_ino_t	ino,
++	uint		flags,
+ 	uint		lock_flags,
+ 	xfs_inode_t	**ipp)
+ {
+@@ -106,9 +107,8 @@ xfs_trans_iget(
+ 	 * If the transaction pointer is NULL, just call the normal
+ 	 * xfs_iget().
+ 	 */
+-	if (tp == NULL) {
+-		return (xfs_iget(mp, NULL, ino, lock_flags, ipp, 0));
+-	}
++	if (tp == NULL)
++		return xfs_iget(mp, NULL, ino, flags, lock_flags, ipp, 0);
+ 
+ 	/*
+ 	 * If we find the inode in core with this transaction
+@@ -148,7 +148,7 @@ xfs_trans_iget(
+ 	}
+ 
+ 	ASSERT(lock_flags & XFS_ILOCK_EXCL);
+-	error = xfs_iget(tp->t_mountp, tp, ino, lock_flags, &ip, 0);
++	error = xfs_iget(tp->t_mountp, tp, ino, flags, lock_flags, &ip, 0);
+ 	if (error) {
+ 		return error;
+ 	}
+@@ -186,7 +186,6 @@ xfs_trans_iget(
+ 	return 0;
+ }
+ 
+-
+ /*
+  * Add the locked inode to the transaction.
+  * The inode must be locked, and it cannot be associated with any
+--- from-0001/fs/xfs/xfs_utils.c
++++ to-work/fs/xfs/xfs_utils.c	2005-10-14 16:01:02.000000000 +0900
+@@ -110,7 +110,7 @@ xfs_dir_lookup_int(
+ 		 * reservation in the inactive routine.
+ 		 */
+ 		xfs_iunlock(dp, lock_mode);
+-		error = xfs_iget(dp->i_mount, NULL, *inum, 0, ipp, 0);
++		error = xfs_iget(dp->i_mount, NULL, *inum, 0, 0, ipp, 0);
+ 		xfs_ilock(dp, lock_mode);
+ 
+ 		if (error) {
+--- from-0001/fs/xfs/xfs_vfsops.c
++++ to-work/fs/xfs/xfs_vfsops.c	2005-10-14 16:03:37.000000000 +0900
+@@ -1585,7 +1585,7 @@ xfs_vget(
+ 		return XFS_ERROR(EINVAL);
+ 	}
+ 	mp = XFS_BHVTOM(bdp);
+-	error = xfs_iget(mp, NULL, ino, XFS_ILOCK_SHARED, &ip, 0);
++	error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
+ 	if (error) {
+ 		*vpp = NULL;
+ 		return error;

Modified: dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-12
===================================================================
--- dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-12	2005-10-14 06:43:10 UTC (rev 4448)
+++ dists/trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-12	2005-10-14 07:27:18 UTC (rev 4449)
@@ -10,3 +10,4 @@
 + 191_build_foo.diff
 + 192_orinoco-info-leak.diff
 + 193_plug-names_cache-memleak.diff
++ 194_xfs-inode-race.diff




More information about the Kernel-svn-changes mailing list