diff --git a/SOURCES/xfsprogs-4.10.0-xfs_db-fix-the-source-command-when-passed-as-a-c-opt.patch b/SOURCES/xfsprogs-4.10.0-xfs_db-fix-the-source-command-when-passed-as-a-c-opt.patch new file mode 100644 index 00000000..e57a8b26 --- /dev/null +++ b/SOURCES/xfsprogs-4.10.0-xfs_db-fix-the-source-command-when-passed-as-a-c-opt.patch @@ -0,0 +1,128 @@ +From c8dc4235614292020f82a031545d66c000b455f9 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Wed, 25 Jan 2017 20:02:43 -0600 +Subject: [PATCH] xfs_db: fix the 'source' command when passed as a -c option + +The 'source' command is supposed to read commands out of a file and +execute them. This works great when done from an interactive command +line, but it doesn't work at all when invoked from the command line +because we never actually do anything with the opened file. + +So don't load stdin into the input stack when we're only executing +command line options, and use that to decide if source_f is executing +from the command line so that we can actually run the input loop. We'll +use this for the per-field fuzzing xfstests. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Eric Sandeen +Signed-off-by: Eric Sandeen +--- + db/init.c | 2 +- + db/input.c | 43 +++++++++++++++++++++++++++++++++---------- + 2 files changed, 34 insertions(+), 11 deletions(-) + +Index: xfsprogs-4.5.0/db/init.c +=================================================================== +--- xfsprogs-4.5.0.orig/db/init.c ++++ xfsprogs-4.5.0/db/init.c +@@ -192,7 +192,6 @@ main( + char **v; + int start_iocur_sp; + +- pushfile(stdin); + init(argc, argv); + start_iocur_sp = iocur_sp; + +@@ -207,6 +206,7 @@ main( + goto close_devices; + } + ++ pushfile(stdin); + while (!done) { + if ((input = fetchline()) == NULL) + break; +Index: xfsprogs-4.5.0/db/input.c +=================================================================== +--- xfsprogs-4.5.0.orig/db/input.c ++++ xfsprogs-4.5.0/db/input.c +@@ -156,7 +156,7 @@ fetchline_internal(void) + + rval = NULL; + for (rlen = iscont = 0; ; ) { +- if (inputstacksize == 1) { ++ if (curinput == stdin) { + if (iscont) + dbprintf("... "); + else +@@ -181,18 +181,24 @@ fetchline_internal(void) + } + if (ferror(curinput) || feof(curinput) || + (len = strlen(buf)) == 0) { +- popfile(); +- if (curinput == NULL) { ++ /* ++ * No more input at this inputstack level; pop ++ * our fd off and return so that a lower ++ * level fetchline can handle us. If this was ++ * an interactive session, print a newline ++ * because ^D doesn't emit one. ++ */ ++ if (curinput == stdin) + dbprintf("\n"); +- return NULL; +- } ++ ++ popfile(); + iscont = 0; + rlen = 0; + if (rval) { + xfree(rval); + rval = NULL; + } +- continue; ++ return NULL; + } + if (inputstacksize == 1) + logprintf("%s", buf); +@@ -225,7 +231,9 @@ fetchline(void) + + if (inputstacksize == 1) { + line = readline(get_prompt()); +- if (line && *line) { ++ if (!line) ++ dbprintf("\n"); ++ else if (line && *line) { + add_history(line); + logprintf("%s", line); + } +@@ -314,12 +322,27 @@ source_f( + char **argv) + { + FILE *f; ++ int c, done = 0; ++ char *input; ++ char **v; + + f = fopen(argv[1], "r"); +- if (f == NULL) ++ if (f == NULL) { + dbprintf(_("can't open %s\n"), argv[0]); +- else +- pushfile(f); ++ return 0; ++ } ++ ++ /* Run the sourced commands now. */ ++ pushfile(f); ++ while (!done) { ++ if ((input = fetchline_internal()) == NULL) ++ break; ++ v = breakline(input, &c); ++ if (c) ++ done = command(c, v); ++ doneline(input, v); ++ } ++ + return 0; + } + diff --git a/SOURCES/xfsprogs-4.10.0-xfs_metadump-ignore-0-entries.patch b/SOURCES/xfsprogs-4.10.0-xfs_metadump-ignore-0-entries.patch index a7124909..73879426 100644 --- a/SOURCES/xfsprogs-4.10.0-xfs_metadump-ignore-0-entries.patch +++ b/SOURCES/xfsprogs-4.10.0-xfs_metadump-ignore-0-entries.patch @@ -3,18 +3,18 @@ Author: Eric Sandeen Date: Wed Feb 15 21:48:31 2017 -0600 xfs_metadump: ignore attr leaf with 0 entries - + Another in the ongoing saga of attribute leaves with zero entries; in this case, if we try to metadump an inode with a zero-entries attribute leaf, the zeroing code will go off the rails and segfault at: - + memset(&entries[nentries], 0, first_name - (char *)&entries[nentries]); - + because first_name is null, and we try to memset a large (negative) number. - + Signed-off-by: Eric Sandeen Reviewed-by: Darrick J. Wong Signed-off-by: Eric Sandeen @@ -24,12 +24,12 @@ index 38519f1..66952f6 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1654,7 +1654,8 @@ process_attr_block( - xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &hdr, leaf); - - nentries = hdr.count; + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &hdr, leaf); + + nentries = hdr.count; - if (nentries * sizeof(xfs_attr_leaf_entry_t) + + if (nentries == 0 || + nentries * sizeof(xfs_attr_leaf_entry_t) + - xfs_attr3_leaf_hdr_size(leaf) > - XFS_ATTR3_RMT_BUF_SPACE(mp, bs)) { - if (show_warnings) + xfs_attr3_leaf_hdr_size(leaf) > + XFS_ATTR3_RMT_BUF_SPACE(mp, bs)) { + if (show_warnings) diff --git a/SOURCES/xfsprogs-4.11.0-xfs_repair-warn-about-dirty-log-with-n-option.patch b/SOURCES/xfsprogs-4.11.0-xfs_repair-warn-about-dirty-log-with-n-option.patch index 6b44aac3..2f659b86 100644 --- a/SOURCES/xfsprogs-4.11.0-xfs_repair-warn-about-dirty-log-with-n-option.patch +++ b/SOURCES/xfsprogs-4.11.0-xfs_repair-warn-about-dirty-log-with-n-option.patch @@ -19,14 +19,14 @@ Index: xfsprogs-4.5.0/repair/phase2.c --- xfsprogs-4.5.0.orig/repair/phase2.c +++ xfsprogs-4.5.0/repair/phase2.c @@ -89,11 +89,16 @@ zero_log( - _("zero_log: head block %" PRId64 " tail block %" PRId64 "\n"), - head_blk, tail_blk); - } + _("zero_log: head block %" PRId64 " tail block %" PRId64 "\n"), + head_blk, tail_blk); + } - if (!no_modify && head_blk != tail_blk) { - if (zap_log) { + if (head_blk != tail_blk) { + if (!no_modify && zap_log) { - do_warn(_( + do_warn(_( "ALERT: The filesystem has valuable metadata changes in a log which is being\n" "destroyed because the -L option was used.\n")); + } else if (no_modify) { @@ -34,6 +34,6 @@ Index: xfsprogs-4.5.0/repair/phase2.c +"ALERT: The filesystem has valuable metadata changes in a log which is being\n" +"ignored because the -n option was used. Expect spurious inconsistencies\n" +"which may be resolved by first mounting the filesystem to replay the log.\n")); - } else { - do_warn(_( + } else { + do_warn(_( "ERROR: The filesystem has valuable metadata changes in a log which needs to\n" diff --git a/SOURCES/xfsprogs-4.12.0-mkfs.xfs-allow-specification-of-0-data-stripe-width-.patch b/SOURCES/xfsprogs-4.12.0-mkfs.xfs-allow-specification-of-0-data-stripe-width-.patch index 4f05954f..d388d394 100644 --- a/SOURCES/xfsprogs-4.12.0-mkfs.xfs-allow-specification-of-0-data-stripe-width-.patch +++ b/SOURCES/xfsprogs-4.12.0-mkfs.xfs-allow-specification-of-0-data-stripe-width-.patch @@ -25,62 +25,62 @@ Index: xfsprogs-rhel7.5/mkfs/xfs_mkfs.c --- xfsprogs-rhel7.5.orig/mkfs/xfs_mkfs.c +++ xfsprogs-rhel7.5/mkfs/xfs_mkfs.c @@ -909,6 +909,7 @@ main( - int dsw; - int dsunit; - int dswidth; + int dsw; + int dsunit; + int dswidth; + int dsflag; - int force_overwrite; - struct fsxattr fsx; - int iaflag; + int force_overwrite; + struct fsxattr fsx; + int iaflag; @@ -1012,7 +1013,7 @@ main( - dfile = logfile = rtfile = NULL; - dsize = logsize = rtsize = rtextsize = protofile = NULL; - dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0; + dfile = logfile = rtfile = NULL; + dsize = logsize = rtsize = rtextsize = protofile = NULL; + dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0; - nodsflag = norsflag = 0; + dsflag = nodsflag = norsflag = 0; - force_overwrite = 0; - worst_freelist = 0; - lazy_sb_counters = 1; + force_overwrite = 0; + worst_freelist = 0; + lazy_sb_counters = 1; @@ -1137,6 +1138,7 @@ main( - exit(1); - } - dsunit = cvtnum(0, 0, value); + exit(1); + } + dsunit = cvtnum(0, 0, value); + dsflag = 1; - break; - case D_SWIDTH: - if (!value || *value == '\0') + break; + case D_SWIDTH: + if (!value || *value == '\0') @@ -1153,6 +1155,7 @@ main( - exit(1); - } - dswidth = cvtnum(0, 0, value); + exit(1); + } + dswidth = cvtnum(0, 0, value); + dsflag = 1; - break; - case D_SU: - if (!value || *value == '\0') + break; + case D_SU: + if (!value || *value == '\0') @@ -1164,6 +1167,7 @@ main( - D_SU); - dsu = cvtnum( - blocksize, sectorsize, value); + D_SU); + dsu = cvtnum( + blocksize, sectorsize, value); + dsflag = 1; - break; - case D_SW: - if (!value || *value == '\0') + break; + case D_SW: + if (!value || *value == '\0') @@ -1180,6 +1184,7 @@ main( - exit(1); - } - dsw = cvtnum(0, 0, value); + exit(1); + } + dsw = cvtnum(0, 0, value); + dsflag = 1; - break; - case D_NOALIGN: - if (dsu) -@@ -2078,6 +2083,10 @@ _("warning: sparse inodes not supported - calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize, - &dsunit, &dswidth, &lsunit); - + break; + case D_NOALIGN: + if (dsu) +@@ -2078,6 +2083,10 @@ _("warning: sparse inodes not supported + calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize, + &dsunit, &dswidth, &lsunit); + + /* If sunit & swidth were manually specified as 0, same as noalign */ + if (dsflag && !dsunit && !dswidth) + nodsflag = 1; + - xi.setblksize = sectorsize; - - /* + xi.setblksize = sectorsize; + + /* diff --git a/SOURCES/xfsprogs-4.12.0-xfs_db-improve-argument-naming-in-set_cur-and-set_io.patch b/SOURCES/xfsprogs-4.12.0-xfs_db-improve-argument-naming-in-set_cur-and-set_io.patch index 0417abce..0781351b 100644 --- a/SOURCES/xfsprogs-4.12.0-xfs_db-improve-argument-naming-in-set_cur-and-set_io.patch +++ b/SOURCES/xfsprogs-4.12.0-xfs_db-improve-argument-naming-in-set_cur-and-set_io.patch @@ -23,7 +23,7 @@ Index: xfsprogs-rhel7.5/db/io.c --- xfsprogs-rhel7.5.orig/db/io.c +++ xfsprogs-rhel7.5/db/io.c @@ -487,9 +487,9 @@ write_cur(void) - + void set_cur( - const typ_t *t, @@ -32,101 +32,101 @@ Index: xfsprogs-rhel7.5/db/io.c + const typ_t *type, + xfs_daddr_t blknum, + int len, - int ring_flag, - bbmap_t *bbmap) + int ring_flag, + bbmap_t *bbmap) { @@ -497,14 +497,13 @@ set_cur( - xfs_ino_t dirino; - xfs_ino_t ino; - __uint16_t mode; + xfs_ino_t dirino; + xfs_ino_t ino; + __uint16_t mode; - const struct xfs_buf_ops *ops = t ? t->bops : NULL; + const struct xfs_buf_ops *ops = type ? type->bops : NULL; - - if (iocur_sp < 0) { - dbprintf(_("set_cur no stack element to set\n")); - return; - } - + + if (iocur_sp < 0) { + dbprintf(_("set_cur no stack element to set\n")); + return; + } + - - ino = iocur_top->ino; - dirino = iocur_top->dirino; - mode = iocur_top->mode; + ino = iocur_top->ino; + dirino = iocur_top->dirino; + mode = iocur_top->mode; @@ -514,7 +513,7 @@ set_cur( - if (bbmap) { + if (bbmap) { #ifdef DEBUG_BBMAP - int i; + int i; - printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); + printf(_("xfs_db got a bbmap for %lld\n"), (long long)blknum); - printf(_("\tblock map")); - for (i = 0; i < bbmap->nmaps; i++) - printf(" %lld:%d", (long long)bbmap->b[i].bm_bn, + printf(_("\tblock map")); + for (i = 0; i < bbmap->nmaps; i++) + printf(" %lld:%d", (long long)bbmap->b[i].bm_bn, @@ -528,7 +527,7 @@ set_cur( - bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, - bbmap->nmaps, 0, ops); - } else { + bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, + bbmap->nmaps, 0, ops); + } else { - bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, ops); + bp = libxfs_readbuf(mp->m_ddev_targp, blknum, len, 0, ops); - iocur_top->bbmap = NULL; - } - + iocur_top->bbmap = NULL; + } + @@ -544,13 +543,13 @@ set_cur( - if (!ops) - bp->b_flags |= LIBXFS_B_UNCHECKED; - + if (!ops) + bp->b_flags |= LIBXFS_B_UNCHECKED; + - iocur_top->bb = d; - iocur_top->blen = c; + iocur_top->bb = blknum; + iocur_top->blen = len; - iocur_top->boff = 0; - iocur_top->data = iocur_top->buf; + iocur_top->boff = 0; + iocur_top->data = iocur_top->buf; - iocur_top->len = BBTOB(c); - iocur_top->off = d << BBSHIFT; - iocur_top->typ = cur_typ = t; + iocur_top->len = BBTOB(len); + iocur_top->off = blknum << BBSHIFT; + iocur_top->typ = cur_typ = type; - iocur_top->ino = ino; - iocur_top->dirino = dirino; - iocur_top->mode = mode; + iocur_top->ino = ino; + iocur_top->dirino = dirino; + iocur_top->mode = mode; @@ -564,23 +563,24 @@ set_cur( - + void set_iocur_type( - const typ_t *t) + const typ_t *type) { - struct xfs_buf *bp = iocur_top->bp; - - /* adjust buffer size for types with fields & hence fsize() */ + struct xfs_buf *bp = iocur_top->bp; + + /* adjust buffer size for types with fields & hence fsize() */ - if (t->fields) { + if (type->fields) { - int bb_count; /* type's size in basic blocks */ - + int bb_count; /* type's size in basic blocks */ + - bb_count = BTOBB(byteize(fsize(t->fields, iocur_top->data, 0, 0))); - set_cur(t, iocur_top->bb, bb_count, DB_RING_IGN, NULL); + bb_count = BTOBB(byteize(fsize(type->fields, + iocur_top->data, 0, 0))); + set_cur(type, iocur_top->bb, bb_count, DB_RING_IGN, NULL); - } + } - iocur_top->typ = t; + iocur_top->typ = type; - - /* verify the buffer if the type has one. */ - if (!bp) - return; + + /* verify the buffer if the type has one. */ + if (!bp) + return; - if (!t->bops) { + if (!type->bops) { - bp->b_ops = NULL; - bp->b_flags |= LIBXFS_B_UNCHECKED; - return; + bp->b_ops = NULL; + bp->b_flags |= LIBXFS_B_UNCHECKED; + return; @@ -588,7 +588,7 @@ set_iocur_type( - if (!(bp->b_flags & LIBXFS_B_UPTODATE)) - return; - bp->b_error = 0; + if (!(bp->b_flags & LIBXFS_B_UPTODATE)) + return; + bp->b_error = 0; - bp->b_ops = t->bops; + bp->b_ops = type->bops; - bp->b_ops->verify_read(bp); - bp->b_flags &= ~LIBXFS_B_UNCHECKED; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; } Index: xfsprogs-rhel7.5/db/io.h =================================================================== @@ -144,5 +144,5 @@ Index: xfsprogs-rhel7.5/db/io.h -extern void set_iocur_type(const struct typ *t); +extern void set_iocur_type(const struct typ *type); extern void xfs_dummy_verify(struct xfs_buf *bp); - + /* diff --git a/SOURCES/xfsprogs-4.12.0-xfs_db-properly-set-inode-type.patch b/SOURCES/xfsprogs-4.12.0-xfs_db-properly-set-inode-type.patch index 85b58821..5e66b348 100644 --- a/SOURCES/xfsprogs-4.12.0-xfs_db-properly-set-inode-type.patch +++ b/SOURCES/xfsprogs-4.12.0-xfs_db-properly-set-inode-type.patch @@ -35,8 +35,8 @@ Index: xfsprogs-rhel7.5/db/io.c +++ xfsprogs-rhel7.5/db/io.c @@ -567,6 +567,22 @@ set_iocur_type( { - struct xfs_buf *bp = iocur_top->bp; - + struct xfs_buf *bp = iocur_top->bp; + + /* Inodes are special; verifier checks all inodes in the chunk */ + if (type->typnm == TYP_INODE) { + xfs_daddr_t b = iocur_top->bb; @@ -53,6 +53,6 @@ Index: xfsprogs-rhel7.5/db/io.c + return; + } + - /* adjust buffer size for types with fields & hence fsize() */ - if (type->fields) { - int bb_count; /* type's size in basic blocks */ + /* adjust buffer size for types with fields & hence fsize() */ + if (type->fields) { + int bb_count; /* type's size in basic blocks */ diff --git a/SOURCES/xfsprogs-4.12.0-xfs_db-update-buffer-size-when-new-type-is-set.patch b/SOURCES/xfsprogs-4.12.0-xfs_db-update-buffer-size-when-new-type-is-set.patch index a24396e3..42ed9568 100644 --- a/SOURCES/xfsprogs-4.12.0-xfs_db-update-buffer-size-when-new-type-is-set.patch +++ b/SOURCES/xfsprogs-4.12.0-xfs_db-update-buffer-size-when-new-type-is-set.patch @@ -46,13 +46,13 @@ Index: xfsprogs-rhel7.5/db/io.c #include "init.h" #include "malloc.h" +#include "bit.h" - + static int pop_f(int argc, char **argv); static void pop_help(void); @@ -567,6 +568,13 @@ set_iocur_type( { - struct xfs_buf *bp = iocur_top->bp; - + struct xfs_buf *bp = iocur_top->bp; + + /* adjust buffer size for types with fields & hence fsize() */ + if (t->fields) { + int bb_count; /* type's size in basic blocks */ @@ -60,6 +60,6 @@ Index: xfsprogs-rhel7.5/db/io.c + bb_count = BTOBB(byteize(fsize(t->fields, iocur_top->data, 0, 0))); + set_cur(t, iocur_top->bb, bb_count, DB_RING_IGN, NULL); + } - iocur_top->typ = t; - - /* verify the buffer if the type has one. */ + iocur_top->typ = t; + + /* verify the buffer if the type has one. */ diff --git a/SOURCES/xfsprogs-4.13.0-mkfs.xfs-Don-t-stagger-AG-for-a-single-disk.patch b/SOURCES/xfsprogs-4.13.0-mkfs.xfs-Don-t-stagger-AG-for-a-single-disk.patch index 3c2eb8aa..5fb2d7e4 100644 --- a/SOURCES/xfsprogs-4.13.0-mkfs.xfs-Don-t-stagger-AG-for-a-single-disk.patch +++ b/SOURCES/xfsprogs-4.13.0-mkfs.xfs-Don-t-stagger-AG-for-a-single-disk.patch @@ -42,13 +42,13 @@ Index: xfsprogs-rhel7.5/mkfs/xfs_mkfs.c --- xfsprogs-rhel7.5.orig/mkfs/xfs_mkfs.c +++ xfsprogs-rhel7.5/mkfs/xfs_mkfs.c @@ -2308,7 +2308,9 @@ reported by the device (%u).\n"), - } - } - } + } + } + } - if (dswidth && ((agsize % dswidth) == 0) && (agcount > 1)) { + if (dswidth && ((agsize % dswidth) == 0) + && (dswidth != dsunit) + && (agcount > 1)) { - /* This is a non-optimal configuration because all AGs - * start on the same disk in the stripe. Changing - * the AG size by one sunit will guarantee that this + /* This is a non-optimal configuration because all AGs + * start on the same disk in the stripe. Changing + * the AG size by one sunit will guarantee that this diff --git a/SOURCES/xfsprogs-4.13.0-xfs_repair-don-t-use-do_warn-for-normal-log-message.patch b/SOURCES/xfsprogs-4.13.0-xfs_repair-don-t-use-do_warn-for-normal-log-message.patch index 58d55efe..4020c02f 100644 --- a/SOURCES/xfsprogs-4.13.0-xfs_repair-don-t-use-do_warn-for-normal-log-message.patch +++ b/SOURCES/xfsprogs-4.13.0-xfs_repair-don-t-use-do_warn-for-normal-log-message.patch @@ -25,10 +25,10 @@ Index: xfsprogs-4.5.0/repair/phase2.c +++ xfsprogs-4.5.0/repair/phase2.c @@ -85,7 +85,7 @@ zero_log( "attempt a repair.\n")); - } else { - if (verbose) { + } else { + if (verbose) { - do_warn( + do_log( - _("zero_log: head block %" PRId64 " tail block %" PRId64 "\n"), - head_blk, tail_blk); - } + _("zero_log: head block %" PRId64 " tail block %" PRId64 "\n"), + head_blk, tail_blk); + } diff --git a/SOURCES/xfsprogs-4.14.0-db-increase-metadump-s-default-overly-long-extent-di.patch b/SOURCES/xfsprogs-4.14.0-db-increase-metadump-s-default-overly-long-extent-di.patch new file mode 100644 index 00000000..17416bbb --- /dev/null +++ b/SOURCES/xfsprogs-4.14.0-db-increase-metadump-s-default-overly-long-extent-di.patch @@ -0,0 +1,55 @@ +From 921c30674e9bc719e7c2747deb6deb04be2adb4b Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Thu, 9 Nov 2017 11:35:22 -0600 +Subject: [PATCH] db: increase metadump's default overly long extent discard + threshold + +Back in 88b8e1d6d7 ("Make xfs_metadump more robust against bad data"), +metadump grew the ability to ignore a directory extent if it was longer +than 20 blocks. Presumably this was to protect metadump from dumping +absurdly long extents resulting from bmbt corruption, but it's certainly +possible to create a directory with an extent longer than 20 blocks. +Hilariously, the discards happen with no warning unless the caller +explicitly set -w. + +This was raised to 1000 blocks in 7431d134fe8 ("Increase default maximum +extent size for xfs_metadump when copying..."), but it's still possible +to create a directory with an extent longer than 1000 blocks. + +Increase the threshold to MAXEXTLEN blocks because it's totally valid +for the filesystem to create extents up to that length. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Carlos Maiolino +Signed-off-by: Eric Sandeen +--- + db/metadump.c | 2 +- + man/man8/xfs_metadump.8 | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: xfsprogs-4.5.0/db/metadump.c +=================================================================== +--- xfsprogs-4.5.0.orig/db/metadump.c ++++ xfsprogs-4.5.0/db/metadump.c +@@ -32,7 +32,7 @@ + #include "field.h" + #include "dir2.h" + +-#define DEFAULT_MAX_EXT_SIZE 1000 ++#define DEFAULT_MAX_EXT_SIZE MAXEXTLEN + + /* + * It's possible that multiple files in a directory (or attributes +Index: xfsprogs-4.5.0/man/man8/xfs_metadump.8 +=================================================================== +--- xfsprogs-4.5.0.orig/man/man8/xfs_metadump.8 ++++ xfsprogs-4.5.0/man/man8/xfs_metadump.8 +@@ -114,7 +114,7 @@ copied. + .B \-m + Set the maximum size of an allowed metadata extent. Extremely large metadata + extents are likely to be corrupt, and will be skipped if they exceed +-this value. The default size is 1000 blocks. ++this value. The default size is 2097151 blocks. + .TP + .B \-o + Disables obfuscation of file names and extended attributes. diff --git a/SOURCES/xfsprogs-4.15.0-xfs_copy-accept-CRC-version-of-ABTB_MAGIC-in-ASSERT.patch b/SOURCES/xfsprogs-4.15.0-xfs_copy-accept-CRC-version-of-ABTB_MAGIC-in-ASSERT.patch new file mode 100644 index 00000000..e4492eab --- /dev/null +++ b/SOURCES/xfsprogs-4.15.0-xfs_copy-accept-CRC-version-of-ABTB_MAGIC-in-ASSERT.patch @@ -0,0 +1,35 @@ +From d0ca5d8a3875a423b522ee9767cbeb3d47bed420 Mon Sep 17 00:00:00 2001 +From: Eric Sandeen +Date: Thu, 25 Jan 2018 13:55:01 -0600 +Subject: [PATCH] xfs_copy: accept CRC version of ABTB_MAGIC in ASSERT + +Not sure how this was missed for so long, but to handle CRC +filesystems, this ASSERT on block magic must accept CRC magic +as well. + +Reported-by: Radek Burkat +Signed-off-by: Eric Sandeen +Reviewed-by: Darrick J. Wong +Reviewed-by: Bill O'Donnell +Signed-off-by: Eric Sandeen +--- + copy/xfs_copy.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c +index fb37375..16ee4d9 100644 +--- a/copy/xfs_copy.c ++++ b/copy/xfs_copy.c +@@ -1140,7 +1140,8 @@ main(int argc, char **argv) + ((char *) btree_buf.data + + pos - btree_buf.position); + +- ASSERT(be32_to_cpu(block->bb_magic) == XFS_ABTB_MAGIC); ++ ASSERT(be32_to_cpu(block->bb_magic) == XFS_ABTB_MAGIC || ++ be32_to_cpu(block->bb_magic) == XFS_ABTB_CRC_MAGIC); + } + + /* +-- +2.9.5 + diff --git a/SOURCES/xfsprogs-4.15.0-xfs_db-fix-crash-when-field-list-selector-string-has.patch b/SOURCES/xfsprogs-4.15.0-xfs_db-fix-crash-when-field-list-selector-string-has.patch new file mode 100644 index 00000000..dd73b3f2 --- /dev/null +++ b/SOURCES/xfsprogs-4.15.0-xfs_db-fix-crash-when-field-list-selector-string-has.patch @@ -0,0 +1,37 @@ +From 945e47e2fcc5d1cec693122286da06d8ab829c52 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Thu, 4 Jan 2018 13:58:29 -0600 +Subject: [PATCH] xfs_db: fix crash when field list selector string has + trailing slash + +If I run the following command: + +xfs_db /dev/sdf -x -c 'agf 0' -c 'addr refcntroot' -c 'addr ptrs[1]\' + +it errors out with "bad character in field \" and +then ftok_free crashes on an invalid free() because picking up the +previous token (the closing bracket) xrealloc'd the token array to be 5 +elements long but never set the last element's tok pointer. +Consequently the ftok_free tries to free whatever garbage pointer is in +that last element and kaboom. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Eric Sandeen +[sandeen: slightly clarify commit log] +Signed-off-by: Eric Sandeen +--- + db/flist.c | 1 + + 1 file changed, 1 insertion(+) + +Index: xfsprogs-4.5.0/db/flist.c +=================================================================== +--- xfsprogs-4.5.0.orig/db/flist.c ++++ xfsprogs-4.5.0/db/flist.c +@@ -400,6 +400,7 @@ flist_split( + strncpy(a, s, l); + a[l] = '\0'; + v = xrealloc(v, (nv + 2) * sizeof(*v)); ++ v[nv + 1].tok = NULL; + v[nv].tok = a; + v[nv].tokty = t; + nv++; diff --git a/SOURCES/xfsprogs-4.15.0-xfsprogs-update-dead-urls.patch b/SOURCES/xfsprogs-4.15.0-xfsprogs-update-dead-urls.patch new file mode 100644 index 00000000..0f105f7d --- /dev/null +++ b/SOURCES/xfsprogs-4.15.0-xfsprogs-update-dead-urls.patch @@ -0,0 +1,97 @@ +From 50663dc149619aef23bcb43e6fdf48bc60487374 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Thu, 25 Jan 2018 13:55:01 -0600 +Subject: [PATCH] xfsprogs: update dead urls + +Since oss.sgi.com is dead and xfs.org is slowly migrating to +xfs.wiki.kernel.org, update all the documentation links to point to the +current landing pads. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Eric Sandeen +Signed-off-by: Eric Sandeen +--- + README | 2 +- + debian/control | 6 +++--- + debian/copyright | 2 +- + debian/watch | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +Index: xfsprogs-4.5.0/README +=================================================================== +--- xfsprogs-4.5.0.orig/README ++++ xfsprogs-4.5.0/README +@@ -9,4 +9,4 @@ and references to other XFS manual pages + + For more information and details on how to contribute to the + XFS project see the web pages at: +- http://oss.sgi.com/projects/xfs/ ++ https://xfs.wiki.kernel.org/ +Index: xfsprogs-4.5.0/debian/control +=================================================================== +--- xfsprogs-4.5.0.orig/debian/control ++++ xfsprogs-4.5.0/debian/control +@@ -24,7 +24,7 @@ Description: Utilities for managing the + Btrees (directories, extents, free space) to aid both performance + and scalability. + . +- Refer to the documentation at http://oss.sgi.com/projects/xfs/ ++ Refer to the documentation at https://xfs.wiki.kernel.org/ + for complete details. + + Package: xfslibs-dev +Index: xfsprogs-4.5.0/debian/copyright +=================================================================== +--- xfsprogs-4.5.0.orig/debian/copyright ++++ xfsprogs-4.5.0/debian/copyright +@@ -1,7 +1,7 @@ + This package was debianized by Nathan Scott nathans@debian.org on + Sun, 19 Nov 2000 07:37:09 -0500. + +-It can be downloaded from ftp://oss.sgi.com/projects/xfs/download/ ++It can be downloaded from https://www.kernel.org/pub/linux/utils/fs/xfs/xfsprogs/ + + Copyright: + +Index: xfsprogs-4.5.0/debian/watch +=================================================================== +--- xfsprogs-4.5.0.orig/debian/watch ++++ xfsprogs-4.5.0/debian/watch +@@ -1,3 +1,3 @@ + version=3 + opts=uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \ +-ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-(.+)\.tar\.gz ++https://www.kernel.org/pub/linux/utils/fs/xfs/xfsprogs/xfsprogs-(.+)\.tar\.xz +Index: xfsprogs-4.5.0/libxfs/util.c +=================================================================== +--- xfsprogs-4.5.0.orig/libxfs/util.c ++++ xfsprogs-4.5.0/libxfs/util.c +@@ -690,7 +690,7 @@ libxfs_fs_repair_cmn_err(int level, xfs_ + fprintf(stderr, " This is a bug.\n"); + fprintf(stderr, "%s version %s\n", progname, VERSION); + fprintf(stderr, "Please capture the filesystem metadata with " +- "xfs_metadump and\nreport it to xfs@oss.sgi.com.\n"); ++ "xfs_metadump and\nreport it to linux-xfs@vger.kernel.org.\n"); + va_end(ap); + } + +Index: xfsprogs-4.5.0/man/man8/xfs_mdrestore.8 +=================================================================== +--- xfsprogs-4.5.0.orig/man/man8/xfs_mdrestore.8 ++++ xfsprogs-4.5.0/man/man8/xfs_mdrestore.8 +@@ -51,4 +51,4 @@ returns an exit code of 0 if all the met + .BR xfs (5) + .SH BUGS + Email bug reports to +-.BR xfs@oss.sgi.com . ++.BR linux-xfs@vger.kernel.org . +Index: xfsprogs-4.5.0/man/man8/xfs_metadump.8 +=================================================================== +--- xfsprogs-4.5.0.orig/man/man8/xfs_metadump.8 ++++ xfsprogs-4.5.0/man/man8/xfs_metadump.8 +@@ -154,4 +154,4 @@ command. + .BR xfs (5) + .SH BUGS + Email bug reports to +-.BR xfs@oss.sgi.com . ++.BR linux-xfs@vger.kernel.org . diff --git a/SOURCES/xfsprogs-4.16-xfs_repair-handle-corrupt-log.patch b/SOURCES/xfsprogs-4.16-xfs_repair-handle-corrupt-log.patch index f0f73cb3..a31f5f80 100644 --- a/SOURCES/xfsprogs-4.16-xfs_repair-handle-corrupt-log.patch +++ b/SOURCES/xfsprogs-4.16-xfs_repair-handle-corrupt-log.patch @@ -12,17 +12,17 @@ Index: xfsprogs-4.5.0/repair/phase2.c --- xfsprogs-4.5.0.orig/repair/phase2.c +++ xfsprogs-4.5.0/repair/phase2.c @@ -78,12 +78,13 @@ zero_log( - do_warn( - _("zero_log: cannot find log head/tail (xlog_find_tail=%d)\n"), - error); + do_warn( + _("zero_log: cannot find log head/tail (xlog_find_tail=%d)\n"), + error); - if (!no_modify && !zap_log) + if (!no_modify && !zap_log) { - do_warn(_( + do_warn(_( "ERROR: The log head and/or tail cannot be discovered. Attempt to mount the\n" "filesystem to replay the log or use the -L option to destroy the log and\n" "attempt a repair.\n")); - exit(2); + exit(2); + } - } else { - if (verbose) { - do_log( + } else { + if (verbose) { + do_log( diff --git a/SOURCES/xfsprogs-4.17.0-xfs_io-add-label-command.patch b/SOURCES/xfsprogs-4.17.0-xfs_io-add-label-command.patch new file mode 100644 index 00000000..b03b0894 --- /dev/null +++ b/SOURCES/xfsprogs-4.17.0-xfs_io-add-label-command.patch @@ -0,0 +1,194 @@ +From cfa10b0f972005b38ed294bca66cebf2f65298ec Mon Sep 17 00:00:00 2001 +From: Eric Sandeen +Date: Thu, 24 May 2018 14:48:33 -0500 +Subject: [PATCH] xfs_io: add label command + +This adds an online get/set/clear label command to xfs_io. + +Signed-off-by: Eric Sandeen +Reviewed-by: Dave Chinner +Signed-off-by: Eric Sandeen +--- + io/Makefile | 6 +-- + io/init.c | 1 + + io/io.h | 1 + + io/label.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + man/man8/xfs_io.8 | 13 +++++++ + 5 files changed, 126 insertions(+), 3 deletions(-) + create mode 100644 io/label.c + +Index: xfsprogs-4.5.0/io/Makefile +=================================================================== +--- xfsprogs-4.5.0.orig/io/Makefile ++++ xfsprogs-4.5.0/io/Makefile +@@ -9,7 +9,7 @@ LTCOMMAND = xfs_io + LSRCFILES = xfs_bmap.sh xfs_freeze.sh xfs_mkfile.sh + HFILES = init.h io.h + CFILES = init.c \ +- attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c link.c \ ++ attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c label.c link.c \ + mmap.c open.c parent.c pread.c prealloc.c pwrite.c seek.c shutdown.c \ + sync.c truncate.c reflink.c + +Index: xfsprogs-4.5.0/io/init.c +=================================================================== +--- xfsprogs-4.5.0.orig/io/init.c ++++ xfsprogs-4.5.0/io/init.c +@@ -65,6 +65,7 @@ init_commands(void) + help_init(); + imap_init(); + inject_init(); ++ label_init(); + seek_init(); + madvise_init(); + mincore_init(); +Index: xfsprogs-4.5.0/io/io.h +=================================================================== +--- xfsprogs-4.5.0.orig/io/io.h ++++ xfsprogs-4.5.0/io/io.h +@@ -102,6 +102,7 @@ extern void getrusage_init(void); + extern void help_init(void); + extern void imap_init(void); + extern void inject_init(void); ++extern void label_init(void); + extern void mmap_init(void); + extern void open_init(void); + extern void parent_init(void); +Index: xfsprogs-4.5.0/io/label.c +=================================================================== +--- /dev/null ++++ xfsprogs-4.5.0/io/label.c +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2018 Red Hat, Inc. ++ * All Rights Reserved. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it would be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++#include ++#include "platform_defs.h" ++#include "libxfs.h" ++#include "path.h" ++#include "command.h" ++#include "init.h" ++#include "io.h" ++ ++#ifndef FS_IOC_GETFSLABEL ++/* Max chars for the interface; fs limits may differ */ ++#define FSLABEL_MAX 256 ++#define FS_IOC_GETFSLABEL _IOR(0x94, 49, char[FSLABEL_MAX]) ++#define FS_IOC_SETFSLABEL _IOW(0x94, 50, char[FSLABEL_MAX]) ++#endif ++ ++static cmdinfo_t label_cmd; ++ ++static void ++label_help(void) ++{ ++ printf(_( ++"\n" ++" Manipulate or query the filesystem label while mounted.\n" ++"\n" ++" With no arguments, displays the current filesystem label.\n" ++" -s newlabel -- set the filesystem label to newlabel\n" ++" -c -- clear the filesystem label (sets to NULL string)\n" ++"\n")); ++} ++ ++static int ++label_f( ++ int argc, ++ char **argv) ++{ ++ int c; ++ int error; ++ char label[FSLABEL_MAX]; ++ ++ if (argc == 1) { ++ memset(label, 0, sizeof(label)); ++ error = ioctl(file->fd, FS_IOC_GETFSLABEL, &label); ++ goto out; ++ } ++ ++ while ((c = getopt(argc, argv, "cs:")) != EOF) { ++ switch (c) { ++ case 'c': ++ label[0] = '\0'; ++ break; ++ case 's': ++ strncpy(label, optarg, sizeof(label)); ++ break; ++ default: ++ return command_usage(&label_cmd); ++ } ++ } ++ ++ /* Check for trailing arguments */ ++ if (argc != optind) ++ return command_usage(&label_cmd); ++ ++ error = ioctl(file->fd, FS_IOC_SETFSLABEL, label); ++out: ++ if (error) { ++ perror("label"); ++ exitcode = 1; ++ } else { ++ printf("label = \"%s\"\n", label); ++ } ++ ++ return 0; ++} ++ ++void ++label_init(void) ++{ ++ label_cmd.name = "label"; ++ label_cmd.cfunc = label_f; ++ label_cmd.argmin = 0; ++ label_cmd.argmax = 3; ++ label_cmd.args = _("[-s label|-c]"); ++ label_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; ++ label_cmd.oneline = ++ _("query, set, or clear the filesystem label while mounted"); ++ label_cmd.help = label_help; ++ ++ add_command(&label_cmd); ++} +Index: xfsprogs-4.5.0/man/man8/xfs_io.8 +=================================================================== +--- xfsprogs-4.5.0.orig/man/man8/xfs_io.8 ++++ xfsprogs-4.5.0/man/man8/xfs_io.8 +@@ -812,7 +812,19 @@ verbose output will be printed. + .IP + .B [NOTE: Not currently operational on Linux.] + .PD +- ++.TP ++.BI "label" " " "[ -c | -s " label " ] " ++On filesystems that support online label manipulation, get, set, or clear the ++filesystem label. With no options, print the current filesystem label. The ++.B \-c ++option clears the filesystem label by setting it to the null string. The ++.BI "\-s " label ++option sets the filesystem label to ++.IR label . ++If the label is longer than the filesystem will accept, ++.B xfs_io ++will print an error message. XFS filesystem labels can be at most 12 ++characters long. + .SH SEE ALSO + .BR mkfs.xfs (8), + .BR xfsctl (3), diff --git a/SOURCES/xfsprogs-4.17.0-xfsprogs-be-careful-about-what-we-stat-in-platform_c.patch b/SOURCES/xfsprogs-4.17.0-xfsprogs-be-careful-about-what-we-stat-in-platform_c.patch new file mode 100644 index 00000000..d8cff4bf --- /dev/null +++ b/SOURCES/xfsprogs-4.17.0-xfsprogs-be-careful-about-what-we-stat-in-platform_c.patch @@ -0,0 +1,64 @@ +From 98c4a01c21b99b13d8aaa406ab15b7424ee5ef9f Mon Sep 17 00:00:00 2001 +From: Eric Sandeen +Date: Wed, 23 May 2018 16:30:49 -0500 +Subject: [PATCH] xfsprogs: be careful about what we stat in + platform_check_mount + +After we lost ustat(2) in commit 4e7a824, we ended up with a slightly +bonkers method to determine if our target block device was mounted: +it goes through every entry returned by getmntent and stats the dir +to see if its underlying device matches ours. + +Unfortunately that dir might be a hung nfs server and sadness ensues. + +So just do a really simple sanity check before we try to stat the +mountpoint: does its device start with a / ? If not, skip it. + +Fixes: 4e7a824 ("libxfs/linux.c: Replace use of ustat by stat") +Signed-off-by: Eric Sandeen +Reviewed-by: Allison Henderson +Signed-off-by: Eric Sandeen +--- + libfrog/linux.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +Index: xfsprogs-4.5.0/libxfs/linux.c +=================================================================== +--- xfsprogs-4.5.0.orig/libxfs/linux.c ++++ xfsprogs-4.5.0/libxfs/linux.c +@@ -68,7 +68,17 @@ platform_check_ismounted(char *name, cha + progname, name); + return 1; + } ++ /* ++ * This whole business is to work out if our block device is mounted ++ * after we lost ustat(2), see: ++ * 4e7a824 libxfs/linux.c: Replace use of ustat by stat ++ * We don't really want to stat every single mounted directory, ++ * as that may include tmpfs, cgroups, procfs or - worst - hung nfs ++ * servers. So first, a simple check: does the "dev" start with "/" ? ++ */ + while ((mnt = getmntent(f)) != NULL) { ++ if (mnt->mnt_fsname[0] != '/') ++ continue; + if (stat64(mnt->mnt_dir, &mst) < 0) + continue; + if (mst.st_dev != s->st_rdev) +@@ -99,7 +109,17 @@ platform_check_iswritable(char *name, ch + "mounted filesystem\n"), progname, name); + return fatal; + } ++ /* ++ * This whole business is to work out if our block device is mounted ++ * after we lost ustat(2), see: ++ * 4e7a824 libxfs/linux.c: Replace use of ustat by stat ++ * We don't really want to stat every single mounted directory, ++ * as that may include tmpfs, cgroups, procfs or - worst - hung nfs ++ * servers. So first, a simple check: does the "dev" start with "/" ? ++ */ + while ((mnt = getmntent(f)) != NULL) { ++ if (mnt->mnt_fsname[0] != '/') ++ continue; + if (stat64(mnt->mnt_fsname, &mst) < 0) + continue; + if ((mst.st_mode & S_IFMT) != S_IFBLK) diff --git a/SOURCES/xfsprogs-4.18-repair-root-parent.patch b/SOURCES/xfsprogs-4.18-repair-root-parent.patch new file mode 100644 index 00000000..d71e5740 --- /dev/null +++ b/SOURCES/xfsprogs-4.18-repair-root-parent.patch @@ -0,0 +1,51 @@ +xfs_repair: Fix root inode's parent when it's bogus for sf directory + +Currently when root inode is in short-form and its parent ino +has an invalid value, process_sf_dir2() ends up not fixing it, +because if verify_inum() fails we never get to the next case which +would fix the root inode's parent pointer. + +This behavior triggers the following assert on process_dir2(): + + ASSERT((ino != mp->m_sb.sb_rootino && ino != *parent) || + (ino == mp->m_sb.sb_rootino && + (ino == *parent || need_root_dotdot == 1))); + +This patch fixes this behavior by making sure we always properly +handle rootino parent pointer in process_sf_dir2() + +Signed-off-by: Marco Benatto +Reviewed-by: Eric Sandeen + +--- + +Note: reviewed but not yet merged upstream + + repair/dir2.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/repair/dir2.c b/repair/dir2.c +index e162d2b..225f926 100644 +--- a/repair/dir2.c ++++ b/repair/dir2.c +@@ -495,8 +495,10 @@ _("corrected entry offsets in directory %" PRIu64 "\n"), + + /* + * if parent entry is bogus, null it out. we'll fix it later . ++ * If the validation fails for the root inode we fix it in ++ * the next else case. + */ +- if (verify_inum(mp, *parent)) { ++ if (verify_inum(mp, *parent) && ino != mp->m_sb.sb_rootino) { + + do_warn( + _("bogus .. inode number (%" PRIu64 ") in directory inode %" PRIu64 ", "), +-- +2.9.5 + +-- +To unsubscribe from this list: send the line "unsubscribe linux-xfs" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html + + diff --git a/SOURCES/xfsprogs-4.5.0-change-mkfs-options.patch b/SOURCES/xfsprogs-4.5.0-change-mkfs-options.patch index b435296b..2b03aec2 100644 --- a/SOURCES/xfsprogs-4.5.0-change-mkfs-options.patch +++ b/SOURCES/xfsprogs-4.5.0-change-mkfs-options.patch @@ -20,7 +20,7 @@ Index: xfsprogs-4.5.0/man/man8/mkfs.xfs.8 .B \-m crc=0 is used, the free inode btree feature is not supported and is disabled. .TP -@@ -419,21 +420,8 @@ If the value is omitted, 1 is assumed. +@@ -419,21 +420,8 @@ If the value is omitted, 1 is assumed. in release version 3.2.0.) .TP .BI sparse[= value ] @@ -49,45 +49,45 @@ Index: xfsprogs-4.5.0/mkfs/xfs_mkfs.c --- xfsprogs-4.5.0.orig/mkfs/xfs_mkfs.c +++ xfsprogs-4.5.0/mkfs/xfs_mkfs.c @@ -105,8 +105,6 @@ char *iopts[] = { - "attr", + "attr", #define I_PROJID32BIT 6 - "projid32bit", + "projid32bit", -#define I_SPINODES 7 - "sparse", - NULL + NULL }; - + @@ -1019,7 +1017,7 @@ main( - worst_freelist = 0; - lazy_sb_counters = 1; - crcs_enabled = 1; + worst_freelist = 0; + lazy_sb_counters = 1; + crcs_enabled = 1; - finobt = 1; + finobt = 0; - finobtflag = false; - spinodes = 0; - memset(&fsx, 0, sizeof(fsx)); + finobtflag = false; + spinodes = 0; + memset(&fsx, 0, sizeof(fsx)); @@ -1343,6 +1341,7 @@ main( - illegal(value, "i projid32bit"); - projid16bit = c ? 0 : 1; - break; + illegal(value, "i projid32bit"); + projid16bit = c ? 0 : 1; + break; +#if 0 - case I_SPINODES: - if (!value || *value == '\0') - value = "1"; + case I_SPINODES: + if (!value || *value == '\0') + value = "1"; @@ -1350,6 +1349,7 @@ main( - if (spinodes < 0 || spinodes > 1) - illegal(value, "i spinodes"); - break; + if (spinodes < 0 || spinodes > 1) + illegal(value, "i spinodes"); + break; +#endif - default: - unknown('i', value); - } + default: + unknown('i', value); + } @@ -3213,7 +3213,7 @@ usage( void ) - sectlog=n|sectsize=num\n\ + sectlog=n|sectsize=num\n\ /* force overwrite */ [-f]\n\ /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\ - projid32bit=0|1,sparse=0|1]\n\ + projid32bit=0|1]\n\ /* no discard */ [-K]\n\ /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n\n\ - sunit=value|su=num,sectlog=n|sectsize=num,\n\ + sunit=value|su=num,sectlog=n|sectsize=num,\n\ diff --git a/SOURCES/xfsprogs-4.5.0-fix-headers.patch b/SOURCES/xfsprogs-4.5.0-fix-headers.patch index 2559bd3c..ff795ed7 100644 --- a/SOURCES/xfsprogs-4.5.0-fix-headers.patch +++ b/SOURCES/xfsprogs-4.5.0-fix-headers.patch @@ -25,7 +25,7 @@ index b9622ba..1f17e1c 100644 @@ -542,12 +542,8 @@ typedef struct xfs_swapext #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ - + -/* XFS_IOC_FREEZE -- FIFREEZE 119 */ -/* XFS_IOC_THAW -- FITHAW 120 */ -#ifndef FIFREEZE @@ -34,7 +34,7 @@ index b9622ba..1f17e1c 100644 -#endif +#define XFS_IOC_FREEZE _IOWR('X', 119, int) /* aka FIFREEZE */ +#define XFS_IOC_THAW _IOWR('X', 120, int) /* aka FITHAW */ - + #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) @@ -47,6 +47,6 @@ index cc0f70c..0c616f4 100644 #include #include +#include /* fsxattr defintion for new kernels */ - + static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) { diff --git a/SOURCES/xfsprogs-4.5.0-revert-AGFL-pack.patch b/SOURCES/xfsprogs-4.5.0-revert-AGFL-pack.patch index 7ffd192d..36afee3d 100644 --- a/SOURCES/xfsprogs-4.5.0-revert-AGFL-pack.patch +++ b/SOURCES/xfsprogs-4.5.0-revert-AGFL-pack.patch @@ -2,10 +2,11 @@ reverted: --- b/libxfs/xfs_format.h +++ a/libxfs/xfs_format.h @@ -787,7 +787,7 @@ - __be64 agfl_lsn; - __be32 agfl_crc; - __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ +} xfs_agfl_t; -} __attribute__((packed)) xfs_agfl_t; - + #define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc) + diff --git a/SOURCES/xfsprogs-4.5.0-revert-xfs_db-sparse-inodes.patch b/SOURCES/xfsprogs-4.5.0-revert-xfs_db-sparse-inodes.patch index 46b68416..49e0b5aa 100644 --- a/SOURCES/xfsprogs-4.5.0-revert-xfs_db-sparse-inodes.patch +++ b/SOURCES/xfsprogs-4.5.0-revert-xfs_db-sparse-inodes.patch @@ -3,13 +3,13 @@ Author: Brian Foster Date: Tue Jun 21 12:58:57 2016 +1000 xfs_db: Revert "xfs_db: make check work for sparse inodes" - + This reverts commit bb2f98b78f20f4abbfbbd442162d9f535c84888a which introduced support for multi-record inode chunks in xfs_db/xfs_check. However, it doesn't currently handle filesystems with multi-record inode chunks correctly. For example, do the following on a 64k page size arch such as ppc64: - + # mkfs.xfs -f -b size=64k # xfs_db -c check bad magic number 0 for inode 1152 @@ -19,15 +19,15 @@ Date: Tue Jun 21 12:58:57 2016 +1000 bad magic number 0 for inode 1156 bad magic number 0 for inode 1157 ... - + This boils down to a regression in the inode record processing code (scanfunc_ino()) in db/check.c. Specifically, the cblocks value can end up being zero after it is shifted by mp->m_sb.sb_inopblog (i.e., 64 >> 7 == 0 for an -isize=512 -bsize=64k fs). - + Fixing this problem is easier to do from scratch, so revert the oringial commit first. - + Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -37,9 +37,9 @@ index 0871ed7..750ecc1 100644 --- a/db/check.c +++ b/db/check.c @@ -4311,51 +4311,6 @@ scanfunc_cnt( - scan_sbtree(agf, be32_to_cpu(pp[i]), level, 0, scanfunc_cnt, TYP_CNTBT); + scan_sbtree(agf, be32_to_cpu(pp[i]), level, 0, scanfunc_cnt, TYP_CNTBT); } - + -static bool -ino_issparse( - struct xfs_inobt_rec *rp, @@ -87,11 +87,11 @@ index 0871ed7..750ecc1 100644 - static void scanfunc_ino( - struct xfs_btree_block *block, + struct xfs_btree_block *block, @@ -4373,13 +4328,6 @@ scanfunc_ino( - int off; - xfs_inobt_ptr_t *pp; - xfs_inobt_rec_t *rp; + int off; + xfs_inobt_ptr_t *pp; + xfs_inobt_rec_t *rp; - bool sparse, crc; - int inodes_per_chunk; - int freecount; @@ -99,21 +99,21 @@ index 0871ed7..750ecc1 100644 - __u16 holemask; - xfs_agino_t rino; - xfs_extlen_t cblocks; - - if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC && - be32_to_cpu(block->bb_magic) != XFS_IBT_CRC_MAGIC) { + + if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_IBT_CRC_MAGIC) { @@ -4407,111 +4355,59 @@ scanfunc_ino( - return; - } - rp = XFS_INOBT_REC_ADDR(mp, block, 1); + return; + } + rp = XFS_INOBT_REC_ADDR(mp, block, 1); - sparse = xfs_sb_version_hassparseinodes(&mp->m_sb); - crc = xfs_sb_version_hascrc(&mp->m_sb); - for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { - nfree = 0; - - /* First let's look at the inode chunk alignment */ - agino = be32_to_cpu(rp[i].ir_startino); - off = XFS_INO_TO_OFFSET(mp, agino); + agino = be32_to_cpu(rp[i].ir_startino); + off = XFS_INO_TO_OFFSET(mp, agino); - if (off == 0 && - (sbversion & XFS_SB_VERSION_ALIGNBIT) && - mp->m_sb.sb_inoalignmt && @@ -131,13 +131,13 @@ index 0871ed7..750ecc1 100644 + mp->m_sb.sb_inoalignmt && + (XFS_INO_TO_AGBNO(mp, agino) % + mp->m_sb.sb_inoalignmt)) - sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + set_dbmap(seqno, XFS_AGINO_TO_AGBNO(mp, agino), + (xfs_extlen_t)MAX(1, + XFS_INODES_PER_CHUNK >> + mp->m_sb.sb_inopblog), + DBM_INODE, seqno, bno); - } + } - - /* Move on to examining the inode chunks */ - if (sparse) { @@ -178,7 +178,7 @@ index 0871ed7..750ecc1 100644 + if (iocur_top->data == NULL) { + if (!sflag) + dbprintf(_("can't read inode block " - "%u/%u\n"), + "%u/%u\n"), - seqno, rino, seqno, bno); - error++; - } @@ -218,7 +218,7 @@ index 0871ed7..750ecc1 100644 + seqno, + XFS_AGINO_TO_AGBNO(mp, agino)); + error++; - pop_cur(); + pop_cur(); - - startidx = find_zero_ino_bit(holemask, endidx); - endidx = find_one_ino_bit(holemask, startidx); @@ -240,41 +240,41 @@ index 0871ed7..750ecc1 100644 + isfree); + } + if (nfree != be32_to_cpu(rp[i].ir_u.f.ir_freecount)) { - if (!sflag) - dbprintf(_("ir_freecount/free mismatch, " - "inode chunk %u/%u, freecount " - "%d nfree %d\n"), - seqno, agino, + if (!sflag) + dbprintf(_("ir_freecount/free mismatch, " + "inode chunk %u/%u, freecount " + "%d nfree %d\n"), + seqno, agino, - freecount, nfree); + be32_to_cpu(rp[i].ir_u.f.ir_freecount), nfree); - error++; - } + error++; + } + pop_cur(); - } - return; - } + } + return; + } @@ -4543,11 +4439,6 @@ scanfunc_fino( - int off; - xfs_inobt_ptr_t *pp; - struct xfs_inobt_rec *rp; + int off; + xfs_inobt_ptr_t *pp; + struct xfs_inobt_rec *rp; - bool sparse, crc; - int startidx, endidx; - __u16 holemask; - xfs_agino_t rino; - xfs_extlen_t cblocks; - - if (be32_to_cpu(block->bb_magic) != XFS_FIBT_MAGIC && - be32_to_cpu(block->bb_magic) != XFS_FIBT_CRC_MAGIC) { + + if (be32_to_cpu(block->bb_magic) != XFS_FIBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_FIBT_CRC_MAGIC) { @@ -4575,63 +4466,21 @@ scanfunc_fino( - return; - } - rp = XFS_INOBT_REC_ADDR(mp, block, 1); + return; + } + rp = XFS_INOBT_REC_ADDR(mp, block, 1); - sparse = xfs_sb_version_hassparseinodes(&mp->m_sb); - crc = xfs_sb_version_hascrc(&mp->m_sb); - for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { - /* First let's look at the inode chunk alignment */ - agino = be32_to_cpu(rp[i].ir_startino); - off = XFS_INO_TO_OFFSET(mp, agino); + agino = be32_to_cpu(rp[i].ir_startino); + off = XFS_INO_TO_OFFSET(mp, agino); - if (off == 0 && - (sbversion & XFS_SB_VERSION_ALIGNBIT) && - mp->m_sb.sb_inoalignmt && @@ -292,13 +292,13 @@ index 0871ed7..750ecc1 100644 + mp->m_sb.sb_inoalignmt && + (XFS_INO_TO_AGBNO(mp, agino) % + mp->m_sb.sb_inoalignmt)) - sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + check_set_dbmap(seqno, XFS_AGINO_TO_AGBNO(mp, agino), + (xfs_extlen_t)MAX(1, + XFS_INODES_PER_CHUNK >> + mp->m_sb.sb_inopblog), + DBM_INODE, DBM_INODE, seqno, bno); - } + } - - /* Move on to examining the inode chunks */ - if (sparse) { @@ -336,6 +336,6 @@ index 0871ed7..750ecc1 100644 - startidx = find_zero_ino_bit(holemask, endidx); - endidx = find_one_ino_bit(holemask, startidx); - } while (endidx < XFS_INODES_PER_CHUNK); - } - return; - } + } + return; + } diff --git a/SOURCES/xfsprogs-4.5.0-xfs_repair-exit-value-memory.patch b/SOURCES/xfsprogs-4.5.0-xfs_repair-exit-value-memory.patch index 48c174cb..9ac9dcef 100644 --- a/SOURCES/xfsprogs-4.5.0-xfs_repair-exit-value-memory.patch +++ b/SOURCES/xfsprogs-4.5.0-xfs_repair-exit-value-memory.patch @@ -28,29 +28,31 @@ index 9d91f2d..bbf0edc 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -851,16 +851,16 @@ main(int argc, char **argv) - "with the -m option. Please increase it to at least %lu.\n"), - mem_used / 1024); - } + "with the -m option. Please increase it to at least %lu.\n"), + mem_used / 1024); + } - do_warn( + do_log( - _("Memory available for repair (%luMB) may not be sufficient.\n" - "At least %luMB is needed to repair this filesystem efficiently\n" - "If repair fails due to lack of memory, please\n"), - max_mem / 1024, mem_used / 1024); - if (do_prefetch) + _("Memory available for repair (%luMB) may not be sufficient.\n" + "At least %luMB is needed to repair this filesystem efficiently\n" + "If repair fails due to lack of memory, please\n"), + max_mem / 1024, mem_used / 1024); + if (do_prefetch) - do_warn( + do_log( - _("turn prefetching off (-P) to reduce the memory footprint.\n")); - else + _("turn prefetching off (-P) to reduce the memory footprint.\n")); + else - do_warn( + do_log( - _("increase system RAM and/or swap space to at least %luMB.\n"), - mem_used * 2 / 1024); - --- + _("increase system RAM and/or swap space to at least %luMB.\n"), + mem_used * 2 / 1024); + +-- 2.5.5 _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs + + diff --git a/SOURCES/xfsprogs-4.5.0-xfs_repair-quota-inodes.patch b/SOURCES/xfsprogs-4.5.0-xfs_repair-quota-inodes.patch index 01d62e63..be8e561b 100644 --- a/SOURCES/xfsprogs-4.5.0-xfs_repair-quota-inodes.patch +++ b/SOURCES/xfsprogs-4.5.0-xfs_repair-quota-inodes.patch @@ -36,58 +36,60 @@ index 45db6ae..44f3e3e 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -316,13 +316,16 @@ xfs_sb_quota_from_disk(struct xfs_sb *sbp) - XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; - sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); - + XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; + sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); + - if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { + if (sbp->sb_qflags & XFS_PQUOTA_ACCT && + sbp->sb_gquotino != NULLFSINO) { - /* - * In older version of superblock, on-disk superblock only - * has sb_gquotino, and in-core superblock has both sb_gquotino - * and sb_pquotino. But, only one of them is supported at any - * point of time. So, if PQUOTA is set in disk superblock, + /* + * In older version of superblock, on-disk superblock only + * has sb_gquotino, and in-core superblock has both sb_gquotino + * and sb_pquotino. But, only one of them is supported at any + * point of time. So, if PQUOTA is set in disk superblock, - * copy over sb_gquotino to sb_pquotino. + * copy over sb_gquotino to sb_pquotino. The NULLFSINO test + * above is to make sure we don't do this twice and wipe them + * both out! - */ - sbp->sb_pquotino = sbp->sb_gquotino; - sbp->sb_gquotino = NULLFSINO; + */ + sbp->sb_pquotino = sbp->sb_gquotino; + sbp->sb_gquotino = NULLFSINO; diff --git a/repair/sb.c b/repair/sb.c index 3965953..8087242 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -155,7 +155,6 @@ __find_secondary_sb( - for (i = 0; !done && i < bsize; i += BBSIZE) { - c_bufsb = (char *)sb + i; - libxfs_sb_from_disk(&bufsb, (xfs_dsb_t *)c_bufsb); + for (i = 0; !done && i < bsize; i += BBSIZE) { + c_bufsb = (char *)sb + i; + libxfs_sb_from_disk(&bufsb, (xfs_dsb_t *)c_bufsb); - libxfs_sb_quota_from_disk(&bufsb); - - if (verify_sb(c_bufsb, &bufsb, 0) != XR_OK) - continue; + + if (verify_sb(c_bufsb, &bufsb, 0) != XR_OK) + continue; @@ -568,7 +567,6 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) - do_error("%s\n", strerror(error)); - } - libxfs_sb_from_disk(sbp, buf); + do_error("%s\n", strerror(error)); + } + libxfs_sb_from_disk(sbp, buf); - libxfs_sb_quota_from_disk(sbp); - - rval = verify_sb((char *)buf, sbp, agno == 0); - free(buf); + + rval = verify_sb((char *)buf, sbp, agno == 0); + free(buf); diff --git a/repair/scan.c b/repair/scan.c index 964ff06..366ce16 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1622,7 +1622,6 @@ scan_ag( - goto out_free_sb; - } - libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); + goto out_free_sb; + } + libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); - libxfs_sb_quota_from_disk(sb); - - agfbuf = libxfs_readbuf(mp->m_dev, - XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), + + agfbuf = libxfs_readbuf(mp->m_dev, + XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs + + diff --git a/SOURCES/xfsprogs-4.5.0-xfs_repair-rtino-version.patch b/SOURCES/xfsprogs-4.5.0-xfs_repair-rtino-version.patch index 1fdff4a0..ec559841 100644 --- a/SOURCES/xfsprogs-4.5.0-xfs_repair-rtino-version.patch +++ b/SOURCES/xfsprogs-4.5.0-xfs_repair-rtino-version.patch @@ -3,27 +3,27 @@ Author: Eric Sandeen Date: Tue Jun 21 12:55:15 2016 +1000 xfs_repair: set rsumino version to 2 - + If we run xfs/033 with "-m crc=0", the test fails with a repair output difference: - + Phase 7 - verify and correct link counts... +resetting inode INO nlinks from 0 to 1 done - + This is because when we zero out the realtime summary inode and rebuild it, we set its version to 1, then set its ip->i_d.di_nlink to 1. This is a little odd, because v1 inodes store their link count in di_onlink... - + Then, later in repair we call xfs_inode_from_disk(), which sees the version one inode, and converts it to version 2 in part by copying di_onlink to di_nlink. But we never *set* di_onlink, so di_nlink gets reset to zero, and this error is discovered later in repair. - + Interestingly, mk_rbmino() was changed in 138659f1 to set version 2; it looks like mk_rsumino was just missed. - + Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -33,20 +33,20 @@ Index: xfsprogs-4.5.0/repair/phase6.c --- xfsprogs-4.5.0.orig/repair/phase6.c +++ xfsprogs-4.5.0/repair/phase6.c @@ -507,7 +507,7 @@ mk_rbmino(xfs_mount_t *mp) - error); - } - + error); + } + - vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 2; - memset(&ip->i_d, 0, xfs_icdinode_size(vers)); - - ip->i_d.di_magic = XFS_DINODE_MAGIC; + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); + + ip->i_d.di_magic = XFS_DINODE_MAGIC; @@ -766,7 +766,7 @@ mk_rsumino(xfs_mount_t *mp) - error); - } - + error); + } + - vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + vers = xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 2; - memset(&ip->i_d, 0, xfs_icdinode_size(vers)); - - ip->i_d.di_magic = XFS_DINODE_MAGIC; + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); + + ip->i_d.di_magic = XFS_DINODE_MAGIC; diff --git a/SOURCES/xfsprogs-4.7.0-defang-frag.patch b/SOURCES/xfsprogs-4.7.0-defang-frag.patch index 9b41ebed..edf75605 100644 --- a/SOURCES/xfsprogs-4.7.0-defang-frag.patch +++ b/SOURCES/xfsprogs-4.7.0-defang-frag.patch @@ -3,16 +3,16 @@ Author: Eric Sandeen Date: Mon May 30 10:35:56 2016 +1000 xfs_db: defang frag command - + Too many people freak out about this fictitious "fragmentation factor." As shown in the fact, it is largely meaningless, because the number approaches 100% extremely quickly for just a few extents per file. - + I thought about removing it altogether, but perhaps a note about its uselessness, and a more soothing metric (avg extents per file) might be useful. - + Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner @@ -22,12 +22,13 @@ Index: xfsprogs-4.5.0/db/frag.c --- xfsprogs-4.5.0.orig/db/frag.c +++ xfsprogs-4.5.0/db/frag.c @@ -172,6 +172,10 @@ frag_f( - answer = 0.0; - dbprintf(_("actual %llu, ideal %llu, fragmentation factor %.2f%%\n"), - extcount_actual, extcount_ideal, answer); + answer = 0.0; + dbprintf(_("actual %llu, ideal %llu, fragmentation factor %.2f%%\n"), + extcount_actual, extcount_ideal, answer); + dbprintf(_("Note, this number is largely meaningless.\n")); + answer = (double)extcount_actual / (double)extcount_ideal; + dbprintf(_("Files on this filesystem average %.2f extents per file\n"), + answer); - return 0; + return 0; } + diff --git a/SOURCES/xfsprogs-4.7.0-fix-agf-limit-errors.patch b/SOURCES/xfsprogs-4.7.0-fix-agf-limit-errors.patch index 0b8c7ae4..1273d562 100644 --- a/SOURCES/xfsprogs-4.7.0-fix-agf-limit-errors.patch +++ b/SOURCES/xfsprogs-4.7.0-fix-agf-limit-errors.patch @@ -3,16 +3,16 @@ Author: Eric Sandeen Date: Tue May 10 17:16:06 2016 +1000 xfs_repair: fix agf limit error messages - + Today we see errors like: - + "fllast 118 in agf 94 too large (max = 118)" - + which makes no sense. - + If we are erroring on X >= Y, Y is clearly not the maximum allowable value. - + Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -22,20 +22,20 @@ Index: xfsprogs-4.5.0/repair/agheader.c --- xfsprogs-4.5.0.orig/repair/agheader.c +++ xfsprogs-4.5.0/repair/agheader.c @@ -94,7 +94,7 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_ - if (be32_to_cpu(agf->agf_flfirst) >= XFS_AGFL_SIZE(mp)) { - do_warn(_("flfirst %d in agf %d too large (max = %zu)\n"), - be32_to_cpu(agf->agf_flfirst), + if (be32_to_cpu(agf->agf_flfirst) >= XFS_AGFL_SIZE(mp)) { + do_warn(_("flfirst %d in agf %d too large (max = %zu)\n"), + be32_to_cpu(agf->agf_flfirst), - i, XFS_AGFL_SIZE(mp)); + i, XFS_AGFL_SIZE(mp) - 1); - if (!no_modify) - agf->agf_flfirst = cpu_to_be32(0); - } + if (!no_modify) + agf->agf_flfirst = cpu_to_be32(0); + } @@ -102,7 +102,7 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_ - if (be32_to_cpu(agf->agf_fllast) >= XFS_AGFL_SIZE(mp)) { - do_warn(_("fllast %d in agf %d too large (max = %zu)\n"), - be32_to_cpu(agf->agf_fllast), + if (be32_to_cpu(agf->agf_fllast) >= XFS_AGFL_SIZE(mp)) { + do_warn(_("fllast %d in agf %d too large (max = %zu)\n"), + be32_to_cpu(agf->agf_fllast), - i, XFS_AGFL_SIZE(mp)); + i, XFS_AGFL_SIZE(mp) - 1); - if (!no_modify) - agf->agf_fllast = cpu_to_be32(0); - } + if (!no_modify) + agf->agf_fllast = cpu_to_be32(0); + } diff --git a/SOURCES/xfsprogs-4.7.0-quota-fixes.patch b/SOURCES/xfsprogs-4.7.0-quota-fixes.patch index 24562cb0..f85c6a58 100644 --- a/SOURCES/xfsprogs-4.7.0-quota-fixes.patch +++ b/SOURCES/xfsprogs-4.7.0-quota-fixes.patch @@ -3,16 +3,16 @@ Author: Zorro Lang Date: Thu Aug 4 11:29:49 2016 +1000 xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails - + After XFS_GETNEXTQUOTA feature has been merged into linux kernel and xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. - + But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as "XFS_GETQUOTA: Invalid argument". That's due to kernel can't recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, the warning is helpless, xfs_quota just need to fall back. - + Signed-off-by: Zorro Lang Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -22,31 +22,31 @@ Author: Eric Sandeen Date: Fri Jun 3 11:04:15 2016 +1000 xfs_quota: only round up timer reporting > 1 day - + I was too hasty with: - + d1fe6ff xfs_quota: remove extra 30 seconds from time limit reporting - + The point of that extra 30s, turns out, was to allow the user to set a limit, query it, and get back what they just set, if it is set to more than a day. - + Without it, if we set a grace period to i.e. 3 days, and query it 1 second later, the rounding in the time_to_string function returns "2 days" not "3 days" as it did before, because we are at 2 days 23:59:59 and it essentially applies a floor() for brevity. I guess this was confusing. - + (I've run into this same conundrum on my stove digital timer; if you set it to 10m, it blinks "10" at you twice so that you know what you set, then quickly flips to 9 as it counts down). - + In some cases, however (and this is the case that prompted the prior patch), we display a full "XYZ days hh:mm:ss" - we do this if the verbose flag is set, or if the timer is less than one day. In these cases, we should not add the 30s, because we are showing full time resolution to the user. - + Reported-by: Zorro Lang Signed-off-by: Eric Sandeen Reviewed-by: Zorro Lang @@ -58,17 +58,17 @@ Author: Eric Sandeen Date: Mon May 30 12:21:31 2016 +1000 xfs_quota: check report_mount return value - + The new call to report_mount doesn't check the return value like every other caller does... - + Returning 1 means it printed something; if the terse flag is used and there is no usage, nothing gets printed. If we set the NO_HEADER_FLAG anyway, then we won't see the header for subsequent entries as we expect. - + For example, project ID 0 has no usage in this case: - + # xfs_quota -x -c "report -a" /mnt/test Project quota on /mnt/test (/dev/sdb1) Blocks @@ -76,22 +76,22 @@ Date: Mon May 30 12:21:31 2016 +1000 ---------- -------------------------------------------------- #0 0 0 0 00 [--------] project 2048 4 4 00 [--none--] - + So using the terse flag results in no header when it prints projects with usage: - + # xfs_quota -x -c "report -t -a" /mnt/test project 2048 4 4 00 [--none--] - + With this fix it prints the header as expected: - + # xfs_quota -x -c "report -t -a" /mnt/test Project quota on /mnt/test (/dev/sdb1) Blocks Project ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- project 2048 4 4 00 [--none--] - + Addresses-Coverity-Id: 1361552 Signed-off-by: Eric Sandeen Reviewed-by: Zorro Lang @@ -103,19 +103,19 @@ Author: Zorro Lang Date: Tue May 10 17:16:06 2016 +1000 xfs_quota: print quota id number if the name can't be found - + When use GETNEXTQUOTA ioctl to report project quota, it always report an unexpected quota: - + (null) 0 0 0 00 [--------] - + The ID 0 store the default quota, even if no one set default quota, it still have quota accounting, but not enforced. So GETNEXTQUOTA can find and report this undefined quota. - + From this problem, I thought if others' quota name miss, (null) will be printed too. e.g. - + # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace @@ -128,15 +128,15 @@ Date: Tue May 10 17:16:06 2016 +1000 ---------- -------------------------------------------------- root 0 0 0 00 [--------] (null) 0 307200 409600 00 [--------] - + So this problem same with above id 0's problem. To deal with this, this patch will print id number if the name can't be found. - + However, if we use the old GETQUOTA ioctl, it won't print project id 0 quota information if it's not defined. That's different with GETNEXTQUOTA. For keep consistent, this patch also print project id 0 when use old GETQUOTA. - + Signed-off-by: Zorro Lang Reviewed-by: Eric Sandeen Reviewed-by: Christoph Hellwig @@ -147,23 +147,23 @@ Author: Zorro Lang Date: Tue May 10 17:16:06 2016 +1000 xfs_quota: fully support users and groups beginning with digits - + A normal user or group name allow beginning with digits, but xfs_quota can't create a limit for that user or group. The reason is 'strtoul' function only translate digits at the beginning, it will ignore letters after digits. - + There's a commit fd537fc50eeade63bbd2a66105f39d04a011a7f5, it try to fix "xfsprogs: xfs_quota allow user or group names beginning with digits". But it doesn't effect 'limit' command, so a command likes: - + xfs_quota 'limit .... 12345678-user' xxxx - + will try to create limit for username="12345678", not "12345678-user". - + This patch will fix this problem, and a test case xfs/138 in xfstests is used to reproduce this bug. - + Signed-off-by: Zorro Lang Reviewed-by: Eric Sandeen Signed-off-by: Dave Chinner @@ -173,16 +173,16 @@ Author: Eric Sandeen Date: Wed Feb 17 17:03:02 2016 +1100 xfs: wire up Q_XGETNEXTQUOTA / get_nextdqblk - + Source kernel commit 296c24e26ee3af2dbfecb482e6bc9560bd34c455 - + Add code to allow the Q_XGETNEXTQUOTA quotactl to quickly find all active quotas by examining the quota inode, and skipping over unallocated or uninitialized regions. - + Userspace can then use this interface rather than i.e. a getpwent() loop when asked to report all active quotas. - + Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -191,46 +191,46 @@ Index: xfsprogs-4.5.0/quota/report.c --- xfsprogs-4.5.0.orig/quota/report.c +++ xfsprogs-4.5.0/quota/report.c @@ -90,8 +90,10 @@ dump_file( - else - cmd = XFS_GETQUOTA; - + else + cmd = XFS_GETQUOTA; + + /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA */ - if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { + if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { - if (errno != ENOENT && errno != ENOSYS && errno != ESRCH) + if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && + cmd == XFS_GETQUOTA) - perror("XFS_GETQUOTA"); - return 0; - } + perror("XFS_GETQUOTA"); + return 0; + } @@ -347,8 +349,10 @@ report_mount( - else - cmd = XFS_GETQUOTA; - + else + cmd = XFS_GETQUOTA; + + /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA*/ - if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { + if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { - if (errno != ENOENT && errno != ENOSYS && errno != ESRCH) + if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && + cmd == XFS_GETQUOTA) - perror("XFS_GETQUOTA"); - return 0; - } + perror("XFS_GETQUOTA"); + return 0; + } @@ -389,7 +393,11 @@ report_mount( - name = p->pr_name; - } - } + name = p->pr_name; + } + } - fprintf(fp, "%-10s", name); + /* If no name is found, print the id #num instead of (null) */ + if (name != NULL) + fprintf(fp, "%-10s", name); + else + fprintf(fp, "#%-9u", d.d_id); - } - - if (form & XFS_BLOCK_QUOTA) { + } + + if (form & XFS_BLOCK_QUOTA) { @@ -571,6 +579,16 @@ report_project_mount( - id = oid + 1; - } - } else { + id = oid + 1; + } + } else { + if (!getprprid(0)) { + /* + * Print default project quota, even if projid 0 @@ -241,17 +241,17 @@ Index: xfsprogs-4.5.0/quota/report.c + flags |= NO_HEADER_FLAG; + } + - setprent(); - while ((p = getprent()) != NULL) { - if (report_mount(fp, p->pr_prid, p->pr_name, NULL, + setprent(); + while ((p = getprent()) != NULL) { + if (report_mount(fp, p->pr_prid, p->pr_name, NULL, Index: xfsprogs-4.5.0/quota/util.c =================================================================== --- xfsprogs-4.5.0.orig/quota/util.c +++ xfsprogs-4.5.0/quota/util.c @@ -43,6 +43,18 @@ time_to_string( - timer = MAX(origin - now, 0); - } - + timer = MAX(origin - now, 0); + } + + /* + * If we are in verbose mode, or if less than a day remains, we + * will show "X days hh:mm:ss" so the user knows the exact timer status. @@ -264,9 +264,9 @@ Index: xfsprogs-4.5.0/quota/util.c + if ((timer > SECONDS_IN_A_DAY) && !(flags & VERBOSE_FLAG)) + timer += 30; /* seconds */ + - days = timer / SECONDS_IN_A_DAY; - if (days) - timer %= SECONDS_IN_A_DAY; + days = timer / SECONDS_IN_A_DAY; + if (days) + timer %= SECONDS_IN_A_DAY; Index: xfsprogs-4.5.0/man/man8/xfs_quota.8 =================================================================== --- xfsprogs-4.5.0.orig/man/man8/xfs_quota.8 @@ -287,23 +287,23 @@ Index: xfsprogs-4.5.0/libxcmd/input.c --- xfsprogs-4.5.0.orig/libxcmd/input.c +++ xfsprogs-4.5.0/libxcmd/input.c @@ -366,7 +366,7 @@ uid_from_string( - char *sp; - - uid_long = strtoul(user, &sp, 10); + char *sp; + + uid_long = strtoul(user, &sp, 10); - if (sp != user) { + if (sp != user && *sp == '\0') { - if ((uid_long == ULONG_MAX && errno == ERANGE) - || (uid_long > (uid_t)-1)) - return -1; + if ((uid_long == ULONG_MAX && errno == ERANGE) + || (uid_long > (uid_t)-1)) + return -1; @@ -387,7 +387,7 @@ gid_from_string( - char *sp; - - gid_long = strtoul(group, &sp, 10); + char *sp; + + gid_long = strtoul(group, &sp, 10); - if (sp != group) { + if (sp != group && *sp == '\0') { - if ((gid_long == ULONG_MAX && errno == ERANGE) - || (gid_long > (gid_t)-1)) - return -1; + if ((gid_long == ULONG_MAX && errno == ERANGE) + || (gid_long > (gid_t)-1)) + return -1; Index: xfsprogs-4.5.0/libxfs/xfs_quota_defs.h =================================================================== --- xfsprogs-4.5.0.orig/libxfs/xfs_quota_defs.h @@ -314,14 +314,14 @@ Index: xfsprogs-4.5.0/libxfs/xfs_quota_defs.h #define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ -#define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */ +#define XFS_DQ_FREEING 0x0010 /* dquot is being torn down */ - + #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) - + @@ -116,6 +116,7 @@ typedef __uint16_t xfs_qwarncnt_t; #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ #define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ +#define XFS_QMOPT_DQNEXT 0x0008000 /* return next dquot >= this ID */ - + /* * flags to xfs_trans_mod_dquot to indicate which field needs to be diff --git a/SOURCES/xfsprogs-4.8.0-mkfs.xfs-clarify-ftype-defaults-in-manpage.patch b/SOURCES/xfsprogs-4.8.0-mkfs.xfs-clarify-ftype-defaults-in-manpage.patch index b3f4c999..0a7f2dca 100644 --- a/SOURCES/xfsprogs-4.8.0-mkfs.xfs-clarify-ftype-defaults-in-manpage.patch +++ b/SOURCES/xfsprogs-4.8.0-mkfs.xfs-clarify-ftype-defaults-in-manpage.patch @@ -21,14 +21,14 @@ Index: xfsprogs-rhel7.5/man/man8/mkfs.xfs.8 --- xfsprogs-rhel7.5.orig/man/man8/mkfs.xfs.8 +++ xfsprogs-rhel7.5/man/man8/mkfs.xfs.8 @@ -587,13 +587,11 @@ do not need to look up the inode to dete - + The .I value -is either 0 or 1, with 1 signifiying that filetype information -will be stored in the directory structure. The default value is 0. +is either 0 or 1, with 1 signifying that filetype information +will be stored in the directory structure. The default value is 1. - + -When CRCs are enabled via -.B \-m crc=1, -the ftype functionality is always enabled. This feature can not be turned diff --git a/SOURCES/xfsprogs-4.8.0-replace-ustat.patch b/SOURCES/xfsprogs-4.8.0-replace-ustat.patch index 08cf7169..bcecfbc3 100644 --- a/SOURCES/xfsprogs-4.8.0-replace-ustat.patch +++ b/SOURCES/xfsprogs-4.8.0-replace-ustat.patch @@ -3,13 +3,13 @@ Author: Felix Janda Date: Thu Sep 8 10:22:28 2016 +1000 libxfs/linux.c: Replace use of ustat by stat - + ustat has been used to check whether a device file is mounted. The function is deprecated and not supported by uclibc and musl. Now do the check using the *mntent functions. - + Based on patch by Natanael Copa . - + Signed-off-by: Felix Janda Reviewed-by: Eric Sandeen Signed-off-by: Dave Chinner @@ -21,7 +21,7 @@ index c9f2baf..44bc1f9 100644 @@ -16,11 +16,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - + -#define ustat __kernel_ustat #include #include @@ -41,13 +41,13 @@ index c9f2baf..44bc1f9 100644 + struct stat64 st, mst; + struct mntent *mnt; + char mounts[MAXPATHLEN]; - - if (!s) { - if (stat64(block, &st) < 0) + + if (!s) { + if (stat64(block, &st) < 0) @@ -63,14 +61,27 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) - s = &st; - } - + s = &st; + } + - if (ustat(s->st_rdev, ust) >= 0) { + strcpy(mounts, (!access(PROC_MOUNTED, R_OK)) ? PROC_MOUNTED : MOUNTED); + if ((f = setmntent(mounts, "r")) == NULL) { @@ -62,16 +62,16 @@ index c9f2baf..44bc1f9 100644 + if (mst.st_dev != s->st_rdev) + continue; + - if (verbose) - fprintf(stderr, - _("%s: %s contains a mounted filesystem\n"), - progname, name); + if (verbose) + fprintf(stderr, + _("%s: %s contains a mounted filesystem\n"), + progname, name); - return 1; + break; - } + } - return 0; + endmntent(f); + return mnt != NULL; } - + int diff --git a/SOURCES/xfsprogs-4.8.0-xfs_copy-UUID.patch b/SOURCES/xfsprogs-4.8.0-xfs_copy-UUID.patch index d28c788d..7c228430 100644 --- a/SOURCES/xfsprogs-4.8.0-xfs_copy-UUID.patch +++ b/SOURCES/xfsprogs-4.8.0-xfs_copy-UUID.patch @@ -3,32 +3,32 @@ Author: Eric Sandeen Date: Fri Sep 23 09:16:52 2016 +1000 xfs_copy: Fix meta UUID handling on multiple copies - + Zorro reported that when making multiple copies of a V5 filesystem with xfs_copy while generating new UUIDs, all but the first copy were corrupt. - + Upon inspection, the corruption was related to incorrect UUIDs; the original UUID, as stamped into every metadata structure, was not preserved in the sb_meta_uuid field of the superblock on any but the first copy. - + This happened because sb_update_uuid was using the UUID present in the ag_hdr structure as the unchanging meta-uuid which is to match existing structures, but it also /updates/ that UUID with the new identifying UUID present in tcarg. So the newly-generated UUIDs moved transitively from tcarg->uuid to ag_hdr->xfs_sb->sb_uuid to ag_hdr->xfs_sb->sb_meta_uuid each time the function got called. - + Fix this by looking instead to the unchanging, original UUID present in the xfs_sb_t we are given, which reflects the original filesystem's metadata UUID, and copy /that/ UUID into each target filesystem's meta_uuid field. - + Most of this patch is changing comments and re-ordering tests to match; the functional change is to simply use the *sb rather than the *ag_hdr to identify the proper metadata UUID. - + Reported-and-tested-by: Zorro Lang Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner @@ -39,7 +39,7 @@ index 3c8998c..22ded6b 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -494,27 +494,29 @@ write_wbuf(void) - + void sb_update_uuid( - xfs_sb_t *sb, @@ -49,8 +49,8 @@ index 3c8998c..22ded6b 100644 + ag_header_t *ag_hdr, /* AG hdr to update for this copy */ + thread_args *tcarg) /* Args for this thread, with UUID */ { - /* - * If this filesystem has CRCs, the original UUID is stamped into + /* + * If this filesystem has CRCs, the original UUID is stamped into - * all metadata. If we are changing the UUID in the copy, we need - * to copy the original UUID into the meta_uuid slot and set the - * set the incompat flag if that hasn't already been done. @@ -58,22 +58,22 @@ index 3c8998c..22ded6b 100644 + * the original filesystem and we are changing the UUID in this copy, + * we must copy the original sb_uuid to the sb_meta_uuid slot and set + * the incompat flag for the feature on this copy. - */ + */ - if (!uuid_equal(&tcarg->uuid, &ag_hdr->xfs_sb->sb_uuid) && - xfs_sb_version_hascrc(sb) && !xfs_sb_version_hasmetauuid(sb)) { + if (xfs_sb_version_hascrc(sb) && !xfs_sb_version_hasmetauuid(sb) && + !uuid_equal(&tcarg->uuid, &sb->sb_uuid)) { - __be32 feat; - - feat = be32_to_cpu(ag_hdr->xfs_sb->sb_features_incompat); - feat |= XFS_SB_FEAT_INCOMPAT_META_UUID; - ag_hdr->xfs_sb->sb_features_incompat = cpu_to_be32(feat); - platform_uuid_copy(&ag_hdr->xfs_sb->sb_meta_uuid, + __be32 feat; + + feat = be32_to_cpu(ag_hdr->xfs_sb->sb_features_incompat); + feat |= XFS_SB_FEAT_INCOMPAT_META_UUID; + ag_hdr->xfs_sb->sb_features_incompat = cpu_to_be32(feat); + platform_uuid_copy(&ag_hdr->xfs_sb->sb_meta_uuid, - &ag_hdr->xfs_sb->sb_uuid); + &sb->sb_uuid); - } - + } + + /* Copy the (possibly new) fs-identifier UUID into sb_uuid */ - platform_uuid_copy(&ag_hdr->xfs_sb->sb_uuid, &tcarg->uuid); - - /* We may have changed the UUID, so update the superblock CRC */ + platform_uuid_copy(&ag_hdr->xfs_sb->sb_uuid, &tcarg->uuid); + + /* We may have changed the UUID, so update the superblock CRC */ diff --git a/SOURCES/xfsprogs-4.8.0-xfs_repair-exit-with-status-2-if-log-dirtiness-is-un.patch b/SOURCES/xfsprogs-4.8.0-xfs_repair-exit-with-status-2-if-log-dirtiness-is-un.patch index c09f22b2..26ea8123 100644 --- a/SOURCES/xfsprogs-4.8.0-xfs_repair-exit-with-status-2-if-log-dirtiness-is-un.patch +++ b/SOURCES/xfsprogs-4.8.0-xfs_repair-exit-with-status-2-if-log-dirtiness-is-un.patch @@ -21,15 +21,15 @@ Index: xfsprogs-4.5.0/repair/phase2.c --- xfsprogs-4.5.0.orig/repair/phase2.c +++ xfsprogs-4.5.0/repair/phase2.c @@ -79,10 +79,11 @@ zero_log( - _("zero_log: cannot find log head/tail (xlog_find_tail=%d)\n"), - error); - if (!no_modify && !zap_log) + _("zero_log: cannot find log head/tail (xlog_find_tail=%d)\n"), + error); + if (!no_modify && !zap_log) - do_error(_( + do_warn(_( "ERROR: The log head and/or tail cannot be discovered. Attempt to mount the\n" "filesystem to replay the log or use the -L option to destroy the log and\n" "attempt a repair.\n")); + exit(2); - } else { - if (verbose) { - do_log( + } else { + if (verbose) { + do_log( diff --git a/SOURCES/xfsprogs-4.9-xfs_io-fix-m-option.patch b/SOURCES/xfsprogs-4.9-xfs_io-fix-m-option.patch index f5e04148..10bb517c 100644 --- a/SOURCES/xfsprogs-4.9-xfs_io-fix-m-option.patch +++ b/SOURCES/xfsprogs-4.9-xfs_io-fix-m-option.patch @@ -3,11 +3,11 @@ Author: Andreas Gruenbacher Date: Tue Nov 1 10:38:40 2016 +1100 xfs_io: Fix initial -m option - + Like "open -m mode", the initial -m option requires a mode argument. - + Document these options correctly as well. - + Signed-off-by: Andreas Gruenbacher Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner @@ -19,30 +19,31 @@ Index: xfsprogs-4.5.0/io/init.c @@ -32,7 +32,7 @@ void usage(void) { - fprintf(stderr, + fprintf(stderr, - _("Usage: %s [-adfmnrRstVx] [-p prog] [-c cmd]... file\n"), + _("Usage: %s [-adfnrRstVx] [-m mode] [-p prog] [-c cmd]... file\n"), - progname); - exit(1); + progname); + exit(1); } @@ -139,7 +139,7 @@ init( - pagesize = getpagesize(); - gettimeofday(&stopwatch, NULL); - + pagesize = getpagesize(); + gettimeofday(&stopwatch, NULL); + - while ((c = getopt(argc, argv, "ac:dFfmp:nrRstTVx")) != EOF) { + while ((c = getopt(argc, argv, "ac:dFfm:p:nrRstTVx")) != EOF) { - switch (c) { - case 'a': - flags |= IO_APPEND; + switch (c) { + case 'a': + flags |= IO_APPEND; Index: xfsprogs-4.5.0/io/open.c =================================================================== --- xfsprogs-4.5.0.orig/io/open.c +++ xfsprogs-4.5.0/io/open.c @@ -759,7 +759,7 @@ open_init(void) - open_cmd.argmin = 0; - open_cmd.argmax = -1; - open_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; + open_cmd.argmin = 0; + open_cmd.argmax = -1; + open_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK; - open_cmd.args = _("[-acdrstxT] [path]"); + open_cmd.args = _("[-acdrstxT] [-m mode] [path]"); - open_cmd.oneline = _("open the file specified by path"); - open_cmd.help = open_help; + open_cmd.oneline = _("open the file specified by path"); + open_cmd.help = open_help; + diff --git a/SOURCES/xfsprogs-4.9.0-junk-attr-leaf-count-zero.patch b/SOURCES/xfsprogs-4.9.0-junk-attr-leaf-count-zero.patch index 8e232b69..74f05906 100644 --- a/SOURCES/xfsprogs-4.9.0-junk-attr-leaf-count-zero.patch +++ b/SOURCES/xfsprogs-4.9.0-junk-attr-leaf-count-zero.patch @@ -33,16 +33,18 @@ index 40cb5f7..b855a10 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -593,7 +593,8 @@ process_leaf_attr_block( - stop = xfs_attr3_leaf_hdr_size(leaf); - - /* does the count look sorta valid? */ + stop = xfs_attr3_leaf_hdr_size(leaf); + + /* does the count look sorta valid? */ - if (leafhdr.count * sizeof(xfs_attr_leaf_entry_t) + stop > + if (!leafhdr.count || + leafhdr.count * sizeof(xfs_attr_leaf_entry_t) + stop > - mp->m_sb.sb_blocksize) { - do_warn( - _("bad attribute count %d in attr block %u, inode %" PRIu64 "\n"), + mp->m_sb.sb_blocksize) { + do_warn( + _("bad attribute count %d in attr block %u, inode %" PRIu64 "\n"), -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html + + diff --git a/SOURCES/xfsprogs-revert-off64_t.patch b/SOURCES/xfsprogs-revert-off64_t.patch index 151e99dc..277b5df3 100644 --- a/SOURCES/xfsprogs-revert-off64_t.patch +++ b/SOURCES/xfsprogs-revert-off64_t.patch @@ -8,12 +8,12 @@ Author: Felix Janda Date: Fri Feb 5 08:34:06 2016 +1100 linux.h: Use off64_t instead of loff_t - + These are equivalent on glibc, while musl does not know loff_t. - + In the long run, it would be preferable to enable transparent LFS so that off64_t could be replaced by off_t. - + Signed-off-by: Felix Janda Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner @@ -25,7 +25,7 @@ index 674717c..a7d2f85 100644 @@ -141,7 +141,7 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ #define EFSBADCRC EBADMSG /* Bad CRC detected */ - + -typedef off64_t xfs_off_t; +typedef loff_t xfs_off_t; typedef __uint64_t xfs_ino_t; diff --git a/SOURCES/xfsprogs-wrapper.h b/SOURCES/xfsprogs-wrapper.h new file mode 100644 index 00000000..66cbb2dd --- /dev/null +++ b/SOURCES/xfsprogs-wrapper.h @@ -0,0 +1,24 @@ +/* This file is here to prevent a file conflict on multiarch systems. A + * conflict will occur because platform_defs.h has arch-specific definitions. + * + * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */ + +#if defined(__i386__) +#include "platform_defs-i386.h" +#elif defined(__x86_64__) +#include "platform_defs-x86_64.h" +#elif defined(__powerpc64__) +#include "platform_defs-ppc64.h" +#elif defined(__powerpc__) +#include "platform_defs-ppc.h" +#elif defined(__s390x__) +#include "platform_defs-s390x.h" +#elif defined(__s390__) +#include "platform_defs-s390.h" +#elif defined(__sparc__) && defined(__arch64__) +#include "platform_defs-sparc64.h" +#elif defined(__sparc__) +#include "platform_defs-sparc.h" +#else +#error "This xfsprogs-devel package does not work your architecture?" +#endif diff --git a/SPECS/xfsprogs.spec b/SPECS/xfsprogs.spec index c2a244a6..0fe5982b 100644 --- a/SPECS/xfsprogs.spec +++ b/SPECS/xfsprogs.spec @@ -1,15 +1,15 @@ Summary: Utilities for managing the XFS filesystem Name: xfsprogs Version: 4.5.0 -Release: 15%{?dist} +Release: 19%{?dist} # Licensing based on generic "GNU GENERAL PUBLIC LICENSE" # in source, with no mention of version. # doc/COPYING file specifies what is GPL and what is LGPL # but no mention of versions in the source. License: GPL+ and LGPLv2+ Group: System Environment/Base -URL: http://oss.sgi.com/projects/xfs/ -Source0: ftp://oss.sgi.com/projects/xfs/cmd_tars/%{name}-%{version}.tar.gz +URL: https://xfs.wiki.kernel.org +Source0: http://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.gz Source1: xfsprogs-wrapper.h BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libtool, gettext, libattr-devel, libuuid-devel @@ -47,6 +47,15 @@ Patch22: xfsprogs-4.13.0-xfs_repair-don-t-use-do_warn-for-normal-log-message.pat Patch23: xfsprogs-4.11.0-xfs_repair-warn-about-dirty-log-with-n-option.patch Patch24: xfsprogs-4.8.0-xfs_repair-exit-with-status-2-if-log-dirtiness-is-un.patch Patch25: xfsprogs-4.16-xfs_repair-handle-corrupt-log.patch +# RHEL-7.6 +Patch26: xfsprogs-4.10.0-xfs_db-fix-the-source-command-when-passed-as-a-c-opt.patch +Patch27: xfsprogs-4.14.0-db-increase-metadump-s-default-overly-long-extent-di.patch +Patch28: xfsprogs-4.15.0-xfs_db-fix-crash-when-field-list-selector-string-has.patch +Patch29: xfsprogs-4.15.0-xfsprogs-update-dead-urls.patch +Patch30: xfsprogs-4.17.0-xfsprogs-be-careful-about-what-we-stat-in-platform_c.patch +Patch31: xfsprogs-4.17.0-xfs_io-add-label-command.patch +Patch32: xfsprogs-4.18-repair-root-parent.patch +Patch33: xfsprogs-4.15.0-xfs_copy-accept-CRC-version-of-ABTB_MAGIC-in-ASSERT.patch %description A set of commands to use the XFS filesystem, including mkfs.xfs. @@ -58,10 +67,6 @@ variable block sizes, is extent based, and makes extensive use of Btrees (directories, extents, free space) to aid both performance and scalability. -Refer to the documentation at http://oss.sgi.com/projects/xfs/ -for complete details. This implementation is on-disk compatible -with the IRIX version of XFS. - %package devel Summary: XFS filesystem-specific headers Group: Development/Libraries @@ -103,6 +108,14 @@ also want to install xfsprogs. %patch23 -p1 %patch24 -p1 %patch25 -p1 +%patch26 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch30 -p1 +%patch31 -p1 +%patch32 -p1 +%patch33 -p1 %build export tagname=CC @@ -168,6 +181,22 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/*.so %changelog +* Mon Feb 11 2019 Eric Sandeen 4.5.0-19 +- xfs_copy: accept CRC version of ABTB_MAGIC in ASSERT (#1641023) + +* Wed Jun 20 2018 Eric Sandeen 4.5.0-18 +- xfs_repar: Fix root inode's parent for sf directory (#1590334) + +* Wed Jun 13 2018 Eric Sandeen 4.5.0-17 +- xfs_io: add online label command (#1584912) + +* Thu May 31 2018 Eric Sandeen 4.5.0-16 +- xfs_db: fix the source command when passed as -c option (#1510279) +- xfs_metadump: allow much larger extent counts (#1502927) +- xfs_db: fix crash when field list selector has garbage (#1532271) +- mkfs.xfs, others: don't stat non-block devices on startup (#1573974) +- Update project URLs throughout the pkg, code and docs (#1550798) + * Tue Feb 27 2018 Eric Sandeen 4.5.0-15 - xfs_repair: allow repair of corrupt log (#1549525) @@ -378,11 +407,11 @@ rm -rf $RPM_BUILD_ROOT * Mon Feb 01 2010 Eric Sandeen 3.1.1-2 - Fix mkfs of target with nothing blkid can recognize (#561870) - + * Mon Feb 01 2010 Eric Sandeen 3.1.1-1 - New upstream release - Fix fd validity test for device-less mkfs invocation - + * Sun Jan 17 2010 Eric Sandeen 3.1.0-2 - Post-release mkfs fixes (#555847) @@ -472,7 +501,7 @@ rm -rf $RPM_BUILD_ROOT - xfs_repair fixes * Wed Jun 04 2008 Dennis Gilmore 2.9.8-3 -- sparc32 is built using the sparcv9 variant +- sparc32 is built using the sparcv9 variant * Wed Jun 04 2008 Eric Sandeen 2.9.8-2 - Tidy up multilib hack for non-multilib arches & add sparc (#448452)