]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blobdiff - include/linux/ext2_fs.h
.del-ext2_fs.h~7a460879, ChangeLog:
[thirdparty/e2fsprogs.git] / include / linux / ext2_fs.h
index 2fa3a9ea9a7d401f54dac6934784675418a72892..be66a3c076e7555ccbe64b7b4bd76854c68ac008 100644 (file)
@@ -16,7 +16,7 @@
 #ifndef _LINUX_EXT2_FS_H
 #define _LINUX_EXT2_FS_H
 
-#include <linux/types.h>
+#include <asm/types.h>         /* Changed from linux/types.h */
 
 /*
  * The second extended filesystem constants/structures
@@ -31,6 +31,7 @@
  * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files
  */
 #define EXT2_PREALLOCATE
+#define EXT2_DEFAULT_PREALLOC_BLOCKS   8
 
 /*
  * The second extended file system version
 #define EXT2FS_DATE            "95/08/09"
 #define EXT2FS_VERSION         "0.5b"
 
-/*
- * Debug code
- */
-#if 0
-#ifdef EXT2FS_DEBUG
-#      define ext2_debug(f, a...)      { \
-                                       printk ("EXT2-fs DEBUG (%s, %d): %s:", \
-                                               __FILE__, __LINE__, __FUNCTION__); \
-                                       printk (f, ## a); \
-                                       }
-#else
-#      define ext2_debug(f, a...)      /**/
-#endif
-#endif
-
 /*
  * Special inodes numbers
  */
 #define EXT2_ACL_DATA_INO       4      /* ACL inode */
 #define EXT2_BOOT_LOADER_INO    5      /* Boot loader inode */
 #define EXT2_UNDEL_DIR_INO      6      /* Undelete directory inode */
+/*
+ * 7 is reserved for EXT2_RESIZE_INO; was used for this in the past
+ * for the on-line resizing patches, but there is a better way of
+ * doing this which sct, andreas, and tytso discussed at the
+ * Filesystem/Storage Management Workshop in Miami (October, 2000).
+ */
+#define EXT2_JOURNAL_INO        8      /* Journal inode */
 
 /* First non-reserved inode for old ext2 filesystems */
 #define EXT2_GOOD_OLD_FIRST_INO        11
@@ -192,8 +185,20 @@ struct ext2_group_desc
 #define EXT2_APPEND_FL                 0x00000020 /* writes to file may only append */
 #define EXT2_NODUMP_FL                 0x00000040 /* do not dump file */
 #define EXT2_NOATIME_FL                        0x00000080 /* do not update atime */
+/* Reserved for compression usage... */
+#define EXT2_DIRTY_FL                  0x00000100
+#define EXT2_COMPRBLK_FL               0x00000200 /* One or more compressed clusters */
+#define EXT2_NOCOMPR_FL                0x00000400 /* Access raw compressed data */
+#define EXT2_ECOMPR_FL                 0x00000800 /* Compression error */
+/* End compression flags --- maybe not all used */     
+#define EXT2_BTREE_FL                  0x00001000 /* btree format dir */
+#define EXT2_IMAGIC_FL                 0x00002000
+#define EXT3_JOURNAL_DATA_FL           0x00004000 /* file data should be journaled */
 #define EXT2_RESERVED_FL               0x80000000 /* reserved for ext2 lib */
-       
+
+#define EXT2_FL_USER_VISIBLE           0x00005FFF /* User visible flags */
+#define EXT2_FL_USER_MODIFIABLE                0x000000FF /* User modifiable flags */
+
 /*
  * ioctl commands
  */
@@ -207,13 +212,13 @@ struct ext2_group_desc
  */
 struct ext2_inode {
        __u16   i_mode;         /* File mode */
-       __u16   i_uid;          /* Owner Uid */
+       __u16   i_uid;          /* Low 16 bits of Owner Uid */
        __u32   i_size;         /* Size in bytes */
        __u32   i_atime;        /* Access time */
        __u32   i_ctime;        /* Creation time */
        __u32   i_mtime;        /* Modification time */
        __u32   i_dtime;        /* Deletion Time */
-       __u16   i_gid;          /* Group Id */
+       __u16   i_gid;          /* Low 16 bits of Group Id */
        __u16   i_links_count;  /* Links count */
        __u32   i_blocks;       /* Blocks count */
        __u32   i_flags;        /* File flags */
@@ -229,7 +234,7 @@ struct ext2_inode {
                } masix1;
        } osd1;                         /* OS dependent 1 */
        __u32   i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
