]> err.no Git - linux-2.6/blobdiff - fs/reiserfs/file.c
Pull thermal into release branch
[linux-2.6] / fs / reiserfs / file.c
index 99b6f329ba23edc7b513e9b7dd606028497bb275..9e451a68580f6eef3ab4ba8c6eb729ae843d071b 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/reiserfs_fs.h>
 #include <linux/reiserfs_acl.h>
 #include <linux/reiserfs_xattr.h>
-#include <linux/smp_lock.h>
 #include <asm/uaccess.h>
 #include <linux/pagemap.h>
 #include <linux/swap.h>
@@ -48,6 +47,11 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
        }
 
        mutex_lock(&inode->i_mutex);
+
+       mutex_lock(&(REISERFS_I(inode)->i_mmap));
+       if (REISERFS_I(inode)->i_flags & i_ever_mapped)
+               REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask;
+
        reiserfs_write_lock(inode->i_sb);
        /* freeing preallocation only involves relogging blocks that
         * are already in the current transaction.  preallocation gets
@@ -100,11 +104,24 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
                err = reiserfs_truncate_file(inode, 0);
        }
       out:
+       mutex_unlock(&(REISERFS_I(inode)->i_mmap));
        mutex_unlock(&inode->i_mutex);
        reiserfs_write_unlock(inode->i_sb);
        return err;
 }
 
+static int reiserfs_file_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct inode *inode;
+
+       inode = file->f_path.dentry->d_inode;
+       mutex_lock(&(REISERFS_I(inode)->i_mmap));
+       REISERFS_I(inode)->i_flags |= i_ever_mapped;
+       mutex_unlock(&(REISERFS_I(inode)->i_mmap));
+
+       return generic_file_mmap(file, vma);
+}
+
 static void reiserfs_vfs_truncate_file(struct inode *inode)
 {
        reiserfs_truncate_file(inode, 1);
@@ -1042,20 +1059,12 @@ static int reiserfs_prepare_file_region_for_write(struct inode *inode
           maping blocks, since there is none, so we just zero out remaining
           parts of first and last pages in write area (if needed) */
        if ((pos & ~((loff_t) PAGE_CACHE_SIZE - 1)) > inode->i_size) {
-               if (from != 0) {        /* First page needs to be partially zeroed */
-                       char *kaddr = kmap_atomic(prepared_pages[0], KM_USER0);
-                       memset(kaddr, 0, from);
-                       kunmap_atomic(kaddr, KM_USER0);
-                       flush_dcache_page(prepared_pages[0]);
-               }
-               if (to != PAGE_CACHE_SIZE) {    /* Last page needs to be partially zeroed */
-                       char *kaddr =
-                           kmap_atomic(prepared_pages[num_pages - 1],
-                                       KM_USER0);
-                       memset(kaddr + to, 0, PAGE_CACHE_SIZE - to);
-                       kunmap_atomic(kaddr, KM_USER0);
-                       flush_dcache_page(prepared_pages[num_pages - 1]);
-               }
+               if (from != 0)          /* First page needs to be partially zeroed */
+                       zero_user_page(prepared_pages[0], 0, from, KM_USER0);
+
+               if (to != PAGE_CACHE_SIZE)      /* Last page needs to be partially zeroed */
+                       zero_user_page(prepared_pages[num_pages-1], to,
+                                       PAGE_CACHE_SIZE - to, KM_USER0);
 
                /* Since all blocks are new - use already calculated value */
                return blocks;
@@ -1182,13 +1191,9 @@ static int reiserfs_prepare_file_region_for_write(struct inode *inode
                                        ll_rw_block(READ, 1, &bh);
                                        *wait_bh++ = bh;
                                } else {        /* Not mapped, zero it */
-                                       char *kaddr =
-                                           kmap_atomic(prepared_pages[0],
-                                                       KM_USER0);
-                                       memset(kaddr + block_start, 0,
-                                              from - block_start);
-                                       kunmap_atomic(kaddr, KM_USER0);
-                                       flush_dcache_page(prepared_pages[0]);
+                                       zero_user_page(prepared_pages[0],
+                                                      block_start,
+                                                      from - block_start, KM_USER0);
                                        set_buffer_uptodate(bh);
                                }
                        }
@@ -1220,13 +1225,8 @@ static int reiserfs_prepare_file_region_for_write(struct inode *inode
                                        ll_rw_block(READ, 1, &bh);
                                        *wait_bh++ = bh;
                                } else {        /* Not mapped, zero it */
-                                       char *kaddr =
-                                           kmap_atomic(prepared_pages
-                                                       [num_pages - 1],
-                                                       KM_USER0);
-                                       memset(kaddr + to, 0, block_end - to);
-                                       kunmap_atomic(kaddr, KM_USER0);
-                                       flush_dcache_page(prepared_pages[num_pages - 1]);
+                                       zero_user_page(prepared_pages[num_pages-1],
+                                                       to, block_end - to, KM_USER0);
                                        set_buffer_uptodate(bh);
                                }
                        }
@@ -1527,7 +1527,7 @@ const struct file_operations reiserfs_file_operations = {
 #ifdef CONFIG_COMPAT
        .compat_ioctl = reiserfs_compat_ioctl,
 #endif
-       .mmap = generic_file_mmap,
+       .mmap = reiserfs_file_mmap,
        .open = generic_file_open,
        .release = reiserfs_file_release,
        .fsync = reiserfs_sync_file,
@@ -1538,7 +1538,7 @@ const struct file_operations reiserfs_file_operations = {
        .splice_write = generic_file_splice_write,
 };
 
-struct inode_operations reiserfs_file_inode_operations = {
+const struct inode_operations reiserfs_file_inode_operations = {
        .truncate = reiserfs_vfs_truncate_file,
        .setattr = reiserfs_setattr,
        .setxattr = reiserfs_setxattr,