Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
2441500a
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2441500a
编写于
9月 07, 2017
作者:
J
James Bottomley
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fixes' into misc
上级
a45a1f36
e6f77540
变更
27
隐藏空白更改
内联
并排
Showing
27 changed file
with
178 addition
and
258 deletion
+178
-258
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+11
-0
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aachba.c
+32
-38
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/aacraid.h
+1
-1
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+15
-53
drivers/scsi/bnx2fc/bnx2fc_hwi.c
drivers/scsi/bnx2fc/bnx2fc_hwi.c
+23
-22
drivers/scsi/bnx2i/bnx2i_init.c
drivers/scsi/bnx2i/bnx2i_init.c
+15
-49
drivers/scsi/csiostor/csio_hw.c
drivers/scsi/csiostor/csio_hw.c
+3
-1
drivers/scsi/csiostor/csio_init.c
drivers/scsi/csiostor/csio_init.c
+8
-4
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+3
-0
drivers/scsi/ipr.c
drivers/scsi/ipr.c
+20
-14
drivers/scsi/ipr.h
drivers/scsi/ipr.h
+2
-0
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/megaraid/megaraid_sas_base.c
+1
-1
drivers/scsi/qedf/qedf.h
drivers/scsi/qedf/qedf.h
+2
-1
drivers/scsi/qedf/qedf_els.c
drivers/scsi/qedf/qedf_els.c
+8
-6
drivers/scsi/qedf/qedf_main.c
drivers/scsi/qedf/qedf_main.c
+9
-11
drivers/scsi/qedi/qedi_main.c
drivers/scsi/qedi/qedi_main.c
+1
-1
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_attr.c
+4
-4
drivers/scsi/qla2xxx/qla_tmpl.c
drivers/scsi/qla2xxx/qla_tmpl.c
+0
-12
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+4
-0
drivers/scsi/sd.c
drivers/scsi/sd.c
+3
-0
drivers/scsi/sd_zbc.c
drivers/scsi/sd_zbc.c
+5
-4
drivers/scsi/ses.c
drivers/scsi/ses.c
+1
-1
drivers/scsi/sg.c
drivers/scsi/sg.c
+2
-31
drivers/scsi/st.c
drivers/scsi/st.c
+2
-2
drivers/scsi/storvsc_drv.c
drivers/scsi/storvsc_drv.c
+2
-0
include/linux/cpuhotplug.h
include/linux/cpuhotplug.h
+0
-2
include/scsi/scsi_cmnd.h
include/scsi/scsi_cmnd.h
+1
-0
未找到文件。
drivers/scsi/Kconfig
浏览文件 @
2441500a
...
...
@@ -47,6 +47,17 @@ config SCSI_NETLINK
default n
depends on NET
config SCSI_MQ_DEFAULT
bool "SCSI: use blk-mq I/O path by default"
depends on SCSI
---help---
This option enables the new blk-mq based I/O path for SCSI
devices by default. With the option the scsi_mod.use_blk_mq
module/boot option defaults to Y, without it to N, but it can
still be overridden either way.
If unsure say N.
config SCSI_PROC_FS
bool "legacy /proc/scsi/ support"
depends on SCSI && PROC_FS
...
...
drivers/scsi/aacraid/aachba.c
浏览文件 @
2441500a
...
...
@@ -549,7 +549,9 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
if
((
le32_to_cpu
(
get_name_reply
->
status
)
==
CT_OK
)
&&
(
get_name_reply
->
data
[
0
]
!=
'\0'
))
{
char
*
sp
=
get_name_reply
->
data
;
sp
[
sizeof
(((
struct
aac_get_name_resp
*
)
NULL
)
->
data
)]
=
'\0'
;
int
data_size
=
FIELD_SIZEOF
(
struct
aac_get_name_resp
,
data
);
sp
[
data_size
-
1
]
=
'\0'
;
while
(
*
sp
==
' '
)
++
sp
;
if
(
*
sp
)
{
...
...
@@ -579,21 +581,25 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
static
int
aac_get_container_name
(
struct
scsi_cmnd
*
scsicmd
)
{
int
status
;
int
data_size
;
struct
aac_get_name
*
dinfo
;
struct
fib
*
cmd_fibcontext
;
struct
aac_dev
*
dev
;
dev
=
(
struct
aac_dev
*
)
scsicmd
->
device
->
host
->
hostdata
;
data_size
=
FIELD_SIZEOF
(
struct
aac_get_name_resp
,
data
);
cmd_fibcontext
=
aac_fib_alloc_tag
(
dev
,
scsicmd
);
aac_fib_init
(
cmd_fibcontext
);
dinfo
=
(
struct
aac_get_name
*
)
fib_data
(
cmd_fibcontext
);
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
dinfo
->
command
=
cpu_to_le32
(
VM_ContainerConfig
);
dinfo
->
type
=
cpu_to_le32
(
CT_READ_NAME
);
dinfo
->
cid
=
cpu_to_le32
(
scmd_id
(
scsicmd
));
dinfo
->
count
=
cpu_to_le32
(
sizeof
(((
struct
aac_get_name_resp
*
)
NULL
)
->
data
)
);
dinfo
->
count
=
cpu_to_le32
(
data_size
-
1
);
status
=
aac_fib_send
(
ContainerCommand
,
cmd_fibcontext
,
...
...
@@ -606,10 +612,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_get_container_name: aac_fib_send failed with status: %d.
\n
"
,
status
);
aac_fib_complete
(
cmd_fibcontext
);
...
...
@@ -720,6 +724,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
dinfo
->
count
=
cpu_to_le32
(
scmd_id
(
scsicmd
));
dinfo
->
type
=
cpu_to_le32
(
FT_FILESYS
);
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_fib_send
(
ContainerCommand
,
fibptr
,
...
...
@@ -731,9 +736,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
else
if
(
status
<
0
)
{
if
(
status
<
0
&&
status
!=
-
EINPROGRESS
)
{
/* Inherit results from VM_NameServe, if any */
dresp
->
status
=
cpu_to_le32
(
ST_OK
);
_aac_probe_container2
(
context
,
fibptr
);
...
...
@@ -761,6 +764,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
dinfo
->
count
=
cpu_to_le32
(
scmd_id
(
scsicmd
));
dinfo
->
type
=
cpu_to_le32
(
FT_FILESYS
);
scsicmd
->
SCp
.
ptr
=
(
char
*
)
callback
;
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_fib_send
(
ContainerCommand
,
fibptr
,
...
...
@@ -772,10 +776,9 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
if
(
status
<
0
)
{
scsicmd
->
SCp
.
ptr
=
NULL
;
aac_fib_complete
(
fibptr
);
...
...
@@ -1121,6 +1124,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
dinfo
->
command
=
cpu_to_le32
(
VM_ContainerConfig
);
dinfo
->
type
=
cpu_to_le32
(
CT_CID_TO_32BITS_UID
);
dinfo
->
cid
=
cpu_to_le32
(
scmd_id
(
scsicmd
));
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_fib_send
(
ContainerCommand
,
cmd_fibcontext
,
...
...
@@ -1133,10 +1137,8 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_get_container_serial: aac_fib_send failed with status: %d.
\n
"
,
status
);
aac_fib_complete
(
cmd_fibcontext
);
...
...
@@ -2330,16 +2332,14 @@ static int aac_read(struct scsi_cmnd * scsicmd)
* Alocate and initialize a Fib
*/
cmd_fibcontext
=
aac_fib_alloc_tag
(
dev
,
scsicmd
);
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_adapter_read
(
cmd_fibcontext
,
scsicmd
,
lba
,
count
);
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_read: aac_fib_send failed with status: %d.
\n
"
,
status
);
/*
...
...
@@ -2424,16 +2424,14 @@ static int aac_write(struct scsi_cmnd * scsicmd)
* Allocate and initialize a Fib then setup a BlockWrite command
*/
cmd_fibcontext
=
aac_fib_alloc_tag
(
dev
,
scsicmd
);
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_adapter_write
(
cmd_fibcontext
,
scsicmd
,
lba
,
count
,
fua
);
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_write: aac_fib_send failed with status: %d
\n
"
,
status
);
/*
...
...
@@ -2583,6 +2581,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
synchronizecmd
->
cid
=
cpu_to_le32
(
scmd_id
(
scsicmd
));
synchronizecmd
->
count
=
cpu_to_le32
(
sizeof
(((
struct
aac_synchronize_reply
*
)
NULL
)
->
data
));
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
/*
* Now send the Fib to the adapter
...
...
@@ -2598,10 +2597,8 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_synchronize: aac_fib_send failed with status: %d.
\n
"
,
status
);
...
...
@@ -2661,6 +2658,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
pmcmd
->
cid
=
cpu_to_le32
(
sdev_id
(
sdev
));
pmcmd
->
parm
=
(
scsicmd
->
cmnd
[
1
]
&
1
)
?
cpu_to_le32
(
CT_PM_UNIT_IMMEDIATE
)
:
0
;
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
/*
* Now send the Fib to the adapter
...
...
@@ -2676,10 +2674,8 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
aac_fib_complete
(
cmd_fibcontext
);
aac_fib_free
(
cmd_fibcontext
);
...
...
@@ -3198,10 +3194,11 @@ static int query_disk(struct aac_dev *dev, void __user *arg)
return
-
EBUSY
;
if
(
copy_from_user
(
&
qd
,
arg
,
sizeof
(
struct
aac_query_disk
)))
return
-
EFAULT
;
if
(
qd
.
cnum
==
-
1
)
if
(
qd
.
cnum
==
-
1
)
{
if
(
qd
.
id
<
0
||
qd
.
id
>=
dev
->
maximum_num_containers
)
return
-
EINVAL
;
qd
.
cnum
=
qd
.
id
;
else
if
((
qd
.
bus
==
-
1
)
&&
(
qd
.
id
==
-
1
)
&&
(
qd
.
lun
==
-
1
))
{
}
else
if
((
qd
.
bus
==
-
1
)
&&
(
qd
.
id
==
-
1
)
&&
(
qd
.
lun
==
-
1
))
{
if
(
qd
.
cnum
<
0
||
qd
.
cnum
>=
dev
->
maximum_num_containers
)
return
-
EINVAL
;
qd
.
instance
=
dev
->
scsi_host_ptr
->
host_no
;
...
...
@@ -3686,16 +3683,14 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
* Allocate and initialize a Fib then setup a BlockWrite command
*/
cmd_fibcontext
=
aac_fib_alloc_tag
(
dev
,
scsicmd
);
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_adapter_scsi
(
cmd_fibcontext
,
scsicmd
);
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
printk
(
KERN_WARNING
"aac_srb: aac_fib_send failed with status: %d
\n
"
,
status
);
aac_fib_complete
(
cmd_fibcontext
);
...
...
@@ -3733,15 +3728,14 @@ static int aac_send_hba_fib(struct scsi_cmnd *scsicmd)
if
(
!
cmd_fibcontext
)
return
-
1
;
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
status
=
aac_adapter_hba
(
cmd_fibcontext
,
scsicmd
);
/*
* Check that the command queued to the controller
*/
if
(
status
==
-
EINPROGRESS
)
{
scsicmd
->
SCp
.
phase
=
AAC_OWNER_FIRMWARE
;
if
(
status
==
-
EINPROGRESS
)
return
0
;
}
pr_warn
(
"aac_hba_cmd_req: aac_fib_send failed with status: %d
\n
"
,
status
);
...
...
drivers/scsi/aacraid/aacraid.h
浏览文件 @
2441500a
...
...
@@ -2275,7 +2275,7 @@ struct aac_get_name_resp {
__le32
parm3
;
__le32
parm4
;
__le32
parm5
;
u8
data
[
1
6
];
u8
data
[
1
7
];
};
#define CT_CID_TO_32BITS_UID 165
...
...
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
浏览文件 @
2441500a
...
...
@@ -2624,12 +2624,11 @@ static struct fcoe_transport bnx2fc_transport = {
};
/**
* bnx2fc_percpu_thread_create - Create a receive thread for an
* online CPU
* bnx2fc_cpu_online - Create a receive thread for an online CPU
*
* @cpu: cpu index for the online cpu
*/
static
void
bnx2fc_percpu_thread_creat
e
(
unsigned
int
cpu
)
static
int
bnx2fc_cpu_onlin
e
(
unsigned
int
cpu
)
{
struct
bnx2fc_percpu_s
*
p
;
struct
task_struct
*
thread
;
...
...
@@ -2639,15 +2638,17 @@ static void bnx2fc_percpu_thread_create(unsigned int cpu)
thread
=
kthread_create_on_node
(
bnx2fc_percpu_io_thread
,
(
void
*
)
p
,
cpu_to_node
(
cpu
),
"bnx2fc_thread/%d"
,
cpu
);
if
(
IS_ERR
(
thread
))
return
PTR_ERR
(
thread
);
/* bind thread to the cpu */
if
(
likely
(
!
IS_ERR
(
thread
)))
{
kthread_bind
(
thread
,
cpu
);
p
->
iothread
=
thread
;
wake_up_process
(
thread
);
}
kthread_bind
(
thread
,
cpu
);
p
->
iothread
=
thread
;
wake_up_process
(
thread
);
return
0
;
}
static
void
bnx2fc_percpu_thread_destroy
(
unsigned
int
cpu
)
static
int
bnx2fc_cpu_offline
(
unsigned
int
cpu
)
{
struct
bnx2fc_percpu_s
*
p
;
struct
task_struct
*
thread
;
...
...
@@ -2661,7 +2662,6 @@ static void bnx2fc_percpu_thread_destroy(unsigned int cpu)
thread
=
p
->
iothread
;
p
->
iothread
=
NULL
;
/* Free all work in the list */
list_for_each_entry_safe
(
work
,
tmp
,
&
p
->
work_list
,
list
)
{
list_del_init
(
&
work
->
list
);
...
...
@@ -2673,20 +2673,6 @@ static void bnx2fc_percpu_thread_destroy(unsigned int cpu)
if
(
thread
)
kthread_stop
(
thread
);
}
static
int
bnx2fc_cpu_online
(
unsigned
int
cpu
)
{
printk
(
PFX
"CPU %x online: Create Rx thread
\n
"
,
cpu
);
bnx2fc_percpu_thread_create
(
cpu
);
return
0
;
}
static
int
bnx2fc_cpu_dead
(
unsigned
int
cpu
)
{
printk
(
PFX
"CPU %x offline: Remove Rx thread
\n
"
,
cpu
);
bnx2fc_percpu_thread_destroy
(
cpu
);
return
0
;
}
...
...
@@ -2761,30 +2747,16 @@ static int __init bnx2fc_mod_init(void)
spin_lock_init
(
&
p
->
fp_work_lock
);
}
get_online_cpus
();
for_each_online_cpu
(
cpu
)
bnx2fc_percpu_thread_create
(
cpu
);
rc
=
cpuhp_setup_state_nocalls
(
CPUHP_AP_ONLINE_DYN
,
"scsi/bnx2fc:online"
,
bnx2fc_cpu_online
,
NULL
);
rc
=
cpuhp_setup_state
(
CPUHP_AP_ONLINE_DYN
,
"scsi/bnx2fc:online"
,
bnx2fc_cpu_online
,
bnx2fc_cpu_offline
);
if
(
rc
<
0
)
goto
stop_thread
s
;
goto
stop_thread
;
bnx2fc_online_state
=
rc
;
cpuhp_setup_state_nocalls
(
CPUHP_SCSI_BNX2FC_DEAD
,
"scsi/bnx2fc:dead"
,
NULL
,
bnx2fc_cpu_dead
);
put_online_cpus
();
cnic_register_driver
(
CNIC_ULP_FCOE
,
&
bnx2fc_cnic_cb
);
return
0
;
stop_threads:
for_each_online_cpu
(
cpu
)
bnx2fc_percpu_thread_destroy
(
cpu
);
put_online_cpus
();
stop_thread:
kthread_stop
(
l2_thread
);
free_wq:
destroy_workqueue
(
bnx2fc_wq
);
...
...
@@ -2803,7 +2775,6 @@ static void __exit bnx2fc_mod_exit(void)
struct
fcoe_percpu_s
*
bg
;
struct
task_struct
*
l2_thread
;
struct
sk_buff
*
skb
;
unsigned
int
cpu
=
0
;
/*
* NOTE: Since cnic calls register_driver routine rtnl_lock,
...
...
@@ -2844,16 +2815,7 @@ static void __exit bnx2fc_mod_exit(void)
if
(
l2_thread
)
kthread_stop
(
l2_thread
);
get_online_cpus
();
/* Destroy per cpu threads */
for_each_online_cpu
(
cpu
)
{
bnx2fc_percpu_thread_destroy
(
cpu
);
}
cpuhp_remove_state_nocalls
(
bnx2fc_online_state
);
cpuhp_remove_state_nocalls
(
CPUHP_SCSI_BNX2FC_DEAD
);
put_online_cpus
();
cpuhp_remove_state
(
bnx2fc_online_state
);
destroy_workqueue
(
bnx2fc_wq
);
/*
...
...
drivers/scsi/bnx2fc/bnx2fc_hwi.c
浏览文件 @
2441500a
...
...
@@ -1008,6 +1008,28 @@ static struct bnx2fc_work *bnx2fc_alloc_work(struct bnx2fc_rport *tgt, u16 wqe)
return
work
;
}
/* Pending work request completion */
static
void
bnx2fc_pending_work
(
struct
bnx2fc_rport
*
tgt
,
unsigned
int
wqe
)
{
unsigned
int
cpu
=
wqe
%
num_possible_cpus
();
struct
bnx2fc_percpu_s
*
fps
;
struct
bnx2fc_work
*
work
;
fps
=
&
per_cpu
(
bnx2fc_percpu
,
cpu
);
spin_lock_bh
(
&
fps
->
fp_work_lock
);
if
(
fps
->
iothread
)
{
work
=
bnx2fc_alloc_work
(
tgt
,
wqe
);
if
(
work
)
{
list_add_tail
(
&
work
->
list
,
&
fps
->
work_list
);
wake_up_process
(
fps
->
iothread
);
spin_unlock_bh
(
&
fps
->
fp_work_lock
);
return
;
}
}
spin_unlock_bh
(
&
fps
->
fp_work_lock
);
bnx2fc_process_cq_compl
(
tgt
,
wqe
);
}
int
bnx2fc_process_new_cqes
(
struct
bnx2fc_rport
*
tgt
)
{
struct
fcoe_cqe
*
cq
;
...
...
@@ -1042,28 +1064,7 @@ int bnx2fc_process_new_cqes(struct bnx2fc_rport *tgt)
/* Unsolicited event notification */
bnx2fc_process_unsol_compl
(
tgt
,
wqe
);
}
else
{
/* Pending work request completion */
struct
bnx2fc_work
*
work
=
NULL
;
struct
bnx2fc_percpu_s
*
fps
=
NULL
;
unsigned
int
cpu
=
wqe
%
num_possible_cpus
();
fps
=
&
per_cpu
(
bnx2fc_percpu
,
cpu
);
spin_lock_bh
(
&
fps
->
fp_work_lock
);
if
(
unlikely
(
!
fps
->
iothread
))
goto
unlock
;
work
=
bnx2fc_alloc_work
(
tgt
,
wqe
);
if
(
work
)
list_add_tail
(
&
work
->
list
,
&
fps
->
work_list
);
unlock:
spin_unlock_bh
(
&
fps
->
fp_work_lock
);
/* Pending work request completion */
if
(
fps
->
iothread
&&
work
)
wake_up_process
(
fps
->
iothread
);
else
bnx2fc_process_cq_compl
(
tgt
,
wqe
);
bnx2fc_pending_work
(
tgt
,
wqe
);
num_free_sqes
++
;
}
cqe
++
;
...
...
drivers/scsi/bnx2i/bnx2i_init.c
浏览文件 @
2441500a
...
...
@@ -404,12 +404,11 @@ int bnx2i_get_stats(void *handle)
/**
* bnx2i_percpu_thread_create - Create a receive thread for an
* online CPU
* bnx2i_cpu_online - Create a receive thread for an online CPU
*
* @cpu: cpu index for the online cpu
*/
static
void
bnx2i_percpu_thread_creat
e
(
unsigned
int
cpu
)
static
int
bnx2i_cpu_onlin
e
(
unsigned
int
cpu
)
{
struct
bnx2i_percpu_s
*
p
;
struct
task_struct
*
thread
;
...
...
@@ -419,16 +418,17 @@ static void bnx2i_percpu_thread_create(unsigned int cpu)
thread
=
kthread_create_on_node
(
bnx2i_percpu_io_thread
,
(
void
*
)
p
,
cpu_to_node
(
cpu
),
"bnx2i_thread/%d"
,
cpu
);
if
(
IS_ERR
(
thread
))
return
PTR_ERR
(
thread
);
/* bind thread to the cpu */
if
(
likely
(
!
IS_ERR
(
thread
)))
{
kthread_bind
(
thread
,
cpu
);
p
->
iothread
=
thread
;
wake_up_process
(
thread
);
}
kthread_bind
(
thread
,
cpu
);
p
->
iothread
=
thread
;
wake_up_process
(
thread
);
return
0
;
}
static
void
bnx2i_percpu_thread_destroy
(
unsigned
int
cpu
)
static
int
bnx2i_cpu_offline
(
unsigned
int
cpu
)
{
struct
bnx2i_percpu_s
*
p
;
struct
task_struct
*
thread
;
...
...
@@ -451,19 +451,6 @@ static void bnx2i_percpu_thread_destroy(unsigned int cpu)
spin_unlock_bh
(
&
p
->
p_work_lock
);
if
(
thread
)
kthread_stop
(
thread
);
}
static
int
bnx2i_cpu_online
(
unsigned
int
cpu
)
{
pr_info
(
"bnx2i: CPU %x online: Create Rx thread
\n
"
,
cpu
);
bnx2i_percpu_thread_create
(
cpu
);
return
0
;
}
static
int
bnx2i_cpu_dead
(
unsigned
int
cpu
)
{
pr_info
(
"CPU %x offline: Remove Rx thread
\n
"
,
cpu
);
bnx2i_percpu_thread_destroy
(
cpu
);
return
0
;
}
...
...
@@ -511,27 +498,14 @@ static int __init bnx2i_mod_init(void)
p
->
iothread
=
NULL
;
}
get_online_cpus
();
for_each_online_cpu
(
cpu
)
bnx2i_percpu_thread_create
(
cpu
);
err
=
cpuhp_setup_state_nocalls
(
CPUHP_AP_ONLINE_DYN
,
"scsi/bnx2i:online"
,
bnx2i_cpu_online
,
NULL
);
err
=
cpuhp_setup_state
(
CPUHP_AP_ONLINE_DYN
,
"scsi/bnx2i:online"
,
bnx2i_cpu_online
,
bnx2i_cpu_offline
);
if
(
err
<
0
)
goto
remove_threads
;
goto
unreg_driver
;
bnx2i_online_state
=
err
;
cpuhp_setup_state_nocalls
(
CPUHP_SCSI_BNX2I_DEAD
,
"scsi/bnx2i:dead"
,
NULL
,
bnx2i_cpu_dead
);
put_online_cpus
();
return
0
;
remove_threads:
for_each_online_cpu
(
cpu
)
bnx2i_percpu_thread_destroy
(
cpu
);
put_online_cpus
();
unreg_driver:
cnic_unregister_driver
(
CNIC_ULP_ISCSI
);
unreg_xport:
iscsi_unregister_transport
(
&
bnx2i_iscsi_transport
);
...
...
@@ -551,7 +525,6 @@ static int __init bnx2i_mod_init(void)
static
void
__exit
bnx2i_mod_exit
(
void
)
{
struct
bnx2i_hba
*
hba
;
unsigned
cpu
=
0
;
mutex_lock
(
&
bnx2i_dev_lock
);
while
(
!
list_empty
(
&
adapter_list
))
{
...
...
@@ -569,14 +542,7 @@ static void __exit bnx2i_mod_exit(void)
}
mutex_unlock
(
&
bnx2i_dev_lock
);
get_online_cpus
();
for_each_online_cpu
(
cpu
)
bnx2i_percpu_thread_destroy
(
cpu
);
cpuhp_remove_state_nocalls
(
bnx2i_online_state
);
cpuhp_remove_state_nocalls
(
CPUHP_SCSI_BNX2I_DEAD
);
put_online_cpus
();
cpuhp_remove_state
(
bnx2i_online_state
);
iscsi_unregister_transport
(
&
bnx2i_iscsi_transport
);
cnic_unregister_driver
(
CNIC_ULP_ISCSI
);
...
...
drivers/scsi/csiostor/csio_hw.c
浏览文件 @
2441500a
...
...
@@ -3845,8 +3845,10 @@ csio_hw_start(struct csio_hw *hw)
if
(
csio_is_hw_ready
(
hw
))
return
0
;
else
else
if
(
csio_match_state
(
hw
,
csio_hws_uninit
))
return
-
EINVAL
;
else
return
-
ENODEV
;
}
int
...
...
drivers/scsi/csiostor/csio_init.c
浏览文件 @
2441500a
...
...
@@ -970,10 +970,14 @@ static int csio_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
pci_set_drvdata
(
pdev
,
hw
);
if
(
csio_hw_start
(
hw
)
!=
0
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to start FW, continuing in debug mode.
\n
"
);
return
0
;
rv
=
csio_hw_start
(
hw
);
if
(
rv
)
{
if
(
rv
==
-
EINVAL
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to start FW, continuing in debug mode.
\n
"
);
return
0
;
}
goto
err_lnode_exit
;
}
sprintf
(
hw
->
fwrev_str
,
"%u.%u.%u.%u
\n
"
,
...
...
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
浏览文件 @
2441500a
...
...
@@ -1635,6 +1635,9 @@ static int init_act_open(struct cxgbi_sock *csk)
goto
rel_resource
;
}
if
(
!
(
n
->
nud_state
&
NUD_VALID
))
neigh_event_send
(
n
,
NULL
);
csk
->
atid
=
cxgb4_alloc_atid
(
lldi
->
tids
,
csk
);
if
(
csk
->
atid
<
0
)
{
pr_err
(
"%s, NO atid available.
\n
"
,
ndev
->
name
);
...
...
drivers/scsi/ipr.c
浏览文件 @
2441500a
...
...
@@ -3351,6 +3351,16 @@ static void ipr_worker_thread(struct work_struct *work)
return
;
}
if
(
ioa_cfg
->
scsi_unblock
)
{
ioa_cfg
->
scsi_unblock
=
0
;
ioa_cfg
->
scsi_blocked
=
0
;
spin_unlock_irqrestore
(
ioa_cfg
->
host
->
host_lock
,
lock_flags
);
scsi_unblock_requests
(
ioa_cfg
->
host
);
spin_lock_irqsave
(
ioa_cfg
->
host
->
host_lock
,
lock_flags
);
if
(
ioa_cfg
->
scsi_blocked
)
scsi_block_requests
(
ioa_cfg
->
host
);
}
if
(
!
ioa_cfg
->
scan_enabled
)
{
spin_unlock_irqrestore
(
ioa_cfg
->
host
->
host_lock
,
lock_flags
);
return
;
...
...
@@ -4935,6 +4945,7 @@ static int ipr_slave_configure(struct scsi_device *sdev)
}
if
(
ipr_is_vset_device
(
res
))
{
sdev
->
scsi_level
=
SCSI_SPC_3
;
sdev
->
no_report_opcodes
=
1
;
blk_queue_rq_timeout
(
sdev
->
request_queue
,
IPR_VSET_RW_TIMEOUT
);
blk_queue_max_hw_sectors
(
sdev
->
request_queue
,
IPR_VSET_MAX_SECTORS
);
...
...
@@ -7211,9 +7222,8 @@ static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
ENTER
;
if
(
!
ioa_cfg
->
hrrq
[
IPR_INIT_HRRQ
].
removing_ioa
)
{
ipr_trace
;
spin_unlock_irq
(
ioa_cfg
->
host
->
host_lock
);
scsi_unblock_requests
(
ioa_cfg
->
host
);
spin_lock_irq
(
ioa_cfg
->
host
->
host_lock
);
ioa_cfg
->
scsi_unblock
=
1
;
schedule_work
(
&
ioa_cfg
->
work_q
);
}
ioa_cfg
->
in_reset_reload
=
0
;
...
...
@@ -7287,13 +7297,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
list_add_tail
(
&
ipr_cmd
->
queue
,
&
ipr_cmd
->
hrrq
->
hrrq_free_q
);
wake_up_all
(
&
ioa_cfg
->
reset_wait_q
);
spin_unlock
(
ioa_cfg
->
host
->
host_lock
);
scsi_unblock_requests
(
ioa_cfg
->
host
);
spin_lock
(
ioa_cfg
->
host
->
host_lock
);
if
(
!
ioa_cfg
->
hrrq
[
IPR_INIT_HRRQ
].
allow_cmds
)
scsi_block_requests
(
ioa_cfg
->
host
);
ioa_cfg
->
scsi_unblock
=
1
;
schedule_work
(
&
ioa_cfg
->
work_q
);
LEAVE
;
return
IPR_RC_JOB_RETURN
;
...
...
@@ -9249,8 +9253,11 @@ static void _ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
spin_unlock
(
&
ioa_cfg
->
hrrq
[
i
].
_lock
);
}
wmb
();
if
(
!
ioa_cfg
->
hrrq
[
IPR_INIT_HRRQ
].
removing_ioa
)
if
(
!
ioa_cfg
->
hrrq
[
IPR_INIT_HRRQ
].
removing_ioa
)
{
ioa_cfg
->
scsi_unblock
=
0
;
ioa_cfg
->
scsi_blocked
=
1
;
scsi_block_requests
(
ioa_cfg
->
host
);
}
ipr_cmd
=
ipr_get_free_ipr_cmnd
(
ioa_cfg
);
ioa_cfg
->
reset_cmd
=
ipr_cmd
;
...
...
@@ -9306,9 +9313,8 @@ static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
wake_up_all
(
&
ioa_cfg
->
reset_wait_q
);
if
(
!
ioa_cfg
->
hrrq
[
IPR_INIT_HRRQ
].
removing_ioa
)
{
spin_unlock_irq
(
ioa_cfg
->
host
->
host_lock
);
scsi_unblock_requests
(
ioa_cfg
->
host
);
spin_lock_irq
(
ioa_cfg
->
host
->
host_lock
);
ioa_cfg
->
scsi_unblock
=
1
;
schedule_work
(
&
ioa_cfg
->
work_q
);
}
return
;
}
else
{
...
...
drivers/scsi/ipr.h
浏览文件 @
2441500a
...
...
@@ -1488,6 +1488,8 @@ struct ipr_ioa_cfg {
u8
cfg_locked
:
1
;
u8
clear_isr
:
1
;
u8
probe_done
:
1
;
u8
scsi_unblock
:
1
;
u8
scsi_blocked
:
1
;
u8
revid
;
...
...
drivers/scsi/megaraid/megaraid_sas_base.c
浏览文件 @
2441500a
...
...
@@ -6240,8 +6240,8 @@ static int megasas_probe_one(struct pci_dev *pdev,
fail_start_aen:
fail_io_attach:
megasas_mgmt_info
.
count
--
;
megasas_mgmt_info
.
instance
[
megasas_mgmt_info
.
max_index
]
=
NULL
;
megasas_mgmt_info
.
max_index
--
;
megasas_mgmt_info
.
instance
[
megasas_mgmt_info
.
max_index
]
=
NULL
;
instance
->
instancet
->
disable_intr
(
instance
);
megasas_destroy_irqs
(
instance
);
...
...
drivers/scsi/qedf/qedf.h
浏览文件 @
2441500a
...
...
@@ -526,7 +526,8 @@ struct fip_vlan {
#define QEDF_WRITE (1 << 0)
#define MAX_FIBRE_LUNS 0xffffffff
#define QEDF_MAX_NUM_CQS 8
#define MIN_NUM_CPUS_MSIX(x) min_t(u32, x->dev_info.num_cqs, \
num_online_cpus())
/*
* PCI function probe defines
...
...
drivers/scsi/qedf/qedf_els.c
浏览文件 @
2441500a
...
...
@@ -489,7 +489,7 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
/* If a SRR times out, simply free resources */
if
(
srr_req
->
event
==
QEDF_IOREQ_EV_ELS_TMO
)
goto
out_
free
;
goto
out_
put
;
/* Normalize response data into struct fc_frame */
mp_req
=
&
(
srr_req
->
mp_req
);
...
...
@@ -501,7 +501,7 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
if
(
!
fp
)
{
QEDF_ERR
(
&
(
qedf
->
dbg_ctx
),
"fc_frame_alloc failure.
\n
"
);
goto
out_
free
;
goto
out_
put
;
}
/* Copy frame header from firmware into fp */
...
...
@@ -526,9 +526,10 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
}
fc_frame_free
(
fp
);
out_
free
:
out_
put
:
/* Put reference for original command since SRR completed */
kref_put
(
&
orig_io_req
->
refcount
,
qedf_release_cmd
);
out_free:
kfree
(
cb_arg
);
}
...
...
@@ -780,7 +781,7 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
/* If a REC times out, free resources */
if
(
rec_req
->
event
==
QEDF_IOREQ_EV_ELS_TMO
)
goto
out_
free
;
goto
out_
put
;
/* Normalize response data into struct fc_frame */
mp_req
=
&
(
rec_req
->
mp_req
);
...
...
@@ -792,7 +793,7 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
if
(
!
fp
)
{
QEDF_ERR
(
&
(
qedf
->
dbg_ctx
),
"fc_frame_alloc failure.
\n
"
);
goto
out_
free
;
goto
out_
put
;
}
/* Copy frame header from firmware into fp */
...
...
@@ -884,9 +885,10 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
out_free_frame:
fc_frame_free
(
fp
);
out_
free
:
out_
put
:
/* Put reference for original command since REC completed */
kref_put
(
&
orig_io_req
->
refcount
,
qedf_release_cmd
);
out_free:
kfree
(
cb_arg
);
}
...
...
drivers/scsi/qedf/qedf_main.c
浏览文件 @
2441500a
...
...
@@ -2797,11 +2797,9 @@ static int qedf_set_fcoe_pf_param(struct qedf_ctx *qedf)
* we allocation is the minimum off:
*
* Number of CPUs
* Number of MSI-X vectors
* Max number allocated in hardware (QEDF_MAX_NUM_CQS)
* Number allocated by qed for our PCI function
*/
qedf
->
num_queues
=
min
((
unsigned
int
)
QEDF_MAX_NUM_CQS
,
num_online_cpus
());
qedf
->
num_queues
=
MIN_NUM_CPUS_MSIX
(
qedf
);
QEDF_INFO
(
&
(
qedf
->
dbg_ctx
),
QEDF_LOG_DISC
,
"Number of CQs is %d.
\n
"
,
qedf
->
num_queues
);
...
...
@@ -2999,6 +2997,13 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
goto
err1
;
}
/* Learn information crucial for qedf to progress */
rc
=
qed_ops
->
fill_dev_info
(
qedf
->
cdev
,
&
qedf
->
dev_info
);
if
(
rc
)
{
QEDF_ERR
(
&
(
qedf
->
dbg_ctx
),
"Failed to dev info.
\n
"
);
goto
err1
;
}
/* queue allocation code should come here
* order should be
* slowpath_start
...
...
@@ -3014,13 +3019,6 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
}
qed_ops
->
common
->
update_pf_params
(
qedf
->
cdev
,
&
qedf
->
pf_params
);
/* Learn information crucial for qedf to progress */
rc
=
qed_ops
->
fill_dev_info
(
qedf
->
cdev
,
&
qedf
->
dev_info
);
if
(
rc
)
{
QEDF_ERR
(
&
(
qedf
->
dbg_ctx
),
"Failed to dev info.
\n
"
);
goto
err1
;
}
/* Record BDQ producer doorbell addresses */
qedf
->
bdq_primary_prod
=
qedf
->
dev_info
.
primary_dbq_rq_addr
;
qedf
->
bdq_secondary_prod
=
qedf
->
dev_info
.
secondary_bdq_rq_addr
;
...
...
drivers/scsi/qedi/qedi_main.c
浏览文件 @
2441500a
...
...
@@ -1576,7 +1576,7 @@ struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid)
{
struct
qedi_cmd
*
cmd
=
NULL
;
if
(
tid
>
MAX_ISCSI_TASK_ENTRIES
)
if
(
tid
>
=
MAX_ISCSI_TASK_ENTRIES
)
return
NULL
;
cmd
=
qedi
->
itt_map
[
tid
].
p_cmd
;
...
...
drivers/scsi/qla2xxx/qla_attr.c
浏览文件 @
2441500a
...
...
@@ -318,6 +318,8 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
return
-
EINVAL
;
if
(
start
>
ha
->
optrom_size
)
return
-
EINVAL
;
if
(
size
>
ha
->
optrom_size
-
start
)
size
=
ha
->
optrom_size
-
start
;
mutex_lock
(
&
ha
->
optrom_mutex
);
switch
(
val
)
{
...
...
@@ -343,8 +345,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
}
ha
->
optrom_region_start
=
start
;
ha
->
optrom_region_size
=
start
+
size
>
ha
->
optrom_size
?
ha
->
optrom_size
-
start
:
size
;
ha
->
optrom_region_size
=
start
+
size
;
ha
->
optrom_state
=
QLA_SREADING
;
ha
->
optrom_buffer
=
vmalloc
(
ha
->
optrom_region_size
);
...
...
@@ -417,8 +418,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
}
ha
->
optrom_region_start
=
start
;
ha
->
optrom_region_size
=
start
+
size
>
ha
->
optrom_size
?
ha
->
optrom_size
-
start
:
size
;
ha
->
optrom_region_size
=
start
+
size
;
ha
->
optrom_state
=
QLA_SWRITING
;
ha
->
optrom_buffer
=
vmalloc
(
ha
->
optrom_region_size
);
...
...
drivers/scsi/qla2xxx/qla_tmpl.c
浏览文件 @
2441500a
...
...
@@ -401,9 +401,6 @@ qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha,
for
(
i
=
0
;
i
<
vha
->
hw
->
max_req_queues
;
i
++
)
{
struct
req_que
*
req
=
vha
->
hw
->
req_q_map
[
i
];
if
(
!
test_bit
(
i
,
vha
->
hw
->
req_qid_map
))
continue
;
if
(
req
||
!
buf
)
{
length
=
req
?
req
->
length
:
REQUEST_ENTRY_CNT_24XX
;
...
...
@@ -418,9 +415,6 @@ qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha,
for
(
i
=
0
;
i
<
vha
->
hw
->
max_rsp_queues
;
i
++
)
{
struct
rsp_que
*
rsp
=
vha
->
hw
->
rsp_q_map
[
i
];
if
(
!
test_bit
(
i
,
vha
->
hw
->
rsp_qid_map
))
continue
;
if
(
rsp
||
!
buf
)
{
length
=
rsp
?
rsp
->
length
:
RESPONSE_ENTRY_CNT_MQ
;
...
...
@@ -664,9 +658,6 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha,
for
(
i
=
0
;
i
<
vha
->
hw
->
max_req_queues
;
i
++
)
{
struct
req_que
*
req
=
vha
->
hw
->
req_q_map
[
i
];
if
(
!
test_bit
(
i
,
vha
->
hw
->
req_qid_map
))
continue
;
if
(
req
||
!
buf
)
{
qla27xx_insert16
(
i
,
buf
,
len
);
qla27xx_insert16
(
1
,
buf
,
len
);
...
...
@@ -679,9 +670,6 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha,
for
(
i
=
0
;
i
<
vha
->
hw
->
max_rsp_queues
;
i
++
)
{
struct
rsp_que
*
rsp
=
vha
->
hw
->
rsp_q_map
[
i
];
if
(
!
test_bit
(
i
,
vha
->
hw
->
rsp_qid_map
))
continue
;
if
(
rsp
||
!
buf
)
{
qla27xx_insert16
(
i
,
buf
,
len
);
qla27xx_insert16
(
1
,
buf
,
len
);
...
...
drivers/scsi/scsi.c
浏览文件 @
2441500a
...
...
@@ -780,7 +780,11 @@ MODULE_LICENSE("GPL");
module_param
(
scsi_logging_level
,
int
,
S_IRUGO
|
S_IWUSR
);
MODULE_PARM_DESC
(
scsi_logging_level
,
"a bit mask of logging levels"
);
#ifdef CONFIG_SCSI_MQ_DEFAULT
bool
scsi_use_blk_mq
=
true
;
#else
bool
scsi_use_blk_mq
=
false
;
#endif
module_param_named
(
use_blk_mq
,
scsi_use_blk_mq
,
bool
,
S_IWUSR
|
S_IRUGO
);
static
int
__init
init_scsi
(
void
)
...
...
drivers/scsi/sd.c
浏览文件 @
2441500a
...
...
@@ -1277,6 +1277,9 @@ static void sd_uninit_command(struct scsi_cmnd *SCpnt)
{
struct
request
*
rq
=
SCpnt
->
request
;
if
(
SCpnt
->
flags
&
SCMD_ZONE_WRITE_LOCK
)
sd_zbc_write_unlock_zone
(
SCpnt
);
if
(
rq
->
rq_flags
&
RQF_SPECIAL_PAYLOAD
)
__free_page
(
rq
->
special_vec
.
bv_page
);
...
...
drivers/scsi/sd_zbc.c
浏览文件 @
2441500a
...
...
@@ -294,6 +294,9 @@ int sd_zbc_write_lock_zone(struct scsi_cmnd *cmd)
test_and_set_bit
(
zno
,
sdkp
->
zones_wlock
))
return
BLKPREP_DEFER
;
WARN_ON_ONCE
(
cmd
->
flags
&
SCMD_ZONE_WRITE_LOCK
);
cmd
->
flags
|=
SCMD_ZONE_WRITE_LOCK
;
return
BLKPREP_OK
;
}
...
...
@@ -302,9 +305,10 @@ void sd_zbc_write_unlock_zone(struct scsi_cmnd *cmd)
struct
request
*
rq
=
cmd
->
request
;
struct
scsi_disk
*
sdkp
=
scsi_disk
(
rq
->
rq_disk
);
if
(
sdkp
->
zones_wlock
)
{
if
(
sdkp
->
zones_wlock
&&
cmd
->
flags
&
SCMD_ZONE_WRITE_LOCK
)
{
unsigned
int
zno
=
sd_zbc_zone_no
(
sdkp
,
blk_rq_pos
(
rq
));
WARN_ON_ONCE
(
!
test_bit
(
zno
,
sdkp
->
zones_wlock
));
cmd
->
flags
&=
~
SCMD_ZONE_WRITE_LOCK
;
clear_bit_unlock
(
zno
,
sdkp
->
zones_wlock
);
smp_mb__after_atomic
();
}
...
...
@@ -335,9 +339,6 @@ void sd_zbc_complete(struct scsi_cmnd *cmd,
case
REQ_OP_WRITE_ZEROES
:
case
REQ_OP_WRITE_SAME
:
/* Unlock the zone */
sd_zbc_write_unlock_zone
(
cmd
);
if
(
result
&&
sshdr
->
sense_key
==
ILLEGAL_REQUEST
&&
sshdr
->
asc
==
0x21
)
...
...
drivers/scsi/ses.c
浏览文件 @
2441500a
...
...
@@ -106,7 +106,7 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
ret
=
scsi_execute_req
(
sdev
,
cmd
,
DMA_FROM_DEVICE
,
buf
,
bufflen
,
NULL
,
SES_TIMEOUT
,
SES_RETRIES
,
NULL
);
if
(
unlikely
(
!
ret
))
if
(
unlikely
(
ret
))
return
ret
;
recv_page_code
=
((
unsigned
char
*
)
buf
)[
0
];
...
...
drivers/scsi/sg.c
浏览文件 @
2441500a
...
...
@@ -751,35 +751,6 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
return
count
;
}
static
bool
sg_is_valid_dxfer
(
sg_io_hdr_t
*
hp
)
{
switch
(
hp
->
dxfer_direction
)
{
case
SG_DXFER_NONE
:
if
(
hp
->
dxferp
||
hp
->
dxfer_len
>
0
)
return
false
;
return
true
;
case
SG_DXFER_FROM_DEV
:
/*
* for SG_DXFER_FROM_DEV we always set dxfer_len to > 0. dxferp
* can either be NULL or != NULL so there's no point in checking
* it either. So just return true.
*/
return
true
;
case
SG_DXFER_TO_DEV
:
case
SG_DXFER_TO_FROM_DEV
:
if
(
!
hp
->
dxferp
||
hp
->
dxfer_len
==
0
)
return
false
;
return
true
;
case
SG_DXFER_UNKNOWN
:
if
((
!
hp
->
dxferp
&&
hp
->
dxfer_len
)
||
(
hp
->
dxferp
&&
hp
->
dxfer_len
==
0
))
return
false
;
return
true
;
default:
return
false
;
}
}
static
int
sg_common_write
(
Sg_fd
*
sfp
,
Sg_request
*
srp
,
unsigned
char
*
cmnd
,
int
timeout
,
int
blocking
)
...
...
@@ -800,7 +771,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
"sg_common_write: scsi opcode=0x%02x, cmd_size=%d
\n
"
,
(
int
)
cmnd
[
0
],
(
int
)
hp
->
cmd_len
));
if
(
!
sg_is_valid_dxfer
(
hp
)
)
if
(
hp
->
dxfer_len
>=
SZ_256M
)
return
-
EINVAL
;
k
=
sg_start_req
(
srp
,
cmnd
);
...
...
@@ -1050,7 +1021,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
read_lock_irqsave
(
&
sfp
->
rq_list_lock
,
iflags
);
val
=
0
;
list_for_each_entry
(
srp
,
&
sfp
->
rq_list
,
entry
)
{
if
(
val
>
SG_MAX_QUEUE
)
if
(
val
>
=
SG_MAX_QUEUE
)
break
;
memset
(
&
rinfo
[
val
],
0
,
SZ_SG_REQ_INFO
);
rinfo
[
val
].
req_state
=
srp
->
done
+
1
;
...
...
drivers/scsi/st.c
浏览文件 @
2441500a
...
...
@@ -4299,11 +4299,11 @@ static int st_probe(struct device *dev)
kref_init
(
&
tpnt
->
kref
);
tpnt
->
disk
=
disk
;
disk
->
private_data
=
&
tpnt
->
driver
;
disk
->
queue
=
SDp
->
request_queue
;
/* SCSI tape doesn't register this gendisk via add_disk(). Manually
* take queue reference that release_disk() expects. */
if
(
!
blk_get_queue
(
disk
->
queue
))
if
(
!
blk_get_queue
(
SDp
->
request_
queue
))
goto
out_put_disk
;
disk
->
queue
=
SDp
->
request_queue
;
tpnt
->
driver
=
&
st_template
;
tpnt
->
device
=
SDp
;
...
...
drivers/scsi/storvsc_drv.c
浏览文件 @
2441500a
...
...
@@ -1640,6 +1640,8 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
put_cpu
();
if
(
ret
==
-
EAGAIN
)
{
if
(
payload_sz
>
sizeof
(
cmd_request
->
mpb
))
kfree
(
payload
);
/* no more space */
return
SCSI_MLQUEUE_DEVICE_BUSY
;
}
...
...
include/linux/cpuhotplug.h
浏览文件 @
2441500a
...
...
@@ -39,8 +39,6 @@ enum cpuhp_state {
CPUHP_PCI_XGENE_DEAD
,
CPUHP_IOMMU_INTEL_DEAD
,
CPUHP_LUSTRE_CFS_DEAD
,
CPUHP_SCSI_BNX2FC_DEAD
,
CPUHP_SCSI_BNX2I_DEAD
,
CPUHP_WORKQUEUE_PREP
,
CPUHP_POWER_NUMA_PREPARE
,
CPUHP_HRTIMERS_PREPARE
,
...
...
include/scsi/scsi_cmnd.h
浏览文件 @
2441500a
...
...
@@ -57,6 +57,7 @@ struct scsi_pointer {
/* for scmd->flags */
#define SCMD_TAGGED (1 << 0)
#define SCMD_UNCHECKED_ISA_DMA (1 << 1)
#define SCMD_ZONE_WRITE_LOCK (1 << 2)
#define SCMD_INITIALIZED (1 << 3)
/* flags preserved across unprep / reprep */
#define SCMD_PRESERVED_FLAGS (SCMD_UNCHECKED_ISA_DMA | SCMD_INITIALIZED)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录