On Sat, Apr 12, 2008 at 06:58:35PM -0400, Bob Copeland wrote: > OMFS is a proprietary filesystem created for the ReplayTV and > also used by the Rio Karma. It uses hash tables with unordered, > unbounded lists in each bucket for directories, extents for > data blocks, 64-bit addressing for blocks, with up to 8K blocks > (only 2K of a given block is ever used for metadata, so the FS > still works with 4K pages). > > This and the following set of changes add support for OMFS; this > change adds the header file. Looks good. Although I would separate the on-disk structure into a separate header of it's own. That makes it easy to spot what we're dealing with, and you can easily re-use just that header in userspace should you write any maintainance tools like mkfs or fsck for this filesystem in the future. > > Signed-off-by: Bob Copeland <me@xxxxxxxxxxxxxxx> > --- > fs/omfs/omfs.h | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 139 insertions(+), 0 deletions(-) > create mode 100644 fs/omfs/omfs.h > > diff --git a/fs/omfs/omfs.h b/fs/omfs/omfs.h > new file mode 100644 > index 0000000..5faeb91 > --- /dev/null > +++ b/fs/omfs/omfs.h > @@ -0,0 +1,139 @@ > +#ifndef _OMFS_H > +#define _OMFS_H > + > +#include <linux/module.h> > +#include <linux/fs.h> > + > +#define OMFS_MAGIC 0xC2993D87 > +#define OMFS_IMAGIC 0xD2 > + > +#define OMFS_DIR 'D' > +#define OMFS_FILE 'F' > +#define OMFS_INODE_NORMAL 'e' > +#define OMFS_INODE_CONTINUATION 'c' > +#define OMFS_INODE_SYSTEM 's' > +#define OMFS_NAMELEN 256 > +#define OMFS_DIR_START 0x1b8 > +#define OMFS_EXTENT_START 0x1d0 > +#define OMFS_EXTENT_CONT 0x40 > +#define OMFS_XOR_COUNT 19 > + > +/* In-memory structures */ > +struct omfs_sb_info { > + u64 s_num_blocks; > + u64 s_bitmap_ino; > + u64 s_root_ino; > + u32 s_blocksize; > + u32 s_mirrors; > + u32 s_sys_blocksize; > + u32 s_clustersize; > + int s_block_shift; > + unsigned long **s_imap; > + int s_imap_size; > + struct mutex s_bitmap_lock; > +}; > + > +/* On-disk structures */ > +struct omfs_super_block { > + char s_fill1[256]; > + __be64 s_root_block; > + __be64 s_num_blocks; > + __be32 s_magic; > + __be32 s_blocksize; > + __be32 s_mirrors; > + __be32 s_sys_blocksize; > +}; > + > +struct omfs_header { > + __be64 h_self; > + __be32 h_body_size; > + __be16 h_crc; > + char h_fill1[2]; > + u8 h_version; > + char h_type; > + u8 h_magic; > + u8 h_check_xor; > + __be32 h_fill2; > +}; > + > +struct omfs_root_block { > + struct omfs_header r_head; > + __be64 r_fill1; > + __be64 r_num_blocks; > + __be64 r_root_dir; > + __be64 r_bitmap; > + __be32 r_blocksize; > + __be32 r_clustersize; > + __be64 r_mirrors; > + char r_name[OMFS_NAMELEN]; > +}; > + > +struct omfs_inode { > + struct omfs_header i_head; > + __be64 i_parent; > + __be64 i_sibling; > + __be64 i_ctime; > + char i_fill1[35]; > + char i_type; > + __be32 i_fill2; > + char i_fill3[64]; > + char i_name[OMFS_NAMELEN]; > + __be64 i_size; > +}; > + > +struct omfs_extent_entry { > + __be64 e_cluster; > + __be64 e_blocks; > +}; > + > +struct omfs_extent { > + __be64 e_next; > + __be32 e_extent_count; > + __be32 e_fill; > + struct omfs_extent_entry e_entry; > +}; > + > + > +/* convert a cluster number to a 512-byte block number */ > +static inline sector_t clus_to_blk(struct omfs_sb_info *sbi, sector_t block) > +{ > + return block << sbi->s_block_shift; > +} > + > +static inline struct omfs_sb_info *OMFS_SB(struct super_block *sb) > +{ > + return sb->s_fs_info; > +} > + > +/* bitmap.c */ > +extern unsigned long omfs_count_free(struct super_block *sb); > +extern int omfs_allocate_block(struct super_block *sb, u64 block); > +extern int omfs_allocate_range(struct super_block *sb, int min_request, > + int max_request, u64 *return_block, int *return_size); > +extern int omfs_clear_range(struct super_block *sb, u64 block, int count); > + > +/* checksum.c */ > +int omfs_update_checksums(struct omfs_inode *oi); > + > +/* dir.c */ > +extern struct file_operations omfs_dir_operations; > +extern struct inode_operations omfs_dir_inops; > +extern int omfs_make_empty(struct inode *inode, struct super_block *sb); > +extern int omfs_is_bad(struct omfs_sb_info *sbi, struct omfs_header *header, > + u64 fsblock); > + > +/* file.c */ > +extern struct file_operations omfs_file_operations; > +extern struct inode_operations omfs_file_inops; > +extern struct address_space_operations omfs_aops; > +extern void omfs_make_empty_table(struct buffer_head *bh, int offset); > +extern int omfs_shrink_inode(struct inode *inode); > + > +/* inode.c */ > +extern struct inode *omfs_iget(struct super_block *sb, ino_t inode); > +extern struct inode *omfs_new_inode(struct inode *dir, int mode); > +extern int omfs_reserve_block(struct super_block *sb, sector_t block); > +extern int omfs_find_empty_block(struct super_block *sb, int mode, ino_t *ino); > +extern int omfs_sync_inode(struct inode *inode); > + > +#endif > -- > 1.5.4.2 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html ---end quoted text--- -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html