Commit aca420bc51f48b0701963ba3a6234442a0cabebd
1 parent
259a187ade
Exists in
master
and in
4 other branches
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); |