]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ext4/balloc.c
Documentation: correction to debugging-via-ohci1394
[linux-2.6-omap-h63xx.git] / fs / ext4 / balloc.c
index 7ae223ed152f6eaff9ed62c22dd8b31ef29f8cce..0737e05ba3dd22842429f287356ca1c500265943 100644 (file)
@@ -577,6 +577,8 @@ void ext4_discard_reservation(struct inode *inode)
        struct ext4_reserve_window_node *rsv;
        spinlock_t *rsv_lock = &EXT4_SB(inode->i_sb)->s_rsv_window_lock;
 
+       ext4_mb_discard_inode_preallocations(inode);
+
        if (!block_i)
                return;
 
@@ -785,19 +787,29 @@ error_return:
  * @inode:             inode
  * @block:             start physical block to free
  * @count:             number of blocks to count
+ * @metadata:          Are these metadata blocks
  */
 void ext4_free_blocks(handle_t *handle, struct inode *inode,
-                       ext4_fsblk_t block, unsigned long count)
+                       ext4_fsblk_t block, unsigned long count,
+                       int metadata)
 {
        struct super_block * sb;
        unsigned long dquot_freed_blocks;
 
+       /* this isn't the right place to decide whether block is metadata
+        * inode.c/extents.c knows better, but for safety ... */
+       if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode) ||
+                       ext4_should_journal_data(inode))
+               metadata = 1;
+
        sb = inode->i_sb;
-       if (!sb) {
-               printk ("ext4_free_blocks: nonexistent device");
-               return;
-       }
-       ext4_free_blocks_sb(handle, sb, block, count, &dquot_freed_blocks);
+
+       if (!test_opt(sb, MBALLOC) || !EXT4_SB(sb)->s_group_info)
+               ext4_free_blocks_sb(handle, sb, block, count,
+                                               &dquot_freed_blocks);
+       else
+               ext4_mb_free_blocks(handle, inode, block, count,
+                                               metadata, &dquot_freed_blocks);
        if (dquot_freed_blocks)
                DQUOT_FREE_BLOCK(inode, dquot_freed_blocks);
        return;
@@ -1576,7 +1588,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
 }
 
 /**
- * ext4_new_blocks() -- core block(s) allocation function
+ * ext4_new_blocks_old() -- core block(s) allocation function
  * @handle:            handle to this transaction
  * @inode:             file inode
  * @goal:              given target block(filesystem wide)
@@ -1589,7 +1601,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
  * any specific goal block.
  *
  */
-ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
+ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode,
                        ext4_fsblk_t goal, unsigned long *count, int *errp)
 {
        struct buffer_head *bitmap_bh = NULL;
@@ -1630,7 +1642,7 @@ ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
 
        sbi = EXT4_SB(sb);
        es = EXT4_SB(sb)->s_es;
-       ext4_debug("goal=%lu.\n", goal);
+       ext4_debug("goal=%llu.\n", goal);
        /*
         * Allocate a block from reservation only when
         * filesystem is mounted with reservation(default,-o reservation), and
@@ -1688,7 +1700,7 @@ retry_alloc:
 
        /*
         * Now search the rest of the groups.  We assume that
-        * i and gdp correctly point to the last group visited.
+        * group_no and gdp correctly point to the last group visited.
         */
        for (bgi = 0; bgi < ngroups; bgi++) {
                group_no++;
@@ -1740,7 +1752,7 @@ retry_alloc:
 
 allocated:
 
-       ext4_debug("using block group %d(%d)\n",
+       ext4_debug("using block group %lu(%d)\n",
                        group_no, gdp->bg_free_blocks_count);
 
        BUFFER_TRACE(gdp_bh, "get_write_access");
@@ -1849,13 +1861,46 @@ out:
 }
 
 ext4_fsblk_t ext4_new_block(handle_t *handle, struct inode *inode,
-                       ext4_fsblk_t goal, int *errp)
+               ext4_fsblk_t goal, int *errp)
+{
+       struct ext4_allocation_request ar;
+       ext4_fsblk_t ret;
+
+       if (!test_opt(inode->i_sb, MBALLOC)) {
+               unsigned long count = 1;
+               ret = ext4_new_blocks_old(handle, inode, goal, &count, errp);
+               return ret;
+       }
+
+       memset(&ar, 0, sizeof(ar));
+       ar.inode = inode;
+       ar.goal = goal;
+       ar.len = 1;
+       ret = ext4_mb_new_blocks(handle, &ar, errp);
+       return ret;
+}
+
+ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
+               ext4_fsblk_t goal, unsigned long *count, int *errp)
 {
-       unsigned long count = 1;
+       struct ext4_allocation_request ar;
+       ext4_fsblk_t ret;
+
+       if (!test_opt(inode->i_sb, MBALLOC)) {
+               ret = ext4_new_blocks_old(handle, inode, goal, count, errp);
+               return ret;
+       }
 
-       return ext4_new_blocks(handle, inode, goal, &count, errp);
+       memset(&ar, 0, sizeof(ar));
+       ar.inode = inode;
+       ar.goal = goal;
+       ar.len = *count;
+       ret = ext4_mb_new_blocks(handle, &ar, errp);
+       *count = ar.len;
+       return ret;
 }
 
+
 /**
  * ext4_count_free_blocks() -- count filesystem free blocks
  * @sb:                superblock
@@ -1898,7 +1943,7 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb)
        brelse(bitmap_bh);
        printk("ext4_count_free_blocks: stored = %llu"
                ", computed = %llu, %llu\n",
-              EXT4_FREE_BLOCKS_COUNT(es),
+               ext4_free_blocks_count(es),
                desc_count, bitmap_count);
        return bitmap_count;
 #else
@@ -1966,11 +2011,7 @@ static unsigned long ext4_bg_num_gdb_meta(struct super_block *sb,
 static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb,
                                        ext4_group_t group)
 {
-       if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
-                               EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER) &&
-                       !ext4_group_sparse(group))
-               return 0;
-       return EXT4_SB(sb)->s_gdb_count;
+       return ext4_bg_has_super(sb, group) ? EXT4_SB(sb)->s_gdb_count : 0;
 }
 
 /**