Re: test13-pre3

From: Christoph Rohland (cr@sap.com)
Date: Mon Dec 18 2000 - 09:34:10 EST


Hi Linus,

On Sun, 17 Dec 2000, Linus Torvalds wrote:
> The shmfs cleanup should be unnoticeable except to users who use SAP
> with huge shared memory segments, where Christoph Rohlands work not
> only makes the code much more readable, it should also make it
> dependable..

 :-)

The appended patch fixes the following:

1) We cannot unlock the page in shmem_writepage on ooswap since
   page_launder will do this later.

2) We should set the inode number of SYSV segments to the (user) shmid
   and not the internal id.

Greetings
                Christoph

diff -uNr 4-13-3/mm/shmem.c c/mm/shmem.c
--- 4-13-3/mm/shmem.c Mon Dec 18 15:08:32 2000
+++ c/mm/shmem.c Mon Dec 18 15:13:10 2000
@@ -210,37 +210,39 @@
 {
         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;
- 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;
-
         /*
          * 1 means "cannot write out".
          * We can't drop dirty pages
          * just because we ran out of
          * swap.
          */
- error = 1;
- *entry = __get_swap_page(2);
- if (!entry->val)
+ 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) {
+ __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++;
diff -uNr 4-13-3/ipc/shm.c c/ipc/shm.c
--- 4-13-3/ipc/shm.c Mon Dec 18 15:08:32 2000
+++ c/ipc/shm.c Mon Dec 18 15:13:58 2000
@@ -220,7 +220,7 @@
         shp->shm_segsz = size;
         shp->id = shm_buildid(id,shp->shm_perm.seq);
         shp->shm_file = file;
- file->f_dentry->d_inode->i_ino = id;
+ file->f_dentry->d_inode->i_ino = shp->id;
         file->f_op = &shm_file_operations;
         shm_tot += numpages;
         shm_unlock (id);
-
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/



This archive was generated by hypermail 2b29 : Sat Dec 23 2000 - 21:00:21 EST