[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