From: Alex Elder <aelder@sgi.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching
Date: Thu, 29 Apr 2010 08:35:22 -0500 [thread overview]
Message-ID: <1272548122.3221.77.camel@doink> (raw)
In-Reply-To: <20100418001058.677429475@bombadil.infradead.org>
On Sat, 2010-04-17 at 20:10 -0400, Christoph Hellwig wrote:
> plain text document attachment (xfs-buf-match-cleanup)
> We currenly have a routine xfs_trans_buf_item_match_all which checks if any
> log item in a transaction contains a given buffer, and a second one that
> only does this check for the first, embedded chunk of log items. We only
> use the second routine if we know we only have that log item chunk, so get
> rid of the limited routine and always use the more complete one.
>
> Also rename the old xfs_trans_buf_item_match_all to xfs_trans_buf_item_match
> and update various surrounding comments, and move the remaining
> xfs_trans_buf_item_match on top of the file to avoid a forward prototype.
Dave suggested using the xfs_trans_*_item() routines (which maybe
could be renamed xfs_trans_item_*() someday). That is the right
thing to do, but not necessary at this point. In fact I prefer
this smaller change anyway, since it clearly just transforms
the original xfs_trans_buf_item_match_all() code directly to
the new result. The switch to use xfs_trans_*_item() can (and
should) happen as a follow-on patch.
The simplification is good.
Reviewed-by: Alex Elder <aelder@sgi.com>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: xfs/fs/xfs/xfs_trans_buf.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-03-09 22:58:31.307004136 +0100
> +++ xfs/fs/xfs/xfs_trans_buf.c 2010-03-11 11:46:45.052004554 +0100
> @@ -40,11 +40,51 @@
> #include "xfs_rw.h"
> #include "xfs_trace.h"
>
> +/*
> + * Check to see if a buffer matching the given parameters is already
> + * a part of the given transaction.
> + */
> +STATIC struct xfs_buf *
> +xfs_trans_buf_item_match(
> + struct xfs_trans *tp,
> + struct xfs_buftarg *target,
> + xfs_daddr_t blkno,
> + int len)
> +{
> + xfs_log_item_chunk_t *licp;
> + xfs_log_item_desc_t *lidp;
> + xfs_buf_log_item_t *blip;
> + int i;
>
> -STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *,
> - xfs_daddr_t, int);
> -STATIC xfs_buf_t *xfs_trans_buf_item_match_all(xfs_trans_t *, xfs_buftarg_t *,
> - xfs_daddr_t, int);
> + len = BBTOB(len);
> + for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) {
> + if (xfs_lic_are_all_free(licp)) {
> + ASSERT(licp == &tp->t_items);
> + ASSERT(licp->lic_next == NULL);
> + return NULL;
> + }
> +
> + for (i = 0; i < licp->lic_unused; i++) {
> + /*
> + * Skip unoccupied slots.
> + */
> + if (xfs_lic_isfree(licp, i))
> + continue;
> +
> + lidp = xfs_lic_slot(licp, i);
> + blip = (xfs_buf_log_item_t *)lidp->lid_item;
> + if (blip->bli_item.li_type != XFS_LI_BUF)
> + continue;
> +
> + if (XFS_BUF_TARGET(blip->bli_buf) == target &&
> + XFS_BUF_ADDR(blip->bli_buf) == blkno &&
> + XFS_BUF_COUNT(blip->bli_buf) == len)
> + return blip->bli_buf;
> + }
> + }
> +
> + return NULL;
> +}
>
> /*
> * Add the locked buffer to the transaction.
> @@ -112,14 +152,6 @@ xfs_trans_bjoin(
> * within the transaction, just increment its lock recursion count
> * and return a pointer to it.
> *
> - * Use the fast path function xfs_trans_buf_item_match() or the buffer
> - * cache routine incore_match() to find the buffer
> - * if it is already owned by this transaction.
> - *
> - * If we don't already own the buffer, use get_buf() to get it.
> - * If it doesn't yet have an associated xfs_buf_log_item structure,
> - * then allocate one and add the item to this transaction.
> - *
> * If the transaction pointer is NULL, make this just a normal
> * get_buf() call.
> */
> @@ -149,11 +181,7 @@ xfs_trans_get_buf(xfs_trans_t *tp,
> * have it locked. In this case we just increment the lock
> * recursion count and return the buffer to the caller.
> */
> - if (tp->t_items.lic_next == NULL) {
> - bp = xfs_trans_buf_item_match(tp, target_dev, blkno, len);
> - } else {
> - bp = xfs_trans_buf_item_match_all(tp, target_dev, blkno, len);
> - }
> + bp = xfs_trans_buf_item_match(tp, target_dev, blkno, len);
> if (bp != NULL) {
> ASSERT(XFS_BUF_VALUSEMA(bp) <= 0);
> if (XFS_FORCED_SHUTDOWN(tp->t_mountp))
> @@ -259,14 +287,6 @@ int xfs_error_mod = 33;
> * within the transaction and already read in, just increment its
> * lock recursion count and return a pointer to it.
> *
> - * Use the fast path function xfs_trans_buf_item_match() or the buffer
> - * cache routine incore_match() to find the buffer
> - * if it is already owned by this transaction.
> - *
> - * If we don't already own the buffer, use read_buf() to get it.
> - * If it doesn't yet have an associated xfs_buf_log_item structure,
> - * then allocate one and add the item to this transaction.
> - *
> * If the transaction pointer is NULL, make this just a normal
> * read_buf() call.
> */
> @@ -328,11 +348,7 @@ xfs_trans_read_buf(
> * If the buffer is not yet read in, then we read it in, increment
> * the lock recursion count, and return it to the caller.
> */
> - if (tp->t_items.lic_next == NULL) {
> - bp = xfs_trans_buf_item_match(tp, target, blkno, len);
> - } else {
> - bp = xfs_trans_buf_item_match_all(tp, target, blkno, len);
> - }
> + bp = xfs_trans_buf_item_match(tp, target, blkno, len);
> if (bp != NULL) {
> ASSERT(XFS_BUF_VALUSEMA(bp) <= 0);
> ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp);
> @@ -901,111 +917,3 @@ xfs_trans_dquot_buf(
>
> bip->bli_format.blf_flags |= type;
> }
> -
> -/*
> - * Check to see if a buffer matching the given parameters is already
> - * a part of the given transaction. Only check the first, embedded
> - * chunk, since we don't want to spend all day scanning large transactions.
> - */
> -STATIC xfs_buf_t *
> -xfs_trans_buf_item_match(
> - xfs_trans_t *tp,
> - xfs_buftarg_t *target,
> - xfs_daddr_t blkno,
> - int len)
> -{
> - xfs_log_item_chunk_t *licp;
> - xfs_log_item_desc_t *lidp;
> - xfs_buf_log_item_t *blip;
> - xfs_buf_t *bp;
> - int i;
> -
> - bp = NULL;
> - len = BBTOB(len);
> - licp = &tp->t_items;
> - if (!xfs_lic_are_all_free(licp)) {
> - for (i = 0; i < licp->lic_unused; i++) {
> - /*
> - * Skip unoccupied slots.
> - */
> - if (xfs_lic_isfree(licp, i)) {
> - continue;
> - }
> -
> - lidp = xfs_lic_slot(licp, i);
> - blip = (xfs_buf_log_item_t *)lidp->lid_item;
> - if (blip->bli_item.li_type != XFS_LI_BUF) {
> - continue;
> - }
> -
> - bp = blip->bli_buf;
> - if ((XFS_BUF_TARGET(bp) == target) &&
> - (XFS_BUF_ADDR(bp) == blkno) &&
> - (XFS_BUF_COUNT(bp) == len)) {
> - /*
> - * We found it. Break out and
> - * return the pointer to the buffer.
> - */
> - break;
> - } else {
> - bp = NULL;
> - }
> - }
> - }
> - return bp;
> -}
> -
> -/*
> - * Check to see if a buffer matching the given parameters is already
> - * a part of the given transaction. Check all the chunks, we
> - * want to be thorough.
> - */
> -STATIC xfs_buf_t *
> -xfs_trans_buf_item_match_all(
> - xfs_trans_t *tp,
> - xfs_buftarg_t *target,
> - xfs_daddr_t blkno,
> - int len)
> -{
> - xfs_log_item_chunk_t *licp;
> - xfs_log_item_desc_t *lidp;
> - xfs_buf_log_item_t *blip;
> - xfs_buf_t *bp;
> - int i;
> -
> - bp = NULL;
> - len = BBTOB(len);
> - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) {
> - if (xfs_lic_are_all_free(licp)) {
> - ASSERT(licp == &tp->t_items);
> - ASSERT(licp->lic_next == NULL);
> - return NULL;
> - }
> - for (i = 0; i < licp->lic_unused; i++) {
> - /*
> - * Skip unoccupied slots.
> - */
> - if (xfs_lic_isfree(licp, i)) {
> - continue;
> - }
> -
> - lidp = xfs_lic_slot(licp, i);
> - blip = (xfs_buf_log_item_t *)lidp->lid_item;
> - if (blip->bli_item.li_type != XFS_LI_BUF) {
> - continue;
> - }
> -
> - bp = blip->bli_buf;
> - if ((XFS_BUF_TARGET(bp) == target) &&
> - (XFS_BUF_ADDR(bp) == blkno) &&
> - (XFS_BUF_COUNT(bp) == len)) {
> - /*
> - * We found it. Break out and
> - * return the pointer to the buffer.
> - */
> - return bp;
> - }
> - }
> - }
> - return NULL;
> -}
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2010-04-29 13:35 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-18 0:10 [PATCH 0/5] various cleanups for 2.6.35 Christoph Hellwig
2010-04-18 0:10 ` [PATCH 1/5] xfs: access quotainfo structure directly Christoph Hellwig
2010-04-20 6:28 ` Dave Chinner
2010-04-18 0:10 ` [PATCH 2/5] xfs: remove a few macro indirections in the quota code Christoph Hellwig
2010-04-20 6:31 ` Dave Chinner
2010-04-18 0:10 ` [PATCH 3/5] xfs: removed unused XFS_QMOPT_ flags Christoph Hellwig
2010-04-20 6:33 ` Dave Chinner
2010-04-22 11:49 ` Christoph Hellwig
2010-04-18 0:10 ` [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching Christoph Hellwig
2010-04-20 6:41 ` Dave Chinner
2010-05-01 12:58 ` Christoph Hellwig
2010-05-03 4:23 ` Dave Chinner
2010-04-27 14:16 ` Christoph Hellwig
2010-04-29 13:35 ` Alex Elder [this message]
2010-04-29 13:38 ` Christoph Hellwig
2010-04-18 0:10 ` [PATCH 5/5] xfs: remove dead XFS_LOUD_RECOVERY code Christoph Hellwig
2010-04-20 6:44 ` 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=1272548122.3221.77.camel@doink \
--to=aelder@sgi.com \
--cc=hch@infradead.org \
--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