pnfs: pass ds_commit_idx through the commit path
authorWeston Andros Adamson <dros@primarydata.com>
Fri, 5 Sep 2014 22:20:21 +0000 (18:20 -0400)
committerTom Haynes <loghyr@primarydata.com>
Tue, 3 Feb 2015 19:06:45 +0000 (11:06 -0800)
Pass ds_commit_idx through the nfs commit path. It's used to select
the commit bucket when using pnfs and is ignored when not using pnfs.
Several functions had to be changed: nfs_retry_commit,
nfs_mark_request_commit, pnfs_mark_request_commit and the pnfs layout
driver .mark_request_commit functions.

Signed-off-by: Tom Haynes <loghyr@primarydata.com>
fs/nfs/direct.c
fs/nfs/filelayout/filelayout.c
fs/nfs/internal.h
fs/nfs/pnfs.h
fs/nfs/pnfs_nfs.c
fs/nfs/write.c

index d7c2d430b04d2d54cac5fa3ed67e2d0863a77ac7..1ee41d74c31c761985349a4c89699502db8aa27a 100644 (file)
@@ -649,7 +649,7 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
                nfs_list_remove_request(req);
                if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) {
                        /* Note the rewrite will go through mds */
-                       nfs_mark_request_commit(req, NULL, &cinfo);
+                       nfs_mark_request_commit(req, NULL, &cinfo, 0);
                } else
                        nfs_release_request(req);
                nfs_unlock_and_release_request(req);
@@ -748,7 +748,8 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
                nfs_list_remove_request(req);
                if (request_commit) {
                        kref_get(&req->wb_kref);
-                       nfs_mark_request_commit(req, hdr->lseg, &cinfo);
+                       nfs_mark_request_commit(req, hdr->lseg, &cinfo,
+                               hdr->ds_commit_idx);
                }
                nfs_unlock_and_release_request(req);
        }
index 520cbc53e035d2c2e6af568d3009b8b58995c3ed..3c9769441f3641199ac006b5c6427faf0cd56531 100644 (file)
@@ -954,7 +954,8 @@ static u32 select_bucket_index(struct nfs4_filelayout_segment *fl, u32 j)
 static void
 filelayout_mark_request_commit(struct nfs_page *req,
                               struct pnfs_layout_segment *lseg,
-                              struct nfs_commit_info *cinfo)
+                              struct nfs_commit_info *cinfo,
+                              u32 ds_commit_idx)
 
 {
        struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg);
index e9305e98b78218b1e7b1d5cf4effd79bab10288c..05f9a87cdab46b885d5a7645ff3bb7c5f9a6b610 100644 (file)
@@ -450,13 +450,15 @@ int nfs_scan_commit(struct inode *inode, struct list_head *dst,
                    struct nfs_commit_info *cinfo);
 void nfs_mark_request_commit(struct nfs_page *req,
                             struct pnfs_layout_segment *lseg,
-                            struct nfs_commit_info *cinfo);
+                            struct nfs_commit_info *cinfo,
+                            u32 ds_commit_idx);
 int nfs_write_need_commit(struct nfs_pgio_header *);
 int nfs_generic_commit_list(struct inode *inode, struct list_head *head,
                            int how, struct nfs_commit_info *cinfo);
 void nfs_retry_commit(struct list_head *page_list,
                      struct pnfs_layout_segment *lseg,
-                     struct nfs_commit_info *cinfo);
+                     struct nfs_commit_info *cinfo,
+                     u32 ds_commit_idx);
 void nfs_commitdata_release(struct nfs_commit_data *data);
 void nfs_request_add_commit_list(struct nfs_page *req, struct list_head *dst,
                                 struct nfs_commit_info *cinfo);
