Commit c0f5f505 authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 122d328d
...@@ -343,6 +343,10 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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 { ...@@ -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;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment