forked from luck/tmp_suning_uos_patched
NFS: Remove bucket array from struct pnfs_ds_commit_info
Remove the unused bucket array in struct pnfs_ds_commit_info. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
fb6b53ba40
commit
0aa647b736
|
@ -217,7 +217,6 @@ static void nfs_direct_req_free(struct kref *kref)
|
||||||
struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
|
struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
|
||||||
|
|
||||||
pnfs_release_ds_info(&dreq->ds_cinfo, dreq->inode);
|
pnfs_release_ds_info(&dreq->ds_cinfo, dreq->inode);
|
||||||
nfs_free_pnfs_ds_cinfo(&dreq->ds_cinfo);
|
|
||||||
if (dreq->l_ctx != NULL)
|
if (dreq->l_ctx != NULL)
|
||||||
nfs_put_lock_context(dreq->l_ctx);
|
nfs_put_lock_context(dreq->l_ctx);
|
||||||
if (dreq->ctx != NULL)
|
if (dreq->ctx != NULL)
|
||||||
|
|
|
@ -755,72 +755,12 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg)
|
||||||
flo = FILELAYOUT_FROM_HDR(lseg->pls_layout);
|
flo = FILELAYOUT_FROM_HDR(lseg->pls_layout);
|
||||||
inode = flo->generic_hdr.plh_inode;
|
inode = flo->generic_hdr.plh_inode;
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
flo->commit_info.nbuckets = 0;
|
|
||||||
kfree(flo->commit_info.buckets);
|
|
||||||
flo->commit_info.buckets = NULL;
|
|
||||||
pnfs_generic_ds_cinfo_release_lseg(&flo->commit_info, lseg);
|
pnfs_generic_ds_cinfo_release_lseg(&flo->commit_info, lseg);
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
}
|
}
|
||||||
_filelayout_free_lseg(fl);
|
_filelayout_free_lseg(fl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
filelayout_alloc_commit_info(struct pnfs_layout_segment *lseg,
|
|
||||||
struct nfs_commit_info *cinfo,
|
|
||||||
gfp_t gfp_flags)
|
|
||||||
{
|
|
||||||
struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg);
|
|
||||||
struct pnfs_commit_bucket *buckets;
|
|
||||||
int size, i;
|
|
||||||
|
|
||||||
if (fl->commit_through_mds)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
size = (fl->stripe_type == STRIPE_SPARSE) ?
|
|
||||||
fl->dsaddr->ds_num : fl->dsaddr->stripe_count;
|
|
||||||
|
|
||||||
if (cinfo->ds->nbuckets >= size) {
|
|
||||||
/* 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().
|
|
||||||
* */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
buckets = kcalloc(size, sizeof(struct pnfs_commit_bucket),
|
|
||||||
gfp_flags);
|
|
||||||
if (!buckets)
|
|
||||||
return -ENOMEM;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
INIT_LIST_HEAD(&buckets[i].written);
|
|
||||||
INIT_LIST_HEAD(&buckets[i].committing);
|
|
||||||
/* mark direct verifier as unset */
|
|
||||||
buckets[i].direct_verf.committed = NFS_INVALID_STABLE_HOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock(&cinfo->inode->i_lock);
|
|
||||||
if (cinfo->ds->nbuckets >= size)
|
|
||||||
goto out;
|
|
||||||
for (i = 0; i < cinfo->ds->nbuckets; i++) {
|
|
||||||
list_splice(&cinfo->ds->buckets[i].written,
|
|
||||||
&buckets[i].written);
|
|
||||||
list_splice(&cinfo->ds->buckets[i].committing,
|
|
||||||
&buckets[i].committing);
|
|
||||||
buckets[i].direct_verf.committed =
|
|
||||||
cinfo->ds->buckets[i].direct_verf.committed;
|
|
||||||
buckets[i].wlseg = cinfo->ds->buckets[i].wlseg;
|
|
||||||
buckets[i].clseg = cinfo->ds->buckets[i].clseg;
|
|
||||||
}
|
|
||||||
swap(cinfo->ds->buckets, buckets);
|
|
||||||
cinfo->ds->nbuckets = size;
|
|
||||||
out:
|
|
||||||
spin_unlock(&cinfo->inode->i_lock);
|
|
||||||
kfree(buckets);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct pnfs_layout_segment *
|
static struct pnfs_layout_segment *
|
||||||
filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid,
|
filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid,
|
||||||
struct nfs4_layoutget_res *lgr,
|
struct nfs4_layoutget_res *lgr,
|
||||||
|
@ -943,9 +883,6 @@ static void
|
||||||
filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
||||||
struct nfs_page *req)
|
struct nfs_page *req)
|
||||||
{
|
{
|
||||||
struct nfs_commit_info cinfo;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
pnfs_generic_pg_check_layout(pgio);
|
pnfs_generic_pg_check_layout(pgio);
|
||||||
if (!pgio->pg_lseg) {
|
if (!pgio->pg_lseg) {
|
||||||
pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode,
|
pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode,
|
||||||
|
@ -964,17 +901,7 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
||||||
|
|
||||||
/* If no lseg, fall back to write through mds */
|
/* If no lseg, fall back to write through mds */
|
||||||
if (pgio->pg_lseg == NULL)
|
if (pgio->pg_lseg == NULL)
|
||||||
goto out_mds;
|
nfs_pageio_reset_write_mds(pgio);
|
||||||
nfs_init_cinfo(&cinfo, pgio->pg_inode, pgio->pg_dreq);
|
|
||||||
status = filelayout_alloc_commit_info(pgio->pg_lseg, &cinfo, GFP_NOFS);
|
|
||||||
if (status < 0) {
|
|
||||||
pnfs_put_lseg(pgio->pg_lseg);
|
|
||||||
pgio->pg_lseg = NULL;
|
|
||||||
goto out_mds;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
out_mds:
|
|
||||||
nfs_pageio_reset_write_mds(pgio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct nfs_pageio_ops filelayout_pg_read_ops = {
|
static const struct nfs_pageio_ops filelayout_pg_read_ops = {
|
||||||
|
|
|
@ -550,17 +550,6 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
||||||
goto out_free_page;
|
goto out_free_page;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ff_layout_has_rw_segments(struct pnfs_layout_hdr *layout)
|
|
||||||
{
|
|
||||||
struct pnfs_layout_segment *lseg;
|
|
||||||
|
|
||||||
list_for_each_entry(lseg, &layout->plh_segs, pls_list)
|
|
||||||
if (lseg->pls_range.iomode == IOMODE_RW)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ff_layout_free_lseg(struct pnfs_layout_segment *lseg)
|
ff_layout_free_lseg(struct pnfs_layout_segment *lseg)
|
||||||
{
|
{
|
||||||
|
@ -575,24 +564,12 @@ ff_layout_free_lseg(struct pnfs_layout_segment *lseg)
|
||||||
ffl = FF_LAYOUT_FROM_HDR(lseg->pls_layout);
|
ffl = FF_LAYOUT_FROM_HDR(lseg->pls_layout);
|
||||||
inode = ffl->generic_hdr.plh_inode;
|
inode = ffl->generic_hdr.plh_inode;
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
if (!ff_layout_has_rw_segments(lseg->pls_layout)) {
|
|
||||||
ffl->commit_info.nbuckets = 0;
|
|
||||||
kfree(ffl->commit_info.buckets);
|
|
||||||
ffl->commit_info.buckets = NULL;
|
|
||||||
}
|
|
||||||
pnfs_generic_ds_cinfo_release_lseg(&ffl->commit_info, lseg);
|
pnfs_generic_ds_cinfo_release_lseg(&ffl->commit_info, lseg);
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
}
|
}
|
||||||
_ff_layout_free_lseg(fls);
|
_ff_layout_free_lseg(fls);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 until we have multiple lsegs support */
|
|
||||||
static int
|
|
||||||
ff_layout_get_lseg_count(struct nfs4_ff_layout_segment *fls)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nfs4_ff_start_busy_timer(struct nfs4_ff_busy_timer *timer, ktime_t now)
|
nfs4_ff_start_busy_timer(struct nfs4_ff_busy_timer *timer, ktime_t now)
|
||||||
{
|
{
|
||||||
|
@ -737,52 +714,6 @@ nfs4_ff_layout_stat_io_end_write(struct rpc_task *task,
|
||||||
spin_unlock(&mirror->lock);
|
spin_unlock(&mirror->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
ff_layout_alloc_commit_info(struct pnfs_layout_segment *lseg,
|
|
||||||
struct nfs_commit_info *cinfo,
|
|
||||||
gfp_t gfp_flags)
|
|
||||||
{
|
|
||||||
struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg);
|
|
||||||
struct pnfs_commit_bucket *buckets;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
if (cinfo->ds->nbuckets != 0) {
|
|
||||||
/* This assumes there is only one RW lseg per file.
|
|
||||||
* To support multiple lseg per file, we need to
|
|
||||||
* change struct pnfs_commit_bucket to allow dynamic
|
|
||||||
* increasing nbuckets.
|
|
||||||
*/
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
size = ff_layout_get_lseg_count(fls) * FF_LAYOUT_MIRROR_COUNT(lseg);
|
|
||||||
|
|
||||||
buckets = kcalloc(size, sizeof(struct pnfs_commit_bucket),
|
|
||||||
gfp_flags);
|
|
||||||
if (!buckets)
|
|
||||||
return -ENOMEM;
|
|
||||||
else {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
spin_lock(&cinfo->inode->i_lock);
|
|
||||||
if (cinfo->ds->nbuckets != 0)
|
|
||||||
kfree(buckets);
|
|
||||||
else {
|
|
||||||
cinfo->ds->buckets = buckets;
|
|
||||||
cinfo->ds->nbuckets = size;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
INIT_LIST_HEAD(&buckets[i].written);
|
|
||||||
INIT_LIST_HEAD(&buckets[i].committing);
|
|
||||||
/* mark direct verifier as unset */
|
|
||||||
buckets[i].direct_verf.committed =
|
|
||||||
NFS_INVALID_STABLE_HOW;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock(&cinfo->inode->i_lock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ff_layout_mark_ds_unreachable(struct pnfs_layout_segment *lseg, int idx)
|
ff_layout_mark_ds_unreachable(struct pnfs_layout_segment *lseg, int idx)
|
||||||
{
|
{
|
||||||
|
@ -944,10 +875,8 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
||||||
{
|
{
|
||||||
struct nfs4_ff_layout_mirror *mirror;
|
struct nfs4_ff_layout_mirror *mirror;
|
||||||
struct nfs_pgio_mirror *pgm;
|
struct nfs_pgio_mirror *pgm;
|
||||||
struct nfs_commit_info cinfo;
|
|
||||||
struct nfs4_pnfs_ds *ds;
|
struct nfs4_pnfs_ds *ds;
|
||||||
int i;
|
int i;
|
||||||
int status;
|
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
pnfs_generic_pg_check_layout(pgio);
|
pnfs_generic_pg_check_layout(pgio);
|
||||||
|
@ -969,11 +898,6 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
||||||
if (pgio->pg_lseg == NULL)
|
if (pgio->pg_lseg == NULL)
|
||||||
goto out_mds;
|
goto out_mds;
|
||||||
|
|
||||||
nfs_init_cinfo(&cinfo, pgio->pg_inode, pgio->pg_dreq);
|
|
||||||
status = ff_layout_alloc_commit_info(pgio->pg_lseg, &cinfo, GFP_NOFS);
|
|
||||||
if (status < 0)
|
|
||||||
goto out_mds;
|
|
||||||
|
|
||||||
/* Use a direct mapping of ds_idx to pgio mirror_idx */
|
/* Use a direct mapping of ds_idx to pgio mirror_idx */
|
||||||
if (WARN_ON_ONCE(pgio->pg_mirror_count !=
|
if (WARN_ON_ONCE(pgio->pg_mirror_count !=
|
||||||
FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg)))
|
FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg)))
|
||||||
|
|
|
@ -531,9 +531,6 @@ void nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info *cinfo)
|
||||||
{
|
{
|
||||||
struct pnfs_commit_array *array;
|
struct pnfs_commit_array *array;
|
||||||
|
|
||||||
pnfs_bucket_clear_pnfs_ds_commit_verifiers(cinfo->buckets,
|
|
||||||
cinfo->nbuckets);
|
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(array, &cinfo->commits, cinfo_list)
|
list_for_each_entry_rcu(array, &cinfo->commits, cinfo_list)
|
||||||
pnfs_bucket_clear_pnfs_ds_commit_verifiers(array->buckets,
|
pnfs_bucket_clear_pnfs_ds_commit_verifiers(array->buckets,
|
||||||
|
|
|
@ -292,12 +292,6 @@ int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max)
|
||||||
struct pnfs_commit_array *array;
|
struct pnfs_commit_array *array;
|
||||||
int rv = 0, cnt;
|
int rv = 0, cnt;
|
||||||
|
|
||||||
cnt = pnfs_bucket_scan_array(cinfo, fl_cinfo->buckets,
|
|
||||||
fl_cinfo->nbuckets, max);
|
|
||||||
rv += cnt;
|
|
||||||
max -= cnt;
|
|
||||||
if (!max)
|
|
||||||
return rv;
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(array, &fl_cinfo->commits, cinfo_list) {
|
list_for_each_entry_rcu(array, &fl_cinfo->commits, cinfo_list) {
|
||||||
if (!array->lseg || !pnfs_get_commit_array(array))
|
if (!array->lseg || !pnfs_get_commit_array(array))
|
||||||
|
@ -353,11 +347,6 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
|
||||||
unsigned int nwritten;
|
unsigned int nwritten;
|
||||||
|
|
||||||
lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
|
lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
|
||||||
nwritten = pnfs_bucket_recover_commit_reqs(dst,
|
|
||||||
fl_cinfo->buckets,
|
|
||||||
fl_cinfo->nbuckets,
|
|
||||||
cinfo);
|
|
||||||
fl_cinfo->nwritten -= nwritten;
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(array, &fl_cinfo->commits, cinfo_list) {
|
list_for_each_entry_rcu(array, &fl_cinfo->commits, cinfo_list) {
|
||||||
if (!array->lseg || !pnfs_get_commit_array(array))
|
if (!array->lseg || !pnfs_get_commit_array(array))
|
||||||
|
@ -412,10 +401,6 @@ pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, struct page *page
|
||||||
struct pnfs_commit_array *array;
|
struct pnfs_commit_array *array;
|
||||||
struct nfs_page *req;
|
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) {
|
list_for_each_entry(array, &fl_cinfo->commits, cinfo_list) {
|
||||||
req = pnfs_bucket_search_commit_reqs(array->buckets,
|
req = pnfs_bucket_search_commit_reqs(array->buckets,
|
||||||
array->nbuckets, page);
|
array->nbuckets, page);
|
||||||
|
@ -550,9 +535,6 @@ pnfs_generic_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
|
||||||
nreq++;
|
nreq++;
|
||||||
}
|
}
|
||||||
|
|
||||||
nreq += pnfs_bucket_alloc_ds_commits(&list, fl_cinfo->buckets,
|
|
||||||
fl_cinfo->nbuckets, cinfo);
|
|
||||||
|
|
||||||
nreq += pnfs_alloc_ds_commits_list(&list, fl_cinfo, cinfo);
|
nreq += pnfs_alloc_ds_commits_list(&list, fl_cinfo, cinfo);
|
||||||
if (nreq == 0)
|
if (nreq == 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -1284,8 +1284,6 @@ struct pnfs_ds_commit_info {
|
||||||
struct list_head commits;
|
struct list_head commits;
|
||||||
unsigned int nwritten;
|
unsigned int nwritten;
|
||||||
unsigned int ncommitting;
|
unsigned int ncommitting;
|
||||||
unsigned int nbuckets;
|
|
||||||
struct pnfs_commit_bucket *buckets;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfs41_state_protection {
|
struct nfs41_state_protection {
|
||||||
|
@ -1396,22 +1394,11 @@ struct nfs41_free_stateid_res {
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
|
||||||
nfs_free_pnfs_ds_cinfo(struct pnfs_ds_commit_info *cinfo)
|
|
||||||
{
|
|
||||||
kfree(cinfo->buckets);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
struct pnfs_ds_commit_info {
|
struct pnfs_ds_commit_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
|
||||||
nfs_free_pnfs_ds_cinfo(struct pnfs_ds_commit_info *cinfo)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_NFS_V4_1 */
|
#endif /* CONFIG_NFS_V4_1 */
|
||||||
|
|
||||||
#ifdef CONFIG_NFS_V4_2
|
#ifdef CONFIG_NFS_V4_2
|
||||||
|
|
Loading…
Reference in New Issue
Block a user