X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Facpi%2Fsystem.c;h=8925a6ca5f87561707f00b7fd8d2219d1f317b71;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=bee370aed4e1f757b4fd150ce07aca1eb427bc28;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index bee370aed..8925a6ca5 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c @@ -24,6 +24,7 @@ */ #include +#include #include #include @@ -48,36 +49,27 @@ extern FADT_DESCRIPTOR acpi_fadt; -------------------------------------------------------------------------- */ static int -acpi_system_read_info ( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data) +acpi_system_read_info (struct seq_file *seq, void *offset) { - char *p = page; - int size = 0; - ACPI_FUNCTION_TRACE("acpi_system_read_info"); - if (off != 0) - goto end; - - p += sprintf(p, "version: %x\n", ACPI_CA_VERSION); - -end: - size = (p - page); - if (size <= off+count) *eof = 1; - *start = page + off; - size -= off; - if (size>count) size = count; - if (size<0) size = 0; + seq_printf(seq, "version: %x\n", ACPI_CA_VERSION); + return_VALUE(0); +} - return_VALUE(size); +static int acpi_system_info_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, acpi_system_read_info, PDE(inode)->data); } -static ssize_t acpi_system_read_dsdt (struct file*, char*, size_t, loff_t*); +static struct file_operations acpi_system_info_ops = { + .open = acpi_system_info_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static ssize_t acpi_system_read_dsdt (struct file*, char __user *, size_t, loff_t*); static struct file_operations acpi_system_dsdt_ops = { .read = acpi_system_read_dsdt, @@ -86,14 +78,13 @@ static struct file_operations acpi_system_dsdt_ops = { static ssize_t acpi_system_read_dsdt ( struct file *file, - char *buffer, + char __user *buffer, size_t count, loff_t *ppos) { acpi_status status = AE_OK; struct acpi_buffer dsdt = {ACPI_ALLOCATE_BUFFER, NULL}; - void *data = 0; - size_t size = 0; + ssize_t res; ACPI_FUNCTION_TRACE("acpi_system_read_dsdt"); @@ -101,26 +92,15 @@ acpi_system_read_dsdt ( if (ACPI_FAILURE(status)) return_VALUE(-ENODEV); - if (*ppos < dsdt.length) { - data = dsdt.pointer + file->f_pos; - size = dsdt.length - file->f_pos; - if (size > count) - size = count; - if (copy_to_user(buffer, data, size)) { - acpi_os_free(dsdt.pointer); - return_VALUE(-EFAULT); - } - } - + res = simple_read_from_buffer(buffer, count, ppos, + dsdt.pointer, dsdt.length); acpi_os_free(dsdt.pointer); - *ppos += size; - - return_VALUE(size); + return_VALUE(res); } -static ssize_t acpi_system_read_fadt (struct file*, char*, size_t, loff_t*); +static ssize_t acpi_system_read_fadt (struct file*, char __user *, size_t, loff_t*); static struct file_operations acpi_system_fadt_ops = { .read = acpi_system_read_fadt, @@ -129,14 +109,13 @@ static struct file_operations acpi_system_fadt_ops = { static ssize_t acpi_system_read_fadt ( struct file *file, - char *buffer, + char __user *buffer, size_t count, loff_t *ppos) { acpi_status status = AE_OK; struct acpi_buffer fadt = {ACPI_ALLOCATE_BUFFER, NULL}; - void *data = 0; - size_t size = 0; + ssize_t res; ACPI_FUNCTION_TRACE("acpi_system_read_fadt"); @@ -144,22 +123,11 @@ acpi_system_read_fadt ( if (ACPI_FAILURE(status)) return_VALUE(-ENODEV); - if (*ppos < fadt.length) { - data = fadt.pointer + file->f_pos; - size = fadt.length - file->f_pos; - if (size > count) - size = count; - if (copy_to_user(buffer, data, size)) { - acpi_os_free(fadt.pointer); - return_VALUE(-EFAULT); - } - } - + res = simple_read_from_buffer(buffer, count, ppos, + fadt.pointer, fadt.length); acpi_os_free(fadt.pointer); - *ppos += size; - - return_VALUE(size); + return_VALUE(res); } @@ -176,10 +144,13 @@ static int __init acpi_system_init (void) /* 'info' [R] */ name = ACPI_SYSTEM_FILE_INFO; - entry = create_proc_read_entry(name, - S_IRUGO, acpi_root_dir, acpi_system_read_info,NULL); + entry = create_proc_entry(name, + S_IRUGO, acpi_root_dir); if (!entry) goto Error; + else { + entry->proc_fops = &acpi_system_info_ops; + } /* 'dsdt' [R] */ name = ACPI_SYSTEM_FILE_DSDT;