Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] NFS: Write optimization for short files and small O_SYNC writes.

Use stable writes if we can see that we are only going to put a single
write on the wire.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

+11 -3
+11 -3
fs/nfs/write.c
··· 750 750 * is entirely in cache, it may be more efficient to avoid 751 751 * fragmenting write requests. 752 752 */ 753 - if (PageUptodate(page) && inode->i_flock == NULL) { 753 + if (PageUptodate(page) && inode->i_flock == NULL && !(file->f_mode & O_SYNC)) { 754 754 loff_t end_offs = i_size_read(inode) - 1; 755 755 unsigned long end_index = end_offs >> PAGE_CACHE_SHIFT; 756 756 ··· 1342 1342 spin_lock(&nfsi->req_lock); 1343 1343 res = nfs_scan_dirty(inode, &head, idx_start, npages); 1344 1344 spin_unlock(&nfsi->req_lock); 1345 - if (res) 1346 - error = nfs_flush_list(&head, NFS_SERVER(inode)->wpages, how); 1345 + if (res) { 1346 + struct nfs_server *server = NFS_SERVER(inode); 1347 + 1348 + /* For single writes, FLUSH_STABLE is more efficient */ 1349 + if (res == nfsi->npages && nfsi->npages <= server->wpages) { 1350 + if (res > 1 || nfs_list_entry(head.next)->wb_bytes <= server->wsize) 1351 + how |= FLUSH_STABLE; 1352 + } 1353 + error = nfs_flush_list(&head, server->wpages, how); 1354 + } 1347 1355 if (error < 0) 1348 1356 return error; 1349 1357 return res;