public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4/5] xfs: record log sector size rather than log2(that)
@ 2010-04-15 18:17 Alex Elder
  2010-04-16 17:10 ` Christoph Hellwig
  2010-04-16 19:27 ` Eric Sandeen
  0 siblings, 2 replies; 3+ messages in thread
From: Alex Elder @ 2010-04-15 18:17 UTC (permalink / raw)
  To: XFS Mailing List

Change struct log so it keeps track of the size (in basic blocks)
of a log sector in l_sectsize rather than the log-base-2 of that
value (previously, l_sectbb_log).  Rename a variable holding the
sector size to more closely match the field it comes from.

(Updated so that a variable used in computing and verifying a log's
sector size is named simply "size".  Also dropped some superfluous
parentheses and renamed another local variable.)

Signed-off-by: Alex Elder <aelder@sgi.com>

---
 fs/xfs/xfs_log.c         |   33 ++++++++++++++++++---------------
 fs/xfs/xfs_log_priv.h    |    2 +-
 fs/xfs/xfs_log_recover.c |   35 ++++++++++++++++-------------------
 3 files changed, 35 insertions(+), 35 deletions(-)

Index: b/fs/xfs/xfs_log.c
===================================================================
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1039,6 +1039,7 @@ xlog_alloc_log(xfs_mount_t	*mp,
 	int			i;
 	int			iclogsize;
 	int			error = ENOMEM;
+	uint			size = 0;
 
 	log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL);
 	if (!log) {
@@ -1064,29 +1065,31 @@ xlog_alloc_log(xfs_mount_t	*mp,
 
 	error = EFSCORRUPTED;
 	if (xfs_sb_version_hassector(&mp->m_sb)) {
-		log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT;
-		if (log->l_sectbb_log < 0 ||
-		    log->l_sectbb_log > mp->m_sectbb_log) {
-			xlog_warn("XFS: Log sector size (0x%x) out of range.",
-						log->l_sectbb_log);
+	        size = mp->m_sb.sb_logsectlog;
+		if (size < BBSHIFT) {
+			xlog_warn("XFS: Log sector size too small "
+				"(0x%x < 0x%x)", size, BBSHIFT);
 			goto out_free_log;
 		}
 
-		/* for larger sector sizes, must have v2 or external log */
-		if (log->l_sectbb_log != 0 &&
-		    (log->l_logBBstart != 0 &&
-		     !xfs_sb_version_haslogv2(&mp->m_sb))) {
-			xlog_warn("XFS: log sector size (0x%x) invalid "
-				  "for configuration.", log->l_sectbb_log);
+	        size -= BBSHIFT;
+		if (size > mp->m_sectbb_log) {
+			xlog_warn("XFS: Log sector size too large "
+				"(0x%x > 0x%x)", size, mp->m_sectbb_log);
 			goto out_free_log;
 		}
-		if (mp->m_sb.sb_logsectlog < BBSHIFT) {
-			xlog_warn("XFS: Log sector log (0x%x) too small.",
-						mp->m_sb.sb_logsectlog);
+
+		/* for larger sector sizes, must have v2 or external log */
+		if (size && log->l_logBBstart > 0 &&
+			    !xfs_sb_version_haslogv2(&mp->m_sb)) {
+
+			xlog_warn("XFS: log sector size (0x%x) invalid "
+				  "for configuration.", size);
 			goto out_free_log;
 		}
 	}
-	log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
+	log->l_sectsize = 1 << size;
+	log->l_sectbb_mask = log->l_sectsize - 1;
 
 	xlog_get_iclog_buffer_size(mp, log);
 
Index: b/fs/xfs/xfs_log_priv.h
===================================================================
--- a/fs/xfs/xfs_log_priv.h
+++ b/fs/xfs/xfs_log_priv.h
@@ -396,7 +396,7 @@ typedef struct log {
 	struct xfs_buf_cancel	**l_buf_cancel_table;
 	int			l_iclog_hsize;  /* size of iclog header */
 	int			l_iclog_heads;  /* # of iclog header sectors */
-	uint			l_sectbb_log;   /* log2 of sector size in BBs */
+	uint			l_sectsize;     /* sector size in BBs */
 	uint			l_sectbb_mask;  /* sector size (in BBs)
 						 * alignment mask */
 	int			l_iclog_size;	/* size of log in bytes */
Index: b/fs/xfs/xfs_log_recover.c
===================================================================
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -60,9 +60,6 @@ STATIC void	xlog_recover_check_summary(x
  * Sector aligned buffer routines for buffer create/read/write/access
  */
 
-/* Number of basic blocks in a log sector */
-#define xlog_sectbb(log) (1 << (log)->l_sectbb_log)
-
 /*
  * Verify the given count of basic blocks is valid number of blocks
  * to specify for an operation involving the given XFS log buffer.
@@ -110,9 +107,9 @@ xlog_get_bp(
 	 * extend the buffer by one extra log sector to ensure
 	 * there's space to accomodate this possiblility.
 	 */
-	if (nbblks > 1 && log->l_sectbb_log)
-		nbblks += xlog_sectbb(log);
-	nbblks = round_up(nbblks, xlog_sectbb(log));
+	if (nbblks > 1 && log->l_sectsize > 1)
+		nbblks += log->l_sectsize;
+	nbblks = round_up(nbblks, log->l_sectsize);
 
 	return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
 }
@@ -133,7 +130,7 @@ xlog_align(
 {
 	xfs_caddr_t	ptr;
 
-	if (!log->l_sectbb_log)
+	if (log->l_sectsize == 1)
 		return XFS_BUF_PTR(bp);
 
 	ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask);
@@ -162,8 +159,8 @@ xlog_bread_noalign(
 		return EFSCORRUPTED;
 	}
 
-	blk_no = round_down(blk_no, xlog_sectbb(log));
-	nbblks = round_up(nbblks, xlog_sectbb(log));
+	blk_no = round_down(blk_no, log->l_sectsize);
+	nbblks = round_up(nbblks, log->l_sectsize);
 
 	ASSERT(nbblks > 0);
 	ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
@@ -221,8 +218,8 @@ xlog_bwrite(
 		return EFSCORRUPTED;
 	}
 
-	blk_no = round_down(blk_no, xlog_sectbb(log));
-	nbblks = round_up(nbblks, xlog_sectbb(log));
+	blk_no = round_down(blk_no, log->l_sectsize);
+	nbblks = round_up(nbblks, log->l_sectsize);
 
 	ASSERT(nbblks > 0);
 	ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
@@ -410,7 +407,7 @@ xlog_find_verify_cycle(
 	bufblks = 1 << ffs(nbblks);
 	while (!(bp = xlog_get_bp(log, bufblks))) {
 		bufblks >>= 1;
-		if (bufblks < xlog_sectbb(log))
+		if (bufblks < log->l_sectsize)
 			return ENOMEM;
 	}
 
@@ -1181,7 +1178,7 @@ xlog_write_log_records(
 	xfs_caddr_t	offset;
 	xfs_buf_t	*bp;
 	int		balign, ealign;
-	int		sectbb = xlog_sectbb(log);
+	int		sectsize = log->l_sectsize;
 	int		end_block = start_block + blocks;
 	int		bufblks;
 	int		error = 0;
@@ -1196,7 +1193,7 @@ xlog_write_log_records(
 	bufblks = 1 << ffs(blocks);
 	while (!(bp = xlog_get_bp(log, bufblks))) {
 		bufblks >>= 1;
-		if (bufblks < xlog_sectbb(log))
+		if (bufblks < sectsize)
 			return ENOMEM;
 	}
 
@@ -1204,7 +1201,7 @@ xlog_write_log_records(
 	 * the buffer in the starting sector not covered by the first
 	 * write below.
 	 */
-	balign = round_down(start_block, sectbb);
+	balign = round_down(start_block, sectsize);
 	if (balign != start_block) {
 		error = xlog_bread_noalign(log, start_block, 1, bp);
 		if (error)
@@ -1223,16 +1220,16 @@ xlog_write_log_records(
 		 * the buffer in the final sector not covered by the write.
 		 * If this is the same sector as the above read, skip it.
 		 */
-		ealign = round_down(end_block, sectbb);
+		ealign = round_down(end_block, sectsize);
 		if (j == 0 && (start_block + endcount > ealign)) {
 			offset = XFS_BUF_PTR(bp);
 			balign = BBTOB(ealign - start_block);
 			error = XFS_BUF_SET_PTR(bp, offset + balign,
-						BBTOB(sectbb));
+						BBTOB(sectsize));
 			if (error)
 				break;
 
-			error = xlog_bread_noalign(log, ealign, sectbb, bp);
+			error = xlog_bread_noalign(log, ealign, sectsize, bp);
 			if (error)
 				break;
 
@@ -3553,7 +3550,7 @@ xlog_do_recovery_pass(
 			hblks = 1;
 		}
 	} else {
-		ASSERT(log->l_sectbb_log == 0);
+		ASSERT(log->l_sectsize == 1);
 		hblks = 1;
 		hbp = xlog_get_bp(log, 1);
 		h_size = XLOG_BIG_RECORD_BSIZE;


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

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

* Re: [PATCH 4/5] xfs: record log sector size rather than log2(that)
  2010-04-15 18:17 [PATCH 4/5] xfs: record log sector size rather than log2(that) Alex Elder
@ 2010-04-16 17:10 ` Christoph Hellwig
  2010-04-16 19:27 ` Eric Sandeen
  1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2010-04-16 17:10 UTC (permalink / raw)
  To: Alex Elder; +Cc: XFS Mailing List

On Thu, Apr 15, 2010 at 01:17:37PM -0500, Alex Elder wrote:
> Change struct log so it keeps track of the size (in basic blocks)
> of a log sector in l_sectsize rather than the log-base-2 of that
> value (previously, l_sectbb_log).  Rename a variable holding the
> sector size to more closely match the field it comes from.
> 
> (Updated so that a variable used in computing and verifying a log's
> sector size is named simply "size".  Also dropped some superfluous
> parentheses and renamed another local variable.)
> 
> Signed-off-by: Alex Elder <aelder@sgi.com>

Looks correct, but I don't think the choice of "size" for a log2
is particularly intuitive.

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

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

* Re: [PATCH 4/5] xfs: record log sector size rather than log2(that)
  2010-04-15 18:17 [PATCH 4/5] xfs: record log sector size rather than log2(that) Alex Elder
  2010-04-16 17:10 ` Christoph Hellwig
@ 2010-04-16 19:27 ` Eric Sandeen
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Sandeen @ 2010-04-16 19:27 UTC (permalink / raw)
  To: aelder; +Cc: XFS Mailing List

On 04/15/2010 01:17 PM, Alex Elder wrote:
> Change struct log so it keeps track of the size (in basic blocks)
> of a log sector in l_sectsize rather than the log-base-2 of that
> value (previously, l_sectbb_log).  Rename a variable holding the
> sector size to more closely match the field it comes from.
> 
> (Updated so that a variable used in computing and verifying a log's
> sector size is named simply "size".  Also dropped some superfluous
> parentheses and renamed another local variable.)
> 
> Signed-off-by: Alex Elder <aelder@sgi.com>

Looks correct to me too, but IMHO l_sectsize having BB (512) units
is pretty non-obvious as well, esp. given that other bb-unit structure
members have "bb" in their name.

If the goal is clarity, I think this only goes partway ...

-Eric

> ---
>  fs/xfs/xfs_log.c         |   33 ++++++++++++++++++---------------
>  fs/xfs/xfs_log_priv.h    |    2 +-
>  fs/xfs/xfs_log_recover.c |   35 ++++++++++++++++-------------------
>  3 files changed, 35 insertions(+), 35 deletions(-)
> 
> Index: b/fs/xfs/xfs_log.c
> ===================================================================
> --- a/fs/xfs/xfs_log.c
> +++ b/fs/xfs/xfs_log.c
> @@ -1039,6 +1039,7 @@ xlog_alloc_log(xfs_mount_t	*mp,
>  	int			i;
>  	int			iclogsize;
>  	int			error = ENOMEM;
> +	uint			size = 0;
>  
>  	log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL);
>  	if (!log) {
> @@ -1064,29 +1065,31 @@ xlog_alloc_log(xfs_mount_t	*mp,
>  
>  	error = EFSCORRUPTED;
>  	if (xfs_sb_version_hassector(&mp->m_sb)) {
> -		log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT;
> -		if (log->l_sectbb_log < 0 ||
> -		    log->l_sectbb_log > mp->m_sectbb_log) {
> -			xlog_warn("XFS: Log sector size (0x%x) out of range.",
> -						log->l_sectbb_log);
> +	        size = mp->m_sb.sb_logsectlog;
> +		if (size < BBSHIFT) {
> +			xlog_warn("XFS: Log sector size too small "
> +				"(0x%x < 0x%x)", size, BBSHIFT);
>  			goto out_free_log;
>  		}
>  
> -		/* for larger sector sizes, must have v2 or external log */
> -		if (log->l_sectbb_log != 0 &&
> -		    (log->l_logBBstart != 0 &&
> -		     !xfs_sb_version_haslogv2(&mp->m_sb))) {
> -			xlog_warn("XFS: log sector size (0x%x) invalid "
> -				  "for configuration.", log->l_sectbb_log);
> +	        size -= BBSHIFT;
> +		if (size > mp->m_sectbb_log) {
> +			xlog_warn("XFS: Log sector size too large "
> +				"(0x%x > 0x%x)", size, mp->m_sectbb_log);
>  			goto out_free_log;
>  		}
> -		if (mp->m_sb.sb_logsectlog < BBSHIFT) {
> -			xlog_warn("XFS: Log sector log (0x%x) too small.",
> -						mp->m_sb.sb_logsectlog);
> +
> +		/* for larger sector sizes, must have v2 or external log */
> +		if (size && log->l_logBBstart > 0 &&
> +			    !xfs_sb_version_haslogv2(&mp->m_sb)) {
> +
> +			xlog_warn("XFS: log sector size (0x%x) invalid "
> +				  "for configuration.", size);
>  			goto out_free_log;
>  		}
>  	}
> -	log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
> +	log->l_sectsize = 1 << size;
> +	log->l_sectbb_mask = log->l_sectsize - 1;
>  
>  	xlog_get_iclog_buffer_size(mp, log);
>  
> Index: b/fs/xfs/xfs_log_priv.h
> ===================================================================
> --- a/fs/xfs/xfs_log_priv.h
> +++ b/fs/xfs/xfs_log_priv.h
> @@ -396,7 +396,7 @@ typedef struct log {
>  	struct xfs_buf_cancel	**l_buf_cancel_table;
>  	int			l_iclog_hsize;  /* size of iclog header */
>  	int			l_iclog_heads;  /* # of iclog header sectors */
> -	uint			l_sectbb_log;   /* log2 of sector size in BBs */
> +	uint			l_sectsize;     /* sector size in BBs */
>  	uint			l_sectbb_mask;  /* sector size (in BBs)
>  						 * alignment mask */
>  	int			l_iclog_size;	/* size of log in bytes */
> Index: b/fs/xfs/xfs_log_recover.c
> ===================================================================
> --- a/fs/xfs/xfs_log_recover.c
> +++ b/fs/xfs/xfs_log_recover.c
> @@ -60,9 +60,6 @@ STATIC void	xlog_recover_check_summary(x
>   * Sector aligned buffer routines for buffer create/read/write/access
>   */
>  
> -/* Number of basic blocks in a log sector */
> -#define xlog_sectbb(log) (1 << (log)->l_sectbb_log)
> -
>  /*
>   * Verify the given count of basic blocks is valid number of blocks
>   * to specify for an operation involving the given XFS log buffer.
> @@ -110,9 +107,9 @@ xlog_get_bp(
>  	 * extend the buffer by one extra log sector to ensure
>  	 * there's space to accomodate this possiblility.
>  	 */
> -	if (nbblks > 1 && log->l_sectbb_log)
> -		nbblks += xlog_sectbb(log);
> -	nbblks = round_up(nbblks, xlog_sectbb(log));
> +	if (nbblks > 1 && log->l_sectsize > 1)
> +		nbblks += log->l_sectsize;
> +	nbblks = round_up(nbblks, log->l_sectsize);
>  
>  	return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
>  }
> @@ -133,7 +130,7 @@ xlog_align(
>  {
>  	xfs_caddr_t	ptr;
>  
> -	if (!log->l_sectbb_log)
> +	if (log->l_sectsize == 1)
>  		return XFS_BUF_PTR(bp);
>  
>  	ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask);
> @@ -162,8 +159,8 @@ xlog_bread_noalign(
>  		return EFSCORRUPTED;
>  	}
>  
> -	blk_no = round_down(blk_no, xlog_sectbb(log));
> -	nbblks = round_up(nbblks, xlog_sectbb(log));
> +	blk_no = round_down(blk_no, log->l_sectsize);
> +	nbblks = round_up(nbblks, log->l_sectsize);
>  
>  	ASSERT(nbblks > 0);
>  	ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
> @@ -221,8 +218,8 @@ xlog_bwrite(
>  		return EFSCORRUPTED;
>  	}
>  
> -	blk_no = round_down(blk_no, xlog_sectbb(log));
> -	nbblks = round_up(nbblks, xlog_sectbb(log));
> +	blk_no = round_down(blk_no, log->l_sectsize);
> +	nbblks = round_up(nbblks, log->l_sectsize);
>  
>  	ASSERT(nbblks > 0);
>  	ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
> @@ -410,7 +407,7 @@ xlog_find_verify_cycle(
>  	bufblks = 1 << ffs(nbblks);
>  	while (!(bp = xlog_get_bp(log, bufblks))) {
>  		bufblks >>= 1;
> -		if (bufblks < xlog_sectbb(log))
> +		if (bufblks < log->l_sectsize)
>  			return ENOMEM;
>  	}
>  
> @@ -1181,7 +1178,7 @@ xlog_write_log_records(
>  	xfs_caddr_t	offset;
>  	xfs_buf_t	*bp;
>  	int		balign, ealign;
> -	int		sectbb = xlog_sectbb(log);
> +	int		sectsize = log->l_sectsize;
>  	int		end_block = start_block + blocks;
>  	int		bufblks;
>  	int		error = 0;
> @@ -1196,7 +1193,7 @@ xlog_write_log_records(
>  	bufblks = 1 << ffs(blocks);
>  	while (!(bp = xlog_get_bp(log, bufblks))) {
>  		bufblks >>= 1;
> -		if (bufblks < xlog_sectbb(log))
> +		if (bufblks < sectsize)
>  			return ENOMEM;
>  	}
>  
> @@ -1204,7 +1201,7 @@ xlog_write_log_records(
>  	 * the buffer in the starting sector not covered by the first
>  	 * write below.
>  	 */
> -	balign = round_down(start_block, sectbb);
> +	balign = round_down(start_block, sectsize);
>  	if (balign != start_block) {
>  		error = xlog_bread_noalign(log, start_block, 1, bp);
>  		if (error)
> @@ -1223,16 +1220,16 @@ xlog_write_log_records(
>  		 * the buffer in the final sector not covered by the write.
>  		 * If this is the same sector as the above read, skip it.
>  		 */
> -		ealign = round_down(end_block, sectbb);
> +		ealign = round_down(end_block, sectsize);
>  		if (j == 0 && (start_block + endcount > ealign)) {
>  			offset = XFS_BUF_PTR(bp);
>  			balign = BBTOB(ealign - start_block);
>  			error = XFS_BUF_SET_PTR(bp, offset + balign,
> -						BBTOB(sectbb));
> +						BBTOB(sectsize));
>  			if (error)
>  				break;
>  
> -			error = xlog_bread_noalign(log, ealign, sectbb, bp);
> +			error = xlog_bread_noalign(log, ealign, sectsize, bp);
>  			if (error)
>  				break;
>  
> @@ -3553,7 +3550,7 @@ xlog_do_recovery_pass(
>  			hblks = 1;
>  		}
>  	} else {
> -		ASSERT(log->l_sectbb_log == 0);
> +		ASSERT(log->l_sectsize == 1);
>  		hblks = 1;
>  		hbp = xlog_get_bp(log, 1);
>  		h_size = XLOG_BIG_RECORD_BSIZE;
> 
> 
> _______________________________________________
> 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

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

end of thread, other threads:[~2010-04-16 19:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-15 18:17 [PATCH 4/5] xfs: record log sector size rather than log2(that) Alex Elder
2010-04-16 17:10 ` Christoph Hellwig
2010-04-16 19:27 ` Eric Sandeen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox