Blame view
init/initramfs.c
13.8 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 |
#include <linux/init.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/delay.h> #include <linux/string.h> |
df52092f3 fastboot: remove ... |
9 |
#include <linux/dirent.h> |
1da177e4c Linux-2.6.12-rc2 |
10 |
#include <linux/syscalls.h> |
889d51a10 initramfs: add op... |
11 |
#include <linux/utime.h> |
088655148 initramfs: finish... |
12 |
#include <linux/file.h> |
1da177e4c Linux-2.6.12-rc2 |
13 |
|
387474399 initramfs: suppor... |
14 15 16 17 18 19 |
static ssize_t __init xwrite(int fd, const char *p, size_t count) { ssize_t out = 0; /* sys_write only can write MAX_RW_COUNT aka 2G-4K bytes at most */ while (count) { |
e7a3e8b2e fs: add ksys_writ... |
20 |
ssize_t rv = ksys_write(fd, p, count); |
387474399 initramfs: suppor... |
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
if (rv < 0) { if (rv == -EINTR || rv == -EAGAIN) continue; return out ? out : rv; } else if (rv == 0) break; p += rv; out += rv; count -= rv; } return out; } |
1da177e4c Linux-2.6.12-rc2 |
36 37 38 39 40 41 |
static __initdata char *message; static void __init error(char *x) { if (!message) message = x; } |
1da177e4c Linux-2.6.12-rc2 |
42 |
/* link hash */ |
6a050da45 [PATCH] initramfs... |
43 |
#define N_ALIGN(len) ((((len) + 1) & ~3) + 2) |
1da177e4c Linux-2.6.12-rc2 |
44 45 |
static __initdata struct hash { int ino, minor, major; |
685dd2d5b init/initramfs.c:... |
46 |
umode_t mode; |
1da177e4c Linux-2.6.12-rc2 |
47 |
struct hash *next; |
6a050da45 [PATCH] initramfs... |
48 |
char name[N_ALIGN(PATH_MAX)]; |
1da177e4c Linux-2.6.12-rc2 |
49 50 51 52 53 54 55 56 |
} *head[32]; static inline int hash(int major, int minor, int ino) { unsigned long tmp = ino + minor + (major << 3); tmp += tmp >> 5; return tmp & 31; } |
2139a7fbf [PATCH] initramfs... |
57 |
static char __init *find_link(int major, int minor, int ino, |
685dd2d5b init/initramfs.c:... |
58 |
umode_t mode, char *name) |
1da177e4c Linux-2.6.12-rc2 |
59 60 61 62 63 64 65 66 67 |
{ struct hash **p, *q; for (p = head + hash(major, minor, ino); *p; p = &(*p)->next) { if ((*p)->ino != ino) continue; if ((*p)->minor != minor) continue; if ((*p)->major != major) continue; |
2139a7fbf [PATCH] initramfs... |
68 69 |
if (((*p)->mode ^ mode) & S_IFMT) continue; |
1da177e4c Linux-2.6.12-rc2 |
70 71 |
return (*p)->name; } |
3265e66b1 directly use kmal... |
72 |
q = kmalloc(sizeof(struct hash), GFP_KERNEL); |
1da177e4c Linux-2.6.12-rc2 |
73 74 |
if (!q) panic("can't allocate link hash entry"); |
1da177e4c Linux-2.6.12-rc2 |
75 |
q->major = major; |
2139a7fbf [PATCH] initramfs... |
76 77 78 |
q->minor = minor; q->ino = ino; q->mode = mode; |
6a050da45 [PATCH] initramfs... |
79 |
strcpy(q->name, name); |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 83 84 85 86 87 88 89 90 91 |
q->next = NULL; *p = q; return NULL; } static void __init free_hash(void) { struct hash **p, *q; for (p = head; p < head + 32; p++) { while (*p) { q = *p; *p = q->next; |
3265e66b1 directly use kmal... |
92 |
kfree(q); |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 |
} } } |
e35c4c64f initramfs: use ti... |
96 |
static long __init do_utime(char *filename, time64_t mtime) |
889d51a10 initramfs: add op... |
97 |
{ |
aaed2dd8a utimes: Make utim... |
98 |
struct timespec64 t[2]; |
889d51a10 initramfs: add op... |
99 100 101 102 103 104 105 106 107 108 109 110 111 |
t[0].tv_sec = mtime; t[0].tv_nsec = 0; t[1].tv_sec = mtime; t[1].tv_nsec = 0; return do_utimes(AT_FDCWD, filename, t, AT_SYMLINK_NOFOLLOW); } static __initdata LIST_HEAD(dir_list); struct dir_entry { struct list_head list; char *name; |
e35c4c64f initramfs: use ti... |
112 |
time64_t mtime; |
889d51a10 initramfs: add op... |
113 |
}; |
e35c4c64f initramfs: use ti... |
114 |
static void __init dir_add(const char *name, time64_t mtime) |
889d51a10 initramfs: add op... |
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
{ struct dir_entry *de = kmalloc(sizeof(struct dir_entry), GFP_KERNEL); if (!de) panic("can't allocate dir_entry buffer"); INIT_LIST_HEAD(&de->list); de->name = kstrdup(name, GFP_KERNEL); de->mtime = mtime; list_add(&de->list, &dir_list); } static void __init dir_utime(void) { struct dir_entry *de, *tmp; list_for_each_entry_safe(de, tmp, &dir_list, list) { list_del(&de->list); do_utime(de->name, de->mtime); kfree(de->name); kfree(de); } } |
e35c4c64f initramfs: use ti... |
135 |
static __initdata time64_t mtime; |
889d51a10 initramfs: add op... |
136 |
|
1da177e4c Linux-2.6.12-rc2 |
137 138 139 |
/* cpio header parsing */ static __initdata unsigned long ino, major, minor, nlink; |
685dd2d5b init/initramfs.c:... |
140 |
static __initdata umode_t mode; |
1da177e4c Linux-2.6.12-rc2 |
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
static __initdata unsigned long body_len, name_len; static __initdata uid_t uid; static __initdata gid_t gid; static __initdata unsigned rdev; static void __init parse_header(char *s) { unsigned long parsed[12]; char buf[9]; int i; buf[8] = '\0'; for (i = 0, s += 6; i < 12; i++, s += 8) { memcpy(buf, s, 8); parsed[i] = simple_strtoul(buf, NULL, 16); } ino = parsed[0]; mode = parsed[1]; uid = parsed[2]; gid = parsed[3]; nlink = parsed[4]; |
e35c4c64f initramfs: use ti... |
162 |
mtime = parsed[5]; /* breaks in y2106 */ |
1da177e4c Linux-2.6.12-rc2 |
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
body_len = parsed[6]; major = parsed[7]; minor = parsed[8]; rdev = new_encode_dev(MKDEV(parsed[9], parsed[10])); name_len = parsed[11]; } /* FSM */ static __initdata enum state { Start, Collect, GotHeader, SkipIt, GotName, CopyFile, GotSymlink, Reset } state, next_state; static __initdata char *victim; |
c34d85aca init/initramfs.c:... |
184 |
static unsigned long byte_count __initdata; |
1da177e4c Linux-2.6.12-rc2 |
185 |
static __initdata loff_t this_header, next_header; |
b0a5ab931 initramfs: missin... |
186 |
static inline void __init eat(unsigned n) |
1da177e4c Linux-2.6.12-rc2 |
187 188 189 |
{ victim += n; this_header += n; |
c34d85aca init/initramfs.c:... |
190 |
byte_count -= n; |
1da177e4c Linux-2.6.12-rc2 |
191 |
} |
889d51a10 initramfs: add op... |
192 |
static __initdata char *vcollected; |
1da177e4c Linux-2.6.12-rc2 |
193 |
static __initdata char *collected; |
d97b07c54 initramfs: suppor... |
194 |
static long remains __initdata; |
1da177e4c Linux-2.6.12-rc2 |
195 196 197 198 |
static __initdata char *collect; static void __init read_into(char *buf, unsigned size, enum state next) { |
c34d85aca init/initramfs.c:... |
199 |
if (byte_count >= size) { |
1da177e4c Linux-2.6.12-rc2 |
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
collected = victim; eat(size); state = next; } else { collect = collected = buf; remains = size; next_state = next; state = Collect; } } static __initdata char *header_buf, *symlink_buf, *name_buf; static int __init do_start(void) { read_into(header_buf, 110, GotHeader); return 0; } static int __init do_collect(void) { |
d97b07c54 initramfs: suppor... |
221 |
unsigned long n = remains; |
c34d85aca init/initramfs.c:... |
222 223 |
if (byte_count < n) n = byte_count; |
1da177e4c Linux-2.6.12-rc2 |
224 225 226 227 228 229 230 231 232 233 234 |
memcpy(collect, victim, n); eat(n); collect += n; if ((remains -= n) != 0) return 1; state = next_state; return 0; } static int __init do_header(void) { |
2e591bbc0 [PATCH] Make init... |
235 236 237 238 |
if (memcmp(collected, "070707", 6)==0) { error("incorrect cpio method used: use -H newc option"); return 1; } |
1da177e4c Linux-2.6.12-rc2 |
239 240 241 242 243 244 245 |
if (memcmp(collected, "070701", 6)) { error("no cpio magic"); return 1; } parse_header(collected); next_header = this_header + N_ALIGN(name_len) + body_len; next_header = (next_header + 3) & ~3; |
1da177e4c Linux-2.6.12-rc2 |
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
state = SkipIt; if (name_len <= 0 || name_len > PATH_MAX) return 0; if (S_ISLNK(mode)) { if (body_len > PATH_MAX) return 0; collect = collected = symlink_buf; remains = N_ALIGN(name_len) + body_len; next_state = GotSymlink; state = Collect; return 0; } if (S_ISREG(mode) || !body_len) read_into(name_buf, N_ALIGN(name_len), GotName); return 0; } static int __init do_skip(void) { |
c34d85aca init/initramfs.c:... |
265 266 |
if (this_header + byte_count < next_header) { eat(byte_count); |
1da177e4c Linux-2.6.12-rc2 |
267 268 269 270 271 272 273 274 275 276 |
return 1; } else { eat(next_header - this_header); state = next_state; return 0; } } static int __init do_reset(void) { |
c34d85aca init/initramfs.c:... |
277 |
while (byte_count && *victim == '\0') |
1da177e4c Linux-2.6.12-rc2 |
278 |
eat(1); |
c34d85aca init/initramfs.c:... |
279 |
if (byte_count && (this_header & 3)) |
1da177e4c Linux-2.6.12-rc2 |
280 281 282 |
error("broken padding"); return 1; } |
c34d85aca init/initramfs.c:... |
283 |
static void __init clean_path(char *path, umode_t fmode) |
2139a7fbf [PATCH] initramfs... |
284 |
{ |
046aa1265 initramfs: use vf... |
285 |
struct kstat st; |
2139a7fbf [PATCH] initramfs... |
286 |
|
046aa1265 initramfs: use vf... |
287 288 |
if (!vfs_lstat(path, &st) && (st.mode ^ fmode) & S_IFMT) { if (S_ISDIR(st.mode)) |
f459dffae fs: add ksys_rmdi... |
289 |
ksys_rmdir(path); |
2139a7fbf [PATCH] initramfs... |
290 |
else |
0f32ab8cf fs: add ksys_unli... |
291 |
ksys_unlink(path); |
2139a7fbf [PATCH] initramfs... |
292 293 |
} } |
2a5d5f5f4 initramfs: clean ... |
294 295 296 297 298 299 300 301 302 303 304 |
static int __init maybe_link(void) { if (nlink >= 2) { char *old = find_link(major, minor, ino, mode, collected); if (old) { clean_path(collected, 0); return (ksys_link(old, collected) < 0) ? -1 : 1; } } return 0; } |
1da177e4c Linux-2.6.12-rc2 |
305 306 307 308 309 310 311 312 313 314 |
static __initdata int wfd; static int __init do_name(void) { state = SkipIt; next_state = Reset; if (strcmp(collected, "TRAILER!!!") == 0) { free_hash(); return 0; } |
2139a7fbf [PATCH] initramfs... |
315 |
clean_path(collected, mode); |
1da177e4c Linux-2.6.12-rc2 |
316 |
if (S_ISREG(mode)) { |
2139a7fbf [PATCH] initramfs... |
317 318 319 320 321 |
int ml = maybe_link(); if (ml >= 0) { int openflags = O_WRONLY|O_CREAT; if (ml != 1) openflags |= O_TRUNC; |
bae217ea8 fs: add ksys_open... |
322 |
wfd = ksys_open(collected, openflags, mode); |
2139a7fbf [PATCH] initramfs... |
323 |
|
1da177e4c Linux-2.6.12-rc2 |
324 |
if (wfd >= 0) { |
55731b3cd fs: add do_fchown... |
325 |
ksys_fchown(wfd, uid, gid); |
03450e271 fs: add ksys_fchm... |
326 |
ksys_fchmod(wfd, mode); |
d20d5a745 initramfs: fix in... |
327 |
if (body_len) |
411d9475c fs: add ksys_ftru... |
328 |
ksys_ftruncate(wfd, body_len); |
889d51a10 initramfs: add op... |
329 |
vcollected = kstrdup(collected, GFP_KERNEL); |
1da177e4c Linux-2.6.12-rc2 |
330 331 332 333 |
state = CopyFile; } } } else if (S_ISDIR(mode)) { |
0101db7a3 fs: add do_mkdira... |
334 |
ksys_mkdir(collected, mode); |
55731b3cd fs: add do_fchown... |
335 |
ksys_chown(collected, uid, gid); |
03450e271 fs: add ksys_fchm... |
336 |
ksys_chmod(collected, mode); |
889d51a10 initramfs: add op... |
337 |
dir_add(collected, mtime); |
1da177e4c Linux-2.6.12-rc2 |
338 339 340 |
} else if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { if (maybe_link() == 0) { |
87c4e1926 fs: add do_mknoda... |
341 |
ksys_mknod(collected, mode, rdev); |
55731b3cd fs: add do_fchown... |
342 |
ksys_chown(collected, uid, gid); |
03450e271 fs: add ksys_fchm... |
343 |
ksys_chmod(collected, mode); |
889d51a10 initramfs: add op... |
344 |
do_utime(collected, mtime); |
1da177e4c Linux-2.6.12-rc2 |
345 346 347 348 349 350 351 |
} } return 0; } static int __init do_copy(void) { |
c34d85aca init/initramfs.c:... |
352 |
if (byte_count >= body_len) { |
9687fd910 initramfs: add wr... |
353 354 |
if (xwrite(wfd, victim, body_len) != body_len) error("write error"); |
2ca2a09d6 fs: add ksys_clos... |
355 |
ksys_close(wfd); |
889d51a10 initramfs: add op... |
356 357 |
do_utime(vcollected, mtime); kfree(vcollected); |
1da177e4c Linux-2.6.12-rc2 |
358 359 360 361 |
eat(body_len); state = SkipIt; return 0; } else { |
c34d85aca init/initramfs.c:... |
362 |
if (xwrite(wfd, victim, byte_count) != byte_count) |
9687fd910 initramfs: add wr... |
363 |
error("write error"); |
c34d85aca init/initramfs.c:... |
364 365 |
body_len -= byte_count; eat(byte_count); |
1da177e4c Linux-2.6.12-rc2 |
366 367 368 369 370 371 372 |
return 1; } } static int __init do_symlink(void) { collected[N_ALIGN(name_len) + body_len] = '\0'; |
2139a7fbf [PATCH] initramfs... |
373 |
clean_path(collected, 0); |
b724e846b fs: add do_symlin... |
374 |
ksys_symlink(collected + N_ALIGN(name_len), collected); |
55731b3cd fs: add do_fchown... |
375 |
ksys_lchown(collected, uid, gid); |
889d51a10 initramfs: add op... |
376 |
do_utime(collected, mtime); |
1da177e4c Linux-2.6.12-rc2 |
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 |
state = SkipIt; next_state = Reset; return 0; } static __initdata int (*actions[])(void) = { [Start] = do_start, [Collect] = do_collect, [GotHeader] = do_header, [SkipIt] = do_skip, [GotName] = do_name, [CopyFile] = do_copy, [GotSymlink] = do_symlink, [Reset] = do_reset, }; |
d97b07c54 initramfs: suppor... |
392 |
static long __init write_buffer(char *buf, unsigned long len) |
1da177e4c Linux-2.6.12-rc2 |
393 |
{ |
c34d85aca init/initramfs.c:... |
394 |
byte_count = len; |
1da177e4c Linux-2.6.12-rc2 |
395 396 397 398 |
victim = buf; while (!actions[state]()) ; |
c34d85aca init/initramfs.c:... |
399 |
return len - byte_count; |
1da177e4c Linux-2.6.12-rc2 |
400 |
} |
d97b07c54 initramfs: suppor... |
401 |
static long __init flush_buffer(void *bufv, unsigned long len) |
1da177e4c Linux-2.6.12-rc2 |
402 |
{ |
30d65dbfe bzip2/lzma: confi... |
403 |
char *buf = (char *) bufv; |
d97b07c54 initramfs: suppor... |
404 405 |
long written; long origLen = len; |
1da177e4c Linux-2.6.12-rc2 |
406 |
if (message) |
30d65dbfe bzip2/lzma: confi... |
407 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
408 409 410 411 412 413 414 415 416 417 418 419 420 |
while ((written = write_buffer(buf, len)) < len && !message) { char c = buf[written]; if (c == '0') { buf += written; len -= written; state = Start; } else if (c == 0) { buf += written; len -= written; state = Reset; } else error("junk in compressed archive"); } |
30d65dbfe bzip2/lzma: confi... |
421 |
return origLen; |
1da177e4c Linux-2.6.12-rc2 |
422 |
} |
d97b07c54 initramfs: suppor... |
423 |
static unsigned long my_inptr; /* index of next byte to be processed in inbuf */ |
1da177e4c Linux-2.6.12-rc2 |
424 |
|
889c92d21 bzip2/lzma: centr... |
425 |
#include <linux/decompress/generic.h> |
1da177e4c Linux-2.6.12-rc2 |
426 |
|
d97b07c54 initramfs: suppor... |
427 |
static char * __init unpack_to_rootfs(char *buf, unsigned long len) |
1da177e4c Linux-2.6.12-rc2 |
428 |
{ |
d97b07c54 initramfs: suppor... |
429 |
long written; |
889c92d21 bzip2/lzma: centr... |
430 |
decompress_fn decompress; |
23a22d57a bzip2/lzma: compr... |
431 432 |
const char *compress_name; static __initdata char msg_buf[64]; |
889c92d21 bzip2/lzma: centr... |
433 |
|
3265e66b1 directly use kmal... |
434 435 436 |
header_buf = kmalloc(110, GFP_KERNEL); symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL); name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL); |
30d65dbfe bzip2/lzma: confi... |
437 438 |
if (!header_buf || !symlink_buf || !name_buf) |
1da177e4c Linux-2.6.12-rc2 |
439 |
panic("can't allocate buffers"); |
30d65dbfe bzip2/lzma: confi... |
440 |
|
1da177e4c Linux-2.6.12-rc2 |
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 |
state = Start; this_header = 0; message = NULL; while (!message && len) { loff_t saved_offset = this_header; if (*buf == '0' && !(this_header & 3)) { state = Start; written = write_buffer(buf, len); buf += written; len -= written; continue; } if (!*buf) { buf++; len--; this_header++; continue; } this_header = 0; |
23a22d57a bzip2/lzma: compr... |
460 |
decompress = decompress_method(buf, len, &compress_name); |
6aa7a29aa initramfs: debug ... |
461 462 |
pr_debug("Detected %s compressed data ", compress_name); |
54291362d initramfs: add mi... |
463 |
if (decompress) { |
d97b07c54 initramfs: suppor... |
464 |
int res = decompress(buf, len, NULL, flush_buffer, NULL, |
889c92d21 bzip2/lzma: centr... |
465 |
&my_inptr, error); |
54291362d initramfs: add mi... |
466 467 468 |
if (res) error("decompressor failed"); } else if (compress_name) { |
23a22d57a bzip2/lzma: compr... |
469 470 471 472 473 474 |
if (!message) { snprintf(msg_buf, sizeof msg_buf, "compression method %s not configured", compress_name); message = msg_buf; } |
df37bd156 initramfs: handle... |
475 476 |
} else error("junk in compressed archive"); |
1da177e4c Linux-2.6.12-rc2 |
477 |
if (state != Reset) |
30d65dbfe bzip2/lzma: confi... |
478 479 480 481 |
error("junk in compressed archive"); this_header = saved_offset + my_inptr; buf += my_inptr; len -= my_inptr; |
1da177e4c Linux-2.6.12-rc2 |
482 |
} |
889d51a10 initramfs: add op... |
483 |
dir_utime(); |
3265e66b1 directly use kmal... |
484 485 486 |
kfree(name_buf); kfree(symlink_buf); kfree(header_buf); |
1da177e4c Linux-2.6.12-rc2 |
487 488 |
return message; } |
0a7b35cb1 [PATCH] Add retai... |
489 490 491 492 493 494 495 496 497 498 |
static int __initdata do_retain_initrd; static int __init retain_initrd_param(char *str) { if (*str) return 0; do_retain_initrd = 1; return 1; } __setup("retain_initrd", retain_initrd_param); |
ffe8018c3 initramfs: fix in... |
499 500 |
extern char __initramfs_start[]; extern unsigned long __initramfs_size; |
1da177e4c Linux-2.6.12-rc2 |
501 |
#include <linux/initrd.h> |
9c15e852a [PATCH] kexec: fi... |
502 |
#include <linux/kexec.h> |
0f3d2bd54 [PATCH] free init... |
503 504 505 |
static void __init free_initrd(void) { |
2965faa5e kexec: split kexe... |
506 |
#ifdef CONFIG_KEXEC_CORE |
9c15e852a [PATCH] kexec: fi... |
507 508 |
unsigned long crashk_start = (unsigned long)__va(crashk_res.start); unsigned long crashk_end = (unsigned long)__va(crashk_res.end); |
0a7b35cb1 [PATCH] Add retai... |
509 510 511 |
#endif if (do_retain_initrd) goto skip; |
9c15e852a [PATCH] kexec: fi... |
512 |
|
2965faa5e kexec: split kexe... |
513 |
#ifdef CONFIG_KEXEC_CORE |
9c15e852a [PATCH] kexec: fi... |
514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 |
/* * If the initrd region is overlapped with crashkernel reserved region, * free only memory that is not part of crashkernel region. */ if (initrd_start < crashk_end && initrd_end > crashk_start) { /* * Initialize initrd memory region since the kexec boot does * not do. */ memset((void *)initrd_start, 0, initrd_end - initrd_start); if (initrd_start < crashk_start) free_initrd_mem(initrd_start, crashk_start); if (initrd_end > crashk_end) free_initrd_mem(crashk_end, initrd_end); } else #endif free_initrd_mem(initrd_start, initrd_end); |
0a7b35cb1 [PATCH] Add retai... |
531 |
skip: |
0f3d2bd54 [PATCH] free init... |
532 533 534 |
initrd_start = 0; initrd_end = 0; } |
b52bb3712 init/initramfs: f... |
535 |
#ifdef CONFIG_BLK_DEV_RAM |
df52092f3 fastboot: remove ... |
536 537 538 539 540 541 |
#define BUF_SIZE 1024 static void __init clean_rootfs(void) { int fd; void *buf; struct linux_dirent64 *dirp; |
8aaed5bec init/initramfs.c:... |
542 |
int num; |
df52092f3 fastboot: remove ... |
543 |
|
bae217ea8 fs: add ksys_open... |
544 |
fd = ksys_open("/", O_RDONLY, 0); |
df52092f3 fastboot: remove ... |
545 546 547 548 549 550 |
WARN_ON(fd < 0); if (fd < 0) return; buf = kzalloc(BUF_SIZE, GFP_KERNEL); WARN_ON(!buf); if (!buf) { |
2ca2a09d6 fs: add ksys_clos... |
551 |
ksys_close(fd); |
df52092f3 fastboot: remove ... |
552 553 554 555 |
return; } dirp = buf; |
454dab3f9 fs: add ksys_getd... |
556 |
num = ksys_getdents64(fd, dirp, BUF_SIZE); |
8aaed5bec init/initramfs.c:... |
557 558 |
while (num > 0) { while (num > 0) { |
046aa1265 initramfs: use vf... |
559 |
struct kstat st; |
df52092f3 fastboot: remove ... |
560 |
int ret; |
046aa1265 initramfs: use vf... |
561 |
ret = vfs_lstat(dirp->d_name, &st); |
df52092f3 fastboot: remove ... |
562 563 |
WARN_ON_ONCE(ret); if (!ret) { |
046aa1265 initramfs: use vf... |
564 |
if (S_ISDIR(st.mode)) |
f459dffae fs: add ksys_rmdi... |
565 |
ksys_rmdir(dirp->d_name); |
df52092f3 fastboot: remove ... |
566 |
else |
0f32ab8cf fs: add ksys_unli... |
567 |
ksys_unlink(dirp->d_name); |
df52092f3 fastboot: remove ... |
568 |
} |
8aaed5bec init/initramfs.c:... |
569 |
num -= dirp->d_reclen; |
df52092f3 fastboot: remove ... |
570 571 572 573 |
dirp = (void *)dirp + dirp->d_reclen; } dirp = buf; memset(buf, 0, BUF_SIZE); |
454dab3f9 fs: add ksys_getd... |
574 |
num = ksys_getdents64(fd, dirp, BUF_SIZE); |
df52092f3 fastboot: remove ... |
575 |
} |
2ca2a09d6 fs: add ksys_clos... |
576 |
ksys_close(fd); |
df52092f3 fastboot: remove ... |
577 578 |
kfree(buf); } |
b52bb3712 init/initramfs: f... |
579 |
#endif |
df52092f3 fastboot: remove ... |
580 |
|
9a9e0d685 ACPI: Remove ACPI... |
581 |
static int __init populate_rootfs(void) |
1da177e4c Linux-2.6.12-rc2 |
582 |
{ |
17a9be317 initramfs: Always... |
583 |
/* Load the built in initramfs */ |
ffe8018c3 initramfs: fix in... |
584 |
char *err = unpack_to_rootfs(__initramfs_start, __initramfs_size); |
1da177e4c Linux-2.6.12-rc2 |
585 |
if (err) |
499a4584d init: fix possibl... |
586 |
panic("%s", err); /* Failed to decompress INTERNAL initramfs */ |
17a9be317 initramfs: Always... |
587 |
/* If available load the bootloader supplied initrd */ |
cff75e0b6 initramfs: provid... |
588 |
if (initrd_start && !IS_ENABLED(CONFIG_INITRAMFS_FORCE)) { |
340e48e66 [PATCH] BLK_DEV_I... |
589 |
#ifdef CONFIG_BLK_DEV_RAM |
1da177e4c Linux-2.6.12-rc2 |
590 |
int fd; |
a1e6b6c1a initramfs: clean ... |
591 592 |
printk(KERN_INFO "Trying to unpack rootfs image as initramfs... "); |
1da177e4c Linux-2.6.12-rc2 |
593 |
err = unpack_to_rootfs((char *)initrd_start, |
df52092f3 fastboot: remove ... |
594 |
initrd_end - initrd_start); |
1da177e4c Linux-2.6.12-rc2 |
595 |
if (!err) { |
0f3d2bd54 [PATCH] free init... |
596 |
free_initrd(); |
bb813f4c9 init, block: try ... |
597 |
goto done; |
df52092f3 fastboot: remove ... |
598 599 |
} else { clean_rootfs(); |
ffe8018c3 initramfs: fix in... |
600 |
unpack_to_rootfs(__initramfs_start, __initramfs_size); |
1da177e4c Linux-2.6.12-rc2 |
601 |
} |
c1c490e01 initramfs: preven... |
602 603 604 |
printk(KERN_INFO "rootfs image is not initramfs (%s)" "; looks like an initrd ", err); |
bae217ea8 fs: add ksys_open... |
605 |
fd = ksys_open("/initrd.image", |
562f5e638 init: mark __user... |
606 |
O_WRONLY|O_CREAT, 0700); |
1da177e4c Linux-2.6.12-rc2 |
607 |
if (fd >= 0) { |
387474399 initramfs: suppor... |
608 609 610 611 612 613 614 |
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) ", written, initrd_end - initrd_start); |
2ca2a09d6 fs: add ksys_clos... |
615 |
ksys_close(fd); |
0f3d2bd54 [PATCH] free init... |
616 |
free_initrd(); |
1da177e4c Linux-2.6.12-rc2 |
617 |
} |
bb813f4c9 init, block: try ... |
618 |
done: |
394e4f5d5 initramfs: avoid ... |
619 |
/* empty statement */; |
340e48e66 [PATCH] BLK_DEV_I... |
620 |
#else |
a1e6b6c1a initramfs: clean ... |
621 622 |
printk(KERN_INFO "Unpacking initramfs... "); |
340e48e66 [PATCH] BLK_DEV_I... |
623 |
err = unpack_to_rootfs((char *)initrd_start, |
df52092f3 fastboot: remove ... |
624 |
initrd_end - initrd_start); |
a1e6b6c1a initramfs: clean ... |
625 626 627 |
if (err) printk(KERN_EMERG "Initramfs unpacking failed: %s ", err); |
340e48e66 [PATCH] BLK_DEV_I... |
628 629 |
free_initrd(); #endif |
1da177e4c Linux-2.6.12-rc2 |
630 |
} |
17a9be317 initramfs: Always... |
631 632 633 634 635 636 |
flush_delayed_fput(); /* * Try loading default modules from initramfs. This gives * us a chance to load before device_initcalls. */ load_default_modules(); |
8d610dd52 Make sure we popu... |
637 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
638 |
} |
8d610dd52 Make sure we popu... |
639 |
rootfs_initcall(populate_rootfs); |