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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [gfs2/] [rgrp.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3
 * Copyright (C) 2004-2007 Red Hat, Inc.  All rights reserved.
4
 *
5
 * This copyrighted material is made available to anyone wishing to use,
6
 * modify, copy, or redistribute it subject to the terms and conditions
7
 * of the GNU General Public License version 2.
8
 */
9
 
10
#include <linux/slab.h>
11
#include <linux/spinlock.h>
12
#include <linux/completion.h>
13
#include <linux/buffer_head.h>
14
#include <linux/fs.h>
15
#include <linux/gfs2_ondisk.h>
16
#include <linux/lm_interface.h>
17
 
18
#include "gfs2.h"
19
#include "incore.h"
20
#include "glock.h"
21
#include "glops.h"
22
#include "lops.h"
23
#include "meta_io.h"
24
#include "quota.h"
25
#include "rgrp.h"
26
#include "super.h"
27
#include "trans.h"
28
#include "ops_file.h"
29
#include "util.h"
30
#include "log.h"
31
#include "inode.h"
32
 
33
#define BFITNOENT ((u32)~0)
34
#define NO_BLOCK ((u64)~0)
35
 
36
/*
37
 * These routines are used by the resource group routines (rgrp.c)
38
 * to keep track of block allocation.  Each block is represented by two
39
 * bits.  So, each byte represents GFS2_NBBY (i.e. 4) blocks.
40
 *
41
 * 0 = Free
42
 * 1 = Used (not metadata)
43
 * 2 = Unlinked (still in use) inode
44
 * 3 = Used (metadata)
45
 */
46
 
47
static const char valid_change[16] = {
48
                /* current */
49
        /* n */ 0, 1, 1, 1,
50
        /* e */ 1, 0, 0, 0,
51
        /* w */ 0, 0, 0, 1,
52
                1, 0, 0, 0
53
};
54
 
55
static u32 rgblk_search(struct gfs2_rgrpd *rgd, u32 goal,
56
                        unsigned char old_state, unsigned char new_state);
57
 
58
/**
59
 * gfs2_setbit - Set a bit in the bitmaps
60
 * @buffer: the buffer that holds the bitmaps
61
 * @buflen: the length (in bytes) of the buffer
62
 * @block: the block to set
63
 * @new_state: the new state of the block
64
 *
65
 */
66
 
67
static void gfs2_setbit(struct gfs2_rgrpd *rgd, unsigned char *buffer,
68
                        unsigned int buflen, u32 block,
69
                        unsigned char new_state)
70
{
71
        unsigned char *byte, *end, cur_state;
72
        unsigned int bit;
73
 
74
        byte = buffer + (block / GFS2_NBBY);
75
        bit = (block % GFS2_NBBY) * GFS2_BIT_SIZE;
76
        end = buffer + buflen;
77
 
78
        gfs2_assert(rgd->rd_sbd, byte < end);
79
 
80
        cur_state = (*byte >> bit) & GFS2_BIT_MASK;
81
 
82
        if (valid_change[new_state * 4 + cur_state]) {
83
                *byte ^= cur_state << bit;
84
                *byte |= new_state << bit;
85
        } else
86
                gfs2_consist_rgrpd(rgd);
87
}
88
 
89
/**
90
 * gfs2_testbit - test a bit in the bitmaps
91
 * @buffer: the buffer that holds the bitmaps
92
 * @buflen: the length (in bytes) of the buffer
93
 * @block: the block to read
94
 *
95
 */
96
 
97
static unsigned char gfs2_testbit(struct gfs2_rgrpd *rgd, unsigned char *buffer,
98
                                  unsigned int buflen, u32 block)
99
{
100
        unsigned char *byte, *end, cur_state;
101
        unsigned int bit;
102
 
103
        byte = buffer + (block / GFS2_NBBY);
104
        bit = (block % GFS2_NBBY) * GFS2_BIT_SIZE;
105
        end = buffer + buflen;
106
 
107
        gfs2_assert(rgd->rd_sbd, byte < end);
108
 
109
        cur_state = (*byte >> bit) & GFS2_BIT_MASK;
110
 
111
        return cur_state;
112
}
113
 
114
/**
115
 * gfs2_bitfit - Search an rgrp's bitmap buffer to find a bit-pair representing
116
 *       a block in a given allocation state.
117
 * @buffer: the buffer that holds the bitmaps
118
 * @buflen: the length (in bytes) of the buffer
119
 * @goal: start search at this block's bit-pair (within @buffer)
120
 * @old_state: GFS2_BLKST_XXX the state of the block we're looking for.
121
 *
122
 * Scope of @goal and returned block number is only within this bitmap buffer,
123
 * not entire rgrp or filesystem.  @buffer will be offset from the actual
124
 * beginning of a bitmap block buffer, skipping any header structures.
125
 *
126
 * Return: the block number (bitmap buffer scope) that was found
127
 */
128
 
129
static u32 gfs2_bitfit(struct gfs2_rgrpd *rgd, unsigned char *buffer,
130
                            unsigned int buflen, u32 goal,
131
                            unsigned char old_state)
132
{
133
        unsigned char *byte, *end, alloc;
134
        u32 blk = goal;
135
        unsigned int bit;
136
 
137
        byte = buffer + (goal / GFS2_NBBY);
138
        bit = (goal % GFS2_NBBY) * GFS2_BIT_SIZE;
139
        end = buffer + buflen;
140
        alloc = (old_state == GFS2_BLKST_FREE) ? 0x55 : 0;
141
 
142
        while (byte < end) {
143
                /* If we're looking for a free block we can eliminate all
144
                   bitmap settings with 0x55, which represents four data
145
                   blocks in a row.  If we're looking for a data block, we can
146
                   eliminate 0x00 which corresponds to four free blocks. */
147
                if ((*byte & 0x55) == alloc) {
148
                        blk += (8 - bit) >> 1;
149
 
150
                        bit = 0;
151
                        byte++;
152
 
153
                        continue;
154
                }
155
 
156
                if (((*byte >> bit) & GFS2_BIT_MASK) == old_state)
157
                        return blk;
158
 
159
                bit += GFS2_BIT_SIZE;
160
                if (bit >= 8) {
161
                        bit = 0;
162
                        byte++;
163
                }
164
 
165
                blk++;
166
        }
167
 
168
        return BFITNOENT;
169
}
170
 
171
/**
172
 * gfs2_bitcount - count the number of bits in a certain state
173
 * @buffer: the buffer that holds the bitmaps
174
 * @buflen: the length (in bytes) of the buffer
175
 * @state: the state of the block we're looking for
176
 *
177
 * Returns: The number of bits
178
 */
179
 
180
static u32 gfs2_bitcount(struct gfs2_rgrpd *rgd, unsigned char *buffer,
181
                              unsigned int buflen, unsigned char state)
182
{
183
        unsigned char *byte = buffer;
184
        unsigned char *end = buffer + buflen;
185
        unsigned char state1 = state << 2;
186
        unsigned char state2 = state << 4;
187
        unsigned char state3 = state << 6;
188
        u32 count = 0;
189
 
190
        for (; byte < end; byte++) {
191
                if (((*byte) & 0x03) == state)
192
                        count++;
193
                if (((*byte) & 0x0C) == state1)
194
                        count++;
195
                if (((*byte) & 0x30) == state2)
196
                        count++;
197
                if (((*byte) & 0xC0) == state3)
198
                        count++;
199
        }
200
 
201
        return count;
202
}
203
 
204
/**
205
 * gfs2_rgrp_verify - Verify that a resource group is consistent
206
 * @sdp: the filesystem
207
 * @rgd: the rgrp
208
 *
209
 */
210
 
211
void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd)
212
{
213
        struct gfs2_sbd *sdp = rgd->rd_sbd;
214
        struct gfs2_bitmap *bi = NULL;
215
        u32 length = rgd->rd_length;
216
        u32 count[4], tmp;
217
        int buf, x;
218
 
219
        memset(count, 0, 4 * sizeof(u32));
220
 
221
        /* Count # blocks in each of 4 possible allocation states */
222
        for (buf = 0; buf < length; buf++) {
223
                bi = rgd->rd_bits + buf;
224
                for (x = 0; x < 4; x++)
225
                        count[x] += gfs2_bitcount(rgd,
226
                                                  bi->bi_bh->b_data +
227
                                                  bi->bi_offset,
228
                                                  bi->bi_len, x);
229
        }
230
 
231
        if (count[0] != rgd->rd_rg.rg_free) {
232
                if (gfs2_consist_rgrpd(rgd))
233
                        fs_err(sdp, "free data mismatch:  %u != %u\n",
234
                               count[0], rgd->rd_rg.rg_free);
235
                return;
236
        }
237
 
238
        tmp = rgd->rd_data -
239
                rgd->rd_rg.rg_free -
240
                rgd->rd_rg.rg_dinodes;
241
        if (count[1] + count[2] != tmp) {
242
                if (gfs2_consist_rgrpd(rgd))
243
                        fs_err(sdp, "used data mismatch:  %u != %u\n",
244
                               count[1], tmp);
245
                return;
246
        }
247
 
248
        if (count[3] != rgd->rd_rg.rg_dinodes) {
249
                if (gfs2_consist_rgrpd(rgd))
250
                        fs_err(sdp, "used metadata mismatch:  %u != %u\n",
251
                               count[3], rgd->rd_rg.rg_dinodes);
252
                return;
253
        }
254
 
255
        if (count[2] > count[3]) {
256
                if (gfs2_consist_rgrpd(rgd))
257
                        fs_err(sdp, "unlinked inodes > inodes:  %u\n",
258
                               count[2]);
259
                return;
260
        }
261
 
262
}
263
 
264
static inline int rgrp_contains_block(struct gfs2_rgrpd *rgd, u64 block)
265
{
266
        u64 first = rgd->rd_data0;
267
        u64 last = first + rgd->rd_data;
268
        return first <= block && block < last;
269
}
270
 
271
/**
272
 * gfs2_blk2rgrpd - Find resource group for a given data/meta block number
273
 * @sdp: The GFS2 superblock
274
 * @n: The data block number
275
 *
276
 * Returns: The resource group, or NULL if not found
277
 */
278
 
279
struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk)
280
{
281
        struct gfs2_rgrpd *rgd;
282
 
283
        spin_lock(&sdp->sd_rindex_spin);
284
 
285
        list_for_each_entry(rgd, &sdp->sd_rindex_mru_list, rd_list_mru) {
286
                if (rgrp_contains_block(rgd, blk)) {
287
                        list_move(&rgd->rd_list_mru, &sdp->sd_rindex_mru_list);
288
                        spin_unlock(&sdp->sd_rindex_spin);
289
                        return rgd;
290
                }
291
        }
292
 
293
        spin_unlock(&sdp->sd_rindex_spin);
294
 
295
        return NULL;
296
}
297
 
298
/**
299
 * gfs2_rgrpd_get_first - get the first Resource Group in the filesystem
300
 * @sdp: The GFS2 superblock
301
 *
302
 * Returns: The first rgrp in the filesystem
303
 */
304
 
305
struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp)
306
{
307
        gfs2_assert(sdp, !list_empty(&sdp->sd_rindex_list));
308
        return list_entry(sdp->sd_rindex_list.next, struct gfs2_rgrpd, rd_list);
309
}
310
 
311
/**
312
 * gfs2_rgrpd_get_next - get the next RG
313
 * @rgd: A RG
314
 *
315
 * Returns: The next rgrp
316
 */
317
 
318
struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd)
319
{
320
        if (rgd->rd_list.next == &rgd->rd_sbd->sd_rindex_list)
321
                return NULL;
322
        return list_entry(rgd->rd_list.next, struct gfs2_rgrpd, rd_list);
323
}
324
 
325
static void clear_rgrpdi(struct gfs2_sbd *sdp)
326
{
327
        struct list_head *head;
328
        struct gfs2_rgrpd *rgd;
329
        struct gfs2_glock *gl;
330
 
331
        spin_lock(&sdp->sd_rindex_spin);
332
        sdp->sd_rindex_forward = NULL;
333
        head = &sdp->sd_rindex_recent_list;
334
        while (!list_empty(head)) {
335
                rgd = list_entry(head->next, struct gfs2_rgrpd, rd_recent);
336
                list_del(&rgd->rd_recent);
337
        }
338
        spin_unlock(&sdp->sd_rindex_spin);
339
 
340
        head = &sdp->sd_rindex_list;
341
        while (!list_empty(head)) {
342
                rgd = list_entry(head->next, struct gfs2_rgrpd, rd_list);
343
                gl = rgd->rd_gl;
344
 
345
                list_del(&rgd->rd_list);
346
                list_del(&rgd->rd_list_mru);
347
 
348
                if (gl) {
349
                        gl->gl_object = NULL;
350
                        gfs2_glock_put(gl);
351
                }
352
 
353
                kfree(rgd->rd_bits);
354
                kfree(rgd);
355
        }
356
}
357
 
358
void gfs2_clear_rgrpd(struct gfs2_sbd *sdp)
359
{
360
        mutex_lock(&sdp->sd_rindex_mutex);
361
        clear_rgrpdi(sdp);
362
        mutex_unlock(&sdp->sd_rindex_mutex);
363
}
364
 
365
static void gfs2_rindex_print(const struct gfs2_rgrpd *rgd)
366
{
367
        printk(KERN_INFO "  ri_addr = %llu\n", (unsigned long long)rgd->rd_addr);
368
        printk(KERN_INFO "  ri_length = %u\n", rgd->rd_length);
369
        printk(KERN_INFO "  ri_data0 = %llu\n", (unsigned long long)rgd->rd_data0);
370
        printk(KERN_INFO "  ri_data = %u\n", rgd->rd_data);
371
        printk(KERN_INFO "  ri_bitbytes = %u\n", rgd->rd_bitbytes);
372
}
373
 
374
/**
375
 * gfs2_compute_bitstructs - Compute the bitmap sizes
376
 * @rgd: The resource group descriptor
377
 *
378
 * Calculates bitmap descriptors, one for each block that contains bitmap data
379
 *
380
 * Returns: errno
381
 */
382
 
383
static int compute_bitstructs(struct gfs2_rgrpd *rgd)
384
{
385
        struct gfs2_sbd *sdp = rgd->rd_sbd;
386
        struct gfs2_bitmap *bi;
387
        u32 length = rgd->rd_length; /* # blocks in hdr & bitmap */
388
        u32 bytes_left, bytes;
389
        int x;
390
 
391
        if (!length)
392
                return -EINVAL;
393
 
394
        rgd->rd_bits = kcalloc(length, sizeof(struct gfs2_bitmap), GFP_NOFS);
395
        if (!rgd->rd_bits)
396
                return -ENOMEM;
397
 
398
        bytes_left = rgd->rd_bitbytes;
399
 
400
        for (x = 0; x < length; x++) {
401
                bi = rgd->rd_bits + x;
402
 
403
                /* small rgrp; bitmap stored completely in header block */
404
                if (length == 1) {
405
                        bytes = bytes_left;
406
                        bi->bi_offset = sizeof(struct gfs2_rgrp);
407
                        bi->bi_start = 0;
408
                        bi->bi_len = bytes;
409
                /* header block */
410
                } else if (x == 0) {
411
                        bytes = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_rgrp);
412
                        bi->bi_offset = sizeof(struct gfs2_rgrp);
413
                        bi->bi_start = 0;
414
                        bi->bi_len = bytes;
415
                /* last block */
416
                } else if (x + 1 == length) {
417
                        bytes = bytes_left;
418
                        bi->bi_offset = sizeof(struct gfs2_meta_header);
419
                        bi->bi_start = rgd->rd_bitbytes - bytes_left;
420
                        bi->bi_len = bytes;
421
                /* other blocks */
422
                } else {
423
                        bytes = sdp->sd_sb.sb_bsize -
424
                                sizeof(struct gfs2_meta_header);
425
                        bi->bi_offset = sizeof(struct gfs2_meta_header);
426
                        bi->bi_start = rgd->rd_bitbytes - bytes_left;
427
                        bi->bi_len = bytes;
428
                }
429
 
430
                bytes_left -= bytes;
431
        }
432
 
433
        if (bytes_left) {
434
                gfs2_consist_rgrpd(rgd);
435
                return -EIO;
436
        }
437
        bi = rgd->rd_bits + (length - 1);
438
        if ((bi->bi_start + bi->bi_len) * GFS2_NBBY != rgd->rd_data) {
439
                if (gfs2_consist_rgrpd(rgd)) {
440
                        gfs2_rindex_print(rgd);
441
                        fs_err(sdp, "start=%u len=%u offset=%u\n",
442
                               bi->bi_start, bi->bi_len, bi->bi_offset);
443
                }
444
                return -EIO;
445
        }
