@@ -316,11 +316,11 @@ static int qd_get(struct gfs2_sbd *sdp, struct kqid qid,
316
316
}
317
317
318
318
319
- static void qd_hold (struct gfs2_quota_data * qd )
319
+ static void __qd_hold (struct gfs2_quota_data * qd )
320
320
{
321
321
struct gfs2_sbd * sdp = qd -> qd_sbd ;
322
- gfs2_assert (sdp , ! __lockref_is_dead ( & qd -> qd_lockref ) );
323
- lockref_get ( & qd -> qd_lockref ) ;
322
+ gfs2_assert (sdp , qd -> qd_lockref . count > 0 );
323
+ qd -> qd_lockref . count ++ ;
324
324
}
325
325
326
326
static void qd_put (struct gfs2_quota_data * qd )
@@ -462,19 +462,27 @@ static void bh_put(struct gfs2_quota_data *qd)
462
462
static bool qd_grab_sync (struct gfs2_sbd * sdp , struct gfs2_quota_data * qd ,
463
463
u64 sync_gen )
464
464
{
465
+ bool ret = false;
466
+
467
+ spin_lock (& qd -> qd_lockref .lock );
465
468
if (test_bit (QDF_LOCKED , & qd -> qd_flags ) ||
466
469
!test_bit (QDF_CHANGE , & qd -> qd_flags ) ||
467
470
qd -> qd_sync_gen >= sync_gen )
468
- return false ;
471
+ goto out ;
469
472
470
- if (!lockref_get_not_dead (& qd -> qd_lockref ))
471
- return false;
473
+ if (__lockref_is_dead (& qd -> qd_lockref ))
474
+ goto out ;
475
+ qd -> qd_lockref .count ++ ;
472
476
473
477
list_move_tail (& qd -> qd_list , & sdp -> sd_quota_list );
474
478
set_bit (QDF_LOCKED , & qd -> qd_flags );
475
479
qd -> qd_change_sync = qd -> qd_change ;
476
480
slot_hold (qd );
477
- return true;
481
+ ret = true;
482
+
483
+ out :
484
+ spin_unlock (& qd -> qd_lockref .lock );
485
+ return ret ;
478
486
}
479
487
480
488
static void qd_ungrab_sync (struct gfs2_quota_data * qd )
@@ -493,8 +501,10 @@ static void qdsb_put(struct gfs2_quota_data *qd)
493
501
494
502
static void qd_unlock (struct gfs2_quota_data * qd )
495
503
{
504
+ spin_lock (& qd -> qd_lockref .lock );
496
505
gfs2_assert_warn (qd -> qd_sbd , test_bit (QDF_LOCKED , & qd -> qd_flags ));
497
506
clear_bit (QDF_LOCKED , & qd -> qd_flags );
507
+ spin_unlock (& qd -> qd_lockref .lock );
498
508
qdsb_put (qd );
499
509
}
500
510
@@ -663,6 +673,7 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change)
663
673
struct gfs2_sbd * sdp = qd -> qd_sbd ;
664
674
struct gfs2_inode * ip = GFS2_I (sdp -> sd_qc_inode );
665
675
struct gfs2_quota_change * qc = qd -> qd_bh_qc ;
676
+ bool needs_put = false;
666
677
s64 x ;
667
678
668
679
mutex_lock (& sdp -> sd_quota_mutex );
@@ -674,26 +685,24 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change)
674
685
* used, and we assume a value of 0 otherwise.
675
686
*/
676
687
688
+ spin_lock (& qd -> qd_lockref .lock );
689
+
677
690
x = 0 ;
678
691
if (test_bit (QDF_CHANGE , & qd -> qd_flags ))
679
692
x = be64_to_cpu (qc -> qc_change );
680
693
x += change ;
681
-
682
- spin_lock (& qd_lock );
683
694
qd -> qd_change += change ;
684
- spin_unlock (& qd_lock );
685
695
686
696
if (!x && test_bit (QDF_CHANGE , & qd -> qd_flags )) {
687
697
/* The slot in the quota change file becomes unused. */
688
698
clear_bit (QDF_CHANGE , & qd -> qd_flags );
689
699
qc -> qc_flags = 0 ;
690
700
qc -> qc_id = 0 ;
691
- slot_put (qd );
692
- qd_put (qd );
701
+ needs_put = true;
693
702
} else if (x && !test_bit (QDF_CHANGE , & qd -> qd_flags )) {
694
703
/* The slot in the quota change file becomes used. */
695
704
set_bit (QDF_CHANGE , & qd -> qd_flags );
696
- qd_hold (qd );
705
+ __qd_hold (qd );
697
706
slot_hold (qd );
698
707
699
708
qc -> qc_flags = 0 ;
@@ -703,6 +712,12 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change)
703
712
}
704
713
qc -> qc_change = cpu_to_be64 (x );
705
714
715
+ spin_unlock (& qd -> qd_lockref .lock );
716
+
717
+ if (needs_put ) {
718
+ slot_put (qd );
719
+ qd_put (qd );
720
+ }
706
721
if (change < 0 ) /* Reset quiet flag if we freed some blocks */
707
722
clear_bit (QDF_QMSG_QUIET , & qd -> qd_flags );
708
723
mutex_unlock (& sdp -> sd_quota_mutex );
@@ -844,6 +859,7 @@ static int gfs2_adjust_quota(struct gfs2_sbd *sdp, loff_t loc,
844
859
be64_add_cpu (& q .qu_value , change );
845
860
if (((s64 )be64_to_cpu (q .qu_value )) < 0 )
846
861
q .qu_value = 0 ; /* Never go negative on quota usage */
862
+ spin_lock (& qd -> qd_lockref .lock );
847
863
qd -> qd_qb .qb_value = q .qu_value ;
848
864
if (fdq ) {
849
865
if (fdq -> d_fieldmask & QC_SPC_SOFT ) {
@@ -859,6 +875,7 @@ static int gfs2_adjust_quota(struct gfs2_sbd *sdp, loff_t loc,
859
875
qd -> qd_qb .qb_value = q .qu_value ;
860
876
}
861
877
}
878
+ spin_unlock (& qd -> qd_lockref .lock );
862
879
863
880
err = gfs2_write_disk_quota (sdp , & q , loc );
864
881
if (!err ) {
@@ -990,7 +1007,9 @@ static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd)
990
1007
qlvb -> qb_limit = q .qu_limit ;
991
1008
qlvb -> qb_warn = q .qu_warn ;
992
1009
qlvb -> qb_value = q .qu_value ;
1010
+ spin_lock (& qd -> qd_lockref .lock );
993
1011
qd -> qd_qb = * qlvb ;
1012
+ spin_unlock (& qd -> qd_lockref .lock );
994
1013
995
1014
return 0 ;
996
1015
}
@@ -1012,7 +1031,9 @@ static int do_glock(struct gfs2_quota_data *qd, int force_refresh,
1012
1031
if (test_and_clear_bit (QDF_REFRESH , & qd -> qd_flags ))
1013
1032
force_refresh = FORCE ;
1014
1033
1034
+ spin_lock (& qd -> qd_lockref .lock );
1015
1035
qd -> qd_qb = * (struct gfs2_quota_lvb * )qd -> qd_gl -> gl_lksb .sb_lvbptr ;
1036
+ spin_unlock (& qd -> qd_lockref .lock );
1016
1037
1017
1038
if (force_refresh || qd -> qd_qb .qb_magic != cpu_to_be32 (GFS2_MAGIC )) {
1018
1039
gfs2_glock_dq_uninit (q_gh );
@@ -1085,20 +1106,19 @@ static bool need_sync(struct gfs2_quota_data *qd)
1085
1106
struct gfs2_tune * gt = & sdp -> sd_tune ;
1086
1107
s64 value , change , limit ;
1087
1108
unsigned int num , den ;
1109
+ int ret = false;
1088
1110
1111
+ spin_lock (& qd -> qd_lockref .lock );
1089
1112
if (!qd -> qd_qb .qb_limit )
1090
- return false ;
1113
+ goto out ;
1091
1114
1092
- spin_lock (& qd_lock );
1093
1115
change = qd -> qd_change ;
1094
- spin_unlock (& qd_lock );
1095
-
1096
1116
if (change <= 0 )
1097
- return false ;
1117
+ goto out ;
1098
1118
value = (s64 )be64_to_cpu (qd -> qd_qb .qb_value );
1099
1119
limit = (s64 )be64_to_cpu (qd -> qd_qb .qb_limit );
1100
1120
if (value >= limit )
1101
- return false ;
1121
+ goto out ;
1102
1122
1103
1123
spin_lock (& gt -> gt_spin );
1104
1124
num = gt -> gt_quota_scale_num ;
@@ -1108,8 +1128,12 @@ static bool need_sync(struct gfs2_quota_data *qd)
1108
1128
change *= gfs2_jindex_size (sdp ) * num ;
1109
1129
change = div_s64 (change , den );
1110
1130
if (value + change < limit )
1111
- return false;
1112
- return true;
1131
+ goto out ;
1132
+
1133
+ ret = true;
1134
+ out :
1135
+ spin_unlock (& qd -> qd_lockref .lock );
1136
+ return ret ;
1113
1137
}
1114
1138
1115
1139
void gfs2_quota_unlock (struct gfs2_inode * ip )
@@ -1211,12 +1235,12 @@ int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid,
1211
1235
qid_eq (qd -> qd_id , make_kqid_gid (gid ))))
1212
1236
continue ;
1213
1237
1238
+ spin_lock (& qd -> qd_lockref .lock );
1214
1239
warn = (s64 )be64_to_cpu (qd -> qd_qb .qb_warn );
1215
1240
limit = (s64 )be64_to_cpu (qd -> qd_qb .qb_limit );
1216
1241
value = (s64 )be64_to_cpu (qd -> qd_qb .qb_value );
1217
- spin_lock (& qd_lock );
1218
1242
value += qd -> qd_change ;
1219
- spin_unlock (& qd_lock );
1243
+ spin_unlock (& qd -> qd_lockref . lock );
1220
1244
1221
1245
if (limit > 0 && (limit - value ) < ap -> allowed )
1222
1246
ap -> allowed = limit - value ;
@@ -1282,12 +1306,12 @@ static bool qd_changed(struct gfs2_sbd *sdp)
1282
1306
1283
1307
spin_lock (& qd_lock );
1284
1308
list_for_each_entry (qd , & sdp -> sd_quota_list , qd_list ) {
1285
- if ( test_bit ( QDF_LOCKED , & qd -> qd_flags ) ||
1286
- !test_bit (QDF_CHANGE , & qd -> qd_flags ))
1287
- continue ;
1288
-
1289
- changed = true;
1290
- break ;
1309
+ spin_lock ( & qd -> qd_lockref . lock );
1310
+ changed = !test_bit (QDF_LOCKED , & qd -> qd_flags ) &&
1311
+ test_bit ( QDF_CHANGE , & qd -> qd_flags ) ;
1312
+ spin_unlock ( & qd -> qd_lockref . lock );
1313
+ if ( changed )
1314
+ break ;
1291
1315
}
1292
1316
spin_unlock (& qd_lock );
1293
1317
return changed ;
0 commit comments