Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 972398fa authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4.1/flexfiles: Fix freeing of mirrors



Mirrors are now shared objects, so we should not be freeing them directly
inside ff_layout_free_lseg(). We should already be doing the right thing
in _ff_layout_free_lseg(), so just let it handle things.

Also ensure that ff_layout_free_mirror() frees the RPC credential if it
is set.

Fixes: 28a0d72c ("Add refcounting to struct nfs4_ff_layout_mirror")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 2d89a1d3
Loading
Loading
Loading
Loading
+2 −12
Original line number Diff line number Diff line
@@ -213,6 +213,8 @@ static void ff_layout_free_mirror(struct nfs4_ff_layout_mirror *mirror)
{
	ff_layout_remove_mirror(mirror);
	kfree(mirror->fh_versions);
	if (mirror->cred)
		put_rpccred(mirror->cred);
	nfs4_ff_layout_put_deviceid(mirror->mirror_ds);
	kfree(mirror);
}
@@ -525,21 +527,9 @@ static void
ff_layout_free_lseg(struct pnfs_layout_segment *lseg)
{
	struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg);
	int i;

	dprintk("--> %s\n", __func__);

	for (i = 0; i < fls->mirror_array_cnt; i++) {
		if (fls->mirror_array[i]) {
			nfs4_ff_layout_put_deviceid(fls->mirror_array[i]->mirror_ds);
			fls->mirror_array[i]->mirror_ds = NULL;
			if (fls->mirror_array[i]->cred) {
				put_rpccred(fls->mirror_array[i]->cred);
				fls->mirror_array[i]->cred = NULL;
			}
		}
	}

	if (lseg->pls_range.iomode == IOMODE_RW) {
		struct nfs4_flexfile_layout *ffl;
		struct inode *inode;