diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/ext2fs.h | 81 | ||||
| -rw-r--r-- | include/ext4fs.h | 132 | ||||
| -rw-r--r-- | include/ext_common.h | 197 | 
3 files changed, 329 insertions, 81 deletions
| diff --git a/include/ext2fs.h b/include/ext2fs.h deleted file mode 100644 index 163a9bbc0..000000000 --- a/include/ext2fs.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - *  GRUB  --  GRand Unified Bootloader - *  Copyright (C) 2000, 2001  Free Software Foundation, Inc. - * - *  (C) Copyright 2003 Sysgo Real-Time Solutions, AG <www.elinos.com> - *  Pavel Bartusek <pba@sysgo.de> - * - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  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. - */ - -/* An implementation for the Ext2FS filesystem ported from GRUB. - * Some parts of this code (mainly the structures and defines) are - * from the original ext2 fs code, as found in the linux kernel. - */ - - -#define SECTOR_SIZE		0x200 -#define SECTOR_BITS		9 - -/* Error codes */ -typedef enum -{ -  ERR_NONE = 0, -  ERR_BAD_FILENAME, -  ERR_BAD_FILETYPE, -  ERR_BAD_GZIP_DATA, -  ERR_BAD_GZIP_HEADER, -  ERR_BAD_PART_TABLE, -  ERR_BAD_VERSION, -  ERR_BELOW_1MB, -  ERR_BOOT_COMMAND, -  ERR_BOOT_FAILURE, -  ERR_BOOT_FEATURES, -  ERR_DEV_FORMAT, -  ERR_DEV_VALUES, -  ERR_EXEC_FORMAT, -  ERR_FILELENGTH, -  ERR_FILE_NOT_FOUND, -  ERR_FSYS_CORRUPT, -  ERR_FSYS_MOUNT, -  ERR_GEOM, -  ERR_NEED_LX_KERNEL, -  ERR_NEED_MB_KERNEL, -  ERR_NO_DISK, -  ERR_NO_PART, -  ERR_NUMBER_PARSING, -  ERR_OUTSIDE_PART, -  ERR_READ, -  ERR_SYMLINK_LOOP, -  ERR_UNRECOGNIZED, -  ERR_WONT_FIT, -  ERR_WRITE, -  ERR_BAD_ARGUMENT, -  ERR_UNALIGNED, -  ERR_PRIVILEGED, -  ERR_DEV_NEED_INIT, -  ERR_NO_DISK_SPACE, -  ERR_NUMBER_OVERFLOW, - -  MAX_ERR_NUM -} ext2fs_error_t; - - -extern int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part); -extern int ext2fs_ls (const char *dirname); -extern int ext2fs_open (const char *filename); -extern int ext2fs_read (char *buf, unsigned len); -extern int ext2fs_mount (unsigned part_length); -extern int ext2fs_close(void); diff --git a/include/ext4fs.h b/include/ext4fs.h new file mode 100644 index 000000000..58a6a1dcf --- /dev/null +++ b/include/ext4fs.h @@ -0,0 +1,132 @@ +/* + * (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 *gd; +	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 block_dev_desc_t *ext4_dev_desc; +extern struct ext2_data *ext4fs_root; +extern struct ext2fs_node *ext4fs_file; + +struct ext_filesystem *get_fs(void); +int init_fs(block_dev_desc_t *dev_desc); +void deinit_fs(block_dev_desc_t *dev_desc); +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(int sector, int byte_offset, int byte_len, char *buf); +int ext4fs_set_blk_dev(block_dev_desc_t *rbdd, int part); +long int read_allocated_block(struct ext2_inode *inode, int fileblock); +#endif diff --git a/include/ext_common.h b/include/ext_common.h new file mode 100644 index 000000000..c90d95b00 --- /dev/null +++ b/include/ext_common.h @@ -0,0 +1,197 @@ +/* + * (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> + * + * Data structures and headers for ext4 support have been taken from + * ext2 ls load support in Uboot + * + * (C) Copyright 2004 + * esd gmbh <www.esd-electronics.com> + * Reinhard Arlt <reinhard.arlt@esd-electronics.com> + * + * based on code from grub2 fs/ext2.c and fs/fshelp.c by + * GRUB  --  GRand Unified Bootloader + * Copyright (C) 2003, 2004  Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 __EXT_COMMON__ +#define __EXT_COMMON__ +#include <command.h> +#define SECTOR_SIZE		0x200 +#define SECTOR_BITS		9 + +/* Magic value used to identify an ext2 filesystem.  */ +#define	EXT2_MAGIC			0xEF53 +/* Amount of indirect blocks in an inode.  */ +#define INDIRECT_BLOCKS			12 +/* Maximum lenght of a pathname.  */ +#define EXT2_PATH_MAX				4096 +/* Maximum nesting of symlinks, used to prevent a loop.  */ +#define	EXT2_MAX_SYMLINKCNT		8 + +/* Filetype used in directory entry.  */ +#define	FILETYPE_UNKNOWN		0 +#define	FILETYPE_REG			1 +#define	FILETYPE_DIRECTORY		2 +#define	FILETYPE_SYMLINK		7 + +/* Filetype information as used in inodes.  */ +#define FILETYPE_INO_MASK		0170000 +#define FILETYPE_INO_REG		0100000 +#define FILETYPE_INO_DIRECTORY		0040000 +#define FILETYPE_INO_SYMLINK		0120000 +#define EXT2_ROOT_INO			2 /* Root inode */ + +/* Bits used as offset in sector */ +#define DISK_SECTOR_BITS		9 +/* The size of an ext2 block in bytes.  */ +#define EXT2_BLOCK_SIZE(data)	   (1 << LOG2_BLOCK_SIZE(data)) + +/* Log2 size of ext2 block in 512 blocks.  */ +#define LOG2_EXT2_BLOCK_SIZE(data) (__le32_to_cpu \ +				(data->sblock.log2_block_size) + 1) + +/* Log2 size of ext2 block in bytes.  */ +#define LOG2_BLOCK_SIZE(data)	   (__le32_to_cpu \ +		(data->sblock.log2_block_size) + 10) +#define INODE_SIZE_FILESYSTEM(data)	(__le32_to_cpu \ +			(data->sblock.inode_size)) + +#define EXT2_FT_DIR	2 +#define SUCCESS	1 + +/* Macro-instructions used to manage several block sizes  */ +#define EXT2_MIN_BLOCK_LOG_SIZE	10 /* 1024 */ +#define EXT2_MAX_BLOCK_LOG_SIZE	16 /* 65536 */ +#define EXT2_MIN_BLOCK_SIZE		(1 << EXT2_MIN_BLOCK_LOG_SIZE) +#define EXT2_MAX_BLOCK_SIZE		(1 << EXT2_MAX_BLOCK_LOG_SIZE) + +/* The ext2 superblock.  */ +struct ext2_sblock { +	uint32_t total_inodes; +	uint32_t total_blocks; +	uint32_t reserved_blocks; +	uint32_t free_blocks; +	uint32_t free_inodes; +	uint32_t first_data_block; +	uint32_t log2_block_size; +	uint32_t log2_fragment_size; +	uint32_t blocks_per_group; +	uint32_t fragments_per_group; +	uint32_t inodes_per_group; +	uint32_t mtime; +	uint32_t utime; +	uint16_t mnt_count; +	uint16_t max_mnt_count; +	uint16_t magic; +	uint16_t fs_state; +	uint16_t error_handling; +	uint16_t minor_revision_level; +	uint32_t lastcheck; +	uint32_t checkinterval; +	uint32_t creator_os; +	uint32_t revision_level; +	uint16_t uid_reserved; +	uint16_t gid_reserved; +	uint32_t first_inode; +	uint16_t inode_size; +	uint16_t block_group_number; +	uint32_t feature_compatibility; +	uint32_t feature_incompat; +	uint32_t feature_ro_compat; +	uint32_t unique_id[4]; +	char volume_name[16]; +	char last_mounted_on[64]; +	uint32_t compression_info; +}; + +struct ext2_block_group { +	__u32 block_id;	/* Blocks bitmap block */ +	__u32 inode_id;	/* Inodes bitmap block */ +	__u32 inode_table_id;	/* Inodes table block */ +	__u16 free_blocks;	/* Free blocks count */ +	__u16 free_inodes;	/* Free inodes count */ +	__u16 used_dir_cnt;	/* Directories count */ +	__u16 bg_flags; +	__u32 bg_reserved[2]; +	__u16 bg_itable_unused; /* Unused inodes count */ +	__u16 bg_checksum;	/* crc16(s_uuid+grouo_num+group_desc)*/ +}; + +/* The ext2 inode. */ +struct ext2_inode { +	uint16_t mode; +	uint16_t uid; +	uint32_t size; +	uint32_t atime; +	uint32_t ctime; +	uint32_t mtime; +	uint32_t dtime; +	uint16_t gid; +	uint16_t nlinks; +	uint32_t blockcnt;	/* Blocks of 512 bytes!! */ +	uint32_t flags; +	uint32_t osd1; +	union { +		struct datablocks { +			uint32_t dir_blocks[INDIRECT_BLOCKS]; +			uint32_t indir_block; +			uint32_t double_indir_block; +			uint32_t triple_indir_block; +		} blocks; +		char symlink[60]; +	} b; +	uint32_t version; +	uint32_t acl; +	uint32_t dir_acl; +	uint32_t fragment_addr; +	uint32_t osd2[3]; +}; + +/* The header of an ext2 directory entry. */ +struct ext2_dirent { +	uint32_t inode; +	uint16_t direntlen; +	uint8_t namelen; +	uint8_t filetype; +}; + +struct ext2fs_node { +	struct ext2_data *data; +	struct ext2_inode inode; +	int ino; +	int inode_read; +}; + +/* Information about a "mounted" ext2 filesystem. */ +struct ext2_data { +	struct ext2_sblock sblock; +	struct ext2_inode *inode; +	struct ext2fs_node diropen; +}; + +int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc, +					char *const argv[]); +int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); +int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc, +					char *const argv[]); +int do_ext_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); +#endif |