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