xfs
[Top] [All Lists]

Re: [PATCH v2 7/8] xfs: Add xfs_log_rlimit.[c|h]

To: "Michael L. Semon" <mlsemon35@xxxxxxxxx>
Subject: Re: [PATCH v2 7/8] xfs: Add xfs_log_rlimit.[c|h]
From: Jeff Liu <jeff.liu@xxxxxxxxxx>
Date: Fri, 17 May 2013 17:40:43 +0800
Cc: "xfs@xxxxxxxxxxx" <xfs@xxxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <5195EC13.2060502@xxxxxxxxx>
References: <5195C279.3060502@xxxxxxxxxx> <5195EC13.2060502@xxxxxxxxx>
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5
Hi Michael,

Are you compiling kernel on 32-bit system?

Looks this issue is regarding 64-bit division at roundup() on 32-bit if so.

Could you please try below fix?

diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c
index 3e84d46..49a88cc 100644
--- a/fs/xfs/xfs_log_rlimit.c
+++ b/fs/xfs/xfs_log_rlimit.c
@@ -127,7 +127,7 @@ xfs_log_validate_logspace(
         * Also, the log size should be a multiple of the log stripe unit, round
         * it up to lsunit boundary if lsunit is specified.
         */
-       minlblks = lsunit ? (roundup(BTOBB(maxlres), lsunit) + 2 * lsunit) * 2 :
+       minlblks = lsunit ? (roundup((int)BTOBB(maxlres), lsunit) + 2 * lsunit) 
* 2 :
                            BTOBB(maxlres) * 2;
 
        if (log->l_logBBsize < minlblks) {


Thanks,
-Jeff
On 05/17/2013 04:36 PM, Michael L. Semon wrote:
> On 05/17/2013 01:39 AM, Jeff Liu wrote:
>> From: Jie Liu <jeff.liu@xxxxxxxxxx>
>>
>> Add source files for xfs_log_rlimit.[c|h].
>> The new source would be used for the log space validation.
> 
> Update:  To build the kernel, I'm getting by on a sysadmin hack that 
> looks like this:
> 
> --- linux/fs/xfs/xfs_log_rlimit.c.orig        2013-05-17 03:36:28.983493357 
> -0400
> +++ linux/fs/xfs/xfs_log_rlimit.c     2013-05-17 04:21:07.090661828 -0400
> @@ -127,8 +127,10 @@
>        * Also, the log size should be a multiple of the log stripe unit, round
>        * it up to lsunit boundary if lsunit is specified.
>        */
> -     minlblks = lsunit ? (roundup(BTOBB(maxlres), lsunit) + 2 * lsunit) * 2 :
> -                         BTOBB(maxlres) * 2;
> +     minlblks = lsunit ?
> +             (roundup((const int)(BTOBB(maxlres)), lsunit) +
> +             2 * lsunit) * 2 :
> +                     BTOBB(maxlres) * 2;
> 
>       if (log->l_logBBsize < minlblks) {
>               xfs_crit(mp,
> 
> However, that makes no sense.  There is a roundup in <linux/kernel.h> 
> that goes like this:
> 
> /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
> #define roundup(x, y) (                                 \
> {                                                       \
>          const typeof(y) __y = y;                        \
>          (((x) + (__y - 1)) / __y) * __y;                \
> }                                                       \
> )
> 
> Okay, so that gave me the inspiration to cast the type so gcc-4.8.0 
> wouldn't call __divdi3.  But why did this make a difference?
> 
> Disclaimer:  I'm not a C macro guru, so I don't know which random 
> sequence of punctuation keys would make roundup() happy.

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

<Prev in Thread] Current Thread [Next in Thread>