]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFSv4/pnfs: Support a list of commit arrays in struct pnfs_ds_commit_info
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 19 Mar 2020 17:36:36 +0000 (13:36 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 27 Mar 2020 20:34:34 +0000 (16:34 -0400)
When we have multiple layout segments with different lists of mirrored
data, we need to track the commits on a per layout segment basis.
This patch adds a list to support this tracking in struct
pnfs_ds_commit_info.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/direct.c
fs/nfs/filelayout/filelayout.c
fs/nfs/flexfilelayout/flexfilelayout.c
fs/nfs/pnfs.h
include/linux/nfs_xdr.h

index ade2435551c89a307b2ce4e51ef603591bee0924..f9a73febce02f2f8213e140f237cb0d78f22e4ba 100644 (file)
@@ -305,6 +305,7 @@ static inline struct nfs_direct_req *nfs_direct_req_alloc(void)
        kref_get(&dreq->kref);
        init_completion(&dreq->completion);
        INIT_LIST_HEAD(&dreq->mds_cinfo.list);
+       pnfs_init_ds_commit_info(&dreq->ds_cinfo);
        dreq->verf.committed = NFS_INVALID_STABLE_HOW;  /* not set yet */
        INIT_WORK(&dreq->work, nfs_direct_write_schedule_work);
        spin_lock_init(&dreq->lock);
index bd234394a87ca4c578f3786d283fa4a6ed8a1398..b051d5d320ba622f5bdb7d73952df82ed1e3fcf1 100644 (file)
@@ -1140,7 +1140,10 @@ filelayout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
        struct nfs4_filelayout *flo;
 
        flo = kzalloc(sizeof(*flo), gfp_flags);
-       return flo != NULL ? &flo->generic_hdr : NULL;
+       if (flo == NULL)
+               return NULL;
+       pnfs_init_ds_commit_info(&flo->commit_info);
+       return &flo->generic_hdr;
 }
 
 static void
index 19728206e9c6c4e67ca93bf879432a69b7ca73cd..c9e79c8e62cd561a8707a3dbd22c3f25dcda1d91 100644 (file)
@@ -48,6 +48,7 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
 
        ffl = kzalloc(sizeof(*ffl), gfp_flags);
        if (ffl) {
+               pnfs_init_ds_commit_info(&ffl->commit_info);
                INIT_LIST_HEAD(&ffl->error_list);
                INIT_LIST_HEAD(&ffl->mirrors);
                ffl->last_report_time = ktime_get();
index f6b1099aa151041faf77ed218d41f4c4e8037568..b293afb48d044ced5664a862c9ca98464e072616 100644 (file)
@@ -462,6 +462,12 @@ pnfs_get_ds_info(struct inode *inode)
        return ld->get_ds_info(inode);
 }
 
+static inline void
+pnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo)
+{
+       INIT_LIST_HEAD(&fl_cinfo->commits);
+}
+
 static inline void
 pnfs_generic_mark_devid_invalid(struct nfs4_deviceid_node *node)
 {
@@ -759,6 +765,11 @@ pnfs_get_ds_info(struct inode *inode)
        return NULL;
 }
 
+static inline void
+pnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo)
+{
+}
+
 static inline bool
 pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
                         struct nfs_commit_info *cinfo, u32 ds_commit_idx)
index e91c917c9c1c15040b19cd4c06f3fd44956532ee..9946787eda72c4f85be4cfba10845490f72a79b1 100644 (file)
@@ -1280,6 +1280,7 @@ struct pnfs_commit_array {
 };
 
 struct pnfs_ds_commit_info {
+       struct list_head commits;
        unsigned int nwritten;
        unsigned int ncommitting;
        unsigned int nbuckets;