NFSv4.1: alloc and free commit_buckets
Create a preallocated list header to hold nfs_pages for each non-MDS COMMIT destination. Note this is not necessarily each DS, but is basically each <DS, fh> pair. Signed-off-by: Fred Isaman <iisaman@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
c879513e91
commit
425eb736cd
2 changed files with 24 additions and 0 deletions
|
@ -503,6 +503,7 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg)
|
|||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs4_fl_put_deviceid(fl->dsaddr);
|
||||
kfree(fl->commit_buckets);
|
||||
_filelayout_free_lseg(fl);
|
||||
}
|
||||
|
||||
|
@ -524,6 +525,27 @@ filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid,
|
|||
_filelayout_free_lseg(fl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This assumes there is only one IOMODE_RW lseg. What
|
||||
* we really want to do is have a layout_hdr level
|
||||
* dictionary of <multipath_list4, fh> keys, each
|
||||
* associated with a struct list_head, populated by calls
|
||||
* to filelayout_write_pagelist().
|
||||
* */
|
||||
if ((!fl->commit_through_mds) && (lgr->range.iomode == IOMODE_RW)) {
|
||||
int i;
|
||||
int size = (fl->stripe_type == STRIPE_SPARSE) ?
|
||||
fl->dsaddr->ds_num : fl->dsaddr->stripe_count;
|
||||
|
||||
fl->commit_buckets = kcalloc(size, sizeof(struct list_head), GFP_KERNEL);
|
||||
if (!fl->commit_buckets) {
|
||||
filelayout_free_lseg(&fl->generic_hdr);
|
||||
return NULL;
|
||||
}
|
||||
fl->number_of_buckets = size;
|
||||
for (i = 0; i < size; i++)
|
||||
INIT_LIST_HEAD(&fl->commit_buckets[i]);
|
||||
}
|
||||
return &fl->generic_hdr;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,6 +79,8 @@ struct nfs4_filelayout_segment {
|
|||
struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */
|
||||
unsigned int num_fh;
|
||||
struct nfs_fh **fh_array;
|
||||
struct list_head *commit_buckets; /* Sort commits to ds */
|
||||
int number_of_buckets;
|
||||
};
|
||||
|
||||
static inline struct nfs4_filelayout_segment *
|
||||
|
|
Loading…
Reference in a new issue