We use necessary cookies to make our site work. We'd also like to set analytics cookies that help us make improvements by measuring how you use the site. These will be set only if you accept.

Fuse-xfs

static void xfs_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) { struct xfs_inode *ip = xfs_iget(parent); xfs_dirent_t *de = xfs_dir_lookup(ip, name); fuse_reply_entry(req, &(struct fuse_entry_param){ .ino = de->inumber, .generation = ip->i_generation, .attr_timeout = 1.0, .entry_timeout = 1.0 }); } XFS divides the disk into equal-sized Allocation Groups. In fuse-xfs , each AG is a mmap() of a region in a backing file ( /var/lib/fuse-xfs/ag0.bin ). Reads and writes become pointer dereferences.

Want to understand delayed allocation? Step through xfs_iomap_write_delay() in userspace with printfs . Curious about AG btree splits? Corrupt an AG by writing random bytes and watch fuse-xfs segfault at the exact line of code where validation fails. fuse-xfs

Why? Because XFS inodes have a generation number (to handle inode reuse), and the low-level API lets us pass that back to the kernel’s dcache. Want to understand delayed allocation

This is where the kernel-to-userspace shift gets interesting. In the kernel, XFS uses xfs_buf_t with b_ops for verification. In fuse-xfs , we just cast: Corrupt an AG by writing random bytes and