Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.4.27 /mm/shmem.c

Filename:/mm/shmem.c
Lines Added:25
Lines Deleted:12
Also changed in: (Previous) 2.4.27-rc6  2.4.27-rc5  2.4.27-rc4  2.4.27-rc3  2.4.27-rc2  2.4.27-rc1 
(Following) 2.4.28-pre4-bk1  2.4.28-pre4-bk2  2.4.28-pre4-bk3  2.4.28-pre4-bk4  2.4.28-pre4-bk5  2.4.28-pre4-bk6 

Location
[  2.4.27
  [  mm
     o  shmem.c

Patch

diff -urN linux-2.4.26/mm/shmem.c linux-2.4.27/mm/shmem.c
--- linux-2.4.26/mm/shmem.c   2003-11-28 10:26:21.000000000 -0800
+++ linux-2.4.27/mm/shmem.c   2004-08-07 16:26:06.508422959 -0700
@@ -86,7 +86,7 @@
 
 static void shmem_removepage(struct page *page)
 {
-   if (!PageLaunder(page))
+   if (!PageLaunder(page) && !PageError(page))
       shmem_free_block(page->mapping->host);
 }
 
@@ -626,8 +626,11 @@
    swp_entry_t swap;
    int error = 0;
 
-   if (idx >= SHMEM_MAX_INDEX)
-      return -EFBIG;
+   if (idx >= SHMEM_MAX_INDEX) {
+      error = -EFBIG;
+      goto failed;
+   }
+
    /*
     * Normally, filepage is NULL on entry, and either found
     * uptodate immediately, or allocated and zeroed, or read
@@ -781,18 +784,24 @@
    }
 done:
    if (!*pagep) {
-      if (filepage) {
+      if (filepage)
          UnlockPage(filepage);
-         *pagep = filepage;
-      } else
-         *pagep = ZERO_PAGE(0);
+      else
+         filepage = ZERO_PAGE(0);
+      *pagep = filepage;
    }
+   if (PageError(filepage))
+      ClearPageError(filepage);
    return 0;
 
 failed:
-   if (*pagep != filepage) {
-      UnlockPage(filepage);
-      page_cache_release(filepage);
+   if (filepage) {
+      if (*pagep == filepage)
+         SetPageError(filepage);
+      else {
+         UnlockPage(filepage);
+         page_cache_release(filepage);
+      }
    }
    return error;
 }
@@ -1042,9 +1051,13 @@
    struct inode *inode = filp->f_dentry->d_inode;
    struct address_space *mapping = inode->i_mapping;
    unsigned long index, offset;
+   loff_t pos = *ppos;
+
+   if (unlikely(pos < 0))
+      return;
 
-   index = *ppos >> PAGE_CACHE_SHIFT;
-   offset = *ppos & ~PAGE_CACHE_MASK;
+   index = pos >> PAGE_CACHE_SHIFT;
+   offset = pos & ~PAGE_CACHE_MASK;
 
    for (;;) {
       struct page *page = NULL;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.