Patchwork [1/1] ext4: use proper little-endian bitops

login
register
mail settings
Submitter Andrew Morton
Date July 28, 2011, 8:55 p.m.
Message ID <201107282055.p6SKtKp5008047@imap1.linux-foundation.org>
Download mbox | patch
Permalink /patch/107309/
State New
Headers show

Comments

Andrew Morton - July 28, 2011, 8:55 p.m.
From: Akinobu Mita <akinobu.mita@gmail.com>

ext4_{set,clear}_bit() is defined as __test_and_{set,clear}_bit_le() for
ext4.  Only two ext4_{set,clear}_bit() calls check the return value.  The
rest of calls ignore the return value and they can be replaced with
__{set,clear}_bit_le().

This changes ext4_{set,clear}_bit() from __test_and_{set,clear}_bit_le()
to __{set,clear}_bit_le() and introduces ext4_test_and_{set,clear}_bit()
for the two places where old bit needs to be returned.

This ext4_{set,clear}_bit() change is considered safe, because if someone
uses these macros without noticing the change, new ext4_{set,clear}_bit
don't have return value and causes compiler errors where the return value
is used.

This also removes unused ext4_find_first_zero_bit().

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 fs/ext4/ext4.h   |    7 ++++---
 fs/ext4/ialloc.c |    4 ++--
 2 files changed, 6 insertions(+), 5 deletions(-)
Lukas Czerner - July 29, 2011, 9:43 a.m.
On Thu, 28 Jul 2011, akpm@linux-foundation.org wrote:

> From: Akinobu Mita <akinobu.mita@gmail.com>
> 
> ext4_{set,clear}_bit() is defined as __test_and_{set,clear}_bit_le() for
> ext4.  Only two ext4_{set,clear}_bit() calls check the return value.  The
> rest of calls ignore the return value and they can be replaced with
> __{set,clear}_bit_le().
> 
> This changes ext4_{set,clear}_bit() from __test_and_{set,clear}_bit_le()
> to __{set,clear}_bit_le() and introduces ext4_test_and_{set,clear}_bit()
> for the two places where old bit needs to be returned.
> 
> This ext4_{set,clear}_bit() change is considered safe, because if someone
> uses these macros without noticing the change, new ext4_{set,clear}_bit
> don't have return value and causes compiler errors where the return value
> is used.
> 
> This also removes unused ext4_find_first_zero_bit().

Hi Anikobu,

I have some comments bellow.

