Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull second try at vfs part d#2 from Al Viro:
"Miklos' first series (with do_lookup() rewrite split into edible
chunks) + assorted bits and pieces.

The 'untangling of do_lookup()' series is is a splitup of what used to
be a monolithic patch from Miklos, so this series is basically "how do
I convince myself that his patch is correct (or find a hole in it)".
No holes found and I like the resulting cleanup, so in it went..."

Changes from try 1: Fix a boot problem with selinux, and commit messages
prettied up a bit.

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (24 commits)
vfs: fix out-of-date dentry_unhash() comment
vfs: split __lookup_hash
untangling do_lookup() - take __lookup_hash()-calling case out of line.
untangling do_lookup() - switch to calling __lookup_hash()
untangling do_lookup() - merge d_alloc_and_lookup() callers
untangling do_lookup() - merge failure exits in !dentry case
untangling do_lookup() - massage !dentry case towards __lookup_hash()
untangling do_lookup() - get rid of need_reval in !dentry case
untangling do_lookup() - eliminate a loop.
untangling do_lookup() - expand the area under ->i_mutex
untangling do_lookup() - isolate !dentry stuff from the rest of it.
vfs: move MAY_EXEC check from __lookup_hash()
vfs: don't revalidate just looked up dentry
vfs: fix d_need_lookup/d_revalidate order in do_lookup
ext3: move headers to fs/ext3/
migrate ext2_fs.h guts to fs/ext2/ext2.h
new helper: ext2_image_size()
get rid of pointless includes of ext2_fs.h
ext2: No longer export ext2_fs.h to user space
mtdchar: kill persistently held vfsmount
...

