dm log: fix dm_io_client leak on error paths
authorTakahiro Yasui <tyasui@redhat.com>
Tue, 6 Jan 2009 03:04:56 +0000 (03:04 +0000)
committerAlasdair G Kergon <agk@redhat.com>
Tue, 6 Jan 2009 03:04:56 +0000 (03:04 +0000)
In create_log_context function, dm_io_client_destroy function needs
to be called, when memory allocation of disk_header, sync_bits and
recovering_bits failed, but dm_io_client_destroy is not called.

Cc: stable@kernel.org
Signed-off-by: Takahiro Yasui <tyasui@redhat.com>
Acked-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-log.c

index a8c0fc79ca78c18d52631bb3e27176ee68c4712f..13e2a1a1a941b723c63231bfad9efd3afa8dbd05 100644 (file)
@@ -467,6 +467,7 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
                lc->disk_header = vmalloc(buf_size);
                if (!lc->disk_header) {
                        DMWARN("couldn't allocate disk log buffer");
+                       dm_io_client_destroy(lc->io_req.client);
                        kfree(lc);
                        return -ENOMEM;
                }
@@ -482,6 +483,8 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
                DMWARN("couldn't allocate sync bitset");
                if (!dev)
                        vfree(lc->clean_bits);
+               else
+                       dm_io_client_destroy(lc->io_req.client);
                vfree(lc->disk_header);
                kfree(lc);
                return -ENOMEM;
@@ -495,6 +498,8 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
                vfree(lc->sync_bits);
                if (!dev)
                        vfree(lc->clean_bits);
+               else
+                       dm_io_client_destroy(lc->io_req.client);
                vfree(lc->disk_header);
                kfree(lc);
                return -ENOMEM;