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); > } >