You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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号、文件路径及偏移量

已完成的工作

  1. 追踪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);
    }
    

    但该方式仅记录数据写入内存的时刻,我需要的是记录内存数据写入磁盘的时刻。

  2. 尝试ext4_sync_file()失败
    曾在ext4_sync_file()中添加日志,但该函数仅在fsync()调用时触发,不符合当前仅创建并复制文件的测试场景。

  3. 当前考虑方向
    计划将printk()植入ext4_bio_write_page(),因为该函数与文件页写入磁盘的操作密切相关。

需求

希望纠正上述可能的错误假设,并确认当前方向是否正确。

内容的提问来源于stack exchange,提问作者Winny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:23:29