[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