Linus Torvalds <[EMAIL PROTECTED]> writes:
> The only comment I have is that as far as I can tell, your shm_writepage()
> has a small bug: if "__get_swap_page()" fails, we can't just drop the
> dirty page in question, so instead of returning -ENOMEM we should really
> return a "1" to tell the VM to keep the page dirty.

Right, here comes the (incremental) patch

        Christoph

diff -uNr c/mm/shmem.c c1/mm/shmem.c
--- c/mm/shmem.c        Sun Dec 17 21:31:46 2000
+++ c1/mm/shmem.c       Sun Dec 17 21:35:08 2000
@@ -210,31 +210,33 @@
 {
        int error;
        struct shmem_inode_info *info;
-       swp_entry_t *entry;
+       swp_entry_t *entry, swap;
 
        info = &((struct inode *)page->mapping->host)->u.shmem_i;
        if (info->locked)
                return 1;
+       swap = __get_swap_page(2);
+       if (!swap.val)
+               return 1;
+
        spin_lock(&info->lock);
        entry = shmem_swp_entry (info, page->index);
        if (!entry)     /* this had been allocted on page allocation */
                BUG();
        error = -EAGAIN;
-       if (entry->val)
-               goto out;
-
-       error = -ENOMEM;
-       *entry = __get_swap_page(2);
-       if (!entry->val)
+       if (entry->val) {
+                __swap_free(swap, 2);
                goto out;
+        }
 
+        *entry = swap;
        error = 0;
        /* Remove the from the page cache */
        lru_cache_del(page);
        remove_inode_page(page);
 
        /* Add it to the swap cache */
-       add_to_swap_cache(page,*entry);
+       add_to_swap_cache(page, swap);
        page_cache_release(page);
        SetPageDirty(page);
        info->swapped++;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to