Re: [PATCH 1/7] omfs: define filesystem structures

From: Christoph Hellwig
Date: Sun Apr 13 2008 - 04:03:36 EST


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-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/