[linux] 02/02: xfs: allow inode allocations in post-growfs disk space (Closes: #802885)

debian-kernel at lists.debian.org debian-kernel at lists.debian.org
Tue Dec 15 02:18:57 UTC 2015


This is an automated email from the git hooks/post-receive script.

benh pushed a commit to branch jessie
in repository linux.

commit 0a63032e0dc2ce5a4f7bc9314d06b8e5007569f8
Author: Ben Hutchings <ben at decadent.org.uk>
Date:   Tue Dec 15 02:13:53 2015 +0000

    xfs: allow inode allocations in post-growfs disk space (Closes: #802885)
---
 debian/changelog                                   |   1 +
 ...node-allocations-in-post-growfs-disk-spac.patch | 149 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 151 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index e5a4851..f510e7b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ linux (3.16.7-ckt20-2) UNRELEASED; urgency=medium
 
   [ Ben Hutchings ]
   * udeb: Add dm-service-time to multipath-modules (Closes: #806131)
+  * xfs: allow inode allocations in post-growfs disk space (Closes: #802885)
 
   [ Aurelien Jarno ]
   * [mips*] Add support for MIPS 5KE CPU.
diff --git a/debian/patches/bugfix/all/xfs-allow-inode-allocations-in-post-growfs-disk-spac.patch b/debian/patches/bugfix/all/xfs-allow-inode-allocations-in-post-growfs-disk-spac.patch
new file mode 100644
index 0000000..129d01d
--- /dev/null
+++ b/debian/patches/bugfix/all/xfs-allow-inode-allocations-in-post-growfs-disk-spac.patch
@@ -0,0 +1,149 @@
+From: Eric Sandeen <sandeen at redhat.com>
+Date: Thu, 24 Jul 2014 20:51:54 +1000
+Subject: xfs: allow inode allocations in post-growfs disk space
+Origin: https://git.kernel.org/linus/9de67c3ba9ea961ba420573d56479d09d33a7587
+Bug-Debian: https://bugs.debian.org/802885
+
+Today, if we perform an xfs_growfs which adds allocation groups,
+mp->m_maxagi is not properly updated when the growfs is complete.
+
+Therefore inodes will continue to be allocated only in the
+AGs which existed prior to the growfs, and the new space
+won't be utilized.
+
+This is because of this path in xfs_growfs_data_private():
+
+xfs_growfs_data_private
+	xfs_initialize_perag(mp, nagcount, &nagimax);
+		if (mp->m_flags & XFS_MOUNT_32BITINODES)
+			index = xfs_set_inode32(mp);
+		else
+			index = xfs_set_inode64(mp);
+
+		if (maxagi)
+			*maxagi = index;
+
+where xfs_set_inode* iterates over the (old) agcount in
+mp->m_sb.sb_agblocks, which has not yet been updated
+in the growfs path.  So "index" will be returned based on
+the old agcount, not the new one, and new AGs are not available
+for inode allocation.
+
+Fix this by explicitly passing the proper AG count (which
+xfs_initialize_perag() already has) down another level,
+so that xfs_set_inode* can make the proper decision about
+acceptable AGs for inode allocation in the potentially
+newly-added AGs.
+
+This has been broken since 3.7, when these two
+xfs_set_inode* functions were added in commit 2d2194f.
+Prior to that, we looped over "agcount" not sb_agblocks
+in these calculations.
+
+Signed-off-by: Eric Sandeen <sandeen at redhat.com>
+Reviewed-by: Brian Foster <bfoster at redhat.com>
+Signed-off-by: Dave Chinner <david at fromorbit.com>
+---
+ fs/xfs/xfs_mount.c |  4 ++--
+ fs/xfs/xfs_super.c | 20 +++++++++++++-------
+ fs/xfs/xfs_super.h |  4 ++--
+ 3 files changed, 17 insertions(+), 11 deletions(-)
+
+diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
+index d5c44a6..f205a2c 100644
+--- a/fs/xfs/xfs_mount.c
++++ b/fs/xfs/xfs_mount.c
+@@ -250,9 +250,9 @@ xfs_initialize_perag(
+ 		mp->m_flags &= ~XFS_MOUNT_32BITINODES;
+ 
+ 	if (mp->m_flags & XFS_MOUNT_32BITINODES)
+-		index = xfs_set_inode32(mp);
++		index = xfs_set_inode32(mp, agcount);
+ 	else
+-		index = xfs_set_inode64(mp);
++		index = xfs_set_inode64(mp, agcount);
+ 
+ 	if (maxagi)
+ 		*maxagi = index;
+diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
+index f2e5f8a..b475eb6 100644
+--- a/fs/xfs/xfs_super.c
++++ b/fs/xfs/xfs_super.c
+@@ -597,8 +597,13 @@ xfs_max_file_offset(
+ 	return (((__uint64_t)pagefactor) << bitshift) - 1;
+ }
+ 
++/*
++ * xfs_set_inode32() and xfs_set_inode64() are passed an agcount
++ * because in the growfs case, mp->m_sb.sb_agcount is not updated
++ * yet to the potentially higher ag count.
++ */
+ xfs_agnumber_t
+-xfs_set_inode32(struct xfs_mount *mp)
++xfs_set_inode32(struct xfs_mount *mp, xfs_agnumber_t agcount)
+ {
+ 	xfs_agnumber_t	index = 0;
+ 	xfs_agnumber_t	maxagi = 0;
+@@ -620,10 +625,10 @@ xfs_set_inode32(struct xfs_mount *mp)
+ 		do_div(icount, sbp->sb_agblocks);
+ 		max_metadata = icount;
+ 	} else {
+-		max_metadata = sbp->sb_agcount;
++		max_metadata = agcount;
+ 	}
+ 
+-	for (index = 0; index < sbp->sb_agcount; index++) {
++	for (index = 0; index < agcount; index++) {
+ 		ino = XFS_AGINO_TO_INO(mp, index, agino);
+ 
+ 		if (ino > XFS_MAXINUMBER_32) {
+@@ -648,11 +653,11 @@ xfs_set_inode32(struct xfs_mount *mp)
+ }
+ 
+ xfs_agnumber_t
+-xfs_set_inode64(struct xfs_mount *mp)
++xfs_set_inode64(struct xfs_mount *mp, xfs_agnumber_t agcount)
+ {
+ 	xfs_agnumber_t index = 0;
+ 
+-	for (index = 0; index < mp->m_sb.sb_agcount; index++) {
++	for (index = 0; index < agcount; index++) {
+ 		struct xfs_perag	*pag;
+ 
+ 		pag = xfs_perag_get(mp, index);
+@@ -1188,6 +1193,7 @@ xfs_fs_remount(
+ 	char			*options)
+ {
+ 	struct xfs_mount	*mp = XFS_M(sb);
++	xfs_sb_t		*sbp = &mp->m_sb;
+ 	substring_t		args[MAX_OPT_ARGS];
+ 	char			*p;
+ 	int			error;
+@@ -1208,10 +1214,10 @@ xfs_fs_remount(
+ 			mp->m_flags &= ~XFS_MOUNT_BARRIER;
+ 			break;
+ 		case Opt_inode64:
+-			mp->m_maxagi = xfs_set_inode64(mp);
++			mp->m_maxagi = xfs_set_inode64(mp, sbp->sb_agcount);
+ 			break;
+ 		case Opt_inode32:
+-			mp->m_maxagi = xfs_set_inode32(mp);
++			mp->m_maxagi = xfs_set_inode32(mp, sbp->sb_agcount);
+ 			break;
+ 		default:
+ 			/*
+diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
+index bbe3d15..b4cfe21 100644
+--- a/fs/xfs/xfs_super.h
++++ b/fs/xfs/xfs_super.h
+@@ -76,8 +76,8 @@ extern __uint64_t xfs_max_file_offset(unsigned int);
+ 
+ extern void xfs_flush_inodes(struct xfs_mount *mp);
+ extern void xfs_blkdev_issue_flush(struct xfs_buftarg *);
+-extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *);
+-extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *);
++extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *, xfs_agnumber_t agcount);
++extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *, xfs_agnumber_t agcount);
+ 
+ extern const struct export_operations xfs_export_operations;
+ extern const struct xattr_handler *xfs_xattr_handlers[];
diff --git a/debian/patches/series b/debian/patches/series
index e029d4e..d9579f5 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -651,3 +651,4 @@ bugfix/all/unix-avoid-use-after-free-in-ep_remove_wait_queue.patch
 debian/af_unix-avoid-abi-changes.patch
 bugfix/all/btrfs-fix-truncation-of-compressed-and-inlined-exten.patch
 bugfix/all/net-add-validation-for-the-socket-syscall-protocol.patch
+bugfix/all/xfs-allow-inode-allocations-in-post-growfs-disk-spac.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git



More information about the Kernel-svn-changes mailing list