Commit c8f5f12e authored by David Chinner's avatar David Chinner Committed by Lachlan McIlroy

[XFS] Fix inode list allocation size in writeback.

We only need to allocate space for the number of inodes in the cluster
when writing back inodes, not every byte in the inode cluster. This
reduces the amount of memory needing to be allocated to 256 bytes instead
of 64k.

SGI-PV: 981949
SGI-Modid: xfs-linux-melb:xfs-kern:31182a
Signed-off-by: default avatarDavid Chinner <dgc@sgi.com>
Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent 49383b0e
...@@ -2974,6 +2974,7 @@ xfs_iflush_cluster( ...@@ -2974,6 +2974,7 @@ xfs_iflush_cluster(
xfs_mount_t *mp = ip->i_mount; xfs_mount_t *mp = ip->i_mount;
xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino);
unsigned long first_index, mask; unsigned long first_index, mask;
unsigned long inodes_per_cluster;
int ilist_size; int ilist_size;
xfs_inode_t **ilist; xfs_inode_t **ilist;
xfs_inode_t *iq; xfs_inode_t *iq;
...@@ -2985,7 +2986,8 @@ xfs_iflush_cluster( ...@@ -2985,7 +2986,8 @@ xfs_iflush_cluster(
ASSERT(pag->pagi_inodeok); ASSERT(pag->pagi_inodeok);
ASSERT(pag->pag_ici_init); ASSERT(pag->pag_ici_init);
ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *); inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog;
ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *);
ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS);
if (!ilist) if (!ilist)
return 0; return 0;
...@@ -2995,8 +2997,7 @@ xfs_iflush_cluster( ...@@ -2995,8 +2997,7 @@ xfs_iflush_cluster(
read_lock(&pag->pag_ici_lock); read_lock(&pag->pag_ici_lock);
/* really need a gang lookup range call here */ /* really need a gang lookup range call here */
nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist,
first_index, first_index, inodes_per_cluster);
XFS_INODE_CLUSTER_SIZE(mp));
if (nr_found == 0) if (nr_found == 0)
goto out_free; goto out_free;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment