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

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

Advertisement

Kernel v2.4.1-pre6 /mm/shmem.c

Filename:/mm/shmem.c
Lines Added:29
Lines Deleted:16
Also changed in: (Previous) 2.4.1-pre4  2.4.1-pre5  2.4.0-ac9  2.4.0-ac7  2.4.0-ac8  2.4.0-ac6 
(Following) 2.4.1-pre7  2.4.1-pre8  2.4.1-pre9  2.4.1-pre10  2.4.1-pre11  2.4.1-pre12 

Location
[  2.4.1-pre6
  [  mm
     o  shmem.c

Patch

diff -u --recursive --new-file v2.4.0/linux/mm/shmem.c linux/mm/shmem.c
--- v2.4.0/linux/mm/shmem.c   Fri Dec 29 14:21:48 2000
+++ linux/mm/shmem.c   Sun Jan 14 11:22:21 2001
@@ -310,6 +310,8 @@
    }
    /* We have the page */
    SetPageUptodate (page);
+   if (info->locked)
+      page_cache_get(page);
 
 cached_page:
    UnlockPage (page);
@@ -374,8 +376,7 @@
          inode->i_fop = &shmem_dir_operations;
          break;
       case S_IFLNK:
-         inode->i_op = &page_symlink_inode_operations;
-         break;
+         BUG();
       }
       spin_lock (&shmem_ilock);
       list_add (&inode->u.shmem_i.list, &shmem_inodes);
@@ -401,6 +402,32 @@
    return 0;
 }
 
+void shmem_lock(struct file * file, int lock)
+{
+   struct inode * inode = file->f_dentry->d_inode;
+   struct shmem_inode_info * info = &inode->u.shmem_i;
+   struct page * page;
+   unsigned long idx, size;
+
+   if (info->locked == lock)
+      return;
+   down(&inode->i_sem);
+   info->locked = lock;
+   size = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+   for (idx = 0; idx < size; idx++) {
+      page = find_lock_page(inode->i_mapping, idx);
+      if (!page)
+         continue;
+      if (!lock) {
+         /* release the extra count and our reference */
+         page_cache_release(page);
+         page_cache_release(page);
+      }
+      UnlockPage(page);
+   }
+   up(&inode->i_sem);
+}
+
 /*
  * Lookup the data. This is trivial - if the dentry didn't already
  * exist, we know it is negative.
@@ -528,19 +555,6 @@
    return error;
 }
 
-static int shmem_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
-{
-   int error;
-
-   error = shmem_mknod(dir, dentry, S_IFLNK | S_IRWXUGO, 0);
-   if (!error) {
-      int l = strlen(symname)+1;
-      struct inode *inode = dentry->d_inode;
-      error = block_symlink(inode, symname, l);
-   }
-   return error;
-}
-
 static int shmem_mmap(struct file * file, struct vm_area_struct * vma)
 {
    struct vm_operations_struct * ops;
@@ -677,7 +691,6 @@
    lookup:      shmem_lookup,
    link:      shmem_link,
    unlink:      shmem_unlink,
-   symlink:   shmem_symlink,
    mkdir:      shmem_mkdir,
    rmdir:      shmem_rmdir,
    mknod:      shmem_mknod,


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