// SPDX-License-Identifier: GPL-2.0 /* * linux/fs/ext2/ialloc.c * * Copyright (C) 1992, 1993, 1994, 1995 * Remy Card ([email protected]) * Laboratoire MASI - Institut Blaise Pascal * Universite Pierre et Marie Curie (Paris VI) * * BSD ufs-inspired inode and directory allocation by * Stephen Tweedie ([email protected]), 1993 * Big-endian to little-endian byte-swapping/bitmaps by * David S. Miller ([email protected]), 1995 */ #include <linux/quotaops.h> #include <linux/sched.h> #include <linux/backing-dev.h> #include <linux/buffer_head.h> #include <linux/random.h> #include "ext2.h" #include "xattr.h" #include "acl.h" /* * ialloc.c contains the inodes allocation and deallocation routines */ /* * The free inodes are managed by bitmaps. A file system contains several * blocks groups. Each group contains 1 bitmap block for blocks, 1 bitmap * block for inodes, N blocks for the inode table and data blocks. * * The file system contains group descriptors which are located after the * super block. Each descriptor contains the number of the bitmap block and * the free blocks count in the block. */ /* * Read the inode allocation bitmap for a given block_group, reading * into the specified slot in the superblock's bitmap cache. * * Return buffer_head of bitmap on success or NULL. */ static struct buffer_head * read_inode_bitmap(struct super_block * sb, unsigned long block_group) { … } static void ext2_release_inode(struct super_block *sb, int group, int dir) { … } /* * NOTE! When we get the inode, we're the only people * that have access to it, and as such there are no * race conditions we have to worry about. The inode * is not on the hash-lists, and it cannot be reached * through the filesystem because the directory entry * has been deleted earlier. * * HOWEVER: we must make sure that we get no aliases, * which means that we have to call "clear_inode()" * _before_ we mark the inode not in use in the inode * bitmaps. Otherwise a newly created file might use * the same inode number (not actually the same pointer * though), and then we'd have two inodes sharing the * same inode number and space on the harddisk. */ void ext2_free_inode (struct inode * inode) { … } /* * We perform asynchronous prereading of the new inode's inode block when * we create the inode, in the expectation that the inode will be written * back soon. There are two reasons: * * - When creating a large number of files, the async prereads will be * nicely merged into large reads * - When writing out a large number of inodes, we don't need to keep on * stalling the writes while we read the inode block. * * FIXME: ext2_get_group_desc() needs to be simplified. */ static void ext2_preread_inode(struct inode *inode) { … } /* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both * free space and a low directory-to-inode ratio; if that fails, then of * the groups with above-average free space, that group with the fewest * directories already is chosen. * * For other inodes, search forward from the parent directory\'s block * group to find a free inode. */ static int find_group_dir(struct super_block *sb, struct inode *parent) { … } /* * Orlov's allocator for directories. * * We always try to spread first-level directories. * * If there are blockgroups with both free inodes and free blocks counts * not worse than average we return one with smallest directory count. * Otherwise we simply return a random group. * * For the rest rules look so: * * It's OK to put directory into a group unless * it has too many directories already (max_dirs) or * it has too few free inodes left (min_inodes) or * it has too few free blocks left (min_blocks) or * it's already running too large debt (max_debt). * Parent's group is preferred, if it doesn't satisfy these * conditions we search cyclically through the rest. If none * of the groups look good we just look for a group with more * free inodes than average (starting at parent's group). * * Debt is incremented each time we allocate a directory and decremented * when we allocate an inode, within 0--255. */ #define INODE_COST … #define BLOCK_COST … static int find_group_orlov(struct super_block *sb, struct inode *parent) { … } static int find_group_other(struct super_block *sb, struct inode *parent) { … } struct inode *ext2_new_inode(struct inode *dir, umode_t mode, const struct qstr *qstr) { … } unsigned long ext2_count_free_inodes (struct super_block * sb) { … } /* Called at mount-time, super-block is locked */ unsigned long ext2_count_dirs (struct super_block * sb) { … }