116 lines
4.3 KiB
C
116 lines
4.3 KiB
C
#ifndef EXT2_TYPE_H
|
|
#define EXT2_TYPE_H
|
|
|
|
/* On the disk all attributes are stored in little endian format.
|
|
* Inode structure was taken from linux/include/linux/ext2_fs.h.
|
|
*/
|
|
typedef struct {
|
|
u16_t i_mode; /* File mode */
|
|
u16_t i_uid; /* Low 16 bits of Owner Uid */
|
|
u32_t i_size; /* Size in bytes */
|
|
u32_t i_atime; /* Access time */
|
|
u32_t i_ctime; /* Creation time */
|
|
u32_t i_mtime; /* Modification time */
|
|
u32_t i_dtime; /* Deletion Time */
|
|
u16_t i_gid; /* Low 16 bits of Group Id */
|
|
u16_t i_links_count; /* Links count */
|
|
u32_t i_blocks; /* Blocks count */
|
|
u32_t i_flags; /* File flags */
|
|
union {
|
|
struct {
|
|
u32_t l_i_reserved1;
|
|
} linux1;
|
|
struct {
|
|
u32_t h_i_translator;
|
|
} hurd1;
|
|
struct {
|
|
u32_t m_i_reserved1;
|
|
} masix1;
|
|
} osd1; /* OS dependent 1 */
|
|
u32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
|
|
u32_t i_generation; /* File version (for NFS) */
|
|
u32_t i_file_acl; /* File ACL */
|
|
u32_t i_dir_acl; /* Directory ACL */
|
|
u32_t i_faddr; /* Fragment address */
|
|
union {
|
|
struct {
|
|
u8_t l_i_frag; /* Fragment number */
|
|
u8_t l_i_fsize; /* Fragment size */
|
|
u16_t i_pad1;
|
|
u16_t l_i_uid_high; /* these 2 fields */
|
|
u16_t l_i_gid_high; /* were reserved2[0] */
|
|
u32_t l_i_reserved2;
|
|
} linux2;
|
|
struct {
|
|
u8_t h_i_frag; /* Fragment number */
|
|
u8_t h_i_fsize; /* Fragment size */
|
|
u16_t h_i_mode_high;
|
|
u16_t h_i_uid_high;
|
|
u16_t h_i_gid_high;
|
|
u32_t h_i_author;
|
|
} hurd2;
|
|
struct {
|
|
u8_t m_i_frag; /* Fragment number */
|
|
u8_t m_i_fsize; /* Fragment size */
|
|
u16_t m_pad1;
|
|
u32_t m_i_reserved2[2];
|
|
} masix2;
|
|
} osd2; /* OS dependent 2 */
|
|
} d_inode;
|
|
|
|
|
|
/* Part of on disk directory (entry description).
|
|
* It includes all fields except name (since size is unknown.
|
|
* In revision 0 name_len is u16_t (here is structure of rev >= 0.5,
|
|
* where name_len was truncated with the upper 8 bit to add file_type).
|
|
* MIN_DIR_ENTRY_SIZE depends on this structure.
|
|
*/
|
|
struct ext2_disk_dir_desc {
|
|
u32_t d_ino;
|
|
u16_t d_rec_len;
|
|
u8_t d_name_len;
|
|
u8_t d_file_type;
|
|
char d_name[1];
|
|
};
|
|
|
|
/* Current position in block */
|
|
#define CUR_DISC_DIR_POS(cur_desc, base) ((char*)cur_desc - (char*)base)
|
|
/* Return pointer to the next dentry */
|
|
#define NEXT_DISC_DIR_DESC(cur_desc) ((struct ext2_disk_dir_desc*)\
|
|
((char*)cur_desc + cur_desc->d_rec_len))
|
|
/* Return next dentry's position in block */
|
|
#define NEXT_DISC_DIR_POS(cur_desc, base) (cur_desc->d_rec_len +\
|
|
CUR_DISC_DIR_POS(cur_desc, base))
|
|
|
|
struct buf {
|
|
/* Data portion of the buffer. */
|
|
union fsdata_u *bp;
|
|
|
|
/* Header portion of the buffer. */
|
|
struct buf *b_next; /* used to link all free bufs in a chain */
|
|
struct buf *b_prev; /* used to link all free bufs the other way */
|
|
struct buf *b_hash; /* used to link bufs on hash chains */
|
|
block_t b_blocknr; /* block number of its (minor) device */
|
|
dev_t b_dev; /* major | minor device where block resides */
|
|
char b_dirt; /* CLEAN or DIRTY */
|
|
char b_count; /* number of users of this buffer */
|
|
unsigned int b_bytes; /* Number of bytes allocated in bp */
|
|
};
|
|
|
|
|
|
/* Structure with options affecting global behavior. */
|
|
struct opt {
|
|
int use_orlov; /* Bool: Use Orlov allocator */
|
|
/* In ext2 there are reserved blocks, which can be used by super user only or
|
|
* user specified by resuid/resgid. Right now we can't check what user
|
|
* requested operation (VFS limitation), so it's a small warkaround.
|
|
*/
|
|
int mfsalloc; /* Bool: use mfslike allocator */
|
|
int use_reserved_blocks; /* Bool: small workaround */
|
|
unsigned int block_with_super;/* Int: where to read super block,
|
|
* uses 1k units. */
|
|
int use_prealloc; /* Bool: use preallocation */
|
|
};
|
|
|
|
|
|
#endif /* EXT2_TYPE_H */
|