| /* | 
 |  * (C) Copyright 2011 - 2012 Samsung Electronics | 
 |  * EXT4 filesystem implementation in Uboot by | 
 |  * Uma Shankar <uma.shankar@samsung.com> | 
 |  * Manjunatha C Achar <a.manjunatha@samsung.com> | 
 |  * | 
 |  * Ext4 Extent data structures are taken from  original ext4 fs code | 
 |  * as found in the linux kernel. | 
 |  * | 
 |  * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com | 
 |  * Written by Alex Tomas <alex@clusterfs.com> | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or modify | 
 |  * it under the terms of the GNU General Public License version 2 as | 
 |  * published by the Free Software Foundation. | 
 |  * | 
 |  * This program is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |  * GNU General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU General Public License | 
 |  * along with this program; if not, write to the Free Software | 
 |  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
 |  */ | 
 |  | 
 | #ifndef __EXT4__ | 
 | #define __EXT4__ | 
 | #include <ext_common.h> | 
 |  | 
 | #define EXT4_EXTENTS_FL		0x00080000 /* Inode uses extents */ | 
 | #define EXT4_EXT_MAGIC			0xf30a | 
 | #define EXT4_FEATURE_RO_COMPAT_GDT_CSUM	0x0010 | 
 | #define EXT4_FEATURE_INCOMPAT_EXTENTS	0x0040 | 
 | #define EXT4_INDIRECT_BLOCKS		12 | 
 |  | 
 | #define EXT4_BG_INODE_UNINIT		0x0001 | 
 | #define EXT4_BG_BLOCK_UNINIT		0x0002 | 
 | #define EXT4_BG_INODE_ZEROED		0x0004 | 
 |  | 
 | /* | 
 |  * ext4_inode has i_block array (60 bytes total). | 
 |  * The first 12 bytes store ext4_extent_header; | 
 |  * the remainder stores an array of ext4_extent. | 
 |  */ | 
 |  | 
 | /* | 
 |  * This is the extent on-disk structure. | 
 |  * It's used at the bottom of the tree. | 
 |  */ | 
 | struct ext4_extent { | 
 | 	__le32	ee_block;	/* first logical block extent covers */ | 
 | 	__le16	ee_len;		/* number of blocks covered by extent */ | 
 | 	__le16	ee_start_hi;	/* high 16 bits of physical block */ | 
 | 	__le32	ee_start_lo;	/* low 32 bits of physical block */ | 
 | }; | 
 |  | 
 | /* | 
 |  * This is index on-disk structure. | 
 |  * It's used at all the levels except the bottom. | 
 |  */ | 
 | struct ext4_extent_idx { | 
 | 	__le32	ei_block;	/* index covers logical blocks from 'block' */ | 
 | 	__le32	ei_leaf_lo;	/* pointer to the physical block of the next * | 
 | 				 * level. leaf or next index could be there */ | 
 | 	__le16	ei_leaf_hi;	/* high 16 bits of physical block */ | 
 | 	__u16	ei_unused; | 
 | }; | 
 |  | 
 | /* Each block (leaves and indexes), even inode-stored has header. */ | 
 | struct ext4_extent_header { | 
 | 	__le16	eh_magic;	/* probably will support different formats */ | 
 | 	__le16	eh_entries;	/* number of valid entries */ | 
 | 	__le16	eh_max;		/* capacity of store in entries */ | 
 | 	__le16	eh_depth;	/* has tree real underlying blocks? */ | 
 | 	__le32	eh_generation;	/* generation of the tree */ | 
 | }; | 
 |  | 
 | struct ext_filesystem { | 
 | 	/* Total Sector of partition */ | 
 | 	uint64_t total_sect; | 
 | 	/* Block size  of partition */ | 
 | 	uint32_t blksz; | 
 | 	/* Inode size of partition */ | 
 | 	uint32_t inodesz; | 
 | 	/* Sectors per Block */ | 
 | 	uint32_t sect_perblk; | 
 | 	/* Group Descriptor Block Number */ | 
 | 	uint32_t gdtable_blkno; | 
 | 	/* Total block groups of partition */ | 
 | 	uint32_t no_blkgrp; | 
 | 	/* No of blocks required for bgdtable */ | 
 | 	uint32_t no_blk_pergdt; | 
 | 	/* Superblock */ | 
 | 	struct ext2_sblock *sb; | 
 | 	/* Block group descritpor table */ | 
 | 	struct ext2_block_group *bgd; | 
 | 	char *gdtable; | 
 |  | 
 | 	/* Block Bitmap Related */ | 
 | 	unsigned char **blk_bmaps; | 
 | 	long int curr_blkno; | 
 | 	uint16_t first_pass_bbmap; | 
 |  | 
 | 	/* Inode Bitmap Related */ | 
 | 	unsigned char **inode_bmaps; | 
 | 	int curr_inode_no; | 
 | 	uint16_t first_pass_ibmap; | 
 |  | 
 | 	/* Journal Related */ | 
 |  | 
 | 	/* Block Device Descriptor */ | 
 | 	block_dev_desc_t *dev_desc; | 
 | }; | 
 |  | 
 | extern struct ext2_data *ext4fs_root; | 
 | extern struct ext2fs_node *ext4fs_file; | 
 |  | 
 | #if defined(CONFIG_EXT4_WRITE) | 
 | extern struct ext2_inode *g_parent_inode; | 
 | extern int gd_index; | 
 | extern int gindex; | 
 |  | 
 | int ext4fs_init(void); | 
 | void ext4fs_deinit(void); | 
 | int ext4fs_filename_check(char *filename); | 
 | int ext4fs_write(const char *fname, unsigned char *buffer, | 
 | 				unsigned long sizebytes); | 
 | #endif | 
 |  | 
 | struct ext_filesystem *get_fs(void); | 
 | int ext4fs_open(const char *filename); | 
 | int ext4fs_read(char *buf, unsigned len); | 
 | int ext4fs_mount(unsigned part_length); | 
 | void ext4fs_close(void); | 
 | int ext4fs_ls(const char *dirname); | 
 | void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot); | 
 | int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf); | 
 | void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info); | 
 | long int read_allocated_block(struct ext2_inode *inode, int fileblock); | 
 | int ext4fs_probe(block_dev_desc_t *fs_dev_desc, | 
 | 		 disk_partition_t *fs_partition); | 
 | int ext4_read_file(const char *filename, void *buf, int offset, int len); | 
 | int ext4_read_superblock(char *buffer); | 
 | #endif |