pnfs: pass ds_commit_idx through the commit path
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>
This commit is contained in:
parent
6cccbb6f52
commit
b57ff1303a
|
@ -649,7 +649,7 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
|
||||||
nfs_list_remove_request(req);
|
nfs_list_remove_request(req);
|
||||||
if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) {
|
if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) {
|
||||||
/* Note the rewrite will go through mds */
|
/* Note the rewrite will go through mds */
|
||||||
nfs_mark_request_commit(req, NULL, &cinfo);
|
nfs_mark_request_commit(req, NULL, &cinfo, 0);
|
||||||
} else
|
} else
|
||||||
nfs_release_request(req);
|
nfs_release_request(req);
|
||||||
nfs_unlock_and_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);
|
nfs_list_remove_request(req);
|
||||||
if (request_commit) {
|
if (request_commit) {
|
||||||
kref_get(&req->wb_kref);
|
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);
|
nfs_unlock_and_release_request(req);
|
||||||
}
|
}
|
||||||
|
|
|
@ -954,7 +954,8 @@ static u32 select_bucket_index(struct nfs4_filelayout_segment *fl, u32 j)
|
||||||
static void
|
static void
|
||||||
filelayout_mark_request_commit(struct nfs_page *req,
|
filelayout_mark_request_commit(struct nfs_page *req,
|
||||||
struct pnfs_layout_segment *lseg,
|
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);
|
struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg);
|
||||||
|
|
|
@ -450,13 +450,15 @@ int nfs_scan_commit(struct inode *inode, struct list_head *dst,
|
||||||
struct nfs_commit_info *cinfo);
|
struct nfs_commit_info *cinfo);
|
||||||
void nfs_mark_request_commit(struct nfs_page *req,
|
void nfs_mark_request_commit(struct nfs_page *req,
|
||||||
struct pnfs_layout_segment *lseg,
|
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_write_need_commit(struct nfs_pgio_header *);
|
||||||
int nfs_generic_commit_list(struct inode *inode, struct list_head *head,
|
int nfs_generic_commit_list(struct inode *inode, struct list_head *head,
|
||||||
int how, struct nfs_commit_info *cinfo);
|
int how, struct nfs_commit_info *cinfo);
|
||||||
void nfs_retry_commit(struct list_head *page_list,
|
void nfs_retry_commit(struct list_head *page_list,
|
||||||
struct pnfs_layout_segment *lseg,
|
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_commitdata_release(struct nfs_commit_data *data);
|
||||||
void nfs_request_add_commit_list(struct nfs_page *req, struct list_head *dst,
|
void nfs_request_add_commit_list(struct nfs_page *req, struct list_head *dst,
|
||||||
struct nfs_commit_info *cinfo);
|
struct nfs_commit_info *cinfo);
|
||||||
|
|
|
@ -137,7 +137,8 @@ struct pnfs_layoutdriver_type {
|
||||||
struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode);
|
struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode);
|
||||||
void (*mark_request_commit) (struct nfs_page *req,
|
void (*mark_request_commit) (struct nfs_page *req,
|
||||||
struct pnfs_layout_segment *lseg,
|
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,
|
void (*clear_request_commit) (struct nfs_page *req,
|
||||||
struct nfs_commit_info *cinfo);
|
struct nfs_commit_info *cinfo);
|
||||||
int (*scan_commit_lists) (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
|
static inline bool
|
||||||
pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
|
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 inode *inode = req->wb_context->dentry->d_inode;
|
||||||
struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
|
struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
|
||||||
|
|
||||||
if (lseg == NULL || ld->mark_request_commit == NULL)
|
if (lseg == NULL || ld->mark_request_commit == NULL)
|
||||||
return false;
|
return false;
|
||||||
ld->mark_request_commit(req, lseg, cinfo);
|
ld->mark_request_commit(req, lseg, cinfo, ds_commit_idx);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,7 +575,7 @@ pnfs_get_ds_info(struct inode *inode)
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,7 @@ static void pnfs_generic_retry_commit(struct nfs_commit_info *cinfo, int idx)
|
||||||
bucket = &fl_cinfo->buckets[i];
|
bucket = &fl_cinfo->buckets[i];
|
||||||
if (list_empty(&bucket->committing))
|
if (list_empty(&bucket->committing))
|
||||||
continue;
|
continue;
|
||||||
nfs_retry_commit(&bucket->committing, bucket->clseg, cinfo);
|
nfs_retry_commit(&bucket->committing, bucket->clseg, cinfo, i);
|
||||||
spin_lock(cinfo->lock);
|
spin_lock(cinfo->lock);
|
||||||
freeme = bucket->clseg;
|
freeme = bucket->clseg;
|
||||||
bucket->clseg = NULL;
|
bucket->clseg = NULL;
|
||||||
|
@ -247,7 +247,7 @@ pnfs_generic_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
|
||||||
list_add(&data->pages, &list);
|
list_add(&data->pages, &list);
|
||||||
nreq++;
|
nreq++;
|
||||||
} else {
|
} else {
|
||||||
nfs_retry_commit(mds_pages, NULL, cinfo);
|
nfs_retry_commit(mds_pages, NULL, cinfo, 0);
|
||||||
pnfs_generic_retry_commit(cinfo, 0);
|
pnfs_generic_retry_commit(cinfo, 0);
|
||||||
cinfo->completion_ops->error_cleanup(NFS_I(inode));
|
cinfo->completion_ops->error_cleanup(NFS_I(inode));
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -847,9 +847,9 @@ EXPORT_SYMBOL_GPL(nfs_init_cinfo);
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
nfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
|
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;
|
return;
|
||||||
nfs_request_add_commit_list(req, &cinfo->mds->list, cinfo);
|
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)) {
|
if (nfs_write_need_commit(hdr)) {
|
||||||
memcpy(&req->wb_verf, &hdr->verf.verifier, sizeof(req->wb_verf));
|
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;
|
goto next;
|
||||||
}
|
}
|
||||||
remove_req:
|
remove_req:
|
||||||
|
@ -1560,14 +1561,15 @@ EXPORT_SYMBOL_GPL(nfs_init_commit);
|
||||||
|
|
||||||
void nfs_retry_commit(struct list_head *page_list,
|
void nfs_retry_commit(struct list_head *page_list,
|
||||||
struct pnfs_layout_segment *lseg,
|
struct pnfs_layout_segment *lseg,
|
||||||
struct nfs_commit_info *cinfo)
|
struct nfs_commit_info *cinfo,
|
||||||
|
u32 ds_commit_idx)
|
||||||
{
|
{
|
||||||
struct nfs_page *req;
|
struct nfs_page *req;
|
||||||
|
|
||||||
while (!list_empty(page_list)) {
|
while (!list_empty(page_list)) {
|
||||||
req = nfs_list_entry(page_list->next);
|
req = nfs_list_entry(page_list->next);
|
||||||
nfs_list_remove_request(req);
|
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) {
|
if (!cinfo->dreq) {
|
||||||
dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
|
dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
|
||||||
dec_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
|
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),
|
return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
|
||||||
data->mds_ops, how, 0);
|
data->mds_ops, how, 0);
|
||||||
out_bad:
|
out_bad:
|
||||||
nfs_retry_commit(head, NULL, cinfo);
|
nfs_retry_commit(head, NULL, cinfo, 0);
|
||||||
cinfo->completion_ops->error_cleanup(NFS_I(inode));
|
cinfo->completion_ops->error_cleanup(NFS_I(inode));
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue