1
2
3
4
5
6
7
8
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#include <linux/fs.h>
13#include <linux/dlm.h>
14#include <linux/slab.h>
15#include <linux/types.h>
16#include <linux/delay.h>
17#include <linux/gfs2_ondisk.h>
18#include <linux/sched/signal.h>
19
20#include "incore.h"
21#include "glock.h"
22#include "util.h"
23#include "sys.h"
24#include "trace_gfs2.h"
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46static inline void gfs2_update_stats(struct gfs2_lkstats *s, unsigned index,
47 s64 sample)
48{
49 s64 delta = sample - s->stats[index];
50 s->stats[index] += (delta >> 3);
51 index++;
52 s->stats[index] += ((abs(delta) - s->stats[index]) >> 2);
53}
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72static inline void gfs2_update_reply_times(struct gfs2_glock *gl)
73{
74 struct gfs2_pcpu_lkstats *lks;
75 const unsigned gltype = gl->gl_name.ln_type;
76 unsigned index = test_bit(GLF_BLOCKING, &gl->gl_flags) ?
77 GFS2_LKS_SRTTB : GFS2_LKS_SRTT;
78 s64 rtt;
79
80 preempt_disable();
81 rtt = ktime_to_ns(ktime_sub(ktime_get_real(), gl->gl_dstamp));
82 lks = this_cpu_ptr(gl->gl_name.ln_sbd->sd_lkstats);
83 gfs2_update_stats(&gl->gl_stats, index, rtt);
84 gfs2_update_stats(&lks->lkstats[gltype], index, rtt);
85 preempt_enable();
86
87 trace_gfs2_glock_lock_time(gl, rtt);
88}
89
90
91
92
93
94
95
96
97
98
99static inline void gfs2_update_request_times(struct gfs2_glock *gl)
100{
101 struct gfs2_pcpu_lkstats *lks;
102 const unsigned gltype = gl->gl_name.ln_type;
103 ktime_t dstamp;
104 s64 irt;
105
106 preempt_disable();
107 dstamp = gl->gl_dstamp;
108 gl->gl_dstamp = ktime_get_real();
109 irt = ktime_to_ns(ktime_sub(gl->gl_dstamp, dstamp));
110 lks = this_cpu_ptr(gl->gl_name.ln_sbd->sd_lkstats);
111 gfs2_update_stats(&gl->gl_stats, GFS2_LKS_SIRT, irt);
112 gfs2_update_stats(&lks->lkstats[gltype], GFS2_LKS_SIRT, irt);
113 preempt_enable();
114}
115
116static void gdlm_ast(void *arg)
117{
118 struct gfs2_glock *gl = arg;
119 unsigned ret = gl->gl_state;
120
121 gfs2_update_reply_times(gl);
122 BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
123
124 if ((gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) && gl->gl_lksb.sb_lvbptr)
125 memset(gl->gl_lksb.sb_lvbptr, 0, GDLM_LVB_SIZE);
126
127 switch (gl->gl_lksb.sb_status) {
128 case -DLM_EUNLOCK:
129 gfs2_glock_free(gl);
130 return;
131 case -DLM_ECANCEL:
132 ret |= LM_OUT_CANCELED;
133 goto out;
134 case -EAGAIN:
135 case -EDEADLK:
136 goto out;
137 case -ETIMEDOUT:
138 ret |= LM_OUT_ERROR;
139 goto out;
140 case 0:
141 break;
142 default:
143 BUG();
144 }
145
146 ret = gl->gl_req;
147 if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
148 if (gl->gl_req == LM_ST_SHARED)
149 ret = LM_ST_DEFERRED;
150 else if (gl->gl_req == LM_ST_DEFERRED)
151 ret = LM_ST_SHARED;
152 else
153 BUG();
154 }
155
156 set_bit(GLF_INITIAL, &gl->gl_flags);
157 gfs2_glock_complete(gl, ret);
158 return;
159out:
160 if (!test_bit(GLF_INITIAL, &gl->gl_flags))
161 gl->gl_lksb.sb_lkid = 0;
162 gfs2_glock_complete(gl, ret);
163}
164
165static void gdlm_bast(void *arg, int mode)
166{
167 struct gfs2_glock *gl = arg;
168
169 switch (mode) {
170 case DLM_LOCK_EX:
171 gfs2_glock_cb(gl, LM_ST_UNLOCKED);
172 break;
173 case DLM_LOCK_CW:
174 gfs2_glock_cb(gl, LM_ST_DEFERRED);
175 break;
176 case DLM_LOCK_PR:
177 gfs2_glock_cb(gl, LM_ST_SHARED);
178 break;
179 default:
180 pr_err("unknown bast mode %d\n", mode);
181 BUG();
182 }
183}
184
185
186
187static int make_mode(const unsigned int lmstate)
188{
189 switch (lmstate) {
190 case LM_ST_UNLOCKED:
191 return DLM_LOCK_NL;
192 case LM_ST_EXCLUSIVE:
193 return DLM_LOCK_EX;
194 case LM_ST_DEFERRED:
195 return DLM_LOCK_CW;
196 case LM_ST_SHARED:
197 return DLM_LOCK_PR;
198 }
199 pr_err("unknown LM state %d\n", lmstate);
200 BUG();
201 return -1;
202}
203
204static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
205 const int req)
206{
207 u32 lkf = 0;
208
209 if (gl->gl_lksb.sb_lvbptr)
210 lkf |= DLM_LKF_VALBLK;
211
212 if (gfs_flags & LM_FLAG_TRY)
213 lkf |= DLM_LKF_NOQUEUE;
214
215 if (gfs_flags & LM_FLAG_TRY_1CB) {
216 lkf |= DLM_LKF_NOQUEUE;
217 lkf |= DLM_LKF_NOQUEUEBAST;
218 }
219
220 if (gfs_flags & LM_FLAG_PRIORITY) {
221 lkf |= DLM_LKF_NOORDER;
222 lkf |= DLM_LKF_HEADQUE;
223 }
224
225 if (gfs_flags & LM_FLAG_ANY) {
226 if (req == DLM_LOCK_PR)
227 lkf |= DLM_LKF_ALTCW;
228 else if (req == DLM_LOCK_CW)
229 lkf |= DLM_LKF_ALTPR;
230 else
231 BUG();
232 }
233
234 if (gl->gl_lksb.sb_lkid != 0) {
235 lkf |= DLM_LKF_CONVERT;
236 if (test_bit(GLF_BLOCKING, &gl->gl_flags))
237 lkf |= DLM_LKF_QUECVT;
238 }
239
240 return lkf;
241}
242
243static void gfs2_reverse_hex(char *c, u64 value)
244{
245 *c = '0';
246 while (value) {
247 *c-- = hex_asc[value & 0x0f];
248 value >>= 4;
249 }
250}
251
252static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state,
253 unsigned int flags)
254{
255 struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct;
256 int req;
257 u32 lkf;
258 char strname[GDLM_STRNAME_BYTES] = "";
259
260 req = make_mode(req_state);
261 lkf = make_flags(gl, flags, req);
262 gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
263 gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
264 if (gl->gl_lksb.sb_lkid) {
265 gfs2_update_request_times(gl);
266 } else {
267 memset(strname, ' ', GDLM_STRNAME_BYTES - 1);
268 strname[GDLM_STRNAME_BYTES - 1] = '\0';
269 gfs2_reverse_hex(strname + 7, gl->gl_name.ln_type);
270 gfs2_reverse_hex(strname + 23, gl->gl_name.ln_number);
271 gl->gl_dstamp = ktime_get_real();
272 }
273
274
275
276
277 return dlm_lock(ls->ls_dlm, req, &gl->gl_lksb, lkf, strname,
278 GDLM_STRNAME_BYTES - 1, 0, gdlm_ast, gl, gdlm_bast);
279}
280
281static void gdlm_put_lock(struct gfs2_glock *gl)
282{
283 struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
284 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
285 int lvb_needs_unlock = 0;
286 int error;
287
288 if (gl->gl_lksb.sb_lkid == 0) {
289 gfs2_glock_free(gl);
290 return;
291 }
292
293 clear_bit(GLF_BLOCKING, &gl->gl_flags);
294 gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
295 gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
296 gfs2_update_request_times(gl);
297
298
299
300 if (gl->gl_lksb.sb_lvbptr && (gl->gl_state == LM_ST_EXCLUSIVE))
301 lvb_needs_unlock = 1;
302
303 if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
304 !lvb_needs_unlock) {
305 gfs2_glock_free(gl);
306 return;
307 }
308
309 error = dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_VALBLK,
310 NULL, gl);
311 if (error) {
312 pr_err("gdlm_unlock %x,%llx err=%d\n",
313 gl->gl_name.ln_type,
314 (unsigned long long)gl->gl_name.ln_number, error);
315 return;
316 }
317}
318
319static void gdlm_cancel(struct gfs2_glock *gl)
320{
321 struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct;
322 dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_CANCEL, NULL, gl);
323}
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465#define JID_BITMAP_OFFSET 8
466
467static void control_lvb_read(struct lm_lockstruct *ls, uint32_t *lvb_gen,
468 char *lvb_bits)
469{
470 __le32 gen;
471 memcpy(lvb_bits, ls->ls_control_lvb, GDLM_LVB_SIZE);
472 memcpy(&gen, lvb_bits, sizeof(__le32));
473 *lvb_gen = le32_to_cpu(gen);
474}
475
476static void control_lvb_write(struct lm_lockstruct *ls, uint32_t lvb_gen,
477 char *lvb_bits)
478{
479 __le32 gen;
480 memcpy(ls->ls_control_lvb, lvb_bits, GDLM_LVB_SIZE);
481 gen = cpu_to_le32(lvb_gen);
482 memcpy(ls->ls_control_lvb, &gen, sizeof(__le32));
483}
484
485static int all_jid_bits_clear(char *lvb)
486{
487 return !memchr_inv(lvb + JID_BITMAP_OFFSET, 0,
488 GDLM_LVB_SIZE - JID_BITMAP_OFFSET);
489}
490
491static void sync_wait_cb(void *arg)
492{
493 struct lm_lockstruct *ls = arg;
494 complete(&ls->ls_sync_wait);
495}
496
497static int sync_unlock(struct gfs2_sbd *sdp, struct dlm_lksb *lksb, char *name)
498{
499 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
500 int error;
501
502 error = dlm_unlock(ls->ls_dlm, lksb->sb_lkid, 0, lksb, ls);
503 if (error) {
504 fs_err(sdp, "%s lkid %x error %d\n",
505 name, lksb->sb_lkid, error);
506 return error;
507 }
508
509 wait_for_completion(&ls->ls_sync_wait);
510
511 if (lksb->sb_status != -DLM_EUNLOCK) {
512 fs_err(sdp, "%s lkid %x status %d\n",
513 name, lksb->sb_lkid, lksb->sb_status);
514 return -1;
515 }
516 return 0;
517}
518
519static int sync_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags,
520 unsigned int num, struct dlm_lksb *lksb, char *name)
521{
522 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
523 char strname[GDLM_STRNAME_BYTES];
524 int error, status;
525
526 memset(strname, 0, GDLM_STRNAME_BYTES);
527 snprintf(strname, GDLM_STRNAME_BYTES, "%8x%16x", LM_TYPE_NONDISK, num);
528
529 error = dlm_lock(ls->ls_dlm, mode, lksb, flags,
530 strname, GDLM_STRNAME_BYTES - 1,
531 0, sync_wait_cb, ls, NULL);
532 if (error) {
533 fs_err(sdp, "%s lkid %x flags %x mode %d error %d\n",
534 name, lksb->sb_lkid, flags, mode, error);
535 return error;
536 }
537
538 wait_for_completion(&ls->ls_sync_wait);
539
540 status = lksb->sb_status;
541
542 if (status && status != -EAGAIN) {
543 fs_err(sdp, "%s lkid %x flags %x mode %d status %d\n",
544 name, lksb->sb_lkid, flags, mode, status);
545 }
546
547 return status;
548}
549
550static int mounted_unlock(struct gfs2_sbd *sdp)
551{
552 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
553 return sync_unlock(sdp, &ls->ls_mounted_lksb, "mounted_lock");
554}
555
556static int mounted_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags)
557{
558 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
559 return sync_lock(sdp, mode, flags, GFS2_MOUNTED_LOCK,
560 &ls->ls_mounted_lksb, "mounted_lock");
561}
562
563static int control_unlock(struct gfs2_sbd *sdp)
564{
565 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
566 return sync_unlock(sdp, &ls->ls_control_lksb, "control_lock");
567}
568
569static int control_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags)
570{
571 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
572 return sync_lock(sdp, mode, flags, GFS2_CONTROL_LOCK,
573 &ls->ls_control_lksb, "control_lock");
574}
575
576static void gfs2_control_func(struct work_struct *work)
577{
578 struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work);
579 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
580 uint32_t block_gen, start_gen, lvb_gen, flags;
581 int recover_set = 0;
582 int write_lvb = 0;
583 int recover_size;
584 int i, error;
585
586 spin_lock(&ls->ls_recover_spin);
587
588
589
590
591
592
593
594
595
596 if (!test_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags) ||
597 test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
598 spin_unlock(&ls->ls_recover_spin);
599 return;
600 }
601 block_gen = ls->ls_recover_block;
602 start_gen = ls->ls_recover_start;
603 spin_unlock(&ls->ls_recover_spin);
604
605
606
607
608
609
610
611
612 if (block_gen == start_gen)
613 return;
614
615
616
617
618
619
620
621
622
623
624
625
626
627 error = control_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_VALBLK);
628 if (error) {
629 fs_err(sdp, "control lock EX error %d\n", error);
630 return;
631 }
632
633 control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
634
635 spin_lock(&ls->ls_recover_spin);
636 if (block_gen != ls->ls_recover_block ||
637 start_gen != ls->ls_recover_start) {
638 fs_info(sdp, "recover generation %u block1 %u %u\n",
639 start_gen, block_gen, ls->ls_recover_block);
640 spin_unlock(&ls->ls_recover_spin);
641 control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
642 return;
643 }
644
645 recover_size = ls->ls_recover_size;
646
647 if (lvb_gen <= start_gen) {
648
649
650
651
652
653
654
655
656
657 for (i = 0; i < recover_size; i++) {
658 if (ls->ls_recover_result[i] != LM_RD_SUCCESS)
659 continue;
660
661 ls->ls_recover_result[i] = 0;
662
663 if (!test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET))
664 continue;
665
666 __clear_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
667 write_lvb = 1;
668 }
669 }
670
671 if (lvb_gen == start_gen) {
672
673
674
675 for (i = 0; i < recover_size; i++) {
676 if (!ls->ls_recover_submit[i])
677 continue;
678 if (ls->ls_recover_submit[i] < lvb_gen)
679 ls->ls_recover_submit[i] = 0;
680 }
681 } else if (lvb_gen < start_gen) {
682
683
684
685 for (i = 0; i < recover_size; i++) {
686 if (!ls->ls_recover_submit[i])
687 continue;
688 if (ls->ls_recover_submit[i] < start_gen) {
689 ls->ls_recover_submit[i] = 0;
690 __set_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
691 }
692 }
693
694
695 write_lvb = 1;
696 } else {
697
698
699
700 }
701 spin_unlock(&ls->ls_recover_spin);
702
703 if (write_lvb) {
704 control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
705 flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK;
706 } else {
707 flags = DLM_LKF_CONVERT;
708 }
709
710 error = control_lock(sdp, DLM_LOCK_NL, flags);
711 if (error) {
712 fs_err(sdp, "control lock NL error %d\n", error);
713 return;
714 }
715
716
717
718
719
720
721
722
723 for (i = 0; i < recover_size; i++) {
724 if (test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET)) {
725 fs_info(sdp, "recover generation %u jid %d\n",
726 start_gen, i);
727 gfs2_recover_set(sdp, i);
728 recover_set++;
729 }
730 }
731 if (recover_set)
732 return;
733
734
735
736
737
738
739
740 spin_lock(&ls->ls_recover_spin);
741 if (ls->ls_recover_block == block_gen &&
742 ls->ls_recover_start == start_gen) {
743 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
744 spin_unlock(&ls->ls_recover_spin);
745 fs_info(sdp, "recover generation %u done\n", start_gen);
746 gfs2_glock_thaw(sdp);
747 } else {
748 fs_info(sdp, "recover generation %u block2 %u %u\n",
749 start_gen, block_gen, ls->ls_recover_block);
750 spin_unlock(&ls->ls_recover_spin);
751 }
752}
753
754static int control_mount(struct gfs2_sbd *sdp)
755{
756 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
757 uint32_t start_gen, block_gen, mount_gen, lvb_gen;
758 int mounted_mode;
759 int retries = 0;
760 int error;
761
762 memset(&ls->ls_mounted_lksb, 0, sizeof(struct dlm_lksb));
763 memset(&ls->ls_control_lksb, 0, sizeof(struct dlm_lksb));
764 memset(&ls->ls_control_lvb, 0, GDLM_LVB_SIZE);
765 ls->ls_control_lksb.sb_lvbptr = ls->ls_control_lvb;
766 init_completion(&ls->ls_sync_wait);
767
768 set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
769
770 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_VALBLK);
771 if (error) {
772 fs_err(sdp, "control_mount control_lock NL error %d\n", error);
773 return error;
774 }
775
776 error = mounted_lock(sdp, DLM_LOCK_NL, 0);
777 if (error) {
778 fs_err(sdp, "control_mount mounted_lock NL error %d\n", error);
779 control_unlock(sdp);
780 return error;
781 }
782 mounted_mode = DLM_LOCK_NL;
783
784restart:
785 if (retries++ && signal_pending(current)) {
786 error = -EINTR;
787 goto fail;
788 }
789
790
791
792
793
794
795 if (mounted_mode != DLM_LOCK_NL) {
796 error = mounted_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
797 if (error)
798 goto fail;
799 mounted_mode = DLM_LOCK_NL;
800 }
801
802
803
804
805
806
807
808 msleep_interruptible(500);
809
810
811
812
813
814
815
816 error = control_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE|DLM_LKF_VALBLK);
817 if (error == -EAGAIN) {
818 goto restart;
819 } else if (error) {
820 fs_err(sdp, "control_mount control_lock EX error %d\n", error);
821 goto fail;
822 }
823
824 error = mounted_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE);
825 if (!error) {
826 mounted_mode = DLM_LOCK_EX;
827 goto locks_done;
828 } else if (error != -EAGAIN) {
829 fs_err(sdp, "control_mount mounted_lock EX error %d\n", error);
830 goto fail;
831 }
832
833 error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE);
834 if (!error) {
835 mounted_mode = DLM_LOCK_PR;
836 goto locks_done;
837 } else {
838
839 fs_err(sdp, "control_mount mounted_lock PR error %d\n", error);
840 goto fail;
841 }
842
843locks_done:
844
845
846
847
848
849
850
851
852
853
854
855 control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
856
857 if (lvb_gen == 0xFFFFFFFF) {
858
859 fs_err(sdp, "control_mount control_lock disabled\n");
860 error = -EINVAL;
861 goto fail;
862 }
863
864 if (mounted_mode == DLM_LOCK_EX) {
865
866 spin_lock(&ls->ls_recover_spin);
867 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
868 set_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags);
869 set_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags);
870 spin_unlock(&ls->ls_recover_spin);
871 fs_info(sdp, "first mounter control generation %u\n", lvb_gen);
872 return 0;
873 }
874
875 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
876 if (error)
877 goto fail;
878
879
880
881
882
883
884
885 if (!all_jid_bits_clear(ls->ls_lvb_bits)) {
886
887 fs_info(sdp, "control_mount wait for journal recovery\n");
888 goto restart;
889 }
890
891 spin_lock(&ls->ls_recover_spin);
892 block_gen = ls->ls_recover_block;
893 start_gen = ls->ls_recover_start;
894 mount_gen = ls->ls_recover_mount;
895
896 if (lvb_gen < mount_gen) {
897
898
899 fs_info(sdp, "control_mount wait1 block %u start %u mount %u "
900 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
901 lvb_gen, ls->ls_recover_flags);
902 spin_unlock(&ls->ls_recover_spin);
903 goto restart;
904 }
905
906 if (lvb_gen != start_gen) {
907
908
909 fs_info(sdp, "control_mount wait2 block %u start %u mount %u "
910 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
911 lvb_gen, ls->ls_recover_flags);
912 spin_unlock(&ls->ls_recover_spin);
913 goto restart;
914 }
915
916 if (block_gen == start_gen) {
917
918 fs_info(sdp, "control_mount wait3 block %u start %u mount %u "
919 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
920 lvb_gen, ls->ls_recover_flags);
921 spin_unlock(&ls->ls_recover_spin);
922 goto restart;
923 }
924
925 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
926 set_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags);
927 memset(ls->ls_recover_submit, 0, ls->ls_recover_size*sizeof(uint32_t));
928 memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t));
929 spin_unlock(&ls->ls_recover_spin);
930 return 0;
931
932fail:
933 mounted_unlock(sdp);
934 control_unlock(sdp);
935 return error;
936}
937
938static int control_first_done(struct gfs2_sbd *sdp)
939{
940 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
941 uint32_t start_gen, block_gen;
942 int error;
943
944restart:
945 spin_lock(&ls->ls_recover_spin);
946 start_gen = ls->ls_recover_start;
947 block_gen = ls->ls_recover_block;
948
949 if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags) ||
950 !test_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags) ||
951 !test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
952
953 fs_err(sdp, "control_first_done start %u block %u flags %lx\n",
954 start_gen, block_gen, ls->ls_recover_flags);
955 spin_unlock(&ls->ls_recover_spin);
956 control_unlock(sdp);
957 return -1;
958 }
959
960 if (start_gen == block_gen) {
961
962
963
964
965
966
967
968 spin_unlock(&ls->ls_recover_spin);
969 fs_info(sdp, "control_first_done wait gen %u\n", start_gen);
970
971 wait_on_bit(&ls->ls_recover_flags, DFL_DLM_RECOVERY,
972 TASK_UNINTERRUPTIBLE);
973 goto restart;
974 }
975
976 clear_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags);
977 set_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags);
978 memset(ls->ls_recover_submit, 0, ls->ls_recover_size*sizeof(uint32_t));
979 memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t));
980 spin_unlock(&ls->ls_recover_spin);
981
982 memset(ls->ls_lvb_bits, 0, GDLM_LVB_SIZE);
983 control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
984
985 error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT);
986 if (error)
987 fs_err(sdp, "control_first_done mounted PR error %d\n", error);
988
989 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT|DLM_LKF_VALBLK);
990 if (error)
991 fs_err(sdp, "control_first_done control NL error %d\n", error);
992
993 return error;
994}
995
996
997
998
999
1000
1001
1002#define RECOVER_SIZE_INC 16
1003
1004static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
1005 int num_slots)
1006{
1007 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1008 uint32_t *submit = NULL;
1009 uint32_t *result = NULL;
1010 uint32_t old_size, new_size;
1011 int i, max_jid;
1012
1013 if (!ls->ls_lvb_bits) {
1014 ls->ls_lvb_bits = kzalloc(GDLM_LVB_SIZE, GFP_NOFS);
1015 if (!ls->ls_lvb_bits)
1016 return -ENOMEM;
1017 }
1018
1019 max_jid = 0;
1020 for (i = 0; i < num_slots; i++) {
1021 if (max_jid < slots[i].slot - 1)
1022 max_jid = slots[i].slot - 1;
1023 }
1024
1025 old_size = ls->ls_recover_size;
1026
1027 if (old_size >= max_jid + 1)
1028 return 0;
1029
1030 new_size = old_size + RECOVER_SIZE_INC;
1031
1032 submit = kcalloc(new_size, sizeof(uint32_t), GFP_NOFS);
1033 result = kcalloc(new_size, sizeof(uint32_t), GFP_NOFS);
1034 if (!submit || !result) {
1035 kfree(submit);
1036 kfree(result);
1037 return -ENOMEM;
1038 }
1039
1040 spin_lock(&ls->ls_recover_spin);
1041 memcpy(submit, ls->ls_recover_submit, old_size * sizeof(uint32_t));
1042 memcpy(result, ls->ls_recover_result, old_size * sizeof(uint32_t));
1043 kfree(ls->ls_recover_submit);
1044 kfree(ls->ls_recover_result);
1045 ls->ls_recover_submit = submit;
1046 ls->ls_recover_result = result;
1047 ls->ls_recover_size = new_size;
1048 spin_unlock(&ls->ls_recover_spin);
1049 return 0;
1050}
1051
1052static void free_recover_size(struct lm_lockstruct *ls)
1053{
1054 kfree(ls->ls_lvb_bits);
1055 kfree(ls->ls_recover_submit);
1056 kfree(ls->ls_recover_result);
1057 ls->ls_recover_submit = NULL;
1058 ls->ls_recover_result = NULL;
1059 ls->ls_recover_size = 0;
1060 ls->ls_lvb_bits = NULL;
1061}
1062
1063
1064
1065static void gdlm_recover_prep(void *arg)
1066{
1067 struct gfs2_sbd *sdp = arg;
1068 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1069
1070 spin_lock(&ls->ls_recover_spin);
1071 ls->ls_recover_block = ls->ls_recover_start;
1072 set_bit(DFL_DLM_RECOVERY, &ls->ls_recover_flags);
1073
1074 if (!test_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags) ||
1075 test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
1076 spin_unlock(&ls->ls_recover_spin);
1077 return;
1078 }
1079 set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
1080 spin_unlock(&ls->ls_recover_spin);
1081}
1082
1083
1084
1085
1086static void gdlm_recover_slot(void *arg, struct dlm_slot *slot)
1087{
1088 struct gfs2_sbd *sdp = arg;
1089 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1090 int jid = slot->slot - 1;
1091
1092 spin_lock(&ls->ls_recover_spin);
1093 if (ls->ls_recover_size < jid + 1) {
1094 fs_err(sdp, "recover_slot jid %d gen %u short size %d\n",
1095 jid, ls->ls_recover_block, ls->ls_recover_size);
1096 spin_unlock(&ls->ls_recover_spin);
1097 return;
1098 }
1099
1100 if (ls->ls_recover_submit[jid]) {
1101 fs_info(sdp, "recover_slot jid %d gen %u prev %u\n",
1102 jid, ls->ls_recover_block, ls->ls_recover_submit[jid]);
1103 }
1104 ls->ls_recover_submit[jid] = ls->ls_recover_block;
1105 spin_unlock(&ls->ls_recover_spin);
1106}
1107
1108
1109
1110static void gdlm_recover_done(void *arg, struct dlm_slot *slots, int num_slots,
1111 int our_slot, uint32_t generation)
1112{
1113 struct gfs2_sbd *sdp = arg;
1114 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1115
1116
1117 set_recover_size(sdp, slots, num_slots);
1118
1119 spin_lock(&ls->ls_recover_spin);
1120 ls->ls_recover_start = generation;
1121
1122 if (!ls->ls_recover_mount) {
1123 ls->ls_recover_mount = generation;
1124 ls->ls_jid = our_slot - 1;
1125 }
1126
1127 if (!test_bit(DFL_UNMOUNT, &ls->ls_recover_flags))
1128 queue_delayed_work(gfs2_control_wq, &sdp->sd_control_work, 0);
1129
1130 clear_bit(DFL_DLM_RECOVERY, &ls->ls_recover_flags);
1131 smp_mb__after_atomic();
1132 wake_up_bit(&ls->ls_recover_flags, DFL_DLM_RECOVERY);
1133 spin_unlock(&ls->ls_recover_spin);
1134}
1135
1136
1137
1138static void gdlm_recovery_result(struct gfs2_sbd *sdp, unsigned int jid,
1139 unsigned int result)
1140{
1141 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1142
1143 if (test_bit(DFL_NO_DLM_OPS, &ls->ls_recover_flags))
1144 return;
1145
1146
1147 if (jid == ls->ls_jid)
1148 return;
1149
1150 spin_lock(&ls->ls_recover_spin);
1151 if (test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
1152 spin_unlock(&ls->ls_recover_spin);
1153 return;
1154 }
1155 if (ls->ls_recover_size < jid + 1) {
1156 fs_err(sdp, "recovery_result jid %d short size %d\n",
1157 jid, ls->ls_recover_size);
1158 spin_unlock(&ls->ls_recover_spin);
1159 return;
1160 }
1161
1162 fs_info(sdp, "recover jid %d result %s\n", jid,
1163 result == LM_RD_GAVEUP ? "busy" : "success");
1164
1165 ls->ls_recover_result[jid] = result;
1166
1167
1168
1169
1170
1171 if (!test_bit(DFL_UNMOUNT, &ls->ls_recover_flags))
1172 queue_delayed_work(gfs2_control_wq, &sdp->sd_control_work,
1173 result == LM_RD_GAVEUP ? HZ : 0);
1174 spin_unlock(&ls->ls_recover_spin);
1175}
1176
1177static const struct dlm_lockspace_ops gdlm_lockspace_ops = {
1178 .recover_prep = gdlm_recover_prep,
1179 .recover_slot = gdlm_recover_slot,
1180 .recover_done = gdlm_recover_done,
1181};
1182
1183static int gdlm_mount(struct gfs2_sbd *sdp, const char *table)
1184{
1185 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1186 char cluster[GFS2_LOCKNAME_LEN];
1187 const char *fsname;
1188 uint32_t flags;
1189 int error, ops_result;
1190
1191
1192
1193
1194
1195 INIT_DELAYED_WORK(&sdp->sd_control_work, gfs2_control_func);
1196 spin_lock_init(&ls->ls_recover_spin);
1197 ls->ls_recover_flags = 0;
1198 ls->ls_recover_mount = 0;
1199 ls->ls_recover_start = 0;
1200 ls->ls_recover_block = 0;
1201 ls->ls_recover_size = 0;
1202 ls->ls_recover_submit = NULL;
1203 ls->ls_recover_result = NULL;
1204 ls->ls_lvb_bits = NULL;
1205
1206 error = set_recover_size(sdp, NULL, 0);
1207 if (error)
1208 goto fail;
1209
1210
1211
1212
1213
1214 fsname = strchr(table, ':');
1215 if (!fsname) {
1216 fs_info(sdp, "no fsname found\n");
1217 error = -EINVAL;
1218 goto fail_free;
1219 }
1220 memset(cluster, 0, sizeof(cluster));
1221 memcpy(cluster, table, strlen(table) - strlen(fsname));
1222 fsname++;
1223
1224 flags = DLM_LSFL_FS | DLM_LSFL_NEWEXCL;
1225
1226
1227
1228
1229
1230 error = dlm_new_lockspace(fsname, cluster, flags, GDLM_LVB_SIZE,
1231 &gdlm_lockspace_ops, sdp, &ops_result,
1232 &ls->ls_dlm);
1233 if (error) {
1234 fs_err(sdp, "dlm_new_lockspace error %d\n", error);
1235 goto fail_free;
1236 }
1237
1238 if (ops_result < 0) {
1239
1240
1241
1242
1243 fs_info(sdp, "dlm lockspace ops not used\n");
1244 free_recover_size(ls);
1245 set_bit(DFL_NO_DLM_OPS, &ls->ls_recover_flags);
1246 return 0;
1247 }
1248
1249 if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags)) {
1250 fs_err(sdp, "dlm lockspace ops disallow jid preset\n");
1251 error = -EINVAL;
1252 goto fail_release;
1253 }
1254
1255
1256
1257
1258
1259
1260 error = control_mount(sdp);
1261 if (error) {
1262 fs_err(sdp, "mount control error %d\n", error);
1263 goto fail_release;
1264 }
1265
1266 ls->ls_first = !!test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags);
1267 clear_bit(SDF_NOJOURNALID, &sdp->sd_flags);
1268 smp_mb__after_atomic();
1269 wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID);
1270 return 0;
1271
1272fail_release:
1273 dlm_release_lockspace(ls->ls_dlm, 2);
1274fail_free:
1275 free_recover_size(ls);
1276fail:
1277 return error;
1278}
1279
1280static void gdlm_first_done(struct gfs2_sbd *sdp)
1281{
1282 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1283 int error;
1284
1285 if (test_bit(DFL_NO_DLM_OPS, &ls->ls_recover_flags))
1286 return;
1287
1288 error = control_first_done(sdp);
1289 if (error)
1290 fs_err(sdp, "mount first_done error %d\n", error);
1291}
1292
1293static void gdlm_unmount(struct gfs2_sbd *sdp)
1294{
1295 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1296
1297 if (test_bit(DFL_NO_DLM_OPS, &ls->ls_recover_flags))
1298 goto release;
1299
1300
1301
1302 spin_lock(&ls->ls_recover_spin);
1303 set_bit(DFL_UNMOUNT, &ls->ls_recover_flags);
1304 spin_unlock(&ls->ls_recover_spin);
1305 flush_delayed_work(&sdp->sd_control_work);
1306
1307
1308release:
1309 if (ls->ls_dlm) {
1310 dlm_release_lockspace(ls->ls_dlm, 2);
1311 ls->ls_dlm = NULL;
1312 }
1313
1314 free_recover_size(ls);
1315}
1316
1317static const match_table_t dlm_tokens = {
1318 { Opt_jid, "jid=%d"},
1319 { Opt_id, "id=%d"},
1320 { Opt_first, "first=%d"},
1321 { Opt_nodir, "nodir=%d"},
1322 { Opt_err, NULL },
1323};
1324
1325const struct lm_lockops gfs2_dlm_ops = {
1326 .lm_proto_name = "lock_dlm",
1327 .lm_mount = gdlm_mount,
1328 .lm_first_done = gdlm_first_done,
1329 .lm_recovery_result = gdlm_recovery_result,
1330 .lm_unmount = gdlm_unmount,
1331 .lm_put_lock = gdlm_put_lock,
1332 .lm_lock = gdlm_lock,
1333 .lm_cancel = gdlm_cancel,
1334 .lm_tokens = &dlm_tokens,
1335};
1336
1337