Re: set_page_dirty/page_launder deadlock

David S. Miller (davem@redhat.com)
Sun, 14 Jan 2001 05:27:45 -0800 (PST)


Marcelo Tosatti writes:
>
> While taking a look at page_launder()...

...

> set_page_dirty() may lock the pagecache_lock which means potential
> deadlock since we have the pagemap_lru_lock locked.

Indeed, the following should work as a fix:

--- mm/vmscan.c.~1~ Thu Jan 11 02:22:19 2001
+++ mm/vmscan.c Sun Jan 14 05:26:17 2001
@@ -493,12 +493,15 @@
page_cache_release(page);

/* And re-start the thing.. */
- spin_lock(&pagemap_lru_lock);
- if (result != 1)
+ if (result != 1) {
+ spin_lock(&pagemap_lru_lock);
continue;
- /* writepage refused to do anything */
- set_page_dirty(page);
- goto page_active;
+ } else {
+ /* writepage refused to do anything */
+ set_page_dirty(page);
+ spin_lock(&pagemap_lru_lock);
+ goto page_active;
+ }
}

/*
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/