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
19#include "incore.h"
20#include "glock.h"
21#include "util.h"
22#include "sys.h"
23#include "trace_gfs2.h"
24
25extern struct workqueue_struct *gfs2_control_wq;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47static inline void gfs2_update_stats(struct gfs2_lkstats *s, unsigned index,
48 s64 sample)
49{
50 s64 delta = sample - s->stats[index];
51 s->stats[index] += (delta >> 3);
52 index++;
53 s->stats[index] += ((abs64(delta) - s->stats[index]) >> 2);
54}
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73static inline void gfs2_update_reply_times(struct gfs2_glock *gl)
74{
75 struct gfs2_pcpu_lkstats *lks;
76 const unsigned gltype = gl->gl_name.ln_type;
77 unsigned index = test_bit(GLF_BLOCKING, &gl->gl_flags) ?
78 GFS2_LKS_SRTTB : GFS2_LKS_SRTT;
79 s64 rtt;
80
81 preempt_disable();
82 rtt = ktime_to_ns(ktime_sub(ktime_get_real(), gl->gl_dstamp));
83 lks = this_cpu_ptr(gl->gl_sbd->sd_lkstats);
84 gfs2_update_stats(&gl->gl_stats, index, rtt);
85 gfs2_update_stats(&lks->lkstats[gltype], index, rtt);
86 preempt_enable();
87
88 trace_gfs2_glock_lock_time(gl, rtt);
89}
90
91
92
93
94
95
96
97
98
99
100static inline void gfs2_update_request_times(struct gfs2_glock *gl)
101{
102 struct gfs2_pcpu_lkstats *lks;
103 const unsigned gltype = gl->gl_name.ln_type;
104 ktime_t dstamp;
105 s64 irt;
106
107 preempt_disable();
108 dstamp = gl->gl_dstamp;
109 gl->gl_dstamp = ktime_get_real();
110 irt = ktime_to_ns(ktime_sub(gl->gl_dstamp, dstamp));
111 lks = this_cpu_ptr(gl->gl_sbd->sd_lkstats);
112 gfs2_update_stats(&gl->gl_stats, GFS2_LKS_SIRT, irt);
113 gfs2_update_stats(&lks->lkstats[gltype], GFS2_LKS_SIRT, irt);
114 preempt_enable();
115}
116
117static void gdlm_ast(void *arg)
118{
119 struct gfs2_glock *gl = arg;
120 unsigned ret = gl->gl_state;
121
122 gfs2_update_reply_times(gl);
123 BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
124
125 if ((gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) && gl->gl_lksb.sb_lvbptr)
126 memset(gl->gl_lksb.sb_lvbptr, 0, GDLM_LVB_SIZE);
127
128 switch (gl->gl_lksb.sb_status) {
129 case -DLM_EUNLOCK:
130 gfs2_glock_free(gl);
131 return;
132 case -DLM_ECANCEL:
133 ret |= LM_OUT_CANCELED;
134 goto out;
135 case -EAGAIN:
136 case -EDEADLK:
137 goto out;
138 case -ETIMEDOUT:
139 ret |= LM_OUT_ERROR;
140 goto out;
141 case 0:
142 break;
143 default:
144 BUG();
145 }
146
147 ret = gl->gl_req;
148 if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
149 if (gl->gl_req == LM_ST_SHARED)
150 ret = LM_ST_DEFERRED;
151 else if (gl->gl_req == LM_ST_DEFERRED)
152 ret = LM_ST_SHARED;
153 else
154 BUG();
155 }
156
157 set_bit(GLF_INITIAL, &gl->gl_flags);
158 gfs2_glock_complete(gl, ret);
159 return;
160out:
161 if (!test_bit(GLF_INITIAL, &gl->gl_flags))
162 gl->gl_lksb.sb_lkid = 0;
163 gfs2_glock_complete(gl, ret);
164}
165
166static void gdlm_bast(void *arg, int mode)
167{
168 struct gfs2_glock *gl = arg;
169
170 switch (mode) {
171 case DLM_LOCK_EX:
172 gfs2_glock_cb(gl, LM_ST_UNLOCKED);
173 break;
174 case DLM_LOCK_CW:
175 gfs2_glock_cb(gl, LM_ST_DEFERRED);
176 break;
177 case DLM_LOCK_PR:
178 gfs2_glock_cb(gl, LM_ST_SHARED);
179 break;
180 default:
181 pr_err("unknown bast mode %d\n", mode);
182 BUG();
183 }
184}
185
186
187
188static int make_mode(const unsigned int lmstate)
189{
190 switch (lmstate) {
191 case LM_ST_UNLOCKED:
192 return DLM_LOCK_NL;
193 case LM_ST_EXCLUSIVE:
194 return DLM_LOCK_EX;
195 case LM_ST_DEFERRED:
196 return DLM_LOCK_CW;
197 case LM_ST_SHARED:
198 return DLM_LOCK_PR;
199 }
200 pr_err("unknown LM state %d\n", lmstate);
201 BUG();
202 return -1;
203}
204
205static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
206 const int req)
207{
208 u32 lkf = 0;
209
210 if (gl->gl_lksb.sb_lvbptr)
211 lkf |= DLM_LKF_VALBLK;
212
213 if (gfs_flags & LM_FLAG_TRY)
214 lkf |= DLM_LKF_NOQUEUE;
215
216 if (gfs_flags & LM_FLAG_TRY_1CB) {
217 lkf |= DLM_LKF_NOQUEUE;
218 lkf |= DLM_LKF_NOQUEUEBAST;
219 }
220
221 if (gfs_flags & LM_FLAG_PRIORITY) {
222 lkf |= DLM_LKF_NOORDER;
223 lkf |= DLM_LKF_HEADQUE;
224 }
225
226 if (gfs_flags & LM_FLAG_ANY) {
227 if (req == DLM_LOCK_PR)
228 lkf |= DLM_LKF_ALTCW;
229 else if (req == DLM_LOCK_CW)
230 lkf |= DLM_LKF_ALTPR;
231 else
232 BUG();
233 }
234
235 if (gl->gl_lksb.sb_lkid != 0) {
236 lkf |= DLM_LKF_CONVERT;
237 if (test_bit(GLF_BLOCKING, &gl->gl_flags))
238 lkf |= DLM_LKF_QUECVT;
239 }
240
241 return lkf;
242}
243
244static void gfs2_reverse_hex(char *c, u64 value)
245{
246 *c = '0';
247 while (value) {
248 *c-- = hex_asc[value & 0x0f];
249 value >>= 4;
250 }
251}
252
253static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state,
254 unsigned int flags)
255{
256 struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
257 int req;
258 u32 lkf;
259 char strname[GDLM_STRNAME_BYTES] = "";
260
261 req = make_mode(req_state);
262 lkf = make_flags(gl, flags, req);
263 gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
264 gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
265 if (gl->gl_lksb.sb_lkid) {
266 gfs2_update_request_times(gl);
267 } else {
268 memset(strname, ' ', GDLM_STRNAME_BYTES - 1);
269 strname[GDLM_STRNAME_BYTES - 1] = '\0';
270 gfs2_reverse_hex(strname + 7, gl->gl_name.ln_type);
271 gfs2_reverse_hex(strname + 23, gl->gl_name.ln_number);
272 gl->gl_dstamp = ktime_get_real();
273 }
274
275
276
277
278 return dlm_lock(ls->ls_dlm, req, &gl->gl_lksb, lkf, strname,
279 GDLM_STRNAME_BYTES - 1, 0, gdlm_ast, gl, gdlm_bast);
280}
281
282static void gdlm_put_lock(struct gfs2_glock *gl)
283{
284 struct gfs2_sbd *sdp = gl->gl_sbd;
285 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
286 int lvb_needs_unlock = 0;
287 int error;
288
289 if (gl->gl_lksb.sb_lkid == 0) {
290 gfs2_glock_free(gl);
291 return;
292 }
293
294 clear_bit(GLF_BLOCKING, &gl->gl_flags);
295 gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
296 gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
297 gfs2_update_request_times(gl);
298
299
300
301 if (gl->gl_lksb.sb_lvbptr && (gl->gl_state == LM_ST_EXCLUSIVE))
302 lvb_needs_unlock = 1;
303
304 if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
305 !lvb_needs_unlock) {
306 gfs2_glock_free(gl);
307 return;
308 }
309
310 error = dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_VALBLK,
311 NULL, gl);
312 if (error) {
313 pr_err("gdlm_unlock %x,%llx err=%d\n",
314 gl->gl_name.ln_type,
315 (unsigned long long)gl->gl_name.ln_number, error);
316 return;
317 }
318}
319
320static void gdlm_cancel(struct gfs2_glock *gl)
321{
322 struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
323 dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_CANCEL, NULL, gl);
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
466#define JID_BITMAP_OFFSET 8
467
468static void control_lvb_read(struct lm_lockstruct *ls, uint32_t *lvb_gen,
469 char *lvb_bits)
470{
471 __le32 gen;
472 memcpy(lvb_bits, ls->ls_control_lvb, GDLM_LVB_SIZE);
473 memcpy(&gen, lvb_bits, sizeof(__le32));
474 *lvb_gen = le32_to_cpu(gen);
475}
476
477static void control_lvb_write(struct lm_lockstruct *ls, uint32_t lvb_gen,
478 char *lvb_bits)
479{
480 __le32 gen;
481 memcpy(ls->ls_control_lvb, lvb_bits, GDLM_LVB_SIZE);
482 gen = cpu_to_le32(lvb_gen);
483 memcpy(ls->ls_control_lvb, &gen, sizeof(__le32));
484}
485
486static int all_jid_bits_clear(char *lvb)
487{
488 return !memchr_inv(lvb + JID_BITMAP_OFFSET, 0,
489 GDLM_LVB_SIZE - JID_BITMAP_OFFSET);
490}
491
492static void sync_wait_cb(void *arg)
493{
494 struct lm_lockstruct *ls = arg;
495 complete(&ls->ls_sync_wait);
496}
497
498static int sync_unlock(struct gfs2_sbd *sdp, struct dlm_lksb *lksb, char *name)
499{
500 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
501 int error;
502
503 error = dlm_unlock(ls->ls_dlm, lksb->sb_lkid, 0, lksb, ls);
504 if (error) {
505 fs_err(sdp, "%s lkid %x error %d\n",
506 name, lksb->sb_lkid, error);
507 return error;
508 }
509
510 wait_for_completion(&ls->ls_sync_wait);
511
512 if (lksb->sb_status != -DLM_EUNLOCK) {
513 fs_err(sdp, "%s lkid %x status %d\n",
514 name, lksb->sb_lkid, lksb->sb_status);
515 return -1;
516 }
517 return 0;
518}
519
520static int sync_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags,
521 unsigned int num, struct dlm_lksb *lksb, char *name)
522{
523 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
524 char strname[GDLM_STRNAME_BYTES];
525 int error, status;
526
527 memset(strname, 0, GDLM_STRNAME_BYTES);
528 snprintf(strname, GDLM_STRNAME_BYTES, "%8x%16x", LM_TYPE_NONDISK, num);
529
530 error = dlm_lock(ls->ls_dlm, mode, lksb, flags,
531 strname, GDLM_STRNAME_BYTES - 1,
532 0, sync_wait_cb, ls, NULL);
533 if (error) {
534 fs_err(sdp, "%s lkid %x flags %x mode %d error %d\n",
535 name, lksb->sb_lkid, flags, mode, error);
536 return error;
537 }
538
539 wait_for_completion(&ls->ls_sync_wait);
540
541 status = lksb->sb_status;
542
543 if (status && status != -EAGAIN) {
544 fs_err(sdp, "%s lkid %x flags %x mode %d status %d\n",
545 name, lksb->sb_lkid, flags, mode, status);
546 }
547
548 return status;
549}
550
551static int mounted_unlock(struct gfs2_sbd *sdp)
552{
553 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
554 return sync_unlock(sdp, &ls->ls_mounted_lksb, "mounted_lock");
555}
556
557static int mounted_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags)
558{
559 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
560 return sync_lock(sdp, mode, flags, GFS2_MOUNTED_LOCK,
561 &ls->ls_mounted_lksb, "mounted_lock");
562}
563
564static int control_unlock(struct gfs2_sbd *sdp)
565{
566 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
567 return sync_unlock(sdp, &ls->ls_control_lksb, "control_lock");
568}
569
570static int control_lock(struct gfs2_sbd *sdp, int mode, uint32_t flags)
571{
572 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
573 return sync_lock(sdp, mode, flags, GFS2_CONTROL_LOCK,
574 &ls->ls_control_lksb, "control_lock");
575}
576
577static void gfs2_control_func(struct work_struct *work)
578{
579 struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work);
580 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
581 uint32_t block_gen, start_gen, lvb_gen, flags;
582 int recover_set = 0;
583 int write_lvb = 0;
584 int recover_size;
585 int i, error;
586
587 spin_lock(&ls->ls_recover_spin);
588
589
590
591
592
593
594
595
596
597 if (!test_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags) ||
598 test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
599 spin_unlock(&ls->ls_recover_spin);
600 return;
601 }
602 block_gen = ls->ls_recover_block;
603 start_gen = ls->ls_recover_start;
604 spin_unlock(&ls->ls_recover_spin);
605
606
607
608
609
610
611
612
613 if (block_gen == start_gen)
614 return;
615
616
617
618
619
620
621
622
623
624
625
626
627
628 error = control_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_VALBLK);
629 if (error) {
630 fs_err(sdp, "control lock EX error %d\n", error);
631 return;
632 }
633
634 control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
635
636 spin_lock(&ls->ls_recover_spin);
637 if (block_gen != ls->ls_recover_block ||
638 start_gen != ls->ls_recover_start) {
639 fs_info(sdp, "recover generation %u block1 %u %u\n",
640 start_gen, block_gen, ls->ls_recover_block);
641 spin_unlock(&ls->ls_recover_spin);
642 control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
643 return;
644 }
645
646 recover_size = ls->ls_recover_size;
647
648 if (lvb_gen <= start_gen) {
649
650
651
652
653
654
655
656
657
658 for (i = 0; i < recover_size; i++) {
659 if (ls->ls_recover_result[i] != LM_RD_SUCCESS)
660 continue;
661
662 ls->ls_recover_result[i] = 0;
663
664 if (!test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET))
665 continue;
666
667 __clear_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
668 write_lvb = 1;
669 }
670 }
671
672 if (lvb_gen == start_gen) {
673
674
675
676 for (i = 0; i < recover_size; i++) {
677 if (!ls->ls_recover_submit[i])
678 continue;
679 if (ls->ls_recover_submit[i] < lvb_gen)
680 ls->ls_recover_submit[i] = 0;
681 }
682 } else if (lvb_gen < start_gen) {
683
684
685
686 for (i = 0; i < recover_size; i++) {
687 if (!ls->ls_recover_submit[i])
688 continue;
689 if (ls->ls_recover_submit[i] < start_gen) {
690 ls->ls_recover_submit[i] = 0;
691 __set_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
692 }
693 }
694
695
696 write_lvb = 1;
697 } else {
698
699
700
701 }
702 spin_unlock(&ls->ls_recover_spin);
703
704 if (write_lvb) {
705 control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
706 flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK;
707 } else {
708 flags = DLM_LKF_CONVERT;
709 }
710
711 error = control_lock(sdp, DLM_LOCK_NL, flags);
712 if (error) {
713 fs_err(sdp, "control lock NL error %d\n", error);
714 return;
715 }
716
717
718
719
720
721
722
723
724 for (i = 0; i < recover_size; i++) {
725 if (test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET)) {
726 fs_info(sdp, "recover generation %u jid %d\n",
727 start_gen, i);
728 gfs2_recover_set(sdp, i);
729 recover_set++;
730 }
731 }
732 if (recover_set)
733 return;
734
735
736
737
738
739
740
741 spin_lock(&ls->ls_recover_spin);
742 if (ls->ls_recover_block == block_gen &&
743 ls->ls_recover_start == start_gen) {
744 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
745 spin_unlock(&ls->ls_recover_spin);
746 fs_info(sdp, "recover generation %u done\n", start_gen);
747 gfs2_glock_thaw(sdp);
748 } else {
749 fs_info(sdp, "recover generation %u block2 %u %u\n",
750 start_gen, block_gen, ls->ls_recover_block);
751 spin_unlock(&ls->ls_recover_spin);
752 }
753}
754
755static int control_mount(struct gfs2_sbd *sdp)
756{
757 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
758 uint32_t start_gen, block_gen, mount_gen, lvb_gen;
759 int mounted_mode;
760 int retries = 0;
761 int error;
762
763 memset(&ls->ls_mounted_lksb, 0, sizeof(struct dlm_lksb));
764 memset(&ls->ls_control_lksb, 0, sizeof(struct dlm_lksb));
765 memset(&ls->ls_control_lvb, 0, GDLM_LVB_SIZE);
766 ls->ls_control_lksb.sb_lvbptr = ls->ls_control_lvb;
767 init_completion(&ls->ls_sync_wait);
768
769 set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
770
771 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_VALBLK);
772 if (error) {
773 fs_err(sdp, "control_mount control_lock NL error %d\n", error);
774 return error;
775 }
776
777 error = mounted_lock(sdp, DLM_LOCK_NL, 0);
778 if (error) {
779 fs_err(sdp, "control_mount mounted_lock NL error %d\n", error);
780 control_unlock(sdp);
781 return error;
782 }
783 mounted_mode = DLM_LOCK_NL;
784
785restart:
786 if (retries++ && signal_pending(current)) {
787 error = -EINTR;
788 goto fail;
789 }
790
791
792
793
794
795
796 if (mounted_mode != DLM_LOCK_NL) {
797 error = mounted_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
798 if (error)
799 goto fail;
800 mounted_mode = DLM_LOCK_NL;
801 }
802
803
804
805
806
807
808
809 msleep_interruptible(500);
810
811
812
813
814
815
816
817 error = control_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE|DLM_LKF_VALBLK);
818 if (error == -EAGAIN) {
819 goto restart;
820 } else if (error) {
821 fs_err(sdp, "control_mount control_lock EX error %d\n", error);
822 goto fail;
823 }
824
825 error = mounted_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE);
826 if (!error) {
827 mounted_mode = DLM_LOCK_EX;
828 goto locks_done;
829 } else if (error != -EAGAIN) {
830 fs_err(sdp, "control_mount mounted_lock EX error %d\n", error);
831 goto fail;
832 }
833
834 error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT|DLM_LKF_NOQUEUE);
835 if (!error) {
836 mounted_mode = DLM_LOCK_PR;
837 goto locks_done;
838 } else {
839
840 fs_err(sdp, "control_mount mounted_lock PR error %d\n", error);
841 goto fail;
842 }
843
844locks_done:
845
846
847
848
849
850
851
852
853
854
855
856 control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
857
858 if (lvb_gen == 0xFFFFFFFF) {
859
860 fs_err(sdp, "control_mount control_lock disabled\n");
861 error = -EINVAL;
862 goto fail;
863 }
864
865 if (mounted_mode == DLM_LOCK_EX) {
866
867 spin_lock(&ls->ls_recover_spin);
868 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
869 set_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags);
870 set_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags);
871 spin_unlock(&ls->ls_recover_spin);
872 fs_info(sdp, "first mounter control generation %u\n", lvb_gen);
873 return 0;
874 }
875
876 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
877 if (error)
878 goto fail;
879
880
881
882
883
884
885
886 if (!all_jid_bits_clear(ls->ls_lvb_bits)) {
887
888 fs_info(sdp, "control_mount wait for journal recovery\n");
889 goto restart;
890 }
891
892 spin_lock(&ls->ls_recover_spin);
893 block_gen = ls->ls_recover_block;
894 start_gen = ls->ls_recover_start;
895 mount_gen = ls->ls_recover_mount;
896
897 if (lvb_gen < mount_gen) {
898
899
900 fs_info(sdp, "control_mount wait1 block %u start %u mount %u "
901 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
902 lvb_gen, ls->ls_recover_flags);
903 spin_unlock(&ls->ls_recover_spin);
904 goto restart;
905 }
906
907 if (lvb_gen != start_gen) {
908
909
910 fs_info(sdp, "control_mount wait2 block %u start %u mount %u "
911 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
912 lvb_gen, ls->ls_recover_flags);
913 spin_unlock(&ls->ls_recover_spin);
914 goto restart;
915 }
916
917 if (block_gen == start_gen) {
918
919 fs_info(sdp, "control_mount wait3 block %u start %u mount %u "
920 "lvb %u flags %lx\n", block_gen, start_gen, mount_gen,
921 lvb_gen, ls->ls_recover_flags);
922 spin_unlock(&ls->ls_recover_spin);
923 goto restart;
924 }
925
926 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
927 set_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags);
928 memset(ls->ls_recover_submit, 0, ls->ls_recover_size*sizeof(uint32_t));
929 memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t));
930 spin_unlock(&ls->ls_recover_spin);
931 return 0;
932
933fail:
934 mounted_unlock(sdp);
935 control_unlock(sdp);
936 return error;
937}
938
939static int control_first_done(struct gfs2_sbd *sdp)
940{
941 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
942 uint32_t start_gen, block_gen;
943 int error;
944
945restart:
946 spin_lock(&ls->ls_recover_spin);
947 start_gen = ls->ls_recover_start;
948 block_gen = ls->ls_recover_block;
949
950 if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags) ||
951 !test_bit(DFL_MOUNT_DONE, &ls->ls_recover_flags) ||
952 !test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
953
954 fs_err(sdp, "control_first_done start %u block %u flags %lx\n",
955 start_gen, block_gen, ls->ls_recover_flags);
956 spin_unlock(&ls->ls_recover_spin);
957 control_unlock(sdp);
958 return -1;
959 }
960
961 if (start_gen == block_gen) {
962
963
964
965
966
967
968
969 spin_unlock(&ls->ls_recover_spin);
970 fs_info(sdp, "control_first_done wait gen %u\n", start_gen);
971
972 wait_on_bit(&ls->ls_recover_flags, DFL_DLM_RECOVERY,
973 TASK_UNINTERRUPTIBLE);
974 goto restart;
975 }
976
977 clear_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags);
978 set_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags);
979 memset(ls->ls_recover_submit, 0, ls->ls_recover_size*sizeof(uint32_t));
980 memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t));
981 spin_unlock(&ls->ls_recover_spin);
982
983 memset(ls->ls_lvb_bits, 0, GDLM_LVB_SIZE);
984 control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
985
986 error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT);
987 if (error)
988 fs_err(sdp, "control_first_done mounted PR error %d\n", error);
989
990 error = control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT|DLM_LKF_VALBLK);
991 if (error)
992 fs_err(sdp, "control_first_done control NL error %d\n", error);
993
994 return error;
995}
996
997
998
999
1000
1001
1002
1003#define RECOVER_SIZE_INC 16
1004
1005static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
1006 int num_slots)
1007{
1008 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
1009 uint32_t *submit = NULL;
1010 uint32_t *result = NULL;
1011 uint32_t old_size, new_size;
1012 int i, max_jid;
1013
1014 if (!ls->ls_lvb_bits) {
1015 ls->ls_lvb_bits = kzalloc(GDLM_LVB_SIZE, GFP_NOFS);
1016 if (!ls->ls_lvb_bits)
1017 return -ENOMEM;
1018 }
1019
1020 max_jid = 0;
1021 for (i = 0; i < num_slots; i++) {
1022 if (max_jid < slots[i].slot - 1)
1023 max_jid = slots[i].slot - 1;
1024 }
1025
1026 old_size = ls->ls_recover_size;
1027
1028 if (old_size >= max_jid + 1)
1029 return 0;
1030
1031 new_size = old_size + RECOVER_SIZE_INC;
1032
1033 submit = kcalloc(new_size, sizeof(uint32_t), GFP_NOFS);
1034 result = kcalloc(new_size, sizeof(uint32_t), GFP_NOFS);
1035 if (!submit || !result) {
1036 kfree(submit);
1037 kfree(result);
1038 return -ENOMEM;
1039 }
1040
1041 spin_lock(&ls->ls_recover_spin);
1042 memcpy(submit, ls->ls_recover_submit, old_size * sizeof(uint32_t));
1043 memcpy(result, ls->ls_recover_result, old_size * sizeof(uint32_t));
1044 kfree(ls->ls_recover_submit);
1045 kfree(ls->ls_recover_result);
1046 ls->ls_recover_submit = submit;
1047 ls->ls_recover_result = result;
1048 ls->ls_recover_size = new_size;
1049 spin_unlock(&ls->ls_recover_spin);
1050 return 0;
1051}
1052
1053static void free_recover_size(struct lm_lockstruct *ls)
1054{
1055 kfree(ls->ls_lvb_bits);
1056 kfree(ls->ls_recover_submit);
1057 kfree(ls->ls_recover_result);
1058 ls->ls_recover_submit = NULL;
1059 ls->ls_recover_result = NULL;
1060 ls->ls_recover_size = 0;
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",
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",
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
1177const 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