[pnfs] [PATCH 1/2] layout commit changes
Benny Halevy
bhalevy at panasas.com
Tue Nov 28 03:13:20 EST 2006
- commit layout before close if needed
- mark inode for layout commit after successful synchronous writes
and in the async writeback path (always for non-nfsv4 layout types).
Signed-off-by: Benny Halevy bhalevy at panasas.com
diff -x CVS -urp a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
--- a/fs/nfs/nfs4state.c 2006-03-16 19:58:32.000000000 +0200
+++ b/fs/nfs/nfs4state.c 2006-11-27 11:15:10.000000000 +0200
@@ -51,6 +51,7 @@
#include "nfs4_fs.h"
#include "callback.h"
#include "delegation.h"
+#include "pnfs.h"
#define OPENOWNER_POOL_SIZE 8
@@ -510,8 +511,15 @@ void nfs4_close_state(struct nfs4_state
spin_unlock(&inode->i_lock);
spin_unlock(&owner->so_lock);
- if (oldstate != newstate && nfs4_do_close(inode, state) == 0)
- return;
+ if (oldstate != newstate) {
+ if (pnfs_enabled_sb(NFS_SERVER(inode))) {
+ if (NFS_I(inode)->layoutcommit_ctx) {
+ pnfs_layoutcommit_inode(inode, 0);
+ }
+ }
+ if (nfs4_do_close(inode, state) == 0)
+ return;
+ }
nfs4_put_open_state(state);
nfs4_put_state_owner(owner);
}
diff -x CVS -urp a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
--- a/fs/nfs/pnfs.c 2006-11-27 10:26:43.000000000 +0200
+++ b/fs/nfs/pnfs.c 2006-11-27 11:22:45.000000000 +0200
@@ -162,10 +162,12 @@ find_pnfs(int id, struct pnfs_module **m
void
pnfs_need_layoutcommit(struct nfs_inode* nfsi, struct nfs_open_context
*ctx)
{
+ dprintk("%s: current_layout=%p layoutcommit_ctx=%p
ctx=%p\n",__FUNCTION__,
+ nfsi->current_layout, nfsi->layoutcommit_ctx, ctx);
spin_lock(&pnfs_spinlock);
if (nfsi->current_layout && !nfsi->layoutcommit_ctx) {
- dprintk("%s: Setting layoutcommit flag\n",__FUNCTION__);
nfsi->layoutcommit_ctx = get_nfs_open_context(ctx);
+ dprintk("%s: Set layoutcommit_ctx=%p\n",__FUNCTION__,
nfsi->layoutcommit_ctx);
}
spin_unlock(&pnfs_spinlock);
}
@@ -760,7 +762,12 @@ pnfs_writepages(struct nfs_write_data* w
how,
wdata);
- out:
+ if (status > 0) {
+ pnfs_update_last_write(nfsi, args->offset, status);
+ pnfs_need_layoutcommit(nfsi, wdata->args.context);
+ }
+
+out:
dprintk("%s: End Status %d\n",__FUNCTION__, status);
return status;
}
@@ -1214,6 +1221,7 @@ pnfs_layoutcommit_setup(struct pnfs_layo
struct nfs_server *nfss = NFS_SERVER(data->inode);
struct nfs4_client *clp = nfss->nfs4_state;
+ dprintk("%s Begin (sync:%d)\n", __FUNCTION__, sync);
data->args.fh = NFS_FH(data->inode);
data->args.clientid = clp->cl_clientid;
data->args.layout_type = nfss->pnfs_curr_ld->id;
@@ -1276,7 +1284,7 @@ pnfs_layoutcommit_inode(struct inode *in
struct nfs_inode *nfsi = NFS_I(inode);
int status = 0;
- dprintk("%s Begin\n", __FUNCTION__);
+ dprintk("%s Begin (sync:%d)\n", __FUNCTION__, sync);
data = pnfs_layoutcommit_alloc();
if (!data)
@@ -1313,6 +1321,7 @@ pnfs_layoutcommit_inode(struct inode *in
pnfs_execute_layoutcommit(data);
}
out:
+ dprintk("%s end (err:%d)\n", __FUNCTION__, status);
return status;
out_unlock:
spin_unlock(&pnfs_spinlock);
diff -x CVS -urp a/fs/nfs/write.c b/fs/nfs/write.c
--- a/fs/nfs/write.c 2006-11-16 09:38:25.000000000 +0200
+++ b/fs/nfs/write.c 2006-11-27 11:27:16.000000000 +0200
@@ -1356,10 +1356,11 @@ void pnfs_writeback_done_update(struct n
struct nfs_writeres *resp = &data->res;
struct nfs_inode *nfsi = NFS_I(data->inode);
+ dprintk("%s: (count:%d)\n", __FUNCTION__, resp->count);
if(resp->count > 0 && pnfs_use_write(data->inode, argp->count)) {
pnfs_update_last_write(nfsi, argp->offset, resp->count);
- if (pnfs_use_nfsv4_wproto(data->inode, argp->count) &&
+ if (!pnfs_use_nfsv4_wproto(data->inode, argp->count) ||
((resp->verf->committed == NFS_FILE_SYNC) ||
(data->how == FLUSH_STABLE && data->call_ops == NULL)))
pnfs_need_layoutcommit(nfsi, argp->context);
More information about the pNFS
mailing list