diff options
Diffstat (limited to 'net/ceph/osd_client.c')
| -rw-r--r-- | net/ceph/osd_client.c | 26 | 
1 files changed, 18 insertions, 8 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index ce310eee708..88ad8a2501b 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -217,6 +217,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,  	INIT_LIST_HEAD(&req->r_unsafe_item);  	INIT_LIST_HEAD(&req->r_linger_item);  	INIT_LIST_HEAD(&req->r_linger_osd); +	INIT_LIST_HEAD(&req->r_req_lru_item);  	req->r_flags = flags;  	WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0); @@ -685,6 +686,18 @@ static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)  	put_osd(osd);  } +static void remove_all_osds(struct ceph_osd_client *osdc) +{ +	dout("__remove_old_osds %p\n", osdc); +	mutex_lock(&osdc->request_mutex); +	while (!RB_EMPTY_ROOT(&osdc->osds)) { +		struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds), +						struct ceph_osd, o_node); +		__remove_osd(osdc, osd); +	} +	mutex_unlock(&osdc->request_mutex); +} +  static void __move_osd_to_lru(struct ceph_osd_client *osdc,  			      struct ceph_osd *osd)  { @@ -701,14 +714,14 @@ static void __remove_osd_from_lru(struct ceph_osd *osd)  		list_del_init(&osd->o_osd_lru);  } -static void remove_old_osds(struct ceph_osd_client *osdc, int remove_all) +static void remove_old_osds(struct ceph_osd_client *osdc)  {  	struct ceph_osd *osd, *nosd;  	dout("__remove_old_osds %p\n", osdc);  	mutex_lock(&osdc->request_mutex);  	list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) { -		if (!remove_all && time_before(jiffies, osd->lru_ttl)) +		if (time_before(jiffies, osd->lru_ttl))  			break;  		__remove_osd(osdc, osd);  	} @@ -751,6 +764,7 @@ static void __insert_osd(struct ceph_osd_client *osdc, struct ceph_osd *new)  	struct rb_node *parent = NULL;  	struct ceph_osd *osd = NULL; +	dout("__insert_osd %p osd%d\n", new, new->o_osd);  	while (*p) {  		parent = *p;  		osd = rb_entry(parent, struct ceph_osd, o_node); @@ -803,13 +817,10 @@ static void __register_request(struct ceph_osd_client *osdc,  {  	req->r_tid = ++osdc->last_tid;  	req->r_request->hdr.tid = cpu_to_le64(req->r_tid); -	INIT_LIST_HEAD(&req->r_req_lru_item); -  	dout("__register_request %p tid %lld\n", req, req->r_tid);  	__insert_request(osdc, req);  	ceph_osdc_get_request(req);  	osdc->num_requests++; -  	if (osdc->num_requests == 1) {  		dout(" first request, scheduling timeout\n");  		__schedule_osd_timeout(osdc); @@ -1144,7 +1155,7 @@ static void handle_osds_timeout(struct work_struct *work)  	dout("osds timeout\n");  	down_read(&osdc->map_sem); -	remove_old_osds(osdc, 0); +	remove_old_osds(osdc);  	up_read(&osdc->map_sem);  	schedule_delayed_work(&osdc->osds_timeout_work, @@ -1862,8 +1873,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc)  		ceph_osdmap_destroy(osdc->osdmap);  		osdc->osdmap = NULL;  	} -	remove_old_osds(osdc, 1); -	WARN_ON(!RB_EMPTY_ROOT(&osdc->osds)); +	remove_all_osds(osdc);  	mempool_destroy(osdc->req_mempool);  	ceph_msgpool_destroy(&osdc->msgpool_op);  	ceph_msgpool_destroy(&osdc->msgpool_op_reply);  |