]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
GFS2: Something nonlinear this way comes!
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 29 Apr 2009 12:59:35 +0000 (13:59 +0100)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 11 May 2009 11:36:44 +0000 (12:36 +0100)
For some reason GFS2 has been missing support for non-linear
mappings. This patch fixes that, and also avoids taking any
locks for mmap in the O_NOATIME case. In fact we don't actually need
to take the lock here at all - just doing file_accessed() would be
enough, but we have to take the lock eventually and this helps
it hit disk (and thus be seen by other nodes) faster.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/ops_file.c

index 5d82e91887e31e4eb139d9b34dd461aec66b63f1..0ee7bd287c5a6772e48de7dd27eb4e2315b7a23b 100644 (file)
@@ -425,33 +425,36 @@ static struct vm_operations_struct gfs2_vm_ops = {
        .page_mkwrite = gfs2_page_mkwrite,
 };
 
-
 /**
  * gfs2_mmap -
  * @file: The file to map
  * @vma: The VMA which described the mapping
  *
- * Returns: 0 or error code
+ * There is no need to get a lock here unless we should be updating
+ * atime. We ignore any locking errors since the only consequence is
+ * a missed atime update (which will just be deferred until later).
+ *
+ * Returns: 0
  */
 
 static int gfs2_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
-       struct gfs2_holder i_gh;
-       int error;
 
-       gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
-       error = gfs2_glock_nq(&i_gh);
-       if (error) {
-               gfs2_holder_uninit(&i_gh);
-               return error;
-       }
+       if (!(file->f_flags & O_NOATIME)) {
+               struct gfs2_holder i_gh;
+               int error;
 
+               gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
+               error = gfs2_glock_nq(&i_gh);
+               file_accessed(file);
+               if (error == 0)
+                       gfs2_glock_dq_uninit(&i_gh);
+       }
        vma->vm_ops = &gfs2_vm_ops;
+       vma->vm_flags |= VM_CAN_NONLINEAR;
 
-       gfs2_glock_dq_uninit(&i_gh);
-
-       return error;
+       return 0;
 }
 
 /**