+4 -3
arch/blackfin/kernel/setup.c
··· 550 550 { 551 551 #ifdef CONFIG_MTD_UCLINUX 552 552 unsigned long mtd_phys = 0; 553 + unsigned long n; 553 554 #endif 554 555 unsigned long max_mem; 555 556 ··· 594 593 mtd_size = PAGE_ALIGN(*((unsigned long *)(mtd_phys + 8))); 595 594 596 595 # if defined(CONFIG_EXT2_FS) || defined(CONFIG_EXT3_FS) 597 - if (*((unsigned short *)(mtd_phys + 0x438)) == EXT2_SUPER_MAGIC) 598 - mtd_size = 599 - PAGE_ALIGN(*((unsigned long *)(mtd_phys + 0x404)) << 10); 596 + n = ext2_image_size((void *)(mtd_phys + 0x400)); 597 + if (n) 598 + mtd_size = PAGE_ALIGN(n * 1024); 600 599 # endif 601 600 602 601 # if defined(CONFIG_CRAMFS)
+16 -37
drivers/mtd/mtdchar.c
··· 39 39 #include <asm/uaccess.h> 40 40 41 41 static DEFINE_MUTEX(mtd_mutex); 42 - static struct vfsmount *mtd_inode_mnt __read_mostly; 43 42 44 43 /* 45 44 * Data structure to hold the pointer to the mtd device as well ··· 74 75 return -EINVAL; 75 76 } 76 77 77 - 78 + static int count; 79 + static struct vfsmount *mnt; 80 + static struct file_system_type mtd_inodefs_type; 78 81 79 82 static int mtdchar_open(struct inode *inode, struct file *file) 80 83 { ··· 93 92 if ((file->f_mode & FMODE_WRITE) && (minor & 1)) 94 93 return -EACCES; 95 94 95 + ret = simple_pin_fs(&mtd_inodefs_type, &mnt, &count); 96 + if (ret) 97 + return ret; 98 + 96 99 mutex_lock(&mtd_mutex); 97 100 mtd = get_mtd_device(NULL, devnum); 98 101 ··· 111 106 goto out; 112 107 } 113 108 114 - mtd_ino = iget_locked(mtd_inode_mnt->mnt_sb, devnum); 109 + mtd_ino = iget_locked(mnt->mnt_sb, devnum); 115 110 if (!mtd_ino) { 116 111 put_mtd_device(mtd); 117 112 ret = -ENOMEM; ··· 146 141 147 142 out: 148 143 mutex_unlock(&mtd_mutex); 144 + simple_release_fs(&mnt, &count); 149 145 return ret; 150 146 } /* mtdchar_open */ 151 147 ··· 168 162 put_mtd_device(mtd); 169 163 file->private_data = NULL; 170 164 kfree(mfi); 165 + simple_release_fs(&mnt, &count); 171 166 172 167 return 0; 173 168 } /* mtdchar_close */ ··· 1182 1175 #endif 1183 1176 }; 1184 1177 1178 + static const struct super_operations mtd_ops = { 1179 + .drop_inode = generic_delete_inode, 1180 + .statfs = simple_statfs, 1181 + }; 1182 + 1185 1183 static struct dentry *mtd_inodefs_mount(struct file_system_type *fs_type, 1186 1184 int flags, const char *dev_name, void *data) 1187 1185 { 1188 - return mount_pseudo(fs_type, "mtd_inode:", NULL, NULL, MTD_INODE_FS_MAGIC); 1186 + return mount_pseudo(fs_type, "mtd_inode:", &mtd_ops, NULL, MTD_INODE_FS_MAGIC); 1189 1187 } 1190 1188 1191 1189 static struct file_system_type mtd_inodefs_type = { 1192 1190 .name = "mtd_inodefs", 1193 1191 .mount = mtd_inodefs_mount, 1194 1192 .kill_sb = kill_anon_super, 1195 - }; 1196 - 1197 - static void mtdchar_notify_add(struct mtd_info *mtd) 1198 - { 1199 - } 1200 - 1201 - static void mtdchar_notify_remove(struct mtd_info *mtd) 1202 - { 1203 - struct inode *mtd_ino = ilookup(mtd_inode_mnt->mnt_sb, mtd->index); 1204 - 1205 - if (mtd_ino) { 1206 - /* Destroy the inode if it exists */ 1207 - clear_nlink(mtd_ino); 1208 - iput(mtd_ino); 1209 - } 1210 - } 1211 - 1212 - static struct mtd_notifier mtdchar_notifier = { 1213 - .add = mtdchar_notify_add, 1214 - .remove = mtdchar_notify_remove, 1215 1193 }; 1216 1194 1217 1195 static int __init init_mtdchar(void) ··· 1216 1224 pr_notice("Can't register mtd_inodefs filesystem: %d\n", ret); 1217 1225 goto err_unregister_chdev; 1218 1226 } 1219 - 1220 - mtd_inode_mnt = kern_mount(&mtd_inodefs_type); 1221 - if (IS_ERR(mtd_inode_mnt)) { 1222 - ret = PTR_ERR(mtd_inode_mnt); 1223 - pr_notice("Error mounting mtd_inodefs filesystem: %d\n", ret); 1224 - goto err_unregister_filesystem; 1225 - } 1226 - register_mtd_user(&mtdchar_notifier); 1227 - 1228 1227 return ret; 1229 1228 1230 - err_unregister_filesystem: 1231 - unregister_filesystem(&mtd_inodefs_type); 1232 1229 err_unregister_chdev: 1233 1230 __unregister_chrdev(MTD_CHAR_MAJOR, 0, 1 << MINORBITS, "mtd"); 1234 1231 return ret; ··· 1225 1244 1226 1245 static void __exit cleanup_mtdchar(void) 1227 1246 { 1228 - unregister_mtd_user(&mtdchar_notifier); 1229 - kern_unmount(mtd_inode_mnt); 1230 1247 unregister_filesystem(&mtd_inodefs_type); 1231 1248 __unregister_chrdev(MTD_CHAR_MAJOR, 0, 1 << MINORBITS, "mtd"); 1232 1249 }
+11 -21
fs/aio.c
··· 305 305 return ERR_PTR(err); 306 306 } 307 307 308 - /* aio_cancel_all 308 + /* kill_ctx 309 309 * Cancels all outstanding aio requests on an aio context. Used 310 310 * when the processes owning a context have all exited to encourage 311 311 * the rapid destruction of the kioctx. 312 312 */ 313 - static void aio_cancel_all(struct kioctx *ctx) 313 + static void kill_ctx(struct kioctx *ctx) 314 314 { 315 315 int (*cancel)(struct kiocb *, struct io_event *); 316 + struct task_struct *tsk = current; 317 + DECLARE_WAITQUEUE(wait, tsk); 316 318 struct io_event res; 319 + 317 320 spin_lock_irq(&ctx->ctx_lock); 318 321 ctx->dead = 1; 319 322 while (!list_empty(&ctx->active_reqs)) { ··· 332 329 spin_lock_irq(&ctx->ctx_lock); 333 330 } 334 331 } 335 - spin_unlock_irq(&ctx->ctx_lock); 336 - } 337 332 338 - static void wait_for_all_aios(struct kioctx *ctx) 339 - { 340 - struct task_struct *tsk = current; 341 - DECLARE_WAITQUEUE(wait, tsk); 342 - 343 - spin_lock_irq(&ctx->ctx_lock); 344 333 if (!ctx->reqs_active) 345 334 goto out; 346 335 ··· 382 387 ctx = hlist_entry(mm->ioctx_list.first, struct kioctx, list); 383 388 hlist_del_rcu(&ctx->list); 384 389 385 - aio_cancel_all(ctx); 386 - 387 - wait_for_all_aios(ctx); 390 + kill_ctx(ctx); 388 391 389 392 if (1 != atomic_read(&ctx->users)) 390 393 printk(KERN_DEBUG ··· 1262 1269 if (likely(!was_dead)) 1263 1270 put_ioctx(ioctx); /* twice for the list */ 1264 1271 1265 - aio_cancel_all(ioctx); 1266 - wait_for_all_aios(ioctx); 1272 + kill_ctx(ioctx); 1267 1273 1268 1274 /* 1269 1275 * Wake up any waiters. The setting of ctx->dead must be seen ··· 1270 1278 * locking done by the above calls to ensure this consistency. 1271 1279 */ 1272 1280 wake_up_all(&ioctx->wait); 1273 - put_ioctx(ioctx); /* once for the lookup */ 1274 1281 } 1275 1282 1276 1283 /* sys_io_setup: ··· 1306 1315 ret = PTR_ERR(ioctx); 1307 1316 if (!IS_ERR(ioctx)) { 1308 1317 ret = put_user(ioctx->user_id, ctxp); 1309 - if (!ret) { 1310 - put_ioctx(ioctx); 1311 - return 0; 1312 - } 1313 - io_destroy(ioctx); 1318 + if (ret) 1319 + io_destroy(ioctx); 1320 + put_ioctx(ioctx); 1314 1321 } 1315 1322 1316 1323 out: ··· 1326 1337 struct kioctx *ioctx = lookup_ioctx(ctx); 1327 1338 if (likely(NULL != ioctx)) { 1328 1339 io_destroy(ioctx); 1340 + put_ioctx(ioctx); 1329 1341 return 0; 1330 1342 } 1331 1343 pr_debug("EINVAL: io_destroy: invalid context id\n");
+631
fs/ext2/ext2.h
··· 1 + /* 2 + * Copyright (C) 1992, 1993, 1994, 1995 3 + * Remy Card (card@masi.ibp.fr) 4 + * Laboratoire MASI - Institut Blaise Pascal 5 + * Universite Pierre et Marie Curie (Paris VI) 6 + * 7 + * from 8 + * 9 + * linux/include/linux/minix_fs.h 10 + * 11 + * Copyright (C) 1991, 1992 Linus Torvalds 12 + */ 1 13 #include <linux/fs.h> 2 14 #include <linux/ext2_fs.h> 15 + #include <linux/blockgroup_lock.h> 16 + #include <linux/percpu_counter.h> 17 + #include <linux/rbtree.h> 18 + 19 + /* XXX Here for now... not interested in restructing headers JUST now */ 20 + 21 + /* data type for block offset of block group */ 22 + typedef int ext2_grpblk_t; 23 + 24 + /* data type for filesystem-wide blocks number */ 25 + typedef unsigned long ext2_fsblk_t; 26 + 27 + #define E2FSBLK "%lu" 28 + 29 + struct ext2_reserve_window { 30 + ext2_fsblk_t _rsv_start; /* First byte reserved */ 31 + ext2_fsblk_t _rsv_end; /* Last byte reserved or 0 */ 32 + }; 33 + 34 + struct ext2_reserve_window_node { 35 + struct rb_node rsv_node; 36 + __u32 rsv_goal_size; 37 + __u32 rsv_alloc_hit; 38 + struct ext2_reserve_window rsv_window; 39 + }; 40 + 41 + struct ext2_block_alloc_info { 42 + /* information about reservation window */ 43 + struct ext2_reserve_window_node rsv_window_node; 44 + /* 45 + * was i_next_alloc_block in ext2_inode_info 46 + * is the logical (file-relative) number of the 47 + * most-recently-allocated block in this file. 48 + * We use this for detecting linearly ascending allocation requests. 49 + */ 50 + __u32 last_alloc_logical_block; 51 + /* 52 + * Was i_next_alloc_goal in ext2_inode_info 53 + * is the *physical* companion to i_next_alloc_block. 54 + * it the the physical block number of the block which was most-recentl 55 + * allocated to this file. This give us the goal (target) for the next 56 + * allocation when we detect linearly ascending requests. 57 + */ 58 + ext2_fsblk_t last_alloc_physical_block; 59 + }; 60 + 61 + #define rsv_start rsv_window._rsv_start 62 + #define rsv_end rsv_window._rsv_end 63 + 64 + /* 65 + * second extended-fs super-block data in memory 66 + */ 67 + struct ext2_sb_info { 68 + unsigned long s_frag_size; /* Size of a fragment in bytes */ 69 + unsigned long s_frags_per_block;/* Number of fragments per block */ 70 + unsigned long s_inodes_per_block;/* Number of inodes per block */ 71 + unsigned long s_frags_per_group;/* Number of fragments in a group */ 72 + unsigned long s_blocks_per_group;/* Number of blocks in a group */ 73 + unsigned long s_inodes_per_group;/* Number of inodes in a group */ 74 + unsigned long s_itb_per_group; /* Number of inode table blocks per group */ 75 + unsigned long s_gdb_count; /* Number of group descriptor blocks */ 76 + unsigned long s_desc_per_block; /* Number of group descriptors per block */ 77 + unsigned long s_groups_count; /* Number of groups in the fs */ 78 + unsigned long s_overhead_last; /* Last calculated overhead */ 79 + unsigned long s_blocks_last; /* Last seen block count */ 80 + struct buffer_head * s_sbh; /* Buffer containing the super block */ 81 + struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */ 82 + struct buffer_head ** s_group_desc; 83 + unsigned long s_mount_opt; 84 + unsigned long s_sb_block; 85 + uid_t s_resuid; 86 + gid_t s_resgid; 87 + unsigned short s_mount_state; 88 + unsigned short s_pad; 89 + int s_addr_per_block_bits; 90 + int s_desc_per_block_bits; 91 + int s_inode_size; 92 + int s_first_ino; 93 + spinlock_t s_next_gen_lock; 94 + u32 s_next_generation; 95 + unsigned long s_dir_count; 96 + u8 *s_debts; 97 + struct percpu_counter s_freeblocks_counter; 98 + struct percpu_counter s_freeinodes_counter; 99 + struct percpu_counter s_dirs_counter; 100 + struct blockgroup_lock *s_blockgroup_lock; 101 + /* root of the per fs reservation window tree */ 102 + spinlock_t s_rsv_window_lock; 103 + struct rb_root s_rsv_window_root; 104 + struct ext2_reserve_window_node s_rsv_window_head; 105 + /* 106 + * s_lock protects against concurrent modifications of s_mount_state, 107 + * s_blocks_last, s_overhead_last and the content of superblock's 108 + * buffer pointed to by sbi->s_es. 109 + * 110 + * Note: It is used in ext2_show_options() to provide a consistent view 111 + * of the mount options. 112 + */ 113 + spinlock_t s_lock; 114 + }; 115 + 116 + static inline spinlock_t * 117 + sb_bgl_lock(struct ext2_sb_info *sbi, unsigned int block_group) 118 + { 119 + return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); 120 + } 121 + 122 + /* 123 + * Define EXT2FS_DEBUG to produce debug messages 124 + */ 125 + #undef EXT2FS_DEBUG 126 + 127 + /* 128 + * Define EXT2_RESERVATION to reserve data blocks for expanding files 129 + */ 130 + #define EXT2_DEFAULT_RESERVE_BLOCKS 8 131 + /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */ 132 + #define EXT2_MAX_RESERVE_BLOCKS 1027 133 + #define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0 134 + /* 135 + * The second extended file system version 136 + */ 137 + #define EXT2FS_DATE "95/08/09" 138 + #define EXT2FS_VERSION "0.5b" 139 + 140 + /* 141 + * Debug code 142 + */ 143 + #ifdef EXT2FS_DEBUG 144 + # define ext2_debug(f, a...) { \ 145 + printk ("EXT2-fs DEBUG (%s, %d): %s:", \ 146 + __FILE__, __LINE__, __func__); \ 147 + printk (f, ## a); \ 148 + } 149 + #else 150 + # define ext2_debug(f, a...) /**/ 151 + #endif 152 + 153 + /* 154 + * Special inode numbers 155 + */ 156 + #define EXT2_BAD_INO 1 /* Bad blocks inode */ 157 + #define EXT2_ROOT_INO 2 /* Root inode */ 158 + #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ 159 + #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ 160 + 161 + /* First non-reserved inode for old ext2 filesystems */ 162 + #define EXT2_GOOD_OLD_FIRST_INO 11 163 + 164 + static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb) 165 + { 166 + return sb->s_fs_info; 167 + } 168 + 169 + /* 170 + * Macro-instructions used to manage several block sizes 171 + */ 172 + #define EXT2_MIN_BLOCK_SIZE 1024 173 + #define EXT2_MAX_BLOCK_SIZE 4096 174 + #define EXT2_MIN_BLOCK_LOG_SIZE 10 175 + #define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize) 176 + #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) 177 + #define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 178 + #define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits) 179 + #define EXT2_INODE_SIZE(s) (EXT2_SB(s)->s_inode_size) 180 + #define EXT2_FIRST_INO(s) (EXT2_SB(s)->s_first_ino) 181 + 182 + /* 183 + * Macro-instructions used to manage fragments 184 + */ 185 + #define EXT2_MIN_FRAG_SIZE 1024 186 + #define EXT2_MAX_FRAG_SIZE 4096 187 + #define EXT2_MIN_FRAG_LOG_SIZE 10 188 + #define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->s_frag_size) 189 + #define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->s_frags_per_block) 190 + 191 + /* 192 + * Structure of a blocks group descriptor 193 + */ 194 + struct ext2_group_desc 195 + { 196 + __le32 bg_block_bitmap; /* Blocks bitmap block */ 197 + __le32 bg_inode_bitmap; /* Inodes bitmap block */ 198 + __le32 bg_inode_table; /* Inodes table block */ 199 + __le16 bg_free_blocks_count; /* Free blocks count */ 200 + __le16 bg_free_inodes_count; /* Free inodes count */ 201 + __le16 bg_used_dirs_count; /* Directories count */ 202 + __le16 bg_pad; 203 + __le32 bg_reserved[3]; 204 + }; 205 + 206 + /* 207 + * Macro-instructions used to manage group descriptors 208 + */ 209 + #define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group) 210 + #define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->s_desc_per_block) 211 + #define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group) 212 + #define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits) 213 + 214 + /* 215 + * Constants relative to the data blocks 216 + */ 217 + #define EXT2_NDIR_BLOCKS 12 218 + #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS 219 + #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) 220 + #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) 221 + #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) 222 + 223 + /* 224 + * Inode flags (GETFLAGS/SETFLAGS) 225 + */ 226 + #define EXT2_SECRM_FL FS_SECRM_FL /* Secure deletion */ 227 + #define EXT2_UNRM_FL FS_UNRM_FL /* Undelete */ 228 + #define EXT2_COMPR_FL FS_COMPR_FL /* Compress file */ 229 + #define EXT2_SYNC_FL FS_SYNC_FL /* Synchronous updates */ 230 + #define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */ 231 + #define EXT2_APPEND_FL FS_APPEND_FL /* writes to file may only append */ 232 + #define EXT2_NODUMP_FL FS_NODUMP_FL /* do not dump file */ 233 + #define EXT2_NOATIME_FL FS_NOATIME_FL /* do not update atime */ 234 + /* Reserved for compression usage... */ 235 + #define EXT2_DIRTY_FL FS_DIRTY_FL 236 + #define EXT2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */ 237 + #define EXT2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */ 238 + #define EXT2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */ 239 + /* End compression flags --- maybe not all used */ 240 + #define EXT2_BTREE_FL FS_BTREE_FL /* btree format dir */ 241 + #define EXT2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */ 242 + #define EXT2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */ 243 + #define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */ 244 + #define EXT2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */ 245 + #define EXT2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */ 246 + #define EXT2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/ 247 + #define EXT2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */ 248 + 249 + #define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */ 250 + #define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */ 251 + 252 + /* Flags that should be inherited by new inodes from their parent. */ 253 + #define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\ 254 + EXT2_SYNC_FL | EXT2_NODUMP_FL |\ 255 + EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\ 256 + EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ 257 + EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) 258 + 259 + /* Flags that are appropriate for regular files (all but dir-specific ones). */ 260 + #define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL)) 261 + 262 + /* Flags that are appropriate for non-directories/regular files. */ 263 + #define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL) 264 + 265 + /* Mask out flags that are inappropriate for the given type of inode. */ 266 + static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags) 267 + { 268 + if (S_ISDIR(mode)) 269 + return flags; 270 + else if (S_ISREG(mode)) 271 + return flags & EXT2_REG_FLMASK; 272 + else 273 + return flags & EXT2_OTHER_FLMASK; 274 + } 275 + 276 + /* 277 + * ioctl commands 278 + */ 279 + #define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS 280 + #define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS 281 + #define EXT2_IOC_GETVERSION FS_IOC_GETVERSION 282 + #define EXT2_IOC_SETVERSION FS_IOC_SETVERSION 283 + #define EXT2_IOC_GETRSVSZ _IOR('f', 5, long) 284 + #define EXT2_IOC_SETRSVSZ _IOW('f', 6, long) 285 + 286 + /* 287 + * ioctl commands in 32 bit emulation 288 + */ 289 + #define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS 290 + #define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS 291 + #define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION 292 + #define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION 293 + 294 + /* 295 + * Structure of an inode on the disk 296 + */ 297 + struct ext2_inode { 298 + __le16 i_mode; /* File mode */ 299 + __le16 i_uid; /* Low 16 bits of Owner Uid */ 300 + __le32 i_size; /* Size in bytes */ 301 + __le32 i_atime; /* Access time */ 302 + __le32 i_ctime; /* Creation time */ 303 + __le32 i_mtime; /* Modification time */ 304 + __le32 i_dtime; /* Deletion Time */ 305 + __le16 i_gid; /* Low 16 bits of Group Id */ 306 + __le16 i_links_count; /* Links count */ 307 + __le32 i_blocks; /* Blocks count */ 308 + __le32 i_flags; /* File flags */ 309 + union { 310 + struct { 311 + __le32 l_i_reserved1; 312 + } linux1; 313 + struct { 314 + __le32 h_i_translator; 315 + } hurd1; 316 + struct { 317 + __le32 m_i_reserved1; 318 + } masix1; 319 + } osd1; /* OS dependent 1 */ 320 + __le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ 321 + __le32 i_generation; /* File version (for NFS) */ 322 + __le32 i_file_acl; /* File ACL */ 323 + __le32 i_dir_acl; /* Directory ACL */ 324 + __le32 i_faddr; /* Fragment address */ 325 + union { 326 + struct { 327 + __u8 l_i_frag; /* Fragment number */ 328 + __u8 l_i_fsize; /* Fragment size */ 329 + __u16 i_pad1; 330 + __le16 l_i_uid_high; /* these 2 fields */ 331 + __le16 l_i_gid_high; /* were reserved2[0] */ 332 + __u32 l_i_reserved2; 333 + } linux2; 334 + struct { 335 + __u8 h_i_frag; /* Fragment number */ 336 + __u8 h_i_fsize; /* Fragment size */ 337 + __le16 h_i_mode_high; 338 + __le16 h_i_uid_high; 339 + __le16 h_i_gid_high; 340 + __le32 h_i_author; 341 + } hurd2; 342 + struct { 343 + __u8 m_i_frag; /* Fragment number */ 344 + __u8 m_i_fsize; /* Fragment size */ 345 + __u16 m_pad1; 346 + __u32 m_i_reserved2[2]; 347 + } masix2; 348 + } osd2; /* OS dependent 2 */ 349 + }; 350 + 351 + #define i_size_high i_dir_acl 352 + 353 + #define i_reserved1 osd1.linux1.l_i_reserved1 354 + #define i_frag osd2.linux2.l_i_frag 355 + #define i_fsize osd2.linux2.l_i_fsize 356 + #define i_uid_low i_uid 357 + #define i_gid_low i_gid 358 + #define i_uid_high osd2.linux2.l_i_uid_high 359 + #define i_gid_high osd2.linux2.l_i_gid_high 360 + #define i_reserved2 osd2.linux2.l_i_reserved2 361 + 362 + /* 363 + * File system states 364 + */ 365 + #define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ 366 + #define EXT2_ERROR_FS 0x0002 /* Errors detected */ 367 + 368 + /* 369 + * Mount flags 370 + */ 371 + #define EXT2_MOUNT_CHECK 0x000001 /* Do mount-time checks */ 372 + #define EXT2_MOUNT_OLDALLOC 0x000002 /* Don't use the new Orlov allocator */ 373 + #define EXT2_MOUNT_GRPID 0x000004 /* Create files with directory's group */ 374 + #define EXT2_MOUNT_DEBUG 0x000008 /* Some debugging messages */ 375 + #define EXT2_MOUNT_ERRORS_CONT 0x000010 /* Continue on errors */ 376 + #define EXT2_MOUNT_ERRORS_RO 0x000020 /* Remount fs ro on errors */ 377 + #define EXT2_MOUNT_ERRORS_PANIC 0x000040 /* Panic on errors */ 378 + #define EXT2_MOUNT_MINIX_DF 0x000080 /* Mimics the Minix statfs */ 379 + #define EXT2_MOUNT_NOBH 0x000100 /* No buffer_heads */ 380 + #define EXT2_MOUNT_NO_UID32 0x000200 /* Disable 32-bit UIDs */ 381 + #define EXT2_MOUNT_XATTR_USER 0x004000 /* Extended user attributes */ 382 + #define EXT2_MOUNT_POSIX_ACL 0x008000 /* POSIX Access Control Lists */ 383 + #define EXT2_MOUNT_XIP 0x010000 /* Execute in place */ 384 + #define EXT2_MOUNT_USRQUOTA 0x020000 /* user quota */ 385 + #define EXT2_MOUNT_GRPQUOTA 0x040000 /* group quota */ 386 + #define EXT2_MOUNT_RESERVATION 0x080000 /* Preallocation */ 387 + 388 + 389 + #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt 390 + #define set_opt(o, opt) o |= EXT2_MOUNT_##opt 391 + #define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \ 392 + EXT2_MOUNT_##opt) 393 + /* 394 + * Maximal mount counts between two filesystem checks 395 + */ 396 + #define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ 397 + #define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */ 398 + 399 + /* 400 + * Behaviour when detecting errors 401 + */ 402 + #define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ 403 + #define EXT2_ERRORS_RO 2 /* Remount fs read-only */ 404 + #define EXT2_ERRORS_PANIC 3 /* Panic */ 405 + #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE 406 + 407 + /* 408 + * Structure of the super block 409 + */ 410 + struct ext2_super_block { 411 + __le32 s_inodes_count; /* Inodes count */ 412 + __le32 s_blocks_count; /* Blocks count */ 413 + __le32 s_r_blocks_count; /* Reserved blocks count */ 414 + __le32 s_free_blocks_count; /* Free blocks count */ 415 + __le32 s_free_inodes_count; /* Free inodes count */ 416 + __le32 s_first_data_block; /* First Data Block */ 417 + __le32 s_log_block_size; /* Block size */ 418 + __le32 s_log_frag_size; /* Fragment size */ 419 + __le32 s_blocks_per_group; /* # Blocks per group */ 420 + __le32 s_frags_per_group; /* # Fragments per group */ 421 + __le32 s_inodes_per_group; /* # Inodes per group */ 422 + __le32 s_mtime; /* Mount time */ 423 + __le32 s_wtime; /* Write time */ 424 + __le16 s_mnt_count; /* Mount count */ 425 + __le16 s_max_mnt_count; /* Maximal mount count */ 426 + __le16 s_magic; /* Magic signature */ 427 + __le16 s_state; /* File system state */ 428 + __le16 s_errors; /* Behaviour when detecting errors */ 429 + __le16 s_minor_rev_level; /* minor revision level */ 430 + __le32 s_lastcheck; /* time of last check */ 431 + __le32 s_checkinterval; /* max. time between checks */ 432 + __le32 s_creator_os; /* OS */ 433 + __le32 s_rev_level; /* Revision level */ 434 + __le16 s_def_resuid; /* Default uid for reserved blocks */ 435 + __le16 s_def_resgid; /* Default gid for reserved blocks */ 436 + /* 437 + * These fields are for EXT2_DYNAMIC_REV superblocks only. 438 + * 439 + * Note: the difference between the compatible feature set and 440 + * the incompatible feature set is that if there is a bit set 441 + * in the incompatible feature set that the kernel doesn't 442 + * know about, it should refuse to mount the filesystem. 443 + * 444 + * e2fsck's requirements are more strict; if it doesn't know 445 + * about a feature in either the compatible or incompatible 446 + * feature set, it must abort and not try to meddle with 447 + * things it doesn't understand... 448 + */ 449 + __le32 s_first_ino; /* First non-reserved inode */ 450 + __le16 s_inode_size; /* size of inode structure */ 451 + __le16 s_block_group_nr; /* block group # of this superblock */ 452 + __le32 s_feature_compat; /* compatible feature set */ 453 + __le32 s_feature_incompat; /* incompatible feature set */ 454 + __le32 s_feature_ro_compat; /* readonly-compatible feature set */ 455 + __u8 s_uuid[16]; /* 128-bit uuid for volume */ 456 + char s_volume_name[16]; /* volume name */ 457 + char s_last_mounted[64]; /* directory where last mounted */ 458 + __le32 s_algorithm_usage_bitmap; /* For compression */ 459 + /* 460 + * Performance hints. Directory preallocation should only 461 + * happen if the EXT2_COMPAT_PREALLOC flag is on. 462 + */ 463 + __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ 464 + __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ 465 + __u16 s_padding1; 466 + /* 467 + * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set. 468 + */ 469 + __u8 s_journal_uuid[16]; /* uuid of journal superblock */ 470 + __u32 s_journal_inum; /* inode number of journal file */ 471 + __u32 s_journal_dev; /* device number of journal file */ 472 + __u32 s_last_orphan; /* start of list of inodes to delete */ 473 + __u32 s_hash_seed[4]; /* HTREE hash seed */ 474 + __u8 s_def_hash_version; /* Default hash version to use */ 475 + __u8 s_reserved_char_pad; 476 + __u16 s_reserved_word_pad; 477 + __le32 s_default_mount_opts; 478 + __le32 s_first_meta_bg; /* First metablock block group */ 479 + __u32 s_reserved[190]; /* Padding to the end of the block */ 480 + }; 481 + 482 + /* 483 + * Codes for operating systems 484 + */ 485 + #define EXT2_OS_LINUX 0 486 + #define EXT2_OS_HURD 1 487 + #define EXT2_OS_MASIX 2 488 + #define EXT2_OS_FREEBSD 3 489 + #define EXT2_OS_LITES 4 490 + 491 + /* 492 + * Revision levels 493 + */ 494 + #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ 495 + #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ 496 + 497 + #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV 498 + #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV 499 + 500 + #define EXT2_GOOD_OLD_INODE_SIZE 128 501 + 502 + /* 503 + * Feature set definitions 504 + */ 505 + 506 + #define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ 507 + ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) 508 + #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ 509 + ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) ) 510 + #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ 511 + ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) 512 + #define EXT2_SET_COMPAT_FEATURE(sb,mask) \ 513 + EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask) 514 + #define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \ 515 + EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask) 516 + #define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \ 517 + EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask) 518 + #define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \ 519 + EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask) 520 + #define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \ 521 + EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask) 522 + #define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \ 523 + EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask) 524 + 525 + #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 526 + #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 527 + #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 528 + #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008 529 + #define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010 530 + #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020 531 + #define EXT2_FEATURE_COMPAT_ANY 0xffffffff 532 + 533 + #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 534 + #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 535 + #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 536 + #define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff 537 + 538 + #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 539 + #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 540 + #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 541 + #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 542 + #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 543 + #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff 544 + 545 + #define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR 546 + #define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \ 547 + EXT2_FEATURE_INCOMPAT_META_BG) 548 + #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ 549 + EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ 550 + EXT2_FEATURE_RO_COMPAT_BTREE_DIR) 551 + #define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP 552 + #define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP 553 + 554 + /* 555 + * Default values for user and/or group using reserved blocks 556 + */ 557 + #define EXT2_DEF_RESUID 0 558 + #define EXT2_DEF_RESGID 0 559 + 560 + /* 561 + * Default mount options 562 + */ 563 + #define EXT2_DEFM_DEBUG 0x0001 564 + #define EXT2_DEFM_BSDGROUPS 0x0002 565 + #define EXT2_DEFM_XATTR_USER 0x0004 566 + #define EXT2_DEFM_ACL 0x0008 567 + #define EXT2_DEFM_UID16 0x0010 568 + /* Not used by ext2, but reserved for use by ext3 */ 569 + #define EXT3_DEFM_JMODE 0x0060 570 + #define EXT3_DEFM_JMODE_DATA 0x0020 571 + #define EXT3_DEFM_JMODE_ORDERED 0x0040 572 + #define EXT3_DEFM_JMODE_WBACK 0x0060 573 + 574 + /* 575 + * Structure of a directory entry 576 + */ 577 + 578 + struct ext2_dir_entry { 579 + __le32 inode; /* Inode number */ 580 + __le16 rec_len; /* Directory entry length */ 581 + __le16 name_len; /* Name length */ 582 + char name[]; /* File name, up to EXT2_NAME_LEN */ 583 + }; 584 + 585 + /* 586 + * The new version of the directory entry. Since EXT2 structures are 587 + * stored in intel byte order, and the name_len field could never be 588 + * bigger than 255 chars, it's safe to reclaim the extra byte for the 589 + * file_type field. 590 + */ 591 + struct ext2_dir_entry_2 { 592 + __le32 inode; /* Inode number */ 593 + __le16 rec_len; /* Directory entry length */ 594 + __u8 name_len; /* Name length */ 595 + __u8 file_type; 596 + char name[]; /* File name, up to EXT2_NAME_LEN */ 597 + }; 598 + 599 + /* 600 + * Ext2 directory file types. Only the low 3 bits are used. The 601 + * other bits are reserved for now. 602 + */ 603 + enum { 604 + EXT2_FT_UNKNOWN = 0, 605 + EXT2_FT_REG_FILE = 1, 606 + EXT2_FT_DIR = 2, 607 + EXT2_FT_CHRDEV = 3, 608 + EXT2_FT_BLKDEV = 4, 609 + EXT2_FT_FIFO = 5, 610 + EXT2_FT_SOCK = 6, 611 + EXT2_FT_SYMLINK = 7, 612 + EXT2_FT_MAX 613 + }; 614 + 615 + /* 616 + * EXT2_DIR_PAD defines the directory entries boundaries 617 + * 618 + * NOTE: It must be a multiple of 4 619 + */ 620 + #define EXT2_DIR_PAD 4 621 + #define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) 622 + #define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ 623 + ~EXT2_DIR_ROUND) 624 + #define EXT2_MAX_REC_LEN ((1<<16)-1) 625 + 626 + static inline void verify_offsets(void) 627 + { 628 + #define A(x,y) BUILD_BUG_ON(x != offsetof(struct ext2_super_block, y)); 629 + A(EXT2_SB_MAGIC_OFFSET, s_magic); 630 + A(EXT2_SB_BLOCKS_OFFSET, s_blocks_count); 631 + A(EXT2_SB_BSIZE_OFFSET, s_log_block_size); 632 + #undef A 633 + } 3 634 4 635 /* 5 636 * ext2 mount options
+1 -4
fs/ext2/xattr_security.c
··· 3 3 * Handler for storing security labels as extended attributes. 4 4 */ 5 5 6 - #include <linux/slab.h> 7 - #include <linux/string.h> 8 - #include <linux/fs.h> 9 - #include <linux/ext2_fs.h> 6 + #include "ext2.h" 10 7 #include <linux/security.h> 11 8 #include "xattr.h" 12 9
+1 -4
fs/ext2/xattr_trusted.c
··· 5 5 * Copyright (C) 2003 by Andreas Gruenbacher, <a.gruenbacher@computer.org> 6 6 */ 7 7 8 - #include <linux/string.h> 9 - #include <linux/capability.h> 10 - #include <linux/fs.h> 11 - #include <linux/ext2_fs.h> 8 + #include "ext2.h" 12 9 #include "xattr.h" 13 10 14 11 static size_t
-2
fs/ext2/xip.c
··· 9 9 #include <linux/fs.h> 10 10 #include <linux/genhd.h> 11 11 #include <linux/buffer_head.h> 12 - #include <linux/ext2_fs_sb.h> 13 - #include <linux/ext2_fs.h> 14 12 #include <linux/blkdev.h> 15 13 #include "ext2.h" 16 14 #include "xip.h"
+1 -7
fs/ext3/acl.c
··· 4 4 * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de> 5 5 */ 6 6 7 - #include <linux/init.h> 8 - #include <linux/sched.h> 9 - #include <linux/slab.h> 10 - #include <linux/capability.h> 11 - #include <linux/fs.h> 12 - #include <linux/ext3_jbd.h> 13 - #include <linux/ext3_fs.h> 7 + #include "ext3.h" 14 8 #include "xattr.h" 15 9 #include "acl.h" 16 10
+1 -9
fs/ext3/balloc.c
··· 11 11 * David S. Miller (davem@caip.rutgers.edu), 1995 12 12 */ 13 13 14 - #include <linux/time.h> 15 - #include <linux/capability.h> 16 - #include <linux/fs.h> 17 - #include <linux/slab.h> 18 - #include <linux/jbd.h> 19 - #include <linux/ext3_fs.h> 20 - #include <linux/ext3_jbd.h> 21 14 #include <linux/quotaops.h> 22 - #include <linux/buffer_head.h> 23 15 #include <linux/blkdev.h> 24 - #include <trace/events/ext3.h> 16 + #include "ext3.h" 25 17 26 18 /* 27 19 * balloc.c contains the blocks allocation and deallocation routines
+1 -3
fs/ext3/bitmap.c
··· 7 7 * Universite Pierre et Marie Curie (Paris VI) 8 8 */ 9 9 10 - #include <linux/buffer_head.h> 11 - #include <linux/jbd.h> 12 - #include <linux/ext3_fs.h> 10 + #include "ext3.h" 13 11 14 12 #ifdef EXT3FS_DEBUG 15 13
+1 -6
fs/ext3/dir.c
··· 21 21 * 22 22 */ 23 23 24 - #include <linux/fs.h> 25 - #include <linux/jbd.h> 26 - #include <linux/ext3_fs.h> 27 - #include <linux/buffer_head.h> 28 - #include <linux/slab.h> 29 - #include <linux/rbtree.h> 24 + #include "ext3.h" 30 25 31 26 static unsigned char ext3_filetype_table[] = { 32 27 DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK
+1 -1
fs/ext3/ext3_jbd.c
··· 2 2 * Interface between ext3 and JBD 3 3 */ 4 4 5 - #include <linux/ext3_jbd.h> 5 + #include "ext3.h" 6 6 7 7 int __ext3_journal_get_undo_access(const char *where, handle_t *handle, 8 8 struct buffer_head *bh)
+1 -5
fs/ext3/file.c
··· 18 18 * (jj@sunsite.ms.mff.cuni.cz) 19 19 */ 20 20 21 - #include <linux/time.h> 22 - #include <linux/fs.h> 23 - #include <linux/jbd.h> 24 21 #include <linux/quotaops.h> 25 - #include <linux/ext3_fs.h> 26 - #include <linux/ext3_jbd.h> 22 + #include "ext3.h" 27 23 #include "xattr.h" 28 24 #include "acl.h" 29 25
+1 -7
fs/ext3/fsync.c
··· 22 22 * we can depend on generic_block_fdatasync() to sync the data blocks. 23 23 */ 24 24 25 - #include <linux/time.h> 26 25 #include <linux/blkdev.h> 27 - #include <linux/fs.h> 28 - #include <linux/sched.h> 29 26 #include <linux/writeback.h> 30 - #include <linux/jbd.h> 31 - #include <linux/ext3_fs.h> 32 - #include <linux/ext3_jbd.h> 33 - #include <trace/events/ext3.h> 27 + #include "ext3.h" 34 28 35 29 /* 36 30 * akpm: A new design for ext3_sync_file().
+1 -3
fs/ext3/hash.c
··· 9 9 * License. 10 10 */ 11 11 12 - #include <linux/fs.h> 13 - #include <linux/jbd.h> 14 - #include <linux/ext3_fs.h> 12 + #include "ext3.h" 15 13 #include <linux/cryptohash.h> 16 14 17 15 #define DELTA 0x9E3779B9
+1 -12
fs/ext3/ialloc.c
··· 12 12 * David S. Miller (davem@caip.rutgers.edu), 1995 13 13 */ 14 14 15 - #include <linux/time.h> 16 - #include <linux/fs.h> 17 - #include <linux/jbd.h> 18 - #include <linux/ext3_fs.h> 19 - #include <linux/ext3_jbd.h> 20 - #include <linux/stat.h> 21 - #include <linux/string.h> 22 15 #include <linux/quotaops.h> 23 - #include <linux/buffer_head.h> 24 16 #include <linux/random.h> 25 - #include <linux/bitops.h> 26 - #include <trace/events/ext3.h> 27 17 28 - #include <asm/byteorder.h> 29 - 18 + #include "ext3.h" 30 19 #include "xattr.h" 31 20 #include "acl.h" 32 21
+1 -11
fs/ext3/inode.c
··· 22 22 * Assorted race fixes, rewrite of ext3_get_block() by Al Viro, 2000 23 23 */ 24 24 25 - #include <linux/fs.h> 26 - #include <linux/time.h> 27 - #include <linux/ext3_jbd.h> 28 - #include <linux/jbd.h> 29 25 #include <linux/highuid.h> 30 - #include <linux/pagemap.h> 31 26 #include <linux/quotaops.h> 32 - #include <linux/string.h> 33 - #include <linux/buffer_head.h> 34 27 #include <linux/writeback.h> 35 28 #include <linux/mpage.h> 36 - #include <linux/uio.h> 37 - #include <linux/bio.h> 38 - #include <linux/fiemap.h> 39 29 #include <linux/namei.h> 40 - #include <trace/events/ext3.h> 30 + #include "ext3.h" 41 31 #include "xattr.h" 42 32 #include "acl.h" 43 33
+1 -6
fs/ext3/ioctl.c
··· 7 7 * Universite Pierre et Marie Curie (Paris VI) 8 8 */ 9 9 10 - #include <linux/fs.h> 11 - #include <linux/jbd.h> 12 - #include <linux/capability.h> 13 - #include <linux/ext3_fs.h> 14 - #include <linux/ext3_jbd.h> 15 10 #include <linux/mount.h> 16 - #include <linux/time.h> 17 11 #include <linux/compat.h> 18 12 #include <asm/uaccess.h> 13 + #include "ext3.h" 19 14 20 15 long ext3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 21 16 {
+1 -13
fs/ext3/namei.c
··· 24 24 * Theodore Ts'o, 2002 25 25 */ 26 26 27 - #include <linux/fs.h> 28 - #include <linux/pagemap.h> 29 - #include <linux/jbd.h> 30 - #include <linux/time.h> 31 - #include <linux/ext3_fs.h> 32 - #include <linux/ext3_jbd.h> 33 - #include <linux/fcntl.h> 34 - #include <linux/stat.h> 35 - #include <linux/string.h> 36 27 #include <linux/quotaops.h> 37 - #include <linux/buffer_head.h> 38 - #include <linux/bio.h> 39 - #include <trace/events/ext3.h> 40 - 28 + #include "ext3.h" 41 29 #include "namei.h" 42 30 #include "xattr.h" 43 31 #include "acl.h"
+1 -4
fs/ext3/resize.c
··· 11 11 12 12 #define EXT3FS_DEBUG 13 13 14 - #include <linux/ext3_jbd.h> 15 - 16 - #include <linux/errno.h> 17 - #include <linux/slab.h> 14 + #include "ext3.h" 18 15 19 16 20 17 #define outside(b, first, last) ((b) < (first) || (b) >= (last))
+4 -14
fs/ext3/super.c
··· 17 17 */ 18 18 19 19 #include <linux/module.h> 20 - #include <linux/string.h> 21 - #include <linux/fs.h> 22 - #include <linux/time.h> 23 - #include <linux/jbd.h> 24 - #include <linux/ext3_fs.h> 25 - #include <linux/ext3_jbd.h> 26 - #include <linux/slab.h> 27 - #include <linux/init.h> 28 20 #include <linux/blkdev.h> 29 21 #include <linux/parser.h> 30 - #include <linux/buffer_head.h> 31 22 #include <linux/exportfs.h> 32 - #include <linux/vfs.h> 23 + #include <linux/statfs.h> 33 24 #include <linux/random.h> 34 25 #include <linux/mount.h> 35 - #include <linux/namei.h> 36 26 #include <linux/quotaops.h> 37 27 #include <linux/seq_file.h> 38 28 #include <linux/log2.h> ··· 30 40 31 41 #include <asm/uaccess.h> 32 42 43 + #define CREATE_TRACE_POINTS 44 + 45 + #include "ext3.h" 33 46 #include "xattr.h" 34 47 #include "acl.h" 35 48 #include "namei.h" 36 - 37 - #define CREATE_TRACE_POINTS 38 - #include <trace/events/ext3.h> 39 49 40 50 #ifdef CONFIG_EXT3_DEFAULTS_TO_ORDERED 41 51 #define EXT3_MOUNT_DEFAULT_DATA_MODE EXT3_MOUNT_ORDERED_DATA
+1 -3
fs/ext3/symlink.c
··· 17 17 * ext3 symlink handling code 18 18 */ 19 19 20 - #include <linux/fs.h> 21 - #include <linux/jbd.h> 22 - #include <linux/ext3_fs.h> 23 20 #include <linux/namei.h> 21 + #include "ext3.h" 24 22 #include "xattr.h" 25 23 26 24 static void * ext3_follow_link(struct dentry *dentry, struct nameidata *nd)
+1 -6
fs/ext3/xattr.c
··· 50 50 * by the buffer lock. 51 51 */ 52 52 53 - #include <linux/init.h> 54 - #include <linux/fs.h> 55 - #include <linux/slab.h> 56 - #include <linux/ext3_jbd.h> 57 - #include <linux/ext3_fs.h> 53 + #include "ext3.h" 58 54 #include <linux/mbcache.h> 59 55 #include <linux/quotaops.h> 60 - #include <linux/rwsem.h> 61 56 #include "xattr.h" 62 57 #include "acl.h" 63 58
+1 -5
fs/ext3/xattr_security.c
··· 3 3 * Handler for storing security labels as extended attributes. 4 4 */ 5 5 6 - #include <linux/slab.h> 7 - #include <linux/string.h> 8 - #include <linux/fs.h> 9 - #include <linux/ext3_jbd.h> 10 - #include <linux/ext3_fs.h> 11 6 #include <linux/security.h> 7 + #include "ext3.h" 12 8 #include "xattr.h" 13 9 14 10 static size_t
+1 -5
fs/ext3/xattr_trusted.c
··· 5 5 * Copyright (C) 2003 by Andreas Gruenbacher, <a.gruenbacher@computer.org> 6 6 */ 7 7 8 - #include <linux/string.h> 9 - #include <linux/capability.h> 10 - #include <linux/fs.h> 11 - #include <linux/ext3_jbd.h> 12 - #include <linux/ext3_fs.h> 8 + #include "ext3.h" 13 9 #include "xattr.h" 14 10 15 11 static size_t
+1 -4
fs/ext3/xattr_user.c
··· 5 5 * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> 6 6 */ 7 7 8 - #include <linux/string.h> 9 - #include <linux/fs.h> 10 - #include <linux/ext3_jbd.h> 11 - #include <linux/ext3_fs.h> 8 + #include "ext3.h" 12 9 #include "xattr.h" 13 10 14 11 static size_t
-1
fs/gfs2/file.c
··· 18 18 #include <linux/mount.h> 19 19 #include <linux/fs.h> 20 20 #include <linux/gfs2_ondisk.h> 21 - #include <linux/ext2_fs.h> 22 21 #include <linux/falloc.h> 23 22 #include <linux/swap.h> 24 23 #include <linux/crc32.h>
+85 -124
fs/namei.c
··· 1054 1054 } 1055 1055 1056 1056 /* 1057 - * Allocate a dentry with name and parent, and perform a parent 1058 - * directory ->lookup on it. Returns the new dentry, or ERR_PTR 1059 - * on error. parent->d_inode->i_mutex must be held. d_lookup must 1060 - * have verified that no child exists while under i_mutex. 1057 + * This looks up the name in dcache, possibly revalidates the old dentry and 1058 + * allocates a new one if not found or not valid. In the need_lookup argument 1059 + * returns whether i_op->lookup is necessary. 1060 + * 1061 + * dir->d_inode->i_mutex must be held 1061 1062 */ 1062 - static struct dentry *d_alloc_and_lookup(struct dentry *parent, 1063 - struct qstr *name, struct nameidata *nd) 1063 + static struct dentry *lookup_dcache(struct qstr *name, struct dentry *dir, 1064 + struct nameidata *nd, bool *need_lookup) 1064 1065 { 1065 - struct inode *inode = parent->d_inode; 1066 1066 struct dentry *dentry; 1067 + int error; 1068 + 1069 + *need_lookup = false; 1070 + dentry = d_lookup(dir, name); 1071 + if (dentry) { 1072 + if (d_need_lookup(dentry)) { 1073 + *need_lookup = true; 1074 + } else if (dentry->d_flags & DCACHE_OP_REVALIDATE) { 1075 + error = d_revalidate(dentry, nd); 1076 + if (unlikely(error <= 0)) { 1077 + if (error < 0) { 1078 + dput(dentry); 1079 + return ERR_PTR(error); 1080 + } else if (!d_invalidate(dentry)) { 1081 + dput(dentry); 1082 + dentry = NULL; 1083 + } 1084 + } 1085 + } 1086 + } 1087 + 1088 + if (!dentry) { 1089 + dentry = d_alloc(dir, name); 1090 + if (unlikely(!dentry)) 1091 + return ERR_PTR(-ENOMEM); 1092 + 1093 + *need_lookup = true; 1094 + } 1095 + return dentry; 1096 + } 1097 + 1098 + /* 1099 + * Call i_op->lookup on the dentry. The dentry must be negative but may be 1100 + * hashed if it was pouplated with DCACHE_NEED_LOOKUP. 1101 + * 1102 + * dir->d_inode->i_mutex must be held 1103 + */ 1104 + static struct dentry *lookup_real(struct inode *dir, struct dentry *dentry, 1105 + struct nameidata *nd) 1106 + { 1067 1107 struct dentry *old; 1068 1108 1069 1109 /* Don't create child dentry for a dead directory. */ 1070 - if (unlikely(IS_DEADDIR(inode))) 1110 + if (unlikely(IS_DEADDIR(dir))) { 1111 + dput(dentry); 1071 1112 return ERR_PTR(-ENOENT); 1113 + } 1072 1114 1073 - dentry = d_alloc(parent, name); 1074 - if (unlikely(!dentry)) 1075 - return ERR_PTR(-ENOMEM); 1076 - 1077 - old = inode->i_op->lookup(inode, dentry, nd); 1115 + old = dir->i_op->lookup(dir, dentry, nd); 1078 1116 if (unlikely(old)) { 1079 1117 dput(dentry); 1080 1118 dentry = old; ··· 1120 1082 return dentry; 1121 1083 } 1122 1084 1123 - /* 1124 - * We already have a dentry, but require a lookup to be performed on the parent 1125 - * directory to fill in d_inode. Returns the new dentry, or ERR_PTR on error. 1126 - * parent->d_inode->i_mutex must be held. d_lookup must have verified that no 1127 - * child exists while under i_mutex. 1128 - */ 1129 - static struct dentry *d_inode_lookup(struct dentry *parent, struct dentry *dentry, 1130 - struct nameidata *nd) 1085 + static struct dentry *__lookup_hash(struct qstr *name, 1086 + struct dentry *base, struct nameidata *nd) 1131 1087 { 1132 - struct inode *inode = parent->d_inode; 1133 - struct dentry *old; 1088 + bool need_lookup; 1089 + struct dentry *dentry; 1134 1090 1135 - /* Don't create child dentry for a dead directory. */ 1136 - if (unlikely(IS_DEADDIR(inode))) { 1137 - dput(dentry); 1138 - return ERR_PTR(-ENOENT); 1139 - } 1091 + dentry = lookup_dcache(name, base, nd, &need_lookup); 1092 + if (!need_lookup) 1093 + return dentry; 1140 1094 1141 - old = inode->i_op->lookup(inode, dentry, nd); 1142 - if (unlikely(old)) { 1143 - dput(dentry); 1144 - dentry = old; 1145 - } 1146 - return dentry; 1095 + return lookup_real(base->d_inode, dentry, nd); 1147 1096 } 1148 1097 1149 1098 /* ··· 1164 1139 return -ECHILD; 1165 1140 nd->seq = seq; 1166 1141 1142 + if (unlikely(d_need_lookup(dentry))) 1143 + goto unlazy; 1167 1144 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) { 1168 1145 status = d_revalidate(dentry, nd); 1169 1146 if (unlikely(status <= 0)) { ··· 1174 1147 goto unlazy; 1175 1148 } 1176 1149 } 1177 - if (unlikely(d_need_lookup(dentry))) 1178 - goto unlazy; 1179 1150 path->mnt = mnt; 1180 1151 path->dentry = dentry; 1181 1152 if (unlikely(!__follow_mount_rcu(nd, path, inode))) ··· 1188 1163 dentry = __d_lookup(parent, name); 1189 1164 } 1190 1165 1191 - if (dentry && unlikely(d_need_lookup(dentry))) { 1192 - dput(dentry); 1193 - dentry = NULL; 1194 - } 1195 - retry: 1196 - if (unlikely(!dentry)) { 1197 - struct inode *dir = parent->d_inode; 1198 - BUG_ON(nd->inode != dir); 1166 + if (unlikely(!dentry)) 1167 + goto need_lookup; 1199 1168 1200 - mutex_lock(&dir->i_mutex); 1201 - dentry = d_lookup(parent, name); 1202 - if (likely(!dentry)) { 1203 - dentry = d_alloc_and_lookup(parent, name, nd); 1204 - if (IS_ERR(dentry)) { 1205 - mutex_unlock(&dir->i_mutex); 1206 - return PTR_ERR(dentry); 1207 - } 1208 - /* known good */ 1209 - need_reval = 0; 1210 - status = 1; 1211 - } else if (unlikely(d_need_lookup(dentry))) { 1212 - dentry = d_inode_lookup(parent, dentry, nd); 1213 - if (IS_ERR(dentry)) { 1214 - mutex_unlock(&dir->i_mutex); 1215 - return PTR_ERR(dentry); 1216 - } 1217 - /* known good */ 1218 - need_reval = 0; 1219 - status = 1; 1220 - } 1221 - mutex_unlock(&dir->i_mutex); 1169 + if (unlikely(d_need_lookup(dentry))) { 1170 + dput(dentry); 1171 + goto need_lookup; 1222 1172 } 1173 + 1223 1174 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval) 1224 1175 status = d_revalidate(dentry, nd); 1225 1176 if (unlikely(status <= 0)) { ··· 1205 1204 } 1206 1205 if (!d_invalidate(dentry)) { 1207 1206 dput(dentry); 1208 - dentry = NULL; 1209 - need_reval = 1; 1210 - goto retry; 1207 + goto need_lookup; 1211 1208 } 1212 1209 } 1213 - 1210 + done: 1214 1211 path->mnt = mnt; 1215 1212 path->dentry = dentry; 1216 1213 err = follow_managed(path, nd->flags); ··· 1220 1221 nd->flags |= LOOKUP_JUMPED; 1221 1222 *inode = path->dentry->d_inode; 1222 1223 return 0; 1224 + 1225 + need_lookup: 1226 + BUG_ON(nd->inode != parent->d_inode); 1227 + 1228 + mutex_lock(&parent->d_inode->i_mutex); 1229 + dentry = __lookup_hash(name, parent, nd); 1230 + mutex_unlock(&parent->d_inode->i_mutex); 1231 + if (IS_ERR(dentry)) 1232 + return PTR_ERR(dentry); 1233 + goto done; 1223 1234 } 1224 1235 1225 1236 static inline int may_lookup(struct nameidata *nd) ··· 1855 1846 return err; 1856 1847 } 1857 1848 1858 - static struct dentry *__lookup_hash(struct qstr *name, 1859 - struct dentry *base, struct nameidata *nd) 1860 - { 1861 - struct inode *inode = base->d_inode; 1862 - struct dentry *dentry; 1863 - int err; 1864 - 1865 - err = inode_permission(inode, MAY_EXEC); 1866 - if (err) 1867 - return ERR_PTR(err); 1868 - 1869 - /* 1870 - * Don't bother with __d_lookup: callers are for creat as 1871 - * well as unlink, so a lot of the time it would cost 1872 - * a double lookup. 1873 - */ 1874 - dentry = d_lookup(base, name); 1875 - 1876 - if (dentry && d_need_lookup(dentry)) { 1877 - /* 1878 - * __lookup_hash is called with the parent dir's i_mutex already 1879 - * held, so we are good to go here. 1880 - */ 1881 - dentry = d_inode_lookup(base, dentry, nd); 1882 - if (IS_ERR(dentry)) 1883 - return dentry; 1884 - } 1885 - 1886 - if (dentry && (dentry->d_flags & DCACHE_OP_REVALIDATE)) { 1887 - int status = d_revalidate(dentry, nd); 1888 - if (unlikely(status <= 0)) { 1889 - /* 1890 - * The dentry failed validation. 1891 - * If d_revalidate returned 0 attempt to invalidate 1892 - * the dentry otherwise d_revalidate is asking us 1893 - * to return a fail status. 1894 - */ 1895 - if (status < 0) { 1896 - dput(dentry); 1897 - return ERR_PTR(status); 1898 - } else if (!d_invalidate(dentry)) { 1899 - dput(dentry); 1900 - dentry = NULL; 1901 - } 1902 - } 1903 - } 1904 - 1905 - if (!dentry) 1906 - dentry = d_alloc_and_lookup(base, name, nd); 1907 - 1908 - return dentry; 1909 - } 1910 - 1911 1849 /* 1912 1850 * Restricted form of lookup. Doesn't follow links, single-component only, 1913 1851 * needs parent already locked. Doesn't follow mounts. ··· 1880 1924 { 1881 1925 struct qstr this; 1882 1926 unsigned int c; 1927 + int err; 1883 1928 1884 1929 WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex)); 1885 1930 ··· 1904 1947 if (err < 0) 1905 1948 return ERR_PTR(err); 1906 1949 } 1950 + 1951 + err = inode_permission(base->d_inode, MAY_EXEC); 1952 + if (err) 1953 + return ERR_PTR(err); 1907 1954 1908 1955 return __lookup_hash(&this, base, NULL); 1909 1956 } ··· 2710 2749 2711 2750 /* 2712 2751 * The dentry_unhash() helper will try to drop the dentry early: we 2713 - * should have a usage count of 2 if we're the only user of this 2752 + * should have a usage count of 1 if we're the only user of this 2714 2753 * dentry, and if that is true (possibly after pruning the dcache), 2715 2754 * then we drop the dentry now. 2716 2755 *
-2
fs/ocfs2/ioctl.c
··· 28 28 #include "suballoc.h" 29 29 #include "move_extents.h" 30 30 31 - #include <linux/ext2_fs.h> 32 - 33 31 #define o2info_from_user(a, b) \ 34 32 copy_from_user(&(a), (b), sizeof(a)) 35 33 #define o2info_to_user(a, b) \
+8 -18
fs/pstore/inode.c
··· 105 105 .unlink = pstore_unlink, 106 106 }; 107 107 108 - static struct inode *pstore_get_inode(struct super_block *sb, 109 - const struct inode *dir, int mode, dev_t dev) 108 + static struct inode *pstore_get_inode(struct super_block *sb) 110 109 { 111 110 struct inode *inode = new_inode(sb); 112 - 113 111 if (inode) { 114 112 inode->i_ino = get_next_ino(); 115 - inode->i_uid = inode->i_gid = 0; 116 - inode->i_mode = mode; 117 113 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; 118 - switch (mode & S_IFMT) { 119 - case S_IFREG: 120 - inode->i_fop = &pstore_file_operations; 121 - break; 122 - case S_IFDIR: 123 - inode->i_op = &pstore_dir_inode_operations; 124 - inode->i_fop = &simple_dir_operations; 125 - inc_nlink(inode); 126 - break; 127 - } 128 114 } 129 115 return inode; 130 116 } ··· 202 216 return rc; 203 217 204 218 rc = -ENOMEM; 205 - inode = pstore_get_inode(pstore_sb, root->d_inode, S_IFREG | 0444, 0); 219 + inode = pstore_get_inode(pstore_sb); 206 220 if (!inode) 207 221 goto fail; 222 + inode->i_mode = S_IFREG | 0444; 223 + inode->i_fop = &pstore_file_operations; 208 224 private = kmalloc(sizeof *private + size, GFP_KERNEL); 209 225 if (!private) 210 226 goto fail_alloc; ··· 281 293 282 294 parse_options(data); 283 295 284 - inode = pstore_get_inode(sb, NULL, S_IFDIR | 0755, 0); 296 + inode = pstore_get_inode(sb); 285 297 if (inode) { 286 - /* override ramfs "dir" options so we catch unlink(2) */ 298 + inode->i_mode = S_IFDIR | 0755; 287 299 inode->i_op = &pstore_dir_inode_operations; 300 + inode->i_fop = &simple_dir_operations; 301 + inc_nlink(inode); 288 302 } 289 303 sb->s_root = d_make_root(inode); 290 304 if (!sb->s_root)
-1
include/linux/Kbuild
··· 120 120 header-y += errqueue.h 121 121 header-y += ethtool.h 122 122 header-y += eventpoll.h 123 - header-y += ext2_fs.h 124 123 header-y += fadvise.h 125 124 header-y += falloc.h 126 125 header-y += fanotify.h
+10 -559
include/linux/ext2_fs.h
··· 18 18 19 19 #include <linux/types.h> 20 20 #include <linux/magic.h> 21 - #include <linux/fs.h> 22 21 23 - /* 24 - * The second extended filesystem constants/structures 25 - */ 26 - 27 - /* 28 - * Define EXT2FS_DEBUG to produce debug messages 29 - */ 30 - #undef EXT2FS_DEBUG 31 - 32 - /* 33 - * Define EXT2_RESERVATION to reserve data blocks for expanding files 34 - */ 35 - #define EXT2_DEFAULT_RESERVE_BLOCKS 8 36 - /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */ 37 - #define EXT2_MAX_RESERVE_BLOCKS 1027 38 - #define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0 39 - /* 40 - * The second extended file system version 41 - */ 42 - #define EXT2FS_DATE "95/08/09" 43 - #define EXT2FS_VERSION "0.5b" 44 - 45 - /* 46 - * Debug code 47 - */ 48 - #ifdef EXT2FS_DEBUG 49 - # define ext2_debug(f, a...) { \ 50 - printk ("EXT2-fs DEBUG (%s, %d): %s:", \ 51 - __FILE__, __LINE__, __func__); \ 52 - printk (f, ## a); \ 53 - } 54 - #else 55 - # define ext2_debug(f, a...) /**/ 56 - #endif 57 - 58 - /* 59 - * Special inode numbers 60 - */ 61 - #define EXT2_BAD_INO 1 /* Bad blocks inode */ 62 - #define EXT2_ROOT_INO 2 /* Root inode */ 63 - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ 64 - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ 65 - 66 - /* First non-reserved inode for old ext2 filesystems */ 67 - #define EXT2_GOOD_OLD_FIRST_INO 11 68 - 69 - #ifdef __KERNEL__ 70 - #include <linux/ext2_fs_sb.h> 71 - static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb) 72 - { 73 - return sb->s_fs_info; 74 - } 75 - #else 76 - /* Assume that user mode programs are passing in an ext2fs superblock, not 77 - * a kernel struct super_block. This will allow us to call the feature-test 78 - * macros from user land. */ 79 - #define EXT2_SB(sb) (sb) 80 - #endif 22 + #define EXT2_NAME_LEN 255 81 23 82 24 /* 83 25 * Maximal count of links to a file 84 26 */ 85 27 #define EXT2_LINK_MAX 32000 86 28 87 - /* 88 - * Macro-instructions used to manage several block sizes 89 - */ 90 - #define EXT2_MIN_BLOCK_SIZE 1024 91 - #define EXT2_MAX_BLOCK_SIZE 4096 92 - #define EXT2_MIN_BLOCK_LOG_SIZE 10 93 - #ifdef __KERNEL__ 94 - # define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize) 95 - #else 96 - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) 97 - #endif 98 - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) 99 - #ifdef __KERNEL__ 100 - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 101 - #else 102 - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) 103 - #endif 104 - #ifdef __KERNEL__ 105 - #define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits) 106 - #define EXT2_INODE_SIZE(s) (EXT2_SB(s)->s_inode_size) 107 - #define EXT2_FIRST_INO(s) (EXT2_SB(s)->s_first_ino) 108 - #else 109 - #define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ 110 - EXT2_GOOD_OLD_INODE_SIZE : \ 111 - (s)->s_inode_size) 112 - #define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ 113 - EXT2_GOOD_OLD_FIRST_INO : \ 114 - (s)->s_first_ino) 115 - #endif 29 + #define EXT2_SB_MAGIC_OFFSET 0x38 30 + #define EXT2_SB_BLOCKS_OFFSET 0x04 31 + #define EXT2_SB_BSIZE_OFFSET 0x18 116 32 117 - /* 118 - * Macro-instructions used to manage fragments 119 - */ 120 - #define EXT2_MIN_FRAG_SIZE 1024 121 - #define EXT2_MAX_FRAG_SIZE 4096 122 - #define EXT2_MIN_FRAG_LOG_SIZE 10 123 - #ifdef __KERNEL__ 124 - # define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->s_frag_size) 125 - # define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->s_frags_per_block) 126 - #else 127 - # define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size) 128 - # define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s)) 129 - #endif 130 - 131 - /* 132 - * Structure of a blocks group descriptor 133 - */ 134 - struct ext2_group_desc 33 + static inline u64 ext2_image_size(void *ext2_sb) 135 34 { 136 - __le32 bg_block_bitmap; /* Blocks bitmap block */ 137 - __le32 bg_inode_bitmap; /* Inodes bitmap block */ 138 - __le32 bg_inode_table; /* Inodes table block */ 139 - __le16 bg_free_blocks_count; /* Free blocks count */ 140 - __le16 bg_free_inodes_count; /* Free inodes count */ 141 - __le16 bg_used_dirs_count; /* Directories count */ 142 - __le16 bg_pad; 143 - __le32 bg_reserved[3]; 144 - }; 145 - 146 - /* 147 - * Macro-instructions used to manage group descriptors 148 - */ 149 - #ifdef __KERNEL__ 150 - # define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group) 151 - # define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->s_desc_per_block) 152 - # define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group) 153 - # define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits) 154 - #else 155 - # define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) 156 - # define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) 157 - # define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) 158 - #endif 159 - 160 - /* 161 - * Constants relative to the data blocks 162 - */ 163 - #define EXT2_NDIR_BLOCKS 12 164 - #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS 165 - #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) 166 - #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) 167 - #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) 168 - 169 - /* 170 - * Inode flags (GETFLAGS/SETFLAGS) 171 - */ 172 - #define EXT2_SECRM_FL FS_SECRM_FL /* Secure deletion */ 173 - #define EXT2_UNRM_FL FS_UNRM_FL /* Undelete */ 174 - #define EXT2_COMPR_FL FS_COMPR_FL /* Compress file */ 175 - #define EXT2_SYNC_FL FS_SYNC_FL /* Synchronous updates */ 176 - #define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */ 177 - #define EXT2_APPEND_FL FS_APPEND_FL /* writes to file may only append */ 178 - #define EXT2_NODUMP_FL FS_NODUMP_FL /* do not dump file */ 179 - #define EXT2_NOATIME_FL FS_NOATIME_FL /* do not update atime */ 180 - /* Reserved for compression usage... */ 181 - #define EXT2_DIRTY_FL FS_DIRTY_FL 182 - #define EXT2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */ 183 - #define EXT2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */ 184 - #define EXT2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */ 185 - /* End compression flags --- maybe not all used */ 186 - #define EXT2_BTREE_FL FS_BTREE_FL /* btree format dir */ 187 - #define EXT2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */ 188 - #define EXT2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */ 189 - #define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */ 190 - #define EXT2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */ 191 - #define EXT2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */ 192 - #define EXT2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/ 193 - #define EXT2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */ 194 - 195 - #define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */ 196 - #define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */ 197 - 198 - /* Flags that should be inherited by new inodes from their parent. */ 199 - #define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\ 200 - EXT2_SYNC_FL | EXT2_NODUMP_FL |\ 201 - EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\ 202 - EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ 203 - EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) 204 - 205 - /* Flags that are appropriate for regular files (all but dir-specific ones). */ 206 - #define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL)) 207 - 208 - /* Flags that are appropriate for non-directories/regular files. */ 209 - #define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL) 210 - 211 - /* Mask out flags that are inappropriate for the given type of inode. */ 212 - static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags) 213 - { 214 - if (S_ISDIR(mode)) 215 - return flags; 216 - else if (S_ISREG(mode)) 217 - return flags & EXT2_REG_FLMASK; 218 - else 219 - return flags & EXT2_OTHER_FLMASK; 35 + __u8 *p = ext2_sb; 36 + if (*(__le16 *)(p + EXT2_SB_MAGIC_OFFSET) != cpu_to_le16(EXT2_SUPER_MAGIC)) 37 + return 0; 38 + return (u64)le32_to_cpup((__le32 *)(p + EXT2_SB_BLOCKS_OFFSET)) << 39 + le32_to_cpup((__le32 *)(p + EXT2_SB_BSIZE_OFFSET)); 220 40 } 221 - 222 - /* 223 - * ioctl commands 224 - */ 225 - #define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS 226 - #define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS 227 - #define EXT2_IOC_GETVERSION FS_IOC_GETVERSION 228 - #define EXT2_IOC_SETVERSION FS_IOC_SETVERSION 229 - #define EXT2_IOC_GETRSVSZ _IOR('f', 5, long) 230 - #define EXT2_IOC_SETRSVSZ _IOW('f', 6, long) 231 - 232 - /* 233 - * ioctl commands in 32 bit emulation 234 - */ 235 - #define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS 236 - #define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS 237 - #define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION 238 - #define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION 239 - 240 - /* 241 - * Structure of an inode on the disk 242 - */ 243 - struct ext2_inode { 244 - __le16 i_mode; /* File mode */ 245 - __le16 i_uid; /* Low 16 bits of Owner Uid */ 246 - __le32 i_size; /* Size in bytes */ 247 - __le32 i_atime; /* Access time */ 248 - __le32 i_ctime; /* Creation time */ 249 - __le32 i_mtime; /* Modification time */ 250 - __le32 i_dtime; /* Deletion Time */ 251 - __le16 i_gid; /* Low 16 bits of Group Id */ 252 - __le16 i_links_count; /* Links count */ 253 - __le32 i_blocks; /* Blocks count */ 254 - __le32 i_flags; /* File flags */ 255 - union { 256 - struct { 257 - __le32 l_i_reserved1; 258 - } linux1; 259 - struct { 260 - __le32 h_i_translator; 261 - } hurd1; 262 - struct { 263 - __le32 m_i_reserved1; 264 - } masix1; 265 - } osd1; /* OS dependent 1 */ 266 - __le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ 267 - __le32 i_generation; /* File version (for NFS) */ 268 - __le32 i_file_acl; /* File ACL */ 269 - __le32 i_dir_acl; /* Directory ACL */ 270 - __le32 i_faddr; /* Fragment address */ 271 - union { 272 - struct { 273 - __u8 l_i_frag; /* Fragment number */ 274 - __u8 l_i_fsize; /* Fragment size */ 275 - __u16 i_pad1; 276 - __le16 l_i_uid_high; /* these 2 fields */ 277 - __le16 l_i_gid_high; /* were reserved2[0] */ 278 - __u32 l_i_reserved2; 279 - } linux2; 280 - struct { 281 - __u8 h_i_frag; /* Fragment number */ 282 - __u8 h_i_fsize; /* Fragment size */ 283 - __le16 h_i_mode_high; 284 - __le16 h_i_uid_high; 285 - __le16 h_i_gid_high; 286 - __le32 h_i_author; 287 - } hurd2; 288 - struct { 289 - __u8 m_i_frag; /* Fragment number */ 290 - __u8 m_i_fsize; /* Fragment size */ 291 - __u16 m_pad1; 292 - __u32 m_i_reserved2[2]; 293 - } masix2; 294 - } osd2; /* OS dependent 2 */ 295 - }; 296 - 297 - #define i_size_high i_dir_acl 298 - 299 - #if defined(__KERNEL__) || defined(__linux__) 300 - #define i_reserved1 osd1.linux1.l_i_reserved1 301 - #define i_frag osd2.linux2.l_i_frag 302 - #define i_fsize osd2.linux2.l_i_fsize 303 - #define i_uid_low i_uid 304 - #define i_gid_low i_gid 305 - #define i_uid_high osd2.linux2.l_i_uid_high 306 - #define i_gid_high osd2.linux2.l_i_gid_high 307 - #define i_reserved2 osd2.linux2.l_i_reserved2 308 - #endif 309 - 310 - #ifdef __hurd__ 311 - #define i_translator osd1.hurd1.h_i_translator 312 - #define i_frag osd2.hurd2.h_i_frag 313 - #define i_fsize osd2.hurd2.h_i_fsize 314 - #define i_uid_high osd2.hurd2.h_i_uid_high 315 - #define i_gid_high osd2.hurd2.h_i_gid_high 316 - #define i_author osd2.hurd2.h_i_author 317 - #endif 318 - 319 - #ifdef __masix__ 320 - #define i_reserved1 osd1.masix1.m_i_reserved1 321 - #define i_frag osd2.masix2.m_i_frag 322 - #define i_fsize osd2.masix2.m_i_fsize 323 - #define i_reserved2 osd2.masix2.m_i_reserved2 324 - #endif 325 - 326 - /* 327 - * File system states 328 - */ 329 - #define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ 330 - #define EXT2_ERROR_FS 0x0002 /* Errors detected */ 331 - 332 - /* 333 - * Mount flags 334 - */ 335 - #define EXT2_MOUNT_CHECK 0x000001 /* Do mount-time checks */ 336 - #define EXT2_MOUNT_OLDALLOC 0x000002 /* Don't use the new Orlov allocator */ 337 - #define EXT2_MOUNT_GRPID 0x000004 /* Create files with directory's group */ 338 - #define EXT2_MOUNT_DEBUG 0x000008 /* Some debugging messages */ 339 - #define EXT2_MOUNT_ERRORS_CONT 0x000010 /* Continue on errors */ 340 - #define EXT2_MOUNT_ERRORS_RO 0x000020 /* Remount fs ro on errors */ 341 - #define EXT2_MOUNT_ERRORS_PANIC 0x000040 /* Panic on errors */ 342 - #define EXT2_MOUNT_MINIX_DF 0x000080 /* Mimics the Minix statfs */ 343 - #define EXT2_MOUNT_NOBH 0x000100 /* No buffer_heads */ 344 - #define EXT2_MOUNT_NO_UID32 0x000200 /* Disable 32-bit UIDs */ 345 - #define EXT2_MOUNT_XATTR_USER 0x004000 /* Extended user attributes */ 346 - #define EXT2_MOUNT_POSIX_ACL 0x008000 /* POSIX Access Control Lists */ 347 - #define EXT2_MOUNT_XIP 0x010000 /* Execute in place */ 348 - #define EXT2_MOUNT_USRQUOTA 0x020000 /* user quota */ 349 - #define EXT2_MOUNT_GRPQUOTA 0x040000 /* group quota */ 350 - #define EXT2_MOUNT_RESERVATION 0x080000 /* Preallocation */ 351 - 352 - 353 - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt 354 - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt 355 - #define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \ 356 - EXT2_MOUNT_##opt) 357 - /* 358 - * Maximal mount counts between two filesystem checks 359 - */ 360 - #define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ 361 - #define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */ 362 - 363 - /* 364 - * Behaviour when detecting errors 365 - */ 366 - #define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ 367 - #define EXT2_ERRORS_RO 2 /* Remount fs read-only */ 368 - #define EXT2_ERRORS_PANIC 3 /* Panic */ 369 - #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE 370 - 371 - /* 372 - * Structure of the super block 373 - */ 374 - struct ext2_super_block { 375 - __le32 s_inodes_count; /* Inodes count */ 376 - __le32 s_blocks_count; /* Blocks count */ 377 - __le32 s_r_blocks_count; /* Reserved blocks count */ 378 - __le32 s_free_blocks_count; /* Free blocks count */ 379 - __le32 s_free_inodes_count; /* Free inodes count */ 380 - __le32 s_first_data_block; /* First Data Block */ 381 - __le32 s_log_block_size; /* Block size */ 382 - __le32 s_log_frag_size; /* Fragment size */ 383 - __le32 s_blocks_per_group; /* # Blocks per group */ 384 - __le32 s_frags_per_group; /* # Fragments per group */ 385 - __le32 s_inodes_per_group; /* # Inodes per group */ 386 - __le32 s_mtime; /* Mount time */ 387 - __le32 s_wtime; /* Write time */ 388 - __le16 s_mnt_count; /* Mount count */ 389 - __le16 s_max_mnt_count; /* Maximal mount count */ 390 - __le16 s_magic; /* Magic signature */ 391 - __le16 s_state; /* File system state */ 392 - __le16 s_errors; /* Behaviour when detecting errors */ 393 - __le16 s_minor_rev_level; /* minor revision level */ 394 - __le32 s_lastcheck; /* time of last check */ 395 - __le32 s_checkinterval; /* max. time between checks */ 396 - __le32 s_creator_os; /* OS */ 397 - __le32 s_rev_level; /* Revision level */ 398 - __le16 s_def_resuid; /* Default uid for reserved blocks */ 399 - __le16 s_def_resgid; /* Default gid for reserved blocks */ 400 - /* 401 - * These fields are for EXT2_DYNAMIC_REV superblocks only. 402 - * 403 - * Note: the difference between the compatible feature set and 404 - * the incompatible feature set is that if there is a bit set 405 - * in the incompatible feature set that the kernel doesn't 406 - * know about, it should refuse to mount the filesystem. 407 - * 408 - * e2fsck's requirements are more strict; if it doesn't know 409 - * about a feature in either the compatible or incompatible 410 - * feature set, it must abort and not try to meddle with 411 - * things it doesn't understand... 412 - */ 413 - __le32 s_first_ino; /* First non-reserved inode */ 414 - __le16 s_inode_size; /* size of inode structure */ 415 - __le16 s_block_group_nr; /* block group # of this superblock */ 416 - __le32 s_feature_compat; /* compatible feature set */ 417 - __le32 s_feature_incompat; /* incompatible feature set */ 418 - __le32 s_feature_ro_compat; /* readonly-compatible feature set */ 419 - __u8 s_uuid[16]; /* 128-bit uuid for volume */ 420 - char s_volume_name[16]; /* volume name */ 421 - char s_last_mounted[64]; /* directory where last mounted */ 422 - __le32 s_algorithm_usage_bitmap; /* For compression */ 423 - /* 424 - * Performance hints. Directory preallocation should only 425 - * happen if the EXT2_COMPAT_PREALLOC flag is on. 426 - */ 427 - __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ 428 - __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ 429 - __u16 s_padding1; 430 - /* 431 - * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set. 432 - */ 433 - __u8 s_journal_uuid[16]; /* uuid of journal superblock */ 434 - __u32 s_journal_inum; /* inode number of journal file */ 435 - __u32 s_journal_dev; /* device number of journal file */ 436 - __u32 s_last_orphan; /* start of list of inodes to delete */ 437 - __u32 s_hash_seed[4]; /* HTREE hash seed */ 438 - __u8 s_def_hash_version; /* Default hash version to use */ 439 - __u8 s_reserved_char_pad; 440 - __u16 s_reserved_word_pad; 441 - __le32 s_default_mount_opts; 442 - __le32 s_first_meta_bg; /* First metablock block group */ 443 - __u32 s_reserved[190]; /* Padding to the end of the block */ 444 - }; 445 - 446 - /* 447 - * Codes for operating systems 448 - */ 449 - #define EXT2_OS_LINUX 0 450 - #define EXT2_OS_HURD 1 451 - #define EXT2_OS_MASIX 2 452 - #define EXT2_OS_FREEBSD 3 453 - #define EXT2_OS_LITES 4 454 - 455 - /* 456 - * Revision levels 457 - */ 458 - #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ 459 - #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ 460 - 461 - #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV 462 - #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV 463 - 464 - #define EXT2_GOOD_OLD_INODE_SIZE 128 465 - 466 - /* 467 - * Feature set definitions 468 - */ 469 - 470 - #define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ 471 - ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) 472 - #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ 473 - ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) ) 474 - #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ 475 - ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) 476 - #define EXT2_SET_COMPAT_FEATURE(sb,mask) \ 477 - EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask) 478 - #define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \ 479 - EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask) 480 - #define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \ 481 - EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask) 482 - #define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \ 483 - EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask) 484 - #define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \ 485 - EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask) 486 - #define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \ 487 - EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask) 488 - 489 - #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 490 - #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 491 - #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 492 - #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008 493 - #define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010 494 - #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020 495 - #define EXT2_FEATURE_COMPAT_ANY 0xffffffff 496 - 497 - #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 498 - #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 499 - #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 500 - #define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff 501 - 502 - #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 503 - #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 504 - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 505 - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 506 - #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 507 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff 508 - 509 - #define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR 510 - #define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \ 511 - EXT2_FEATURE_INCOMPAT_META_BG) 512 - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ 513 - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ 514 - EXT2_FEATURE_RO_COMPAT_BTREE_DIR) 515 - #define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP 516 - #define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP 517 - 518 - /* 519 - * Default values for user and/or group using reserved blocks 520 - */ 521 - #define EXT2_DEF_RESUID 0 522 - #define EXT2_DEF_RESGID 0 523 - 524 - /* 525 - * Default mount options 526 - */ 527 - #define EXT2_DEFM_DEBUG 0x0001 528 - #define EXT2_DEFM_BSDGROUPS 0x0002 529 - #define EXT2_DEFM_XATTR_USER 0x0004 530 - #define EXT2_DEFM_ACL 0x0008 531 - #define EXT2_DEFM_UID16 0x0010 532 - /* Not used by ext2, but reserved for use by ext3 */ 533 - #define EXT3_DEFM_JMODE 0x0060 534 - #define EXT3_DEFM_JMODE_DATA 0x0020 535 - #define EXT3_DEFM_JMODE_ORDERED 0x0040 536 - #define EXT3_DEFM_JMODE_WBACK 0x0060 537 - 538 - /* 539 - * Structure of a directory entry 540 - */ 541 - #define EXT2_NAME_LEN 255 542 - 543 - struct ext2_dir_entry { 544 - __le32 inode; /* Inode number */ 545 - __le16 rec_len; /* Directory entry length */ 546 - __le16 name_len; /* Name length */ 547 - char name[EXT2_NAME_LEN]; /* File name */ 548 - }; 549 - 550 - /* 551 - * The new version of the directory entry. Since EXT2 structures are 552 - * stored in intel byte order, and the name_len field could never be 553 - * bigger than 255 chars, it's safe to reclaim the extra byte for the 554 - * file_type field. 555 - */ 556 - struct ext2_dir_entry_2 { 557 - __le32 inode; /* Inode number */ 558 - __le16 rec_len; /* Directory entry length */ 559 - __u8 name_len; /* Name length */ 560 - __u8 file_type; 561 - char name[EXT2_NAME_LEN]; /* File name */ 562 - }; 563 - 564 - /* 565 - * Ext2 directory file types. Only the low 3 bits are used. The 566 - * other bits are reserved for now. 567 - */ 568 - enum { 569 - EXT2_FT_UNKNOWN = 0, 570 - EXT2_FT_REG_FILE = 1, 571 - EXT2_FT_DIR = 2, 572 - EXT2_FT_CHRDEV = 3, 573 - EXT2_FT_BLKDEV = 4, 574 - EXT2_FT_FIFO = 5, 575 - EXT2_FT_SOCK = 6, 576 - EXT2_FT_SYMLINK = 7, 577 - EXT2_FT_MAX 578 - }; 579 - 580 - /* 581 - * EXT2_DIR_PAD defines the directory entries boundaries 582 - * 583 - * NOTE: It must be a multiple of 4 584 - */ 585 - #define EXT2_DIR_PAD 4 586 - #define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) 587 - #define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ 588 - ~EXT2_DIR_ROUND) 589 - #define EXT2_MAX_REC_LEN ((1<<16)-1) 590 41 591 42 #endif /* _LINUX_EXT2_FS_H */
-126
include/linux/ext2_fs_sb.h
··· 1 - /* 2 - * linux/include/linux/ext2_fs_sb.h 3 - * 4 - * Copyright (C) 1992, 1993, 1994, 1995 5 - * Remy Card (card@masi.ibp.fr) 6 - * Laboratoire MASI - Institut Blaise Pascal 7 - * Universite Pierre et Marie Curie (Paris VI) 8 - * 9 - * from 10 - * 11 - * linux/include/linux/minix_fs_sb.h 12 - * 13 - * Copyright (C) 1991, 1992 Linus Torvalds 14 - */ 15 - 16 - #ifndef _LINUX_EXT2_FS_SB 17 - #define _LINUX_EXT2_FS_SB 18 - 19 - #include <linux/blockgroup_lock.h> 20 - #include <linux/percpu_counter.h> 21 - #include <linux/rbtree.h> 22 - 23 - /* XXX Here for now... not interested in restructing headers JUST now */ 24 - 25 - /* data type for block offset of block group */ 26 - typedef int ext2_grpblk_t; 27 - 28 - /* data type for filesystem-wide blocks number */ 29 - typedef unsigned long ext2_fsblk_t; 30 - 31 - #define E2FSBLK "%lu" 32 - 33 - struct ext2_reserve_window { 34 - ext2_fsblk_t _rsv_start; /* First byte reserved */ 35 - ext2_fsblk_t _rsv_end; /* Last byte reserved or 0 */ 36 - }; 37 - 38 - struct ext2_reserve_window_node { 39 - struct rb_node rsv_node; 40 - __u32 rsv_goal_size; 41 - __u32 rsv_alloc_hit; 42 - struct ext2_reserve_window rsv_window; 43 - }; 44 - 45 - struct ext2_block_alloc_info { 46 - /* information about reservation window */ 47 - struct ext2_reserve_window_node rsv_window_node; 48 - /* 49 - * was i_next_alloc_block in ext2_inode_info 50 - * is the logical (file-relative) number of the 51 - * most-recently-allocated block in this file. 52 - * We use this for detecting linearly ascending allocation requests. 53 - */ 54 - __u32 last_alloc_logical_block; 55 - /* 56 - * Was i_next_alloc_goal in ext2_inode_info 57 - * is the *physical* companion to i_next_alloc_block. 58 - * it the the physical block number of the block which was most-recentl 59 - * allocated to this file. This give us the goal (target) for the next 60 - * allocation when we detect linearly ascending requests. 61 - */ 62 - ext2_fsblk_t last_alloc_physical_block; 63 - }; 64 - 65 - #define rsv_start rsv_window._rsv_start 66 - #define rsv_end rsv_window._rsv_end 67 - 68 - /* 69 - * second extended-fs super-block data in memory 70 - */ 71 - struct ext2_sb_info { 72 - unsigned long s_frag_size; /* Size of a fragment in bytes */ 73 - unsigned long s_frags_per_block;/* Number of fragments per block */ 74 - unsigned long s_inodes_per_block;/* Number of inodes per block */ 75 - unsigned long s_frags_per_group;/* Number of fragments in a group */ 76 - unsigned long s_blocks_per_group;/* Number of blocks in a group */ 77 - unsigned long s_inodes_per_group;/* Number of inodes in a group */ 78 - unsigned long s_itb_per_group; /* Number of inode table blocks per group */ 79 - unsigned long s_gdb_count; /* Number of group descriptor blocks */ 80 - unsigned long s_desc_per_block; /* Number of group descriptors per block */ 81 - unsigned long s_groups_count; /* Number of groups in the fs */ 82 - unsigned long s_overhead_last; /* Last calculated overhead */ 83 - unsigned long s_blocks_last; /* Last seen block count */ 84 - struct buffer_head * s_sbh; /* Buffer containing the super block */ 85 - struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */ 86 - struct buffer_head ** s_group_desc; 87 - unsigned long s_mount_opt; 88 - unsigned long s_sb_block; 89 - uid_t s_resuid; 90 - gid_t s_resgid; 91 - unsigned short s_mount_state; 92 - unsigned short s_pad; 93 - int s_addr_per_block_bits; 94 - int s_desc_per_block_bits; 95 - int s_inode_size; 96 - int s_first_ino; 97 - spinlock_t s_next_gen_lock; 98 - u32 s_next_generation; 99 - unsigned long s_dir_count; 100 - u8 *s_debts; 101 - struct percpu_counter s_freeblocks_counter; 102 - struct percpu_counter s_freeinodes_counter; 103 - struct percpu_counter s_dirs_counter; 104 - struct blockgroup_lock *s_blockgroup_lock; 105 - /* root of the per fs reservation window tree */ 106 - spinlock_t s_rsv_window_lock; 107 - struct rb_root s_rsv_window_root; 108 - struct ext2_reserve_window_node s_rsv_window_head; 109 - /* 110 - * s_lock protects against concurrent modifications of s_mount_state, 111 - * s_blocks_last, s_overhead_last and the content of superblock's 112 - * buffer pointed to by sbi->s_es. 113 - * 114 - * Note: It is used in ext2_show_options() to provide a consistent view 115 - * of the mount options. 116 - */ 117 - spinlock_t s_lock; 118 - }; 119 - 120 - static inline spinlock_t * 121 - sb_bgl_lock(struct ext2_sb_info *sbi, unsigned int block_group) 122 - { 123 - return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); 124 - } 125 - 126 - #endif /* _LINUX_EXT2_FS_SB */
+415 -73
include/linux/ext3_fs.h fs/ext3/ext3.h
··· 1 1 /* 2 - * linux/include/linux/ext3_fs.h 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. 3 9 * 4 10 * Copyright (C) 1992, 1993, 1994, 1995 5 11 * Remy Card (card@masi.ibp.fr) ··· 19 13 * Copyright (C) 1991, 1992 Linus Torvalds 20 14 */ 21 15 22 - #ifndef _LINUX_EXT3_FS_H 23 - #define _LINUX_EXT3_FS_H 24 - 25 - #include <linux/types.h> 16 + #include <linux/fs.h> 17 + #include <linux/jbd.h> 26 18 #include <linux/magic.h> 27 19 #include <linux/bug.h> 20 + #include <linux/blockgroup_lock.h> 28 21 29 22 /* 30 23 * The second extended filesystem constants/structures ··· 80 75 #define EXT3_MIN_BLOCK_SIZE 1024 81 76 #define EXT3_MAX_BLOCK_SIZE 65536 82 77 #define EXT3_MIN_BLOCK_LOG_SIZE 10 83 - #ifdef __KERNEL__ 84 - # define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize) 85 - #else 86 - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) 87 - #endif 78 + #define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize) 88 79 #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) 89 - #ifdef __KERNEL__ 90 - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 91 - #else 92 - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) 93 - #endif 94 - #ifdef __KERNEL__ 80 + #define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 95 81 #define EXT3_ADDR_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_addr_per_block_bits) 96 82 #define EXT3_INODE_SIZE(s) (EXT3_SB(s)->s_inode_size) 97 83 #define EXT3_FIRST_INO(s) (EXT3_SB(s)->s_first_ino) 98 - #else 99 - #define EXT3_INODE_SIZE(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \ 100 - EXT3_GOOD_OLD_INODE_SIZE : \ 101 - (s)->s_inode_size) 102 - #define EXT3_FIRST_INO(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \ 103 - EXT3_GOOD_OLD_FIRST_INO : \ 104 - (s)->s_first_ino) 105 - #endif 106 84 107 85 /* 108 86 * Macro-instructions used to manage fragments ··· 93 105 #define EXT3_MIN_FRAG_SIZE 1024 94 106 #define EXT3_MAX_FRAG_SIZE 4096 95 107 #define EXT3_MIN_FRAG_LOG_SIZE 10 96 - #ifdef __KERNEL__ 97 - # define EXT3_FRAG_SIZE(s) (EXT3_SB(s)->s_frag_size) 98 - # define EXT3_FRAGS_PER_BLOCK(s) (EXT3_SB(s)->s_frags_per_block) 99 - #else 100 - # define EXT3_FRAG_SIZE(s) (EXT3_MIN_FRAG_SIZE << (s)->s_log_frag_size) 101 - # define EXT3_FRAGS_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / EXT3_FRAG_SIZE(s)) 102 - #endif 108 + #define EXT3_FRAG_SIZE(s) (EXT3_SB(s)->s_frag_size) 109 + #define EXT3_FRAGS_PER_BLOCK(s) (EXT3_SB(s)->s_frags_per_block) 103 110 104 111 /* 105 112 * Structure of a blocks group descriptor ··· 114 131 /* 115 132 * Macro-instructions used to manage group descriptors 116 133 */ 117 - #ifdef __KERNEL__ 118 - # define EXT3_BLOCKS_PER_GROUP(s) (EXT3_SB(s)->s_blocks_per_group) 119 - # define EXT3_DESC_PER_BLOCK(s) (EXT3_SB(s)->s_desc_per_block) 120 - # define EXT3_INODES_PER_GROUP(s) (EXT3_SB(s)->s_inodes_per_group) 121 - # define EXT3_DESC_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_desc_per_block_bits) 122 - #else 123 - # define EXT3_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) 124 - # define EXT3_DESC_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_group_desc)) 125 - # define EXT3_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) 126 - #endif 134 + #define EXT3_BLOCKS_PER_GROUP(s) (EXT3_SB(s)->s_blocks_per_group) 135 + #define EXT3_DESC_PER_BLOCK(s) (EXT3_SB(s)->s_desc_per_block) 136 + #define EXT3_INODES_PER_GROUP(s) (EXT3_SB(s)->s_inodes_per_group) 137 + #define EXT3_DESC_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_desc_per_block_bits) 127 138 128 139 /* 129 140 * Constants relative to the data blocks ··· 313 336 314 337 #define i_size_high i_dir_acl 315 338 316 - #if defined(__KERNEL__) || defined(__linux__) 317 339 #define i_reserved1 osd1.linux1.l_i_reserved1 318 340 #define i_frag osd2.linux2.l_i_frag 319 341 #define i_fsize osd2.linux2.l_i_fsize ··· 321 345 #define i_uid_high osd2.linux2.l_i_uid_high 322 346 #define i_gid_high osd2.linux2.l_i_gid_high 323 347 #define i_reserved2 osd2.linux2.l_i_reserved2 324 - 325 - #elif defined(__GNU__) 326 - 327 - #define i_translator osd1.hurd1.h_i_translator 328 - #define i_frag osd2.hurd2.h_i_frag; 329 - #define i_fsize osd2.hurd2.h_i_fsize; 330 - #define i_uid_high osd2.hurd2.h_i_uid_high 331 - #define i_gid_high osd2.hurd2.h_i_gid_high 332 - #define i_author osd2.hurd2.h_i_author 333 - 334 - #elif defined(__masix__) 335 - 336 - #define i_reserved1 osd1.masix1.m_i_reserved1 337 - #define i_frag osd2.masix2.m_i_frag 338 - #define i_fsize osd2.masix2.m_i_fsize 339 - #define i_reserved2 osd2.masix2.m_i_reserved2 340 - 341 - #endif /* defined(__KERNEL__) || defined(__linux__) */ 342 348 343 349 /* 344 350 * File system states ··· 489 531 __u32 s_reserved[162]; /* Padding to the end of the block */ 490 532 }; 491 533 492 - #ifdef __KERNEL__ 493 - #include <linux/ext3_fs_i.h> 494 - #include <linux/ext3_fs_sb.h> 534 + /* data type for block offset of block group */ 535 + typedef int ext3_grpblk_t; 536 + 537 + /* data type for filesystem-wide blocks number */ 538 + typedef unsigned long ext3_fsblk_t; 539 + 540 + #define E3FSBLK "%lu" 541 + 542 + struct ext3_reserve_window { 543 + ext3_fsblk_t _rsv_start; /* First byte reserved */ 544 + ext3_fsblk_t _rsv_end; /* Last byte reserved or 0 */ 545 + }; 546 + 547 + struct ext3_reserve_window_node { 548 + struct rb_node rsv_node; 549 + __u32 rsv_goal_size; 550 + __u32 rsv_alloc_hit; 551 + struct ext3_reserve_window rsv_window; 552 + }; 553 + 554 + struct ext3_block_alloc_info { 555 + /* information about reservation window */ 556 + struct ext3_reserve_window_node rsv_window_node; 557 + /* 558 + * was i_next_alloc_block in ext3_inode_info 559 + * is the logical (file-relative) number of the 560 + * most-recently-allocated block in this file. 561 + * We use this for detecting linearly ascending allocation requests. 562 + */ 563 + __u32 last_alloc_logical_block; 564 + /* 565 + * Was i_next_alloc_goal in ext3_inode_info 566 + * is the *physical* companion to i_next_alloc_block. 567 + * it the physical block number of the block which was most-recentl 568 + * allocated to this file. This give us the goal (target) for the next 569 + * allocation when we detect linearly ascending requests. 570 + */ 571 + ext3_fsblk_t last_alloc_physical_block; 572 + }; 573 + 574 + #define rsv_start rsv_window._rsv_start 575 + #define rsv_end rsv_window._rsv_end 576 + 577 + /* 578 + * third extended file system inode data in memory 579 + */ 580 + struct ext3_inode_info { 581 + __le32 i_data[15]; /* unconverted */ 582 + __u32 i_flags; 583 + #ifdef EXT3_FRAGMENTS 584 + __u32 i_faddr; 585 + __u8 i_frag_no; 586 + __u8 i_frag_size; 587 + #endif 588 + ext3_fsblk_t i_file_acl; 589 + __u32 i_dir_acl; 590 + __u32 i_dtime; 591 + 592 + /* 593 + * i_block_group is the number of the block group which contains 594 + * this file's inode. Constant across the lifetime of the inode, 595 + * it is ued for making block allocation decisions - we try to 596 + * place a file's data blocks near its inode block, and new inodes 597 + * near to their parent directory's inode. 598 + */ 599 + __u32 i_block_group; 600 + unsigned long i_state_flags; /* Dynamic state flags for ext3 */ 601 + 602 + /* block reservation info */ 603 + struct ext3_block_alloc_info *i_block_alloc_info; 604 + 605 + __u32 i_dir_start_lookup; 606 + #ifdef CONFIG_EXT3_FS_XATTR 607 + /* 608 + * Extended attributes can be read independently of the main file 609 + * data. Taking i_mutex even when reading would cause contention 610 + * between readers of EAs and writers of regular file data, so 611 + * instead we synchronize on xattr_sem when reading or changing 612 + * EAs. 613 + */ 614 + struct rw_semaphore xattr_sem; 615 + #endif 616 + 617 + struct list_head i_orphan; /* unlinked but open inodes */ 618 + 619 + /* 620 + * i_disksize keeps track of what the inode size is ON DISK, not 621 + * in memory. During truncate, i_size is set to the new size by 622 + * the VFS prior to calling ext3_truncate(), but the filesystem won't 623 + * set i_disksize to 0 until the truncate is actually under way. 624 + * 625 + * The intent is that i_disksize always represents the blocks which 626 + * are used by this file. This allows recovery to restart truncate 627 + * on orphans if we crash during truncate. We actually write i_disksize 628 + * into the on-disk inode when writing inodes out, instead of i_size. 629 + * 630 + * The only time when i_disksize and i_size may be different is when 631 + * a truncate is in progress. The only things which change i_disksize 632 + * are ext3_get_block (growth) and ext3_truncate (shrinkth). 633 + */ 634 + loff_t i_disksize; 635 + 636 + /* on-disk additional length */ 637 + __u16 i_extra_isize; 638 + 639 + /* 640 + * truncate_mutex is for serialising ext3_truncate() against 641 + * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's 642 + * data tree are chopped off during truncate. We can't do that in 643 + * ext3 because whenever we perform intermediate commits during 644 + * truncate, the inode and all the metadata blocks *must* be in a 645 + * consistent state which allows truncation of the orphans to restart 646 + * during recovery. Hence we must fix the get_block-vs-truncate race 647 + * by other means, so we have truncate_mutex. 648 + */ 649 + struct mutex truncate_mutex; 650 + 651 + /* 652 + * Transactions that contain inode's metadata needed to complete 653 + * fsync and fdatasync, respectively. 654 + */ 655 + atomic_t i_sync_tid; 656 + atomic_t i_datasync_tid; 657 + 658 + struct inode vfs_inode; 659 + }; 660 + 661 + /* 662 + * third extended-fs super-block data in memory 663 + */ 664 + struct ext3_sb_info { 665 + unsigned long s_frag_size; /* Size of a fragment in bytes */ 666 + unsigned long s_frags_per_block;/* Number of fragments per block */ 667 + unsigned long s_inodes_per_block;/* Number of inodes per block */ 668 + unsigned long s_frags_per_group;/* Number of fragments in a group */ 669 + unsigned long s_blocks_per_group;/* Number of blocks in a group */ 670 + unsigned long s_inodes_per_group;/* Number of inodes in a group */ 671 + unsigned long s_itb_per_group; /* Number of inode table blocks per group */ 672 + unsigned long s_gdb_count; /* Number of group descriptor blocks */ 673 + unsigned long s_desc_per_block; /* Number of group descriptors per block */ 674 + unsigned long s_groups_count; /* Number of groups in the fs */ 675 + unsigned long s_overhead_last; /* Last calculated overhead */ 676 + unsigned long s_blocks_last; /* Last seen block count */ 677 + struct buffer_head * s_sbh; /* Buffer containing the super block */ 678 + struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */ 679 + struct buffer_head ** s_group_desc; 680 + unsigned long s_mount_opt; 681 + ext3_fsblk_t s_sb_block; 682 + uid_t s_resuid; 683 + gid_t s_resgid; 684 + unsigned short s_mount_state; 685 + unsigned short s_pad; 686 + int s_addr_per_block_bits; 687 + int s_desc_per_block_bits; 688 + int s_inode_size; 689 + int s_first_ino; 690 + spinlock_t s_next_gen_lock; 691 + u32 s_next_generation; 692 + u32 s_hash_seed[4]; 693 + int s_def_hash_version; 694 + int s_hash_unsigned; /* 3 if hash should be signed, 0 if not */ 695 + struct percpu_counter s_freeblocks_counter; 696 + struct percpu_counter s_freeinodes_counter; 697 + struct percpu_counter s_dirs_counter; 698 + struct blockgroup_lock *s_blockgroup_lock; 699 + 700 + /* root of the per fs reservation window tree */ 701 + spinlock_t s_rsv_window_lock; 702 + struct rb_root s_rsv_window_root; 703 + struct ext3_reserve_window_node s_rsv_window_head; 704 + 705 + /* Journaling */ 706 + struct inode * s_journal_inode; 707 + struct journal_s * s_journal; 708 + struct list_head s_orphan; 709 + struct mutex s_orphan_lock; 710 + struct mutex s_resize_lock; 711 + unsigned long s_commit_interval; 712 + struct block_device *journal_bdev; 713 + #ifdef CONFIG_QUOTA 714 + char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ 715 + int s_jquota_fmt; /* Format of quota to use */ 716 + #endif 717 + }; 718 + 719 + static inline spinlock_t * 720 + sb_bgl_lock(struct ext3_sb_info *sbi, unsigned int block_group) 721 + { 722 + return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); 723 + } 724 + 495 725 static inline struct ext3_sb_info * EXT3_SB(struct super_block *sb) 496 726 { 497 727 return sb->s_fs_info; ··· 722 576 { 723 577 clear_bit(bit, &EXT3_I(inode)->i_state_flags); 724 578 } 725 - #else 726 - /* Assume that user mode programs are passing in an ext3fs superblock, not 727 - * a kernel struct super_block. This will allow us to call the feature-test 728 - * macros from user land. */ 729 - #define EXT3_SB(sb) (sb) 730 - #endif 731 579 732 580 #define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime 733 581 ··· 910 770 #define DX_HASH_LEGACY_UNSIGNED 3 911 771 #define DX_HASH_HALF_MD4_UNSIGNED 4 912 772 #define DX_HASH_TEA_UNSIGNED 5 913 - 914 - #ifdef __KERNEL__ 915 773 916 774 /* hash info structure used by the directory hash */ 917 775 struct dx_hash_info ··· 1112 974 extern const struct inode_operations ext3_symlink_inode_operations; 1113 975 extern const struct inode_operations ext3_fast_symlink_inode_operations; 1114 976 977 + #define EXT3_JOURNAL(inode) (EXT3_SB((inode)->i_sb)->s_journal) 1115 978 1116 - #endif /* __KERNEL__ */ 979 + /* Define the number of blocks we need to account to a transaction to 980 + * modify one block of data. 981 + * 982 + * We may have to touch one inode, one bitmap buffer, up to three 983 + * indirection blocks, the group and superblock summaries, and the data 984 + * block to complete the transaction. */ 1117 985 1118 - #endif /* _LINUX_EXT3_FS_H */ 986 + #define EXT3_SINGLEDATA_TRANS_BLOCKS 8U 987 + 988 + /* Extended attribute operations touch at most two data buffers, 989 + * two bitmap buffers, and two group summaries, in addition to the inode 990 + * and the superblock, which are already accounted for. */ 991 + 992 + #define EXT3_XATTR_TRANS_BLOCKS 6U 993 + 994 + /* Define the minimum size for a transaction which modifies data. This 995 + * needs to take into account the fact that we may end up modifying two 996 + * quota files too (one for the group, one for the user quota). The 997 + * superblock only gets updated once, of course, so don't bother 998 + * counting that again for the quota updates. */ 999 + 1000 + #define EXT3_DATA_TRANS_BLOCKS(sb) (EXT3_SINGLEDATA_TRANS_BLOCKS + \ 1001 + EXT3_XATTR_TRANS_BLOCKS - 2 + \ 1002 + EXT3_MAXQUOTAS_TRANS_BLOCKS(sb)) 1003 + 1004 + /* Delete operations potentially hit one directory's namespace plus an 1005 + * entire inode, plus arbitrary amounts of bitmap/indirection data. Be 1006 + * generous. We can grow the delete transaction later if necessary. */ 1007 + 1008 + #define EXT3_DELETE_TRANS_BLOCKS(sb) (EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) + 64) 1009 + 1010 + /* Define an arbitrary limit for the amount of data we will anticipate 1011 + * writing to any given transaction. For unbounded transactions such as 1012 + * write(2) and truncate(2) we can write more than this, but we always 1013 + * start off at the maximum transaction size and grow the transaction 1014 + * optimistically as we go. */ 1015 + 1016 + #define EXT3_MAX_TRANS_DATA 64U 1017 + 1018 + /* We break up a large truncate or write transaction once the handle's 1019 + * buffer credits gets this low, we need either to extend the 1020 + * transaction or to start a new one. Reserve enough space here for 1021 + * inode, bitmap, superblock, group and indirection updates for at least 1022 + * one block, plus two quota updates. Quota allocations are not 1023 + * needed. */ 1024 + 1025 + #define EXT3_RESERVE_TRANS_BLOCKS 12U 1026 + 1027 + #define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 1028 + 1029 + #ifdef CONFIG_QUOTA 1030 + /* Amount of blocks needed for quota update - we know that the structure was 1031 + * allocated so we need to update only inode+data */ 1032 + #define EXT3_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0) 1033 + /* Amount of blocks needed for quota insert/delete - we do some block writes 1034 + * but inode, sb and group updates are done only once */ 1035 + #define EXT3_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\ 1036 + (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_INIT_REWRITE) : 0) 1037 + #define EXT3_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\ 1038 + (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_DEL_REWRITE) : 0) 1039 + #else 1040 + #define EXT3_QUOTA_TRANS_BLOCKS(sb) 0 1041 + #define EXT3_QUOTA_INIT_BLOCKS(sb) 0 1042 + #define EXT3_QUOTA_DEL_BLOCKS(sb) 0 1043 + #endif 1044 + #define EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_TRANS_BLOCKS(sb)) 1045 + #define EXT3_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_INIT_BLOCKS(sb)) 1046 + #define EXT3_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_DEL_BLOCKS(sb)) 1047 + 1048 + int 1049 + ext3_mark_iloc_dirty(handle_t *handle, 1050 + struct inode *inode, 1051 + struct ext3_iloc *iloc); 1052 + 1053 + /* 1054 + * On success, We end up with an outstanding reference count against 1055 + * iloc->bh. This _must_ be cleaned up later. 1056 + */ 1057 + 1058 + int ext3_reserve_inode_write(handle_t *handle, struct inode *inode, 1059 + struct ext3_iloc *iloc); 1060 + 1061 + int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode); 1062 + 1063 + /* 1064 + * Wrapper functions with which ext3 calls into JBD. The intent here is 1065 + * to allow these to be turned into appropriate stubs so ext3 can control 1066 + * ext2 filesystems, so ext2+ext3 systems only nee one fs. This work hasn't 1067 + * been done yet. 1068 + */ 1069 + 1070 + static inline void ext3_journal_release_buffer(handle_t *handle, 1071 + struct buffer_head *bh) 1072 + { 1073 + journal_release_buffer(handle, bh); 1074 + } 1075 + 1076 + void ext3_journal_abort_handle(const char *caller, const char *err_fn, 1077 + struct buffer_head *bh, handle_t *handle, int err); 1078 + 1079 + int __ext3_journal_get_undo_access(const char *where, handle_t *handle, 1080 + struct buffer_head *bh); 1081 + 1082 + int __ext3_journal_get_write_access(const char *where, handle_t *handle, 1083 + struct buffer_head *bh); 1084 + 1085 + int __ext3_journal_forget(const char *where, handle_t *handle, 1086 + struct buffer_head *bh); 1087 + 1088 + int __ext3_journal_revoke(const char *where, handle_t *handle, 1089 + unsigned long blocknr, struct buffer_head *bh); 1090 + 1091 + int __ext3_journal_get_create_access(const char *where, 1092 + handle_t *handle, struct buffer_head *bh); 1093 + 1094 + int __ext3_journal_dirty_metadata(const char *where, 1095 + handle_t *handle, struct buffer_head *bh); 1096 + 1097 + #define ext3_journal_get_undo_access(handle, bh) \ 1098 + __ext3_journal_get_undo_access(__func__, (handle), (bh)) 1099 + #define ext3_journal_get_write_access(handle, bh) \ 1100 + __ext3_journal_get_write_access(__func__, (handle), (bh)) 1101 + #define ext3_journal_revoke(handle, blocknr, bh) \ 1102 + __ext3_journal_revoke(__func__, (handle), (blocknr), (bh)) 1103 + #define ext3_journal_get_create_access(handle, bh) \ 1104 + __ext3_journal_get_create_access(__func__, (handle), (bh)) 1105 + #define ext3_journal_dirty_metadata(handle, bh) \ 1106 + __ext3_journal_dirty_metadata(__func__, (handle), (bh)) 1107 + #define ext3_journal_forget(handle, bh) \ 1108 + __ext3_journal_forget(__func__, (handle), (bh)) 1109 + 1110 + int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh); 1111 + 1112 + handle_t *ext3_journal_start_sb(struct super_block *sb, int nblocks); 1113 + int __ext3_journal_stop(const char *where, handle_t *handle); 1114 + 1115 + static inline handle_t *ext3_journal_start(struct inode *inode, int nblocks) 1116 + { 1117 + return ext3_journal_start_sb(inode->i_sb, nblocks); 1118 + } 1119 + 1120 + #define ext3_journal_stop(handle) \ 1121 + __ext3_journal_stop(__func__, (handle)) 1122 + 1123 + static inline handle_t *ext3_journal_current_handle(void) 1124 + { 1125 + return journal_current_handle(); 1126 + } 1127 + 1128 + static inline int ext3_journal_extend(handle_t *handle, int nblocks) 1129 + { 1130 + return journal_extend(handle, nblocks); 1131 + } 1132 + 1133 + static inline int ext3_journal_restart(handle_t *handle, int nblocks) 1134 + { 1135 + return journal_restart(handle, nblocks); 1136 + } 1137 + 1138 + static inline int ext3_journal_blocks_per_page(struct inode *inode) 1139 + { 1140 + return journal_blocks_per_page(inode); 1141 + } 1142 + 1143 + static inline int ext3_journal_force_commit(journal_t *journal) 1144 + { 1145 + return journal_force_commit(journal); 1146 + } 1147 + 1148 + /* super.c */ 1149 + int ext3_force_commit(struct super_block *sb); 1150 + 1151 + static inline int ext3_should_journal_data(struct inode *inode) 1152 + { 1153 + if (!S_ISREG(inode->i_mode)) 1154 + return 1; 1155 + if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) 1156 + return 1; 1157 + if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 1158 + return 1; 1159 + return 0; 1160 + } 1161 + 1162 + static inline int ext3_should_order_data(struct inode *inode) 1163 + { 1164 + if (!S_ISREG(inode->i_mode)) 1165 + return 0; 1166 + if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 1167 + return 0; 1168 + if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA) 1169 + return 1; 1170 + return 0; 1171 + } 1172 + 1173 + static inline int ext3_should_writeback_data(struct inode *inode) 1174 + { 1175 + if (!S_ISREG(inode->i_mode)) 1176 + return 0; 1177 + if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 1178 + return 0; 1179 + if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) 1180 + return 1; 1181 + return 0; 1182 + } 1183 + 1184 + #include <trace/events/ext3.h>
-151
include/linux/ext3_fs_i.h
··· 1 - /* 2 - * linux/include/linux/ext3_fs_i.h 3 - * 4 - * Copyright (C) 1992, 1993, 1994, 1995 5 - * Remy Card (card@masi.ibp.fr) 6 - * Laboratoire MASI - Institut Blaise Pascal 7 - * Universite Pierre et Marie Curie (Paris VI) 8 - * 9 - * from 10 - * 11 - * linux/include/linux/minix_fs_i.h 12 - * 13 - * Copyright (C) 1991, 1992 Linus Torvalds 14 - */ 15 - 16 - #ifndef _LINUX_EXT3_FS_I 17 - #define _LINUX_EXT3_FS_I 18 - 19 - #include <linux/rwsem.h> 20 - #include <linux/rbtree.h> 21 - #include <linux/seqlock.h> 22 - #include <linux/mutex.h> 23 - 24 - /* data type for block offset of block group */ 25 - typedef int ext3_grpblk_t; 26 - 27 - /* data type for filesystem-wide blocks number */ 28 - typedef unsigned long ext3_fsblk_t; 29 - 30 - #define E3FSBLK "%lu" 31 - 32 - struct ext3_reserve_window { 33 - ext3_fsblk_t _rsv_start; /* First byte reserved */ 34 - ext3_fsblk_t _rsv_end; /* Last byte reserved or 0 */ 35 - }; 36 - 37 - struct ext3_reserve_window_node { 38 - struct rb_node rsv_node; 39 - __u32 rsv_goal_size; 40 - __u32 rsv_alloc_hit; 41 - struct ext3_reserve_window rsv_window; 42 - }; 43 - 44 - struct ext3_block_alloc_info { 45 - /* information about reservation window */ 46 - struct ext3_reserve_window_node rsv_window_node; 47 - /* 48 - * was i_next_alloc_block in ext3_inode_info 49 - * is the logical (file-relative) number of the 50 - * most-recently-allocated block in this file. 51 - * We use this for detecting linearly ascending allocation requests. 52 - */ 53 - __u32 last_alloc_logical_block; 54 - /* 55 - * Was i_next_alloc_goal in ext3_inode_info 56 - * is the *physical* companion to i_next_alloc_block. 57 - * it the physical block number of the block which was most-recentl 58 - * allocated to this file. This give us the goal (target) for the next 59 - * allocation when we detect linearly ascending requests. 60 - */ 61 - ext3_fsblk_t last_alloc_physical_block; 62 - }; 63 - 64 - #define rsv_start rsv_window._rsv_start 65 - #define rsv_end rsv_window._rsv_end 66 - 67 - /* 68 - * third extended file system inode data in memory 69 - */ 70 - struct ext3_inode_info { 71 - __le32 i_data[15]; /* unconverted */ 72 - __u32 i_flags; 73 - #ifdef EXT3_FRAGMENTS 74 - __u32 i_faddr; 75 - __u8 i_frag_no; 76 - __u8 i_frag_size; 77 - #endif 78 - ext3_fsblk_t i_file_acl; 79 - __u32 i_dir_acl; 80 - __u32 i_dtime; 81 - 82 - /* 83 - * i_block_group is the number of the block group which contains 84 - * this file's inode. Constant across the lifetime of the inode, 85 - * it is ued for making block allocation decisions - we try to 86 - * place a file's data blocks near its inode block, and new inodes 87 - * near to their parent directory's inode. 88 - */ 89 - __u32 i_block_group; 90 - unsigned long i_state_flags; /* Dynamic state flags for ext3 */ 91 - 92 - /* block reservation info */ 93 - struct ext3_block_alloc_info *i_block_alloc_info; 94 - 95 - __u32 i_dir_start_lookup; 96 - #ifdef CONFIG_EXT3_FS_XATTR 97 - /* 98 - * Extended attributes can be read independently of the main file 99 - * data. Taking i_mutex even when reading would cause contention 100 - * between readers of EAs and writers of regular file data, so 101 - * instead we synchronize on xattr_sem when reading or changing 102 - * EAs. 103 - */ 104 - struct rw_semaphore xattr_sem; 105 - #endif 106 - 107 - struct list_head i_orphan; /* unlinked but open inodes */ 108 - 109 - /* 110 - * i_disksize keeps track of what the inode size is ON DISK, not 111 - * in memory. During truncate, i_size is set to the new size by 112 - * the VFS prior to calling ext3_truncate(), but the filesystem won't 113 - * set i_disksize to 0 until the truncate is actually under way. 114 - * 115 - * The intent is that i_disksize always represents the blocks which 116 - * are used by this file. This allows recovery to restart truncate 117 - * on orphans if we crash during truncate. We actually write i_disksize 118 - * into the on-disk inode when writing inodes out, instead of i_size. 119 - * 120 - * The only time when i_disksize and i_size may be different is when 121 - * a truncate is in progress. The only things which change i_disksize 122 - * are ext3_get_block (growth) and ext3_truncate (shrinkth). 123 - */ 124 - loff_t i_disksize; 125 - 126 - /* on-disk additional length */ 127 - __u16 i_extra_isize; 128 - 129 - /* 130 - * truncate_mutex is for serialising ext3_truncate() against 131 - * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's 132 - * data tree are chopped off during truncate. We can't do that in 133 - * ext3 because whenever we perform intermediate commits during 134 - * truncate, the inode and all the metadata blocks *must* be in a 135 - * consistent state which allows truncation of the orphans to restart 136 - * during recovery. Hence we must fix the get_block-vs-truncate race 137 - * by other means, so we have truncate_mutex. 138 - */ 139 - struct mutex truncate_mutex; 140 - 141 - /* 142 - * Transactions that contain inode's metadata needed to complete 143 - * fsync and fdatasync, respectively. 144 - */ 145 - atomic_t i_sync_tid; 146 - atomic_t i_datasync_tid; 147 - 148 - struct inode vfs_inode; 149 - }; 150 - 151 - #endif /* _LINUX_EXT3_FS_I */
-91
include/linux/ext3_fs_sb.h
··· 1 - /* 2 - * linux/include/linux/ext3_fs_sb.h 3 - * 4 - * Copyright (C) 1992, 1993, 1994, 1995 5 - * Remy Card (card@masi.ibp.fr) 6 - * Laboratoire MASI - Institut Blaise Pascal 7 - * Universite Pierre et Marie Curie (Paris VI) 8 - * 9 - * from 10 - * 11 - * linux/include/linux/minix_fs_sb.h 12 - * 13 - * Copyright (C) 1991, 1992 Linus Torvalds 14 - */ 15 - 16 - #ifndef _LINUX_EXT3_FS_SB 17 - #define _LINUX_EXT3_FS_SB 18 - 19 - #ifdef __KERNEL__ 20 - #include <linux/timer.h> 21 - #include <linux/wait.h> 22 - #include <linux/blockgroup_lock.h> 23 - #include <linux/percpu_counter.h> 24 - #endif 25 - #include <linux/rbtree.h> 26 - 27 - /* 28 - * third extended-fs super-block data in memory 29 - */ 30 - struct ext3_sb_info { 31 - unsigned long s_frag_size; /* Size of a fragment in bytes */ 32 - unsigned long s_frags_per_block;/* Number of fragments per block */ 33 - unsigned long s_inodes_per_block;/* Number of inodes per block */ 34 - unsigned long s_frags_per_group;/* Number of fragments in a group */ 35 - unsigned long s_blocks_per_group;/* Number of blocks in a group */ 36 - unsigned long s_inodes_per_group;/* Number of inodes in a group */ 37 - unsigned long s_itb_per_group; /* Number of inode table blocks per group */ 38 - unsigned long s_gdb_count; /* Number of group descriptor blocks */ 39 - unsigned long s_desc_per_block; /* Number of group descriptors per block */ 40 - unsigned long s_groups_count; /* Number of groups in the fs */ 41 - unsigned long s_overhead_last; /* Last calculated overhead */ 42 - unsigned long s_blocks_last; /* Last seen block count */ 43 - struct buffer_head * s_sbh; /* Buffer containing the super block */ 44 - struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */ 45 - struct buffer_head ** s_group_desc; 46 - unsigned long s_mount_opt; 47 - ext3_fsblk_t s_sb_block; 48 - uid_t s_resuid; 49 - gid_t s_resgid; 50 - unsigned short s_mount_state; 51 - unsigned short s_pad; 52 - int s_addr_per_block_bits; 53 - int s_desc_per_block_bits; 54 - int s_inode_size; 55 - int s_first_ino; 56 - spinlock_t s_next_gen_lock; 57 - u32 s_next_generation; 58 - u32 s_hash_seed[4]; 59 - int s_def_hash_version; 60 - int s_hash_unsigned; /* 3 if hash should be signed, 0 if not */ 61 - struct percpu_counter s_freeblocks_counter; 62 - struct percpu_counter s_freeinodes_counter; 63 - struct percpu_counter s_dirs_counter; 64 - struct blockgroup_lock *s_blockgroup_lock; 65 - 66 - /* root of the per fs reservation window tree */ 67 - spinlock_t s_rsv_window_lock; 68 - struct rb_root s_rsv_window_root; 69 - struct ext3_reserve_window_node s_rsv_window_head; 70 - 71 - /* Journaling */ 72 - struct inode * s_journal_inode; 73 - struct journal_s * s_journal; 74 - struct list_head s_orphan; 75 - struct mutex s_orphan_lock; 76 - struct mutex s_resize_lock; 77 - unsigned long s_commit_interval; 78 - struct block_device *journal_bdev; 79 - #ifdef CONFIG_QUOTA 80 - char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ 81 - int s_jquota_fmt; /* Format of quota to use */ 82 - #endif 83 - }; 84 - 85 - static inline spinlock_t * 86 - sb_bgl_lock(struct ext3_sb_info *sbi, unsigned int block_group) 87 - { 88 - return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); 89 - } 90 - 91 - #endif /* _LINUX_EXT3_FS_SB */
-229
include/linux/ext3_jbd.h
··· 1 - /* 2 - * linux/include/linux/ext3_jbd.h 3 - * 4 - * Written by Stephen C. Tweedie <sct@redhat.com>, 1999 5 - * 6 - * Copyright 1998--1999 Red Hat corp --- All Rights Reserved 7 - * 8 - * This file is part of the Linux kernel and is made available under 9 - * the terms of the GNU General Public License, version 2, or at your 10 - * option, any later version, incorporated herein by reference. 11 - * 12 - * Ext3-specific journaling extensions. 13 - */ 14 - 15 - #ifndef _LINUX_EXT3_JBD_H 16 - #define _LINUX_EXT3_JBD_H 17 - 18 - #include <linux/fs.h> 19 - #include <linux/jbd.h> 20 - #include <linux/ext3_fs.h> 21 - 22 - #define EXT3_JOURNAL(inode) (EXT3_SB((inode)->i_sb)->s_journal) 23 - 24 - /* Define the number of blocks we need to account to a transaction to 25 - * modify one block of data. 26 - * 27 - * We may have to touch one inode, one bitmap buffer, up to three 28 - * indirection blocks, the group and superblock summaries, and the data 29 - * block to complete the transaction. */ 30 - 31 - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8U 32 - 33 - /* Extended attribute operations touch at most two data buffers, 34 - * two bitmap buffers, and two group summaries, in addition to the inode 35 - * and the superblock, which are already accounted for. */ 36 - 37 - #define EXT3_XATTR_TRANS_BLOCKS 6U 38 - 39 - /* Define the minimum size for a transaction which modifies data. This 40 - * needs to take into account the fact that we may end up modifying two 41 - * quota files too (one for the group, one for the user quota). The 42 - * superblock only gets updated once, of course, so don't bother 43 - * counting that again for the quota updates. */ 44 - 45 - #define EXT3_DATA_TRANS_BLOCKS(sb) (EXT3_SINGLEDATA_TRANS_BLOCKS + \ 46 - EXT3_XATTR_TRANS_BLOCKS - 2 + \ 47 - EXT3_MAXQUOTAS_TRANS_BLOCKS(sb)) 48 - 49 - /* Delete operations potentially hit one directory's namespace plus an 50 - * entire inode, plus arbitrary amounts of bitmap/indirection data. Be 51 - * generous. We can grow the delete transaction later if necessary. */ 52 - 53 - #define EXT3_DELETE_TRANS_BLOCKS(sb) (EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) + 64) 54 - 55 - /* Define an arbitrary limit for the amount of data we will anticipate 56 - * writing to any given transaction. For unbounded transactions such as 57 - * write(2) and truncate(2) we can write more than this, but we always 58 - * start off at the maximum transaction size and grow the transaction 59 - * optimistically as we go. */ 60 - 61 - #define EXT3_MAX_TRANS_DATA 64U 62 - 63 - /* We break up a large truncate or write transaction once the handle's 64 - * buffer credits gets this low, we need either to extend the 65 - * transaction or to start a new one. Reserve enough space here for 66 - * inode, bitmap, superblock, group and indirection updates for at least 67 - * one block, plus two quota updates. Quota allocations are not 68 - * needed. */ 69 - 70 - #define EXT3_RESERVE_TRANS_BLOCKS 12U 71 - 72 - #define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 73 - 74 - #ifdef CONFIG_QUOTA 75 - /* Amount of blocks needed for quota update - we know that the structure was 76 - * allocated so we need to update only inode+data */ 77 - #define EXT3_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0) 78 - /* Amount of blocks needed for quota insert/delete - we do some block writes 79 - * but inode, sb and group updates are done only once */ 80 - #define EXT3_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\ 81 - (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_INIT_REWRITE) : 0) 82 - #define EXT3_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\ 83 - (EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_DEL_REWRITE) : 0) 84 - #else 85 - #define EXT3_QUOTA_TRANS_BLOCKS(sb) 0 86 - #define EXT3_QUOTA_INIT_BLOCKS(sb) 0 87 - #define EXT3_QUOTA_DEL_BLOCKS(sb) 0 88 - #endif 89 - #define EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_TRANS_BLOCKS(sb)) 90 - #define EXT3_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_INIT_BLOCKS(sb)) 91 - #define EXT3_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_DEL_BLOCKS(sb)) 92 - 93 - int 94 - ext3_mark_iloc_dirty(handle_t *handle, 95 - struct inode *inode, 96 - struct ext3_iloc *iloc); 97 - 98 - /* 99 - * On success, We end up with an outstanding reference count against 100 - * iloc->bh. This _must_ be cleaned up later. 101 - */ 102 - 103 - int ext3_reserve_inode_write(handle_t *handle, struct inode *inode, 104 - struct ext3_iloc *iloc); 105 - 106 - int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode); 107 - 108 - /* 109 - * Wrapper functions with which ext3 calls into JBD. The intent here is 110 - * to allow these to be turned into appropriate stubs so ext3 can control 111 - * ext2 filesystems, so ext2+ext3 systems only nee one fs. This work hasn't 112 - * been done yet. 113 - */ 114 - 115 - static inline void ext3_journal_release_buffer(handle_t *handle, 116 - struct buffer_head *bh) 117 - { 118 - journal_release_buffer(handle, bh); 119 - } 120 - 121 - void ext3_journal_abort_handle(const char *caller, const char *err_fn, 122 - struct buffer_head *bh, handle_t *handle, int err); 123 - 124 - int __ext3_journal_get_undo_access(const char *where, handle_t *handle, 125 - struct buffer_head *bh); 126 - 127 - int __ext3_journal_get_write_access(const char *where, handle_t *handle, 128 - struct buffer_head *bh); 129 - 130 - int __ext3_journal_forget(const char *where, handle_t *handle, 131 - struct buffer_head *bh); 132 - 133 - int __ext3_journal_revoke(const char *where, handle_t *handle, 134 - unsigned long blocknr, struct buffer_head *bh); 135 - 136 - int __ext3_journal_get_create_access(const char *where, 137 - handle_t *handle, struct buffer_head *bh); 138 - 139 - int __ext3_journal_dirty_metadata(const char *where, 140 - handle_t *handle, struct buffer_head *bh); 141 - 142 - #define ext3_journal_get_undo_access(handle, bh) \ 143 - __ext3_journal_get_undo_access(__func__, (handle), (bh)) 144 - #define ext3_journal_get_write_access(handle, bh) \ 145 - __ext3_journal_get_write_access(__func__, (handle), (bh)) 146 - #define ext3_journal_revoke(handle, blocknr, bh) \ 147 - __ext3_journal_revoke(__func__, (handle), (blocknr), (bh)) 148 - #define ext3_journal_get_create_access(handle, bh) \ 149 - __ext3_journal_get_create_access(__func__, (handle), (bh)) 150 - #define ext3_journal_dirty_metadata(handle, bh) \ 151 - __ext3_journal_dirty_metadata(__func__, (handle), (bh)) 152 - #define ext3_journal_forget(handle, bh) \ 153 - __ext3_journal_forget(__func__, (handle), (bh)) 154 - 155 - int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh); 156 - 157 - handle_t *ext3_journal_start_sb(struct super_block *sb, int nblocks); 158 - int __ext3_journal_stop(const char *where, handle_t *handle); 159 - 160 - static inline handle_t *ext3_journal_start(struct inode *inode, int nblocks) 161 - { 162 - return ext3_journal_start_sb(inode->i_sb, nblocks); 163 - } 164 - 165 - #define ext3_journal_stop(handle) \ 166 - __ext3_journal_stop(__func__, (handle)) 167 - 168 - static inline handle_t *ext3_journal_current_handle(void) 169 - { 170 - return journal_current_handle(); 171 - } 172 - 173 - static inline int ext3_journal_extend(handle_t *handle, int nblocks) 174 - { 175 - return journal_extend(handle, nblocks); 176 - } 177 - 178 - static inline int ext3_journal_restart(handle_t *handle, int nblocks) 179 - { 180 - return journal_restart(handle, nblocks); 181 - } 182 - 183 - static inline int ext3_journal_blocks_per_page(struct inode *inode) 184 - { 185 - return journal_blocks_per_page(inode); 186 - } 187 - 188 - static inline int ext3_journal_force_commit(journal_t *journal) 189 - { 190 - return journal_force_commit(journal); 191 - } 192 - 193 - /* super.c */ 194 - int ext3_force_commit(struct super_block *sb); 195 - 196 - static inline int ext3_should_journal_data(struct inode *inode) 197 - { 198 - if (!S_ISREG(inode->i_mode)) 199 - return 1; 200 - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) 201 - return 1; 202 - if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 203 - return 1; 204 - return 0; 205 - } 206 - 207 - static inline int ext3_should_order_data(struct inode *inode) 208 - { 209 - if (!S_ISREG(inode->i_mode)) 210 - return 0; 211 - if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 212 - return 0; 213 - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA) 214 - return 1; 215 - return 0; 216 - } 217 - 218 - static inline int ext3_should_writeback_data(struct inode *inode) 219 - { 220 - if (!S_ISREG(inode->i_mode)) 221 - return 0; 222 - if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) 223 - return 0; 224 - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) 225 - return 1; 226 - return 0; 227 - } 228 - 229 - #endif /* _LINUX_EXT3_JBD_H */
-1
init/do_mounts_initrd.c
··· 2 2 #include <linux/kernel.h> 3 3 #include <linux/fs.h> 4 4 #include <linux/minix_fs.h> 5 - #include <linux/ext2_fs.h> 6 5 #include <linux/romfs_fs.h> 7 6 #include <linux/initrd.h> 8 7 #include <linux/sched.h>
+4 -5
init/do_mounts_rd.c
··· 54 54 { 55 55 const int size = 512; 56 56 struct minix_super_block *minixsb; 57 - struct ext2_super_block *ext2sb; 58 57 struct romfs_super_block *romfsb; 59 58 struct cramfs_super *cramfsb; 60 59 struct squashfs_super_block *squashfsb; 61 60 int nblocks = -1; 62 61 unsigned char *buf; 63 62 const char *compress_name; 63 + unsigned long n; 64 64 65 65 buf = kmalloc(size, GFP_KERNEL); 66 66 if (!buf) 67 67 return -ENOMEM; 68 68 69 69 minixsb = (struct minix_super_block *) buf; 70 - ext2sb = (struct ext2_super_block *) buf; 71 70 romfsb = (struct romfs_super_block *) buf; 72 71 cramfsb = (struct cramfs_super *) buf; 73 72 squashfsb = (struct squashfs_super_block *) buf; ··· 149 150 } 150 151 151 152 /* Try ext2 */ 152 - if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) { 153 + n = ext2_image_size(buf); 154 + if (n) { 153 155 printk(KERN_NOTICE 154 156 "RAMDISK: ext2 filesystem found at block %d\n", 155 157 start_block); 156 - nblocks = le32_to_cpu(ext2sb->s_blocks_count) << 157 - le32_to_cpu(ext2sb->s_log_block_size); 158 + nblocks = n; 158 159 goto done; 159 160 } 160 161
+4 -5
security/selinux/hooks.c
··· 28 28 #include <linux/kernel.h> 29 29 #include <linux/tracehook.h> 30 30 #include <linux/errno.h> 31 - #include <linux/ext2_fs.h> 32 31 #include <linux/sched.h> 33 32 #include <linux/security.h> 34 33 #include <linux/xattr.h> ··· 2970 2971 /* fall through */ 2971 2972 case FIGETBSZ: 2972 2973 /* fall through */ 2973 - case EXT2_IOC_GETFLAGS: 2974 + case FS_IOC_GETFLAGS: 2974 2975 /* fall through */ 2975 - case EXT2_IOC_GETVERSION: 2976 + case FS_IOC_GETVERSION: 2976 2977 error = file_has_perm(cred, file, FILE__GETATTR); 2977 2978 break; 2978 2979 2979 - case EXT2_IOC_SETFLAGS: 2980 + case FS_IOC_SETFLAGS: 2980 2981 /* fall through */ 2981 - case EXT2_IOC_SETVERSION: 2982 + case FS_IOC_SETVERSION: 2982 2983 error = file_has_perm(cred, file, FILE__SETATTR); 2983 2984 break; 2984 2985
+44 -66
security/selinux/selinuxfs.c
··· 344 344 static int sel_make_policycap(void); 345 345 346 346 /* declaration for sel_make_class_dirs */ 347 - static int sel_make_dir(struct inode *dir, struct dentry *dentry, 347 + static struct dentry *sel_make_dir(struct dentry *dir, const char *name, 348 348 unsigned long *ino); 349 349 350 350 static ssize_t sel_read_mls(struct file *filp, char __user *buf, ··· 1678 1678 inode->i_ino = sel_class_to_ino(index); 1679 1679 d_add(dentry, inode); 1680 1680 1681 - dentry = d_alloc_name(dir, "perms"); 1682 - if (!dentry) 1683 - return -ENOMEM; 1684 - 1685 - rc = sel_make_dir(dir->d_inode, dentry, &last_class_ino); 1686 - if (rc) 1687 - return rc; 1681 + dentry = sel_make_dir(dir, "perms", &last_class_ino); 1682 + if (IS_ERR(dentry)) 1683 + return PTR_ERR(dentry); 1688 1684 1689 1685 rc = sel_make_perm_files(classname, index, dentry); 1690 1686 ··· 1729 1733 for (i = 0; i < nclasses; i++) { 1730 1734 struct dentry *class_name_dir; 1731 1735 1732 - rc = -ENOMEM; 1733 - class_name_dir = d_alloc_name(class_dir, classes[i]); 1734 - if (!class_name_dir) 1735 - goto out; 1736 - 1737 - rc = sel_make_dir(class_dir->d_inode, class_name_dir, 1736 + class_name_dir = sel_make_dir(class_dir, classes[i], 1738 1737 &last_class_ino); 1739 - if (rc) 1738 + if (IS_ERR(class_name_dir)) { 1739 + rc = PTR_ERR(class_name_dir); 1740 1740 goto out; 1741 + } 1741 1742 1742 1743 /* i+1 since class values are 1-indexed */ 1743 1744 rc = sel_make_class_dir_entries(classes[i], i + 1, ··· 1780 1787 return 0; 1781 1788 } 1782 1789 1783 - static int sel_make_dir(struct inode *dir, struct dentry *dentry, 1790 + static struct dentry *sel_make_dir(struct dentry *dir, const char *name, 1784 1791 unsigned long *ino) 1785 1792 { 1793 + struct dentry *dentry = d_alloc_name(dir, name); 1786 1794 struct inode *inode; 1787 1795 1788 - inode = sel_make_inode(dir->i_sb, S_IFDIR | S_IRUGO | S_IXUGO); 1789 - if (!inode) 1790 - return -ENOMEM; 1796 + if (!dentry) 1797 + return ERR_PTR(-ENOMEM); 1798 + 1799 + inode = sel_make_inode(dir->d_sb, S_IFDIR | S_IRUGO | S_IXUGO); 1800 + if (!inode) { 1801 + dput(dentry); 1802 + return ERR_PTR(-ENOMEM); 1803 + } 1791 1804 1792 1805 inode->i_op = &simple_dir_inode_operations; 1793 1806 inode->i_fop = &simple_dir_operations; ··· 1802 1803 inc_nlink(inode); 1803 1804 d_add(dentry, inode); 1804 1805 /* bump link count on parent directory, too */ 1805 - inc_nlink(dir); 1806 + inc_nlink(dir->d_inode); 1806 1807 1807 - return 0; 1808 + return dentry; 1808 1809 } 1809 1810 1810 1811 static int sel_fill_super(struct super_block *sb, void *data, int silent) 1811 1812 { 1812 1813 int ret; 1813 1814 struct dentry *dentry; 1814 - struct inode *inode, *root_inode; 1815 + struct inode *inode; 1815 1816 struct inode_security_struct *isec; 1816 1817 1817 1818 static struct tree_descr selinux_files[] = { ··· 1838 1839 if (ret) 1839 1840 goto err; 1840 1841 1841 - root_inode = sb->s_root->d_inode; 1842 - 1843 - ret = -ENOMEM; 1844 - dentry = d_alloc_name(sb->s_root, BOOL_DIR_NAME); 1845 - if (!dentry) 1842 + bool_dir = sel_make_dir(sb->s_root, BOOL_DIR_NAME, &sel_last_ino); 1843 + if (IS_ERR(bool_dir)) { 1844 + ret = PTR_ERR(bool_dir); 1845 + bool_dir = NULL; 1846 1846 goto err; 1847 - 1848 - ret = sel_make_dir(root_inode, dentry, &sel_last_ino); 1849 - if (ret) 1850 - goto err; 1851 - 1852 - bool_dir = dentry; 1847 + } 1853 1848 1854 1849 ret = -ENOMEM; 1855 1850 dentry = d_alloc_name(sb->s_root, NULL_FILE_NAME); ··· 1865 1872 d_add(dentry, inode); 1866 1873 selinux_null = dentry; 1867 1874 1868 - ret = -ENOMEM; 1869 - dentry = d_alloc_name(sb->s_root, "avc"); 1870 - if (!dentry) 1875 + dentry = sel_make_dir(sb->s_root, "avc", &sel_last_ino); 1876 + if (IS_ERR(dentry)) { 1877 + ret = PTR_ERR(dentry); 1871 1878 goto err; 1872 - 1873 - ret = sel_make_dir(root_inode, dentry, &sel_last_ino); 1874 - if (ret) 1875 - goto err; 1879 + } 1876 1880 1877 1881 ret = sel_make_avc_files(dentry); 1878 1882 if (ret) 1879 1883 goto err; 1880 1884 1881 - ret = -ENOMEM; 1882 - dentry = d_alloc_name(sb->s_root, "initial_contexts"); 1883 - if (!dentry) 1885 + dentry = sel_make_dir(sb->s_root, "initial_contexts", &sel_last_ino); 1886 + if (IS_ERR(dentry)) { 1887 + ret = PTR_ERR(dentry); 1884 1888 goto err; 1885 - 1886 - ret = sel_make_dir(root_inode, dentry, &sel_last_ino); 1887 - if (ret) 1888 - goto err; 1889 + } 1889 1890 1890 1891 ret = sel_make_initcon_files(dentry); 1891 1892 if (ret) 1892 1893 goto err; 1893 1894 1894 - ret = -ENOMEM; 1895 - dentry = d_alloc_name(sb->s_root, "class"); 1896 - if (!dentry) 1895 + class_dir = sel_make_dir(sb->s_root, "class", &sel_last_ino); 1896 + if (IS_ERR(class_dir)) { 1897 + ret = PTR_ERR(class_dir); 1898 + class_dir = NULL; 1897 1899 goto err; 1900 + } 1898 1901 1899 - ret = sel_make_dir(root_inode, dentry, &sel_last_ino); 1900 - if (ret) 1902 + policycap_dir = sel_make_dir(sb->s_root, "policy_capabilities", &sel_last_ino); 1903 + if (IS_ERR(policycap_dir)) { 1904 + ret = PTR_ERR(policycap_dir); 1905 + policycap_dir = NULL; 1901 1906 goto err; 1902 - 1903 - class_dir = dentry; 1904 - 1905 - ret = -ENOMEM; 1906 - dentry = d_alloc_name(sb->s_root, "policy_capabilities"); 1907 - if (!dentry) 1908 - goto err; 1909 - 1910 - ret = sel_make_dir(root_inode, dentry, &sel_last_ino); 1911 - if (ret) 1912 - goto err; 1913 - 1914 - policycap_dir = dentry; 1915 - 1907 + } 1916 1908 return 0; 1917 1909 err: 1918 1910 printk(KERN_ERR "SELinux: %s: failed while creating inodes\n",