public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 1/4] XFS: Remove xfs_iflush_all and clean up xfs_finish_reclaim_all()
Date: Mon, 21 Jul 2008 03:58:26 -0400	[thread overview]
Message-ID: <20080721075826.GC6692@infradead.org> (raw)
In-Reply-To: <1216556394-17529-2-git-send-email-david@fromorbit.com>

On Sun, Jul 20, 2008 at 10:19:51PM +1000, Dave Chinner wrote:
> xfs_iflush_all() walks the m_inodes list to find inodes that
> need reclaiming. We already have such a list - the m_del_inodes
> list. Replace xfs_iflush_all() with a call to xfs_finish_reclaim_all()
> and clean up xfs_finish_reclaim_all() to handle the different flush
> modes now needed.
>
>
> 
> Originally based on a patch from Christoph Hellwig.

Unlike my original patch is also now calls xfs_finish_reclaim_all
unconditonal in xfs_syncsub.  This looks harmless but useless in the
context of this patch, and actually useful for your next patches.

The xfs_finish_reclaim_all in xfs_quiesce_fs changes from
XFS_IFLUSH_DELWRI_ELSE_ASYNC to XFS_IFLUSH_ASYNC, which needs an
explanation.

Otherwiase this looks good to me, should have submitted the original
patch long time ago..

