Merge git://git.kernel.org/pub/scm/linux/kernel/git/arjan/linux-2.6-async-for-30
* git://git.kernel.org/pub/scm/linux/kernel/git/arjan/linux-2.6-async-for-30: fastboot: remove duplicate unpack_to_rootfs() ide/net: flip the order of SATA and network init async: remove the temporary (2.6.29) "async is off by default" code Fix up conflicts in init/initramfs.c manually
This commit is contained in:
Коммит
eedf2c5296
|
@ -36,13 +36,14 @@ obj-$(CONFIG_FB_INTEL) += video/intelfb/
|
||||||
|
|
||||||
obj-y += serial/
|
obj-y += serial/
|
||||||
obj-$(CONFIG_PARPORT) += parport/
|
obj-$(CONFIG_PARPORT) += parport/
|
||||||
obj-y += base/ block/ misc/ mfd/ net/ media/
|
obj-y += base/ block/ misc/ mfd/ media/
|
||||||
obj-$(CONFIG_NUBUS) += nubus/
|
obj-$(CONFIG_NUBUS) += nubus/
|
||||||
obj-$(CONFIG_ATM) += atm/
|
|
||||||
obj-y += macintosh/
|
obj-y += macintosh/
|
||||||
obj-$(CONFIG_IDE) += ide/
|
obj-$(CONFIG_IDE) += ide/
|
||||||
obj-$(CONFIG_SCSI) += scsi/
|
obj-$(CONFIG_SCSI) += scsi/
|
||||||
obj-$(CONFIG_ATA) += ata/
|
obj-$(CONFIG_ATA) += ata/
|
||||||
|
obj-y += net/
|
||||||
|
obj-$(CONFIG_ATM) += atm/
|
||||||
obj-$(CONFIG_FUSION) += message/
|
obj-$(CONFIG_FUSION) += message/
|
||||||
obj-$(CONFIG_FIREWIRE) += firewire/
|
obj-$(CONFIG_FIREWIRE) += firewire/
|
||||||
obj-y += ieee1394/
|
obj-y += ieee1394/
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <linux/fcntl.h>
|
#include <linux/fcntl.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/dirent.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/utime.h>
|
#include <linux/utime.h>
|
||||||
|
|
||||||
|
@ -166,8 +167,6 @@ static __initdata char *victim;
|
||||||
static __initdata unsigned count;
|
static __initdata unsigned count;
|
||||||
static __initdata loff_t this_header, next_header;
|
static __initdata loff_t this_header, next_header;
|
||||||
|
|
||||||
static __initdata int dry_run;
|
|
||||||
|
|
||||||
static inline void __init eat(unsigned n)
|
static inline void __init eat(unsigned n)
|
||||||
{
|
{
|
||||||
victim += n;
|
victim += n;
|
||||||
|
@ -229,10 +228,6 @@ static int __init do_header(void)
|
||||||
parse_header(collected);
|
parse_header(collected);
|
||||||
next_header = this_header + N_ALIGN(name_len) + body_len;
|
next_header = this_header + N_ALIGN(name_len) + body_len;
|
||||||
next_header = (next_header + 3) & ~3;
|
next_header = (next_header + 3) & ~3;
|
||||||
if (dry_run) {
|
|
||||||
read_into(name_buf, N_ALIGN(name_len), GotName);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
state = SkipIt;
|
state = SkipIt;
|
||||||
if (name_len <= 0 || name_len > PATH_MAX)
|
if (name_len <= 0 || name_len > PATH_MAX)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -303,8 +298,6 @@ static int __init do_name(void)
|
||||||
free_hash();
|
free_hash();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (dry_run)
|
|
||||||
return 0;
|
|
||||||
clean_path(collected, mode);
|
clean_path(collected, mode);
|
||||||
if (S_ISREG(mode)) {
|
if (S_ISREG(mode)) {
|
||||||
int ml = maybe_link();
|
int ml = maybe_link();
|
||||||
|
@ -417,14 +410,13 @@ static unsigned my_inptr; /* index of next byte to be processed in inbuf */
|
||||||
|
|
||||||
#include <linux/decompress/generic.h>
|
#include <linux/decompress/generic.h>
|
||||||
|
|
||||||
static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
|
static char * __init unpack_to_rootfs(char *buf, unsigned len)
|
||||||
{
|
{
|
||||||
int written;
|
int written;
|
||||||
decompress_fn decompress;
|
decompress_fn decompress;
|
||||||
const char *compress_name;
|
const char *compress_name;
|
||||||
static __initdata char msg_buf[64];
|
static __initdata char msg_buf[64];
|
||||||
|
|
||||||
dry_run = check_only;
|
|
||||||
header_buf = kmalloc(110, GFP_KERNEL);
|
header_buf = kmalloc(110, GFP_KERNEL);
|
||||||
symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
|
symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
|
||||||
name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
|
name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
|
||||||
|
@ -523,10 +515,57 @@ skip:
|
||||||
initrd_end = 0;
|
initrd_end = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BUF_SIZE 1024
|
||||||
|
static void __init clean_rootfs(void)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
void *buf;
|
||||||
|
struct linux_dirent64 *dirp;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
fd = sys_open("/", O_RDONLY, 0);
|
||||||
|
WARN_ON(fd < 0);
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
||||||
|
buf = kzalloc(BUF_SIZE, GFP_KERNEL);
|
||||||
|
WARN_ON(!buf);
|
||||||
|
if (!buf) {
|
||||||
|
sys_close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirp = buf;
|
||||||
|
count = sys_getdents64(fd, dirp, BUF_SIZE);
|
||||||
|
while (count > 0) {
|
||||||
|
while (count > 0) {
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = sys_newlstat(dirp->d_name, &st);
|
||||||
|
WARN_ON_ONCE(ret);
|
||||||
|
if (!ret) {
|
||||||
|
if (S_ISDIR(st.st_mode))
|
||||||
|
sys_rmdir(dirp->d_name);
|
||||||
|
else
|
||||||
|
sys_unlink(dirp->d_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
count -= dirp->d_reclen;
|
||||||
|
dirp = (void *)dirp + dirp->d_reclen;
|
||||||
|
}
|
||||||
|
dirp = buf;
|
||||||
|
memset(buf, 0, BUF_SIZE);
|
||||||
|
count = sys_getdents64(fd, dirp, BUF_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
sys_close(fd);
|
||||||
|
kfree(buf);
|
||||||
|
}
|
||||||
|
|
||||||
static int __init populate_rootfs(void)
|
static int __init populate_rootfs(void)
|
||||||
{
|
{
|
||||||
char *err = unpack_to_rootfs(__initramfs_start,
|
char *err = unpack_to_rootfs(__initramfs_start,
|
||||||
__initramfs_end - __initramfs_start, 0);
|
__initramfs_end - __initramfs_start);
|
||||||
if (err)
|
if (err)
|
||||||
panic(err); /* Failed to decompress INTERNAL initramfs */
|
panic(err); /* Failed to decompress INTERNAL initramfs */
|
||||||
if (initrd_start) {
|
if (initrd_start) {
|
||||||
|
@ -534,13 +573,15 @@ static int __init populate_rootfs(void)
|
||||||
int fd;
|
int fd;
|
||||||
printk(KERN_INFO "checking if image is initramfs...");
|
printk(KERN_INFO "checking if image is initramfs...");
|
||||||
err = unpack_to_rootfs((char *)initrd_start,
|
err = unpack_to_rootfs((char *)initrd_start,
|
||||||
initrd_end - initrd_start, 1);
|
initrd_end - initrd_start);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
printk(" it is\n");
|
printk(" it is\n");
|
||||||
unpack_to_rootfs((char *)initrd_start,
|
|
||||||
initrd_end - initrd_start, 0);
|
|
||||||
free_initrd();
|
free_initrd();
|
||||||
return 0;
|
return 0;
|
||||||
|
} else {
|
||||||
|
clean_rootfs();
|
||||||
|
unpack_to_rootfs(__initramfs_start,
|
||||||
|
__initramfs_end - __initramfs_start);
|
||||||
}
|
}
|
||||||
printk("it isn't (%s); looks like an initrd\n", err);
|
printk("it isn't (%s); looks like an initrd\n", err);
|
||||||
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
|
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
|
||||||
|
@ -553,7 +594,7 @@ static int __init populate_rootfs(void)
|
||||||
#else
|
#else
|
||||||
printk(KERN_INFO "Unpacking initramfs...");
|
printk(KERN_INFO "Unpacking initramfs...");
|
||||||
err = unpack_to_rootfs((char *)initrd_start,
|
err = unpack_to_rootfs((char *)initrd_start,
|
||||||
initrd_end - initrd_start, 0);
|
initrd_end - initrd_start);
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(" failed!\n");
|
printk(" failed!\n");
|
||||||
printk(KERN_EMERG "%s\n", err);
|
printk(KERN_EMERG "%s\n", err);
|
||||||
|
|
|
@ -49,6 +49,7 @@ asynchronous and synchronous parts of the kernel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/async.h>
|
#include <linux/async.h>
|
||||||
|
#include <linux/bug.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
@ -387,20 +388,11 @@ static int async_manager_thread(void *unused)
|
||||||
|
|
||||||
static int __init async_init(void)
|
static int __init async_init(void)
|
||||||
{
|
{
|
||||||
if (async_enabled)
|
async_enabled =
|
||||||
if (IS_ERR(kthread_run(async_manager_thread, NULL,
|
!IS_ERR(kthread_run(async_manager_thread, NULL, "async/mgr"));
|
||||||
"async/mgr")))
|
|
||||||
async_enabled = 0;
|
WARN_ON(!async_enabled);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init setup_async(char *str)
|
|
||||||
{
|
|
||||||
async_enabled = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
__setup("fastboot", setup_async);
|
|
||||||
|
|
||||||
|
|
||||||
core_initcall(async_init);
|
core_initcall(async_init);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче