libceph: move schedule_delayed_work() in ceph_osdc_init()
authorIlya Dryomov <idryomov@gmail.com>
Thu, 28 Apr 2016 14:07:24 +0000 (16:07 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 25 May 2016 22:36:28 +0000 (00:36 +0200)
ceph_osdc_stop() isn't called if ceph_osdc_init() fails, so we end up
with handle_osds_timeout() running on invalid memory if any one of the
allocations fails.  Call schedule_delayed_work() after everything is
setup, just before returning.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/osd_client.c

index baf2844b00d61cf31a620386845486b998f46269..4c7231e55cb7d2842cc3272463a1cc931142d301 100644 (file)
@@ -2729,9 +2729,6 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
        osdc->event_tree = RB_ROOT;
        osdc->event_count = 0;
 
-       schedule_delayed_work(&osdc->osds_timeout_work,
-           round_jiffies_relative(osdc->client->options->osd_idle_ttl));
-
        err = -ENOMEM;
        osdc->req_mempool = mempool_create_slab_pool(10,
                                                     ceph_osd_request_cache);
@@ -2752,6 +2749,9 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
        if (!osdc->notify_wq)
                goto out_msgpool_reply;
 
+       schedule_delayed_work(&osdc->osds_timeout_work,
+           round_jiffies_relative(osdc->client->options->osd_idle_ttl));
+
        return 0;
 
 out_msgpool_reply: