OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ext3/] [resize.c] - Blame information for rev 78

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  linux/fs/ext3/resize.c
3
 *
4
 * Support for resizing an ext3 filesystem while it is mounted.
5
 *
6
 * Copyright (C) 2001, 2002 Andreas Dilger <adilger@clusterfs.com>
7
 *
8
 * This could probably be made into a module, because it is not often in use.
9
 */
10
 
11
 
12
#define EXT3FS_DEBUG
13
 
14
#include <linux/ext3_jbd.h>
15
 
16
#include <linux/errno.h>
17
#include <linux/slab.h>
18
 
19
 
20
#define outside(b, first, last) ((b) < (first) || (b) >= (last))
21
#define inside(b, first, last)  ((b) >= (first) && (b) < (last))
22
 
23
static int verify_group_input(struct super_block *sb,
24
                              struct ext3_new_group_data *input)
25
{
26
        struct ext3_sb_info *sbi = EXT3_SB(sb);
27
        struct ext3_super_block *es = sbi->s_es;
28
        ext3_fsblk_t start = le32_to_cpu(es->s_blocks_count);
29
        ext3_fsblk_t end = start + input->blocks_count;
30
        unsigned group = input->group;
31
        ext3_fsblk_t itend = input->inode_table + sbi->s_itb_per_group;
32
        unsigned overhead = ext3_bg_has_super(sb, group) ?
33
                (1 + ext3_bg_num_gdb(sb, group) +
34
                 le16_to_cpu(es->s_reserved_gdt_blocks)) : 0;
35
        ext3_fsblk_t metaend = start + overhead;
36
        struct buffer_head *bh = NULL;
37
        ext3_grpblk_t free_blocks_count;
38
        int err = -EINVAL;
39
 
40
        input->free_blocks_count = free_blocks_count =
41
                input->blocks_count - 2 - overhead - sbi->s_itb_per_group;
42
 
43
        if (test_opt(sb, DEBUG))
44
                printk(KERN_DEBUG "EXT3-fs: adding %s group %u: %u blocks "
45
                       "(%d free, %u reserved)\n",
46
                       ext3_bg_has_super(sb, input->group) ? "normal" :
47
                       "no-super", input->group, input->blocks_count,
48
                       free_blocks_count, input->reserved_blocks);
49
 
50
        if (group != sbi->s_groups_count)
51
                ext3_warning(sb, __FUNCTION__,
52
                             "Cannot add at group %u (only %lu groups)",
53
                             input->group, sbi->s_groups_count);
54
        else if ((start - le32_to_cpu(es->s_first_data_block)) %
55
                 EXT3_BLOCKS_PER_GROUP(sb))
56
                ext3_warning(sb, __FUNCTION__, "Last group not full");
57
        else if (input->reserved_blocks > input->blocks_count / 5)
58
                ext3_warning(sb, __FUNCTION__, "Reserved blocks too high (%u)",
59
                             input->reserved_blocks);
60
        else if (free_blocks_count < 0)
61
                ext3_warning(sb, __FUNCTION__, "Bad blocks count %u",
62
                             input->blocks_count);
63
        else if (!(bh = sb_bread(sb, end - 1)))
64
                ext3_warning(sb, __FUNCTION__,
65
                             "Cannot read last block ("E3FSBLK")",
66
                             end - 1);
67
        else if (outside(input->block_bitmap, start, end))
68
                ext3_warning(sb, __FUNCTION__,
69
                             "Block bitmap not in group (block %u)",
70
                             input->block_bitmap);
71
        else if (outside(input->inode_bitmap, start, end))
72
                ext3_warning(sb, __FUNCTION__,
73
                             "Inode bitmap not in group (block %u)",
74
                             input->inode_bitmap);
75
        else if (outside(input->inode_table, start, end) ||
76
                 outside(itend - 1, start, end))
77
                ext3_warning(sb, __FUNCTION__,
78
                             "Inode table not in group (blocks %u-"E3FSBLK")",
79
                             input->inode_table, itend - 1);
80
        else if (input->inode_bitmap == input->block_bitmap)
81
                ext3_warning(sb, __FUNCTION__,
82
                             "Block bitmap same as inode bitmap (%u)",
83
                             input->block_bitmap);
84
        else if (inside(input->block_bitmap, input->inode_table, itend))
85
                ext3_warning(sb, __FUNCTION__,
86
                             "Block bitmap (%u) in inode table (%u-"E3FSBLK")",
87
                             input->block_bitmap, input->inode_table, itend-1);
88
        else if (inside(input->inode_bitmap, input->inode_table, itend))
89
                ext3_warning(sb, __FUNCTION__,
90
                             "Inode bitmap (%u) in inode table (%u-"E3FSBLK")",
91
                             input->inode_bitmap, input->inode_table, itend-1);
92
        else if (inside(input->block_bitmap, start, metaend))
93
                ext3_warning(sb, __FUNCTION__,
94
                             "Block bitmap (%u) in GDT table"
95
                             " ("E3FSBLK"-"E3FSBLK")",
96
                             input->block_bitmap, start, metaend - 1);
97
        else if (inside(input->inode_bitmap, start, metaend))
98
                ext3_warning(sb, __FUNCTION__,
99
                             "Inode bitmap (%u) in GDT table"
100
                             " ("E3FSBLK"-"E3FSBLK")",
101
                             input->inode_bitmap, start, metaend - 1);
102
        else if (inside(input->inode_table, start, metaend) ||
103
                 inside(itend - 1, start, metaend))
104
                ext3_warning(sb, __FUNCTION__,
105
                             "Inode table (%u-"E3FSBLK") overlaps"
106
                             "GDT table ("E3FSBLK"-"E3FSBLK")",
107
                             input->inode_table, itend - 1, start, metaend - 1);
108
        else
109
                err = 0;
110
        brelse(bh);
111
 
112
        return err;
113
}
114
 
115
static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
116
                                  ext3_fsblk_t blk)
117
{
118
        struct buffer_head *bh;
119
        int err;
120
 
121
        bh = sb_getblk(sb, blk);
122
        if (!bh)
123
                return ERR_PTR(-EIO);
124
        if ((err = ext3_journal_get_write_access(handle, bh))) {
125
                brelse(bh);
126
                bh = ERR_PTR(err);
127
        } else {
128
                lock_buffer(bh);
129
                memset(bh->b_data, 0, sb->s_blocksize);
130
                set_buffer_uptodate(bh);
131
                unlock_buffer(bh);
132
        }
133
 
134
        return bh;
135
}
136
 
137
/*
138
 * To avoid calling the atomic setbit hundreds or thousands of times, we only
139
 * need to use it within a single byte (to ensure we get endianness right).
140
 * We can use memset for the rest of the bitmap as there are no other users.
141
 */
142
static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
143
{
144
        int i;
145
 
146
        if (start_bit >= end_bit)
147
                return;
148
 
149
        ext3_debug("mark end bits +%d through +%d used\n", start_bit, end_bit);
150
        for (i = start_bit; i < ((start_bit + 7) & ~7UL); i++)
151
                ext3_set_bit(i, bitmap);
152
        if (i < end_bit)
153
                memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3);
154
}
155
 
156
/*
157
 * If we have fewer than thresh credits, extend by EXT3_MAX_TRANS_DATA.
158
 * If that fails, restart the transaction & regain write access for the
159
 * buffer head which is used for block_bitmap modifications.
160
 */
161
static int extend_or_restart_transaction(handle_t *handle, int thresh,
162
                                         struct buffer_head *bh)
163
{
164
        int err;
165
 
166
        if (handle->h_buffer_credits >= thresh)
167
                return 0;
168
 
169
        err = ext3_journal_extend(handle, EXT3_MAX_TRANS_DATA);
170
        if (err < 0)
171
                return err;
172
        if (err) {
173
                err = ext3_journal_restart(handle, EXT3_MAX_TRANS_DATA);
174
                if (err)
175
                        return err;
176
                err = ext3_journal_get_write_access(handle, bh);
177
                if (err)
178
                        return err;
179
        }
180
 
181
        return 0;
182
}
183
 
184
/*
185
 * Set up the block and inode bitmaps, and the inode table for the new group.
186
 * This doesn't need to be part of the main transaction, since we are only
187
 * changing blocks outside the actual filesystem.  We still do journaling to
188
 * ensure the recovery is correct in case of a failure just after resize.
189
 * If any part of this fails, we simply abort the resize.
190
 */
191
static int setup_new_group_blocks(struct super_block *sb,
192
                                  struct ext3_new_group_data *input)
193
{
194
        struct ext3_sb_info *sbi = EXT3_SB(sb);
195
        ext3_fsblk_t start = ext3_group_first_block_no(sb, input->group);
196
        int reserved_gdb = ext3_bg_has_super(sb, input->group) ?
197
                le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) : 0;
198
        unsigned long gdblocks = ext3_bg_num_gdb(sb, input->group);
199
        struct buffer_head *bh;
200
        handle_t *handle;
201
        ext3_fsblk_t block;
202
        ext3_grpblk_t bit;
203
        int i;
204
        int err = 0, err2;
205
 
206
        /* This transaction may be extended/restarted along the way */
207
        handle = ext3_journal_start_sb(sb, EXT3_MAX_TRANS_DATA);
208
 
209
        if (IS_ERR(handle))
210
                return PTR_ERR(handle);
211
 
212
        lock_super(sb);
213
        if (input->group != sbi->s_groups_count) {
214
                err = -EBUSY;
215
                goto exit_journal;
216
        }
217
 
218
        if (IS_ERR(bh = bclean(handle, sb, input->block_bitmap))) {
219
                err = PTR_ERR(bh);
220
                goto exit_journal;
221
        }
222
 
223
        if (ext3_bg_has_super(sb, input->group)) {
224
                ext3_debug("mark backup superblock %#04lx (+0)\n", start);
225
                ext3_set_bit(0, bh->b_data);
226
        }
227
 
228
        /* Copy all of the GDT blocks into the backup in this group */
229
        for (i = 0, bit = 1, block = start + 1;
230
             i < gdblocks; i++, block++, bit++) {
231
                struct buffer_head *gdb;
232
 
233
                ext3_debug("update backup group %#04lx (+%d)\n", block, bit);
234
 
235
                err = extend_or_restart_transaction(handle, 1, bh);
236
                if (err)
237
                        goto exit_bh;
238
 
239
                gdb = sb_getblk(sb, block);
240
                if (!gdb) {
241
                        err = -EIO;
242
                        goto exit_bh;
243
                }
244
                if ((err = ext3_journal_get_write_access(handle, gdb))) {
245
                        brelse(gdb);
246
                        goto exit_bh;
247
                }
248
                lock_buffer(gdb);
249
                memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size);
250
                set_buffer_uptodate(gdb);
251
                unlock_buffer(gdb);
252
                ext3_journal_dirty_metadata(handle, gdb);
253
                ext3_set_bit(bit, bh->b_data);
254
                brelse(gdb);
255
        }
256
 
257
        /* Zero out all of the reserved backup group descriptor table blocks */
258
        for (i = 0, bit = gdblocks + 1, block = start + bit;
259
             i < reserved_gdb; i++, block++, bit++) {
260
                struct buffer_head *gdb;
261
 
262
                ext3_debug("clear reserved block %#04lx (+%d)\n", block, bit);
263
 
264
                err = extend_or_restart_transaction(handle, 1, bh);
265
                if (err)
266
                        goto exit_bh;
267
 
268
                if (IS_ERR(gdb = bclean(handle, sb, block))) {
269
                        err = PTR_ERR(bh);
270
                        goto exit_bh;
271
                }
272
                ext3_journal_dirty_metadata(handle, gdb);
273
                ext3_set_bit(bit, bh->b_data);
274
                brelse(gdb);
275
        }
