diff options
-rw-r--r-- | fs/gfs2/bmap.c | 9 | ||||
-rw-r--r-- | fs/gfs2/dir.c | 11 | ||||
-rw-r--r-- | fs/gfs2/eattr.c | 14 | ||||
-rw-r--r-- | fs/gfs2/glops.c | 20 | ||||
-rw-r--r-- | fs/gfs2/incore.h | 7 | ||||
-rw-r--r-- | fs/gfs2/rgrp.c | 58 | ||||
-rw-r--r-- | fs/gfs2/rgrp.h | 47 |
7 files changed, 99 insertions, 67 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 3a5d3f883e10..253e1a39f841 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
@@ -136,7 +136,9 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) | |||
136 | and write it out to disk */ | 136 | and write it out to disk */ |
137 | 137 | ||
138 | unsigned int n = 1; | 138 | unsigned int n = 1; |
139 | block = gfs2_alloc_block(ip, &n); | 139 | error = gfs2_alloc_block(ip, &block, &n); |
140 | if (error) | ||
141 | goto out_brelse; | ||
140 | if (isdir) { | 142 | if (isdir) { |
141 | gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1); | 143 | gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1); |
142 | error = gfs2_dir_get_new_buffer(ip, block, &bh); | 144 | error = gfs2_dir_get_new_buffer(ip, block, &bh); |
@@ -476,8 +478,11 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock, | |||
476 | blks = dblks + iblks; | 478 | blks = dblks + iblks; |
477 | i = sheight; | 479 | i = sheight; |
478 | do { | 480 | do { |
481 | int error; | ||
479 | n = blks - alloced; | 482 | n = blks - alloced; |
480 | bn = gfs2_alloc_block(ip, &n); | 483 | error = gfs2_alloc_block(ip, &bn, &n); |
484 | if (error) | ||
485 | return error; | ||
481 | alloced += n; | 486 | alloced += n; |
482 | if (state != ALLOC_DATA || gfs2_is_jdata(ip)) | 487 | if (state != ALLOC_DATA || gfs2_is_jdata(ip)) |
483 | gfs2_trans_add_unrevoke(sdp, bn, n); | 488 | gfs2_trans_add_unrevoke(sdp, bn, n); |
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index aef4d0c06748..297d7e5cebad 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
@@ -803,13 +803,20 @@ static struct gfs2_leaf *new_leaf(struct inode *inode, struct buffer_head **pbh, | |||
803 | { | 803 | { |
804 | struct gfs2_inode *ip = GFS2_I(inode); | 804 | struct gfs2_inode *ip = GFS2_I(inode); |
805 | unsigned int n = 1; | 805 | unsigned int n = 1; |
806 | u64 bn = gfs2_alloc_block(ip, &n); | 806 | u64 bn; |
807 | struct buffer_head *bh = gfs2_meta_new(ip->i_gl, bn); | 807 | int error; |
808 | struct buffer_head *bh; | ||
808 | struct gfs2_leaf *leaf; | 809 | struct gfs2_leaf *leaf; |
809 | struct gfs2_dirent *dent; | 810 | struct gfs2_dirent *dent; |
810 | struct qstr name = { .name = "", .len = 0, .hash = 0 }; | 811 | struct qstr name = { .name = "", .len = 0, .hash = 0 }; |
812 | |||
813 | error = gfs2_alloc_block(ip, &bn, &n); | ||
814 | if (error) | ||
815 | return NULL; | ||
816 | bh = gfs2_meta_new(ip->i_gl, bn); | ||
811 | if (!bh) | 817 | if (!bh) |
812 | return NULL; | 818 | return NULL; |
819 | |||
813 | gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, 1); | 820 | gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, 1); |
814 | gfs2_trans_add_bh(ip->i_gl, bh, 1); | 821 | gfs2_trans_add_bh(ip->i_gl, bh, 1); |
815 | gfs2_metatype_set(bh, GFS2_METATYPE_LF, GFS2_FORMAT_LF); | 822 | gfs2_metatype_set(bh, GFS2_METATYPE_LF, GFS2_FORMAT_LF); |
diff --git a/fs/gfs2/eattr.c b/fs/gfs2/eattr.c index 899763aed217..07ea9529adda 100644 --- a/fs/gfs2/eattr.c +++ b/fs/gfs2/eattr.c | |||
@@ -582,8 +582,11 @@ static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp) | |||
582 | struct gfs2_ea_header *ea; | 582 | struct gfs2_ea_header *ea; |
583 | unsigned int n = 1; | 583 | unsigned int n = 1; |
584 | u64 block; | 584 | u64 block; |
585 | int error; | ||
585 | 586 | ||
586 | block = gfs2_alloc_block(ip, &n); | 587 | error = gfs2_alloc_block(ip, &block, &n); |
588 | if (error) | ||
589 | return error; | ||
587 | gfs2_trans_add_unrevoke(sdp, block, 1); | 590 | gfs2_trans_add_unrevoke(sdp, block, 1); |
588 | *bhp = gfs2_meta_new(ip->i_gl, block); | 591 | *bhp = gfs2_meta_new(ip->i_gl, block); |
589 | gfs2_trans_add_bh(ip->i_gl, *bhp, 1); | 592 | gfs2_trans_add_bh(ip->i_gl, *bhp, 1); |
@@ -617,6 +620,7 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea, | |||
617 | struct gfs2_ea_request *er) | 620 | struct gfs2_ea_request *er) |
618 | { | 621 | { |
619 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 622 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
623 | int error; | ||
620 | 624 | ||
621 | ea->ea_data_len = cpu_to_be32(er->er_data_len); | 625 | ea->ea_data_len = cpu_to_be32(er->er_data_len); |
622 | ea->ea_name_len = er->er_name_len; | 626 | ea->ea_name_len = er->er_name_len; |
@@ -642,7 +646,9 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea, | |||
642 | int mh_size = sizeof(struct gfs2_meta_header); | 646 | int mh_size = sizeof(struct gfs2_meta_header); |
643 | unsigned int n = 1; | 647 | unsigned int n = 1; |
644 | 648 | ||
645 | block = gfs2_alloc_block(ip, &n); | 649 | error = gfs2_alloc_block(ip, &block, &n); |
650 | if (error) | ||
651 | return error; | ||
646 | gfs2_trans_add_unrevoke(sdp, block, 1); | 652 | gfs2_trans_add_unrevoke(sdp, block, 1); |
647 | bh = gfs2_meta_new(ip->i_gl, block); | 653 | bh = gfs2_meta_new(ip->i_gl, block); |
648 | gfs2_trans_add_bh(ip->i_gl, bh, 1); | 654 | gfs2_trans_add_bh(ip->i_gl, bh, 1); |
@@ -963,7 +969,9 @@ static int ea_set_block(struct gfs2_inode *ip, struct gfs2_ea_request *er, | |||
963 | } else { | 969 | } else { |
964 | u64 blk; | 970 | u64 blk; |
965 | unsigned int n = 1; | 971 | unsigned int n = 1; |
966 | blk = gfs2_alloc_block(ip, &n); | 972 | error = gfs2_alloc_block(ip, &blk, &n); |
973 | if (error) | ||
974 | return error; | ||
967 | gfs2_trans_add_unrevoke(sdp, blk, 1); | 975 | gfs2_trans_add_unrevoke(sdp, blk, 1); |
968 | indbh = gfs2_meta_new(ip->i_gl, blk); | 976 | indbh = gfs2_meta_new(ip->i_gl, blk); |
969 | gfs2_trans_add_bh(ip->i_gl, indbh, 1); | 977 | gfs2_trans_add_bh(ip->i_gl, indbh, 1); |
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 70f87f43afa2..d5e4ab155ca0 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -310,24 +310,6 @@ static void rgrp_go_unlock(struct gfs2_holder *gh) | |||
310 | } | 310 | } |
311 | 311 | ||
312 | /** | 312 | /** |
313 | * rgrp_go_dump - print out an rgrp | ||
314 | * @seq: The iterator | ||
315 | * @gl: The glock in question | ||
316 | * | ||
317 | */ | ||
318 | |||
319 | static int rgrp_go_dump(struct seq_file *seq, const struct gfs2_glock *gl) | ||
320 | { | ||
321 | const struct gfs2_rgrpd *rgd = gl->gl_object; | ||
322 | if (rgd == NULL) | ||
323 | return 0; | ||
324 | gfs2_print_dbg(seq, " R: n:%llu f:%02x b:%u/%u i:%u\n", | ||
325 | (unsigned long long)rgd->rd_addr, rgd->rd_flags, | ||
326 | rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes); | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | /** | ||
331 | * trans_go_sync - promote/demote the transaction glock | 313 | * trans_go_sync - promote/demote the transaction glock |
332 | * @gl: the glock | 314 | * @gl: the glock |
333 | * @state: the requested state | 315 | * @state: the requested state |
@@ -410,7 +392,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = { | |||
410 | .go_demote_ok = rgrp_go_demote_ok, | 392 | .go_demote_ok = rgrp_go_demote_ok, |
411 | .go_lock = rgrp_go_lock, | 393 | .go_lock = rgrp_go_lock, |
412 | .go_unlock = rgrp_go_unlock, | 394 | .go_unlock = rgrp_go_unlock, |
413 | .go_dump = rgrp_go_dump, | 395 | .go_dump = gfs2_rgrp_dump, |
414 | .go_type = LM_TYPE_RGRP, | 396 | .go_type = LM_TYPE_RGRP, |
415 | .go_min_hold_time = HZ / 5, | 397 | .go_min_hold_time = HZ / 5, |
416 | }; | 398 | }; |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 0060e9564bb9..de50d86fec12 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -92,9 +92,10 @@ struct gfs2_rgrpd { | |||
92 | unsigned int rd_bh_count; | 92 | unsigned int rd_bh_count; |
93 | u32 rd_last_alloc; | 93 | u32 rd_last_alloc; |
94 | unsigned char rd_flags; | 94 | unsigned char rd_flags; |
95 | #define GFS2_RDF_CHECK 0x01 /* Need to check for unlinked inodes */ | 95 | #define GFS2_RDF_CHECK 0x10000000 /* check for unlinked inodes */ |
96 | #define GFS2_RDF_NOALLOC 0x02 /* rg prohibits allocation */ | 96 | #define GFS2_RDF_UPTODATE 0x20000000 /* rg is up to date */ |
97 | #define GFS2_RDF_UPTODATE 0x04 /* rg is up to date */ | 97 | #define GFS2_RDF_ERROR 0x40000000 /* error in rg */ |
98 | #define GFS2_RDF_MASK 0xf0000000 /* mask for internal flags */ | ||
98 | }; | 99 | }; |
99 | 100 | ||
100 | enum gfs2_state_bits { | 101 | enum gfs2_state_bits { |
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 565038243fa2..fbacf09ee34e 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
@@ -701,10 +701,7 @@ static void gfs2_rgrp_in(struct gfs2_rgrpd *rgd, const void *buf) | |||
701 | u32 rg_flags; | 701 | u32 rg_flags; |
702 | 702 | ||
703 | rg_flags = be32_to_cpu(str->rg_flags); | 703 | rg_flags = be32_to_cpu(str->rg_flags); |
704 | if (rg_flags & GFS2_RGF_NOALLOC) | 704 | rg_flags &= ~GFS2_RDF_MASK; |
705 | rgd->rd_flags |= GFS2_RDF_NOALLOC; | ||
706 | else | ||
707 | rgd->rd_flags &= ~GFS2_RDF_NOALLOC; | ||
708 | rgd->rd_free = be32_to_cpu(str->rg_free); | 705 | rgd->rd_free = be32_to_cpu(str->rg_free); |
709 | rgd->rd_dinodes = be32_to_cpu(str->rg_dinodes); | 706 | rgd->rd_dinodes = be32_to_cpu(str->rg_dinodes); |
710 | rgd->rd_igeneration = be64_to_cpu(str->rg_igeneration); | 707 | rgd->rd_igeneration = be64_to_cpu(str->rg_igeneration); |
@@ -713,11 +710,8 @@ static void gfs2_rgrp_in(struct gfs2_rgrpd *rgd, const void *buf) | |||
713 | static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf) | 710 | static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf) |
714 | { | 711 | { |
715 | struct gfs2_rgrp *str = buf; | 712 | struct gfs2_rgrp *str = buf; |
716 | u32 rg_flags = 0; | ||
717 | 713 | ||
718 | if (rgd->rd_flags & GFS2_RDF_NOALLOC) | 714 | str->rg_flags = cpu_to_be32(rgd->rd_flags & ~GFS2_RDF_MASK); |
719 | rg_flags |= GFS2_RGF_NOALLOC; | ||
720 | str->rg_flags = cpu_to_be32(rg_flags); | ||
721 | str->rg_free = cpu_to_be32(rgd->rd_free); | 715 | str->rg_free = cpu_to_be32(rgd->rd_free); |
722 | str->rg_dinodes = cpu_to_be32(rgd->rd_dinodes); | 716 | str->rg_dinodes = cpu_to_be32(rgd->rd_dinodes); |
723 | str->__pad = cpu_to_be32(0); | 717 | str->__pad = cpu_to_be32(0); |
@@ -942,7 +936,7 @@ static int try_rgrp_fit(struct gfs2_rgrpd *rgd, struct gfs2_alloc *al) | |||
942 | struct gfs2_sbd *sdp = rgd->rd_sbd; | 936 | struct gfs2_sbd *sdp = rgd->rd_sbd; |
943 | int ret = 0; | 937 | int ret = 0; |
944 | 938 | ||
945 | if (rgd->rd_flags & GFS2_RDF_NOALLOC) | 939 | if (rgd->rd_flags & (GFS2_RGF_NOALLOC | GFS2_RDF_ERROR)) |
946 | return 0; | 940 | return 0; |
947 | 941 | ||
948 | spin_lock(&sdp->sd_rindex_spin); | 942 | spin_lock(&sdp->sd_rindex_spin); |
@@ -1435,13 +1429,33 @@ static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart, | |||
1435 | } | 1429 | } |
1436 | 1430 | ||
1437 | /** | 1431 | /** |
1438 | * gfs2_alloc_block - Allocate a block | 1432 | * gfs2_rgrp_dump - print out an rgrp |
1433 | * @seq: The iterator | ||
1434 | * @gl: The glock in question | ||
1435 | * | ||
1436 | */ | ||
1437 | |||
1438 | int gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl) | ||
1439 | { | ||
1440 | const struct gfs2_rgrpd *rgd = gl->gl_object; | ||
1441 | if (rgd == NULL) | ||
1442 | return 0; | ||
1443 | gfs2_print_dbg(seq, " R: n:%llu f:%02x b:%u/%u i:%u\n", | ||
1444 | (unsigned long long)rgd->rd_addr, rgd->rd_flags, | ||
1445 | rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes); | ||
1446 | return 0; | ||
1447 | } | ||
1448 | |||
1449 | /** | ||
1450 | * gfs2_alloc_block - Allocate one or more blocks | ||
1439 | * @ip: the inode to allocate the block for | 1451 | * @ip: the inode to allocate the block for |
1452 | * @bn: Used to return the starting block number | ||
1453 | * @n: requested number of blocks/extent length (value/result) | ||
1440 | * | 1454 | * |
1441 | * Returns: the allocated block | 1455 | * Returns: 0 or error |
1442 | */ | 1456 | */ |
1443 | 1457 | ||
1444 | u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n) | 1458 | int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n) |
1445 | { | 1459 | { |
1446 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 1460 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
1447 | struct buffer_head *dibh; | 1461 | struct buffer_head *dibh; |
@@ -1457,7 +1471,10 @@ u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n) | |||
1457 | goal = rgd->rd_last_alloc; | 1471 | goal = rgd->rd_last_alloc; |
1458 | 1472 | ||
1459 | blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, GFS2_BLKST_USED, n); | 1473 | blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, GFS2_BLKST_USED, n); |
1460 | BUG_ON(blk == BFITNOENT); | 1474 | |
1475 | /* Since all blocks are reserved in advance, this shouldn't happen */ | ||
1476 | if (blk == BFITNOENT) | ||
1477 | goto rgrp_error; | ||
1461 | 1478 | ||
1462 | rgd->rd_last_alloc = blk; | 1479 | rgd->rd_last_alloc = blk; |
1463 | block = rgd->rd_data0 + blk; | 1480 | block = rgd->rd_data0 + blk; |
@@ -1469,7 +1486,9 @@ u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n) | |||
1469 | di->di_goal_meta = di->di_goal_data = cpu_to_be64(ip->i_goal); | 1486 | di->di_goal_meta = di->di_goal_data = cpu_to_be64(ip->i_goal); |
1470 | brelse(dibh); | 1487 | brelse(dibh); |
1471 | } | 1488 | } |
1472 | gfs2_assert_withdraw(sdp, rgd->rd_free >= *n); | 1489 | if (rgd->rd_free < *n) |
1490 | goto rgrp_error; | ||
1491 | |||
1473 | rgd->rd_free -= *n; | 1492 | rgd->rd_free -= *n; |
1474 | 1493 | ||
1475 | gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1); | 1494 | gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1); |
@@ -1484,7 +1503,16 @@ u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n) | |||
1484 | rgd->rd_free_clone -= *n; | 1503 | rgd->rd_free_clone -= *n; |
1485 | spin_unlock(&sdp->sd_rindex_spin); | 1504 | spin_unlock(&sdp->sd_rindex_spin); |
1486 | 1505 | ||
1487 | return block; | 1506 | *bn = block; |
1507 | return 0; | ||
1508 | |||
1509 | rgrp_error: | ||
1510 | fs_warn(sdp, "rgrp %llu has an error, marking it readonly until umount\n", | ||
1511 | (unsigned long long)rgd->rd_addr); | ||
1512 | fs_warn(sdp, "umount on all nodes and run fsck.gfs2 to fix the error\n"); | ||
1513 | gfs2_rgrp_dump(NULL, rgd->rd_gl); | ||
1514 | rgd->rd_flags |= GFS2_RDF_ERROR; | ||
1515 | return -EIO; | ||
1488 | } | 1516 | } |
1489 | 1517 | ||
1490 | /** | 1518 | /** |
diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h index 3181c7e624bf..1e76ff0f3e00 100644 --- a/fs/gfs2/rgrp.h +++ b/fs/gfs2/rgrp.h | |||
@@ -14,22 +14,22 @@ struct gfs2_rgrpd; | |||
14 | struct gfs2_sbd; | 14 | struct gfs2_sbd; |
15 | struct gfs2_holder; | 15 | struct gfs2_holder; |
16 | 16 | ||
17 | void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd); | 17 | extern void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd); |
18 | 18 | ||
19 | struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk); | 19 | struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk); |
20 | struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp); | 20 | struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp); |
21 | struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd); | 21 | struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd); |
22 | 22 | ||
23 | void gfs2_clear_rgrpd(struct gfs2_sbd *sdp); | 23 | extern void gfs2_clear_rgrpd(struct gfs2_sbd *sdp); |
24 | int gfs2_rindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ri_gh); | 24 | extern int gfs2_rindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ri_gh); |
25 | 25 | ||
26 | int gfs2_rgrp_bh_get(struct gfs2_rgrpd *rgd); | 26 | extern int gfs2_rgrp_bh_get(struct gfs2_rgrpd *rgd); |
27 | void gfs2_rgrp_bh_hold(struct gfs2_rgrpd *rgd); | 27 | extern void gfs2_rgrp_bh_hold(struct gfs2_rgrpd *rgd); |
28 | void gfs2_rgrp_bh_put(struct gfs2_rgrpd *rgd); | 28 | extern void gfs2_rgrp_bh_put(struct gfs2_rgrpd *rgd); |
29 | 29 | ||
30 | void gfs2_rgrp_repolish_clones(struct gfs2_rgrpd *rgd); | 30 | extern void gfs2_rgrp_repolish_clones(struct gfs2_rgrpd *rgd); |
31 | 31 | ||
32 | struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip); | 32 | extern struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip); |
33 | static inline void gfs2_alloc_put(struct gfs2_inode *ip) | 33 | static inline void gfs2_alloc_put(struct gfs2_inode *ip) |
34 | { | 34 | { |
35 | BUG_ON(ip->i_alloc == NULL); | 35 | BUG_ON(ip->i_alloc == NULL); |
@@ -37,22 +37,22 @@ static inline void gfs2_alloc_put(struct gfs2_inode *ip) | |||
37 | ip->i_alloc = NULL; | 37 | ip->i_alloc = NULL; |
38 | } | 38 | } |
39 | 39 | ||
40 | int gfs2_inplace_reserve_i(struct gfs2_inode *ip, | 40 | extern int gfs2_inplace_reserve_i(struct gfs2_inode *ip, char *file, |
41 | char *file, unsigned int line); | 41 | unsigned int line); |
42 | #define gfs2_inplace_reserve(ip) \ | 42 | #define gfs2_inplace_reserve(ip) \ |
43 | gfs2_inplace_reserve_i((ip), __FILE__, __LINE__) | 43 | gfs2_inplace_reserve_i((ip), __FILE__, __LINE__) |
44 | 44 | ||
45 | void gfs2_inplace_release(struct gfs2_inode *ip); | 45 | extern void gfs2_inplace_release(struct gfs2_inode *ip); |
46 | 46 | ||
47 | unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block); | 47 | extern unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block); |
48 | 48 | ||
49 | u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n); | 49 | extern int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n); |
50 | u64 gfs2_alloc_di(struct gfs2_inode *ip, u64 *generation); | 50 | extern u64 gfs2_alloc_di(struct gfs2_inode *ip, u64 *generation); |
51 | 51 | ||
52 | void gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen); | 52 | extern void gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen); |
53 | void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen); | 53 | extern void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen); |
54 | void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip); | 54 | extern void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip); |
55 | void gfs2_unlink_di(struct inode *inode); | 55 | extern void gfs2_unlink_di(struct inode *inode); |
56 | 56 | ||
57 | struct gfs2_rgrp_list { | 57 | struct gfs2_rgrp_list { |
58 | unsigned int rl_rgrps; | 58 | unsigned int rl_rgrps; |
@@ -61,10 +61,11 @@ struct gfs2_rgrp_list { | |||
61 | struct gfs2_holder *rl_ghs; | 61 | struct gfs2_holder *rl_ghs; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | void gfs2_rlist_add(struct gfs2_sbd *sdp, struct gfs2_rgrp_list *rlist, | 64 | extern void gfs2_rlist_add(struct gfs2_sbd *sdp, struct gfs2_rgrp_list *rlist, |
65 | u64 block); | 65 | u64 block); |
66 | void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, unsigned int state); | 66 | extern void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, unsigned int state); |
67 | void gfs2_rlist_free(struct gfs2_rgrp_list *rlist); | 67 | extern void gfs2_rlist_free(struct gfs2_rgrp_list *rlist); |
68 | u64 gfs2_ri_total(struct gfs2_sbd *sdp); | 68 | extern u64 gfs2_ri_total(struct gfs2_sbd *sdp); |
69 | extern int gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl); | ||
69 | 70 | ||
70 | #endif /* __RGRP_DOT_H__ */ | 71 | #endif /* __RGRP_DOT_H__ */ |