| Kernel v2.4.1-pre6 /mm/shmem.c |
|---|
 2.4.1-pre6
 mm
 shmem.c
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,
|