446
 
447
        return 0;
448
}
449
 
450
/**
451
 * gfs2_ri_total - Total up the file system space, according to the rindex.
452
 *
453
 */
454
u64 gfs2_ri_total(struct gfs2_sbd *sdp)
455
{
456
        u64 total_data = 0;
457
        struct inode *inode = sdp->sd_rindex;
458
        struct gfs2_inode *ip = GFS2_I(inode);
459
        char buf[sizeof(struct gfs2_rindex)];
460
        struct file_ra_state ra_state;
461
        int error, rgrps;
462
 
463
        mutex_lock(&sdp->sd_rindex_mutex);
464
        file_ra_state_init(&ra_state, inode->i_mapping);
465
        for (rgrps = 0;; rgrps++) {
466
                loff_t pos = rgrps * sizeof(struct gfs2_rindex);
467
 
468
                if (pos + sizeof(struct gfs2_rindex) >= ip->i_di.di_size)
469
                        break;
470
                error = gfs2_internal_read(ip, &ra_state, buf, &pos,
471
                                           sizeof(struct gfs2_rindex));
472
                if (error != sizeof(struct gfs2_rindex))
473
                        break;
474
                total_data += be32_to_cpu(((struct gfs2_rindex *)buf)->ri_data);
475
        }
476
        mutex_unlock(&sdp->sd_rindex_mutex);
477
        return total_data;
478
}
479
 
480
static void gfs2_rindex_in(struct gfs2_rgrpd *rgd, const void *buf)
481
{
482
        const struct gfs2_rindex *str = buf;
483
 
484
        rgd->rd_addr = be64_to_cpu(str->ri_addr);
485
        rgd->rd_length = be32_to_cpu(str->ri_length);
486
        rgd->rd_data0 = be64_to_cpu(str->ri_data0);
487
        rgd->rd_data = be32_to_cpu(str->ri_data);
488
        rgd->rd_bitbytes = be32_to_cpu(str->ri_bitbytes);
489
}
490
 
491
/**
492
 * read_rindex_entry - Pull in a new resource index entry from the disk
493
 * @gl: The glock covering the rindex inode
494
 *
495
 * Returns: 0 on success, error code otherwise
496
 */
497
 
498
static int read_rindex_entry(struct gfs2_inode *ip,
499
                             struct file_ra_state *ra_state)
500
{
501
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
502
        loff_t pos = sdp->sd_rgrps * sizeof(struct gfs2_rindex);
503
        char buf[sizeof(struct gfs2_rindex)];
504
        int error;
505
        struct gfs2_rgrpd *rgd;
506
 
507
        error = gfs2_internal_read(ip, ra_state, buf, &pos,
508
                                   sizeof(struct gfs2_rindex));
509
        if (!error)
510
                return 0;
511
        if (error != sizeof(struct gfs2_rindex)) {
512
                if (error > 0)
513
                        error = -EIO;
514
                return error;
515
        }
516
 
517
        rgd = kzalloc(sizeof(struct gfs2_rgrpd), GFP_NOFS);
518
        error = -ENOMEM;
519
        if (!rgd)
520
                return error;
521
 
522
        mutex_init(&rgd->rd_mutex);
523
        lops_init_le(&rgd->rd_le, &gfs2_rg_lops);
524
        rgd->rd_sbd = sdp;
525
 
526
        list_add_tail(&rgd->rd_list, &sdp->sd_rindex_list);
527
        list_add_tail(&rgd->rd_list_mru, &sdp->sd_rindex_mru_list);
528
 
529
        gfs2_rindex_in(rgd, buf);
530
        error = compute_bitstructs(rgd);
531
        if (error)
532
                return error;
533
 
534
        error = gfs2_glock_get(sdp, rgd->rd_addr,
535
                               &gfs2_rgrp_glops, CREATE, &rgd->rd_gl);
536
        if (error)
537
                return error;
538
 
539
        rgd->rd_gl->gl_object = rgd;
540
        rgd->rd_rg_vn = rgd->rd_gl->gl_vn - 1;
541
        rgd->rd_flags |= GFS2_RDF_CHECK;
542
        return error;
543
}
544
 
545
/**
546
 * gfs2_ri_update - Pull in a new resource index from the disk
547
 * @ip: pointer to the rindex inode
548
 *
549
 * Returns: 0 on successful update, error code otherwise
550
 */
551
 
552
static int gfs2_ri_update(struct gfs2_inode *ip)
553
{
554
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
555
        struct inode *inode = &ip->i_inode;
556
        struct file_ra_state ra_state;
557
        u64 rgrp_count = ip->i_di.di_size;
558
        int error;
559
 
560
        if (do_div(rgrp_count, sizeof(struct gfs2_rindex))) {
561
                gfs2_consist_inode(ip);
562
                return -EIO;
563
        }
564
 
565
        clear_rgrpdi(sdp);
566
 
567
        file_ra_state_init(&ra_state, inode->i_mapping);
568
        for (sdp->sd_rgrps = 0; sdp->sd_rgrps < rgrp_count; sdp->sd_rgrps++) {
569
                error = read_rindex_entry(ip, &ra_state);
570
                if (error) {
571
                        clear_rgrpdi(sdp);
572
                        return error;
573
                }
574
        }
575
 
576
        sdp->sd_rindex_vn = ip->i_gl->gl_vn;
577
        return 0;
578
}
579
 
580
/**
581
 * gfs2_ri_update_special - Pull in a new resource index from the disk
582
 *
583
 * This is a special version that's safe to call from gfs2_inplace_reserve_i.
584
 * In this case we know that we don't have any resource groups in memory yet.
585
 *
586
 * @ip: pointer to the rindex inode
587
 *
588
 * Returns: 0 on successful update, error code otherwise
589
 */
590
static int gfs2_ri_update_special(struct gfs2_inode *ip)
591
{
592
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
593
        struct inode *inode = &ip->i_inode;
594
        struct file_ra_state ra_state;
595
        int error;
596
 
597
        file_ra_state_init(&ra_state, inode->i_mapping);
598
        for (sdp->sd_rgrps = 0;; sdp->sd_rgrps++) {
599
                /* Ignore partials */
600
                if ((sdp->sd_rgrps + 1) * sizeof(struct gfs2_rindex) >
601
                    ip->i_di.di_size)
602
                        break;
603
                error = read_rindex_entry(ip, &ra_state);
604
                if (error) {
605
                        clear_rgrpdi(sdp);
606
                        return error;
607
                }
608
        }
609
 
610
        sdp->sd_rindex_vn = ip->i_gl->gl_vn;
611
        return 0;
612
}
613
 
614
/**
615
 * gfs2_rindex_hold - Grab a lock on the rindex
616
 * @sdp: The GFS2 superblock
617
 * @ri_gh: the glock holder
618
 *
619
 * We grab a lock on the rindex inode to make sure that it doesn't
620
 * change whilst we are performing an operation. We keep this lock
621
 * for quite long periods of time compared to other locks. This
622
 * doesn't matter, since it is shared and it is very, very rarely
623
 * accessed in the exclusive mode (i.e. only when expanding the filesystem).
624
 *
625
 * This makes sure that we're using the latest copy of the resource index
626
 * special file, which might have been updated if someone expanded the
627
 * filesystem (via gfs2_grow utility), which adds new resource groups.
628
 *
629
 * Returns: 0 on success, error code otherwise
630
 */
631
 
632
int gfs2_rindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ri_gh)
633
{
634
        struct gfs2_inode *ip = GFS2_I(sdp->sd_rindex);
635
        struct gfs2_glock *gl = ip->i_gl;
636
        int error;
637
 
638
        error = gfs2_glock_nq_init(gl, LM_ST_SHARED, 0, ri_gh);
639
        if (error)
640
                return error;
641
 
642
        /* Read new copy from disk if we don't have the latest */
643
        if (sdp->sd_rindex_vn != gl->gl_vn) {
644
                mutex_lock(&sdp->sd_rindex_mutex);
645
                if (sdp->sd_rindex_vn != gl->gl_vn) {
646
                        error = gfs2_ri_update(ip);
647
                        if (error)
648
                                gfs2_glock_dq_uninit(ri_gh);
649
                }
650
                mutex_unlock(&sdp->sd_rindex_mutex);
651
        }
652
 
653
        return error;
654
}
655
 
