init/initramfs.c

Source file repositories/reference/linux-study-clean/init/initramfs.c

File Facts

System
Linux kernel
Corpus path
init/initramfs.c
Extension
.c
Size
18751 bytes
Lines
793
Domain
Core OS
Bucket
Boot And Init
Inferred role
Core OS: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct dir_entry {
	struct list_head list;
	time64_t mtime;
	char name[];
};

static void __init dir_add(const char *name, size_t nlen, time64_t mtime)
{
	struct dir_entry *de;

	de = kmalloc_flex(*de, name, nlen);
	if (!de)
		panic_show_mem("can't allocate dir_entry buffer");
	INIT_LIST_HEAD(&de->list);
	strscpy(de->name, name, nlen);
	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);
	}
}
#else
static void __init do_utime(char *filename, time64_t mtime) {}
static void __init do_utime_path(const struct path *path, time64_t mtime) {}
static void __init dir_add(const char *name, size_t nlen, time64_t mtime) {}
static void __init dir_utime(void) {}
#endif

static __initdata time64_t mtime;

/* cpio header parsing */

static __initdata unsigned long ino, major, minor, nlink;
static __initdata umode_t mode;
static __initdata unsigned long body_len, name_len;
static __initdata uid_t uid;
static __initdata gid_t gid;
static __initdata unsigned rdev;
static __initdata u32 hdr_csum;

static int __init parse_header(char *s)
{
	__be32 header[13];
	int ret;

	ret = hex2bin((u8 *)header, s + 6, sizeof(header));
	if (ret) {
		error("damaged header");
		return ret;
	}

	ino = be32_to_cpu(header[0]);
	mode = be32_to_cpu(header[1]);
	uid = be32_to_cpu(header[2]);
	gid = be32_to_cpu(header[3]);
	nlink = be32_to_cpu(header[4]);
	mtime = be32_to_cpu(header[5]); /* breaks in y2106 */
	body_len = be32_to_cpu(header[6]);
	major = be32_to_cpu(header[7]);
	minor = be32_to_cpu(header[8]);
	rdev = new_encode_dev(MKDEV(be32_to_cpu(header[9]), be32_to_cpu(header[10])));
	name_len = be32_to_cpu(header[11]);
	hdr_csum = be32_to_cpu(header[12]);
	return 0;
}

/* Finite-state machine */

static __initdata enum state {
	Start,
	Collect,
	GotHeader,
	SkipIt,
	GotName,
	CopyFile,
	GotSymlink,
	Reset
} state, next_state;

static __initdata char *victim;
static unsigned long byte_count __initdata;
static __initdata loff_t this_header, next_header;

Annotation

Implementation Notes