Lines Matching refs:udev
104 struct tcmu_dev *udev; member
285 struct tcmu_dev *udev = nl_cmd->udev; in tcmu_fail_netlink_cmd() local
293 pr_debug("Aborting nl cmd %d on %s\n", nl_cmd->cmd, udev->name); in tcmu_fail_netlink_cmd()
354 struct tcmu_dev *udev = NULL; in tcmu_genl_cmd_done() local
369 if (nl_cmd->udev->se_dev.dev_index == dev_id) { in tcmu_genl_cmd_done()
370 udev = nl_cmd->udev; in tcmu_genl_cmd_done()
375 if (!udev) { in tcmu_genl_cmd_done()
384 udev->name, dev_id, nl_cmd->cmd, completed_cmd, rc, in tcmu_genl_cmd_done()
389 udev->name, completed_cmd, nl_cmd->cmd); in tcmu_genl_cmd_done()
478 struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; in tcmu_cmd_free_data() local
482 clear_bit(tcmu_cmd->dbi[i], udev->data_bitmap); in tcmu_cmd_free_data()
485 static inline bool tcmu_get_empty_block(struct tcmu_dev *udev, in tcmu_get_empty_block() argument
491 dbi = find_first_zero_bit(udev->data_bitmap, udev->dbi_thresh); in tcmu_get_empty_block()
492 if (dbi == udev->dbi_thresh) in tcmu_get_empty_block()
495 page = radix_tree_lookup(&udev->data_blocks, dbi); in tcmu_get_empty_block()
506 ret = radix_tree_insert(&udev->data_blocks, dbi, page); in tcmu_get_empty_block()
511 if (dbi > udev->dbi_max) in tcmu_get_empty_block()
512 udev->dbi_max = dbi; in tcmu_get_empty_block()
514 set_bit(dbi, udev->data_bitmap); in tcmu_get_empty_block()
525 static bool tcmu_get_empty_blocks(struct tcmu_dev *udev, in tcmu_get_empty_blocks() argument
531 if (!tcmu_get_empty_block(udev, tcmu_cmd)) in tcmu_get_empty_blocks()
538 tcmu_get_block_page(struct tcmu_dev *udev, uint32_t dbi) in tcmu_get_block_page() argument
540 return radix_tree_lookup(&udev->data_blocks, dbi); in tcmu_get_block_page()
573 struct tcmu_dev *udev = TCMU_DEV(se_dev); in tcmu_alloc_cmd() local
582 tcmu_cmd->tcmu_dev = udev; in tcmu_alloc_cmd()
662 static void scatter_data_area(struct tcmu_dev *udev, in scatter_data_area() argument
684 page = tcmu_get_block_page(udev, dbi); in scatter_data_area()
691 to_offset = get_block_offset_user(udev, dbi, in scatter_data_area()
738 static void gather_data_area(struct tcmu_dev *udev, struct tcmu_cmd *cmd, in gather_data_area() argument
779 page = tcmu_get_block_page(udev, dbi); in gather_data_area()
814 static bool is_ring_space_avail(struct tcmu_dev *udev, struct tcmu_cmd *cmd, in is_ring_space_avail() argument
817 struct tcmu_mailbox *mb = udev->mb_addr; in is_ring_space_avail()
825 cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */ in is_ring_space_avail()
831 if (head_to_end(cmd_head, udev->cmdr_size) >= cmd_size) in is_ring_space_avail()
834 cmd_needed = cmd_size + head_to_end(cmd_head, udev->cmdr_size); in is_ring_space_avail()
836 space = spc_free(cmd_head, udev->cmdr_last_cleaned, udev->cmdr_size); in is_ring_space_avail()
839 udev->cmdr_last_cleaned, udev->cmdr_size); in is_ring_space_avail()
844 space = spc_bitmap_free(udev->data_bitmap, udev->dbi_thresh); in is_ring_space_avail()
847 (udev->max_blocks - udev->dbi_thresh) + space; in is_ring_space_avail()
856 udev->dbi_thresh += blocks_needed; in is_ring_space_avail()
857 if (udev->dbi_thresh > udev->max_blocks) in is_ring_space_avail()
858 udev->dbi_thresh = udev->max_blocks; in is_ring_space_avail()
861 return tcmu_get_empty_blocks(udev, cmd); in is_ring_space_avail()
888 struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; in tcmu_setup_cmd_timer() local
894 cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT); in tcmu_setup_cmd_timer()
902 udev->name, tmo / MSEC_PER_SEC); in tcmu_setup_cmd_timer()
917 struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; in add_to_qfull_queue() local
925 if (!udev->qfull_time_out) in add_to_qfull_queue()
927 else if (udev->qfull_time_out > 0) in add_to_qfull_queue()
928 tmo = udev->qfull_time_out; in add_to_qfull_queue()
929 else if (udev->cmd_time_out) in add_to_qfull_queue()
930 tmo = udev->cmd_time_out; in add_to_qfull_queue()
934 ret = tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer); in add_to_qfull_queue()
938 list_add_tail(&tcmu_cmd->queue_entry, &udev->qfull_queue); in add_to_qfull_queue()
940 tcmu_cmd->cmd_id, udev->name); in add_to_qfull_queue()
956 struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; in queue_cmd_ring() local
970 if (test_bit(TCMU_DEV_BIT_BLOCKED, &udev->flags)) { in queue_cmd_ring()
975 if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) { in queue_cmd_ring()
995 if (!list_empty(&udev->qfull_queue)) in queue_cmd_ring()
998 mb = udev->mb_addr; in queue_cmd_ring()
999 cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */ in queue_cmd_ring()
1000 if ((command_size > (udev->cmdr_size / 2)) || in queue_cmd_ring()
1001 data_length > udev->data_size) { in queue_cmd_ring()
1004 udev->cmdr_size, udev->data_size); in queue_cmd_ring()
1009 if (!is_ring_space_avail(udev, tcmu_cmd, command_size, data_length)) { in queue_cmd_ring()
1020 if (head_to_end(cmd_head, udev->cmdr_size) < command_size) { in queue_cmd_ring()
1021 size_t pad_size = head_to_end(cmd_head, udev->cmdr_size); in queue_cmd_ring()
1031 UPDATE_HEAD(mb->cmd_head, pad_size, udev->cmdr_size); in queue_cmd_ring()
1034 cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */ in queue_cmd_ring()
1048 scatter_data_area(udev, tcmu_cmd, se_cmd->t_data_sg, in queue_cmd_ring()
1057 scatter_data_area(udev, tcmu_cmd, se_cmd->t_bidi_data_sg, in queue_cmd_ring()
1063 ret = tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, in queue_cmd_ring()
1064 &udev->cmd_timer); in queue_cmd_ring()
1089 UPDATE_HEAD(mb->cmd_head, command_size, udev->cmdr_size); in queue_cmd_ring()
1092 list_add_tail(&tcmu_cmd->queue_entry, &udev->inflight_queue); in queue_cmd_ring()
1096 uio_event_notify(&udev->uio_info); in queue_cmd_ring()
1113 struct tcmu_dev *udev = TCMU_DEV(se_dev); in tcmu_queue_cmd() local
1122 mutex_lock(&udev->cmdr_lock); in tcmu_queue_cmd()
1124 mutex_unlock(&udev->cmdr_lock); in tcmu_queue_cmd()
1133 struct tcmu_dev *udev = cmd->tcmu_dev; in tcmu_handle_completion() local
1174 gather_data_area(udev, cmd, true, read_len); in tcmu_handle_completion()
1176 gather_data_area(udev, cmd, false, read_len); in tcmu_handle_completion()
1217 static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) in tcmu_handle_completions() argument
1223 if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) { in tcmu_handle_completions()
1228 mb = udev->mb_addr; in tcmu_handle_completions()
1231 while (udev->cmdr_last_cleaned != READ_ONCE(mb->cmd_tail)) { in tcmu_handle_completions()
1233 struct tcmu_cmd_entry *entry = (void *) mb + CMDR_OFF + udev->cmdr_last_cleaned; in tcmu_handle_completions()
1238 UPDATE_HEAD(udev->cmdr_last_cleaned, in tcmu_handle_completions()
1240 udev->cmdr_size); in tcmu_handle_completions()
1245 cmd = idr_remove(&udev->commands, entry->hdr.cmd_id); in tcmu_handle_completions()
1249 set_bit(TCMU_DEV_BIT_BROKEN, &udev->flags); in tcmu_handle_completions()
1255 UPDATE_HEAD(udev->cmdr_last_cleaned, in tcmu_handle_completions()
1257 udev->cmdr_size); in tcmu_handle_completions()
1264 del_timer(&udev->cmd_timer); in tcmu_handle_completions()
1266 if (list_empty(&udev->qfull_queue)) { in tcmu_handle_completions()
1275 } else if (udev->cmd_time_out) { in tcmu_handle_completions()
1276 tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); in tcmu_handle_completions()
1285 struct tcmu_dev *udev = cmd->tcmu_dev; in tcmu_check_expired_cmd() local
1304 if (!udev->cmd_time_out) in tcmu_check_expired_cmd()
1316 idr_remove(&udev->commands, id); in tcmu_check_expired_cmd()
1322 id, udev->name, is_running ? "inflight" : "queued"); in tcmu_check_expired_cmd()
1328 static void tcmu_device_timedout(struct tcmu_dev *udev) in tcmu_device_timedout() argument
1331 if (list_empty(&udev->timedout_entry)) in tcmu_device_timedout()
1332 list_add_tail(&udev->timedout_entry, &timed_out_udevs); in tcmu_device_timedout()
1340 struct tcmu_dev *udev = from_timer(udev, t, cmd_timer); in tcmu_cmd_timedout() local
1342 pr_debug("%s cmd timeout has expired\n", udev->name); in tcmu_cmd_timedout()
1343 tcmu_device_timedout(udev); in tcmu_cmd_timedout()
1348 struct tcmu_dev *udev = from_timer(udev, t, qfull_timer); in tcmu_qfull_timedout() local
1350 pr_debug("%s qfull timeout has expired\n", udev->name); in tcmu_qfull_timedout()
1351 tcmu_device_timedout(udev); in tcmu_qfull_timedout()
1376 struct tcmu_dev *udev; in tcmu_alloc_device() local
1378 udev = kzalloc(sizeof(struct tcmu_dev), GFP_KERNEL); in tcmu_alloc_device()
1379 if (!udev) in tcmu_alloc_device()
1381 kref_init(&udev->kref); in tcmu_alloc_device()
1383 udev->name = kstrdup(name, GFP_KERNEL); in tcmu_alloc_device()
1384 if (!udev->name) { in tcmu_alloc_device()
1385 kfree(udev); in tcmu_alloc_device()
1389 udev->hba = hba; in tcmu_alloc_device()
1390 udev->cmd_time_out = TCMU_TIME_OUT; in tcmu_alloc_device()
1391 udev->qfull_time_out = -1; in tcmu_alloc_device()
1393 udev->max_blocks = DATA_BLOCK_BITS_DEF; in tcmu_alloc_device()
1394 mutex_init(&udev->cmdr_lock); in tcmu_alloc_device()
1396 INIT_LIST_HEAD(&udev->node); in tcmu_alloc_device()
1397 INIT_LIST_HEAD(&udev->timedout_entry); in tcmu_alloc_device()
1398 INIT_LIST_HEAD(&udev->qfull_queue); in tcmu_alloc_device()
1399 INIT_LIST_HEAD(&udev->inflight_queue); in tcmu_alloc_device()
1400 idr_init(&udev->commands); in tcmu_alloc_device()
1402 timer_setup(&udev->qfull_timer, tcmu_qfull_timedout, 0); in tcmu_alloc_device()
1403 timer_setup(&udev->cmd_timer, tcmu_cmd_timedout, 0); in tcmu_alloc_device()
1405 INIT_RADIX_TREE(&udev->data_blocks, GFP_KERNEL); in tcmu_alloc_device()
1407 return &udev->se_dev; in tcmu_alloc_device()
1410 static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) in run_qfull_queue() argument
1418 if (list_empty(&udev->qfull_queue)) in run_qfull_queue()
1421 pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail); in run_qfull_queue()
1423 list_splice_init(&udev->qfull_queue, &cmds); in run_qfull_queue()
1429 tcmu_cmd->cmd_id, udev->name); in run_qfull_queue()
1432 idr_remove(&udev->commands, tcmu_cmd->cmd_id); in run_qfull_queue()
1448 tcmu_cmd->cmd_id, udev->name, scsi_ret); in run_qfull_queue()
1450 idr_remove(&udev->commands, tcmu_cmd->cmd_id); in run_qfull_queue()
1464 list_splice_tail(&cmds, &udev->qfull_queue); in run_qfull_queue()
1470 tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); in run_qfull_queue()
1476 struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info); in tcmu_irqcontrol() local
1478 mutex_lock(&udev->cmdr_lock); in tcmu_irqcontrol()
1479 tcmu_handle_completions(udev); in tcmu_irqcontrol()
1480 run_qfull_queue(udev, false); in tcmu_irqcontrol()
1481 mutex_unlock(&udev->cmdr_lock); in tcmu_irqcontrol()
1492 struct tcmu_dev *udev = vma->vm_private_data; in tcmu_find_mem_index() local
1493 struct uio_info *info = &udev->uio_info; in tcmu_find_mem_index()
1503 static struct page *tcmu_try_get_block_page(struct tcmu_dev *udev, uint32_t dbi) in tcmu_try_get_block_page() argument
1507 mutex_lock(&udev->cmdr_lock); in tcmu_try_get_block_page()
1508 page = tcmu_get_block_page(udev, dbi); in tcmu_try_get_block_page()
1510 mutex_unlock(&udev->cmdr_lock); in tcmu_try_get_block_page()
1519 dbi, udev->name); in tcmu_try_get_block_page()
1521 mutex_unlock(&udev->cmdr_lock); in tcmu_try_get_block_page()
1528 struct tcmu_dev *udev = vmf->vma->vm_private_data; in tcmu_vma_fault() local
1529 struct uio_info *info = &udev->uio_info; in tcmu_vma_fault()
1544 if (offset < udev->data_off) { in tcmu_vma_fault()
1552 dbi = (offset - udev->data_off) / DATA_BLOCK_SIZE; in tcmu_vma_fault()
1553 page = tcmu_try_get_block_page(udev, dbi); in tcmu_vma_fault()
1569 struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info); in tcmu_mmap() local
1574 vma->vm_private_data = udev; in tcmu_mmap()
1577 if (vma_pages(vma) != (udev->ring_size >> PAGE_SHIFT)) in tcmu_mmap()
1585 struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info); in tcmu_open() local
1588 if (test_and_set_bit(TCMU_DEV_BIT_OPEN, &udev->flags)) in tcmu_open()
1591 udev->inode = inode; in tcmu_open()
1592 kref_get(&udev->kref); in tcmu_open()
1602 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_dev_call_rcu() local
1604 kfree(udev->uio_info.name); in tcmu_dev_call_rcu()
1605 kfree(udev->name); in tcmu_dev_call_rcu()
1606 kfree(udev); in tcmu_dev_call_rcu()
1635 struct tcmu_dev *udev = container_of(kref, struct tcmu_dev, kref); in tcmu_dev_kref_release() local
1636 struct se_device *dev = &udev->se_dev; in tcmu_dev_kref_release()
1641 vfree(udev->mb_addr); in tcmu_dev_kref_release()
1642 udev->mb_addr = NULL; in tcmu_dev_kref_release()
1645 if (!list_empty(&udev->timedout_entry)) in tcmu_dev_kref_release()
1646 list_del(&udev->timedout_entry); in tcmu_dev_kref_release()
1650 mutex_lock(&udev->cmdr_lock); in tcmu_dev_kref_release()
1651 idr_for_each_entry(&udev->commands, cmd, i) { in tcmu_dev_kref_release()
1655 idr_destroy(&udev->commands); in tcmu_dev_kref_release()
1658 tcmu_blocks_release(&udev->data_blocks, 0, udev->dbi_max + 1); in tcmu_dev_kref_release()
1659 bitmap_free(udev->data_bitmap); in tcmu_dev_kref_release()
1660 mutex_unlock(&udev->cmdr_lock); in tcmu_dev_kref_release()
1667 struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info); in tcmu_release() local
1669 clear_bit(TCMU_DEV_BIT_OPEN, &udev->flags); in tcmu_release()
1673 kref_put(&udev->kref, tcmu_dev_kref_release); in tcmu_release()
1677 static int tcmu_init_genl_cmd_reply(struct tcmu_dev *udev, int cmd) in tcmu_init_genl_cmd_reply() argument
1679 struct tcmu_nl_cmd *nl_cmd = &udev->curr_nl_cmd; in tcmu_init_genl_cmd_reply()
1684 if (udev->nl_reply_supported <= 0) in tcmu_init_genl_cmd_reply()
1692 udev->name); in tcmu_init_genl_cmd_reply()
1699 nl_cmd->cmd, udev->name); in tcmu_init_genl_cmd_reply()
1705 nl_cmd->udev = udev; in tcmu_init_genl_cmd_reply()
1715 static void tcmu_destroy_genl_cmd_reply(struct tcmu_dev *udev) in tcmu_destroy_genl_cmd_reply() argument
1717 struct tcmu_nl_cmd *nl_cmd = &udev->curr_nl_cmd; in tcmu_destroy_genl_cmd_reply()
1722 if (udev->nl_reply_supported <= 0) in tcmu_destroy_genl_cmd_reply()
1733 static int tcmu_wait_genl_cmd_reply(struct tcmu_dev *udev) in tcmu_wait_genl_cmd_reply() argument
1735 struct tcmu_nl_cmd *nl_cmd = &udev->curr_nl_cmd; in tcmu_wait_genl_cmd_reply()
1741 if (udev->nl_reply_supported <= 0) in tcmu_wait_genl_cmd_reply()
1755 static int tcmu_netlink_event_init(struct tcmu_dev *udev, in tcmu_netlink_event_init() argument
1771 ret = nla_put_string(skb, TCMU_ATTR_DEVICE, udev->uio_info.name); in tcmu_netlink_event_init()
1775 ret = nla_put_u32(skb, TCMU_ATTR_MINOR, udev->uio_info.uio_dev->minor); in tcmu_netlink_event_init()
1779 ret = nla_put_u32(skb, TCMU_ATTR_DEVICE_ID, udev->se_dev.dev_index); in tcmu_netlink_event_init()
1792 static int tcmu_netlink_event_send(struct tcmu_dev *udev, in tcmu_netlink_event_send() argument
1800 ret = tcmu_init_genl_cmd_reply(udev, cmd); in tcmu_netlink_event_send()
1812 return tcmu_wait_genl_cmd_reply(udev); in tcmu_netlink_event_send()
1814 tcmu_destroy_genl_cmd_reply(udev); in tcmu_netlink_event_send()
1819 static int tcmu_send_dev_add_event(struct tcmu_dev *udev) in tcmu_send_dev_add_event() argument
1825 ret = tcmu_netlink_event_init(udev, TCMU_CMD_ADDED_DEVICE, &skb, in tcmu_send_dev_add_event()
1829 return tcmu_netlink_event_send(udev, TCMU_CMD_ADDED_DEVICE, skb, in tcmu_send_dev_add_event()
1833 static int tcmu_send_dev_remove_event(struct tcmu_dev *udev) in tcmu_send_dev_remove_event() argument
1839 ret = tcmu_netlink_event_init(udev, TCMU_CMD_REMOVED_DEVICE, in tcmu_send_dev_remove_event()
1843 return tcmu_netlink_event_send(udev, TCMU_CMD_REMOVED_DEVICE, in tcmu_send_dev_remove_event()
1847 static int tcmu_update_uio_info(struct tcmu_dev *udev) in tcmu_update_uio_info() argument
1849 struct tcmu_hba *hba = udev->hba->hba_ptr; in tcmu_update_uio_info()
1853 info = &udev->uio_info; in tcmu_update_uio_info()
1855 if (udev->dev_config[0]) in tcmu_update_uio_info()
1857 udev->name, udev->dev_config); in tcmu_update_uio_info()
1860 udev->name); in tcmu_update_uio_info()
1873 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_configure_device() local
1878 ret = tcmu_update_uio_info(udev); in tcmu_configure_device()
1882 info = &udev->uio_info; in tcmu_configure_device()
1884 mutex_lock(&udev->cmdr_lock); in tcmu_configure_device()
1885 udev->data_bitmap = bitmap_zalloc(udev->max_blocks, GFP_KERNEL); in tcmu_configure_device()
1886 mutex_unlock(&udev->cmdr_lock); in tcmu_configure_device()
1887 if (!udev->data_bitmap) { in tcmu_configure_device()
1892 udev->mb_addr = vzalloc(CMDR_SIZE); in tcmu_configure_device()
1893 if (!udev->mb_addr) { in tcmu_configure_device()
1899 udev->cmdr_size = CMDR_SIZE - CMDR_OFF; in tcmu_configure_device()
1900 udev->data_off = CMDR_SIZE; in tcmu_configure_device()
1901 udev->data_size = udev->max_blocks * DATA_BLOCK_SIZE; in tcmu_configure_device()
1902 udev->dbi_thresh = 0; /* Default in Idle state */ in tcmu_configure_device()
1905 mb = udev->mb_addr; in tcmu_configure_device()
1909 mb->cmdr_size = udev->cmdr_size; in tcmu_configure_device()
1911 WARN_ON(!PAGE_ALIGNED(udev->data_off)); in tcmu_configure_device()
1912 WARN_ON(udev->data_size % PAGE_SIZE); in tcmu_configure_device()
1913 WARN_ON(udev->data_size % DATA_BLOCK_SIZE); in tcmu_configure_device()
1918 info->mem[0].addr = (phys_addr_t)(uintptr_t)udev->mb_addr; in tcmu_configure_device()
1919 info->mem[0].size = udev->ring_size = udev->data_size + CMDR_SIZE; in tcmu_configure_device()
1946 if (udev->nl_reply_supported >= 0) in tcmu_configure_device()
1947 udev->nl_reply_supported = tcmu_kern_cmd_reply_supported; in tcmu_configure_device()
1953 kref_get(&udev->kref); in tcmu_configure_device()
1955 ret = tcmu_send_dev_add_event(udev); in tcmu_configure_device()
1960 list_add(&udev->node, &root_udev); in tcmu_configure_device()
1966 kref_put(&udev->kref, tcmu_dev_kref_release); in tcmu_configure_device()
1967 uio_unregister_device(&udev->uio_info); in tcmu_configure_device()
1969 vfree(udev->mb_addr); in tcmu_configure_device()
1970 udev->mb_addr = NULL; in tcmu_configure_device()
1972 bitmap_free(udev->data_bitmap); in tcmu_configure_device()
1973 udev->data_bitmap = NULL; in tcmu_configure_device()
1983 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_free_device() local
1986 kref_put(&udev->kref, tcmu_dev_kref_release); in tcmu_free_device()
1991 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_destroy_device() local
1993 del_timer_sync(&udev->cmd_timer); in tcmu_destroy_device()
1994 del_timer_sync(&udev->qfull_timer); in tcmu_destroy_device()
1997 list_del(&udev->node); in tcmu_destroy_device()
2000 tcmu_send_dev_remove_event(udev); in tcmu_destroy_device()
2002 uio_unregister_device(&udev->uio_info); in tcmu_destroy_device()
2005 kref_put(&udev->kref, tcmu_dev_kref_release); in tcmu_destroy_device()
2008 static void tcmu_unblock_dev(struct tcmu_dev *udev) in tcmu_unblock_dev() argument
2010 mutex_lock(&udev->cmdr_lock); in tcmu_unblock_dev()
2011 clear_bit(TCMU_DEV_BIT_BLOCKED, &udev->flags); in tcmu_unblock_dev()
2012 mutex_unlock(&udev->cmdr_lock); in tcmu_unblock_dev()
2015 static void tcmu_block_dev(struct tcmu_dev *udev) in tcmu_block_dev() argument
2017 mutex_lock(&udev->cmdr_lock); in tcmu_block_dev()
2019 if (test_and_set_bit(TCMU_DEV_BIT_BLOCKED, &udev->flags)) in tcmu_block_dev()
2023 tcmu_handle_completions(udev); in tcmu_block_dev()
2025 run_qfull_queue(udev, true); in tcmu_block_dev()
2028 mutex_unlock(&udev->cmdr_lock); in tcmu_block_dev()
2031 static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) in tcmu_reset_ring() argument
2037 mutex_lock(&udev->cmdr_lock); in tcmu_reset_ring()
2039 idr_for_each_entry(&udev->commands, cmd, i) { in tcmu_reset_ring()
2044 cmd->cmd_id, udev->name, in tcmu_reset_ring()
2047 idr_remove(&udev->commands, i); in tcmu_reset_ring()
2067 mb = udev->mb_addr; in tcmu_reset_ring()
2069 pr_debug("mb last %u head %u tail %u\n", udev->cmdr_last_cleaned, in tcmu_reset_ring()
2072 udev->cmdr_last_cleaned = 0; in tcmu_reset_ring()
2077 del_timer(&udev->cmd_timer); in tcmu_reset_ring()
2079 mutex_unlock(&udev->cmdr_lock); in tcmu_reset_ring()
2117 static int tcmu_set_max_blocks_param(struct tcmu_dev *udev, substring_t *arg) in tcmu_set_max_blocks_param() argument
2133 mutex_lock(&udev->cmdr_lock); in tcmu_set_max_blocks_param()
2134 if (udev->data_bitmap) { in tcmu_set_max_blocks_param()
2140 udev->max_blocks = TCMU_MBS_TO_BLOCKS(val); in tcmu_set_max_blocks_param()
2141 if (udev->max_blocks > tcmu_global_max_blocks) { in tcmu_set_max_blocks_param()
2144 udev->max_blocks = tcmu_global_max_blocks; in tcmu_set_max_blocks_param()
2148 mutex_unlock(&udev->cmdr_lock); in tcmu_set_max_blocks_param()
2155 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_set_configfs_dev_params() local
2173 if (match_strlcpy(udev->dev_config, &args[0], in tcmu_set_configfs_dev_params()
2178 pr_debug("TCMU: Referencing Path: %s\n", udev->dev_config); in tcmu_set_configfs_dev_params()
2181 ret = match_u64(&args[0], &udev->dev_size); in tcmu_set_configfs_dev_params()
2195 ret = match_int(&args[0], &udev->nl_reply_supported); in tcmu_set_configfs_dev_params()
2201 ret = tcmu_set_max_blocks_param(udev, &args[0]); in tcmu_set_configfs_dev_params()
2217 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_show_configfs_dev_params() local
2221 udev->dev_config[0] ? udev->dev_config : "NULL"); in tcmu_show_configfs_dev_params()
2222 bl += sprintf(b + bl, "Size: %llu ", udev->dev_size); in tcmu_show_configfs_dev_params()
2224 TCMU_BLOCKS_TO_MBS(udev->max_blocks)); in tcmu_show_configfs_dev_params()
2231 struct tcmu_dev *udev = TCMU_DEV(dev); in tcmu_get_blocks() local
2233 return div_u64(udev->dev_size - dev->dev_attrib.block_size, in tcmu_get_blocks()
2247 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_cmd_time_out_show() local
2249 return snprintf(page, PAGE_SIZE, "%lu\n", udev->cmd_time_out / MSEC_PER_SEC); in tcmu_cmd_time_out_show()
2257 struct tcmu_dev *udev = container_of(da->da_dev, in tcmu_cmd_time_out_store() local
2271 udev->cmd_time_out = val * MSEC_PER_SEC; in tcmu_cmd_time_out_store()
2280 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_qfull_time_out_show() local
2282 return snprintf(page, PAGE_SIZE, "%ld\n", udev->qfull_time_out <= 0 ? in tcmu_qfull_time_out_show()
2283 udev->qfull_time_out : in tcmu_qfull_time_out_show()
2284 udev->qfull_time_out / MSEC_PER_SEC); in tcmu_qfull_time_out_show()
2292 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_qfull_time_out_store() local
2301 udev->qfull_time_out = val * MSEC_PER_SEC; in tcmu_qfull_time_out_store()
2303 udev->qfull_time_out = val; in tcmu_qfull_time_out_store()
2316 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_max_data_area_mb_show() local
2319 TCMU_BLOCKS_TO_MBS(udev->max_blocks)); in tcmu_max_data_area_mb_show()
2327 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_dev_config_show() local
2329 return snprintf(page, PAGE_SIZE, "%s\n", udev->dev_config); in tcmu_dev_config_show()
2332 static int tcmu_send_dev_config_event(struct tcmu_dev *udev, in tcmu_send_dev_config_event() argument
2339 ret = tcmu_netlink_event_init(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_dev_config_event()
2348 return tcmu_netlink_event_send(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_dev_config_event()
2358 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_dev_config_store() local
2366 if (target_dev_configured(&udev->se_dev)) { in tcmu_dev_config_store()
2367 ret = tcmu_send_dev_config_event(udev, page); in tcmu_dev_config_store()
2372 strlcpy(udev->dev_config, page, TCMU_CONFIG_LEN); in tcmu_dev_config_store()
2374 ret = tcmu_update_uio_info(udev); in tcmu_dev_config_store()
2379 strlcpy(udev->dev_config, page, TCMU_CONFIG_LEN); in tcmu_dev_config_store()
2389 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_dev_size_show() local
2391 return snprintf(page, PAGE_SIZE, "%llu\n", udev->dev_size); in tcmu_dev_size_show()
2394 static int tcmu_send_dev_size_event(struct tcmu_dev *udev, u64 size) in tcmu_send_dev_size_event() argument
2400 ret = tcmu_netlink_event_init(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_dev_size_event()
2410 return tcmu_netlink_event_send(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_dev_size_event()
2419 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_dev_size_store() local
2428 if (target_dev_configured(&udev->se_dev)) { in tcmu_dev_size_store()
2429 ret = tcmu_send_dev_size_event(udev, val); in tcmu_dev_size_store()
2435 udev->dev_size = val; in tcmu_dev_size_store()
2445 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_nl_reply_supported_show() local
2447 return snprintf(page, PAGE_SIZE, "%d\n", udev->nl_reply_supported); in tcmu_nl_reply_supported_show()
2455 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_nl_reply_supported_store() local
2463 udev->nl_reply_supported = val; in tcmu_nl_reply_supported_store()
2477 static int tcmu_send_emulate_write_cache(struct tcmu_dev *udev, u8 val) in tcmu_send_emulate_write_cache() argument
2483 ret = tcmu_netlink_event_init(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_emulate_write_cache()
2492 return tcmu_netlink_event_send(udev, TCMU_CMD_RECONFIG_DEVICE, in tcmu_send_emulate_write_cache()
2501 struct tcmu_dev *udev = TCMU_DEV(da->da_dev); in tcmu_emulate_write_cache_store() local
2510 if (target_dev_configured(&udev->se_dev)) { in tcmu_emulate_write_cache_store()
2511 ret = tcmu_send_emulate_write_cache(udev, val); in tcmu_emulate_write_cache_store()
2528 struct tcmu_dev *udev = TCMU_DEV(se_dev); in tcmu_block_dev_show() local
2530 if (test_bit(TCMU_DEV_BIT_BLOCKED, &udev->flags)) in tcmu_block_dev_show()
2542 struct tcmu_dev *udev = TCMU_DEV(se_dev); in tcmu_block_dev_store() local
2546 if (!target_dev_configured(&udev->se_dev)) { in tcmu_block_dev_store()
2561 tcmu_unblock_dev(udev); in tcmu_block_dev_store()
2563 tcmu_block_dev(udev); in tcmu_block_dev_store()
2574 struct tcmu_dev *udev = TCMU_DEV(se_dev); in tcmu_reset_ring_store() local
2578 if (!target_dev_configured(&udev->se_dev)) { in tcmu_reset_ring_store()
2592 tcmu_reset_ring(udev, val); in tcmu_reset_ring_store()
2636 struct tcmu_dev *udev; in find_free_blocks() local
2644 list_for_each_entry(udev, &root_udev, node) { in find_free_blocks()
2645 mutex_lock(&udev->cmdr_lock); in find_free_blocks()
2647 if (!target_dev_configured(&udev->se_dev)) { in find_free_blocks()
2648 mutex_unlock(&udev->cmdr_lock); in find_free_blocks()
2653 tcmu_handle_completions(udev); in find_free_blocks()
2656 if (!udev->dbi_thresh) { in find_free_blocks()
2657 mutex_unlock(&udev->cmdr_lock); in find_free_blocks()
2661 end = udev->dbi_max + 1; in find_free_blocks()
2662 block = find_last_bit(udev->data_bitmap, end); in find_free_blocks()
2663 if (block == udev->dbi_max) { in find_free_blocks()
2668 mutex_unlock(&udev->cmdr_lock); in find_free_blocks()
2672 udev->dbi_thresh = start = 0; in find_free_blocks()
2673 udev->dbi_max = 0; in find_free_blocks()
2675 udev->dbi_thresh = start = block + 1; in find_free_blocks()
2676 udev->dbi_max = block; in find_free_blocks()
2680 off = udev->data_off + start * DATA_BLOCK_SIZE; in find_free_blocks()
2681 unmap_mapping_range(udev->inode->i_mapping, off, 0, 1); in find_free_blocks()
2684 tcmu_blocks_release(&udev->data_blocks, start, end); in find_free_blocks()
2685 mutex_unlock(&udev->cmdr_lock); in find_free_blocks()
2689 total_freed, udev->name); in find_free_blocks()
2699 struct tcmu_dev *udev, *tmp_dev; in check_timedout_devices() local
2705 list_for_each_entry_safe(udev, tmp_dev, &devs, timedout_entry) { in check_timedout_devices()
2706 list_del_init(&udev->timedout_entry); in check_timedout_devices()
2709 mutex_lock(&udev->cmdr_lock); in check_timedout_devices()
2710 idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL); in check_timedout_devices()
2712 tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); in check_timedout_devices()
2713 tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); in check_timedout_devices()
2715 mutex_unlock(&udev->cmdr_lock); in check_timedout_devices()