修正为使用信号量.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
cf1b8765bc
commit
7748d464d4
|
@ -340,7 +340,7 @@ struct demo_dev
|
|||
{
|
||||
struct cdev cdev;
|
||||
struct device *dev;
|
||||
rwlock_t demo_rwlock;
|
||||
struct rw_semaphore demo_rwsemp;
|
||||
// This is a test.
|
||||
char demo_text[DEMO_DATA_SIZE];
|
||||
};
|
||||
|
@ -351,7 +351,7 @@ static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, l
|
|||
loff_t p;
|
||||
ssize_t ret = 0;
|
||||
|
||||
read_lock(&devp->demo_rwlock);
|
||||
down_read(&devp->demo_rwsemp);
|
||||
p = *position;
|
||||
|
||||
// This is a test.
|
||||
|
@ -362,13 +362,13 @@ static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, l
|
|||
count = DEMO_DATA_SIZE-p;
|
||||
|
||||
if(copy_to_user((void*)buffer, &devp->demo_text[p], count)) {
|
||||
read_unlock(&devp->demo_rwlock);
|
||||
up_read(&devp->demo_rwsemp);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
else
|
||||
{
|
||||
*position += count;
|
||||
read_unlock(&devp->demo_rwlock);
|
||||
up_read(&devp->demo_rwsemp);
|
||||
ret = count;
|
||||
}
|
||||
return ret;
|
||||
|
@ -380,7 +380,7 @@ static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t c
|
|||
loff_t p;
|
||||
ssize_t ret = 0;
|
||||
|
||||
write_lock(&devp->demo_rwlock);
|
||||
down_write(&devp->demo_rwsemp);
|
||||
p = *position;
|
||||
// This is a test.
|
||||
// 分析和获取有效的写长度
|
||||
|
@ -390,12 +390,12 @@ static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t c
|
|||
count = DEMO_DATA_SIZE-p;
|
||||
|
||||
if(copy_from_user(&devp->demo_text[p], (void*)buffer, count)) {
|
||||
write_unlock(&devp->demo_rwlock);
|
||||
up_write(&devp->demo_rwsemp);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
else {
|
||||
*position += count;
|
||||
write_unlock(&devp->demo_rwlock);
|
||||
up_write(&devp->demo_rwsemp);
|
||||
ret = count;
|
||||
}
|
||||
|
||||
|
@ -426,7 +426,7 @@ static int demo_setup_cdev(struct demo_dev *devp, int index)
|
|||
devp->demo_text[DEMO_DATA_SIZE-1] = 0;
|
||||
sprintf(devp->demo_text, "%d", index);
|
||||
|
||||
rwlock_init(&devp->demo_rwlock);
|
||||
init_rwsem(&devp->demo_rwsemp);
|
||||
return 0;
|
||||
out_cdev:
|
||||
cdev_del(&devp->cdev);
|
||||
|
|
Loading…
Reference in New Issue