656
static void gfs2_rgrp_in(struct gfs2_rgrp_host *rg, const void *buf)
657
{
658
        const struct gfs2_rgrp *str = buf;
659
 
660
        rg->rg_flags = be32_to_cpu(str->rg_flags);
661
        rg->rg_free = be32_to_cpu(str->rg_free);
662
        rg->rg_dinodes = be32_to_cpu(str->rg_dinodes);
663
        rg->rg_igeneration = be64_to_cpu(str->rg_igeneration);
664
}
665
 
666
static void gfs2_rgrp_out(const struct gfs2_rgrp_host *rg, void *buf)
667
{
668
        struct gfs2_rgrp *str = buf;
669
 
670
        str->rg_flags = cpu_to_be32(rg->rg_flags);
671
        str->rg_free = cpu_to_be32(rg->rg_free);
672
        str->rg_dinodes = cpu_to_be32(rg->rg_dinodes);
673
        str->__pad = cpu_to_be32(0);
674
        str->rg_igeneration = cpu_to_be64(rg->rg_igeneration);
675
        memset(&str->rg_reserved, 0, sizeof(str->rg_reserved));
676
}
677
 
678
/**
679
 * gfs2_rgrp_bh_get - Read in a RG's header and bitmaps
680
 * @rgd: the struct gfs2_rgrpd describing the RG to read in
681
 *
682
 * Read in all of a Resource Group's header and bitmap blocks.
683
 * Caller must eventually call gfs2_rgrp_relse() to free the bitmaps.
684
 *
685
 * Returns: errno
686
 */
687
 
688
int gfs2_rgrp_bh_get(struct gfs2_rgrpd *rgd)
689
{
690
        struct gfs2_sbd *sdp = rgd->rd_sbd;
691
        struct gfs2_glock *gl = rgd->rd_gl;
692
        unsigned int length = rgd->rd_length;
693
        struct gfs2_bitmap *bi;
694
        unsigned int x, y;
695
        int error;
696
 
697
        mutex_lock(&rgd->rd_mutex);
698
 
699
        spin_lock(&sdp->sd_rindex_spin);
700
        if (rgd->rd_bh_count) {
701
                rgd->rd_bh_count++;
702
                spin_unlock(&sdp->sd_rindex_spin);
703
                mutex_unlock(&rgd->rd_mutex);
704
                return 0;
705
        }
706
        spin_unlock(&sdp->sd_rindex_spin);
707
 
708
        for (x = 0; x < length; x++) {
709
                bi = rgd->rd_bits + x;
710
                error = gfs2_meta_read(gl, rgd->rd_addr + x, 0, &bi->bi_bh);
711
                if (error)
712
                        goto fail;
713
        }
714
 
715
        for (y = length; y--;) {
716
                bi = rgd->rd_bits + y;
717
                error = gfs2_meta_wait(sdp, bi->bi_bh);
718
                if (error)
719
                        goto fail;
720
                if (gfs2_metatype_check(sdp, bi->bi_bh, y ? GFS2_METATYPE_RB :
721
                                              GFS2_METATYPE_RG)) {
722
                        error = -EIO;
723
                        goto fail;
724
                }
725
        }
726
 
727
        if (rgd->rd_rg_vn != gl->gl_vn) {
728
                gfs2_rgrp_in(&rgd->rd_rg, (rgd->rd_bits[0].bi_bh)->b_data);
729
                rgd->rd_rg_vn = gl->gl_vn;
730
        }
731
 
732
        spin_lock(&sdp->sd_rindex_spin);
733
        rgd->rd_free_clone = rgd->rd_rg.rg_free;
734
        rgd->rd_bh_count++;
735
        spin_unlock(&sdp->sd_rindex_spin);
736
 
737
        mutex_unlock(&rgd->rd_mutex);
738
 
739
        return 0;
740
 
741
fail:
742
        while (x--) {
743
                bi = rgd->rd_bits + x;
744
                brelse(bi->bi_bh);
745
                bi->bi_bh = NULL;
746
                gfs2_assert_warn(sdp, !bi->bi_clone);
747
        }
748
        mutex_unlock(&rgd->rd_mutex);
749
 
750
        return error;
751
}
752
 
753
void gfs2_rgrp_bh_hold(struct gfs2_rgrpd *rgd)
754
{
755
        struct gfs2_sbd *sdp = rgd->rd_sbd;
756
 
757
        spin_lock(&sdp->sd_rindex_spin);
758
        gfs2_assert_warn(rgd->rd_sbd, rgd->rd_bh_count);
759
        rgd->rd_bh_count++;
760
        spin_unlock(&sdp->sd_rindex_spin);
761
}
762
 
763
/**
764
 * gfs2_rgrp_bh_put - Release RG bitmaps read in with gfs2_rgrp_bh_get()
765
 * @rgd: the struct gfs2_rgrpd describing the RG to read in
766
 *
767
 */
768
 
769
void gfs2_rgrp_bh_put(struct gfs2_rgrpd *rgd)
770
{
771
        struct gfs2_sbd *sdp = rgd->rd_sbd;
772
        int x, length = rgd->rd_length;
773
 
774
        spin_lock(&sdp->sd_rindex_spin);
775
        gfs2_assert_warn(rgd->rd_sbd, rgd->rd_bh_count);
776
        if (--rgd->rd_bh_count) {
777
                spin_unlock(&sdp->sd_rindex_spin);
778
                return;
779
        }
780
 
781
        for (x = 0; x < length; x++) {
782
                struct gfs2_bitmap *bi = rgd->rd_bits + x;
783
                kfree(bi->bi_clone);
784
                bi->bi_clone = NULL;
785
                brelse(bi->bi_bh);
786
                bi->bi_bh = NULL;
787
        }
788
 
789
        spin_unlock(&sdp->sd_rindex_spin);
790
}
791
 
792
void gfs2_rgrp_repolish_clones(struct gfs2_rgrpd *rgd)
793
{
794
        struct gfs2_sbd *sdp = rgd->rd_sbd;
795
        unsigned int length = rgd->rd_length;
796
        unsigned int x;
797
 
798
        for (x = 0; x < length; x++) {
799
                struct gfs2_bitmap *bi = rgd->rd_bits + x;
800
                if (!bi->bi_clone)
801
                        continue;
802
                memcpy(bi->bi_clone + bi->bi_offset,
803
                       bi->bi_bh->b_data + bi->bi_offset, bi->bi_len);
804
        }
805
 
806
        spin_lock(&sdp->sd_rindex_spin);
807
        rgd->rd_free_clone = rgd->rd_rg.rg_free;
808
        spin_unlock(&sdp->sd_rindex_spin);
809
}
810
 
811
/**
812
 * gfs2_alloc_get - get the struct gfs2_alloc structure for an inode
813
 * @ip: the incore GFS2 inode structure
814
 *
815
 * Returns: the struct gfs2_alloc
816
 */
817
 
818
struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip)
819
{
820
        struct gfs2_alloc *al = &ip->i_alloc;
821
 
822
        /* FIXME: Should assert that the correct locks are held here... */
823
        memset(al, 0, sizeof(*al));
824
        return al;
825
}
826
 
827
/**
828
 * try_rgrp_fit - See if a given reservation will fit in a given RG
829
 * @rgd: the RG data
830
 * @al: the struct gfs2_alloc structure describing the reservation
831
 *
832
 * If there's room for the requested blocks to be allocated from the RG:
833
 *   Sets the $al_rgd field in @al.
834
 *
835
 * Returns: 1 on success (it fits), 0 on failure (it doesn't fit)
836
 */
837
 
838
static int try_rgrp_fit(struct gfs2_rgrpd *rgd, struct gfs2_alloc *al)
839
{
840
        struct gfs2_sbd *sdp = rgd->rd_sbd;
841
        int ret = 0;
842
 
843
        if (rgd->rd_rg.rg_flags & GFS2_RGF_NOALLOC)
844
                return 0;
845
 
846
        spin_lock(&sdp->sd_rindex_spin);
847
        if (rgd->rd_free_clone >= al->al_requested) {
848
                al->al_rgd = rgd;
849
                ret = 1;
850
        }
851
        spin_unlock(&sdp->sd_rindex_spin);
852
 
853
        return ret;
854
}
855
 
