<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Фильтр block device в Линукс</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html</link>
    <description>Всем доброго времени суток.&lt;br&gt;&lt;br&gt;Изучаю потихоньку разработку модулей ядра. И пытаюсь написать простенький фильтр для блочного устройства. &lt;br&gt;&lt;br&gt;Если я все правильно понимаю, теоретически то на каждую операцию записи и чтения должны вызываться функция make_request_fn, которую я собственно перехватываю. Проблема в том, что я вижу вызовы этой функции на запись, и изредка на чтение. Такое ощущение, что данные либо где-то кэшируются, либо используется еще какой-то механизм..&lt;br&gt;&lt;br&gt;Собственно вопрос в том, почему так происходит?&lt;br&gt;&lt;br&gt;Вот мой код:&lt;br&gt;&lt;br&gt;#include &amp;lt;linux/kernel.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/init.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/fs.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/blkdev.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/buffer_head.h&amp;gt;&lt;br&gt;#define PARTITION_NAME &quot;/dev/sdb&quot;&lt;br&gt;&lt;br&gt;&lt;br&gt;char *ptr;&lt;br&gt;int i;&lt;br&gt;struct block_device *bd;&lt;br&gt;make_request_fn *orig_mrqfn;&lt;br&gt; &lt;br&gt;static void filter_mrqfn(struct request_queue *rq, struct bio *b)&lt;br&gt;&#123;&lt;br&gt;printk(KERN_INFO &quot;filter: Sector=lu Size=&#037;d bi_rw=&#037;lu&#092;n&quot;, b-&amp;gt;bi_sector, b-&amp;gt;bi_size, b-&amp;gt;bi_rw);&lt;br&gt;&lt;br&gt;ptr=(char *)bio_data(b);&lt;br&gt;for(i=</description>

<item>
    <title>Фильтр block device в Линукс (Doublehead)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#7</link>
    <pubDate>Tue, 13 Nov 2018 18:44:45 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt; Диск примонтирован? Может дисковый кэш. Что будет при команде sync?&lt;br&gt;&amp;gt;&amp;gt; Без разницы смонтирован диск или нет, на устройстве может вообще не быть &lt;br&gt;&amp;gt;&amp;gt; никакой ФС, так как вызов make_request_fn в данном случае лежит сразу &lt;br&gt;&amp;gt;&amp;gt; над драйвером физического устройства.&lt;br&gt;&amp;gt; Удалось разобраться ?&lt;br&gt;&lt;br&gt;Сорри, поторопился я с ответом. Сейчас в код глянул, там вот такое. Насколько я помню, это работает и на запись и на чтение, но при большой нагрузке валит систему. Разбираться почему это происходит было, честно говоря уже лень. Если разберетесь, не забудьте поделиться :) &lt;br&gt;&lt;br&gt;&lt;br&gt;#include &amp;lt;linux/init.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/fs.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/blkdev.h&amp;gt;&lt;br&gt;#include &amp;lt;linux/buffer_head.h&amp;gt;&lt;br&gt;#define PARTITION_NAME &quot;/dev/sdb&quot;&lt;br&gt;&lt;br&gt;&lt;br&gt;char *ptr;&lt;br&gt;int i;&lt;br&gt;&lt;br&gt;struct block_device *bd;&lt;br&gt;&lt;br&gt;make_request_fn *orig_mrqfn;&lt;br&gt;&lt;br&gt;bio_end_io_t *old_endio;&lt;br&gt;&lt;br&gt;// BIOs set&lt;br&gt;struct bio_set * bs;&lt;br&gt;&lt;br&gt;// HOOKs&lt;br&gt;static struct kmem_cache *my_hooks;&lt;br&gt;&lt;br&gt;// HOOK&lt;br&gt;struct hook&#123;&lt;br&gt;void *old_private;&lt;br&gt;bio_end_io_t *old_endio;&lt;br&gt;struct bio </description>
</item>

<item>
    <title>Фильтр block device в Линукс (Doublehead)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#6</link>
    <pubDate>Tue, 13 Nov 2018 18:17:24 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt; Диск примонтирован? Может дисковый кэш. Что будет при команде sync?&lt;br&gt;&amp;gt;&amp;gt; Без разницы смонтирован диск или нет, на устройстве может вообще не быть &lt;br&gt;&amp;gt;&amp;gt; никакой ФС, так как вызов make_request_fn в данном случае лежит сразу &lt;br&gt;&amp;gt;&amp;gt; над драйвером физического устройства.&lt;br&gt;&amp;gt; Удалось разобраться ?&lt;br&gt;&lt;br&gt;Нет, увы. Забросил. &lt;br&gt;А у вас тоже такая же проблема?&lt;br&gt;</description>
