Hi Walt,

> Ooops.  Looks like you haven't commited the changes yet?
Nope. I did not want to check things in without you looking over it once..
>
> Anyway, please change the first one to read:
>
> if (!smcb->op_completed)
> {
>      smcb->op_completed = 1;
>      s_completion_list[s_completion_list_index++] = smcb;
> }
> gen_mutex_unlock(&s_completion_list_mutex);
> return 0;
>
> goto's are no-no's  :-(
hehe.. ok.. I have been staring/doing too much kernel style coding
lately..
Done!
>
> Then go ahead and commit and I'll check things out here.
> Again, thanks for your help!

Just checked it in,,
thanks!
Murali
>
> Walt
>
> Murali Vilayannur wrote:
> > Walt,
> > I made the following changes to get the kmod and client-core working with
> > the WALT3 branch.
> > While it works now, I do not know if these are the right sets of fixes..
> > I did a few stress tests and all tests through the vfs do seem to pass
> > now..
> > thanks,
> > Murali
> >
> >
> > OK, I think I fixed the small-io problem and the mkdir problem.
> > That only leaves the mounting problem.  I've never attempted to build
> > the kernel interface or mount the file system (being the old goat that I
> > am) so that might take a bit.
> >
> > I'll commit the changes I made and you can run them in the next nightly
> > to see if anything new pops up.
> >
> > Walt
> >
> >
> > ------------------------------------------------------------------------
> >
> > Index: src/client/sysint/client-state-machine.c
> > ===================================================================
> > RCS file: 
> > /projects/cvsroot/pvfs2-1/src/client/sysint/client-state-machine.c,v
> > retrieving revision 1.79.4.11
> > diff -u -r1.79.4.11 client-state-machine.c
> > --- src/client/sysint/client-state-machine.c        1 Aug 2006 15:51:59 
> > -0000       1.79.4.11
> > +++ src/client/sysint/client-state-machine.c        8 Sep 2006 01:26:17 
> > -0000
> > @@ -56,7 +56,11 @@
> >  {
> >      gen_mutex_lock(&s_completion_list_mutex);
> >      assert(s_completion_list_index < MAX_RETURNED_JOBS);
> > +    if (smcb->op_completed)
> > +        goto out;
> > +    smcb->op_completed = 1;
> >      s_completion_list[s_completion_list_index++] = smcb;
> > +out:
> >      gen_mutex_unlock(&s_completion_list_mutex);
> >      return 0;
> >  }
> > @@ -146,7 +150,7 @@
> >              tmp_completion_list[new_list_index++] = smcb;
> >          }
> >      }
> > -    *out_count = i;
> > +    *out_count = PVFS_util_min(i, limit);
> >
> >      /* clean up and adjust the list and it's book keeping */
> >      s_completion_list_index = new_list_index;
> > @@ -294,6 +298,8 @@
> >              (PINT_smcb_cancelled(smcb)) &&
> >              (cancelled_io_jobs_are_pending(smcb))))
> >      {
> > +        gossip_debug(GOSSIP_CLIENT_DEBUG,
> > +                "client_state_machine_terminate smcb %p\n", smcb);
> >          ret = add_sm_to_completion_list(smcb);
> >          assert(ret == 0);
> >      }
> > @@ -378,8 +384,8 @@
> >      if (PINT_smcb_complete(smcb))
> >      {
> >          gossip_debug(
> > -            GOSSIP_CLIENT_DEBUG, "Posted %s (immediate completion)\n",
> > -            PINT_client_get_name_str(pvfs_sys_op));
> > +            GOSSIP_CLIENT_DEBUG, "Posted %s (%lld) (immediate 
> > completion)\n",
> > +            PINT_client_get_name_str(pvfs_sys_op), (op_id ? *op_id : -1));
> >
> >          ret = add_sm_to_completion_list(smcb);
> >          assert(ret == 0);
> > @@ -387,8 +393,8 @@
> >      else
> >      {
> >          gossip_debug(
> > -            GOSSIP_CLIENT_DEBUG, "Posted %s (waiting for test)\n",
> > -            PINT_client_get_name_str(pvfs_sys_op));
> > +            GOSSIP_CLIENT_DEBUG, "Posted %s (%lld) (waiting for test)\n",
> > +            PINT_client_get_name_str(pvfs_sys_op), (op_id ? *op_id : -1));
> >      }
> >      return ret;
> >  }
> > @@ -631,13 +637,22 @@
> >          {
> >              PINT_smcb_set_complete(tmp_smcb);
> >          }
> > +        if (PINT_smcb_invalid_op(tmp_smcb))
> > +        {
> > +            gossip_err("Invalid sm control block op %d\n", 
> > PINT_smcb_op(tmp_smcb));
> > +            continue;
> > +        }
> > +        gossip_debug(GOSSIP_CLIENT_DEBUG, "sm control op %d\n", 
> > PINT_smcb_op(tmp_smcb));
> >
> >          if (!PINT_smcb_complete(tmp_smcb))
> >          {
> >              ret = PINT_state_machine_next(tmp_smcb, &job_status_array[i]);
> >
> > -            assert(ret == SM_ACTION_DEFERRED ||
> > -                    ret == SM_ACTION_TERMINATE); /* ret == 0 */
> > +            if (ret != SM_ACTION_DEFERRED &&
> > +                    ret != SM_ACTION_TERMINATE); /* ret == 0 */
> > +            {
> > +                continue;
> > +            }
> >          }
> >
> >          /* make sure we don't return internally cancelled I/O jobs */
> > @@ -655,13 +670,14 @@
> >            being tested here, we add it to our local completion list so
> >            that later calls to the sysint test/testsome can find it
> >          */
> > -        /*  This is handled in terminate fn now
> > +        /* add_sm_to_completion_list() does the right thing in determining 
> > whether
> > +         * smcb has already been added to completion Q or not
> > +         */
> >          if ((tmp_smcb != smcb) && (PINT_smcb_complete(tmp_smcb)))
> >          {
> >              ret = add_sm_to_completion_list(tmp_smcb);
> >              assert(ret == 0);
> >          }
> > -        */
> >      }
> >
> >      if (PINT_smcb_complete(smcb))
> > @@ -692,9 +708,6 @@
> >      job_status_s job_status_array[MAX_RETURNED_JOBS];
> >      void *client_sm_p_array[MAX_RETURNED_JOBS] = {NULL};
> >
> > -    gossip_debug(GOSSIP_CLIENT_DEBUG,
> > -                 "PINT_client_state_machine_testsome\n");
> > -
> >      CLIENT_SM_ASSERT_INITIALIZED();
> >
> >      if (!op_id_array || !op_count || !error_code_array)
> > @@ -753,8 +766,11 @@
> >               * itself; the return value of the underlying operation is
> >               * kept in the job status structure.
> >               */
> > -            assert(ret == SM_ACTION_DEFERRED ||
> > -                    ret == SM_ACTION_TERMINATE);
> > +            if (ret != SM_ACTION_DEFERRED &&
> > +                    ret != SM_ACTION_TERMINATE)
> > +            {
> > +                continue;
> > +            }
> >          }
> >
> >          /* make sure we don't return internally cancelled I/O jobs */
> > @@ -773,13 +789,15 @@
> >            grab all completed operations when we're finished
> >            (i.e. outside of this loop).
> >          */
> > -        /* now done in terminate function
> > +
> > +        /* add_sm_to_completion_list(smcb) does the right thing if an smcb
> > +         *  was already added to the completion list
> > +         */
> >          if (PINT_smcb_complete(smcb))
> >          {
> >              ret = add_sm_to_completion_list(smcb);
> >              assert(ret == 0);
> >          }
> > -        */
> >      }
> >
> >      return completion_list_retrieve_completed(
> > @@ -833,48 +851,69 @@
> >   */
> >  void PVFS_sys_release(PVFS_sys_op_id op_id)
> >  {
> > -    PINT_smcb *smcb = PINT_id_gen_safe_lookup(op_id);
> > -    PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
> > -    PVFS_credentials *cred_p = sm_p->cred_p;
> > +    PINT_smcb *smcb;
> > +    PINT_client_sm *sm_p;
> > +    PVFS_credentials *cred_p;
> >
> >      gossip_debug(GOSSIP_CLIENT_DEBUG,
> >                "PVFS_sys_release id %lld\n",op_id);
> > -
> > -    if (smcb)
> > +    smcb = PINT_id_gen_safe_lookup(op_id);
> > +    if (smcb == NULL)
> >      {
> > -        PINT_id_gen_safe_unregister(op_id);
> > -
> > -        if (PINT_smcb_op(smcb) && cred_p)
> > -        {
> > -            PVFS_util_release_credentials(cred_p);
> > -            sm_p->cred_p = NULL;
> > -        }
> > +        return;
> > +    }
> > +    sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
> > +    if (sm_p == NULL)
> > +    {
> > +        cred_p = NULL;
> > +    }
> > +    else
> > +    {
> > +        cred_p = sm_p->cred_p;
> > +    }
> > +    PINT_id_gen_safe_unregister(op_id);
> >
> > -        PINT_smcb_free(&smcb);
> > +    if (PINT_smcb_op(smcb) && cred_p)
> > +    {
> > +        PVFS_util_release_credentials(cred_p);
> > +        if (sm_p) sm_p->cred_p = NULL;
> >      }
> > +
> > +    PINT_smcb_free(&smcb);
> >  }
> >
> >  /* why is this different??? */
> >  void PVFS_mgmt_release(PVFS_mgmt_op_id op_id)
> >  {
> > -    PINT_smcb *smcb = PINT_id_gen_safe_lookup(op_id);
> > -    PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
> > +    PINT_smcb *smcb;
> > +    PINT_client_sm *sm_p;
> > +    PVFS_credentials *cred_p;
> >
> >      gossip_debug(GOSSIP_CLIENT_DEBUG,
> >                "PVFS_mgmt_release id %lld\n",op_id);
> > -
> > -    if (smcb)
> > +    smcb = PINT_id_gen_safe_lookup(op_id);
> > +    if (smcb == NULL)
> >      {
> > -        PINT_id_gen_safe_unregister(op_id);
> > -
> > -        if (PINT_smcb_op(smcb) && sm_p->cred_p)
> > -        {
> > -            PVFS_util_release_credentials(sm_p->cred_p);
> > -            sm_p->cred_p = NULL;
> > -        }
> > +        return;
> > +    }
> > +    sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
> > +    if (sm_p == NULL)
> > +    {
> > +        cred_p = NULL;
> > +    }
> > +    else
> > +    {
> > +        cred_p = sm_p->cred_p;
> > +    }
> > +    PINT_id_gen_safe_unregister(op_id);
> >
> > -        PINT_smcb_free(&smcb);
> > +    if (PINT_smcb_op(smcb) && cred_p)
> > +    {
> > +        PVFS_util_release_credentials(cred_p);
> > +        if (sm_p) sm_p->cred_p = NULL;
> >      }
> > +
> > +    PINT_smcb_free(&smcb);
> >  }
> >
> >  const char *PINT_client_get_name_str(int op_type)
> > @@ -920,6 +959,7 @@
> >          { PVFS_CLIENT_JOB_TIMER, "PVFS_CLIENT_JOB_TIMER" },
> >          { PVFS_DEV_UNEXPECTED, "PVFS_DEV_UNEXPECTED" },
> >          { PVFS_SYS_FS_ADD, "PVFS_SYS_FS_ADD" },
> > +        { PVFS_SYS_STATFS, "PVFS_SYS_STATFS" },
> >          { 0, "UNKNOWN" }
> >      };
> >
> > Index: src/client/sysint/client-state-machine.h
> > ===================================================================
> > RCS file: 
> > /projects/cvsroot/pvfs2-1/src/client/sysint/client-state-machine.h,v
> > retrieving revision 1.162.2.8
> > diff -u -r1.162.2.8 client-state-machine.h
> > --- src/client/sysint/client-state-machine.h        1 Aug 2006 15:51:59 
> > -0000       1.162.2.8
> > +++ src/client/sysint/client-state-machine.h        8 Sep 2006 01:26:17 
> > -0000
> > @@ -613,7 +613,9 @@
> >      PVFS_DEV_UNEXPECTED            = 400
> >  };
> >
> > +#define PVFS_OP_SYS_MAXVALID  20
> >  #define PVFS_OP_SYS_MAXVAL 69
> > +#define PVFS_OP_MGMT_MAXVALID 81
> >  #define PVFS_OP_MGMT_MAXVAL 199
> >
> >  int PINT_client_io_cancel(job_id_t id);
> > Index: src/client/sysint/mgmt-statfs-list.sm
> > ===================================================================
> > RCS file: /projects/cvsroot/pvfs2-1/src/client/sysint/mgmt-statfs-list.sm,v
> > retrieving revision 1.39.4.10
> > diff -u -r1.39.4.10 mgmt-statfs-list.sm
> > --- src/client/sysint/mgmt-statfs-list.sm   1 Aug 2006 15:52:00 -0000       
> > 1.39.4.10
> > +++ src/client/sysint/mgmt-statfs-list.sm   8 Sep 2006 01:26:17 -0000
> > @@ -257,7 +257,6 @@
> >      }
> >
> >      sm_p->error_code  = error;
> > -    PINT_SET_OP_COMPLETE;
> >
> >      return SM_ACTION_COMPLETE;
> >  }
> > Index: src/common/misc/state-machine-fns.c
> > ===================================================================
> > RCS file: 
> > /projects/cvsroot/pvfs2-1/src/common/misc/Attic/state-machine-fns.c,v
> > retrieving revision 1.1.2.11
> > diff -u -r1.1.2.11 state-machine-fns.c
> > --- src/common/misc/state-machine-fns.c     29 Aug 2006 20:44:02 -0000      
> > 1.1.2.11
> > +++ src/common/misc/state-machine-fns.c     8 Sep 2006 01:26:17 -0000
> > @@ -14,6 +14,7 @@
> >  #include "gossip.h"
> >  #include "pvfs2-debug.h"
> >  #include "state-machine.h"
> > +#include "client-state-machine.h"
> >
> >  /* STATE-MACHINE-FNS.C
> >   *
> > @@ -223,6 +224,11 @@
> >      do {
> >          /* loop while returning from nested SM */
> >          do {
> > +            if (!smcb->current_state || !smcb->current_state->trtbl)
> > +            {
> > +                gossip_err("SM current state or trtbl is invalid\n");
> > +                return -1;
> > +            }
> >              transtbl = smcb->current_state->trtbl;
> >
> >         /* for each entry in the transition table there is a return
> > @@ -346,6 +352,35 @@
> >  int PINT_smcb_op(struct PINT_smcb *smcb)
> >  {
> >      return smcb->op;
> > +}
> > +
> > +static int PINT_smcb_sys_op(struct PINT_smcb *smcb)
> > +{
> > +    if (smcb->op > 0 && smcb->op < PVFS_OP_SYS_MAXVALID)
> > +        return 1;
> > +    return 0;
> > +}
> > +
> > +static int PINT_smcb_mgmt_op(struct PINT_smcb *smcb)
> > +{
> > +    if (smcb->op > PVFS_OP_SYS_MAXVAL && smcb->op < PVFS_OP_MGMT_MAXVALID)
> > +        return 1;
> > +    return 0;
> > +}
> > +
> > +static int PINT_smcb_misc_op(struct PINT_smcb *smcb)
> > +{
> > +    return smcb->op == PVFS_SERVER_GET_CONFIG
> > +        || smcb->op == PVFS_CLIENT_JOB_TIMER
> > +        || smcb->op == PVFS_CLIENT_PERF_COUNT_TIMER
> > +        || smcb->op == PVFS_DEV_UNEXPECTED;
> > +}
> > +
> > +int PINT_smcb_invalid_op(struct PINT_smcb *smcb)
> > +{
> > +    if (!PINT_smcb_sys_op(smcb) && !PINT_smcb_mgmt_op(smcb) && 
> > !PINT_smcb_misc_op(smcb))
> > +        return 1;
> > +    return 0;
> >  }
> >
> >  /* Function: PINT_smcb_set_complete
> > Index: src/common/misc/state-machine.h
> > ===================================================================
> > RCS file: /projects/cvsroot/pvfs2-1/src/common/misc/state-machine.h,v
> > retrieving revision 1.12.4.14
> > diff -u -r1.12.4.14 state-machine.h
> > --- src/common/misc/state-machine.h 30 Aug 2006 18:14:21 -0000      
> > 1.12.4.14
> > +++ src/common/misc/state-machine.h 8 Sep 2006 01:26:17 -0000
> > @@ -66,6 +66,7 @@
> >      int op_terminate; /* indicates SM is ready to terminate */
> >      int op_cancelled; /* indicates SM operation was cancelled */
> >      int children_running; /* the number of child SMs running */
> > +    int op_completed;  /* indicates SM operation was added to completion Q 
> > */
> >      /* add a lock here */
> >      job_context_id context; /* job context when waiting for children */
> >      int (*terminate_fn)(struct PINT_smcb *, job_status_s *);
> > @@ -190,6 +191,7 @@
> >  int PINT_smcb_set_op(struct PINT_smcb *smcb, int op);
> >  int PINT_smcb_op(struct PINT_smcb *smcb);
> >  void PINT_smcb_set_complete(struct PINT_smcb *smcb);
> > +int PINT_smcb_invalid_op(struct PINT_smcb *smcb);
> >  int PINT_smcb_complete(struct PINT_smcb *smcb);
> >  void PINT_smcb_set_cancelled(struct PINT_smcb *smcb);
> >  int PINT_smcb_cancelled(struct PINT_smcb *smcb);
>
> --
> Dr. Walter B. Ligon III
> Associate Professor
> ECE Department
> Clemson University
>
>
_______________________________________________
Pvfs2-developers mailing list
Pvfs2-developers@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to