From: "Éric Piel" <Eric.Piel@tremplin-utc.net>
To: len.brown@intel.com
Cc: Christoph Hellwig <hch@lst.de>,
dsdt@gaugusch.at, linux-kernel@vger.kernel.org,
Linus Torvalds <torvalds@osdl.org>,
trenn@suse.de
Subject: [PATCH] Use userland-like functions for reading the ACPI table
Date: Sat, 23 Feb 2008 20:34:14 +0100 [thread overview]
Message-ID: <47C07536.6040404@tremplin-utc.net> (raw)
In-Reply-To: <47BDC705.6090902@tremplin-utc.net>
21/02/08 19:46, Éric Piel wrote/a écrit:
> In the mean time, here is a patch which should get the situation already
> much cleaner. It has been tested on various configs (with and without
> DSDT). Let me know if you think it is acceptable.
>
It seems the patch looks ok for people around so here is a s-o-b version
for Len. It's against 2.6.25-rc2.
Eric
--
As recommended by Christoph Hellwig, even if we can't rely on the userspace
firmware loader so early at boot, at least use normal syscall (as in
init/do_mounts_*.c). Similarly, use kfree() instead of ACPI_FREE().
Also, it's recommended to open the file before stating it, to avoid surprises.
Signed-off-by: Eric Piel <eric.piel@tremplin-utc.net>
---
drivers/acpi/osl.c | 33 +++++++++++++++------------------
1 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 34b3386..b836305 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -42,6 +42,7 @@
#include <acpi/acpi_bus.h>
#include <acpi/processor.h>
#include <asm/uaccess.h>
+#include <linux/syscalls.h>
#include <linux/efi.h>
#include <linux/ioport.h>
@@ -327,8 +328,7 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
static struct acpi_table_header *acpi_find_dsdt_initrd(void)
{
- struct file *firmware_file;
- mm_segment_t oldfs;
+ int fd;
unsigned long len, len2;
struct acpi_table_header *dsdt_buffer, *ret = NULL;
struct kstat stat;
@@ -342,20 +342,21 @@ struct acpi_table_header *acpi_find_dsdt_initrd(void)
* But this code must be run before there is any userspace available.
* A static/init firmware infrastructure doesn't exist yet...
*/
- if (vfs_stat(ramfs_dsdt_name, &stat) < 0)
- return ret;
+ fd = sys_open(ramfs_dsdt_name, O_RDONLY, 0);
+ if (fd < 0)
+ return ret; /* No need for warning, no DSDT override is normal */
+
+ /* There exists 3 different sys_fstat's, all are wrapper to vfs_fstat */
+ if (vfs_fstat(fd, &stat) < 0) {
+ printk(KERN_ERR PREFIX "Failed to stat %s.\n", ramfs_dsdt_name);
+ goto err;
+ }
len = stat.size;
/* check especially against empty files */
if (len <= 4) {
printk(KERN_ERR PREFIX "Failed: DSDT only %lu bytes.\n", len);
- return ret;
- }
-
- firmware_file = filp_open(ramfs_dsdt_name, O_RDONLY, 0);
- if (IS_ERR(firmware_file)) {
- printk(KERN_ERR PREFIX "Failed to open %s.\n", ramfs_dsdt_name);
- return ret;
+ goto err;
}
dsdt_buffer = kmalloc(len, GFP_ATOMIC);
@@ -364,15 +365,11 @@ struct acpi_table_header *acpi_find_dsdt_initrd(void)
goto err;
}
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- len2 = vfs_read(firmware_file, (char __user *)dsdt_buffer, len,
- &firmware_file->f_pos);
- set_fs(oldfs);
+ len2 = sys_read(fd, (char __user *)dsdt_buffer, len);
if (len2 < len) {
printk(KERN_ERR PREFIX "Failed to read %lu bytes from %s.\n",
len, ramfs_dsdt_name);
- ACPI_FREE(dsdt_buffer);
+ kfree(dsdt_buffer);
goto err;
}
@@ -380,7 +377,7 @@ struct acpi_table_header *acpi_find_dsdt_initrd(void)
len, ramfs_dsdt_name);
ret = dsdt_buffer;
err:
- filp_close(firmware_file, NULL);
+ sys_close(fd);
return ret;
}
#endif
next prev parent reply other threads:[~2008-02-23 20:06 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-10 7:12 acpi dsts loading and populate_rootfs Christoph Hellwig
2008-02-10 7:14 ` Christoph Hellwig
2008-02-10 11:58 ` Eric Piel
2008-02-11 13:47 ` Sergey Vlasov
2008-02-11 23:41 ` Éric Piel
2008-02-21 19:02 ` [PATCH] Allow populate_rootfs() to be called early (was: acpi dsts loading and populate_rootfs) Éric Piel
2008-02-21 19:04 ` Christoph Hellwig
2008-02-21 21:27 ` [PATCH] Allow populate_rootfs() to be called early Éric Piel
2008-02-23 19:40 ` [PATCH] Allow populate_rootfs() to be called early (resent, with sob) Éric Piel
2008-02-12 5:37 ` acpi dsts loading and populate_rootfs Christoph Hellwig
2008-02-21 18:46 ` Éric Piel
2008-02-22 8:51 ` Thomas Renninger
2008-02-22 9:05 ` Thomas Renninger
2008-02-22 9:53 ` Andi Kleen
2008-02-23 19:34 ` Éric Piel [this message]
2008-02-23 20:45 ` [PATCH] Use userland-like functions for reading the ACPI table Linus Torvalds
2008-02-24 1:31 ` Christoph Hellwig
2008-02-24 19:02 ` Éric Piel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47C07536.6040404@tremplin-utc.net \
--to=eric.piel@tremplin-utc.net \
--cc=dsdt@gaugusch.at \
--cc=hch@lst.de \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
--cc=trenn@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.