856
/**
857
 * try_rgrp_unlink - Look for any unlinked, allocated, but unused inodes
858
 * @rgd: The rgrp
859
 *
860
 * Returns: The inode, if one has been found
861
 */
862
 
863
static struct inode *try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked)
864
{
865
        struct inode *inode;
866
        u32 goal = 0, block;
867
        u64 no_addr;
868
        struct gfs2_sbd *sdp = rgd->rd_sbd;
869
 
870
        for(;;) {
871
                if (goal >= rgd->rd_data)
872
                        break;
873
                down_write(&sdp->sd_log_flush_lock);
874
                block = rgblk_search(rgd, goal, GFS2_BLKST_UNLINKED,
875
                                     GFS2_BLKST_UNLINKED);
876
                up_write(&sdp->sd_log_flush_lock);
877
                if (block == BFITNOENT)
878
                        break;
879
                /* rgblk_search can return a block < goal, so we need to
880
                   keep it marching forward. */
881
                no_addr = block + rgd->rd_data0;
882
                goal++;
883
                if (*last_unlinked != NO_BLOCK && no_addr <= *last_unlinked)
884
                        continue;
885
                *last_unlinked = no_addr;
886
                inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, DT_UNKNOWN,
887
                                          no_addr, -1, 1);
888
                if (!IS_ERR(inode))
889
                        return inode;
890
        }
891
 
892
        rgd->rd_flags &= ~GFS2_RDF_CHECK;
893
        return NULL;
894
}
895
 
896
/**
897
 * recent_rgrp_first - get first RG from "recent" list
898
 * @sdp: The GFS2 superblock
899
 * @rglast: address of the rgrp used last
900
 *
901
 * Returns: The first rgrp in the recent list
902
 */
903
 
904
static struct gfs2_rgrpd *recent_rgrp_first(struct gfs2_sbd *sdp,
905
                                            u64 rglast)
906
{
907
        struct gfs2_rgrpd *rgd = NULL;
908
 
909
        spin_lock(&sdp->sd_rindex_spin);
910
 
911
        if (list_empty(&sdp->sd_rindex_recent_list))
912
                goto out;
913
 
914
        if (!rglast)
915
                goto first;
916
 
917
        list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
918
                if (rgd->rd_addr == rglast)
919
                        goto out;
920
        }
921
 
922
first:
923
        rgd = list_entry(sdp->sd_rindex_recent_list.next, struct gfs2_rgrpd,
924
                         rd_recent);
925
out:
926
        spin_unlock(&sdp->sd_rindex_spin);
927
        return rgd;
928
}
929
 
930
/**
931
 * recent_rgrp_next - get next RG from "recent" list
932
 * @cur_rgd: current rgrp
933
 * @remove:
934
 *
935
 * Returns: The next rgrp in the recent list
936
 */
937
 
938
static struct gfs2_rgrpd *recent_rgrp_next(struct gfs2_rgrpd *cur_rgd,
939
                                           int remove)
940
{
941
        struct gfs2_sbd *sdp = cur_rgd->rd_sbd;
942
        struct list_head *head;
943
        struct gfs2_rgrpd *rgd;
944
 
945
        spin_lock(&sdp->sd_rindex_spin);
946
 
947
        head = &sdp->sd_rindex_recent_list;
948
 
949
        list_for_each_entry(rgd, head, rd_recent) {
950
                if (rgd == cur_rgd) {
951
                        if (cur_rgd->rd_recent.next != head)
952
                                rgd = list_entry(cur_rgd->rd_recent.next,
953
                                                 struct gfs2_rgrpd, rd_recent);
954
                        else
955
                                rgd = NULL;
956
 
957
                        if (remove)
958
                                list_del(&cur_rgd->rd_recent);
959
 
960
                        goto out;
961
                }
962
        }
963
 
964
        rgd = NULL;
965
        if (!list_empty(head))
966
                rgd = list_entry(head->next, struct gfs2_rgrpd, rd_recent);
967
 
968
out:
969
        spin_unlock(&sdp->sd_rindex_spin);
970
        return rgd;
971
}
972
 
973
/**
974
 * recent_rgrp_add - add an RG to tail of "recent" list
975
 * @new_rgd: The rgrp to add
976
 *
977
 */
978
 
979
static void recent_rgrp_add(struct gfs2_rgrpd *new_rgd)
980
{
981
        struct gfs2_sbd *sdp = new_rgd->rd_sbd;
982
        struct gfs2_rgrpd *rgd;
983
        unsigned int count = 0;
984
        unsigned int max = sdp->sd_rgrps / gfs2_jindex_size(sdp);
985
 
986
        spin_lock(&sdp->sd_rindex_spin);
987
 
988
        list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
989
                if (rgd == new_rgd)
990
                        goto out;
991
 
992
                if (++count >= max)
993
                        goto out;
994
        }
995
        list_add_tail(&new_rgd->rd_recent, &sdp->sd_rindex_recent_list);
996
 
997
out:
998
        spin_unlock(&sdp->sd_rindex_spin);
999
}
1000
 
1001
/**
1002
 * forward_rgrp_get - get an rgrp to try next from full list
1003
 * @sdp: The GFS2 superblock
1004
 *
1005
 * Returns: The rgrp to try next
1006
 */
1007
 
1008
static struct gfs2_rgrpd *forward_rgrp_get(struct gfs2_sbd *sdp)
1009
{
1010
        struct gfs2_rgrpd *rgd;
1011
        unsigned int journals = gfs2_jindex_size(sdp);
1012
        unsigned int rg = 0, x;
1013
 
1014
        spin_lock(&sdp->sd_rindex_spin);
1015
 
1016
        rgd = sdp->sd_rindex_forward;
1017
        if (!rgd) {
1018
                if (sdp->sd_rgrps >= journals)
1019
                        rg = sdp->sd_rgrps * sdp->sd_jdesc->jd_jid / journals;
1020
 
1021
                for (x = 0, rgd = gfs2_rgrpd_get_first(sdp); x < rg;
1022
                     x++, rgd = gfs2_rgrpd_get_next(rgd))
1023
                        /* Do Nothing */;
1024
 
1025
                sdp->sd_rindex_forward = rgd;
1026
        }
1027
 
1028
        spin_unlock(&sdp->sd_rindex_spin);
1029
 
1030
        return rgd;
1031
}
1032
 
1033
/**
1034
 * forward_rgrp_set - set the forward rgrp pointer
1035
 * @sdp: the filesystem
1036
 * @rgd: The new forward rgrp
1037
 *
1038
 */
1039
 
1040
static void forward_rgrp_set(struct gfs2_sbd *sdp, struct gfs2_rgrpd *rgd)
1041
{
1042
        spin_lock(&sdp->sd_rindex_spin);
1043
        sdp->sd_rindex_forward = rgd;
1044
        spin_unlock(&sdp->sd_rindex_spin);
1045
}
1046
 
1047
/**
1048
 * get_local_rgrp - Choose and lock a rgrp for allocation
1049
 * @ip: the inode to reserve space for
1050
 * @rgp: the chosen and locked rgrp
1051
 *
1052
 * Try to acquire rgrp in way which avoids contending with others.
1053
 *
1054
 * Returns: errno
1055
 */
1056
 
1057
static struct inode *get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
1058
{
1059
        struct inode *inode = NULL;
1060
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1061
        struct gfs2_rgrpd *rgd, *begin = NULL;
1062
        struct gfs2_alloc *al = &ip->i_alloc;
1063
        int flags = LM_FLAG_TRY;
1064
        int skipped = 0;
1065
        int loops = 0;
1066
        int error;
1067
 
1068
        /* Try recently successful rgrps */
1069
 
1070
        rgd = recent_rgrp_first(sdp, ip->i_last_rg_alloc);
1071
 
1072
        while (rgd) {
1073
                error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE,
1074
                                           LM_FLAG_TRY, &al->al_rgd_gh);
1075
                switch (error) {
1076
                case 0:
1077
                        if (try_rgrp_fit(rgd, al))
1078
                                goto out;
1079
                        if (rgd->rd_flags & GFS2_RDF_CHECK)
1080
                                inode = try_rgrp_unlink(rgd, last_unlinked);
1081
                        gfs2_glock_dq_uninit(&al->al_rgd_gh);
1082
                        if (inode)
1083
                                return inode;
1084
                        rgd = recent_rgrp_next(rgd, 1);
1085
                        break;
1086
 
1087
                case GLR_TRYFAILED:
1088
                        rgd = recent_rgrp_next(rgd, 0);
1089
                        break;
1090
 
1091
                default:
1092
                        return ERR_PTR(error);
1093
                }
1094
        }
