Lines Matching refs:osdc

69 static inline void verify_osdc_locked(struct ceph_osd_client *osdc)  in verify_osdc_locked()  argument
71 WARN_ON(!rwsem_is_locked(&osdc->lock)); in verify_osdc_locked()
73 static inline void verify_osdc_wrlocked(struct ceph_osd_client *osdc) in verify_osdc_wrlocked() argument
75 WARN_ON(!rwsem_is_wrlocked(&osdc->lock)); in verify_osdc_wrlocked()
79 struct ceph_osd_client *osdc = osd->o_osdc; in verify_osd_locked() local
82 rwsem_is_locked(&osdc->lock)) && in verify_osd_locked()
83 !rwsem_is_wrlocked(&osdc->lock)); in verify_osd_locked()
90 static inline void verify_osdc_locked(struct ceph_osd_client *osdc) { } in verify_osdc_locked() argument
91 static inline void verify_osdc_wrlocked(struct ceph_osd_client *osdc) { } in verify_osdc_wrlocked() argument
544 struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, in ceph_osdc_alloc_request() argument
554 req = mempool_alloc(osdc->req_mempool, gfp_flags); in ceph_osdc_alloc_request()
565 req->r_osdc = osdc; in ceph_osdc_alloc_request()
585 struct ceph_osd_client *osdc = req->r_osdc; in __ceph_osdc_alloc_messages() local
611 msg = ceph_msgpool_get(&osdc->msgpool_op, msg_size, in __ceph_osdc_alloc_messages()
628 msg = ceph_msgpool_get(&osdc->msgpool_op_reply, msg_size, in __ceph_osdc_alloc_messages()
1055 struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, in ceph_osdc_new_request() argument
1077 req = ceph_osdc_alloc_request(osdc, snapc, num_ops, use_mempool, in ceph_osdc_new_request()
1110 req->r_flags = flags | osdc->client->options->read_from_replica; in ceph_osdc_new_request()
1173 static void for_each_request(struct ceph_osd_client *osdc, in DEFINE_RB_FUNCS()
1179 for (n = rb_first(&osdc->osds); n; n = rb_next(n)) { in DEFINE_RB_FUNCS()
1192 for (p = rb_first(&osdc->homeless_osd.o_requests); p; ) { in DEFINE_RB_FUNCS()
1260 static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum) in create_osd() argument
1268 osd->o_osdc = osdc; in create_osd()
1274 ceph_con_init(&osd->o_con, osd, &osd_con_ops, &osdc->client->msgr); in create_osd()
1303 struct ceph_osd_client *osdc = osd->o_osdc; in DEFINE_RB_FUNCS() local
1308 spin_lock(&osdc->osd_lru_lock); in DEFINE_RB_FUNCS()
1309 list_add_tail(&osd->o_osd_lru, &osdc->osd_lru); in DEFINE_RB_FUNCS()
1310 spin_unlock(&osdc->osd_lru_lock); in DEFINE_RB_FUNCS()
1312 osd->lru_ttl = jiffies + osdc->client->options->osd_idle_ttl; in DEFINE_RB_FUNCS()
1324 struct ceph_osd_client *osdc = osd->o_osdc; in __remove_osd_from_lru() local
1328 spin_lock(&osdc->osd_lru_lock); in __remove_osd_from_lru()
1331 spin_unlock(&osdc->osd_lru_lock); in __remove_osd_from_lru()
1340 struct ceph_osd_client *osdc = osd->o_osdc; in close_osd() local
1343 verify_osdc_wrlocked(osdc); in close_osd()
1356 link_request(&osdc->homeless_osd, req); in close_osd()
1367 link_linger(&osdc->homeless_osd, lreq); in close_osd()
1372 erase_osd(&osdc->osds, osd); in close_osd()
1415 static struct ceph_osd *lookup_create_osd(struct ceph_osd_client *osdc, int o, in lookup_create_osd() argument
1421 verify_osdc_wrlocked(osdc); in lookup_create_osd()
1423 verify_osdc_locked(osdc); in lookup_create_osd()
1426 osd = lookup_osd(&osdc->osds, o); in lookup_create_osd()
1428 osd = &osdc->homeless_osd; in lookup_create_osd()
1433 osd = create_osd(osdc, o); in lookup_create_osd()
1434 insert_osd(&osdc->osds, osd); in lookup_create_osd()
1436 &osdc->osdmap->osd_addr[osd->o_osd]); in lookup_create_osd()
1439 dout("%s osdc %p osd%d -> osd %p\n", __func__, osdc, o, osd); in lookup_create_osd()
1491 static bool have_pool_full(struct ceph_osd_client *osdc) in have_pool_full() argument
1495 for (n = rb_first(&osdc->osdmap->pg_pools); n; n = rb_next(n)) { in have_pool_full()
1506 static bool pool_full(struct ceph_osd_client *osdc, s64 pool_id) in pool_full() argument
1510 pi = ceph_pg_pool_by_id(osdc->osdmap, pool_id); in pool_full()
1521 static bool target_should_be_paused(struct ceph_osd_client *osdc, in target_should_be_paused() argument
1525 bool pauserd = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD); in target_should_be_paused()
1526 bool pausewr = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSEWR) || in target_should_be_paused()
1527 ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in target_should_be_paused()
1533 (osdc->osdmap->epoch < osdc->epoch_barrier); in target_should_be_paused()
1550 static int pick_closest_replica(struct ceph_osd_client *osdc, in pick_closest_replica() argument
1553 struct ceph_options *opt = osdc->client->options; in pick_closest_replica()
1558 locality = ceph_get_crush_locality(osdc->osdmap, in pick_closest_replica()
1581 static enum calc_target_result calc_target(struct ceph_osd_client *osdc, in calc_target() argument
1595 bool sort_bitwise = ceph_osdmap_flag(osdc, CEPH_OSDMAP_SORTBITWISE); in calc_target()
1596 bool recovery_deletes = ceph_osdmap_flag(osdc, in calc_target()
1600 t->epoch = osdc->osdmap->epoch; in calc_target()
1601 pi = ceph_pg_pool_by_id(osdc->osdmap, t->base_oloc.pool); in calc_target()
1608 if (osdc->osdmap->epoch == pi->last_force_request_resend) { in calc_target()
1626 pi = ceph_pg_pool_by_id(osdc->osdmap, t->target_oloc.pool); in calc_target()
1638 ceph_pg_to_up_acting_osds(osdc->osdmap, pi, &pgid, &up, &acting); in calc_target()
1657 should_be_paused = target_should_be_paused(osdc, t, pi); in calc_target()
1675 ceph_pg_to_primary_shard(osdc->osdmap, pi, &pgid, &t->spgid); in calc_target()
1695 pos = pick_closest_replica(osdc, &acting); in calc_target()
2357 static void maybe_request_map(struct ceph_osd_client *osdc) in maybe_request_map() argument
2361 verify_osdc_locked(osdc); in maybe_request_map()
2362 WARN_ON(!osdc->osdmap->epoch); in maybe_request_map()
2364 if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in maybe_request_map()
2365 ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD) || in maybe_request_map()
2366 ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSEWR)) { in maybe_request_map()
2367 dout("%s osdc %p continuous\n", __func__, osdc); in maybe_request_map()
2370 dout("%s osdc %p onetime\n", __func__, osdc); in maybe_request_map()
2373 if (ceph_monc_want_map(&osdc->client->monc, CEPH_SUB_OSDMAP, in maybe_request_map()
2374 osdc->osdmap->epoch + 1, continuous)) in maybe_request_map()
2375 ceph_monc_renew_subs(&osdc->client->monc); in maybe_request_map()
2383 struct ceph_osd_client *osdc = req->r_osdc; in __submit_request() local
2394 ct_res = calc_target(osdc, &req->r_t, false); in __submit_request()
2398 osd = lookup_create_osd(osdc, req->r_t.osd, wrlocked); in __submit_request()
2404 if (osdc->abort_err) { in __submit_request()
2405 dout("req %p abort_err %d\n", req, osdc->abort_err); in __submit_request()
2406 err = osdc->abort_err; in __submit_request()
2407 } else if (osdc->osdmap->epoch < osdc->epoch_barrier) { in __submit_request()
2408 dout("req %p epoch %u barrier %u\n", req, osdc->osdmap->epoch, in __submit_request()
2409 osdc->epoch_barrier); in __submit_request()
2411 maybe_request_map(osdc); in __submit_request()
2413 ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSEWR)) { in __submit_request()
2416 maybe_request_map(osdc); in __submit_request()
2418 ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD)) { in __submit_request()
2421 maybe_request_map(osdc); in __submit_request()
2425 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in __submit_request()
2426 pool_full(osdc, req->r_t.base_oloc.pool))) { in __submit_request()
2428 if (ceph_test_opt(osdc->client, ABORT_ON_FULL)) { in __submit_request()
2431 if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) in __submit_request()
2437 maybe_request_map(osdc); in __submit_request()
2442 maybe_request_map(osdc); in __submit_request()
2451 req->r_tid = atomic64_inc_return(&osdc->last_tid); in __submit_request()
2463 downgrade_write(&osdc->lock); in __submit_request()
2467 up_read(&osdc->lock); in __submit_request()
2468 down_write(&osdc->lock); in __submit_request()
2495 struct ceph_osd_client *osdc = req->r_osdc; in finish_request() local
2497 WARN_ON(lookup_request_mc(&osdc->map_checks, req->r_tid)); in finish_request()
2506 atomic_dec(&osdc->num_requests); in finish_request()
2553 struct ceph_osd_client *osdc = req->r_osdc; in cancel_map_check() local
2556 verify_osdc_wrlocked(osdc); in cancel_map_check()
2558 lookup_req = lookup_request_mc(&osdc->map_checks, req->r_tid); in cancel_map_check()
2563 erase_request_mc(&osdc->map_checks, req); in cancel_map_check()
2597 void ceph_osdc_abort_requests(struct ceph_osd_client *osdc, int err) in ceph_osdc_abort_requests() argument
2599 dout("%s osdc %p err %d\n", __func__, osdc, err); in ceph_osdc_abort_requests()
2600 down_write(&osdc->lock); in ceph_osdc_abort_requests()
2601 for_each_request(osdc, abort_fn, &err); in ceph_osdc_abort_requests()
2602 osdc->abort_err = err; in ceph_osdc_abort_requests()
2603 up_write(&osdc->lock); in ceph_osdc_abort_requests()
2607 void ceph_osdc_clear_abort_err(struct ceph_osd_client *osdc) in ceph_osdc_clear_abort_err() argument
2609 down_write(&osdc->lock); in ceph_osdc_clear_abort_err()
2610 osdc->abort_err = 0; in ceph_osdc_clear_abort_err()
2611 up_write(&osdc->lock); in ceph_osdc_clear_abort_err()
2615 static void update_epoch_barrier(struct ceph_osd_client *osdc, u32 eb) in update_epoch_barrier() argument
2617 if (likely(eb > osdc->epoch_barrier)) { in update_epoch_barrier()
2619 osdc->epoch_barrier, eb); in update_epoch_barrier()
2620 osdc->epoch_barrier = eb; in update_epoch_barrier()
2622 if (eb > osdc->osdmap->epoch) in update_epoch_barrier()
2623 maybe_request_map(osdc); in update_epoch_barrier()
2627 void ceph_osdc_update_epoch_barrier(struct ceph_osd_client *osdc, u32 eb) in ceph_osdc_update_epoch_barrier() argument
2629 down_read(&osdc->lock); in ceph_osdc_update_epoch_barrier()
2630 if (unlikely(eb > osdc->epoch_barrier)) { in ceph_osdc_update_epoch_barrier()
2631 up_read(&osdc->lock); in ceph_osdc_update_epoch_barrier()
2632 down_write(&osdc->lock); in ceph_osdc_update_epoch_barrier()
2633 update_epoch_barrier(osdc, eb); in ceph_osdc_update_epoch_barrier()
2634 up_write(&osdc->lock); in ceph_osdc_update_epoch_barrier()
2636 up_read(&osdc->lock); in ceph_osdc_update_epoch_barrier()
2649 struct ceph_osd_client *osdc = req->r_osdc; in abort_on_full_fn() local
2653 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in abort_on_full_fn()
2654 pool_full(osdc, req->r_t.base_oloc.pool))) { in abort_on_full_fn()
2656 update_epoch_barrier(osdc, osdc->osdmap->epoch); in abort_on_full_fn()
2671 static void ceph_osdc_abort_on_full(struct ceph_osd_client *osdc) in ceph_osdc_abort_on_full() argument
2675 if (ceph_test_opt(osdc->client, ABORT_ON_FULL) && in ceph_osdc_abort_on_full()
2676 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || have_pool_full(osdc))) in ceph_osdc_abort_on_full()
2677 for_each_request(osdc, abort_on_full_fn, &victims); in ceph_osdc_abort_on_full()
2682 struct ceph_osd_client *osdc = req->r_osdc; in check_pool_dne() local
2683 struct ceph_osdmap *map = osdc->osdmap; in check_pool_dne()
2685 verify_osdc_wrlocked(osdc); in check_pool_dne()
2716 struct ceph_osd_client *osdc = &greq->monc->client->osdc; in map_check_cb() local
2722 down_write(&osdc->lock); in map_check_cb()
2723 req = lookup_request_mc(&osdc->map_checks, tid); in map_check_cb()
2733 erase_request_mc(&osdc->map_checks, req); in map_check_cb()
2738 up_write(&osdc->lock); in map_check_cb()
2743 struct ceph_osd_client *osdc = req->r_osdc; in send_map_check() local
2747 verify_osdc_wrlocked(osdc); in send_map_check()
2749 lookup_req = lookup_request_mc(&osdc->map_checks, req->r_tid); in send_map_check()
2756 insert_request_mc(&osdc->map_checks, req); in send_map_check()
2757 ret = ceph_monc_get_version_async(&osdc->client->monc, "osdmap", in send_map_check()
2804 linger_alloc(struct ceph_osd_client *osdc) in linger_alloc() argument
2822 lreq->osdc = osdc; in linger_alloc()
2876 verify_osdc_locked(lreq->osdc); in __linger_registered()
2883 struct ceph_osd_client *osdc = lreq->osdc; in linger_registered() local
2886 down_read(&osdc->lock); in linger_registered()
2888 up_read(&osdc->lock); in linger_registered()
2895 struct ceph_osd_client *osdc = lreq->osdc; in linger_register() local
2897 verify_osdc_wrlocked(osdc); in linger_register()
2901 lreq->linger_id = ++osdc->last_linger_id; in linger_register()
2902 insert_linger_osdc(&osdc->linger_requests, lreq); in linger_register()
2907 struct ceph_osd_client *osdc = lreq->osdc; in linger_unregister() local
2909 verify_osdc_wrlocked(osdc); in linger_unregister()
2911 erase_linger_osdc(&osdc->linger_requests, lreq); in linger_unregister()
2976 struct ceph_osd_client *osdc = lreq->osdc; in lwork_queue() local
2983 queue_work(osdc->notify_wq, &lwork->work); in lwork_queue()
3128 struct ceph_osd_client *osdc = lreq->osdc; in send_linger() local
3132 verify_osdc_wrlocked(osdc); in send_linger()
3142 req = ceph_osdc_alloc_request(osdc, NULL, 1, true, GFP_NOIO); in send_linger()
3216 struct ceph_osd_client *osdc = lreq->osdc; in send_linger_ping() local
3220 if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD)) { in send_linger_ping()
3236 req = ceph_osdc_alloc_request(osdc, NULL, 1, true, GFP_NOIO); in send_linger_ping()
3253 req->r_tid = atomic64_inc_return(&osdc->last_tid); in send_linger_ping()
3260 struct ceph_osd_client *osdc = lreq->osdc; in linger_submit() local
3263 down_write(&osdc->lock); in linger_submit()
3266 calc_target(osdc, &lreq->t, false); in linger_submit()
3267 osd = lookup_create_osd(osdc, lreq->t.osd, true); in linger_submit()
3271 up_write(&osdc->lock); in linger_submit()
3276 struct ceph_osd_client *osdc = lreq->osdc; in cancel_linger_map_check() local
3279 verify_osdc_wrlocked(osdc); in cancel_linger_map_check()
3281 lookup_lreq = lookup_linger_mc(&osdc->linger_map_checks, in cancel_linger_map_check()
3287 erase_linger_mc(&osdc->linger_map_checks, lreq); in cancel_linger_map_check()
3307 struct ceph_osd_client *osdc = lreq->osdc; in linger_cancel() local
3309 down_write(&osdc->lock); in linger_cancel()
3312 up_write(&osdc->lock); in linger_cancel()
3319 struct ceph_osd_client *osdc = lreq->osdc; in check_linger_pool_dne() local
3320 struct ceph_osdmap *map = osdc->osdmap; in check_linger_pool_dne()
3322 verify_osdc_wrlocked(osdc); in check_linger_pool_dne()
3350 struct ceph_osd_client *osdc = &greq->monc->client->osdc; in linger_map_check_cb() local
3356 down_write(&osdc->lock); in linger_map_check_cb()
3357 lreq = lookup_linger_mc(&osdc->linger_map_checks, linger_id); in linger_map_check_cb()
3368 erase_linger_mc(&osdc->linger_map_checks, lreq); in linger_map_check_cb()
3373 up_write(&osdc->lock); in linger_map_check_cb()
3378 struct ceph_osd_client *osdc = lreq->osdc; in send_linger_map_check() local
3382 verify_osdc_wrlocked(osdc); in send_linger_map_check()
3384 lookup_lreq = lookup_linger_mc(&osdc->linger_map_checks, in send_linger_map_check()
3392 insert_linger_mc(&osdc->linger_map_checks, lreq); in send_linger_map_check()
3393 ret = ceph_monc_get_version_async(&osdc->client->monc, "osdmap", in send_linger_map_check()
3431 struct ceph_osd_client *osdc = in handle_timeout() local
3433 struct ceph_options *opts = osdc->client->options; in handle_timeout()
3439 dout("%s osdc %p\n", __func__, osdc); in handle_timeout()
3440 down_write(&osdc->lock); in handle_timeout()
3447 for (n = rb_first(&osdc->osds); n; n = rb_next(n)) { in handle_timeout()
3488 for (p = rb_first(&osdc->homeless_osd.o_requests); p; ) { in handle_timeout()
3496 req->r_tid, osdc->homeless_osd.o_osd); in handle_timeout()
3502 if (atomic_read(&osdc->num_homeless) || !list_empty(&slow_osds)) in handle_timeout()
3503 maybe_request_map(osdc); in handle_timeout()
3513 up_write(&osdc->lock); in handle_timeout()
3514 schedule_delayed_work(&osdc->timeout_work, in handle_timeout()
3515 osdc->client->options->osd_keepalive_timeout); in handle_timeout()
3520 struct ceph_osd_client *osdc = in handle_osds_timeout() local
3523 unsigned long delay = osdc->client->options->osd_idle_ttl / 4; in handle_osds_timeout()
3526 dout("%s osdc %p\n", __func__, osdc); in handle_osds_timeout()
3527 down_write(&osdc->lock); in handle_osds_timeout()
3528 list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) { in handle_osds_timeout()
3537 up_write(&osdc->lock); in handle_osds_timeout()
3538 schedule_delayed_work(&osdc->osds_timeout_work, in handle_osds_timeout()
3751 struct ceph_osd_client *osdc = osd->o_osdc; in handle_reply() local
3761 down_read(&osdc->lock); in handle_reply()
3868 up_read(&osdc->lock); in handle_reply()
3878 up_read(&osdc->lock); in handle_reply()
3881 static void set_pool_was_full(struct ceph_osd_client *osdc) in set_pool_was_full() argument
3885 for (n = rb_first(&osdc->osdmap->pg_pools); n; n = rb_next(n)) { in set_pool_was_full()
3893 static bool pool_cleared_full(struct ceph_osd_client *osdc, s64 pool_id) in pool_cleared_full() argument
3897 pi = ceph_pg_pool_by_id(osdc->osdmap, pool_id); in pool_cleared_full()
3907 struct ceph_osd_client *osdc = lreq->osdc; in recalc_linger_target() local
3910 ct_res = calc_target(osdc, &lreq->t, true); in recalc_linger_target()
3914 osd = lookup_create_osd(osdc, lreq->t.osd, true); in recalc_linger_target()
3934 struct ceph_osd_client *osdc = osd->o_osdc; in scan_requests() local
3952 pool_cleared_full(osdc, lreq->t.base_oloc.pool)); in scan_requests()
3982 ct_res = calc_target(osdc, &req->r_t, false); in scan_requests()
3987 pool_cleared_full(osdc, req->r_t.base_oloc.pool)); in scan_requests()
4006 static int handle_one_map(struct ceph_osd_client *osdc, in handle_one_map() argument
4016 was_full = ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL); in handle_one_map()
4017 set_pool_was_full(osdc); in handle_one_map()
4021 ceph_msgr2(osdc->client), in handle_one_map()
4022 osdc->osdmap); in handle_one_map()
4024 newmap = ceph_osdmap_decode(&p, end, ceph_msgr2(osdc->client)); in handle_one_map()
4028 if (newmap != osdc->osdmap) { in handle_one_map()
4039 old_pi = ceph_pg_pool_by_id(osdc->osdmap, pi->id); in handle_one_map()
4046 if (osdc->osdmap->epoch && in handle_one_map()
4047 osdc->osdmap->epoch + 1 < newmap->epoch) { in handle_one_map()
4052 ceph_osdmap_destroy(osdc->osdmap); in handle_one_map()
4053 osdc->osdmap = newmap; in handle_one_map()
4056 was_full &= !ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL); in handle_one_map()
4057 scan_requests(&osdc->homeless_osd, skipped_map, was_full, true, in handle_one_map()
4060 for (n = rb_first(&osdc->osds); n; ) { in handle_one_map()
4067 if (!ceph_osd_is_up(osdc->osdmap, osd->o_osd) || in handle_one_map()
4069 ceph_osd_addr(osdc->osdmap, osd->o_osd), in handle_one_map()
4077 static void kick_requests(struct ceph_osd_client *osdc, in kick_requests() argument
4092 if (req->r_t.epoch < osdc->osdmap->epoch) { in kick_requests()
4093 ct_res = calc_target(osdc, &req->r_t, false); in kick_requests()
4109 osd = lookup_create_osd(osdc, req->r_t.osd, true); in kick_requests()
4134 void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) in ceph_osdc_handle_map() argument
4148 dout("%s have %u\n", __func__, osdc->osdmap->epoch); in ceph_osdc_handle_map()
4149 down_write(&osdc->lock); in ceph_osdc_handle_map()
4154 if (ceph_check_fsid(osdc->client, &fsid) < 0) in ceph_osdc_handle_map()
4157 was_pauserd = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD); in ceph_osdc_handle_map()
4158 was_pausewr = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSEWR) || in ceph_osdc_handle_map()
4159 ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in ceph_osdc_handle_map()
4160 have_pool_full(osdc); in ceph_osdc_handle_map()
4170 if (osdc->osdmap->epoch && in ceph_osdc_handle_map()
4171 osdc->osdmap->epoch + 1 == epoch) { in ceph_osdc_handle_map()
4174 err = handle_one_map(osdc, p, p + maplen, true, in ceph_osdc_handle_map()
4200 } else if (osdc->osdmap->epoch >= epoch) { in ceph_osdc_handle_map()
4203 osdc->osdmap->epoch); in ceph_osdc_handle_map()
4206 err = handle_one_map(osdc, p, p + maplen, false, in ceph_osdc_handle_map()
4221 pauserd = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSERD); in ceph_osdc_handle_map()
4222 pausewr = ceph_osdmap_flag(osdc, CEPH_OSDMAP_PAUSEWR) || in ceph_osdc_handle_map()
4223 ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || in ceph_osdc_handle_map()
4224 have_pool_full(osdc); in ceph_osdc_handle_map()
4226 osdc->osdmap->epoch < osdc->epoch_barrier) in ceph_osdc_handle_map()
4227 maybe_request_map(osdc); in ceph_osdc_handle_map()
4229 kick_requests(osdc, &need_resend, &need_resend_linger); in ceph_osdc_handle_map()
4231 ceph_osdc_abort_on_full(osdc); in ceph_osdc_handle_map()
4232 ceph_monc_got_map(&osdc->client->monc, CEPH_SUB_OSDMAP, in ceph_osdc_handle_map()
4233 osdc->osdmap->epoch); in ceph_osdc_handle_map()
4234 up_write(&osdc->lock); in ceph_osdc_handle_map()
4235 wake_up_all(&osdc->client->auth_wq); in ceph_osdc_handle_map()
4241 up_write(&osdc->lock); in ceph_osdc_handle_map()
4280 struct ceph_osd_client *osdc = osd->o_osdc; in osd_fault() local
4284 down_write(&osdc->lock); in osd_fault()
4295 maybe_request_map(osdc); in osd_fault()
4298 up_write(&osdc->lock); in osd_fault()
4517 struct ceph_osd_client *osdc = osd->o_osdc; in handle_backoff() local
4521 down_read(&osdc->lock); in handle_backoff()
4524 up_read(&osdc->lock); in handle_backoff()
4553 up_read(&osdc->lock); in handle_backoff()
4559 static void handle_watch_notify(struct ceph_osd_client *osdc, in handle_watch_notify() argument
4592 down_read(&osdc->lock); in handle_watch_notify()
4593 lreq = lookup_linger_osdc(&osdc->linger_requests, cookie); in handle_watch_notify()
4648 up_read(&osdc->lock); in handle_watch_notify()
4658 void ceph_osdc_start_request(struct ceph_osd_client *osdc, in ceph_osdc_start_request() argument
4661 down_read(&osdc->lock); in ceph_osdc_start_request()
4663 up_read(&osdc->lock); in ceph_osdc_start_request()
4678 struct ceph_osd_client *osdc = req->r_osdc; in ceph_osdc_cancel_request() local
4680 down_write(&osdc->lock); in ceph_osdc_cancel_request()
4683 up_write(&osdc->lock); in ceph_osdc_cancel_request()
4711 int ceph_osdc_wait_request(struct ceph_osd_client *osdc, in ceph_osdc_wait_request() argument
4721 void ceph_osdc_sync(struct ceph_osd_client *osdc) in ceph_osdc_sync() argument
4724 u64 last_tid = atomic64_read(&osdc->last_tid); in ceph_osdc_sync()
4727 down_read(&osdc->lock); in ceph_osdc_sync()
4728 for (n = rb_first(&osdc->osds); n; n = rb_next(n)) { in ceph_osdc_sync()
4744 up_read(&osdc->lock); in ceph_osdc_sync()
4755 up_read(&osdc->lock); in ceph_osdc_sync()
4764 ceph_osdc_watch(struct ceph_osd_client *osdc, in ceph_osdc_watch() argument
4774 lreq = linger_alloc(osdc); in ceph_osdc_watch()
4811 int ceph_osdc_unwatch(struct ceph_osd_client *osdc, in ceph_osdc_unwatch() argument
4814 struct ceph_options *opts = osdc->client->options; in ceph_osdc_unwatch()
4818 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO); in ceph_osdc_unwatch()
4833 ceph_osdc_start_request(osdc, req); in ceph_osdc_unwatch()
4876 int ceph_osdc_notify_ack(struct ceph_osd_client *osdc, in ceph_osdc_notify_ack() argument
4887 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO); in ceph_osdc_notify_ack()
4904 ceph_osdc_start_request(osdc, req); in ceph_osdc_notify_ack()
4905 ret = ceph_osdc_wait_request(osdc, req); in ceph_osdc_notify_ack()
4921 int ceph_osdc_notify(struct ceph_osd_client *osdc, in ceph_osdc_notify() argument
4939 lreq = linger_alloc(osdc); in ceph_osdc_notify()
5054 int ceph_osdc_list_watchers(struct ceph_osd_client *osdc, in ceph_osdc_list_watchers() argument
5064 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO); in ceph_osdc_list_watchers()
5087 ceph_osdc_start_request(osdc, req); in ceph_osdc_list_watchers()
5088 ret = ceph_osdc_wait_request(osdc, req); in ceph_osdc_list_watchers()
5106 void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc) in ceph_osdc_flush_notifies() argument
5108 dout("%s osdc %p\n", __func__, osdc); in ceph_osdc_flush_notifies()
5109 flush_workqueue(osdc->notify_wq); in ceph_osdc_flush_notifies()
5113 void ceph_osdc_maybe_request_map(struct ceph_osd_client *osdc) in ceph_osdc_maybe_request_map() argument
5115 down_read(&osdc->lock); in ceph_osdc_maybe_request_map()
5116 maybe_request_map(osdc); in ceph_osdc_maybe_request_map()
5117 up_read(&osdc->lock); in ceph_osdc_maybe_request_map()
5127 int ceph_osdc_call(struct ceph_osd_client *osdc, in ceph_osdc_call() argument
5141 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO); in ceph_osdc_call()
5164 ceph_osdc_start_request(osdc, req); in ceph_osdc_call()
5165 ret = ceph_osdc_wait_request(osdc, req); in ceph_osdc_call()
5181 void ceph_osdc_reopen_osds(struct ceph_osd_client *osdc) in ceph_osdc_reopen_osds() argument
5185 down_write(&osdc->lock); in ceph_osdc_reopen_osds()
5186 for (n = rb_first(&osdc->osds); n; ) { in ceph_osdc_reopen_osds()
5193 up_write(&osdc->lock); in ceph_osdc_reopen_osds()
5199 int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) in ceph_osdc_init() argument
5204 osdc->client = client; in ceph_osdc_init()
5205 init_rwsem(&osdc->lock); in ceph_osdc_init()
5206 osdc->osds = RB_ROOT; in ceph_osdc_init()
5207 INIT_LIST_HEAD(&osdc->osd_lru); in ceph_osdc_init()
5208 spin_lock_init(&osdc->osd_lru_lock); in ceph_osdc_init()
5209 osd_init(&osdc->homeless_osd); in ceph_osdc_init()
5210 osdc->homeless_osd.o_osdc = osdc; in ceph_osdc_init()
5211 osdc->homeless_osd.o_osd = CEPH_HOMELESS_OSD; in ceph_osdc_init()
5212 osdc->last_linger_id = CEPH_LINGER_ID_START; in ceph_osdc_init()
5213 osdc->linger_requests = RB_ROOT; in ceph_osdc_init()
5214 osdc->map_checks = RB_ROOT; in ceph_osdc_init()
5215 osdc->linger_map_checks = RB_ROOT; in ceph_osdc_init()
5216 INIT_DELAYED_WORK(&osdc->timeout_work, handle_timeout); in ceph_osdc_init()
5217 INIT_DELAYED_WORK(&osdc->osds_timeout_work, handle_osds_timeout); in ceph_osdc_init()
5220 osdc->osdmap = ceph_osdmap_alloc(); in ceph_osdc_init()
5221 if (!osdc->osdmap) in ceph_osdc_init()
5224 osdc->req_mempool = mempool_create_slab_pool(10, in ceph_osdc_init()
5226 if (!osdc->req_mempool) in ceph_osdc_init()
5229 err = ceph_msgpool_init(&osdc->msgpool_op, CEPH_MSG_OSD_OP, in ceph_osdc_init()
5233 err = ceph_msgpool_init(&osdc->msgpool_op_reply, CEPH_MSG_OSD_OPREPLY, in ceph_osdc_init()
5240 osdc->notify_wq = create_singlethread_workqueue("ceph-watch-notify"); in ceph_osdc_init()
5241 if (!osdc->notify_wq) in ceph_osdc_init()
5244 osdc->completion_wq = create_singlethread_workqueue("ceph-completion"); in ceph_osdc_init()
5245 if (!osdc->completion_wq) in ceph_osdc_init()
5248 schedule_delayed_work(&osdc->timeout_work, in ceph_osdc_init()
5249 osdc->client->options->osd_keepalive_timeout); in ceph_osdc_init()
5250 schedule_delayed_work(&osdc->osds_timeout_work, in ceph_osdc_init()
5251 round_jiffies_relative(osdc->client->options->osd_idle_ttl)); in ceph_osdc_init()
5256 destroy_workqueue(osdc->notify_wq); in ceph_osdc_init()
5258 ceph_msgpool_destroy(&osdc->msgpool_op_reply); in ceph_osdc_init()
5260 ceph_msgpool_destroy(&osdc->msgpool_op); in ceph_osdc_init()
5262 mempool_destroy(osdc->req_mempool); in ceph_osdc_init()
5264 ceph_osdmap_destroy(osdc->osdmap); in ceph_osdc_init()
5269 void ceph_osdc_stop(struct ceph_osd_client *osdc) in ceph_osdc_stop() argument
5271 destroy_workqueue(osdc->completion_wq); in ceph_osdc_stop()
5272 destroy_workqueue(osdc->notify_wq); in ceph_osdc_stop()
5273 cancel_delayed_work_sync(&osdc->timeout_work); in ceph_osdc_stop()
5274 cancel_delayed_work_sync(&osdc->osds_timeout_work); in ceph_osdc_stop()
5276 down_write(&osdc->lock); in ceph_osdc_stop()
5277 while (!RB_EMPTY_ROOT(&osdc->osds)) { in ceph_osdc_stop()
5278 struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds), in ceph_osdc_stop()
5282 up_write(&osdc->lock); in ceph_osdc_stop()
5283 WARN_ON(refcount_read(&osdc->homeless_osd.o_ref) != 1); in ceph_osdc_stop()
5284 osd_cleanup(&osdc->homeless_osd); in ceph_osdc_stop()
5286 WARN_ON(!list_empty(&osdc->osd_lru)); in ceph_osdc_stop()
5287 WARN_ON(!RB_EMPTY_ROOT(&osdc->linger_requests)); in ceph_osdc_stop()
5288 WARN_ON(!RB_EMPTY_ROOT(&osdc->map_checks)); in ceph_osdc_stop()
5289 WARN_ON(!RB_EMPTY_ROOT(&osdc->linger_map_checks)); in ceph_osdc_stop()
5290 WARN_ON(atomic_read(&osdc->num_requests)); in ceph_osdc_stop()
5291 WARN_ON(atomic_read(&osdc->num_homeless)); in ceph_osdc_stop()
5293 ceph_osdmap_destroy(osdc->osdmap); in ceph_osdc_stop()
5294 mempool_destroy(osdc->req_mempool); in ceph_osdc_stop()
5295 ceph_msgpool_destroy(&osdc->msgpool_op); in ceph_osdc_stop()
5296 ceph_msgpool_destroy(&osdc->msgpool_op_reply); in ceph_osdc_stop()
5362 struct ceph_osd_client *osdc = osd->o_osdc; in osd_dispatch() local
5367 ceph_osdc_handle_map(osdc, msg); in osd_dispatch()
5376 handle_watch_notify(osdc, msg); in osd_dispatch()
5415 struct ceph_osd_client *osdc = osd->o_osdc; in get_reply() local
5423 down_read(&osdc->lock); in get_reply()
5472 up_read(&osdc->lock); in get_reply()
5555 struct ceph_osd_client *osdc = o->o_osdc; in osd_get_authorizer() local
5556 struct ceph_auth_client *ac = osdc->client->monc.auth; in osd_get_authorizer()
5572 struct ceph_osd_client *osdc = o->o_osdc; in osd_add_authorizer_challenge() local
5573 struct ceph_auth_client *ac = osdc->client->monc.auth; in osd_add_authorizer_challenge()
5582 struct ceph_osd_client *osdc = o->o_osdc; in osd_verify_authorizer_reply() local
5583 struct ceph_auth_client *ac = osdc->client->monc.auth; in osd_verify_authorizer_reply()
5594 struct ceph_osd_client *osdc = o->o_osdc; in osd_invalidate_authorizer() local
5595 struct ceph_auth_client *ac = osdc->client->monc.auth; in osd_invalidate_authorizer()
5598 return ceph_monc_validate_auth(&osdc->client->monc); in osd_invalidate_authorizer()