diff options
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/resize.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 1c3c2b56049d..3bb4e7b502ec 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -735,6 +735,52 @@ exit_err: | |||
735 | } | 735 | } |
736 | } | 736 | } |
737 | 737 | ||
738 | /* | ||
739 | * ext4_add_new_descs() adds @count group descriptor of groups | ||
740 | * starting at @group | ||
741 | * | ||
742 | * @handle: journal handle | ||
743 | * @sb: super block | ||
744 | * @group: the group no. of the first group desc to be added | ||
745 | * @resize_inode: the resize inode | ||
746 | * @count: number of group descriptors to be added | ||
747 | */ | ||
748 | static int ext4_add_new_descs(handle_t *handle, struct super_block *sb, | ||
749 | ext4_group_t group, struct inode *resize_inode, | ||
750 | ext4_group_t count) | ||
751 | { | ||
752 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
753 | struct ext4_super_block *es = sbi->s_es; | ||
754 | struct buffer_head *gdb_bh; | ||
755 | int i, gdb_off, gdb_num, err = 0; | ||
756 | |||
757 | for (i = 0; i < count; i++, group++) { | ||
758 | int reserved_gdb = ext4_bg_has_super(sb, group) ? | ||
759 | le16_to_cpu(es->s_reserved_gdt_blocks) : 0; | ||
760 | |||
761 | gdb_off = group % EXT4_DESC_PER_BLOCK(sb); | ||
762 | gdb_num = group / EXT4_DESC_PER_BLOCK(sb); | ||
763 | |||
764 | /* | ||
765 | * We will only either add reserved group blocks to a backup group | ||
766 | * or remove reserved blocks for the first group in a new group block. | ||
767 | * Doing both would be mean more complex code, and sane people don't | ||
768 | * use non-sparse filesystems anymore. This is already checked above. | ||
769 | */ | ||
770 | if (gdb_off) { | ||
771 | gdb_bh = sbi->s_group_desc[gdb_num]; | ||
772 | err = ext4_journal_get_write_access(handle, gdb_bh); | ||
773 | |||
774 | if (!err && reserved_gdb && ext4_bg_num_gdb(sb, group)) | ||
775 | err = reserve_backup_gdb(handle, resize_inode, group); | ||
776 | } else | ||
777 | err = add_new_gdb(handle, resize_inode, group); | ||
778 | if (err) | ||
779 | break; | ||
780 | } | ||
781 | return err; | ||
782 | } | ||
783 | |||
738 | /* Add group descriptor data to an existing or new group descriptor block. | 784 | /* Add group descriptor data to an existing or new group descriptor block. |
739 | * Ensure we handle all possible error conditions _before_ we start modifying | 785 | * Ensure we handle all possible error conditions _before_ we start modifying |
740 | * the filesystem, because we cannot abort the transaction and not have it | 786 | * the filesystem, because we cannot abort the transaction and not have it |