diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2009-04-29 08:59:35 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2009-05-11 07:36:44 -0400 |
commit | 48bf2b1711dc498494e77705c415ee46bb508fd9 (patch) | |
tree | 55807e37d047a799ffa8ed5e0f675ff62ab38c79 /fs/gfs2/ops_file.c | |
parent | 4a0f9a321a113392b448e477018311d14fba2b34 (diff) |
GFS2: Something nonlinear this way comes!
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>
Diffstat (limited to 'fs/gfs2/ops_file.c')
-rw-r--r-- | fs/gfs2/ops_file.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c index 5d82e91887e3..0ee7bd287c5a 100644 --- a/fs/gfs2/ops_file.c +++ b/fs/gfs2/ops_file.c | |||
@@ -425,33 +425,36 @@ static struct vm_operations_struct gfs2_vm_ops = { | |||
425 | .page_mkwrite = gfs2_page_mkwrite, | 425 | .page_mkwrite = gfs2_page_mkwrite, |
426 | }; | 426 | }; |
427 | 427 | ||
428 | |||
429 | /** | 428 | /** |
430 | * gfs2_mmap - | 429 | * gfs2_mmap - |
431 | * @file: The file to map | 430 | * @file: The file to map |
432 | * @vma: The VMA which described the mapping | 431 | * @vma: The VMA which described the mapping |
433 | * | 432 | * |
434 | * Returns: 0 or error code | 433 | * There is no need to get a lock here unless we should be updating |
434 | * atime. We ignore any locking errors since the only consequence is | ||
435 | * a missed atime update (which will just be deferred until later). | ||
436 | * | ||
437 | * Returns: 0 | ||
435 | */ | 438 | */ |
436 | 439 | ||
437 | static int gfs2_mmap(struct file *file, struct vm_area_struct *vma) | 440 | static int gfs2_mmap(struct file *file, struct vm_area_struct *vma) |
438 | { | 441 | { |
439 | struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); | 442 | struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); |
440 | struct gfs2_holder i_gh; | ||
441 | int error; | ||
442 | 443 | ||
443 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh); | 444 | if (!(file->f_flags & O_NOATIME)) { |
444 | error = gfs2_glock_nq(&i_gh); | 445 | struct gfs2_holder i_gh; |
445 | if (error) { | 446 | int error; |
446 | gfs2_holder_uninit(&i_gh); | ||
447 | return error; | ||
448 | } | ||
449 | 447 | ||
448 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh); | ||
449 | error = gfs2_glock_nq(&i_gh); | ||
450 | file_accessed(file); | ||
451 | if (error == 0) | ||
452 | gfs2_glock_dq_uninit(&i_gh); | ||
453 | } | ||
450 | vma->vm_ops = &gfs2_vm_ops; | 454 | vma->vm_ops = &gfs2_vm_ops; |
455 | vma->vm_flags |= VM_CAN_NONLINEAR; | ||
451 | 456 | ||
452 | gfs2_glock_dq_uninit(&i_gh); | 457 | return 0; |
453 | |||
454 | return error; | ||
455 | } | 458 | } |
456 | 459 | ||
457 | /** | 460 | /** |