@@ -153,6 +153,16 @@ static int device_list_add(const char *path,
return 0;
}
+static void btrfs_close_device(struct btrfs_device *device)
+{
+ close(device->fd);
+ device->fd = -1;
+ device->writeable = 0;
+ if (device->name)
+ kfree(device->name);
+ kfree(device);
+}
+
int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
{
struct btrfs_fs_devices *seed_devices;
@@ -161,17 +171,17 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
again:
list_for_each(cur, &fs_devices->devices) {
device = list_entry(cur, struct btrfs_device, dev_list);
- close(device->fd);
- device->fd = -1;
- device->writeable = 0;
+ btrfs_close_device(device);
}
seed_devices = fs_devices->seed;
fs_devices->seed = NULL;
if (seed_devices) {
+ kfree(fs_devices);
fs_devices = seed_devices;
goto again;
}
+ kfree(fs_devices);
return 0;
}
Three kind of structures need to be freed on close: * All struct btrfs_device managed by fs_devices * The name field for each struct btrfs_device * fs_devices structure itself The same ones for seed_devices. Signed-off-by: Wang Sheng-Hui <shhuiw@gmail.com> --- volumes.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)