276
        ext3_debug("mark block bitmap %#04x (+%ld)\n", input->block_bitmap,
277
                   input->block_bitmap - start);
278
        ext3_set_bit(input->block_bitmap - start, bh->b_data);
279
        ext3_debug("mark inode bitmap %#04x (+%ld)\n", input->inode_bitmap,
280
                   input->inode_bitmap - start);
281
        ext3_set_bit(input->inode_bitmap - start, bh->b_data);
282
 
283
        /* Zero out all of the inode table blocks */
284
        for (i = 0, block = input->inode_table, bit = block - start;
285
             i < sbi->s_itb_per_group; i++, bit++, block++) {
286
                struct buffer_head *it;
287
 
288
                ext3_debug("clear inode block %#04lx (+%d)\n", block, bit);
289
 
290
                err = extend_or_restart_transaction(handle, 1, bh);
291
                if (err)
292
                        goto exit_bh;
293
 
294
                if (IS_ERR(it = bclean(handle, sb, block))) {
295
                        err = PTR_ERR(it);
296
                        goto exit_bh;
297
                }
298
                ext3_journal_dirty_metadata(handle, it);
299
                brelse(it);
300
                ext3_set_bit(bit, bh->b_data);
301
        }
302
 
303
        err = extend_or_restart_transaction(handle, 2, bh);
304
        if (err)
305
                goto exit_bh;
306
 
307
        mark_bitmap_end(input->blocks_count, EXT3_BLOCKS_PER_GROUP(sb),
308
                        bh->b_data);
309
        ext3_journal_dirty_metadata(handle, bh);
310
        brelse(bh);
311
 
312
        /* Mark unused entries in inode bitmap used */
313
        ext3_debug("clear inode bitmap %#04x (+%ld)\n",
314
                   input->inode_bitmap, input->inode_bitmap - start);
315
        if (IS_ERR(bh = bclean(handle, sb, input->inode_bitmap))) {
316
                err = PTR_ERR(bh);
317
                goto exit_journal;
318
        }
319
 
320
        mark_bitmap_end(EXT3_INODES_PER_GROUP(sb), EXT3_BLOCKS_PER_GROUP(sb),
321
                        bh->b_data);
322
        ext3_journal_dirty_metadata(handle, bh);
323
exit_bh:
324
        brelse(bh);
325
 
326
exit_journal:
327
        unlock_super(sb);
328
        if ((err2 = ext3_journal_stop(handle)) && !err)
329
                err = err2;
330
 
331
        return err;
332
}
333
 
334
/*
335
 * Iterate through the groups which hold BACKUP superblock/GDT copies in an
336
 * ext3 filesystem.  The counters should be initialized to 1, 5, and 7 before
337
 * calling this for the first time.  In a sparse filesystem it will be the
338
 * sequence of powers of 3, 5, and 7: 1, 3, 5, 7, 9, 25, 27, 49, 81, ...
339
 * For a non-sparse filesystem it will be every group: 1, 2, 3, 4, ...
340
 */
341
static unsigned ext3_list_backups(struct super_block *sb, unsigned *three,
342
                                  unsigned *five, unsigned *seven)
