€•¢DŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/pt_BR/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/filesystems/omfs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ>/var/lib/git/docbuild/linux/Documentation/filesystems/omfs.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ Optimized MPEG Filesystem (OMFS)”h]”hŒ Optimized MPEG Filesystem (OMFS)”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒOverview”h]”hŒOverview”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)”}”(hXOMFS is a filesystem created by SonicBlue for use in the ReplayTV DVR and Rio Karma MP3 player. The filesystem is extent-based, utilizing block sizes from 2k to 8k, with hash-based directories. This filesystem driver may be used to read and write disks from these devices.”h]”hXOMFS is a filesystem created by SonicBlue for use in the ReplayTV DVR and Rio Karma MP3 player. The filesystem is extent-based, utilizing block sizes from 2k to 8k, with hash-based directories. This filesystem driver may be used to read and write disks from these devices.”…””}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubhï)”}”(hŒ¬Note, it is not recommended that this FS be used in place of a general filesystem for your own streaming media device. Native Linux filesystems will likely perform better.”h]”hŒ¬Note, it is not recommended that this FS be used in place of a general filesystem for your own streaming media device. Native Linux filesystems will likely perform better.”…””}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhï)”}”(hŒ!More information is available at:”h]”hŒ!More information is available at:”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhŒ block_quote”“”)”}”(hŒhttp://linux-karma.sf.net/ ”h]”hï)”}”(hŒhttp://linux-karma.sf.net/”h]”hŒ reference”“”)”}”(hj"h]”hŒhttp://linux-karma.sf.net/”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j"uh1j$hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KhhÝh²hubhï)”}”(hŒZVarious utilities, including mkomfs and omfsck, are included with omfsprogs, available at:”h]”hŒZVarious utilities, including mkomfs and omfsck, are included with omfsprogs, available at:”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubj)”}”(hŒhttps://bobcopeland.com/karma/ ”h]”hï)”}”(hŒhttps://bobcopeland.com/karma/”h]”j%)”}”(hjTh]”hŒhttps://bobcopeland.com/karma/”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jTuh1j$hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KhhÝh²hubhï)”}”(hŒ(Instructions are included in its README.”h]”hŒ(Instructions are included in its README.”…””}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒOptions”h]”hŒOptions”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj†h²hh³hÇh´K ubhï)”}”(hŒ/OMFS supports the following mount-time options:”h]”hŒ/OMFS supports the following mount-time options:”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K"hj†h²hubj)”}”(hXb============ ======================================== uid=n make all files owned by specified user gid=n make all files owned by specified group umask=xxx set permission umask to xxx fmask=xxx set umask to xxx for files dmask=xxx set umask to xxx for directories ============ ======================================== ”h]”hŒtable”“”)”}”(hhh]”hŒtgroup”“”)”}”(hhh]”(hŒcolspec”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1j³hj°ubj´)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K(uh1j³hj°ubhŒtbody”“”)”}”(hhh]”(hŒrow”“”)”}”(hhh]”(hŒentry”“”)”}”(hhh]”hï)”}”(hŒuid=n”h]”hŒuid=n”…””}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K%hjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhjÐubjÔ)”}”(hhh]”hï)”}”(hŒ&make all files owned by specified user”h]”hŒ&make all files owned by specified user”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K%hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhjÐubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubjÏ)”}”(hhh]”(jÔ)”}”(hhh]”hï)”}”(hŒgid=n”h]”hŒgid=n”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K&hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj ubjÔ)”}”(hhh]”hï)”}”(hŒ'make all files owned by specified group”h]”hŒ'make all files owned by specified group”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K&hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubjÏ)”}”(hhh]”(jÔ)”}”(hhh]”hï)”}”(hŒ umask=xxx”h]”hŒ umask=xxx”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K'hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj@ubjÔ)”}”(hhh]”hï)”}”(hŒset permission umask to xxx”h]”hŒset permission umask to xxx”…””}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K'hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubjÏ)”}”(hhh]”(jÔ)”}”(hhh]”hï)”}”(hŒ fmask=xxx”h]”hŒ fmask=xxx”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K(hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhjwubjÔ)”}”(hhh]”hï)”}”(hŒset umask to xxx for files”h]”hŒset umask to xxx for files”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K(hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubjÏ)”}”(hhh]”(jÔ)”}”(hhh]”hï)”}”(hŒ dmask=xxx”h]”hŒ dmask=xxx”…””}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K)hj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj®ubjÔ)”}”(hhh]”hï)”}”(hŒ set umask to xxx for directories”h]”hŒ set umask to xxx for directories”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K)hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jÓhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÉhj°ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j®hj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1j©hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K$hj†h²hubeh}”(h]”Œoptions”ah ]”h"]”Œoptions”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Disk format”h]”hŒ Disk format”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K-ubhï)”}”(hXÔOMFS discriminates between "sysblocks" and normal data blocks. The sysblock group consists of super block information, file metadata, directory structures, and extents. Each sysblock has a header containing CRCs of the entire sysblock, and may be mirrored in successive blocks on the disk. A sysblock may have a smaller size than a data block, but since they are both addressed by the same 64-bit block number, any remaining space in the smaller sysblock is unused.”h]”hXØOMFS discriminates between “sysblocks†and normal data blocks. The sysblock group consists of super block information, file metadata, directory structures, and extents. Each sysblock has a header containing CRCs of the entire sysblock, and may be mirrored in successive blocks on the disk. A sysblock may have a smaller size than a data block, but since they are both addressed by the same 64-bit block number, any remaining space in the smaller sysblock is unused.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K/hjh²hubhï)”}”(hŒSysblock header information::”h]”hŒSysblock header information:”…””}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K7hjh²hubhŒ literal_block”“”)”}”(hX2struct omfs_header { __be64 h_self; /* FS block where this is located */ __be32 h_body_size; /* size of useful data after header */ __be16 h_crc; /* crc-ccitt of body_size bytes */ char h_fill1[2]; u8 h_version; /* version, always 1 */ char h_type; /* OMFS_INODE_X */ u8 h_magic; /* OMFS_IMAGIC */ u8 h_check_xor; /* XOR of header bytes before this */ __be32 h_fill2; };”h]”hX2struct omfs_header { __be64 h_self; /* FS block where this is located */ __be32 h_body_size; /* size of useful data after header */ __be16 h_crc; /* crc-ccitt of body_size bytes */ char h_fill1[2]; u8 h_version; /* version, always 1 */ char h_type; /* OMFS_INODE_X */ u8 h_magic; /* OMFS_IMAGIC */ u8 h_check_xor; /* XOR of header bytes before this */ __be32 h_fill2; };”…””}”hj5sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j3h³hÇh´K9hjh²hubhï)”}”(hŒ:Files and directories are both represented by omfs_inode::”h]”hŒ9Files and directories are both represented by omfs_inode:”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KEhjh²hubj4)”}”(hX)struct omfs_inode { struct omfs_header i_head; /* header */ __be64 i_parent; /* parent containing this inode */ __be64 i_sibling; /* next inode in hash bucket */ __be64 i_ctime; /* ctime, in milliseconds */ char i_fill1[35]; char i_type; /* OMFS_[DIR,FILE] */ __be32 i_fill2; char i_fill3[64]; char i_name[OMFS_NAMELEN]; /* filename */ __be64 i_size; /* size of file, in bytes */ };”h]”hX)struct omfs_inode { struct omfs_header i_head; /* header */ __be64 i_parent; /* parent containing this inode */ __be64 i_sibling; /* next inode in hash bucket */ __be64 i_ctime; /* ctime, in milliseconds */ char i_fill1[35]; char i_type; /* OMFS_[DIR,FILE] */ __be32 i_fill2; char i_fill3[64]; char i_name[OMFS_NAMELEN]; /* filename */ __be64 i_size; /* size of file, in bytes */ };”…””}”hjQsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j3h³hÇh´KGhjh²hubhï)”}”(hXCDirectories in OMFS are implemented as a large hash table. Filenames are hashed then prepended into the bucket list beginning at OMFS_DIR_START. Lookup requires hashing the filename, then seeking across i_sibling pointers until a match is found on i_name. Empty buckets are represented by block pointers with all-1s (~0).”h]”hXCDirectories in OMFS are implemented as a large hash table. Filenames are hashed then prepended into the bucket list beginning at OMFS_DIR_START. Lookup requires hashing the filename, then seeking across i_sibling pointers until a match is found on i_name. Empty buckets are represented by block pointers with all-1s (~0).”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KThjh²hubhï)”}”(hŒ^A file is an omfs_inode structure followed by an extent table beginning at OMFS_EXTENT_START::”h]”hŒ]A file is an omfs_inode structure followed by an extent table beginning at OMFS_EXTENT_START:”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KZhjh²hubj4)”}”(hXÏstruct omfs_extent_entry { __be64 e_cluster; /* start location of a set of blocks */ __be64 e_blocks; /* number of blocks after e_cluster */ }; struct omfs_extent { __be64 e_next; /* next extent table location */ __be32 e_extent_count; /* total # extents in this table */ __be32 e_fill; struct omfs_extent_entry e_entry; /* start of extent entries */ };”h]”hXÏstruct omfs_extent_entry { __be64 e_cluster; /* start location of a set of blocks */ __be64 e_blocks; /* number of blocks after e_cluster */ }; struct omfs_extent { __be64 e_next; /* next extent table location */ __be32 e_extent_count; /* total # extents in this table */ __be32 e_fill; struct omfs_extent_entry e_entry; /* start of extent entries */ };”…””}”hj{sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j3h³hÇh´K]hjh²hubhï)”}”(hŒðEach extent holds the block offset followed by number of blocks allocated to the extent. The final extent in each table is a terminator with e_cluster being ~0 and e_blocks being ones'-complement of the total number of blocks in the table.”h]”hŒòEach extent holds the block offset followed by number of blocks allocated to the extent. The final extent in each table is a terminator with e_cluster being ~0 and e_blocks being ones’-complement of the total number of blocks in the table.”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kihjh²hubhï)”}”(hŒ‘If this table overflows, a continuation inode is written and pointed to by e_next. These have a header but lack the rest of the inode structure.”h]”hŒ‘If this table overflows, a continuation inode is written and pointed to by e_next. These have a header but lack the rest of the inode structure.”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Knhjh²hubeh}”(h]”Œ disk-format”ah ]”h"]”Œ disk format”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K-ubeh}”(h]”Œoptimized-mpeg-filesystem-omfs”ah ]”h"]”Œ optimized mpeg filesystem (omfs)”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jÓŒfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j׌error_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j²j¯jƒj€jjjªj§uŒ nametypes”}”(j²‰jƒ‰j‰jª‰uh}”(j¯hÊj€hÝjj†j§juŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.