xfs
[Top] [All Lists]

[PATCH 2/2] Fix i_state of inode is changed after the inode is freed [tr

To: Nathan Scott <nathans@xxxxxxx>, David Chinner <dgc@xxxxxxx>
Subject: [PATCH 2/2] Fix i_state of inode is changed after the inode is freed [try #2]
From: Masayuki Saito <m-saito@xxxxxxxxxxxxxx>
Date: Wed, 23 Aug 2006 20:14:45 +0900
Cc: xfs@xxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
Fix i_state of the inode is changed after the inode is freed.

Signed-off-by: Masayuki Saito <m-saito@xxxxxxxxxxxxxx>
Signed-off-by: ASANO Masahiro <masano@xxxxxxxxxxxxxx>
---

--- linux-2.6.17.7/fs/xfs/xfs_inode.c.orig      2006-08-21 20:15:58.385211286 
+0900
+++ linux-2.6.17.7/fs/xfs/xfs_inode.c   2006-08-21 21:21:22.277033371 +0900
@@ -2751,18 +2751,30 @@ xfs_iunpin(
                 * call as the inode reclaim may be blocked waiting for
                 * the inode to become unpinned.
                 */
+               int need_iput = 0;
+               struct inode *inode;
+               spin_lock(&ip->i_flags_lock);
                if (!(ip->i_flags & (XFS_IRECLAIM|XFS_IRECLAIMABLE))) {
                        vnode_t *vp = XFS_ITOV_NULL(ip);
 
                        /* make sync come back and flush this inode */
                        if (vp) {
-                               struct inode    *inode = vn_to_inode(vp);
+                               inode = vn_to_inode(vp);
 
-                               if (!(inode->i_state & I_NEW))
-                                       mark_inode_dirty_sync(inode);
+                               if (!(inode->i_state &
+                                               (I_NEW|I_FREEING|I_CLEAR))) {
+                                       inode = igrab(inode);
+                                       if (inode) {
+                                               need_iput = 1;
+                                               mark_inode_dirty_sync(inode);
+                                       }
+                               }
                        }
                }
+               spin_unlock(&ip->i_flags_lock);
                wake_up(&ip->i_ipin_wait);
+               if (need_iput)
+                       iput(inode);
        }
 }


<Prev in Thread] Current Thread [Next in Thread>