Merge remote-tracking branch 'qcom_sm8250/lineage-20' into lineage-20
Change-Id: I4b52f660c586a3f9a7393cbff534ff35e83fc1a3
This commit is contained in:
@@ -12,13 +12,14 @@
|
||||
#include <linux/file.h>
|
||||
#include <linux/initramfs.h>
|
||||
|
||||
static ssize_t __init xwrite(int fd, const char *p, size_t count)
|
||||
static ssize_t __init xwrite(struct file *file, const char *p, size_t count,
|
||||
loff_t *pos)
|
||||
{
|
||||
ssize_t out = 0;
|
||||
|
||||
/* sys_write only can write MAX_RW_COUNT aka 2G-4K bytes at most */
|
||||
while (count) {
|
||||
ssize_t rv = ksys_write(fd, p, count);
|
||||
ssize_t rv = kernel_write(file, p, count, pos);
|
||||
|
||||
if (rv < 0) {
|
||||
if (rv == -EINTR || rv == -EAGAIN)
|
||||
@@ -316,7 +317,8 @@ static int __init maybe_link(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __initdata int wfd;
|
||||
static __initdata struct file *wfile;
|
||||
static __initdata loff_t wfile_pos;
|
||||
|
||||
static int __init do_name(void)
|
||||
{
|
||||
@@ -333,16 +335,17 @@ static int __init do_name(void)
|
||||
int openflags = O_WRONLY|O_CREAT;
|
||||
if (ml != 1)
|
||||
openflags |= O_TRUNC;
|
||||
wfd = ksys_open(collected, openflags, mode);
|
||||
wfile = filp_open(collected, openflags, mode);
|
||||
if (IS_ERR(wfile))
|
||||
return 0;
|
||||
wfile_pos = 0;
|
||||
|
||||
if (wfd >= 0) {
|
||||
ksys_fchown(wfd, uid, gid);
|
||||
ksys_fchmod(wfd, mode);
|
||||
if (body_len)
|
||||
ksys_ftruncate(wfd, body_len);
|
||||
vcollected = kstrdup(collected, GFP_KERNEL);
|
||||
state = CopyFile;
|
||||
}
|
||||
vfs_fchown(wfile, uid, gid);
|
||||
vfs_fchmod(wfile, mode);
|
||||
if (body_len)
|
||||
vfs_truncate(&wfile->f_path, body_len);
|
||||
vcollected = kstrdup(collected, GFP_KERNEL);
|
||||
state = CopyFile;
|
||||
}
|
||||
} else if (S_ISDIR(mode)) {
|
||||
ksys_mkdir(collected, mode);
|
||||
@@ -364,16 +367,16 @@ static int __init do_name(void)
|
||||
static int __init do_copy(void)
|
||||
{
|
||||
if (byte_count >= body_len) {
|
||||
if (xwrite(wfd, victim, body_len) != body_len)
|
||||
if (xwrite(wfile, victim, body_len, &wfile_pos) != body_len)
|
||||
error("write error");
|
||||
ksys_close(wfd);
|
||||
fput(wfile);
|
||||
do_utime(vcollected, mtime);
|
||||
kfree(vcollected);
|
||||
eat(body_len);
|
||||
state = SkipIt;
|
||||
return 0;
|
||||
} else {
|
||||
if (xwrite(wfd, victim, byte_count) != byte_count)
|
||||
if (xwrite(wfile, victim, byte_count, &wfile_pos) != byte_count)
|
||||
error("write error");
|
||||
body_len -= byte_count;
|
||||
eat(byte_count);
|
||||
@@ -611,6 +614,30 @@ static int __init skip_initramfs_param(char *str)
|
||||
}
|
||||
__setup("skip_initramfs", skip_initramfs_param);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_RAM
|
||||
static void __init populate_initrd_image(char *err)
|
||||
{
|
||||
ssize_t written;
|
||||
struct file *file;
|
||||
loff_t pos = 0;
|
||||
|
||||
unpack_to_rootfs(__initramfs_start, __initramfs_size);
|
||||
|
||||
printk(KERN_INFO "rootfs image is not initramfs (%s); looks like an initrd\n",
|
||||
err);
|
||||
file = filp_open("/initrd.image", O_WRONLY|O_CREAT|O_LARGEFILE, 0700);
|
||||
if (IS_ERR(file))
|
||||
return;
|
||||
|
||||
written = xwrite(file, (char *)initrd_start, initrd_end - initrd_start,
|
||||
&pos);
|
||||
if (written != initrd_end - initrd_start)
|
||||
pr_err("/initrd.image: incomplete write (%zd != %ld)\n",
|
||||
written, initrd_end - initrd_start);
|
||||
fput(file);
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_RAM */
|
||||
|
||||
static int __init populate_rootfs(void)
|
||||
{
|
||||
char *err;
|
||||
@@ -628,7 +655,6 @@ static int __init populate_rootfs(void)
|
||||
/* If available load the bootloader supplied initrd */
|
||||
if (initrd_start && !IS_ENABLED(CONFIG_INITRAMFS_FORCE)) {
|
||||
#ifdef CONFIG_BLK_DEV_RAM
|
||||
int fd;
|
||||
printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");
|
||||
err = unpack_to_rootfs((char *)initrd_start,
|
||||
initrd_end - initrd_start);
|
||||
@@ -636,22 +662,7 @@ static int __init populate_rootfs(void)
|
||||
goto done;
|
||||
|
||||
clean_rootfs();
|
||||
unpack_to_rootfs(__initramfs_start, __initramfs_size);
|
||||
|
||||
printk(KERN_INFO "rootfs image is not initramfs (%s)"
|
||||
"; looks like an initrd\n", err);
|
||||
fd = ksys_open("/initrd.image",
|
||||
O_WRONLY|O_CREAT, 0700);
|
||||
if (fd >= 0) {
|
||||
ssize_t written = xwrite(fd, (char *)initrd_start,
|
||||
initrd_end - initrd_start);
|
||||
|
||||
if (written != initrd_end - initrd_start)
|
||||
pr_err("/initrd.image: incomplete write (%zd != %ld)\n",
|
||||
written, initrd_end - initrd_start);
|
||||
|
||||
ksys_close(fd);
|
||||
}
|
||||
populate_initrd_image(err);
|
||||
done:
|
||||
/* empty statement */;
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user