forked from luck/tmp_suning_uos_patched
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>
This commit is contained in:
parent
4a0f9a321a
commit
48bf2b1711
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue
Block a user