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