aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/migrate.c
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2013-04-10 23:32:52 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-04-10 23:32:52 -0400
commit0d14b098ce05c067e06eea5ed63d9b5c14656bdb (patch)
tree251da1c2ba46926a1fc2297f0303b97372cd8326 /fs/ext4/migrate.c
parentd6a771056b32146da1280f7872f6936b0c7770ea (diff)
ext4: move ext4_ind_migrate() into migrate.c
Move ext4_ind_migrate() into migrate.c file since it makes much more sense and ext4_ext_migrate() is there as well. Also fix tiny style problem - add spaces around "=" in "i=0". Signed-off-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/migrate.c')
-rw-r--r--fs/ext4/migrate.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c
index 480acf4a085f..d129a4dc16a7 100644
--- a/fs/ext4/migrate.c
+++ b/fs/ext4/migrate.c
@@ -426,7 +426,6 @@ static int free_ext_block(handle_t *handle, struct inode *inode)
426 return retval; 426 return retval;
427 } 427 }
428 return retval; 428 return retval;
429
430} 429}
431 430
432int ext4_ext_migrate(struct inode *inode) 431int ext4_ext_migrate(struct inode *inode)
@@ -606,3 +605,60 @@ out:
606 605
607 return retval; 606 return retval;
608} 607}
608
609/*
610 * Migrate a simple extent-based inode to use the i_blocks[] array
611 */
612int ext4_ind_migrate(struct inode *inode)
613{
614 struct ext4_extent_header *eh;
615 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
616 struct ext4_inode_info *ei = EXT4_I(inode);
617 struct ext4_extent *ex;
618 unsigned int i, len;
619 ext4_fsblk_t blk;
620 handle_t *handle;
621 int ret;
622
623 if (!EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb,
624 EXT4_FEATURE_INCOMPAT_EXTENTS) ||
625 (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
626 return -EINVAL;
627
628 handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, 1);
629 if (IS_ERR(handle))
630 return PTR_ERR(handle);
631
632 down_write(&EXT4_I(inode)->i_data_sem);
633 ret = ext4_ext_check_inode(inode);
634 if (ret)
635 goto errout;
636
637 eh = ext_inode_hdr(inode);
638 ex = EXT_FIRST_EXTENT(eh);
639 if (ext4_blocks_count(es) > EXT4_MAX_BLOCK_FILE_PHYS ||
640 eh->eh_depth != 0 || le16_to_cpu(eh->eh_entries) > 1) {
641 ret = -EOPNOTSUPP;
642 goto errout;
643 }
644 if (eh->eh_entries == 0)
645 blk = len = 0;
646 else {
647 len = le16_to_cpu(ex->ee_len);
648 blk = ext4_ext_pblock(ex);
649 if (len > EXT4_NDIR_BLOCKS) {
650 ret = -EOPNOTSUPP;
651 goto errout;
652 }
653 }
654
655 ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS);
656 memset(ei->i_data, 0, sizeof(ei->i_data));
657 for (i=0; i < len; i++)
658 ei->i_data[i] = cpu_to_le32(blk++);
659 ext4_mark_inode_dirty(handle, inode);
660errout:
661 ext4_journal_stop(handle);
662 up_write(&EXT4_I(inode)->i_data_sem);
663 return ret;
664}