Lines Matching +full:add +full:- +full:fs
2 * linux/fs/ext3/resize.c
27 struct ext3_super_block *es = sbi->s_es; in verify_group_input()
28 ext3_fsblk_t start = le32_to_cpu(es->s_blocks_count); in verify_group_input()
29 ext3_fsblk_t end = start + input->blocks_count; in verify_group_input()
30 unsigned group = input->group; in verify_group_input()
31 ext3_fsblk_t itend = input->inode_table + sbi->s_itb_per_group; in verify_group_input()
34 le16_to_cpu(es->s_reserved_gdt_blocks)) : 0; in verify_group_input()
38 int err = -EINVAL; in verify_group_input()
40 input->free_blocks_count = free_blocks_count = in verify_group_input()
41 input->blocks_count - 2 - overhead - sbi->s_itb_per_group; in verify_group_input()
44 printk(KERN_DEBUG "EXT3-fs: adding %s group %u: %u blocks " in verify_group_input()
46 ext3_bg_has_super(sb, input->group) ? "normal" : in verify_group_input()
47 "no-super", input->group, input->blocks_count, in verify_group_input()
48 free_blocks_count, input->reserved_blocks); in verify_group_input()
50 if (group != sbi->s_groups_count) in verify_group_input()
52 "Cannot add at group %u (only %lu groups)", in verify_group_input()
53 input->group, sbi->s_groups_count); in verify_group_input()
54 else if ((start - le32_to_cpu(es->s_first_data_block)) % in verify_group_input()
57 else if (input->reserved_blocks > input->blocks_count / 5) in verify_group_input()
59 input->reserved_blocks); in verify_group_input()
62 input->blocks_count); in verify_group_input()
63 else if (!(bh = sb_bread(sb, end - 1))) in verify_group_input()
66 end - 1); in verify_group_input()
67 else if (outside(input->block_bitmap, start, end)) in verify_group_input()
70 input->block_bitmap); in verify_group_input()
71 else if (outside(input->inode_bitmap, start, end)) in verify_group_input()
74 input->inode_bitmap); in verify_group_input()
75 else if (outside(input->inode_table, start, end) || in verify_group_input()
76 outside(itend - 1, start, end)) in verify_group_input()
78 "Inode table not in group (blocks %u-"E3FSBLK")", in verify_group_input()
79 input->inode_table, itend - 1); in verify_group_input()
80 else if (input->inode_bitmap == input->block_bitmap) in verify_group_input()
83 input->block_bitmap); in verify_group_input()
84 else if (inside(input->block_bitmap, input->inode_table, itend)) in verify_group_input()
86 "Block bitmap (%u) in inode table (%u-"E3FSBLK")", in verify_group_input()
87 input->block_bitmap, input->inode_table, itend-1); in verify_group_input()
88 else if (inside(input->inode_bitmap, input->inode_table, itend)) in verify_group_input()
90 "Inode bitmap (%u) in inode table (%u-"E3FSBLK")", in verify_group_input()
91 input->inode_bitmap, input->inode_table, itend-1); in verify_group_input()
92 else if (inside(input->block_bitmap, start, metaend)) in verify_group_input()
95 " ("E3FSBLK"-"E3FSBLK")", in verify_group_input()
96 input->block_bitmap, start, metaend - 1); in verify_group_input()
97 else if (inside(input->inode_bitmap, start, metaend)) in verify_group_input()
100 " ("E3FSBLK"-"E3FSBLK")", in verify_group_input()
101 input->inode_bitmap, start, metaend - 1); in verify_group_input()
102 else if (inside(input->inode_table, start, metaend) || in verify_group_input()
103 inside(itend - 1, start, metaend)) in verify_group_input()
105 "Inode table (%u-"E3FSBLK") overlaps" in verify_group_input()
106 "GDT table ("E3FSBLK"-"E3FSBLK")", in verify_group_input()
107 input->inode_table, itend - 1, start, metaend - 1); in verify_group_input()
123 return ERR_PTR(-EIO); in bclean()
129 memset(bh->b_data, 0, sb->s_blocksize); in bclean()
153 memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3); in mark_bitmap_end()
166 if (handle->h_buffer_credits >= thresh) in extend_or_restart_transaction()
195 ext3_fsblk_t start = ext3_group_first_block_no(sb, input->group); in setup_new_group_blocks()
196 int reserved_gdb = ext3_bg_has_super(sb, input->group) ? in setup_new_group_blocks()
197 le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) : 0; in setup_new_group_blocks()
198 unsigned long gdblocks = ext3_bg_num_gdb(sb, input->group); in setup_new_group_blocks()
212 mutex_lock(&sbi->s_resize_lock); in setup_new_group_blocks()
213 if (input->group != sbi->s_groups_count) { in setup_new_group_blocks()
214 err = -EBUSY; in setup_new_group_blocks()
218 if (IS_ERR(bh = bclean(handle, sb, input->block_bitmap))) { in setup_new_group_blocks()
223 if (ext3_bg_has_super(sb, input->group)) { in setup_new_group_blocks()
225 ext3_set_bit(0, bh->b_data); in setup_new_group_blocks()
241 err = -EIO; in setup_new_group_blocks()
249 memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); in setup_new_group_blocks()
257 ext3_set_bit(bit, bh->b_data); in setup_new_group_blocks()
281 ext3_set_bit(bit, bh->b_data); in setup_new_group_blocks()
284 ext3_debug("mark block bitmap %#04x (+%ld)\n", input->block_bitmap, in setup_new_group_blocks()
285 input->block_bitmap - start); in setup_new_group_blocks()
286 ext3_set_bit(input->block_bitmap - start, bh->b_data); in setup_new_group_blocks()
287 ext3_debug("mark inode bitmap %#04x (+%ld)\n", input->inode_bitmap, in setup_new_group_blocks()
288 input->inode_bitmap - start); in setup_new_group_blocks()
289 ext3_set_bit(input->inode_bitmap - start, bh->b_data); in setup_new_group_blocks()
292 for (i = 0, block = input->inode_table, bit = block - start; in setup_new_group_blocks()
293 i < sbi->s_itb_per_group; i++, bit++, block++) { in setup_new_group_blocks()
312 ext3_set_bit(bit, bh->b_data); in setup_new_group_blocks()
319 mark_bitmap_end(input->blocks_count, EXT3_BLOCKS_PER_GROUP(sb), in setup_new_group_blocks()
320 bh->b_data); in setup_new_group_blocks()
328 input->inode_bitmap, input->inode_bitmap - start); in setup_new_group_blocks()
329 if (IS_ERR(bh = bclean(handle, sb, input->inode_bitmap))) { in setup_new_group_blocks()
335 bh->b_data); in setup_new_group_blocks()
341 mutex_unlock(&sbi->s_resize_lock); in setup_new_group_blocks()
353 * For a non-sparse filesystem it will be every group: 1, 2, 3, 4, ...
387 * groups in current filesystem that have BACKUPS, or -ve error code.
392 const ext3_fsblk_t blk = primary->b_blocknr; in verify_reserved_gdb()
393 const unsigned long end = EXT3_SB(sb)->s_groups_count; in verify_reserved_gdb()
398 __le32 *p = (__le32 *)primary->b_data; in verify_reserved_gdb()
408 return -EINVAL; in verify_reserved_gdb()
411 return -EFBIG; in verify_reserved_gdb()
434 struct super_block *sb = inode->i_sb; in add_new_gdb()
435 struct ext3_super_block *es = EXT3_SB(sb)->s_es; in add_new_gdb()
436 unsigned long gdb_num = input->group / EXT3_DESC_PER_BLOCK(sb); in add_new_gdb()
437 ext3_fsblk_t gdblock = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; in add_new_gdb()
447 "EXT3-fs: ext3_add_new_gdb: adding group block %lu\n", in add_new_gdb()
455 if (EXT3_SB(sb)->s_sbh->b_blocknr != in add_new_gdb()
456 le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) { in add_new_gdb()
459 (unsigned long long)EXT3_SB(sb)->s_sbh->b_blocknr); in add_new_gdb()
460 return -EPERM; in add_new_gdb()
465 return -EIO; in add_new_gdb()
472 data = EXT3_I(inode)->i_data + EXT3_DIND_BLOCK; in add_new_gdb()
475 err = -EIO; in add_new_gdb()
479 data = (__le32 *)dind->b_data; in add_new_gdb()
483 input->group, gdblock); in add_new_gdb()
484 err = -EINVAL; in add_new_gdb()
488 if ((err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh))) in add_new_gdb()
504 err = -ENOMEM; in add_new_gdb()
513 * Remove new GDT block from inode double-indirect block and clear out in add_new_gdb()
516 * these blocks, because they are marked as in-use from being in the in add_new_gdb()
525 inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; in add_new_gdb()
529 memset((*primary)->b_data, 0, sb->s_blocksize); in add_new_gdb()
534 o_group_desc = EXT3_SB(sb)->s_group_desc; in add_new_gdb()
536 EXT3_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); in add_new_gdb()
538 EXT3_SB(sb)->s_group_desc = n_group_desc; in add_new_gdb()
539 EXT3_SB(sb)->s_gdb_count++; in add_new_gdb()
542 le16_add_cpu(&es->s_reserved_gdt_blocks, -1); in add_new_gdb()
543 err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); in add_new_gdb()
572 * We need to add these reserved backup GDT blocks to the resize inode, so
578 * double-indirect block to verify it is pointing to the primary reserved
585 struct super_block *sb = inode->i_sb; in reserve_backup_gdb()
586 int reserved_gdb =le16_to_cpu(EXT3_SB(sb)->s_es->s_reserved_gdt_blocks); in reserve_backup_gdb()
598 return -ENOMEM; in reserve_backup_gdb()
600 data = EXT3_I(inode)->i_data + EXT3_DIND_BLOCK; in reserve_backup_gdb()
603 err = -EIO; in reserve_backup_gdb()
607 blk = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + EXT3_SB(sb)->s_gdb_count; in reserve_backup_gdb()
608 data = (__le32 *)dind->b_data + (EXT3_SB(sb)->s_gdb_count % in reserve_backup_gdb()
610 end = (__le32 *)dind->b_data + EXT3_ADDR_PER_BLOCK(sb); in reserve_backup_gdb()
619 (long)(data - (__le32 *)dind->b_data)); in reserve_backup_gdb()
620 err = -EINVAL; in reserve_backup_gdb()
625 err = -EIO; in reserve_backup_gdb()
634 data = (__le32 *)dind->b_data; in reserve_backup_gdb()
652 * Finally we can add each of the reserved backup GDT blocks from in reserve_backup_gdb()
655 blk = input->group * EXT3_BLOCKS_PER_GROUP(sb); in reserve_backup_gdb()
658 data = (__le32 *)primary[i]->b_data; in reserve_backup_gdb()
660 primary[i]->b_blocknr, gdbackups, in reserve_backup_gdb()
661 blk + primary[i]->b_blocknr); */ in reserve_backup_gdb()
662 data[gdbackups] = cpu_to_le32(blk + primary[i]->b_blocknr); in reserve_backup_gdb()
667 inode->i_blocks += reserved_gdb * sb->s_blocksize >> 9; in reserve_backup_gdb()
671 while (--res >= 0) in reserve_backup_gdb()
683 * of the main resize transaction, because e2fsck will re-write them if there
693 * sbi->s_groups_count, because the worst that can happen is that we
701 const unsigned long last = sbi->s_groups_count; in update_backups()
707 int rest = sb->s_blocksize - size; in update_backups()
721 /* Out of journal space, and can't get more - abort - so sad */ in update_backups()
722 if (handle->h_buffer_credits == 0 && in update_backups()
729 err = -EIO; in update_backups()
733 (unsigned long)bh->b_blocknr); in update_backups()
739 memcpy(bh->b_data, data, size); in update_backups()
741 memset(bh->b_data + size, 0, rest); in update_backups()
760 * to disk, and if not - we will simply wait until next fsck. in update_backups()
767 sbi->s_mount_state &= ~EXT3_VALID_FS; in update_backups()
768 sbi->s_es->s_state &= cpu_to_le16(~EXT3_VALID_FS); in update_backups()
769 mark_buffer_dirty(sbi->s_sbh); in update_backups()
773 /* Add group descriptor data to an existing or new group descriptor block.
779 * Otherwise, we may need to add backup GDT blocks for a sparse group.
783 * not really "added" the group at all. We re-check that we are still
789 struct ext3_super_block *es = sbi->s_es; in ext3_group_add()
790 int reserved_gdb = ext3_bg_has_super(sb, input->group) ? in ext3_group_add()
791 le16_to_cpu(es->s_reserved_gdt_blocks) : 0; in ext3_group_add()
799 gdb_num = input->group / EXT3_DESC_PER_BLOCK(sb); in ext3_group_add()
800 gdb_off = input->group % EXT3_DESC_PER_BLOCK(sb); in ext3_group_add()
805 "Can't resize non-sparse filesystem further"); in ext3_group_add()
806 return -EPERM; in ext3_group_add()
809 if (le32_to_cpu(es->s_blocks_count) + input->blocks_count < in ext3_group_add()
810 le32_to_cpu(es->s_blocks_count)) { in ext3_group_add()
812 return -EINVAL; in ext3_group_add()
815 if (le32_to_cpu(es->s_inodes_count) + EXT3_INODES_PER_GROUP(sb) < in ext3_group_add()
816 le32_to_cpu(es->s_inodes_count)) { in ext3_group_add()
818 return -EINVAL; in ext3_group_add()
824 || !le16_to_cpu(es->s_reserved_gdt_blocks)) { in ext3_group_add()
827 return -EPERM; in ext3_group_add()
851 ext3_bg_has_super(sb, input->group) ? in ext3_group_add()
858 mutex_lock(&sbi->s_resize_lock); in ext3_group_add()
859 if (input->group != sbi->s_groups_count) { in ext3_group_add()
862 err = -EBUSY; in ext3_group_add()
866 if ((err = ext3_journal_get_write_access(handle, sbi->s_sbh))) in ext3_group_add()
870 * We will only either add reserved group blocks to a backup group in ext3_group_add()
873 * use non-sparse filesystems anymore. This is already checked above. in ext3_group_add()
876 primary = sbi->s_group_desc[gdb_num]; in ext3_group_add()
880 if (reserved_gdb && ext3_bg_num_gdb(sb, input->group) && in ext3_group_add()
894 * The key field here is sbi->s_groups_count: as long as in ext3_group_add()
906 gdp = (struct ext3_group_desc *)primary->b_data + gdb_off; in ext3_group_add()
908 gdp->bg_block_bitmap = cpu_to_le32(input->block_bitmap); in ext3_group_add()
909 gdp->bg_inode_bitmap = cpu_to_le32(input->inode_bitmap); in ext3_group_add()
910 gdp->bg_inode_table = cpu_to_le32(input->inode_table); in ext3_group_add()
911 gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count); in ext3_group_add()
912 gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb)); in ext3_group_add()
919 * We always allocate group-by-group, then block-by-block or in ext3_group_add()
920 * inode-by-inode within a group, so enabling these in ext3_group_add()
924 le32_add_cpu(&es->s_blocks_count, input->blocks_count); in ext3_group_add()
925 le32_add_cpu(&es->s_inodes_count, EXT3_INODES_PER_GROUP(sb)); in ext3_group_add()
951 /* Update the global fs size fields */ in ext3_group_add()
952 sbi->s_groups_count++; in ext3_group_add()
960 le32_add_cpu(&es->s_r_blocks_count, input->reserved_blocks); in ext3_group_add()
963 percpu_counter_add(&sbi->s_freeblocks_counter, in ext3_group_add()
964 input->free_blocks_count); in ext3_group_add()
965 percpu_counter_add(&sbi->s_freeinodes_counter, in ext3_group_add()
968 err = ext3_journal_dirty_metadata(handle, sbi->s_sbh); in ext3_group_add()
971 mutex_unlock(&sbi->s_resize_lock); in ext3_group_add()
975 update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, in ext3_group_add()
977 update_backups(sb, primary->b_blocknr, primary->b_data, in ext3_group_add()
978 primary->b_size); in ext3_group_add()
999 ext3_grpblk_t add; in ext3_group_extend() local
1006 * yet: we're going to revalidate es->s_blocks_count after in ext3_group_extend()
1008 o_blocks_count = le32_to_cpu(es->s_blocks_count); in ext3_group_extend()
1011 printk(KERN_DEBUG "EXT3-fs: extending last group from "E3FSBLK in ext3_group_extend()
1018 if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { in ext3_group_extend()
1019 printk(KERN_ERR "EXT3-fs: filesystem on %s:" in ext3_group_extend()
1021 sb->s_id, n_blocks_count); in ext3_group_extend()
1025 return -EINVAL; in ext3_group_extend()
1030 "can't shrink FS - resize aborted"); in ext3_group_extend()
1031 return -EBUSY; in ext3_group_extend()
1035 last = (o_blocks_count - le32_to_cpu(es->s_first_data_block)) % in ext3_group_extend()
1041 return -EPERM; in ext3_group_extend()
1044 add = EXT3_BLOCKS_PER_GROUP(sb) - last; in ext3_group_extend()
1046 if (o_blocks_count + add < o_blocks_count) { in ext3_group_extend()
1048 return -EINVAL; in ext3_group_extend()
1051 if (o_blocks_count + add > n_blocks_count) in ext3_group_extend()
1052 add = n_blocks_count - o_blocks_count; in ext3_group_extend()
1054 if (o_blocks_count + add < n_blocks_count) in ext3_group_extend()
1058 o_blocks_count + add, add); in ext3_group_extend()
1061 bh = sb_bread(sb, o_blocks_count + add -1); in ext3_group_extend()
1065 return -ENOSPC; in ext3_group_extend()
1079 mutex_lock(&EXT3_SB(sb)->s_resize_lock); in ext3_group_extend()
1080 if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) { in ext3_group_extend()
1083 mutex_unlock(&EXT3_SB(sb)->s_resize_lock); in ext3_group_extend()
1085 err = -EBUSY; in ext3_group_extend()
1090 EXT3_SB(sb)->s_sbh))) { in ext3_group_extend()
1093 mutex_unlock(&EXT3_SB(sb)->s_resize_lock); in ext3_group_extend()
1097 es->s_blocks_count = cpu_to_le32(o_blocks_count + add); in ext3_group_extend()
1098 err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); in ext3_group_extend()
1099 mutex_unlock(&EXT3_SB(sb)->s_resize_lock); in ext3_group_extend()
1107 o_blocks_count, o_blocks_count + add); in ext3_group_extend()
1108 ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); in ext3_group_extend()
1110 o_blocks_count, o_blocks_count + add); in ext3_group_extend()
1114 printk(KERN_DEBUG "EXT3-fs: extended group to %u blocks\n", in ext3_group_extend()
1115 le32_to_cpu(es->s_blocks_count)); in ext3_group_extend()
1116 update_backups(sb, EXT3_SB(sb)->s_sbh->b_blocknr, (char *)es, in ext3_group_extend()