diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 8393abf..878cbca 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c @@ -1935,14 +1935,14 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, * We will update one block bitmap, and one group descriptor */ handle = ext3_journal_start_sb(sb, 2); - if (IS_ERR(handle)) { - err = PTR_ERR(handle); - return err; - } + if (IS_ERR(handle)) + return PTR_ERR(handle); bitmap_bh = read_block_bitmap(sb, group); - if (!bitmap_bh) + if (!bitmap_bh) { + err = -EIO; goto err_out; + } BUFFER_TRACE(bitmap_bh, "getting undo access"); err = ext3_journal_get_undo_access(handle, bitmap_bh); @@ -1950,8 +1950,10 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, goto err_out; gdp = ext3_get_group_desc(sb, group, &gdp_bh); - if (!gdp) + if (!gdp) { + err = -EIO; goto err_out; + } BUFFER_TRACE(gdp_bh, "get_write_access"); err = ext3_journal_get_write_access(handle, gdp_bh); @@ -1963,7 +1965,6 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, /* Walk through the whole group */ while (start < max) { - start = bitmap_search_next_usable_block(start, bitmap_bh, max); if (start < 0) break; @@ -1997,7 +1998,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, goto free_extent; /* Send the TRIM command down to the device */ - ret = sb_issue_discard(sb, discard_block, next - start, + err = sb_issue_discard(sb, discard_block, next - start, GFP_NOFS, 0); count += (next - start); free_extent: @@ -2023,22 +2024,18 @@ free_extent: spin_lock(sb_bgl_lock(sbi, group)); le16_add_cpu(&gdp->bg_free_blocks_count, freed); spin_unlock(sb_bgl_lock(sbi, group)); - percpu_counter_add(&sbi->s_freeblocks_counter, next - start); + percpu_counter_add(&sbi->s_freeblocks_counter, freed); start = next; - if (ret < 0) { - if (ret == -EOPNOTSUPP) { - ext3_warning(sb, __func__, - "discard not supported!"); - count = ret; - break; - } - err = ret; + if (err < 0) { + if (err != -EOPNOTSUPP) + ext3_warning(sb, __func__, "Discard command " + "returned error %d\n", err); break; } if (fatal_signal_pending(current)) { - count = -ERESTARTSYS; + err = -ERESTARTSYS; break; } @@ -2063,12 +2060,10 @@ free_extent: count, group); err_out: - if (err) { - ext3_std_error(sb, err); + if (err) count = err; - } ext3_journal_stop(handle); brelse(bitmap_bh);