提交 07db0563 编写于 作者: L Linus Torvalds

Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull more SCSI updates from James Bottomley:
 "This is a set of minor fixes in various drivers (qla2xxx, ufs,
  scsi_debug, lpfc) one doc fix and a fairly large update to the fnic
  driver to remove the open coded iteration functions in favour of the
  scsi provided ones"

* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: fnic: Use scsi_host_busy_iter() to traverse commands
  scsi: fnic: Kill 'exclude_id' argument to fnic_cleanup_io()
  scsi: scsi_debug: Fix cmd_per_lun, set to max_queue
  scsi: ufs: core: Narrow down fast path in system suspend path
  scsi: ufs: core: Cancel rpm_dev_flush_recheck_work during system suspend
  scsi: ufs: core: Do not put UFS power into LPM if link is broken
  scsi: qla2xxx: Prevent PRLI in target mode
  scsi: qla2xxx: Add marginal path handling support
  scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found
  scsi: ufs: core: Fix a typo in ufs-sysfs.c
  scsi: lpfc: Fix bad memory access during VPD DUMP mailbox command
  scsi: lpfc: Fix DMA virtual address ptr assignment in bsg
  scsi: lpfc: Fix illegal memory access on Abort IOCBs
  scsi: blk-mq: Fix build warning when making htmldocs
