openbsd-ext4/writeup/3.md

1.9 KiB

Mount source code

Let's look at OpenBSD's mounting, as present in ext2fs_vfsops.c.

The first two function declarations prove quite useful:

int ext2fs_sbupdate(struct ufsmount *, int);
static int	e2fs_sbcheck(struct ext2fs *, int);

The first thing we are concerned with, of course, is the super block. With that being said, let's keep reading.

Below that, we have a struct called ext2fs_vfsops which just contains values that are defined as certain constants (e.g. .vfs_mount = ext2fs_mount), but we don't care about that. Then we have the inode pool, the ext2gennumber, and below that, we have the initializer of the inode pool, which probably needs to be tweaked for 64-bit as well. No wonder nobody has done it 😅

At this point, we should see where in the mounting process ext4 fails. Create an ext4 filesystem using qemu and mount it; make sure that the virtual machine manager marks it as a readonly filesystem before mounting it to ensure that it doesn't get corrupted (at least, not yet).

Finally, on line 106 we have the ext2fs_mountroot function. This is where the bulk of our analysis will start.

	struct m_ext2fs *fs;
    struct mount *mp;
	struct proc *p = curproc;	/* XXX */
	struct ufsmount *ump;
	int error;

	/*
	 * Get vnodes for swapdev and rootdev.
	 */
	if (bdevvp(swapdev, &swapdev_vp) || bdevvp(rootdev, &rootvp))
		panic("ext2fs_mountroot: can't setup bdevvp's");

So here we have to figure out what exactly the bdevvp function is. From the OpenBSD man page:

bdevvp() will create a vnode for a block device, and is used for the root device and swap areas, among other things.

I guess our question starts at, what exactly is a virtual node? It's nothing more than "an abstract ayer on top of a more concrete filesystem." (Wikipedia).

Meaning nothing more than what we have to do in order for there to be no difference when we run ls, cd, rm, mkdir, etc. Abstractions are necessary.