1095
 
1096
        /* Go through full list of rgrps */
1097
 
1098
        begin = rgd = forward_rgrp_get(sdp);
1099
 
1100
        for (;;) {
1101
                error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, flags,
1102
                                          &al->al_rgd_gh);
1103
                switch (error) {
1104
                case 0:
1105
                        if (try_rgrp_fit(rgd, al))
1106
                                goto out;
1107
                        if (rgd->rd_flags & GFS2_RDF_CHECK)
1108
                                inode = try_rgrp_unlink(rgd, last_unlinked);
1109
                        gfs2_glock_dq_uninit(&al->al_rgd_gh);
1110
                        if (inode)
1111
                                return inode;
1112
                        break;
1113
 
1114
                case GLR_TRYFAILED:
1115
                        skipped++;
1116
                        break;
1117
 
1118
                default:
1119
                        return ERR_PTR(error);
1120
                }
1121
 
1122
                rgd = gfs2_rgrpd_get_next(rgd);
1123
                if (!rgd)
1124
                        rgd = gfs2_rgrpd_get_first(sdp);
1125
 
1126
                if (rgd == begin) {
1127
                        if (++loops >= 3)
1128
                                return ERR_PTR(-ENOSPC);
1129
                        if (!skipped)
1130
                                loops++;
1131
                        flags = 0;
1132
                        if (loops == 2)
1133
                                gfs2_log_flush(sdp, NULL);
1134
                }
1135
        }
1136
 
1137
out:
1138
        ip->i_last_rg_alloc = rgd->rd_addr;
1139
 
1140
        if (begin) {
1141
                recent_rgrp_add(rgd);
1142
                rgd = gfs2_rgrpd_get_next(rgd);
1143
                if (!rgd)
1144
                        rgd = gfs2_rgrpd_get_first(sdp);
1145
                forward_rgrp_set(sdp, rgd);
1146
        }
1147
 
1148
        return NULL;
1149
}
1150
 
1151
/**
1152
 * gfs2_inplace_reserve_i - Reserve space in the filesystem
1153
 * @ip: the inode to reserve space for
1154
 *
1155
 * Returns: errno
1156
 */
1157
 
1158
int gfs2_inplace_reserve_i(struct gfs2_inode *ip, char *file, unsigned int line)
1159
{
1160
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1161
        struct gfs2_alloc *al = &ip->i_alloc;
1162
        struct inode *inode;
1163
        int error = 0;
1164
        u64 last_unlinked = NO_BLOCK;
1165
 
1166
        if (gfs2_assert_warn(sdp, al->al_requested))
1167
                return -EINVAL;
1168
 
1169
try_again:
1170
        /* We need to hold the rindex unless the inode we're using is
1171
           the rindex itself, in which case it's already held. */
1172
        if (ip != GFS2_I(sdp->sd_rindex))
1173
                error = gfs2_rindex_hold(sdp, &al->al_ri_gh);
1174
        else if (!sdp->sd_rgrps) /* We may not have the rindex read in, so: */
1175
                error = gfs2_ri_update_special(ip);
1176
 
1177
        if (error)
1178
                return error;
1179
 
1180
        inode = get_local_rgrp(ip, &last_unlinked);
1181
        if (inode) {
1182
                if (ip != GFS2_I(sdp->sd_rindex))
1183
                        gfs2_glock_dq_uninit(&al->al_ri_gh);
1184
                if (IS_ERR(inode))
1185
                        return PTR_ERR(inode);
1186
                iput(inode);
1187
                gfs2_log_flush(sdp, NULL);
1188
                goto try_again;
1189
        }
1190
 
1191
        al->al_file = file;
1192
        al->al_line = line;
1193
 
1194
        return 0;
1195
}
1196
 
1197
/**
1198
 * gfs2_inplace_release - release an inplace reservation
1199
 * @ip: the inode the reservation was taken out on
1200
 *
1201
 * Release a reservation made by gfs2_inplace_reserve().
1202
 */
1203
 
1204
void gfs2_inplace_release(struct gfs2_inode *ip)
1205
{
1206
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1207
        struct gfs2_alloc *al = &ip->i_alloc;
1208
 
1209
        if (gfs2_assert_warn(sdp, al->al_alloced <= al->al_requested) == -1)
1210
                fs_warn(sdp, "al_alloced = %u, al_requested = %u "
1211
                             "al_file = %s, al_line = %u\n",
1212
                             al->al_alloced, al->al_requested, al->al_file,
1213
                             al->al_line);
1214
 
1215
        al->al_rgd = NULL;
1216
        gfs2_glock_dq_uninit(&al->al_rgd_gh);
1217
        if (ip != GFS2_I(sdp->sd_rindex))
1218
                gfs2_glock_dq_uninit(&al->al_ri_gh);
1219
}
1220
 
1221
/**
1222
 * gfs2_get_block_type - Check a block in a RG is of given type
1223
 * @rgd: the resource group holding the block
1224
 * @block: the block number
1225
 *
1226
 * Returns: The block type (GFS2_BLKST_*)
1227
 */
1228
 
1229
unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block)
1230
{
1231
        struct gfs2_bitmap *bi = NULL;
1232
        u32 length, rgrp_block, buf_block;
1233
        unsigned int buf;
1234
        unsigned char type;
1235
 
1236
        length = rgd->rd_length;
1237
        rgrp_block = block - rgd->rd_data0;
1238
 
1239
        for (buf = 0; buf < length; buf++) {
1240
                bi = rgd->rd_bits + buf;
1241
                if (rgrp_block < (bi->bi_start + bi->bi_len) * GFS2_NBBY)
1242
                        break;
1243
        }
1244
 
1245
        gfs2_assert(rgd->rd_sbd, buf < length);
1246
        buf_block = rgrp_block - bi->bi_start * GFS2_NBBY;
1247
 
1248
        type = gfs2_testbit(rgd, bi->bi_bh->b_data + bi->bi_offset,
1249
                           bi->bi_len, buf_block);
1250
 
1251
        return type;
1252
}
1253
 
1254
/**
1255
 * rgblk_search - find a block in @old_state, change allocation
1256
 *           state to @new_state
1257
 * @rgd: the resource group descriptor
1258
 * @goal: the goal block within the RG (start here to search for avail block)
1259
 * @old_state: GFS2_BLKST_XXX the before-allocation state to find
1260
 * @new_state: GFS2_BLKST_XXX the after-allocation block state
1261
 *
1262
 * Walk rgrp's bitmap to find bits that represent a block in @old_state.
1263
 * Add the found bitmap buffer to the transaction.
1264
 * Set the found bits to @new_state to change block's allocation state.
1265
 *
1266
 * This function never fails, because we wouldn't call it unless we
1267
 * know (from reservation results, etc.) that a block is available.
1268
 *
1269
 * Scope of @goal and returned block is just within rgrp, not the whole
1270
 * filesystem.
1271
 *
1272
 * Returns:  the block number allocated
1273
 */
1274
 
1275
static u32 rgblk_search(struct gfs2_rgrpd *rgd, u32 goal,
1276
                        unsigned char old_state, unsigned char new_state)
1277
{
1278
        struct gfs2_bitmap *bi = NULL;
1279
        u32 length = rgd->rd_length;
1280
        u32 blk = 0;
1281
        unsigned int buf, x;
1282
 
1283
        /* Find bitmap block that contains bits for goal block */
1284
        for (buf = 0; buf < length; buf++) {
1285
                bi = rgd->rd_bits + buf;
1286
                if (goal < (bi->bi_start + bi->bi_len) * GFS2_NBBY)
1287
                        break;
1288
        }
1289
 
1290
        gfs2_assert(rgd->rd_sbd, buf < length);
1291
 
1292
        /* Convert scope of "goal" from rgrp-wide to within found bit block */
1293
        goal -= bi->bi_start * GFS2_NBBY;
1294
 
1295
        /* Search (up to entire) bitmap in this rgrp for allocatable block.
1296
           "x <= length", instead of "x < length", because we typically start
1297
           the search in the middle of a bit block, but if we can't find an
1298
           allocatable block anywhere else, we want to be able wrap around and
1299
           search in the first part of our first-searched bit block.  */
1300
        for (x = 0; x <= length; x++) {
1301
                /* The GFS2_BLKST_UNLINKED state doesn't apply to the clone
1302
                   bitmaps, so we must search the originals for that. */
1303
                if (old_state != GFS2_BLKST_UNLINKED && bi->bi_clone)
1304
                        blk = gfs2_bitfit(rgd, bi->bi_clone + bi->bi_offset,
1305
                                          bi->bi_len, goal, old_state);
1306
                else
1307
                        blk = gfs2_bitfit(rgd,
1308
                                          bi->bi_bh->b_data + bi->bi_offset,
1309
                                          bi->bi_len, goal, old_state);
1310
                if (blk != BFITNOENT)
1311
                        break;
1312
 
1313
                /* Try next bitmap block (wrap back to rgrp header if at end) */
1314
                buf = (buf + 1) % length;
1315
                bi = rgd->rd_bits + buf;
1316
                goal = 0;
1317
        }
1318
 
1319
        if (blk != BFITNOENT && old_state != new_state) {
1320
                gfs2_trans_add_bh(rgd->rd_gl, bi->bi_bh, 1);
1321
                gfs2_setbit(rgd, bi->bi_bh->b_data + bi->bi_offset,
1322
                            bi->bi_len, blk, new_state);
1323
                if (bi->bi_clone)
1324
                        gfs2_setbit(rgd, bi->bi_clone + bi->bi_offset,
1325
                                    bi->bi_len, blk, new_state);
1326
        }
1327
 
1328
        return (blk == BFITNOENT) ? blk : (bi->bi_start * GFS2_NBBY) + blk;
1329
}
1330
 
1331
/**
1332
 * rgblk_free - Change alloc state of given block(s)
1333
 * @sdp: the filesystem
1334
 * @bstart: the start of a run of blocks to free
1335
 * @blen: the length of the block run (all must lie within ONE RG!)
1336
 * @new_state: GFS2_BLKST_XXX the after-allocation block state
1337
 *
1338
 * Returns:  Resource group containing the block(s)
1339
 */
1340
 
1341
static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart,
1342
                                     u32 blen, unsigned char new_state)
1343
{
1344
        struct gfs2_rgrpd *rgd;
1345
        struct gfs2_bitmap *bi = NULL;
1346
        u32 length, rgrp_blk, buf_blk;
1347
        unsigned int buf;
1348
 
1349
        rgd = gfs2_blk2rgrpd(sdp, bstart);
1350
        if (!rgd) {
1351
                if (gfs2_consist(sdp))
1352
                        fs_err(sdp, "block = %llu\n", (unsigned long long)bstart);
1353
                return NULL;
1354
        }
1355
 
1356
        length = rgd->rd_length;
1357
 
1358
        rgrp_blk = bstart - rgd->rd_data0;
1359
 
1360
        while (blen--) {
1361
                for (buf = 0; buf < length; buf++) {
1362
                        bi = rgd->rd_bits + buf;
1363
                        if (rgrp_blk < (bi->bi_start + bi->bi_len) * GFS2_NBBY)
1364
                                break;
1365
                }
1366
 
1367
                gfs2_assert(rgd->rd_sbd, buf < length);
1368
 
1369
                buf_blk = rgrp_blk - bi->bi_start * GFS2_NBBY;
1370
                rgrp_blk++;
1371
 
1372
                if (!bi->bi_clone) {
1373
                        bi->bi_clone = kmalloc(bi->bi_bh->b_size,
1374
                                               GFP_NOFS | __GFP_NOFAIL);
1375
                        memcpy(bi->bi_clone + bi->bi_offset,
1376
                               bi->bi_bh->b_data + bi->bi_offset,
1377
                               bi->bi_len);
1378
                }
1379
                gfs2_trans_add_bh(rgd->rd_gl, bi->bi_bh, 1);
1380
                gfs2_setbit(rgd, bi->bi_bh->b_data + bi->bi_offset,
1381
                            bi->bi_len, buf_blk, new_state);
1382
        }
1383
 
1384
        return rgd;
1385
}
1386
 
1387
/**
1388
 * gfs2_alloc_data - Allocate a data block
1389
 * @ip: the inode to allocate the data block for
1390
 *
1391
 * Returns: the allocated block
1392
 */
1393
 
1394
u64 gfs2_alloc_data(struct gfs2_inode *ip)
1395
{
1396
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1397
        struct gfs2_alloc *al = &ip->i_alloc;
1398
        struct gfs2_rgrpd *rgd = al->al_rgd;
1399
        u32 goal, blk;
1400
        u64 block;
1401
 
1402
        if (rgrp_contains_block(rgd, ip->i_di.di_goal_data))
1403
                goal = ip->i_di.di_goal_data - rgd->rd_data0;
1404
        else
1405
                goal = rgd->rd_last_alloc_data;
1406
 
1407
        blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, GFS2_BLKST_USED);
1408
        BUG_ON(blk == BFITNOENT);
1409
        rgd->rd_last_alloc_data = blk;
1410
 
1411
        block = rgd->rd_data0 + blk;
1412
        ip->i_di.di_goal_data = block;
1413
 
1414
        gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
1415
        rgd->rd_rg.rg_free--;
1416
 
1417
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1418
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1419
 
1420
        al->al_alloced++;
1421
 
1422
        gfs2_statfs_change(sdp, 0, -1, 0);
1423
        gfs2_quota_change(ip, +1, ip->i_inode.i_uid, ip->i_inode.i_gid);
1424
 
1425
        spin_lock(&sdp->sd_rindex_spin);
1426
        rgd->rd_free_clone--;
1427
        spin_unlock(&sdp->sd_rindex_spin);
1428
 
1429
        return block;
1430
}
1431
 
1432
/**
1433
 * gfs2_alloc_meta - Allocate a metadata block
1434
 * @ip: the inode to allocate the metadata block for
1435
 *
1436
 * Returns: the allocated block
1437
 */
1438
 
1439
u64 gfs2_alloc_meta(struct gfs2_inode *ip)
1440
{
1441
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1442
        struct gfs2_alloc *al = &ip->i_alloc;
1443
        struct gfs2_rgrpd *rgd = al->al_rgd;
1444
        u32 goal, blk;
1445
        u64 block;
1446
 
1447
        if (rgrp_contains_block(rgd, ip->i_di.di_goal_meta))
1448
                goal = ip->i_di.di_goal_meta - rgd->rd_data0;
1449
        else
1450
                goal = rgd->rd_last_alloc_meta;
1451
 
1452
        blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, GFS2_BLKST_USED);
1453
        BUG_ON(blk == BFITNOENT);
1454
        rgd->rd_last_alloc_meta = blk;
1455
 
1456
        block = rgd->rd_data0 + blk;
1457
        ip->i_di.di_goal_meta = block;
1458
 
1459
        gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
1460
        rgd->rd_rg.rg_free--;
1461
 
1462
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1463
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1464
 
1465
        al->al_alloced++;
1466
 
1467
        gfs2_statfs_change(sdp, 0, -1, 0);
1468
        gfs2_quota_change(ip, +1, ip->i_inode.i_uid, ip->i_inode.i_gid);
1469
        gfs2_trans_add_unrevoke(sdp, block);
1470
 
1471
        spin_lock(&sdp->sd_rindex_spin);
1472
        rgd->rd_free_clone--;
1473
        spin_unlock(&sdp->sd_rindex_spin);
1474
 
1475
        return block;
1476
}
1477
 
1478
/**
1479
 * gfs2_alloc_di - Allocate a dinode
1480
 * @dip: the directory that the inode is going in
1481
 *
1482
 * Returns: the block allocated
1483
 */
1484
 
