NFS/pNFS: Add a helper pnfs_generic_search_commit_reqs()
Lift filelayout_search_commit_reqs() into the generic pnfs/nfs code, and add support for commit arrays. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
ba827c9abb
commit
fb6b53ba40
@ -1083,36 +1083,6 @@ out_err:
|
|||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* filelayout_search_commit_reqs - Search lists in @cinfo for the head reqest
|
|
||||||
* for @page
|
|
||||||
* @cinfo - commit info for current inode
|
|
||||||
* @page - page to search for matching head request
|
|
||||||
*
|
|
||||||
* Returns a the head request if one is found, otherwise returns NULL.
|
|
||||||
*/
|
|
||||||
static struct nfs_page *
|
|
||||||
filelayout_search_commit_reqs(struct nfs_commit_info *cinfo, struct page *page)
|
|
||||||
{
|
|
||||||
struct nfs_page *freq, *t;
|
|
||||||
struct pnfs_commit_bucket *b;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Linearly search the commit lists for each bucket until a matching
|
|
||||||
* request is found */
|
|
||||||
for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {
|
|
||||||
list_for_each_entry_safe(freq, t, &b->written, wb_list) {
|
|
||||||
if (freq->wb_page == page)
|
|
||||||
return freq->wb_head;
|
|
||||||
}
|
|
||||||
list_for_each_entry_safe(freq, t, &b->committing, wb_list) {
|
|
||||||
if (freq->wb_page == page)
|
|
||||||
return freq->wb_head;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
filelayout_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
|
filelayout_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
|
||||||
int how, struct nfs_commit_info *cinfo)
|
int how, struct nfs_commit_info *cinfo)
|
||||||
@ -1217,7 +1187,7 @@ static struct pnfs_layoutdriver_type filelayout_type = {
|
|||||||
.clear_request_commit = pnfs_generic_clear_request_commit,
|
.clear_request_commit = pnfs_generic_clear_request_commit,
|
||||||
.scan_commit_lists = pnfs_generic_scan_commit_lists,
|
.scan_commit_lists = pnfs_generic_scan_commit_lists,
|
||||||
.recover_commit_reqs = pnfs_generic_recover_commit_reqs,
|
.recover_commit_reqs = pnfs_generic_recover_commit_reqs,
|
||||||
.search_commit_reqs = filelayout_search_commit_reqs,
|
.search_commit_reqs = pnfs_generic_search_commit_reqs,
|
||||||
.commit_pagelist = filelayout_commit_pagelist,
|
.commit_pagelist = filelayout_commit_pagelist,
|
||||||
.read_pagelist = filelayout_read_pagelist,
|
.read_pagelist = filelayout_read_pagelist,
|
||||||
.write_pagelist = filelayout_write_pagelist,
|
.write_pagelist = filelayout_write_pagelist,
|
||||||
|
@ -388,6 +388,8 @@ void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data);
|
|||||||
void pnfs_generic_rw_release(void *data);
|
void pnfs_generic_rw_release(void *data);
|
||||||
void pnfs_generic_recover_commit_reqs(struct list_head *dst,
|
void pnfs_generic_recover_commit_reqs(struct list_head *dst,
|
||||||
struct nfs_commit_info *cinfo);
|
struct nfs_commit_info *cinfo);
|
||||||
|
struct nfs_page *pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo,
|
||||||
|
struct page *page);
|
||||||
int pnfs_generic_commit_pagelist(struct inode *inode,
|
int pnfs_generic_commit_pagelist(struct inode *inode,
|
||||||
struct list_head *mds_pages,
|
struct list_head *mds_pages,
|
||||||
int how,
|
int how,
|
||||||
|
@ -375,6 +375,57 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
|
EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
|
||||||
|
|
||||||
|
static struct nfs_page *
|
||||||
|
pnfs_bucket_search_commit_reqs(struct pnfs_commit_bucket *buckets,
|
||||||
|
unsigned int nbuckets, struct page *page)
|
||||||
|
{
|
||||||
|
struct nfs_page *req;
|
||||||
|
struct pnfs_commit_bucket *b;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
/* Linearly search the commit lists for each bucket until a matching
|
||||||
|
* request is found */
|
||||||
|
for (i = 0, b = buckets; i < nbuckets; i++, b++) {
|
||||||
|
list_for_each_entry(req, &b->written, wb_list) {
|
||||||
|
if (req->wb_page == page)
|
||||||
|
return req->wb_head;
|
||||||
|
}
|
||||||
|
list_for_each_entry(req, &b->committing, wb_list) {
|
||||||
|
if (req->wb_page == page)
|
||||||
|
return req->wb_head;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pnfs_generic_search_commit_reqs - Search lists in @cinfo for the head reqest
|
||||||
|
* for @page
|
||||||
|
* @cinfo - commit info for current inode
|
||||||
|
* @page - page to search for matching head request
|
||||||
|
*
|
||||||
|
* Returns a the head request if one is found, otherwise returns NULL.
|
||||||
|
*/
|
||||||
|
struct nfs_page *
|
||||||
|
pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, struct page *page)
|
||||||
|
{
|
||||||
|
struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
|
||||||
|
struct pnfs_commit_array *array;
|
||||||
|
struct nfs_page *req;
|
||||||
|
|
||||||
|
req = pnfs_bucket_search_commit_reqs(fl_cinfo->buckets,
|
||||||
|
fl_cinfo->nbuckets, page);
|
||||||
|
if (req)
|
||||||
|
return req;
|
||||||
|
list_for_each_entry(array, &fl_cinfo->commits, cinfo_list) {
|
||||||
|
req = pnfs_bucket_search_commit_reqs(array->buckets,
|
||||||
|
array->nbuckets, page);
|
||||||
|
if (req)
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pnfs_generic_search_commit_reqs);
|
||||||
|
|
||||||
static struct pnfs_layout_segment *
|
static struct pnfs_layout_segment *
|
||||||
pnfs_bucket_get_committing(struct list_head *head,
|
pnfs_bucket_get_committing(struct list_head *head,
|
||||||
struct pnfs_commit_bucket *bucket,
|
struct pnfs_commit_bucket *bucket,
|
||||||
|
Loading…
Reference in New Issue
Block a user