Marcelo Tosatti <[EMAIL PROTECTED]> writes:

> Christoph is already looking at it and should have a fix soon.

Here it comes against 13-pre4 ...

We cannot call delete_from_swap_cache, it was called already in
try_to_unuse.

There is still a race when we page in the page which is
just freed in try_to_unuse. I am not sure how to fix this.

Also the add_to_page_cache forgot the offset  :-(

Greetings
                Christoph

--- 4-13-4/mm/shmem.c   Fri Dec 22 10:05:38 2000
+++ m4-13-4/mm/shmem.c  Fri Dec 22 10:47:11 2000
@@ -761,14 +761,16 @@
        swp_entry_t **base, **ptr;
        unsigned long idx;
        int offset;
+       struct shmem_inode_info *info = &inode->u.shmem_i;
        
        idx = 0;
-       if ((offset = shmem_clear_swp (entry, inode->u.shmem_i.i_direct, 
SHMEM_NR_DIRECT)) >= 0)
+       spin_lock (&info->lock);
+       if ((offset = shmem_clear_swp (entry,info->i_direct, SHMEM_NR_DIRECT)) >= 0)
                goto found;
 
        idx = SHMEM_NR_DIRECT;
-       if (!(base = inode->u.shmem_i.i_indirect))
-               return 0;
+       if (!(base = info->i_indirect))
+               goto out;
 
        for (ptr = base; ptr < base + ENTRIES_PER_PAGE; ptr++) {
                if (*ptr &&
@@ -776,16 +778,16 @@
                        goto found;
                idx += ENTRIES_PER_PAGE;
        }
+out:
+       spin_unlock (&info->lock);
        return 0;
 found:
-       delete_from_swap_cache (page);
-       add_to_page_cache (page, inode->i_mapping, idx);
+       add_to_page_cache (page, inode->i_mapping, offset + idx);
        SetPageDirty (page);
        SetPageUptodate (page);
        UnlockPage (page);
-       spin_lock (&inode->u.shmem_i.lock);
-       inode->u.shmem_i.swapped--;
-       spin_unlock (&inode->u.shmem_i.lock);
+       info->swapped--;
+       spin_unlock (&info->lock);
        return 1;
 }
 

-
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