| Kernel v2.4.13-ac2 /mm/shmem.c |
|---|
 2.4.13-ac2
 mm
 shmem.c
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/mm/shmem.c linux.ac/mm/shmem.c
--- linux.vanilla/mm/shmem.c Thu Oct 25 16:26:39 2001
+++ linux.ac/mm/shmem.c Sun Oct 21 18:54:37 2001
@@ -47,10 +47,15 @@
LIST_HEAD (shmem_inodes);
static spinlock_t shmem_ilock = SPIN_LOCK_UNLOCKED;
-atomic_t shmem_nrpages = ATOMIC_INIT(0); /* Not used right now */
+atomic_t shmem_nrpages = ATOMIC_INIT(0);
#define BLOCKS_PER_PAGE (PAGE_CACHE_SIZE/512)
+static void shmem_removepage(struct page *page)
+{
+ atomic_dec(&shmem_nrpages);
+}
+
/*
* shmem_recalc_inode - recalculate the size of an inode
*
@@ -386,10 +391,11 @@
spin_unlock (&info->lock);
return 0;
found:
- delete_from_swap_cache(page);
add_to_page_cache(page, info->inode->i_mapping, offset + idx);
+ atomic_inc(&shmem_nrpages);
SetPageDirty(page);
SetPageUptodate(page);
+ UnlockPage(page);
info->swapped--;
spin_unlock(&info->lock);
return 1;
@@ -465,6 +471,7 @@
* Add page back to page cache, unref swap, try again.
*/
add_to_page_cache_locked(page, mapping, index);
+ atomic_inc(&shmem_nrpages);
spin_unlock(&info->lock);
swap_free(swap);
goto getswap;
@@ -531,8 +538,10 @@
if (!page) {
swp_entry_t swap = *entry;
spin_unlock (&info->lock);
+ lock_kernel();
swapin_readahead(*entry);
page = read_swap_cache_async(*entry);
+ unlock_kernel();
if (!page) {
if (entry->val != swap.val)
goto repeat;
@@ -587,6 +596,7 @@
}
/* We have the page */
+ atomic_inc(&shmem_nrpages);
SetPageUptodate(page);
if (info->locked)
page_cache_get(page);
@@ -1351,6 +1361,7 @@
static struct address_space_operations shmem_aops = {
+ removepage: shmem_removepage,
writepage: shmem_writepage,
};
|