> 
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> Cc: "Theodore Ts'o" <tytso@mit.edu>
> Cc: Andreas Dilger <adilger.kernel@dilger.ca>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
> 
>  fs/ext4/ext4.h   |    7 ++++---
>  fs/ext4/ialloc.c |    4 ++--
>  2 files changed, 6 insertions(+), 5 deletions(-)
> 
> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
> +++ a/fs/ext4/ext4.h
> @@ -931,12 +931,13 @@ struct ext4_inode_info {
>  #define test_opt2(sb, opt)		(EXT4_SB(sb)->s_mount_opt2 & \
>  					 EXT4_MOUNT2_##opt)
>  
> -#define ext4_set_bit			__test_and_set_bit_le
> +#define ext4_test_and_set_bit		__test_and_set_bit_le
> +#define ext4_set_bit			__set_bit_le
>  #define ext4_set_bit_atomic		ext2_set_bit_atomic
We can remove this since it is not used anywhere and it is just a macro
for test_and_set_bit_le() anyway.

> -#define ext4_clear_bit			__test_and_clear_bit_le
> +#define ext4_test_and_clear_bit		__test_and_clear_bit_le
> +#define ext4_clear_bit			__clear_bit_le
>  #define ext4_clear_bit_atomic		ext2_clear_bit_atomic
Not used as well.

>  #define ext4_test_bit			test_bit_le
> -#define ext4_find_first_zero_bit	find_first_zero_bit_le
>  #define ext4_find_next_zero_bit		find_next_zero_bit_le
>  #define ext4_find_next_bit		find_next_bit_le

Other than that it looks good. You can add my 

Reviewed-by: Lukas Czerner <lczerner@redhat.com>

Thanks!
-Lukas

>  
> diff -puN fs/ext4/ialloc.c~ext4-use-proper-little-endian-bitops fs/ext4/ialloc.c
> --- a/fs/ext4/ialloc.c~ext4-use-proper-little-endian-bitops
> +++ a/fs/ext4/ialloc.c
> @@ -252,7 +252,7 @@ void ext4_free_inode(handle_t *handle, s
>  		fatal = ext4_journal_get_write_access(handle, bh2);
>  	}
>  	ext4_lock_group(sb, block_group);
> -	cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
> +	cleared = ext4_test_and_clear_bit(bit, bitmap_bh->b_data);
>  	if (fatal || !cleared) {
>  		ext4_unlock_group(sb, block_group);
>  		goto out;
> @@ -729,7 +729,7 @@ static int ext4_claim_inode(struct super
>  	 */
>  	down_read(&grp->alloc_sem);
>  	ext4_lock_group(sb, group);
> -	if (ext4_set_bit(ino, inode_bitmap_bh->b_data)) {
> +	if (ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data)) {
>  		/* not a free inode */
>  		retval = 1;
>  		goto err_ret;
> _
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Akinobu Mita - July 29, 2011, 10:55 a.m.
2011/7/29 Lukas Czerner <lczerner@redhat.com>:

>> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
>> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
>> +++ a/fs/ext4/ext4.h
>> @@ -931,12 +931,13 @@ struct ext4_inode_info {
>>  #define test_opt2(sb, opt)           (EXT4_SB(sb)->s_mount_opt2 & \
>>                                        EXT4_MOUNT2_##opt)
>>
>> -#define ext4_set_bit                 __test_and_set_bit_le
>> +#define ext4_test_and_set_bit                __test_and_set_bit_le
>> +#define ext4_set_bit                 __set_bit_le
>>  #define ext4_set_bit_atomic          ext2_set_bit_atomic
> We can remove this since it is not used anywhere and it is just a macro
> for test_and_set_bit_le() anyway.

Amir Goldstein requested not to remove it because ext4 snapshot patches is
using ext4_set_bit_atomic(), although I really don't know about the status of
mainline inclusion.

> Other than that it looks good. You can add my
>
> Reviewed-by: Lukas Czerner <lczerner@redhat.com>

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lukas Czerner - July 29, 2011, 11:51 a.m.
On Fri, 29 Jul 2011, Akinobu Mita wrote:

> 2011/7/29 Lukas Czerner <lczerner@redhat.com>:
> 
> >> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
> >> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
> >> +++ a/fs/ext4/ext4.h
> >> @@ -931,12 +931,13 @@ struct ext4_inode_info {
> >>  #define test_opt2(sb, opt)           (EXT4_SB(sb)->s_mount_opt2 & \
> >>                                        EXT4_MOUNT2_##opt)
> >>
> >> -#define ext4_set_bit                 __test_and_set_bit_le
> >> +#define ext4_test_and_set_bit                __test_and_set_bit_le
> >> +#define ext4_set_bit                 __set_bit_le
> >>  #define ext4_set_bit_atomic          ext2_set_bit_atomic
> > We can remove this since it is not used anywhere and it is just a macro
> > for test_and_set_bit_le() anyway.
> 
> Amir Goldstein requested not to remove it because ext4 snapshot patches is
> using ext4_set_bit_atomic(), although I really don't know about the status of
> mainline inclusion.

It is not anywhere near inclusion. Moreover it is using
__test_and_set_bit_le, but the name does not really imply *test*.
So please, just remove it and when Amir is going to
need it someday he might add proper define with the proper name using
the proper set, or test_and_set functions.

Thanks!
-Lukas

> 
> > Other than that it looks good. You can add my
> >
> > Reviewed-by: Lukas Czerner <lczerner@redhat.com>
> 
> Thanks.
> 

--
Amir Goldstein - July 29, 2011, 12:13 p.m.
On Fri, Jul 29, 2011 at 2:51 PM, Lukas Czerner <lczerner@redhat.com> wrote:
> On Fri, 29 Jul 2011, Akinobu Mita wrote:
>
>> 2011/7/29 Lukas Czerner <lczerner@redhat.com>:
>>
>> >> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
>> >> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
>> >> +++ a/fs/ext4/ext4.h
>> >> @@ -931,12 +931,13 @@ struct ext4_inode_info {
>> >>  #define test_opt2(sb, opt)           (EXT4_SB(sb)->s_mount_opt2 & \
>> >>                                        EXT4_MOUNT2_##opt)
>> >>
>> >> -#define ext4_set_bit                 __test_and_set_bit_le
>> >> +#define ext4_test_and_set_bit                __test_and_set_bit_le
>> >> +#define ext4_set_bit                 __set_bit_le
>> >>  #define ext4_set_bit_atomic          ext2_set_bit_atomic
>> > We can remove this since it is not used anywhere and it is just a macro
>> > for test_and_set_bit_le() anyway.
>>
>> Amir Goldstein requested not to remove it because ext4 snapshot patches is
>> using ext4_set_bit_atomic(), although I really don't know about the status of
>> mainline inclusion.
>
> It is not anywhere near inclusion. Moreover it is using
> __test_and_set_bit_le, but the name does not really imply *test*.
> So please, just remove it and when Amir is going to
> need it someday he might add proper define with the proper name using
> the proper set, or test_and_set functions.
>

Yongqiang,

Please refresh my memory.
Are we still using those macros?
Didn't we say will need to switch to using mballoc's ext4_set_bits() instead?
I think you modified the calls in some of the execution paths and not
all of them
(i.e. not in MOW), which is probably a bug.

Cheers,
Amir.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Akinobu Mita - July 29, 2011, 12:25 p.m.
2011/7/29 Lukas Czerner <lczerner@redhat.com>:
> On Fri, 29 Jul 2011, Akinobu Mita wrote:
>
>> 2011/7/29 Lukas Czerner <lczerner@redhat.com>:
>>
>> >> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
>> >> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
>> >> +++ a/fs/ext4/ext4.h
>> >> @@ -931,12 +931,13 @@ struct ext4_inode_info {
>> >>  #define test_opt2(sb, opt)           (EXT4_SB(sb)->s_mount_opt2 & \
>> >>                                        EXT4_MOUNT2_##opt)
>> >>
>> >> -#define ext4_set_bit                 __test_and_set_bit_le
>> >> +#define ext4_test_and_set_bit                __test_and_set_bit_le
>> >> +#define ext4_set_bit                 __set_bit_le
>> >>  #define ext4_set_bit_atomic          ext2_set_bit_atomic
>> > We can remove this since it is not used anywhere and it is just a macro
>> > for test_and_set_bit_le() anyway.
>>
>> Amir Goldstein requested not to remove it because ext4 snapshot patches is
>> using ext4_set_bit_atomic(), although I really don't know about the status of
>> mainline inclusion.
>
> It is not anywhere near inclusion. Moreover it is using
> __test_and_set_bit_le, but the name does not really imply *test*.

BTW, do you think of anything more preferable name?  Because ext[23] and
nilfs2 are still using them, so renaming can avoid confusion.

> So please, just remove it and when Amir is going to
> need it someday he might add proper define with the proper name using
> the proper set, or test_and_set functions.

OK, I'll remove if no one has strong objection against it.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lukas Czerner - July 29, 2011, 12:41 p.m.
On Fri, 29 Jul 2011, Akinobu Mita wrote:

> 2011/7/29 Lukas Czerner <lczerner@redhat.com>:
> > On Fri, 29 Jul 2011, Akinobu Mita wrote:
> >
> >> 2011/7/29 Lukas Czerner <lczerner@redhat.com>:
> >>
> >> >> diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
> >> >> --- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
> >> >> +++ a/fs/ext4/ext4.h
> >> >> @@ -931,12 +931,13 @@ struct ext4_inode_info {
> >> >>  #define test_opt2(sb, opt)           (EXT4_SB(sb)->s_mount_opt2 & \
> >> >>                                        EXT4_MOUNT2_##opt)
> >> >>
> >> >> -#define ext4_set_bit                 __test_and_set_bit_le
> >> >> +#define ext4_test_and_set_bit                __test_and_set_bit_le
> >> >> +#define ext4_set_bit                 __set_bit_le
> >> >>  #define ext4_set_bit_atomic          ext2_set_bit_atomic
> >> > We can remove this since it is not used anywhere and it is just a macro
> >> > for test_and_set_bit_le() anyway.
> >>
> >> Amir Goldstein requested not to remove it because ext4 snapshot patches is
> >> using ext4_set_bit_atomic(), although I really don't know about the status of
> >> mainline inclusion.
> >
> > It is not anywhere near inclusion. Moreover it is using
> > __test_and_set_bit_le, but the name does not really imply *test*.
> 
> BTW, do you think of anything more preferable name?  Because ext[23] and
> nilfs2 are still using them, so renaming can avoid confusion.

Well, it is the same situation as you are fixing with this ext4 patch.
So ext2_test_and_set_bit_atomic seems ok, but I really wonder if we need
to call it ext2_* since it is not ext2 specific.

Maybe it would be nice to rename it, as well as move it into different
file, or just rename the file. But it is not *very* important I guess.

> 
> > So please, just remove it and when Amir is going to
> > need it someday he might add proper define with the proper name using
> > the proper set, or test_and_set functions.
> 
> OK, I'll remove if no one has strong objection against it.
> 

Thanks!

Patch

diff -puN fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops fs/ext4/ext4.h
--- a/fs/ext4/ext4.h~ext4-use-proper-little-endian-bitops
+++ a/fs/ext4/ext4.h
@@ -931,12 +931,13 @@  struct ext4_inode_info {
 #define test_opt2(sb, opt)		(EXT4_SB(sb)->s_mount_opt2 & \
 					 EXT4_MOUNT2_##opt)
 
-#define ext4_set_bit			__test_and_set_bit_le
+#define ext4_test_and_set_bit		__test_and_set_bit_le
+#define ext4_set_bit			__set_bit_le
 #define ext4_set_bit_atomic		ext2_set_bit_atomic
-#define ext4_clear_bit			__test_and_clear_bit_le
+#define ext4_test_and_clear_bit		__test_and_clear_bit_le
+#define ext4_clear_bit			__clear_bit_le
 #define ext4_clear_bit_atomic		ext2_clear_bit_atomic
 #define ext4_test_bit			test_bit_le
-#define ext4_find_first_zero_bit	find_first_zero_bit_le
 #define ext4_find_next_zero_bit		find_next_zero_bit_le
 #define ext4_find_next_bit		find_next_bit_le
 
diff -puN fs/ext4/ialloc.c~ext4-use-proper-little-endian-bitops fs/ext4/ialloc.c
--- a/fs/ext4/ialloc.c~ext4-use-proper-little-endian-bitops
+++ a/fs/ext4/ialloc.c
@@ -252,7 +252,7 @@  void ext4_free_inode(handle_t *handle, s
 		fatal = ext4_journal_get_write_access(handle, bh2);
 	}
 	ext4_lock_group(sb, block_group);
-	cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
+	cleared = ext4_test_and_clear_bit(bit, bitmap_bh->b_data);
 	if (fatal || !cleared) {
 		ext4_unlock_group(sb, block_group);
 		goto out;
@@ -729,7 +729,7 @@  static int ext4_claim_inode(struct super
 	 */
 	down_read(&grp->alloc_sem);
 	ext4_lock_group(sb, group);
-	if (ext4_set_bit(ino, inode_bitmap_bh->b_data)) {
+	if (ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data)) {
 		/* not a free inode */
 		retval = 1;
 		goto err_ret;