Skip to content

Commit

Permalink
NFS: Add a count of the number of unstable writes carried by an inode
Browse files Browse the repository at this point in the history
In order to know when we should do opportunistic commits of the unstable
writes, when the VM is doing a background flush, we add a field to count
the number of unstable writes.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Mar 5, 2010
1 parent 8fc795f commit ff778d0
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
1 change: 1 addition & 0 deletions fs/nfs/inode.c
Expand Up @@ -1404,6 +1404,7 @@ static void init_once(void *foo)
INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
INIT_RADIX_TREE(&nfsi->nfs_page_tree, GFP_ATOMIC);
nfsi->npages = 0;
nfsi->ncommit = 0;
atomic_set(&nfsi->silly_count, 1);
INIT_HLIST_HEAD(&nfsi->silly_list);
init_waitqueue_head(&nfsi->waitqueue);
Expand Down
14 changes: 10 additions & 4 deletions fs/nfs/write.c
Expand Up @@ -438,6 +438,7 @@ nfs_mark_request_commit(struct nfs_page *req)
radix_tree_tag_set(&nfsi->nfs_page_tree,
req->wb_index,
NFS_PAGE_TAG_COMMIT);
nfsi->ncommit++;
spin_unlock(&inode->i_lock);
inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
inc_bdi_stat(req->wb_page->mapping->backing_dev_info, BDI_RECLAIMABLE);
Expand Down Expand Up @@ -573,11 +574,15 @@ static int
nfs_scan_commit(struct inode *inode, struct list_head *dst, pgoff_t idx_start, unsigned int npages)
{
struct nfs_inode *nfsi = NFS_I(inode);
int ret;

if (!nfs_need_commit(nfsi))
return 0;

return nfs_scan_list(nfsi, dst, idx_start, npages, NFS_PAGE_TAG_COMMIT);
ret = nfs_scan_list(nfsi, dst, idx_start, npages, NFS_PAGE_TAG_COMMIT);
if (ret > 0)
nfsi->ncommit -= ret;
return ret;
}
#else
static inline int nfs_need_commit(struct nfs_inode *nfsi)
Expand Down Expand Up @@ -642,9 +647,10 @@ static struct nfs_page *nfs_try_to_update_request(struct inode *inode,
spin_lock(&inode->i_lock);
}

if (nfs_clear_request_commit(req))
radix_tree_tag_clear(&NFS_I(inode)->nfs_page_tree,
req->wb_index, NFS_PAGE_TAG_COMMIT);
if (nfs_clear_request_commit(req) &&
radix_tree_tag_clear(&NFS_I(inode)->nfs_page_tree,
req->wb_index, NFS_PAGE_TAG_COMMIT) != NULL)
NFS_I(inode)->ncommit--;

/* Okay, the request matches. Update the region */
if (offset < req->wb_offset) {
Expand Down
1 change: 1 addition & 0 deletions include/linux/nfs_fs.h
Expand Up @@ -166,6 +166,7 @@ struct nfs_inode {
struct radix_tree_root nfs_page_tree;

unsigned long npages;
unsigned long ncommit;

/* Open contexts for shared mmap writes */
struct list_head open_files;
Expand Down

0 comments on commit ff778d0

Please sign in to comment.