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@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to