343
{
344
        unsigned *min = three;
345
        int mult = 3;
346
        unsigned ret;
347
 
348
        if (!EXT3_HAS_RO_COMPAT_FEATURE(sb,
349
                                        EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
350
                ret = *min;
351
                *min += 1;
352
                return ret;
353
        }
354
 
355
        if (*five < *min) {
356
                min = five;
357
                mult = 5;
358
        }
359
        if (*seven < *min) {
360
                min = seven;
361
                mult = 7;
362
        }
363
 
364
        ret = *min;
365
        *min *= mult;
366
 
367
        return ret;
368
}
369
 
370
/*
371
 * Check that all of the backup GDT blocks are held in the primary GDT block.
372
 * It is assumed that they are stored in group order.  Returns the number of
373
 * groups in current filesystem that have BACKUPS, or -ve error code.
374
 */
375
static int verify_reserved_gdb(struct super_block *sb,
376
                               struct buffer_head *primary)
377
{
378
        const ext3_fsblk_t blk = primary->b_blocknr;
379
        const unsigned long end = EXT3_SB(sb)->s_groups_count;
380
        unsigned three = 1;
381
        unsigned five = 5;
382
        unsigned seven = 7;
383
        unsigned grp;
384
        __le32 *p = (__le32 *)primary->b_data;
385
        int gdbackups = 0;
386
 
387
        while ((grp = ext3_list_backups(sb, &three, &five, &seven)) < end) {
388
                if (le32_to_cpu(*p++) != grp * EXT3_BLOCKS_PER_GROUP(sb) + blk){
389
                        ext3_warning(sb, __FUNCTION__,
390
                                     "reserved GDT "E3FSBLK
391
                                     " missing grp %d ("E3FSBLK")",
392
                                     blk, grp,
393
                                     grp * EXT3_BLOCKS_PER_GROUP(sb) + blk);
394
                        return -EINVAL;
395
                }
396
                if (++gdbackups > EXT3_ADDR_PER_BLOCK(sb))
397
                        return -EFBIG;
398
        }
399
 
400
        return gdbackups;
401
}
402
 
403
/*
404
 * Called when we need to bring a reserved group descriptor table block into
405
 * use from the resize inode.  The primary copy of the new GDT block currently
406
 * is an indirect block (under the double indirect block in the resize inode).
407
 * The new backup GDT blocks will be stored as leaf blocks in this indirect
408
 * block, in group order.  Even though we know all the block numbers we need,
409
 * we check to ensure that the resize inode has actually reserved these blocks.
410
 *
411
 * Don't need to update the block bitmaps because the blocks are still in use.
412
 *
413
 * We get all of the error cases out of the way, so that we are sure to not
414
 * fail once we start modifying the data on disk, because JBD has no rollback.
415
 */
416
static int add_new_gdb(handle_t *handle, struct inode *inode,
417
                       struct ext3_new_group_data *input,
418
                       struct buffer_head **primary)
419
{
420
        struct super_block *sb = inode->i_sb;
421
        struct ext3_super_block *es = EXT3_SB(sb)->s_es;
422
        unsigned long gdb_num = input->group / EXT3_DESC_PER_BLOCK(sb);
423
        ext3_fsblk_t gdblock = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num;
424
        struct buffer_head **o_group_desc, **n_group_desc;
425
        struct buffer_head *dind;
426
        int gdbackups;
427
        struct ext3_iloc iloc;
428
        __le32 *data;
429
        int err;
430
 
431
        if (test_opt(sb, DEBUG))
432
                printk(KERN_DEBUG
433
                       "EXT3-fs: ext3_add_new_gdb: adding group block %lu\n",
434
                       gdb_num);
435
 
436
        /*
437
         * If we are not using the primary superblock/GDT copy don't resize,
438
         * because the user tools have no way of handling this.  Probably a
439
         * bad time to do it anyways.
440
         */
441
        if (EXT3_SB(sb)->s_sbh->b_blocknr !=
442
            le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) {
443
                ext3_warning(sb, __FUNCTION__,
444
                        "won't resize using backup superblock at %llu",
445
                        (unsigned long long)EXT3_SB(sb)->s_sbh->b_blocknr);
446
                return -EPERM;
447
        }
448
 
449
        *primary = sb_bread(sb, gdblock);
450
        if (!*primary)
451
                return -EIO;
452
 
453
        if ((gdbackups = verify_reserved_gdb(sb, *primary)) < 0) {
454
                err = gdbackups;
455
                goto exit_bh;
456
        }
457
 
458
        data = EXT3_I(inode)->i_data + EXT3_DIND_BLOCK;
459
        dind = sb_bread(sb, le32_to_cpu(*data));
460
        if (!dind) {
461
                err = -EIO;
462
                goto exit_bh;
463
        }
464
 
465
        data = (__le32 *)dind->b_data;
466
        if (le32_to_cpu(data[gdb_num % EXT3_ADDR_PER_BLOCK(sb)]) != gdblock) {
467
                ext3_warning(sb, __FUNCTION__,
468
                             "new group %u GDT block "E3FSBLK" not reserved",
469
                             input->group, gdblock);
470
                err = -EINVAL;
471
                goto exit_dind;
472
        }
473
 
474
        if ((err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh)))
475
                goto exit_dind;
476
 
477
        if ((err = ext3_journal_get_write_access(handle, *primary)))
478
                goto exit_sbh;
479
 
480
        if ((err = ext3_journal_get_write_access(handle, dind)))
481
                goto exit_primary;
482
 
483
        /* ext3_reserve_inode_write() gets a reference on the iloc */
484
        if ((err = ext3_reserve_inode_write(handle, inode, &iloc)))
485
                goto exit_dindj;
486
 
487
        n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *),
488
                        GFP_KERNEL);
489
        if (!n_group_desc) {
490
                err = -ENOMEM;
491
                ext3_warning (sb, __FUNCTION__,
492
                              "not enough memory for %lu groups", gdb_num + 1);
493
                goto exit_inode;
494
        }
495
 
496
        /*
497
         * Finally, we have all of the possible failures behind us...
498
         *
499
         * Remove new GDT block from inode double-indirect block and clear out
500
         * the new GDT block for use (which also "frees" the backup GDT blocks
501
         * from the reserved inode).  We don't need to change the bitmaps for
502
         * these blocks, because they are marked as in-use from being in the
503
         * reserved inode, and will become GDT blocks (primary and backup).
504
         */
505
        data[gdb_num % EXT3_ADDR_PER_BLOCK(sb)] = 0;
506
        ext3_journal_dirty_metadata(handle, dind);
507
        brelse(dind);
508
        inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9;
509
        ext3_mark_iloc_dirty(handle, inode, &iloc);
510
        memset((*primary)->b_data, 0, sb->s_blocksize);
511
        ext3_journal_dirty_metadata(handle, *primary);
512
 
513
        o_group_desc = EXT3_SB(sb)->s_group_desc;
514
        memcpy(n_group_desc, o_group_desc,
515
               EXT3_SB(sb)->s_gdb_count * sizeof(struct buffer_head *));
516
        n_group_desc[gdb_num] = *primary;
517
        EXT3_SB(sb)->s_group_desc = n_group_desc;
518
        EXT3_SB(sb)->s_gdb_count++;
519
        kfree(o_group_desc);
520
 
521
        es->s_reserved_gdt_blocks =
522
                cpu_to_le16(le16_to_cpu(es->s_reserved_gdt_blocks) - 1);
523
        ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh);
524
 
525
        return 0;
526
 
527
exit_inode:
528
        //ext3_journal_release_buffer(handle, iloc.bh);
529
        brelse(iloc.bh);
530
exit_dindj:
531
        //ext3_journal_release_buffer(handle, dind);
532
exit_primary:
533
        //ext3_journal_release_buffer(handle, *primary);
534
exit_sbh:
535
        //ext3_journal_release_buffer(handle, *primary);
536
exit_dind:
537
        brelse(dind);
538
exit_bh:
539
        brelse(*primary);
540
 
541
        ext3_debug("leaving with error %d\n", err);
542
        return err;
543
}
544
 