-       __u32   i_version;      /* File version (for NFS) */
+       __u32   i_generation;   /* File version (for NFS) */
        __u32   i_file_acl;     /* File ACL */
        __u32   i_dir_acl;      /* Directory ACL */
        __u32   i_faddr;        /* Fragment address */
@@ -238,7 +243,9 @@ struct ext2_inode {
                        __u8    l_i_frag;       /* Fragment number */
                        __u8    l_i_fsize;      /* Fragment size */
                        __u16   i_pad1;
-                       __u32   l_i_reserved2[2];
+                       __u16   l_i_uid_high;   /* these 2 fields    */
+                       __u16   l_i_gid_high;   /* were reserved2[0] */
+                       __u32   l_i_reserved2;
                } linux2;
                struct {
                        __u8    h_i_frag;       /* Fragment number */
@@ -257,28 +264,35 @@ struct ext2_inode {
        } osd2;                         /* OS dependent 2 */
 };
 
+#define i_size_high    i_dir_acl
+
 #if defined(__KERNEL__) || defined(__linux__)
 #define i_reserved1    osd1.linux1.l_i_reserved1
 #define i_frag         osd2.linux2.l_i_frag
 #define i_fsize                osd2.linux2.l_i_fsize
+#define i_uid_low      i_uid
+#define i_gid_low      i_gid
+#define i_uid_high     osd2.linux2.l_i_uid_high
+#define i_gid_high     osd2.linux2.l_i_gid_high
 #define i_reserved2    osd2.linux2.l_i_reserved2
-#endif
 
-#ifdef __hurd__
+#elif defined(__GNU__)
+
 #define i_translator   osd1.hurd1.h_i_translator
 #define i_frag         osd2.hurd2.h_i_frag;
 #define i_fsize                osd2.hurd2.h_i_fsize;
 #define i_uid_high     osd2.hurd2.h_i_uid_high
 #define i_gid_high     osd2.hurd2.h_i_gid_high
 #define i_author       osd2.hurd2.h_i_author
-#endif
 
-#ifdef __masix__
+#elif defined(__masix__)
+
 #define i_reserved1    osd1.masix1.m_i_reserved1
 #define i_frag         osd2.masix2.m_i_frag
 #define i_fsize                osd2.masix2.m_i_fsize
 #define i_reserved2    osd2.masix2.m_i_reserved2
-#endif
+
+#endif /* defined(__KERNEL) || defined(__linux__) */
 
 /*
  * File system states
@@ -289,16 +303,14 @@ struct ext2_inode {
 /*
  * Mount flags
  */
-#define EXT2_MOUNT_CHECK_NORMAL                0x0001  /* Do some more checks */
-#define EXT2_MOUNT_CHECK_STRICT                0x0002  /* Do again more checks */
-#define EXT2_MOUNT_CHECK               (EXT2_MOUNT_CHECK_NORMAL | \
-                                        EXT2_MOUNT_CHECK_STRICT)
+#define EXT2_MOUNT_CHECK               0x0001  /* Do mount-time checks */
 #define EXT2_MOUNT_GRPID               0x0004  /* Create files with directory's group */
 #define EXT2_MOUNT_DEBUG               0x0008  /* Some debugging messages */
 #define EXT2_MOUNT_ERRORS_CONT         0x0010  /* Continue on errors */
 #define EXT2_MOUNT_ERRORS_RO           0x0020  /* Remount fs ro on errors */
 #define EXT2_MOUNT_ERRORS_PANIC                0x0040  /* Panic on errors */
 #define EXT2_MOUNT_MINIX_DF            0x0080  /* Mimics the Minix statfs */
+#define EXT2_MOUNT_NO_UID32            0x0200  /* Disable 32-bit UIDs */
 
 #define clear_opt(o, opt)              o &= ~EXT2_MOUNT_##opt
 #define set_opt(o, opt)                        o |= EXT2_MOUNT_##opt
@@ -369,9 +381,34 @@ struct ext2_super_block {
        __u8    s_uuid[16];             /* 128-bit uuid for volume */
        char    s_volume_name[16];      /* volume name */
        char    s_last_mounted[64];     /* directory where last mounted */
-       __u32   s_reserved[206];        /* Padding to the end of the block */
+       __u32   s_algorithm_usage_bitmap; /* For compression */
+       /*
+        * Performance hints.  Directory preallocation should only
+        * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
+        */
+       __u8    s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
+       __u8    s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
+       __u16   s_padding1;
+       /* 
+        * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
+        */
+       __u8    s_journal_uuid[16];     /* uuid of journal superblock */
+       __u32   s_journal_inum;         /* inode number of journal file */
+       __u32   s_journal_dev;          /* device number of journal file */
+       __u32   s_last_orphan;          /* start of list of inodes to delete */
+       
+       __u32   s_reserved[197];        /* Padding to the end of the block */
 };
 
