On Thu, 20 Feb 2003, Hugh Dickins wrote:
>
> But that raises the doubt: maybe 2.4 won't get any Self-destruct
> message, but when prune_icache calls dispose_list calls clear_inode
> and destroy_inode, there could be a reference to freed super_block?
Which triggers the realization that my original patch was wrong for
this very reason: 2.5 prune_icache must hold iprune_sem until _after_
its dispose_list, and invalidate_inodes might as well do the same:
--- 2.5.62/fs/inode.c Mon Feb 10 20:12:50 2003
+++ linux/fs/inode.c Thu Feb 20 20:13:30 2003
@@ -81,6 +81,11 @@
spinlock_t inode_lock = SPIN_LOCK_UNLOCKED;
/*
+ * A semaphore to delay invalidate_inodes while prune_icache is busy.
+ */
+static DECLARE_MUTEX(iprune_sem);
+
+/*
* Statistics gathering..
*/
struct inodes_stat_t inodes_stat;
@@ -320,6 +325,7 @@
int busy;
LIST_HEAD(throw_away);
+ down(&iprune_sem);
spin_lock(&inode_lock);
busy = invalidate_list(&inode_in_use, sb, &throw_away);
busy |= invalidate_list(&inode_unused, sb, &throw_away);
@@ -328,6 +334,7 @@
spin_unlock(&inode_lock);
dispose_list(&throw_away);
+ up(&iprune_sem);
return busy;
}
@@ -395,6 +402,7 @@
int nr_scanned;
unsigned long reap = 0;
+ down(&iprune_sem);
spin_lock(&inode_lock);
for (nr_scanned = 0; nr_scanned < nr_to_scan; nr_scanned++) {
struct inode *inode;
@@ -429,7 +437,10 @@
}
inodes_stat.nr_unused -= nr_pruned;
spin_unlock(&inode_lock);
+
dispose_list(&freeable);
+ up(&iprune_sem);
+
if (current_is_kswapd)
mod_page_state(kswapd_inodesteal, reap);
else
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Sun Feb 23 2003 - 22:00:31 EST