public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: xfs@oss.sgi.com
Subject: [PATCH v6 05/10] xfs: create function to scan and clear EOFBLOCKS inodes
Date: Tue,  6 Nov 2012 09:50:42 -0500	[thread overview]
Message-ID: <1352213447-59791-6-git-send-email-bfoster@redhat.com> (raw)
In-Reply-To: <1352213447-59791-1-git-send-email-bfoster@redhat.com>

xfs_inodes_free_eofblocks() implements scanning functionality for
EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes
and free post-EOF blocks via the xfs_inode_free_eofblocks() execute
function. The scan can be invoked in best-effort mode or wait
(force) mode.

A best-effort scan (default) handles all inodes that do not have a
dirty cache and we successfully acquire the io lock via trylock. In
wait mode, we continue to cycle through an AG until all inodes are
handled.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Mark Tinguely<tinguely@sgi.com>
---
 fs/xfs/xfs_icache.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 fs/xfs/xfs_icache.h |    1 +
 fs/xfs/xfs_trace.h  |    1 +
 3 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
index 878eb24..b02a3df 100644
--- a/fs/xfs/xfs_icache.c
+++ b/fs/xfs/xfs_icache.c
@@ -1170,6 +1170,49 @@ xfs_reclaim_inodes_count(
 	return reclaimable;
 }
 
+STATIC int
+xfs_inode_free_eofblocks(
+	struct xfs_inode	*ip,
+	struct xfs_perag	*pag,
+	int			flags,
+	void			*args)
+{
+	int ret;
+
+	if (!xfs_can_free_eofblocks(ip, false)) {
+		/* inode could be preallocated or append-only */
+		trace_xfs_inode_free_eofblocks_invalid(ip);
+		xfs_inode_clear_eofblocks_tag(ip);
+		return 0;
+	}
+
+	/*
+	 * If the mapping is dirty the operation can block and wait for some
+	 * time. Unless we are waiting, skip it.
+	 */
+	if (!(flags & SYNC_WAIT) &&
+	    mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY))
+		return 0;
+
+	ret = xfs_free_eofblocks(ip->i_mount, ip, true);
+
+	/* don't revisit the inode if we're not waiting */
+	if (ret == EAGAIN && !(flags & SYNC_WAIT))
+		ret = 0;
+
+	return ret;
+}
+
+int
+xfs_icache_free_eofblocks(
+	struct xfs_mount	*mp,
+	int			flags)
+{
+	ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0);
+	return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags,
+					 NULL, XFS_ICI_EOFBLOCKS_TAG);
+}
+
 void
 xfs_inode_set_eofblocks_tag(
 	xfs_inode_t	*ip)
diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h
index bb80237..abca9fb 100644
--- a/fs/xfs/xfs_icache.h
+++ b/fs/xfs/xfs_icache.h
@@ -37,6 +37,7 @@ void xfs_inode_set_reclaim_tag(struct xfs_inode *ip);
 
 void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip);
 void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip);
+int xfs_icache_free_eofblocks(struct xfs_mount *, int);
 
 int xfs_sync_inode_grab(struct xfs_inode *ip);
 int xfs_inode_ag_iterator(struct xfs_mount *mp,
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
index 6f46e03..cb52346 100644
--- a/fs/xfs/xfs_trace.h
+++ b/fs/xfs/xfs_trace.h
@@ -589,6 +589,7 @@ DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
 
 DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag);
 DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag);
+DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid);
 
 DECLARE_EVENT_CLASS(xfs_iref_class,
 	TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip),
-- 
1.7.7.6

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  parent reply	other threads:[~2012-11-06 14:46 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-06 14:50 [PATCH v6 00/10] speculative preallocation inode tracking Brian Foster
2012-11-06 14:50 ` [PATCH v6 01/10] xfs: add EOFBLOCKS inode tagging/untagging Brian Foster
2012-11-06 14:50 ` [PATCH v6 02/10] xfs: support a tag-based inode_ag_iterator Brian Foster
2012-11-06 14:50 ` [PATCH v6 03/10] xfs: create helper to check whether to free eofblocks on inode Brian Foster
2012-11-06 14:50 ` [PATCH v6 04/10] xfs: make xfs_free_eofblocks() non-static, return EAGAIN on trylock failure Brian Foster
2012-11-06 14:50 ` Brian Foster [this message]
2012-11-06 14:50 ` [PATCH v6 06/10] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Brian Foster
2012-11-06 16:44   ` Mark Tinguely
2012-11-06 22:11   ` Dave Chinner
2012-11-06 14:50 ` [PATCH v6 07/10] xfs: add inode id filtering to eofblocks scan Brian Foster
2012-11-06 16:41   ` Mark Tinguely
2012-11-06 17:57     ` Brian Foster
2012-11-06 22:17   ` Dave Chinner
2012-11-06 14:50 ` [PATCH v6 08/10] xfs: support multiple inode id filtering in " Brian Foster
2012-11-06 16:48   ` Mark Tinguely
2012-11-06 22:20   ` Dave Chinner
2012-11-06 14:50 ` [PATCH v6 09/10] xfs: add minimum file size filtering to " Brian Foster
2012-11-06 16:57   ` Mark Tinguely
2012-11-06 17:08     ` Roger Willcocks
2012-11-06 18:00       ` Brian Foster
2012-11-06 19:23         ` Mark Tinguely
2012-11-06 22:29           ` Dave Chinner
2012-11-06 22:25   ` Dave Chinner
2012-11-06 14:50 ` [PATCH v6 10/10] xfs: add background scanning to clear eofblocks inodes Brian Foster
2012-11-06 17:04   ` Mark Tinguely
2012-11-06 22:30   ` Dave Chinner
2012-11-07 17:21 ` [PATCH v7 06/10] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Brian Foster
2012-11-07 17:21   ` [PATCH v7 07/10] xfs: add inode id filtering to eofblocks scan Brian Foster
2012-11-07 20:33     ` Dave Chinner
2012-11-07 17:21   ` [PATCH v7 09/10] xfs: add minimum file size " Brian Foster
2012-11-07 20:33     ` Dave Chinner
2012-11-08 22:38 ` [PATCH v6 00/10] speculative preallocation inode tracking Ben Myers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1352213447-59791-6-git-send-email-bfoster@redhat.com \
    --to=bfoster@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox