Lines Matching refs:osd
49 static void link_request(struct ceph_osd *osd, struct ceph_osd_request *req);
50 static void unlink_request(struct ceph_osd *osd, struct ceph_osd_request *req);
51 static void link_linger(struct ceph_osd *osd,
53 static void unlink_linger(struct ceph_osd *osd,
55 static void clear_backoffs(struct ceph_osd *osd);
77 static inline void verify_osd_locked(struct ceph_osd *osd) in verify_osd_locked() argument
79 struct ceph_osd_client *osdc = osd->o_osdc; in verify_osd_locked()
81 WARN_ON(!(mutex_is_locked(&osd->lock) && in verify_osd_locked()
92 static inline void verify_osd_locked(struct ceph_osd *osd) { } in verify_osd_locked() argument
425 t->osd = CEPH_HOMELESS_OSD; in target_init()
452 dest->osd = src->osd; in target_copy()
1069 struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node); in DEFINE_RB_FUNCS() local
1071 for (p = rb_first(&osd->o_requests); p; ) { in DEFINE_RB_FUNCS()
1091 static bool osd_homeless(struct ceph_osd *osd) in osd_homeless() argument
1093 return osd->o_osd == CEPH_HOMELESS_OSD; in osd_homeless()
1096 static bool osd_registered(struct ceph_osd *osd) in osd_registered() argument
1098 verify_osdc_locked(osd->o_osdc); in osd_registered()
1100 return !RB_EMPTY_NODE(&osd->o_node); in osd_registered()
1106 static void osd_init(struct ceph_osd *osd) in osd_init() argument
1108 refcount_set(&osd->o_ref, 1); in osd_init()
1109 RB_CLEAR_NODE(&osd->o_node); in osd_init()
1110 osd->o_requests = RB_ROOT; in osd_init()
1111 osd->o_linger_requests = RB_ROOT; in osd_init()
1112 osd->o_backoff_mappings = RB_ROOT; in osd_init()
1113 osd->o_backoffs_by_id = RB_ROOT; in osd_init()
1114 INIT_LIST_HEAD(&osd->o_osd_lru); in osd_init()
1115 INIT_LIST_HEAD(&osd->o_keepalive_item); in osd_init()
1116 osd->o_incarnation = 1; in osd_init()
1117 mutex_init(&osd->lock); in osd_init()
1120 static void osd_cleanup(struct ceph_osd *osd) in osd_cleanup() argument
1122 WARN_ON(!RB_EMPTY_NODE(&osd->o_node)); in osd_cleanup()
1123 WARN_ON(!RB_EMPTY_ROOT(&osd->o_requests)); in osd_cleanup()
1124 WARN_ON(!RB_EMPTY_ROOT(&osd->o_linger_requests)); in osd_cleanup()
1125 WARN_ON(!RB_EMPTY_ROOT(&osd->o_backoff_mappings)); in osd_cleanup()
1126 WARN_ON(!RB_EMPTY_ROOT(&osd->o_backoffs_by_id)); in osd_cleanup()
1127 WARN_ON(!list_empty(&osd->o_osd_lru)); in osd_cleanup()
1128 WARN_ON(!list_empty(&osd->o_keepalive_item)); in osd_cleanup()
1130 if (osd->o_auth.authorizer) { in osd_cleanup()
1131 WARN_ON(osd_homeless(osd)); in osd_cleanup()
1132 ceph_auth_destroy_authorizer(osd->o_auth.authorizer); in osd_cleanup()
1141 struct ceph_osd *osd; in create_osd() local
1145 osd = kzalloc(sizeof(*osd), GFP_NOIO | __GFP_NOFAIL); in create_osd()
1146 osd_init(osd); in create_osd()
1147 osd->o_osdc = osdc; in create_osd()
1148 osd->o_osd = onum; in create_osd()
1150 ceph_con_init(&osd->o_con, osd, &osd_con_ops, &osdc->client->msgr); in create_osd()
1152 return osd; in create_osd()
1155 static struct ceph_osd *get_osd(struct ceph_osd *osd) in get_osd() argument
1157 if (refcount_inc_not_zero(&osd->o_ref)) { in get_osd()
1158 dout("get_osd %p %d -> %d\n", osd, refcount_read(&osd->o_ref)-1, in get_osd()
1159 refcount_read(&osd->o_ref)); in get_osd()
1160 return osd; in get_osd()
1162 dout("get_osd %p FAIL\n", osd); in get_osd()
1167 static void put_osd(struct ceph_osd *osd) in put_osd() argument
1169 dout("put_osd %p %d -> %d\n", osd, refcount_read(&osd->o_ref), in put_osd()
1170 refcount_read(&osd->o_ref) - 1); in put_osd()
1171 if (refcount_dec_and_test(&osd->o_ref)) { in put_osd()
1172 osd_cleanup(osd); in put_osd()
1173 kfree(osd); in put_osd()
1177 DEFINE_RB_FUNCS(osd, struct ceph_osd, o_osd, o_node) in DEFINE_RB_FUNCS() argument
1179 static void __move_osd_to_lru(struct ceph_osd *osd) in DEFINE_RB_FUNCS()
1181 struct ceph_osd_client *osdc = osd->o_osdc; in DEFINE_RB_FUNCS()
1183 dout("%s osd %p osd%d\n", __func__, osd, osd->o_osd); in DEFINE_RB_FUNCS()
1184 BUG_ON(!list_empty(&osd->o_osd_lru)); in DEFINE_RB_FUNCS()
1187 list_add_tail(&osd->o_osd_lru, &osdc->osd_lru); in DEFINE_RB_FUNCS()
1190 osd->lru_ttl = jiffies + osdc->client->options->osd_idle_ttl; in DEFINE_RB_FUNCS()
1193 static void maybe_move_osd_to_lru(struct ceph_osd *osd) in maybe_move_osd_to_lru() argument
1195 if (RB_EMPTY_ROOT(&osd->o_requests) && in maybe_move_osd_to_lru()
1196 RB_EMPTY_ROOT(&osd->o_linger_requests)) in maybe_move_osd_to_lru()
1197 __move_osd_to_lru(osd); in maybe_move_osd_to_lru()
1200 static void __remove_osd_from_lru(struct ceph_osd *osd) in __remove_osd_from_lru() argument
1202 struct ceph_osd_client *osdc = osd->o_osdc; in __remove_osd_from_lru()
1204 dout("%s osd %p osd%d\n", __func__, osd, osd->o_osd); in __remove_osd_from_lru()
1207 if (!list_empty(&osd->o_osd_lru)) in __remove_osd_from_lru()
1208 list_del_init(&osd->o_osd_lru); in __remove_osd_from_lru()
1216 static void close_osd(struct ceph_osd *osd) in close_osd() argument
1218 struct ceph_osd_client *osdc = osd->o_osdc; in close_osd()
1222 dout("%s osd %p osd%d\n", __func__, osd, osd->o_osd); in close_osd()
1224 ceph_con_close(&osd->o_con); in close_osd()
1226 for (n = rb_first(&osd->o_requests); n; ) { in close_osd()
1233 unlink_request(osd, req); in close_osd()
1236 for (n = rb_first(&osd->o_linger_requests); n; ) { in close_osd()
1244 unlink_linger(osd, lreq); in close_osd()
1247 clear_backoffs(osd); in close_osd()
1249 __remove_osd_from_lru(osd); in close_osd()
1250 erase_osd(&osdc->osds, osd); in close_osd()
1251 put_osd(osd); in close_osd()
1257 static int reopen_osd(struct ceph_osd *osd) in reopen_osd() argument
1261 dout("%s osd %p osd%d\n", __func__, osd, osd->o_osd); in reopen_osd()
1263 if (RB_EMPTY_ROOT(&osd->o_requests) && in reopen_osd()
1264 RB_EMPTY_ROOT(&osd->o_linger_requests)) { in reopen_osd()
1265 close_osd(osd); in reopen_osd()
1269 peer_addr = &osd->o_osdc->osdmap->osd_addr[osd->o_osd]; in reopen_osd()
1270 if (!memcmp(peer_addr, &osd->o_con.peer_addr, sizeof (*peer_addr)) && in reopen_osd()
1271 !ceph_con_opened(&osd->o_con)) { in reopen_osd()
1277 for (n = rb_first(&osd->o_requests); n; n = rb_next(n)) { in reopen_osd()
1286 ceph_con_close(&osd->o_con); in reopen_osd()
1287 ceph_con_open(&osd->o_con, CEPH_ENTITY_TYPE_OSD, osd->o_osd, peer_addr); in reopen_osd()
1288 osd->o_incarnation++; in reopen_osd()
1296 struct ceph_osd *osd; in lookup_create_osd() local
1304 osd = lookup_osd(&osdc->osds, o); in lookup_create_osd()
1306 osd = &osdc->homeless_osd; in lookup_create_osd()
1307 if (!osd) { in lookup_create_osd()
1311 osd = create_osd(osdc, o); in lookup_create_osd()
1312 insert_osd(&osdc->osds, osd); in lookup_create_osd()
1313 ceph_con_open(&osd->o_con, CEPH_ENTITY_TYPE_OSD, osd->o_osd, in lookup_create_osd()
1314 &osdc->osdmap->osd_addr[osd->o_osd]); in lookup_create_osd()
1317 dout("%s osdc %p osd%d -> osd %p\n", __func__, osdc, o, osd); in lookup_create_osd()
1318 return osd; in lookup_create_osd()
1326 static void link_request(struct ceph_osd *osd, struct ceph_osd_request *req) in link_request() argument
1328 verify_osd_locked(osd); in link_request()
1330 dout("%s osd %p osd%d req %p tid %llu\n", __func__, osd, osd->o_osd, in link_request()
1333 if (!osd_homeless(osd)) in link_request()
1334 __remove_osd_from_lru(osd); in link_request()
1336 atomic_inc(&osd->o_osdc->num_homeless); in link_request()
1338 get_osd(osd); in link_request()
1339 insert_request(&osd->o_requests, req); in link_request()
1340 req->r_osd = osd; in link_request()
1343 static void unlink_request(struct ceph_osd *osd, struct ceph_osd_request *req) in unlink_request() argument
1345 verify_osd_locked(osd); in unlink_request()
1346 WARN_ON(req->r_osd != osd); in unlink_request()
1347 dout("%s osd %p osd%d req %p tid %llu\n", __func__, osd, osd->o_osd, in unlink_request()
1351 erase_request(&osd->o_requests, req); in unlink_request()
1352 put_osd(osd); in unlink_request()
1354 if (!osd_homeless(osd)) in unlink_request()
1355 maybe_move_osd_to_lru(osd); in unlink_request()
1357 atomic_dec(&osd->o_osdc->num_homeless); in unlink_request()
1436 t->osd = CEPH_HOMELESS_OSD; in calc_target()
1461 t->osd = CEPH_HOMELESS_OSD; in calc_target()
1511 t->osd = acting.primary; in calc_target()
1522 dout("%s t %p -> ct_res %d osd %d\n", __func__, t, ct_res, t->osd); in calc_target()
1781 static void clear_backoffs(struct ceph_osd *osd) in DEFINE_RB_FUNCS()
1783 while (!RB_EMPTY_ROOT(&osd->o_backoff_mappings)) { in DEFINE_RB_FUNCS()
1785 rb_entry(rb_first(&osd->o_backoff_mappings), in DEFINE_RB_FUNCS()
1794 erase_backoff_by_id(&osd->o_backoffs_by_id, backoff); in DEFINE_RB_FUNCS()
1797 erase_spg_mapping(&osd->o_backoff_mappings, spg); in DEFINE_RB_FUNCS()
1828 struct ceph_osd *osd = req->r_osd; in should_plug_request() local
1833 spg = lookup_spg_mapping(&osd->o_backoff_mappings, &req->r_t.spgid); in should_plug_request()
1843 __func__, req, req->r_tid, osd->o_osd, backoff->spgid.pgid.pool, in should_plug_request()
2122 struct ceph_osd *osd = req->r_osd; in send_request() local
2124 verify_osd_locked(osd); in send_request()
2125 WARN_ON(osd->o_osd != req->r_t.osd); in send_request()
2149 req->r_t.spgid.shard, osd->o_osd, req->r_t.epoch, req->r_flags, in send_request()
2156 req->r_sent = osd->o_incarnation; in send_request()
2158 ceph_con_send(&osd->o_con, ceph_msg_get(req->r_request)); in send_request()
2188 struct ceph_osd *osd; in __submit_request() local
2202 osd = lookup_create_osd(osdc, req->r_t.osd, wrlocked); in __submit_request()
2203 if (IS_ERR(osd)) { in __submit_request()
2204 WARN_ON(PTR_ERR(osd) != -EAGAIN || wrlocked); in __submit_request()
2239 } else if (!osd_homeless(osd)) { in __submit_request()
2245 mutex_lock(&osd->lock); in __submit_request()
2252 link_request(osd, req); in __submit_request()
2257 mutex_unlock(&osd->lock); in __submit_request()
2564 WARN_ON(lreq->osd); in linger_release()
2622 static void link_linger(struct ceph_osd *osd, in DEFINE_RB_INSDEL_FUNCS()
2625 verify_osd_locked(osd); in DEFINE_RB_INSDEL_FUNCS()
2626 WARN_ON(!lreq->linger_id || lreq->osd); in DEFINE_RB_INSDEL_FUNCS()
2627 dout("%s osd %p osd%d lreq %p linger_id %llu\n", __func__, osd, in DEFINE_RB_INSDEL_FUNCS()
2628 osd->o_osd, lreq, lreq->linger_id); in DEFINE_RB_INSDEL_FUNCS()
2630 if (!osd_homeless(osd)) in DEFINE_RB_INSDEL_FUNCS()
2631 __remove_osd_from_lru(osd); in DEFINE_RB_INSDEL_FUNCS()
2633 atomic_inc(&osd->o_osdc->num_homeless); in DEFINE_RB_INSDEL_FUNCS()
2635 get_osd(osd); in DEFINE_RB_INSDEL_FUNCS()
2636 insert_linger(&osd->o_linger_requests, lreq); in DEFINE_RB_INSDEL_FUNCS()
2637 lreq->osd = osd; in DEFINE_RB_INSDEL_FUNCS()
2640 static void unlink_linger(struct ceph_osd *osd, in unlink_linger() argument
2643 verify_osd_locked(osd); in unlink_linger()
2644 WARN_ON(lreq->osd != osd); in unlink_linger()
2645 dout("%s osd %p osd%d lreq %p linger_id %llu\n", __func__, osd, in unlink_linger()
2646 osd->o_osd, lreq, lreq->linger_id); in unlink_linger()
2648 lreq->osd = NULL; in unlink_linger()
2649 erase_linger(&osd->o_linger_requests, lreq); in unlink_linger()
2650 put_osd(osd); in unlink_linger()
2652 if (!osd_homeless(osd)) in unlink_linger()
2653 maybe_move_osd_to_lru(osd); in unlink_linger()
2655 atomic_dec(&osd->o_osdc->num_homeless); in unlink_linger()
2995 link_request(lreq->osd, req); in send_linger_ping()
3002 struct ceph_osd *osd; in linger_submit() local
3005 osd = lookup_create_osd(osdc, lreq->t.osd, true); in linger_submit()
3006 link_linger(osd, lreq); in linger_submit()
3038 unlink_linger(lreq->osd, lreq); in __linger_cancel()
3178 struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node); in handle_timeout() local
3181 for (p = rb_first(&osd->o_requests); p; ) { in handle_timeout()
3189 req, req->r_tid, osd->o_osd); in handle_timeout()
3195 req->r_tid, osd->o_osd); in handle_timeout()
3199 for (p = rb_first(&osd->o_linger_requests); p; p = rb_next(p)) { in handle_timeout()
3204 lreq, lreq->linger_id, osd->o_osd); in handle_timeout()
3214 list_move_tail(&osd->o_keepalive_item, &slow_osds); in handle_timeout()
3236 struct ceph_osd *osd = list_first_entry(&slow_osds, in handle_timeout() local
3239 list_del_init(&osd->o_keepalive_item); in handle_timeout()
3240 ceph_con_keepalive(&osd->o_con); in handle_timeout()
3254 struct ceph_osd *osd, *nosd; in handle_osds_timeout() local
3258 list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) { in handle_osds_timeout()
3259 if (time_before(jiffies, osd->lru_ttl)) in handle_osds_timeout()
3262 WARN_ON(!RB_EMPTY_ROOT(&osd->o_requests)); in handle_osds_timeout()
3263 WARN_ON(!RB_EMPTY_ROOT(&osd->o_linger_requests)); in handle_osds_timeout()
3264 close_osd(osd); in handle_osds_timeout()
3482 static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg) in handle_reply() argument
3484 struct ceph_osd_client *osdc = osd->o_osdc; in handle_reply()
3495 if (!osd_registered(osd)) { in handle_reply()
3496 dout("%s osd%d unknown\n", __func__, osd->o_osd); in handle_reply()
3499 WARN_ON(osd->o_osd != le64_to_cpu(msg->hdr.src.num)); in handle_reply()
3501 mutex_lock(&osd->lock); in handle_reply()
3502 req = lookup_request(&osd->o_requests, tid); in handle_reply()
3504 dout("%s osd%d tid %llu unknown\n", __func__, osd->o_osd, tid); in handle_reply()
3536 unlink_request(osd, req); in handle_reply()
3537 mutex_unlock(&osd->lock); in handle_reply()
3577 mutex_unlock(&osd->lock); in handle_reply()
3586 mutex_unlock(&osd->lock); in handle_reply()
3622 struct ceph_osd *osd; in recalc_linger_target() local
3624 osd = lookup_create_osd(osdc, lreq->t.osd, true); in recalc_linger_target()
3625 if (osd != lreq->osd) { in recalc_linger_target()
3626 unlink_linger(lreq->osd, lreq); in recalc_linger_target()
3627 link_linger(osd, lreq); in recalc_linger_target()
3637 static void scan_requests(struct ceph_osd *osd, in scan_requests() argument
3644 struct ceph_osd_client *osdc = osd->o_osdc; in scan_requests()
3648 for (n = rb_first(&osd->o_linger_requests); n; ) { in scan_requests()
3684 for (n = rb_first(&osd->o_requests); n; ) { in scan_requests()
3707 unlink_request(osd, req); in scan_requests()
3770 struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node); in handle_one_map() local
3774 scan_requests(osd, skipped_map, was_full, true, need_resend, in handle_one_map()
3776 if (!ceph_osd_is_up(osdc->osdmap, osd->o_osd) || in handle_one_map()
3777 memcmp(&osd->o_con.peer_addr, in handle_one_map()
3778 ceph_osd_addr(osdc->osdmap, osd->o_osd), in handle_one_map()
3780 close_osd(osd); in handle_one_map()
3813 struct ceph_osd *osd; in kick_requests() local
3818 osd = lookup_create_osd(osdc, req->r_t.osd, true); in kick_requests()
3819 link_request(osd, req); in kick_requests()
3821 if (!osd_homeless(osd) && !req->r_t.paused) in kick_requests()
3829 if (!osd_homeless(lreq->osd)) in kick_requests()
3956 static void kick_osd_requests(struct ceph_osd *osd) in kick_osd_requests() argument
3960 clear_backoffs(osd); in kick_osd_requests()
3962 for (n = rb_first(&osd->o_requests); n; ) { in kick_osd_requests()
3975 for (n = rb_first(&osd->o_linger_requests); n; n = rb_next(n)) { in kick_osd_requests()
3988 struct ceph_osd *osd = con->private; in osd_fault() local
3989 struct ceph_osd_client *osdc = osd->o_osdc; in osd_fault()
3991 dout("%s osd %p osd%d\n", __func__, osd, osd->o_osd); in osd_fault()
3994 if (!osd_registered(osd)) { in osd_fault()
3995 dout("%s osd%d unknown\n", __func__, osd->o_osd); in osd_fault()
3999 if (!reopen_osd(osd)) in osd_fault()
4000 kick_osd_requests(osd); in osd_fault()
4104 static void handle_backoff_block(struct ceph_osd *osd, struct MOSDBackoff *m) in handle_backoff_block() argument
4110 dout("%s osd%d spgid %llu.%xs%d id %llu\n", __func__, osd->o_osd, in handle_backoff_block()
4113 spg = lookup_spg_mapping(&osd->o_backoff_mappings, &m->spgid); in handle_backoff_block()
4121 insert_spg_mapping(&osd->o_backoff_mappings, spg); in handle_backoff_block()
4137 insert_backoff_by_id(&osd->o_backoffs_by_id, backoff); in handle_backoff_block()
4148 ceph_con_send(&osd->o_con, msg); in handle_backoff_block()
4163 static void handle_backoff_unblock(struct ceph_osd *osd, in handle_backoff_unblock() argument
4170 dout("%s osd%d spgid %llu.%xs%d id %llu\n", __func__, osd->o_osd, in handle_backoff_unblock()
4173 backoff = lookup_backoff_by_id(&osd->o_backoffs_by_id, m->id); in handle_backoff_unblock()
4176 __func__, osd->o_osd, m->spgid.pgid.pool, in handle_backoff_unblock()
4184 __func__, osd->o_osd, m->spgid.pgid.pool, in handle_backoff_unblock()
4189 spg = lookup_spg_mapping(&osd->o_backoff_mappings, &backoff->spgid); in handle_backoff_unblock()
4193 erase_backoff_by_id(&osd->o_backoffs_by_id, backoff); in handle_backoff_unblock()
4197 erase_spg_mapping(&osd->o_backoff_mappings, spg); in handle_backoff_unblock()
4201 for (n = rb_first(&osd->o_requests); n; n = rb_next(n)) { in handle_backoff_unblock()
4221 static void handle_backoff(struct ceph_osd *osd, struct ceph_msg *msg) in handle_backoff() argument
4223 struct ceph_osd_client *osdc = osd->o_osdc; in handle_backoff()
4228 if (!osd_registered(osd)) { in handle_backoff()
4229 dout("%s osd%d unknown\n", __func__, osd->o_osd); in handle_backoff()
4233 WARN_ON(osd->o_osd != le64_to_cpu(msg->hdr.src.num)); in handle_backoff()
4235 mutex_lock(&osd->lock); in handle_backoff()
4245 handle_backoff_block(osd, &m); in handle_backoff()
4248 handle_backoff_unblock(osd, &m); in handle_backoff()
4251 pr_err("%s osd%d unknown op %d\n", __func__, osd->o_osd, m.op); in handle_backoff()
4258 mutex_unlock(&osd->lock); in handle_backoff()
4437 struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node); in ceph_osdc_sync() local
4439 mutex_lock(&osd->lock); in ceph_osdc_sync()
4440 for (p = rb_first(&osd->o_requests); p; p = rb_next(p)) { in ceph_osdc_sync()
4451 mutex_unlock(&osd->lock); in ceph_osdc_sync()
4460 mutex_unlock(&osd->lock); in ceph_osdc_sync()
5071 struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds), in ceph_osdc_stop() local
5073 close_osd(osd); in ceph_osdc_stop()
5195 struct ceph_osd *osd = con->private; in dispatch() local
5196 struct ceph_osd_client *osdc = osd->o_osdc; in dispatch()
5204 handle_reply(osd, msg); in dispatch()
5207 handle_backoff(osd, msg); in dispatch()
5230 struct ceph_osd *osd = con->private; in get_reply() local
5231 struct ceph_osd_client *osdc = osd->o_osdc; in get_reply()
5239 if (!osd_registered(osd)) { in get_reply()
5240 dout("%s osd%d unknown, skipping\n", __func__, osd->o_osd); in get_reply()
5244 WARN_ON(osd->o_osd != le64_to_cpu(hdr->src.num)); in get_reply()
5246 mutex_lock(&osd->lock); in get_reply()
5247 req = lookup_request(&osd->o_requests, tid); in get_reply()
5250 osd->o_osd, tid); in get_reply()
5259 __func__, osd->o_osd, req->r_tid, front_len, in get_reply()
5271 __func__, osd->o_osd, req->r_tid, data_len, in get_reply()
5282 mutex_unlock(&osd->lock); in get_reply()
5325 struct ceph_osd *osd = con->private; in alloc_msg() local
5338 osd->o_osd, type); in alloc_msg()
5349 struct ceph_osd *osd = con->private; in get_osd_con() local
5350 if (get_osd(osd)) in get_osd_con()
5357 struct ceph_osd *osd = con->private; in put_osd_con() local
5358 put_osd(osd); in put_osd_con()