Lines Matching refs:device

94 void *drbd_md_get_buffer(struct drbd_device *device, const char *intent)  in drbd_md_get_buffer()  argument
98 wait_event(device->misc_wait, in drbd_md_get_buffer()
99 (r = atomic_cmpxchg(&device->md_io.in_use, 0, 1)) == 0 || in drbd_md_get_buffer()
100 device->state.disk <= D_FAILED); in drbd_md_get_buffer()
105 device->md_io.current_use = intent; in drbd_md_get_buffer()
106 device->md_io.start_jif = jiffies; in drbd_md_get_buffer()
107 device->md_io.submit_jif = device->md_io.start_jif - 1; in drbd_md_get_buffer()
108 return page_address(device->md_io.page); in drbd_md_get_buffer()
111 void drbd_md_put_buffer(struct drbd_device *device) in drbd_md_put_buffer() argument
113 if (atomic_dec_and_test(&device->md_io.in_use)) in drbd_md_put_buffer()
114 wake_up(&device->misc_wait); in drbd_md_put_buffer()
117 void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, in wait_until_done_or_force_detached() argument
129 dt = wait_event_timeout(device->misc_wait, in wait_until_done_or_force_detached()
130 *done || test_bit(FORCE_DETACH, &device->flags), dt); in wait_until_done_or_force_detached()
132 drbd_err(device, "meta-data IO operation timed out\n"); in wait_until_done_or_force_detached()
133 drbd_chk_io_error(device, 1, DRBD_FORCE_DETACH); in wait_until_done_or_force_detached()
137 static int _drbd_md_sync_page_io(struct drbd_device *device, in _drbd_md_sync_page_io() argument
146 device->md_io.done = 0; in _drbd_md_sync_page_io()
147 device->md_io.error = -ENODEV; in _drbd_md_sync_page_io()
149 if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) in _drbd_md_sync_page_io()
157 if (bio_add_page(bio, device->md_io.page, size, 0) != size) in _drbd_md_sync_page_io()
159 bio->bi_private = device; in _drbd_md_sync_page_io()
163 if (op != REQ_OP_WRITE && device->state.disk == D_DISKLESS && device->ldev == NULL) in _drbd_md_sync_page_io()
166 else if (!get_ldev_if_state(device, D_ATTACHING)) { in _drbd_md_sync_page_io()
168 drbd_err(device, "ASSERT FAILED: get_ldev_if_state() == 1 in _drbd_md_sync_page_io()\n"); in _drbd_md_sync_page_io()
174 atomic_inc(&device->md_io.in_use); /* drbd_md_put_buffer() is in the completion handler */ in _drbd_md_sync_page_io()
175 device->md_io.submit_jif = jiffies; in _drbd_md_sync_page_io()
176 if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) in _drbd_md_sync_page_io()
180 wait_until_done_or_force_detached(device, bdev, &device->md_io.done); in _drbd_md_sync_page_io()
182 err = device->md_io.error; in _drbd_md_sync_page_io()
189 int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, in drbd_md_sync_page_io() argument
193 D_ASSERT(device, atomic_read(&device->md_io.in_use) == 1); in drbd_md_sync_page_io()
197 dynamic_drbd_dbg(device, "meta_data io: %s [%d]:%s(,%llus,%s) %pS\n", in drbd_md_sync_page_io()
204 drbd_alert(device, "%s [%d]:%s(,%llus,%s) out of range md access!\n", in drbd_md_sync_page_io()
209 err = _drbd_md_sync_page_io(device, bdev, sector, op); in drbd_md_sync_page_io()
211 drbd_err(device, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", in drbd_md_sync_page_io()
218 static struct bm_extent *find_active_resync_extent(struct drbd_device *device, unsigned int enr) in find_active_resync_extent() argument
221 tmp = lc_find(device->resync, enr/AL_EXT_PER_BM_SECT); in find_active_resync_extent()
230 static struct lc_element *_al_get(struct drbd_device *device, unsigned int enr, bool nonblock) in _al_get() argument
236 spin_lock_irq(&device->al_lock); in _al_get()
237 bm_ext = find_active_resync_extent(device, enr); in _al_get()
240 spin_unlock_irq(&device->al_lock); in _al_get()
242 wake_up(&device->al_wait); in _al_get()
246 al_ext = lc_try_get(device->act_log, enr); in _al_get()
248 al_ext = lc_get(device->act_log, enr); in _al_get()
249 spin_unlock_irq(&device->al_lock); in _al_get()
253 bool drbd_al_begin_io_fastpath(struct drbd_device *device, struct drbd_interval *i) in drbd_al_begin_io_fastpath() argument
260 D_ASSERT(device, first <= last); in drbd_al_begin_io_fastpath()
261 D_ASSERT(device, atomic_read(&device->local_cnt) > 0); in drbd_al_begin_io_fastpath()
267 return _al_get(device, first, true); in drbd_al_begin_io_fastpath()
270 bool drbd_al_begin_io_prepare(struct drbd_device *device, struct drbd_interval *i) in drbd_al_begin_io_prepare() argument
279 D_ASSERT(device, first <= last); in drbd_al_begin_io_prepare()
280 D_ASSERT(device, atomic_read(&device->local_cnt) > 0); in drbd_al_begin_io_prepare()
284 wait_event(device->al_wait, in drbd_al_begin_io_prepare()
285 (al_ext = _al_get(device, enr, false)) != NULL); in drbd_al_begin_io_prepare()
310 static sector_t al_tr_number_to_on_disk_sector(struct drbd_device *device) in al_tr_number_to_on_disk_sector() argument
312 const unsigned int stripes = device->ldev->md.al_stripes; in al_tr_number_to_on_disk_sector()
313 const unsigned int stripe_size_4kB = device->ldev->md.al_stripe_size_4k; in al_tr_number_to_on_disk_sector()
316 unsigned int t = device->al_tr_number % (device->ldev->md.al_size_4k); in al_tr_number_to_on_disk_sector()
325 return device->ldev->md.md_offset + device->ldev->md.al_offset + t; in al_tr_number_to_on_disk_sector()
328 static int __al_write_transaction(struct drbd_device *device, struct al_transaction_on_disk *buffer) in __al_write_transaction() argument
339 buffer->tr_number = cpu_to_be32(device->al_tr_number); in __al_write_transaction()
343 drbd_bm_reset_al_hints(device); in __al_write_transaction()
349 spin_lock_irq(&device->al_lock); in __al_write_transaction()
350 list_for_each_entry(e, &device->act_log->to_be_changed, list) { in __al_write_transaction()
358 drbd_bm_mark_for_writeout(device, in __al_write_transaction()
362 spin_unlock_irq(&device->al_lock); in __al_write_transaction()
371 buffer->context_size = cpu_to_be16(device->act_log->nr_elements); in __al_write_transaction()
372 buffer->context_start_slot_nr = cpu_to_be16(device->al_tr_cycle); in __al_write_transaction()
375 device->act_log->nr_elements - device->al_tr_cycle); in __al_write_transaction()
377 unsigned idx = device->al_tr_cycle + i; in __al_write_transaction()
378 extent_nr = lc_element_by_index(device->act_log, idx)->lc_number; in __al_write_transaction()
384 device->al_tr_cycle += AL_CONTEXT_PER_TRANSACTION; in __al_write_transaction()
385 if (device->al_tr_cycle >= device->act_log->nr_elements) in __al_write_transaction()
386 device->al_tr_cycle = 0; in __al_write_transaction()
388 sector = al_tr_number_to_on_disk_sector(device); in __al_write_transaction()
393 if (drbd_bm_write_hinted(device)) in __al_write_transaction()
398 write_al_updates = rcu_dereference(device->ldev->disk_conf)->al_updates; in __al_write_transaction()
401 if (drbd_md_sync_page_io(device, device->ldev, sector, WRITE)) { in __al_write_transaction()
403 drbd_chk_io_error(device, 1, DRBD_META_IO_ERROR); in __al_write_transaction()
405 device->al_tr_number++; in __al_write_transaction()
406 device->al_writ_cnt++; in __al_write_transaction()
414 static int al_write_transaction(struct drbd_device *device) in al_write_transaction() argument
419 if (!get_ldev(device)) { in al_write_transaction()
420 drbd_err(device, "disk is %s, cannot start al transaction\n", in al_write_transaction()
421 drbd_disk_str(device->state.disk)); in al_write_transaction()
426 if (device->state.disk < D_INCONSISTENT) { in al_write_transaction()
427 drbd_err(device, in al_write_transaction()
429 drbd_disk_str(device->state.disk)); in al_write_transaction()
430 put_ldev(device); in al_write_transaction()
435 buffer = drbd_md_get_buffer(device, __func__); in al_write_transaction()
437 drbd_err(device, "disk failed while waiting for md_io buffer\n"); in al_write_transaction()
438 put_ldev(device); in al_write_transaction()
442 err = __al_write_transaction(device, buffer); in al_write_transaction()
444 drbd_md_put_buffer(device); in al_write_transaction()
445 put_ldev(device); in al_write_transaction()
451 void drbd_al_begin_io_commit(struct drbd_device *device) in drbd_al_begin_io_commit() argument
458 wait_event(device->al_wait, in drbd_al_begin_io_commit()
459 device->act_log->pending_changes == 0 || in drbd_al_begin_io_commit()
460 (locked = lc_try_lock_for_transaction(device->act_log))); in drbd_al_begin_io_commit()
465 if (device->act_log->pending_changes) { in drbd_al_begin_io_commit()
469 write_al_updates = rcu_dereference(device->ldev->disk_conf)->al_updates; in drbd_al_begin_io_commit()
473 al_write_transaction(device); in drbd_al_begin_io_commit()
474 spin_lock_irq(&device->al_lock); in drbd_al_begin_io_commit()
479 lc_committed(device->act_log); in drbd_al_begin_io_commit()
480 spin_unlock_irq(&device->al_lock); in drbd_al_begin_io_commit()
482 lc_unlock(device->act_log); in drbd_al_begin_io_commit()
483 wake_up(&device->al_wait); in drbd_al_begin_io_commit()
490 void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i) in drbd_al_begin_io() argument
492 if (drbd_al_begin_io_prepare(device, i)) in drbd_al_begin_io()
493 drbd_al_begin_io_commit(device); in drbd_al_begin_io()
496 int drbd_al_begin_io_nonblock(struct drbd_device *device, struct drbd_interval *i) in drbd_al_begin_io_nonblock() argument
498 struct lru_cache *al = device->act_log; in drbd_al_begin_io_nonblock()
507 D_ASSERT(device, first <= last); in drbd_al_begin_io_nonblock()
526 __set_bit(__LC_STARVING, &device->act_log->flags); in drbd_al_begin_io_nonblock()
533 tmp = lc_find(device->resync, enr/AL_EXT_PER_BM_SECT); in drbd_al_begin_io_nonblock()
549 al_ext = lc_get_cumulative(device->act_log, enr); in drbd_al_begin_io_nonblock()
551 drbd_info(device, "LOGIC BUG for enr=%u\n", enr); in drbd_al_begin_io_nonblock()
556 void drbd_al_complete_io(struct drbd_device *device, struct drbd_interval *i) in drbd_al_complete_io() argument
566 D_ASSERT(device, first <= last); in drbd_al_complete_io()
567 spin_lock_irqsave(&device->al_lock, flags); in drbd_al_complete_io()
570 extent = lc_find(device->act_log, enr); in drbd_al_complete_io()
572 drbd_err(device, "al_complete_io() called on inactive extent %u\n", enr); in drbd_al_complete_io()
575 lc_put(device->act_log, extent); in drbd_al_complete_io()
577 spin_unlock_irqrestore(&device->al_lock, flags); in drbd_al_complete_io()
578 wake_up(&device->al_wait); in drbd_al_complete_io()
581 static int _try_lc_del(struct drbd_device *device, struct lc_element *al_ext) in _try_lc_del() argument
585 spin_lock_irq(&device->al_lock); in _try_lc_del()
588 lc_del(device->act_log, al_ext); in _try_lc_del()
589 spin_unlock_irq(&device->al_lock); in _try_lc_del()
603 void drbd_al_shrink(struct drbd_device *device) in drbd_al_shrink() argument
608 D_ASSERT(device, test_bit(__LC_LOCKED, &device->act_log->flags)); in drbd_al_shrink()
610 for (i = 0; i < device->act_log->nr_elements; i++) { in drbd_al_shrink()
611 al_ext = lc_element_by_index(device->act_log, i); in drbd_al_shrink()
614 wait_event(device->al_wait, _try_lc_del(device, al_ext)); in drbd_al_shrink()
617 wake_up(&device->al_wait); in drbd_al_shrink()
620 int drbd_al_initialize(struct drbd_device *device, void *buffer) in drbd_al_initialize() argument
623 struct drbd_md *md = &device->ldev->md; in drbd_al_initialize()
627 __al_write_transaction(device, al); in drbd_al_initialize()
629 spin_lock_irq(&device->al_lock); in drbd_al_initialize()
630 lc_committed(device->act_log); in drbd_al_initialize()
631 spin_unlock_irq(&device->al_lock); in drbd_al_initialize()
637 int err = __al_write_transaction(device, al); in drbd_al_initialize()
663 static bool update_rs_extent(struct drbd_device *device, in update_rs_extent() argument
669 D_ASSERT(device, atomic_read(&device->local_cnt)); in update_rs_extent()
679 e = lc_find(device->resync, enr); in update_rs_extent()
681 e = lc_get(device->resync, enr); in update_rs_extent()
692 drbd_warn(device, "BAD! enr=%u rs_left=%d " in update_rs_extent()
696 drbd_conn_str(device->state.conn)); in update_rs_extent()
704 ext->rs_left = drbd_bm_e_weight(device, enr); in update_rs_extent()
713 int rs_left = drbd_bm_e_weight(device, enr); in update_rs_extent()
715 drbd_warn(device, "changing resync lce: %d[%u;%02lx]" in update_rs_extent()
722 drbd_warn(device, "Kicking resync_lru element enr=%u " in update_rs_extent()
730 lc_committed(device->resync); in update_rs_extent()
733 lc_put(device->resync, &ext->lce); in update_rs_extent()
742 drbd_err(device, "lc_get() failed! locked=%d/%d flags=%lu\n", in update_rs_extent()
743 device->resync_locked, in update_rs_extent()
744 device->resync->nr_elements, in update_rs_extent()
745 device->resync->flags); in update_rs_extent()
750 void drbd_advance_rs_marks(struct drbd_device *device, unsigned long still_to_go) in drbd_advance_rs_marks() argument
753 unsigned long last = device->rs_mark_time[device->rs_last_mark]; in drbd_advance_rs_marks()
754 int next = (device->rs_last_mark + 1) % DRBD_SYNC_MARKS; in drbd_advance_rs_marks()
756 if (device->rs_mark_left[device->rs_last_mark] != still_to_go && in drbd_advance_rs_marks()
757 device->state.conn != C_PAUSED_SYNC_T && in drbd_advance_rs_marks()
758 device->state.conn != C_PAUSED_SYNC_S) { in drbd_advance_rs_marks()
759 device->rs_mark_time[next] = now; in drbd_advance_rs_marks()
760 device->rs_mark_left[next] = still_to_go; in drbd_advance_rs_marks()
761 device->rs_last_mark = next; in drbd_advance_rs_marks()
767 static bool lazy_bitmap_update_due(struct drbd_device *device) in lazy_bitmap_update_due() argument
769 return time_after(jiffies, device->rs_last_bcast + 2*HZ); in lazy_bitmap_update_due()
772 static void maybe_schedule_on_disk_bitmap_update(struct drbd_device *device, bool rs_done) in maybe_schedule_on_disk_bitmap_update() argument
775 struct drbd_connection *connection = first_peer_device(device)->connection; in maybe_schedule_on_disk_bitmap_update()
777 is_sync_target_state(device->state.conn)) in maybe_schedule_on_disk_bitmap_update()
778 set_bit(RS_DONE, &device->flags); in maybe_schedule_on_disk_bitmap_update()
785 } else if (!lazy_bitmap_update_due(device)) in maybe_schedule_on_disk_bitmap_update()
788 drbd_device_post_work(device, RS_PROGRESS); in maybe_schedule_on_disk_bitmap_update()
791 static int update_sync_bits(struct drbd_device *device, in update_sync_bits() argument
816 c = drbd_bm_count_bits(device, sbnr, tbnr); in update_sync_bits()
818 c = drbd_bm_clear_bits(device, sbnr, tbnr); in update_sync_bits()
820 c = drbd_bm_set_bits(device, sbnr, tbnr); in update_sync_bits()
823 spin_lock_irqsave(&device->al_lock, flags); in update_sync_bits()
824 cleared += update_rs_extent(device, BM_BIT_TO_EXT(sbnr), c, mode); in update_sync_bits()
825 spin_unlock_irqrestore(&device->al_lock, flags); in update_sync_bits()
832 unsigned long still_to_go = drbd_bm_total_weight(device); in update_sync_bits()
833 bool rs_is_done = (still_to_go <= device->rs_failed); in update_sync_bits()
834 drbd_advance_rs_marks(device, still_to_go); in update_sync_bits()
836 maybe_schedule_on_disk_bitmap_update(device, rs_is_done); in update_sync_bits()
838 device->rs_failed += count; in update_sync_bits()
839 wake_up(&device->al_wait); in update_sync_bits()
858 int __drbd_change_sync(struct drbd_device *device, sector_t sector, int size, in __drbd_change_sync() argument
871 drbd_err(device, "%s: sector=%llus size=%d nonsense!\n", in __drbd_change_sync()
877 if (!get_ldev(device)) in __drbd_change_sync()
880 nr_sectors = drbd_get_capacity(device->this_bdev); in __drbd_change_sync()
907 count = update_sync_bits(device, sbnr, ebnr, mode); in __drbd_change_sync()
909 put_ldev(device); in __drbd_change_sync()
914 struct bm_extent *_bme_get(struct drbd_device *device, unsigned int enr) in _bme_get() argument
921 spin_lock_irq(&device->al_lock); in _bme_get()
922 if (device->resync_locked > device->resync->nr_elements/2) { in _bme_get()
923 spin_unlock_irq(&device->al_lock); in _bme_get()
926 e = lc_get(device->resync, enr); in _bme_get()
930 bm_ext->rs_left = drbd_bm_e_weight(device, enr); in _bme_get()
932 lc_committed(device->resync); in _bme_get()
936 device->resync_locked++; in _bme_get()
939 rs_flags = device->resync->flags; in _bme_get()
940 spin_unlock_irq(&device->al_lock); in _bme_get()
942 wake_up(&device->al_wait); in _bme_get()
946 drbd_warn(device, "Have to wait for element" in _bme_get()
954 static int _is_in_al(struct drbd_device *device, unsigned int enr) in _is_in_al() argument
958 spin_lock_irq(&device->al_lock); in _is_in_al()
959 rv = lc_is_used(device->act_log, enr); in _is_in_al()
960 spin_unlock_irq(&device->al_lock); in _is_in_al()
972 int drbd_rs_begin_io(struct drbd_device *device, sector_t sector) in drbd_rs_begin_io() argument
980 sig = wait_event_interruptible(device->al_wait, in drbd_rs_begin_io()
981 (bm_ext = _bme_get(device, enr))); in drbd_rs_begin_io()
989 sa = drbd_rs_c_min_rate_throttle(device); in drbd_rs_begin_io()
992 sig = wait_event_interruptible(device->al_wait, in drbd_rs_begin_io()
993 !_is_in_al(device, enr * AL_EXT_PER_BM_SECT + i) || in drbd_rs_begin_io()
997 spin_lock_irq(&device->al_lock); in drbd_rs_begin_io()
998 if (lc_put(device->resync, &bm_ext->lce) == 0) { in drbd_rs_begin_io()
1000 device->resync_locked--; in drbd_rs_begin_io()
1001 wake_up(&device->al_wait); in drbd_rs_begin_io()
1003 spin_unlock_irq(&device->al_lock); in drbd_rs_begin_io()
1024 int drbd_try_rs_begin_io(struct drbd_device *device, sector_t sector) in drbd_try_rs_begin_io() argument
1031 bool throttle = drbd_rs_should_slow_down(device, sector, true); in drbd_try_rs_begin_io()
1038 if (throttle && device->resync_wenr != enr) in drbd_try_rs_begin_io()
1041 spin_lock_irq(&device->al_lock); in drbd_try_rs_begin_io()
1042 if (device->resync_wenr != LC_FREE && device->resync_wenr != enr) { in drbd_try_rs_begin_io()
1056 e = lc_find(device->resync, device->resync_wenr); in drbd_try_rs_begin_io()
1059 D_ASSERT(device, !test_bit(BME_LOCKED, &bm_ext->flags)); in drbd_try_rs_begin_io()
1060 D_ASSERT(device, test_bit(BME_NO_WRITES, &bm_ext->flags)); in drbd_try_rs_begin_io()
1062 device->resync_wenr = LC_FREE; in drbd_try_rs_begin_io()
1063 if (lc_put(device->resync, &bm_ext->lce) == 0) { in drbd_try_rs_begin_io()
1065 device->resync_locked--; in drbd_try_rs_begin_io()
1067 wake_up(&device->al_wait); in drbd_try_rs_begin_io()
1069 drbd_alert(device, "LOGIC BUG\n"); in drbd_try_rs_begin_io()
1073 e = lc_try_get(device->resync, enr); in drbd_try_rs_begin_io()
1079 device->resync_locked++; in drbd_try_rs_begin_io()
1086 D_ASSERT(device, bm_ext->lce.refcnt > 0); in drbd_try_rs_begin_io()
1091 if (device->resync_locked > device->resync->nr_elements-3) in drbd_try_rs_begin_io()
1094 e = lc_get(device->resync, enr); in drbd_try_rs_begin_io()
1097 const unsigned long rs_flags = device->resync->flags; in drbd_try_rs_begin_io()
1099 drbd_warn(device, "Have to wait for element" in drbd_try_rs_begin_io()
1105 bm_ext->rs_left = drbd_bm_e_weight(device, enr); in drbd_try_rs_begin_io()
1107 lc_committed(device->resync); in drbd_try_rs_begin_io()
1108 wake_up(&device->al_wait); in drbd_try_rs_begin_io()
1109 D_ASSERT(device, test_bit(BME_LOCKED, &bm_ext->flags) == 0); in drbd_try_rs_begin_io()
1112 D_ASSERT(device, bm_ext->lce.refcnt == 1); in drbd_try_rs_begin_io()
1113 device->resync_locked++; in drbd_try_rs_begin_io()
1118 if (lc_is_used(device->act_log, al_enr+i)) in drbd_try_rs_begin_io()
1123 device->resync_wenr = LC_FREE; in drbd_try_rs_begin_io()
1124 spin_unlock_irq(&device->al_lock); in drbd_try_rs_begin_io()
1130 D_ASSERT(device, !test_bit(BME_LOCKED, &bm_ext->flags)); in drbd_try_rs_begin_io()
1131 D_ASSERT(device, test_bit(BME_NO_WRITES, &bm_ext->flags)); in drbd_try_rs_begin_io()
1133 device->resync_wenr = LC_FREE; in drbd_try_rs_begin_io()
1134 if (lc_put(device->resync, &bm_ext->lce) == 0) { in drbd_try_rs_begin_io()
1136 device->resync_locked--; in drbd_try_rs_begin_io()
1138 wake_up(&device->al_wait); in drbd_try_rs_begin_io()
1140 device->resync_wenr = enr; in drbd_try_rs_begin_io()
1142 spin_unlock_irq(&device->al_lock); in drbd_try_rs_begin_io()
1146 void drbd_rs_complete_io(struct drbd_device *device, sector_t sector) in drbd_rs_complete_io() argument
1153 spin_lock_irqsave(&device->al_lock, flags); in drbd_rs_complete_io()
1154 e = lc_find(device->resync, enr); in drbd_rs_complete_io()
1157 spin_unlock_irqrestore(&device->al_lock, flags); in drbd_rs_complete_io()
1159 drbd_err(device, "drbd_rs_complete_io() called, but extent not found\n"); in drbd_rs_complete_io()
1164 spin_unlock_irqrestore(&device->al_lock, flags); in drbd_rs_complete_io()
1165 drbd_err(device, "drbd_rs_complete_io(,%llu [=%u]) called, " in drbd_rs_complete_io()
1171 if (lc_put(device->resync, &bm_ext->lce) == 0) { in drbd_rs_complete_io()
1173 device->resync_locked--; in drbd_rs_complete_io()
1174 wake_up(&device->al_wait); in drbd_rs_complete_io()
1177 spin_unlock_irqrestore(&device->al_lock, flags); in drbd_rs_complete_io()
1184 void drbd_rs_cancel_all(struct drbd_device *device) in drbd_rs_cancel_all() argument
1186 spin_lock_irq(&device->al_lock); in drbd_rs_cancel_all()
1188 if (get_ldev_if_state(device, D_FAILED)) { /* Makes sure ->resync is there. */ in drbd_rs_cancel_all()
1189 lc_reset(device->resync); in drbd_rs_cancel_all()
1190 put_ldev(device); in drbd_rs_cancel_all()
1192 device->resync_locked = 0; in drbd_rs_cancel_all()
1193 device->resync_wenr = LC_FREE; in drbd_rs_cancel_all()
1194 spin_unlock_irq(&device->al_lock); in drbd_rs_cancel_all()
1195 wake_up(&device->al_wait); in drbd_rs_cancel_all()
1205 int drbd_rs_del_all(struct drbd_device *device) in drbd_rs_del_all() argument
1211 spin_lock_irq(&device->al_lock); in drbd_rs_del_all()
1213 if (get_ldev_if_state(device, D_FAILED)) { in drbd_rs_del_all()
1215 for (i = 0; i < device->resync->nr_elements; i++) { in drbd_rs_del_all()
1216 e = lc_element_by_index(device->resync, i); in drbd_rs_del_all()
1220 if (bm_ext->lce.lc_number == device->resync_wenr) { in drbd_rs_del_all()
1221 drbd_info(device, "dropping %u in drbd_rs_del_all, apparently" in drbd_rs_del_all()
1223 device->resync_wenr); in drbd_rs_del_all()
1224 D_ASSERT(device, !test_bit(BME_LOCKED, &bm_ext->flags)); in drbd_rs_del_all()
1225 D_ASSERT(device, test_bit(BME_NO_WRITES, &bm_ext->flags)); in drbd_rs_del_all()
1227 device->resync_wenr = LC_FREE; in drbd_rs_del_all()
1228 lc_put(device->resync, &bm_ext->lce); in drbd_rs_del_all()
1231 drbd_info(device, "Retrying drbd_rs_del_all() later. " in drbd_rs_del_all()
1233 put_ldev(device); in drbd_rs_del_all()
1234 spin_unlock_irq(&device->al_lock); in drbd_rs_del_all()
1237 D_ASSERT(device, !test_bit(BME_LOCKED, &bm_ext->flags)); in drbd_rs_del_all()
1238 D_ASSERT(device, !test_bit(BME_NO_WRITES, &bm_ext->flags)); in drbd_rs_del_all()
1239 lc_del(device->resync, &bm_ext->lce); in drbd_rs_del_all()
1241 D_ASSERT(device, device->resync->used == 0); in drbd_rs_del_all()
1242 put_ldev(device); in drbd_rs_del_all()
1244 spin_unlock_irq(&device->al_lock); in drbd_rs_del_all()
1245 wake_up(&device->al_wait); in drbd_rs_del_all()