此差异已折叠。
...@@ -934,7 +934,7 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -934,7 +934,7 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
INIT_LIST_HEAD(&head); INIT_LIST_HEAD(&head);
list_add_tail(&head, &piocbq->list); list_add_tail(&head, &piocbq->list);
ct_req = (struct lpfc_sli_ct_request *)bdeBuf1; ct_req = (struct lpfc_sli_ct_request *)bdeBuf1->virt;
evt_req_id = ct_req->FsType; evt_req_id = ct_req->FsType;
cmd = ct_req->CommandResponse.bits.CmdRsp; cmd = ct_req->CommandResponse.bits.CmdRsp;
......
...@@ -254,13 +254,13 @@ lpfc_config_port_prep(struct lpfc_hba *phba) ...@@ -254,13 +254,13 @@ lpfc_config_port_prep(struct lpfc_hba *phba)
if (mb->un.varDmp.word_cnt == 0) if (mb->un.varDmp.word_cnt == 0)
break; break;
i = mb->un.varDmp.word_cnt * sizeof(uint32_t); if (mb->un.varDmp.word_cnt > DMP_VPD_SIZE - offset)
if (offset + i > DMP_VPD_SIZE) mb->un.varDmp.word_cnt = DMP_VPD_SIZE - offset;
i = DMP_VPD_SIZE - offset;
lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET, lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET,
lpfc_vpd_data + offset, i); lpfc_vpd_data + offset,
offset += i; mb->un.varDmp.word_cnt);
} while (offset < DMP_VPD_SIZE); offset += mb->un.varDmp.word_cnt;
} while (mb->un.varDmp.word_cnt && offset < DMP_VPD_SIZE);
lpfc_parse_vpd(phba, lpfc_vpd_data, offset); lpfc_parse_vpd(phba, lpfc_vpd_data, offset);
......
...@@ -11804,13 +11804,20 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, struct lpfc_vport *vport, ...@@ -11804,13 +11804,20 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, struct lpfc_vport *vport,
lpfc_ctx_cmd ctx_cmd) lpfc_ctx_cmd ctx_cmd)
{ {
struct lpfc_io_buf *lpfc_cmd; struct lpfc_io_buf *lpfc_cmd;
IOCB_t *icmd = NULL;
int rc = 1; int rc = 1;
if (!iocbq || iocbq->vport != vport) if (!iocbq || iocbq->vport != vport)
return rc; return rc;
if (!(iocbq->iocb_flag & LPFC_IO_FCP) || if (!(iocbq->iocb_flag & LPFC_IO_FCP) ||
!(iocbq->iocb_flag & LPFC_IO_ON_TXCMPLQ)) !(iocbq->iocb_flag & LPFC_IO_ON_TXCMPLQ) ||
iocbq->iocb_flag & LPFC_DRIVER_ABORTED)
return rc;
icmd = &iocbq->iocb;
if (icmd->ulpCommand == CMD_ABORT_XRI_CN ||
icmd->ulpCommand == CMD_CLOSE_XRI_CN)
return rc; return rc;
lpfc_cmd = container_of(iocbq, struct lpfc_io_buf, cur_iocbq); lpfc_cmd = container_of(iocbq, struct lpfc_io_buf, cur_iocbq);
...@@ -19770,7 +19777,7 @@ lpfc_sli_get_config_region23(struct lpfc_hba *phba, char *rgn23_data) ...@@ -19770,7 +19777,7 @@ lpfc_sli_get_config_region23(struct lpfc_hba *phba, char *rgn23_data)
LPFC_MBOXQ_t *pmb = NULL; LPFC_MBOXQ_t *pmb = NULL;
MAILBOX_t *mb; MAILBOX_t *mb;
uint32_t offset = 0; uint32_t offset = 0;
int i, rc; int rc;
if (!rgn23_data) if (!rgn23_data)
return 0; return 0;
...@@ -19801,13 +19808,14 @@ lpfc_sli_get_config_region23(struct lpfc_hba *phba, char *rgn23_data) ...@@ -19801,13 +19808,14 @@ lpfc_sli_get_config_region23(struct lpfc_hba *phba, char *rgn23_data)
if (mb->un.varDmp.word_cnt == 0) if (mb->un.varDmp.word_cnt == 0)
break; break;
i = mb->un.varDmp.word_cnt * sizeof(uint32_t); if (mb->un.varDmp.word_cnt > DMP_RGN23_SIZE - offset)
if (offset + i > DMP_RGN23_SIZE) mb->un.varDmp.word_cnt = DMP_RGN23_SIZE - offset;
i = DMP_RGN23_SIZE - offset;
lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET, lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET,
rgn23_data + offset, i); rgn23_data + offset,
offset += i; mb->un.varDmp.word_cnt);
} while (offset < DMP_RGN23_SIZE); offset += mb->un.varDmp.word_cnt;
} while (mb->un.varDmp.word_cnt && offset < DMP_RGN23_SIZE);
mempool_free(pmb, phba->mbox_mem_pool); mempool_free(pmb, phba->mbox_mem_pool);
return offset; return offset;
......
...@@ -1195,6 +1195,9 @@ static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport) ...@@ -1195,6 +1195,9 @@ static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport)
{ {
struct qla_work_evt *e; struct qla_work_evt *e;
if (vha->host->active_mode == MODE_TARGET)
return QLA_FUNCTION_FAILED;
e = qla2x00_alloc_work(vha, QLA_EVT_PRLI); e = qla2x00_alloc_work(vha, QLA_EVT_PRLI);
if (!e) if (!e)
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
......
...@@ -7707,6 +7707,7 @@ struct scsi_host_template qla2xxx_driver_template = { ...@@ -7707,6 +7707,7 @@ struct scsi_host_template qla2xxx_driver_template = {
.eh_timed_out = fc_eh_timed_out, .eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = qla2xxx_eh_abort, .eh_abort_handler = qla2xxx_eh_abort,
.eh_should_retry_cmd = fc_eh_should_retry_cmd,
.eh_device_reset_handler = qla2xxx_eh_device_reset, .eh_device_reset_handler = qla2xxx_eh_device_reset,
.eh_target_reset_handler = qla2xxx_eh_target_reset, .eh_target_reset_handler = qla2xxx_eh_target_reset,
.eh_bus_reset_handler = qla2xxx_eh_bus_reset, .eh_bus_reset_handler = qla2xxx_eh_bus_reset,
......
...@@ -218,7 +218,7 @@ static const char *sdebug_version_date = "20200710"; ...@@ -218,7 +218,7 @@ static const char *sdebug_version_date = "20200710";
*/ */
#define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */ #define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */
#define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG) #define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
#define DEF_CMD_PER_LUN 255 #define DEF_CMD_PER_LUN SDEBUG_CANQUEUE
/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */ /* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
#define F_D_IN 1 /* Data-in command (e.g. READ) */ #define F_D_IN 1 /* Data-in command (e.g. READ) */
...@@ -5695,8 +5695,8 @@ MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)"); ...@@ -5695,8 +5695,8 @@ MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)"); MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)"); MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)"); MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method"); MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method");
MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))"); MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error"); MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error"); MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
...@@ -5710,7 +5710,7 @@ MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent ...@@ -5710,7 +5710,7 @@ MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent
MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)"); MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)"); MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)"); MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1)"); MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1))");
MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])"); MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns"); MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
MODULE_PARM_DESC(removable, "claim to have removable media (def=0)"); MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
...@@ -7165,12 +7165,15 @@ static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth) ...@@ -7165,12 +7165,15 @@ static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
} }
num_in_q = atomic_read(&devip->num_in_q); num_in_q = atomic_read(&devip->num_in_q);
if (qdepth > SDEBUG_CANQUEUE) {
qdepth = SDEBUG_CANQUEUE;
pr_warn("%s: requested qdepth [%d] exceeds canqueue [%d], trim\n", __func__,
qdepth, SDEBUG_CANQUEUE);
}
if (qdepth < 1) if (qdepth < 1)
qdepth = 1; qdepth = 1;
/* allow to exceed max host qc_arr elements for testing */ if (qdepth != sdev->queue_depth)
if (qdepth > SDEBUG_CANQUEUE + 10) scsi_change_queue_depth(sdev, qdepth);
qdepth = SDEBUG_CANQUEUE + 10;
scsi_change_queue_depth(sdev, qdepth);
if (SDEBUG_OPT_Q_NOISE & sdebug_opts) { if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n", sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
...@@ -7558,6 +7561,7 @@ static int sdebug_driver_probe(struct device *dev) ...@@ -7558,6 +7561,7 @@ static int sdebug_driver_probe(struct device *dev)
sdbg_host = to_sdebug_host(dev); sdbg_host = to_sdebug_host(dev);
sdebug_driver_template.can_queue = sdebug_max_queue; sdebug_driver_template.can_queue = sdebug_max_queue;
sdebug_driver_template.cmd_per_lun = sdebug_max_queue;
if (!sdebug_clustering) if (!sdebug_clustering)
sdebug_driver_template.dma_boundary = PAGE_SIZE - 1; sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
...@@ -7593,7 +7597,11 @@ static int sdebug_driver_probe(struct device *dev) ...@@ -7593,7 +7597,11 @@ static int sdebug_driver_probe(struct device *dev)
* If condition not met, trim poll_queues to 1 (just for simplicity). * If condition not met, trim poll_queues to 1 (just for simplicity).
*/ */
if (poll_queues >= submit_queues) { if (poll_queues >= submit_queues) {
pr_warn("%s: trim poll_queues to 1\n", my_name); if (submit_queues < 3)
pr_warn("%s: trim poll_queues to 1\n", my_name);
else
pr_warn("%s: trim poll_queues to 1. Perhaps try poll_queues=%d\n",
my_name, submit_queues - 1);
poll_queues = 1; poll_queues = 1;
} }
if (poll_queues) if (poll_queues)
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "ufs.h" #include "ufs.h"
#include "ufs-sysfs.h" #include "ufs-sysfs.h"
static const char *ufschd_uic_link_state_to_string( static const char *ufshcd_uic_link_state_to_string(
enum uic_link_state state) enum uic_link_state state)
{ {
switch (state) { switch (state) {
...@@ -21,7 +21,7 @@ static const char *ufschd_uic_link_state_to_string( ...@@ -21,7 +21,7 @@ static const char *ufschd_uic_link_state_to_string(
} }
} }
static const char *ufschd_ufs_dev_pwr_mode_to_string( static const char *ufshcd_ufs_dev_pwr_mode_to_string(
enum ufs_dev_pwr_mode state) enum ufs_dev_pwr_mode state)
{ {
switch (state) { switch (state) {
...@@ -81,7 +81,7 @@ static ssize_t rpm_target_dev_state_show(struct device *dev, ...@@ -81,7 +81,7 @@ static ssize_t rpm_target_dev_state_show(struct device *dev,
{ {
struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_hba *hba = dev_get_drvdata(dev);
return sysfs_emit(buf, "%s\n", ufschd_ufs_dev_pwr_mode_to_string( return sysfs_emit(buf, "%s\n", ufshcd_ufs_dev_pwr_mode_to_string(
ufs_pm_lvl_states[hba->rpm_lvl].dev_state)); ufs_pm_lvl_states[hba->rpm_lvl].dev_state));
} }
...@@ -90,7 +90,7 @@ static ssize_t rpm_target_link_state_show(struct device *dev, ...@@ -90,7 +90,7 @@ static ssize_t rpm_target_link_state_show(struct device *dev,
{ {
struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_hba *hba = dev_get_drvdata(dev);
return sysfs_emit(buf, "%s\n", ufschd_uic_link_state_to_string( return sysfs_emit(buf, "%s\n", ufshcd_uic_link_state_to_string(
ufs_pm_lvl_states[hba->rpm_lvl].link_state)); ufs_pm_lvl_states[hba->rpm_lvl].link_state));
} }
...@@ -113,7 +113,7 @@ static ssize_t spm_target_dev_state_show(struct device *dev, ...@@ -113,7 +113,7 @@ static ssize_t spm_target_dev_state_show(struct device *dev,
{ {
struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_hba *hba = dev_get_drvdata(dev);
return sysfs_emit(buf, "%s\n", ufschd_ufs_dev_pwr_mode_to_string( return sysfs_emit(buf, "%s\n", ufshcd_ufs_dev_pwr_mode_to_string(
ufs_pm_lvl_states[hba->spm_lvl].dev_state)); ufs_pm_lvl_states[hba->spm_lvl].dev_state));
} }
...@@ -122,7 +122,7 @@ static ssize_t spm_target_link_state_show(struct device *dev, ...@@ -122,7 +122,7 @@ static ssize_t spm_target_link_state_show(struct device *dev,
{ {
struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_hba *hba = dev_get_drvdata(dev);
return sysfs_emit(buf, "%s\n", ufschd_uic_link_state_to_string( return sysfs_emit(buf, "%s\n", ufshcd_uic_link_state_to_string(
ufs_pm_lvl_states[hba->spm_lvl].link_state)); ufs_pm_lvl_states[hba->spm_lvl].link_state));
} }
......
...@@ -8593,7 +8593,7 @@ static void ufshcd_vreg_set_lpm(struct ufs_hba *hba) ...@@ -8593,7 +8593,7 @@ static void ufshcd_vreg_set_lpm(struct ufs_hba *hba)
} else if (!ufshcd_is_ufs_dev_active(hba)) { } else if (!ufshcd_is_ufs_dev_active(hba)) {
ufshcd_toggle_vreg(hba->dev, hba->vreg_info.vcc, false); ufshcd_toggle_vreg(hba->dev, hba->vreg_info.vcc, false);
vcc_off = true; vcc_off = true;
if (!ufshcd_is_link_active(hba)) { if (ufshcd_is_link_hibern8(hba) || ufshcd_is_link_off(hba)) {
ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq); ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq);
ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq2); ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq2);
} }
...@@ -8615,7 +8615,7 @@ static int ufshcd_vreg_set_hpm(struct ufs_hba *hba) ...@@ -8615,7 +8615,7 @@ static int ufshcd_vreg_set_hpm(struct ufs_hba *hba)
!hba->dev_info.is_lu_power_on_wp) { !hba->dev_info.is_lu_power_on_wp) {
ret = ufshcd_setup_vreg(hba, true); ret = ufshcd_setup_vreg(hba, true);
} else if (!ufshcd_is_ufs_dev_active(hba)) { } else if (!ufshcd_is_ufs_dev_active(hba)) {
if (!ret && !ufshcd_is_link_active(hba)) { if (!ufshcd_is_link_active(hba)) {
ret = ufshcd_config_vreg_hpm(hba, hba->vreg_info.vccq); ret = ufshcd_config_vreg_hpm(hba, hba->vreg_info.vccq);
if (ret) if (ret)
goto vcc_disable; goto vcc_disable;
...@@ -8975,10 +8975,13 @@ int ufshcd_system_suspend(struct ufs_hba *hba) ...@@ -8975,10 +8975,13 @@ int ufshcd_system_suspend(struct ufs_hba *hba)
if (!hba->is_powered) if (!hba->is_powered)
return 0; return 0;
cancel_delayed_work_sync(&hba->rpm_dev_flush_recheck_work);
if ((ufs_get_pm_lvl_to_dev_pwr_mode(hba->spm_lvl) == if ((ufs_get_pm_lvl_to_dev_pwr_mode(hba->spm_lvl) ==
hba->curr_dev_pwr_mode) && hba->curr_dev_pwr_mode) &&
(ufs_get_pm_lvl_to_link_pwr_state(hba->spm_lvl) == (ufs_get_pm_lvl_to_link_pwr_state(hba->spm_lvl) ==
hba->uic_link_state) && hba->uic_link_state) &&
pm_runtime_suspended(hba->dev) &&
!hba->dev_info.b_rpm_dev_flush_capable) !hba->dev_info.b_rpm_dev_flush_capable)
goto out; goto out;
......
...@@ -1413,7 +1413,7 @@ static int tcmu_run_tmr_queue(struct tcmu_dev *udev) ...@@ -1413,7 +1413,7 @@ static int tcmu_run_tmr_queue(struct tcmu_dev *udev)
return 1; return 1;
} }
static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) static bool tcmu_handle_completions(struct tcmu_dev *udev)
{ {
struct tcmu_mailbox *mb; struct tcmu_mailbox *mb;
struct tcmu_cmd *cmd; struct tcmu_cmd *cmd;
...@@ -1456,7 +1456,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) ...@@ -1456,7 +1456,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
pr_err("cmd_id %u not found, ring is broken\n", pr_err("cmd_id %u not found, ring is broken\n",
entry->hdr.cmd_id); entry->hdr.cmd_id);
set_bit(TCMU_DEV_BIT_BROKEN, &udev->flags); set_bit(TCMU_DEV_BIT_BROKEN, &udev->flags);
break; return false;
} }
tcmu_handle_completion(cmd, entry); tcmu_handle_completion(cmd, entry);
......
...@@ -313,12 +313,12 @@ struct blk_mq_ops { ...@@ -313,12 +313,12 @@ struct blk_mq_ops {
*/ */
void (*put_budget)(struct request_queue *, int); void (*put_budget)(struct request_queue *, int);
/* /**
* @set_rq_budget_toekn: store rq's budget token * @set_rq_budget_token: store rq's budget token
*/ */
void (*set_rq_budget_token)(struct request *, int); void (*set_rq_budget_token)(struct request *, int);
/* /**
* @get_rq_budget_toekn: retrieve rq's budget token * @get_rq_budget_token: retrieve rq's budget token
*/ */
int (*get_rq_budget_token)(struct request *); int (*get_rq_budget_token)(struct request *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册