1485
u64 gfs2_alloc_di(struct gfs2_inode *dip, u64 *generation)
1486
{
1487
        struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
1488
        struct gfs2_alloc *al = &dip->i_alloc;
1489
        struct gfs2_rgrpd *rgd = al->al_rgd;
1490
        u32 blk;
1491
        u64 block;
1492
 
1493
        blk = rgblk_search(rgd, rgd->rd_last_alloc_meta,
1494
                           GFS2_BLKST_FREE, GFS2_BLKST_DINODE);
1495
        BUG_ON(blk == BFITNOENT);
1496
 
1497
        rgd->rd_last_alloc_meta = blk;
1498
 
1499
        block = rgd->rd_data0 + blk;
1500
 
1501
        gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
1502
        rgd->rd_rg.rg_free--;
1503
        rgd->rd_rg.rg_dinodes++;
1504
        *generation = rgd->rd_rg.rg_igeneration++;
1505
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1506
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1507
 
1508
        al->al_alloced++;
1509
 
1510
        gfs2_statfs_change(sdp, 0, -1, +1);
1511
        gfs2_trans_add_unrevoke(sdp, block);
1512
 
1513
        spin_lock(&sdp->sd_rindex_spin);
1514
        rgd->rd_free_clone--;
1515
        spin_unlock(&sdp->sd_rindex_spin);
1516
 
1517
        return block;
1518
}
1519
 
1520
/**
1521
 * gfs2_free_data - free a contiguous run of data block(s)
1522
 * @ip: the inode these blocks are being freed from
1523
 * @bstart: first block of a run of contiguous blocks
1524
 * @blen: the length of the block run
1525
 *
1526
 */
1527
 
1528
void gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen)
1529
{
1530
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1531
        struct gfs2_rgrpd *rgd;
1532
 
1533
        rgd = rgblk_free(sdp, bstart, blen, GFS2_BLKST_FREE);
1534
        if (!rgd)
1535
                return;
1536
 
1537
        rgd->rd_rg.rg_free += blen;
1538
 
1539
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1540
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1541
 
1542
        gfs2_trans_add_rg(rgd);
1543
 
1544
        gfs2_statfs_change(sdp, 0, +blen, 0);
1545
        gfs2_quota_change(ip, -(s64)blen, ip->i_inode.i_uid, ip->i_inode.i_gid);
1546
}
1547
 
1548
/**
1549
 * gfs2_free_meta - free a contiguous run of data block(s)
1550
 * @ip: the inode these blocks are being freed from
1551
 * @bstart: first block of a run of contiguous blocks
1552
 * @blen: the length of the block run
1553
 *
1554
 */
1555
 
1556
void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen)
1557
{
1558
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1559
        struct gfs2_rgrpd *rgd;
1560
 
1561
        rgd = rgblk_free(sdp, bstart, blen, GFS2_BLKST_FREE);
1562
        if (!rgd)
1563
                return;
1564
 
1565
        rgd->rd_rg.rg_free += blen;
1566
 
1567
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1568
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1569
 
1570
        gfs2_trans_add_rg(rgd);
1571
 
1572
        gfs2_statfs_change(sdp, 0, +blen, 0);
1573
        gfs2_quota_change(ip, -(s64)blen, ip->i_inode.i_uid, ip->i_inode.i_gid);
1574
        gfs2_meta_wipe(ip, bstart, blen);
1575
}
1576
 
1577
void gfs2_unlink_di(struct inode *inode)
1578
{
1579
        struct gfs2_inode *ip = GFS2_I(inode);
1580
        struct gfs2_sbd *sdp = GFS2_SB(inode);
1581
        struct gfs2_rgrpd *rgd;
1582
        u64 blkno = ip->i_no_addr;
1583
 
1584
        rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_UNLINKED);
1585
        if (!rgd)
1586
                return;
1587
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1588
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1589
        gfs2_trans_add_rg(rgd);
1590
}
1591
 
1592
static void gfs2_free_uninit_di(struct gfs2_rgrpd *rgd, u64 blkno)
1593
{
1594
        struct gfs2_sbd *sdp = rgd->rd_sbd;
1595
        struct gfs2_rgrpd *tmp_rgd;
1596
 
1597
        tmp_rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_FREE);
1598
        if (!tmp_rgd)
1599
                return;
1600
        gfs2_assert_withdraw(sdp, rgd == tmp_rgd);
1601
 
1602
        if (!rgd->rd_rg.rg_dinodes)
1603
                gfs2_consist_rgrpd(rgd);
1604
        rgd->rd_rg.rg_dinodes--;
1605
        rgd->rd_rg.rg_free++;
1606
 
1607
        gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
1608
        gfs2_rgrp_out(&rgd->rd_rg, rgd->rd_bits[0].bi_bh->b_data);
1609
 
1610
        gfs2_statfs_change(sdp, 0, +1, -1);
1611
        gfs2_trans_add_rg(rgd);
1612
}
1613
 
1614
 
1615
void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip)
1616
{
1617
        gfs2_free_uninit_di(rgd, ip->i_no_addr);
1618
        gfs2_quota_change(ip, -1, ip->i_inode.i_uid, ip->i_inode.i_gid);
1619
        gfs2_meta_wipe(ip, ip->i_no_addr, 1);
1620
}
1621
 
1622
/**
1623
 * gfs2_rlist_add - add a RG to a list of RGs
1624
 * @sdp: the filesystem
1625
 * @rlist: the list of resource groups
1626
 * @block: the block
1627
 *
1628
 * Figure out what RG a block belongs to and add that RG to the list
1629
 *
1630
 * FIXME: Don't use NOFAIL
1631
 *
1632
 */
1633
 
1634
void gfs2_rlist_add(struct gfs2_sbd *sdp, struct gfs2_rgrp_list *rlist,
1635
                    u64 block)
1636
{
1637
        struct gfs2_rgrpd *rgd;
1638
        struct gfs2_rgrpd **tmp;
1639
        unsigned int new_space;
1640
        unsigned int x;
1641
 
1642
        if (gfs2_assert_warn(sdp, !rlist->rl_ghs))
1643
                return;
1644
 
1645
        rgd = gfs2_blk2rgrpd(sdp, block);
1646
        if (!rgd) {
1647
                if (gfs2_consist(sdp))
1648
                        fs_err(sdp, "block = %llu\n", (unsigned long long)block);
1649
                return;
1650
        }
1651
 
1652
        for (x = 0; x < rlist->rl_rgrps; x++)
1653
                if (rlist->rl_rgd[x] == rgd)
1654
                        return;
1655
 
1656
        if (rlist->rl_rgrps == rlist->rl_space) {
1657
                new_space = rlist->rl_space + 10;
1658
 
1659
                tmp = kcalloc(new_space, sizeof(struct gfs2_rgrpd *),
1660
                              GFP_NOFS | __GFP_NOFAIL);
1661
 
1662
                if (rlist->rl_rgd) {
1663
                        memcpy(tmp, rlist->rl_rgd,
1664
                               rlist->rl_space * sizeof(struct gfs2_rgrpd *));
1665
                        kfree(rlist->rl_rgd);
1666
                }
1667
 
1668
                rlist->rl_space = new_space;
1669
                rlist->rl_rgd = tmp;
1670
        }
1671
 
1672
        rlist->rl_rgd[rlist->rl_rgrps++] = rgd;
1673
}
1674
 
1675
/**
1676
 * gfs2_rlist_alloc - all RGs have been added to the rlist, now allocate
1677
 *      and initialize an array of glock holders for them
1678
 * @rlist: the list of resource groups
1679
 * @state: the lock state to acquire the RG lock in
1680
 * @flags: the modifier flags for the holder structures
1681
 *
1682
 * FIXME: Don't use NOFAIL
1683
 *
1684
 */
1685
 
1686
void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, unsigned int state,
1687
                      int flags)
1688
{
1689
        unsigned int x;
1690
 
1691
        rlist->rl_ghs = kcalloc(rlist->rl_rgrps, sizeof(struct gfs2_holder),
1692
                                GFP_NOFS | __GFP_NOFAIL);
1693
        for (x = 0; x < rlist->rl_rgrps; x++)
1694
                gfs2_holder_init(rlist->rl_rgd[x]->rd_gl,
1695
                                state, flags,
1696
                                &rlist->rl_ghs[x]);
1697
}
1698
 
1699
/**
1700
 * gfs2_rlist_free - free a resource group list
1701
 * @list: the list of resource groups
1702
 *
1703
 */
1704
 
1705
void gfs2_rlist_free(struct gfs2_rgrp_list *rlist)
1706
{
1707
        unsigned int x;
1708
 
1709
        kfree(rlist->rl_rgd);
1710
 
1711
        if (rlist->rl_ghs) {
1712
                for (x = 0; x < rlist->rl_rgrps; x++)
1713
                        gfs2_holder_uninit(&rlist->rl_ghs[x]);
1714
                kfree(rlist->rl_ghs);
1715
        }
1716
}
1717
 

powered by: WebSVN 2.1.0

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