index 59c831efb5dee44e6078da06f2fe1050c3a1c545..a0ab81cc9cf3724441fa431e4e0f21ba0a05b167 100644 (file)
@@ -137,7 +137,8 @@ struct pnfs_layoutdriver_type {
        struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode);
        void (*mark_request_commit) (struct nfs_page *req,
                                     struct pnfs_layout_segment *lseg,
-                                    struct nfs_commit_info *cinfo);
+                                    struct nfs_commit_info *cinfo,
+                                    u32 ds_commit_idx);
        void (*clear_request_commit) (struct nfs_page *req,
                                      struct nfs_commit_info *cinfo);
        int (*scan_commit_lists) (struct nfs_commit_info *cinfo,
@@ -389,14 +390,14 @@ pnfs_generic_mark_devid_invalid(struct nfs4_deviceid_node *node)
 
 static inline bool
 pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
-                        struct nfs_commit_info *cinfo)
+                        struct nfs_commit_info *cinfo, u32 ds_commit_idx)
 {
        struct inode *inode = req->wb_context->dentry->d_inode;
        struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
 
        if (lseg == NULL || ld->mark_request_commit == NULL)
                return false;
-       ld->mark_request_commit(req, lseg, cinfo);
+       ld->mark_request_commit(req, lseg, cinfo, ds_commit_idx);
        return true;
 }
 
@@ -574,7 +575,7 @@ pnfs_get_ds_info(struct inode *inode)
 
 static inline bool
 pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
-                        struct nfs_commit_info *cinfo)
+                        struct nfs_commit_info *cinfo, u32 ds_commit_idx)
 {
        return false;
 }
index 55bff41180e87a09f3f0b9cc1ad53fec3ae57a73..fdc4f6562bb7efc65179f970053dfec6a9c38705 100644 (file)
@@ -188,7 +188,7 @@ static void pnfs_generic_retry_commit(struct nfs_commit_info *cinfo, int idx)
                bucket = &fl_cinfo->buckets[i];
                if (list_empty(&bucket->committing))
                        continue;
-               nfs_retry_commit(&bucket->committing, bucket->clseg, cinfo);
+               nfs_retry_commit(&bucket->committing, bucket->clseg, cinfo, i);
                spin_lock(cinfo->lock);
                freeme = bucket->clseg;
                bucket->clseg = NULL;
@@ -247,7 +247,7 @@ pnfs_generic_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
                        list_add(&data->pages, &list);
                        nreq++;
                } else {
-                       nfs_retry_commit(mds_pages, NULL, cinfo);
+                       nfs_retry_commit(mds_pages, NULL, cinfo, 0);
                        pnfs_generic_retry_commit(cinfo, 0);
                        cinfo->completion_ops->error_cleanup(NFS_I(inode));
                        return -ENOMEM;
index e9974574b19ac2d18ecacd5c34e55d27e018eae0..2bee165fddcff6f951787919aa5643880e12793a 100644 (file)
@@ -847,9 +847,9 @@ EXPORT_SYMBOL_GPL(nfs_init_cinfo);
  */
 void
 nfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
-                       struct nfs_commit_info *cinfo)
+                       struct nfs_commit_info *cinfo, u32 ds_commit_idx)
 {
-       if (pnfs_mark_request_commit(req, lseg, cinfo))
+       if (pnfs_mark_request_commit(req, lseg, cinfo, ds_commit_idx))
                return;
        nfs_request_add_commit_list(req, &cinfo->mds->list, cinfo);
 }
@@ -905,7 +905,8 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr)
                }
                if (nfs_write_need_commit(hdr)) {
                        memcpy(&req->wb_verf, &hdr->verf.verifier, sizeof(req->wb_verf));
-                       nfs_mark_request_commit(req, hdr->lseg, &cinfo);
+                       nfs_mark_request_commit(req, hdr->lseg, &cinfo,
+                               0);
                        goto next;
                }
 remove_req:
@@ -1560,14 +1561,15 @@ EXPORT_SYMBOL_GPL(nfs_init_commit);
 
 void nfs_retry_commit(struct list_head *page_list,
                      struct pnfs_layout_segment *lseg,
-                     struct nfs_commit_info *cinfo)
+                     struct nfs_commit_info *cinfo,
+                     u32 ds_commit_idx)
 {
        struct nfs_page *req;
 
        while (!list_empty(page_list)) {
                req = nfs_list_entry(page_list->next);
                nfs_list_remove_request(req);
-               nfs_mark_request_commit(req, lseg, cinfo);
+               nfs_mark_request_commit(req, lseg, cinfo, ds_commit_idx);
                if (!cinfo->dreq) {
                        dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
                        dec_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
@@ -1598,7 +1600,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
        return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
                                   data->mds_ops, how, 0);
  out_bad:
-       nfs_retry_commit(head, NULL, cinfo);
+       nfs_retry_commit(head, NULL, cinfo, 0);
        cinfo->completion_ops->error_cleanup(NFS_I(inode));
        return -ENOMEM;
 }