NFS: Make stat() return updated mtimes after a write()
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 3 Jan 2006 08:55:34 +0000 (09:55 +0100)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 6 Jan 2006 19:58:50 +0000 (14:58 -0500)
 The SuS states that a call to write() will cause mtime to be updated on
 the file. In order to satisfy that requirement, we need to flush out
 any cached writes in nfs_getattr().
 Speed things up slightly by not committing the writes.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/inode.c
fs/nfs/write.c
include/linux/nfs_fs.h

index acde2c5725bf81ca6ee31e1d3e4800b2704ae69b..2c7f8aac1deca61a72eb0f2bb2b8296654eec4db 100644 (file)
@@ -952,6 +952,8 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
        int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
        int err;
 
+       /* Flush out writes to the server in order to update c/mtime */
+       nfs_sync_inode(inode, 0, 0, FLUSH_WAIT|FLUSH_NOCOMMIT);
        if (__IS_FLG(inode, MS_NOATIME))
                need_atime = 0;
        else if (__IS_FLG(inode, MS_NODIRATIME) && S_ISDIR(inode->i_mode))
index 1ce0c200df16392725e20f3f39b8df09819f8ec1..9449b6835509dae636154341e3257d23e0eaf1db 100644 (file)
@@ -1377,22 +1377,23 @@ int nfs_commit_inode(struct inode *inode, int how)
 int nfs_sync_inode(struct inode *inode, unsigned long idx_start,
                  unsigned int npages, int how)
 {
-       int     error,
-               wait;
+       int nocommit = how & FLUSH_NOCOMMIT;
+       int wait = how & FLUSH_WAIT;
+       int error;
 
-       wait = how & FLUSH_WAIT;
-       how &= ~FLUSH_WAIT;
+       how &= ~(FLUSH_WAIT|FLUSH_NOCOMMIT);
 
        do {
-               error = 0;
-               if (wait)
+               if (wait) {
                        error = nfs_wait_on_requests(inode, idx_start, npages);
-               if (error == 0)
-                       error = nfs_flush_inode(inode, idx_start, npages, how);
-#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-               if (error == 0)
+                       if (error != 0)
+                               continue;
+               }
+               error = nfs_flush_inode(inode, idx_start, npages, how);
+               if (error != 0)
+                       continue;
+               if (!nocommit)
                        error = nfs_commit_inode(inode, how);
-#endif
        } while (error > 0);
        return error;
 }
index d38010ba64771796d4c6399b5dc64672c5990852..408d82d3d97cc5e264b586686b3475d5abd5a44d 100644 (file)
@@ -62,6 +62,7 @@
 #define FLUSH_STABLE           4       /* commit to stable storage */
 #define FLUSH_LOWPRI           8       /* low priority background flush */
 #define FLUSH_HIGHPRI          16      /* high priority memory reclaim flush */
+#define FLUSH_NOCOMMIT         32      /* Don't send the NFSv3/v4 COMMIT */
 
 #ifdef __KERNEL__