Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[safe/jmp/linux-2.6] / fs / ext3 / balloc.c
index dd4237e..27967f9 100644 (file)
@@ -117,7 +117,7 @@ static int ext3_valid_block_bitmap(struct super_block *sb,
                return 1;
 
 err_out:
-       ext3_error(sb, __FUNCTION__,
+       ext3_error(sb, __func__,
                        "Invalid block bitmap - "
                        "block_group = %d, block = %lu",
                        block_group, bitmap_blk);
@@ -147,7 +147,7 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
        bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
        bh = sb_getblk(sb, bitmap_blk);
        if (unlikely(!bh)) {
-               ext3_error(sb, __FUNCTION__,
+               ext3_error(sb, __func__,
                            "Cannot read block bitmap - "
                            "block_group = %d, block_bitmap = %u",
                            block_group, le32_to_cpu(desc->bg_block_bitmap));
@@ -158,16 +158,17 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
 
        if (bh_submit_read(bh) < 0) {
                brelse(bh);
-               ext3_error(sb, __FUNCTION__,
+               ext3_error(sb, __func__,
                            "Cannot read block bitmap - "
                            "block_group = %d, block_bitmap = %u",
                            block_group, le32_to_cpu(desc->bg_block_bitmap));
                return NULL;
        }
-       if (!ext3_valid_block_bitmap(sb, desc, block_group, bh)) {
-               brelse(bh);
-               return NULL;
-       }
+       ext3_valid_block_bitmap(sb, desc, block_group, bh);
+       /*
+        * file system mounted not to panic on error, continue with corrupt
+        * bitmap
+        */
        return bh;
 }
 /*
@@ -235,7 +236,7 @@ restart:
        BUG_ON(bad);
 }
 #define rsv_window_dump(root, verbose) \
-       __rsv_window_dump((root), (verbose), __FUNCTION__)
+       __rsv_window_dump((root), (verbose), __func__)
 #else
 #define rsv_window_dump(root, verbose) do {} while (0)
 #endif
@@ -617,7 +618,7 @@ do_more:
                if (!ext3_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
                                                bit + i, bitmap_bh->b_data)) {
                        jbd_unlock_bh_state(bitmap_bh);
-                       ext3_error(sb, __FUNCTION__,
+                       ext3_error(sb, __func__,
                                "bit already cleared for block "E3FSBLK,
                                 block + i);
                        jbd_lock_bh_state(bitmap_bh);
@@ -648,7 +649,7 @@ do_more:
                count = overflow;
                goto do_more;
        }
-       sb->s_dirt = 1;
+
 error_return:
        brelse(bitmap_bh);
        ext3_std_error(sb, err);
@@ -675,7 +676,7 @@ void ext3_free_blocks(handle_t *handle, struct inode *inode,
        }
        ext3_free_blocks_sb(handle, sb, block, count, &dquot_freed_blocks);
        if (dquot_freed_blocks)
-               DQUOT_FREE_BLOCK(inode, dquot_freed_blocks);
+               vfs_dq_free_block(inode, dquot_freed_blocks);
        return;
 }
 
@@ -1421,7 +1422,7 @@ static int ext3_has_free_blocks(struct ext3_sb_info *sbi)
        free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
        root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
        if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
-               sbi->s_resuid != current->fsuid &&
+               sbi->s_resuid != current_fsuid() &&
                (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
                return 0;
        }
@@ -1501,7 +1502,7 @@ ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode,
        /*
         * Check quota for allocation of this block.
         */
-       if (DQUOT_ALLOC_BLOCK(inode, num)) {
+       if (vfs_dq_alloc_block(inode, num)) {
                *errp = -EDQUOT;
                return 0;
        }
@@ -1546,6 +1547,7 @@ retry_alloc:
         * turn off reservation for this allocation
         */
        if (my_rsv && (free_blocks < windowsz)
+               && (free_blocks > 0)
                && (rsv_is_empty(&my_rsv->rsv_window)))
                my_rsv = NULL;
 
@@ -1584,7 +1586,7 @@ retry_alloc:
                 * free blocks is less than half of the reservation
                 * window size.
                 */
-               if (free_blocks <= (windowsz/2))
+               if (my_rsv && (free_blocks <= (windowsz/2)))
                        continue;
 
                brelse(bitmap_bh);
@@ -1641,7 +1643,11 @@ allocated:
                            "Allocating block in system zone - "
                            "blocks from "E3FSBLK", length %lu",
                             ret_block, num);
-               goto out;
+               /*
+                * claim_block() marked the blocks we allocated as in use. So we
+                * may want to selectively mark some of the blocks as free.
+                */
+               goto retry_alloc;
        }
 
        performed_allocation = 1;
@@ -1667,7 +1673,7 @@ allocated:
                        if (ext3_test_bit(grp_alloc_blk+i,
                                        bh2jh(bitmap_bh)->b_committed_data)) {
                                printk("%s: block was unexpectedly set in "
-                                       "b_committed_data\n", __FUNCTION__);
+                                       "b_committed_data\n", __func__);
                        }
                }
        }
@@ -1702,13 +1708,12 @@ allocated:
        if (!fatal)
                fatal = err;
 
-       sb->s_dirt = 1;
        if (fatal)
                goto out;
 
        *errp = 0;
        brelse(bitmap_bh);
-       DQUOT_FREE_BLOCK(inode, *count-num);
+       vfs_dq_free_block(inode, *count-num);
        *count = num;
        return ret_block;
 
@@ -1723,7 +1728,7 @@ out:
         * Undo the block allocation
         */
        if (!performed_allocation)
-               DQUOT_FREE_BLOCK(inode, *count);
+               vfs_dq_free_block(inode, *count);
        brelse(bitmap_bh);
        return 0;
 }