+#ifdef __KERNEL__
+#define EXT2_SB(sb)    (&((sb)->u.ext2_sb))
+#else
+/* Assume that user mode programs are passing in an ext2fs superblock, not
+ * a kernel struct super_block.  This will allow us to call the feature-test
+ * macros from user land. */
+#define EXT2_SB(sb)    (sb)
+#endif
+
 /*
  * Codes for operating systems
  */
@@ -396,11 +433,30 @@ struct ext2_super_block {
  * Feature set definitions
  */
 
+#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                       \
+       ( EXT2_SB(sb)->s_feature_compat & (mask) )
+#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                    \
+       ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
+#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                     \
+       ( EXT2_SB(sb)->s_feature_incompat & (mask) )
+
+#define EXT2_FEATURE_COMPAT_DIR_PREALLOC       0x0001
+#define EXT2_FEATURE_COMPAT_IMAGIC_INODES      0x0002
+#define EXT3_FEATURE_COMPAT_HAS_JOURNAL                0x0004
+
 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER    0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE      0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR       0x0004
+
+#define EXT2_FEATURE_INCOMPAT_COMPRESSION      0x0001
+#define EXT2_FEATURE_INCOMPAT_FILETYPE         0x0002
+#define EXT3_FEATURE_INCOMPAT_RECOVER          0x0004 /* Needs recovery */
 
 #define EXT2_FEATURE_COMPAT_SUPP       0
-#define EXT2_FEATURE_INCOMPAT_SUPP     0
-#define EXT2_FEATURE_RO_COMPAT_SUPP    EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER
+#define EXT2_FEATURE_INCOMPAT_SUPP     EXT2_FEATURE_INCOMPAT_FILETYPE
+#define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
 
 /*
  * Default values for user and/or group using reserved blocks
@@ -420,6 +476,35 @@ struct ext2_dir_entry {
        char    name[EXT2_NAME_LEN];    /* File name */
 };
 
+/*
+ * The new version of the directory entry.  Since EXT2 structures are
+ * stored in intel byte order, and the name_len field could never be
+ * bigger than 255 chars, it's safe to reclaim the extra byte for the
+ * file_type field.
+ */
+struct ext2_dir_entry_2 {
+       __u32   inode;                  /* Inode number */
+       __u16   rec_len;                /* Directory entry length */
+       __u8    name_len;               /* Name length */
+       __u8    file_type;
+       char    name[EXT2_NAME_LEN];    /* File name */
+};
+
+/*
+ * Ext2 directory file types.  Only the low 3 bits are used.  The
+ * other bits are reserved for now.
+ */
+#define EXT2_FT_UNKNOWN                0
+#define EXT2_FT_REG_FILE       1
+#define EXT2_FT_DIR            2
+#define EXT2_FT_CHRDEV         3
+#define EXT2_FT_BLKDEV                 4
+#define EXT2_FT_FIFO           5
+#define EXT2_FT_SOCK           6
+#define EXT2_FT_SYMLINK                7
+
+#define EXT2_FT_MAX            8
+
 /*
  * EXT2_DIR_PAD defines the directory entries boundaries
  *
@@ -439,33 +524,31 @@ struct ext2_dir_entry {
  * Ok, these declarations are also in <linux/kernel.h> but none of the
  * ext2 source programs needs to include it so they are duplicated here.
  */
-#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-# define NORET_TYPE    __volatile__
-# define ATTRIB_NORET  /**/
-# define NORET_AND     /**/
-#else
 # define NORET_TYPE    /**/
 # define ATTRIB_NORET  __attribute__((noreturn))
 # define NORET_AND     noreturn,
-#endif
 
 /* acl.c */
 extern int ext2_permission (struct inode *, int);
 
 /* balloc.c */
+extern int ext2_group_sparse(int group);
 extern int ext2_new_block (const struct inode *, unsigned long,
                           __u32 *, __u32 *, int *);
 extern void ext2_free_blocks (const struct inode *, unsigned long,
                              unsigned long);
 extern unsigned long ext2_count_free_blocks (struct super_block *);
 extern void ext2_check_blocks_bitmap (struct super_block *);
