<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Разработка ФС]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=10885</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=10885&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Разработка ФС».]]></description>
		<lastBuildDate>Fri, 25 Feb 2011 18:10:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=149950#p149950</link>
			<description><![CDATA[<p>дали почитать талмуд Бовет, Чезати &quot;Ядро Linux&quot; - книжка ответила почти на все вопросы. <strong>drBatty</strong>, спасибо за помощь.</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Fri, 25 Feb 2011 18:10:43 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=149950#p149950</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147583#p147583</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>вопрос не совсем понятен у extX в том и прелесть, что они обладают совместимостью во всех направлениях(и обратной и прямой). А то что (у меня) 2 - это действительно 2 я уверен(как минимум работает человеческий undelete)</p></blockquote></div><p>а у меня не работает...</p></blockquote></div><p>был не прав:<br />ext2 монтируется как ext[2,4]<br />ext3 монтируется как ext[2,3,4]<br />ext4 монтируется как ext4 только</p><p>эксперементы:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh"><br />tmp # dd if=/dev/zero of=file<br />^C293108+0 записей считано<br />293107+0 записей написано<br /> скопировано 150070784 байта (150 MB), 1,53825 c, 97,6 MB/c</p><p>tmp # mkfs.ext2 file<br />mke2fs 1.41.12 (17-May-2010)<br />file is not a block special device.<br />Proceed anyway? (y,n) y<br />Filesystem label=<br />OS type: Linux<br />Block size=1024 (log=0)<br />Fragment size=1024 (log=0)<br />Stride=0 blocks, Stripe width=0 blocks<br />36720 inodes, 146552 blocks<br />7327 blocks (5.00%) reserved for the super user<br />First data block=1<br />Maximum filesystem blocks=67371008<br />18 block groups<br />8192 blocks per group, 8192 fragments per group<br />2040 inodes per group<br />Superblock backups stored on blocks:<br />&nbsp; &nbsp; &nbsp; &nbsp; 8193, 24577, 40961, 57345, 73729</p><p>Writing inode tables: done<br />Writing superblocks and filesystem accounting information: done</p><p>This filesystem will be automatically checked every 24 mounts or<br />180 days, whichever comes first.&nbsp; Use tune2fs -c or -i to override.<br />tmp # mkdir mountdir<br />tmp # mount -o loop file mountdir/<br />tmp # cp /usr/portage/a* mountdir/ -R<br />tmp # umount mountdir/<br />tmp # sudo mount -t ext3 -o loop file mountdir/<br />mount: wrong fs type, bad option, bad superblock on /dev/loop0,<br />&nbsp; &nbsp; &nbsp; &nbsp;missing codepage or helper program, or other error<br />&nbsp; &nbsp; &nbsp; &nbsp;В некоторых случаях полезная информация может быть<br />&nbsp; &nbsp; &nbsp; &nbsp;найдена в syslog - попробуйте dmesg | tail или что-то<br />&nbsp; &nbsp; &nbsp; &nbsp;в этом роде</p><p>tmp # ls mountdir/<br />tmp # sudo mount -t ext4 -o loop file mountdir/<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; app-xemacs<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim&nbsp; &nbsp;lost+found<br />tmp # rm -r mountdir/app-xemacs/<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; lost+found<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim<br />tmp # umount mountdir/<br />tmp # sudo mkfs.ext3 file<br />mke2fs 1.41.12 (17-May-2010)<br />file is not a block special device.<br />Proceed anyway? (y,n) y<br />Filesystem label=<br />OS type: Linux<br />Block size=1024 (log=0)<br />Fragment size=1024 (log=0)<br />Stride=0 blocks, Stripe width=0 blocks<br />36720 inodes, 146552 blocks<br />7327 blocks (5.00%) reserved for the super user<br />First data block=1<br />Maximum filesystem blocks=67371008<br />18 block groups<br />8192 blocks per group, 8192 fragments per group<br />2040 inodes per group<br />Superblock backups stored on blocks:<br />&nbsp; &nbsp; &nbsp; &nbsp; 8193, 24577, 40961, 57345, 73729</p><p>Writing inode tables: done<br />Creating journal (4096 blocks): done<br />Writing superblocks and filesystem accounting information: done</p><p>This filesystem will be automatically checked every 26 mounts or<br />180 days, whichever comes first.&nbsp; Use tune2fs -c or -i to override.<br />tmp # sudo mount -t ext2 -o loop file mountdir/<br />tmp # cp /usr/portage/a* mountdir/ -R<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; app-xemacs<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim&nbsp; &nbsp;lost+found<br />tmp # umount mountdir/<br />tmp # sudo mount -t ext3 -o loop file mountdir/<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; app-xemacs<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim&nbsp; &nbsp;lost+found<br />tmp # umount mountdir/<br />tmp # sudo mount -t ext4 -o loop file mountdir/<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; app-xemacs<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim&nbsp; &nbsp;lost+found<br />tmp # rm -r mountdir/app-xemacs/<br />tmp # ls mountdir/<br />app-accessibility&nbsp; app-antivirus&nbsp; app-backup&nbsp; &nbsp; &nbsp; app-cdr&nbsp; &nbsp; app-dicts&nbsp; app-editors&nbsp; app-emulation&nbsp; app-i18n&nbsp; &nbsp; app-misc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app-office&nbsp; app-portage&nbsp; app-text&nbsp; lost+found<br />app-admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; app-arch&nbsp; &nbsp; &nbsp; &nbsp;app-benchmarks&nbsp; app-crypt&nbsp; app-doc&nbsp; &nbsp; app-emacs&nbsp; &nbsp; app-forensics&nbsp; app-laptop&nbsp; app-mobilephone&nbsp; app-pda&nbsp; &nbsp; &nbsp;app-shells&nbsp; &nbsp;app-vim<br />tmp # umount mountdir/<br />tmp # mkfs.ext4 file<br />mke2fs 1.41.12 (17-May-2010)<br />file is not a block special device.<br />Proceed anyway? (y,n) y<br />Filesystem label=<br />OS type: Linux<br />Block size=1024 (log=0)<br />Fragment size=1024 (log=0)<br />Stride=0 blocks, Stripe width=0 blocks<br />36720 inodes, 146552 blocks<br />7327 blocks (5.00%) reserved for the super user<br />First data block=1<br />Maximum filesystem blocks=67371008<br />18 block groups<br />8192 blocks per group, 8192 fragments per group<br />2040 inodes per group<br />Superblock backups stored on blocks:<br />&nbsp; &nbsp; &nbsp; &nbsp; 8193, 24577, 40961, 57345, 73729</p><p>Writing inode tables: done<br />Creating journal (4096 blocks): done<br />Writing superblocks and filesystem accounting information: done</p><p>This filesystem will be automatically checked every 27 mounts or<br />180 days, whichever comes first.&nbsp; Use tune2fs -c or -i to override.<br />goblin tmp # mount -t ext2 -o loop file mountdir/<br />mount: wrong fs type, bad option, bad superblock on /dev/loop0,<br />&nbsp; &nbsp; &nbsp; &nbsp;missing codepage or helper program, or other error<br />&nbsp; &nbsp; &nbsp; &nbsp;В некоторых случаях полезная информация может быть<br />&nbsp; &nbsp; &nbsp; &nbsp;найдена в syslog - попробуйте dmesg | tail или что-то<br />&nbsp; &nbsp; &nbsp; &nbsp;в этом роде</p><p>tmp # mount -t ext3 -o loop file mountdir/<br />mount: wrong fs type, bad option, bad superblock on /dev/loop0,<br />&nbsp; &nbsp; &nbsp; &nbsp;missing codepage or helper program, or other error<br />&nbsp; &nbsp; &nbsp; &nbsp;В некоторых случаях полезная информация может быть<br />&nbsp; &nbsp; &nbsp; &nbsp;найдена в syslog - попробуйте dmesg | tail или что-то<br />&nbsp; &nbsp; &nbsp; &nbsp;в этом роде</p><p></div><br />ругань из dmesg:<br /></p><div class="codebox"><pre><code>[63516.350370] EXT3-fs (loop0): error: no journal found. mounting ext3 over ext2?
[63531.752337] EXT4-fs (loop0): mounted filesystem without journal. Opts: (null)
[64834.130508] EXT2-fs (loop0): warning: mounting ext3 filesystem as ext2
[64986.218178] EXT3-fs: barriers not enabled
[64986.218209] kjournald starting.  Commit interval 5 seconds
[64986.218242] EXT3-fs (loop0): using internal journal
[64986.218246] EXT3-fs (loop0): mounted filesystem with writeback data mode
[65001.334499] EXT4-fs (loop0): mounted filesystem with ordered data mode. Opts: (null)
[65775.969452] EXT2-fs (loop0): error: couldn&#039;t mount because of unsupported optional features (240)
[65782.602635] EXT3-fs (loop0): error: couldn&#039;t mount because of unsupported optional features (240)</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 20 Feb 2011 15:29:29 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147583#p147583</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147477#p147477</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>вопрос не совсем понятен у extX в том и прелесть, что они обладают совместимостью во всех направлениях(и обратной и прямой). А то что (у меня) 2 - это действительно 2 я уверен(как минимум работает человеческий undelete)</p></blockquote></div><p>а у меня не работает...<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>unsigned char s_blocksize_bits; // ???</p></blockquote></div><p>ЕМНИП это тоже что и размер блока, только для скорости оно как-то по другому записано. вроде-бы там логарифм от 2, для того-что-бы скажем сдвинуть число влево на 12, и получить из числа блоков байты. (12 == log2(4096))<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>// что за магическое число до сих пор не понимаю... (похоже или UUID, или уникальный для каждого типа ФС)</p></blockquote></div><p>это тип FS. если команде mount не указать ФС (auto), то она читает суперблок, и если в нужном месте число 0xEF53, она предполагает, что это какая-то EXT. Это не очень надёжно конечно, с вероятностью 1/65536 она может принять данные скажем из NTFS как EXT, и соответственно напишет &quot;инвалидный суперблок&quot;.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>int s_count; // ???</p></blockquote></div><p>скорее всего это счётчик свободных блоков. надо дальше по коду смотреть...<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>struct mtd_info *s_mtd; // ???</p></blockquote></div><p>ЕМНИП когда и как монтировалась ФС в посл. раз.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>и всё таки оно показывает только опции монтирования... в текстовом виде(см. последний член структуры)</p></blockquote></div><p>ну значит так...</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Sun, 20 Feb 2011 11:38:56 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147477#p147477</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147431#p147431</link>
			<description><![CDATA[<p>для полноты картины не хватало:<br /><strong>include/linux/fs.h</strong> <span style="color: blue">struct super_block</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>struct super_block {
    struct list_head    s_list;        /* Keep this first */  // заголовок списка суперблоков
    dev_t            s_dev;        /* search index; _not_ kdev_t */ // пока не ясно что это
    unsigned char        s_dirt;  // флаг грязности инода
    unsigned char        s_blocksize_bits; // ???
    unsigned long        s_blocksize; // размер блока данных
    loff_t            s_maxbytes;    /* Max file size */
    struct file_system_type    *s_type;  // указатель на тип ФС ()
    const struct super_operations    *s_op;  // список доступных операций
    const struct dquot_operations    *dq_op;  // операции связанные с квотами
    const struct quotactl_ops    *s_qcop;  // в ту же степь
    const struct export_operations *s_export_op;  //ещё какие-то операции
    unsigned long        s_flags;  // флаги какие-то
    unsigned long        s_magic; // что за магическое число до сих пор не понимаю... (похоже или UUID, или уникальный для каждого типа ФС)
    struct dentry        *s_root;  // указатель на структуру связанную с корнем
    struct rw_semaphore    s_umount; // видимо блокировка отмонтирования при работе с ФС
    struct mutex        s_lock; // а это бокировка на монопольный доступ к ФС
    int            s_count; // ???
    atomic_t        s_active; // ???
#ifdef CONFIG_SECURITY
    void                    *s_security;
#endif
    const struct xattr_handler **s_xattr;  // тоже операции/обработчики чего-то связанного с xattr&#039;ами 

    struct list_head    s_inodes;    /* all inodes */
    struct hlist_head    s_anon;        /* anonymous dentries for (nfs) exporting */
#ifdef CONFIG_SMP
    struct list_head __percpu *s_files;
#else
    struct list_head    s_files;  // список открытых файлов 
#endif
    /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */
    struct list_head    s_dentry_lru;    /* unused dentry lru */
    int            s_nr_dentry_unused;    /* # of dentry on lru */

    struct block_device    *s_bdev;  // блочное устройство, ассоциированное с ФС
    struct backing_dev_info *s_bdi;  // ???
    struct mtd_info        *s_mtd; // ???
    struct list_head    s_instances; // ???
    struct quota_info    s_dquot;    /* Diskquota specific options */

    int            s_frozen; // ???
    wait_queue_head_t    s_wait_unfrozen; // ???

    char s_id[32];                /* Informational name */

    void             *s_fs_info;    /* Filesystem private info */
    fmode_t            s_mode; // ???

    /* Granularity of c/m/atime in ns.
       Cannot be worse than a second */
    u32           s_time_gran; // надо понять, что такое грунул[ярность/ирование]

    /*
     * The next field is for VFS *only*. No filesystems have any business
     * even looking at it. You had been warned.
     */
    struct mutex s_vfs_rename_mutex;    /* Kludge */ 

    /*
     * Filesystem subtype.  If non-empty the filesystem type field
     * in /proc/mounts will be &quot;type.subtype&quot;
     */
    char *s_subtype;

    /*
     * Saved mount options for lazy filesystems using
     * generic_show_options()
     */
    char *s_options;  // опа на...
};</code></pre></div></div></div><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p> <br />.show_options = ext2_show_options, // тоже пока загадка</p></blockquote></div><p>в зависимости от версии ФС не все фичи могут быть доступны, например ACL, которая по умолчанию выключена. Но её можно и включить. Естественно необходим механизм для проверки этого.</p></blockquote></div><p>и всё таки оно показывает только опции монтирования... в текстовом виде(см. последний член структуры)</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 20 Feb 2011 10:45:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147431#p147431</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147401#p147401</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>зависит. вопрос в том, модулем оно, или в самом ядре. mkfs естественно умеет и так и так.</p></blockquote></div><p>в том то и идея... оно вообще выпилено из ядра (и модуль не собран, само собой).<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>Вы можете проверить, настоящая-ли у вас EXT2 - достаточно посмотреть, затирает-ли она нулями координаты блоков данных. EXT2 не затирает, а EXT3 без журнала - не затирает. Разница существенная, ибо на EXT3 без журнала не работает undelete.</p></blockquote></div><p>не совсем согласен: затирание - дело драйвера. Если драйвер ext2 не знает о том, что нужно затирать нулями, то за него магическая сила это делать не будет...<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>создание ФС конечно от ядра и не должно зависить, но вот сможете-ли вы смонтировать вашу EXT2, или нет... И является-ли эта EXT2 действительно 2?...</p></blockquote></div><p>вопрос не совсем понятен у extX в том и прелесть, что они обладают совместимостью во всех направлениях(и обратной и прямой). А то что (у меня) 2 - это действительно 2 я уверен(как минимум работает человеческий undelete)<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>&quot;грязный&quot; в том смысле, что например произошло создание файла, и соответственно число свободных инодов уменьшилось. дело в том, что суперблок обычно расположен далеко от данных, и что-бы лишний раз не дёргать головками, запись в суперблок откладывается до выполнения этой функции. Она выполняется либо ядром, когда нечего делать, либо во время размонтирования носителя.</p></blockquote></div><p>это понятно... просто ёкнуло, что должны сбрасываться ещё и буферы данных... сейчас вспомнил, что буферизация данных находится на уровне устройств.<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>это как раз самое интересное. Вот эти данные:<br /># tune2fs -l /dev/sda3</p></blockquote></div><p>интересно, но не то... это текстовая строка, в которой, как минимум, может находится &quot;sb=N&quot; (N - смещение с которого читаем суперблок). Вопрос был откуда она по коду приходит (есть предположение, что она идёт из mount). Это было в той части, которую я опустил.<br /></p><div class="codebox"><pre><code>    unsigned long sb_block = get_sb_block(&amp;data);</code></pre></div><p><strong>fs/ext2/super.c</strong> <span style="color: blue">static unsigned long get_sb_block()</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>static unsigned long get_sb_block(void **data)
{
    unsigned long     sb_block;
    char         *options = (char *) *data;

    if (!options || strncmp(options, &quot;sb=&quot;, 3) != 0)
        return 1;    /* Default location */
    options += 3;
    sb_block = simple_strtoul(options, &amp;options, 0);
    if (*options &amp;&amp; *options != &#039;,&#039;) {
        printk(&quot;EXT2-fs: Invalid sb specification: %s\n&quot;,
               (char *) *data);
        return 1;
    }
    if (*options == &#039;,&#039;)
        options++;
    *data = (void *) options;
    return sb_block;
}</code></pre></div></div></div><p>а то что вы назвали должно содержаться в es или sbi(если смотреть по коду)</p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>в зависимости от версии ФС не все фичи могут быть доступны, например ACL, которая по умолчанию выключена. Но её можно и включить. Естественно необходим механизм для проверки этого.</p></blockquote></div><p> понял, правда тут, наверное в зависимости от того как модуль собран зависит...<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>где-то у меня валялось годное описание, поищу...</p></blockquote></div><p>заранее спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 20 Feb 2011 10:13:01 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147401#p147401</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147362#p147362</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>Только что попробовал создать рейзер4, хотя в ядре им и не пахнет...&nbsp; получилось, смонтировать само собой - фейл... Итого: создание ФС не зависит от ядра ни как</p></blockquote></div><p>зависит. вопрос в том, модулем оно, или в самом ядре. mkfs естественно умеет и так и так.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>А вот монтировать он точно отказывается (помню в первый раз, когда собирал, отключил ext2 и /boot не монтировался...)</p></blockquote></div><p>ну ещё-бы! именно для того и делают /boot в EXT2, что-бы их поняли старинные загрузчики. т.е. прежде всего загрузчик должен прочитать ядро, потом ядро монтирует корневой раздел, потом оттуда грузятся модули.</p><p>Сейчас это всё не играет никакой роли, ибо и загрузчики, и ядра поддерживают EXT4.</p><p>Вы можете проверить, настоящая-ли у вас EXT2 - достаточно посмотреть, затирает-ли она нулями координаты блоков данных. EXT2 не затирает, а EXT3 без журнала - не затирает. Разница существенная, ибо на EXT3 без журнала не работает undelete.</p><p>создание ФС конечно от ядра и не должно зависить, но вот сможете-ли вы смонтировать вашу EXT2, или нет... И является-ли эта EXT2 действительно 2?...</p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>data - данные, которые передали транзитом (А кстати откуда эти данные пришли и что это такое?)</p></blockquote></div><p>это как раз самое интересное. Вот эти данные:<br /># tune2fs -l /dev/sda3<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>tune2fs 1.41.11 (14-Mar-2010)<br />Filesystem volume name:&nbsp; &nbsp;&lt;none&gt;<br />Last mounted on:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /<br />Filesystem UUID:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4a9c664f-c241-4dd5-be99-399d1ae205ca<br />Filesystem magic number:&nbsp; 0xEF53<br />Filesystem revision #:&nbsp; &nbsp; 1 (dynamic)<br />Filesystem features:&nbsp; &nbsp; &nbsp; has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize<br />Filesystem flags:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;signed_directory_hash <br />Default mount options:&nbsp; &nbsp; (none)<br />Filesystem state:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;clean<br />Errors behavior:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Continue<br />Filesystem OS type:&nbsp; &nbsp; &nbsp; &nbsp;Linux<br />Inode count:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 449680<br />Block count:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1795255<br />Reserved block count:&nbsp; &nbsp; &nbsp;89762<br />Free blocks:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 404665<br />Free inodes:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 163994<br />First block:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0<br />Block size:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4096<br />Fragment size:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4096<br />Reserved GDT blocks:&nbsp; &nbsp; &nbsp; 438<br />Blocks per group:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;32768<br />Fragments per group:&nbsp; &nbsp; &nbsp; 32768<br />Inodes per group:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8176<br />Inode blocks per group:&nbsp; &nbsp;511<br />Flex block group size:&nbsp; &nbsp; 16<br />Filesystem created:&nbsp; &nbsp; &nbsp; &nbsp;Wed Feb 16 19:52:45 2011<br />Last mount time:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Sat Feb 19 21:30:27 2011<br />Last write time:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Wed Feb 16 20:41:50 2011<br />Mount count:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5<br />Maximum mount count:&nbsp; &nbsp; &nbsp; 36<br />Last checked:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Wed Feb 16 19:52:45 2011<br />Check interval:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;15552000 (6 months)<br />Next check after:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Mon Aug 15 20:52:45 2011<br />Lifetime writes:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6439 MB<br />Reserved blocks uid:&nbsp; &nbsp; &nbsp; 0 (user root)<br />Reserved blocks gid:&nbsp; &nbsp; &nbsp; 0 (group root)<br />First inode:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 11<br />Inode size:&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;256<br />Required extra isize:&nbsp; &nbsp; &nbsp;28<br />Desired extra isize:&nbsp; &nbsp; &nbsp; 28<br />Journal inode:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8<br />First orphan inode:&nbsp; &nbsp; &nbsp; &nbsp;144828<br />Default directory hash:&nbsp; &nbsp;half_md4<br />Directory Hash Seed:&nbsp; &nbsp; &nbsp; 753c461d-c8a4-4ca4-a77a-4ba9ff788bfc<br />Journal backup:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inode blocks</p></div></div><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>.sync_fs = ext2_sync_fs, // записывает грязный суперблок надиск (вычитал в книжке, сильно в этом сомневаюсь)</p></blockquote></div><p>&quot;грязный&quot; в том смысле, что например произошло создание файла, и соответственно число свободных инодов уменьшилось. дело в том, что суперблок обычно расположен далеко от данных, и что-бы лишний раз не дёргать головками, запись в суперблок откладывается до выполнения этой функции. Она выполняется либо ядром, когда нечего делать, либо во время размонтирования носителя.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>.show_options = ext2_show_options, // тоже пока загадка</p></blockquote></div><p>в зависимости от версии ФС не все фичи могут быть доступны, например ACL, которая по умолчанию выключена. Но её можно и включить. Естественно необходим механизм для проверки этого.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>ещё хотелось бы что-нить почитать о структуре самой ФС ext2</p></blockquote></div><p>где-то у меня валялось годное описание, поищу...</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Sun, 20 Feb 2011 08:49:54 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147362#p147362</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=147101#p147101</link>
			<description><![CDATA[<p>код ext2_fill_super() расписывать нет больше ни желание, ни необходимости, ибо эта зараза занимает без малого четыре сотни строк. Так что опишу просто основные действия/данные, на что ИМХО стоит обратить внимание:</p><p><strong>fs/ext2/super.c</strong> <span style="color: blue">static int ext2_fill_super()</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>static int ext2_fill_super(struct super_block *sb, void *data, int silent)
// sb - структура суперблока, которую заполняем
// data - данные, которые передали транзитом (А кстати откуда эти данные пришли и что это такое?) 
//     судя по всему это опции монтирования в виде простой текстовой строки...
{
    struct buffer_head * bh;    // заголовок буфера чтения
    struct ext2_sb_info * sbi;    // указатель на эти данные, специфические для ФС будет хранится в суперблоке
    struct ext2_super_block * es;    // структура суперблока, так, как она хранится на диске

// ...

    if (blocksize != BLOCK_SIZE) { // перещёт смешения, если суперблок находится не на границе блока устройства
        logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
        offset = (sb_block*BLOCK_SIZE) % blocksize;
    } else {
        logic_sb_block = sb_block; 
    }
    if (!(bh = sb_bread(sb, logic_sb_block))) { // собственно создание и чтение в буффер суперблока
        ext2_msg(sb, KERN_ERR, &quot;error: unable to read superblock&quot;);
        goto failed_sbi;
    }
// ...
// потом уставливаем дефолтные значения
// правим их в зависимости от опций монтирования
// проверка, не попытались ли мы использовать какие-то неподдерживаемые опции
// копирование разнообразных параметров в sbi
// ...
// что-то про группы, фрагменты итп... в общем в этом разбираться бесполезно, 
// пока более-менее не освоюсь в структуре ФС
// ...
// !а вот это очень важно!
    sb-&gt;s_op = &amp;ext2_sops; // установка структуры-списка операций над ФС
    sb-&gt;s_export_op = &amp;ext2_export_ops;  // не столь важные операции
    sb-&gt;s_xattr = ext2_xattr_handlers;  // операции над доп. атрибутами
// ...
    root = ext2_iget(sb, EXT2_ROOT_INO);  // чтение инода корня ФС
// ...
    sb-&gt;s_root = d_alloc_root(root);
// ...
    ext2_write_super(sb);  // не совсем понял, зачем нам записывать суперблок после того, как мы его загрузили
    return 0;
// ... обработка ошибок
}</code></pre></div></div></div><p><strong>fs/ext2/super.c</strong> <span style="color: blue">static const struct super_operations ext2_sops</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>static const struct super_operations ext2_sops = {
    .alloc_inode     = ext2_alloc_inode,  // выделяем инод в кеше
    .destroy_inode   = ext2_destroy_inode,  // соответственно уничтожаем инод
    .write_inode     = ext2_write_inode,  // сохранение инода на диск
    .evict_inode     = ext2_evict_inode,  // пока не понял (???) может удаление
    .put_super       = ext2_put_super,    // освобождение суперблока
    .write_super     = ext2_write_super, // запись суперблока на диск
    .sync_fs         = ext2_sync_fs,   // записывает грязный суперблок надиск (вычитал в книжке, сильно в этом сомневаюсь)
    .statfs          = ext2_statfs,   // получение статистики ФС
    .remount_fs      = ext2_remount,  // перемонтирование ФС
    .show_options    = ext2_show_options,  // тоже пока загадка
#ifdef CONFIG_QUOTA
    .quota_read      = ext2_quota_read,
    .quota_write     = ext2_quota_write,
#endif
};</code></pre></div></div></div><p>заметил, что переопределяются не все операции(например нет read_inode). Некоторые из них доступны по-умолчанию? где это можно увидеть?</p><p>Ещё: как рейзер упаковывает хвосты и мелкие файлы?</p><p>ЗЫ: наткнулся на <a href="http://www.makelinux.net/mirrors/www.os.nctu.edu.tw/2002LinuxTrace/Ext2.pdf">статью о ext2(pdf)</a>, вроде это как раз то что нужно было.<br />ЗЗЫ: ещё хотелось бы что-нить почитать о структуре самой ФС ext2</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sat, 19 Feb 2011 16:04:19 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=147101#p147101</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=146284#p146284</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>ИМХО проще всего попробовать собрать ядро без 2 и 3, и потом mkfs.ext2.</p></blockquote></div><p>А разве mkfs не полностью в юзерспейсе работает и от модулей ФС ядра вообще не зависит? А вот монтировать он точно отказывается (помню в первый раз, когда собирал, отключил ext2 и /boot не монтировался...) конечно можно смонтировать 2 как 3(или 4)... но это уже история обратной совместимости.</p><p>[added] Только что попробовал создать рейзер4, хотя в ядре им и не пахнет...&nbsp; получилось, смонтировать само собой - фейл... Итого: создание ФС не зависит от ядра ни как</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Thu, 17 Feb 2011 12:06:37 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=146284#p146284</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=146227#p146227</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>не верю я чего-то... при сборке ядра всё же собирается отдельно. Есть пруфлинк или идеи, как это проверить?</p></blockquote></div><p>ИМХО проще всего попробовать собрать ядро без 2 и 3, и потом mkfs.ext2.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Thu, 17 Feb 2011 09:15:42 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=146227#p146227</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=146143#p146143</link>
			<description><![CDATA[<p>ещё вопрос... как иноды адресуют информацию на диске? и есть ли различия в структуре инодов для каталогов/устройств/труб итп?<br />а теперь.... следующий кусок кода на разбор...</p><p><strong>fs/ext2/super.c</strong> <span style="color: blue">static int ext2_get_sb()</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>static int ext2_get_sb(struct file_system_type *fs_type,
    int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
    return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super, mnt);
}</code></pre></div><p>ничего примечательного... важно что передаём указатель на функцию ext2_fill_super().</p></div></div><p>похоже оно занимается чтением суперблока с блочного устройства... хотя собственно чтения я тут не заметил:<br /><strong>fs/super.c</strong> <span style="color: blue">static int get_sb_bdev()</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>int get_sb_bdev(struct file_system_type *fs_type,
    int flags, const char *dev_name, void *data,
    int (*fill_super)(struct super_block *, void *, int),
    struct vfsmount *mnt)
{
    struct block_device *bdev;
    struct super_block *s;
    fmode_t mode = FMODE_READ;
    int error = 0;

    if (!(flags &amp; MS_RDONLY)) //если не ридонли, то разрешаем запись
        mode |= FMODE_WRITE;

    bdev = open_bdev_exclusive(dev_name, mode, fs_type);  //открываем блочное устройство
    if (IS_ERR(bdev))  // ошибка при ахтунге
        return PTR_ERR(bdev); 

    /*
     * once the super is inserted into the list by sget, s_umount
     * will protect the lockfs code from trying to start a snapshot
     * while we are mounting
     */
    mutex_lock(&amp;bdev-&gt;bd_fsfreeze_mutex);
    if (bdev-&gt;bd_fsfreeze_count &gt; 0) {  // не очень понятно, что мы тут проверяем.. что за замороженные процессы...
        mutex_unlock(&amp;bdev-&gt;bd_fsfreeze_mutex);
        error = -EBUSY;
        goto error_bdev;
    }
    s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);  // собственно ищет и создаёт суперблок
    mutex_unlock(&amp;bdev-&gt;bd_fsfreeze_mutex);
    if (IS_ERR(s))
        goto error_s;
    // не понятно, кто бы мог это установить... похоже где-то в тёмной части c test в sget
    if (s-&gt;s_root) {
        if ((flags ^ s-&gt;s_flags) &amp; MS_RDONLY) {
            deactivate_locked_super(s);
            error = -EBUSY;
            goto error_bdev;
        }

        /*
         * s_umount nests inside bd_mutex during
         * __invalidate_device().  close_bdev_exclusive()
         * acquires bd_mutex and can&#039;t be called under
         * s_umount.  Drop s_umount temporarily.  This is safe
         * as we&#039;re holding an active reference.
         */
        up_write(&amp;s-&gt;s_umount);
        close_bdev_exclusive(bdev, mode);
        down_write(&amp;s-&gt;s_umount);
    } else {
        char b[BDEVNAME_SIZE];

        s-&gt;s_flags = flags; // устанавливаем флаги
        s-&gt;s_mode = mode; // режим
        strlcpy(s-&gt;s_id, bdevname(bdev, b), sizeof(s-&gt;s_id));  // заменяем имя
        sb_set_blocksize(s, block_size(bdev));  // устанавливаем размер блока
        error = fill_super(s, data, flags &amp; MS_SILENT ? 1 : 0);  //!!!калл-бек в модуль ФС
        if (error) {
            deactivate_locked_super(s);
            goto error;
        }

        s-&gt;s_flags |= MS_ACTIVE;
        bdev-&gt;bd_super = s;
    }

    simple_set_mnt(mnt, s);
    return 0;

error_s:
    error = PTR_ERR(s);
error_bdev:
    close_bdev_exclusive(bdev, mode);
error:
    return error;
}</code></pre></div></div></div><p><strong>fs/super.c</strong> <span style="color: blue">struct super_block *sget()</span><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>/**
 *    sget    -    find or create a superblock
 *    @type:    filesystem type superblock should belong to
 *    @test:    comparison callback
 *    @set:    setup callback
 *    @data:    argument to each of them
 */
struct super_block *sget(struct file_system_type *type,
            int (*test)(struct super_block *,void *),
            int (*set)(struct super_block *,void *),
            void *data)
{
    struct super_block *s = NULL;
    struct super_block *old;
    int err;

retry:
    spin_lock(&amp;sb_lock);
    if (test) {// если нам передали указатель на функцию тестирования суперблока, то проходим по всем спискам суперблоков для ФС и перепроверяем их(если не ошибыюсь)
        list_for_each_entry(old, &amp;type-&gt;fs_supers, s_instances) {
            if (!test(old, data))
                continue;
            if (!grab_super(old))
                goto retry;
            if (s) {
                up_write(&amp;s-&gt;s_umount);
                destroy_super(s);
                s = NULL;
            }
            down_write(&amp;old-&gt;s_umount);
            if (unlikely(!(old-&gt;s_flags &amp; MS_BORN))) {
                deactivate_locked_super(old);
                goto retry;
            }
            return old; 
        }
    }
    if (!s) { // если указатель на суперблок ==нулю(а это скорей всего так), то пытаемся его создать
        spin_unlock(&amp;sb_lock);
        s = alloc_super(type);
        if (!s)
            return ERR_PTR(-ENOMEM);
        goto retry;
    }
        
    err = set(s, data); // калл-бек
    if (err) { 
        spin_unlock(&amp;sb_lock);
        up_write(&amp;s-&gt;s_umount);
        destroy_super(s);
        return ERR_PTR(err);
    }
    s-&gt;s_type = type;  // начинаем заполнение структуры... устанавливаем тип ФС
    strlcpy(s-&gt;s_id, type-&gt;name, sizeof(s-&gt;s_id));  //устанавливаем ID ФС суперблока
    list_add_tail(&amp;s-&gt;s_list, &amp;super_blocks);  //добавляет новый суперблок в конец списка СБ
    list_add(&amp;s-&gt;s_instances, &amp;type-&gt;fs_supers);  // добавляет суперблок в список суперблоков ФС
    spin_unlock(&amp;sb_lock);  
    get_filesystem(type);  //!!! похоже подгружает модуль для ФС (поправте меня)!!!
    return s;
}</code></pre></div><p>в общем не понятно , что за тёмное дело с test делается...&nbsp; <br />и вроде там может возникнуть ситуация, когда спинблокировку второй раз пытаемя захватить...&nbsp; oO <br />и ещё get_filesystem не совсем уверен, что делает</p></div></div><p>в следуещем посте рассмотрю ext2_fill_super()</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Wed, 16 Feb 2011 21:11:37 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=146143#p146143</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=146069#p146069</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>как я понял, в ядро вкомпилливается только EXT4. но можно засунуть и лишь EXT2, например для встроенных систем без HDD.</p></blockquote></div><p>не верю я чего-то... при сборке ядра всё же собирается отдельно. Есть пруфлинк или идеи, как это проверить?</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Wed, 16 Feb 2011 19:06:20 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=146069#p146069</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=145953#p145953</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>почему? в дереве сырцов отдельно лежат fs/ext2/, fs/ext3/, fs/ext4/ и содержимое в них достаточно сильно(если не полностью) различается.</p></blockquote></div><p>как я понял, в ядро вкомпилливается только EXT4. но можно засунуть и лишь EXT2, например для встроенных систем без HDD.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>это тоже достаточно логично... всё таки поддерживаем не одну ФС...</p></blockquote></div><p>логично. я не спорю. просто раньше похоже было по другому. конечно в итоге всё и так приводилось к общему знаменателю, но уже дальше по коду.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>это по времени худший случай О(n^2), а памяти он используется не более O(n). да и улучшить можно: если глубина рекурсии достигает опасного n, то вызываем какой-нить пузырёк для подмассивов.</p></blockquote></div><p>ну O(N) это обычно тоже ОЧЕНЬ много. Учитывая, что рассчитывают таки на log2(N).<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>да и улучшить можно: если глубина рекурсии достигает опасного n, то вызываем какой-нить пузырёк для подмассивов.</p></blockquote></div><p>проще не парится, а взять другую сортировку, ЕМНИП так и было сделано. (используется метод Шелла).<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>можно поподробней, а то я этого не застал</p></blockquote></div><p>недавно было. совпало по времени со сменой hda на sda (у меня во всяком случае). Там при операциях с файлами всё жутко тупило, мышкой по кнопке нельзя было кликнуть. А загрузка около 0.<br />многие не застали - этот глюк проявлялся как-то рандомно - типа на дистре XYZ и мамке ABC есть, а на другой мамке/дистре - нету.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>вот эту строчку не переварил... не представляю, как такое может быть(то что скрыта от рута, да и как вообще неучтённая память может быть...)</p></blockquote></div><p>да говорю-же: глюк. Рут спрашивает ядро: &quot;сколько памяти?&quot;, ядро отвечает 100. И нагло врёт. <img src="https://linuxforum.ru/img/smilies/ac.gif" alt="ac" /><br /></p><div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>в линуксе этих фс.. черт ногу сломает.<br />зачем усложнять себе жись?</p></blockquote></div><p>для более эффективного использования инструмента надо знать его свойства. Что-бы было ясно, когда применить шило, когда отвёртку, а когда - лом.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Wed, 16 Feb 2011 14:17:08 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=145953#p145953</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=145871#p145871</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>Как я понял, сейчас есть только EXT4, EXT2 и EXT3 получаются из четвёрки отключением некоторых фич.</p></blockquote></div><p>почему? в дереве сырцов отдельно лежат fs/ext2/, fs/ext3/, fs/ext4/ и содержимое в них достаточно сильно(если не полностью) различается.<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>Получается, что при чтении инода он теперь кардинально переделывается (ЕМНИП раньше он просто тупо читался, и структура была точно такой-же).</p></blockquote></div><p>это тоже достаточно логично... всё таки поддерживаем не одну ФС...<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>К примеру, внутри ядра не применяется qsort(), причина проста - qsort() имеет худший случай - когда время исполнения и объём памяти равен N*N - если N равно например 1000000, то N*N = 10^12, что приведёт даже для 32х битных систем к потреблению как минимум 10^14 байт.</p></blockquote></div><p>это по времени худший случай О(n^2), а памяти он используется не более O(n). да и улучшить можно: если глубина рекурсии достигает опасного n, то вызываем какой-нить пузырёк для подмассивов.<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>ИМХО как раз это и привело к трудноуловимому глюку.</p></blockquote></div><p>можно поподробней, а то я этого не застал smile <br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>ИЧСХ, область памяти ядра скрыта даже от рута, и невидима - получается так, что кажется, что памяти хватает, но на самом деле, её недостаточно.</p></blockquote></div><p>о_О вот эту строчку не переварил... не представляю, как такое может быть(то что скрыта от рута, да и как вообще неучтённая память может быть...)&nbsp; oO <br /></p><div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>в линуксе этих фс.. черт ногу сломает.<br />зачем усложнять себе жись?</p></blockquote></div><p>ни кто за вами бегать с палкой и заставлять использовать что-то конкретное не будет. а зачем - как минимум самообразование.</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Wed, 16 Feb 2011 10:37:05 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=145871#p145871</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=145858#p145858</link>
			<description><![CDATA[<p>в линуксе этих фс.. черт ногу сломает.<br />зачем усложнять себе жись?</p>]]></description>
			<author><![CDATA[null@example.com (сантехник)]]></author>
			<pubDate>Wed, 16 Feb 2011 10:05:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=145858#p145858</guid>
		</item>
		<item>
			<title><![CDATA[Re: Разработка ФС]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=145818#p145818</link>
			<description><![CDATA[<div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>что это было?<br />это тоже необходимо знать?</p></blockquote></div><p>если вы собираетесь разрабатывать ФС - да.&nbsp; smile</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Wed, 16 Feb 2011 08:12:04 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=145818#p145818</guid>
		</item>
	</channel>
</rss>
