@@ -580,7 +580,6 @@ static void gfs2_control_func(struct work_struct *work)
580
580
{
581
581
struct gfs2_sbd * sdp = container_of (work , struct gfs2_sbd , sd_control_work .work );
582
582
struct lm_lockstruct * ls = & sdp -> sd_lockstruct ;
583
- char lvb_bits [GDLM_LVB_SIZE ];
584
583
uint32_t block_gen , start_gen , lvb_gen , flags ;
585
584
int recover_set = 0 ;
586
585
int write_lvb = 0 ;
@@ -634,7 +633,7 @@ static void gfs2_control_func(struct work_struct *work)
634
633
return ;
635
634
}
636
635
637
- control_lvb_read (ls , & lvb_gen , lvb_bits );
636
+ control_lvb_read (ls , & lvb_gen , ls -> ls_lvb_bits );
638
637
639
638
spin_lock (& ls -> ls_recover_spin );
640
639
if (block_gen != ls -> ls_recover_block ||
@@ -664,10 +663,10 @@ static void gfs2_control_func(struct work_struct *work)
664
663
665
664
ls -> ls_recover_result [i ] = 0 ;
666
665
667
- if (!test_bit_le (i , lvb_bits + JID_BITMAP_OFFSET ))
666
+ if (!test_bit_le (i , ls -> ls_lvb_bits + JID_BITMAP_OFFSET ))
668
667
continue ;
669
668
670
- __clear_bit_le (i , lvb_bits + JID_BITMAP_OFFSET );
669
+ __clear_bit_le (i , ls -> ls_lvb_bits + JID_BITMAP_OFFSET );
671
670
write_lvb = 1 ;
672
671
}
673
672
}
@@ -691,7 +690,7 @@ static void gfs2_control_func(struct work_struct *work)
691
690
continue ;
692
691
if (ls -> ls_recover_submit [i ] < start_gen ) {
693
692
ls -> ls_recover_submit [i ] = 0 ;
694
- __set_bit_le (i , lvb_bits + JID_BITMAP_OFFSET );
693
+ __set_bit_le (i , ls -> ls_lvb_bits + JID_BITMAP_OFFSET );
695
694
}
696
695
}
697
696
/* even if there are no bits to set, we need to write the
@@ -705,7 +704,7 @@ static void gfs2_control_func(struct work_struct *work)
705
704
spin_unlock (& ls -> ls_recover_spin );
706
705
707
706
if (write_lvb ) {
708
- control_lvb_write (ls , start_gen , lvb_bits );
707
+ control_lvb_write (ls , start_gen , ls -> ls_lvb_bits );
709
708
flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK ;
710
709
} else {
711
710
flags = DLM_LKF_CONVERT ;
@@ -725,7 +724,7 @@ static void gfs2_control_func(struct work_struct *work)
725
724
*/
726
725
727
726
for (i = 0 ; i < recover_size ; i ++ ) {
728
- if (test_bit_le (i , lvb_bits + JID_BITMAP_OFFSET )) {
727
+ if (test_bit_le (i , ls -> ls_lvb_bits + JID_BITMAP_OFFSET )) {
729
728
fs_info (sdp , "recover generation %u jid %d\n" ,
730
729
start_gen , i );
731
730
gfs2_recover_set (sdp , i );
@@ -758,7 +757,6 @@ static void gfs2_control_func(struct work_struct *work)
758
757
static int control_mount (struct gfs2_sbd * sdp )
759
758
{
760
759
struct lm_lockstruct * ls = & sdp -> sd_lockstruct ;
761
- char lvb_bits [GDLM_LVB_SIZE ];
762
760
uint32_t start_gen , block_gen , mount_gen , lvb_gen ;
763
761
int mounted_mode ;
764
762
int retries = 0 ;
@@ -857,7 +855,7 @@ static int control_mount(struct gfs2_sbd *sdp)
857
855
* lvb_gen will be non-zero.
858
856
*/
859
857
860
- control_lvb_read (ls , & lvb_gen , lvb_bits );
858
+ control_lvb_read (ls , & lvb_gen , ls -> ls_lvb_bits );
861
859
862
860
if (lvb_gen == 0xFFFFFFFF ) {
863
861
/* special value to force mount attempts to fail */
@@ -887,7 +885,7 @@ static int control_mount(struct gfs2_sbd *sdp)
887
885
* and all lvb bits to be clear (no pending journal recoveries.)
888
886
*/
889
887
890
- if (!all_jid_bits_clear (lvb_bits )) {
888
+ if (!all_jid_bits_clear (ls -> ls_lvb_bits )) {
891
889
/* journals need recovery, wait until all are clear */
892
890
fs_info (sdp , "control_mount wait for journal recovery\n" );
893
891
goto restart ;
@@ -949,7 +947,6 @@ static int dlm_recovery_wait(void *word)
949
947
static int control_first_done (struct gfs2_sbd * sdp )
950
948
{
951
949
struct lm_lockstruct * ls = & sdp -> sd_lockstruct ;
952
- char lvb_bits [GDLM_LVB_SIZE ];
953
950
uint32_t start_gen , block_gen ;
954
951
int error ;
955
952
@@ -991,8 +988,8 @@ static int control_first_done(struct gfs2_sbd *sdp)
991
988
memset (ls -> ls_recover_result , 0 , ls -> ls_recover_size * sizeof (uint32_t ));
992
989
spin_unlock (& ls -> ls_recover_spin );
993
990
994
- memset (lvb_bits , 0 , sizeof ( lvb_bits ) );
995
- control_lvb_write (ls , start_gen , lvb_bits );
991
+ memset (ls -> ls_lvb_bits , 0 , GDLM_LVB_SIZE );
992
+ control_lvb_write (ls , start_gen , ls -> ls_lvb_bits );
996
993
997
994
error = mounted_lock (sdp , DLM_LOCK_PR , DLM_LKF_CONVERT );
998
995
if (error )
@@ -1022,6 +1019,12 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
1022
1019
uint32_t old_size , new_size ;
1023
1020
int i , max_jid ;
1024
1021
1022
+ if (!ls -> ls_lvb_bits ) {
1023
+ ls -> ls_lvb_bits = kzalloc (GDLM_LVB_SIZE , GFP_NOFS );
1024
+ if (!ls -> ls_lvb_bits )
1025
+ return - ENOMEM ;
1026
+ }
1027
+
1025
1028
max_jid = 0 ;
1026
1029
for (i = 0 ; i < num_slots ; i ++ ) {
1027
1030
if (max_jid < slots [i ].slot - 1 )
@@ -1057,6 +1060,7 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
1057
1060
1058
1061
static void free_recover_size (struct lm_lockstruct * ls )
1059
1062
{
1063
+ kfree (ls -> ls_lvb_bits );
1060
1064
kfree (ls -> ls_recover_submit );
1061
1065
kfree (ls -> ls_recover_result );
1062
1066
ls -> ls_recover_submit = NULL ;
@@ -1205,6 +1209,7 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table)
1205
1209
ls -> ls_recover_size = 0 ;
1206
1210
ls -> ls_recover_submit = NULL ;
1207
1211
ls -> ls_recover_result = NULL ;
1212
+ ls -> ls_lvb_bits = NULL ;
1208
1213
1209
1214
error = set_recover_size (sdp , NULL , 0 );
1210
1215
if (error )
0 commit comments