545
/*
546
 * Called when we are adding a new group which has a backup copy of each of
547
 * the GDT blocks (i.e. sparse group) and there are reserved GDT blocks.
548
 * We need to add these reserved backup GDT blocks to the resize inode, so
549
 * that they are kept for future resizing and not allocated to files.
550
 *
551
 * Each reserved backup GDT block will go into a different indirect block.
552
 * The indirect blocks are actually the primary reserved GDT blocks,
553
 * so we know in advance what their block numbers are.  We only get the
554
 * double-indirect block to verify it is pointing to the primary reserved
555
 * GDT blocks so we don't overwrite a data block by accident.  The reserved
556
 * backup GDT blocks are stored in their reserved primary GDT block.
557
 */
558
static int reserve_backup_gdb(handle_t *handle, struct inode *inode,
559
                              struct ext3_new_group_data *input)
560
{
561
        struct super_block *sb = inode->i_sb;
562
        int reserved_gdb =le16_to_cpu(EXT3_SB(sb)->s_es->s_reserved_gdt_blocks);
563
        struct buffer_head **primary;
564
        struct buffer_head *dind;
565
        struct ext3_iloc iloc;
566
        ext3_fsblk_t blk;
567
        __le32 *data, *end;
568
        int gdbackups = 0;
569
        int res, i;
570
        int err;
571
 
572
        primary = kmalloc(reserved_gdb * sizeof(*primary), GFP_KERNEL);
573
        if (!primary)
574
                return -ENOMEM;
575
 
576
        data = EXT3_I(inode)->i_data + EXT3_DIND_BLOCK;
577
        dind = sb_bread(sb, le32_to_cpu(*data));
578
        if (!dind) {
579
                err = -EIO;
580
                goto exit_free;
581
        }
582
 
583
        blk = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + EXT3_SB(sb)->s_gdb_count;
584
        data = (__le32 *)dind->b_data + EXT3_SB(sb)->s_gdb_count;
585
        end = (__le32 *)dind->b_data + EXT3_ADDR_PER_BLOCK(sb);
586
 
587
        /* Get each reserved primary GDT block and verify it holds backups */
588
        for (res = 0; res < reserved_gdb; res++, blk++) {
589
                if (le32_to_cpu(*data) != blk) {
590
                        ext3_warning(sb, __FUNCTION__,
591
                                     "reserved block "E3FSBLK
592
                                     " not at offset %ld",
593
                                     blk,
594
                                     (long)(data - (__le32 *)dind->b_data));
595
                        err = -EINVAL;
596
                        goto exit_bh;
597
                }
598
                primary[res] = sb_bread(sb, blk);
599
                if (!primary[res]) {
600
                        err = -EIO;
601
                        goto exit_bh;
602
                }
603
                if ((gdbackups = verify_reserved_gdb(sb, primary[res])) < 0) {
604
                        brelse(primary[res]);
605
                        err = gdbackups;
606
                        goto exit_bh;
607
                }
608
                if (++data >= end)
609
                        data = (__le32 *)dind->b_data;
610
        }
611
 
612
        for (i = 0; i < reserved_gdb; i++) {
613
                if ((err = ext3_journal_get_write_access(handle, primary[i]))) {
614
                        /*
615
                        int j;
616
                        for (j = 0; j < i; j++)
617
                                ext3_journal_release_buffer(handle, primary[j]);
618
                         */
619
                        goto exit_bh;
620
                }
621
        }
622
 
623
        if ((err = ext3_reserve_inode_write(handle, inode, &iloc)))
624
                goto exit_bh;
625
 
626
        /*
627
         * Finally we can add each of the reserved backup GDT blocks from
628
         * the new group to its reserved primary GDT block.
629
         */
630
        blk = input->group * EXT3_BLOCKS_PER_GROUP(sb);
631
        for (i = 0; i < reserved_gdb; i++) {
632
                int err2;
633
                data = (__le32 *)primary[i]->b_data;
634
                /* printk("reserving backup %lu[%u] = %lu\n",
635
                       primary[i]->b_blocknr, gdbackups,
636
                       blk + primary[i]->b_blocknr); */
637
                data[gdbackups] = cpu_to_le32(blk + primary[i]->b_blocknr);
638
                err2 = ext3_journal_dirty_metadata(handle, primary[i]);
639
                if (!err)
640
                        err = err2;
641
        }
642
        inode->i_blocks += reserved_gdb * sb->s_blocksize >> 9;
643
        ext3_mark_iloc_dirty(handle, inode, &iloc);
644
 
645
exit_bh:
646
        while (--res >= 0)
647
                brelse(primary[res]);
648
        brelse(dind);
649
 
650
exit_free:
651
        kfree(primary);
652
 
653
        return err;
654
}
655
 
656
/*
657
 * Update the backup copies of the ext3 metadata.  These don't need to be part
658
 * of the main resize transaction, because e2fsck will re-write them if there
659
 * is a problem (basically only OOM will cause a problem).  However, we
660
 * _should_ update the backups if possible, in case the primary gets trashed
661
 * for some reason and we need to run e2fsck from a backup superblock.  The
662
 * important part is that the new block and inode counts are in the backup
663
 * superblocks, and the location of the new group metadata in the GDT backups.
664
 *
665
 * We do not need lock_super() for this, because these blocks are not
666
 * otherwise touched by the filesystem code when it is mounted.  We don't
667
 * need to worry about last changing from sbi->s_groups_count, because the
668
 * worst that can happen is that we do not copy the full number of backups
669
 * at this time.  The resize which changed s_groups_count will backup again.
670
 */
671
static void update_backups(struct super_block *sb,
672
                           int blk_off, char *data, int size)
