diff --git a/.gfs2-utils.metadata b/.gfs2-utils.metadata new file mode 100644 index 0000000..19eabf1 --- /dev/null +++ b/.gfs2-utils.metadata @@ -0,0 +1 @@ +d524948b501354a97f2ade4e8f7130d97b92ff32 SOURCES/gfs2-utils-3.1.10.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b59d86a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gfs2-utils-3.1.10.tar.gz diff --git a/SOURCES/bz1326508-gfs2_5_Clarify_the_availability_of_the_loccookie_option.patch b/SOURCES/bz1326508-gfs2_5_Clarify_the_availability_of_the_loccookie_option.patch new file mode 100644 index 0000000..ea9f946 --- /dev/null +++ b/SOURCES/bz1326508-gfs2_5_Clarify_the_availability_of_the_loccookie_option.patch @@ -0,0 +1,27 @@ +commit 704beb265cd6f860a10f4a5ae0fd8c52e72bf392 +Author: Andrew Price +Date: Tue Jul 19 15:41:13 2016 +0100 + + gfs2(5): Clarify the availability of the loccookie option + + The loccookie option was added in kernel-3.10.0-341.el7 but the first + release will be RHEL 7.3 so use that to clarify when 'loccookie' appears + in RHEL7. + + Resolves: rhbz#1326508 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/man/gfs2.5 b/gfs2/man/gfs2.5 +index 56d1a00..6c77519 100644 +--- a/gfs2/man/gfs2.5 ++++ b/gfs2/man/gfs2.5 +@@ -193,7 +193,7 @@ give out well over half a billion location based cookies. This option was added + in the 4.5 Linux kernel. Prior to this kernel, gfs2 did not add directory + entries in a way that allowed it to use location based readdir cookies. + \fBNote:\fP To safely turn on this option, all nodes mounting the filesystem +-must be running at least a 4.5 Linux kernel. If this option is only enabled on ++must be running at least a 4.5 Linux kernel or RHEL 7.3. If this option is only enabled on + some of the nodes mounting a filesystem, the cookies returned by nodes using + this option will not be valid on nodes that are not using this option, and vice + versa. Finally, when first enabling this option on a filesystem that had been diff --git a/SOURCES/bz1436772-gfs2_grow_Disable_rgrp_alignment_when_dev_topology_is_unsuitable.patch b/SOURCES/bz1436772-gfs2_grow_Disable_rgrp_alignment_when_dev_topology_is_unsuitable.patch new file mode 100644 index 0000000..7c0e9f7 --- /dev/null +++ b/SOURCES/bz1436772-gfs2_grow_Disable_rgrp_alignment_when_dev_topology_is_unsuitable.patch @@ -0,0 +1,32 @@ +commit ae565c82568a8b8068c225d8534c68c9989ccbe3 +Author: Andrew Price +Date: Tue Mar 28 21:32:42 2017 +0100 + + gfs2_grow: Disable rgrp alignment when dev topology is unsuitable + + If optimal_io_size is not a multiple of minimum_io_size then the values + are not reliable swidth and sunit values, so disable rgrp stripe + alignment in that case. + + Resolves: rhbz#1436772 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c +index 173466c..66ba057 100644 +--- a/gfs2/mkfs/main_grow.c ++++ b/gfs2/mkfs/main_grow.c +@@ -169,8 +169,12 @@ static lgfs2_rgrps_t rgrps_init(struct gfs2_sbd *sdp) + unsigned long min_io_sz = blkid_topology_get_minimum_io_size(tp); + unsigned long opt_io_sz = blkid_topology_get_optimal_io_size(tp); + unsigned long phy_sector_sz = blkid_topology_get_physical_sector_size(tp); ++ /* If optimal_io_size is not a multiple of minimum_io_size then ++ the values are not reliable swidth and sunit values, so don't ++ attempt rgrp alignment */ + if ((min_io_sz > phy_sector_sz) && +- (opt_io_sz > phy_sector_sz)) { ++ (opt_io_sz > phy_sector_sz) && ++ (opt_io_sz % min_io_sz == 0)) { + al_base = opt_io_sz / sdp->bsize; + al_off = min_io_sz / sdp->bsize; + } diff --git a/SOURCES/bz1440269-1-mkfs_gfs2_Free_unnecessary_cached_pages_disable_readahead.patch b/SOURCES/bz1440269-1-mkfs_gfs2_Free_unnecessary_cached_pages_disable_readahead.patch new file mode 100644 index 0000000..6958f30 --- /dev/null +++ b/SOURCES/bz1440269-1-mkfs_gfs2_Free_unnecessary_cached_pages_disable_readahead.patch @@ -0,0 +1,51 @@ +commit 10deb2492c8b0dd4dceb963850c91e053bb8d6df +Author: Andrew Price +Date: Thu Apr 13 06:51:15 2017 -0400 + + mkfs.gfs2: Free unnecessary cached pages, disable readahead + + With a 300T file system, cached pages built up quite heavily and could + be left over from previous io on the device. Use POSIX_FADV_DONTNEED + where appropriate. + + Also, readahead isn't required as mkfs.gfs2 mainly writing full block + ranges at unpredictable locations so use POSIX_FADV_RANDOM to minimise + the overhead from that. + + Resolves: rhbz#1440269 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c +index 0801a4b..83065fb 100644 +--- a/gfs2/mkfs/main_mkfs.c ++++ b/gfs2/mkfs/main_mkfs.c +@@ -817,6 +817,7 @@ static int place_rgrps(struct gfs2_sbd *sdp, lgfs2_rgrps_t rgs, struct mkfs_opts + gfs2_progress_update(&progress, (sdp->rgrps)); + } + gfs2_progress_close(&progress, _("Done\n")); ++ posix_fadvise(sdp->device_fd, 0, sdp->fssize * sdp->bsize, POSIX_FADV_DONTNEED); + + return 0; + } +@@ -909,6 +910,11 @@ static void open_dev(struct mkfs_dev *dev, int withprobe) + exit(1); + } + ++ /* Freshen up the cache */ ++ posix_fadvise(dev->fd, 0, 0, POSIX_FADV_DONTNEED); ++ /* Turn off readahead, we're just writing new blocks */ ++ posix_fadvise(dev->fd, 0, 0, POSIX_FADV_RANDOM); ++ + error = fstat(dev->fd, &dev->stat); + if (error < 0) { + perror(dev->path); +@@ -1075,7 +1081,7 @@ int main(int argc, char *argv[]) + perror(opts.dev.path); + exit(EXIT_FAILURE); + } +- ++ posix_fadvise(opts.dev.fd, 0, 0, POSIX_FADV_DONTNEED); + error = close(opts.dev.fd); + if (error){ + perror(opts.dev.path); diff --git a/SOURCES/bz1440269-2-mkfs_gfs2_Fix_resource_group_alignment_issue.patch b/SOURCES/bz1440269-2-mkfs_gfs2_Fix_resource_group_alignment_issue.patch new file mode 100644 index 0000000..3dbbb61 --- /dev/null +++ b/SOURCES/bz1440269-2-mkfs_gfs2_Fix_resource_group_alignment_issue.patch @@ -0,0 +1,58 @@ +commit 896a2f709141728355c2a1e8cdf377c51573de05 +Author: Andrew Price +Date: Thu Apr 13 07:42:18 2017 -0400 + + mkfs.gfs2: Fix resource group alignment issue + + Make sure the resource groups created when allocating the journals have + an aligned length to avoid subsequent resource groups start addresses + getting misaligned. This can cause read-modify-write issues during mkfs + and likely in other situations, harming performance. + + Test case included. + + Resolves: rhbz#1440269 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c +index 83065fb..2e08bc6 100644 +--- a/gfs2/mkfs/main_mkfs.c ++++ b/gfs2/mkfs/main_mkfs.c +@@ -721,6 +721,7 @@ static int place_journals(struct gfs2_sbd *sdp, lgfs2_rgrps_t rgs, struct mkfs_o + if (mkfs_journals == NULL) + return 1; + *rgaddr = lgfs2_rgrp_align_addr(rgs, sdp->sb_addr + 1); ++ rgsize = lgfs2_rgrp_align_len(rgs, rgsize); + + for (j = 0; j < opts->journals; j++) { + int result; +diff --git a/tests/mkfs.at b/tests/mkfs.at +index c026a76..274a81d 100644 +--- a/tests/mkfs.at ++++ b/tests/mkfs.at +@@ -102,6 +102,13 @@ AT_CHECK([$GFS_MKFS -p lock_dlm -t "financial_cluster:this_time_we_test_fs_namin + GFS_FSCK_CHECK([$GFS_MKFS -p lock_dlm -t "a_really_long_named_cluster_here:concurrently_lets_check_fs_len" $GFS_TGT]) + AT_CLEANUP + ++# -o test_topology order: ++# alignment_offset, ++# logical_sector_size, ++# minimum_io_size, ++# optimal_io_size, ++# physical_sector_size ++ + AT_SETUP([Device i/o limits handling]) + AT_KEYWORDS(mkfs.gfs2 mkfs) + AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=0:0:0:0:0 $GFS_TGT], 0, [ignore], [ignore]) +@@ -109,3 +116,10 @@ AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=7168:512:0:33553920:512 $GFS + AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=7168:512:8192:33553920:512 $GFS_TGT], 0, [ignore], [Warning: device is not properly aligned. This may harm performance. + ]) + AT_CLEANUP ++ ++AT_SETUP([Resource group alignment]) ++AT_KEYWORDS(mkfs.gfs2 mkfs) ++AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=0:512:65536:393216:512 $GFS_TGT], 0, [ignore], [ignore]) ++# Check rgrp alignment to minimum_io_size: 65536 / 4096 == 16 ++AT_CHECK([gfs2_edit -p rindex $GFS_TGT | grep ri_addr | awk '{print $2, $2 % 16; if ($2 % 16 != 0) { exit 1 }}'], 0, [ignore], [ignore]) ++AT_CLEANUP diff --git a/SOURCES/bz1440269-3-libgfs2_Issue_one_write_per_rgrp_when_creating_them.patch b/SOURCES/bz1440269-3-libgfs2_Issue_one_write_per_rgrp_when_creating_them.patch new file mode 100644 index 0000000..393b84b --- /dev/null +++ b/SOURCES/bz1440269-3-libgfs2_Issue_one_write_per_rgrp_when_creating_them.patch @@ -0,0 +1,127 @@ +commit 83450dcb4c4179968343e922e75b73961c7ccefe +Author: Andrew Price +Date: Thu Apr 13 12:19:01 2017 -0400 + + libgfs2: Issue one write per rgrp when creating them + + Previously mkfs.gfs2 issued a write for each block of an rgrp. On + systems where the page size is much larger than the block size, this + incurs a read-modify-write overhead and can slow down mkfs.gfs2 + considerably. Instead, allocate a single, aligned buffer for the bitmap + blocks and write them all in one go. + + On a system with 64K pages and a 300TB block device, this speeds up + mkfs.gfs2 from over an hour to less than 3 minutes. + + Resolves: rhbz#1440269 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c +index 7066a5c..bb0776a 100644 +--- a/gfs2/libgfs2/rgrp.c ++++ b/gfs2/libgfs2/rgrp.c +@@ -11,6 +11,7 @@ + #include "rgrp.h" + + #define RG_SYNC_TOLERANCE 1000 ++#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) + + static void compute_bitmaps(lgfs2_rgrp_t rg, const unsigned bsize) + { +@@ -109,23 +110,30 @@ struct rgrp_tree *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, uint64_t blk) + int lgfs2_rgrp_bitbuf_alloc(lgfs2_rgrp_t rg) + { + struct gfs2_sbd *sdp = rg->rgrps->sdp; ++ struct gfs2_buffer_head *bhs; ++ size_t len = rg->ri.ri_length * sdp->bsize; ++ unsigned long io_align = sdp->bsize; + unsigned i; + char *bufs; + +- bufs = calloc(rg->ri.ri_length, sizeof(struct gfs2_buffer_head) + sdp->bsize); +- if (bufs == NULL) ++ if (rg->rgrps->align > 0) { ++ len = ROUND_UP(len, rg->rgrps->align * sdp->bsize); ++ io_align = rg->rgrps->align_off * sdp->bsize; ++ } ++ bhs = calloc(rg->ri.ri_length, sizeof(struct gfs2_buffer_head)); ++ if (bhs == NULL) + return 1; + +- rg->bits[0].bi_bh = (struct gfs2_buffer_head *)bufs; +- rg->bits[0].bi_bh->iov.iov_base = (char *)(rg->bits[0].bi_bh + 1); +- rg->bits[0].bi_bh->iov.iov_len = sdp->bsize; +- rg->bits[0].bi_bh->b_blocknr = rg->ri.ri_addr; +- rg->bits[0].bi_bh->sdp = sdp; ++ if (posix_memalign((void **)&bufs, io_align, len) != 0) { ++ errno = ENOMEM; ++ free(bhs); ++ return 1; ++ } ++ memset(bufs, 0, len); + +- for (i = 1; i < rg->ri.ri_length; i++) { +- char *nextbuf = rg->bits[i - 1].bi_bh->b_data + sdp->bsize; +- rg->bits[i].bi_bh = (struct gfs2_buffer_head *)(nextbuf); +- rg->bits[i].bi_bh->iov.iov_base = (char *)(rg->bits[i].bi_bh + 1); ++ for (i = 0; i < rg->ri.ri_length; i++) { ++ rg->bits[i].bi_bh = bhs + i; ++ rg->bits[i].bi_bh->iov.iov_base = bufs + (i * sdp->bsize); + rg->bits[i].bi_bh->iov.iov_len = sdp->bsize; + rg->bits[i].bi_bh->b_blocknr = rg->ri.ri_addr + i; + rg->bits[i].bi_bh->sdp = sdp; +@@ -143,6 +151,7 @@ int lgfs2_rgrp_bitbuf_alloc(lgfs2_rgrp_t rg) + void lgfs2_rgrp_bitbuf_free(lgfs2_rgrp_t rg) + { + unsigned i; ++ free(rg->bits[0].bi_bh->iov.iov_base); + free(rg->bits[0].bi_bh); + for (i = 0; i < rg->ri.ri_length; i++) + rg->bits[i].bi_bh = NULL; +@@ -618,7 +627,7 @@ lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry) + */ + int lgfs2_rgrp_write(int fd, const lgfs2_rgrp_t rg) + { +- int ret = 0; ++ struct gfs2_sbd *sdp = rg->rgrps->sdp; + unsigned int i; + const struct gfs2_meta_header bmh = { + .mh_magic = GFS2_MAGIC, +@@ -626,25 +635,29 @@ int lgfs2_rgrp_write(int fd, const lgfs2_rgrp_t rg) + .mh_format = GFS2_FORMAT_RB, + }; + int freebufs = 0; ++ ssize_t ret; ++ size_t len; + + if (rg->bits[0].bi_bh == NULL) { + freebufs = 1; + if (lgfs2_rgrp_bitbuf_alloc(rg) != 0) + return -1; + } +- + gfs2_rgrp_out(&rg->rg, rg->bits[0].bi_bh->b_data); +- ret = bwrite(rg->bits[0].bi_bh); +- +- for (i = 1; ret == 0 && i < rg->ri.ri_length; i++) { ++ for (i = 1; i < rg->ri.ri_length; i++) + gfs2_meta_header_out(&bmh, rg->bits[i].bi_bh->b_data); +- ret = bwrite(rg->bits[i].bi_bh); +- } ++ ++ len = sdp->bsize * rg->ri.ri_length; ++ if (rg->rgrps->align > 0) ++ len = ROUND_UP(len, rg->rgrps->align * sdp->bsize); ++ ++ ret = pwrite(sdp->device_fd, rg->bits[0].bi_bh->b_data, len, ++ rg->bits[0].bi_bh->b_blocknr * sdp->bsize); + + if (freebufs) + lgfs2_rgrp_bitbuf_free(rg); + +- return ret; ++ return ret == len ? 0 : -1; + } + + lgfs2_rgrp_t lgfs2_rgrp_first(lgfs2_rgrps_t rgs) diff --git a/SOURCES/bz1482542-gfs2_edit_savemeta_Fix_up_saving_of_dinodes_symlinks.patch b/SOURCES/bz1482542-gfs2_edit_savemeta_Fix_up_saving_of_dinodes_symlinks.patch new file mode 100644 index 0000000..7c5596e --- /dev/null +++ b/SOURCES/bz1482542-gfs2_edit_savemeta_Fix_up_saving_of_dinodes_symlinks.patch @@ -0,0 +1,91 @@ +commit 52fce21ef94182fbe99b4e4344bdab42c6c95868 +Author: Andrew Price +Date: Thu Aug 17 17:45:31 2017 +0100 + + gfs2_edit savemeta: Fix up saving of dinodes/symlinks + + Factor out the code that decides whether to save the dinode contents, + improve its error reporting (and don't exit) and make sure contents of + symlink dinodes are saved. + + Resolves: rhbz#1482542 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c +index dee405bc..04f67fc7 100644 +--- a/gfs2/edit/savemeta.c ++++ b/gfs2/edit/savemeta.c +@@ -190,6 +190,38 @@ static const char *anthropomorphize(unsigned long long inhuman_value) + return out_val; + } + ++static int di_save_len(struct gfs2_buffer_head *bh, uint64_t owner) ++{ ++ struct gfs2_inode *inode; ++ struct gfs2_dinode *dn; ++ int len; ++ ++ if (sbd.gfs1) ++ inode = lgfs2_gfs_inode_get(&sbd, bh); ++ else ++ inode = lgfs2_inode_get(&sbd, bh); ++ ++ if (inode == NULL) { ++ fprintf(stderr, "Error reading inode at %"PRIu64": %s\n", ++ bh->b_blocknr, strerror(errno)); ++ return 0; /* Skip the block */ ++ } ++ dn = &inode->i_di; ++ len = sizeof(struct gfs2_dinode); ++ ++ /* Do not save (user) data from the inode block unless they are ++ indirect pointers, dirents, symlinks or fs internal data */ ++ if (dn->di_height != 0 || ++ S_ISDIR(dn->di_mode) || ++ S_ISLNK(dn->di_mode) || ++ (sbd.gfs1 && dn->__pad1 == GFS_FILE_DIR) || ++ block_is_systemfile(owner)) ++ len = sbd.bsize; ++ ++ inode_put(&inode); ++ return len; ++} ++ + /* + * get_gfs_struct_info - get block type and structure length + * +@@ -205,7 +237,6 @@ static int get_gfs_struct_info(struct gfs2_buffer_head *lbh, uint64_t owner, + int *block_type, int *gstruct_len) + { + struct gfs2_meta_header mh; +- struct gfs2_inode *inode; + + if (block_type != NULL) + *block_type = 0; +@@ -229,24 +260,7 @@ static int get_gfs_struct_info(struct gfs2_buffer_head *lbh, uint64_t owner, + *gstruct_len = sbd.bsize; + break; + case GFS2_METATYPE_DI: /* 4 (disk inode) */ +- if (sbd.gfs1) { +- inode = lgfs2_gfs_inode_get(&sbd, lbh); +- } else { +- inode = lgfs2_inode_get(&sbd, lbh); +- } +- if (inode == NULL) { +- perror("Error reading inode"); +- exit(-1); +- } +- if (S_ISDIR(inode->i_di.di_mode) || +- (sbd.gfs1 && inode->i_di.__pad1 == GFS_FILE_DIR)) +- *gstruct_len = sbd.bsize; +- else if (!inode->i_di.di_height && !block_is_systemfile(owner) && +- !S_ISDIR(inode->i_di.di_mode)) +- *gstruct_len = sizeof(struct gfs2_dinode); +- else +- *gstruct_len = sbd.bsize; +- inode_put(&inode); ++ *gstruct_len = di_save_len(lbh, owner); + break; + case GFS2_METATYPE_IN: /* 5 (indir inode blklst) */ + *gstruct_len = sbd.bsize; /*sizeof(struct gfs_indirect);*/ diff --git a/SOURCES/bz1498068-mkfs_gfs2_Scale_down_journal_size_for_smaller_devices.patch b/SOURCES/bz1498068-mkfs_gfs2_Scale_down_journal_size_for_smaller_devices.patch new file mode 100644 index 0000000..e123ed9 --- /dev/null +++ b/SOURCES/bz1498068-mkfs_gfs2_Scale_down_journal_size_for_smaller_devices.patch @@ -0,0 +1,187 @@ +commit cc079a4d907eedd24c69ab2a88e9e0fcdef58a5d +Author: Andrew Price +Date: Mon Feb 12 19:27:48 2018 +0000 + + mkfs.gfs2: Scale down journal size for smaller devices + + Currently the default behaviour when the journal size is not specified + is to use a default size of 128M, which means that mkfs.gfs2 can run out + of space while writing to a small device. The hard default also means + that some xfstests fail with gfs2 as they try to create small file + systems. + + This patch addresses these problems by setting sensible default journal + sizes depending on the size of the file system. Journal sizes specified + by the user are limited to half of the fs. As the minimum journal size + is 8MB that means we effectively get a hard minimum file system size of + 16MB (per journal). + + Resolves: rhbz#1498068 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h +index ebf6bca7..570c89b9 100644 +--- a/gfs2/libgfs2/libgfs2.h ++++ b/gfs2/libgfs2/libgfs2.h +@@ -319,6 +319,8 @@ struct metapath { + + #define GFS2_DEFAULT_BSIZE (4096) + #define GFS2_DEFAULT_JSIZE (128) ++#define GFS2_MAX_JSIZE (1024) ++#define GFS2_MIN_JSIZE (8) + #define GFS2_DEFAULT_RGSIZE (256) + #define GFS2_DEFAULT_UTSIZE (1) + #define GFS2_DEFAULT_QCSIZE (1) +diff --git a/gfs2/man/mkfs.gfs2.8 b/gfs2/man/mkfs.gfs2.8 +index 342a636d..35e355a5 100644 +--- a/gfs2/man/mkfs.gfs2.8 ++++ b/gfs2/man/mkfs.gfs2.8 +@@ -32,8 +32,9 @@ Enable debugging output. + Print out a help message describing the available options, then exit. + .TP + \fB-J\fP \fImegabytes\fR +-The size of each journal. The default journal size is 128 megabytes and the +-minimum size is 8 megabytes. ++The size of each journal. The minimum size is 8 megabytes and the maximum is ++1024. If this is not specified, a value based on a sensible proportion of the ++file system will be chosen. + .TP + \fB-j\fP \fIjournals\fR + The number of journals for mkfs.gfs2 to create. At least one journal is +diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c +index 2e08bc62..24e5a850 100644 +--- a/gfs2/mkfs/main_mkfs.c ++++ b/gfs2/mkfs/main_mkfs.c +@@ -552,7 +552,7 @@ static void opts_check(struct mkfs_opts *opts) + if (!opts->journals) + die( _("no journals specified\n")); + +- if (opts->jsize < 8 || opts->jsize > 1024) ++ if (opts->jsize < GFS2_MIN_JSIZE || opts->jsize > GFS2_MAX_JSIZE) + die( _("bad journal size\n")); + + if (!opts->qcsize || opts->qcsize > 64) +@@ -575,6 +575,7 @@ static void print_results(struct gfs2_sb *sb, struct mkfs_opts *opts, uint64_t r + printf("%-27s%.2f %s (%"PRIu64" %s)\n", _("Filesystem size:"), + (fssize / ((float)(1 << 30)) * sb->sb_bsize), _("GB"), fssize, _("blocks")); + printf("%-27s%u\n", _("Journals:"), opts->journals); ++ printf("%-27s%uMB\n", _("Journal size:"), opts->jsize); + printf("%-27s%"PRIu64"\n", _("Resource groups:"), rgrps); + printf("%-27s\"%s\"\n", _("Locking protocol:"), opts->lockproto); + printf("%-27s\"%s\"\n", _("Lock table:"), opts->locktable); +@@ -823,6 +824,36 @@ static int place_rgrps(struct gfs2_sbd *sdp, lgfs2_rgrps_t rgs, struct mkfs_opts + return 0; + } + ++/* ++ * Find a reasonable journal file size (in blocks) given the number of blocks ++ * in the filesystem. For very small filesystems, it is not reasonable to ++ * have a journal that fills more than half of the filesystem. ++ * ++ * n.b. comments assume 4k blocks ++ * ++ * This was copied and adapted from e2fsprogs. ++ */ ++static int default_journal_size(unsigned bsize, uint64_t num_blocks) ++{ ++ int min_blocks = (GFS2_MIN_JSIZE << 20) / bsize; ++ ++ if (num_blocks < 2 * min_blocks) ++ return -1; ++ if (num_blocks < 131072) /* 512 MB */ ++ return min_blocks; /* 8 MB */ ++ if (num_blocks < 512*1024) /* 2 GB */ ++ return (4096); /* 16 MB */ ++ if (num_blocks < 2048*1024) /* 8 GB */ ++ return (8192); /* 32 MB */ ++ if (num_blocks < 4096*1024) /* 16 GB */ ++ return (16384); /* 64 MB */ ++ if (num_blocks < 262144*1024) /* 1 TB */ ++ return (32768); /* 128 MB */ ++ if (num_blocks < 2621440*1024) /* 10 TB */ ++ return (131072); /* 512 MB */ ++ return 262144; /* 1 GB */ ++} ++ + static void sbd_init(struct gfs2_sbd *sdp, struct mkfs_opts *opts, unsigned bsize) + { + memset(sdp, 0, sizeof(struct gfs2_sbd)); +@@ -847,9 +878,28 @@ static void sbd_init(struct gfs2_sbd *sdp, struct mkfs_opts *opts, unsigned bsiz + opts->dev.size / ((float)(1 << 30)), _("GB"), + opts->dev.size / sdp->bsize, _("blocks")); + } +- /* TODO: Check if the fssize is too small, somehow */ + sdp->device.length = opts->fssize; + } ++ /* opts->jsize has already been max/min checked but we need to check it ++ makes sense for the device size, or set a sensible default, if one ++ will fit. For user-provided journal sizes, limit it to half of the fs. */ ++ if (!opts->got_jsize) { ++ int default_jsize = default_journal_size(sdp->bsize, sdp->device.length / opts->journals); ++ if (default_jsize < 0) { ++ fprintf(stderr, _("gfs2 will not fit on this device.\n")); ++ exit(1); ++ } ++ opts->jsize = (default_jsize * sdp->bsize) >> 20; ++ } else if ((((opts->jsize * opts->journals) << 20) / sdp->bsize) > (sdp->device.length / 2)) { ++ unsigned max_jsize = (sdp->device.length / 2 * sdp->bsize / opts->journals) >> 20; ++ ++ fprintf(stderr, _("gfs2 will not fit on this device.\n")); ++ if (max_jsize >= GFS2_MIN_JSIZE) ++ fprintf(stderr, _("Maximum size for %u journals on this device is %uMB.\n"), ++ opts->journals, max_jsize); ++ exit(1); ++ } ++ sdp->jsize = opts->jsize; + } + + static int probe_contents(struct mkfs_dev *dev) +diff --git a/tests/edit.at b/tests/edit.at +index 3bd41636..e1a0fca7 100644 +--- a/tests/edit.at ++++ b/tests/edit.at +@@ -6,7 +6,7 @@ AT_KEYWORDS(gfs2_edit edit) + GFS_TGT_REGEN + AT_CHECK([$GFS_MKFS -p lock_nolock $GFS_TGT $(($(gfs_max_blocks 4096)/2))], 0, [ignore], [ignore]) + AT_CHECK([gfs2_edit savemeta $GFS_TGT test.meta > savemeta.log], 0, [ignore], [ignore]) +-AT_CHECK([head -2 savemeta.log], 0, [There are 1310718 blocks of 4096 bytes in the filesystem. ++AT_CHECK([head -2 savemeta.log], 0, [There are 1310716 blocks of 4096 bytes in the filesystem. + Filesystem size: 4.1023GB + ], [ignore]) + GFS_TGT_REGEN +diff --git a/tests/mkfs.at b/tests/mkfs.at +index 274a81db..68195e93 100644 +--- a/tests/mkfs.at ++++ b/tests/mkfs.at +@@ -123,3 +123,13 @@ AT_CHECK([$GFS_MKFS -p lock_nolock -o test_topology=0:512:65536:393216:512 $GFS_ + # Check rgrp alignment to minimum_io_size: 65536 / 4096 == 16 + AT_CHECK([gfs2_edit -p rindex $GFS_TGT | grep ri_addr | awk '{print $2, $2 % 16; if ($2 % 16 != 0) { exit 1 }}'], 0, [ignore], [ignore]) + AT_CLEANUP ++ ++AT_SETUP([Small filesystems]) ++AT_KEYWORDS(mkfs.gfs2 mkfs) ++GFS_TGT_SIZE(32M) ++AT_CHECK([$GFS_MKFS -p lock_nolock $GFS_TGT], 0, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -n $GFS_TGT], 0, [ignore], [ignore]) ++GFS_TGT_SIZE(64M) ++AT_CHECK([$GFS_MKFS -p lock_nolock -j2 $GFS_TGT], 0, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -n $GFS_TGT], 0, [ignore], [ignore]) ++AT_CLEANUP +diff --git a/tests/testsuite.at b/tests/testsuite.at +index cc1bd54d..522ac1c2 100644 +--- a/tests/testsuite.at ++++ b/tests/testsuite.at +@@ -4,6 +4,12 @@ m4_define([GFS_TGT_REGEN], + [AT_CHECK([rm -f $GFS_TGT && truncate -s ${GFS_TGT_SZ}G ${GFS_TGT}], [ignore], [ignore], [ignore]) + AT_SKIP_IF([test ! -f ${GFS_TGT}])]) + ++# Regenerate the sparse file used for testing, with a given size, and skip the test if it fails ++# Usage: GFS_TGT_REGEN() ++m4_define([GFS_TGT_SIZE], ++[AT_CHECK([rm -f $GFS_TGT && truncate -s $1 ${GFS_TGT}], [ignore], [ignore], [ignore]) ++AT_SKIP_IF([test ! -f ${GFS_TGT}])]) ++ + # Regenerate, check, fsck is used a lot so combine it into one macro + # Usage: GFS_FSCK_CHECK ([mkfs.gfs2 ... $GFS_TGT]) + m4_define([GFS_FSCK_CHECK], diff --git a/SOURCES/bz1507091-fsck_gfs2_Make_p_n_and_y_conflicting_options.patch b/SOURCES/bz1507091-fsck_gfs2_Make_p_n_and_y_conflicting_options.patch new file mode 100644 index 0000000..90048c6 --- /dev/null +++ b/SOURCES/bz1507091-fsck_gfs2_Make_p_n_and_y_conflicting_options.patch @@ -0,0 +1,148 @@ +commit 1061c4767b1d511a9461cd3bcf2e40239cf77d8a +Author: Andrew Price +Date: Tue Oct 31 11:19:38 2017 +0000 + + fsck.gfs2: Make -p, -n and -y conflicting options + + Exit with FSCK_USAGE when these options are used in combination. Also + update the man page to make this behaviour explicit with other tweaks + for conciseness. Tests included. + + Resolves: rhbz#1507091 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/fsck/main.c b/gfs2/fsck/main.c +index cd260ef3..ecdcd0f6 100644 +--- a/gfs2/fsck/main.c ++++ b/gfs2/fsck/main.c +@@ -75,6 +75,11 @@ static int read_cmdline(int argc, char **argv, struct gfs2_options *gopts) + switch(c) { + + case 'a': ++ case 'p': ++ if (gopts->yes || gopts->no) { ++ fprintf(stderr, _("Options -p/-a, -y and -n may not be used together\n")); ++ return FSCK_USAGE; ++ } + preen = 1; + gopts->yes = 1; + break; +@@ -86,12 +91,12 @@ static int read_cmdline(int argc, char **argv, struct gfs2_options *gopts) + exit(FSCK_OK); + break; + case 'n': ++ if (gopts->yes || preen) { ++ fprintf(stderr, _("Options -p/-a, -y and -n may not be used together\n")); ++ return FSCK_USAGE; ++ } + gopts->no = 1; + break; +- case 'p': +- preen = 1; +- gopts->yes = 1; +- break; + case 'q': + decrease_verbosity(); + break; +@@ -103,6 +108,10 @@ static int read_cmdline(int argc, char **argv, struct gfs2_options *gopts) + exit(FSCK_OK); + break; + case 'y': ++ if (gopts->no || preen) { ++ fprintf(stderr, _("Options -p/-a, -y and -n may not be used together\n")); ++ return FSCK_USAGE; ++ } + gopts->yes = 1; + break; + case ':': +diff --git a/gfs2/man/fsck.gfs2.8 b/gfs2/man/fsck.gfs2.8 +index 56dcddcd..b2b326fb 100644 +--- a/gfs2/man/fsck.gfs2.8 ++++ b/gfs2/man/fsck.gfs2.8 +@@ -40,7 +40,7 @@ administration. + .SH OPTIONS + .TP + \fB-a\fP +-Same as the -p (preen) option. ++Same as the \fB-p\fP (preen) option. + .TP + \fB-f\fP + Force checking even if the file system seems clean. +@@ -54,29 +54,26 @@ This prints out the proper command line usage syntax. + Quiet. + .TP + \fB-n\fP +-No to all questions. +- +-By specifying this option, fsck.gfs2 will only show the changes that ++No to all questions. By specifying this option, fsck.gfs2 will only show the changes that + would be made, but not make any changes to the filesystem. ++ ++This option may not be used with the \fB-y\fP or \fB-p\fP/\fB-a\fP options. + .TP + \fB-p\fP +-Preen (same as -a: automatically repair the file system if it is dirty, +-and safe to do so, otherwise exit.) ++Automatically repair ("preen") the file system if it is dirty and safe to do so, ++otherwise exit. ++ ++If the file system has locking protocol \fIlock_nolock\fR, it is considered a ++non-shared storage device and it is considered safe. If the locking protocol ++is lock_dlm and \fB-a\fP or \fB-p\fP was specified, the check is considered unsafe as it ++cannot be determined whether the device is mounted by other nodes in the cluster. ++In this case a warning is given if any damage or dirty journals are found. The ++file system should then be unmounted from all nodes in the cluster and ++fsck.gfs2 should be run manually without the \fB-a\fP or \fB-p\fP options. + +-Note: If the file system has locking protocol lock_nolock, the file system +-is considered a non-shared storage device and the fsck is deemed safe. +-However, fsck.gfs2 does not know whether it was called automatically +-from the init process, due to options in the /etc/fstab file. Therefore, if +-the locking protocol is lock_dlm and -a or -p was specified, fsck.gfs2 +-cannot determine whether the disk is mounted by other nodes in the cluster. +-Therefore, the fsck is deemed to be unsafe and a warning is given +-if any damage or dirty journals are found. In that case, the file system +-should be unmounted from all nodes in the cluster and fsck.gfs2 should be +-run manually without the -a or -p options. ++This option may not be used with the \fB-n\fP or \fB-y\fP options. + .TP + \fB-V\fP +-Version. +- + Print out the program version information. + .TP + \fB-v\fP +@@ -85,7 +82,7 @@ Verbose operation. + Print more information while running. + .TP + \fB-y\fP +-Yes to all questions. +- +-By specifying this option, fsck.gfs2 will not prompt before making ++Yes to all questions. By specifying this option, fsck.gfs2 will not prompt before making + changes. ++ ++This option may not be used with the \fB-n\fP or \fB-p\fP/\fB-a\fP options. +diff --git a/tests/fsck.at b/tests/fsck.at +index b9953fb4..0dfeac33 100644 +--- a/tests/fsck.at ++++ b/tests/fsck.at +@@ -1,6 +1,17 @@ + AT_TESTED([fsck.gfs2]) + AT_BANNER([fsck.gfs2 tests]) + ++AT_SETUP([Conflicting options]) ++AT_KEYWORDS(fsck.gfs2 fsck) ++# Error code 16 is FSCK_USAGE ++AT_CHECK([fsck.gfs2 -y -n $GFS_TGT], 16, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -n -y $GFS_TGT], 16, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -n -p $GFS_TGT], 16, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -p -n $GFS_TGT], 16, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -y -p $GFS_TGT], 16, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -p -y $GFS_TGT], 16, [ignore], [ignore]) ++AT_CLEANUP ++ + AT_SETUP([Fix invalid block sizes]) + AT_KEYWORDS(fsck.gfs2 fsck) + GFS_LANG_CHECK([mkfs.gfs2 -O -p lock_nolock $GFS_TGT], [set sb { sb_bsize: 0 }]) diff --git a/SOURCES/bz1518938-gfs2_edit_Print_offsets_of_indirect_pointers.patch b/SOURCES/bz1518938-gfs2_edit_Print_offsets_of_indirect_pointers.patch new file mode 100644 index 0000000..bc8e6f6 --- /dev/null +++ b/SOURCES/bz1518938-gfs2_edit_Print_offsets_of_indirect_pointers.patch @@ -0,0 +1,81 @@ +commit 1a093d1233a4d5ef83d6141928f5de693f1333ee +Author: Andrew Price +Date: Thu Nov 30 19:00:31 2017 +0000 + + gfs2_edit: Print offsets of indirect pointers + + When printing indirect pointers gfs2_edit doesn't keep track of the + location of the pointer within the indirect block and only prints an + index for each non-zero pointer. Instead, store the offset of each + non-zero pointer and print it when displaying indirect blocks, as it is + done in interactive mode. + + Resolves: rhbz#1518938 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/edit/extended.c b/gfs2/edit/extended.c +index e8048532..214fdba4 100644 +--- a/gfs2/edit/extended.c ++++ b/gfs2/edit/extended.c +@@ -51,6 +51,7 @@ static int get_height(void) + static int _do_indirect_extended(char *diebuf, struct iinfo *iinf, int hgt) + { + unsigned int x, y; ++ off_t headoff; + uint64_t p; + int i_blocks; + +@@ -62,15 +63,14 @@ static int _do_indirect_extended(char *diebuf, struct iinfo *iinf, int hgt) + iinf->ii[x].dirents = 0; + memset(&iinf->ii[x].dirent, 0, sizeof(struct gfs2_dirents)); + } +- for (x = (sbd.gfs1 ? sizeof(struct gfs_indirect): +- sizeof(struct gfs2_meta_header)), y = 0; +- x < sbd.bsize; +- x += sizeof(uint64_t), y++) { ++ headoff = sbd.gfs1 ? sizeof(struct gfs_indirect) : sizeof(struct gfs2_meta_header); ++ for (x = headoff, y = 0; x < sbd.bsize; x += sizeof(uint64_t), y++) { + p = be64_to_cpu(*(uint64_t *)(diebuf + x)); + if (p) { + iinf->ii[i_blocks].block = p; + iinf->ii[i_blocks].mp.mp_list[hgt] = i_blocks; + iinf->ii[i_blocks].is_dir = FALSE; ++ iinf->ii[i_blocks].ptroff = (x - headoff) / sizeof(uint64_t); + i_blocks++; + } + } +@@ -177,7 +177,7 @@ static int display_indirect(struct iinfo *ind, int indblocks, int level, + for (h = 0; h < level; h++) + print_gfs2(" "); + } +- print_gfs2("%d => ", pndx); ++ print_gfs2("%d: 0x%"PRIx64" => ", pndx, ind->ii[pndx].ptroff); + if (termlines) + move(line,9); + print_gfs2("0x%"PRIx64" / %"PRId64, ind->ii[pndx].block, +diff --git a/gfs2/edit/gfs2hex.c b/gfs2/edit/gfs2hex.c +index 3d0f10dd..8abadd21 100644 +--- a/gfs2/edit/gfs2hex.c ++++ b/gfs2/edit/gfs2hex.c +@@ -255,6 +255,8 @@ void do_dinode_extended(struct gfs2_dinode *dine, struct gfs2_buffer_head *lbh) + indirect->ii[indirect_blocks].mp.mp_list[0] = + ptroff; + indirect->ii[indirect_blocks].is_dir = FALSE; ++ indirect->ii[indirect_blocks].ptroff = ++ (x - sizeof(*dine)) / sizeof(uint64_t); + indirect_blocks++; + } + ptroff++; +diff --git a/gfs2/edit/hexedit.h b/gfs2/edit/hexedit.h +index 4f7207b0..d2992d8e 100644 +--- a/gfs2/edit/hexedit.h ++++ b/gfs2/edit/hexedit.h +@@ -81,6 +81,7 @@ struct indirect_info { + struct gfs2_leaf lf; + struct metapath mp; + struct gfs2_dirents dirent[64]; ++ uint64_t ptroff; + }; + + struct iinfo { diff --git a/SOURCES/bz1544944-glocktop_Remove_a_non_existent_flag_from_the_usage_string.patch b/SOURCES/bz1544944-glocktop_Remove_a_non_existent_flag_from_the_usage_string.patch new file mode 100644 index 0000000..afaa35a --- /dev/null +++ b/SOURCES/bz1544944-glocktop_Remove_a_non_existent_flag_from_the_usage_string.patch @@ -0,0 +1,24 @@ +commit 26b4d21c9ced2b8a8d03e2b0e4413373bd0de69b +Author: Andrew Price +Date: Thu Feb 15 11:06:18 2018 +0000 + + glocktop: Remove a non-existent flag from the usage string + + There is no -f option. + + Signed-off-by: Andrew Price + +diff --git a/gfs2/glocktop/glocktop.c b/gfs2/glocktop/glocktop.c +index bcee3d8b..cef368a0 100644 +--- a/gfs2/glocktop/glocktop.c ++++ b/gfs2/glocktop/glocktop.c +@@ -1630,8 +1630,7 @@ static void parse_glocks_file(int fd, const char *fsname, int dlmwaiters, + static void usage(void) + { + printf("Usage:\n"); +- printf("glocktop [-i] [-d ] [-f] [-n ] [-sX] " +- "[-c] [-D] [-H] [-r] [-t]\n"); ++ printf("glocktop [-i] [-d ] [-n ] [-sX] [-c] [-D] [-H] [-r] [-t]\n"); + printf("\n"); + printf("-i : Runs glocktop in interactive mode.\n"); + printf("-d : delay between refreshes, in seconds (default: %d).\n", REFRESH_TIME); diff --git a/SOURCES/bz1616389-1-fsck_gfs2_Don_t_check_fs_formats_we_don_t_recognise.patch b/SOURCES/bz1616389-1-fsck_gfs2_Don_t_check_fs_formats_we_don_t_recognise.patch new file mode 100644 index 0000000..17e2320 --- /dev/null +++ b/SOURCES/bz1616389-1-fsck_gfs2_Don_t_check_fs_formats_we_don_t_recognise.patch @@ -0,0 +1,130 @@ +commit 1a4581c3f54b5c794da6537789eeab298b78e031 +Author: Andrew Price +Date: Fri Aug 17 12:49:24 2018 +0100 + + fsck.gfs2: Don't check fs formats we don't recognise + + Currently fsck.gfs2 will ignore sb_fs_format but in order to support + future formats we need to make sure it doesn't try to check filesystems + with formats we don't recognise yet. Better late than never. + + Tests included. + + rhbz#1616389 + rhbz#1622050 + + Signed-off-by: Andrew Price + +diff --git a/gfs2/fsck/fsck.h b/gfs2/fsck/fsck.h +index 8af4eb41..db173c67 100644 +--- a/gfs2/fsck/fsck.h ++++ b/gfs2/fsck/fsck.h +@@ -4,6 +4,8 @@ + #include "libgfs2.h" + #include "osi_tree.h" + ++#define FSCK_MAX_FORMAT (1801) ++ + #define FSCK_HASH_SHIFT (13) + #define FSCK_HASH_SIZE (1 << FSCK_HASH_SHIFT) + #define FSCK_HASH_MASK (FSCK_HASH_SIZE - 1) +diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c +index 75f050b5..4e323ffa 100644 +--- a/gfs2/fsck/initialize.c ++++ b/gfs2/fsck/initialize.c +@@ -1332,12 +1332,12 @@ static int fill_super_block(struct gfs2_sbd *sdp) + if (sizeof(struct gfs2_sb) > sdp->sd_sb.sb_bsize){ + log_crit( _("GFS superblock is larger than the blocksize!\n")); + log_debug("sizeof(struct gfs2_sb) > sdp->sd_sb.sb_bsize\n"); +- return -1; ++ return FSCK_ERROR; + } + + if (compute_constants(sdp)) { + log_crit("%s\n", _("Failed to compute file system constants")); +- exit(FSCK_ERROR); ++ return FSCK_ERROR; + } + ret = read_sb(sdp); + if (ret < 0) { +@@ -1346,10 +1346,15 @@ static int fill_super_block(struct gfs2_sbd *sdp) + /* Now that we've tried to repair it, re-read it. */ + ret = read_sb(sdp); + if (ret < 0) +- return -1; ++ return FSCK_ERROR; + } + if (sdp->gfs1) + sbd1 = (struct gfs_sb *)&sdp->sd_sb; ++ else if (sdp->sd_sb.sb_fs_format > FSCK_MAX_FORMAT) { ++ log_crit(_("Unsupported gfs2 format found: %"PRIu32"\n"), sdp->sd_sb.sb_fs_format); ++ log_crit(_("A newer fsck.gfs2 is required to check this file system.\n")); ++ return FSCK_USAGE; ++ } + return 0; + } + +@@ -1554,6 +1559,7 @@ int initialize(struct gfs2_sbd *sdp, int force_check, int preen, + int *all_clean) + { + int clean_journals = 0, open_flag; ++ int err; + + *all_clean = 0; + +@@ -1599,8 +1605,9 @@ int initialize(struct gfs2_sbd *sdp, int force_check, int preen, + } + + /* read in sb from disk */ +- if (fill_super_block(sdp)) +- return FSCK_ERROR; ++ err = fill_super_block(sdp); ++ if (err != FSCK_OK) ++ return err; + + /* Change lock protocol to be fsck_* instead of lock_* */ + if (!opts.no && preen_is_safe(sdp, preen, force_check)) { +diff --git a/gfs2/libgfs2/super.c b/gfs2/libgfs2/super.c +index 61752031..cc9679f5 100644 +--- a/gfs2/libgfs2/super.c ++++ b/gfs2/libgfs2/super.c +@@ -29,11 +29,18 @@ int check_sb(struct gfs2_sb *sb) + errno = EIO; + return -1; + } ++ /* Check for gfs1 */ + if (sb->sb_fs_format == GFS_FORMAT_FS && + sb->sb_header.mh_format == GFS_FORMAT_SB && + sb->sb_multihost_format == GFS_FORMAT_MULTI) { + return 1; + } ++ /* It's gfs2. Check format number is in a sensible range. */ ++ if (sb->sb_fs_format < GFS2_FORMAT_FS || ++ sb->sb_fs_format > 1899) { ++ errno = EINVAL; ++ return -1; ++ } + return 2; + } + +diff --git a/tests/fsck.at b/tests/fsck.at +index 0dfeac33..d3cf3dbb 100644 +--- a/tests/fsck.at ++++ b/tests/fsck.at +@@ -45,3 +45,16 @@ AT_SETUP([Fix bad rindex entry #1]) + AT_KEYWORDS(fsck.gfs2 fsck) + GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock $GFS_TGT], [-i 1]) + AT_CLEANUP ++ ++AT_SETUP([gfs2 format versions]) ++AT_KEYWORDS(fsck.gfs2 fsck) ++GFS_TGT_REGEN ++AT_CHECK([mkfs.gfs2 -O -p lock_nolock ${GFS_TGT}], 0, [ignore], [ignore]) ++AT_CHECK([echo "set sb { sb_fs_format: 1802 }" | gfs2l ${GFS_TGT}], 0, [ignore], [ignore]) ++# Unsupported format, FSCK_USAGE == 16 ++AT_CHECK([fsck.gfs2 -y $GFS_TGT], 16, [ignore], [ignore]) ++# Format out of range ++AT_CHECK([echo "set sb { sb_fs_format: 4242 }" | gfs2l ${GFS_TGT}], 0, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -y $GFS_TGT], 1, [ignore], [ignore]) ++AT_CHECK([fsck.gfs2 -n $GFS_TGT], 0, [ignore], [ignore]) ++AT_CLEANUP diff --git a/SOURCES/bz1616389-2-libgfs2_Fix_pointer_cast_byte_order_issue.patch b/SOURCES/bz1616389-2-libgfs2_Fix_pointer_cast_byte_order_issue.patch new file mode 100644 index 0000000..79e2a5b --- /dev/null +++ b/SOURCES/bz1616389-2-libgfs2_Fix_pointer_cast_byte_order_issue.patch @@ -0,0 +1,47 @@ +commit 9349bf264b3a8e60f071ab0f9c11859ca6342395 +Author: Andrew Price +Date: Thu Sep 6 14:28:19 2018 +0100 + + libgfs2: Fix pointer cast byte order issue + + lgfs2_field_assign() currently uses pointer casting to achieve generic + integer assignment based on the width of the field, but this is broken + as a uin32_t field can be assigned the value from the high bytes of the + uint64_t value, for instance. To fix this, store the value into a + uint64_t before casting to the narrower types. + + Signed-off-by: Andrew Price + +diff --git a/gfs2/libgfs2/meta.c b/gfs2/libgfs2/meta.c +index 500757d9..55133b1d 100644 +--- a/gfs2/libgfs2/meta.c ++++ b/gfs2/libgfs2/meta.c +@@ -919,6 +919,7 @@ int lgfs2_field_str(char *str, const size_t size, const char *blk, const struct + int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const void *val) + { + char *fieldp = blk + field->offset; ++ uint64_t num = *(uint64_t *)val; + + if (field->flags & LGFS2_MFF_UUID) { + memcpy(fieldp, val, 16); +@@ -938,16 +939,16 @@ int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const voi + + switch(field->length) { + case sizeof(uint8_t): +- *fieldp = *(uint8_t *)val; ++ *fieldp = (uint8_t)num; + return 0; + case sizeof(uint16_t): +- *(uint16_t *)fieldp = cpu_to_be16(*(uint16_t *)val); ++ *(uint16_t *)fieldp = cpu_to_be16((uint16_t)num); + return 0; + case sizeof(uint32_t): +- *(uint32_t *)fieldp = cpu_to_be32(*(uint32_t *)val); ++ *(uint32_t *)fieldp = cpu_to_be32((uint32_t)num); + return 0; + case sizeof(uint64_t): +- *(uint64_t *)fieldp = cpu_to_be64(*(uint64_t *)val); ++ *(uint64_t *)fieldp = cpu_to_be64((uint64_t)num); + return 0; + default: + /* Will never happen */ diff --git a/SPECS/gfs2-utils.spec b/SPECS/gfs2-utils.spec new file mode 100644 index 0000000..24a5d8d --- /dev/null +++ b/SPECS/gfs2-utils.spec @@ -0,0 +1,558 @@ +############################################################################### +############################################################################### +## +## Copyright (C) 2004-2013 Red Hat, Inc. All rights reserved. +## +## This copyrighted material is made available to anyone wishing to use, +## modify, copy, or redistribute it subject to the terms and conditions +## of the GNU General Public License v.2. +## +############################################################################### +############################################################################### + +Name: gfs2-utils +Version: 3.1.10 +Release: 9%{?dist} +License: GPLv2+ and LGPLv2+ +Group: System Environment/Kernel +Summary: Utilities for managing the global file system (GFS2) +%{?fedora:Requires: kernel-modules-extra} +Obsoletes: gfs2-cluster < %{version} +BuildRequires: ncurses-devel +BuildRequires: kernel-headers +BuildRequires: automake +BuildRequires: libtool +BuildRequires: zlib-devel +BuildRequires: gettext-devel +BuildRequires: bison +BuildRequires: flex +BuildRequires: libblkid-devel +BuildRequires: libuuid-devel +BuildRequires: check-devel +URL: https://pagure.io/gfs2-utils + +%if 0%{?rhel} > 0 +ExclusiveArch: x86_64 s390x ppc64le +%endif + +# The source for this package was pulled from the upstream git tree. +# Use the following commands to generate the tarball: +# git clone git://git.fedorahosted.org/gfs2-utils.git +# cd gfs2-utils +# ./make-tarball.sh +# +Source0: https://releases.pagure.org/gfs2-utils/gfs2-utils-%{version}.tar.gz +Patch0: bz1326508-gfs2_5_Clarify_the_availability_of_the_loccookie_option.patch +Patch1: bz1436772-gfs2_grow_Disable_rgrp_alignment_when_dev_topology_is_unsuitable.patch +Patch2: bz1440269-1-mkfs_gfs2_Free_unnecessary_cached_pages_disable_readahead.patch +Patch3: bz1440269-2-mkfs_gfs2_Fix_resource_group_alignment_issue.patch +Patch4: bz1440269-3-libgfs2_Issue_one_write_per_rgrp_when_creating_them.patch +Patch5: bz1482542-gfs2_edit_savemeta_Fix_up_saving_of_dinodes_symlinks.patch +Patch6: bz1507091-fsck_gfs2_Make_p_n_and_y_conflicting_options.patch +Patch7: bz1518938-gfs2_edit_Print_offsets_of_indirect_pointers.patch +Patch8: bz1498068-mkfs_gfs2_Scale_down_journal_size_for_smaller_devices.patch +Patch9: bz1544944-glocktop_Remove_a_non_existent_flag_from_the_usage_string.patch +Patch10: bz1616389-1-fsck_gfs2_Don_t_check_fs_formats_we_don_t_recognise.patch +Patch11: bz1616389-2-libgfs2_Fix_pointer_cast_byte_order_issue.patch + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +%prep +%setup -q -n gfs2-utils-%{version} +%patch0 -p1 -b .bz1326508-gfs2_5_Clarify_the_availability_of_the_loccookie_option +%patch1 -p1 -b .bz1436772-gfs2_grow_Disable_rgrp_alignment_when_dev_topology_is_unsuitable +%patch2 -p1 -b .bz1440269-1-mkfs_gfs2_Free_unnecessary_cached_pages_disable_readahead +%patch3 -p1 -b .bz1440269-2-mkfs_gfs2_Fix_resource_group_alignment_issue +%patch4 -p1 -b .bz1440269-3-libgfs2_Issue_one_write_per_rgrp_when_creating_them +%patch5 -p1 -b .bz1482542-gfs2_edit_savemeta_Fix_up_saving_of_dinodes_symlinks +%patch6 -p1 -b .bz1507091-fsck_gfs2_Make_p_n_and_y_conflicting_options +%patch7 -p1 -b .bz1518938-gfs2_edit_Print_offsets_of_indirect_pointers +%patch8 -p1 -b .bz1498068-mkfs_gfs2_Scale_down_journal_size_for_smaller_devices +%patch9 -p1 -b .bz1544944-glocktop_Remove_a_non_existent_flag_from_the_usage_string +%patch10 -p1 -b .bz1616389-1-fsck_gfs2_Don_t_check_fs_formats_we_don_t_recognise +%patch11 -p1 -b .bz1616389-2-libgfs2_Fix_pointer_cast_byte_order_issue + +%build +./autogen.sh +%configure +make %{_smp_mflags} + +%check +make check + +%install +rm -rf %{buildroot} +make -C gfs2 install DESTDIR=%{buildroot} +# Don't ship gfs2_{trace,lockcapture} in this package +rm -f %{buildroot}/usr/sbin/gfs2_trace +rm -f %{buildroot}/usr/sbin/gfs2_lockcapture +rm -f %{buildroot}%{_mandir}/man8/gfs2_trace.8 +rm -f %{buildroot}%{_mandir}/man8/gfs2_lockcapture.8 + +%clean +rm -rf %{buildroot} + +%description +The gfs2-utils package contains a number of utilities for creating, +checking, modifying, and correcting any inconsistencies in GFS2 +file systems. + +%files +%defattr(-,root,root,-) +%doc doc/COPYING.* doc/COPYRIGHT doc/*.txt +%doc doc/README.contributing doc/README.licence doc/README.tests +%{_sbindir}/fsck.gfs2 +%{_sbindir}/gfs2_grow +%{_sbindir}/gfs2_jadd +%{_sbindir}/mkfs.gfs2 +%{_sbindir}/gfs2_convert +%{_sbindir}/gfs2_edit +%{_sbindir}/tunegfs2 +%{_sbindir}/gfs2_withdraw_helper +%{_sbindir}/glocktop +%{_mandir}/man8/*gfs2* +%{_mandir}/man8/glocktop* +%{_mandir}/man5/* +%{_prefix}/lib/udev/rules.d/82-gfs2-withdraw.rules + +%changelog +* Thu Sep 06 2018 Andrew Price - 3.1.10-9 +- fsck.gfs2: Don't check fs formats we don't recognise +- libgfs2: Fix pointer cast byte order issue + Resolves: rhbz#1616389 + +* Fri Jun 22 2018 Andrew Price - 3.1.10-8 +- glocktop: Remove a non-existent flag from the usage string + Resolves: rhbz#1544944 + +* Sun Apr 15 2018 Andrew Price - 3.1.10-7 +- mkfs.gfs2: Scale down journal size for smaller devices + Resolves: rhbz#1498068 + +* Tue Dec 05 2017 Andrew Price - 3.1.10-6 +- gfs2_edit: Print offsets of indirect pointers + Resolves: rhbz#1518938 + +* Thu Nov 02 2017 Andrew Price - 3.1.10-5 +- Update URL in spec file + Resolves: rhbz#1501738 +- fsck.gfs2: Make -p, -n and -y conflicting options + Resolves: rhbz#1507091 + +* Fri Aug 18 2017 Andrew Price - 3.1.10-4 +- gfs2_edit savemeta: Fix up saving of dinodes/symlinks + Resolves: rhbz#1482542 + +* Tue Apr 18 2017 Andrew Price - 3.1.10-3 +- libgfs2: Issue one write per rgrp when creating them +- mkfs.gfs2: Fix resource group alignment issue +- mkfs.gfs2: Free unnecessary cached pages, disable readahead + Resolves: rhbz#1440269 + +* Tue Mar 28 2017 Andrew Price - 3.1.10-2 +- gfs2_grow: Disable rgrp alignment when dev topology is unsuitable + Resolves: rhbz#1436772 + +* Tue Mar 28 2017 Andrew Price - 3.1.10-1 +- Rebase to new upstream version 3.1.10 + Resolves: rhbz#1348601 + Resolves: rhbz#1356685 + Resolves: rhbz#1382087 + Resolves: rhbz#1405163 + Resolves: rhbz#1430399 +- Make dependency on libuuid explicit + +* Wed Mar 15 2017 Andrew Price - 3.1.9-4 +- Enable ppc64le builds + Resolves: rhbz#1426651 + +* Wed Jul 20 2016 Andrew Price - 3.1.9-3 +- gfs2(5): Clarify the availability of the loccookie option + Resolves: rhbz#1326508 + +* Wed Jul 06 2016 Andrew Price - 3.1.9-2 +- fsck.gfs2: "undo" functions can stop too early on duplicates + Resolves: rhbz#1348703 +- fsck.gfs2: link count checking wrong inode's formal inode number + Resolves: rhbz#1350597 +- fsck.gfs2: check formal inode number when links go from 1 to 2 + Resolves: rhbz#1350600 + +* Tue Jun 07 2016 Andrew Price - 3.1.9-1 +- Rebase to new upstream release 3.1.9 + Resolves: rhbz#1271674 + Resolves: rhbz#1162819 + Resolves: rhbz#1196321 + Resolves: rhbz#1202814 + Resolves: rhbz#1251036 + Resolves: rhbz#1257625 + Resolves: rhbz#1268045 + Resolves: rhbz#1283866 + Resolves: rhbz#1332728 + +* Thu Sep 17 2015 Andrew Price - 3.1.8-6 +- gfs2_edit savemeta: speed up is_block_in_per_node() + Resolves: rhbz#1162216 + +* Thu Aug 20 2015 Andrew Price - 3.1.8-5 +- gfs2-utils: Fix hang on withdraw (4 patches) +- Include new withdraw helper scripts in files section + Resolves: rhbz#1225634 + +* Tue Jul 07 2015 Andrew Price - 3.1.8-4 +- fsck.gfs2: Change duptree structure to have generic flags +- fsck.gfs2: Detect, fix and clone duplicate block refs within a dinode + Resolves: rhbz#1236669 + +* Mon Apr 27 2015 Andrew Price - 3.1.8-3 +- mkfs.gfs2: Allow longer cluster names + Resolves: rhbz#1202831 + +* Fri Apr 17 2015 Andrew Price - 3.1.8-2 +- fsck.gfs2: replace recent i_goal fixes with simple logic + Resolves: rhbz#1186515 + +* Tue Apr 07 2015 Andrew Price - 3.1.8-1 +- Rebase to new upstream version 3.1.8 + Resolves: rhbz#1184482 + Resolves: rhbz#1153316 + Resolves: rhbz#1154726 + Resolves: rhbz#1162216 + Resolves: rhbz#1165285 + Resolves: rhbz#1186515 + Resolves: rhbz#1186847 + Resolves: rhbz#1194446 + Resolves: rhbz#1195394 + +* Thu Jan 15 2015 Andrew Price - 3.1.7-6 +- fsck.gfs2: fix broken i_goal values in inodes +- gfs2_convert: use correct i_goal values instead of zeros for inodes +- tests: test for incorrect inode i_goal values +- fsck.gfs2: Reprocess nodes if anything changed - addendum 1 of 2 +- fsck.gfs2: addendum to fix broken i_goal values in inodes - addendum 2 of 2 + Resolves: rhbz#1178604 + +* Thu Nov 20 2014 Andrew Price - 3.1.7-5 +- Update ExclusiveArch + Resolves: rhbz#1161936 + +* Tue Nov 18 2014 Andrew Price - 3.1.7-4 +- mkfs.gfs2: Revert default resource group size + Resolves: rhbz#1162817 +- Add ExclusiveArch + Resolves: rhbz#1161936 + +* Tue Nov 18 2014 Andrew Price - 3.1.7-3 +- fsck.gfs2: Detect and correct corrupt journals + Resolves: rhbz#1146160 + +* Mon Nov 17 2014 Andrew Price - 3.1.7-2 +- fsck.gfs2: Improve reporting of pass timings + Resolves: rhbz#1154786 + +* Mon Sep 08 2014 Andrew Price - 3.1.7-1 +- Rebase to new upstream version 3.1.7 +- gfs2-utils tests: Fix unit tests for RHEL7 +- gfs2-utils tests: Build unit tests with consistent cpp flags + Resolves: rhbz#1112342 + Resolves: rhbz#1017381 + Resolves: rhbz#1075135 + Resolves: rhbz#1079507 + Resolves: rhbz#1107238 + +* Fri Mar 07 2014 Andrew Price - 3.1.6-13 +- gfs2_edit: Convert fssize to bytes before reporting fs size +- mkfs.gfs2 tests: Enable debug output + Resolves: rhbz#1059443 +- libgfs2: Superblock building and writing improvements +- gfs2-utils: Ensure sb_uuid uses are guarded +- libgfs2: Add support for new leaf hint fields + Resolves: rhbz#1063842 + +* Fri Jan 24 2014 Daniel Mach - 3.1.6-12 +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 3.1.6-11 +- Mass rebuild 2013-12-27 + +* Mon Nov 18 2013 Andrew Price - 3.1.6-10 +- libgfs2: Add lgfs2_open_mnt* functions +- Switch is_pathname_mounted callers to lgfs2_open_mnt* +- libgfs2: Remove is_pathname_mounted + Resolves: rhbz#991204 + +* Wed Nov 13 2013 Andrew Price - 3.1.6-9 +- libgfs2: Add sd_heightsize bounds checking in read_sb (3 patches) + Resolves: rhbz#1028388 + +* Tue Sep 17 2013 Andrew Price - 3.1.6-8 +- Don't use README.* for docs (it can pick up some patch files) + Related: rhbz#1000066 + +* Tue Sep 17 2013 Andrew Price - 3.1.6-7 +- fsck.gfs2: Check and repair per_node contents such as quota_changeX + Resolves: rhbz#1003059 + +* Fri Sep 06 2013 Andrew Price - 3.1.6-6 +- gfs2_tool: catch interrupts while the metafs is mounted + Resolves: rhbz#996236 + +* Tue Aug 27 2013 Andrew Price - 3.1.6-5 +- gfs2-utils tests: Switch to autotest + Resolves: rhbz#1000066 +- fsck.gfs2: Allocate enough space for the block map (2 patches) + Resolves: rhbz#1001583 + +* Tue Aug 27 2013 Andrew Price - 3.1.6-4 +- Install utils into /usr/sbin instead of /sbin + Resolves: rhbz#996539 + +* Tue Aug 13 2013 Andrew Price - 3.1.6-3 +- fsck.gfs2: Add the ability to detect journal inode indirect block corruption + Resolves: rhbz#990683 +- gfs2_grow: Don't try to open an empty string + Resolves: rhbz#991204 + +* Mon Jul 29 2013 Andrew Price - 3.1.6-2 +- Don't install gfs2_lockcapture and gfs2_trace + Resolves: rhbz#987019 +- Run test suite after build (requires check-devel build req) +- Install both of the READMEs into doc/ + +* Wed Jul 24 2013 Andrew Price - 3.1.6-1 +- New upstream release +- Drop 'file' requirement - mkfs.gfs2 now uses libblkid instead +- Drop 'ncurses' requirement - dependency is added automatically +- Drop requires chkconfig and initscripts - no longer installs daemons +- Drop fix_build_on_rawhide.patch - upstream +- Add build req on libblkid-devel + +* Wed Feb 13 2013 Fedora Release Engineering - 3.1.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Tue Nov 13 2012 Andrew Price - 3.1.5-1 +- New upstream release + Removes mount.gfs2, gfs2_tool, gfs2_quota +- Remove rawhide_transition.patch - now obsolete +- Update BuildRequires: + Change glibc-kernheaders to kernel-headers + Add bison and flex +- Provide a valid url for Source0 +- Add fix_build_on_rawhide.patch to fix a circular dep introduced in + bison 2.6, and a make -j race between libgfs2 and gfs2l + +* Tue Aug 14 2012 Andrew Price - 3.1.4-6 +- Make the kernel-modules-extra requirement Fedora-specific + Resolves bz#847955 + +* Thu Jul 19 2012 Fedora Release Engineering - 3.1.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Apr 17 2012 Andrew Price - 3.1.4-4 +- Remove commented-out sections +- Clean up some lintian warnings +- Add dependency on kernel-modules-extra as per bz#811547 + +* Wed Mar 07 2012 Andrew Price - 3.1.4-3 +- Remove redundant postinstall scriptlet + +* Thu Feb 2 2012 Fabio M. Di Nitto - 3.1.4-2 +- make sure to Obsolete gfs2-cluster + +* Wed Feb 01 2012 Andrew Price - 3.1.4-1 +- New upstream release + Adds gfs2_lockgather script +- Remove gfs2-cluster (commented out for now) +- Remove dependency on corosynclib-devel and systemd-units +- Add rawhide_transition.patch to stop gfs_controld from building + +* Fri Jan 13 2012 Fedora Release Engineering - 3.1.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Dec 15 2011 Andrew Price - 3.1.3-1 +- New upstream release + Bugfixes and improvements to fsck.gfs2 + Fixes various other bugs + Improve strings and translation support +- Adds gfs2-cluster systemd unit +- Removes gfs2* init scripts + +* Wed Jul 06 2011 Andrew Price - 3.1.2-1 +- New upstream release + Fixes several bugs + Improves translation support + Adds savemeta compression +- Add zlib-devel to BuildRequires +- Add gettext-devel to BuildRequires + +* Wed May 25 2011 Steven Whitehouse - 3.1.1-3 +- Update wiki URL +- Remove gfs2_tool and gfs2_quota from package + +* Fri Feb 25 2011 Bob Peterson - 3.1.1-2 +- Bumping release number to keep upgrades consistent. + +* Wed Feb 23 2011 Bob Peterson - 3.1.1-1 +- gfs2_edit savemeta doesn't save all leafs for big directories +- gfs2_edit improvements +- fsck.gfs2: can't repair rgrps resulting from gfs_grow->gfs2_convert +- fsck.gfs2: reports master/root dinodes as unused and fixes bitmap + +* Tue Feb 08 2011 Fedora Release Engineering - 3.1.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Jan 20 2011 Steven Whitehouse - 3.1.0-4 +- Drop mount.gfs2 and its man page +- Only list gfs2_tool once in the files list + +* Wed Dec 8 2010 Fabio M. Di Nitto - 3.1.0-3 +- Drop circular dependency on cman + +* Fri Dec 3 2010 Fabio M. Di Nitto - 3.1.0-2 +- gfs2-cluster should Obsoletes/Provides gfs-pcmk + +* Tue Sep 30 2010 Steven Whitehouse - 3.1.0-1 +- Bringing this package back for upstream GFS2 + Addition of gfs2tune to the utils + Merge of gfs_controld from cman + +* Thu Jan 22 2009 Fabio M. Di Nitto - 2.03.11-1 +- New upstream release + Fix several bugs and drastically improve startup errors. + +* Wed Dec 10 2008 Fabio M. Di Nitto - 2.03.10-1 +- New upstream release + Fix several bugs and port gfs1 code to match 2.6.27 kernel. + +* Fri Oct 31 2008 Fabio M. Di Nitto - 2.03.09-1 +- New upstream release + Fix rhbz#468966 + Addresses several security issues similar to CVE-2008-4192 and + CVE-2008-4579 after deep code audit from upstream +- cleanup patches to match 2.6.26 kernel in F-9 + +* Tue Oct 21 2008 Fabio M. Di Nitto - 2.03.08-1 +- New upstream release + Fix rhbz#460376 CVE-2008-4192 + Fix rhbz#467386 CVE-2008-4579 +- cleanup/update patches to match 2.6.26 kernel in F-9 + +* Thu Aug 14 2008 Fabio M. Di Nitto - 2.03.07-1 +- New upstream release +- Fix rgmanager startup locking issues +- Apply patch to include kernel headers from 2.6.26 required to build + userland. Userland will run in 2.6.25 compatibility mode +- Apply patch to keep kernel modules at 2.6.25 (upstream is at 2.6.26) + (this patch is purely cosmetic since we don't build kernel modules + but keep the source in sync is Good (tm)) +- Cleanup packaging for installed docs and file permissions + +* Mon Jul 14 2008 Fabio M. Di Nitto - 2.03.05-1 +- New upstream release +- Cleanup installed doc after upstream + +* Wed Jun 11 2008 Fabio M. Di Nitto 2.03.04-1 +- New upstream release +- Resolves: #446995 #318271 #447378 #445662 +- Update license tags after major upstream cleanup +- Include COPYRIGHT file + +* Fri May 30 2008 Fabio M. Di Nitto 2.03.03-1 +- New upstream release +- Fix several build warnings +- Update spec files to use macros +- Update Requires to use packages rather than pointing at files +- Drop BR on kernel-devel since it's not required anymore +- Update build section to use proper _sysconfdir, libdir and sbindir +- Avoid abusing cd when we can ask make to do the work for us +- Remove /usr/sbin from file section. We don't have any file there + and we can avoid shipping stuff by mistake + +* Mon Apr 14 2008 Steven Whitehouse 2.03.00-3 +- Fabbione saves the day. We can get rid of the sed stuff after all + +* Mon Apr 14 2008 Steven Whitehouse 2.03.00-1 +- New upstream sources +- Eric Sandeen's solution to kernel version dep + +* Wed Apr 09 2008 Steven Whitehouse 0.1.25.2.02.01-15 +- Remove obsolete chkconfig patch for initscript +- Enable parallel make +- Remove obsolete copy of gfs2_ondisk.h (this should be in glibc-kernheaders) + +* Wed Apr 09 2008 Steven Whitehouse 0.1.25.2.02.01-14 +- Update URL +- Fix license spec + +* Fri Mar 14 2008 Chris Feist 0.1.25.2.02.00-2 +- New upstream sources. + +* Tue Jan 16 2007 Chris Feist 0.1.24-1 +- New upstream sources. +- Resolves: rhbz#222747 + +* Wed Jan 03 2007 Chris Feist 0.1.24-1 +- Updated sources +- Resolves: rhbz#218560 + +* Thu Dec 21 2006 Chris Feist 0.1.23-1 +- Updated sources +- Resolves: rhbz#218560 + +* Tue Dec 19 2006 Chris Feist 0.1.22-1 +- New upstream sources. +- Resolves: rhbz#219878 + +* Tue Dec 04 2006 Chris Feist 0.1.21-1 +- New upstream sources. +- Resolves: rhbz#218134 rhbz#215962 + +* Thu Nov 30 2006 Chris Feist 0.1.19-1 +- New upstream sources. +- Resolves: rhbz#217798 + +* Wed Nov 29 2006 Chris Feist 0.1.18-1 +- New upstream sources. +- Resolves: rhbz#217460 + +* Thu Oct 26 2006 Chris Feist 0.1.14-1 +- New upstream sources. + +* Fri Oct 13 2006 Chris Feist 0.1.12-1 +- New Upstream sources. + +* Fri Oct 13 2006 Chris Feist 0.1.10-1 +- New Upstream sources. + +* Mon Oct 09 2006 Chris Feist 0.1.9-1 +- New Upstream sources. + +* Mon Sep 25 2006 Chris Feist 0.1.8-1 +- New Upstream sources. + +* Wed Sep 13 2006 Chris Feist 0.1.7-1 +- New Upstream sources. + +* Thu Sep 07 2006 Chris Feist 0.1.6-2 +- Fix typo in uninstall script (turn off gfs2 instead of gfs) + +* Mon Aug 28 2006 Chris Feist 0.1.6-1 +- New Upstream sources. + +* Tue Aug 22 2006 Chris Feist 0.1.5-1 +- New Upstream sources. + +* Mon Aug 14 2006 Chris Feist 0.1.3-0 +- New Upstream sources, use dist tag. + +* Fri Jul 14 2006 Chris Feist +- Rebuild with updated sources + +* Wed Jul 12 2006 Jesse Keating +- rebuild + +* Tue Jun 27 2006 Florian La Roche +- fix typo in preun script + +* Fri Jun 09 2006 Chris Feist - 0.1.0-1.fc6.3 +- Initial build of gfs-utils.