From 37cebed771627e7c7398e848879dc2ba89856333 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sat, 10 Nov 2018 11:10:06 +0100 Subject: [PATCH] - up to 4.19.0 --- misc.patch | 241 -------------------------------------------------- xfsprogs.spec | 8 +- 2 files changed, 3 insertions(+), 246 deletions(-) delete mode 100644 misc.patch diff --git a/misc.patch b/misc.patch deleted file mode 100644 index 14aa86a..0000000 --- a/misc.patch +++ /dev/null @@ -1,241 +0,0 @@ -From: Darrick J. Wong - -When we added a new defer op type for agfl block freeing to the kernel, -we forgot to add that type to the userspace side of things. This will -cause spontaneous combustion in xfs_repair if we try to rebuild -directories. - -Fixes: d5c1b462232 ("xfs: defer agfl block frees when dfops is available") -Signed-off-by: Darrick J. Wong ---- - libxfs/defer_item.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 44 insertions(+) - -diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c -index b7185c1a..82aa32a8 100644 ---- a/libxfs/defer_item.c -+++ b/libxfs/defer_item.c -@@ -118,11 +118,55 @@ static const struct xfs_defer_op_type xfs_extent_free_defer_type = { - .cancel_item = xfs_extent_free_cancel_item, - }; - -+/* -+ * AGFL blocks are accounted differently in the reserve pools and are not -+ * inserted into the busy extent list. -+ */ -+STATIC int -+xfs_agfl_free_finish_item( -+ struct xfs_trans *tp, -+ struct list_head *item, -+ void *done_item, -+ void **state) -+{ -+ struct xfs_mount *mp = tp->t_mountp; -+ struct xfs_extent_free_item *free; -+ struct xfs_buf *agbp; -+ int error; -+ xfs_agnumber_t agno; -+ xfs_agblock_t agbno; -+ -+ free = container_of(item, struct xfs_extent_free_item, xefi_list); -+ ASSERT(free->xefi_blockcount == 1); -+ agno = XFS_FSB_TO_AGNO(mp, free->xefi_startblock); -+ agbno = XFS_FSB_TO_AGBNO(mp, free->xefi_startblock); -+ -+ error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp); -+ if (!error) -+ error = xfs_free_agfl_block(tp, agno, agbno, agbp, -+ &free->xefi_oinfo); -+ kmem_free(free); -+ return error; -+} -+ -+/* sub-type with special handling for AGFL deferred frees */ -+static const struct xfs_defer_op_type xfs_agfl_free_defer_type = { -+ .type = XFS_DEFER_OPS_TYPE_AGFL_FREE, -+ .diff_items = xfs_extent_free_diff_items, -+ .create_intent = xfs_extent_free_create_intent, -+ .abort_intent = xfs_extent_free_abort_intent, -+ .log_item = xfs_extent_free_log_item, -+ .create_done = xfs_extent_free_create_done, -+ .finish_item = xfs_agfl_free_finish_item, -+ .cancel_item = xfs_extent_free_cancel_item, -+}; -+ - /* Register the deferred op type. */ - void - xfs_extent_free_init_defer_op(void) - { - xfs_defer_init_op_type(&xfs_extent_free_defer_type); -+ xfs_defer_init_op_type(&xfs_agfl_free_defer_type); - } - - /* Reverse Mapping */ -Subject: [PATCH 1/2] xfs_repair: initialize realloced bplist in - longform_dir2_entry_check -From: Eric Sandeen - -If we need to realloc the bplist[] array holding buffers for a given -directory, we don't initialize the new slots. This causes a problem -if the directory has holes, because those slots never get filled in. - -At the end of the function we call libxfs_putbuf for every non-null -slot, and any uninitialized slots are segfault landmines. - -Make sure we initialize all new slots to NULL for this reason. - -Reported-by: Oleg Davydov -Signed-off-by: Eric Sandeen ---- - -diff --git a/repair/phase6.c b/repair/phase6.c -index b87c751..9d24a4f 100644 ---- a/repair/phase6.c -+++ b/repair/phase6.c -@@ -2348,6 +2348,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, - - db = xfs_dir2_da_to_db(mp->m_dir_geo, da_bno); - if (db >= num_bps) { -+ int last_size = num_bps; -+ - /* more data blocks than expected */ - num_bps = db + 1; - bplist = realloc(bplist, num_bps * sizeof(struct xfs_buf*)); -@@ -2355,6 +2357,9 @@ longform_dir2_entry_check(xfs_mount_t *mp, - do_error(_("realloc failed in %s (%zu bytes)\n"), - __func__, - num_bps * sizeof(struct xfs_buf*)); -+ /* Initialize the new elements */ -+ for (i = last_size; i < num_bps; i++) -+ bplist[i] = NULL; - } - - if (isblock) - -Subject: [PATCH 2/2] xfs_repair: continue after xfs_bunmapi deadlock avoidance -From: Eric Sandeen - -After commit: - -15a8bcc xfs: fix multi-AG deadlock in xfs_bunmapi - -xfs_bunmapi can legitimately return before all work is done. -Sadly nobody told xfs_repair, so it fires an assert: - - phase6.c:1410: longform_dir2_rebuild: Assertion `done' failed. - -Fix this by calling back in until all work is done, as we do -in the kernel. - -Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641116 -Reported-by: Tomasz Torcz -Signed-off-by: Eric Sandeen ---- - -diff --git a/repair/phase6.c b/repair/phase6.c -index e017326..b87c751 100644 ---- a/repair/phase6.c -+++ b/repair/phase6.c -@@ -1317,7 +1317,7 @@ longform_dir2_rebuild( - xfs_fileoff_t lastblock; - xfs_inode_t pip; - dir_hash_ent_t *p; -- int done; -+ int done = 0; - - /* - * trash directory completely and rebuild from scratch using the -@@ -1352,12 +1352,25 @@ longform_dir2_rebuild( - error); - - /* free all data, leaf, node and freespace blocks */ -- error = -libxfs_bunmapi(tp, ip, 0, lastblock, XFS_BMAPI_METADATA, 0, -- &firstblock, &dfops, &done); -- if (error) { -- do_warn(_("xfs_bunmapi failed -- error - %d\n"), error); -- goto out_bmap_cancel; -- } -+ while (!done) { -+ error = -libxfs_bunmapi(tp, ip, 0, lastblock, XFS_BMAPI_METADATA, -+ 0, &firstblock, &dfops, &done); -+ if (error) { -+ do_warn(_("xfs_bunmapi failed -- error - %d\n"), error); -+ goto out_bmap_cancel; -+ } -+ error = xfs_defer_finish(&tp, &dfops); -+ if (error) { -+ do_warn(("defer_finish failed -- error - %d\n"), error); -+ goto out_bmap_cancel; -+ } -+ /* -+ * Close out trans and start the next one in the chain. -+ */ -+ error = xfs_trans_roll_inode(&tp, ip); -+ if (error) -+ goto out_bmap_cancel; -+ } - - ASSERT(done); - - -From: "Darrick J. Wong" -Subject: [PATCH] libxfs: check all defer ops types - -From: Darrick J. Wong - -Make sure we have all the defer ops types loaded before proceeding. - -Signed-off-by: Darrick J. Wong ---- - libxfs/init.c | 5 +++++ - libxfs/xfs_defer.c | 12 ++++++++++++ - libxfs/xfs_defer.h | 1 + - 3 files changed, 18 insertions(+) - -diff --git a/libxfs/init.c b/libxfs/init.c -index 750b8f20..d1fdc3a8 100644 ---- a/libxfs/init.c -+++ b/libxfs/init.c -@@ -253,6 +253,11 @@ libxfs_init(libxfs_init_t *a) - xfs_rmap_update_init_defer_op(); - xfs_refcount_update_init_defer_op(); - xfs_bmap_update_init_defer_op(); -+ if (!xfs_defer_check_all_present()) { -+ fprintf(stderr, _("%s: defer ops not all there\n"), -+ progname); -+ goto done; -+ } - - radix_tree_init(); - -diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c -index 5a6da0f3..cd3a8ef3 100644 ---- a/libxfs/xfs_defer.c -+++ b/libxfs/xfs_defer.c -@@ -545,3 +545,15 @@ xfs_defer_move( - - xfs_defer_reset(stp); - } -+ -+/* Make sure we filled out all the defer_ops types. */ -+bool -+xfs_defer_check_all_present(void) -+{ -+ int x; -+ -+ for(x = 0; x < XFS_DEFER_OPS_TYPE_MAX; x++) -+ if (defer_op_types[x] == NULL) -+ return false; -+ return true; -+} -diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h -index 2584a5b9..bc7ae7ff 100644 ---- a/libxfs/xfs_defer.h -+++ b/libxfs/xfs_defer.h -@@ -57,5 +57,6 @@ struct xfs_defer_op_type { - }; - - void xfs_defer_init_op_type(const struct xfs_defer_op_type *type); -+bool xfs_defer_check_all_present(void); - - #endif /* __XFS_DEFER_H__ */ diff --git a/xfsprogs.spec b/xfsprogs.spec index 2b0e887..60fea47 100644 --- a/xfsprogs.spec +++ b/xfsprogs.spec @@ -3,16 +3,15 @@ Summary: Tools for the XFS filesystem Summary(pl.UTF-8): Narzędzia do systemu plików XFS Name: xfsprogs -Version: 4.18.0 -Release: 3 +Version: 4.19.0 +Release: 1 License: LGPL v2.1 (libhandle), GPL v2 (the rest) Group: Applications/System Source0: https://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.gz -# Source0-md5: 6a2a92d3d63e3548b86fd7ad1a8f5af2 +# Source0-md5: 955b3dad9cbe01d6b21a562cc0100e04 Source1: xfs_lsprojid Patch0: %{name}-miscfix-v2.patch Patch1: %{name}-pl.po-update.patch -Patch2: misc.patch URL: http://www.xfs.org/ BuildRequires: autoconf >= 2.50 BuildRequires: automake @@ -106,7 +105,6 @@ Biblioteki statyczne do XFS. %setup -q %patch0 -p1 %patch1 -p1 -%patch2 -p1 %{__sed} -i -e '1s,/usr/bin/env python3,%{__python3},' scrub/xfs_scrub_all.in tools/xfsbuflock.py -- 2.44.0