€•ÏCŒ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Œ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:”…””}”(hhø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”“”)”}”(hjh]”hŒhttp://linux-karma.sf.net/”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jhj 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)”}”(hj@h]”hŒhttps://bobcopeland.com/karma/”…””}”(hjBhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j@uh1jhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h Khj:ubah}”(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.”…””}”(hj\hž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”…””}”(hjuhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjrhž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"hjrhž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”…””}”(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 group”h]”hŒ'make all files owned by specified group”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K&hjubah}”(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”…””}”(hj2hž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 permission umask to xxx”h]”hŒset permission umask to xxx”…””}”(hjIhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K'hjFubah}”(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”…””}”(hjihžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K(hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j¿hjcubjÀ)”}”(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¿hjcubeh}”(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)hjubah}”(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$hjrhž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¹hjòhž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/hjòhžhubhÛ)”}”(hŒSysblock header information::”h]”hŒSysblock header information:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K7hjòhž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; };”…””}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jhŸh³h K9hjòhžhubhÛ)”}”(hŒ:Files and directories are both represented by omfs_inode::”h]”hŒ9Files and directories are both represented by omfs_inode:”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KEhjòhžhubj )”}”(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 */ };”…””}”hj=sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jhŸh³h KGhjòhž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).”…””}”(hjKhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KThjòhž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:”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KZhjòhžhubj )”}”(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 */ };”…””}”hjgsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jhŸh³h K]hjòhž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.”…””}”(hjuhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h Kihjòhž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 Knhjòhž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›jojljïjìj–j“uŒ nametypes”}”(jž‰jo‰jï‰j–‰uh}”(j›h¶jlhÉjìjrj“jòuŒ 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.