Re: [PATCH V2] Free map to avoid resource leak issues

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 07/13/2018 09:36 PM, Tkaczyk, Mariusz wrote:
Try this:
mdadm --zero-super /dev/sd*
mdadm -C /dev/md/imsm -n2 -eimsm /dev/sdb /dev/sdc --run
mdadm -C /dev/md/r1 -n2 -z15G -eimsm /dev/sdb /dev/sdc -l1 --run --assume-clean
mdadm -f /dev/md126 /dev/sdb
mdadm -Ss

Remember about exporting IMSM_NO_PLATFORM and IMSM_DEVNAME_AS_SERIAL.
The problem occurs when map file is freeing.
The previous reproduction steps works for me, because I had old, invalid entry in /var/run/mdadm/map.
This issue seems to be related with this file.
I didn't reproduce it on native metadata without outdated entry in this file.

Thanks, since Manage_stop calls map_remove and map_unlock, but *mapp is not set to NULL after map_remove -> map_free, so map_unlock will call map_free again. Pls try below to see it works for
you or not.

diff --git a/mapfile.c b/mapfile.c
index a50255632d28..8d7acb3cc389 100644
--- a/mapfile.c
+++ b/mapfile.c
@@ -268,6 +268,7 @@ void map_remove(struct map_ent **mapp, char *devnm)
        map_delete(mapp, devnm);
        map_write(*mapp);
        map_free(*mapp);
+       *mapp = NULL;
 }


In current code, after call map_free(), some places set the map pointer to NULL while some not.
Jes, do you think it is necessary to change all the place? Thanks.

gqjiang@linux-8mgw:~/source-tree/mdadm> grep "map_free(" *.c -r -A 1
config.c:            map_free(map);
config.c-            map = NULL;
--
Detail.c:            map_free(map);
Detail.c-        } else {
--
Detail.c:            map_free(map);
Detail.c-        }
--
Incremental.c:    map_free(mapl);
Incremental.c-    return rv;
--
Incremental.c:        map_free(map);
Incremental.c-    }
--
Incremental.c:        map_free(map);
Incremental.c-        map = NULL;
--
Incremental.c:    map_free(map);
Incremental.c-    return 0;
--
Incremental.c:        map_free(map);
Incremental.c-    }
--
mapfile.c:        map_free(*melp);
mapfile.c-    map_read(melp);
--
mapfile.c:        map_free(*melp);
mapfile.c-    lf = NULL;
--
mapfile.c:void map_free(struct map_ent *map)
mapfile.c-{
--
mapfile.c:    map_free(map);
mapfile.c-    return rv;
--
mapfile.c:    map_free(*mapp);
mapfile.c-}
--
mapfile.c:    map_free(map);
mapfile.c-    free_mdstat(mdstat);
--
mdadm.c:            map_free(map);
mdadm.c-            map = NULL;


Regards,
Guoqing
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux