Merge branch 'devel' into for-linus
This commit is contained in:
@@ -64,11 +64,7 @@ const struct file_operations nfs_file_operations = {
|
||||
.write = do_sync_write,
|
||||
.aio_read = nfs_file_read,
|
||||
.aio_write = nfs_file_write,
|
||||
#ifdef CONFIG_MMU
|
||||
.mmap = nfs_file_mmap,
|
||||
#else
|
||||
.mmap = generic_file_mmap,
|
||||
#endif
|
||||
.open = nfs_file_open,
|
||||
.flush = nfs_file_flush,
|
||||
.release = nfs_file_release,
|
||||
@@ -141,9 +137,6 @@ nfs_file_release(struct inode *inode, struct file *filp)
|
||||
dentry->d_parent->d_name.name,
|
||||
dentry->d_name.name);
|
||||
|
||||
/* Ensure that dirty pages are flushed out with the right creds */
|
||||
if (filp->f_mode & FMODE_WRITE)
|
||||
nfs_wb_all(dentry->d_inode);
|
||||
nfs_inc_stats(inode, NFSIOS_VFSRELEASE);
|
||||
return nfs_release(inode, filp);
|
||||
}
|
||||
@@ -235,7 +228,6 @@ nfs_file_flush(struct file *file, fl_owner_t id)
|
||||
struct nfs_open_context *ctx = nfs_file_open_context(file);
|
||||
struct dentry *dentry = file->f_path.dentry;
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int status;
|
||||
|
||||
dprintk("NFS: flush(%s/%s)\n",
|
||||
dentry->d_parent->d_name.name,
|
||||
@@ -245,11 +237,8 @@ nfs_file_flush(struct file *file, fl_owner_t id)
|
||||
return 0;
|
||||
nfs_inc_stats(inode, NFSIOS_VFSFLUSH);
|
||||
|
||||
/* Ensure that data+attribute caches are up to date after close() */
|
||||
status = nfs_do_fsync(ctx, inode);
|
||||
if (!status)
|
||||
nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
return status;
|
||||
/* Flush writes to the server and return any errors */
|
||||
return nfs_do_fsync(ctx, inode);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
@@ -304,11 +293,13 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
|
||||
dprintk("NFS: mmap(%s/%s)\n",
|
||||
dentry->d_parent->d_name.name, dentry->d_name.name);
|
||||
|
||||
status = nfs_revalidate_mapping(inode, file->f_mapping);
|
||||
/* Note: generic_file_mmap() returns ENOSYS on nommu systems
|
||||
* so we call that before revalidating the mapping
|
||||
*/
|
||||
status = generic_file_mmap(file, vma);
|
||||
if (!status) {
|
||||
vma->vm_ops = &nfs_file_vm_ops;
|
||||
vma->vm_flags |= VM_CAN_NONLINEAR;
|
||||
file_accessed(file);
|
||||
status = nfs_revalidate_mapping(inode, file->f_mapping);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -354,6 +345,15 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
|
||||
file->f_path.dentry->d_name.name,
|
||||
mapping->host->i_ino, len, (long long) pos);
|
||||
|
||||
/*
|
||||
* Prevent starvation issues if someone is doing a consistency
|
||||
* sync-to-disk
|
||||
*/
|
||||
ret = wait_on_bit(&NFS_I(mapping->host)->flags, NFS_INO_FLUSHING,
|
||||
nfs_wait_bit_killable, TASK_KILLABLE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
page = grab_cache_page_write_begin(mapping, index, flags);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
Reference in New Issue
Block a user