Home Home > GIT Browse > openSUSE-15.1
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolay Borisov <nborisov@suse.com>2019-08-15 09:57:52 +0300
committerNikolay Borisov <nborisov@suse.com>2019-08-15 09:58:04 +0300
commit82d0f2c894eab43f90c7b9b19ba5f8c2c6e0437e (patch)
tree430e03d504b139ab32e8445e418e1e0708c1b971
parent8ab35cb53a5c52e64569e69ec696c81d4ddac914 (diff)
xfs: eliminate duplicate icreate tx reservation functions
(bsc#1145235).
-rw-r--r--patches.suse/xfs-eliminate-duplicate-icreate-tx-reservation-functions.patch143
-rw-r--r--series.conf1
2 files changed, 144 insertions, 0 deletions
diff --git a/patches.suse/xfs-eliminate-duplicate-icreate-tx-reservation-functions.patch b/patches.suse/xfs-eliminate-duplicate-icreate-tx-reservation-functions.patch
new file mode 100644
index 0000000000..281d636218
--- /dev/null
+++ b/patches.suse/xfs-eliminate-duplicate-icreate-tx-reservation-functions.patch
@@ -0,0 +1,143 @@
+From: Brian Foster <bfoster@redhat.com>
+Date: Mon, 8 Jan 2018 10:41:38 -0800
+Subject: xfs: eliminate duplicate icreate tx reservation functions
+Git-commit: c017cb5ddfd6326032570d5eba83308c8a9c13a9
+Patch-mainline: v4.16-rc1
+References: bsc#1145235
+
+The create transaction reservation calculation has two different
+branches of code depending on whether the filesystem is a v5 format
+fs or older. Each branch considers the max reservation between the
+allocation case (new chunk allocation + record insert) and the
+modify case (chunk exists, record modification) of inode allocation.
+
+The modify case is the same for both superblock versions with the
+exception of the finobt. The finobt helper checks the feature bit,
+however, and so the modify case already shares the same code.
+
+Now that inode chunk allocation has been refactored into a helper
+that checks the superblock version to calculate the appropriate
+reservation for the create transaction, the only remaining
+difference between the create and icreate branches is the call to
+the finobt helper. As noted above, the finobt helper is a no-op when
+the feature is not enabled. Therefore, these branches are
+effectively duplicate and can be condensed.
+
+Remove the xfs_calc_create_*() branch of functions and update the
+various callers to use the xfs_calc_icreate_*() variant. The latter
+creates the same reservation size for v4 create transactions as the
+removed branch. As such, this patch does not result in transaction
+reservation changes.
+
+Signed-off-by: Brian Foster <bfoster@redhat.com>
+Reviewed-by: Dave Chinner <dchinner@redhat.com>
+Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Acked-by: Nikolay Borisov <nborisov@suse.com>
+---
+ fs/xfs/libxfs/xfs_trans_resv.c | 52 +++++-------------------------------------
+ 1 file changed, 6 insertions(+), 46 deletions(-)
+
+diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c
+index 75259a1346eb..5f17641f040f 100644
+--- a/fs/xfs/libxfs/xfs_trans_resv.c
++++ b/fs/xfs/libxfs/xfs_trans_resv.c
+@@ -413,39 +413,13 @@ xfs_calc_create_resv_modify(
+ xfs_calc_finobt_res(mp);
+ }
+
+-/*
+- * For create we can allocate some inodes giving:
+- * the agi and agf of the ag getting the new inodes: 2 * sectorsize
+- * the superblock for the nlink flag: sector size
+- * the inode chunk (allocation/init)
+- * the inode btree (record insertion)
+- */
+-STATIC uint
+-xfs_calc_create_resv_alloc(
+- struct xfs_mount *mp)
+-{
+- return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +
+- mp->m_sb.sb_sectsize +
+- xfs_calc_inode_chunk_res(mp, _ALLOC) +
+- xfs_calc_inobt_res(mp);
+-}
+-
+-STATIC uint
+-__xfs_calc_create_reservation(
+- struct xfs_mount *mp)
+-{
+- return XFS_DQUOT_LOGRES(mp) +
+- MAX(xfs_calc_create_resv_alloc(mp),
+- xfs_calc_create_resv_modify(mp));
+-}
+-
+ /*
+ * For icreate we can allocate some inodes giving:
+ * the agi and agf of the ag getting the new inodes: 2 * sectorsize
+ * the superblock for the nlink flag: sector size
+- * the inode chunk (allocation, no init)
++ * the inode chunk (allocation, optional init)
+ * the inobt (record insertion)
+- * the finobt (record insertion)
++ * the finobt (optional, record insertion)
+ */
+ STATIC uint
+ xfs_calc_icreate_resv_alloc(
+@@ -466,27 +440,13 @@ xfs_calc_icreate_reservation(xfs_mount_t *mp)
+ xfs_calc_create_resv_modify(mp));
+ }
+
+-STATIC uint
+-xfs_calc_create_reservation(
+- struct xfs_mount *mp)
+-{
+- if (xfs_sb_version_hascrc(&mp->m_sb))
+- return xfs_calc_icreate_reservation(mp);
+- return __xfs_calc_create_reservation(mp);
+-
+-}
+-
+ STATIC uint
+ xfs_calc_create_tmpfile_reservation(
+ struct xfs_mount *mp)
+ {
+ uint res = XFS_DQUOT_LOGRES(mp);
+
+- if (xfs_sb_version_hascrc(&mp->m_sb))
+- res += xfs_calc_icreate_resv_alloc(mp);
+- else
+- res += xfs_calc_create_resv_alloc(mp);
+-
++ res += xfs_calc_icreate_resv_alloc(mp);
+ return res + xfs_calc_iunlink_add_reservation(mp);
+ }
+
+@@ -497,7 +457,7 @@ STATIC uint
+ xfs_calc_mkdir_reservation(
+ struct xfs_mount *mp)
+ {
+- return xfs_calc_create_reservation(mp);
++ return xfs_calc_icreate_reservation(mp);
+ }
+
+
+@@ -510,7 +470,7 @@ STATIC uint
+ xfs_calc_symlink_reservation(
+ struct xfs_mount *mp)
+ {
+- return xfs_calc_create_reservation(mp) +
++ return xfs_calc_icreate_reservation(mp) +
+ xfs_calc_buf_res(1, XFS_SYMLINK_MAXLEN);
+ }
+
+@@ -869,7 +829,7 @@ xfs_trans_resv_calc(
+ resp->tr_symlink.tr_logcount = XFS_SYMLINK_LOG_COUNT;
+ resp->tr_symlink.tr_logflags |= XFS_TRANS_PERM_LOG_RES;
+
+- resp->tr_create.tr_logres = xfs_calc_create_reservation(mp);
++ resp->tr_create.tr_logres = xfs_calc_icreate_reservation(mp);
+ resp->tr_create.tr_logcount = XFS_CREATE_LOG_COUNT;
+ resp->tr_create.tr_logflags |= XFS_TRANS_PERM_LOG_RES;
+
+
diff --git a/series.conf b/series.conf
index a4fcba33c8..a2fd3fa2c9 100644
--- a/series.conf
+++ b/series.conf
@@ -11985,6 +11985,7 @@
patches.suse/xfs-truncate-transaction-does-not-modify-the-inobt.patch
patches.suse/xfs-include-an-allocfree-res-for-inobt-modifications.patch
patches.suse/xfs-refactor-inode-chunk-alloc-free-tx-reservation.patch
+ patches.suse/xfs-eliminate-duplicate-icreate-tx-reservation-functions.patch
patches.fixes/0004-iomap-report-collisions-between-directio-and-buffere.patch
patches.fixes/xfs-call-xfs_qm_dqattach-before-performing-reflink-o.patch
patches.fixes/xfs-preserve-i_rdev-when-recycling-a-reclaimable-inode.patch