673
{
674
        struct ext3_sb_info *sbi = EXT3_SB(sb);
675
        const unsigned long last = sbi->s_groups_count;
676
        const int bpg = EXT3_BLOCKS_PER_GROUP(sb);
677
        unsigned three = 1;
678
        unsigned five = 5;
679
        unsigned seven = 7;
680
        unsigned group;
681
        int rest = sb->s_blocksize - size;
682
        handle_t *handle;
683
        int err = 0, err2;
684
 
685
        handle = ext3_journal_start_sb(sb, EXT3_MAX_TRANS_DATA);
686
        if (IS_ERR(handle)) {
687
                group = 1;
688
                err = PTR_ERR(handle);
689
                goto exit_err;
690
        }
691
 
692
        while ((group = ext3_list_backups(sb, &three, &five, &seven)) < last) {
693
                struct buffer_head *bh;
694
 
695
                /* Out of journal space, and can't get more - abort - so sad */
696
                if (handle->h_buffer_credits == 0 &&
697
                    ext3_journal_extend(handle, EXT3_MAX_TRANS_DATA) &&
698
                    (err = ext3_journal_restart(handle, EXT3_MAX_TRANS_DATA)))
699
                        break;
700
 
701
                bh = sb_getblk(sb, group * bpg + blk_off);
702
                if (!bh) {
703
                        err = -EIO;
704
                        break;
705
                }
706
                ext3_debug("update metadata backup %#04lx\n",
707
                          (unsigned long)bh->b_blocknr);
708
                if ((err = ext3_journal_get_write_access(handle, bh)))
709
                        break;
710
                lock_buffer(bh);
711
                memcpy(bh->b_data, data, size);
712
                if (rest)
713
                        memset(bh->b_data + size, 0, rest);
714
                set_buffer_uptodate(bh);
715
                unlock_buffer(bh);
716
                ext3_journal_dirty_metadata(handle, bh);
717
                brelse(bh);
718
        }
719
        if ((err2 = ext3_journal_stop(handle)) && !err)
720
                err = err2;
721
 
722
        /*
723
         * Ugh! Need to have e2fsck write the backup copies.  It is too
724
         * late to revert the resize, we shouldn't fail just because of
725
         * the backup copies (they are only needed in case of corruption).
726
         *
727
         * However, if we got here we have a journal problem too, so we
728
         * can't really start a transaction to mark the superblock.
729
         * Chicken out and just set the flag on the hope it will be written
730
         * to disk, and if not - we will simply wait until next fsck.
731
         */
732
exit_err:
733
        if (err) {
734
                ext3_warning(sb, __FUNCTION__,
735
                             "can't update backup for group %d (err %d), "
736
                             "forcing fsck on next reboot", group, err);
737
                sbi->s_mount_state &= ~EXT3_VALID_FS;
738
                sbi->s_es->s_state &= cpu_to_le16(~EXT3_VALID_FS);
739
                mark_buffer_dirty(sbi->s_sbh);
740
        }
741
}
742
 
743
/* Add group descriptor data to an existing or new group descriptor block.
744
 * Ensure we handle all possible error conditions _before_ we start modifying
745
 * the filesystem, because we cannot abort the transaction and not have it
746
 * write the data to disk.
747
 *
748
 * If we are on a GDT block boundary, we need to get the reserved GDT block.
749
 * Otherwise, we may need to add backup GDT blocks for a sparse group.
750
 *
751
 * We only need to hold the superblock lock while we are actually adding
752
 * in the new group's counts to the superblock.  Prior to that we have
753
 * not really "added" the group at all.  We re-check that we are still
754
 * adding in the last group in case things have changed since verifying.
755
 */
756
int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input)
757
{
758
        struct ext3_sb_info *sbi = EXT3_SB(sb);
759
        struct ext3_super_block *es = sbi->s_es;
760
        int reserved_gdb = ext3_bg_has_super(sb, input->group) ?
761
                le16_to_cpu(es->s_reserved_gdt_blocks) : 0;
762
        struct buffer_head *primary = NULL;
763
        struct ext3_group_desc *gdp;
764
        struct inode *inode = NULL;
765
        handle_t *handle;
766
        int gdb_off, gdb_num;
767
        int err, err2;
768
 
769
        gdb_num = input->group / EXT3_DESC_PER_BLOCK(sb);
770
        gdb_off = input->group % EXT3_DESC_PER_BLOCK(sb);
771
 
772
        if (gdb_off == 0 && !EXT3_HAS_RO_COMPAT_FEATURE(sb,
773
                                        EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
774
                ext3_warning(sb, __FUNCTION__,
775
                             "Can't resize non-sparse filesystem further");
776
                return -EPERM;
777
        }
778
 
779
        if (le32_to_cpu(es->s_blocks_count) + input->blocks_count <
780
            le32_to_cpu(es->s_blocks_count)) {
781
                ext3_warning(sb, __FUNCTION__, "blocks_count overflow\n");
782
                return -EINVAL;
783
        }
784
 
785
        if (le32_to_cpu(es->s_inodes_count) + EXT3_INODES_PER_GROUP(sb) <
786
            le32_to_cpu(es->s_inodes_count)) {
787
                ext3_warning(sb, __FUNCTION__, "inodes_count overflow\n");
788
                return -EINVAL;
789
        }
790
 
791
        if (reserved_gdb || gdb_off == 0) {
792
                if (!EXT3_HAS_COMPAT_FEATURE(sb,
793
                                             EXT3_FEATURE_COMPAT_RESIZE_INODE)){
794
                        ext3_warning(sb, __FUNCTION__,
795
                                     "No reserved GDT blocks, can't resize");
796
                        return -EPERM;
797
                }
798
                inode = iget(sb, EXT3_RESIZE_INO);
799
                if (!inode || is_bad_inode(inode)) {
800
                        ext3_warning(sb, __FUNCTION__,
801
                                     "Error opening resize inode");
802
                        iput(inode);
803
                        return -ENOENT;
804
                }
805
        }
806
 
807
        if ((err = verify_group_input(sb, input)))
808
                goto exit_put;
809
 
810
        if ((err = setup_new_group_blocks(sb, input)))
811
                goto exit_put;
812
 
813
        /*
814
         * We will always be modifying at least the superblock and a GDT
815
         * block.  If we are adding a group past the last current GDT block,
816
         * we will also modify the inode and the dindirect block.  If we
817
         * are adding a group with superblock/GDT backups  we will also
818
         * modify each of the reserved GDT dindirect blocks.
819
         */
820
        handle = ext3_journal_start_sb(sb,
821
                                       ext3_bg_has_super(sb, input->group) ?
822
                                       3 + reserved_gdb : 4);
823
        if (IS_ERR(handle)) {
824
                err = PTR_ERR(handle);
825
                goto exit_put;
826
        }
827
 
828
        lock_super(sb);
829
        if (input->group != sbi->s_groups_count) {
830
                ext3_warning(sb, __FUNCTION__,
831
                             "multiple resizers run on filesystem!");
832
                err = -EBUSY;
833
                goto exit_journal;
834
        }
835
 
836
        if ((err = ext3_journal_get_write_access(handle, sbi->s_sbh)))
837
                goto exit_journal;
838
 
839
        /*
840
         * We will only either add reserved group blocks to a backup group
841
         * or remove reserved blocks for the first group in a new group block.
842
         * Doing both would be mean more complex code, and sane people don't
843
         * use non-sparse filesystems anymore.  This is already checked above.
844
         */
845
        if (gdb_off) {
846
                primary = sbi->s_group_desc[gdb_num];
847
                if ((err = ext3_journal_get_write_access(handle, primary)))
848
                        goto exit_journal;
849
 
850
                if (reserved_gdb && ext3_bg_num_gdb(sb, input->group) &&
851
                    (err = reserve_backup_gdb(handle, inode, input)))
852
                        goto exit_journal;
853
        } else if ((err = add_new_gdb(handle, inode, input, &primary)))
854
                goto exit_journal;
855
 
856
        /*
857
         * OK, now we've set up the new group.  Time to make it active.
858
         *
859
         * Current kernels don't lock all allocations via lock_super(),
860
         * so we have to be safe wrt. concurrent accesses the group
861
         * data.  So we need to be careful to set all of the relevant
862
         * group descriptor data etc. *before* we enable the group.
863
         *
864
         * The key field here is sbi->s_groups_count: as long as
865
         * that retains its old value, nobody is going to access the new
866
         * group.
867
         *
868
         * So first we update all the descriptor metadata for the new
869
         * group; then we update the total disk blocks count; then we
870
         * update the groups count to enable the group; then finally we
871
         * update the free space counts so that the system can start
872
         * using the new disk blocks.
873
         */
874
 
875
        /* Update group descriptor block for new group */
876
        gdp = (struct ext3_group_desc *)primary->b_data + gdb_off;
877
 
878
        gdp->bg_block_bitmap = cpu_to_le32(input->block_bitmap);
879
        gdp->bg_inode_bitmap = cpu_to_le32(input->inode_bitmap);
880
        gdp->bg_inode_table = cpu_to_le32(input->inode_table);
881
        gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
882
        gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb));
883
 
884
        /*
885
         * Make the new blocks and inodes valid next.  We do this before
886
         * increasing the group count so that once the group is enabled,
887
         * all of its blocks and inodes are already valid.
888
         *
889
         * We always allocate group-by-group, then block-by-block or
890
         * inode-by-inode within a group, so enabling these
891
         * blocks/inodes before the group is live won't actually let us
892
         * allocate the new space yet.
893
         */
894
        es->s_blocks_count = cpu_to_le32(le32_to_cpu(es->s_blocks_count) +
895
                input->blocks_count);
896
        es->s_inodes_count = cpu_to_le32(le32_to_cpu(es->s_inodes_count) +
897
                EXT3_INODES_PER_GROUP(sb));
898
 
899
        /*
900
         * We need to protect s_groups_count against other CPUs seeing
901
         * inconsistent state in the superblock.
902
         *
903
         * The precise rules we use are:
904
         *
905
         * * Writers of s_groups_count *must* hold lock_super
906
         * AND
907
         * * Writers must perform a smp_wmb() after updating all dependent
908
         *   data and before modifying the groups count
909
         *
910
         * * Readers must hold lock_super() over the access
911
         * OR
912
         * * Readers must perform an smp_rmb() after reading the groups count
913
         *   and before reading any dependent data.
914
         *
915
         * NB. These rules can be relaxed when checking the group count
916
         * while freeing data, as we can only allocate from a block
917
         * group after serialising against the group count, and we can
918
         * only then free after serialising in turn against that
919
         * allocation.
920
         */
921
        smp_wmb();
922
 
923
        /* Update the global fs size fields */
924
        sbi->s_groups_count++;
925
 
926
        ext3_journal_dirty_metadata(handle, primary);
927
 
928
        /* Update the reserved block counts only once the new group is
929
         * active. */
930
        es->s_r_blocks_count = cpu_to_le32(le32_to_cpu(es->s_r_blocks_count) +
931
                input->reserved_blocks);
932
 
933
        /* Update the free space counts */
934
        percpu_counter_add(&sbi->s_freeblocks_counter,
935
                           input->free_blocks_count);
936
        percpu_counter_add(&sbi->s_freeinodes_counter,
937
                           EXT3_INODES_PER_GROUP(sb));
938
 
939
        ext3_journal_dirty_metadata(handle, sbi->s_sbh);
940
        sb->s_dirt = 1;
941
 
942
exit_journal:
943
        unlock_super(sb);
944
        if ((err2 = ext3_journal_stop(handle)) && !err)
945
                err = err2;
946
        if (!err) {
947
                update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es,
948
                               sizeof(struct ext3_super_block));
949
                update_backups(sb, primary->b_blocknr, primary->b_data,
950
                               primary->b_size);
951
        }
952
exit_put:
953
        iput(inode);
954
        return err;
955
} /* ext3_group_add */
956
 
