Функция исходного кода Linux ядра, которая записывает данные из памяти на дискLinux

Ответить
Anonymous
 Функция исходного кода Linux ядра, которая записывает данные из памяти на диск

Сообщение Anonymous »

Я очень новичок в ядре Linux, и я просто хотел задать вопрос о моем проекте. Проект о сравнении операции записи между BTRFS и EXT4. В частности, я хочу посмотреть, как BTRFS использует копию на записи при копировании файла. В тестовой среде я создал 2MB -файл на диск Ext4 и BTRFS. Затем я неоднократно скопировал файл, используя CP для EXT4 и CP --REFLINK = AUTO для BTRFS. Поскольку я хочу распечатать номер iNode, путь файла и смещение файла. < /P>
Мои инициативы: < /p>

Я следил за тем, как VFS реагирует на вызовы write () и определил, что ext4_file_write_iter () и btrfs_fil_write_write_write_witer () на самом деле называют. /> < /ol>
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);
}

< /code>
Это работает очень хорошо и делало подобное для BTRF. Это показало мне, что только исходный файл вызывает write () для btrfs, но даже скопированные файлы вызывают write () в ext4. < /P>

Однако я понял, что это показывает только тогда, когда данные написаны в памяти. Я хотел войти в систему в тот момент, когда данные в памяти записываются на диск. В классе я узнал, что Kworker синхронизирует данные о грязных битах от памяти в кэш. Это побудило меня разместить журналы внутри ext4_sync_file (). Это звучало как хорошее решение, но я узнал, что эта функция вызывается, когда называется fsync (). Поскольку я создаю только один файл, затем копирую его, это было не очень хорошо. может исправить любые неправильные предположения, которые я сделал выше, и если я на правильном пути.

Подробнее здесь: https://stackoverflow.com/questions/795 ... ry-to-disk
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»