patch-2.4.0-test3 linux/mm/filemap.c

Next file: linux/mm/mmap.c
Previous file: linux/lib/string.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test2/linux/mm/filemap.c linux/mm/filemap.c
@@ -195,6 +195,7 @@
 			 * to it causing all sorts of fun problems ...
 			 */
 			remove_inode_page(page);
+			ClearPageDirty(page);
 
 			UnlockPage(page);
 			page_cache_release(page);
@@ -500,7 +501,7 @@
 
 /*
  * This adds a page to the page cache, starting out as locked,
- * owned by us, referenced, but not uptodate and with no errors.
+ * owned by us, but unreferenced, not uptodate and with no errors.
  */
 static inline void __add_to_page_cache(struct page * page,
 	struct address_space *mapping, unsigned long offset,
@@ -512,8 +513,8 @@
 	if (PageLocked(page))
 		BUG();
 
-	flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_dirty));
-	page->flags = flags | (1 << PG_locked) | (1 << PG_referenced);
+	flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_dirty) | (1 << PG_referenced));
+	page->flags = flags | (1 << PG_locked);
 	page_cache_get(page);
 	page->index = offset;
 	add_page_to_inode_queue(mapping, page);
@@ -1682,9 +1683,7 @@
  */
 static void filemap_unmap(struct vm_area_struct *vma, unsigned long start, size_t len)
 {
-	lock_kernel();
 	filemap_sync(vma, start, len, MS_ASYNC);
-	unlock_kernel();
 }
 
 /*
@@ -1743,8 +1742,13 @@
 		error = vma->vm_ops->sync(vma, start, end-start, flags);
 		if (!error && (flags & MS_SYNC)) {
 			struct file * file = vma->vm_file;
-			if (file && file->f_op && file->f_op->fsync)
-				error = file->f_op->fsync(file, file->f_dentry);
+			if (file && file->f_op && file->f_op->fsync) {
+				down(&file->f_dentry->d_inode->i_sem);
+				lock_kernel();
+				error = file->f_op->fsync(file, file->f_dentry, 1);
+				unlock_kernel();
+				up(&file->f_dentry->d_inode->i_sem);
+			}
 		}
 		return error;
 	}
@@ -1758,7 +1762,6 @@
 	int unmapped_error, error = -EINVAL;
 
 	down(&current->mm->mmap_sem);
-	lock_kernel();
 	if (start & ~PAGE_MASK)
 		goto out;
 	len = (len + ~PAGE_MASK) & PAGE_MASK;
@@ -1804,7 +1807,6 @@
 		vma = vma->vm_next;
 	}
 out:
-	unlock_kernel();
 	up(&current->mm->mmap_sem);
 	return error;
 }
@@ -2020,13 +2022,9 @@
 	if (vma->vm_flags & VM_LOCKED)
 		return -EINVAL;
 
-	lock_kernel();	/* is this really necessary? */
-
 	flush_cache_range(vma->vm_mm, start, end);
 	zap_page_range(vma->vm_mm, start, end - start);
 	flush_tlb_range(vma->vm_mm, start, end);
-
-	unlock_kernel();
 	return 0;
 }
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)