957
/* Extend the filesystem to the new number of blocks specified.  This entry
958
 * point is only used to extend the current filesystem to the end of the last
959
 * existing group.  It can be accessed via ioctl, or by "remount,resize=<size>"
960
 * for emergencies (because it has no dependencies on reserved blocks).
961
 *
962
 * If we _really_ wanted, we could use default values to call ext3_group_add()
963
 * allow the "remount" trick to work for arbitrary resizing, assuming enough
964
 * GDT blocks are reserved to grow to the desired size.
965
 */
966
int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es,
967
                      ext3_fsblk_t n_blocks_count)
968
{
969
        ext3_fsblk_t o_blocks_count;
970
        unsigned long o_groups_count;
971
        ext3_grpblk_t last;
972
        ext3_grpblk_t add;
973
        struct buffer_head * bh;
974
        handle_t *handle;
975
        int err;
976
        unsigned long freed_blocks;
977
 
978
        /* We don't need to worry about locking wrt other resizers just
979
         * yet: we're going to revalidate es->s_blocks_count after
980
         * taking lock_super() below. */
981
        o_blocks_count = le32_to_cpu(es->s_blocks_count);
982
        o_groups_count = EXT3_SB(sb)->s_groups_count;
983
 
984
        if (test_opt(sb, DEBUG))
985
                printk(KERN_DEBUG "EXT3-fs: extending last group from "E3FSBLK" uto "E3FSBLK" blocks\n",
986
                       o_blocks_count, n_blocks_count);
987
 
988
        if (n_blocks_count == 0 || n_blocks_count == o_blocks_count)
989
                return 0;
990
 
991
        if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) {
992
                printk(KERN_ERR "EXT3-fs: filesystem on %s:"
993
                        " too large to resize to %lu blocks safely\n",
994
                        sb->s_id, n_blocks_count);
995
                if (sizeof(sector_t) < 8)
996
                        ext3_warning(sb, __FUNCTION__,
997
                        "CONFIG_LBD not enabled\n");
998
                return -EINVAL;
999
        }
1000
 
1001
        if (n_blocks_count < o_blocks_count) {
1002
                ext3_warning(sb, __FUNCTION__,
1003
                             "can't shrink FS - resize aborted");
1004
                return -EBUSY;
1005
        }
1006
 
1007
        /* Handle the remaining blocks in the last group only. */
1008
        last = (o_blocks_count - le32_to_cpu(es->s_first_data_block)) %
1009
                EXT3_BLOCKS_PER_GROUP(sb);
1010
 
1011
        if (last == 0) {
1012
                ext3_warning(sb, __FUNCTION__,
1013
                             "need to use ext2online to resize further");
1014
                return -EPERM;
1015
        }
1016
 
1017
        add = EXT3_BLOCKS_PER_GROUP(sb) - last;
1018
 
1019
        if (o_blocks_count + add < o_blocks_count) {
1020
                ext3_warning(sb, __FUNCTION__, "blocks_count overflow");
1021
                return -EINVAL;
1022
        }
1023
 
1024
        if (o_blocks_count + add > n_blocks_count)
1025
                add = n_blocks_count - o_blocks_count;
1026
 
1027
        if (o_blocks_count + add < n_blocks_count)
1028
                ext3_warning(sb, __FUNCTION__,
1029
                             "will only finish group ("E3FSBLK
1030
                             " blocks, %u new)",
1031
                             o_blocks_count + add, add);
1032
 
1033
        /* See if the device is actually as big as what was requested */
1034
        bh = sb_bread(sb, o_blocks_count + add -1);
1035
        if (!bh) {
1036
                ext3_warning(sb, __FUNCTION__,
1037
                             "can't read last block, resize aborted");
1038
                return -ENOSPC;
1039
        }
1040
        brelse(bh);
1041
 
1042
        /* We will update the superblock, one block bitmap, and
1043
         * one group descriptor via ext3_free_blocks().
1044
         */
1045
        handle = ext3_journal_start_sb(sb, 3);
1046
        if (IS_ERR(handle)) {
1047
                err = PTR_ERR(handle);
1048
                ext3_warning(sb, __FUNCTION__, "error %d on journal start",err);
1049
                goto exit_put;
1050
        }
1051
 
1052
        lock_super(sb);
1053
        if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) {
1054
                ext3_warning(sb, __FUNCTION__,
1055
                             "multiple resizers run on filesystem!");
1056
                unlock_super(sb);
1057
                err = -EBUSY;
1058
                goto exit_put;
1059
        }
1060
 
1061
        if ((err = ext3_journal_get_write_access(handle,
1062
                                                 EXT3_SB(sb)->s_sbh))) {
1063
                ext3_warning(sb, __FUNCTION__,
1064
                             "error %d on journal write access", err);
1065
                unlock_super(sb);
1066
                ext3_journal_stop(handle);
1067
                goto exit_put;
1068
        }
1069
        es->s_blocks_count = cpu_to_le32(o_blocks_count + add);
1070
        ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh);
1071
        sb->s_dirt = 1;
1072
        unlock_super(sb);
1073
        ext3_debug("freeing blocks %lu through "E3FSBLK"\n", o_blocks_count,
1074
                   o_blocks_count + add);
1075
        ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks);
1076
        ext3_debug("freed blocks "E3FSBLK" through "E3FSBLK"\n", o_blocks_count,
1077
                   o_blocks_count + add);
1078
        if ((err = ext3_journal_stop(handle)))
1079
                goto exit_put;
1080
        if (test_opt(sb, DEBUG))
1081
                printk(KERN_DEBUG "EXT3-fs: extended group to %u blocks\n",
1082
                       le32_to_cpu(es->s_blocks_count));
1083
        update_backups(sb, EXT3_SB(sb)->s_sbh->b_blocknr, (char *)es,
1084
                       sizeof(struct ext3_super_block));
1085
exit_put:
1086
        return err;
1087
} /* ext3_group_extend */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.