Loading fs/ext4/extents.c +7 −62 Original line number Diff line number Diff line Loading @@ -2535,77 +2535,22 @@ void ext4_ext_release(struct super_block *sb) #endif } static void bi_complete(struct bio *bio, int error) { complete((struct completion *)bio->bi_private); } /* FIXME!! we need to try to merge to left or right after zero-out */ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) { ext4_fsblk_t ee_pblock; unsigned int ee_len; int ret; struct bio *bio; int blkbits, blocksize; sector_t ee_pblock; struct completion event; unsigned int ee_len, len, done, offset; blkbits = inode->i_blkbits; blocksize = inode->i_sb->s_blocksize; ee_len = ext4_ext_get_actual_len(ex); ee_pblock = ext_pblock(ex); /* convert ee_pblock to 512 byte sectors */ ee_pblock = ee_pblock << (blkbits - 9); while (ee_len > 0) { if (ee_len > BIO_MAX_PAGES) len = BIO_MAX_PAGES; else len = ee_len; bio = bio_alloc(GFP_NOIO, len); if (!bio) return -ENOMEM; bio->bi_sector = ee_pblock; bio->bi_bdev = inode->i_sb->s_bdev; done = 0; offset = 0; while (done < len) { ret = bio_add_page(bio, ZERO_PAGE(0), blocksize, offset); if (ret != blocksize) { /* * We can't add any more pages because of * hardware limitations. Start a new bio. */ break; } done++; offset += blocksize; if (offset >= PAGE_CACHE_SIZE) offset = 0; } init_completion(&event); bio->bi_private = &event; bio->bi_end_io = bi_complete; submit_bio(WRITE, bio); wait_for_completion(&event); ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS, BLKDEV_IFL_WAIT); if (ret > 0) ret = 0; if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { bio_put(bio); return -EIO; } bio_put(bio); ee_len -= done; ee_pblock += done << (blkbits - 9); } return 0; return ret; } #define EXT4_EXT_ZERO_LEN 7 Loading Loading
fs/ext4/extents.c +7 −62 Original line number Diff line number Diff line Loading @@ -2535,77 +2535,22 @@ void ext4_ext_release(struct super_block *sb) #endif } static void bi_complete(struct bio *bio, int error) { complete((struct completion *)bio->bi_private); } /* FIXME!! we need to try to merge to left or right after zero-out */ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) { ext4_fsblk_t ee_pblock; unsigned int ee_len; int ret; struct bio *bio; int blkbits, blocksize; sector_t ee_pblock; struct completion event; unsigned int ee_len, len, done, offset; blkbits = inode->i_blkbits; blocksize = inode->i_sb->s_blocksize; ee_len = ext4_ext_get_actual_len(ex); ee_pblock = ext_pblock(ex); /* convert ee_pblock to 512 byte sectors */ ee_pblock = ee_pblock << (blkbits - 9); while (ee_len > 0) { if (ee_len > BIO_MAX_PAGES) len = BIO_MAX_PAGES; else len = ee_len; bio = bio_alloc(GFP_NOIO, len); if (!bio) return -ENOMEM; bio->bi_sector = ee_pblock; bio->bi_bdev = inode->i_sb->s_bdev; done = 0; offset = 0; while (done < len) { ret = bio_add_page(bio, ZERO_PAGE(0), blocksize, offset); if (ret != blocksize) { /* * We can't add any more pages because of * hardware limitations. Start a new bio. */ break; } done++; offset += blocksize; if (offset >= PAGE_CACHE_SIZE) offset = 0; } init_completion(&event); bio->bi_private = &event; bio->bi_end_io = bi_complete; submit_bio(WRITE, bio); wait_for_completion(&event); ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS, BLKDEV_IFL_WAIT); if (ret > 0) ret = 0; if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { bio_put(bio); return -EIO; } bio_put(bio); ee_len -= done; ee_pblock += done << (blkbits - 9); } return 0; return ret; } #define EXT4_EXT_ZERO_LEN 7 Loading