关于BTRFS与EXT4写操作对比及CoW行为追踪的技术咨询
问题:BTRFS与EXT4写操作(含CoW)的磁盘写入时机追踪
项目背景
我是Linux内核新手,正在开展BTRFS与EXT4写操作对比项目,重点研究BTRFS在文件复制时的*Copy-on-Write(CoW)*行为。需要在内核源码中植入printk()记录CoW行为,测试场景如下:
- 在EXT4和BTRFS挂载磁盘中各创建2MB文件
- 分别用
cp(EXT4)和cp --reflink=auto(BTRFS)重复复制文件 - 需打印inode号、文件路径及偏移量
已完成的工作
追踪VFS写调用
确定ext4_file_write_iter()和btrfs_file_write_iter()是实际处理写数据的函数,已在ext4_file_write_iter()中添加printk代码(如下),并对BTRFS做了类似修改。结果显示:BTRFS仅原文件触发write(),EXT4复制文件也会触发write()。static ssize_t ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) { struct inode *inode = file_inode(iocb->ki_filp); char *pathname = NULL; struct file *file = iocb->ki_filp; struct path *path = &file->f_path; pathname = kmalloc(PATH_MAX, GFP_KERNEL); ktime_t time_ktime = ktime_get_real(); s64 time_ms = ktime_to_ms(time_ktime); if (pathname) { char *p = d_path(path, pathname, PATH_MAX); if (!IS_ERR(p)) { if (strstr(p, "ext4_dir")) { printk(KERN_INFO "EXT4 write: TIME=%llu, PATH=%s, INODE=%lu, OFFSET=%llu\n", time_ms, p, inode->i_ino, iocb->ki_pos); } } kfree(pathname); } if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; #ifdef CONFIG_FS_DAX if (IS_DAX(inode)) return ext4_dax_write_iter(iocb, from); #endif if (iocb->ki_flags & IOCB_DIRECT) return ext4_dio_write_iter(iocb, from); else return ext4_buffered_write_iter(iocb, from); }但该方式仅记录数据写入内存的时刻,我需要的是记录内存数据写入磁盘的时刻。
尝试
ext4_sync_file()失败
曾在ext4_sync_file()中添加日志,但该函数仅在fsync()调用时触发,不符合当前仅创建并复制文件的测试场景。当前考虑方向
计划将printk()植入ext4_bio_write_page(),因为该函数与文件页写入磁盘的操作密切相关。
需求
希望纠正上述可能的错误假设,并确认当前方向是否正确。
内容的提问来源于stack exchange,提问作者Winny
相关产品推荐
相关产品推荐

