diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 10:57:56 +0400 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 11:01:08 +0400 | 
| commit | a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4 (patch) | |
| tree | 61a2eb7fa62f5af10c2b913ca429e6b068b0eb2d /mm/filemap.c | |
| parent | 20d5a540e55a29daeef12706f9ee73baf5641c16 (diff) | |
| parent | d9875690d9b89a866022ff49e3fcea892345ad92 (diff) | |
| download | linux-a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4.tar.xz | |
Merge tag 'v3.6-rc2' into drm-intel-next
Backmerge Linux 3.6-rc2 to resolve a few funny conflicts before we put
even more madness on top:
- drivers/gpu/drm/i915/i915_irq.c: Just a spurious WARN removed in
  -fixes, that has been changed in a variable-rename in -next, too.
- drivers/gpu/drm/i915/intel_ringbuffer.c: -next remove scratch_addr
  (since all their users have been extracted in another fucntion),
  -fixes added another user for a hw workaroudn.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 31 | 
1 files changed, 29 insertions, 2 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index a4a5260b0279..fa5ca304148e 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1712,8 +1712,35 @@ page_not_uptodate:  }  EXPORT_SYMBOL(filemap_fault); +int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) +{ +	struct page *page = vmf->page; +	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	int ret = VM_FAULT_LOCKED; + +	sb_start_pagefault(inode->i_sb); +	file_update_time(vma->vm_file); +	lock_page(page); +	if (page->mapping != inode->i_mapping) { +		unlock_page(page); +		ret = VM_FAULT_NOPAGE; +		goto out; +	} +	/* +	 * We mark the page dirty already here so that when freeze is in +	 * progress, we are guaranteed that writeback during freezing will +	 * see the dirty page and writeprotect it again. +	 */ +	set_page_dirty(page); +out: +	sb_end_pagefault(inode->i_sb); +	return ret; +} +EXPORT_SYMBOL(filemap_page_mkwrite); +  const struct vm_operations_struct generic_file_vm_ops = {  	.fault		= filemap_fault, +	.page_mkwrite	= filemap_page_mkwrite,  };  /* This is used for a general mmap of a disk file */ @@ -2407,8 +2434,6 @@ ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  	count = ocount;  	pos = *ppos; -	vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); -  	/* We can write back this queue in page reclaim */  	current->backing_dev_info = mapping->backing_dev_info;  	written = 0; @@ -2507,6 +2532,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  	BUG_ON(iocb->ki_pos != pos); +	sb_start_write(inode->i_sb);  	mutex_lock(&inode->i_mutex);  	blk_start_plug(&plug);  	ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); @@ -2520,6 +2546,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  			ret = err;  	}  	blk_finish_plug(&plug); +	sb_end_write(inode->i_sb);  	return ret;  }  EXPORT_SYMBOL(generic_file_aio_write);  | 
