*/
#include <linux/slab.h>
#include <linux/pagemap.h>
+#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/hugetlb.h>
* write out the dirty pages and wait on the writeout and check the result.
* Or the application may run fadvise(FADV_DONTNEED) against the fd to start
* async writeout immediately.
- * So my _not_ starting I/O in MS_ASYNC we provide complete flexibility to
+ * So by _not_ starting I/O in MS_ASYNC we provide complete flexibility to
* applications.
*/
static int msync_interval(struct vm_area_struct *vma, unsigned long addr,
{
unsigned long end;
struct vm_area_struct *vma;
- int unmapped_error, error = -EINVAL;
+ int unmapped_error = 0;
+ int error = -EINVAL;
int done = 0;
if (flags & ~(MS_ASYNC | MS_INVALIDATE | MS_SYNC))
* just ignore them, but return -ENOMEM at the end.
*/
down_read(¤t->mm->mmap_sem);
- if (flags & MS_SYNC)
- current->flags |= PF_SYNCWRITE;
vma = find_vma(current->mm, start);
- unmapped_error = 0;
+ if (!vma) {
+ error = -ENOMEM;
+ goto out_unlock;
+ }
do {
unsigned long nr_pages_dirtied = 0;
struct file *file;
- /* Still start < end. */
- error = -ENOMEM;
- if (!vma)
- goto out_unlock;
/* Here start < vma->vm_end. */
if (start < vma->vm_start) {
unmapped_error = -ENOMEM;
vma = find_vma(current->mm, start);
} else if ((flags & MS_SYNC) && file &&
(vma->vm_flags & VM_SHARED)) {
- struct address_space *mapping;
- int err;
-
get_file(file);
up_read(¤t->mm->mmap_sem);
- mapping = file->f_mapping;
- error = filemap_fdatawrite(mapping);
- if (file->f_op && file->f_op->fsync) {
- mutex_lock(&mapping->host->i_mutex);
- err = file->f_op->fsync(file,file->f_dentry,1);
- mutex_unlock(&mapping->host->i_mutex);
- if (err && !error)
- error = err;
- }
- err = filemap_fdatawait(mapping);
- if (err && !error)
- error = err;
+ error = do_fsync(file, 0);
fput(file);
down_read(¤t->mm->mmap_sem);
if (error)
} else {
vma = vma->vm_next;
}
- } while (!done);
+ } while (vma && !done);
out_unlock:
- current->flags &= ~PF_SYNCWRITE;
up_read(¤t->mm->mmap_sem);
out:
return error;