vserver 1.9.5.x5
[linux-2.6.git] / drivers / acpi / system.c
index bee370a..8925a6c 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
 
@@ -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;