NFSv4: Truncating file opens should also sync O_DIRECT writes
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 25 Mar 2015 21:23:31 +0000 (17:23 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 27 Mar 2015 16:39:37 +0000 (12:39 -0400)
We don't just want to sync out buffered writes, but also O_DIRECT ones.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c
fs/nfs/nfs4file.c
include/linux/nfs_fs.h

index 60f907666697ee309d1d41d7701c9b3485da481a..f1fc0e4c1c023ab6a656d8d83f8256b338520974 100644 (file)
@@ -133,11 +133,12 @@ void nfs_evict_inode(struct inode *inode)
        nfs_clear_inode(inode);
 }
 
-static int nfs_sync_inode(struct inode *inode)
+int nfs_sync_inode(struct inode *inode)
 {
        nfs_inode_dio_wait(inode);
        return nfs_wb_all(inode);
 }
+EXPORT_SYMBOL_GPL(nfs_sync_inode);
 
 /**
  * nfs_sync_mapping - helper to flush all mmapped dirty data to disk
index 0de62f7cfebfef787b00aef18a9d907007121e48..8da5409e6f1a63db92713e1edd9a3ac3d196140b 100644 (file)
@@ -59,7 +59,7 @@ nfs4_file_open(struct inode *inode, struct file *filp)
        if (openflags & O_TRUNC) {
                attr.ia_valid |= ATTR_SIZE;
                attr.ia_size = 0;
-               nfs_wb_all(inode);
+               nfs_sync_inode(inode);
        }
 
        inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, &attr, &opened);
index b01ccf371fdcaf229f07bddbd2f12f9bbb5c53b0..b638eb6727c689efc065cb32dce27aabfe257efd 100644 (file)
@@ -512,6 +512,7 @@ extern int  nfs_updatepage(struct file *, struct page *, unsigned int, unsigned
  * Try to write back everything synchronously (but check the
  * return value!)
  */
+extern int nfs_sync_inode(struct inode *inode);
 extern int nfs_wb_all(struct inode *inode);
 extern int nfs_wb_page(struct inode *inode, struct page* page);
 extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);