+extern struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
+                                                   unsigned int block_group,
+                                                   struct buffer_head ** bh);
 
 /* bitmap.c */
 extern unsigned long ext2_count_free (struct buffer_head *, unsigned);
 
 /* dir.c */
 extern int ext2_check_dir_entry (const char *, struct inode *,
-                                struct ext2_dir_entry *, struct buffer_head *,
+                                struct ext2_dir_entry_2 *, struct buffer_head *,
                                 unsigned long);
 
 /* file.c */
@@ -473,7 +556,7 @@ extern int ext2_read (struct inode *, struct file *, char *, int);
 extern int ext2_write (struct inode *, struct file *, char *, int);
 
 /* fsync.c */
-extern int ext2_sync_file (struct inode *, struct file *);
+extern int ext2_sync_file (struct file *, struct dentry *);
 
 /* ialloc.c */
 extern struct inode * ext2_new_inode (const struct inode *, int, int *);
@@ -482,15 +565,18 @@ extern unsigned long ext2_count_free_inodes (struct super_block *);
 extern void ext2_check_inodes_bitmap (struct super_block *);
 
 /* inode.c */
-extern int ext2_bmap (struct inode *, int);
+extern long ext2_bmap (struct inode *, long);
+extern int ext2_get_block (struct inode *, long, struct buffer_head *, int);
 
 extern struct buffer_head * ext2_getblk (struct inode *, long, int, int *);
+extern int ext2_getblk_block (struct inode *, long, int, int *, int *);
 extern struct buffer_head * ext2_bread (struct inode *, int, int, int *);
 
 extern int ext2_getcluster (struct inode * inode, long block);
 extern void ext2_read_inode (struct inode *);
 extern void ext2_write_inode (struct inode *);
 extern void ext2_put_inode (struct inode *);
+extern void ext2_delete_inode (struct inode *);
 extern int ext2_sync_inode (struct inode *);
 extern void ext2_discard_prealloc (struct inode *);
 
@@ -500,17 +586,16 @@ extern int ext2_ioctl (struct inode *, struct file *, unsigned int,
 
 /* namei.c */
 extern void ext2_release (struct inode *, struct file *);
-extern int ext2_lookup (struct inode *,const char *, int, struct inode **);
-extern int ext2_create (struct inode *,const char *, int, int,
-                       struct inode **);
-extern int ext2_mkdir (struct inode *, const char *, int, int);
-extern int ext2_rmdir (struct inode *, const char *, int);
-extern int ext2_unlink (struct inode *, const char *, int);
-extern int ext2_symlink (struct inode *, const char *, int, const char *);
-extern int ext2_link (struct inode *, struct inode *, const char *, int);
-extern int ext2_mknod (struct inode *, const char *, int, int, int);
-extern int ext2_rename (struct inode *, const char *, int,
-                       struct inode *, const char *, int, int);
+extern struct dentry *ext2_lookup (struct inode *, struct dentry *);
+extern int ext2_create (struct inode *,struct dentry *,int);
+extern int ext2_mkdir (struct inode *,struct dentry *,int);
+extern int ext2_rmdir (struct inode *,struct dentry *);
+extern int ext2_unlink (struct inode *,struct dentry *);
+extern int ext2_symlink (struct inode *,struct dentry *,const char *);
+extern int ext2_link (struct dentry *, struct inode *, struct dentry *);
+extern int ext2_mknod (struct inode *, struct dentry *, int, int);
+extern int ext2_rename (struct inode *, struct dentry *,
+                       struct inode *, struct dentry *);
 
 /* super.c */
 extern void ext2_error (struct super_block *, const char *, const char *, ...)
@@ -524,8 +609,7 @@ extern void ext2_put_super (struct super_block *);
 extern void ext2_write_super (struct super_block *);
 extern int ext2_remount (struct super_block *, int *, char *);
 extern struct super_block * ext2_read_super (struct super_block *,void *,int);
-extern int init_ext2_fs(void);
-extern void ext2_statfs (struct super_block *, struct statfs *, int);
+extern int ext2_statfs (struct super_block *, struct statfs *, int);
 
 /* truncate.c */
 extern void ext2_truncate (struct inode *);
@@ -542,6 +626,7 @@ extern struct inode_operations ext2_file_inode_operations;
 
 /* symlink.c */
 extern struct inode_operations ext2_symlink_inode_operations;
+extern struct inode_operations ext2_fast_symlink_inode_operations;
 
 #endif /* __KERNEL__ */