pNFS/flexfiles: Turn off layoutcommit for servers that don't need it
This patch ensures that we record the value of 'ffl_flags' from the layout, and then checks for the presence of the FF_FLAGS_NO_LAYOUTCOMMIT flag before deciding whether or not to call pnfs_set_layoutcommit(). The effect is that servers now can decide whether or not they want the client to call layoutcommit before returning a writeable layout. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
@@ -343,6 +343,10 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
|||||||
fls->mirror_array[i]->gid);
|
fls->mirror_array[i]->gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p = xdr_inline_decode(&stream, 4);
|
||||||
|
if (p)
|
||||||
|
fls->flags = be32_to_cpup(p);
|
||||||
|
|
||||||
ff_layout_sort_mirrors(fls);
|
ff_layout_sort_mirrors(fls);
|
||||||
rc = ff_layout_check_layout(lgr);
|
rc = ff_layout_check_layout(lgr);
|
||||||
if (rc)
|
if (rc)
|
||||||
@@ -1018,6 +1022,12 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
ff_layout_need_layoutcommit(struct pnfs_layout_segment *lseg)
|
||||||
|
{
|
||||||
|
return !(FF_LAYOUT_LSEG(lseg)->flags & FF_FLAGS_NO_LAYOUTCOMMIT);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We reference the rpc_cred of the first WRITE that triggers the need for
|
* We reference the rpc_cred of the first WRITE that triggers the need for
|
||||||
* a LAYOUTCOMMIT, and use it to send the layoutcommit compound.
|
* a LAYOUTCOMMIT, and use it to send the layoutcommit compound.
|
||||||
@@ -1030,6 +1040,9 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
|
|||||||
static void
|
static void
|
||||||
ff_layout_set_layoutcommit(struct nfs_pgio_header *hdr)
|
ff_layout_set_layoutcommit(struct nfs_pgio_header *hdr)
|
||||||
{
|
{
|
||||||
|
if (!ff_layout_need_layoutcommit(hdr->lseg))
|
||||||
|
return;
|
||||||
|
|
||||||
pnfs_set_layoutcommit(hdr->inode, hdr->lseg,
|
pnfs_set_layoutcommit(hdr->inode, hdr->lseg,
|
||||||
hdr->mds_offset + hdr->res.count);
|
hdr->mds_offset + hdr->res.count);
|
||||||
dprintk("%s inode %lu pls_end_pos %lu\n", __func__, hdr->inode->i_ino,
|
dprintk("%s inode %lu pls_end_pos %lu\n", __func__, hdr->inode->i_ino,
|
||||||
@@ -1221,7 +1234,8 @@ static int ff_layout_commit_done_cb(struct rpc_task *task,
|
|||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->verf.committed == NFS_UNSTABLE)
|
if (data->verf.committed == NFS_UNSTABLE
|
||||||
|
&& ff_layout_need_layoutcommit(data->lseg))
|
||||||
pnfs_set_layoutcommit(data->inode, data->lseg, data->lwb);
|
pnfs_set_layoutcommit(data->inode, data->lseg, data->lwb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -9,6 +9,8 @@
|
|||||||
#ifndef FS_NFS_NFS4FLEXFILELAYOUT_H
|
#ifndef FS_NFS_NFS4FLEXFILELAYOUT_H
|
||||||
#define FS_NFS_NFS4FLEXFILELAYOUT_H
|
#define FS_NFS_NFS4FLEXFILELAYOUT_H
|
||||||
|
|
||||||
|
#define FF_FLAGS_NO_LAYOUTCOMMIT 1
|
||||||
|
|
||||||
#include "../pnfs.h"
|
#include "../pnfs.h"
|
||||||
|
|
||||||
/* XXX: Let's filter out insanely large mirror count for now to avoid oom
|
/* XXX: Let's filter out insanely large mirror count for now to avoid oom
|
||||||
@@ -85,6 +87,7 @@ struct nfs4_ff_layout_mirror {
|
|||||||
struct nfs4_ff_layout_segment {
|
struct nfs4_ff_layout_segment {
|
||||||
struct pnfs_layout_segment generic_hdr;
|
struct pnfs_layout_segment generic_hdr;
|
||||||
u64 stripe_unit;
|
u64 stripe_unit;
|
||||||
|
u32 flags;
|
||||||
u32 mirror_array_cnt;
|
u32 mirror_array_cnt;
|
||||||
struct nfs4_ff_layout_mirror **mirror_array;
|
struct nfs4_ff_layout_mirror **mirror_array;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user