</item>

<item>
    <title>Фильтр block device в Линукс (SysManOne)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#5</link>
    <pubDate>Tue, 13 Nov 2018 14:32:51 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Диск примонтирован? Может дисковый кэш. Что будет при команде sync?&lt;br&gt;&amp;gt; Без разницы смонтирован диск или нет, на устройстве может вообще не быть &lt;br&gt;&amp;gt; никакой ФС, так как вызов make_request_fn в данном случае лежит сразу &lt;br&gt;&amp;gt; над драйвером физического устройства.&lt;br&gt;&lt;br&gt;Удалось разобраться ?&lt;br&gt;</description>
</item>

<item>
    <title>Фильтр block device в Линукс (DoubleHead)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#4</link>
    <pubDate>Fri, 26 Jun 2015 17:57:47 GMT</pubDate>
    <description>&amp;gt; Диск примонтирован? Может дисковый кэш. Что будет при команде sync?&lt;br&gt;&lt;br&gt;Без разницы смонтирован диск или нет, на устройстве может вообще не быть никакой ФС, так как вызов make_request_fn в данном случае лежит сразу над драйвером физического устройства. &lt;br&gt;</description>
</item>

<item>
    <title>Фильтр block device в Линукс (DoubleHead)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#3</link>
    <pubDate>Fri, 26 Jun 2015 17:53:53 GMT</pubDate>
    <description>&amp;gt; Что у вас на /dev/sdb? Гадать не буду, такое поведение, значит так &lt;br&gt;&amp;gt; и есть. Может дисковый кэш сбрасывается. Можно посмотреть что при команде &lt;br&gt;&amp;gt; sync будет.&lt;br&gt;&lt;br&gt;/dev/sdb это SCSI диск в виртуалке. &lt;br&gt;&lt;br&gt;При выполнении sync как и ожидается происходит запись буферизофанных данных и вызов make_request_fn(). &lt;br&gt;&lt;br&gt;Поведение меня смущает только тем, что я не вижу операций чтения. На небольших файлах, ну скажем выполнение echo 1234 &amp;gt; /mnt/mydevice/1 логично вызывают несколько операций записи и соответственно вызовов перехваченной функции и я их вижу. А последующая cat /mnt/mydevice/1 отрабатывая совершенно нормально не влечет за собой вызовов моей функции, хотя должно бы.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Фильтр block device в Линукс (Павел Самсонов)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#2</link>
    <pubDate>Fri, 26 Jun 2015 17:31:04 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;  printk(KERN_DEBUG &quot;filter: &#037;s&#092;n&quot;, __FUNCTION__); &lt;br&gt;&amp;gt;  restore_mrqfn(); &lt;br&gt;&amp;gt;  if (!IS_ERR(bd)) &#123; &lt;br&gt;&amp;gt;   blkdev_put(bd, FMODE_READ); &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; module_init(filter_init); &lt;br&gt;&amp;gt; module_exit(filter_exit); &lt;br&gt;&amp;gt; MODULE_LICENSE(&quot;Dual MIT/GPL&quot;); &lt;br&gt;&amp;gt; MODULE_AUTHOR(&quot;Me&quot;); &lt;br&gt;&lt;br&gt;Диск примонтирован? Может дисковый кэш. Что будет при команде sync?&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Фильтр block device в Линукс (Павел Самсонов)</title>
    <link>https://www.solaris.opennet.ru/openforum/vsluhforumID9/10020.html#1</link>
    <pubDate>Fri, 26 Jun 2015 17:13:58 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;  printk(KERN_DEBUG &quot;filter: &#037;s&#092;n&quot;, __FUNCTION__); &lt;br&gt;&amp;gt;  restore_mrqfn(); &lt;br&gt;&amp;gt;  if (!IS_ERR(bd)) &#123; &lt;br&gt;&amp;gt;   blkdev_put(bd, FMODE_READ); &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; module_init(filter_init); &lt;br&gt;&amp;gt; module_exit(filter_exit); &lt;br&gt;&amp;gt; MODULE_LICENSE(&quot;Dual MIT/GPL&quot;); &lt;br&gt;&amp;gt; MODULE_AUTHOR(&quot;Me&quot;); &lt;br&gt;&lt;br&gt;Что у вас на /dev/sdb? Гадать не буду, такое поведение, значит так и есть. Может дисковый кэш сбрасывается. Можно посмотреть что при команде sync будет.&lt;br&gt;</description>
</item>

</channel>
</rss>
