Commit aca420bc51f48b0701963ba3a6234442a0cabebd

Authored by Sage Weil
1 parent 259a187ade

libceph: fix leak of osd structs during shutdown

We want to remove all OSDs, not just those on the idle LRU.

Signed-off-by: Sage Weil <sage@newdream.net>

Showing 1 changed file with 17 additions and 5 deletions Side-by-side Diff

net/ceph/osd_client.c
... ... @@ -685,6 +685,18 @@
685 685 put_osd(osd);
686 686 }
687 687  
  688 +static void remove_all_osds(struct ceph_osd_client *osdc)
  689 +{
  690 + dout("__remove_old_osds %p\n", osdc);
  691 + mutex_lock(&osdc->request_mutex);
  692 + while (!RB_EMPTY_ROOT(&osdc->osds)) {
  693 + struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds),
  694 + struct ceph_osd, o_node);
  695 + __remove_osd(osdc, osd);
  696 + }
  697 + mutex_unlock(&osdc->request_mutex);
  698 +}
  699 +
688 700 static void __move_osd_to_lru(struct ceph_osd_client *osdc,
689 701 struct ceph_osd *osd)
690 702 {
691 703  
... ... @@ -701,14 +713,14 @@
701 713 list_del_init(&osd->o_osd_lru);
702 714 }
703 715  
704   -static void remove_old_osds(struct ceph_osd_client *osdc, int remove_all)
  716 +static void remove_old_osds(struct ceph_osd_client *osdc)
705 717 {
706 718 struct ceph_osd *osd, *nosd;
707 719  
708 720 dout("__remove_old_osds %p\n", osdc);
709 721 mutex_lock(&osdc->request_mutex);
710 722 list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) {
711   - if (!remove_all && time_before(jiffies, osd->lru_ttl))
  723 + if (time_before(jiffies, osd->lru_ttl))
712 724 break;
713 725 __remove_osd(osdc, osd);
714 726 }
... ... @@ -751,6 +763,7 @@
751 763 struct rb_node *parent = NULL;
752 764 struct ceph_osd *osd = NULL;
753 765  
  766 + dout("__insert_osd %p osd%d\n", new, new->o_osd);
754 767 while (*p) {
755 768 parent = *p;
756 769 osd = rb_entry(parent, struct ceph_osd, o_node);
... ... @@ -1144,7 +1157,7 @@
1144 1157  
1145 1158 dout("osds timeout\n");
1146 1159 down_read(&osdc->map_sem);
1147   - remove_old_osds(osdc, 0);
  1160 + remove_old_osds(osdc);
1148 1161 up_read(&osdc->map_sem);
1149 1162  
1150 1163 schedule_delayed_work(&osdc->osds_timeout_work,
... ... @@ -1862,8 +1875,7 @@
1862 1875 ceph_osdmap_destroy(osdc->osdmap);
1863 1876 osdc->osdmap = NULL;
1864 1877 }
1865   - remove_old_osds(osdc, 1);
1866   - WARN_ON(!RB_EMPTY_ROOT(&osdc->osds));
  1878 + remove_all_osds(osdc);
1867 1879 mempool_destroy(osdc->req_mempool);
1868 1880 ceph_msgpool_destroy(&osdc->msgpool_op);
1869 1881 ceph_msgpool_destroy(&osdc->msgpool_op_reply);