1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/types.h>
27#include <linux/slab.h>
28#include <linux/highmem.h>
29#include <linux/mm.h>
30#include <linux/kthread.h>
31#include <linux/pagemap.h>
32#include <linux/debugfs.h>
33#include <linux/seq_file.h>
34#include <linux/time.h>
35#include <linux/quotaops.h>
36
37#define MLOG_MASK_PREFIX ML_DLM_GLUE
38#include <cluster/masklog.h>
39
40#include "ocfs2.h"
41#include "ocfs2_lockingver.h"
42
43#include "alloc.h"
44#include "dcache.h"
45#include "dlmglue.h"
46#include "extent_map.h"
47#include "file.h"
48#include "heartbeat.h"
49#include "inode.h"
50#include "journal.h"
51#include "stackglue.h"
52#include "slot_map.h"
53#include "super.h"
54#include "uptodate.h"
55#include "quota.h"
56#include "refcounttree.h"
57#include "acl.h"
58
59#include "buffer_head_io.h"
60
61struct ocfs2_mask_waiter {
62 struct list_head mw_item;
63 int mw_status;
64 struct completion mw_complete;
65 unsigned long mw_mask;
66 unsigned long mw_goal;
67#ifdef CONFIG_OCFS2_FS_STATS
68 ktime_t mw_lock_start;
69#endif
70};
71
72static struct ocfs2_super *ocfs2_get_dentry_osb(struct ocfs2_lock_res *lockres);
73static struct ocfs2_super *ocfs2_get_inode_osb(struct ocfs2_lock_res *lockres);
74static struct ocfs2_super *ocfs2_get_file_osb(struct ocfs2_lock_res *lockres);
75static struct ocfs2_super *ocfs2_get_qinfo_osb(struct ocfs2_lock_res *lockres);
76
77
78
79
80
81
82
83
84enum ocfs2_unblock_action {
85 UNBLOCK_CONTINUE = 0,
86 UNBLOCK_CONTINUE_POST = 1,
87
88 UNBLOCK_STOP_POST = 2,
89
90};
91
92struct ocfs2_unblock_ctl {
93 int requeue;
94 enum ocfs2_unblock_action unblock_action;
95};
96
97
98struct lock_class_key lockdep_keys[OCFS2_NUM_LOCK_TYPES];
99
100static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres,
101 int new_level);
102static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres);
103
104static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
105 int blocking);
106
107static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres,
108 int blocking);
109
110static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
111 struct ocfs2_lock_res *lockres);
112
113static void ocfs2_set_qinfo_lvb(struct ocfs2_lock_res *lockres);
114
115static int ocfs2_check_refcount_downconvert(struct ocfs2_lock_res *lockres,
116 int new_level);
117static int ocfs2_refcount_convert_worker(struct ocfs2_lock_res *lockres,
118 int blocking);
119
120#define mlog_meta_lvb(__level, __lockres) ocfs2_dump_meta_lvb_info(__level, __PRETTY_FUNCTION__, __LINE__, __lockres)
121
122
123static void ocfs2_dump_meta_lvb_info(u64 level,
124 const char *function,
125 unsigned int line,
126 struct ocfs2_lock_res *lockres)
127{
128 struct ocfs2_meta_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
129
130 mlog(level, "LVB information for %s (called from %s:%u):\n",
131 lockres->l_name, function, line);
132 mlog(level, "version: %u, clusters: %u, generation: 0x%x\n",
133 lvb->lvb_version, be32_to_cpu(lvb->lvb_iclusters),
134 be32_to_cpu(lvb->lvb_igeneration));
135 mlog(level, "size: %llu, uid %u, gid %u, mode 0x%x\n",
136 (unsigned long long)be64_to_cpu(lvb->lvb_isize),
137 be32_to_cpu(lvb->lvb_iuid), be32_to_cpu(lvb->lvb_igid),
138 be16_to_cpu(lvb->lvb_imode));
139 mlog(level, "nlink %u, atime_packed 0x%llx, ctime_packed 0x%llx, "
140 "mtime_packed 0x%llx iattr 0x%x\n", be16_to_cpu(lvb->lvb_inlink),
141 (long long)be64_to_cpu(lvb->lvb_iatime_packed),
142 (long long)be64_to_cpu(lvb->lvb_ictime_packed),
143 (long long)be64_to_cpu(lvb->lvb_imtime_packed),
144 be32_to_cpu(lvb->lvb_iattr));
145}
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161struct ocfs2_lock_res_ops {
162
163
164
165
166 struct ocfs2_super * (*get_osb)(struct ocfs2_lock_res *);
167
168
169
170
171
172
173
174
175
176
177 void (*post_unlock)(struct ocfs2_super *, struct ocfs2_lock_res *);
178
179
180
181
182
183
184
185
186
187
188
189 int (*check_downconvert)(struct ocfs2_lock_res *, int);
190
191
192
193
194
195
196
197
198
199
200 void (*set_lvb)(struct ocfs2_lock_res *);
201
202
203
204
205
206
207
208
209
210
211 int (*downconvert_worker)(struct ocfs2_lock_res *, int);
212
213
214
215
216
217 int flags;
218};
219
220
221
222
223
224
225
226
227
228#define LOCK_TYPE_REQUIRES_REFRESH 0x1
229
230
231
232
233
234#define LOCK_TYPE_USES_LVB 0x2
235
236static struct ocfs2_lock_res_ops ocfs2_inode_rw_lops = {
237 .get_osb = ocfs2_get_inode_osb,
238 .flags = 0,
239};
240
241static struct ocfs2_lock_res_ops ocfs2_inode_inode_lops = {
242 .get_osb = ocfs2_get_inode_osb,
243 .check_downconvert = ocfs2_check_meta_downconvert,
244 .set_lvb = ocfs2_set_meta_lvb,
245 .downconvert_worker = ocfs2_data_convert_worker,
246 .flags = LOCK_TYPE_REQUIRES_REFRESH|LOCK_TYPE_USES_LVB,
247};
248
249static struct ocfs2_lock_res_ops ocfs2_super_lops = {
250 .flags = LOCK_TYPE_REQUIRES_REFRESH,
251};
252
253static struct ocfs2_lock_res_ops ocfs2_rename_lops = {
254 .flags = 0,
255};
256
257static struct ocfs2_lock_res_ops ocfs2_nfs_sync_lops = {
258 .flags = 0,
259};
260
261static struct ocfs2_lock_res_ops ocfs2_orphan_scan_lops = {
262 .flags = LOCK_TYPE_REQUIRES_REFRESH|LOCK_TYPE_USES_LVB,
263};
264
265static struct ocfs2_lock_res_ops ocfs2_dentry_lops = {
266 .get_osb = ocfs2_get_dentry_osb,
267 .post_unlock = ocfs2_dentry_post_unlock,
268 .downconvert_worker = ocfs2_dentry_convert_worker,
269 .flags = 0,
270};
271
272static struct ocfs2_lock_res_ops ocfs2_inode_open_lops = {
273 .get_osb = ocfs2_get_inode_osb,
274 .flags = 0,
275};
276
277static struct ocfs2_lock_res_ops ocfs2_flock_lops = {
278 .get_osb = ocfs2_get_file_osb,
279 .flags = 0,
280};
281
282static struct ocfs2_lock_res_ops ocfs2_qinfo_lops = {
283 .set_lvb = ocfs2_set_qinfo_lvb,
284 .get_osb = ocfs2_get_qinfo_osb,
285 .flags = LOCK_TYPE_REQUIRES_REFRESH | LOCK_TYPE_USES_LVB,
286};
287
288static struct ocfs2_lock_res_ops ocfs2_refcount_block_lops = {
289 .check_downconvert = ocfs2_check_refcount_downconvert,
290 .downconvert_worker = ocfs2_refcount_convert_worker,
291 .flags = 0,
292};
293
294static inline int ocfs2_is_inode_lock(struct ocfs2_lock_res *lockres)
295{
296 return lockres->l_type == OCFS2_LOCK_TYPE_META ||
297 lockres->l_type == OCFS2_LOCK_TYPE_RW ||
298 lockres->l_type == OCFS2_LOCK_TYPE_OPEN;
299}
300
301static inline struct ocfs2_lock_res *ocfs2_lksb_to_lock_res(struct ocfs2_dlm_lksb *lksb)
302{
303 return container_of(lksb, struct ocfs2_lock_res, l_lksb);
304}
305
306static inline struct inode *ocfs2_lock_res_inode(struct ocfs2_lock_res *lockres)
307{
308 BUG_ON(!ocfs2_is_inode_lock(lockres));
309
310 return (struct inode *) lockres->l_priv;
311}
312
313static inline struct ocfs2_dentry_lock *ocfs2_lock_res_dl(struct ocfs2_lock_res *lockres)
314{
315 BUG_ON(lockres->l_type != OCFS2_LOCK_TYPE_DENTRY);
316
317 return (struct ocfs2_dentry_lock *)lockres->l_priv;
318}
319
320static inline struct ocfs2_mem_dqinfo *ocfs2_lock_res_qinfo(struct ocfs2_lock_res *lockres)
321{
322 BUG_ON(lockres->l_type != OCFS2_LOCK_TYPE_QINFO);
323
324 return (struct ocfs2_mem_dqinfo *)lockres->l_priv;
325}
326
327static inline struct ocfs2_refcount_tree *
328ocfs2_lock_res_refcount_tree(struct ocfs2_lock_res *res)
329{
330 return container_of(res, struct ocfs2_refcount_tree, rf_lockres);
331}
332
333static inline struct ocfs2_super *ocfs2_get_lockres_osb(struct ocfs2_lock_res *lockres)
334{
335 if (lockres->l_ops->get_osb)
336 return lockres->l_ops->get_osb(lockres);
337
338 return (struct ocfs2_super *)lockres->l_priv;
339}
340
341static int ocfs2_lock_create(struct ocfs2_super *osb,
342 struct ocfs2_lock_res *lockres,
343 int level,
344 u32 dlm_flags);
345static inline int ocfs2_may_continue_on_blocked_lock(struct ocfs2_lock_res *lockres,
346 int wanted);
347static void __ocfs2_cluster_unlock(struct ocfs2_super *osb,
348 struct ocfs2_lock_res *lockres,
349 int level, unsigned long caller_ip);
350static inline void ocfs2_cluster_unlock(struct ocfs2_super *osb,
351 struct ocfs2_lock_res *lockres,
352 int level)
353{
354 __ocfs2_cluster_unlock(osb, lockres, level, _RET_IP_);
355}
356
357static inline void ocfs2_generic_handle_downconvert_action(struct ocfs2_lock_res *lockres);
358static inline void ocfs2_generic_handle_convert_action(struct ocfs2_lock_res *lockres);
359static inline void ocfs2_generic_handle_attach_action(struct ocfs2_lock_res *lockres);
360static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres, int level);
361static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb,
362 struct ocfs2_lock_res *lockres);
363static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres,
364 int convert);
365#define ocfs2_log_dlm_error(_func, _err, _lockres) do { \
366 if ((_lockres)->l_type != OCFS2_LOCK_TYPE_DENTRY) \
367 mlog(ML_ERROR, "DLM error %d while calling %s on resource %s\n", \
368 _err, _func, _lockres->l_name); \
369 else \
370 mlog(ML_ERROR, "DLM error %d while calling %s on resource %.*s%08x\n", \
371 _err, _func, OCFS2_DENTRY_LOCK_INO_START - 1, (_lockres)->l_name, \
372 (unsigned int)ocfs2_get_dentry_lock_ino(_lockres)); \
373} while (0)
374static int ocfs2_downconvert_thread(void *arg);
375static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
376 struct ocfs2_lock_res *lockres);
377static int ocfs2_inode_lock_update(struct inode *inode,
378 struct buffer_head **bh);
379static void ocfs2_drop_osb_locks(struct ocfs2_super *osb);
380static inline int ocfs2_highest_compat_lock_level(int level);
381static unsigned int ocfs2_prepare_downconvert(struct ocfs2_lock_res *lockres,
382 int new_level);
383static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
384 struct ocfs2_lock_res *lockres,
385 int new_level,
386 int lvb,
387 unsigned int generation);
388static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb,
389 struct ocfs2_lock_res *lockres);
390static int ocfs2_cancel_convert(struct ocfs2_super *osb,
391 struct ocfs2_lock_res *lockres);
392
393
394static void ocfs2_build_lock_name(enum ocfs2_lock_type type,
395 u64 blkno,
396 u32 generation,
397 char *name)
398{
399 int len;
400
401 BUG_ON(type >= OCFS2_NUM_LOCK_TYPES);
402
403 len = snprintf(name, OCFS2_LOCK_ID_MAX_LEN, "%c%s%016llx%08x",
404 ocfs2_lock_type_char(type), OCFS2_LOCK_ID_PAD,
405 (long long)blkno, generation);
406
407 BUG_ON(len != (OCFS2_LOCK_ID_MAX_LEN - 1));
408
409 mlog(0, "built lock resource with name: %s\n", name);
410}
411
412static DEFINE_SPINLOCK(ocfs2_dlm_tracking_lock);
413
414static void ocfs2_add_lockres_tracking(struct ocfs2_lock_res *res,
415 struct ocfs2_dlm_debug *dlm_debug)
416{
417 mlog(0, "Add tracking for lockres %s\n", res->l_name);
418
419 spin_lock(&ocfs2_dlm_tracking_lock);
420 list_add(&res->l_debug_list, &dlm_debug->d_lockres_tracking);
421 spin_unlock(&ocfs2_dlm_tracking_lock);
422}
423
424static void ocfs2_remove_lockres_tracking(struct ocfs2_lock_res *res)
425{
426 spin_lock(&ocfs2_dlm_tracking_lock);
427 if (!list_empty(&res->l_debug_list))
428 list_del_init(&res->l_debug_list);
429 spin_unlock(&ocfs2_dlm_tracking_lock);
430}
431
432#ifdef CONFIG_OCFS2_FS_STATS
433static void ocfs2_init_lock_stats(struct ocfs2_lock_res *res)
434{
435 res->l_lock_refresh = 0;
436 memset(&res->l_lock_prmode, 0, sizeof(struct ocfs2_lock_stats));
437 memset(&res->l_lock_exmode, 0, sizeof(struct ocfs2_lock_stats));
438}
439
440static void ocfs2_update_lock_stats(struct ocfs2_lock_res *res, int level,
441 struct ocfs2_mask_waiter *mw, int ret)
442{
443 u32 usec;
444 ktime_t kt;
445 struct ocfs2_lock_stats *stats;
446
447 if (level == LKM_PRMODE)
448 stats = &res->l_lock_prmode;
449 else if (level == LKM_EXMODE)
450 stats = &res->l_lock_exmode;
451 else
452 return;
453
454 kt = ktime_sub(ktime_get(), mw->mw_lock_start);
455 usec = ktime_to_us(kt);
456
457 stats->ls_gets++;
458 stats->ls_total += ktime_to_ns(kt);
459
460 if (unlikely(stats->ls_gets == 0)) {
461 stats->ls_gets++;
462 stats->ls_total = ktime_to_ns(kt);
463 }
464
465 if (stats->ls_max < usec)
466 stats->ls_max = usec;
467
468 if (ret)
469 stats->ls_fail++;
470}
471
472static inline void ocfs2_track_lock_refresh(struct ocfs2_lock_res *lockres)
473{
474 lockres->l_lock_refresh++;
475}
476
477static inline void ocfs2_init_start_time(struct ocfs2_mask_waiter *mw)
478{
479 mw->mw_lock_start = ktime_get();
480}
481#else
482static inline void ocfs2_init_lock_stats(struct ocfs2_lock_res *res)
483{
484}
485static inline void ocfs2_update_lock_stats(struct ocfs2_lock_res *res,
486 int level, struct ocfs2_mask_waiter *mw, int ret)
487{
488}
489static inline void ocfs2_track_lock_refresh(struct ocfs2_lock_res *lockres)
490{
491}
492static inline void ocfs2_init_start_time(struct ocfs2_mask_waiter *mw)
493{
494}
495#endif
496
497static void ocfs2_lock_res_init_common(struct ocfs2_super *osb,
498 struct ocfs2_lock_res *res,
499 enum ocfs2_lock_type type,
500 struct ocfs2_lock_res_ops *ops,
501 void *priv)
502{
503 res->l_type = type;
504 res->l_ops = ops;
505 res->l_priv = priv;
506
507 res->l_level = DLM_LOCK_IV;
508 res->l_requested = DLM_LOCK_IV;
509 res->l_blocking = DLM_LOCK_IV;
510 res->l_action = OCFS2_AST_INVALID;
511 res->l_unlock_action = OCFS2_UNLOCK_INVALID;
512
513 res->l_flags = OCFS2_LOCK_INITIALIZED;
514
515 ocfs2_add_lockres_tracking(res, osb->osb_dlm_debug);
516
517 ocfs2_init_lock_stats(res);
518#ifdef CONFIG_DEBUG_LOCK_ALLOC
519 if (type != OCFS2_LOCK_TYPE_OPEN)
520 lockdep_init_map(&res->l_lockdep_map, ocfs2_lock_type_strings[type],
521 &lockdep_keys[type], 0);
522 else
523 res->l_lockdep_map.key = NULL;
524#endif
525}
526
527void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res)
528{
529
530 memset(res, 0, sizeof(struct ocfs2_lock_res));
531 spin_lock_init(&res->l_lock);
532 init_waitqueue_head(&res->l_event);
533 INIT_LIST_HEAD(&res->l_blocked_list);
534 INIT_LIST_HEAD(&res->l_mask_waiters);
535}
536
537void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
538 enum ocfs2_lock_type type,
539 unsigned int generation,
540 struct inode *inode)
541{
542 struct ocfs2_lock_res_ops *ops;
543
544 switch(type) {
545 case OCFS2_LOCK_TYPE_RW:
546 ops = &ocfs2_inode_rw_lops;
547 break;
548 case OCFS2_LOCK_TYPE_META:
549 ops = &ocfs2_inode_inode_lops;
550 break;
551 case OCFS2_LOCK_TYPE_OPEN:
552 ops = &ocfs2_inode_open_lops;
553 break;
554 default:
555 mlog_bug_on_msg(1, "type: %d\n", type);
556 ops = NULL;
557 break;
558 };
559
560 ocfs2_build_lock_name(type, OCFS2_I(inode)->ip_blkno,
561 generation, res->l_name);
562 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), res, type, ops, inode);
563}
564
565static struct ocfs2_super *ocfs2_get_inode_osb(struct ocfs2_lock_res *lockres)
566{
567 struct inode *inode = ocfs2_lock_res_inode(lockres);
568
569 return OCFS2_SB(inode->i_sb);
570}
571
572static struct ocfs2_super *ocfs2_get_qinfo_osb(struct ocfs2_lock_res *lockres)
573{
574 struct ocfs2_mem_dqinfo *info = lockres->l_priv;
575
576 return OCFS2_SB(info->dqi_gi.dqi_sb);
577}
578
579static struct ocfs2_super *ocfs2_get_file_osb(struct ocfs2_lock_res *lockres)
580{
581 struct ocfs2_file_private *fp = lockres->l_priv;
582
583 return OCFS2_SB(fp->fp_file->f_mapping->host->i_sb);
584}
585
586static __u64 ocfs2_get_dentry_lock_ino(struct ocfs2_lock_res *lockres)
587{
588 __be64 inode_blkno_be;
589
590 memcpy(&inode_blkno_be, &lockres->l_name[OCFS2_DENTRY_LOCK_INO_START],
591 sizeof(__be64));
592
593 return be64_to_cpu(inode_blkno_be);
594}
595
596static struct ocfs2_super *ocfs2_get_dentry_osb(struct ocfs2_lock_res *lockres)
597{
598 struct ocfs2_dentry_lock *dl = lockres->l_priv;
599
600 return OCFS2_SB(dl->dl_inode->i_sb);
601}
602
603void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
604 u64 parent, struct inode *inode)
605{
606 int len;
607 u64 inode_blkno = OCFS2_I(inode)->ip_blkno;
608 __be64 inode_blkno_be = cpu_to_be64(inode_blkno);
609 struct ocfs2_lock_res *lockres = &dl->dl_lockres;
610
611 ocfs2_lock_res_init_once(lockres);
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628 len = snprintf(lockres->l_name, OCFS2_DENTRY_LOCK_INO_START,
629 "%c%016llx",
630 ocfs2_lock_type_char(OCFS2_LOCK_TYPE_DENTRY),
631 (long long)parent);
632
633 BUG_ON(len != (OCFS2_DENTRY_LOCK_INO_START - 1));
634
635 memcpy(&lockres->l_name[OCFS2_DENTRY_LOCK_INO_START], &inode_blkno_be,
636 sizeof(__be64));
637
638 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), lockres,
639 OCFS2_LOCK_TYPE_DENTRY, &ocfs2_dentry_lops,
640 dl);
641}
642
643static void ocfs2_super_lock_res_init(struct ocfs2_lock_res *res,
644 struct ocfs2_super *osb)
645{
646
647
648 ocfs2_lock_res_init_once(res);
649 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_SUPER, OCFS2_SUPER_BLOCK_BLKNO,
650 0, res->l_name);
651 ocfs2_lock_res_init_common(osb, res, OCFS2_LOCK_TYPE_SUPER,
652 &ocfs2_super_lops, osb);
653}
654
655static void ocfs2_rename_lock_res_init(struct ocfs2_lock_res *res,
656 struct ocfs2_super *osb)
657{
658
659
660 ocfs2_lock_res_init_once(res);
661 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_RENAME, 0, 0, res->l_name);
662 ocfs2_lock_res_init_common(osb, res, OCFS2_LOCK_TYPE_RENAME,
663 &ocfs2_rename_lops, osb);
664}
665
666static void ocfs2_nfs_sync_lock_res_init(struct ocfs2_lock_res *res,
667 struct ocfs2_super *osb)
668{
669
670
671 ocfs2_lock_res_init_once(res);
672 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_NFS_SYNC, 0, 0, res->l_name);
673 ocfs2_lock_res_init_common(osb, res, OCFS2_LOCK_TYPE_NFS_SYNC,
674 &ocfs2_nfs_sync_lops, osb);
675}
676
677static void ocfs2_orphan_scan_lock_res_init(struct ocfs2_lock_res *res,
678 struct ocfs2_super *osb)
679{
680 ocfs2_lock_res_init_once(res);
681 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_ORPHAN_SCAN, 0, 0, res->l_name);
682 ocfs2_lock_res_init_common(osb, res, OCFS2_LOCK_TYPE_ORPHAN_SCAN,
683 &ocfs2_orphan_scan_lops, osb);
684}
685
686void ocfs2_file_lock_res_init(struct ocfs2_lock_res *lockres,
687 struct ocfs2_file_private *fp)
688{
689 struct inode *inode = fp->fp_file->f_mapping->host;
690 struct ocfs2_inode_info *oi = OCFS2_I(inode);
691
692 ocfs2_lock_res_init_once(lockres);
693 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_FLOCK, oi->ip_blkno,
694 inode->i_generation, lockres->l_name);
695 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), lockres,
696 OCFS2_LOCK_TYPE_FLOCK, &ocfs2_flock_lops,
697 fp);
698 lockres->l_flags |= OCFS2_LOCK_NOCACHE;
699}
700
701void ocfs2_qinfo_lock_res_init(struct ocfs2_lock_res *lockres,
702 struct ocfs2_mem_dqinfo *info)
703{
704 ocfs2_lock_res_init_once(lockres);
705 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_QINFO, info->dqi_gi.dqi_type,
706 0, lockres->l_name);
707 ocfs2_lock_res_init_common(OCFS2_SB(info->dqi_gi.dqi_sb), lockres,
708 OCFS2_LOCK_TYPE_QINFO, &ocfs2_qinfo_lops,
709 info);
710}
711
712void ocfs2_refcount_lock_res_init(struct ocfs2_lock_res *lockres,
713 struct ocfs2_super *osb, u64 ref_blkno,
714 unsigned int generation)
715{
716 ocfs2_lock_res_init_once(lockres);
717 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_REFCOUNT, ref_blkno,
718 generation, lockres->l_name);
719 ocfs2_lock_res_init_common(osb, lockres, OCFS2_LOCK_TYPE_REFCOUNT,
720 &ocfs2_refcount_block_lops, osb);
721}
722
723void ocfs2_lock_res_free(struct ocfs2_lock_res *res)
724{
725 if (!(res->l_flags & OCFS2_LOCK_INITIALIZED))
726 return;
727
728 ocfs2_remove_lockres_tracking(res);
729
730 mlog_bug_on_msg(!list_empty(&res->l_blocked_list),
731 "Lockres %s is on the blocked list\n",
732 res->l_name);
733 mlog_bug_on_msg(!list_empty(&res->l_mask_waiters),
734 "Lockres %s has mask waiters pending\n",
735 res->l_name);
736 mlog_bug_on_msg(spin_is_locked(&res->l_lock),
737 "Lockres %s is locked\n",
738 res->l_name);
739 mlog_bug_on_msg(res->l_ro_holders,
740 "Lockres %s has %u ro holders\n",
741 res->l_name, res->l_ro_holders);
742 mlog_bug_on_msg(res->l_ex_holders,
743 "Lockres %s has %u ex holders\n",
744 res->l_name, res->l_ex_holders);
745
746
747 memset(&res->l_lksb, 0, sizeof(res->l_lksb));
748
749 res->l_flags = 0UL;
750}
751
752static inline void ocfs2_inc_holders(struct ocfs2_lock_res *lockres,
753 int level)
754{
755 BUG_ON(!lockres);
756
757 switch(level) {
758 case DLM_LOCK_EX:
759 lockres->l_ex_holders++;
760 break;
761 case DLM_LOCK_PR:
762 lockres->l_ro_holders++;
763 break;
764 default:
765 BUG();
766 }
767}
768
769static inline void ocfs2_dec_holders(struct ocfs2_lock_res *lockres,
770 int level)
771{
772 BUG_ON(!lockres);
773
774 switch(level) {
775 case DLM_LOCK_EX:
776 BUG_ON(!lockres->l_ex_holders);
777 lockres->l_ex_holders--;
778 break;
779 case DLM_LOCK_PR:
780 BUG_ON(!lockres->l_ro_holders);
781 lockres->l_ro_holders--;
782 break;
783 default:
784 BUG();
785 }
786}
787
788
789
790
791static inline int ocfs2_highest_compat_lock_level(int level)
792{
793 int new_level = DLM_LOCK_EX;
794
795 if (level == DLM_LOCK_EX)
796 new_level = DLM_LOCK_NL;
797 else if (level == DLM_LOCK_PR)
798 new_level = DLM_LOCK_PR;
799 return new_level;
800}
801
802static void lockres_set_flags(struct ocfs2_lock_res *lockres,
803 unsigned long newflags)
804{
805 struct ocfs2_mask_waiter *mw, *tmp;
806
807 assert_spin_locked(&lockres->l_lock);
808
809 lockres->l_flags = newflags;
810
811 list_for_each_entry_safe(mw, tmp, &lockres->l_mask_waiters, mw_item) {
812 if ((lockres->l_flags & mw->mw_mask) != mw->mw_goal)
813 continue;
814
815 list_del_init(&mw->mw_item);
816 mw->mw_status = 0;
817 complete(&mw->mw_complete);
818 }
819}
820static void lockres_or_flags(struct ocfs2_lock_res *lockres, unsigned long or)
821{
822 lockres_set_flags(lockres, lockres->l_flags | or);
823}
824static void lockres_clear_flags(struct ocfs2_lock_res *lockres,
825 unsigned long clear)
826{
827 lockres_set_flags(lockres, lockres->l_flags & ~clear);
828}
829
830static inline void ocfs2_generic_handle_downconvert_action(struct ocfs2_lock_res *lockres)
831{
832 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY));
833 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_ATTACHED));
834 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BLOCKED));
835 BUG_ON(lockres->l_blocking <= DLM_LOCK_NL);
836
837 lockres->l_level = lockres->l_requested;
838 if (lockres->l_level <=
839 ocfs2_highest_compat_lock_level(lockres->l_blocking)) {
840 lockres->l_blocking = DLM_LOCK_NL;
841 lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED);
842 }
843 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
844}
845
846static inline void ocfs2_generic_handle_convert_action(struct ocfs2_lock_res *lockres)
847{
848 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY));
849 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_ATTACHED));
850
851
852
853
854
855 if (lockres->l_level == DLM_LOCK_NL &&
856 lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
857 lockres_or_flags(lockres, OCFS2_LOCK_NEEDS_REFRESH);
858
859 lockres->l_level = lockres->l_requested;
860
861
862
863
864
865
866
867
868 if (!(lockres->l_flags & OCFS2_LOCK_NONBLOCK_FINISHED))
869 lockres_or_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING);
870 else
871 lockres_clear_flags(lockres, OCFS2_LOCK_NONBLOCK_FINISHED);
872
873 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
874}
875
876static inline void ocfs2_generic_handle_attach_action(struct ocfs2_lock_res *lockres)
877{
878 BUG_ON((!(lockres->l_flags & OCFS2_LOCK_BUSY)));
879 BUG_ON(lockres->l_flags & OCFS2_LOCK_ATTACHED);
880
881 if (lockres->l_requested > DLM_LOCK_NL &&
882 !(lockres->l_flags & OCFS2_LOCK_LOCAL) &&
883 lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
884 lockres_or_flags(lockres, OCFS2_LOCK_NEEDS_REFRESH);
885
886 lockres->l_level = lockres->l_requested;
887 lockres_or_flags(lockres, OCFS2_LOCK_ATTACHED);
888 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
889}
890
891static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres,
892 int level)
893{
894 int needs_downconvert = 0;
895
896 assert_spin_locked(&lockres->l_lock);
897
898 if (level > lockres->l_blocking) {
899
900
901
902
903 if (ocfs2_highest_compat_lock_level(level) <
904 ocfs2_highest_compat_lock_level(lockres->l_blocking))
905 needs_downconvert = 1;
906
907 lockres->l_blocking = level;
908 }
909
910 mlog(ML_BASTS, "lockres %s, block %d, level %d, l_block %d, dwn %d\n",
911 lockres->l_name, level, lockres->l_level, lockres->l_blocking,
912 needs_downconvert);
913
914 if (needs_downconvert)
915 lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED);
916 mlog(0, "needs_downconvert = %d\n", needs_downconvert);
917 return needs_downconvert;
918}
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979static void __lockres_clear_pending(struct ocfs2_lock_res *lockres,
980 unsigned int generation,
981 struct ocfs2_super *osb)
982{
983 assert_spin_locked(&lockres->l_lock);
984
985
986
987
988
989 if (!(lockres->l_flags & OCFS2_LOCK_PENDING) ||
990 (lockres->l_pending_gen != generation))
991 return;
992
993 lockres_clear_flags(lockres, OCFS2_LOCK_PENDING);
994 lockres->l_pending_gen++;
995
996
997
998
999
1000 if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
1001 ocfs2_wake_downconvert_thread(osb);
1002}
1003
1004
1005static void lockres_clear_pending(struct ocfs2_lock_res *lockres,
1006 unsigned int generation,
1007 struct ocfs2_super *osb)
1008{
1009 unsigned long flags;
1010
1011 spin_lock_irqsave(&lockres->l_lock, flags);
1012 __lockres_clear_pending(lockres, generation, osb);
1013 spin_unlock_irqrestore(&lockres->l_lock, flags);
1014}
1015
1016static unsigned int lockres_set_pending(struct ocfs2_lock_res *lockres)
1017{
1018 assert_spin_locked(&lockres->l_lock);
1019 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY));
1020
1021 lockres_or_flags(lockres, OCFS2_LOCK_PENDING);
1022
1023 return lockres->l_pending_gen;
1024}
1025
1026static void ocfs2_blocking_ast(struct ocfs2_dlm_lksb *lksb, int level)
1027{
1028 struct ocfs2_lock_res *lockres = ocfs2_lksb_to_lock_res(lksb);
1029 struct ocfs2_super *osb = ocfs2_get_lockres_osb(lockres);
1030 int needs_downconvert;
1031 unsigned long flags;
1032
1033 BUG_ON(level <= DLM_LOCK_NL);
1034
1035 mlog(ML_BASTS, "BAST fired for lockres %s, blocking %d, level %d, "
1036 "type %s\n", lockres->l_name, level, lockres->l_level,
1037 ocfs2_lock_type_string(lockres->l_type));
1038
1039
1040
1041
1042
1043 if (lockres->l_flags & OCFS2_LOCK_NOCACHE)
1044 return;
1045
1046 spin_lock_irqsave(&lockres->l_lock, flags);
1047 needs_downconvert = ocfs2_generic_handle_bast(lockres, level);
1048 if (needs_downconvert)
1049 ocfs2_schedule_blocked_lock(osb, lockres);
1050 spin_unlock_irqrestore(&lockres->l_lock, flags);
1051
1052 wake_up(&lockres->l_event);
1053
1054 ocfs2_wake_downconvert_thread(osb);
1055}
1056
1057static void ocfs2_locking_ast(struct ocfs2_dlm_lksb *lksb)
1058{
1059 struct ocfs2_lock_res *lockres = ocfs2_lksb_to_lock_res(lksb);
1060 struct ocfs2_super *osb = ocfs2_get_lockres_osb(lockres);
1061 unsigned long flags;
1062 int status;
1063
1064 spin_lock_irqsave(&lockres->l_lock, flags);
1065
1066 status = ocfs2_dlm_lock_status(&lockres->l_lksb);
1067
1068 if (status == -EAGAIN) {
1069 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
1070 goto out;
1071 }
1072
1073 if (status) {
1074 mlog(ML_ERROR, "lockres %s: lksb status value of %d!\n",
1075 lockres->l_name, status);
1076 spin_unlock_irqrestore(&lockres->l_lock, flags);
1077 return;
1078 }
1079
1080 mlog(ML_BASTS, "AST fired for lockres %s, action %d, unlock %d, "
1081 "level %d => %d\n", lockres->l_name, lockres->l_action,
1082 lockres->l_unlock_action, lockres->l_level, lockres->l_requested);
1083
1084 switch(lockres->l_action) {
1085 case OCFS2_AST_ATTACH:
1086 ocfs2_generic_handle_attach_action(lockres);
1087 lockres_clear_flags(lockres, OCFS2_LOCK_LOCAL);
1088 break;
1089 case OCFS2_AST_CONVERT:
1090 ocfs2_generic_handle_convert_action(lockres);
1091 break;
1092 case OCFS2_AST_DOWNCONVERT:
1093 ocfs2_generic_handle_downconvert_action(lockres);
1094 break;
1095 default:
1096 mlog(ML_ERROR, "lockres %s: AST fired with invalid action: %u, "
1097 "flags 0x%lx, unlock: %u\n",
1098 lockres->l_name, lockres->l_action, lockres->l_flags,
1099 lockres->l_unlock_action);
1100 BUG();
1101 }
1102out:
1103
1104
1105 lockres->l_action = OCFS2_AST_INVALID;
1106
1107
1108 if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT)
1109 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID;
1110
1111
1112
1113
1114
1115
1116
1117 __lockres_clear_pending(lockres, lockres->l_pending_gen, osb);
1118
1119 wake_up(&lockres->l_event);
1120 spin_unlock_irqrestore(&lockres->l_lock, flags);
1121}
1122
1123static void ocfs2_unlock_ast(struct ocfs2_dlm_lksb *lksb, int error)
1124{
1125 struct ocfs2_lock_res *lockres = ocfs2_lksb_to_lock_res(lksb);
1126 unsigned long flags;
1127
1128 mlog(ML_BASTS, "UNLOCK AST fired for lockres %s, action = %d\n",
1129 lockres->l_name, lockres->l_unlock_action);
1130
1131 spin_lock_irqsave(&lockres->l_lock, flags);
1132 if (error) {
1133 mlog(ML_ERROR, "Dlm passes error %d for lock %s, "
1134 "unlock_action %d\n", error, lockres->l_name,
1135 lockres->l_unlock_action);
1136 spin_unlock_irqrestore(&lockres->l_lock, flags);
1137 return;
1138 }
1139
1140 switch(lockres->l_unlock_action) {
1141 case OCFS2_UNLOCK_CANCEL_CONVERT:
1142 mlog(0, "Cancel convert success for %s\n", lockres->l_name);
1143 lockres->l_action = OCFS2_AST_INVALID;
1144
1145
1146 if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
1147 ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
1148 break;
1149 case OCFS2_UNLOCK_DROP_LOCK:
1150 lockres->l_level = DLM_LOCK_IV;
1151 break;
1152 default:
1153 BUG();
1154 }
1155
1156 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
1157 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID;
1158 wake_up(&lockres->l_event);
1159 spin_unlock_irqrestore(&lockres->l_lock, flags);
1160}
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185static struct ocfs2_locking_protocol lproto = {
1186 .lp_max_version = {
1187 .pv_major = OCFS2_LOCKING_PROTOCOL_MAJOR,
1188 .pv_minor = OCFS2_LOCKING_PROTOCOL_MINOR,
1189 },
1190 .lp_lock_ast = ocfs2_locking_ast,
1191 .lp_blocking_ast = ocfs2_blocking_ast,
1192 .lp_unlock_ast = ocfs2_unlock_ast,
1193};
1194
1195void ocfs2_set_locking_protocol(void)
1196{
1197 ocfs2_stack_glue_set_max_proto_version(&lproto.lp_max_version);
1198}
1199
1200static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres,
1201 int convert)
1202{
1203 unsigned long flags;
1204
1205 spin_lock_irqsave(&lockres->l_lock, flags);
1206 lockres_clear_flags(lockres, OCFS2_LOCK_BUSY);
1207 lockres_clear_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING);
1208 if (convert)
1209 lockres->l_action = OCFS2_AST_INVALID;
1210 else
1211 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID;
1212 spin_unlock_irqrestore(&lockres->l_lock, flags);
1213
1214 wake_up(&lockres->l_event);
1215}
1216
1217
1218
1219
1220
1221static int ocfs2_lock_create(struct ocfs2_super *osb,
1222 struct ocfs2_lock_res *lockres,
1223 int level,
1224 u32 dlm_flags)
1225{
1226 int ret = 0;
1227 unsigned long flags;
1228 unsigned int gen;
1229
1230 mlog(0, "lock %s, level = %d, flags = %u\n", lockres->l_name, level,
1231 dlm_flags);
1232
1233 spin_lock_irqsave(&lockres->l_lock, flags);
1234 if ((lockres->l_flags & OCFS2_LOCK_ATTACHED) ||
1235 (lockres->l_flags & OCFS2_LOCK_BUSY)) {
1236 spin_unlock_irqrestore(&lockres->l_lock, flags);
1237 goto bail;
1238 }
1239
1240 lockres->l_action = OCFS2_AST_ATTACH;
1241 lockres->l_requested = level;
1242 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
1243 gen = lockres_set_pending(lockres);
1244 spin_unlock_irqrestore(&lockres->l_lock, flags);
1245
1246 ret = ocfs2_dlm_lock(osb->cconn,
1247 level,
1248 &lockres->l_lksb,
1249 dlm_flags,
1250 lockres->l_name,
1251 OCFS2_LOCK_ID_MAX_LEN - 1);
1252 lockres_clear_pending(lockres, gen, osb);
1253 if (ret) {
1254 ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres);
1255 ocfs2_recover_from_dlm_error(lockres, 1);
1256 }
1257
1258 mlog(0, "lock %s, return from ocfs2_dlm_lock\n", lockres->l_name);
1259
1260bail:
1261 return ret;
1262}
1263
1264static inline int ocfs2_check_wait_flag(struct ocfs2_lock_res *lockres,
1265 int flag)
1266{
1267 unsigned long flags;
1268 int ret;
1269
1270 spin_lock_irqsave(&lockres->l_lock, flags);
1271 ret = lockres->l_flags & flag;
1272 spin_unlock_irqrestore(&lockres->l_lock, flags);
1273
1274 return ret;
1275}
1276
1277static inline void ocfs2_wait_on_busy_lock(struct ocfs2_lock_res *lockres)
1278
1279{
1280 wait_event(lockres->l_event,
1281 !ocfs2_check_wait_flag(lockres, OCFS2_LOCK_BUSY));
1282}
1283
1284static inline void ocfs2_wait_on_refreshing_lock(struct ocfs2_lock_res *lockres)
1285
1286{
1287 wait_event(lockres->l_event,
1288 !ocfs2_check_wait_flag(lockres, OCFS2_LOCK_REFRESHING));
1289}
1290
1291
1292
1293
1294static inline int ocfs2_may_continue_on_blocked_lock(struct ocfs2_lock_res *lockres,
1295 int wanted)
1296{
1297 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BLOCKED));
1298
1299 return wanted <= ocfs2_highest_compat_lock_level(lockres->l_blocking);
1300}
1301
1302static void ocfs2_init_mask_waiter(struct ocfs2_mask_waiter *mw)
1303{
1304 INIT_LIST_HEAD(&mw->mw_item);
1305 init_completion(&mw->mw_complete);
1306 ocfs2_init_start_time(mw);
1307}
1308
1309static int ocfs2_wait_for_mask(struct ocfs2_mask_waiter *mw)
1310{
1311 wait_for_completion(&mw->mw_complete);
1312
1313 reinit_completion(&mw->mw_complete);
1314 return mw->mw_status;
1315}
1316
1317static void lockres_add_mask_waiter(struct ocfs2_lock_res *lockres,
1318 struct ocfs2_mask_waiter *mw,
1319 unsigned long mask,
1320 unsigned long goal)
1321{
1322 BUG_ON(!list_empty(&mw->mw_item));
1323
1324 assert_spin_locked(&lockres->l_lock);
1325
1326 list_add_tail(&mw->mw_item, &lockres->l_mask_waiters);
1327 mw->mw_mask = mask;
1328 mw->mw_goal = goal;
1329}
1330
1331
1332
1333static int __lockres_remove_mask_waiter(struct ocfs2_lock_res *lockres,
1334 struct ocfs2_mask_waiter *mw)
1335{
1336 int ret = 0;
1337
1338 assert_spin_locked(&lockres->l_lock);
1339 if (!list_empty(&mw->mw_item)) {
1340 if ((lockres->l_flags & mw->mw_mask) != mw->mw_goal)
1341 ret = -EBUSY;
1342
1343 list_del_init(&mw->mw_item);
1344 init_completion(&mw->mw_complete);
1345 }
1346
1347 return ret;
1348}
1349
1350static int lockres_remove_mask_waiter(struct ocfs2_lock_res *lockres,
1351 struct ocfs2_mask_waiter *mw)
1352{
1353 unsigned long flags;
1354 int ret = 0;
1355
1356 spin_lock_irqsave(&lockres->l_lock, flags);
1357 ret = __lockres_remove_mask_waiter(lockres, mw);
1358 spin_unlock_irqrestore(&lockres->l_lock, flags);
1359
1360 return ret;
1361
1362}
1363
1364static int ocfs2_wait_for_mask_interruptible(struct ocfs2_mask_waiter *mw,
1365 struct ocfs2_lock_res *lockres)
1366{
1367 int ret;
1368
1369 ret = wait_for_completion_interruptible(&mw->mw_complete);
1370 if (ret)
1371 lockres_remove_mask_waiter(lockres, mw);
1372 else
1373 ret = mw->mw_status;
1374
1375 reinit_completion(&mw->mw_complete);
1376 return ret;
1377}
1378
1379static int __ocfs2_cluster_lock(struct ocfs2_super *osb,
1380 struct ocfs2_lock_res *lockres,
1381 int level,
1382 u32 lkm_flags,
1383 int arg_flags,
1384 int l_subclass,
1385 unsigned long caller_ip)
1386{
1387 struct ocfs2_mask_waiter mw;
1388 int wait, catch_signals = !(osb->s_mount_opt & OCFS2_MOUNT_NOINTR);
1389 int ret = 0;
1390 unsigned long flags;
1391 unsigned int gen;
1392 int noqueue_attempted = 0;
1393 int dlm_locked = 0;
1394 int kick_dc = 0;
1395
1396 if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED)) {
1397 mlog_errno(-EINVAL);
1398 return -EINVAL;
1399 }
1400
1401 ocfs2_init_mask_waiter(&mw);
1402
1403 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
1404 lkm_flags |= DLM_LKF_VALBLK;
1405
1406again:
1407 wait = 0;
1408
1409 spin_lock_irqsave(&lockres->l_lock, flags);
1410
1411 if (catch_signals && signal_pending(current)) {
1412 ret = -ERESTARTSYS;
1413 goto unlock;
1414 }
1415
1416 mlog_bug_on_msg(lockres->l_flags & OCFS2_LOCK_FREEING,
1417 "Cluster lock called on freeing lockres %s! flags "
1418 "0x%lx\n", lockres->l_name, lockres->l_flags);
1419
1420
1421
1422
1423 if (lockres->l_flags & OCFS2_LOCK_BUSY &&
1424 level > lockres->l_level) {
1425
1426
1427 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
1428 wait = 1;
1429 goto unlock;
1430 }
1431
1432 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) {
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447 if (level <= lockres->l_level)
1448 goto update_holders;
1449 }
1450
1451 if (lockres->l_flags & OCFS2_LOCK_BLOCKED &&
1452 !ocfs2_may_continue_on_blocked_lock(lockres, level)) {
1453
1454
1455 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BLOCKED, 0);
1456 wait = 1;
1457 goto unlock;
1458 }
1459
1460 if (level > lockres->l_level) {
1461 if (noqueue_attempted > 0) {
1462 ret = -EAGAIN;
1463 goto unlock;
1464 }
1465 if (lkm_flags & DLM_LKF_NOQUEUE)
1466 noqueue_attempted = 1;
1467
1468 if (lockres->l_action != OCFS2_AST_INVALID)
1469 mlog(ML_ERROR, "lockres %s has action %u pending\n",
1470 lockres->l_name, lockres->l_action);
1471
1472 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
1473 lockres->l_action = OCFS2_AST_ATTACH;
1474 lkm_flags &= ~DLM_LKF_CONVERT;
1475 } else {
1476 lockres->l_action = OCFS2_AST_CONVERT;
1477 lkm_flags |= DLM_LKF_CONVERT;
1478 }
1479
1480 lockres->l_requested = level;
1481 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
1482 gen = lockres_set_pending(lockres);
1483 spin_unlock_irqrestore(&lockres->l_lock, flags);
1484
1485 BUG_ON(level == DLM_LOCK_IV);
1486 BUG_ON(level == DLM_LOCK_NL);
1487
1488 mlog(ML_BASTS, "lockres %s, convert from %d to %d\n",
1489 lockres->l_name, lockres->l_level, level);
1490
1491
1492 ret = ocfs2_dlm_lock(osb->cconn,
1493 level,
1494 &lockres->l_lksb,
1495 lkm_flags,
1496 lockres->l_name,
1497 OCFS2_LOCK_ID_MAX_LEN - 1);
1498 lockres_clear_pending(lockres, gen, osb);
1499 if (ret) {
1500 if (!(lkm_flags & DLM_LKF_NOQUEUE) ||
1501 (ret != -EAGAIN)) {
1502 ocfs2_log_dlm_error("ocfs2_dlm_lock",
1503 ret, lockres);
1504 }
1505 ocfs2_recover_from_dlm_error(lockres, 1);
1506 goto out;
1507 }
1508 dlm_locked = 1;
1509
1510 mlog(0, "lock %s, successful return from ocfs2_dlm_lock\n",
1511 lockres->l_name);
1512
1513
1514
1515 catch_signals = 0;
1516
1517
1518 goto again;
1519 }
1520
1521update_holders:
1522
1523 ocfs2_inc_holders(lockres, level);
1524
1525 ret = 0;
1526unlock:
1527 lockres_clear_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING);
1528
1529
1530 kick_dc = (lockres->l_flags & OCFS2_LOCK_BLOCKED);
1531
1532 spin_unlock_irqrestore(&lockres->l_lock, flags);
1533 if (kick_dc)
1534 ocfs2_wake_downconvert_thread(osb);
1535out:
1536
1537
1538
1539
1540
1541
1542
1543
1544 if (wait && arg_flags & OCFS2_LOCK_NONBLOCK &&
1545 mw.mw_mask & (OCFS2_LOCK_BUSY|OCFS2_LOCK_BLOCKED)) {
1546 wait = 0;
1547 spin_lock_irqsave(&lockres->l_lock, flags);
1548 if (__lockres_remove_mask_waiter(lockres, &mw)) {
1549 if (dlm_locked)
1550 lockres_or_flags(lockres,
1551 OCFS2_LOCK_NONBLOCK_FINISHED);
1552 spin_unlock_irqrestore(&lockres->l_lock, flags);
1553 ret = -EAGAIN;
1554 } else {
1555 spin_unlock_irqrestore(&lockres->l_lock, flags);
1556 goto again;
1557 }
1558 }
1559 if (wait) {
1560 ret = ocfs2_wait_for_mask(&mw);
1561 if (ret == 0)
1562 goto again;
1563 mlog_errno(ret);
1564 }
1565 ocfs2_update_lock_stats(lockres, level, &mw, ret);
1566
1567#ifdef CONFIG_DEBUG_LOCK_ALLOC
1568 if (!ret && lockres->l_lockdep_map.key != NULL) {
1569 if (level == DLM_LOCK_PR)
1570 rwsem_acquire_read(&lockres->l_lockdep_map, l_subclass,
1571 !!(arg_flags & OCFS2_META_LOCK_NOQUEUE),
1572 caller_ip);
1573 else
1574 rwsem_acquire(&lockres->l_lockdep_map, l_subclass,
1575 !!(arg_flags & OCFS2_META_LOCK_NOQUEUE),
1576 caller_ip);
1577 }
1578#endif
1579 return ret;
1580}
1581
1582static inline int ocfs2_cluster_lock(struct ocfs2_super *osb,
1583 struct ocfs2_lock_res *lockres,
1584 int level,
1585 u32 lkm_flags,
1586 int arg_flags)
1587{
1588 return __ocfs2_cluster_lock(osb, lockres, level, lkm_flags, arg_flags,
1589 0, _RET_IP_);
1590}
1591
1592
1593static void __ocfs2_cluster_unlock(struct ocfs2_super *osb,
1594 struct ocfs2_lock_res *lockres,
1595 int level,
1596 unsigned long caller_ip)
1597{
1598 unsigned long flags;
1599
1600 spin_lock_irqsave(&lockres->l_lock, flags);
1601 ocfs2_dec_holders(lockres, level);
1602 ocfs2_downconvert_on_unlock(osb, lockres);
1603 spin_unlock_irqrestore(&lockres->l_lock, flags);
1604#ifdef CONFIG_DEBUG_LOCK_ALLOC
1605 if (lockres->l_lockdep_map.key != NULL)
1606 rwsem_release(&lockres->l_lockdep_map, 1, caller_ip);
1607#endif
1608}
1609
1610static int ocfs2_create_new_lock(struct ocfs2_super *osb,
1611 struct ocfs2_lock_res *lockres,
1612 int ex,
1613 int local)
1614{
1615 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
1616 unsigned long flags;
1617 u32 lkm_flags = local ? DLM_LKF_LOCAL : 0;
1618
1619 spin_lock_irqsave(&lockres->l_lock, flags);
1620 BUG_ON(lockres->l_flags & OCFS2_LOCK_ATTACHED);
1621 lockres_or_flags(lockres, OCFS2_LOCK_LOCAL);
1622 spin_unlock_irqrestore(&lockres->l_lock, flags);
1623
1624 return ocfs2_lock_create(osb, lockres, level, lkm_flags);
1625}
1626
1627
1628
1629
1630
1631
1632
1633int ocfs2_create_new_inode_locks(struct inode *inode)
1634{
1635 int ret;
1636 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1637
1638 BUG_ON(!ocfs2_inode_is_new(inode));
1639
1640 mlog(0, "Inode %llu\n", (unsigned long long)OCFS2_I(inode)->ip_blkno);
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_rw_lockres, 1, 1);
1651 if (ret) {
1652 mlog_errno(ret);
1653 goto bail;
1654 }
1655
1656
1657
1658
1659
1660 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_inode_lockres, 1, 0);
1661 if (ret) {
1662 mlog_errno(ret);
1663 goto bail;
1664 }
1665
1666 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_open_lockres, 0, 0);
1667 if (ret)
1668 mlog_errno(ret);
1669
1670bail:
1671 return ret;
1672}
1673
1674int ocfs2_rw_lock(struct inode *inode, int write)
1675{
1676 int status, level;
1677 struct ocfs2_lock_res *lockres;
1678 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1679
1680 mlog(0, "inode %llu take %s RW lock\n",
1681 (unsigned long long)OCFS2_I(inode)->ip_blkno,
1682 write ? "EXMODE" : "PRMODE");
1683
1684 if (ocfs2_mount_local(osb))
1685 return 0;
1686
1687 lockres = &OCFS2_I(inode)->ip_rw_lockres;
1688
1689 level = write ? DLM_LOCK_EX : DLM_LOCK_PR;
1690
1691 status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres, level, 0,
1692 0);
1693 if (status < 0)
1694 mlog_errno(status);
1695
1696 return status;
1697}
1698
1699void ocfs2_rw_unlock(struct inode *inode, int write)
1700{
1701 int level = write ? DLM_LOCK_EX : DLM_LOCK_PR;
1702 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_rw_lockres;
1703 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1704
1705 mlog(0, "inode %llu drop %s RW lock\n",
1706 (unsigned long long)OCFS2_I(inode)->ip_blkno,
1707 write ? "EXMODE" : "PRMODE");
1708
1709 if (!ocfs2_mount_local(osb))
1710 ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
1711}
1712
1713
1714
1715
1716int ocfs2_open_lock(struct inode *inode)
1717{
1718 int status = 0;
1719 struct ocfs2_lock_res *lockres;
1720 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1721
1722 mlog(0, "inode %llu take PRMODE open lock\n",
1723 (unsigned long long)OCFS2_I(inode)->ip_blkno);
1724
1725 if (ocfs2_is_hard_readonly(osb) || ocfs2_mount_local(osb))
1726 goto out;
1727
1728 lockres = &OCFS2_I(inode)->ip_open_lockres;
1729
1730 status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres,
1731 DLM_LOCK_PR, 0, 0);
1732 if (status < 0)
1733 mlog_errno(status);
1734
1735out:
1736 return status;
1737}
1738
1739int ocfs2_try_open_lock(struct inode *inode, int write)
1740{
1741 int status = 0, level;
1742 struct ocfs2_lock_res *lockres;
1743 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1744
1745 mlog(0, "inode %llu try to take %s open lock\n",
1746 (unsigned long long)OCFS2_I(inode)->ip_blkno,
1747 write ? "EXMODE" : "PRMODE");
1748
1749 if (ocfs2_is_hard_readonly(osb)) {
1750 if (write)
1751 status = -EROFS;
1752 goto out;
1753 }
1754
1755 if (ocfs2_mount_local(osb))
1756 goto out;
1757
1758 lockres = &OCFS2_I(inode)->ip_open_lockres;
1759
1760 level = write ? DLM_LOCK_EX : DLM_LOCK_PR;
1761
1762
1763
1764
1765
1766
1767
1768 status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres,
1769 level, DLM_LKF_NOQUEUE, 0);
1770
1771out:
1772 return status;
1773}
1774
1775
1776
1777
1778void ocfs2_open_unlock(struct inode *inode)
1779{
1780 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_open_lockres;
1781 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1782
1783 mlog(0, "inode %llu drop open lock\n",
1784 (unsigned long long)OCFS2_I(inode)->ip_blkno);
1785
1786 if (ocfs2_mount_local(osb))
1787 goto out;
1788
1789 if(lockres->l_ro_holders)
1790 ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres,
1791 DLM_LOCK_PR);
1792 if(lockres->l_ex_holders)
1793 ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres,
1794 DLM_LOCK_EX);
1795
1796out:
1797 return;
1798}
1799
1800static int ocfs2_flock_handle_signal(struct ocfs2_lock_res *lockres,
1801 int level)
1802{
1803 int ret;
1804 struct ocfs2_super *osb = ocfs2_get_lockres_osb(lockres);
1805 unsigned long flags;
1806 struct ocfs2_mask_waiter mw;
1807
1808 ocfs2_init_mask_waiter(&mw);
1809
1810retry_cancel:
1811 spin_lock_irqsave(&lockres->l_lock, flags);
1812 if (lockres->l_flags & OCFS2_LOCK_BUSY) {
1813 ret = ocfs2_prepare_cancel_convert(osb, lockres);
1814 if (ret) {
1815 spin_unlock_irqrestore(&lockres->l_lock, flags);
1816 ret = ocfs2_cancel_convert(osb, lockres);
1817 if (ret < 0) {
1818 mlog_errno(ret);
1819 goto out;
1820 }
1821 goto retry_cancel;
1822 }
1823 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
1824 spin_unlock_irqrestore(&lockres->l_lock, flags);
1825
1826 ocfs2_wait_for_mask(&mw);
1827 goto retry_cancel;
1828 }
1829
1830 ret = -ERESTARTSYS;
1831
1832
1833
1834
1835 if (lockres->l_level == level)
1836 ret = 0;
1837
1838 mlog(0, "Cancel returning %d. flags: 0x%lx, level: %d, act: %d\n", ret,
1839 lockres->l_flags, lockres->l_level, lockres->l_action);
1840
1841 spin_unlock_irqrestore(&lockres->l_lock, flags);
1842
1843out:
1844 return ret;
1845}
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868int ocfs2_file_lock(struct file *file, int ex, int trylock)
1869{
1870 int ret, level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
1871 unsigned int lkm_flags = trylock ? DLM_LKF_NOQUEUE : 0;
1872 unsigned long flags;
1873 struct ocfs2_file_private *fp = file->private_data;
1874 struct ocfs2_lock_res *lockres = &fp->fp_flock;
1875 struct ocfs2_super *osb = OCFS2_SB(file->f_mapping->host->i_sb);
1876 struct ocfs2_mask_waiter mw;
1877
1878 ocfs2_init_mask_waiter(&mw);
1879
1880 if ((lockres->l_flags & OCFS2_LOCK_BUSY) ||
1881 (lockres->l_level > DLM_LOCK_NL)) {
1882 mlog(ML_ERROR,
1883 "File lock \"%s\" has busy or locked state: flags: 0x%lx, "
1884 "level: %u\n", lockres->l_name, lockres->l_flags,
1885 lockres->l_level);
1886 return -EINVAL;
1887 }
1888
1889 spin_lock_irqsave(&lockres->l_lock, flags);
1890 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
1891 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
1892 spin_unlock_irqrestore(&lockres->l_lock, flags);
1893
1894
1895
1896
1897
1898 ret = ocfs2_lock_create(osb, lockres, DLM_LOCK_NL, 0);
1899 if (ret < 0) {
1900 mlog_errno(ret);
1901 goto out;
1902 }
1903
1904 ret = ocfs2_wait_for_mask(&mw);
1905 if (ret) {
1906 mlog_errno(ret);
1907 goto out;
1908 }
1909 spin_lock_irqsave(&lockres->l_lock, flags);
1910 }
1911
1912 lockres->l_action = OCFS2_AST_CONVERT;
1913 lkm_flags |= DLM_LKF_CONVERT;
1914 lockres->l_requested = level;
1915 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
1916
1917 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
1918 spin_unlock_irqrestore(&lockres->l_lock, flags);
1919
1920 ret = ocfs2_dlm_lock(osb->cconn, level, &lockres->l_lksb, lkm_flags,
1921 lockres->l_name, OCFS2_LOCK_ID_MAX_LEN - 1);
1922 if (ret) {
1923 if (!trylock || (ret != -EAGAIN)) {
1924 ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres);
1925 ret = -EINVAL;
1926 }
1927
1928 ocfs2_recover_from_dlm_error(lockres, 1);
1929 lockres_remove_mask_waiter(lockres, &mw);
1930 goto out;
1931 }
1932
1933 ret = ocfs2_wait_for_mask_interruptible(&mw, lockres);
1934 if (ret == -ERESTARTSYS) {
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950 ret = ocfs2_flock_handle_signal(lockres, level);
1951 } else if (!ret && (level > lockres->l_level)) {
1952
1953 BUG_ON(!trylock);
1954 ret = -EAGAIN;
1955 }
1956
1957out:
1958
1959 mlog(0, "Lock: \"%s\" ex: %d, trylock: %d, returns: %d\n",
1960 lockres->l_name, ex, trylock, ret);
1961 return ret;
1962}
1963
1964void ocfs2_file_unlock(struct file *file)
1965{
1966 int ret;
1967 unsigned int gen;
1968 unsigned long flags;
1969 struct ocfs2_file_private *fp = file->private_data;
1970 struct ocfs2_lock_res *lockres = &fp->fp_flock;
1971 struct ocfs2_super *osb = OCFS2_SB(file->f_mapping->host->i_sb);
1972 struct ocfs2_mask_waiter mw;
1973
1974 ocfs2_init_mask_waiter(&mw);
1975
1976 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED))
1977 return;
1978
1979 if (lockres->l_level == DLM_LOCK_NL)
1980 return;
1981
1982 mlog(0, "Unlock: \"%s\" flags: 0x%lx, level: %d, act: %d\n",
1983 lockres->l_name, lockres->l_flags, lockres->l_level,
1984 lockres->l_action);
1985
1986 spin_lock_irqsave(&lockres->l_lock, flags);
1987
1988
1989
1990 lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED);
1991 lockres->l_blocking = DLM_LOCK_EX;
1992
1993 gen = ocfs2_prepare_downconvert(lockres, DLM_LOCK_NL);
1994 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
1995 spin_unlock_irqrestore(&lockres->l_lock, flags);
1996
1997 ret = ocfs2_downconvert_lock(osb, lockres, DLM_LOCK_NL, 0, gen);
1998 if (ret) {
1999 mlog_errno(ret);
2000 return;
2001 }
2002
2003 ret = ocfs2_wait_for_mask(&mw);
2004 if (ret)
2005 mlog_errno(ret);
2006}
2007
2008static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
2009 struct ocfs2_lock_res *lockres)
2010{
2011 int kick = 0;
2012
2013
2014
2015
2016 if (lockres->l_flags & OCFS2_LOCK_BLOCKED) {
2017 switch(lockres->l_blocking) {
2018 case DLM_LOCK_EX:
2019 if (!lockres->l_ex_holders && !lockres->l_ro_holders)
2020 kick = 1;
2021 break;
2022 case DLM_LOCK_PR:
2023 if (!lockres->l_ex_holders)
2024 kick = 1;
2025 break;
2026 default:
2027 BUG();
2028 }
2029 }
2030
2031 if (kick)
2032 ocfs2_wake_downconvert_thread(osb);
2033}
2034
2035#define OCFS2_SEC_BITS 34
2036#define OCFS2_SEC_SHIFT (64 - 34)
2037#define OCFS2_NSEC_MASK ((1ULL << OCFS2_SEC_SHIFT) - 1)
2038
2039
2040
2041static u64 ocfs2_pack_timespec(struct timespec *spec)
2042{
2043 u64 res;
2044 u64 sec = spec->tv_sec;
2045 u32 nsec = spec->tv_nsec;
2046
2047 res = (sec << OCFS2_SEC_SHIFT) | (nsec & OCFS2_NSEC_MASK);
2048
2049 return res;
2050}
2051
2052
2053
2054
2055static void __ocfs2_stuff_meta_lvb(struct inode *inode)
2056{
2057 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2058 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres;
2059 struct ocfs2_meta_lvb *lvb;
2060
2061 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2062
2063
2064
2065
2066
2067
2068 if (oi->ip_flags & OCFS2_INODE_DELETED) {
2069 lvb->lvb_version = 0;
2070 goto out;
2071 }
2072
2073 lvb->lvb_version = OCFS2_LVB_VERSION;
2074 lvb->lvb_isize = cpu_to_be64(i_size_read(inode));
2075 lvb->lvb_iclusters = cpu_to_be32(oi->ip_clusters);
2076 lvb->lvb_iuid = cpu_to_be32(i_uid_read(inode));
2077 lvb->lvb_igid = cpu_to_be32(i_gid_read(inode));
2078 lvb->lvb_imode = cpu_to_be16(inode->i_mode);
2079 lvb->lvb_inlink = cpu_to_be16(inode->i_nlink);
2080 lvb->lvb_iatime_packed =
2081 cpu_to_be64(ocfs2_pack_timespec(&inode->i_atime));
2082 lvb->lvb_ictime_packed =
2083 cpu_to_be64(ocfs2_pack_timespec(&inode->i_ctime));
2084 lvb->lvb_imtime_packed =
2085 cpu_to_be64(ocfs2_pack_timespec(&inode->i_mtime));
2086 lvb->lvb_iattr = cpu_to_be32(oi->ip_attr);
2087 lvb->lvb_idynfeatures = cpu_to_be16(oi->ip_dyn_features);
2088 lvb->lvb_igeneration = cpu_to_be32(inode->i_generation);
2089
2090out:
2091 mlog_meta_lvb(0, lockres);
2092}
2093
2094static void ocfs2_unpack_timespec(struct timespec *spec,
2095 u64 packed_time)
2096{
2097 spec->tv_sec = packed_time >> OCFS2_SEC_SHIFT;
2098 spec->tv_nsec = packed_time & OCFS2_NSEC_MASK;
2099}
2100
2101static void ocfs2_refresh_inode_from_lvb(struct inode *inode)
2102{
2103 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2104 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres;
2105 struct ocfs2_meta_lvb *lvb;
2106
2107 mlog_meta_lvb(0, lockres);
2108
2109 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2110
2111
2112 spin_lock(&oi->ip_lock);
2113 oi->ip_clusters = be32_to_cpu(lvb->lvb_iclusters);
2114 i_size_write(inode, be64_to_cpu(lvb->lvb_isize));
2115
2116 oi->ip_attr = be32_to_cpu(lvb->lvb_iattr);
2117 oi->ip_dyn_features = be16_to_cpu(lvb->lvb_idynfeatures);
2118 ocfs2_set_inode_flags(inode);
2119
2120
2121 if (S_ISLNK(inode->i_mode) && !oi->ip_clusters)
2122 inode->i_blocks = 0;
2123 else
2124 inode->i_blocks = ocfs2_inode_sector_count(inode);
2125
2126 i_uid_write(inode, be32_to_cpu(lvb->lvb_iuid));
2127 i_gid_write(inode, be32_to_cpu(lvb->lvb_igid));
2128 inode->i_mode = be16_to_cpu(lvb->lvb_imode);
2129 set_nlink(inode, be16_to_cpu(lvb->lvb_inlink));
2130 ocfs2_unpack_timespec(&inode->i_atime,
2131 be64_to_cpu(lvb->lvb_iatime_packed));
2132 ocfs2_unpack_timespec(&inode->i_mtime,
2133 be64_to_cpu(lvb->lvb_imtime_packed));
2134 ocfs2_unpack_timespec(&inode->i_ctime,
2135 be64_to_cpu(lvb->lvb_ictime_packed));
2136 spin_unlock(&oi->ip_lock);
2137}
2138
2139static inline int ocfs2_meta_lvb_is_trustable(struct inode *inode,
2140 struct ocfs2_lock_res *lockres)
2141{
2142 struct ocfs2_meta_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2143
2144 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb)
2145 && lvb->lvb_version == OCFS2_LVB_VERSION
2146 && be32_to_cpu(lvb->lvb_igeneration) == inode->i_generation)
2147 return 1;
2148 return 0;
2149}
2150
2151
2152
2153
2154
2155
2156
2157
2158static int ocfs2_should_refresh_lock_res(struct ocfs2_lock_res *lockres)
2159{
2160 unsigned long flags;
2161 int status = 0;
2162
2163refresh_check:
2164 spin_lock_irqsave(&lockres->l_lock, flags);
2165 if (!(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH)) {
2166 spin_unlock_irqrestore(&lockres->l_lock, flags);
2167 goto bail;
2168 }
2169
2170 if (lockres->l_flags & OCFS2_LOCK_REFRESHING) {
2171 spin_unlock_irqrestore(&lockres->l_lock, flags);
2172
2173 ocfs2_wait_on_refreshing_lock(lockres);
2174 goto refresh_check;
2175 }
2176
2177
2178 lockres_or_flags(lockres, OCFS2_LOCK_REFRESHING);
2179 spin_unlock_irqrestore(&lockres->l_lock, flags);
2180
2181 status = 1;
2182bail:
2183 mlog(0, "status %d\n", status);
2184 return status;
2185}
2186
2187
2188
2189static inline void ocfs2_complete_lock_res_refresh(struct ocfs2_lock_res *lockres,
2190 int status)
2191{
2192 unsigned long flags;
2193
2194 spin_lock_irqsave(&lockres->l_lock, flags);
2195 lockres_clear_flags(lockres, OCFS2_LOCK_REFRESHING);
2196 if (!status)
2197 lockres_clear_flags(lockres, OCFS2_LOCK_NEEDS_REFRESH);
2198 spin_unlock_irqrestore(&lockres->l_lock, flags);
2199
2200 wake_up(&lockres->l_event);
2201}
2202
2203
2204static int ocfs2_inode_lock_update(struct inode *inode,
2205 struct buffer_head **bh)
2206{
2207 int status = 0;
2208 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2209 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres;
2210 struct ocfs2_dinode *fe;
2211 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2212
2213 if (ocfs2_mount_local(osb))
2214 goto bail;
2215
2216 spin_lock(&oi->ip_lock);
2217 if (oi->ip_flags & OCFS2_INODE_DELETED) {
2218 mlog(0, "Orphaned inode %llu was deleted while we "
2219 "were waiting on a lock. ip_flags = 0x%x\n",
2220 (unsigned long long)oi->ip_blkno, oi->ip_flags);
2221 spin_unlock(&oi->ip_lock);
2222 status = -ENOENT;
2223 goto bail;
2224 }
2225 spin_unlock(&oi->ip_lock);
2226
2227 if (!ocfs2_should_refresh_lock_res(lockres))
2228 goto bail;
2229
2230
2231
2232 ocfs2_metadata_cache_purge(INODE_CACHE(inode));
2233
2234 ocfs2_extent_map_trunc(inode, 0);
2235
2236 if (ocfs2_meta_lvb_is_trustable(inode, lockres)) {
2237 mlog(0, "Trusting LVB on inode %llu\n",
2238 (unsigned long long)oi->ip_blkno);
2239 ocfs2_refresh_inode_from_lvb(inode);
2240 } else {
2241
2242
2243 status = ocfs2_read_inode_block(inode, bh);
2244 if (status < 0) {
2245 mlog_errno(status);
2246 goto bail_refresh;
2247 }
2248 fe = (struct ocfs2_dinode *) (*bh)->b_data;
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259 mlog_bug_on_msg(inode->i_generation !=
2260 le32_to_cpu(fe->i_generation),
2261 "Invalid dinode %llu disk generation: %u "
2262 "inode->i_generation: %u\n",
2263 (unsigned long long)oi->ip_blkno,
2264 le32_to_cpu(fe->i_generation),
2265 inode->i_generation);
2266 mlog_bug_on_msg(le64_to_cpu(fe->i_dtime) ||
2267 !(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL)),
2268 "Stale dinode %llu dtime: %llu flags: 0x%x\n",
2269 (unsigned long long)oi->ip_blkno,
2270 (unsigned long long)le64_to_cpu(fe->i_dtime),
2271 le32_to_cpu(fe->i_flags));
2272
2273 ocfs2_refresh_inode(inode, fe);
2274 ocfs2_track_lock_refresh(lockres);
2275 }
2276
2277 status = 0;
2278bail_refresh:
2279 ocfs2_complete_lock_res_refresh(lockres, status);
2280bail:
2281 return status;
2282}
2283
2284static int ocfs2_assign_bh(struct inode *inode,
2285 struct buffer_head **ret_bh,
2286 struct buffer_head *passed_bh)
2287{
2288 int status;
2289
2290 if (passed_bh) {
2291
2292
2293 *ret_bh = passed_bh;
2294 get_bh(*ret_bh);
2295
2296 return 0;
2297 }
2298
2299 status = ocfs2_read_inode_block(inode, ret_bh);
2300 if (status < 0)
2301 mlog_errno(status);
2302
2303 return status;
2304}
2305
2306
2307
2308
2309
2310int ocfs2_inode_lock_full_nested(struct inode *inode,
2311 struct buffer_head **ret_bh,
2312 int ex,
2313 int arg_flags,
2314 int subclass)
2315{
2316 int status, level, acquired;
2317 u32 dlm_flags;
2318 struct ocfs2_lock_res *lockres = NULL;
2319 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2320 struct buffer_head *local_bh = NULL;
2321
2322 mlog(0, "inode %llu, take %s META lock\n",
2323 (unsigned long long)OCFS2_I(inode)->ip_blkno,
2324 ex ? "EXMODE" : "PRMODE");
2325
2326 status = 0;
2327 acquired = 0;
2328
2329
2330 if (ocfs2_is_hard_readonly(osb)) {
2331 if (ex)
2332 status = -EROFS;
2333 goto getbh;
2334 }
2335
2336 if (ocfs2_mount_local(osb))
2337 goto local;
2338
2339 if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
2340 ocfs2_wait_for_recovery(osb);
2341
2342 lockres = &OCFS2_I(inode)->ip_inode_lockres;
2343 level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2344 dlm_flags = 0;
2345 if (arg_flags & OCFS2_META_LOCK_NOQUEUE)
2346 dlm_flags |= DLM_LKF_NOQUEUE;
2347
2348 status = __ocfs2_cluster_lock(osb, lockres, level, dlm_flags,
2349 arg_flags, subclass, _RET_IP_);
2350 if (status < 0) {
2351 if (status != -EAGAIN)
2352 mlog_errno(status);
2353 goto bail;
2354 }
2355
2356
2357 acquired = 1;
2358
2359
2360
2361
2362
2363 if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
2364 ocfs2_wait_for_recovery(osb);
2365
2366local:
2367
2368
2369
2370
2371
2372
2373 if (inode->i_state & I_NEW) {
2374 status = 0;
2375 if (lockres)
2376 ocfs2_complete_lock_res_refresh(lockres, 0);
2377 goto bail;
2378 }
2379
2380
2381
2382
2383
2384
2385 status = ocfs2_inode_lock_update(inode, &local_bh);
2386 if (status < 0) {
2387 if (status != -ENOENT)
2388 mlog_errno(status);
2389 goto bail;
2390 }
2391getbh:
2392 if (ret_bh) {
2393 status = ocfs2_assign_bh(inode, ret_bh, local_bh);
2394 if (status < 0) {
2395 mlog_errno(status);
2396 goto bail;
2397 }
2398 }
2399
2400bail:
2401 if (status < 0) {
2402 if (ret_bh && (*ret_bh)) {
2403 brelse(*ret_bh);
2404 *ret_bh = NULL;
2405 }
2406 if (acquired)
2407 ocfs2_inode_unlock(inode, ex);
2408 }
2409
2410 if (local_bh)
2411 brelse(local_bh);
2412
2413 return status;
2414}
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432int ocfs2_inode_lock_with_page(struct inode *inode,
2433 struct buffer_head **ret_bh,
2434 int ex,
2435 struct page *page)
2436{
2437 int ret;
2438
2439 ret = ocfs2_inode_lock_full(inode, ret_bh, ex, OCFS2_LOCK_NONBLOCK);
2440 if (ret == -EAGAIN) {
2441 unlock_page(page);
2442 ret = AOP_TRUNCATED_PAGE;
2443 }
2444
2445 return ret;
2446}
2447
2448int ocfs2_inode_lock_atime(struct inode *inode,
2449 struct vfsmount *vfsmnt,
2450 int *level)
2451{
2452 int ret;
2453
2454 ret = ocfs2_inode_lock(inode, NULL, 0);
2455 if (ret < 0) {
2456 mlog_errno(ret);
2457 return ret;
2458 }
2459
2460
2461
2462
2463
2464 if (ocfs2_should_update_atime(inode, vfsmnt)) {
2465 struct buffer_head *bh = NULL;
2466
2467 ocfs2_inode_unlock(inode, 0);
2468 ret = ocfs2_inode_lock(inode, &bh, 1);
2469 if (ret < 0) {
2470 mlog_errno(ret);
2471 return ret;
2472 }
2473 *level = 1;
2474 if (ocfs2_should_update_atime(inode, vfsmnt))
2475 ocfs2_update_inode_atime(inode, bh);
2476 if (bh)
2477 brelse(bh);
2478 } else
2479 *level = 0;
2480
2481 return ret;
2482}
2483
2484void ocfs2_inode_unlock(struct inode *inode,
2485 int ex)
2486{
2487 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2488 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_inode_lockres;
2489 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2490
2491 mlog(0, "inode %llu drop %s META lock\n",
2492 (unsigned long long)OCFS2_I(inode)->ip_blkno,
2493 ex ? "EXMODE" : "PRMODE");
2494
2495 if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)) &&
2496 !ocfs2_mount_local(osb))
2497 ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
2498}
2499
2500int ocfs2_orphan_scan_lock(struct ocfs2_super *osb, u32 *seqno)
2501{
2502 struct ocfs2_lock_res *lockres;
2503 struct ocfs2_orphan_scan_lvb *lvb;
2504 int status = 0;
2505
2506 if (ocfs2_is_hard_readonly(osb))
2507 return -EROFS;
2508
2509 if (ocfs2_mount_local(osb))
2510 return 0;
2511
2512 lockres = &osb->osb_orphan_scan.os_lockres;
2513 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, 0, 0);
2514 if (status < 0)
2515 return status;
2516
2517 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2518 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) &&
2519 lvb->lvb_version == OCFS2_ORPHAN_LVB_VERSION)
2520 *seqno = be32_to_cpu(lvb->lvb_os_seqno);
2521 else
2522 *seqno = osb->osb_orphan_scan.os_seqno + 1;
2523
2524 return status;
2525}
2526
2527void ocfs2_orphan_scan_unlock(struct ocfs2_super *osb, u32 seqno)
2528{
2529 struct ocfs2_lock_res *lockres;
2530 struct ocfs2_orphan_scan_lvb *lvb;
2531
2532 if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb)) {
2533 lockres = &osb->osb_orphan_scan.os_lockres;
2534 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2535 lvb->lvb_version = OCFS2_ORPHAN_LVB_VERSION;
2536 lvb->lvb_os_seqno = cpu_to_be32(seqno);
2537 ocfs2_cluster_unlock(osb, lockres, DLM_LOCK_EX);
2538 }
2539}
2540
2541int ocfs2_super_lock(struct ocfs2_super *osb,
2542 int ex)
2543{
2544 int status = 0;
2545 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2546 struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
2547
2548 if (ocfs2_is_hard_readonly(osb))
2549 return -EROFS;
2550
2551 if (ocfs2_mount_local(osb))
2552 goto bail;
2553
2554 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
2555 if (status < 0) {
2556 mlog_errno(status);
2557 goto bail;
2558 }
2559
2560
2561
2562
2563
2564 status = ocfs2_should_refresh_lock_res(lockres);
2565 if (status) {
2566 status = ocfs2_refresh_slot_info(osb);
2567
2568 ocfs2_complete_lock_res_refresh(lockres, status);
2569
2570 if (status < 0) {
2571 ocfs2_cluster_unlock(osb, lockres, level);
2572 mlog_errno(status);
2573 }
2574 ocfs2_track_lock_refresh(lockres);
2575 }
2576bail:
2577 return status;
2578}
2579
2580void ocfs2_super_unlock(struct ocfs2_super *osb,
2581 int ex)
2582{
2583 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2584 struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
2585
2586 if (!ocfs2_mount_local(osb))
2587 ocfs2_cluster_unlock(osb, lockres, level);
2588}
2589
2590int ocfs2_rename_lock(struct ocfs2_super *osb)
2591{
2592 int status;
2593 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;
2594
2595 if (ocfs2_is_hard_readonly(osb))
2596 return -EROFS;
2597
2598 if (ocfs2_mount_local(osb))
2599 return 0;
2600
2601 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, 0, 0);
2602 if (status < 0)
2603 mlog_errno(status);
2604
2605 return status;
2606}
2607
2608void ocfs2_rename_unlock(struct ocfs2_super *osb)
2609{
2610 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;
2611
2612 if (!ocfs2_mount_local(osb))
2613 ocfs2_cluster_unlock(osb, lockres, DLM_LOCK_EX);
2614}
2615
2616int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex)
2617{
2618 int status;
2619 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres;
2620
2621 if (ocfs2_is_hard_readonly(osb))
2622 return -EROFS;
2623
2624 if (ocfs2_mount_local(osb))
2625 return 0;
2626
2627 status = ocfs2_cluster_lock(osb, lockres, ex ? LKM_EXMODE : LKM_PRMODE,
2628 0, 0);
2629 if (status < 0)
2630 mlog(ML_ERROR, "lock on nfs sync lock failed %d\n", status);
2631
2632 return status;
2633}
2634
2635void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex)
2636{
2637 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres;
2638
2639 if (!ocfs2_mount_local(osb))
2640 ocfs2_cluster_unlock(osb, lockres,
2641 ex ? LKM_EXMODE : LKM_PRMODE);
2642}
2643
2644int ocfs2_dentry_lock(struct dentry *dentry, int ex)
2645{
2646 int ret;
2647 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2648 struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
2649 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
2650
2651 BUG_ON(!dl);
2652
2653 if (ocfs2_is_hard_readonly(osb)) {
2654 if (ex)
2655 return -EROFS;
2656 return 0;
2657 }
2658
2659 if (ocfs2_mount_local(osb))
2660 return 0;
2661
2662 ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0);
2663 if (ret < 0)
2664 mlog_errno(ret);
2665
2666 return ret;
2667}
2668
2669void ocfs2_dentry_unlock(struct dentry *dentry, int ex)
2670{
2671 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2672 struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
2673 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
2674
2675 if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb))
2676 ocfs2_cluster_unlock(osb, &dl->dl_lockres, level);
2677}
2678
2679
2680
2681
2682static void ocfs2_dlm_debug_free(struct kref *kref)
2683{
2684 struct ocfs2_dlm_debug *dlm_debug;
2685
2686 dlm_debug = container_of(kref, struct ocfs2_dlm_debug, d_refcnt);
2687
2688 kfree(dlm_debug);
2689}
2690
2691void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug)
2692{
2693 if (dlm_debug)
2694 kref_put(&dlm_debug->d_refcnt, ocfs2_dlm_debug_free);
2695}
2696
2697static void ocfs2_get_dlm_debug(struct ocfs2_dlm_debug *debug)
2698{
2699 kref_get(&debug->d_refcnt);
2700}
2701
2702struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void)
2703{
2704 struct ocfs2_dlm_debug *dlm_debug;
2705
2706 dlm_debug = kmalloc(sizeof(struct ocfs2_dlm_debug), GFP_KERNEL);
2707 if (!dlm_debug) {
2708 mlog_errno(-ENOMEM);
2709 goto out;
2710 }
2711
2712 kref_init(&dlm_debug->d_refcnt);
2713 INIT_LIST_HEAD(&dlm_debug->d_lockres_tracking);
2714 dlm_debug->d_locking_state = NULL;
2715out:
2716 return dlm_debug;
2717}
2718
2719
2720struct ocfs2_dlm_seq_priv {
2721 struct ocfs2_dlm_debug *p_dlm_debug;
2722 struct ocfs2_lock_res p_iter_res;
2723 struct ocfs2_lock_res p_tmp_res;
2724};
2725
2726static struct ocfs2_lock_res *ocfs2_dlm_next_res(struct ocfs2_lock_res *start,
2727 struct ocfs2_dlm_seq_priv *priv)
2728{
2729 struct ocfs2_lock_res *iter, *ret = NULL;
2730 struct ocfs2_dlm_debug *dlm_debug = priv->p_dlm_debug;
2731
2732 assert_spin_locked(&ocfs2_dlm_tracking_lock);
2733
2734 list_for_each_entry(iter, &start->l_debug_list, l_debug_list) {
2735
2736 if (&iter->l_debug_list == &dlm_debug->d_lockres_tracking) {
2737 mlog(0, "End of list found, %p\n", ret);
2738 break;
2739 }
2740
2741
2742
2743 if (iter->l_ops != NULL) {
2744 ret = iter;
2745 break;
2746 }
2747 }
2748
2749 return ret;
2750}
2751
2752static void *ocfs2_dlm_seq_start(struct seq_file *m, loff_t *pos)
2753{
2754 struct ocfs2_dlm_seq_priv *priv = m->private;
2755 struct ocfs2_lock_res *iter;
2756
2757 spin_lock(&ocfs2_dlm_tracking_lock);
2758 iter = ocfs2_dlm_next_res(&priv->p_iter_res, priv);
2759 if (iter) {
2760
2761
2762
2763
2764
2765
2766
2767 priv->p_tmp_res = *iter;
2768 iter = &priv->p_tmp_res;
2769 }
2770 spin_unlock(&ocfs2_dlm_tracking_lock);
2771
2772 return iter;
2773}
2774
2775static void ocfs2_dlm_seq_stop(struct seq_file *m, void *v)
2776{
2777}
2778
2779static void *ocfs2_dlm_seq_next(struct seq_file *m, void *v, loff_t *pos)
2780{
2781 struct ocfs2_dlm_seq_priv *priv = m->private;
2782 struct ocfs2_lock_res *iter = v;
2783 struct ocfs2_lock_res *dummy = &priv->p_iter_res;
2784
2785 spin_lock(&ocfs2_dlm_tracking_lock);
2786 iter = ocfs2_dlm_next_res(iter, priv);
2787 list_del_init(&dummy->l_debug_list);
2788 if (iter) {
2789 list_add(&dummy->l_debug_list, &iter->l_debug_list);
2790 priv->p_tmp_res = *iter;
2791 iter = &priv->p_tmp_res;
2792 }
2793 spin_unlock(&ocfs2_dlm_tracking_lock);
2794
2795 return iter;
2796}
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806#define OCFS2_DLM_DEBUG_STR_VERSION 3
2807static int ocfs2_dlm_seq_show(struct seq_file *m, void *v)
2808{
2809 int i;
2810 char *lvb;
2811 struct ocfs2_lock_res *lockres = v;
2812
2813 if (!lockres)
2814 return -EINVAL;
2815
2816 seq_printf(m, "0x%x\t", OCFS2_DLM_DEBUG_STR_VERSION);
2817
2818 if (lockres->l_type == OCFS2_LOCK_TYPE_DENTRY)
2819 seq_printf(m, "%.*s%08x\t", OCFS2_DENTRY_LOCK_INO_START - 1,
2820 lockres->l_name,
2821 (unsigned int)ocfs2_get_dentry_lock_ino(lockres));
2822 else
2823 seq_printf(m, "%.*s\t", OCFS2_LOCK_ID_MAX_LEN, lockres->l_name);
2824
2825 seq_printf(m, "%d\t"
2826 "0x%lx\t"
2827 "0x%x\t"
2828 "0x%x\t"
2829 "%u\t"
2830 "%u\t"
2831 "%d\t"
2832 "%d\t",
2833 lockres->l_level,
2834 lockres->l_flags,
2835 lockres->l_action,
2836 lockres->l_unlock_action,
2837 lockres->l_ro_holders,
2838 lockres->l_ex_holders,
2839 lockres->l_requested,
2840 lockres->l_blocking);
2841
2842
2843 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2844 for(i = 0; i < DLM_LVB_LEN; i++)
2845 seq_printf(m, "0x%x\t", lvb[i]);
2846
2847#ifdef CONFIG_OCFS2_FS_STATS
2848# define lock_num_prmode(_l) ((_l)->l_lock_prmode.ls_gets)
2849# define lock_num_exmode(_l) ((_l)->l_lock_exmode.ls_gets)
2850# define lock_num_prmode_failed(_l) ((_l)->l_lock_prmode.ls_fail)
2851# define lock_num_exmode_failed(_l) ((_l)->l_lock_exmode.ls_fail)
2852# define lock_total_prmode(_l) ((_l)->l_lock_prmode.ls_total)
2853# define lock_total_exmode(_l) ((_l)->l_lock_exmode.ls_total)
2854# define lock_max_prmode(_l) ((_l)->l_lock_prmode.ls_max)
2855# define lock_max_exmode(_l) ((_l)->l_lock_exmode.ls_max)
2856# define lock_refresh(_l) ((_l)->l_lock_refresh)
2857#else
2858# define lock_num_prmode(_l) (0)
2859# define lock_num_exmode(_l) (0)
2860# define lock_num_prmode_failed(_l) (0)
2861# define lock_num_exmode_failed(_l) (0)
2862# define lock_total_prmode(_l) (0ULL)
2863# define lock_total_exmode(_l) (0ULL)
2864# define lock_max_prmode(_l) (0)
2865# define lock_max_exmode(_l) (0)
2866# define lock_refresh(_l) (0)
2867#endif
2868
2869 seq_printf(m, "%u\t"
2870 "%u\t"
2871 "%u\t"
2872 "%u\t"
2873 "%llu\t"
2874 "%llu\t"
2875 "%u\t"
2876 "%u\t"
2877 "%u\t",
2878 lock_num_prmode(lockres),
2879 lock_num_exmode(lockres),
2880 lock_num_prmode_failed(lockres),
2881 lock_num_exmode_failed(lockres),
2882 lock_total_prmode(lockres),
2883 lock_total_exmode(lockres),
2884 lock_max_prmode(lockres),
2885 lock_max_exmode(lockres),
2886 lock_refresh(lockres));
2887
2888
2889 seq_printf(m, "\n");
2890 return 0;
2891}
2892
2893static const struct seq_operations ocfs2_dlm_seq_ops = {
2894 .start = ocfs2_dlm_seq_start,
2895 .stop = ocfs2_dlm_seq_stop,
2896 .next = ocfs2_dlm_seq_next,
2897 .show = ocfs2_dlm_seq_show,
2898};
2899
2900static int ocfs2_dlm_debug_release(struct inode *inode, struct file *file)
2901{
2902 struct seq_file *seq = file->private_data;
2903 struct ocfs2_dlm_seq_priv *priv = seq->private;
2904 struct ocfs2_lock_res *res = &priv->p_iter_res;
2905
2906 ocfs2_remove_lockres_tracking(res);
2907 ocfs2_put_dlm_debug(priv->p_dlm_debug);
2908 return seq_release_private(inode, file);
2909}
2910
2911static int ocfs2_dlm_debug_open(struct inode *inode, struct file *file)
2912{
2913 struct ocfs2_dlm_seq_priv *priv;
2914 struct ocfs2_super *osb;
2915
2916 priv = __seq_open_private(file, &ocfs2_dlm_seq_ops, sizeof(*priv));
2917 if (!priv) {
2918 mlog_errno(-ENOMEM);
2919 return -ENOMEM;
2920 }
2921
2922 osb = inode->i_private;
2923 ocfs2_get_dlm_debug(osb->osb_dlm_debug);
2924 priv->p_dlm_debug = osb->osb_dlm_debug;
2925 INIT_LIST_HEAD(&priv->p_iter_res.l_debug_list);
2926
2927 ocfs2_add_lockres_tracking(&priv->p_iter_res,
2928 priv->p_dlm_debug);
2929
2930 return 0;
2931}
2932
2933static const struct file_operations ocfs2_dlm_debug_fops = {
2934 .open = ocfs2_dlm_debug_open,
2935 .release = ocfs2_dlm_debug_release,
2936 .read = seq_read,
2937 .llseek = seq_lseek,
2938};
2939
2940static int ocfs2_dlm_init_debug(struct ocfs2_super *osb)
2941{
2942 int ret = 0;
2943 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
2944
2945 dlm_debug->d_locking_state = debugfs_create_file("locking_state",
2946 S_IFREG|S_IRUSR,
2947 osb->osb_debug_root,
2948 osb,
2949 &ocfs2_dlm_debug_fops);
2950 if (!dlm_debug->d_locking_state) {
2951 ret = -EINVAL;
2952 mlog(ML_ERROR,
2953 "Unable to create locking state debugfs file.\n");
2954 goto out;
2955 }
2956
2957 ocfs2_get_dlm_debug(dlm_debug);
2958out:
2959 return ret;
2960}
2961
2962static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)
2963{
2964 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
2965
2966 if (dlm_debug) {
2967 debugfs_remove(dlm_debug->d_locking_state);
2968 ocfs2_put_dlm_debug(dlm_debug);
2969 }
2970}
2971
2972int ocfs2_dlm_init(struct ocfs2_super *osb)
2973{
2974 int status = 0;
2975 struct ocfs2_cluster_connection *conn = NULL;
2976
2977 if (ocfs2_mount_local(osb)) {
2978 osb->node_num = 0;
2979 goto local;
2980 }
2981
2982 status = ocfs2_dlm_init_debug(osb);
2983 if (status < 0) {
2984 mlog_errno(status);
2985 goto bail;
2986 }
2987
2988
2989 osb->dc_task = kthread_run(ocfs2_downconvert_thread, osb, "ocfs2dc-%s",
2990 osb->uuid_str);
2991 if (IS_ERR(osb->dc_task)) {
2992 status = PTR_ERR(osb->dc_task);
2993 osb->dc_task = NULL;
2994 mlog_errno(status);
2995 goto bail;
2996 }
2997
2998
2999 status = ocfs2_cluster_connect(osb->osb_cluster_stack,
3000 osb->osb_cluster_name,
3001 strlen(osb->osb_cluster_name),
3002 osb->uuid_str,
3003 strlen(osb->uuid_str),
3004 &lproto, ocfs2_do_node_down, osb,
3005 &conn);
3006 if (status) {
3007 mlog_errno(status);
3008 goto bail;
3009 }
3010
3011 status = ocfs2_cluster_this_node(conn, &osb->node_num);
3012 if (status < 0) {
3013 mlog_errno(status);
3014 mlog(ML_ERROR,
3015 "could not find this host's node number\n");
3016 ocfs2_cluster_disconnect(conn, 0);
3017 goto bail;
3018 }
3019
3020local:
3021 ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
3022 ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);
3023 ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb);
3024 ocfs2_orphan_scan_lock_res_init(&osb->osb_orphan_scan.os_lockres, osb);
3025
3026 osb->cconn = conn;
3027bail:
3028 if (status < 0) {
3029 ocfs2_dlm_shutdown_debug(osb);
3030 if (osb->dc_task)
3031 kthread_stop(osb->dc_task);
3032 }
3033
3034 return status;
3035}
3036
3037void ocfs2_dlm_shutdown(struct ocfs2_super *osb,
3038 int hangup_pending)
3039{
3040 ocfs2_drop_osb_locks(osb);
3041
3042
3043
3044
3045
3046
3047
3048 if (osb->dc_task) {
3049 kthread_stop(osb->dc_task);
3050 osb->dc_task = NULL;
3051 }
3052
3053 ocfs2_lock_res_free(&osb->osb_super_lockres);
3054 ocfs2_lock_res_free(&osb->osb_rename_lockres);
3055 ocfs2_lock_res_free(&osb->osb_nfs_sync_lockres);
3056 ocfs2_lock_res_free(&osb->osb_orphan_scan.os_lockres);
3057
3058 ocfs2_cluster_disconnect(osb->cconn, hangup_pending);
3059 osb->cconn = NULL;
3060
3061 ocfs2_dlm_shutdown_debug(osb);
3062}
3063
3064static int ocfs2_drop_lock(struct ocfs2_super *osb,
3065 struct ocfs2_lock_res *lockres)
3066{
3067 int ret;
3068 unsigned long flags;
3069 u32 lkm_flags = 0;
3070
3071
3072 if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED))
3073 goto out;
3074
3075 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
3076 lkm_flags |= DLM_LKF_VALBLK;
3077
3078 spin_lock_irqsave(&lockres->l_lock, flags);
3079
3080 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_FREEING),
3081 "lockres %s, flags 0x%lx\n",
3082 lockres->l_name, lockres->l_flags);
3083
3084 while (lockres->l_flags & OCFS2_LOCK_BUSY) {
3085 mlog(0, "waiting on busy lock \"%s\": flags = %lx, action = "
3086 "%u, unlock_action = %u\n",
3087 lockres->l_name, lockres->l_flags, lockres->l_action,
3088 lockres->l_unlock_action);
3089
3090 spin_unlock_irqrestore(&lockres->l_lock, flags);
3091
3092
3093
3094
3095 ocfs2_wait_on_busy_lock(lockres);
3096
3097 spin_lock_irqsave(&lockres->l_lock, flags);
3098 }
3099
3100 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
3101 if (lockres->l_flags & OCFS2_LOCK_ATTACHED &&
3102 lockres->l_level == DLM_LOCK_EX &&
3103 !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
3104 lockres->l_ops->set_lvb(lockres);
3105 }
3106
3107 if (lockres->l_flags & OCFS2_LOCK_BUSY)
3108 mlog(ML_ERROR, "destroying busy lock: \"%s\"\n",
3109 lockres->l_name);
3110 if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
3111 mlog(0, "destroying blocked lock: \"%s\"\n", lockres->l_name);
3112
3113 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
3114 spin_unlock_irqrestore(&lockres->l_lock, flags);
3115 goto out;
3116 }
3117
3118 lockres_clear_flags(lockres, OCFS2_LOCK_ATTACHED);
3119
3120
3121
3122 BUG_ON(lockres->l_action != OCFS2_AST_INVALID);
3123
3124
3125 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
3126 lockres->l_unlock_action = OCFS2_UNLOCK_DROP_LOCK;
3127 spin_unlock_irqrestore(&lockres->l_lock, flags);
3128
3129 mlog(0, "lock %s\n", lockres->l_name);
3130
3131 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb, lkm_flags);
3132 if (ret) {
3133 ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
3134 mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags);
3135 ocfs2_dlm_dump_lksb(&lockres->l_lksb);
3136 BUG();
3137 }
3138 mlog(0, "lock %s, successful return from ocfs2_dlm_unlock\n",
3139 lockres->l_name);
3140
3141 ocfs2_wait_on_busy_lock(lockres);
3142out:
3143 return 0;
3144}
3145
3146static void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
3147 struct ocfs2_lock_res *lockres);
3148
3149
3150
3151
3152
3153
3154
3155void ocfs2_mark_lockres_freeing(struct ocfs2_super *osb,
3156 struct ocfs2_lock_res *lockres)
3157{
3158 int status;
3159 struct ocfs2_mask_waiter mw;
3160 unsigned long flags, flags2;
3161
3162 ocfs2_init_mask_waiter(&mw);
3163
3164 spin_lock_irqsave(&lockres->l_lock, flags);
3165 lockres->l_flags |= OCFS2_LOCK_FREEING;
3166 if (lockres->l_flags & OCFS2_LOCK_QUEUED && current == osb->dc_task) {
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184 spin_unlock_irqrestore(&lockres->l_lock, flags);
3185 spin_lock_irqsave(&osb->dc_task_lock, flags2);
3186 list_del_init(&lockres->l_blocked_list);
3187 osb->blocked_lock_count--;
3188 spin_unlock_irqrestore(&osb->dc_task_lock, flags2);
3189
3190
3191
3192
3193
3194
3195 WARN_ON_ONCE(lockres->l_ops->post_unlock);
3196
3197 ocfs2_process_blocked_lock(osb, lockres);
3198 return;
3199 }
3200 while (lockres->l_flags & OCFS2_LOCK_QUEUED) {
3201 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_QUEUED, 0);
3202 spin_unlock_irqrestore(&lockres->l_lock, flags);
3203
3204 mlog(0, "Waiting on lockres %s\n", lockres->l_name);
3205
3206 status = ocfs2_wait_for_mask(&mw);
3207 if (status)
3208 mlog_errno(status);
3209
3210 spin_lock_irqsave(&lockres->l_lock, flags);
3211 }
3212 spin_unlock_irqrestore(&lockres->l_lock, flags);
3213}
3214
3215void ocfs2_simple_drop_lockres(struct ocfs2_super *osb,
3216 struct ocfs2_lock_res *lockres)
3217{
3218 int ret;
3219
3220 ocfs2_mark_lockres_freeing(osb, lockres);
3221 ret = ocfs2_drop_lock(osb, lockres);
3222 if (ret)
3223 mlog_errno(ret);
3224}
3225
3226static void ocfs2_drop_osb_locks(struct ocfs2_super *osb)
3227{
3228 ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres);
3229 ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres);
3230 ocfs2_simple_drop_lockres(osb, &osb->osb_nfs_sync_lockres);
3231 ocfs2_simple_drop_lockres(osb, &osb->osb_orphan_scan.os_lockres);
3232}
3233
3234int ocfs2_drop_inode_locks(struct inode *inode)
3235{
3236 int status, err;
3237
3238
3239
3240
3241 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3242 &OCFS2_I(inode)->ip_open_lockres);
3243 if (err < 0)
3244 mlog_errno(err);
3245
3246 status = err;
3247
3248 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3249 &OCFS2_I(inode)->ip_inode_lockres);
3250 if (err < 0)
3251 mlog_errno(err);
3252 if (err < 0 && !status)
3253 status = err;
3254
3255 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3256 &OCFS2_I(inode)->ip_rw_lockres);
3257 if (err < 0)
3258 mlog_errno(err);
3259 if (err < 0 && !status)
3260 status = err;
3261
3262 return status;
3263}
3264
3265static unsigned int ocfs2_prepare_downconvert(struct ocfs2_lock_res *lockres,
3266 int new_level)
3267{
3268 assert_spin_locked(&lockres->l_lock);
3269
3270 BUG_ON(lockres->l_blocking <= DLM_LOCK_NL);
3271
3272 if (lockres->l_level <= new_level) {
3273 mlog(ML_ERROR, "lockres %s, lvl %d <= %d, blcklst %d, mask %d, "
3274 "type %d, flags 0x%lx, hold %d %d, act %d %d, req %d, "
3275 "block %d, pgen %d\n", lockres->l_name, lockres->l_level,
3276 new_level, list_empty(&lockres->l_blocked_list),
3277 list_empty(&lockres->l_mask_waiters), lockres->l_type,
3278 lockres->l_flags, lockres->l_ro_holders,
3279 lockres->l_ex_holders, lockres->l_action,
3280 lockres->l_unlock_action, lockres->l_requested,
3281 lockres->l_blocking, lockres->l_pending_gen);
3282 BUG();
3283 }
3284
3285 mlog(ML_BASTS, "lockres %s, level %d => %d, blocking %d\n",
3286 lockres->l_name, lockres->l_level, new_level, lockres->l_blocking);
3287
3288 lockres->l_action = OCFS2_AST_DOWNCONVERT;
3289 lockres->l_requested = new_level;
3290 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
3291 return lockres_set_pending(lockres);
3292}
3293
3294static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
3295 struct ocfs2_lock_res *lockres,
3296 int new_level,
3297 int lvb,
3298 unsigned int generation)
3299{
3300 int ret;
3301 u32 dlm_flags = DLM_LKF_CONVERT;
3302
3303 mlog(ML_BASTS, "lockres %s, level %d => %d\n", lockres->l_name,
3304 lockres->l_level, new_level);
3305
3306 if (lvb)
3307 dlm_flags |= DLM_LKF_VALBLK;
3308
3309 ret = ocfs2_dlm_lock(osb->cconn,
3310 new_level,
3311 &lockres->l_lksb,
3312 dlm_flags,
3313 lockres->l_name,
3314 OCFS2_LOCK_ID_MAX_LEN - 1);
3315 lockres_clear_pending(lockres, generation, osb);
3316 if (ret) {
3317 ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres);
3318 ocfs2_recover_from_dlm_error(lockres, 1);
3319 goto bail;
3320 }
3321
3322 ret = 0;
3323bail:
3324 return ret;
3325}
3326
3327
3328static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb,
3329 struct ocfs2_lock_res *lockres)
3330{
3331 assert_spin_locked(&lockres->l_lock);
3332
3333 if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT) {
3334
3335
3336
3337 mlog(ML_BASTS, "lockres %s, skip convert\n", lockres->l_name);
3338 return 0;
3339 }
3340
3341
3342 BUG_ON(lockres->l_action != OCFS2_AST_CONVERT &&
3343 lockres->l_action != OCFS2_AST_DOWNCONVERT);
3344
3345
3346 lockres->l_unlock_action = OCFS2_UNLOCK_CANCEL_CONVERT;
3347
3348 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_BUSY),
3349 "lock %s, invalid flags: 0x%lx\n",
3350 lockres->l_name, lockres->l_flags);
3351
3352 mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
3353
3354 return 1;
3355}
3356
3357static int ocfs2_cancel_convert(struct ocfs2_super *osb,
3358 struct ocfs2_lock_res *lockres)
3359{
3360 int ret;
3361
3362 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb,
3363 DLM_LKF_CANCEL);
3364 if (ret) {
3365 ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
3366 ocfs2_recover_from_dlm_error(lockres, 0);
3367 }
3368
3369 mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
3370
3371 return ret;
3372}
3373
3374static int ocfs2_unblock_lock(struct ocfs2_super *osb,
3375 struct ocfs2_lock_res *lockres,
3376 struct ocfs2_unblock_ctl *ctl)
3377{
3378 unsigned long flags;
3379 int blocking;
3380 int new_level;
3381 int level;
3382 int ret = 0;
3383 int set_lvb = 0;
3384 unsigned int gen;
3385
3386 spin_lock_irqsave(&lockres->l_lock, flags);
3387
3388recheck:
3389
3390
3391
3392 if (!(lockres->l_flags & OCFS2_LOCK_BLOCKED)) {
3393 BUG_ON(lockres->l_blocking != DLM_LOCK_NL);
3394 spin_unlock_irqrestore(&lockres->l_lock, flags);
3395 ret = 0;
3396 goto leave;
3397 }
3398
3399 if (lockres->l_flags & OCFS2_LOCK_BUSY) {
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423 if (lockres->l_flags & OCFS2_LOCK_PENDING) {
3424 mlog(ML_BASTS, "lockres %s, ReQ: Pending\n",
3425 lockres->l_name);
3426 goto leave_requeue;
3427 }
3428
3429 ctl->requeue = 1;
3430 ret = ocfs2_prepare_cancel_convert(osb, lockres);
3431 spin_unlock_irqrestore(&lockres->l_lock, flags);
3432 if (ret) {
3433 ret = ocfs2_cancel_convert(osb, lockres);
3434 if (ret < 0)
3435 mlog_errno(ret);
3436 }
3437 goto leave;
3438 }
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING)
3450 goto leave_requeue;
3451
3452
3453
3454
3455
3456
3457 if (lockres->l_level == DLM_LOCK_NL) {
3458 BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders);
3459 mlog(ML_BASTS, "lockres %s, Aborting dc\n", lockres->l_name);
3460 lockres->l_blocking = DLM_LOCK_NL;
3461 lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED);
3462 spin_unlock_irqrestore(&lockres->l_lock, flags);
3463 goto leave;
3464 }
3465
3466
3467
3468 if ((lockres->l_blocking == DLM_LOCK_EX)
3469 && (lockres->l_ex_holders || lockres->l_ro_holders)) {
3470 mlog(ML_BASTS, "lockres %s, ReQ: EX/PR Holders %u,%u\n",
3471 lockres->l_name, lockres->l_ex_holders,
3472 lockres->l_ro_holders);
3473 goto leave_requeue;
3474 }
3475
3476
3477
3478 if (lockres->l_blocking == DLM_LOCK_PR &&
3479 lockres->l_ex_holders) {
3480 mlog(ML_BASTS, "lockres %s, ReQ: EX Holders %u\n",
3481 lockres->l_name, lockres->l_ex_holders);
3482 goto leave_requeue;
3483 }
3484
3485
3486
3487
3488
3489 if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
3490 && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) {
3491 mlog(ML_BASTS, "lockres %s, ReQ: Lock Refreshing\n",
3492 lockres->l_name);
3493 goto leave_requeue;
3494 }
3495
3496 new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking);
3497
3498 if (lockres->l_ops->check_downconvert
3499 && !lockres->l_ops->check_downconvert(lockres, new_level)) {
3500 mlog(ML_BASTS, "lockres %s, ReQ: Checkpointing\n",
3501 lockres->l_name);
3502 goto leave_requeue;
3503 }
3504
3505
3506
3507
3508 if (!lockres->l_ops->downconvert_worker)
3509 goto downconvert;
3510
3511
3512
3513
3514
3515 blocking = lockres->l_blocking;
3516 level = lockres->l_level;
3517 spin_unlock_irqrestore(&lockres->l_lock, flags);
3518
3519 ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking);
3520
3521 if (ctl->unblock_action == UNBLOCK_STOP_POST) {
3522 mlog(ML_BASTS, "lockres %s, UNBLOCK_STOP_POST\n",
3523 lockres->l_name);
3524 goto leave;
3525 }
3526
3527 spin_lock_irqsave(&lockres->l_lock, flags);
3528 if ((blocking != lockres->l_blocking) || (level != lockres->l_level)) {
3529
3530
3531 mlog(ML_BASTS, "lockres %s, block=%d:%d, level=%d:%d, "
3532 "Recheck\n", lockres->l_name, blocking,
3533 lockres->l_blocking, level, lockres->l_level);
3534 goto recheck;
3535 }
3536
3537downconvert:
3538 ctl->requeue = 0;
3539
3540 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
3541 if (lockres->l_level == DLM_LOCK_EX)
3542 set_lvb = 1;
3543
3544
3545
3546
3547
3548
3549
3550 if (set_lvb && !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
3551 lockres->l_ops->set_lvb(lockres);
3552 }
3553
3554 gen = ocfs2_prepare_downconvert(lockres, new_level);
3555 spin_unlock_irqrestore(&lockres->l_lock, flags);
3556 ret = ocfs2_downconvert_lock(osb, lockres, new_level, set_lvb,
3557 gen);
3558
3559leave:
3560 if (ret)
3561 mlog_errno(ret);
3562 return ret;
3563
3564leave_requeue:
3565 spin_unlock_irqrestore(&lockres->l_lock, flags);
3566 ctl->requeue = 1;
3567
3568 return 0;
3569}
3570
3571static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
3572 int blocking)
3573{
3574 struct inode *inode;
3575 struct address_space *mapping;
3576 struct ocfs2_inode_info *oi;
3577
3578 inode = ocfs2_lock_res_inode(lockres);
3579 mapping = inode->i_mapping;
3580
3581 if (S_ISDIR(inode->i_mode)) {
3582 oi = OCFS2_I(inode);
3583 oi->ip_dir_lock_gen++;
3584 mlog(0, "generation: %u\n", oi->ip_dir_lock_gen);
3585 goto out;
3586 }
3587
3588 if (!S_ISREG(inode->i_mode))
3589 goto out;
3590
3591
3592
3593
3594
3595
3596
3597
3598 unmap_mapping_range(mapping, 0, 0, 0);
3599
3600 if (filemap_fdatawrite(mapping)) {
3601 mlog(ML_ERROR, "Could not sync inode %llu for downconvert!",
3602 (unsigned long long)OCFS2_I(inode)->ip_blkno);
3603 }
3604 sync_mapping_buffers(mapping);
3605 if (blocking == DLM_LOCK_EX) {
3606 truncate_inode_pages(mapping, 0);
3607 } else {
3608
3609
3610
3611
3612
3613 filemap_fdatawait(mapping);
3614 }
3615
3616 forget_all_cached_acls(inode);
3617
3618out:
3619 return UNBLOCK_CONTINUE;
3620}
3621
3622static int ocfs2_ci_checkpointed(struct ocfs2_caching_info *ci,
3623 struct ocfs2_lock_res *lockres,
3624 int new_level)
3625{
3626 int checkpointed = ocfs2_ci_fully_checkpointed(ci);
3627
3628 BUG_ON(new_level != DLM_LOCK_NL && new_level != DLM_LOCK_PR);
3629 BUG_ON(lockres->l_level != DLM_LOCK_EX && !checkpointed);
3630
3631 if (checkpointed)
3632 return 1;
3633
3634 ocfs2_start_checkpoint(OCFS2_SB(ocfs2_metadata_cache_get_super(ci)));
3635 return 0;
3636}
3637
3638static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres,
3639 int new_level)
3640{
3641 struct inode *inode = ocfs2_lock_res_inode(lockres);
3642
3643 return ocfs2_ci_checkpointed(INODE_CACHE(inode), lockres, new_level);
3644}
3645
3646static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres)
3647{
3648 struct inode *inode = ocfs2_lock_res_inode(lockres);
3649
3650 __ocfs2_stuff_meta_lvb(inode);
3651}
3652
3653
3654
3655
3656
3657
3658static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
3659 struct ocfs2_lock_res *lockres)
3660{
3661 struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
3662 ocfs2_dentry_lock_put(osb, dl);
3663}
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres,
3685 int blocking)
3686{
3687 struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
3688 struct ocfs2_inode_info *oi = OCFS2_I(dl->dl_inode);
3689 struct dentry *dentry;
3690 unsigned long flags;
3691 int extra_ref = 0;
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701 if (blocking == DLM_LOCK_PR)
3702 return UNBLOCK_CONTINUE;
3703
3704
3705
3706
3707
3708
3709 spin_lock(&oi->ip_lock);
3710 oi->ip_flags |= OCFS2_INODE_MAYBE_ORPHANED;
3711 spin_unlock(&oi->ip_lock);
3712
3713
3714
3715
3716
3717
3718
3719 spin_lock_irqsave(&lockres->l_lock, flags);
3720 spin_lock(&dentry_attach_lock);
3721 if (!(lockres->l_flags & OCFS2_LOCK_FREEING)
3722 && dl->dl_count) {
3723 dl->dl_count++;
3724 extra_ref = 1;
3725 }
3726 spin_unlock(&dentry_attach_lock);
3727 spin_unlock_irqrestore(&lockres->l_lock, flags);
3728
3729 mlog(0, "extra_ref = %d\n", extra_ref);
3730
3731
3732
3733
3734
3735
3736 if (!extra_ref)
3737 return UNBLOCK_CONTINUE;
3738
3739 spin_lock(&dentry_attach_lock);
3740 while (1) {
3741 dentry = ocfs2_find_local_alias(dl->dl_inode,
3742 dl->dl_parent_blkno, 1);
3743 if (!dentry)
3744 break;
3745 spin_unlock(&dentry_attach_lock);
3746
3747 if (S_ISDIR(dl->dl_inode->i_mode))
3748 shrink_dcache_parent(dentry);
3749
3750 mlog(0, "d_delete(%pd);\n", dentry);
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760 d_delete(dentry);
3761 dput(dentry);
3762
3763 spin_lock(&dentry_attach_lock);
3764 }
3765 spin_unlock(&dentry_attach_lock);
3766
3767
3768
3769
3770
3771 if (dl->dl_count == 1)
3772 return UNBLOCK_STOP_POST;
3773
3774 return UNBLOCK_CONTINUE_POST;
3775}
3776
3777static int ocfs2_check_refcount_downconvert(struct ocfs2_lock_res *lockres,
3778 int new_level)
3779{
3780 struct ocfs2_refcount_tree *tree =
3781 ocfs2_lock_res_refcount_tree(lockres);
3782
3783 return ocfs2_ci_checkpointed(&tree->rf_ci, lockres, new_level);
3784}
3785
3786static int ocfs2_refcount_convert_worker(struct ocfs2_lock_res *lockres,
3787 int blocking)
3788{
3789 struct ocfs2_refcount_tree *tree =
3790 ocfs2_lock_res_refcount_tree(lockres);
3791
3792 ocfs2_metadata_cache_purge(&tree->rf_ci);
3793
3794 return UNBLOCK_CONTINUE;
3795}
3796
3797static void ocfs2_set_qinfo_lvb(struct ocfs2_lock_res *lockres)
3798{
3799 struct ocfs2_qinfo_lvb *lvb;
3800 struct ocfs2_mem_dqinfo *oinfo = ocfs2_lock_res_qinfo(lockres);
3801 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
3802 oinfo->dqi_gi.dqi_type);
3803
3804 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
3805 lvb->lvb_version = OCFS2_QINFO_LVB_VERSION;
3806 lvb->lvb_bgrace = cpu_to_be32(info->dqi_bgrace);
3807 lvb->lvb_igrace = cpu_to_be32(info->dqi_igrace);
3808 lvb->lvb_syncms = cpu_to_be32(oinfo->dqi_syncms);
3809 lvb->lvb_blocks = cpu_to_be32(oinfo->dqi_gi.dqi_blocks);
3810 lvb->lvb_free_blk = cpu_to_be32(oinfo->dqi_gi.dqi_free_blk);
3811 lvb->lvb_free_entry = cpu_to_be32(oinfo->dqi_gi.dqi_free_entry);
3812}
3813
3814void ocfs2_qinfo_unlock(struct ocfs2_mem_dqinfo *oinfo, int ex)
3815{
3816 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3817 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
3818 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3819
3820 if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb))
3821 ocfs2_cluster_unlock(osb, lockres, level);
3822}
3823
3824static int ocfs2_refresh_qinfo(struct ocfs2_mem_dqinfo *oinfo)
3825{
3826 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
3827 oinfo->dqi_gi.dqi_type);
3828 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3829 struct ocfs2_qinfo_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
3830 struct buffer_head *bh = NULL;
3831 struct ocfs2_global_disk_dqinfo *gdinfo;
3832 int status = 0;
3833
3834 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) &&
3835 lvb->lvb_version == OCFS2_QINFO_LVB_VERSION) {
3836 info->dqi_bgrace = be32_to_cpu(lvb->lvb_bgrace);
3837 info->dqi_igrace = be32_to_cpu(lvb->lvb_igrace);
3838 oinfo->dqi_syncms = be32_to_cpu(lvb->lvb_syncms);
3839 oinfo->dqi_gi.dqi_blocks = be32_to_cpu(lvb->lvb_blocks);
3840 oinfo->dqi_gi.dqi_free_blk = be32_to_cpu(lvb->lvb_free_blk);
3841 oinfo->dqi_gi.dqi_free_entry =
3842 be32_to_cpu(lvb->lvb_free_entry);
3843 } else {
3844 status = ocfs2_read_quota_phys_block(oinfo->dqi_gqinode,
3845 oinfo->dqi_giblk, &bh);
3846 if (status) {
3847 mlog_errno(status);
3848 goto bail;
3849 }
3850 gdinfo = (struct ocfs2_global_disk_dqinfo *)
3851 (bh->b_data + OCFS2_GLOBAL_INFO_OFF);
3852 info->dqi_bgrace = le32_to_cpu(gdinfo->dqi_bgrace);
3853 info->dqi_igrace = le32_to_cpu(gdinfo->dqi_igrace);
3854 oinfo->dqi_syncms = le32_to_cpu(gdinfo->dqi_syncms);
3855 oinfo->dqi_gi.dqi_blocks = le32_to_cpu(gdinfo->dqi_blocks);
3856 oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(gdinfo->dqi_free_blk);
3857 oinfo->dqi_gi.dqi_free_entry =
3858 le32_to_cpu(gdinfo->dqi_free_entry);
3859 brelse(bh);
3860 ocfs2_track_lock_refresh(lockres);
3861 }
3862
3863bail:
3864 return status;
3865}
3866
3867
3868
3869int ocfs2_qinfo_lock(struct ocfs2_mem_dqinfo *oinfo, int ex)
3870{
3871 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3872 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
3873 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3874 int status = 0;
3875
3876
3877 if (ocfs2_is_hard_readonly(osb)) {
3878 if (ex)
3879 status = -EROFS;
3880 goto bail;
3881 }
3882 if (ocfs2_mount_local(osb))
3883 goto bail;
3884
3885 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
3886 if (status < 0) {
3887 mlog_errno(status);
3888 goto bail;
3889 }
3890 if (!ocfs2_should_refresh_lock_res(lockres))
3891 goto bail;
3892
3893 status = ocfs2_refresh_qinfo(oinfo);
3894 if (status)
3895 ocfs2_qinfo_unlock(oinfo, ex);
3896 ocfs2_complete_lock_res_refresh(lockres, status);
3897bail:
3898 return status;
3899}
3900
3901int ocfs2_refcount_lock(struct ocfs2_refcount_tree *ref_tree, int ex)
3902{
3903 int status;
3904 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3905 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
3906 struct ocfs2_super *osb = lockres->l_priv;
3907
3908
3909 if (ocfs2_is_hard_readonly(osb))
3910 return -EROFS;
3911
3912 if (ocfs2_mount_local(osb))
3913 return 0;
3914
3915 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
3916 if (status < 0)
3917 mlog_errno(status);
3918
3919 return status;
3920}
3921
3922void ocfs2_refcount_unlock(struct ocfs2_refcount_tree *ref_tree, int ex)
3923{
3924 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3925 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
3926 struct ocfs2_super *osb = lockres->l_priv;
3927
3928 if (!ocfs2_mount_local(osb))
3929 ocfs2_cluster_unlock(osb, lockres, level);
3930}
3931
3932static void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
3933 struct ocfs2_lock_res *lockres)
3934{
3935 int status;
3936 struct ocfs2_unblock_ctl ctl = {0, 0,};
3937 unsigned long flags;
3938
3939
3940
3941
3942
3943 BUG_ON(!lockres);
3944 BUG_ON(!lockres->l_ops);
3945
3946 mlog(ML_BASTS, "lockres %s blocked\n", lockres->l_name);
3947
3948
3949
3950
3951
3952
3953 spin_lock_irqsave(&lockres->l_lock, flags);
3954 if (lockres->l_flags & OCFS2_LOCK_FREEING)
3955 goto unqueue;
3956 spin_unlock_irqrestore(&lockres->l_lock, flags);
3957
3958 status = ocfs2_unblock_lock(osb, lockres, &ctl);
3959 if (status < 0)
3960 mlog_errno(status);
3961
3962 spin_lock_irqsave(&lockres->l_lock, flags);
3963unqueue:
3964 if (lockres->l_flags & OCFS2_LOCK_FREEING || !ctl.requeue) {
3965 lockres_clear_flags(lockres, OCFS2_LOCK_QUEUED);
3966 } else
3967 ocfs2_schedule_blocked_lock(osb, lockres);
3968
3969 mlog(ML_BASTS, "lockres %s, requeue = %s.\n", lockres->l_name,
3970 ctl.requeue ? "yes" : "no");
3971 spin_unlock_irqrestore(&lockres->l_lock, flags);
3972
3973 if (ctl.unblock_action != UNBLOCK_CONTINUE
3974 && lockres->l_ops->post_unlock)
3975 lockres->l_ops->post_unlock(osb, lockres);
3976}
3977
3978static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb,
3979 struct ocfs2_lock_res *lockres)
3980{
3981 unsigned long flags;
3982
3983 assert_spin_locked(&lockres->l_lock);
3984
3985 if (lockres->l_flags & OCFS2_LOCK_FREEING) {
3986
3987
3988
3989 mlog(ML_BASTS, "lockres %s won't be scheduled: flags 0x%lx\n",
3990 lockres->l_name, lockres->l_flags);
3991 return;
3992 }
3993
3994 lockres_or_flags(lockres, OCFS2_LOCK_QUEUED);
3995
3996 spin_lock_irqsave(&osb->dc_task_lock, flags);
3997 if (list_empty(&lockres->l_blocked_list)) {
3998 list_add_tail(&lockres->l_blocked_list,
3999 &osb->blocked_lock_list);
4000 osb->blocked_lock_count++;
4001 }
4002 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4003}
4004
4005static void ocfs2_downconvert_thread_do_work(struct ocfs2_super *osb)
4006{
4007 unsigned long processed;
4008 unsigned long flags;
4009 struct ocfs2_lock_res *lockres;
4010
4011 spin_lock_irqsave(&osb->dc_task_lock, flags);
4012
4013
4014 osb->dc_work_sequence = osb->dc_wake_sequence;
4015
4016 processed = osb->blocked_lock_count;
4017
4018
4019
4020
4021
4022
4023 while (processed && !list_empty(&osb->blocked_lock_list)) {
4024 lockres = list_entry(osb->blocked_lock_list.next,
4025 struct ocfs2_lock_res, l_blocked_list);
4026 list_del_init(&lockres->l_blocked_list);
4027 osb->blocked_lock_count--;
4028 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4029
4030 BUG_ON(!processed);
4031 processed--;
4032
4033 ocfs2_process_blocked_lock(osb, lockres);
4034
4035 spin_lock_irqsave(&osb->dc_task_lock, flags);
4036 }
4037 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4038}
4039
4040static int ocfs2_downconvert_thread_lists_empty(struct ocfs2_super *osb)
4041{
4042 int empty = 0;
4043 unsigned long flags;
4044
4045 spin_lock_irqsave(&osb->dc_task_lock, flags);
4046 if (list_empty(&osb->blocked_lock_list))
4047 empty = 1;
4048
4049 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4050 return empty;
4051}
4052
4053static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb)
4054{
4055 int should_wake = 0;
4056 unsigned long flags;
4057
4058 spin_lock_irqsave(&osb->dc_task_lock, flags);
4059 if (osb->dc_work_sequence != osb->dc_wake_sequence)
4060 should_wake = 1;
4061 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4062
4063 return should_wake;
4064}
4065
4066static int ocfs2_downconvert_thread(void *arg)
4067{
4068 int status = 0;
4069 struct ocfs2_super *osb = arg;
4070
4071
4072
4073 while (!(kthread_should_stop() &&
4074 ocfs2_downconvert_thread_lists_empty(osb))) {
4075
4076 wait_event_interruptible(osb->dc_event,
4077 ocfs2_downconvert_thread_should_wake(osb) ||
4078 kthread_should_stop());
4079
4080 mlog(0, "downconvert_thread: awoken\n");
4081
4082 ocfs2_downconvert_thread_do_work(osb);
4083 }
4084
4085 osb->dc_task = NULL;
4086 return status;
4087}
4088
4089void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb)
4090{
4091 unsigned long flags;
4092
4093 spin_lock_irqsave(&osb->dc_task_lock, flags);
4094
4095
4096 osb->dc_wake_sequence++;
4097 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4098 wake_up(&osb->dc_event);
4099}
4100