Я очень новичок в ядре 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
Функция исходного кода Linux ядра, которая записывает данные из памяти на диск ⇐ Linux
1744371382
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 (). Поскольку я создаю только один файл, затем копирую его, это было не очень хорошо. может исправить любые неправильные предположения, которые я сделал выше, и если я на правильном пути.
Подробнее здесь: [url]https://stackoverflow.com/questions/79568749/linux-kernel-source-code-function-that-writes-data-from-memory-to-disk[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия