Christophe JAILLET
2022-Jul-19 10:01 UTC
[Ocfs2-devel] [PATCH 1/3] ocfs2: Remove some useless functions
__ocfs2_node_map_set_bit() and __ocfs2_node_map_set_bit() are just wrapper around set_bit() and clear_bit(). The leading __ also makes think that these functions are non-atomic just like __set_bit() and __clear_bit(). So, just remove these wrappers and call set_bit() and clear_bit() directly. Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr> --- fs/ocfs2/heartbeat.c | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index 9099d8fc7599..1d72e0788943 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c @@ -24,11 +24,6 @@ #include "buffer_head_io.h" -static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, - int bit); -static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, - int bit); - /* special case -1 for now * TODO: should *really* make sure the calling func never passes -1!! */ static void ocfs2_node_map_init(struct ocfs2_node_map *map) @@ -65,12 +60,6 @@ void ocfs2_do_node_down(int node_num, void *data) ocfs2_recovery_thread(osb, node_num); } -static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, - int bit) -{ - set_bit(bit, map->map); -} - void ocfs2_node_map_set_bit(struct ocfs2_super *osb, struct ocfs2_node_map *map, int bit) @@ -79,16 +68,10 @@ void ocfs2_node_map_set_bit(struct ocfs2_super *osb, return; BUG_ON(bit >= map->num_nodes); spin_lock(&osb->node_map_lock); - __ocfs2_node_map_set_bit(map, bit); + set_bit(bit, map->map); spin_unlock(&osb->node_map_lock); } -static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, - int bit) -{ - clear_bit(bit, map->map); -} - void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, struct ocfs2_node_map *map, int bit) @@ -97,7 +80,7 @@ void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, return; BUG_ON(bit >= map->num_nodes); spin_lock(&osb->node_map_lock); - __ocfs2_node_map_clear_bit(map, bit); + clear_bit(bit, map->map); spin_unlock(&osb->node_map_lock); } -- 2.34.1
Christophe JAILLET
2022-Jul-19 10:01 UTC
[Ocfs2-devel] [PATCH 2/3] ocfs2: Remove a useless spinlock
'node_map_lock' is a spinlock only used to protect calls to set_bit(), clear_bit() and test_bit(). {set|clear}_bit() are already atomic and don't need this extra spinlock. test_bit() only reads the bitmap for a given bit. Remove this useless spinlock. Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr> --- test_bit() is NOT documented as an atomic function. However, I can't see how it could return a wrong result here. So review with care. There is maybe something I don't think about that is lurking here. --- fs/ocfs2/heartbeat.c | 11 ++++------- fs/ocfs2/ocfs2.h | 2 -- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index 1d72e0788943..4863ad35c242 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c @@ -35,7 +35,6 @@ static void ocfs2_node_map_init(struct ocfs2_node_map *map) void ocfs2_init_node_maps(struct ocfs2_super *osb) { - spin_lock_init(&osb->node_map_lock); ocfs2_node_map_init(&osb->osb_recovering_orphan_dirs); } @@ -67,9 +66,8 @@ void ocfs2_node_map_set_bit(struct ocfs2_super *osb, if (bit==-1) return; BUG_ON(bit >= map->num_nodes); - spin_lock(&osb->node_map_lock); + set_bit(bit, map->map); - spin_unlock(&osb->node_map_lock); } void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, @@ -79,9 +77,8 @@ void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, if (bit==-1) return; BUG_ON(bit >= map->num_nodes); - spin_lock(&osb->node_map_lock); + clear_bit(bit, map->map); - spin_unlock(&osb->node_map_lock); } int ocfs2_node_map_test_bit(struct ocfs2_super *osb, @@ -89,13 +86,13 @@ int ocfs2_node_map_test_bit(struct ocfs2_super *osb, int bit) { int ret; + if (bit >= map->num_nodes) { mlog(ML_ERROR, "bit=%d map->num_nodes=%d\n", bit, map->num_nodes); BUG(); } - spin_lock(&osb->node_map_lock); + ret = test_bit(bit, map->map); - spin_unlock(&osb->node_map_lock); return ret; } diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index 740b64238312..1df193b97c30 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h @@ -302,8 +302,6 @@ struct ocfs2_super u32 *slot_recovery_generations; - spinlock_t node_map_lock; - u64 root_blkno; u64 system_dir_blkno; u64 bitmap_blkno; -- 2.34.1
Christophe JAILLET
2022-Jul-19 10:05 UTC
[Ocfs2-devel] [PATCH 3/3] ocfs2: use the bitmap API to simplify code
Use bitmap_zero() instead of hand-writing it. It is less verbose. While at it, add an explicit #include <linux/bitmap.h>. Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr> --- fs/ocfs2/heartbeat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index 4863ad35c242..e243cd99e63f 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c @@ -8,6 +8,7 @@ * Copyright (C) 2002, 2004 Oracle. All rights reserved. */ +#include <linux/bitmap.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/highmem.h> @@ -29,8 +30,7 @@ static void ocfs2_node_map_init(struct ocfs2_node_map *map) { map->num_nodes = OCFS2_NODE_MAP_MAX_NODES; - memset(map->map, 0, BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES) * - sizeof(unsigned long)); + bitmap_zero(map->map, OCFS2_NODE_MAP_MAX_NODES); } void ocfs2_init_node_maps(struct ocfs2_super *osb) -- 2.34.1
Joseph Qi
2022-Jul-20 02:03 UTC
[Ocfs2-devel] [PATCH 1/3] ocfs2: Remove some useless functions
On 7/19/22 6:01 PM, Christophe JAILLET wrote:> __ocfs2_node_map_set_bit() and __ocfs2_node_map_set_bit() are just > wrapper around set_bit() and clear_bit(). > > The leading __ also makes think that these functions are non-atomic just > like __set_bit() and __clear_bit(). > > So, just remove these wrappers and call set_bit() and clear_bit() > directly. > > Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr>Looks good. Reviewed-by: Joseph Qi <joseph.qi at linux.alibaba.com>> --- > fs/ocfs2/heartbeat.c | 21 ++------------------- > 1 file changed, 2 insertions(+), 19 deletions(-) > > diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c > index 9099d8fc7599..1d72e0788943 100644 > --- a/fs/ocfs2/heartbeat.c > +++ b/fs/ocfs2/heartbeat.c > @@ -24,11 +24,6 @@ > > #include "buffer_head_io.h" > > -static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, > - int bit); > -static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, > - int bit); > - > /* special case -1 for now > * TODO: should *really* make sure the calling func never passes -1!! */ > static void ocfs2_node_map_init(struct ocfs2_node_map *map) > @@ -65,12 +60,6 @@ void ocfs2_do_node_down(int node_num, void *data) > ocfs2_recovery_thread(osb, node_num); > } > > -static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, > - int bit) > -{ > - set_bit(bit, map->map); > -} > - > void ocfs2_node_map_set_bit(struct ocfs2_super *osb, > struct ocfs2_node_map *map, > int bit) > @@ -79,16 +68,10 @@ void ocfs2_node_map_set_bit(struct ocfs2_super *osb, > return; > BUG_ON(bit >= map->num_nodes); > spin_lock(&osb->node_map_lock); > - __ocfs2_node_map_set_bit(map, bit); > + set_bit(bit, map->map); > spin_unlock(&osb->node_map_lock); > } > > -static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, > - int bit) > -{ > - clear_bit(bit, map->map); > -} > - > void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, > struct ocfs2_node_map *map, > int bit) > @@ -97,7 +80,7 @@ void ocfs2_node_map_clear_bit(struct ocfs2_super *osb, > return; > BUG_ON(bit >= map->num_nodes); > spin_lock(&osb->node_map_lock); > - __ocfs2_node_map_clear_bit(map, bit); > + clear_bit(bit, map->map); > spin_unlock(&osb->node_map_lock); > } >