LCOV - code coverage report
Current view: top level - fs/ext2 - balloc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 397 0.0 %
Date: 2014-02-18 Functions: 0 24 0.0 %
Branches: 0 336 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/fs/ext2/balloc.c
       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                 :            :  *  Enhanced block allocation by Stephen Tweedie (sct@redhat.com), 1993
      10                 :            :  *  Big-endian to little-endian byte-swapping/bitmaps by
      11                 :            :  *        David S. Miller (davem@caip.rutgers.edu), 1995
      12                 :            :  */
      13                 :            : 
      14                 :            : #include "ext2.h"
      15                 :            : #include <linux/quotaops.h>
      16                 :            : #include <linux/slab.h>
      17                 :            : #include <linux/sched.h>
      18                 :            : #include <linux/buffer_head.h>
      19                 :            : #include <linux/capability.h>
      20                 :            : 
      21                 :            : /*
      22                 :            :  * balloc.c contains the blocks allocation and deallocation routines
      23                 :            :  */
      24                 :            : 
      25                 :            : /*
      26                 :            :  * The free blocks are managed by bitmaps.  A file system contains several
      27                 :            :  * blocks groups.  Each group contains 1 bitmap block for blocks, 1 bitmap
      28                 :            :  * block for inodes, N blocks for the inode table and data blocks.
      29                 :            :  *
      30                 :            :  * The file system contains group descriptors which are located after the
      31                 :            :  * super block.  Each descriptor contains the number of the bitmap block and
      32                 :            :  * the free blocks count in the block.  The descriptors are loaded in memory
      33                 :            :  * when a file system is mounted (see ext2_fill_super).
      34                 :            :  */
      35                 :            : 
      36                 :            : 
      37                 :            : #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
      38                 :            : 
      39                 :          0 : struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
      40                 :            :                                              unsigned int block_group,
      41                 :            :                                              struct buffer_head ** bh)
      42                 :            : {
      43                 :            :         unsigned long group_desc;
      44                 :            :         unsigned long offset;
      45                 :            :         struct ext2_group_desc * desc;
      46                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
      47                 :            : 
      48         [ #  # ]:          0 :         if (block_group >= sbi->s_groups_count) {
      49                 :          0 :                 ext2_error (sb, "ext2_get_group_desc",
      50                 :            :                             "block_group >= groups_count - "
      51                 :            :                             "block_group = %d, groups_count = %lu",
      52                 :            :                             block_group, sbi->s_groups_count);
      53                 :            : 
      54                 :          0 :                 return NULL;
      55                 :            :         }
      56                 :            : 
      57                 :          0 :         group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
      58                 :          0 :         offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
      59         [ #  # ]:          0 :         if (!sbi->s_group_desc[group_desc]) {
      60                 :          0 :                 ext2_error (sb, "ext2_get_group_desc",
      61                 :            :                             "Group descriptor not loaded - "
      62                 :            :                             "block_group = %d, group_desc = %lu, desc = %lu",
      63                 :            :                              block_group, group_desc, offset);
      64                 :          0 :                 return NULL;
      65                 :            :         }
      66                 :            : 
      67                 :          0 :         desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data;
      68         [ #  # ]:          0 :         if (bh)
      69                 :          0 :                 *bh = sbi->s_group_desc[group_desc];
      70                 :          0 :         return desc + offset;
      71                 :            : }
      72                 :            : 
      73                 :          0 : static int ext2_valid_block_bitmap(struct super_block *sb,
      74                 :            :                                         struct ext2_group_desc *desc,
      75                 :            :                                         unsigned int block_group,
      76                 :            :                                         struct buffer_head *bh)
      77                 :            : {
      78                 :            :         ext2_grpblk_t offset;
      79                 :            :         ext2_grpblk_t next_zero_bit;
      80                 :            :         ext2_fsblk_t bitmap_blk;
      81                 :            :         ext2_fsblk_t group_first_block;
      82                 :            : 
      83                 :            :         group_first_block = ext2_group_first_block_no(sb, block_group);
      84                 :            : 
      85                 :            :         /* check whether block bitmap block number is set */
      86                 :          0 :         bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
      87                 :          0 :         offset = bitmap_blk - group_first_block;
      88         [ #  # ]:          0 :         if (!ext2_test_bit(offset, bh->b_data))
      89                 :            :                 /* bad block bitmap */
      90                 :            :                 goto err_out;
      91                 :            : 
      92                 :            :         /* check whether the inode bitmap block number is set */
      93                 :          0 :         bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
      94                 :          0 :         offset = bitmap_blk - group_first_block;
      95         [ #  # ]:          0 :         if (!ext2_test_bit(offset, bh->b_data))
      96                 :            :                 /* bad block bitmap */
      97                 :            :                 goto err_out;
      98                 :            : 
      99                 :            :         /* check whether the inode table block number is set */
     100                 :          0 :         bitmap_blk = le32_to_cpu(desc->bg_inode_table);
     101                 :          0 :         offset = bitmap_blk - group_first_block;
     102                 :          0 :         next_zero_bit = ext2_find_next_zero_bit(bh->b_data,
     103                 :          0 :                                 offset + EXT2_SB(sb)->s_itb_per_group,
     104                 :            :                                 offset);
     105         [ #  # ]:          0 :         if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
     106                 :            :                 /* good bitmap for inode tables */
     107                 :            :                 return 1;
     108                 :            : 
     109                 :            : err_out:
     110                 :          0 :         ext2_error(sb, __func__,
     111                 :            :                         "Invalid block bitmap - "
     112                 :            :                         "block_group = %d, block = %lu",
     113                 :            :                         block_group, bitmap_blk);
     114                 :            :         return 0;
     115                 :            : }
     116                 :            : 
     117                 :            : /*
     118                 :            :  * Read the bitmap for a given block_group,and validate the
     119                 :            :  * bits for block/inode/inode tables are set in the bitmaps
     120                 :            :  *
     121                 :            :  * Return buffer_head on success or NULL in case of failure.
     122                 :            :  */
     123                 :            : static struct buffer_head *
     124                 :          0 : read_block_bitmap(struct super_block *sb, unsigned int block_group)
     125                 :            : {
     126                 :            :         struct ext2_group_desc * desc;
     127                 :          0 :         struct buffer_head * bh = NULL;
     128                 :            :         ext2_fsblk_t bitmap_blk;
     129                 :            : 
     130                 :          0 :         desc = ext2_get_group_desc(sb, block_group, NULL);
     131         [ #  # ]:          0 :         if (!desc)
     132                 :            :                 return NULL;
     133                 :          0 :         bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
     134                 :          0 :         bh = sb_getblk(sb, bitmap_blk);
     135         [ #  # ]:          0 :         if (unlikely(!bh)) {
     136                 :          0 :                 ext2_error(sb, __func__,
     137                 :            :                             "Cannot read block bitmap - "
     138                 :            :                             "block_group = %d, block_bitmap = %u",
     139                 :            :                             block_group, le32_to_cpu(desc->bg_block_bitmap));
     140                 :          0 :                 return NULL;
     141                 :            :         }
     142         [ #  # ]:          0 :         if (likely(bh_uptodate_or_lock(bh)))
     143                 :            :                 return bh;
     144                 :            : 
     145         [ #  # ]:          0 :         if (bh_submit_read(bh) < 0) {
     146                 :            :                 brelse(bh);
     147                 :          0 :                 ext2_error(sb, __func__,
     148                 :            :                             "Cannot read block bitmap - "
     149                 :            :                             "block_group = %d, block_bitmap = %u",
     150                 :            :                             block_group, le32_to_cpu(desc->bg_block_bitmap));
     151                 :          0 :                 return NULL;
     152                 :            :         }
     153                 :            : 
     154                 :          0 :         ext2_valid_block_bitmap(sb, desc, block_group, bh);
     155                 :            :         /*
     156                 :            :          * file system mounted not to panic on error, continue with corrupt
     157                 :            :          * bitmap
     158                 :            :          */
     159                 :          0 :         return bh;
     160                 :            : }
     161                 :            : 
     162                 :          0 : static void group_adjust_blocks(struct super_block *sb, int group_no,
     163                 :            :         struct ext2_group_desc *desc, struct buffer_head *bh, int count)
     164                 :            : {
     165         [ #  # ]:          0 :         if (count) {
     166                 :          0 :                 struct ext2_sb_info *sbi = EXT2_SB(sb);
     167                 :            :                 unsigned free_blocks;
     168                 :            : 
     169                 :          0 :                 spin_lock(sb_bgl_lock(sbi, group_no));
     170                 :          0 :                 free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
     171                 :          0 :                 desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
     172                 :          0 :                 spin_unlock(sb_bgl_lock(sbi, group_no));
     173                 :          0 :                 mark_buffer_dirty(bh);
     174                 :            :         }
     175                 :          0 : }
     176                 :            : 
     177                 :            : /*
     178                 :            :  * The reservation window structure operations
     179                 :            :  * --------------------------------------------
     180                 :            :  * Operations include:
     181                 :            :  * dump, find, add, remove, is_empty, find_next_reservable_window, etc.
     182                 :            :  *
     183                 :            :  * We use a red-black tree to represent per-filesystem reservation
     184                 :            :  * windows.
     185                 :            :  *
     186                 :            :  */
     187                 :            : 
     188                 :            : /**
     189                 :            :  * __rsv_window_dump() -- Dump the filesystem block allocation reservation map
     190                 :            :  * @rb_root:            root of per-filesystem reservation rb tree
     191                 :            :  * @verbose:            verbose mode
     192                 :            :  * @fn:                 function which wishes to dump the reservation map
     193                 :            :  *
     194                 :            :  * If verbose is turned on, it will print the whole block reservation
     195                 :            :  * windows(start, end). Otherwise, it will only print out the "bad" windows,
     196                 :            :  * those windows that overlap with their immediate neighbors.
     197                 :            :  */
     198                 :            : #if 1
     199                 :          0 : static void __rsv_window_dump(struct rb_root *root, int verbose,
     200                 :            :                               const char *fn)
     201                 :            : {
     202                 :            :         struct rb_node *n;
     203                 :            :         struct ext2_reserve_window_node *rsv, *prev;
     204                 :            :         int bad;
     205                 :            : 
     206                 :            : restart:
     207                 :          0 :         n = rb_first(root);
     208                 :            :         bad = 0;
     209                 :            :         prev = NULL;
     210                 :            : 
     211                 :          0 :         printk("Block Allocation Reservation Windows Map (%s):\n", fn);
     212         [ #  # ]:          0 :         while (n) {
     213                 :            :                 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
     214         [ #  # ]:          0 :                 if (verbose)
     215                 :          0 :                         printk("reservation window 0x%p "
     216                 :            :                                 "start: %lu, end: %lu\n",
     217                 :            :                                 rsv, rsv->rsv_start, rsv->rsv_end);
     218 [ #  # ][ #  # ]:          0 :                 if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
     219                 :          0 :                         printk("Bad reservation %p (start >= end)\n",
     220                 :            :                                rsv);
     221                 :            :                         bad = 1;
     222                 :            :                 }
     223 [ #  # ][ #  # ]:          0 :                 if (prev && prev->rsv_end >= rsv->rsv_start) {
     224                 :          0 :                         printk("Bad reservation %p (prev->end >= start)\n",
     225                 :            :                                rsv);
     226                 :            :                         bad = 1;
     227                 :            :                 }
     228         [ #  # ]:          0 :                 if (bad) {
     229         [ #  # ]:          0 :                         if (!verbose) {
     230                 :          0 :                                 printk("Restarting reservation walk in verbose mode\n");
     231                 :            :                                 verbose = 1;
     232                 :          0 :                                 goto restart;
     233                 :            :                         }
     234                 :            :                 }
     235                 :          0 :                 n = rb_next(n);
     236                 :            :                 prev = rsv;
     237                 :            :         }
     238                 :          0 :         printk("Window map complete.\n");
     239         [ #  # ]:          0 :         BUG_ON(bad);
     240                 :          0 : }
     241                 :            : #define rsv_window_dump(root, verbose) \
     242                 :            :         __rsv_window_dump((root), (verbose), __func__)
     243                 :            : #else
     244                 :            : #define rsv_window_dump(root, verbose) do {} while (0)
     245                 :            : #endif
     246                 :            : 
     247                 :            : /**
     248                 :            :  * goal_in_my_reservation()
     249                 :            :  * @rsv:                inode's reservation window
     250                 :            :  * @grp_goal:           given goal block relative to the allocation block group
     251                 :            :  * @group:              the current allocation block group
     252                 :            :  * @sb:                 filesystem super block
     253                 :            :  *
     254                 :            :  * Test if the given goal block (group relative) is within the file's
     255                 :            :  * own block reservation window range.
     256                 :            :  *
     257                 :            :  * If the reservation window is outside the goal allocation group, return 0;
     258                 :            :  * grp_goal (given goal block) could be -1, which means no specific
     259                 :            :  * goal block. In this case, always return 1.
     260                 :            :  * If the goal block is within the reservation window, return 1;
     261                 :            :  * otherwise, return 0;
     262                 :            :  */
     263                 :            : static int
     264                 :          0 : goal_in_my_reservation(struct ext2_reserve_window *rsv, ext2_grpblk_t grp_goal,
     265                 :            :                         unsigned int group, struct super_block * sb)
     266                 :            : {
     267                 :            :         ext2_fsblk_t group_first_block, group_last_block;
     268                 :            : 
     269                 :            :         group_first_block = ext2_group_first_block_no(sb, group);
     270                 :          0 :         group_last_block = group_first_block + EXT2_BLOCKS_PER_GROUP(sb) - 1;
     271                 :            : 
     272 [ #  # ][ #  # ]:          0 :         if ((rsv->_rsv_start > group_last_block) ||
     273                 :          0 :             (rsv->_rsv_end < group_first_block))
     274                 :            :                 return 0;
     275 [ #  # ][ #  # ]:          0 :         if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
     276         [ #  # ]:          0 :                 || (grp_goal + group_first_block > rsv->_rsv_end)))
     277                 :            :                 return 0;
     278                 :          0 :         return 1;
     279                 :            : }
     280                 :            : 
     281                 :            : /**
     282                 :            :  * search_reserve_window()
     283                 :            :  * @rb_root:            root of reservation tree
     284                 :            :  * @goal:               target allocation block
     285                 :            :  *
     286                 :            :  * Find the reserved window which includes the goal, or the previous one
     287                 :            :  * if the goal is not in any window.
     288                 :            :  * Returns NULL if there are no windows or if all windows start after the goal.
     289                 :            :  */
     290                 :            : static struct ext2_reserve_window_node *
     291                 :          0 : search_reserve_window(struct rb_root *root, ext2_fsblk_t goal)
     292                 :            : {
     293                 :          0 :         struct rb_node *n = root->rb_node;
     294                 :            :         struct ext2_reserve_window_node *rsv;
     295                 :            : 
     296         [ #  # ]:          0 :         if (!n)
     297                 :            :                 return NULL;
     298                 :            : 
     299                 :            :         do {
     300                 :            :                 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
     301                 :            : 
     302         [ #  # ]:          0 :                 if (goal < rsv->rsv_start)
     303                 :          0 :                         n = n->rb_left;
     304         [ #  # ]:          0 :                 else if (goal > rsv->rsv_end)
     305                 :          0 :                         n = n->rb_right;
     306                 :            :                 else
     307                 :            :                         return rsv;
     308         [ #  # ]:          0 :         } while (n);
     309                 :            :         /*
     310                 :            :          * We've fallen off the end of the tree: the goal wasn't inside
     311                 :            :          * any particular node.  OK, the previous node must be to one
     312                 :            :          * side of the interval containing the goal.  If it's the RHS,
     313                 :            :          * we need to back up one.
     314                 :            :          */
     315         [ #  # ]:          0 :         if (rsv->rsv_start > goal) {
     316                 :          0 :                 n = rb_prev(&rsv->rsv_node);
     317                 :            :                 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
     318                 :            :         }
     319                 :          0 :         return rsv;
     320                 :            : }
     321                 :            : 
     322                 :            : /*
     323                 :            :  * ext2_rsv_window_add() -- Insert a window to the block reservation rb tree.
     324                 :            :  * @sb:                 super block
     325                 :            :  * @rsv:                reservation window to add
     326                 :            :  *
     327                 :            :  * Must be called with rsv_lock held.
     328                 :            :  */
     329                 :          0 : void ext2_rsv_window_add(struct super_block *sb,
     330                 :            :                     struct ext2_reserve_window_node *rsv)
     331                 :            : {
     332                 :          0 :         struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
     333                 :          0 :         struct rb_node *node = &rsv->rsv_node;
     334                 :          0 :         ext2_fsblk_t start = rsv->rsv_start;
     335                 :            : 
     336                 :            :         struct rb_node ** p = &root->rb_node;
     337                 :            :         struct rb_node * parent = NULL;
     338                 :            :         struct ext2_reserve_window_node *this;
     339                 :            : 
     340         [ #  # ]:          0 :         while (*p)
     341                 :            :         {
     342                 :            :                 parent = *p;
     343                 :            :                 this = rb_entry(parent, struct ext2_reserve_window_node, rsv_node);
     344                 :            : 
     345         [ #  # ]:          0 :                 if (start < this->rsv_start)
     346                 :          0 :                         p = &(*p)->rb_left;
     347         [ #  # ]:          0 :                 else if (start > this->rsv_end)
     348                 :          0 :                         p = &(*p)->rb_right;
     349                 :            :                 else {
     350                 :          0 :                         rsv_window_dump(root, 1);
     351                 :          0 :                         BUG();
     352                 :            :                 }
     353                 :            :         }
     354                 :            : 
     355                 :            :         rb_link_node(node, parent, p);
     356                 :          0 :         rb_insert_color(node, root);
     357                 :          0 : }
     358                 :            : 
     359                 :            : /**
     360                 :            :  * rsv_window_remove() -- unlink a window from the reservation rb tree
     361                 :            :  * @sb:                 super block
     362                 :            :  * @rsv:                reservation window to remove
     363                 :            :  *
     364                 :            :  * Mark the block reservation window as not allocated, and unlink it
     365                 :            :  * from the filesystem reservation window rb tree. Must be called with
     366                 :            :  * rsv_lock held.
     367                 :            :  */
     368                 :          0 : static void rsv_window_remove(struct super_block *sb,
     369                 :            :                               struct ext2_reserve_window_node *rsv)
     370                 :            : {
     371                 :          0 :         rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
     372                 :          0 :         rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
     373                 :          0 :         rsv->rsv_alloc_hit = 0;
     374                 :          0 :         rb_erase(&rsv->rsv_node, &EXT2_SB(sb)->s_rsv_window_root);
     375                 :            : }
     376                 :            : 
     377                 :            : /*
     378                 :            :  * rsv_is_empty() -- Check if the reservation window is allocated.
     379                 :            :  * @rsv:                given reservation window to check
     380                 :            :  *
     381                 :            :  * returns 1 if the end block is EXT2_RESERVE_WINDOW_NOT_ALLOCATED.
     382                 :            :  */
     383                 :            : static inline int rsv_is_empty(struct ext2_reserve_window *rsv)
     384                 :            : {
     385                 :            :         /* a valid reservation end block could not be 0 */
     386                 :            :         return (rsv->_rsv_end == EXT2_RESERVE_WINDOW_NOT_ALLOCATED);
     387                 :            : }
     388                 :            : 
     389                 :            : /**
     390                 :            :  * ext2_init_block_alloc_info()
     391                 :            :  * @inode:              file inode structure
     392                 :            :  *
     393                 :            :  * Allocate and initialize the  reservation window structure, and
     394                 :            :  * link the window to the ext2 inode structure at last
     395                 :            :  *
     396                 :            :  * The reservation window structure is only dynamically allocated
     397                 :            :  * and linked to ext2 inode the first time the open file
     398                 :            :  * needs a new block. So, before every ext2_new_block(s) call, for
     399                 :            :  * regular files, we should check whether the reservation window
     400                 :            :  * structure exists or not. In the latter case, this function is called.
     401                 :            :  * Fail to do so will result in block reservation being turned off for that
     402                 :            :  * open file.
     403                 :            :  *
     404                 :            :  * This function is called from ext2_get_blocks_handle(), also called
     405                 :            :  * when setting the reservation window size through ioctl before the file
     406                 :            :  * is open for write (needs block allocation).
     407                 :            :  *
     408                 :            :  * Needs truncate_mutex protection prior to calling this function.
     409                 :            :  */
     410                 :          0 : void ext2_init_block_alloc_info(struct inode *inode)
     411                 :            : {
     412                 :            :         struct ext2_inode_info *ei = EXT2_I(inode);
     413                 :            :         struct ext2_block_alloc_info *block_i;
     414                 :          0 :         struct super_block *sb = inode->i_sb;
     415                 :            : 
     416                 :            :         block_i = kmalloc(sizeof(*block_i), GFP_NOFS);
     417         [ #  # ]:          0 :         if (block_i) {
     418                 :            :                 struct ext2_reserve_window_node *rsv = &block_i->rsv_window_node;
     419                 :            : 
     420                 :          0 :                 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
     421                 :          0 :                 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
     422                 :            : 
     423                 :            :                 /*
     424                 :            :                  * if filesystem is mounted with NORESERVATION, the goal
     425                 :            :                  * reservation window size is set to zero to indicate
     426                 :            :                  * block reservation is off
     427                 :            :                  */
     428         [ #  # ]:          0 :                 if (!test_opt(sb, RESERVATION))
     429                 :          0 :                         rsv->rsv_goal_size = 0;
     430                 :            :                 else
     431                 :          0 :                         rsv->rsv_goal_size = EXT2_DEFAULT_RESERVE_BLOCKS;
     432                 :          0 :                 rsv->rsv_alloc_hit = 0;
     433                 :          0 :                 block_i->last_alloc_logical_block = 0;
     434                 :          0 :                 block_i->last_alloc_physical_block = 0;
     435                 :            :         }
     436                 :          0 :         ei->i_block_alloc_info = block_i;
     437                 :          0 : }
     438                 :            : 
     439                 :            : /**
     440                 :            :  * ext2_discard_reservation()
     441                 :            :  * @inode:              inode
     442                 :            :  *
     443                 :            :  * Discard(free) block reservation window on last file close, or truncate
     444                 :            :  * or at last iput().
     445                 :            :  *
     446                 :            :  * It is being called in three cases:
     447                 :            :  *      ext2_release_file(): last writer closes the file
     448                 :            :  *      ext2_clear_inode(): last iput(), when nobody links to this file.
     449                 :            :  *      ext2_truncate(): when the block indirect map is about to change.
     450                 :            :  */
     451                 :          0 : void ext2_discard_reservation(struct inode *inode)
     452                 :            : {
     453                 :            :         struct ext2_inode_info *ei = EXT2_I(inode);
     454                 :          0 :         struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
     455                 :            :         struct ext2_reserve_window_node *rsv;
     456                 :          0 :         spinlock_t *rsv_lock = &EXT2_SB(inode->i_sb)->s_rsv_window_lock;
     457                 :            : 
     458         [ #  # ]:          0 :         if (!block_i)
     459                 :          0 :                 return;
     460                 :            : 
     461                 :            :         rsv = &block_i->rsv_window_node;
     462         [ #  # ]:          0 :         if (!rsv_is_empty(&rsv->rsv_window)) {
     463                 :            :                 spin_lock(rsv_lock);
     464         [ #  # ]:          0 :                 if (!rsv_is_empty(&rsv->rsv_window))
     465                 :          0 :                         rsv_window_remove(inode->i_sb, rsv);
     466                 :            :                 spin_unlock(rsv_lock);
     467                 :            :         }
     468                 :            : }
     469                 :            : 
     470                 :            : /**
     471                 :            :  * ext2_free_blocks() -- Free given blocks and update quota and i_blocks
     472                 :            :  * @inode:              inode
     473                 :            :  * @block:              start physical block to free
     474                 :            :  * @count:              number of blocks to free
     475                 :            :  */
     476                 :          0 : void ext2_free_blocks (struct inode * inode, unsigned long block,
     477                 :            :                        unsigned long count)
     478                 :            : {
     479                 :            :         struct buffer_head *bitmap_bh = NULL;
     480                 :            :         struct buffer_head * bh2;
     481                 :            :         unsigned long block_group;
     482                 :            :         unsigned long bit;
     483                 :            :         unsigned long i;
     484                 :            :         unsigned long overflow;
     485                 :          0 :         struct super_block * sb = inode->i_sb;
     486                 :            :         struct ext2_sb_info * sbi = EXT2_SB(sb);
     487                 :            :         struct ext2_group_desc * desc;
     488                 :          0 :         struct ext2_super_block * es = sbi->s_es;
     489                 :            :         unsigned freed = 0, group_freed;
     490                 :            : 
     491 [ #  # ][ #  # ]:          0 :         if (block < le32_to_cpu(es->s_first_data_block) ||
     492         [ #  # ]:          0 :             block + count < block ||
     493                 :          0 :             block + count > le32_to_cpu(es->s_blocks_count)) {
     494                 :          0 :                 ext2_error (sb, "ext2_free_blocks",
     495                 :            :                             "Freeing blocks not in datazone - "
     496                 :            :                             "block = %lu, count = %lu", block, count);
     497                 :          0 :                 goto error_return;
     498                 :            :         }
     499                 :            : 
     500                 :            :         ext2_debug ("freeing block(s) %lu-%lu\n", block, block + count - 1);
     501                 :            : 
     502                 :            : do_more:
     503                 :            :         overflow = 0;
     504                 :          0 :         block_group = (block - le32_to_cpu(es->s_first_data_block)) /
     505                 :          0 :                       EXT2_BLOCKS_PER_GROUP(sb);
     506                 :          0 :         bit = (block - le32_to_cpu(es->s_first_data_block)) %
     507                 :            :                       EXT2_BLOCKS_PER_GROUP(sb);
     508                 :            :         /*
     509                 :            :          * Check to see if we are freeing blocks across a group
     510                 :            :          * boundary.
     511                 :            :          */
     512         [ #  # ]:          0 :         if (bit + count > EXT2_BLOCKS_PER_GROUP(sb)) {
     513                 :          0 :                 overflow = bit + count - EXT2_BLOCKS_PER_GROUP(sb);
     514                 :          0 :                 count -= overflow;
     515                 :            :         }
     516                 :            :         brelse(bitmap_bh);
     517                 :          0 :         bitmap_bh = read_block_bitmap(sb, block_group);
     518         [ #  # ]:          0 :         if (!bitmap_bh)
     519                 :            :                 goto error_return;
     520                 :            : 
     521                 :          0 :         desc = ext2_get_group_desc (sb, block_group, &bh2);
     522         [ #  # ]:          0 :         if (!desc)
     523                 :            :                 goto error_return;
     524                 :            : 
     525 [ #  # ][ #  # ]:          0 :         if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) ||
                 [ #  # ]
     526 [ #  # ][ #  # ]:          0 :             in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) ||
     527         [ #  # ]:          0 :             in_range (block, le32_to_cpu(desc->bg_inode_table),
     528         [ #  # ]:          0 :                       sbi->s_itb_per_group) ||
     529         [ #  # ]:          0 :             in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table),
     530                 :            :                       sbi->s_itb_per_group)) {
     531                 :          0 :                 ext2_error (sb, "ext2_free_blocks",
     532                 :            :                             "Freeing blocks in system zones - "
     533                 :            :                             "Block = %lu, count = %lu",
     534                 :            :                             block, count);
     535                 :          0 :                 goto error_return;
     536                 :            :         }
     537                 :            : 
     538         [ #  # ]:          0 :         for (i = 0, group_freed = 0; i < count; i++) {
     539         [ #  # ]:          0 :                 if (!ext2_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
     540                 :            :                                                 bit + i, bitmap_bh->b_data)) {
     541                 :          0 :                         ext2_error(sb, __func__,
     542                 :            :                                 "bit already cleared for block %lu", block + i);
     543                 :            :                 } else {
     544                 :          0 :                         group_freed++;
     545                 :            :                 }
     546                 :            :         }
     547                 :            : 
     548                 :          0 :         mark_buffer_dirty(bitmap_bh);
     549         [ #  # ]:          0 :         if (sb->s_flags & MS_SYNCHRONOUS)
     550                 :          0 :                 sync_dirty_buffer(bitmap_bh);
     551                 :            : 
     552                 :          0 :         group_adjust_blocks(sb, block_group, desc, bh2, group_freed);
     553                 :          0 :         freed += group_freed;
     554                 :            : 
     555         [ #  # ]:          0 :         if (overflow) {
     556                 :            :                 block += count;
     557                 :            :                 count = overflow;
     558                 :            :                 goto do_more;
     559                 :            :         }
     560                 :            : error_return:
     561                 :            :         brelse(bitmap_bh);
     562         [ #  # ]:          0 :         if (freed) {
     563                 :          0 :                 percpu_counter_add(&sbi->s_freeblocks_counter, freed);
     564                 :            :                 dquot_free_block_nodirty(inode, freed);
     565                 :            :                 mark_inode_dirty(inode);
     566                 :            :         }
     567                 :          0 : }
     568                 :            : 
     569                 :            : /**
     570                 :            :  * bitmap_search_next_usable_block()
     571                 :            :  * @start:              the starting block (group relative) of the search
     572                 :            :  * @bh:                 bufferhead contains the block group bitmap
     573                 :            :  * @maxblocks:          the ending block (group relative) of the reservation
     574                 :            :  *
     575                 :            :  * The bitmap search --- search forward through the actual bitmap on disk until
     576                 :            :  * we find a bit free.
     577                 :            :  */
     578                 :            : static ext2_grpblk_t
     579                 :            : bitmap_search_next_usable_block(ext2_grpblk_t start, struct buffer_head *bh,
     580                 :            :                                         ext2_grpblk_t maxblocks)
     581                 :            : {
     582                 :            :         ext2_grpblk_t next;
     583                 :            : 
     584                 :            :         next = ext2_find_next_zero_bit(bh->b_data, maxblocks, start);
     585 [ #  # ][ #  # ]:          0 :         if (next >= maxblocks)
     586                 :            :                 return -1;
     587                 :            :         return next;
     588                 :            : }
     589                 :            : 
     590                 :            : /**
     591                 :            :  * find_next_usable_block()
     592                 :            :  * @start:              the starting block (group relative) to find next
     593                 :            :  *                      allocatable block in bitmap.
     594                 :            :  * @bh:                 bufferhead contains the block group bitmap
     595                 :            :  * @maxblocks:          the ending block (group relative) for the search
     596                 :            :  *
     597                 :            :  * Find an allocatable block in a bitmap.  We perform the "most
     598                 :            :  * appropriate allocation" algorithm of looking for a free block near
     599                 :            :  * the initial goal; then for a free byte somewhere in the bitmap;
     600                 :            :  * then for any free bit in the bitmap.
     601                 :            :  */
     602                 :            : static ext2_grpblk_t
     603                 :          0 : find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
     604                 :            : {
     605                 :            :         ext2_grpblk_t here, next;
     606                 :            :         char *p, *r;
     607                 :            : 
     608         [ #  # ]:          0 :         if (start > 0) {
     609                 :            :                 /*
     610                 :            :                  * The goal was occupied; search forward for a free 
     611                 :            :                  * block within the next XX blocks.
     612                 :            :                  *
     613                 :            :                  * end_goal is more or less random, but it has to be
     614                 :            :                  * less than EXT2_BLOCKS_PER_GROUP. Aligning up to the
     615                 :            :                  * next 64-bit boundary is simple..
     616                 :            :                  */
     617                 :          0 :                 ext2_grpblk_t end_goal = (start + 63) & ~63;
     618         [ #  # ]:          0 :                 if (end_goal > maxblocks)
     619                 :            :                         end_goal = maxblocks;
     620                 :          0 :                 here = ext2_find_next_zero_bit(bh->b_data, end_goal, start);
     621         [ #  # ]:          0 :                 if (here < end_goal)
     622                 :            :                         return here;
     623                 :            :                 ext2_debug("Bit not found near goal\n");
     624                 :            :         }
     625                 :            : 
     626                 :            :         here = start;
     627         [ #  # ]:          0 :         if (here < 0)
     628                 :            :                 here = 0;
     629                 :            : 
     630                 :          0 :         p = ((char *)bh->b_data) + (here >> 3);
     631                 :          0 :         r = memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
     632                 :          0 :         next = (r - ((char *)bh->b_data)) << 3;
     633                 :            : 
     634         [ #  # ]:          0 :         if (next < maxblocks && next >= here)
     635                 :            :                 return next;
     636                 :            : 
     637                 :            :         here = bitmap_search_next_usable_block(here, bh, maxblocks);
     638                 :            :         return here;
     639                 :            : }
     640                 :            : 
     641                 :            : /**
     642                 :            :  * ext2_try_to_allocate()
     643                 :            :  * @sb:                 superblock
     644                 :            :  * @group:              given allocation block group
     645                 :            :  * @bitmap_bh:          bufferhead holds the block bitmap
     646                 :            :  * @grp_goal:           given target block within the group
     647                 :            :  * @count:              target number of blocks to allocate
     648                 :            :  * @my_rsv:             reservation window
     649                 :            :  *
     650                 :            :  * Attempt to allocate blocks within a give range. Set the range of allocation
     651                 :            :  * first, then find the first free bit(s) from the bitmap (within the range),
     652                 :            :  * and at last, allocate the blocks by claiming the found free bit as allocated.
     653                 :            :  *
     654                 :            :  * To set the range of this allocation:
     655                 :            :  *      if there is a reservation window, only try to allocate block(s)
     656                 :            :  *      from the file's own reservation window;
     657                 :            :  *      Otherwise, the allocation range starts from the give goal block,
     658                 :            :  *      ends at the block group's last block.
     659                 :            :  *
     660                 :            :  * If we failed to allocate the desired block then we may end up crossing to a
     661                 :            :  * new bitmap.
     662                 :            :  */
     663                 :            : static int
     664                 :          0 : ext2_try_to_allocate(struct super_block *sb, int group,
     665                 :            :                         struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
     666                 :            :                         unsigned long *count,
     667                 :            :                         struct ext2_reserve_window *my_rsv)
     668                 :            : {
     669                 :            :         ext2_fsblk_t group_first_block;
     670                 :            :         ext2_grpblk_t start, end;
     671                 :            :         unsigned long num = 0;
     672                 :            : 
     673                 :            :         /* we do allocation within the reservation window if we have a window */
     674         [ #  # ]:          0 :         if (my_rsv) {
     675                 :          0 :                 group_first_block = ext2_group_first_block_no(sb, group);
     676         [ #  # ]:          0 :                 if (my_rsv->_rsv_start >= group_first_block)
     677                 :          0 :                         start = my_rsv->_rsv_start - group_first_block;
     678                 :            :                 else
     679                 :            :                         /* reservation window cross group boundary */
     680                 :            :                         start = 0;
     681                 :          0 :                 end = my_rsv->_rsv_end - group_first_block + 1;
     682         [ #  # ]:          0 :                 if (end > EXT2_BLOCKS_PER_GROUP(sb))
     683                 :            :                         /* reservation window crosses group boundary */
     684                 :          0 :                         end = EXT2_BLOCKS_PER_GROUP(sb);
     685         [ #  # ]:          0 :                 if ((start <= grp_goal) && (grp_goal < end))
     686                 :            :                         start = grp_goal;
     687                 :            :                 else
     688                 :            :                         grp_goal = -1;
     689                 :            :         } else {
     690         [ #  # ]:          0 :                 if (grp_goal > 0)
     691                 :            :                         start = grp_goal;
     692                 :            :                 else
     693                 :            :                         start = 0;
     694                 :          0 :                 end = EXT2_BLOCKS_PER_GROUP(sb);
     695                 :            :         }
     696                 :            : 
     697         [ #  # ]:          0 :         BUG_ON(start > EXT2_BLOCKS_PER_GROUP(sb));
     698                 :            : 
     699                 :            : repeat:
     700         [ #  # ]:          0 :         if (grp_goal < 0) {
     701                 :          0 :                 grp_goal = find_next_usable_block(start, bitmap_bh, end);
     702         [ #  # ]:          0 :                 if (grp_goal < 0)
     703                 :            :                         goto fail_access;
     704         [ #  # ]:          0 :                 if (!my_rsv) {
     705                 :            :                         int i;
     706                 :            : 
     707 [ #  # ][ #  # ]:          0 :                         for (i = 0; i < 7 && grp_goal > start &&
     708                 :          0 :                                         !ext2_test_bit(grp_goal - 1,
     709                 :          0 :                                                         bitmap_bh->b_data);
     710                 :          0 :                                         i++, grp_goal--)
     711                 :            :                                 ;
     712                 :            :                 }
     713                 :            :         }
     714                 :            :         start = grp_goal;
     715                 :            : 
     716         [ #  # ]:          0 :         if (ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group), grp_goal,
     717                 :            :                                                         bitmap_bh->b_data)) {
     718                 :            :                 /*
     719                 :            :                  * The block was allocated by another thread, or it was
     720                 :            :                  * allocated and then freed by another thread
     721                 :            :                  */
     722                 :          0 :                 start++;
     723                 :            :                 grp_goal++;
     724         [ #  # ]:          0 :                 if (start >= end)
     725                 :            :                         goto fail_access;
     726                 :            :                 goto repeat;
     727                 :            :         }
     728                 :            :         num++;
     729                 :          0 :         grp_goal++;
     730 [ #  # ][ #  # ]:          0 :         while (num < *count && grp_goal < end
     731         [ #  # ]:          0 :                 && !ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group),
     732                 :            :                                         grp_goal, bitmap_bh->b_data)) {
     733                 :          0 :                 num++;
     734                 :          0 :                 grp_goal++;
     735                 :            :         }
     736                 :          0 :         *count = num;
     737                 :          0 :         return grp_goal - num;
     738                 :            : fail_access:
     739                 :          0 :         *count = num;
     740                 :          0 :         return -1;
     741                 :            : }
     742                 :            : 
     743                 :            : /**
     744                 :            :  *      find_next_reservable_window():
     745                 :            :  *              find a reservable space within the given range.
     746                 :            :  *              It does not allocate the reservation window for now:
     747                 :            :  *              alloc_new_reservation() will do the work later.
     748                 :            :  *
     749                 :            :  *      @search_head: the head of the searching list;
     750                 :            :  *              This is not necessarily the list head of the whole filesystem
     751                 :            :  *
     752                 :            :  *              We have both head and start_block to assist the search
     753                 :            :  *              for the reservable space. The list starts from head,
     754                 :            :  *              but we will shift to the place where start_block is,
     755                 :            :  *              then start from there, when looking for a reservable space.
     756                 :            :  *
     757                 :            :  *      @size: the target new reservation window size
     758                 :            :  *
     759                 :            :  *      @group_first_block: the first block we consider to start
     760                 :            :  *                      the real search from
     761                 :            :  *
     762                 :            :  *      @last_block:
     763                 :            :  *              the maximum block number that our goal reservable space
     764                 :            :  *              could start from. This is normally the last block in this
     765                 :            :  *              group. The search will end when we found the start of next
     766                 :            :  *              possible reservable space is out of this boundary.
     767                 :            :  *              This could handle the cross boundary reservation window
     768                 :            :  *              request.
     769                 :            :  *
     770                 :            :  *      basically we search from the given range, rather than the whole
     771                 :            :  *      reservation double linked list, (start_block, last_block)
     772                 :            :  *      to find a free region that is of my size and has not
     773                 :            :  *      been reserved.
     774                 :            :  *
     775                 :            :  */
     776                 :          0 : static int find_next_reservable_window(
     777                 :            :                                 struct ext2_reserve_window_node *search_head,
     778                 :            :                                 struct ext2_reserve_window_node *my_rsv,
     779                 :            :                                 struct super_block * sb,
     780                 :            :                                 ext2_fsblk_t start_block,
     781                 :            :                                 ext2_fsblk_t last_block)
     782                 :            : {
     783                 :            :         struct rb_node *next;
     784                 :            :         struct ext2_reserve_window_node *rsv, *prev;
     785                 :            :         ext2_fsblk_t cur;
     786                 :          0 :         int size = my_rsv->rsv_goal_size;
     787                 :            : 
     788                 :            :         /* TODO: make the start of the reservation window byte-aligned */
     789                 :            :         /* cur = *start_block & ~7;*/
     790                 :            :         cur = start_block;
     791                 :            :         rsv = search_head;
     792         [ #  # ]:          0 :         if (!rsv)
     793                 :            :                 return -1;
     794                 :            : 
     795                 :            :         while (1) {
     796         [ #  # ]:          0 :                 if (cur <= rsv->rsv_end)
     797                 :          0 :                         cur = rsv->rsv_end + 1;
     798                 :            : 
     799                 :            :                 /* TODO?
     800                 :            :                  * in the case we could not find a reservable space
     801                 :            :                  * that is what is expected, during the re-search, we could
     802                 :            :                  * remember what's the largest reservable space we could have
     803                 :            :                  * and return that one.
     804                 :            :                  *
     805                 :            :                  * For now it will fail if we could not find the reservable
     806                 :            :                  * space with expected-size (or more)...
     807                 :            :                  */
     808         [ #  # ]:          0 :                 if (cur > last_block)
     809                 :            :                         return -1;              /* fail */
     810                 :            : 
     811                 :            :                 prev = rsv;
     812                 :          0 :                 next = rb_next(&rsv->rsv_node);
     813                 :            :                 rsv = rb_entry(next,struct ext2_reserve_window_node,rsv_node);
     814                 :            : 
     815                 :            :                 /*
     816                 :            :                  * Reached the last reservation, we can just append to the
     817                 :            :                  * previous one.
     818                 :            :                  */
     819         [ #  # ]:          0 :                 if (!next)
     820                 :            :                         break;
     821                 :            : 
     822         [ #  # ]:          0 :                 if (cur + size <= rsv->rsv_start) {
     823                 :            :                         /*
     824                 :            :                          * Found a reserveable space big enough.  We could
     825                 :            :                          * have a reservation across the group boundary here
     826                 :            :                          */
     827                 :            :                         break;
     828                 :            :                 }
     829                 :            :         }
     830                 :            :         /*
     831                 :            :          * we come here either :
     832                 :            :          * when we reach the end of the whole list,
     833                 :            :          * and there is empty reservable space after last entry in the list.
     834                 :            :          * append it to the end of the list.
     835                 :            :          *
     836                 :            :          * or we found one reservable space in the middle of the list,
     837                 :            :          * return the reservation window that we could append to.
     838                 :            :          * succeed.
     839                 :            :          */
     840                 :            : 
     841 [ #  # ][ #  # ]:          0 :         if ((prev != my_rsv) && (!rsv_is_empty(&my_rsv->rsv_window)))
     842                 :            :                 rsv_window_remove(sb, my_rsv);
     843                 :            : 
     844                 :            :         /*
     845                 :            :          * Let's book the whole available window for now.  We will check the
     846                 :            :          * disk bitmap later and then, if there are free blocks then we adjust
     847                 :            :          * the window size if it's larger than requested.
     848                 :            :          * Otherwise, we will remove this node from the tree next time
     849                 :            :          * call find_next_reservable_window.
     850                 :            :          */
     851                 :          0 :         my_rsv->rsv_start = cur;
     852                 :          0 :         my_rsv->rsv_end = cur + size - 1;
     853                 :          0 :         my_rsv->rsv_alloc_hit = 0;
     854                 :            : 
     855         [ #  # ]:          0 :         if (prev != my_rsv)
     856                 :          0 :                 ext2_rsv_window_add(sb, my_rsv);
     857                 :            : 
     858                 :            :         return 0;
     859                 :            : }
     860                 :            : 
     861                 :            : /**
     862                 :            :  *      alloc_new_reservation()--allocate a new reservation window
     863                 :            :  *
     864                 :            :  *              To make a new reservation, we search part of the filesystem
     865                 :            :  *              reservation list (the list that inside the group). We try to
     866                 :            :  *              allocate a new reservation window near the allocation goal,
     867                 :            :  *              or the beginning of the group, if there is no goal.
     868                 :            :  *
     869                 :            :  *              We first find a reservable space after the goal, then from
     870                 :            :  *              there, we check the bitmap for the first free block after
     871                 :            :  *              it. If there is no free block until the end of group, then the
     872                 :            :  *              whole group is full, we failed. Otherwise, check if the free
     873                 :            :  *              block is inside the expected reservable space, if so, we
     874                 :            :  *              succeed.
     875                 :            :  *              If the first free block is outside the reservable space, then
     876                 :            :  *              start from the first free block, we search for next available
     877                 :            :  *              space, and go on.
     878                 :            :  *
     879                 :            :  *      on succeed, a new reservation will be found and inserted into the list
     880                 :            :  *      It contains at least one free block, and it does not overlap with other
     881                 :            :  *      reservation windows.
     882                 :            :  *
     883                 :            :  *      failed: we failed to find a reservation window in this group
     884                 :            :  *
     885                 :            :  *      @rsv: the reservation
     886                 :            :  *
     887                 :            :  *      @grp_goal: The goal (group-relative).  It is where the search for a
     888                 :            :  *              free reservable space should start from.
     889                 :            :  *              if we have a goal(goal >0 ), then start from there,
     890                 :            :  *              no goal(goal = -1), we start from the first block
     891                 :            :  *              of the group.
     892                 :            :  *
     893                 :            :  *      @sb: the super block
     894                 :            :  *      @group: the group we are trying to allocate in
     895                 :            :  *      @bitmap_bh: the block group block bitmap
     896                 :            :  *
     897                 :            :  */
     898                 :          0 : static int alloc_new_reservation(struct ext2_reserve_window_node *my_rsv,
     899                 :          0 :                 ext2_grpblk_t grp_goal, struct super_block *sb,
     900                 :          0 :                 unsigned int group, struct buffer_head *bitmap_bh)
     901                 :            : {
     902                 :            :         struct ext2_reserve_window_node *search_head;
     903                 :            :         ext2_fsblk_t group_first_block, group_end_block, start_block;
     904                 :            :         ext2_grpblk_t first_free_block;
     905                 :          0 :         struct rb_root *fs_rsv_root = &EXT2_SB(sb)->s_rsv_window_root;
     906                 :            :         unsigned long size;
     907                 :            :         int ret;
     908                 :            :         spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
     909                 :            : 
     910                 :            :         group_first_block = ext2_group_first_block_no(sb, group);
     911                 :          0 :         group_end_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
     912                 :            : 
     913         [ #  # ]:          0 :         if (grp_goal < 0)
     914                 :            :                 start_block = group_first_block;
     915                 :            :         else
     916                 :          0 :                 start_block = grp_goal + group_first_block;
     917                 :            : 
     918                 :          0 :         size = my_rsv->rsv_goal_size;
     919                 :            : 
     920         [ #  # ]:          0 :         if (!rsv_is_empty(&my_rsv->rsv_window)) {
     921                 :            :                 /*
     922                 :            :                  * if the old reservation is cross group boundary
     923                 :            :                  * and if the goal is inside the old reservation window,
     924                 :            :                  * we will come here when we just failed to allocate from
     925                 :            :                  * the first part of the window. We still have another part
     926                 :            :                  * that belongs to the next group. In this case, there is no
     927                 :            :                  * point to discard our window and try to allocate a new one
     928                 :            :                  * in this group(which will fail). we should
     929                 :            :                  * keep the reservation window, just simply move on.
     930                 :            :                  *
     931                 :            :                  * Maybe we could shift the start block of the reservation
     932                 :            :                  * window to the first block of next group.
     933                 :            :                  */
     934                 :            : 
     935 [ #  # ][ #  # ]:          0 :                 if ((my_rsv->rsv_start <= group_end_block) &&
     936         [ #  # ]:          0 :                                 (my_rsv->rsv_end > group_end_block) &&
     937                 :            :                                 (start_block >= my_rsv->rsv_start))
     938                 :            :                         return -1;
     939                 :            : 
     940         [ #  # ]:          0 :                 if ((my_rsv->rsv_alloc_hit >
     941                 :          0 :                      (my_rsv->rsv_end - my_rsv->rsv_start + 1) / 2)) {
     942                 :            :                         /*
     943                 :            :                          * if the previously allocation hit ratio is
     944                 :            :                          * greater than 1/2, then we double the size of
     945                 :            :                          * the reservation window the next time,
     946                 :            :                          * otherwise we keep the same size window
     947                 :            :                          */
     948                 :          0 :                         size = size * 2;
     949         [ #  # ]:          0 :                         if (size > EXT2_MAX_RESERVE_BLOCKS)
     950                 :            :                                 size = EXT2_MAX_RESERVE_BLOCKS;
     951                 :          0 :                         my_rsv->rsv_goal_size= size;
     952                 :            :                 }
     953                 :            :         }
     954                 :            : 
     955                 :            :         spin_lock(rsv_lock);
     956                 :            :         /*
     957                 :            :          * shift the search start to the window near the goal block
     958                 :            :          */
     959                 :          0 :         search_head = search_reserve_window(fs_rsv_root, start_block);
     960                 :            : 
     961                 :            :         /*
     962                 :            :          * find_next_reservable_window() simply finds a reservable window
     963                 :            :          * inside the given range(start_block, group_end_block).
     964                 :            :          *
     965                 :            :          * To make sure the reservation window has a free bit inside it, we
     966                 :            :          * need to check the bitmap after we found a reservable window.
     967                 :            :          */
     968                 :            : retry:
     969                 :          0 :         ret = find_next_reservable_window(search_head, my_rsv, sb,
     970                 :            :                                                 start_block, group_end_block);
     971                 :            : 
     972         [ #  # ]:          0 :         if (ret == -1) {
     973         [ #  # ]:          0 :                 if (!rsv_is_empty(&my_rsv->rsv_window))
     974                 :            :                         rsv_window_remove(sb, my_rsv);
     975                 :            :                 spin_unlock(rsv_lock);
     976                 :          0 :                 return -1;
     977                 :            :         }
     978                 :            : 
     979                 :            :         /*
     980                 :            :          * On success, find_next_reservable_window() returns the
     981                 :            :          * reservation window where there is a reservable space after it.
     982                 :            :          * Before we reserve this reservable space, we need
     983                 :            :          * to make sure there is at least a free block inside this region.
     984                 :            :          *
     985                 :            :          * Search the first free bit on the block bitmap.  Search starts from
     986                 :            :          * the start block of the reservable space we just found.
     987                 :            :          */
     988                 :            :         spin_unlock(rsv_lock);
     989                 :          0 :         first_free_block = bitmap_search_next_usable_block(
     990                 :          0 :                         my_rsv->rsv_start - group_first_block,
     991                 :          0 :                         bitmap_bh, group_end_block - group_first_block + 1);
     992                 :            : 
     993         [ #  # ]:          0 :         if (first_free_block < 0) {
     994                 :            :                 /*
     995                 :            :                  * no free block left on the bitmap, no point
     996                 :            :                  * to reserve the space. return failed.
     997                 :            :                  */
     998                 :            :                 spin_lock(rsv_lock);
     999         [ #  # ]:          0 :                 if (!rsv_is_empty(&my_rsv->rsv_window))
    1000                 :            :                         rsv_window_remove(sb, my_rsv);
    1001                 :            :                 spin_unlock(rsv_lock);
    1002                 :          0 :                 return -1;              /* failed */
    1003                 :            :         }
    1004                 :            : 
    1005                 :          0 :         start_block = first_free_block + group_first_block;
    1006                 :            :         /*
    1007                 :            :          * check if the first free block is within the
    1008                 :            :          * free space we just reserved
    1009                 :            :          */
    1010 [ #  # ][ #  # ]:          0 :         if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
    1011                 :            :                 return 0;               /* success */
    1012                 :            :         /*
    1013                 :            :          * if the first free bit we found is out of the reservable space
    1014                 :            :          * continue search for next reservable space,
    1015                 :            :          * start from where the free block is,
    1016                 :            :          * we also shift the list head to where we stopped last time
    1017                 :            :          */
    1018                 :            :         search_head = my_rsv;
    1019                 :            :         spin_lock(rsv_lock);
    1020                 :            :         goto retry;
    1021                 :            : }
    1022                 :            : 
    1023                 :            : /**
    1024                 :            :  * try_to_extend_reservation()
    1025                 :            :  * @my_rsv:             given reservation window
    1026                 :            :  * @sb:                 super block
    1027                 :            :  * @size:               the delta to extend
    1028                 :            :  *
    1029                 :            :  * Attempt to expand the reservation window large enough to have
    1030                 :            :  * required number of free blocks
    1031                 :            :  *
    1032                 :            :  * Since ext2_try_to_allocate() will always allocate blocks within
    1033                 :            :  * the reservation window range, if the window size is too small,
    1034                 :            :  * multiple blocks allocation has to stop at the end of the reservation
    1035                 :            :  * window. To make this more efficient, given the total number of
    1036                 :            :  * blocks needed and the current size of the window, we try to
    1037                 :            :  * expand the reservation window size if necessary on a best-effort
    1038                 :            :  * basis before ext2_new_blocks() tries to allocate blocks.
    1039                 :            :  */
    1040                 :          0 : static void try_to_extend_reservation(struct ext2_reserve_window_node *my_rsv,
    1041                 :          0 :                         struct super_block *sb, int size)
    1042                 :            : {
    1043                 :            :         struct ext2_reserve_window_node *next_rsv;
    1044                 :            :         struct rb_node *next;
    1045                 :            :         spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
    1046                 :            : 
    1047         [ #  # ]:          0 :         if (!spin_trylock(rsv_lock))
    1048                 :          0 :                 return;
    1049                 :            : 
    1050                 :          0 :         next = rb_next(&my_rsv->rsv_node);
    1051                 :            : 
    1052         [ #  # ]:          0 :         if (!next)
    1053                 :          0 :                 my_rsv->rsv_end += size;
    1054                 :            :         else {
    1055                 :            :                 next_rsv = rb_entry(next, struct ext2_reserve_window_node, rsv_node);
    1056                 :            : 
    1057         [ #  # ]:          0 :                 if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
    1058                 :          0 :                         my_rsv->rsv_end += size;
    1059                 :            :                 else
    1060                 :          0 :                         my_rsv->rsv_end = next_rsv->rsv_start - 1;
    1061                 :            :         }
    1062                 :            :         spin_unlock(rsv_lock);
    1063                 :            : }
    1064                 :            : 
    1065                 :            : /**
    1066                 :            :  * ext2_try_to_allocate_with_rsv()
    1067                 :            :  * @sb:                 superblock
    1068                 :            :  * @group:              given allocation block group
    1069                 :            :  * @bitmap_bh:          bufferhead holds the block bitmap
    1070                 :            :  * @grp_goal:           given target block within the group
    1071                 :            :  * @count:              target number of blocks to allocate
    1072                 :            :  * @my_rsv:             reservation window
    1073                 :            :  *
    1074                 :            :  * This is the main function used to allocate a new block and its reservation
    1075                 :            :  * window.
    1076                 :            :  *
    1077                 :            :  * Each time when a new block allocation is need, first try to allocate from
    1078                 :            :  * its own reservation.  If it does not have a reservation window, instead of
    1079                 :            :  * looking for a free bit on bitmap first, then look up the reservation list to
    1080                 :            :  * see if it is inside somebody else's reservation window, we try to allocate a
    1081                 :            :  * reservation window for it starting from the goal first. Then do the block
    1082                 :            :  * allocation within the reservation window.
    1083                 :            :  *
    1084                 :            :  * This will avoid keeping on searching the reservation list again and
    1085                 :            :  * again when somebody is looking for a free block (without
    1086                 :            :  * reservation), and there are lots of free blocks, but they are all
    1087                 :            :  * being reserved.
    1088                 :            :  *
    1089                 :            :  * We use a red-black tree for the per-filesystem reservation list.
    1090                 :            :  */
    1091                 :            : static ext2_grpblk_t
    1092                 :          0 : ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
    1093                 :            :                         struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
    1094                 :            :                         struct ext2_reserve_window_node * my_rsv,
    1095                 :            :                         unsigned long *count)
    1096                 :            : {
    1097                 :            :         ext2_fsblk_t group_first_block, group_last_block;
    1098                 :            :         ext2_grpblk_t ret = 0;
    1099                 :          0 :         unsigned long num = *count;
    1100                 :            : 
    1101                 :            :         /*
    1102                 :            :          * we don't deal with reservation when
    1103                 :            :          * filesystem is mounted without reservation
    1104                 :            :          * or the file is not a regular file
    1105                 :            :          * or last attempt to allocate a block with reservation turned on failed
    1106                 :            :          */
    1107         [ #  # ]:          0 :         if (my_rsv == NULL) {
    1108                 :          0 :                 return ext2_try_to_allocate(sb, group, bitmap_bh,
    1109                 :            :                                                 grp_goal, count, NULL);
    1110                 :            :         }
    1111                 :            :         /*
    1112                 :            :          * grp_goal is a group relative block number (if there is a goal)
    1113                 :            :          * 0 <= grp_goal < EXT2_BLOCKS_PER_GROUP(sb)
    1114                 :            :          * first block is a filesystem wide block number
    1115                 :            :          * first block is the block number of the first block in this group
    1116                 :            :          */
    1117                 :            :         group_first_block = ext2_group_first_block_no(sb, group);
    1118                 :          0 :         group_last_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
    1119                 :            : 
    1120                 :            :         /*
    1121                 :            :          * Basically we will allocate a new block from inode's reservation
    1122                 :            :          * window.
    1123                 :            :          *
    1124                 :            :          * We need to allocate a new reservation window, if:
    1125                 :            :          * a) inode does not have a reservation window; or
    1126                 :            :          * b) last attempt to allocate a block from existing reservation
    1127                 :            :          *    failed; or
    1128                 :            :          * c) we come here with a goal and with a reservation window
    1129                 :            :          *
    1130                 :            :          * We do not need to allocate a new reservation window if we come here
    1131                 :            :          * at the beginning with a goal and the goal is inside the window, or
    1132                 :            :          * we don't have a goal but already have a reservation window.
    1133                 :            :          * then we could go to allocate from the reservation window directly.
    1134                 :            :          */
    1135                 :            :         while (1) {
    1136         [ #  # ]:          0 :                 if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) ||
           [ #  #  #  # ]
    1137                 :          0 :                         !goal_in_my_reservation(&my_rsv->rsv_window,
    1138                 :            :                                                 grp_goal, group, sb)) {
    1139         [ #  # ]:          0 :                         if (my_rsv->rsv_goal_size < *count)
    1140                 :          0 :                                 my_rsv->rsv_goal_size = *count;
    1141                 :          0 :                         ret = alloc_new_reservation(my_rsv, grp_goal, sb,
    1142                 :            :                                                         group, bitmap_bh);
    1143         [ #  # ]:          0 :                         if (ret < 0)
    1144                 :            :                                 break;                  /* failed */
    1145                 :            : 
    1146         [ #  # ]:          0 :                         if (!goal_in_my_reservation(&my_rsv->rsv_window,
    1147                 :            :                                                         grp_goal, group, sb))
    1148                 :            :                                 grp_goal = -1;
    1149         [ #  # ]:          0 :                 } else if (grp_goal >= 0) {
    1150                 :          0 :                         int curr = my_rsv->rsv_end -
    1151                 :          0 :                                         (grp_goal + group_first_block) + 1;
    1152                 :            : 
    1153         [ #  # ]:          0 :                         if (curr < *count)
    1154                 :          0 :                                 try_to_extend_reservation(my_rsv, sb,
    1155                 :          0 :                                                         *count - curr);
    1156                 :            :                 }
    1157                 :            : 
    1158 [ #  # ][ #  # ]:          0 :                 if ((my_rsv->rsv_start > group_last_block) ||
    1159                 :          0 :                                 (my_rsv->rsv_end < group_first_block)) {
    1160                 :          0 :                         rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1);
    1161                 :          0 :                         BUG();
    1162                 :            :                 }
    1163                 :          0 :                 ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal,
    1164                 :            :                                            &num, &my_rsv->rsv_window);
    1165         [ #  # ]:          0 :                 if (ret >= 0) {
    1166                 :          0 :                         my_rsv->rsv_alloc_hit += num;
    1167                 :          0 :                         *count = num;
    1168                 :          0 :                         break;                          /* succeed */
    1169                 :            :                 }
    1170                 :          0 :                 num = *count;
    1171                 :          0 :         }
    1172                 :          0 :         return ret;
    1173                 :            : }
    1174                 :            : 
    1175                 :            : /**
    1176                 :            :  * ext2_has_free_blocks()
    1177                 :            :  * @sbi:                in-core super block structure.
    1178                 :            :  *
    1179                 :            :  * Check if filesystem has at least 1 free block available for allocation.
    1180                 :            :  */
    1181                 :          0 : static int ext2_has_free_blocks(struct ext2_sb_info *sbi)
    1182                 :            : {
    1183                 :            :         ext2_fsblk_t free_blocks, root_blocks;
    1184                 :            : 
    1185                 :          0 :         free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
    1186                 :          0 :         root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
    1187 [ #  # ][ #  # ]:          0 :         if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
                 [ #  # ]
    1188         [ #  # ]:          0 :                 !uid_eq(sbi->s_resuid, current_fsuid()) &&
    1189         [ #  # ]:          0 :                 (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) ||
    1190                 :          0 :                  !in_group_p (sbi->s_resgid))) {
    1191                 :            :                 return 0;
    1192                 :            :         }
    1193                 :            :         return 1;
    1194                 :            : }
    1195                 :            : 
    1196                 :            : /*
    1197                 :            :  * ext2_new_blocks() -- core block(s) allocation function
    1198                 :            :  * @inode:              file inode
    1199                 :            :  * @goal:               given target block(filesystem wide)
    1200                 :            :  * @count:              target number of blocks to allocate
    1201                 :            :  * @errp:               error code
    1202                 :            :  *
    1203                 :            :  * ext2_new_blocks uses a goal block to assist allocation.  If the goal is
    1204                 :            :  * free, or there is a free block within 32 blocks of the goal, that block
    1205                 :            :  * is allocated.  Otherwise a forward search is made for a free block; within 
    1206                 :            :  * each block group the search first looks for an entire free byte in the block
    1207                 :            :  * bitmap, and then for any free bit if that fails.
    1208                 :            :  * This function also updates quota and i_blocks field.
    1209                 :            :  */
    1210                 :          0 : ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal,
    1211                 :            :                     unsigned long *count, int *errp)
    1212                 :            : {
    1213                 :            :         struct buffer_head *bitmap_bh = NULL;
    1214                 :            :         struct buffer_head *gdp_bh;
    1215                 :            :         int group_no;
    1216                 :            :         int goal_group;
    1217                 :            :         ext2_grpblk_t grp_target_blk;   /* blockgroup relative goal block */
    1218                 :            :         ext2_grpblk_t grp_alloc_blk;    /* blockgroup-relative allocated block*/
    1219                 :            :         ext2_fsblk_t ret_block;         /* filesyetem-wide allocated block */
    1220                 :            :         int bgi;                        /* blockgroup iteration index */
    1221                 :            :         int performed_allocation = 0;
    1222                 :            :         ext2_grpblk_t free_blocks;      /* number of free blocks in a group */
    1223                 :          0 :         struct super_block *sb;
    1224                 :            :         struct ext2_group_desc *gdp;
    1225                 :            :         struct ext2_super_block *es;
    1226                 :            :         struct ext2_sb_info *sbi;
    1227                 :            :         struct ext2_reserve_window_node *my_rsv = NULL;
    1228                 :            :         struct ext2_block_alloc_info *block_i;
    1229                 :            :         unsigned short windowsz = 0;
    1230                 :            :         unsigned long ngroups;
    1231                 :          0 :         unsigned long num = *count;
    1232                 :            :         int ret;
    1233                 :            : 
    1234                 :          0 :         *errp = -ENOSPC;
    1235                 :          0 :         sb = inode->i_sb;
    1236                 :            : 
    1237                 :            :         /*
    1238                 :            :          * Check quota for allocation of this block.
    1239                 :            :          */
    1240                 :          0 :         ret = dquot_alloc_block(inode, num);
    1241         [ #  # ]:          0 :         if (ret) {
    1242                 :          0 :                 *errp = ret;
    1243                 :          0 :                 return 0;
    1244                 :            :         }
    1245                 :            : 
    1246                 :            :         sbi = EXT2_SB(sb);
    1247                 :          0 :         es = EXT2_SB(sb)->s_es;
    1248                 :            :         ext2_debug("goal=%lu.\n", goal);
    1249                 :            :         /*
    1250                 :            :          * Allocate a block from reservation only when
    1251                 :            :          * filesystem is mounted with reservation(default,-o reservation), and
    1252                 :            :          * it's a regular file, and
    1253                 :            :          * the desired window size is greater than 0 (One could use ioctl
    1254                 :            :          * command EXT2_IOC_SETRSVSZ to set the window size to 0 to turn off
    1255                 :            :          * reservation on that particular file)
    1256                 :            :          */
    1257                 :          0 :         block_i = EXT2_I(inode)->i_block_alloc_info;
    1258         [ #  # ]:          0 :         if (block_i) {
    1259                 :          0 :                 windowsz = block_i->rsv_window_node.rsv_goal_size;
    1260         [ #  # ]:          0 :                 if (windowsz > 0)
    1261                 :          0 :                         my_rsv = &block_i->rsv_window_node;
    1262                 :            :         }
    1263                 :            : 
    1264         [ #  # ]:          0 :         if (!ext2_has_free_blocks(sbi)) {
    1265                 :          0 :                 *errp = -ENOSPC;
    1266                 :          0 :                 goto out;
    1267                 :            :         }
    1268                 :            : 
    1269                 :            :         /*
    1270                 :            :          * First, test whether the goal block is free.
    1271                 :            :          */
    1272 [ #  # ][ #  # ]:          0 :         if (goal < le32_to_cpu(es->s_first_data_block) ||
    1273                 :          0 :             goal >= le32_to_cpu(es->s_blocks_count))
    1274                 :            :                 goal = le32_to_cpu(es->s_first_data_block);
    1275                 :          0 :         group_no = (goal - le32_to_cpu(es->s_first_data_block)) /
    1276                 :          0 :                         EXT2_BLOCKS_PER_GROUP(sb);
    1277                 :            :         goal_group = group_no;
    1278                 :            : retry_alloc:
    1279                 :          0 :         gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
    1280         [ #  # ]:          0 :         if (!gdp)
    1281                 :            :                 goto io_error;
    1282                 :            : 
    1283                 :          0 :         free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
    1284                 :            :         /*
    1285                 :            :          * if there is not enough free blocks to make a new resevation
    1286                 :            :          * turn off reservation for this allocation
    1287                 :            :          */
    1288 [ #  # ][ #  # ]:          0 :         if (my_rsv && (free_blocks < windowsz)
    1289         [ #  # ]:          0 :                 && (free_blocks > 0)
    1290         [ #  # ]:          0 :                 && (rsv_is_empty(&my_rsv->rsv_window)))
    1291                 :            :                 my_rsv = NULL;
    1292                 :            : 
    1293         [ #  # ]:          0 :         if (free_blocks > 0) {
    1294                 :          0 :                 grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) %
    1295                 :          0 :                                 EXT2_BLOCKS_PER_GROUP(sb));
    1296                 :          0 :                 bitmap_bh = read_block_bitmap(sb, group_no);
    1297         [ #  # ]:          0 :                 if (!bitmap_bh)
    1298                 :            :                         goto io_error;
    1299                 :          0 :                 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
    1300                 :            :                                         bitmap_bh, grp_target_blk,
    1301                 :            :                                         my_rsv, &num);
    1302         [ #  # ]:          0 :                 if (grp_alloc_blk >= 0)
    1303                 :            :                         goto allocated;
    1304                 :            :         }
    1305                 :            : 
    1306                 :          0 :         ngroups = EXT2_SB(sb)->s_groups_count;
    1307                 :          0 :         smp_rmb();
    1308                 :            : 
    1309                 :            :         /*
    1310                 :            :          * Now search the rest of the groups.  We assume that
    1311                 :            :          * group_no and gdp correctly point to the last group visited.
    1312                 :            :          */
    1313         [ #  # ]:          0 :         for (bgi = 0; bgi < ngroups; bgi++) {
    1314                 :          0 :                 group_no++;
    1315         [ #  # ]:          0 :                 if (group_no >= ngroups)
    1316                 :            :                         group_no = 0;
    1317                 :          0 :                 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
    1318         [ #  # ]:          0 :                 if (!gdp)
    1319                 :            :                         goto io_error;
    1320                 :            : 
    1321                 :          0 :                 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
    1322                 :            :                 /*
    1323                 :            :                  * skip this group (and avoid loading bitmap) if there
    1324                 :            :                  * are no free blocks
    1325                 :            :                  */
    1326         [ #  # ]:          0 :                 if (!free_blocks)
    1327                 :          0 :                         continue;
    1328                 :            :                 /*
    1329                 :            :                  * skip this group if the number of
    1330                 :            :                  * free blocks is less than half of the reservation
    1331                 :            :                  * window size.
    1332                 :            :                  */
    1333 [ #  # ][ #  # ]:          0 :                 if (my_rsv && (free_blocks <= (windowsz/2)))
    1334                 :          0 :                         continue;
    1335                 :            : 
    1336                 :            :                 brelse(bitmap_bh);
    1337                 :          0 :                 bitmap_bh = read_block_bitmap(sb, group_no);
    1338         [ #  # ]:          0 :                 if (!bitmap_bh)
    1339                 :            :                         goto io_error;
    1340                 :            :                 /*
    1341                 :            :                  * try to allocate block(s) from this group, without a goal(-1).
    1342                 :            :                  */
    1343                 :          0 :                 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
    1344                 :            :                                         bitmap_bh, -1, my_rsv, &num);
    1345         [ #  # ]:          0 :                 if (grp_alloc_blk >= 0)
    1346                 :            :                         goto allocated;
    1347                 :            :         }
    1348                 :            :         /*
    1349                 :            :          * We may end up a bogus earlier ENOSPC error due to
    1350                 :            :          * filesystem is "full" of reservations, but
    1351                 :            :          * there maybe indeed free blocks available on disk
    1352                 :            :          * In this case, we just forget about the reservations
    1353                 :            :          * just do block allocation as without reservations.
    1354                 :            :          */
    1355         [ #  # ]:          0 :         if (my_rsv) {
    1356                 :            :                 my_rsv = NULL;
    1357                 :            :                 windowsz = 0;
    1358                 :            :                 group_no = goal_group;
    1359                 :            :                 goto retry_alloc;
    1360                 :            :         }
    1361                 :            :         /* No space left on the device */
    1362                 :          0 :         *errp = -ENOSPC;
    1363                 :          0 :         goto out;
    1364                 :            : 
    1365                 :            : allocated:
    1366                 :            : 
    1367                 :            :         ext2_debug("using block group %d(%d)\n",
    1368                 :            :                         group_no, gdp->bg_free_blocks_count);
    1369                 :            : 
    1370                 :          0 :         ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
    1371                 :            : 
    1372 [ #  # ][ #  # ]:          0 :         if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) ||
                 [ #  # ]
    1373 [ #  # ][ #  # ]:          0 :             in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) ||
    1374         [ #  # ]:          0 :             in_range(ret_block, le32_to_cpu(gdp->bg_inode_table),
    1375         [ #  # ]:          0 :                       EXT2_SB(sb)->s_itb_per_group) ||
    1376         [ #  # ]:          0 :             in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table),
    1377                 :            :                       EXT2_SB(sb)->s_itb_per_group)) {
    1378                 :          0 :                 ext2_error(sb, "ext2_new_blocks",
    1379                 :            :                             "Allocating block in system zone - "
    1380                 :            :                             "blocks from "E2FSBLK", length %lu",
    1381                 :            :                             ret_block, num);
    1382                 :            :                 /*
    1383                 :            :                  * ext2_try_to_allocate marked the blocks we allocated as in
    1384                 :            :                  * use.  So we may want to selectively mark some of the blocks
    1385                 :            :                  * as free
    1386                 :            :                  */
    1387                 :          0 :                 goto retry_alloc;
    1388                 :            :         }
    1389                 :            : 
    1390                 :            :         performed_allocation = 1;
    1391                 :            : 
    1392         [ #  # ]:          0 :         if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) {
    1393                 :          0 :                 ext2_error(sb, "ext2_new_blocks",
    1394                 :            :                             "block("E2FSBLK") >= blocks count(%d) - "
    1395                 :            :                             "block_group = %d, es == %p ", ret_block,
    1396                 :            :                         le32_to_cpu(es->s_blocks_count), group_no, es);
    1397                 :          0 :                 goto out;
    1398                 :            :         }
    1399                 :            : 
    1400                 :          0 :         group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
    1401                 :          0 :         percpu_counter_sub(&sbi->s_freeblocks_counter, num);
    1402                 :            : 
    1403                 :          0 :         mark_buffer_dirty(bitmap_bh);
    1404         [ #  # ]:          0 :         if (sb->s_flags & MS_SYNCHRONOUS)
    1405                 :          0 :                 sync_dirty_buffer(bitmap_bh);
    1406                 :            : 
    1407                 :          0 :         *errp = 0;
    1408                 :            :         brelse(bitmap_bh);
    1409         [ #  # ]:          0 :         if (num < *count) {
    1410                 :          0 :                 dquot_free_block_nodirty(inode, *count-num);
    1411                 :            :                 mark_inode_dirty(inode);
    1412                 :          0 :                 *count = num;
    1413                 :            :         }
    1414                 :          0 :         return ret_block;
    1415                 :            : 
    1416                 :            : io_error:
    1417                 :          0 :         *errp = -EIO;
    1418                 :            : out:
    1419                 :            :         /*
    1420                 :            :          * Undo the block allocation
    1421                 :            :          */
    1422         [ #  # ]:          0 :         if (!performed_allocation) {
    1423                 :          0 :                 dquot_free_block_nodirty(inode, *count);
    1424                 :            :                 mark_inode_dirty(inode);
    1425                 :            :         }
    1426                 :            :         brelse(bitmap_bh);
    1427                 :            :         return 0;
    1428                 :            : }
    1429                 :            : 
    1430                 :          0 : ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
    1431                 :            : {
    1432                 :          0 :         unsigned long count = 1;
    1433                 :            : 
    1434                 :          0 :         return ext2_new_blocks(inode, goal, &count, errp);
    1435                 :            : }
    1436                 :            : 
    1437                 :            : #ifdef EXT2FS_DEBUG
    1438                 :            : 
    1439                 :            : unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars)
    1440                 :            : {
    1441                 :            :         return numchars * BITS_PER_BYTE - memweight(map->b_data, numchars);
    1442                 :            : }
    1443                 :            : 
    1444                 :            : #endif  /*  EXT2FS_DEBUG  */
    1445                 :            : 
    1446                 :          0 : unsigned long ext2_count_free_blocks (struct super_block * sb)
    1447                 :            : {
    1448                 :            :         struct ext2_group_desc * desc;
    1449                 :            :         unsigned long desc_count = 0;
    1450                 :            :         int i;
    1451                 :            : #ifdef EXT2FS_DEBUG
    1452                 :            :         unsigned long bitmap_count, x;
    1453                 :            :         struct ext2_super_block *es;
    1454                 :            : 
    1455                 :            :         es = EXT2_SB(sb)->s_es;
    1456                 :            :         desc_count = 0;
    1457                 :            :         bitmap_count = 0;
    1458                 :            :         desc = NULL;
    1459                 :            :         for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
    1460                 :            :                 struct buffer_head *bitmap_bh;
    1461                 :            :                 desc = ext2_get_group_desc (sb, i, NULL);
    1462                 :            :                 if (!desc)
    1463                 :            :                         continue;
    1464                 :            :                 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
    1465                 :            :                 bitmap_bh = read_block_bitmap(sb, i);
    1466                 :            :                 if (!bitmap_bh)
    1467                 :            :                         continue;
    1468                 :            :                 
    1469                 :            :                 x = ext2_count_free(bitmap_bh, sb->s_blocksize);
    1470                 :            :                 printk ("group %d: stored = %d, counted = %lu\n",
    1471                 :            :                         i, le16_to_cpu(desc->bg_free_blocks_count), x);
    1472                 :            :                 bitmap_count += x;
    1473                 :            :                 brelse(bitmap_bh);
    1474                 :            :         }
    1475                 :            :         printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
    1476                 :            :                 (long)le32_to_cpu(es->s_free_blocks_count),
    1477                 :            :                 desc_count, bitmap_count);
    1478                 :            :         return bitmap_count;
    1479                 :            : #else
    1480         [ #  # ]:          0 :         for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
    1481                 :          0 :                 desc = ext2_get_group_desc (sb, i, NULL);
    1482         [ #  # ]:          0 :                 if (!desc)
    1483                 :          0 :                         continue;
    1484                 :          0 :                 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
    1485                 :            :         }
    1486                 :          0 :         return desc_count;
    1487                 :            : #endif
    1488                 :            : }
    1489                 :            : 
    1490                 :            : static inline int test_root(int a, int b)
    1491                 :            : {
    1492                 :            :         int num = b;
    1493                 :            : 
    1494 [ #  # ][ #  # ]:          0 :         while (a > num)
                 [ #  # ]
    1495                 :          0 :                 num *= b;
    1496                 :            :         return num == a;
    1497                 :            : }
    1498                 :            : 
    1499                 :          0 : static int ext2_group_sparse(int group)
    1500                 :            : {
    1501         [ #  # ]:          0 :         if (group <= 1)
    1502                 :            :                 return 1;
    1503 [ #  # ][ #  # ]:          0 :         return (test_root(group, 3) || test_root(group, 5) ||
                 [ #  # ]
    1504                 :            :                 test_root(group, 7));
    1505                 :            : }
    1506                 :            : 
    1507                 :            : /**
    1508                 :            :  *      ext2_bg_has_super - number of blocks used by the superblock in group
    1509                 :            :  *      @sb: superblock for filesystem
    1510                 :            :  *      @group: group number to check
    1511                 :            :  *
    1512                 :            :  *      Return the number of blocks used by the superblock (primary or backup)
    1513                 :            :  *      in this group.  Currently this will be only 0 or 1.
    1514                 :            :  */
    1515                 :          0 : int ext2_bg_has_super(struct super_block *sb, int group)
    1516                 :            : {
    1517   [ #  #  #  # ]:          0 :         if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
    1518                 :          0 :             !ext2_group_sparse(group))
    1519                 :            :                 return 0;
    1520                 :          0 :         return 1;
    1521                 :            : }
    1522                 :            : 
    1523                 :            : /**
    1524                 :            :  *      ext2_bg_num_gdb - number of blocks used by the group table in group
    1525                 :            :  *      @sb: superblock for filesystem
    1526                 :            :  *      @group: group number to check
    1527                 :            :  *
    1528                 :            :  *      Return the number of blocks used by the group descriptor table
    1529                 :            :  *      (primary or backup) in this group.  In the future there may be a
    1530                 :            :  *      different number of descriptor blocks in each group.
    1531                 :            :  */
    1532                 :          0 : unsigned long ext2_bg_num_gdb(struct super_block *sb, int group)
    1533                 :            : {
    1534         [ #  # ]:          0 :         return ext2_bg_has_super(sb, group) ? EXT2_SB(sb)->s_gdb_count : 0;
    1535                 :            : }
    1536                 :            : 

Generated by: LCOV version 1.9