NFS: Use an atomic_long_t to count the number of commits
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 1 Aug 2017 21:04:12 +0000 (17:04 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 15 Aug 2017 15:54:48 +0000 (11:54 -0400)
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c
fs/nfs/write.c
include/linux/nfs_xdr.h

index 0480eb02299a2376e84dac03b60e8b8cea8902c3..134d9f560240f3ba1183a9ab4173a81ff21f4b63 100644 (file)
@@ -2012,7 +2012,7 @@ static void init_once(void *foo)
        INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
        INIT_LIST_HEAD(&nfsi->commit_info.list);
        atomic_long_set(&nfsi->nrequests, 0);
-       nfsi->commit_info.ncommit = 0;
+       atomic_long_set(&nfsi->commit_info.ncommit, 0);
        atomic_set(&nfsi->commit_info.rpcs_out, 0);
        init_rwsem(&nfsi->rmdir_sem);
        mutex_init(&nfsi->commit_mutex);
index 08093552f115dcd1b753e10cefe70678140f57d5..12479c25028ea81e4cfa13074b92212fde7e7cd6 100644 (file)
@@ -857,7 +857,7 @@ nfs_request_add_commit_list_locked(struct nfs_page *req, struct list_head *dst,
 {
        set_bit(PG_CLEAN, &req->wb_flags);
        nfs_list_add_request(req, dst);
-       cinfo->mds->ncommit++;
+       atomic_long_inc(&cinfo->mds->ncommit);
 }
 EXPORT_SYMBOL_GPL(nfs_request_add_commit_list_locked);
 
@@ -903,7 +903,7 @@ nfs_request_remove_commit_list(struct nfs_page *req,
        if (!test_and_clear_bit(PG_CLEAN, &(req)->wb_flags))
                return;
        nfs_list_remove_request(req);
-       cinfo->mds->ncommit--;
+       atomic_long_dec(&cinfo->mds->ncommit);
 }
 EXPORT_SYMBOL_GPL(nfs_request_remove_commit_list);
 
@@ -1017,7 +1017,7 @@ out:
 unsigned long
 nfs_reqs_to_commit(struct nfs_commit_info *cinfo)
 {
-       return cinfo->mds->ncommit;
+       return atomic_long_read(&cinfo->mds->ncommit);
 }
 
 /* NFS_I(cinfo->inode)->commit_mutex held by caller */
@@ -1057,8 +1057,10 @@ nfs_scan_commit(struct inode *inode, struct list_head *dst,
 {
        int ret = 0;
 
+       if (!atomic_long_read(&cinfo->mds->ncommit))
+               return 0;
        mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
-       if (cinfo->mds->ncommit > 0) {
+       if (atomic_long_read(&cinfo->mds->ncommit) > 0) {
                const int max = INT_MAX;
 
                ret = nfs_scan_commit_list(&cinfo->mds->list, dst,
@@ -1890,7 +1892,7 @@ int nfs_write_inode(struct inode *inode, struct writeback_control *wbc)
        int ret = 0;
 
        /* no commits means nothing needs to be done */
-       if (!nfsi->commit_info.ncommit)
+       if (!atomic_long_read(&nfsi->commit_info.ncommit))
                return ret;
 
        if (wbc->sync_mode == WB_SYNC_NONE) {
index 62cbcb842f99c2cbda7121bcb5a4ebc5e818a3bc..164d5359d4ab0099772cfc21f5c257f2a9d6211d 100644 (file)
@@ -1476,7 +1476,7 @@ struct nfs_pgio_header {
 
 struct nfs_mds_commit_info {
        atomic_t rpcs_out;
-       unsigned long           ncommit;
+       atomic_long_t           ncommit;
        struct list_head        list;
 };