Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
abedd296
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
abedd296
编写于
5月 15, 2008
作者:
J
Jonathan Corbet
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lp: cdev lock_kernel() pushdown
Signed-off-by:
N
Jonathan Corbet
<
corbet@lwn.net
>
上级
12ead6b0
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
26 addition
and
12 deletion
+26
-12
drivers/char/lp.c
drivers/char/lp.c
+26
-12
未找到文件。
drivers/char/lp.c
浏览文件 @
abedd296
...
@@ -126,6 +126,7 @@
...
@@ -126,6 +126,7 @@
#include <linux/device.h>
#include <linux/device.h>
#include <linux/wait.h>
#include <linux/wait.h>
#include <linux/jiffies.h>
#include <linux/jiffies.h>
#include <linux/smp_lock.h>
#include <linux/parport.h>
#include <linux/parport.h>
#undef LP_STATS
#undef LP_STATS
...
@@ -489,14 +490,21 @@ static ssize_t lp_read(struct file * file, char __user * buf,
...
@@ -489,14 +490,21 @@ static ssize_t lp_read(struct file * file, char __user * buf,
static
int
lp_open
(
struct
inode
*
inode
,
struct
file
*
file
)
static
int
lp_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
{
unsigned
int
minor
=
iminor
(
inode
);
unsigned
int
minor
=
iminor
(
inode
);
int
ret
=
0
;
if
(
minor
>=
LP_NO
)
lock_kernel
();
return
-
ENXIO
;
if
(
minor
>=
LP_NO
)
{
if
((
LP_F
(
minor
)
&
LP_EXIST
)
==
0
)
ret
=
-
ENXIO
;
return
-
ENXIO
;
goto
out
;
if
(
test_and_set_bit
(
LP_BUSY_BIT_POS
,
&
LP_F
(
minor
)))
}
return
-
EBUSY
;
if
((
LP_F
(
minor
)
&
LP_EXIST
)
==
0
)
{
ret
=
-
ENXIO
;
goto
out
;
}
if
(
test_and_set_bit
(
LP_BUSY_BIT_POS
,
&
LP_F
(
minor
)))
{
ret
=
-
EBUSY
;
goto
out
;
}
/* If ABORTOPEN is set and the printer is offline or out of paper,
/* If ABORTOPEN is set and the printer is offline or out of paper,
we may still want to open it to perform ioctl()s. Therefore we
we may still want to open it to perform ioctl()s. Therefore we
have commandeered O_NONBLOCK, even though it is being used in
have commandeered O_NONBLOCK, even though it is being used in
...
@@ -510,21 +518,25 @@ static int lp_open(struct inode * inode, struct file * file)
...
@@ -510,21 +518,25 @@ static int lp_open(struct inode * inode, struct file * file)
if
(
status
&
LP_POUTPA
)
{
if
(
status
&
LP_POUTPA
)
{
printk
(
KERN_INFO
"lp%d out of paper
\n
"
,
minor
);
printk
(
KERN_INFO
"lp%d out of paper
\n
"
,
minor
);
LP_F
(
minor
)
&=
~
LP_BUSY
;
LP_F
(
minor
)
&=
~
LP_BUSY
;
return
-
ENOSPC
;
ret
=
-
ENOSPC
;
goto
out
;
}
else
if
(
!
(
status
&
LP_PSELECD
))
{
}
else
if
(
!
(
status
&
LP_PSELECD
))
{
printk
(
KERN_INFO
"lp%d off-line
\n
"
,
minor
);
printk
(
KERN_INFO
"lp%d off-line
\n
"
,
minor
);
LP_F
(
minor
)
&=
~
LP_BUSY
;
LP_F
(
minor
)
&=
~
LP_BUSY
;
return
-
EIO
;
ret
=
-
EIO
;
goto
out
;
}
else
if
(
!
(
status
&
LP_PERRORP
))
{
}
else
if
(
!
(
status
&
LP_PERRORP
))
{
printk
(
KERN_ERR
"lp%d printer error
\n
"
,
minor
);
printk
(
KERN_ERR
"lp%d printer error
\n
"
,
minor
);
LP_F
(
minor
)
&=
~
LP_BUSY
;
LP_F
(
minor
)
&=
~
LP_BUSY
;
return
-
EIO
;
ret
=
-
EIO
;
goto
out
;
}
}
}
}
lp_table
[
minor
].
lp_buffer
=
kmalloc
(
LP_BUFFER_SIZE
,
GFP_KERNEL
);
lp_table
[
minor
].
lp_buffer
=
kmalloc
(
LP_BUFFER_SIZE
,
GFP_KERNEL
);
if
(
!
lp_table
[
minor
].
lp_buffer
)
{
if
(
!
lp_table
[
minor
].
lp_buffer
)
{
LP_F
(
minor
)
&=
~
LP_BUSY
;
LP_F
(
minor
)
&=
~
LP_BUSY
;
return
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
out
;
}
}
/* Determine if the peripheral supports ECP mode */
/* Determine if the peripheral supports ECP mode */
lp_claim_parport_or_block
(
&
lp_table
[
minor
]);
lp_claim_parport_or_block
(
&
lp_table
[
minor
]);
...
@@ -540,7 +552,9 @@ static int lp_open(struct inode * inode, struct file * file)
...
@@ -540,7 +552,9 @@ static int lp_open(struct inode * inode, struct file * file)
parport_negotiate
(
lp_table
[
minor
].
dev
->
port
,
IEEE1284_MODE_COMPAT
);
parport_negotiate
(
lp_table
[
minor
].
dev
->
port
,
IEEE1284_MODE_COMPAT
);
lp_release_parport
(
&
lp_table
[
minor
]);
lp_release_parport
(
&
lp_table
[
minor
]);
lp_table
[
minor
].
current_mode
=
IEEE1284_MODE_COMPAT
;
lp_table
[
minor
].
current_mode
=
IEEE1284_MODE_COMPAT
;
return
0
;
out:
unlock_kernel
();
return
ret
;
}
}
static
int
lp_release
(
struct
inode
*
inode
,
struct
file
*
file
)
static
int
lp_release
(
struct
inode
*
inode
,
struct
file
*
file
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录