> 
> Signed-off-by: Dave Chinner <david@fromorbit.com>
> ---
>  fs/xfs/xfs_inode.c    |   39 ---------------------------------------
>  fs/xfs/xfs_inode.h    |    3 +--
>  fs/xfs/xfs_mount.c    |    2 +-
>  fs/xfs/xfs_vfsops.c   |    8 +++-----
>  fs/xfs/xfs_vnodeops.c |   42 ++++++++++++++++++------------------------
>  5 files changed, 23 insertions(+), 71 deletions(-)
> 
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 20b6f87..ae19b05 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -3456,45 +3456,6 @@ corrupt_out:
>  	return XFS_ERROR(EFSCORRUPTED);
>  }
>  
> -
> -/*
> - * Flush all inactive inodes in mp.
> - */
> -void
> -xfs_iflush_all(
> -	xfs_mount_t	*mp)
> -{
> -	xfs_inode_t	*ip;
> -	bhv_vnode_t	*vp;
> -
> - again:
> -	XFS_MOUNT_ILOCK(mp);
> -	ip = mp->m_inodes;
> -	if (ip == NULL)
> -		goto out;
> -
> -	do {
> -		/* Make sure we skip markers inserted by sync */
> -		if (ip->i_mount == NULL) {
> -			ip = ip->i_mnext;
> -			continue;
> -		}
> -
> -		vp = XFS_ITOV_NULL(ip);
> -		if (!vp) {
> -			XFS_MOUNT_IUNLOCK(mp);
> -			xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
> -			goto again;
> -		}
> -
> -		ASSERT(vn_count(vp) == 0);
> -
> -		ip = ip->i_mnext;
> -	} while (ip != mp->m_inodes);
> - out:
> -	XFS_MOUNT_IUNLOCK(mp);
> -}
> -
>  #ifdef XFS_ILOCK_TRACE
>  ktrace_t	*xfs_ilock_trace_buf;
>  
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index 17a04b6..7ce41d3 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -480,7 +480,7 @@ void		xfs_iunlock_map_shared(xfs_inode_t *, uint);
>  void		xfs_ifunlock(xfs_inode_t *);
>  void		xfs_ireclaim(xfs_inode_t *);
>  int		xfs_finish_reclaim(xfs_inode_t *, int, int);
> -int		xfs_finish_reclaim_all(struct xfs_mount *, int);
> +int		xfs_finish_reclaim_all(struct xfs_mount *, int, int);
>  
>  /*
>   * xfs_inode.c prototypes.
> @@ -518,7 +518,6 @@ void		xfs_ipin(xfs_inode_t *);
>  void		xfs_iunpin(xfs_inode_t *);
>  int		xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
>  int		xfs_iflush(xfs_inode_t *, uint);
> -void		xfs_iflush_all(struct xfs_mount *);
>  void		xfs_ichgtime(xfs_inode_t *, int);
>  xfs_fsize_t	xfs_file_last_byte(xfs_inode_t *);
>  void		xfs_lock_inodes(xfs_inode_t **, int, uint);
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 6c5d132..0c23f6a 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -1268,7 +1268,7 @@ xfs_unmountfs(xfs_mount_t *mp)
>  	 * need to force the log first.
>  	 */
>  	xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
> -	xfs_iflush_all(mp);
> +	xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_ASYNC);
>  
>  	XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
>  
> diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c
> index 4a9a433..9d72646 100644
> --- a/fs/xfs/xfs_vfsops.c
> +++ b/fs/xfs/xfs_vfsops.c
> @@ -65,7 +65,7 @@ xfs_quiesce_fs(
>  	int			count = 0, pincount;
>  
>  	xfs_flush_buftarg(mp->m_ddev_targp, 0);
> -	xfs_finish_reclaim_all(mp, 0);
> +	xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_ASYNC);
>  
>  	/* This loop must run at least twice.
>  	 * The first instance of the loop will flush
> @@ -653,10 +653,8 @@ xfs_syncsub(
>  	xfs_log_force(mp, (xfs_lsn_t)0, log_flags);
>  
>  	if (flags & (SYNC_ATTR|SYNC_DELWRI)) {
> -		if (flags & SYNC_BDFLUSH)
> -			xfs_finish_reclaim_all(mp, 1);
> -		else
> -			error = xfs_sync_inodes(mp, flags, bypassed);
> +		xfs_finish_reclaim_all(mp, 1, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
> +		error = xfs_sync_inodes(mp, flags, bypassed);
>  	}
>  
>  	/*
> diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
> index b792a12..2af1be3 100644
> --- a/fs/xfs/xfs_vnodeops.c
> +++ b/fs/xfs/xfs_vnodeops.c
> @@ -2985,36 +2985,30 @@ xfs_finish_reclaim(
>  }
>  
>  int
> -xfs_finish_reclaim_all(xfs_mount_t *mp, int noblock)
> +xfs_finish_reclaim_all(
> +	xfs_mount_t	*mp,
> +	int		 noblock,
> +	int		mode)
>  {
> -	int		purged;
>  	xfs_inode_t	*ip, *n;
> -	int		done = 0;
>  
> -	while (!done) {
> -		purged = 0;
> -		XFS_MOUNT_ILOCK(mp);
> -		list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
> -			if (noblock) {
> -				if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
> -					continue;
> -				if (xfs_ipincount(ip) ||
> -				    !xfs_iflock_nowait(ip)) {
> -					xfs_iunlock(ip, XFS_ILOCK_EXCL);
> -					continue;
> -				}
> +restart:
> +	XFS_MOUNT_ILOCK(mp);
> +	list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
> +		if (noblock) {
> +			if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
> +				continue;
> +			if (xfs_ipincount(ip) ||
> +			    !xfs_iflock_nowait(ip)) {
> +				xfs_iunlock(ip, XFS_ILOCK_EXCL);
> +				continue;
>  			}
> -			XFS_MOUNT_IUNLOCK(mp);
> -			if (xfs_finish_reclaim(ip, noblock,
> -					XFS_IFLUSH_DELWRI_ELSE_ASYNC))
> -				delay(1);
> -			purged = 1;
> -			break;
>  		}
> -
> -		done = !purged;
> +		XFS_MOUNT_IUNLOCK(mp);
> +		if (xfs_finish_reclaim(ip, noblock, mode))
> +			delay(1);
> +		goto restart;
>  	}
> -
>  	XFS_MOUNT_IUNLOCK(mp);
>  	return 0;
>  }
> -- 
> 1.5.6
> 
> 
---end quoted text---

  reply	other threads:[~2008-07-21  7:57 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-20 12:19 [PATCH 0/4] XFS: replace the mount inode list with radix tree traversals Dave Chinner
2008-07-20 12:19 ` [PATCH 1/4] XFS: Remove xfs_iflush_all and clean up xfs_finish_reclaim_all() Dave Chinner
2008-07-21  7:58   ` Christoph Hellwig [this message]
2008-07-21 11:33     ` Dave Chinner
2008-07-22  4:24       ` Christoph Hellwig
2008-07-20 12:19 ` [PATCH 2/4] XFS: Use the inode tree for finding dirty inodes Dave Chinner
2008-07-22  4:28   ` Christoph Hellwig
2008-07-22  5:30     ` Dave Chinner
2008-07-22  7:27       ` Christoph Hellwig
2008-07-23  0:05         ` Dave Chinner
2008-07-23  2:10           ` Mark Goodwin
2008-07-23  3:46             ` Eric Sandeen
2008-07-23  4:04               ` Mark Goodwin
2008-07-23  4:09                 ` Eric Sandeen
2008-07-23  5:00                   ` Mark Goodwin
2008-07-23  4:27                 ` Dave Chinner
2008-07-23  4:18             ` Dave Chinner
2008-07-23 15:37             ` Russell Cattelan
2008-07-24  6:02               ` Mark Goodwin
2008-07-25  3:55                 ` Russell Cattelan
2008-07-25  4:08                   ` Mark Goodwin
2008-07-25  5:40                     ` Russell Cattelan
2008-07-25  6:55                   ` Niv Sardi
2008-07-23 20:49             ` Christoph Hellwig
2008-07-24 11:46               ` Dave Chinner
2008-07-20 12:19 ` [PATCH 3/4] XFS: Traverse inode trees when releasing dquots Dave Chinner
2008-07-20 12:19 ` [PATCH 4/4] XFS: remove the mount inode list Dave Chinner
2008-07-22  4:29   ` Christoph Hellwig
2008-07-22  5:42     ` Dave Chinner

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=20080721075826.GC6692@infradead.org \
    --to=hch@infradead.org \
    --cc=david@fromorbit.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