Lines Matching refs:device
194 adm_ctx->device = minor_to_device(d_in->minor); in drbd_adm_prepare()
199 if (adm_ctx->device) in drbd_adm_prepare()
200 kref_get(&adm_ctx->device->kref); in drbd_adm_prepare()
206 if (!adm_ctx->device && (flags & DRBD_ADM_NEED_MINOR)) { in drbd_adm_prepare()
222 if (adm_ctx->device) { in drbd_adm_prepare()
238 if (adm_ctx->device && adm_ctx->resource && in drbd_adm_prepare()
239 adm_ctx->device->resource != adm_ctx->resource) { in drbd_adm_prepare()
242 adm_ctx->device->resource->name); in drbd_adm_prepare()
246 if (adm_ctx->device && in drbd_adm_prepare()
248 adm_ctx->volume != adm_ctx->device->vnr) { in drbd_adm_prepare()
251 adm_ctx->device->vnr, in drbd_adm_prepare()
252 adm_ctx->device->resource->name); in drbd_adm_prepare()
259 adm_ctx->resource = adm_ctx->device ? adm_ctx->device->resource in drbd_adm_prepare()
276 if (adm_ctx->device) { in drbd_adm_finish()
277 kref_put(&adm_ctx->device->kref, drbd_destroy_device); in drbd_adm_finish()
278 adm_ctx->device = NULL; in drbd_adm_finish()
324 int drbd_khelper(struct drbd_device *device, char *cmd) in drbd_khelper() argument
334 struct drbd_connection *connection = first_peer_device(device)->connection; in drbd_khelper()
341 snprintf(mb, 12, "minor-%d", device_to_minor(device)); in drbd_khelper()
346 drbd_md_sync(device); in drbd_khelper()
348 drbd_info(device, "helper command: %s %s %s\n", usermode_helper, cmd, mb); in drbd_khelper()
351 drbd_bcast_event(device, &sib); in drbd_khelper()
354 drbd_warn(device, "helper command: %s %s %s exit code %u (0x%x)\n", in drbd_khelper()
358 drbd_info(device, "helper command: %s %s %s exit code %u (0x%x)\n", in drbd_khelper()
363 drbd_bcast_event(device, &sib); in drbd_khelper()
417 struct drbd_device *device = peer_device->device; in highest_fencing_policy() local
418 if (get_ldev_if_state(device, D_CONSISTENT)) { in highest_fencing_policy()
420 rcu_dereference(peer_device->device->ldev->disk_conf); in highest_fencing_policy()
422 put_ldev(device); in highest_fencing_policy()
432 drbd_change_state(peer_device->device, CS_VERBOSE | CS_HARD, NS(susp_fen, 0)); in highest_fencing_policy()
563 drbd_set_role(struct drbd_device *const device, enum drbd_role new_role, int force) in drbd_set_role() argument
565 struct drbd_peer_device *const peer_device = first_peer_device(device); in drbd_set_role()
580 for_each_connection(connection, device->resource) in drbd_set_role()
585 mutex_lock(device->state_mutex); in drbd_set_role()
591 rv = _drbd_request_state_holding_state_mutex(device, mask, val, CS_WAIT_COMPLETE); in drbd_set_role()
602 (device->state.disk < D_UP_TO_DATE && in drbd_set_role()
603 device->state.disk >= D_INCONSISTENT)) { in drbd_set_role()
611 device->state.disk == D_CONSISTENT && mask.pdsk == 0) { in drbd_set_role()
612 D_ASSERT(device, device->state.pdsk == D_UNKNOWN); in drbd_set_role()
625 drbd_warn(device, "Forced into split brain situation!\n"); in drbd_set_role()
646 rv = _drbd_request_state(device, mask, val, in drbd_set_role()
658 drbd_warn(device, "Forced to consider local data as UpToDate!\n"); in drbd_set_role()
661 wait_event(device->misc_wait, atomic_read(&device->ap_pending_cnt) == 0); in drbd_set_role()
666 if (get_ldev(device)) { in drbd_set_role()
667 device->ldev->md.uuid[UI_CURRENT] &= ~(u64)1; in drbd_set_role()
668 put_ldev(device); in drbd_set_role()
671 mutex_lock(&device->resource->conf_update); in drbd_set_role()
675 mutex_unlock(&device->resource->conf_update); in drbd_set_role()
677 if (get_ldev(device)) { in drbd_set_role()
678 if (((device->state.conn < C_CONNECTED || in drbd_set_role()
679 device->state.pdsk <= D_FAILED) in drbd_set_role()
680 && device->ldev->md.uuid[UI_BITMAP] == 0) || forced) in drbd_set_role()
681 drbd_uuid_new_current(device); in drbd_set_role()
683 device->ldev->md.uuid[UI_CURRENT] |= (u64)1; in drbd_set_role()
684 put_ldev(device); in drbd_set_role()
691 if (device->state.conn >= C_WF_REPORT_PARAMS) { in drbd_set_role()
698 drbd_md_sync(device); in drbd_set_role()
699 set_disk_ro(device->vdisk, new_role == R_SECONDARY); in drbd_set_role()
700 kobject_uevent(&disk_to_dev(device->vdisk)->kobj, KOBJ_CHANGE); in drbd_set_role()
702 mutex_unlock(device->state_mutex); in drbd_set_role()
740 retcode = drbd_set_role(adm_ctx.device, R_PRIMARY, parms.assume_uptodate); in drbd_adm_set_role()
742 retcode = drbd_set_role(adm_ctx.device, R_SECONDARY, 0); in drbd_adm_set_role()
772 static void drbd_md_set_sector_offsets(struct drbd_device *device, in drbd_md_set_sector_offsets() argument
850 void drbd_suspend_io(struct drbd_device *device) in drbd_suspend_io() argument
852 set_bit(SUSPEND_IO, &device->flags); in drbd_suspend_io()
853 if (drbd_suspended(device)) in drbd_suspend_io()
855 wait_event(device->misc_wait, !atomic_read(&device->ap_bio_cnt)); in drbd_suspend_io()
858 void drbd_resume_io(struct drbd_device *device) in drbd_resume_io() argument
860 clear_bit(SUSPEND_IO, &device->flags); in drbd_resume_io()
861 wake_up(&device->misc_wait); in drbd_resume_io()
872 drbd_determine_dev_size(struct drbd_device *device, enum dds_flags flags, struct resize_parms *rs) … in drbd_determine_dev_size() argument
876 struct drbd_md *md = &device->ldev->md; in drbd_determine_dev_size()
895 drbd_suspend_io(device); in drbd_determine_dev_size()
896 buffer = drbd_md_get_buffer(device, __func__); /* Lock meta-data IO */ in drbd_determine_dev_size()
898 drbd_resume_io(device); in drbd_determine_dev_size()
903 wait_event(device->al_wait, lc_try_lock(device->act_log)); in drbd_determine_dev_size()
905 prev_first_sect = drbd_md_first_sector(device->ldev); in drbd_determine_dev_size()
906 prev_size = device->ldev->md.md_size_sect; in drbd_determine_dev_size()
907 la_size_sect = device->ldev->md.la_size_sect; in drbd_determine_dev_size()
920 drbd_md_set_sector_offsets(device, device->ldev); in drbd_determine_dev_size()
923 u_size = rcu_dereference(device->ldev->disk_conf)->disk_size; in drbd_determine_dev_size()
925 size = drbd_new_dev_size(device, device->ldev, u_size, flags & DDSF_FORCED); in drbd_determine_dev_size()
931 drbd_warn(device, "Implicit shrink not allowed. " in drbd_determine_dev_size()
942 if (drbd_get_capacity(device->this_bdev) != size || in drbd_determine_dev_size()
943 drbd_bm_capacity(device) != size) { in drbd_determine_dev_size()
945 err = drbd_bm_resize(device, size, !(flags & DDSF_NO_RESYNC)); in drbd_determine_dev_size()
948 size = drbd_bm_capacity(device)>>1; in drbd_determine_dev_size()
950 drbd_err(device, "OUT OF MEMORY! " in drbd_determine_dev_size()
953 drbd_err(device, "BM resizing failed. " in drbd_determine_dev_size()
960 drbd_set_my_capacity(device, size); in drbd_determine_dev_size()
961 device->ldev->md.la_size_sect = size; in drbd_determine_dev_size()
962 drbd_info(device, "size = %s (%llu KB)\n", ppsize(ppb, size>>1), in drbd_determine_dev_size()
968 la_size_changed = (la_size_sect != device->ldev->md.la_size_sect); in drbd_determine_dev_size()
970 md_moved = prev_first_sect != drbd_md_first_sector(device->ldev) in drbd_determine_dev_size()
971 || prev_size != device->ldev->md.md_size_sect; in drbd_determine_dev_size()
979 del_timer(&device->md_sync_timer); in drbd_determine_dev_size()
980 drbd_al_shrink(device); /* All extents inactive. */ in drbd_determine_dev_size()
984 drbd_md_write(device, buffer); in drbd_determine_dev_size()
986 drbd_info(device, "Writing the whole bitmap, %s\n", in drbd_determine_dev_size()
990 drbd_bitmap_io(device, md_moved ? &drbd_bm_write_all : &drbd_bm_write, in drbd_determine_dev_size()
992 drbd_initialize_al(device, buffer); in drbd_determine_dev_size()
995 drbd_md_write(device, buffer); in drbd_determine_dev_size()
998 drbd_info(device, "Changed AL layout to al-stripes = %d, al-stripe-size-kB = %d\n", in drbd_determine_dev_size()
1014 drbd_md_set_sector_offsets(device, device->ldev); in drbd_determine_dev_size()
1017 lc_unlock(device->act_log); in drbd_determine_dev_size()
1018 wake_up(&device->al_wait); in drbd_determine_dev_size()
1019 drbd_md_put_buffer(device); in drbd_determine_dev_size()
1020 drbd_resume_io(device); in drbd_determine_dev_size()
1026 drbd_new_dev_size(struct drbd_device *device, struct drbd_backing_dev *bdev, in drbd_new_dev_size() argument
1029 sector_t p_size = device->p_size; /* partner's disk size. */ in drbd_new_dev_size()
1036 if (device->state.conn < C_CONNECTED && assume_peer_has_space) { in drbd_new_dev_size()
1037 drbd_warn(device, "Resize while not connected was forced by the user!\n"); in drbd_new_dev_size()
1059 drbd_err(device, "Both nodes diskless!\n"); in drbd_new_dev_size()
1063 drbd_err(device, "Requested disk size is too big (%lu > %lu)\n", in drbd_new_dev_size()
1080 static int drbd_check_al_size(struct drbd_device *device, struct disk_conf *dc) in drbd_check_al_size() argument
1087 if (device->act_log && in drbd_check_al_size()
1088 device->act_log->nr_elements == dc->al_extents) in drbd_check_al_size()
1092 t = device->act_log; in drbd_check_al_size()
1097 drbd_err(device, "Cannot allocate act_log lru!\n"); in drbd_check_al_size()
1100 spin_lock_irq(&device->al_lock); in drbd_check_al_size()
1105 drbd_err(device, "refcnt(%d)==%d\n", in drbd_check_al_size()
1111 device->act_log = n; in drbd_check_al_size()
1112 spin_unlock_irq(&device->al_lock); in drbd_check_al_size()
1114 drbd_err(device, "Activity log still in use!\n"); in drbd_check_al_size()
1121 drbd_md_mark_dirty(device); /* we changed device->act_log->nr_elemens */ in drbd_check_al_size()
1125 static void drbd_setup_queue_param(struct drbd_device *device, struct drbd_backing_dev *bdev, in drbd_setup_queue_param() argument
1128 struct request_queue * const q = device->rq_queue; in drbd_setup_queue_param()
1138 max_segments = rcu_dereference(device->ldev->disk_conf)->max_bio_bvecs; in drbd_setup_queue_param()
1152 struct drbd_connection *connection = first_peer_device(device)->connection; in drbd_setup_queue_param()
1174 drbd_info(device, "Adjusting my ra_pages to backing device's (%lu -> %lu)\n", in drbd_setup_queue_param()
1182 void drbd_reconsider_max_bio_size(struct drbd_device *device, struct drbd_backing_dev *bdev) in drbd_reconsider_max_bio_size() argument
1186 now = queue_max_hw_sectors(device->rq_queue) << 9; in drbd_reconsider_max_bio_size()
1187 local = device->local_max_bio_size; /* Eventually last known value, from volatile memory */ in drbd_reconsider_max_bio_size()
1188 peer = device->peer_max_bio_size; /* Eventually last known value, from meta data */ in drbd_reconsider_max_bio_size()
1192 device->local_max_bio_size = local; in drbd_reconsider_max_bio_size()
1199 if (device->state.conn >= C_WF_REPORT_PARAMS) { in drbd_reconsider_max_bio_size()
1200 if (first_peer_device(device)->connection->agreed_pro_version < 94) in drbd_reconsider_max_bio_size()
1201 peer = min(device->peer_max_bio_size, DRBD_MAX_SIZE_H80_PACKET); in drbd_reconsider_max_bio_size()
1203 else if (first_peer_device(device)->connection->agreed_pro_version == 94) in drbd_reconsider_max_bio_size()
1205 else if (first_peer_device(device)->connection->agreed_pro_version < 100) in drbd_reconsider_max_bio_size()
1214 if (peer > device->peer_max_bio_size) in drbd_reconsider_max_bio_size()
1215 device->peer_max_bio_size = peer; in drbd_reconsider_max_bio_size()
1219 if (device->state.role == R_PRIMARY && new < now) in drbd_reconsider_max_bio_size()
1220 drbd_err(device, "ASSERT FAILED new < now; (%u < %u)\n", new, now); in drbd_reconsider_max_bio_size()
1223 drbd_info(device, "max BIO size = %u\n", new); in drbd_reconsider_max_bio_size()
1225 drbd_setup_queue_param(device, bdev, new); in drbd_reconsider_max_bio_size()
1252 static void drbd_suspend_al(struct drbd_device *device) in drbd_suspend_al() argument
1256 if (!lc_try_lock(device->act_log)) { in drbd_suspend_al()
1257 drbd_warn(device, "Failed to lock al in drbd_suspend_al()\n"); in drbd_suspend_al()
1261 drbd_al_shrink(device); in drbd_suspend_al()
1262 spin_lock_irq(&device->resource->req_lock); in drbd_suspend_al()
1263 if (device->state.conn < C_CONNECTED) in drbd_suspend_al()
1264 s = !test_and_set_bit(AL_SUSPENDED, &device->flags); in drbd_suspend_al()
1265 spin_unlock_irq(&device->resource->req_lock); in drbd_suspend_al()
1266 lc_unlock(device->act_log); in drbd_suspend_al()
1269 drbd_info(device, "Suspended AL updates\n"); in drbd_suspend_al()
1318 struct drbd_device *device; in drbd_adm_disk_opts() local
1329 device = adm_ctx.device; in drbd_adm_disk_opts()
1334 if (!get_ldev(device)) { in drbd_adm_disk_opts()
1345 mutex_lock(&device->resource->conf_update); in drbd_adm_disk_opts()
1346 old_disk_conf = device->ldev->disk_conf; in drbd_adm_disk_opts()
1363 if (new_disk_conf->al_extents > drbd_al_extents_max(device->ldev)) in drbd_adm_disk_opts()
1364 new_disk_conf->al_extents = drbd_al_extents_max(device->ldev); in drbd_adm_disk_opts()
1370 if (fifo_size != device->rs_plan_s->size) { in drbd_adm_disk_opts()
1373 drbd_err(device, "kmalloc of fifo_buffer failed"); in drbd_adm_disk_opts()
1379 drbd_suspend_io(device); in drbd_adm_disk_opts()
1380 wait_event(device->al_wait, lc_try_lock(device->act_log)); in drbd_adm_disk_opts()
1381 drbd_al_shrink(device); in drbd_adm_disk_opts()
1382 err = drbd_check_al_size(device, new_disk_conf); in drbd_adm_disk_opts()
1383 lc_unlock(device->act_log); in drbd_adm_disk_opts()
1384 wake_up(&device->al_wait); in drbd_adm_disk_opts()
1385 drbd_resume_io(device); in drbd_adm_disk_opts()
1393 retcode = drbd_resync_after_valid(device, new_disk_conf->resync_after); in drbd_adm_disk_opts()
1395 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in drbd_adm_disk_opts()
1396 drbd_resync_after_changed(device); in drbd_adm_disk_opts()
1404 old_plan = device->rs_plan_s; in drbd_adm_disk_opts()
1405 rcu_assign_pointer(device->rs_plan_s, new_plan); in drbd_adm_disk_opts()
1408 mutex_unlock(&device->resource->conf_update); in drbd_adm_disk_opts()
1411 device->ldev->md.flags &= ~MDF_AL_DISABLED; in drbd_adm_disk_opts()
1413 device->ldev->md.flags |= MDF_AL_DISABLED; in drbd_adm_disk_opts()
1416 clear_bit(MD_NO_FUA, &device->flags); in drbd_adm_disk_opts()
1418 set_bit(MD_NO_FUA, &device->flags); in drbd_adm_disk_opts()
1421 drbd_bump_write_ordering(device->resource, NULL, WO_bdev_flush); in drbd_adm_disk_opts()
1423 drbd_md_sync(device); in drbd_adm_disk_opts()
1425 if (device->state.conn >= C_CONNECTED) { in drbd_adm_disk_opts()
1428 for_each_peer_device(peer_device, device) in drbd_adm_disk_opts()
1435 mod_timer(&device->request_timer, jiffies + HZ); in drbd_adm_disk_opts()
1439 mutex_unlock(&device->resource->conf_update); in drbd_adm_disk_opts()
1444 put_ldev(device); in drbd_adm_disk_opts()
1455 struct drbd_device *device; in drbd_adm_attach() local
1478 device = adm_ctx.device; in drbd_adm_attach()
1480 peer_device = first_peer_device(device); in drbd_adm_attach()
1485 if (device->state.disk > D_DISKLESS) { in drbd_adm_attach()
1493 wait_event(device->misc_wait, !test_bit(GOING_DISKLESS, &device->flags)); in drbd_adm_attach()
1496 clear_bit(FORCE_DETACH, &device->flags); in drbd_adm_attach()
1497 clear_bit(WAS_IO_ERROR, &device->flags); in drbd_adm_attach()
1498 clear_bit(WAS_READ_ERROR, &device->flags); in drbd_adm_attach()
1501 device->rs_total = 0; in drbd_adm_attach()
1502 device->rs_failed = 0; in drbd_adm_attach()
1503 atomic_set(&device->rs_pending_cnt, 0); in drbd_adm_attach()
1543 retcode = drbd_resync_after_valid(device, new_disk_conf->resync_after); in drbd_adm_attach()
1560 FMODE_READ | FMODE_WRITE | FMODE_EXCL, device); in drbd_adm_attach()
1562 drbd_err(device, "open(\"%s\") failed with %ld\n", new_disk_conf->backing_dev, in drbd_adm_attach()
1580 (void *)device : (void *)drbd_m_holder); in drbd_adm_attach()
1582 drbd_err(device, "open(\"%s\") failed with %ld\n", new_disk_conf->meta_dev, in drbd_adm_attach()
1606 retcode = drbd_md_read(device, nbc); in drbd_adm_attach()
1616 drbd_err(device, "max capacity %llu smaller than disk size %llu\n", in drbd_adm_attach()
1634 drbd_warn(device, "refusing attach: md-device too small, " in drbd_adm_attach()
1643 drbd_get_capacity(device->this_bdev)) { in drbd_adm_attach()
1651 drbd_warn(device, "==> truncating very big lower level device " in drbd_adm_attach()
1655 drbd_warn(device, "==>> using internal or flexible " in drbd_adm_attach()
1659 drbd_suspend_io(device); in drbd_adm_attach()
1667 wait_event(device->misc_wait, !atomic_read(&device->ap_pending_cnt) || drbd_suspended(device)); in drbd_adm_attach()
1671 rv = _drbd_request_state(device, NS(disk, D_ATTACHING), CS_VERBOSE); in drbd_adm_attach()
1673 drbd_resume_io(device); in drbd_adm_attach()
1677 if (!get_ldev_if_state(device, D_ATTACHING)) in drbd_adm_attach()
1680 if (!device->bitmap) { in drbd_adm_attach()
1681 if (drbd_bm_init(device)) { in drbd_adm_attach()
1687 if (device->state.conn < C_CONNECTED && in drbd_adm_attach()
1688 device->state.role == R_PRIMARY && device->ed_uuid && in drbd_adm_attach()
1689 (device->ed_uuid & ~((u64)1)) != (nbc->md.uuid[UI_CURRENT] & ~((u64)1))) { in drbd_adm_attach()
1690 drbd_err(device, "Can only attach to data with current UUID=%016llX\n", in drbd_adm_attach()
1691 (unsigned long long)device->ed_uuid); in drbd_adm_attach()
1697 if (drbd_check_al_size(device, new_disk_conf)) { in drbd_adm_attach()
1704 drbd_new_dev_size(device, nbc, nbc->disk_conf->disk_size, 0) < nbc->md.la_size_sect) { in drbd_adm_attach()
1705 drbd_warn(device, "refusing to truncate a consistent device\n"); in drbd_adm_attach()
1713 clear_bit(MD_NO_FUA, &device->flags); in drbd_adm_attach()
1715 set_bit(MD_NO_FUA, &device->flags); in drbd_adm_attach()
1721 D_ASSERT(device, device->ldev == NULL); in drbd_adm_attach()
1722 device->ldev = nbc; in drbd_adm_attach()
1723 device->resync = resync_lru; in drbd_adm_attach()
1724 device->rs_plan_s = new_plan; in drbd_adm_attach()
1730 drbd_bump_write_ordering(device->resource, device->ldev, WO_bdev_flush); in drbd_adm_attach()
1732 if (drbd_md_test_flag(device->ldev, MDF_CRASHED_PRIMARY)) in drbd_adm_attach()
1733 set_bit(CRASHED_PRIMARY, &device->flags); in drbd_adm_attach()
1735 clear_bit(CRASHED_PRIMARY, &device->flags); in drbd_adm_attach()
1737 if (drbd_md_test_flag(device->ldev, MDF_PRIMARY_IND) && in drbd_adm_attach()
1738 !(device->state.role == R_PRIMARY && device->resource->susp_nod)) in drbd_adm_attach()
1739 set_bit(CRASHED_PRIMARY, &device->flags); in drbd_adm_attach()
1741 device->send_cnt = 0; in drbd_adm_attach()
1742 device->recv_cnt = 0; in drbd_adm_attach()
1743 device->read_cnt = 0; in drbd_adm_attach()
1744 device->writ_cnt = 0; in drbd_adm_attach()
1746 drbd_reconsider_max_bio_size(device, device->ldev); in drbd_adm_attach()
1762 clear_bit(USE_DEGR_WFC_T, &device->flags); in drbd_adm_attach()
1763 if (device->state.role != R_PRIMARY && in drbd_adm_attach()
1764 drbd_md_test_flag(device->ldev, MDF_PRIMARY_IND) && in drbd_adm_attach()
1765 !drbd_md_test_flag(device->ldev, MDF_CONNECTED_IND)) in drbd_adm_attach()
1766 set_bit(USE_DEGR_WFC_T, &device->flags); in drbd_adm_attach()
1768 dd = drbd_determine_dev_size(device, 0, NULL); in drbd_adm_attach()
1773 set_bit(RESYNC_AFTER_NEG, &device->flags); in drbd_adm_attach()
1775 if (drbd_md_test_flag(device->ldev, MDF_FULL_SYNC) || in drbd_adm_attach()
1776 (test_bit(CRASHED_PRIMARY, &device->flags) && in drbd_adm_attach()
1777 drbd_md_test_flag(device->ldev, MDF_AL_DISABLED))) { in drbd_adm_attach()
1778 drbd_info(device, "Assuming that all blocks are out of sync " in drbd_adm_attach()
1780 if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, in drbd_adm_attach()
1786 if (drbd_bitmap_io(device, &drbd_bm_read, in drbd_adm_attach()
1793 if (_drbd_bm_total_weight(device) == drbd_bm_bits(device)) in drbd_adm_attach()
1794 drbd_suspend_al(device); /* IO is still suspended here... */ in drbd_adm_attach()
1796 spin_lock_irq(&device->resource->req_lock); in drbd_adm_attach()
1797 os = drbd_read_state(device); in drbd_adm_attach()
1804 if (drbd_md_test_flag(device->ldev, MDF_CONSISTENT)) { in drbd_adm_attach()
1805 if (drbd_md_test_flag(device->ldev, MDF_WAS_UP_TO_DATE)) in drbd_adm_attach()
1813 if (drbd_md_test_flag(device->ldev, MDF_PEER_OUT_DATED)) in drbd_adm_attach()
1818 (ns.pdsk == D_OUTDATED || rcu_dereference(device->ldev->disk_conf)->fencing == FP_DONT_CARE)) in drbd_adm_attach()
1826 if (rcu_dereference(device->ldev->disk_conf)->al_updates) in drbd_adm_attach()
1827 device->ldev->md.flags &= ~MDF_AL_DISABLED; in drbd_adm_attach()
1829 device->ldev->md.flags |= MDF_AL_DISABLED; in drbd_adm_attach()
1835 if (device->state.conn == C_CONNECTED) { in drbd_adm_attach()
1836 device->new_state_tmp.i = ns.i; in drbd_adm_attach()
1843 kfree(device->p_uuid); in drbd_adm_attach()
1844 device->p_uuid = NULL; in drbd_adm_attach()
1847 rv = _drbd_set_state(device, ns, CS_VERBOSE, NULL); in drbd_adm_attach()
1848 spin_unlock_irq(&device->resource->req_lock); in drbd_adm_attach()
1853 mod_timer(&device->request_timer, jiffies + HZ); in drbd_adm_attach()
1855 if (device->state.role == R_PRIMARY) in drbd_adm_attach()
1856 device->ldev->md.uuid[UI_CURRENT] |= (u64)1; in drbd_adm_attach()
1858 device->ldev->md.uuid[UI_CURRENT] &= ~(u64)1; in drbd_adm_attach()
1860 drbd_md_mark_dirty(device); in drbd_adm_attach()
1861 drbd_md_sync(device); in drbd_adm_attach()
1863 kobject_uevent(&disk_to_dev(device->vdisk)->kobj, KOBJ_CHANGE); in drbd_adm_attach()
1864 put_ldev(device); in drbd_adm_attach()
1871 put_ldev(device); in drbd_adm_attach()
1873 drbd_force_state(device, NS(disk, D_DISKLESS)); in drbd_adm_attach()
1874 drbd_md_sync(device); in drbd_adm_attach()
1895 static int adm_detach(struct drbd_device *device, int force) in adm_detach() argument
1901 set_bit(FORCE_DETACH, &device->flags); in adm_detach()
1902 drbd_force_state(device, NS(disk, D_FAILED)); in adm_detach()
1907 drbd_suspend_io(device); /* so no-one is stuck in drbd_al_begin_io */ in adm_detach()
1908 drbd_md_get_buffer(device, __func__); /* make sure there is no in-flight meta-data IO */ in adm_detach()
1909 retcode = drbd_request_state(device, NS(disk, D_FAILED)); in adm_detach()
1910 drbd_md_put_buffer(device); in adm_detach()
1912 ret = wait_event_interruptible(device->misc_wait, in adm_detach()
1913 device->state.disk != D_FAILED); in adm_detach()
1914 drbd_resume_io(device); in adm_detach()
1951 retcode = adm_detach(adm_ctx.device, parms.force_detach); in drbd_adm_detach()
1966 struct drbd_device *device = peer_device->device; in conn_resync_running() local
1967 if (device->state.conn == C_SYNC_SOURCE || in conn_resync_running()
1968 device->state.conn == C_SYNC_TARGET || in conn_resync_running()
1969 device->state.conn == C_PAUSED_SYNC_S || in conn_resync_running()
1970 device->state.conn == C_PAUSED_SYNC_T) { in conn_resync_running()
1988 struct drbd_device *device = peer_device->device; in conn_ov_running() local
1989 if (device->state.conn == C_VERIFY_S || in conn_ov_running()
1990 device->state.conn == C_VERIFY_T) { in conn_ov_running()
2027 struct drbd_device *device = peer_device->device; in _check_net_options() local
2028 if (get_ldev(device)) { in _check_net_options()
2029 enum drbd_fencing_p fp = rcu_dereference(device->ldev->disk_conf)->fencing; in _check_net_options()
2030 put_ldev(device); in _check_net_options()
2034 if (device->state.role == R_PRIMARY && new_net_conf->discard_my_data) in _check_net_options()
2057 struct drbd_device *device = peer_device->device; in check_net_options() local
2058 if (!device->bitmap) { in check_net_options()
2059 if (drbd_bm_init(device)) in check_net_options()
2354 struct drbd_device *device = peer_device->device; in drbd_adm_connect() local
2355 device->send_cnt = 0; in drbd_adm_connect()
2356 device->recv_cnt = 0; in drbd_adm_connect()
2473 void resync_after_online_grow(struct drbd_device *device) in resync_after_online_grow() argument
2477 drbd_info(device, "Resync of new storage after online grow\n"); in resync_after_online_grow()
2478 if (device->state.role != device->state.peer) in resync_after_online_grow()
2479 iass = (device->state.role == R_PRIMARY); in resync_after_online_grow()
2481 iass = test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags); in resync_after_online_grow()
2484 drbd_start_resync(device, C_SYNC_SOURCE); in resync_after_online_grow()
2486 _drbd_request_state(device, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE + CS_SERIALIZE); in resync_after_online_grow()
2494 struct drbd_device *device; in drbd_adm_resize() local
2509 device = adm_ctx.device; in drbd_adm_resize()
2510 if (!get_ldev(device)) { in drbd_adm_resize()
2516 rs.al_stripes = device->ldev->md.al_stripes; in drbd_adm_resize()
2517 rs.al_stripe_size = device->ldev->md.al_stripe_size_4k * 4; in drbd_adm_resize()
2527 if (device->state.conn > C_CONNECTED) { in drbd_adm_resize()
2532 if (device->state.role == R_SECONDARY && in drbd_adm_resize()
2533 device->state.peer == R_SECONDARY) { in drbd_adm_resize()
2538 if (rs.no_resync && first_peer_device(device)->connection->agreed_pro_version < 93) { in drbd_adm_resize()
2544 u_size = rcu_dereference(device->ldev->disk_conf)->disk_size; in drbd_adm_resize()
2554 if (device->ldev->md.al_stripes != rs.al_stripes || in drbd_adm_resize()
2555 device->ldev->md.al_stripe_size_4k != rs.al_stripe_size / 4) { in drbd_adm_resize()
2568 if (device->state.conn != C_CONNECTED && !rs.resize_force) { in drbd_adm_resize()
2576 if (device->ldev->known_size != drbd_get_capacity(device->ldev->backing_bdev)) in drbd_adm_resize()
2577 device->ldev->known_size = drbd_get_capacity(device->ldev->backing_bdev); in drbd_adm_resize()
2580 mutex_lock(&device->resource->conf_update); in drbd_adm_resize()
2581 old_disk_conf = device->ldev->disk_conf; in drbd_adm_resize()
2584 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in drbd_adm_resize()
2585 mutex_unlock(&device->resource->conf_update); in drbd_adm_resize()
2591 dd = drbd_determine_dev_size(device, ddsf, change_al_layout ? &rs : NULL); in drbd_adm_resize()
2592 drbd_md_sync(device); in drbd_adm_resize()
2593 put_ldev(device); in drbd_adm_resize()
2605 if (device->state.conn == C_CONNECTED) { in drbd_adm_resize()
2607 set_bit(RESIZE_PENDING, &device->flags); in drbd_adm_resize()
2609 drbd_send_uuids(first_peer_device(device)); in drbd_adm_resize()
2610 drbd_send_sizes(first_peer_device(device), 1, ddsf); in drbd_adm_resize()
2620 put_ldev(device); in drbd_adm_resize()
2665 struct drbd_device *device; in drbd_adm_invalidate() local
2674 device = adm_ctx.device; in drbd_adm_invalidate()
2675 if (!get_ldev(device)) { in drbd_adm_invalidate()
2685 drbd_suspend_io(device); in drbd_adm_invalidate()
2686 wait_event(device->misc_wait, !test_bit(BITMAP_IO, &device->flags)); in drbd_adm_invalidate()
2687 drbd_flush_workqueue(&first_peer_device(device)->connection->sender_work); in drbd_adm_invalidate()
2693 if (device->state.conn == C_STANDALONE && device->state.role == R_SECONDARY) { in drbd_adm_invalidate()
2694 retcode = drbd_request_state(device, NS(disk, D_INCONSISTENT)); in drbd_adm_invalidate()
2696 if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, in drbd_adm_invalidate()
2701 retcode = drbd_request_state(device, NS(conn, C_STARTING_SYNC_T)); in drbd_adm_invalidate()
2702 drbd_resume_io(device); in drbd_adm_invalidate()
2704 put_ldev(device); in drbd_adm_invalidate()
2723 retcode = drbd_request_state(adm_ctx.device, mask, val); in drbd_adm_simple_request_state()
2730 static int drbd_bmio_set_susp_al(struct drbd_device *device) __must_hold(local) in drbd_bmio_set_susp_al() argument
2734 rv = drbd_bmio_set_n_write(device); in drbd_bmio_set_susp_al()
2735 drbd_suspend_al(device); in drbd_bmio_set_susp_al()
2743 struct drbd_device *device; in drbd_adm_invalidate_peer() local
2751 device = adm_ctx.device; in drbd_adm_invalidate_peer()
2752 if (!get_ldev(device)) { in drbd_adm_invalidate_peer()
2762 drbd_suspend_io(device); in drbd_adm_invalidate_peer()
2763 wait_event(device->misc_wait, !test_bit(BITMAP_IO, &device->flags)); in drbd_adm_invalidate_peer()
2764 drbd_flush_workqueue(&first_peer_device(device)->connection->sender_work); in drbd_adm_invalidate_peer()
2770 if (device->state.conn == C_STANDALONE && device->state.role == R_PRIMARY) { in drbd_adm_invalidate_peer()
2773 retcode = drbd_request_state(device, NS(pdsk, D_INCONSISTENT)); in drbd_adm_invalidate_peer()
2775 if (drbd_bitmap_io(device, &drbd_bmio_set_susp_al, in drbd_adm_invalidate_peer()
2781 retcode = drbd_request_state(device, NS(conn, C_STARTING_SYNC_S)); in drbd_adm_invalidate_peer()
2782 drbd_resume_io(device); in drbd_adm_invalidate_peer()
2784 put_ldev(device); in drbd_adm_invalidate_peer()
2802 if (drbd_request_state(adm_ctx.device, NS(user_isp, 1)) == SS_NOTHING_TO_DO) in drbd_adm_pause_sync()
2823 if (drbd_request_state(adm_ctx.device, NS(user_isp, 0)) == SS_NOTHING_TO_DO) { in drbd_adm_resume_sync()
2824 s = adm_ctx.device->state; in drbd_adm_resume_sync()
2846 struct drbd_device *device; in drbd_adm_resume_io() local
2856 device = adm_ctx.device; in drbd_adm_resume_io()
2857 if (test_bit(NEW_CUR_UUID, &device->flags)) { in drbd_adm_resume_io()
2858 drbd_uuid_new_current(device); in drbd_adm_resume_io()
2859 clear_bit(NEW_CUR_UUID, &device->flags); in drbd_adm_resume_io()
2861 drbd_suspend_io(device); in drbd_adm_resume_io()
2862 retcode = drbd_request_state(device, NS3(susp, 0, susp_nod, 0, susp_fen, 0)); in drbd_adm_resume_io()
2864 if (device->state.conn < C_CONNECTED) in drbd_adm_resume_io()
2865 tl_clear(first_peer_device(device)->connection); in drbd_adm_resume_io()
2866 if (device->state.disk == D_DISKLESS || device->state.disk == D_FAILED) in drbd_adm_resume_io()
2867 tl_restart(first_peer_device(device)->connection, FAIL_FROZEN_DISK_IO); in drbd_adm_resume_io()
2869 drbd_resume_io(device); in drbd_adm_resume_io()
2884 struct drbd_device *device) in nla_put_drbd_cfg_context() argument
2890 if (device && in nla_put_drbd_cfg_context()
2891 nla_put_u32(skb, T_ctx_volume, device->vnr)) in nla_put_drbd_cfg_context()
2924 static int nla_put_status_info(struct sk_buff *skb, struct drbd_device *device, in nla_put_status_info() argument
2927 struct drbd_resource *resource = device->resource; in nla_put_status_info()
2947 got_ldev = get_ldev(device); in nla_put_status_info()
2951 if (nla_put_drbd_cfg_context(skb, resource, the_only_connection(resource), device)) in nla_put_status_info()
2954 if (res_opts_to_skb(skb, &device->resource->res_opts, exclude_sensitive)) in nla_put_status_info()
2961 disk_conf = rcu_dereference(device->ldev->disk_conf); in nla_put_status_info()
2967 nc = rcu_dereference(first_peer_device(device)->connection->net_conf); in nla_put_status_info()
2979 nla_put_u32(skb, T_current_state, device->state.i) || in nla_put_status_info()
2980 nla_put_u64(skb, T_ed_uuid, device->ed_uuid) || in nla_put_status_info()
2981 nla_put_u64(skb, T_capacity, drbd_get_capacity(device->this_bdev)) || in nla_put_status_info()
2982 nla_put_u64(skb, T_send_cnt, device->send_cnt) || in nla_put_status_info()
2983 nla_put_u64(skb, T_recv_cnt, device->recv_cnt) || in nla_put_status_info()
2984 nla_put_u64(skb, T_read_cnt, device->read_cnt) || in nla_put_status_info()
2985 nla_put_u64(skb, T_writ_cnt, device->writ_cnt) || in nla_put_status_info()
2986 nla_put_u64(skb, T_al_writ_cnt, device->al_writ_cnt) || in nla_put_status_info()
2987 nla_put_u64(skb, T_bm_writ_cnt, device->bm_writ_cnt) || in nla_put_status_info()
2988 nla_put_u32(skb, T_ap_bio_cnt, atomic_read(&device->ap_bio_cnt)) || in nla_put_status_info()
2989 nla_put_u32(skb, T_ap_pending_cnt, atomic_read(&device->ap_pending_cnt)) || in nla_put_status_info()
2990 nla_put_u32(skb, T_rs_pending_cnt, atomic_read(&device->rs_pending_cnt))) in nla_put_status_info()
2996 spin_lock_irq(&device->ldev->md.uuid_lock); in nla_put_status_info()
2997 err = nla_put(skb, T_uuids, sizeof(si->uuids), device->ldev->md.uuid); in nla_put_status_info()
2998 spin_unlock_irq(&device->ldev->md.uuid_lock); in nla_put_status_info()
3003 if (nla_put_u32(skb, T_disk_flags, device->ldev->md.flags) || in nla_put_status_info()
3004 nla_put_u64(skb, T_bits_total, drbd_bm_bits(device)) || in nla_put_status_info()
3005 nla_put_u64(skb, T_bits_oos, drbd_bm_total_weight(device))) in nla_put_status_info()
3007 if (C_SYNC_SOURCE <= device->state.conn && in nla_put_status_info()
3008 C_PAUSED_SYNC_T >= device->state.conn) { in nla_put_status_info()
3009 if (nla_put_u64(skb, T_bits_rs_total, device->rs_total) || in nla_put_status_info()
3010 nla_put_u64(skb, T_bits_rs_failed, device->rs_failed)) in nla_put_status_info()
3042 put_ldev(device); in nla_put_status_info()
3058 err = nla_put_status_info(adm_ctx.reply_skb, adm_ctx.device, NULL); in drbd_adm_get_status()
3070 struct drbd_device *device; in get_one_status() local
3115 device = idr_get_next(&resource->devices, &volume); in get_one_status()
3116 if (!device) { in get_one_status()
3140 if (!device) { in get_one_status()
3161 D_ASSERT(device, device->vnr == volume); in get_one_status()
3162 D_ASSERT(device, device->resource == resource); in get_one_status()
3164 dh->minor = device_to_minor(device); in get_one_status()
3167 if (nla_put_status_info(skb, device, NULL)) { in get_one_status()
3263 adm_ctx.device->state.pdsk == D_OUTDATED ? UT_PEER_OUTDATED : in drbd_adm_get_timeout_type()
3264 test_bit(USE_DEGR_WFC_T, &adm_ctx.device->flags) ? UT_DEGRADED : in drbd_adm_get_timeout_type()
3280 struct drbd_device *device; in drbd_adm_start_ov() local
3290 device = adm_ctx.device; in drbd_adm_start_ov()
3293 parms.ov_start_sector = device->ov_start_sector; in drbd_adm_start_ov()
3306 device->ov_start_sector = parms.ov_start_sector & ~(BM_SECT_PER_BIT-1); in drbd_adm_start_ov()
3307 device->ov_stop_sector = parms.ov_stop_sector; in drbd_adm_start_ov()
3311 drbd_suspend_io(device); in drbd_adm_start_ov()
3312 wait_event(device->misc_wait, !test_bit(BITMAP_IO, &device->flags)); in drbd_adm_start_ov()
3313 retcode = drbd_request_state(device, NS(conn, C_VERIFY_S)); in drbd_adm_start_ov()
3314 drbd_resume_io(device); in drbd_adm_start_ov()
3326 struct drbd_device *device; in drbd_adm_new_c_uuid() local
3338 device = adm_ctx.device; in drbd_adm_new_c_uuid()
3350 mutex_lock(device->state_mutex); /* Protects us against serialized state changes. */ in drbd_adm_new_c_uuid()
3352 if (!get_ldev(device)) { in drbd_adm_new_c_uuid()
3358 if (device->state.conn == C_CONNECTED && in drbd_adm_new_c_uuid()
3359 first_peer_device(device)->connection->agreed_pro_version >= 90 && in drbd_adm_new_c_uuid()
3360 device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && args.clear_bm) { in drbd_adm_new_c_uuid()
3361 drbd_info(device, "Preparing to skip initial sync\n"); in drbd_adm_new_c_uuid()
3363 } else if (device->state.conn != C_STANDALONE) { in drbd_adm_new_c_uuid()
3368 drbd_uuid_set(device, UI_BITMAP, 0); /* Rotate UI_BITMAP to History 1, etc... */ in drbd_adm_new_c_uuid()
3369 drbd_uuid_new_current(device); /* New current, previous to UI_BITMAP */ in drbd_adm_new_c_uuid()
3372 err = drbd_bitmap_io(device, &drbd_bmio_clear_n_write, in drbd_adm_new_c_uuid()
3375 drbd_err(device, "Writing bitmap failed with %d\n", err); in drbd_adm_new_c_uuid()
3379 drbd_send_uuids_skip_initial_sync(first_peer_device(device)); in drbd_adm_new_c_uuid()
3380 _drbd_uuid_set(device, UI_BITMAP, 0); in drbd_adm_new_c_uuid()
3381 drbd_print_uuids(device, "cleared bitmap UUID"); in drbd_adm_new_c_uuid()
3382 spin_lock_irq(&device->resource->req_lock); in drbd_adm_new_c_uuid()
3383 _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), in drbd_adm_new_c_uuid()
3385 spin_unlock_irq(&device->resource->req_lock); in drbd_adm_new_c_uuid()
3389 drbd_md_sync(device); in drbd_adm_new_c_uuid()
3391 put_ldev(device); in drbd_adm_new_c_uuid()
3393 mutex_unlock(device->state_mutex); in drbd_adm_new_c_uuid()
3484 if (adm_ctx.device) { in drbd_adm_new_minor()
3499 static enum drbd_ret_code adm_del_minor(struct drbd_device *device) in adm_del_minor() argument
3501 if (device->state.disk == D_DISKLESS && in adm_del_minor()
3505 device->state.role == R_SECONDARY) { in adm_del_minor()
3506 _drbd_request_state(device, NS(conn, C_WF_REPORT_PARAMS), in adm_del_minor()
3508 drbd_delete_device(device); in adm_del_minor()
3526 retcode = adm_del_minor(adm_ctx.device); in drbd_adm_del_minor()
3559 struct drbd_device *device; in drbd_adm_down() local
3576 retcode = drbd_set_role(peer_device->device, R_SECONDARY, 0); in drbd_adm_down()
3591 idr_for_each_entry(&resource->devices, device, i) { in drbd_adm_down()
3592 retcode = adm_detach(device, 0); in drbd_adm_down()
3600 idr_for_each_entry(&resource->devices, device, i) { in drbd_adm_down()
3601 retcode = adm_del_minor(device); in drbd_adm_down()
3638 void drbd_bcast_event(struct drbd_device *device, const struct sib_info *sib) in drbd_bcast_event() argument
3655 d_out->minor = device_to_minor(device); in drbd_bcast_event()
3658 if (nla_put_status_info(msg, device, sib)) in drbd_bcast_event()
3671 drbd_err(device, "Error %d while broadcasting event. " in drbd_bcast_event()