linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Minor cleanups
@ 2019-08-13  9:03 Nikolay Borisov
  2019-08-13  9:03 ` [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere Nikolay Borisov
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13  9:03 UTC (permalink / raw)
  To: linux-xfs; +Cc: darrick.wong, Nikolay Borisov

While digging around xfs' buf code I spotted a couple of cleanup candidates
which resulted in this patch. It should hopefully make the code easier to inspect
by reducing the 'hops' to the actual implementation of buffer submission. 

Nikolay Borisov (3):
  xfs: Use __xfs_buf_submit everywhere
  xfs: Rename __xfs_buf_submit to xfs_buf_submit
  xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP

 fs/xfs/xfs_buf.c         | 16 +++++++++-------
 fs/xfs/xfs_buf.h         | 16 ++++------------
 fs/xfs/xfs_buf_item.c    |  2 +-
 fs/xfs/xfs_log_recover.c |  2 +-
 fs/xfs/xfs_trans.h       |  6 ++++--
 5 files changed, 19 insertions(+), 23 deletions(-)

-- 
2.17.1

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere
  2019-08-13  9:03 [PATCH 0/3] Minor cleanups Nikolay Borisov
@ 2019-08-13  9:03 ` Nikolay Borisov
  2019-08-13 11:55   ` Brian Foster
  2019-08-13  9:03 ` [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit Nikolay Borisov
  2019-08-13  9:03 ` [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP Nikolay Borisov
  2 siblings, 1 reply; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13  9:03 UTC (permalink / raw)
  To: linux-xfs; +Cc: darrick.wong, Nikolay Borisov

Currently xfs_buf_submit is used as a tiny wrapper to __xfs_buf_submit.
It only checks whether XFB_ASYNC flag is set and sets the second
parameter to __xfs_buf_submit accordingly. It's possible to remove the
level of indirection since in all contexts where xfs_buf_submit is
called we already know if XBF_ASYNC is set or not.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
 fs/xfs/xfs_buf.c         | 8 +++++---
 fs/xfs/xfs_buf_item.c    | 2 +-
 fs/xfs/xfs_log_recover.c | 2 +-
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index ca0849043f54..a75d05e49a98 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -751,13 +751,15 @@ _xfs_buf_read(
 	xfs_buf_t		*bp,
 	xfs_buf_flags_t		flags)
 {
+	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
+
 	ASSERT(!(flags & XBF_WRITE));
 	ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL);
 
 	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
 	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
 
-	return xfs_buf_submit(bp);
+	return __xfs_buf_submit(bp, wait);
 }
 
 /*
@@ -883,7 +885,7 @@ xfs_buf_read_uncached(
 	bp->b_flags |= XBF_READ;
 	bp->b_ops = ops;
 
-	xfs_buf_submit(bp);
+	__xfs_buf_submit(bp, true);
 	if (bp->b_error) {
 		int	error = bp->b_error;
 		xfs_buf_relse(bp);
@@ -1214,7 +1216,7 @@ xfs_bwrite(
 	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
 			 XBF_WRITE_FAIL | XBF_DONE);
 
-	error = xfs_buf_submit(bp);
+	error = __xfs_buf_submit(bp, true);
 	if (error)
 		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
 	return error;
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 7dcaec54a20b..fef08980dd21 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
 			bp->b_first_retry_time = jiffies;
 
 		xfs_buf_ioerror(bp, 0);
-		xfs_buf_submit(bp);
+		__xfs_buf_submit(bp, false);
 		return true;
 	}
 
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 13d1d3e95b88..64e315f80147 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -5610,7 +5610,7 @@ xlog_do_recover(
 	bp->b_flags |= XBF_READ;
 	bp->b_ops = &xfs_sb_buf_ops;
 
-	error = xfs_buf_submit(bp);
+	error = __xfs_buf_submit(bp, true);
 	if (error) {
 		if (!XFS_FORCED_SHUTDOWN(mp)) {
 			xfs_buf_ioerror_alert(bp, __func__);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit
  2019-08-13  9:03 [PATCH 0/3] Minor cleanups Nikolay Borisov
  2019-08-13  9:03 ` [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere Nikolay Borisov
@ 2019-08-13  9:03 ` Nikolay Borisov
  2019-08-13 11:56   ` Brian Foster
  2019-08-13  9:03 ` [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP Nikolay Borisov
  2 siblings, 1 reply; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13  9:03 UTC (permalink / raw)
  To: linux-xfs; +Cc: darrick.wong, Nikolay Borisov

Since xfs_buf_submit no longer has any callers just rename its __
prefixed counterpart.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
 fs/xfs/xfs_buf.c         | 10 +++++-----
 fs/xfs/xfs_buf.h         |  7 +------
 fs/xfs/xfs_buf_item.c    |  2 +-
 fs/xfs/xfs_log_recover.c |  2 +-
 4 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index a75d05e49a98..99c66f80d7cc 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -759,7 +759,7 @@ _xfs_buf_read(
 	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
 	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
 
-	return __xfs_buf_submit(bp, wait);
+	return xfs_buf_submit(bp, wait);
 }
 
 /*
@@ -885,7 +885,7 @@ xfs_buf_read_uncached(
 	bp->b_flags |= XBF_READ;
 	bp->b_ops = ops;
 
-	__xfs_buf_submit(bp, true);
+	xfs_buf_submit(bp, true);
 	if (bp->b_error) {
 		int	error = bp->b_error;
 		xfs_buf_relse(bp);
@@ -1216,7 +1216,7 @@ xfs_bwrite(
 	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
 			 XBF_WRITE_FAIL | XBF_DONE);
 
-	error = __xfs_buf_submit(bp, true);
+	error = xfs_buf_submit(bp, true);
 	if (error)
 		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
 	return error;
@@ -1427,7 +1427,7 @@ xfs_buf_iowait(
  * holds an additional reference itself.
  */
 int
-__xfs_buf_submit(
+xfs_buf_submit(
 	struct xfs_buf	*bp,
 	bool		wait)
 {
@@ -1929,7 +1929,7 @@ xfs_buf_delwri_submit_buffers(
 			bp->b_flags |= XBF_ASYNC;
 			list_del_init(&bp->b_list);
 		}
-		__xfs_buf_submit(bp, false);
+		xfs_buf_submit(bp, false);
 	}
 	blk_finish_plug(&plug);
 
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
index c6e57a3f409e..ec7037284d62 100644
--- a/fs/xfs/xfs_buf.h
+++ b/fs/xfs/xfs_buf.h
@@ -262,12 +262,7 @@ extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error,
 #define xfs_buf_ioerror(bp, err) __xfs_buf_ioerror((bp), (err), __this_address)
 extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func);
 
-extern int __xfs_buf_submit(struct xfs_buf *bp, bool);
-static inline int xfs_buf_submit(struct xfs_buf *bp)
-{
-	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
-	return __xfs_buf_submit(bp, wait);
-}
+extern int xfs_buf_submit(struct xfs_buf *bp, bool);
 
 void xfs_buf_zero(struct xfs_buf *bp, size_t boff, size_t bsize);
 
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index fef08980dd21..93f38fdceb80 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
 			bp->b_first_retry_time = jiffies;
 
 		xfs_buf_ioerror(bp, 0);
-		__xfs_buf_submit(bp, false);
+		xfs_buf_submit(bp, false);
 		return true;
 	}
 
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 64e315f80147..9b7822638f83 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -5610,7 +5610,7 @@ xlog_do_recover(
 	bp->b_flags |= XBF_READ;
 	bp->b_ops = &xfs_sb_buf_ops;
 
-	error = __xfs_buf_submit(bp, true);
+	error = xfs_buf_submit(bp, true);
 	if (error) {
 		if (!XFS_FORCED_SHUTDOWN(mp)) {
 			xfs_buf_ioerror_alert(bp, __func__);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP
  2019-08-13  9:03 [PATCH 0/3] Minor cleanups Nikolay Borisov
  2019-08-13  9:03 ` [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere Nikolay Borisov
  2019-08-13  9:03 ` [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit Nikolay Borisov
@ 2019-08-13  9:03 ` Nikolay Borisov
  2019-08-13 11:57   ` Brian Foster
  2019-08-14 10:23   ` Dave Chinner
  2 siblings, 2 replies; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13  9:03 UTC (permalink / raw)
  To: linux-xfs; +Cc: darrick.wong, Nikolay Borisov

This macro encodes a trivial struct initializations, just open code it.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
 fs/xfs/xfs_buf.c   | 4 ++--
 fs/xfs/xfs_buf.h   | 9 +++------
 fs/xfs/xfs_trans.h | 6 ++++--
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 99c66f80d7cc..389c5b590f11 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -658,7 +658,7 @@ xfs_buf_incore(
 {
 	struct xfs_buf		*bp;
 	int			error;
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
 
 	error = xfs_buf_find(target, &map, 1, flags, NULL, &bp);
 	if (error)
@@ -905,7 +905,7 @@ xfs_buf_get_uncached(
 	unsigned long		page_count;
 	int			error, i;
 	struct xfs_buf		*bp;
-	DEFINE_SINGLE_BUF_MAP(map, XFS_BUF_DADDR_NULL, numblks);
+	struct xfs_buf_map map = { .bm_bn = XFS_BUF_DADDR_NULL, .bm_len = numblks };
 
 	/* flags might contain irrelevant bits, pass only what we care about */
 	bp = _xfs_buf_alloc(target, &map, 1, flags & XBF_NO_IOACCT);
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
index ec7037284d62..548dfb0c6e27 100644
--- a/fs/xfs/xfs_buf.h
+++ b/fs/xfs/xfs_buf.h
@@ -104,9 +104,6 @@ struct xfs_buf_map {
 	int			bm_len;	/* size of I/O */
 };
 
-#define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \
-	struct xfs_buf_map (map) = { .bm_bn = (blkno), .bm_len = (numblk) };
-
 struct xfs_buf_ops {
 	char *name;
 	union {
@@ -209,7 +206,7 @@ xfs_buf_get(
 	xfs_daddr_t		blkno,
 	size_t			numblks)
 {
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
 	return xfs_buf_get_map(target, &map, 1, 0);
 }
 
@@ -221,7 +218,7 @@ xfs_buf_read(
 	xfs_buf_flags_t		flags,
 	const struct xfs_buf_ops *ops)
 {
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
 	return xfs_buf_read_map(target, &map, 1, flags, ops);
 }
 
@@ -232,7 +229,7 @@ xfs_buf_readahead(
 	size_t			numblks,
 	const struct xfs_buf_ops *ops)
 {
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
 	return xfs_buf_readahead_map(target, &map, 1, ops);
 }
 
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
index 64d7f171ebd3..8d6fce5c0320 100644
--- a/fs/xfs/xfs_trans.h
+++ b/fs/xfs/xfs_trans.h
@@ -182,7 +182,8 @@ xfs_trans_get_buf(
 	int			numblks,
 	uint			flags)
 {
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
+
 	return xfs_trans_get_buf_map(tp, target, &map, 1, flags);
 }
 
@@ -205,7 +206,8 @@ xfs_trans_read_buf(
 	struct xfs_buf		**bpp,
 	const struct xfs_buf_ops *ops)
 {
-	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
+
 	return xfs_trans_read_buf_map(mp, tp, target, &map, 1,
 				      flags, bpp, ops);
 }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere
  2019-08-13  9:03 ` [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere Nikolay Borisov
@ 2019-08-13 11:55   ` Brian Foster
  2019-08-13 12:06     ` Nikolay Borisov
  0 siblings, 1 reply; 11+ messages in thread
From: Brian Foster @ 2019-08-13 11:55 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-xfs, darrick.wong

On Tue, Aug 13, 2019 at 12:03:04PM +0300, Nikolay Borisov wrote:
> Currently xfs_buf_submit is used as a tiny wrapper to __xfs_buf_submit.
> It only checks whether XFB_ASYNC flag is set and sets the second
> parameter to __xfs_buf_submit accordingly. It's possible to remove the
> level of indirection since in all contexts where xfs_buf_submit is
> called we already know if XBF_ASYNC is set or not.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---

Random nit: the use of upper case in the first word of the commit log
subject line kind of stands out to me. I know there are other instances
of this (I think I noticed one the other day), but my presumption was
that it was random/accidental where your patches seem to do it
intentionally. Do we have a common practice here? Do we care? I prefer
consistency of using lower case for normal text, but it's really just a
nit.

>  fs/xfs/xfs_buf.c         | 8 +++++---
>  fs/xfs/xfs_buf_item.c    | 2 +-
>  fs/xfs/xfs_log_recover.c | 2 +-
>  3 files changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index ca0849043f54..a75d05e49a98 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -751,13 +751,15 @@ _xfs_buf_read(
>  	xfs_buf_t		*bp,
>  	xfs_buf_flags_t		flags)
>  {
> +	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
> +

This doesn't look quite right. Just below we clear several flags from
->b_flags then potentially reapply based on the flags parameter. Hence,
I think ->b_flags above may not reflect ->b_flags by the time we call
__xfs_buf_submit().

Brian

>  	ASSERT(!(flags & XBF_WRITE));
>  	ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL);
>  
>  	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
>  	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
>  
> -	return xfs_buf_submit(bp);
> +	return __xfs_buf_submit(bp, wait);
>  }
>  
>  /*
> @@ -883,7 +885,7 @@ xfs_buf_read_uncached(
>  	bp->b_flags |= XBF_READ;
>  	bp->b_ops = ops;
>  
> -	xfs_buf_submit(bp);
> +	__xfs_buf_submit(bp, true);
>  	if (bp->b_error) {
>  		int	error = bp->b_error;
>  		xfs_buf_relse(bp);
> @@ -1214,7 +1216,7 @@ xfs_bwrite(
>  	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
>  			 XBF_WRITE_FAIL | XBF_DONE);
>  
> -	error = xfs_buf_submit(bp);
> +	error = __xfs_buf_submit(bp, true);
>  	if (error)
>  		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
>  	return error;
> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
> index 7dcaec54a20b..fef08980dd21 100644
> --- a/fs/xfs/xfs_buf_item.c
> +++ b/fs/xfs/xfs_buf_item.c
> @@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
>  			bp->b_first_retry_time = jiffies;
>  
>  		xfs_buf_ioerror(bp, 0);
> -		xfs_buf_submit(bp);
> +		__xfs_buf_submit(bp, false);
>  		return true;
>  	}
>  
> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
> index 13d1d3e95b88..64e315f80147 100644
> --- a/fs/xfs/xfs_log_recover.c
> +++ b/fs/xfs/xfs_log_recover.c
> @@ -5610,7 +5610,7 @@ xlog_do_recover(
>  	bp->b_flags |= XBF_READ;
>  	bp->b_ops = &xfs_sb_buf_ops;
>  
> -	error = xfs_buf_submit(bp);
> +	error = __xfs_buf_submit(bp, true);
>  	if (error) {
>  		if (!XFS_FORCED_SHUTDOWN(mp)) {
>  			xfs_buf_ioerror_alert(bp, __func__);
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit
  2019-08-13  9:03 ` [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit Nikolay Borisov
@ 2019-08-13 11:56   ` Brian Foster
  2019-08-14 10:14     ` Dave Chinner
  0 siblings, 1 reply; 11+ messages in thread
From: Brian Foster @ 2019-08-13 11:56 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-xfs, darrick.wong

On Tue, Aug 13, 2019 at 12:03:05PM +0300, Nikolay Borisov wrote:
> Since xfs_buf_submit no longer has any callers just rename its __
> prefixed counterpart.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---

Now we have a primary submission interface that allows combinations of
XBF_ASYNC and waiting or not while the underlying mechanisms are not so
flexible. It looks like the current factoring exists to support delwri
queues where we never wait in buffer submission regardless of async
state because we are batching the submission/wait across multiple
buffers. But what happens if a caller passes an async buffer with wait
== true? I/O completion only completes ->b_iowait if XBF_ASYNC is clear.

I find this rather confusing because now a caller needs to know about
implementation details to use the function properly. That's already true
of __xfs_buf_submit(), but that's partly why it's named as an "internal"
function. I think we ultimately need the interface flexibility so the
delwri case can continue to work. One option could be to update
xfs_buf_submit() such that we never wait on an XBF_ASYNC buffer and add
an assert to flag wait == true as invalid, but TBH I'm not convinced
this is any simpler than the current interface where most callers simply
only need to care about the flag. Maybe others have thoughts...

Brian

>  fs/xfs/xfs_buf.c         | 10 +++++-----
>  fs/xfs/xfs_buf.h         |  7 +------
>  fs/xfs/xfs_buf_item.c    |  2 +-
>  fs/xfs/xfs_log_recover.c |  2 +-
>  4 files changed, 8 insertions(+), 13 deletions(-)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index a75d05e49a98..99c66f80d7cc 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -759,7 +759,7 @@ _xfs_buf_read(
>  	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
>  	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
>  
> -	return __xfs_buf_submit(bp, wait);
> +	return xfs_buf_submit(bp, wait);
>  }
>  
>  /*
> @@ -885,7 +885,7 @@ xfs_buf_read_uncached(
>  	bp->b_flags |= XBF_READ;
>  	bp->b_ops = ops;
>  
> -	__xfs_buf_submit(bp, true);
> +	xfs_buf_submit(bp, true);
>  	if (bp->b_error) {
>  		int	error = bp->b_error;
>  		xfs_buf_relse(bp);
> @@ -1216,7 +1216,7 @@ xfs_bwrite(
>  	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
>  			 XBF_WRITE_FAIL | XBF_DONE);
>  
> -	error = __xfs_buf_submit(bp, true);
> +	error = xfs_buf_submit(bp, true);
>  	if (error)
>  		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
>  	return error;
> @@ -1427,7 +1427,7 @@ xfs_buf_iowait(
>   * holds an additional reference itself.
>   */
>  int
> -__xfs_buf_submit(
> +xfs_buf_submit(
>  	struct xfs_buf	*bp,
>  	bool		wait)
>  {
> @@ -1929,7 +1929,7 @@ xfs_buf_delwri_submit_buffers(
>  			bp->b_flags |= XBF_ASYNC;
>  			list_del_init(&bp->b_list);
>  		}
> -		__xfs_buf_submit(bp, false);
> +		xfs_buf_submit(bp, false);
>  	}
>  	blk_finish_plug(&plug);
>  
> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
> index c6e57a3f409e..ec7037284d62 100644
> --- a/fs/xfs/xfs_buf.h
> +++ b/fs/xfs/xfs_buf.h
> @@ -262,12 +262,7 @@ extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error,
>  #define xfs_buf_ioerror(bp, err) __xfs_buf_ioerror((bp), (err), __this_address)
>  extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func);
>  
> -extern int __xfs_buf_submit(struct xfs_buf *bp, bool);
> -static inline int xfs_buf_submit(struct xfs_buf *bp)
> -{
> -	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
> -	return __xfs_buf_submit(bp, wait);
> -}
> +extern int xfs_buf_submit(struct xfs_buf *bp, bool);
>  
>  void xfs_buf_zero(struct xfs_buf *bp, size_t boff, size_t bsize);
>  
> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
> index fef08980dd21..93f38fdceb80 100644
> --- a/fs/xfs/xfs_buf_item.c
> +++ b/fs/xfs/xfs_buf_item.c
> @@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
>  			bp->b_first_retry_time = jiffies;
>  
>  		xfs_buf_ioerror(bp, 0);
> -		__xfs_buf_submit(bp, false);
> +		xfs_buf_submit(bp, false);
>  		return true;
>  	}
>  
> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
> index 64e315f80147..9b7822638f83 100644
> --- a/fs/xfs/xfs_log_recover.c
> +++ b/fs/xfs/xfs_log_recover.c
> @@ -5610,7 +5610,7 @@ xlog_do_recover(
>  	bp->b_flags |= XBF_READ;
>  	bp->b_ops = &xfs_sb_buf_ops;
>  
> -	error = __xfs_buf_submit(bp, true);
> +	error = xfs_buf_submit(bp, true);
>  	if (error) {
>  		if (!XFS_FORCED_SHUTDOWN(mp)) {
>  			xfs_buf_ioerror_alert(bp, __func__);
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP
  2019-08-13  9:03 ` [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP Nikolay Borisov
@ 2019-08-13 11:57   ` Brian Foster
  2019-08-14 10:23   ` Dave Chinner
  1 sibling, 0 replies; 11+ messages in thread
From: Brian Foster @ 2019-08-13 11:57 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-xfs, darrick.wong

On Tue, Aug 13, 2019 at 12:03:06PM +0300, Nikolay Borisov wrote:
> This macro encodes a trivial struct initializations, just open code it.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---

Seems fine:

Reviewed-by: Brian Foster <bfoster@redhat.com>

What might be more interesting is to audit the cases where nmap is
always 1 and see if we can start eliminating some of this code where it
isn't needed. For example, it looks xfs_buf_readahead_map() only ever
uses nmap == 1. Can we pass a block/len directly there and push the
map/nmap parameters further down the stack? FWIW, I also see several
functions on a quick glance (xfs_dabuf_map(), xfs_buf_map_from_irec())
that take map/nmaps params, assert that nmaps == 1 yet still have
iteration code for nmap > 1 cases.

>  fs/xfs/xfs_buf.c   | 4 ++--
>  fs/xfs/xfs_buf.h   | 9 +++------
>  fs/xfs/xfs_trans.h | 6 ++++--
>  3 files changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index 99c66f80d7cc..389c5b590f11 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -658,7 +658,7 @@ xfs_buf_incore(
>  {
>  	struct xfs_buf		*bp;
>  	int			error;
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
>  
>  	error = xfs_buf_find(target, &map, 1, flags, NULL, &bp);
>  	if (error)
> @@ -905,7 +905,7 @@ xfs_buf_get_uncached(
>  	unsigned long		page_count;
>  	int			error, i;
>  	struct xfs_buf		*bp;
> -	DEFINE_SINGLE_BUF_MAP(map, XFS_BUF_DADDR_NULL, numblks);
> +	struct xfs_buf_map map = { .bm_bn = XFS_BUF_DADDR_NULL, .bm_len = numblks };
>  
>  	/* flags might contain irrelevant bits, pass only what we care about */
>  	bp = _xfs_buf_alloc(target, &map, 1, flags & XBF_NO_IOACCT);
> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
> index ec7037284d62..548dfb0c6e27 100644
> --- a/fs/xfs/xfs_buf.h
> +++ b/fs/xfs/xfs_buf.h
> @@ -104,9 +104,6 @@ struct xfs_buf_map {
>  	int			bm_len;	/* size of I/O */
>  };
>  
> -#define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \
> -	struct xfs_buf_map (map) = { .bm_bn = (blkno), .bm_len = (numblk) };
> -
>  struct xfs_buf_ops {
>  	char *name;
>  	union {
> @@ -209,7 +206,7 @@ xfs_buf_get(
>  	xfs_daddr_t		blkno,
>  	size_t			numblks)
>  {
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
>  	return xfs_buf_get_map(target, &map, 1, 0);
>  }
>  
> @@ -221,7 +218,7 @@ xfs_buf_read(
>  	xfs_buf_flags_t		flags,
>  	const struct xfs_buf_ops *ops)
>  {
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
>  	return xfs_buf_read_map(target, &map, 1, flags, ops);
>  }
>  
> @@ -232,7 +229,7 @@ xfs_buf_readahead(
>  	size_t			numblks,
>  	const struct xfs_buf_ops *ops)
>  {
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
>  	return xfs_buf_readahead_map(target, &map, 1, ops);
>  }
>  
> diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
> index 64d7f171ebd3..8d6fce5c0320 100644
> --- a/fs/xfs/xfs_trans.h
> +++ b/fs/xfs/xfs_trans.h
> @@ -182,7 +182,8 @@ xfs_trans_get_buf(
>  	int			numblks,
>  	uint			flags)
>  {
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
> +
>  	return xfs_trans_get_buf_map(tp, target, &map, 1, flags);
>  }
>  
> @@ -205,7 +206,8 @@ xfs_trans_read_buf(
>  	struct xfs_buf		**bpp,
>  	const struct xfs_buf_ops *ops)
>  {
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };
> +
>  	return xfs_trans_read_buf_map(mp, tp, target, &map, 1,
>  				      flags, bpp, ops);
>  }
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere
  2019-08-13 11:55   ` Brian Foster
@ 2019-08-13 12:06     ` Nikolay Borisov
  2019-08-13 12:15       ` Nikolay Borisov
  0 siblings, 1 reply; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13 12:06 UTC (permalink / raw)
  To: Brian Foster; +Cc: darrick.wong, linux-xfs



On 13.08.19 г. 14:55 ч., Brian Foster wrote:
> On Tue, Aug 13, 2019 at 12:03:04PM +0300, Nikolay Borisov wrote:
>> Currently xfs_buf_submit is used as a tiny wrapper to __xfs_buf_submit.
>> It only checks whether XFB_ASYNC flag is set and sets the second
>> parameter to __xfs_buf_submit accordingly. It's possible to remove the
>> level of indirection since in all contexts where xfs_buf_submit is
>> called we already know if XBF_ASYNC is set or not.
>>
>> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
>> ---
> 
> Random nit: the use of upper case in the first word of the commit log
> subject line kind of stands out to me. I know there are other instances
> of this (I think I noticed one the other day), but my presumption was
> that it was random/accidental where your patches seem to do it
> intentionally. Do we have a common practice here? Do we care? I prefer
> consistency of using lower case for normal text, but it's really just a
> nit.

I consider the commit log subject and commit log body to be 2 separate
paragraphs, hence I start each one with capital letter.

> 
>>  fs/xfs/xfs_buf.c         | 8 +++++---
>>  fs/xfs/xfs_buf_item.c    | 2 +-
>>  fs/xfs/xfs_log_recover.c | 2 +-
>>  3 files changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
>> index ca0849043f54..a75d05e49a98 100644
>> --- a/fs/xfs/xfs_buf.c
>> +++ b/fs/xfs/xfs_buf.c
>> @@ -751,13 +751,15 @@ _xfs_buf_read(
>>  	xfs_buf_t		*bp,
>>  	xfs_buf_flags_t		flags)
>>  {
>> +	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
>> +
> 
> This doesn't look quite right. Just below we clear several flags from
> ->b_flags then potentially reapply based on the flags parameter. Hence,
> I think ->b_flags above may not reflect ->b_flags by the time we call
> __xfs_buf_submit().

It's correct the flag clearing/setting ensures that the only flags we
have in bp->b_flags are in the set: flags & (XBF_READ | XBF_ASYNC |
XBF_READ_AHEAD);

So if XBF_ASYNC was set initially it will also be set when we call
xfs_buf_submit.


> 
> Brian
> 
>>  	ASSERT(!(flags & XBF_WRITE));
>>  	ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL);
>>  
>>  	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
>>  	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
>>  
>> -	return xfs_buf_submit(bp);
>> +	return __xfs_buf_submit(bp, wait);
>>  }
>>  
>>  /*
>> @@ -883,7 +885,7 @@ xfs_buf_read_uncached(
>>  	bp->b_flags |= XBF_READ;
>>  	bp->b_ops = ops;
>>  
>> -	xfs_buf_submit(bp);
>> +	__xfs_buf_submit(bp, true);
>>  	if (bp->b_error) {
>>  		int	error = bp->b_error;
>>  		xfs_buf_relse(bp);
>> @@ -1214,7 +1216,7 @@ xfs_bwrite(
>>  	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
>>  			 XBF_WRITE_FAIL | XBF_DONE);
>>  
>> -	error = xfs_buf_submit(bp);
>> +	error = __xfs_buf_submit(bp, true);
>>  	if (error)
>>  		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
>>  	return error;
>> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
>> index 7dcaec54a20b..fef08980dd21 100644
>> --- a/fs/xfs/xfs_buf_item.c
>> +++ b/fs/xfs/xfs_buf_item.c
>> @@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
>>  			bp->b_first_retry_time = jiffies;
>>  
>>  		xfs_buf_ioerror(bp, 0);
>> -		xfs_buf_submit(bp);
>> +		__xfs_buf_submit(bp, false);
>>  		return true;
>>  	}
>>  
>> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
>> index 13d1d3e95b88..64e315f80147 100644
>> --- a/fs/xfs/xfs_log_recover.c
>> +++ b/fs/xfs/xfs_log_recover.c
>> @@ -5610,7 +5610,7 @@ xlog_do_recover(
>>  	bp->b_flags |= XBF_READ;
>>  	bp->b_ops = &xfs_sb_buf_ops;
>>  
>> -	error = xfs_buf_submit(bp);
>> +	error = __xfs_buf_submit(bp, true);
>>  	if (error) {
>>  		if (!XFS_FORCED_SHUTDOWN(mp)) {
>>  			xfs_buf_ioerror_alert(bp, __func__);
>> -- 
>> 2.17.1
>>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere
  2019-08-13 12:06     ` Nikolay Borisov
@ 2019-08-13 12:15       ` Nikolay Borisov
  0 siblings, 0 replies; 11+ messages in thread
From: Nikolay Borisov @ 2019-08-13 12:15 UTC (permalink / raw)
  To: Brian Foster; +Cc: darrick.wong, linux-xfs



On 13.08.19 г. 15:06 ч., Nikolay Borisov wrote:
> 
> 
> On 13.08.19 г. 14:55 ч., Brian Foster wrote:
>> On Tue, Aug 13, 2019 at 12:03:04PM +0300, Nikolay Borisov wrote:
>>> Currently xfs_buf_submit is used as a tiny wrapper to __xfs_buf_submit.
>>> It only checks whether XFB_ASYNC flag is set and sets the second
>>> parameter to __xfs_buf_submit accordingly. It's possible to remove the
>>> level of indirection since in all contexts where xfs_buf_submit is
>>> called we already know if XBF_ASYNC is set or not.
>>>
>>> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
>>> ---
>>
>> Random nit: the use of upper case in the first word of the commit log
>> subject line kind of stands out to me. I know there are other instances
>> of this (I think I noticed one the other day), but my presumption was
>> that it was random/accidental where your patches seem to do it
>> intentionally. Do we have a common practice here? Do we care? I prefer
>> consistency of using lower case for normal text, but it's really just a
>> nit.
> 
> I consider the commit log subject and commit log body to be 2 separate
> paragraphs, hence I start each one with capital letter.
> 
>>
>>>  fs/xfs/xfs_buf.c         | 8 +++++---
>>>  fs/xfs/xfs_buf_item.c    | 2 +-
>>>  fs/xfs/xfs_log_recover.c | 2 +-
>>>  3 files changed, 7 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
>>> index ca0849043f54..a75d05e49a98 100644
>>> --- a/fs/xfs/xfs_buf.c
>>> +++ b/fs/xfs/xfs_buf.c
>>> @@ -751,13 +751,15 @@ _xfs_buf_read(
>>>  	xfs_buf_t		*bp,
>>>  	xfs_buf_flags_t		flags)
>>>  {
>>> +	bool wait = bp->b_flags & XBF_ASYNC ? false : true;
>>> +
>>
>> This doesn't look quite right. Just below we clear several flags from
>> ->b_flags then potentially reapply based on the flags parameter. Hence,
>> I think ->b_flags above may not reflect ->b_flags by the time we call
>> __xfs_buf_submit().
> 
> It's correct the flag clearing/setting ensures that the only flags we
> have in bp->b_flags are in the set: flags & (XBF_READ | XBF_ASYNC |
> XBF_READ_AHEAD);
> 
> So if XBF_ASYNC was set initially it will also be set when we call
> xfs_buf_submit.

Ah, I see what you meant, indeed the correct check would be :

flags & XBF_ASYNC ...

I will wait to see if people actually consider this series useful and
then resubmit a fixed version.

> 
> 
>>
>> Brian
>>
>>>  	ASSERT(!(flags & XBF_WRITE));
>>>  	ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL);
>>>  
>>>  	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);
>>>  	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD);
>>>  
>>> -	return xfs_buf_submit(bp);
>>> +	return __xfs_buf_submit(bp, wait);
>>>  }
>>>  
>>>  /*
>>> @@ -883,7 +885,7 @@ xfs_buf_read_uncached(
>>>  	bp->b_flags |= XBF_READ;
>>>  	bp->b_ops = ops;
>>>  
>>> -	xfs_buf_submit(bp);
>>> +	__xfs_buf_submit(bp, true);
>>>  	if (bp->b_error) {
>>>  		int	error = bp->b_error;
>>>  		xfs_buf_relse(bp);
>>> @@ -1214,7 +1216,7 @@ xfs_bwrite(
>>>  	bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
>>>  			 XBF_WRITE_FAIL | XBF_DONE);
>>>  
>>> -	error = xfs_buf_submit(bp);
>>> +	error = __xfs_buf_submit(bp, true);
>>>  	if (error)
>>>  		xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
>>>  	return error;
>>> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
>>> index 7dcaec54a20b..fef08980dd21 100644
>>> --- a/fs/xfs/xfs_buf_item.c
>>> +++ b/fs/xfs/xfs_buf_item.c
>>> @@ -1123,7 +1123,7 @@ xfs_buf_iodone_callback_error(
>>>  			bp->b_first_retry_time = jiffies;
>>>  
>>>  		xfs_buf_ioerror(bp, 0);
>>> -		xfs_buf_submit(bp);
>>> +		__xfs_buf_submit(bp, false);
>>>  		return true;
>>>  	}
>>>  
>>> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
>>> index 13d1d3e95b88..64e315f80147 100644
>>> --- a/fs/xfs/xfs_log_recover.c
>>> +++ b/fs/xfs/xfs_log_recover.c
>>> @@ -5610,7 +5610,7 @@ xlog_do_recover(
>>>  	bp->b_flags |= XBF_READ;
>>>  	bp->b_ops = &xfs_sb_buf_ops;
>>>  
>>> -	error = xfs_buf_submit(bp);
>>> +	error = __xfs_buf_submit(bp, true);
>>>  	if (error) {
>>>  		if (!XFS_FORCED_SHUTDOWN(mp)) {
>>>  			xfs_buf_ioerror_alert(bp, __func__);
>>> -- 
>>> 2.17.1
>>>
>>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit
  2019-08-13 11:56   ` Brian Foster
@ 2019-08-14 10:14     ` Dave Chinner
  0 siblings, 0 replies; 11+ messages in thread
From: Dave Chinner @ 2019-08-14 10:14 UTC (permalink / raw)
  To: Brian Foster; +Cc: Nikolay Borisov, linux-xfs, darrick.wong

On Tue, Aug 13, 2019 at 07:56:58AM -0400, Brian Foster wrote:
> On Tue, Aug 13, 2019 at 12:03:05PM +0300, Nikolay Borisov wrote:
> > Since xfs_buf_submit no longer has any callers just rename its __
> > prefixed counterpart.
> > 
> > Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> > ---
> 
> Now we have a primary submission interface that allows combinations of
> XBF_ASYNC and waiting or not while the underlying mechanisms are not so
> flexible. It looks like the current factoring exists to support delwri
> queues where we never wait in buffer submission regardless of async
> state because we are batching the submission/wait across multiple
> buffers. But what happens if a caller passes an async buffer with wait
> == true? I/O completion only completes ->b_iowait if XBF_ASYNC is clear.
> 
> I find this rather confusing because now a caller needs to know about
> implementation details to use the function properly. That's already true
> of __xfs_buf_submit(), but that's partly why it's named as an "internal"
> function. I think we ultimately need the interface flexibility so the
> delwri case can continue to work. One option could be to update
> xfs_buf_submit() such that we never wait on an XBF_ASYNC buffer and add
> an assert to flag wait == true as invalid, but TBH I'm not convinced
> this is any simpler than the current interface where most callers simply
> only need to care about the flag. Maybe others have thoughts...

Yeah, we slpit the code u plike this intentionally to separate out
the different ways of submitting IO so that we didn't end up using
invalid methods, like ASYNC + wait, which would lead to hangs
waiting for IO that has already completed.

I much prefer the code as it stands now - it may be slightly more
verbose, but it's simple to understand and hard to use
incorrectly....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP
  2019-08-13  9:03 ` [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP Nikolay Borisov
  2019-08-13 11:57   ` Brian Foster
@ 2019-08-14 10:23   ` Dave Chinner
  1 sibling, 0 replies; 11+ messages in thread
From: Dave Chinner @ 2019-08-14 10:23 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-xfs, darrick.wong

On Tue, Aug 13, 2019 at 12:03:06PM +0300, Nikolay Borisov wrote:
> This macro encodes a trivial struct initializations, just open code it.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>

Hmmmm.

We have defines for this sort of structure definition and
initialisation all over the kernel. e.g. LIST_HEAD(),
DEFINE_PER_CPU(), DEFINE_HASHTABLE(), DEFINE_SPINLOCK(), etc...

And really, the intent of the define was to make it easy to get
rid of all the callers of the non-map buffer interfaces by moving
the map definition into the callers of xfs_buf_get, _read, etc
and then enabling use to remove the non-map interfaces
altogether.

Hence I'd much prefer to see the xfs_buf_{get,read,readahead} and
xfs_trans_buf_{get,read} wrapper functions go away than removing the
define.

> ---
>  fs/xfs/xfs_buf.c   | 4 ++--
>  fs/xfs/xfs_buf.h   | 9 +++------
>  fs/xfs/xfs_trans.h | 6 ++++--
>  3 files changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index 99c66f80d7cc..389c5b590f11 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -658,7 +658,7 @@ xfs_buf_incore(
>  {
>  	struct xfs_buf		*bp;
>  	int			error;
> -	DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
> +	struct xfs_buf_map map = { .bm_bn = blkno, .bm_len = numblks };

FWIW, I'm not a fan of single line definitions like this because
they are really hard to read. If you are converting to this form, it
should be like this:

	struct xfs_buf_map map = {
		.bm_bn = blkno,
		.bm_len = numblks,
	};

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2019-08-14 10:25 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-13  9:03 [PATCH 0/3] Minor cleanups Nikolay Borisov
2019-08-13  9:03 ` [PATCH 1/3] xfs: Use __xfs_buf_submit everywhere Nikolay Borisov
2019-08-13 11:55   ` Brian Foster
2019-08-13 12:06     ` Nikolay Borisov
2019-08-13 12:15       ` Nikolay Borisov
2019-08-13  9:03 ` [PATCH 2/3] xfs: Rename __xfs_buf_submit to xfs_buf_submit Nikolay Borisov
2019-08-13 11:56   ` Brian Foster
2019-08-14 10:14     ` Dave Chinner
2019-08-13  9:03 ` [PATCH 3/3] xfs: Opencode and remove DEFINE_SINGLE_BUF_MAP Nikolay Borisov
2019-08-13 11:57   ` Brian Foster
2019-08-14 10:23   ` Dave Chinner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).