mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-06 20:03:33 -04:00
NFSv4/pnfs: pnfs_set_layout_stateid() should update the layout cred
[ Upstream commit 59b5639490f51aa604d18064dcf0c2d72eb1decf ]
If the cred assigned to the layout that we're updating differs from
the one used to retrieve the new layout segment, then we need to
update the layout plh_lc_cred field.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Stable-dep-of: 6d6d7f91cc8c ("NFSv4/pnfs: Reset the layout state after a layoutreturn")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7f42126b61
commit
1057c7ae8b
3 changed files with 18 additions and 5 deletions
|
|
@ -284,7 +284,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,
|
|||
goto unlock;
|
||||
}
|
||||
|
||||
pnfs_set_layout_stateid(lo, &args->cbl_stateid, true);
|
||||
pnfs_set_layout_stateid(lo, &args->cbl_stateid, NULL, true);
|
||||
switch (pnfs_mark_matching_lsegs_return(lo, &free_me_list,
|
||||
&args->cbl_range,
|
||||
be32_to_cpu(args->cbl_stateid.seqid))) {
|
||||
|
|
|
|||
|
|
@ -943,10 +943,21 @@ pnfs_destroy_all_layouts(struct nfs_client *clp)
|
|||
pnfs_destroy_layouts_byclid(clp, false);
|
||||
}
|
||||
|
||||
static void
|
||||
pnfs_set_layout_cred(struct pnfs_layout_hdr *lo, const struct cred *cred)
|
||||
{
|
||||
const struct cred *old;
|
||||
|
||||
if (cred && cred_fscmp(lo->plh_lc_cred, cred) != 0) {
|
||||
old = xchg(&lo->plh_lc_cred, get_cred(cred));
|
||||
put_cred(old);
|
||||
}
|
||||
}
|
||||
|
||||
/* update lo->plh_stateid with new if is more recent */
|
||||
void
|
||||
pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
|
||||
bool update_barrier)
|
||||
const struct cred *cred, bool update_barrier)
|
||||
{
|
||||
u32 oldseq, newseq, new_barrier = 0;
|
||||
|
||||
|
|
@ -954,6 +965,7 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
|
|||
newseq = be32_to_cpu(new->seqid);
|
||||
|
||||
if (!pnfs_layout_is_valid(lo)) {
|
||||
pnfs_set_layout_cred(lo, cred);
|
||||
nfs4_stateid_copy(&lo->plh_stateid, new);
|
||||
lo->plh_barrier = newseq;
|
||||
pnfs_clear_layoutreturn_info(lo);
|
||||
|
|
@ -1149,7 +1161,7 @@ void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,
|
|||
|
||||
pnfs_mark_matching_lsegs_invalid(lo, &freeme, range, seq);
|
||||
pnfs_free_returned_lsegs(lo, &freeme, range, seq);
|
||||
pnfs_set_layout_stateid(lo, stateid, true);
|
||||
pnfs_set_layout_stateid(lo, stateid, NULL, true);
|
||||
} else
|
||||
pnfs_mark_layout_stateid_invalid(lo, &freeme);
|
||||
out_unlock:
|
||||
|
|
@ -2382,14 +2394,14 @@ pnfs_layout_process(struct nfs4_layoutget *lgp)
|
|||
|
||||
if (!pnfs_layout_is_valid(lo)) {
|
||||
/* We have a completely new layout */
|
||||
pnfs_set_layout_stateid(lo, &res->stateid, true);
|
||||
pnfs_set_layout_stateid(lo, &res->stateid, lgp->cred, true);
|
||||
} else if (nfs4_stateid_match_other(&lo->plh_stateid, &res->stateid)) {
|
||||
/* existing state ID, make sure the sequence number matches. */
|
||||
if (pnfs_layout_stateid_blocked(lo, &res->stateid)) {
|
||||
dprintk("%s forget reply due to sequence\n", __func__);
|
||||
goto out_forget;
|
||||
}
|
||||
pnfs_set_layout_stateid(lo, &res->stateid, false);
|
||||
pnfs_set_layout_stateid(lo, &res->stateid, lgp->cred, false);
|
||||
} else {
|
||||
/*
|
||||
* We got an entirely new state ID. Mark all segments for the
|
||||
|
|
|
|||
|
|
@ -270,6 +270,7 @@ bool nfs4_layout_refresh_old_stateid(nfs4_stateid *dst,
|
|||
void pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo);
|
||||
void pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
|
||||
const nfs4_stateid *new,
|
||||
const struct cred *cred,
|
||||
bool update_barrier);
|
||||
int pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
||||
struct list_head *tmp_list,
|
||||
|
|
|
|||
Loading…
Reference in a new issue