[Pvfs2-developers] patches: mount bug fixes

Sam Lang slang at mcs.anl.gov
Tue Mar 20 15:03:06 EST 2007


Committed to CVS HEAD.

-sam

On Mar 20, 2007, at 8:43 AM, Phil Carns wrote:

> initialize-dyn.patch:
> ---------------------
> This is a correction to the initialize-dyn test program.  It  
> previously hardcoded the number of mounted file systems and would  
> crash if a different number were mounted.
>
> mount-mem-leaks.patch:
> ----------------------
> This patch corrects multiple memory leaks in the mount path.  The  
> largest one was happening when the same file system was mounted  
> multiple times.  In that case, the configuration data was cached,  
> but not before a new copy had been generated.  The new copy was not  
> being free'd.
>
> remount.patch:
> --------------
> This patch fixes a bug in mount.pvfs2 (only used on 2.4 kernels).   
> It did not handle the "remount" flag correctly.
> Index: pvfs2_src/test/client/sysint/initialize-dyn.c
> ===================================================================
> --- pvfs2_src/test/client/sysint/initialize-dyn.c	(revision 2805)
> +++ pvfs2_src/test/client/sysint/initialize-dyn.c	(revision 2806)
> @@ -11,8 +11,6 @@
>  #include "client.h"
>  #include "pvfs2-util.h"
>
> -#define MAX_NUM_MNT  3
> -
>  int main(int argc, char **argv)
>  {
>      int ret = -1;
> @@ -61,7 +59,7 @@
>      printf("*** All defaults initialized\n");
>
>      /* make sure we can resolve all mnt points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          ret = PVFS_util_resolve(mntent[i].mnt_dir, &fs_id,
>                                  buf, PVFS_NAME_MAX);
> @@ -80,7 +78,7 @@
>      }
>
>      /* remove the mount points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          printf("Removing mount entry %d: %s\n",
>                 i, mntent[i].mnt_dir);
> @@ -94,7 +92,7 @@
>      }
>
>      /* make sure we *can't* resolve all mnt points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          ret = PVFS_util_resolve(mntent[i].mnt_dir, &fs_id,
>                                  buf, PVFS_NAME_MAX);
> @@ -112,7 +110,7 @@
>      }
>
>      /* re-add the mount points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          printf("Adding dynamic mount entry %d: %s\n",
>                 i, mntent[i].mnt_dir);
> @@ -129,7 +127,7 @@
>        make sure we can re-resolve all mnt points now that they've  
> been
>        moved to the dynamic area of the book keeping
>      */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          ret = PVFS_util_resolve(mntent[i].mnt_dir, &fs_id,
>                                  buf, PVFS_NAME_MAX);
> @@ -148,7 +146,7 @@
>      }
>
>      /* remove the dynamic mount points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          printf("Removing dynamic mount entry %d: %s\n",
>                 i, mntent[i].mnt_dir);
> @@ -162,7 +160,7 @@
>      }
>
>      /* make sure we *can't* resolve all mnt points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          ret = PVFS_util_resolve(mntent[i].mnt_dir, &fs_id,
>                                  buf, PVFS_NAME_MAX);
> @@ -180,7 +178,7 @@
>      }
>
>      /* re-add the mount points */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          printf("Adding dynamic mount entry %d: %s\n",
>                 i, mntent[i].mnt_dir);
> @@ -194,7 +192,7 @@
>      }
>
>      /* re-resolve one more time -- to be sure ;-) */
> -    for(i = 0; i < MAX_NUM_MNT; i++)
> +    for(i = 0; i < tab->mntent_count; i++)
>      {
>          ret = PVFS_util_resolve(mntent[i].mnt_dir, &fs_id,
>                                  buf, PVFS_NAME_MAX);
> Index: pvfs2_src/src/apps/kernel/linux/pvfs2-client-core.c
> ===================================================================
> --- pvfs2_src/src/apps/kernel/linux/pvfs2-client-core.c	(revision  
> 3131)
> +++ pvfs2_src/src/apps/kernel/linux/pvfs2-client-core.c	(revision  
> 3132)
> @@ -2345,6 +2345,7 @@
>              }
>
>              PVFS_util_free_mntent(vfs_request->mntent);
> +            free(vfs_request->mntent);
>
>              break;
>          case PVFS2_VFS_OP_RENAME:
> Index: pvfs2_src/src/common/misc/pvfs2-util.c
> ===================================================================
> --- pvfs2_src/src/common/misc/pvfs2-util.c	(revision 3131)
> +++ pvfs2_src/src/common/misc/pvfs2-util.c	(revision 3132)
> @@ -921,6 +921,7 @@
>                  }
>                  PVFS_util_copy_mntent(
>                      &tmp_mnt_array[new_count++], current_mnt);
> +                PVFS_util_free_mntent(current_mnt);
>              }
>
>              /* finally, swap the mntent arrays */
> Index: pvfs2_src/src/common/misc/server-config-mgr.c
> ===================================================================
> --- pvfs2_src/src/common/misc/server-config-mgr.c	(revision 3132)
> +++ pvfs2_src/src/common/misc/server-config-mgr.c	(revision 3133)
> @@ -221,12 +221,15 @@
>
>  int PINT_server_config_mgr_add_config(
>      struct server_configuration_s *config_s,
> -    PVFS_fs_id fs_id)
> +    PVFS_fs_id fs_id,
> +    int* free_config_flag)
>  {
>      int ret = -PVFS_EINVAL;
>      server_config_t *config = NULL;
>      struct qlist_head *hash_link = NULL;
>
> +    *free_config_flag = 0;
> +
>      gossip_debug(GOSSIP_CLIENT_DEBUG, "PINT_server_config_mgr_add_"
>                   "config: adding config %p\n", config_s);
>
> @@ -245,6 +248,10 @@
>              assert(config);
>              assert(config->server_config);
>              config->ref_count++;
> +            /* set a flag to inform caller that we aren't using  
> the config
> +             * structure
> +             */
> +            *free_config_flag = 1;
>              gen_mutex_unlock(s_server_config_mgr_mutex);
>              return(0);
>          }
> Index: pvfs2_src/src/common/misc/server-config-mgr.h
> ===================================================================
> --- pvfs2_src/src/common/misc/server-config-mgr.h	(revision 3132)
> +++ pvfs2_src/src/common/misc/server-config-mgr.h	(revision 3133)
> @@ -17,7 +17,8 @@
>
>  int PINT_server_config_mgr_add_config(
>      struct server_configuration_s *config_s,
> -    PVFS_fs_id fs_id);
> +    PVFS_fs_id fs_id,
> +    int* free_config_flag);
>
>  int PINT_server_config_mgr_remove_config(
>      PVFS_fs_id fs_id);
> Index: pvfs2_src/src/client/sysint/client-state-machine.h
> ===================================================================
> --- pvfs2_src/src/client/sysint/client-state-machine.h	(revision 3132)
> +++ pvfs2_src/src/client/sysint/client-state-machine.h	(revision 3133)
> @@ -369,6 +369,7 @@
>      uint32_t fs_config_buf_size;
>      uint32_t server_config_buf_size;
>      int persist_config_buffers;
> +    int free_config_flag;
>  };
>
>  struct PINT_server_fetch_config_sm_state
> Index: pvfs2_src/src/client/sysint/fs-add.sm
> ===================================================================
> --- pvfs2_src/src/client/sysint/fs-add.sm	(revision 3132)
> +++ pvfs2_src/src/client/sysint/fs-add.sm	(revision 3133)
> @@ -541,7 +541,8 @@
>
>      /* finally, try to add the new config to the server config  
> manager */
>      ret = PINT_server_config_mgr_add_config(
> -        sm_p->u.get_config.config, sm_p->u.get_config.mntent->fs_id);
> +        sm_p->u.get_config.config, sm_p->u.get_config.mntent->fs_id,
> +        &sm_p->u.get_config.free_config_flag);
>      if (ret < 0)
>      {
>          PVFS_perror_gossip("PINT_server_config_mgr_add_config  
> failed", ret);
> @@ -574,6 +575,11 @@
>      {
>          compare_hashes(sm_p, js_p);
>      }
> +    if(sm_p->u.get_config.free_config_flag)
> +    {
> +        PINT_config_release(sm_p->u.get_config.config);
> +        free(sm_p->u.get_config.config);
> +    }
>      sm_p->error_code = js_p->error_code;
>      sm_p->op_complete = 1;
>      return 0;
> Index: pvfs2_src/src/apps/kernel/linux/mount.pvfs2.c
> ===================================================================
> --- pvfs2_src/src/apps/kernel/linux/mount.pvfs2.c	(revision 2966)
> +++ pvfs2_src/src/apps/kernel/linux/mount.pvfs2.c	(revision 2967)
> @@ -111,6 +111,12 @@
>          myment.mnt_opts = "rw";
>      }
>
> +    /* if this is just a remount, then exit without touching mtab */
> +    if(flags & MS_REMOUNT)
> +    {
> +        return(0);
> +    }
> +
>      /* Leave mtab alone if it is a link */
>      if (lstat(PVFS2_MTAB, &sb) == 0 && S_ISLNK(sb.st_mode))
>      {
> @@ -192,6 +198,10 @@
>                  {
>                      *flags |= MS_RDONLY;
>                  }
> +                if(!strcmp(index, "remount"))
> +                {
> +                    *flags |= MS_REMOUNT;
> +                }
>                  index = strtok(NULL, ",");
>              }
>
> _______________________________________________
> Pvfs2-developers mailing list
> Pvfs2-developers at beowulf-underground.org
> http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers



More information about the Pvfs2-developers mailing list