LCOV - code coverage report
Current view: top level - fs/ext3 - ext3.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 33 0.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 0 88 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Written by Stephen C. Tweedie <sct@redhat.com>, 1999
       3                 :            :  *
       4                 :            :  * Copyright 1998--1999 Red Hat corp --- All Rights Reserved
       5                 :            :  *
       6                 :            :  * This file is part of the Linux kernel and is made available under
       7                 :            :  * the terms of the GNU General Public License, version 2, or at your
       8                 :            :  * option, any later version, incorporated herein by reference.
       9                 :            :  *
      10                 :            :  * Copyright (C) 1992, 1993, 1994, 1995
      11                 :            :  * Remy Card (card@masi.ibp.fr)
      12                 :            :  * Laboratoire MASI - Institut Blaise Pascal
      13                 :            :  * Universite Pierre et Marie Curie (Paris VI)
      14                 :            :  *
      15                 :            :  *  from
      16                 :            :  *
      17                 :            :  *  linux/include/linux/minix_fs.h
      18                 :            :  *
      19                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
      20                 :            :  */
      21                 :            : 
      22                 :            : #include <linux/fs.h>
      23                 :            : #include <linux/jbd.h>
      24                 :            : #include <linux/magic.h>
      25                 :            : #include <linux/bug.h>
      26                 :            : #include <linux/blockgroup_lock.h>
      27                 :            : 
      28                 :            : /*
      29                 :            :  * The second extended filesystem constants/structures
      30                 :            :  */
      31                 :            : 
      32                 :            : /*
      33                 :            :  * Define EXT3FS_DEBUG to produce debug messages
      34                 :            :  */
      35                 :            : #undef EXT3FS_DEBUG
      36                 :            : 
      37                 :            : /*
      38                 :            :  * Define EXT3_RESERVATION to reserve data blocks for expanding files
      39                 :            :  */
      40                 :            : #define EXT3_DEFAULT_RESERVE_BLOCKS     8
      41                 :            : /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
      42                 :            : #define EXT3_MAX_RESERVE_BLOCKS         1027
      43                 :            : #define EXT3_RESERVE_WINDOW_NOT_ALLOCATED 0
      44                 :            : 
      45                 :            : /*
      46                 :            :  * Debug code
      47                 :            :  */
      48                 :            : #ifdef EXT3FS_DEBUG
      49                 :            : #define ext3_debug(f, a...)                                             \
      50                 :            :         do {                                                            \
      51                 :            :                 printk (KERN_DEBUG "EXT3-fs DEBUG (%s, %d): %s:",     \
      52                 :            :                         __FILE__, __LINE__, __func__);          \
      53                 :            :                 printk (KERN_DEBUG f, ## a);                            \
      54                 :            :         } while (0)
      55                 :            : #else
      56                 :            : #define ext3_debug(f, a...)     do {} while (0)
      57                 :            : #endif
      58                 :            : 
      59                 :            : /*
      60                 :            :  * Special inodes numbers
      61                 :            :  */
      62                 :            : #define EXT3_BAD_INO             1      /* Bad blocks inode */
      63                 :            : #define EXT3_ROOT_INO            2      /* Root inode */
      64                 :            : #define EXT3_BOOT_LOADER_INO     5      /* Boot loader inode */
      65                 :            : #define EXT3_UNDEL_DIR_INO       6      /* Undelete directory inode */
      66                 :            : #define EXT3_RESIZE_INO          7      /* Reserved group descriptors inode */
      67                 :            : #define EXT3_JOURNAL_INO         8      /* Journal inode */
      68                 :            : 
      69                 :            : /* First non-reserved inode for old ext3 filesystems */
      70                 :            : #define EXT3_GOOD_OLD_FIRST_INO 11
      71                 :            : 
      72                 :            : /*
      73                 :            :  * Maximal count of links to a file
      74                 :            :  */
      75                 :            : #define EXT3_LINK_MAX           32000
      76                 :            : 
      77                 :            : /*
      78                 :            :  * Macro-instructions used to manage several block sizes
      79                 :            :  */
      80                 :            : #define EXT3_MIN_BLOCK_SIZE             1024
      81                 :            : #define EXT3_MAX_BLOCK_SIZE             65536
      82                 :            : #define EXT3_MIN_BLOCK_LOG_SIZE         10
      83                 :            : #define EXT3_BLOCK_SIZE(s)              ((s)->s_blocksize)
      84                 :            : #define EXT3_ADDR_PER_BLOCK(s)          (EXT3_BLOCK_SIZE(s) / sizeof (__u32))
      85                 :            : #define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
      86                 :            : #define EXT3_ADDR_PER_BLOCK_BITS(s)     (EXT3_SB(s)->s_addr_per_block_bits)
      87                 :            : #define EXT3_INODE_SIZE(s)              (EXT3_SB(s)->s_inode_size)
      88                 :            : #define EXT3_FIRST_INO(s)               (EXT3_SB(s)->s_first_ino)
      89                 :            : 
      90                 :            : /*
      91                 :            :  * Macro-instructions used to manage fragments
      92                 :            :  */
      93                 :            : #define EXT3_MIN_FRAG_SIZE              1024
      94                 :            : #define EXT3_MAX_FRAG_SIZE              4096
      95                 :            : #define EXT3_MIN_FRAG_LOG_SIZE            10
      96                 :            : #define EXT3_FRAG_SIZE(s)               (EXT3_SB(s)->s_frag_size)
      97                 :            : #define EXT3_FRAGS_PER_BLOCK(s)         (EXT3_SB(s)->s_frags_per_block)
      98                 :            : 
      99                 :            : /*
     100                 :            :  * Structure of a blocks group descriptor
     101                 :            :  */
     102                 :            : struct ext3_group_desc
     103                 :            : {
     104                 :            :         __le32  bg_block_bitmap;                /* Blocks bitmap block */
     105                 :            :         __le32  bg_inode_bitmap;                /* Inodes bitmap block */
     106                 :            :         __le32  bg_inode_table;         /* Inodes table block */
     107                 :            :         __le16  bg_free_blocks_count;   /* Free blocks count */
     108                 :            :         __le16  bg_free_inodes_count;   /* Free inodes count */
     109                 :            :         __le16  bg_used_dirs_count;     /* Directories count */
     110                 :            :         __u16   bg_pad;
     111                 :            :         __le32  bg_reserved[3];
     112                 :            : };
     113                 :            : 
     114                 :            : /*
     115                 :            :  * Macro-instructions used to manage group descriptors
     116                 :            :  */
     117                 :            : #define EXT3_BLOCKS_PER_GROUP(s)        (EXT3_SB(s)->s_blocks_per_group)
     118                 :            : #define EXT3_DESC_PER_BLOCK(s)          (EXT3_SB(s)->s_desc_per_block)
     119                 :            : #define EXT3_INODES_PER_GROUP(s)        (EXT3_SB(s)->s_inodes_per_group)
     120                 :            : #define EXT3_DESC_PER_BLOCK_BITS(s)     (EXT3_SB(s)->s_desc_per_block_bits)
     121                 :            : 
     122                 :            : /*
     123                 :            :  * Constants relative to the data blocks
     124                 :            :  */
     125                 :            : #define EXT3_NDIR_BLOCKS                12
     126                 :            : #define EXT3_IND_BLOCK                  EXT3_NDIR_BLOCKS
     127                 :            : #define EXT3_DIND_BLOCK                 (EXT3_IND_BLOCK + 1)
     128                 :            : #define EXT3_TIND_BLOCK                 (EXT3_DIND_BLOCK + 1)
     129                 :            : #define EXT3_N_BLOCKS                   (EXT3_TIND_BLOCK + 1)
     130                 :            : 
     131                 :            : /*
     132                 :            :  * Inode flags
     133                 :            :  */
     134                 :            : #define EXT3_SECRM_FL                   0x00000001 /* Secure deletion */
     135                 :            : #define EXT3_UNRM_FL                    0x00000002 /* Undelete */
     136                 :            : #define EXT3_COMPR_FL                   0x00000004 /* Compress file */
     137                 :            : #define EXT3_SYNC_FL                    0x00000008 /* Synchronous updates */
     138                 :            : #define EXT3_IMMUTABLE_FL               0x00000010 /* Immutable file */
     139                 :            : #define EXT3_APPEND_FL                  0x00000020 /* writes to file may only append */
     140                 :            : #define EXT3_NODUMP_FL                  0x00000040 /* do not dump file */
     141                 :            : #define EXT3_NOATIME_FL                 0x00000080 /* do not update atime */
     142                 :            : /* Reserved for compression usage... */
     143                 :            : #define EXT3_DIRTY_FL                   0x00000100
     144                 :            : #define EXT3_COMPRBLK_FL                0x00000200 /* One or more compressed clusters */
     145                 :            : #define EXT3_NOCOMPR_FL                 0x00000400 /* Don't compress */
     146                 :            : #define EXT3_ECOMPR_FL                  0x00000800 /* Compression error */
     147                 :            : /* End compression flags --- maybe not all used */
     148                 :            : #define EXT3_INDEX_FL                   0x00001000 /* hash-indexed directory */
     149                 :            : #define EXT3_IMAGIC_FL                  0x00002000 /* AFS directory */
     150                 :            : #define EXT3_JOURNAL_DATA_FL            0x00004000 /* file data should be journaled */
     151                 :            : #define EXT3_NOTAIL_FL                  0x00008000 /* file tail should not be merged */
     152                 :            : #define EXT3_DIRSYNC_FL                 0x00010000 /* dirsync behaviour (directories only) */
     153                 :            : #define EXT3_TOPDIR_FL                  0x00020000 /* Top of directory hierarchies*/
     154                 :            : #define EXT3_RESERVED_FL                0x80000000 /* reserved for ext3 lib */
     155                 :            : 
     156                 :            : #define EXT3_FL_USER_VISIBLE            0x0003DFFF /* User visible flags */
     157                 :            : #define EXT3_FL_USER_MODIFIABLE         0x000380FF /* User modifiable flags */
     158                 :            : 
     159                 :            : /* Flags that should be inherited by new inodes from their parent. */
     160                 :            : #define EXT3_FL_INHERITED (EXT3_SECRM_FL | EXT3_UNRM_FL | EXT3_COMPR_FL |\
     161                 :            :                            EXT3_SYNC_FL | EXT3_NODUMP_FL |\
     162                 :            :                            EXT3_NOATIME_FL | EXT3_COMPRBLK_FL |\
     163                 :            :                            EXT3_NOCOMPR_FL | EXT3_JOURNAL_DATA_FL |\
     164                 :            :                            EXT3_NOTAIL_FL | EXT3_DIRSYNC_FL)
     165                 :            : 
     166                 :            : /* Flags that are appropriate for regular files (all but dir-specific ones). */
     167                 :            : #define EXT3_REG_FLMASK (~(EXT3_DIRSYNC_FL | EXT3_TOPDIR_FL))
     168                 :            : 
     169                 :            : /* Flags that are appropriate for non-directories/regular files. */
     170                 :            : #define EXT3_OTHER_FLMASK (EXT3_NODUMP_FL | EXT3_NOATIME_FL)
     171                 :            : 
     172                 :            : /* Mask out flags that are inappropriate for the given type of inode. */
     173                 :            : static inline __u32 ext3_mask_flags(umode_t mode, __u32 flags)
     174                 :            : {
     175 [ #  # ][ #  # ]:          0 :         if (S_ISDIR(mode))
     176                 :            :                 return flags;
     177         [ #  # ]:          0 :         else if (S_ISREG(mode))
     178                 :          0 :                 return flags & EXT3_REG_FLMASK;
     179                 :            :         else
     180                 :          0 :                 return flags & EXT3_OTHER_FLMASK;
     181                 :            : }
     182                 :            : 
     183                 :            : /* Used to pass group descriptor data when online resize is done */
     184                 :            : struct ext3_new_group_input {
     185                 :            :         __u32 group;            /* Group number for this data */
     186                 :            :         __u32 block_bitmap;     /* Absolute block number of block bitmap */
     187                 :            :         __u32 inode_bitmap;     /* Absolute block number of inode bitmap */
     188                 :            :         __u32 inode_table;      /* Absolute block number of inode table start */
     189                 :            :         __u32 blocks_count;     /* Total number of blocks in this group */
     190                 :            :         __u16 reserved_blocks;  /* Number of reserved blocks in this group */
     191                 :            :         __u16 unused;
     192                 :            : };
     193                 :            : 
     194                 :            : /* The struct ext3_new_group_input in kernel space, with free_blocks_count */
     195                 :            : struct ext3_new_group_data {
     196                 :            :         __u32 group;
     197                 :            :         __u32 block_bitmap;
     198                 :            :         __u32 inode_bitmap;
     199                 :            :         __u32 inode_table;
     200                 :            :         __u32 blocks_count;
     201                 :            :         __u16 reserved_blocks;
     202                 :            :         __u16 unused;
     203                 :            :         __u32 free_blocks_count;
     204                 :            : };
     205                 :            : 
     206                 :            : 
     207                 :            : /*
     208                 :            :  * ioctl commands
     209                 :            :  */
     210                 :            : #define EXT3_IOC_GETFLAGS               FS_IOC_GETFLAGS
     211                 :            : #define EXT3_IOC_SETFLAGS               FS_IOC_SETFLAGS
     212                 :            : #define EXT3_IOC_GETVERSION             _IOR('f', 3, long)
     213                 :            : #define EXT3_IOC_SETVERSION             _IOW('f', 4, long)
     214                 :            : #define EXT3_IOC_GROUP_EXTEND           _IOW('f', 7, unsigned long)
     215                 :            : #define EXT3_IOC_GROUP_ADD              _IOW('f', 8,struct ext3_new_group_input)
     216                 :            : #define EXT3_IOC_GETVERSION_OLD         FS_IOC_GETVERSION
     217                 :            : #define EXT3_IOC_SETVERSION_OLD         FS_IOC_SETVERSION
     218                 :            : #ifdef CONFIG_JBD_DEBUG
     219                 :            : #define EXT3_IOC_WAIT_FOR_READONLY      _IOR('f', 99, long)
     220                 :            : #endif
     221                 :            : #define EXT3_IOC_GETRSVSZ               _IOR('f', 5, long)
     222                 :            : #define EXT3_IOC_SETRSVSZ               _IOW('f', 6, long)
     223                 :            : 
     224                 :            : /*
     225                 :            :  * ioctl commands in 32 bit emulation
     226                 :            :  */
     227                 :            : #define EXT3_IOC32_GETFLAGS             FS_IOC32_GETFLAGS
     228                 :            : #define EXT3_IOC32_SETFLAGS             FS_IOC32_SETFLAGS
     229                 :            : #define EXT3_IOC32_GETVERSION           _IOR('f', 3, int)
     230                 :            : #define EXT3_IOC32_SETVERSION           _IOW('f', 4, int)
     231                 :            : #define EXT3_IOC32_GETRSVSZ             _IOR('f', 5, int)
     232                 :            : #define EXT3_IOC32_SETRSVSZ             _IOW('f', 6, int)
     233                 :            : #define EXT3_IOC32_GROUP_EXTEND         _IOW('f', 7, unsigned int)
     234                 :            : #ifdef CONFIG_JBD_DEBUG
     235                 :            : #define EXT3_IOC32_WAIT_FOR_READONLY    _IOR('f', 99, int)
     236                 :            : #endif
     237                 :            : #define EXT3_IOC32_GETVERSION_OLD       FS_IOC32_GETVERSION
     238                 :            : #define EXT3_IOC32_SETVERSION_OLD       FS_IOC32_SETVERSION
     239                 :            : 
     240                 :            : 
     241                 :            : /*
     242                 :            :  *  Mount options
     243                 :            :  */
     244                 :            : struct ext3_mount_options {
     245                 :            :         unsigned long s_mount_opt;
     246                 :            :         kuid_t s_resuid;
     247                 :            :         kgid_t s_resgid;
     248                 :            :         unsigned long s_commit_interval;
     249                 :            : #ifdef CONFIG_QUOTA
     250                 :            :         int s_jquota_fmt;
     251                 :            :         char *s_qf_names[MAXQUOTAS];
     252                 :            : #endif
     253                 :            : };
     254                 :            : 
     255                 :            : /*
     256                 :            :  * Structure of an inode on the disk
     257                 :            :  */
     258                 :            : struct ext3_inode {
     259                 :            :         __le16  i_mode;         /* File mode */
     260                 :            :         __le16  i_uid;          /* Low 16 bits of Owner Uid */
     261                 :            :         __le32  i_size;         /* Size in bytes */
     262                 :            :         __le32  i_atime;        /* Access time */
     263                 :            :         __le32  i_ctime;        /* Creation time */
     264                 :            :         __le32  i_mtime;        /* Modification time */
     265                 :            :         __le32  i_dtime;        /* Deletion Time */
     266                 :            :         __le16  i_gid;          /* Low 16 bits of Group Id */
     267                 :            :         __le16  i_links_count;  /* Links count */
     268                 :            :         __le32  i_blocks;       /* Blocks count */
     269                 :            :         __le32  i_flags;        /* File flags */
     270                 :            :         union {
     271                 :            :                 struct {
     272                 :            :                         __u32  l_i_reserved1;
     273                 :            :                 } linux1;
     274                 :            :                 struct {
     275                 :            :                         __u32  h_i_translator;
     276                 :            :                 } hurd1;
     277                 :            :                 struct {
     278                 :            :                         __u32  m_i_reserved1;
     279                 :            :                 } masix1;
     280                 :            :         } osd1;                         /* OS dependent 1 */
     281                 :            :         __le32  i_block[EXT3_N_BLOCKS];/* Pointers to blocks */
     282                 :            :         __le32  i_generation;   /* File version (for NFS) */
     283                 :            :         __le32  i_file_acl;     /* File ACL */
     284                 :            :         __le32  i_dir_acl;      /* Directory ACL */
     285                 :            :         __le32  i_faddr;        /* Fragment address */
     286                 :            :         union {
     287                 :            :                 struct {
     288                 :            :                         __u8    l_i_frag;       /* Fragment number */
     289                 :            :                         __u8    l_i_fsize;      /* Fragment size */
     290                 :            :                         __u16   i_pad1;
     291                 :            :                         __le16  l_i_uid_high;   /* these 2 fields    */
     292                 :            :                         __le16  l_i_gid_high;   /* were reserved2[0] */
     293                 :            :                         __u32   l_i_reserved2;
     294                 :            :                 } linux2;
     295                 :            :                 struct {
     296                 :            :                         __u8    h_i_frag;       /* Fragment number */
     297                 :            :                         __u8    h_i_fsize;      /* Fragment size */
     298                 :            :                         __u16   h_i_mode_high;
     299                 :            :                         __u16   h_i_uid_high;
     300                 :            :                         __u16   h_i_gid_high;
     301                 :            :                         __u32   h_i_author;
     302                 :            :                 } hurd2;
     303                 :            :                 struct {
     304                 :            :                         __u8    m_i_frag;       /* Fragment number */
     305                 :            :                         __u8    m_i_fsize;      /* Fragment size */
     306                 :            :                         __u16   m_pad1;
     307                 :            :                         __u32   m_i_reserved2[2];
     308                 :            :                 } masix2;
     309                 :            :         } osd2;                         /* OS dependent 2 */
     310                 :            :         __le16  i_extra_isize;
     311                 :            :         __le16  i_pad1;
     312                 :            : };
     313                 :            : 
     314                 :            : #define i_size_high     i_dir_acl
     315                 :            : 
     316                 :            : #define i_reserved1     osd1.linux1.l_i_reserved1
     317                 :            : #define i_frag          osd2.linux2.l_i_frag
     318                 :            : #define i_fsize         osd2.linux2.l_i_fsize
     319                 :            : #define i_uid_low       i_uid
     320                 :            : #define i_gid_low       i_gid
     321                 :            : #define i_uid_high      osd2.linux2.l_i_uid_high
     322                 :            : #define i_gid_high      osd2.linux2.l_i_gid_high
     323                 :            : #define i_reserved2     osd2.linux2.l_i_reserved2
     324                 :            : 
     325                 :            : /*
     326                 :            :  * File system states
     327                 :            :  */
     328                 :            : #define EXT3_VALID_FS                   0x0001  /* Unmounted cleanly */
     329                 :            : #define EXT3_ERROR_FS                   0x0002  /* Errors detected */
     330                 :            : #define EXT3_ORPHAN_FS                  0x0004  /* Orphans being recovered */
     331                 :            : 
     332                 :            : /*
     333                 :            :  * Misc. filesystem flags
     334                 :            :  */
     335                 :            : #define EXT2_FLAGS_SIGNED_HASH          0x0001  /* Signed dirhash in use */
     336                 :            : #define EXT2_FLAGS_UNSIGNED_HASH        0x0002  /* Unsigned dirhash in use */
     337                 :            : #define EXT2_FLAGS_TEST_FILESYS         0x0004  /* to test development code */
     338                 :            : 
     339                 :            : /*
     340                 :            :  * Mount flags
     341                 :            :  */
     342                 :            : #define EXT3_MOUNT_CHECK                0x00001 /* Do mount-time checks */
     343                 :            : /* EXT3_MOUNT_OLDALLOC was there */
     344                 :            : #define EXT3_MOUNT_GRPID                0x00004 /* Create files with directory's group */
     345                 :            : #define EXT3_MOUNT_DEBUG                0x00008 /* Some debugging messages */
     346                 :            : #define EXT3_MOUNT_ERRORS_CONT          0x00010 /* Continue on errors */
     347                 :            : #define EXT3_MOUNT_ERRORS_RO            0x00020 /* Remount fs ro on errors */
     348                 :            : #define EXT3_MOUNT_ERRORS_PANIC         0x00040 /* Panic on errors */
     349                 :            : #define EXT3_MOUNT_MINIX_DF             0x00080 /* Mimics the Minix statfs */
     350                 :            : #define EXT3_MOUNT_NOLOAD               0x00100 /* Don't use existing journal*/
     351                 :            : #define EXT3_MOUNT_ABORT                0x00200 /* Fatal error detected */
     352                 :            : #define EXT3_MOUNT_DATA_FLAGS           0x00C00 /* Mode for data writes: */
     353                 :            : #define EXT3_MOUNT_JOURNAL_DATA         0x00400 /* Write data to journal */
     354                 :            : #define EXT3_MOUNT_ORDERED_DATA         0x00800 /* Flush data before commit */
     355                 :            : #define EXT3_MOUNT_WRITEBACK_DATA       0x00C00 /* No data ordering */
     356                 :            : #define EXT3_MOUNT_UPDATE_JOURNAL       0x01000 /* Update the journal format */
     357                 :            : #define EXT3_MOUNT_NO_UID32             0x02000  /* Disable 32-bit UIDs */
     358                 :            : #define EXT3_MOUNT_XATTR_USER           0x04000 /* Extended user attributes */
     359                 :            : #define EXT3_MOUNT_POSIX_ACL            0x08000 /* POSIX Access Control Lists */
     360                 :            : #define EXT3_MOUNT_RESERVATION          0x10000 /* Preallocation */
     361                 :            : #define EXT3_MOUNT_BARRIER              0x20000 /* Use block barriers */
     362                 :            : #define EXT3_MOUNT_QUOTA                0x80000 /* Some quota option set */
     363                 :            : #define EXT3_MOUNT_USRQUOTA             0x100000 /* "old" user quota */
     364                 :            : #define EXT3_MOUNT_GRPQUOTA             0x200000 /* "old" group quota */
     365                 :            : #define EXT3_MOUNT_DATA_ERR_ABORT       0x400000 /* Abort on file data write
     366                 :            :                                                   * error in ordered mode */
     367                 :            : 
     368                 :            : /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
     369                 :            : #ifndef _LINUX_EXT2_FS_H
     370                 :            : #define clear_opt(o, opt)               o &= ~EXT3_MOUNT_##opt
     371                 :            : #define set_opt(o, opt)                 o |= EXT3_MOUNT_##opt
     372                 :            : #define test_opt(sb, opt)               (EXT3_SB(sb)->s_mount_opt & \
     373                 :            :                                          EXT3_MOUNT_##opt)
     374                 :            : #else
     375                 :            : #define EXT2_MOUNT_NOLOAD               EXT3_MOUNT_NOLOAD
     376                 :            : #define EXT2_MOUNT_ABORT                EXT3_MOUNT_ABORT
     377                 :            : #define EXT2_MOUNT_DATA_FLAGS           EXT3_MOUNT_DATA_FLAGS
     378                 :            : #endif
     379                 :            : 
     380                 :            : #define ext3_set_bit                    __set_bit_le
     381                 :            : #define ext3_set_bit_atomic             ext2_set_bit_atomic
     382                 :            : #define ext3_clear_bit                  __clear_bit_le
     383                 :            : #define ext3_clear_bit_atomic           ext2_clear_bit_atomic
     384                 :            : #define ext3_test_bit                   test_bit_le
     385                 :            : #define ext3_find_next_zero_bit         find_next_zero_bit_le
     386                 :            : 
     387                 :            : /*
     388                 :            :  * Maximal mount counts between two filesystem checks
     389                 :            :  */
     390                 :            : #define EXT3_DFL_MAX_MNT_COUNT          20      /* Allow 20 mounts */
     391                 :            : #define EXT3_DFL_CHECKINTERVAL          0       /* Don't use interval check */
     392                 :            : 
     393                 :            : /*
     394                 :            :  * Behaviour when detecting errors
     395                 :            :  */
     396                 :            : #define EXT3_ERRORS_CONTINUE            1       /* Continue execution */
     397                 :            : #define EXT3_ERRORS_RO                  2       /* Remount fs read-only */
     398                 :            : #define EXT3_ERRORS_PANIC               3       /* Panic */
     399                 :            : #define EXT3_ERRORS_DEFAULT             EXT3_ERRORS_CONTINUE
     400                 :            : 
     401                 :            : /*
     402                 :            :  * Structure of the super block
     403                 :            :  */
     404                 :            : struct ext3_super_block {
     405                 :            : /*00*/  __le32  s_inodes_count;         /* Inodes count */
     406                 :            :         __le32  s_blocks_count;         /* Blocks count */
     407                 :            :         __le32  s_r_blocks_count;       /* Reserved blocks count */
     408                 :            :         __le32  s_free_blocks_count;    /* Free blocks count */
     409                 :            : /*10*/  __le32  s_free_inodes_count;    /* Free inodes count */
     410                 :            :         __le32  s_first_data_block;     /* First Data Block */
     411                 :            :         __le32  s_log_block_size;       /* Block size */
     412                 :            :         __le32  s_log_frag_size;        /* Fragment size */
     413                 :            : /*20*/  __le32  s_blocks_per_group;     /* # Blocks per group */
     414                 :            :         __le32  s_frags_per_group;      /* # Fragments per group */
     415                 :            :         __le32  s_inodes_per_group;     /* # Inodes per group */
     416                 :            :         __le32  s_mtime;                /* Mount time */
     417                 :            : /*30*/  __le32  s_wtime;                /* Write time */
     418                 :            :         __le16  s_mnt_count;            /* Mount count */
     419                 :            :         __le16  s_max_mnt_count;        /* Maximal mount count */
     420                 :            :         __le16  s_magic;                /* Magic signature */
     421                 :            :         __le16  s_state;                /* File system state */
     422                 :            :         __le16  s_errors;               /* Behaviour when detecting errors */
     423                 :            :         __le16  s_minor_rev_level;      /* minor revision level */
     424                 :            : /*40*/  __le32  s_lastcheck;            /* time of last check */
     425                 :            :         __le32  s_checkinterval;        /* max. time between checks */
     426                 :            :         __le32  s_creator_os;           /* OS */
     427                 :            :         __le32  s_rev_level;            /* Revision level */
     428                 :            : /*50*/  __le16  s_def_resuid;           /* Default uid for reserved blocks */
     429                 :            :         __le16  s_def_resgid;           /* Default gid for reserved blocks */
     430                 :            :         /*
     431                 :            :          * These fields are for EXT3_DYNAMIC_REV superblocks only.
     432                 :            :          *
     433                 :            :          * Note: the difference between the compatible feature set and
     434                 :            :          * the incompatible feature set is that if there is a bit set
     435                 :            :          * in the incompatible feature set that the kernel doesn't
     436                 :            :          * know about, it should refuse to mount the filesystem.
     437                 :            :          *
     438                 :            :          * e2fsck's requirements are more strict; if it doesn't know
     439                 :            :          * about a feature in either the compatible or incompatible
     440                 :            :          * feature set, it must abort and not try to meddle with
     441                 :            :          * things it doesn't understand...
     442                 :            :          */
     443                 :            :         __le32  s_first_ino;            /* First non-reserved inode */
     444                 :            :         __le16   s_inode_size;          /* size of inode structure */
     445                 :            :         __le16  s_block_group_nr;       /* block group # of this superblock */
     446                 :            :         __le32  s_feature_compat;       /* compatible feature set */
     447                 :            : /*60*/  __le32  s_feature_incompat;     /* incompatible feature set */
     448                 :            :         __le32  s_feature_ro_compat;    /* readonly-compatible feature set */
     449                 :            : /*68*/  __u8    s_uuid[16];             /* 128-bit uuid for volume */
     450                 :            : /*78*/  char    s_volume_name[16];      /* volume name */
     451                 :            : /*88*/  char    s_last_mounted[64];     /* directory where last mounted */
     452                 :            : /*C8*/  __le32  s_algorithm_usage_bitmap; /* For compression */
     453                 :            :         /*
     454                 :            :          * Performance hints.  Directory preallocation should only
     455                 :            :          * happen if the EXT3_FEATURE_COMPAT_DIR_PREALLOC flag is on.
     456                 :            :          */
     457                 :            :         __u8    s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
     458                 :            :         __u8    s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
     459                 :            :         __le16  s_reserved_gdt_blocks;  /* Per group desc for online growth */
     460                 :            :         /*
     461                 :            :          * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
     462                 :            :          */
     463                 :            : /*D0*/  __u8    s_journal_uuid[16];     /* uuid of journal superblock */
     464                 :            : /*E0*/  __le32  s_journal_inum;         /* inode number of journal file */
     465                 :            :         __le32  s_journal_dev;          /* device number of journal file */
     466                 :            :         __le32  s_last_orphan;          /* start of list of inodes to delete */
     467                 :            :         __le32  s_hash_seed[4];         /* HTREE hash seed */
     468                 :            :         __u8    s_def_hash_version;     /* Default hash version to use */
     469                 :            :         __u8    s_reserved_char_pad;
     470                 :            :         __u16   s_reserved_word_pad;
     471                 :            :         __le32  s_default_mount_opts;
     472                 :            :         __le32  s_first_meta_bg;        /* First metablock block group */
     473                 :            :         __le32  s_mkfs_time;            /* When the filesystem was created */
     474                 :            :         __le32  s_jnl_blocks[17];       /* Backup of the journal inode */
     475                 :            :         /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
     476                 :            : /*150*/ __le32  s_blocks_count_hi;      /* Blocks count */
     477                 :            :         __le32  s_r_blocks_count_hi;    /* Reserved blocks count */
     478                 :            :         __le32  s_free_blocks_count_hi; /* Free blocks count */
     479                 :            :         __le16  s_min_extra_isize;      /* All inodes have at least # bytes */
     480                 :            :         __le16  s_want_extra_isize;     /* New inodes should reserve # bytes */
     481                 :            :         __le32  s_flags;                /* Miscellaneous flags */
     482                 :            :         __le16  s_raid_stride;          /* RAID stride */
     483                 :            :         __le16  s_mmp_interval;         /* # seconds to wait in MMP checking */
     484                 :            :         __le64  s_mmp_block;            /* Block for multi-mount protection */
     485                 :            :         __le32  s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
     486                 :            :         __u8    s_log_groups_per_flex;  /* FLEX_BG group size */
     487                 :            :         __u8    s_reserved_char_pad2;
     488                 :            :         __le16  s_reserved_pad;
     489                 :            :         __u32   s_reserved[162];        /* Padding to the end of the block */
     490                 :            : };
     491                 :            : 
     492                 :            : /* data type for block offset of block group */
     493                 :            : typedef int ext3_grpblk_t;
     494                 :            : 
     495                 :            : /* data type for filesystem-wide blocks number */
     496                 :            : typedef unsigned long ext3_fsblk_t;
     497                 :            : 
     498                 :            : #define E3FSBLK "%lu"
     499                 :            : 
     500                 :            : struct ext3_reserve_window {
     501                 :            :         ext3_fsblk_t    _rsv_start;     /* First byte reserved */
     502                 :            :         ext3_fsblk_t    _rsv_end;       /* Last byte reserved or 0 */
     503                 :            : };
     504                 :            : 
     505                 :            : struct ext3_reserve_window_node {
     506                 :            :         struct rb_node          rsv_node;
     507                 :            :         __u32                   rsv_goal_size;
     508                 :            :         __u32                   rsv_alloc_hit;
     509                 :            :         struct ext3_reserve_window      rsv_window;
     510                 :            : };
     511                 :            : 
     512                 :            : struct ext3_block_alloc_info {
     513                 :            :         /* information about reservation window */
     514                 :            :         struct ext3_reserve_window_node rsv_window_node;
     515                 :            :         /*
     516                 :            :          * was i_next_alloc_block in ext3_inode_info
     517                 :            :          * is the logical (file-relative) number of the
     518                 :            :          * most-recently-allocated block in this file.
     519                 :            :          * We use this for detecting linearly ascending allocation requests.
     520                 :            :          */
     521                 :            :         __u32                   last_alloc_logical_block;
     522                 :            :         /*
     523                 :            :          * Was i_next_alloc_goal in ext3_inode_info
     524                 :            :          * is the *physical* companion to i_next_alloc_block.
     525                 :            :          * it the physical block number of the block which was most-recentl
     526                 :            :          * allocated to this file.  This give us the goal (target) for the next
     527                 :            :          * allocation when we detect linearly ascending requests.
     528                 :            :          */
     529                 :            :         ext3_fsblk_t            last_alloc_physical_block;
     530                 :            : };
     531                 :            : 
     532                 :            : #define rsv_start rsv_window._rsv_start
     533                 :            : #define rsv_end rsv_window._rsv_end
     534                 :            : 
     535                 :            : /*
     536                 :            :  * third extended file system inode data in memory
     537                 :            :  */
     538                 :            : struct ext3_inode_info {
     539                 :            :         __le32  i_data[15];     /* unconverted */
     540                 :            :         __u32   i_flags;
     541                 :            : #ifdef EXT3_FRAGMENTS
     542                 :            :         __u32   i_faddr;
     543                 :            :         __u8    i_frag_no;
     544                 :            :         __u8    i_frag_size;
     545                 :            : #endif
     546                 :            :         ext3_fsblk_t    i_file_acl;
     547                 :            :         __u32   i_dir_acl;
     548                 :            :         __u32   i_dtime;
     549                 :            : 
     550                 :            :         /*
     551                 :            :          * i_block_group is the number of the block group which contains
     552                 :            :          * this file's inode.  Constant across the lifetime of the inode,
     553                 :            :          * it is ued for making block allocation decisions - we try to
     554                 :            :          * place a file's data blocks near its inode block, and new inodes
     555                 :            :          * near to their parent directory's inode.
     556                 :            :          */
     557                 :            :         __u32   i_block_group;
     558                 :            :         unsigned long   i_state_flags;  /* Dynamic state flags for ext3 */
     559                 :            : 
     560                 :            :         /* block reservation info */
     561                 :            :         struct ext3_block_alloc_info *i_block_alloc_info;
     562                 :            : 
     563                 :            :         __u32   i_dir_start_lookup;
     564                 :            : #ifdef CONFIG_EXT3_FS_XATTR
     565                 :            :         /*
     566                 :            :          * Extended attributes can be read independently of the main file
     567                 :            :          * data. Taking i_mutex even when reading would cause contention
     568                 :            :          * between readers of EAs and writers of regular file data, so
     569                 :            :          * instead we synchronize on xattr_sem when reading or changing
     570                 :            :          * EAs.
     571                 :            :          */
     572                 :            :         struct rw_semaphore xattr_sem;
     573                 :            : #endif
     574                 :            : 
     575                 :            :         struct list_head i_orphan;      /* unlinked but open inodes */
     576                 :            : 
     577                 :            :         /*
     578                 :            :          * i_disksize keeps track of what the inode size is ON DISK, not
     579                 :            :          * in memory.  During truncate, i_size is set to the new size by
     580                 :            :          * the VFS prior to calling ext3_truncate(), but the filesystem won't
     581                 :            :          * set i_disksize to 0 until the truncate is actually under way.
     582                 :            :          *
     583                 :            :          * The intent is that i_disksize always represents the blocks which
     584                 :            :          * are used by this file.  This allows recovery to restart truncate
     585                 :            :          * on orphans if we crash during truncate.  We actually write i_disksize
     586                 :            :          * into the on-disk inode when writing inodes out, instead of i_size.
     587                 :            :          *
     588                 :            :          * The only time when i_disksize and i_size may be different is when
     589                 :            :          * a truncate is in progress.  The only things which change i_disksize
     590                 :            :          * are ext3_get_block (growth) and ext3_truncate (shrinkth).
     591                 :            :          */
     592                 :            :         loff_t  i_disksize;
     593                 :            : 
     594                 :            :         /* on-disk additional length */
     595                 :            :         __u16 i_extra_isize;
     596                 :            : 
     597                 :            :         /*
     598                 :            :          * truncate_mutex is for serialising ext3_truncate() against
     599                 :            :          * ext3_getblock().  In the 2.4 ext2 design, great chunks of inode's
     600                 :            :          * data tree are chopped off during truncate. We can't do that in
     601                 :            :          * ext3 because whenever we perform intermediate commits during
     602                 :            :          * truncate, the inode and all the metadata blocks *must* be in a
     603                 :            :          * consistent state which allows truncation of the orphans to restart
     604                 :            :          * during recovery.  Hence we must fix the get_block-vs-truncate race
     605                 :            :          * by other means, so we have truncate_mutex.
     606                 :            :          */
     607                 :            :         struct mutex truncate_mutex;
     608                 :            : 
     609                 :            :         /*
     610                 :            :          * Transactions that contain inode's metadata needed to complete
     611                 :            :          * fsync and fdatasync, respectively.
     612                 :            :          */
     613                 :            :         atomic_t i_sync_tid;
     614                 :            :         atomic_t i_datasync_tid;
     615                 :            : 
     616                 :            :         struct inode vfs_inode;
     617                 :            : };
     618                 :            : 
     619                 :            : /*
     620                 :            :  * third extended-fs super-block data in memory
     621                 :            :  */
     622                 :            : struct ext3_sb_info {
     623                 :            :         unsigned long s_frag_size;      /* Size of a fragment in bytes */
     624                 :            :         unsigned long s_frags_per_block;/* Number of fragments per block */
     625                 :            :         unsigned long s_inodes_per_block;/* Number of inodes per block */
     626                 :            :         unsigned long s_frags_per_group;/* Number of fragments in a group */
     627                 :            :         unsigned long s_blocks_per_group;/* Number of blocks in a group */
     628                 :            :         unsigned long s_inodes_per_group;/* Number of inodes in a group */
     629                 :            :         unsigned long s_itb_per_group;  /* Number of inode table blocks per group */
     630                 :            :         unsigned long s_gdb_count;      /* Number of group descriptor blocks */
     631                 :            :         unsigned long s_desc_per_block; /* Number of group descriptors per block */
     632                 :            :         unsigned long s_groups_count;   /* Number of groups in the fs */
     633                 :            :         unsigned long s_overhead_last;  /* Last calculated overhead */
     634                 :            :         unsigned long s_blocks_last;    /* Last seen block count */
     635                 :            :         struct buffer_head * s_sbh;     /* Buffer containing the super block */
     636                 :            :         struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */
     637                 :            :         struct buffer_head ** s_group_desc;
     638                 :            :         unsigned long  s_mount_opt;
     639                 :            :         ext3_fsblk_t s_sb_block;
     640                 :            :         kuid_t s_resuid;
     641                 :            :         kgid_t s_resgid;
     642                 :            :         unsigned short s_mount_state;
     643                 :            :         unsigned short s_pad;
     644                 :            :         int s_addr_per_block_bits;
     645                 :            :         int s_desc_per_block_bits;
     646                 :            :         int s_inode_size;
     647                 :            :         int s_first_ino;
     648                 :            :         spinlock_t s_next_gen_lock;
     649                 :            :         u32 s_next_generation;
     650                 :            :         u32 s_hash_seed[4];
     651                 :            :         int s_def_hash_version;
     652                 :            :         int s_hash_unsigned;    /* 3 if hash should be signed, 0 if not */
     653                 :            :         struct percpu_counter s_freeblocks_counter;
     654                 :            :         struct percpu_counter s_freeinodes_counter;
     655                 :            :         struct percpu_counter s_dirs_counter;
     656                 :            :         struct blockgroup_lock *s_blockgroup_lock;
     657                 :            : 
     658                 :            :         /* root of the per fs reservation window tree */
     659                 :            :         spinlock_t s_rsv_window_lock;
     660                 :            :         struct rb_root s_rsv_window_root;
     661                 :            :         struct ext3_reserve_window_node s_rsv_window_head;
     662                 :            : 
     663                 :            :         /* Journaling */
     664                 :            :         struct inode * s_journal_inode;
     665                 :            :         struct journal_s * s_journal;
     666                 :            :         struct list_head s_orphan;
     667                 :            :         struct mutex s_orphan_lock;
     668                 :            :         struct mutex s_resize_lock;
     669                 :            :         unsigned long s_commit_interval;
     670                 :            :         struct block_device *journal_bdev;
     671                 :            : #ifdef CONFIG_QUOTA
     672                 :            :         char *s_qf_names[MAXQUOTAS];            /* Names of quota files with journalled quota */
     673                 :            :         int s_jquota_fmt;                       /* Format of quota to use */
     674                 :            : #endif
     675                 :            : };
     676                 :            : 
     677                 :            : static inline spinlock_t *
     678                 :            : sb_bgl_lock(struct ext3_sb_info *sbi, unsigned int block_group)
     679                 :            : {
     680                 :            :         return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group);
     681                 :            : }
     682                 :            : 
     683                 :            : static inline struct ext3_sb_info * EXT3_SB(struct super_block *sb)
     684                 :            : {
     685                 :            :         return sb->s_fs_info;
     686                 :            : }
     687                 :            : static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
     688                 :            : {
     689                 :            :         return container_of(inode, struct ext3_inode_info, vfs_inode);
     690                 :            : }
     691                 :            : 
     692                 :          0 : static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino)
     693                 :            : {
     694                 :          0 :         return ino == EXT3_ROOT_INO ||
     695 [ #  # ][ #  # ]:          0 :                 ino == EXT3_JOURNAL_INO ||
     696 [ #  # ][ #  # ]:          0 :                 ino == EXT3_RESIZE_INO ||
         [ #  # ][ #  # ]
     697 [ #  # ][ #  # ]:          0 :                 (ino >= EXT3_FIRST_INO(sb) &&
     698                 :          0 :                  ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count));
     699                 :            : }
     700                 :            : 
     701                 :            : /*
     702                 :            :  * Inode dynamic state flags
     703                 :            :  */
     704                 :            : enum {
     705                 :            :         EXT3_STATE_JDATA,               /* journaled data exists */
     706                 :            :         EXT3_STATE_NEW,                 /* inode is newly created */
     707                 :            :         EXT3_STATE_XATTR,               /* has in-inode xattrs */
     708                 :            :         EXT3_STATE_FLUSH_ON_CLOSE,      /* flush dirty pages on close */
     709                 :            : };
     710                 :            : 
     711                 :            : static inline int ext3_test_inode_state(struct inode *inode, int bit)
     712                 :            : {
     713                 :            :         return test_bit(bit, &EXT3_I(inode)->i_state_flags);
     714                 :            : }
     715                 :            : 
     716                 :            : static inline void ext3_set_inode_state(struct inode *inode, int bit)
     717                 :            : {
     718                 :          0 :         set_bit(bit, &EXT3_I(inode)->i_state_flags);
     719                 :            : }
     720                 :            : 
     721                 :            : static inline void ext3_clear_inode_state(struct inode *inode, int bit)
     722                 :            : {
     723                 :          0 :         clear_bit(bit, &EXT3_I(inode)->i_state_flags);
     724                 :            : }
     725                 :            : 
     726                 :            : #define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime
     727                 :            : 
     728                 :            : /*
     729                 :            :  * Codes for operating systems
     730                 :            :  */
     731                 :            : #define EXT3_OS_LINUX           0
     732                 :            : #define EXT3_OS_HURD            1
     733                 :            : #define EXT3_OS_MASIX           2
     734                 :            : #define EXT3_OS_FREEBSD         3
     735                 :            : #define EXT3_OS_LITES           4
     736                 :            : 
     737                 :            : /*
     738                 :            :  * Revision levels
     739                 :            :  */
     740                 :            : #define EXT3_GOOD_OLD_REV       0       /* The good old (original) format */
     741                 :            : #define EXT3_DYNAMIC_REV        1       /* V2 format w/ dynamic inode sizes */
     742                 :            : 
     743                 :            : #define EXT3_CURRENT_REV        EXT3_GOOD_OLD_REV
     744                 :            : #define EXT3_MAX_SUPP_REV       EXT3_DYNAMIC_REV
     745                 :            : 
     746                 :            : #define EXT3_GOOD_OLD_INODE_SIZE 128
     747                 :            : 
     748                 :            : /*
     749                 :            :  * Feature set definitions
     750                 :            :  */
     751                 :            : 
     752                 :            : #define EXT3_HAS_COMPAT_FEATURE(sb,mask)                        \
     753                 :            :         ( EXT3_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
     754                 :            : #define EXT3_HAS_RO_COMPAT_FEATURE(sb,mask)                     \
     755                 :            :         ( EXT3_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
     756                 :            : #define EXT3_HAS_INCOMPAT_FEATURE(sb,mask)                      \
     757                 :            :         ( EXT3_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
     758                 :            : #define EXT3_SET_COMPAT_FEATURE(sb,mask)                        \
     759                 :            :         EXT3_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
     760                 :            : #define EXT3_SET_RO_COMPAT_FEATURE(sb,mask)                     \
     761                 :            :         EXT3_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
     762                 :            : #define EXT3_SET_INCOMPAT_FEATURE(sb,mask)                      \
     763                 :            :         EXT3_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
     764                 :            : #define EXT3_CLEAR_COMPAT_FEATURE(sb,mask)                      \
     765                 :            :         EXT3_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
     766                 :            : #define EXT3_CLEAR_RO_COMPAT_FEATURE(sb,mask)                   \
     767                 :            :         EXT3_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
     768                 :            : #define EXT3_CLEAR_INCOMPAT_FEATURE(sb,mask)                    \
     769                 :            :         EXT3_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
     770                 :            : 
     771                 :            : #define EXT3_FEATURE_COMPAT_DIR_PREALLOC        0x0001
     772                 :            : #define EXT3_FEATURE_COMPAT_IMAGIC_INODES       0x0002
     773                 :            : #define EXT3_FEATURE_COMPAT_HAS_JOURNAL         0x0004
     774                 :            : #define EXT3_FEATURE_COMPAT_EXT_ATTR            0x0008
     775                 :            : #define EXT3_FEATURE_COMPAT_RESIZE_INODE        0x0010
     776                 :            : #define EXT3_FEATURE_COMPAT_DIR_INDEX           0x0020
     777                 :            : 
     778                 :            : #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER     0x0001
     779                 :            : #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE       0x0002
     780                 :            : #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR        0x0004
     781                 :            : 
     782                 :            : #define EXT3_FEATURE_INCOMPAT_COMPRESSION       0x0001
     783                 :            : #define EXT3_FEATURE_INCOMPAT_FILETYPE          0x0002
     784                 :            : #define EXT3_FEATURE_INCOMPAT_RECOVER           0x0004 /* Needs recovery */
     785                 :            : #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV       0x0008 /* Journal device */
     786                 :            : #define EXT3_FEATURE_INCOMPAT_META_BG           0x0010
     787                 :            : 
     788                 :            : #define EXT3_FEATURE_COMPAT_SUPP        EXT2_FEATURE_COMPAT_EXT_ATTR
     789                 :            : #define EXT3_FEATURE_INCOMPAT_SUPP      (EXT3_FEATURE_INCOMPAT_FILETYPE| \
     790                 :            :                                          EXT3_FEATURE_INCOMPAT_RECOVER| \
     791                 :            :                                          EXT3_FEATURE_INCOMPAT_META_BG)
     792                 :            : #define EXT3_FEATURE_RO_COMPAT_SUPP     (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
     793                 :            :                                          EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
     794                 :            :                                          EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
     795                 :            : 
     796                 :            : /*
     797                 :            :  * Default values for user and/or group using reserved blocks
     798                 :            :  */
     799                 :            : #define EXT3_DEF_RESUID         0
     800                 :            : #define EXT3_DEF_RESGID         0
     801                 :            : 
     802                 :            : /*
     803                 :            :  * Default mount options
     804                 :            :  */
     805                 :            : #define EXT3_DEFM_DEBUG         0x0001
     806                 :            : #define EXT3_DEFM_BSDGROUPS     0x0002
     807                 :            : #define EXT3_DEFM_XATTR_USER    0x0004
     808                 :            : #define EXT3_DEFM_ACL           0x0008
     809                 :            : #define EXT3_DEFM_UID16         0x0010
     810                 :            : #define EXT3_DEFM_JMODE         0x0060
     811                 :            : #define EXT3_DEFM_JMODE_DATA    0x0020
     812                 :            : #define EXT3_DEFM_JMODE_ORDERED 0x0040
     813                 :            : #define EXT3_DEFM_JMODE_WBACK   0x0060
     814                 :            : 
     815                 :            : /*
     816                 :            :  * Structure of a directory entry
     817                 :            :  */
     818                 :            : #define EXT3_NAME_LEN 255
     819                 :            : 
     820                 :            : struct ext3_dir_entry {
     821                 :            :         __le32  inode;                  /* Inode number */
     822                 :            :         __le16  rec_len;                /* Directory entry length */
     823                 :            :         __le16  name_len;               /* Name length */
     824                 :            :         char    name[EXT3_NAME_LEN];    /* File name */
     825                 :            : };
     826                 :            : 
     827                 :            : /*
     828                 :            :  * The new version of the directory entry.  Since EXT3 structures are
     829                 :            :  * stored in intel byte order, and the name_len field could never be
     830                 :            :  * bigger than 255 chars, it's safe to reclaim the extra byte for the
     831                 :            :  * file_type field.
     832                 :            :  */
     833                 :            : struct ext3_dir_entry_2 {
     834                 :            :         __le32  inode;                  /* Inode number */
     835                 :            :         __le16  rec_len;                /* Directory entry length */
     836                 :            :         __u8    name_len;               /* Name length */
     837                 :            :         __u8    file_type;
     838                 :            :         char    name[EXT3_NAME_LEN];    /* File name */
     839                 :            : };
     840                 :            : 
     841                 :            : /*
     842                 :            :  * Ext3 directory file types.  Only the low 3 bits are used.  The
     843                 :            :  * other bits are reserved for now.
     844                 :            :  */
     845                 :            : #define EXT3_FT_UNKNOWN         0
     846                 :            : #define EXT3_FT_REG_FILE        1
     847                 :            : #define EXT3_FT_DIR             2
     848                 :            : #define EXT3_FT_CHRDEV          3
     849                 :            : #define EXT3_FT_BLKDEV          4
     850                 :            : #define EXT3_FT_FIFO            5
     851                 :            : #define EXT3_FT_SOCK            6
     852                 :            : #define EXT3_FT_SYMLINK         7
     853                 :            : 
     854                 :            : #define EXT3_FT_MAX             8
     855                 :            : 
     856                 :            : /*
     857                 :            :  * EXT3_DIR_PAD defines the directory entries boundaries
     858                 :            :  *
     859                 :            :  * NOTE: It must be a multiple of 4
     860                 :            :  */
     861                 :            : #define EXT3_DIR_PAD                    4
     862                 :            : #define EXT3_DIR_ROUND                  (EXT3_DIR_PAD - 1)
     863                 :            : #define EXT3_DIR_REC_LEN(name_len)      (((name_len) + 8 + EXT3_DIR_ROUND) & \
     864                 :            :                                          ~EXT3_DIR_ROUND)
     865                 :            : #define EXT3_MAX_REC_LEN                ((1<<16)-1)
     866                 :            : 
     867                 :            : /*
     868                 :            :  * Tests against MAX_REC_LEN etc were put in place for 64k block
     869                 :            :  * sizes; if that is not possible on this arch, we can skip
     870                 :            :  * those tests and speed things up.
     871                 :            :  */
     872                 :            : static inline unsigned ext3_rec_len_from_disk(__le16 dlen)
     873                 :            : {
     874                 :          0 :         unsigned len = le16_to_cpu(dlen);
     875                 :            : 
     876                 :            : #if (PAGE_CACHE_SIZE >= 65536)
     877                 :            :         if (len == EXT3_MAX_REC_LEN)
     878                 :            :                 return 1 << 16;
     879                 :            : #endif
     880                 :            :         return len;
     881                 :            : }
     882                 :            : 
     883                 :            : static inline __le16 ext3_rec_len_to_disk(unsigned len)
     884                 :            : {
     885                 :            : #if (PAGE_CACHE_SIZE >= 65536)
     886                 :            :         if (len == (1 << 16))
     887                 :            :                 return cpu_to_le16(EXT3_MAX_REC_LEN);
     888                 :            :         else if (len > (1 << 16))
     889                 :            :                 BUG();
     890                 :            : #endif
     891                 :          0 :         return cpu_to_le16(len);
     892                 :            : }
     893                 :            : 
     894                 :            : /*
     895                 :            :  * Hash Tree Directory indexing
     896                 :            :  * (c) Daniel Phillips, 2001
     897                 :            :  */
     898                 :            : 
     899                 :            : #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \
     900                 :            :                                       EXT3_FEATURE_COMPAT_DIR_INDEX) && \
     901                 :            :                       (EXT3_I(dir)->i_flags & EXT3_INDEX_FL))
     902                 :            : #define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX)
     903                 :            : #define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
     904                 :            : 
     905                 :            : /* Legal values for the dx_root hash_version field: */
     906                 :            : 
     907                 :            : #define DX_HASH_LEGACY          0
     908                 :            : #define DX_HASH_HALF_MD4        1
     909                 :            : #define DX_HASH_TEA             2
     910                 :            : #define DX_HASH_LEGACY_UNSIGNED 3
     911                 :            : #define DX_HASH_HALF_MD4_UNSIGNED       4
     912                 :            : #define DX_HASH_TEA_UNSIGNED            5
     913                 :            : 
     914                 :            : /* hash info structure used by the directory hash */
     915                 :            : struct dx_hash_info
     916                 :            : {
     917                 :            :         u32             hash;
     918                 :            :         u32             minor_hash;
     919                 :            :         int             hash_version;
     920                 :            :         u32             *seed;
     921                 :            : };
     922                 :            : 
     923                 :            : 
     924                 :            : /* 32 and 64 bit signed EOF for dx directories */
     925                 :            : #define EXT3_HTREE_EOF_32BIT   ((1UL  << (32 - 1)) - 1)
     926                 :            : #define EXT3_HTREE_EOF_64BIT   ((1ULL << (64 - 1)) - 1)
     927                 :            : 
     928                 :            : 
     929                 :            : /*
     930                 :            :  * Control parameters used by ext3_htree_next_block
     931                 :            :  */
     932                 :            : #define HASH_NB_ALWAYS          1
     933                 :            : 
     934                 :            : 
     935                 :            : /*
     936                 :            :  * Describe an inode's exact location on disk and in memory
     937                 :            :  */
     938                 :            : struct ext3_iloc
     939                 :            : {
     940                 :            :         struct buffer_head *bh;
     941                 :            :         unsigned long offset;
     942                 :            :         unsigned long block_group;
     943                 :            : };
     944                 :            : 
     945                 :            : static inline struct ext3_inode *ext3_raw_inode(struct ext3_iloc *iloc)
     946                 :            : {
     947                 :          0 :         return (struct ext3_inode *) (iloc->bh->b_data + iloc->offset);
     948                 :            : }
     949                 :            : 
     950                 :            : /*
     951                 :            :  * This structure is stuffed into the struct file's private_data field
     952                 :            :  * for directories.  It is where we put information so that we can do
     953                 :            :  * readdir operations in hash tree order.
     954                 :            :  */
     955                 :            : struct dir_private_info {
     956                 :            :         struct rb_root  root;
     957                 :            :         struct rb_node  *curr_node;
     958                 :            :         struct fname    *extra_fname;
     959                 :            :         loff_t          last_pos;
     960                 :            :         __u32           curr_hash;
     961                 :            :         __u32           curr_minor_hash;
     962                 :            :         __u32           next_hash;
     963                 :            : };
     964                 :            : 
     965                 :            : /* calculate the first block number of the group */
     966                 :            : static inline ext3_fsblk_t
     967                 :          0 : ext3_group_first_block_no(struct super_block *sb, unsigned long group_no)
     968                 :            : {
     969                 :          0 :         return group_no * (ext3_fsblk_t)EXT3_BLOCKS_PER_GROUP(sb) +
     970                 :          0 :                 le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block);
     971                 :            : }
     972                 :            : 
     973                 :            : /*
     974                 :            :  * Special error return code only used by dx_probe() and its callers.
     975                 :            :  */
     976                 :            : #define ERR_BAD_DX_DIR  -75000
     977                 :            : 
     978                 :            : /*
     979                 :            :  * Function prototypes
     980                 :            :  */
     981                 :            : 
     982                 :            : /*
     983                 :            :  * Ok, these declarations are also in <linux/kernel.h> but none of the
     984                 :            :  * ext3 source programs needs to include it so they are duplicated here.
     985                 :            :  */
     986                 :            : # define NORET_TYPE    /**/
     987                 :            : # define ATTRIB_NORET  __attribute__((noreturn))
     988                 :            : # define NORET_AND     noreturn,
     989                 :            : 
     990                 :            : /* balloc.c */
     991                 :            : extern int ext3_bg_has_super(struct super_block *sb, int group);
     992                 :            : extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group);
     993                 :            : extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode,
     994                 :            :                         ext3_fsblk_t goal, int *errp);
     995                 :            : extern ext3_fsblk_t ext3_new_blocks (handle_t *handle, struct inode *inode,
     996                 :            :                         ext3_fsblk_t goal, unsigned long *count, int *errp);
     997                 :            : extern void ext3_free_blocks (handle_t *handle, struct inode *inode,
     998                 :            :                         ext3_fsblk_t block, unsigned long count);
     999                 :            : extern void ext3_free_blocks_sb (handle_t *handle, struct super_block *sb,
    1000                 :            :                                  ext3_fsblk_t block, unsigned long count,
    1001                 :            :                                 unsigned long *pdquot_freed_blocks);
    1002                 :            : extern ext3_fsblk_t ext3_count_free_blocks (struct super_block *);
    1003                 :            : extern void ext3_check_blocks_bitmap (struct super_block *);
    1004                 :            : extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
    1005                 :            :                                                     unsigned int block_group,
    1006                 :            :                                                     struct buffer_head ** bh);
    1007                 :            : extern int ext3_should_retry_alloc(struct super_block *sb, int *retries);
    1008                 :            : extern void ext3_init_block_alloc_info(struct inode *);
    1009                 :            : extern void ext3_rsv_window_add(struct super_block *sb, struct ext3_reserve_window_node *rsv);
    1010                 :            : extern int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range);
    1011                 :            : 
    1012                 :            : /* dir.c */
    1013                 :            : extern int ext3_check_dir_entry(const char *, struct inode *,
    1014                 :            :                                 struct ext3_dir_entry_2 *,
    1015                 :            :                                 struct buffer_head *, unsigned long);
    1016                 :            : extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
    1017                 :            :                                     __u32 minor_hash,
    1018                 :            :                                     struct ext3_dir_entry_2 *dirent);
    1019                 :            : extern void ext3_htree_free_dir_info(struct dir_private_info *p);
    1020                 :            : 
    1021                 :            : /* fsync.c */
    1022                 :            : extern int ext3_sync_file(struct file *, loff_t, loff_t, int);
    1023                 :            : 
    1024                 :            : /* hash.c */
    1025                 :            : extern int ext3fs_dirhash(const char *name, int len, struct
    1026                 :            :                           dx_hash_info *hinfo);
    1027                 :            : 
    1028                 :            : /* ialloc.c */
    1029                 :            : extern struct inode * ext3_new_inode (handle_t *, struct inode *,
    1030                 :            :                                       const struct qstr *, umode_t);
    1031                 :            : extern void ext3_free_inode (handle_t *, struct inode *);
    1032                 :            : extern struct inode * ext3_orphan_get (struct super_block *, unsigned long);
    1033                 :            : extern unsigned long ext3_count_free_inodes (struct super_block *);
    1034                 :            : extern unsigned long ext3_count_dirs (struct super_block *);
    1035                 :            : extern void ext3_check_inodes_bitmap (struct super_block *);
    1036                 :            : extern unsigned long ext3_count_free (struct buffer_head *, unsigned);
    1037                 :            : 
    1038                 :            : 
    1039                 :            : /* inode.c */
    1040                 :            : int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
    1041                 :            :                 struct buffer_head *bh, ext3_fsblk_t blocknr);
    1042                 :            : struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
    1043                 :            : struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
    1044                 :            : int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
    1045                 :            :         sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result,
    1046                 :            :         int create);
    1047                 :            : 
    1048                 :            : extern struct inode *ext3_iget(struct super_block *, unsigned long);
    1049                 :            : extern int  ext3_write_inode (struct inode *, struct writeback_control *);
    1050                 :            : extern int  ext3_setattr (struct dentry *, struct iattr *);
    1051                 :            : extern void ext3_evict_inode (struct inode *);
    1052                 :            : extern int  ext3_sync_inode (handle_t *, struct inode *);
    1053                 :            : extern void ext3_discard_reservation (struct inode *);
    1054                 :            : extern void ext3_dirty_inode(struct inode *, int);
    1055                 :            : extern int ext3_change_inode_journal_flag(struct inode *, int);
    1056                 :            : extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);
    1057                 :            : extern int ext3_can_truncate(struct inode *inode);
    1058                 :            : extern void ext3_truncate(struct inode *inode);
    1059                 :            : extern void ext3_set_inode_flags(struct inode *);
    1060                 :            : extern void ext3_get_inode_flags(struct ext3_inode_info *);
    1061                 :            : extern void ext3_set_aops(struct inode *inode);
    1062                 :            : extern int ext3_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
    1063                 :            :                        u64 start, u64 len);
    1064                 :            : 
    1065                 :            : /* ioctl.c */
    1066                 :            : extern long ext3_ioctl(struct file *, unsigned int, unsigned long);
    1067                 :            : extern long ext3_compat_ioctl(struct file *, unsigned int, unsigned long);
    1068                 :            : 
    1069                 :            : /* namei.c */
    1070                 :            : extern int ext3_orphan_add(handle_t *, struct inode *);
    1071                 :            : extern int ext3_orphan_del(handle_t *, struct inode *);
    1072                 :            : extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
    1073                 :            :                                 __u32 start_minor_hash, __u32 *next_hash);
    1074                 :            : 
    1075                 :            : /* resize.c */
    1076                 :            : extern int ext3_group_add(struct super_block *sb,
    1077                 :            :                                 struct ext3_new_group_data *input);
    1078                 :            : extern int ext3_group_extend(struct super_block *sb,
    1079                 :            :                                 struct ext3_super_block *es,
    1080                 :            :                                 ext3_fsblk_t n_blocks_count);
    1081                 :            : 
    1082                 :            : /* super.c */
    1083                 :            : extern __printf(3, 4)
    1084                 :            : void ext3_error(struct super_block *, const char *, const char *, ...);
    1085                 :            : extern void __ext3_std_error (struct super_block *, const char *, int);
    1086                 :            : extern __printf(3, 4)
    1087                 :            : void ext3_abort(struct super_block *, const char *, const char *, ...);
    1088                 :            : extern __printf(3, 4)
    1089                 :            : void ext3_warning(struct super_block *, const char *, const char *, ...);
    1090                 :            : extern __printf(3, 4)
    1091                 :            : void ext3_msg(struct super_block *, const char *, const char *, ...);
    1092                 :            : extern void ext3_update_dynamic_rev (struct super_block *sb);
    1093                 :            : 
    1094                 :            : #define ext3_std_error(sb, errno)                               \
    1095                 :            : do {                                                            \
    1096                 :            :         if ((errno))                                            \
    1097                 :            :                 __ext3_std_error((sb), __func__, (errno));      \
    1098                 :            : } while (0)
    1099                 :            : 
    1100                 :            : /*
    1101                 :            :  * Inodes and files operations
    1102                 :            :  */
    1103                 :            : 
    1104                 :            : /* dir.c */
    1105                 :            : extern const struct file_operations ext3_dir_operations;
    1106                 :            : 
    1107                 :            : /* file.c */
    1108                 :            : extern const struct inode_operations ext3_file_inode_operations;
    1109                 :            : extern const struct file_operations ext3_file_operations;
    1110                 :            : 
    1111                 :            : /* namei.c */
    1112                 :            : extern const struct inode_operations ext3_dir_inode_operations;
    1113                 :            : extern const struct inode_operations ext3_special_inode_operations;
    1114                 :            : 
    1115                 :            : /* symlink.c */
    1116                 :            : extern const struct inode_operations ext3_symlink_inode_operations;
    1117                 :            : extern const struct inode_operations ext3_fast_symlink_inode_operations;
    1118                 :            : 
    1119                 :            : #define EXT3_JOURNAL(inode)     (EXT3_SB((inode)->i_sb)->s_journal)
    1120                 :            : 
    1121                 :            : /* Define the number of blocks we need to account to a transaction to
    1122                 :            :  * modify one block of data.
    1123                 :            :  *
    1124                 :            :  * We may have to touch one inode, one bitmap buffer, up to three
    1125                 :            :  * indirection blocks, the group and superblock summaries, and the data
    1126                 :            :  * block to complete the transaction.  */
    1127                 :            : 
    1128                 :            : #define EXT3_SINGLEDATA_TRANS_BLOCKS    8U
    1129                 :            : 
    1130                 :            : /* Extended attribute operations touch at most two data buffers,
    1131                 :            :  * two bitmap buffers, and two group summaries, in addition to the inode
    1132                 :            :  * and the superblock, which are already accounted for. */
    1133                 :            : 
    1134                 :            : #define EXT3_XATTR_TRANS_BLOCKS         6U
    1135                 :            : 
    1136                 :            : /* Define the minimum size for a transaction which modifies data.  This
    1137                 :            :  * needs to take into account the fact that we may end up modifying two
    1138                 :            :  * quota files too (one for the group, one for the user quota).  The
    1139                 :            :  * superblock only gets updated once, of course, so don't bother
    1140                 :            :  * counting that again for the quota updates. */
    1141                 :            : 
    1142                 :            : #define EXT3_DATA_TRANS_BLOCKS(sb)      (EXT3_SINGLEDATA_TRANS_BLOCKS + \
    1143                 :            :                                          EXT3_XATTR_TRANS_BLOCKS - 2 + \
    1144                 :            :                                          EXT3_MAXQUOTAS_TRANS_BLOCKS(sb))
    1145                 :            : 
    1146                 :            : /* Delete operations potentially hit one directory's namespace plus an
    1147                 :            :  * entire inode, plus arbitrary amounts of bitmap/indirection data.  Be
    1148                 :            :  * generous.  We can grow the delete transaction later if necessary. */
    1149                 :            : 
    1150                 :            : #define EXT3_DELETE_TRANS_BLOCKS(sb)   (EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) + 64)
    1151                 :            : 
    1152                 :            : /* Define an arbitrary limit for the amount of data we will anticipate
    1153                 :            :  * writing to any given transaction.  For unbounded transactions such as
    1154                 :            :  * write(2) and truncate(2) we can write more than this, but we always
    1155                 :            :  * start off at the maximum transaction size and grow the transaction
    1156                 :            :  * optimistically as we go. */
    1157                 :            : 
    1158                 :            : #define EXT3_MAX_TRANS_DATA             64U
    1159                 :            : 
    1160                 :            : /* We break up a large truncate or write transaction once the handle's
    1161                 :            :  * buffer credits gets this low, we need either to extend the
    1162                 :            :  * transaction or to start a new one.  Reserve enough space here for
    1163                 :            :  * inode, bitmap, superblock, group and indirection updates for at least
    1164                 :            :  * one block, plus two quota updates.  Quota allocations are not
    1165                 :            :  * needed. */
    1166                 :            : 
    1167                 :            : #define EXT3_RESERVE_TRANS_BLOCKS       12U
    1168                 :            : 
    1169                 :            : #define EXT3_INDEX_EXTRA_TRANS_BLOCKS   8
    1170                 :            : 
    1171                 :            : #ifdef CONFIG_QUOTA
    1172                 :            : /* Amount of blocks needed for quota update - we know that the structure was
    1173                 :            :  * allocated so we need to update only inode+data */
    1174                 :            : #define EXT3_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0)
    1175                 :            : /* Amount of blocks needed for quota insert/delete - we do some block writes
    1176                 :            :  * but inode, sb and group updates are done only once */
    1177                 :            : #define EXT3_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
    1178                 :            :                 (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_INIT_REWRITE) : 0)
    1179                 :            : #define EXT3_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\
    1180                 :            :                 (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_DEL_REWRITE) : 0)
    1181                 :            : #else
    1182                 :            : #define EXT3_QUOTA_TRANS_BLOCKS(sb) 0
    1183                 :            : #define EXT3_QUOTA_INIT_BLOCKS(sb) 0
    1184                 :            : #define EXT3_QUOTA_DEL_BLOCKS(sb) 0
    1185                 :            : #endif
    1186                 :            : #define EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_TRANS_BLOCKS(sb))
    1187                 :            : #define EXT3_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_INIT_BLOCKS(sb))
    1188                 :            : #define EXT3_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_DEL_BLOCKS(sb))
    1189                 :            : 
    1190                 :            : int
    1191                 :            : ext3_mark_iloc_dirty(handle_t *handle,
    1192                 :            :                      struct inode *inode,
    1193                 :            :                      struct ext3_iloc *iloc);
    1194                 :            : 
    1195                 :            : /*
    1196                 :            :  * On success, We end up with an outstanding reference count against
    1197                 :            :  * iloc->bh.  This _must_ be cleaned up later.
    1198                 :            :  */
    1199                 :            : 
    1200                 :            : int ext3_reserve_inode_write(handle_t *handle, struct inode *inode,
    1201                 :            :                         struct ext3_iloc *iloc);
    1202                 :            : 
    1203                 :            : int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode);
    1204                 :            : 
    1205                 :            : /*
    1206                 :            :  * Wrapper functions with which ext3 calls into JBD.  The intent here is
    1207                 :            :  * to allow these to be turned into appropriate stubs so ext3 can control
    1208                 :            :  * ext2 filesystems, so ext2+ext3 systems only nee one fs.  This work hasn't
    1209                 :            :  * been done yet.
    1210                 :            :  */
    1211                 :            : 
    1212                 :            : static inline void ext3_journal_release_buffer(handle_t *handle,
    1213                 :            :                                                 struct buffer_head *bh)
    1214                 :            : {
    1215                 :          0 :         journal_release_buffer(handle, bh);
    1216                 :            : }
    1217                 :            : 
    1218                 :            : void ext3_journal_abort_handle(const char *caller, const char *err_fn,
    1219                 :            :                 struct buffer_head *bh, handle_t *handle, int err);
    1220                 :            : 
    1221                 :            : int __ext3_journal_get_undo_access(const char *where, handle_t *handle,
    1222                 :            :                                 struct buffer_head *bh);
    1223                 :            : 
    1224                 :            : int __ext3_journal_get_write_access(const char *where, handle_t *handle,
    1225                 :            :                                 struct buffer_head *bh);
    1226                 :            : 
    1227                 :            : int __ext3_journal_forget(const char *where, handle_t *handle,
    1228                 :            :                                 struct buffer_head *bh);
    1229                 :            : 
    1230                 :            : int __ext3_journal_revoke(const char *where, handle_t *handle,
    1231                 :            :                                 unsigned long blocknr, struct buffer_head *bh);
    1232                 :            : 
    1233                 :            : int __ext3_journal_get_create_access(const char *where,
    1234                 :            :                                 handle_t *handle, struct buffer_head *bh);
    1235                 :            : 
    1236                 :            : int __ext3_journal_dirty_metadata(const char *where,
    1237                 :            :                                 handle_t *handle, struct buffer_head *bh);
    1238                 :            : 
    1239                 :            : #define ext3_journal_get_undo_access(handle, bh) \
    1240                 :            :         __ext3_journal_get_undo_access(__func__, (handle), (bh))
    1241                 :            : #define ext3_journal_get_write_access(handle, bh) \
    1242                 :            :         __ext3_journal_get_write_access(__func__, (handle), (bh))
    1243                 :            : #define ext3_journal_revoke(handle, blocknr, bh) \
    1244                 :            :         __ext3_journal_revoke(__func__, (handle), (blocknr), (bh))
    1245                 :            : #define ext3_journal_get_create_access(handle, bh) \
    1246                 :            :         __ext3_journal_get_create_access(__func__, (handle), (bh))
    1247                 :            : #define ext3_journal_dirty_metadata(handle, bh) \
    1248                 :            :         __ext3_journal_dirty_metadata(__func__, (handle), (bh))
    1249                 :            : #define ext3_journal_forget(handle, bh) \
    1250                 :            :         __ext3_journal_forget(__func__, (handle), (bh))
    1251                 :            : 
    1252                 :            : int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh);
    1253                 :            : 
    1254                 :            : handle_t *ext3_journal_start_sb(struct super_block *sb, int nblocks);
    1255                 :            : int __ext3_journal_stop(const char *where, handle_t *handle);
    1256                 :            : 
    1257                 :            : static inline handle_t *ext3_journal_start(struct inode *inode, int nblocks)
    1258                 :            : {
    1259                 :          0 :         return ext3_journal_start_sb(inode->i_sb, nblocks);
    1260                 :            : }
    1261                 :            : 
    1262                 :            : #define ext3_journal_stop(handle) \
    1263                 :            :         __ext3_journal_stop(__func__, (handle))
    1264                 :            : 
    1265                 :            : static inline handle_t *ext3_journal_current_handle(void)
    1266                 :            : {
    1267                 :            :         return journal_current_handle();
    1268                 :            : }
    1269                 :            : 
    1270                 :            : static inline int ext3_journal_extend(handle_t *handle, int nblocks)
    1271                 :            : {
    1272                 :          0 :         return journal_extend(handle, nblocks);
    1273                 :            : }
    1274                 :            : 
    1275                 :            : static inline int ext3_journal_restart(handle_t *handle, int nblocks)
    1276                 :            : {
    1277                 :          0 :         return journal_restart(handle, nblocks);
    1278                 :            : }
    1279                 :            : 
    1280                 :            : static inline int ext3_journal_blocks_per_page(struct inode *inode)
    1281                 :            : {
    1282                 :          0 :         return journal_blocks_per_page(inode);
    1283                 :            : }
    1284                 :            : 
    1285                 :            : static inline int ext3_journal_force_commit(journal_t *journal)
    1286                 :            : {
    1287                 :          0 :         return journal_force_commit(journal);
    1288                 :            : }
    1289                 :            : 
    1290                 :            : /* super.c */
    1291                 :            : int ext3_force_commit(struct super_block *sb);
    1292                 :            : 
    1293                 :            : static inline int ext3_should_journal_data(struct inode *inode)
    1294                 :            : {
    1295         [ #  # ]:          0 :         if (!S_ISREG(inode->i_mode))
           [ #  #  #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1296                 :            :                 return 1;
    1297 [ #  # ][ #  # ]:          0 :         if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1298                 :            :                 return 1;
    1299 [ #  # ][ #  # ]:          0 :         if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1300                 :            :                 return 1;
    1301                 :            :         return 0;
    1302                 :            : }
    1303                 :            : 
    1304                 :            : static inline int ext3_should_order_data(struct inode *inode)
    1305                 :            : {
    1306 [ #  # ][ #  # ]:          0 :         if (!S_ISREG(inode->i_mode))
    1307                 :            :                 return 0;
    1308 [ #  # ][ #  # ]:          0 :         if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
    1309                 :            :                 return 0;
    1310 [ #  # ][ #  # ]:          0 :         if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA)
    1311                 :            :                 return 1;
    1312                 :            :         return 0;
    1313                 :            : }
    1314                 :            : 
    1315                 :            : static inline int ext3_should_writeback_data(struct inode *inode)
    1316                 :            : {
    1317 [ #  # ][ #  # ]:          0 :         if (!S_ISREG(inode->i_mode))
                 [ #  # ]
    1318                 :            :                 return 0;
    1319 [ #  # ][ #  # ]:          0 :         if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
                 [ #  # ]
    1320                 :            :                 return 0;
    1321 [ #  # ][ #  # ]:          0 :         if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
                 [ #  # ]
    1322                 :            :                 return 1;
    1323                 :            :         return 0;
    1324                 :            : }
    1325                 :            : 
    1326                 :            : #include <trace/events/ext3.h>

Generated by: LCOV version 1.9