LINUX.ORG.RU

[Просьба] тест патча ядра на Advanced Format дисках (4k sector)

 


0

1

Нижеприведенный патч на ядро был предназначен для того чтобы подружить ext4 с жестким диском, который не может писать/читать блоками менее, чем по 4k, хотя сообщает о логическом размере в 512 байт. В обсуждении мне указали, что он портит жизнь в следующей ситуации: Кто-то на AF-диске (4k) создаёт ext4 с размером блока в 1k (бывают разные странности у людей). После применения патча смонтировать такую фс будет невозможно.

У меня нет в наличии такого диска, поэтому я прошу тех, у кого он есть, проверить эту гипотезу. Если mkfs.ext4 не дает сделать -b 1024, можно скопировать тестовый раздел в файл, создать фс в файле, а потом файл залить обратно на раздел. (В этом случае еще интересно, дает ли обычное ядро смонтировать такой раздел.)

diff -ur vanilla/linux-2.6.37-rc5/fs/block_dev.c linux-2.6.37-rc5/fs/block_dev.c
--- vanilla/linux-2.6.37-rc5/fs/block_dev.c   2010-12-07 04:09:04.000000000 +0000
+++ linux-2.6.37-rc5/fs/block_dev.c   2010-12-15 20:11:19.311387630 +0000
@@ -121,7 +121,7 @@
 
 int sb_min_blocksize(struct super_block *sb, int size)
 {
-   int minsize = bdev_logical_block_size(sb->s_bdev);
+   int minsize = bdev_physical_block_size(sb->s_bdev);
    if (size < minsize)
       size = minsize;
    return sb_set_blocksize(sb, size);
★★★★★

>который не может писать/читать блоками менее, чем по 4k, хотя сообщает о логическом размере в 512 байт.

Непонятно, чем этот патч может помочь. Для суперблока в ext234 есть хак, позволяющий прочитать суперблок со смещением от раздела при любом размере блока, т.е. он тут у вас прочитает 4кб и прибавит, сколько надо. Но дальше-то все I/O по 1 кб все равно не пройдет.

Murr ★★
()
Ответ на: комментарий от Murr

Собственно чтение суперблока — это единственный ввод-вывод, который у меня происходил невыровненным и блоком менее 4кб. С этим патчем ы sb_set_blocksize передается размер 4096, где он заносится в s_blocksize структуры sb. Я не понимаю того, как работает ФС, но могу предположить, что если есть поле s_blocksize, то оно где-то используется.

Вопрос был не в том, поможет ли мне патч. Вопрос заключается в том, не ломает ли он работу ext4 на AF дисках с эмуляцией 512-байтных секторов.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

С этим патчем ы sb_set_blocksize передается размер 4096, где он заносится в s_blocksize структуры sb.

static int ext3_fill_super (struct super_block *sb, void *data, int silent) {
...
        blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);

        if (blocksize < EXT3_MIN_BLOCK_SIZE ||
            blocksize > EXT3_MAX_BLOCK_SIZE) {
                printk(KERN_ERR 
                       "EXT3-fs: Unsupported filesystem blocksize %d on %s.\n",
                       blocksize, sb->s_id);
                goto failed_mount;
        }

        hblock = bdev_hardsect_size(sb->s_bdev);
        if (sb->s_blocksize != blocksize) {
...
                sb_set_blocksize(sb, blocksize);

В результате этой операции будет сделано сравнение if (4096 != 1024) и в sb_set_blocksize уйдет 1024. Потом это попадет в sb_blocksize и sb_blocksize_bits, а оттуда для inode в i_blkbits и будет использоваться для чтения и записи данных.

do_mpage_readpage сделает поблочный запрос на чтение. При полном отсутствии фрагментации запрос объединится в один запрос на 4 кб, но при наличии фрагментации уйдут отдельные запросы (и будет облом, если только драйвер сам не умеет обрабатывать эту ситуацию, но по вводным данным не умеет).

Murr ★★
()
Ответ на: комментарий от Murr

уйдут отдельные запросы (и будет облом, если только драйвер сам не умеет обрабатывать эту ситуацию, но по вводным данным не умеет).

Облом будет на моём диске, так как он не может обработать такие запросы.
AF 512e диски умеют читать и писать по 512 байт, но делают это медленно. Приведенный кусок кода не вызовет у них проблем с чтением-записью, просто скорость будет низкая. Собственно у них и на оригинальном ядре будут такие же скорости.

i-rinat ★★★★★
() автор топика

Похоже, нашел способ проверить без покупки AF диска.

diff -ur linux-2.6.38-rc4-orig/drivers/ata/libata-core.c linux-2.6.38-rc4/drivers/ata/libata-core.c
--- linux-2.6.38-rc4-orig/drivers/ata/libata-core.c	2011-02-08 00:03:55.000000000 +0000
+++ linux-2.6.38-rc4/drivers/ata/libata-core.c	2011-03-01 18:01:31.859956475 +0000
@@ -1907,6 +1907,8 @@
 	else
 		err_mask = ata_do_dev_read_id(dev, &tf, id);
 
+	id[106] = 0x6003; // 4kb imitation
+
 	if (err_mask) {
 		if (err_mask & AC_ERR_NODEV_HINT) {
 			ata_dev_printk(dev, KERN_DEBUG,

И все диски «становятся» Advanced Format с эмуляцией.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от Murr

> do_mpage_readpage

Спасибо за информацию, теперь понятно, в каком направлении двигаться.

i-rinat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.