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 INIT_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 INIT_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(inode->i_uid);
2049 lvb->lvb_igid = cpu_to_be32(inode->i_gid);
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 inode->i_uid = be32_to_cpu(lvb->lvb_iuid);
2099 inode->i_gid = 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 && status != -EIOCBRETRY)
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 mlog_errno(status);
2549 goto bail;
2550 }
2551 if (status) {
2552 status = ocfs2_refresh_slot_info(osb);
2553
2554 ocfs2_complete_lock_res_refresh(lockres, status);
2555
2556 if (status < 0)
2557 mlog_errno(status);
2558 ocfs2_track_lock_refresh(lockres);
2559 }
2560bail:
2561 return status;
2562}
2563
2564void ocfs2_super_unlock(struct ocfs2_super *osb,
2565 int ex)
2566{
2567 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2568 struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
2569
2570 if (!ocfs2_mount_local(osb))
2571 ocfs2_cluster_unlock(osb, lockres, level);
2572}
2573
2574int ocfs2_rename_lock(struct ocfs2_super *osb)
2575{
2576 int status;
2577 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;
2578
2579 if (ocfs2_is_hard_readonly(osb))
2580 return -EROFS;
2581
2582 if (ocfs2_mount_local(osb))
2583 return 0;
2584
2585 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, 0, 0);
2586 if (status < 0)
2587 mlog_errno(status);
2588
2589 return status;
2590}
2591
2592void ocfs2_rename_unlock(struct ocfs2_super *osb)
2593{
2594 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;
2595
2596 if (!ocfs2_mount_local(osb))
2597 ocfs2_cluster_unlock(osb, lockres, DLM_LOCK_EX);
2598}
2599
2600int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex)
2601{
2602 int status;
2603 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres;
2604
2605 if (ocfs2_is_hard_readonly(osb))
2606 return -EROFS;
2607
2608 if (ocfs2_mount_local(osb))
2609 return 0;
2610
2611 status = ocfs2_cluster_lock(osb, lockres, ex ? LKM_EXMODE : LKM_PRMODE,
2612 0, 0);
2613 if (status < 0)
2614 mlog(ML_ERROR, "lock on nfs sync lock failed %d\n", status);
2615
2616 return status;
2617}
2618
2619void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex)
2620{
2621 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres;
2622
2623 if (!ocfs2_mount_local(osb))
2624 ocfs2_cluster_unlock(osb, lockres,
2625 ex ? LKM_EXMODE : LKM_PRMODE);
2626}
2627
2628int ocfs2_dentry_lock(struct dentry *dentry, int ex)
2629{
2630 int ret;
2631 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2632 struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
2633 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
2634
2635 BUG_ON(!dl);
2636
2637 if (ocfs2_is_hard_readonly(osb)) {
2638 if (ex)
2639 return -EROFS;
2640 return 0;
2641 }
2642
2643 if (ocfs2_mount_local(osb))
2644 return 0;
2645
2646 ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0);
2647 if (ret < 0)
2648 mlog_errno(ret);
2649
2650 return ret;
2651}
2652
2653void ocfs2_dentry_unlock(struct dentry *dentry, int ex)
2654{
2655 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2656 struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
2657 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
2658
2659 if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb))
2660 ocfs2_cluster_unlock(osb, &dl->dl_lockres, level);
2661}
2662
2663
2664
2665
2666static void ocfs2_dlm_debug_free(struct kref *kref)
2667{
2668 struct ocfs2_dlm_debug *dlm_debug;
2669
2670 dlm_debug = container_of(kref, struct ocfs2_dlm_debug, d_refcnt);
2671
2672 kfree(dlm_debug);
2673}
2674
2675void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug)
2676{
2677 if (dlm_debug)
2678 kref_put(&dlm_debug->d_refcnt, ocfs2_dlm_debug_free);
2679}
2680
2681static void ocfs2_get_dlm_debug(struct ocfs2_dlm_debug *debug)
2682{
2683 kref_get(&debug->d_refcnt);
2684}
2685
2686struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void)
2687{
2688 struct ocfs2_dlm_debug *dlm_debug;
2689
2690 dlm_debug = kmalloc(sizeof(struct ocfs2_dlm_debug), GFP_KERNEL);
2691 if (!dlm_debug) {
2692 mlog_errno(-ENOMEM);
2693 goto out;
2694 }
2695
2696 kref_init(&dlm_debug->d_refcnt);
2697 INIT_LIST_HEAD(&dlm_debug->d_lockres_tracking);
2698 dlm_debug->d_locking_state = NULL;
2699out:
2700 return dlm_debug;
2701}
2702
2703
2704struct ocfs2_dlm_seq_priv {
2705 struct ocfs2_dlm_debug *p_dlm_debug;
2706 struct ocfs2_lock_res p_iter_res;
2707 struct ocfs2_lock_res p_tmp_res;
2708};
2709
2710static struct ocfs2_lock_res *ocfs2_dlm_next_res(struct ocfs2_lock_res *start,
2711 struct ocfs2_dlm_seq_priv *priv)
2712{
2713 struct ocfs2_lock_res *iter, *ret = NULL;
2714 struct ocfs2_dlm_debug *dlm_debug = priv->p_dlm_debug;
2715
2716 assert_spin_locked(&ocfs2_dlm_tracking_lock);
2717
2718 list_for_each_entry(iter, &start->l_debug_list, l_debug_list) {
2719
2720 if (&iter->l_debug_list == &dlm_debug->d_lockres_tracking) {
2721 mlog(0, "End of list found, %p\n", ret);
2722 break;
2723 }
2724
2725
2726
2727 if (iter->l_ops != NULL) {
2728 ret = iter;
2729 break;
2730 }
2731 }
2732
2733 return ret;
2734}
2735
2736static void *ocfs2_dlm_seq_start(struct seq_file *m, loff_t *pos)
2737{
2738 struct ocfs2_dlm_seq_priv *priv = m->private;
2739 struct ocfs2_lock_res *iter;
2740
2741 spin_lock(&ocfs2_dlm_tracking_lock);
2742 iter = ocfs2_dlm_next_res(&priv->p_iter_res, priv);
2743 if (iter) {
2744
2745
2746
2747
2748
2749
2750
2751 priv->p_tmp_res = *iter;
2752 iter = &priv->p_tmp_res;
2753 }
2754 spin_unlock(&ocfs2_dlm_tracking_lock);
2755
2756 return iter;
2757}
2758
2759static void ocfs2_dlm_seq_stop(struct seq_file *m, void *v)
2760{
2761}
2762
2763static void *ocfs2_dlm_seq_next(struct seq_file *m, void *v, loff_t *pos)
2764{
2765 struct ocfs2_dlm_seq_priv *priv = m->private;
2766 struct ocfs2_lock_res *iter = v;
2767 struct ocfs2_lock_res *dummy = &priv->p_iter_res;
2768
2769 spin_lock(&ocfs2_dlm_tracking_lock);
2770 iter = ocfs2_dlm_next_res(iter, priv);
2771 list_del_init(&dummy->l_debug_list);
2772 if (iter) {
2773 list_add(&dummy->l_debug_list, &iter->l_debug_list);
2774 priv->p_tmp_res = *iter;
2775 iter = &priv->p_tmp_res;
2776 }
2777 spin_unlock(&ocfs2_dlm_tracking_lock);
2778
2779 return iter;
2780}
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790#define OCFS2_DLM_DEBUG_STR_VERSION 3
2791static int ocfs2_dlm_seq_show(struct seq_file *m, void *v)
2792{
2793 int i;
2794 char *lvb;
2795 struct ocfs2_lock_res *lockres = v;
2796
2797 if (!lockres)
2798 return -EINVAL;
2799
2800 seq_printf(m, "0x%x\t", OCFS2_DLM_DEBUG_STR_VERSION);
2801
2802 if (lockres->l_type == OCFS2_LOCK_TYPE_DENTRY)
2803 seq_printf(m, "%.*s%08x\t", OCFS2_DENTRY_LOCK_INO_START - 1,
2804 lockres->l_name,
2805 (unsigned int)ocfs2_get_dentry_lock_ino(lockres));
2806 else
2807 seq_printf(m, "%.*s\t", OCFS2_LOCK_ID_MAX_LEN, lockres->l_name);
2808
2809 seq_printf(m, "%d\t"
2810 "0x%lx\t"
2811 "0x%x\t"
2812 "0x%x\t"
2813 "%u\t"
2814 "%u\t"
2815 "%d\t"
2816 "%d\t",
2817 lockres->l_level,
2818 lockres->l_flags,
2819 lockres->l_action,
2820 lockres->l_unlock_action,
2821 lockres->l_ro_holders,
2822 lockres->l_ex_holders,
2823 lockres->l_requested,
2824 lockres->l_blocking);
2825
2826
2827 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
2828 for(i = 0; i < DLM_LVB_LEN; i++)
2829 seq_printf(m, "0x%x\t", lvb[i]);
2830
2831#ifdef CONFIG_OCFS2_FS_STATS
2832# define lock_num_prmode(_l) ((_l)->l_lock_prmode.ls_gets)
2833# define lock_num_exmode(_l) ((_l)->l_lock_exmode.ls_gets)
2834# define lock_num_prmode_failed(_l) ((_l)->l_lock_prmode.ls_fail)
2835# define lock_num_exmode_failed(_l) ((_l)->l_lock_exmode.ls_fail)
2836# define lock_total_prmode(_l) ((_l)->l_lock_prmode.ls_total)
2837# define lock_total_exmode(_l) ((_l)->l_lock_exmode.ls_total)
2838# define lock_max_prmode(_l) ((_l)->l_lock_prmode.ls_max)
2839# define lock_max_exmode(_l) ((_l)->l_lock_exmode.ls_max)
2840# define lock_refresh(_l) ((_l)->l_lock_refresh)
2841#else
2842# define lock_num_prmode(_l) (0)
2843# define lock_num_exmode(_l) (0)
2844# define lock_num_prmode_failed(_l) (0)
2845# define lock_num_exmode_failed(_l) (0)
2846# define lock_total_prmode(_l) (0ULL)
2847# define lock_total_exmode(_l) (0ULL)
2848# define lock_max_prmode(_l) (0)
2849# define lock_max_exmode(_l) (0)
2850# define lock_refresh(_l) (0)
2851#endif
2852
2853 seq_printf(m, "%u\t"
2854 "%u\t"
2855 "%u\t"
2856 "%u\t"
2857 "%llu\t"
2858 "%llu\t"
2859 "%u\t"
2860 "%u\t"
2861 "%u\t",
2862 lock_num_prmode(lockres),
2863 lock_num_exmode(lockres),
2864 lock_num_prmode_failed(lockres),
2865 lock_num_exmode_failed(lockres),
2866 lock_total_prmode(lockres),
2867 lock_total_exmode(lockres),
2868 lock_max_prmode(lockres),
2869 lock_max_exmode(lockres),
2870 lock_refresh(lockres));
2871
2872
2873 seq_printf(m, "\n");
2874 return 0;
2875}
2876
2877static const struct seq_operations ocfs2_dlm_seq_ops = {
2878 .start = ocfs2_dlm_seq_start,
2879 .stop = ocfs2_dlm_seq_stop,
2880 .next = ocfs2_dlm_seq_next,
2881 .show = ocfs2_dlm_seq_show,
2882};
2883
2884static int ocfs2_dlm_debug_release(struct inode *inode, struct file *file)
2885{
2886 struct seq_file *seq = file->private_data;
2887 struct ocfs2_dlm_seq_priv *priv = seq->private;
2888 struct ocfs2_lock_res *res = &priv->p_iter_res;
2889
2890 ocfs2_remove_lockres_tracking(res);
2891 ocfs2_put_dlm_debug(priv->p_dlm_debug);
2892 return seq_release_private(inode, file);
2893}
2894
2895static int ocfs2_dlm_debug_open(struct inode *inode, struct file *file)
2896{
2897 int ret;
2898 struct ocfs2_dlm_seq_priv *priv;
2899 struct seq_file *seq;
2900 struct ocfs2_super *osb;
2901
2902 priv = kzalloc(sizeof(struct ocfs2_dlm_seq_priv), GFP_KERNEL);
2903 if (!priv) {
2904 ret = -ENOMEM;
2905 mlog_errno(ret);
2906 goto out;
2907 }
2908 osb = inode->i_private;
2909 ocfs2_get_dlm_debug(osb->osb_dlm_debug);
2910 priv->p_dlm_debug = osb->osb_dlm_debug;
2911 INIT_LIST_HEAD(&priv->p_iter_res.l_debug_list);
2912
2913 ret = seq_open(file, &ocfs2_dlm_seq_ops);
2914 if (ret) {
2915 kfree(priv);
2916 mlog_errno(ret);
2917 goto out;
2918 }
2919
2920 seq = file->private_data;
2921 seq->private = priv;
2922
2923 ocfs2_add_lockres_tracking(&priv->p_iter_res,
2924 priv->p_dlm_debug);
2925
2926out:
2927 return ret;
2928}
2929
2930static const struct file_operations ocfs2_dlm_debug_fops = {
2931 .open = ocfs2_dlm_debug_open,
2932 .release = ocfs2_dlm_debug_release,
2933 .read = seq_read,
2934 .llseek = seq_lseek,
2935};
2936
2937static int ocfs2_dlm_init_debug(struct ocfs2_super *osb)
2938{
2939 int ret = 0;
2940 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
2941
2942 dlm_debug->d_locking_state = debugfs_create_file("locking_state",
2943 S_IFREG|S_IRUSR,
2944 osb->osb_debug_root,
2945 osb,
2946 &ocfs2_dlm_debug_fops);
2947 if (!dlm_debug->d_locking_state) {
2948 ret = -EINVAL;
2949 mlog(ML_ERROR,
2950 "Unable to create locking state debugfs file.\n");
2951 goto out;
2952 }
2953
2954 ocfs2_get_dlm_debug(dlm_debug);
2955out:
2956 return ret;
2957}
2958
2959static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)
2960{
2961 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
2962
2963 if (dlm_debug) {
2964 debugfs_remove(dlm_debug->d_locking_state);
2965 ocfs2_put_dlm_debug(dlm_debug);
2966 }
2967}
2968
2969int ocfs2_dlm_init(struct ocfs2_super *osb)
2970{
2971 int status = 0;
2972 struct ocfs2_cluster_connection *conn = NULL;
2973
2974 if (ocfs2_mount_local(osb)) {
2975 osb->node_num = 0;
2976 goto local;
2977 }
2978
2979 status = ocfs2_dlm_init_debug(osb);
2980 if (status < 0) {
2981 mlog_errno(status);
2982 goto bail;
2983 }
2984
2985
2986 osb->dc_task = kthread_run(ocfs2_downconvert_thread, osb, "ocfs2dc");
2987 if (IS_ERR(osb->dc_task)) {
2988 status = PTR_ERR(osb->dc_task);
2989 osb->dc_task = NULL;
2990 mlog_errno(status);
2991 goto bail;
2992 }
2993
2994
2995 status = ocfs2_cluster_connect(osb->osb_cluster_stack,
2996 osb->uuid_str,
2997 strlen(osb->uuid_str),
2998 &lproto, ocfs2_do_node_down, osb,
2999 &conn);
3000 if (status) {
3001 mlog_errno(status);
3002 goto bail;
3003 }
3004
3005 status = ocfs2_cluster_this_node(&osb->node_num);
3006 if (status < 0) {
3007 mlog_errno(status);
3008 mlog(ML_ERROR,
3009 "could not find this host's node number\n");
3010 ocfs2_cluster_disconnect(conn, 0);
3011 goto bail;
3012 }
3013
3014local:
3015 ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
3016 ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);
3017 ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb);
3018 ocfs2_orphan_scan_lock_res_init(&osb->osb_orphan_scan.os_lockres, osb);
3019
3020 osb->cconn = conn;
3021
3022 status = 0;
3023bail:
3024 if (status < 0) {
3025 ocfs2_dlm_shutdown_debug(osb);
3026 if (osb->dc_task)
3027 kthread_stop(osb->dc_task);
3028 }
3029
3030 return status;
3031}
3032
3033void ocfs2_dlm_shutdown(struct ocfs2_super *osb,
3034 int hangup_pending)
3035{
3036 ocfs2_drop_osb_locks(osb);
3037
3038
3039
3040
3041
3042
3043
3044 if (osb->dc_task) {
3045 kthread_stop(osb->dc_task);
3046 osb->dc_task = NULL;
3047 }
3048
3049 ocfs2_lock_res_free(&osb->osb_super_lockres);
3050 ocfs2_lock_res_free(&osb->osb_rename_lockres);
3051 ocfs2_lock_res_free(&osb->osb_nfs_sync_lockres);
3052 ocfs2_lock_res_free(&osb->osb_orphan_scan.os_lockres);
3053
3054 ocfs2_cluster_disconnect(osb->cconn, hangup_pending);
3055 osb->cconn = NULL;
3056
3057 ocfs2_dlm_shutdown_debug(osb);
3058}
3059
3060static int ocfs2_drop_lock(struct ocfs2_super *osb,
3061 struct ocfs2_lock_res *lockres)
3062{
3063 int ret;
3064 unsigned long flags;
3065 u32 lkm_flags = 0;
3066
3067
3068 if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED))
3069 goto out;
3070
3071 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
3072 lkm_flags |= DLM_LKF_VALBLK;
3073
3074 spin_lock_irqsave(&lockres->l_lock, flags);
3075
3076 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_FREEING),
3077 "lockres %s, flags 0x%lx\n",
3078 lockres->l_name, lockres->l_flags);
3079
3080 while (lockres->l_flags & OCFS2_LOCK_BUSY) {
3081 mlog(0, "waiting on busy lock \"%s\": flags = %lx, action = "
3082 "%u, unlock_action = %u\n",
3083 lockres->l_name, lockres->l_flags, lockres->l_action,
3084 lockres->l_unlock_action);
3085
3086 spin_unlock_irqrestore(&lockres->l_lock, flags);
3087
3088
3089
3090
3091 ocfs2_wait_on_busy_lock(lockres);
3092
3093 spin_lock_irqsave(&lockres->l_lock, flags);
3094 }
3095
3096 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
3097 if (lockres->l_flags & OCFS2_LOCK_ATTACHED &&
3098 lockres->l_level == DLM_LOCK_EX &&
3099 !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
3100 lockres->l_ops->set_lvb(lockres);
3101 }
3102
3103 if (lockres->l_flags & OCFS2_LOCK_BUSY)
3104 mlog(ML_ERROR, "destroying busy lock: \"%s\"\n",
3105 lockres->l_name);
3106 if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
3107 mlog(0, "destroying blocked lock: \"%s\"\n", lockres->l_name);
3108
3109 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
3110 spin_unlock_irqrestore(&lockres->l_lock, flags);
3111 goto out;
3112 }
3113
3114 lockres_clear_flags(lockres, OCFS2_LOCK_ATTACHED);
3115
3116
3117
3118 BUG_ON(lockres->l_action != OCFS2_AST_INVALID);
3119
3120
3121 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
3122 lockres->l_unlock_action = OCFS2_UNLOCK_DROP_LOCK;
3123 spin_unlock_irqrestore(&lockres->l_lock, flags);
3124
3125 mlog(0, "lock %s\n", lockres->l_name);
3126
3127 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb, lkm_flags);
3128 if (ret) {
3129 ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
3130 mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags);
3131 ocfs2_dlm_dump_lksb(&lockres->l_lksb);
3132 BUG();
3133 }
3134 mlog(0, "lock %s, successful return from ocfs2_dlm_unlock\n",
3135 lockres->l_name);
3136
3137 ocfs2_wait_on_busy_lock(lockres);
3138out:
3139 return 0;
3140}
3141
3142
3143
3144
3145
3146
3147
3148void ocfs2_mark_lockres_freeing(struct ocfs2_lock_res *lockres)
3149{
3150 int status;
3151 struct ocfs2_mask_waiter mw;
3152 unsigned long flags;
3153
3154 ocfs2_init_mask_waiter(&mw);
3155
3156 spin_lock_irqsave(&lockres->l_lock, flags);
3157 lockres->l_flags |= OCFS2_LOCK_FREEING;
3158 while (lockres->l_flags & OCFS2_LOCK_QUEUED) {
3159 lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_QUEUED, 0);
3160 spin_unlock_irqrestore(&lockres->l_lock, flags);
3161
3162 mlog(0, "Waiting on lockres %s\n", lockres->l_name);
3163
3164 status = ocfs2_wait_for_mask(&mw);
3165 if (status)
3166 mlog_errno(status);
3167
3168 spin_lock_irqsave(&lockres->l_lock, flags);
3169 }
3170 spin_unlock_irqrestore(&lockres->l_lock, flags);
3171}
3172
3173void ocfs2_simple_drop_lockres(struct ocfs2_super *osb,
3174 struct ocfs2_lock_res *lockres)
3175{
3176 int ret;
3177
3178 ocfs2_mark_lockres_freeing(lockres);
3179 ret = ocfs2_drop_lock(osb, lockres);
3180 if (ret)
3181 mlog_errno(ret);
3182}
3183
3184static void ocfs2_drop_osb_locks(struct ocfs2_super *osb)
3185{
3186 ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres);
3187 ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres);
3188 ocfs2_simple_drop_lockres(osb, &osb->osb_nfs_sync_lockres);
3189 ocfs2_simple_drop_lockres(osb, &osb->osb_orphan_scan.os_lockres);
3190}
3191
3192int ocfs2_drop_inode_locks(struct inode *inode)
3193{
3194 int status, err;
3195
3196
3197
3198
3199 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3200 &OCFS2_I(inode)->ip_open_lockres);
3201 if (err < 0)
3202 mlog_errno(err);
3203
3204 status = err;
3205
3206 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3207 &OCFS2_I(inode)->ip_inode_lockres);
3208 if (err < 0)
3209 mlog_errno(err);
3210 if (err < 0 && !status)
3211 status = err;
3212
3213 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
3214 &OCFS2_I(inode)->ip_rw_lockres);
3215 if (err < 0)
3216 mlog_errno(err);
3217 if (err < 0 && !status)
3218 status = err;
3219
3220 return status;
3221}
3222
3223static unsigned int ocfs2_prepare_downconvert(struct ocfs2_lock_res *lockres,
3224 int new_level)
3225{
3226 assert_spin_locked(&lockres->l_lock);
3227
3228 BUG_ON(lockres->l_blocking <= DLM_LOCK_NL);
3229
3230 if (lockres->l_level <= new_level) {
3231 mlog(ML_ERROR, "lockres %s, lvl %d <= %d, blcklst %d, mask %d, "
3232 "type %d, flags 0x%lx, hold %d %d, act %d %d, req %d, "
3233 "block %d, pgen %d\n", lockres->l_name, lockres->l_level,
3234 new_level, list_empty(&lockres->l_blocked_list),
3235 list_empty(&lockres->l_mask_waiters), lockres->l_type,
3236 lockres->l_flags, lockres->l_ro_holders,
3237 lockres->l_ex_holders, lockres->l_action,
3238 lockres->l_unlock_action, lockres->l_requested,
3239 lockres->l_blocking, lockres->l_pending_gen);
3240 BUG();
3241 }
3242
3243 mlog(ML_BASTS, "lockres %s, level %d => %d, blocking %d\n",
3244 lockres->l_name, lockres->l_level, new_level, lockres->l_blocking);
3245
3246 lockres->l_action = OCFS2_AST_DOWNCONVERT;
3247 lockres->l_requested = new_level;
3248 lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
3249 return lockres_set_pending(lockres);
3250}
3251
3252static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
3253 struct ocfs2_lock_res *lockres,
3254 int new_level,
3255 int lvb,
3256 unsigned int generation)
3257{
3258 int ret;
3259 u32 dlm_flags = DLM_LKF_CONVERT;
3260
3261 mlog(ML_BASTS, "lockres %s, level %d => %d\n", lockres->l_name,
3262 lockres->l_level, new_level);
3263
3264 if (lvb)
3265 dlm_flags |= DLM_LKF_VALBLK;
3266
3267 ret = ocfs2_dlm_lock(osb->cconn,
3268 new_level,
3269 &lockres->l_lksb,
3270 dlm_flags,
3271 lockres->l_name,
3272 OCFS2_LOCK_ID_MAX_LEN - 1);
3273 lockres_clear_pending(lockres, generation, osb);
3274 if (ret) {
3275 ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres);
3276 ocfs2_recover_from_dlm_error(lockres, 1);
3277 goto bail;
3278 }
3279
3280 ret = 0;
3281bail:
3282 return ret;
3283}
3284
3285
3286static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb,
3287 struct ocfs2_lock_res *lockres)
3288{
3289 assert_spin_locked(&lockres->l_lock);
3290
3291 if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT) {
3292
3293
3294
3295 mlog(ML_BASTS, "lockres %s, skip convert\n", lockres->l_name);
3296 return 0;
3297 }
3298
3299
3300 BUG_ON(lockres->l_action != OCFS2_AST_CONVERT &&
3301 lockres->l_action != OCFS2_AST_DOWNCONVERT);
3302
3303
3304 lockres->l_unlock_action = OCFS2_UNLOCK_CANCEL_CONVERT;
3305
3306 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_BUSY),
3307 "lock %s, invalid flags: 0x%lx\n",
3308 lockres->l_name, lockres->l_flags);
3309
3310 mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
3311
3312 return 1;
3313}
3314
3315static int ocfs2_cancel_convert(struct ocfs2_super *osb,
3316 struct ocfs2_lock_res *lockres)
3317{
3318 int ret;
3319
3320 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb,
3321 DLM_LKF_CANCEL);
3322 if (ret) {
3323 ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
3324 ocfs2_recover_from_dlm_error(lockres, 0);
3325 }
3326
3327 mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
3328
3329 return ret;
3330}
3331
3332static int ocfs2_unblock_lock(struct ocfs2_super *osb,
3333 struct ocfs2_lock_res *lockres,
3334 struct ocfs2_unblock_ctl *ctl)
3335{
3336 unsigned long flags;
3337 int blocking;
3338 int new_level;
3339 int level;
3340 int ret = 0;
3341 int set_lvb = 0;
3342 unsigned int gen;
3343
3344 spin_lock_irqsave(&lockres->l_lock, flags);
3345
3346recheck:
3347
3348
3349
3350 if (!(lockres->l_flags & OCFS2_LOCK_BLOCKED)) {
3351 BUG_ON(lockres->l_blocking != DLM_LOCK_NL);
3352 spin_unlock_irqrestore(&lockres->l_lock, flags);
3353 ret = 0;
3354 goto leave;
3355 }
3356
3357 if (lockres->l_flags & OCFS2_LOCK_BUSY) {
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381 if (lockres->l_flags & OCFS2_LOCK_PENDING) {
3382 mlog(ML_BASTS, "lockres %s, ReQ: Pending\n",
3383 lockres->l_name);
3384 goto leave_requeue;
3385 }
3386
3387 ctl->requeue = 1;
3388 ret = ocfs2_prepare_cancel_convert(osb, lockres);
3389 spin_unlock_irqrestore(&lockres->l_lock, flags);
3390 if (ret) {
3391 ret = ocfs2_cancel_convert(osb, lockres);
3392 if (ret < 0)
3393 mlog_errno(ret);
3394 }
3395 goto leave;
3396 }
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING)
3408 goto leave_requeue;
3409
3410
3411
3412
3413
3414
3415 if (lockres->l_level == DLM_LOCK_NL) {
3416 BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders);
3417 mlog(ML_BASTS, "lockres %s, Aborting dc\n", lockres->l_name);
3418 lockres->l_blocking = DLM_LOCK_NL;
3419 lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED);
3420 spin_unlock_irqrestore(&lockres->l_lock, flags);
3421 goto leave;
3422 }
3423
3424
3425
3426 if ((lockres->l_blocking == DLM_LOCK_EX)
3427 && (lockres->l_ex_holders || lockres->l_ro_holders)) {
3428 mlog(ML_BASTS, "lockres %s, ReQ: EX/PR Holders %u,%u\n",
3429 lockres->l_name, lockres->l_ex_holders,
3430 lockres->l_ro_holders);
3431 goto leave_requeue;
3432 }
3433
3434
3435
3436 if (lockres->l_blocking == DLM_LOCK_PR &&
3437 lockres->l_ex_holders) {
3438 mlog(ML_BASTS, "lockres %s, ReQ: EX Holders %u\n",
3439 lockres->l_name, lockres->l_ex_holders);
3440 goto leave_requeue;
3441 }
3442
3443
3444
3445
3446
3447 if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
3448 && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) {
3449 mlog(ML_BASTS, "lockres %s, ReQ: Lock Refreshing\n",
3450 lockres->l_name);
3451 goto leave_requeue;
3452 }
3453
3454 new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking);
3455
3456 if (lockres->l_ops->check_downconvert
3457 && !lockres->l_ops->check_downconvert(lockres, new_level)) {
3458 mlog(ML_BASTS, "lockres %s, ReQ: Checkpointing\n",
3459 lockres->l_name);
3460 goto leave_requeue;
3461 }
3462
3463
3464
3465
3466 if (!lockres->l_ops->downconvert_worker)
3467 goto downconvert;
3468
3469
3470
3471
3472
3473 blocking = lockres->l_blocking;
3474 level = lockres->l_level;
3475 spin_unlock_irqrestore(&lockres->l_lock, flags);
3476
3477 ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking);
3478
3479 if (ctl->unblock_action == UNBLOCK_STOP_POST) {
3480 mlog(ML_BASTS, "lockres %s, UNBLOCK_STOP_POST\n",
3481 lockres->l_name);
3482 goto leave;
3483 }
3484
3485 spin_lock_irqsave(&lockres->l_lock, flags);
3486 if ((blocking != lockres->l_blocking) || (level != lockres->l_level)) {
3487
3488
3489 mlog(ML_BASTS, "lockres %s, block=%d:%d, level=%d:%d, "
3490 "Recheck\n", lockres->l_name, blocking,
3491 lockres->l_blocking, level, lockres->l_level);
3492 goto recheck;
3493 }
3494
3495downconvert:
3496 ctl->requeue = 0;
3497
3498 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
3499 if (lockres->l_level == DLM_LOCK_EX)
3500 set_lvb = 1;
3501
3502
3503
3504
3505
3506
3507
3508 if (set_lvb && !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
3509 lockres->l_ops->set_lvb(lockres);
3510 }
3511
3512 gen = ocfs2_prepare_downconvert(lockres, new_level);
3513 spin_unlock_irqrestore(&lockres->l_lock, flags);
3514 ret = ocfs2_downconvert_lock(osb, lockres, new_level, set_lvb,
3515 gen);
3516
3517leave:
3518 if (ret)
3519 mlog_errno(ret);
3520 return ret;
3521
3522leave_requeue:
3523 spin_unlock_irqrestore(&lockres->l_lock, flags);
3524 ctl->requeue = 1;
3525
3526 return 0;
3527}
3528
3529static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
3530 int blocking)
3531{
3532 struct inode *inode;
3533 struct address_space *mapping;
3534 struct ocfs2_inode_info *oi;
3535
3536 inode = ocfs2_lock_res_inode(lockres);
3537 mapping = inode->i_mapping;
3538
3539 if (S_ISDIR(inode->i_mode)) {
3540 oi = OCFS2_I(inode);
3541 oi->ip_dir_lock_gen++;
3542 mlog(0, "generation: %u\n", oi->ip_dir_lock_gen);
3543 goto out;
3544 }
3545
3546 if (!S_ISREG(inode->i_mode))
3547 goto out;
3548
3549
3550
3551
3552
3553
3554
3555
3556 unmap_mapping_range(mapping, 0, 0, 0);
3557
3558 if (filemap_fdatawrite(mapping)) {
3559 mlog(ML_ERROR, "Could not sync inode %llu for downconvert!",
3560 (unsigned long long)OCFS2_I(inode)->ip_blkno);
3561 }
3562 sync_mapping_buffers(mapping);
3563 if (blocking == DLM_LOCK_EX) {
3564 truncate_inode_pages(mapping, 0);
3565 } else {
3566
3567
3568
3569
3570
3571 filemap_fdatawait(mapping);
3572 }
3573
3574out:
3575 return UNBLOCK_CONTINUE;
3576}
3577
3578static int ocfs2_ci_checkpointed(struct ocfs2_caching_info *ci,
3579 struct ocfs2_lock_res *lockres,
3580 int new_level)
3581{
3582 int checkpointed = ocfs2_ci_fully_checkpointed(ci);
3583
3584 BUG_ON(new_level != DLM_LOCK_NL && new_level != DLM_LOCK_PR);
3585 BUG_ON(lockres->l_level != DLM_LOCK_EX && !checkpointed);
3586
3587 if (checkpointed)
3588 return 1;
3589
3590 ocfs2_start_checkpoint(OCFS2_SB(ocfs2_metadata_cache_get_super(ci)));
3591 return 0;
3592}
3593
3594static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres,
3595 int new_level)
3596{
3597 struct inode *inode = ocfs2_lock_res_inode(lockres);
3598
3599 return ocfs2_ci_checkpointed(INODE_CACHE(inode), lockres, new_level);
3600}
3601
3602static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres)
3603{
3604 struct inode *inode = ocfs2_lock_res_inode(lockres);
3605
3606 __ocfs2_stuff_meta_lvb(inode);
3607}
3608
3609
3610
3611
3612
3613
3614static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
3615 struct ocfs2_lock_res *lockres)
3616{
3617 struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
3618 ocfs2_dentry_lock_put(osb, dl);
3619}
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres,
3641 int blocking)
3642{
3643 struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
3644 struct ocfs2_inode_info *oi = OCFS2_I(dl->dl_inode);
3645 struct dentry *dentry;
3646 unsigned long flags;
3647 int extra_ref = 0;
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657 if (blocking == DLM_LOCK_PR)
3658 return UNBLOCK_CONTINUE;
3659
3660
3661
3662
3663
3664
3665 spin_lock(&oi->ip_lock);
3666 oi->ip_flags |= OCFS2_INODE_MAYBE_ORPHANED;
3667 spin_unlock(&oi->ip_lock);
3668
3669
3670
3671
3672
3673
3674
3675 spin_lock_irqsave(&lockres->l_lock, flags);
3676 spin_lock(&dentry_attach_lock);
3677 if (!(lockres->l_flags & OCFS2_LOCK_FREEING)
3678 && dl->dl_count) {
3679 dl->dl_count++;
3680 extra_ref = 1;
3681 }
3682 spin_unlock(&dentry_attach_lock);
3683 spin_unlock_irqrestore(&lockres->l_lock, flags);
3684
3685 mlog(0, "extra_ref = %d\n", extra_ref);
3686
3687
3688
3689
3690
3691
3692 if (!extra_ref)
3693 return UNBLOCK_CONTINUE;
3694
3695 spin_lock(&dentry_attach_lock);
3696 while (1) {
3697 dentry = ocfs2_find_local_alias(dl->dl_inode,
3698 dl->dl_parent_blkno, 1);
3699 if (!dentry)
3700 break;
3701 spin_unlock(&dentry_attach_lock);
3702
3703 mlog(0, "d_delete(%.*s);\n", dentry->d_name.len,
3704 dentry->d_name.name);
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714 d_delete(dentry);
3715 dput(dentry);
3716
3717 spin_lock(&dentry_attach_lock);
3718 }
3719 spin_unlock(&dentry_attach_lock);
3720
3721
3722
3723
3724
3725 if (dl->dl_count == 1)
3726 return UNBLOCK_STOP_POST;
3727
3728 return UNBLOCK_CONTINUE_POST;
3729}
3730
3731static int ocfs2_check_refcount_downconvert(struct ocfs2_lock_res *lockres,
3732 int new_level)
3733{
3734 struct ocfs2_refcount_tree *tree =
3735 ocfs2_lock_res_refcount_tree(lockres);
3736
3737 return ocfs2_ci_checkpointed(&tree->rf_ci, lockres, new_level);
3738}
3739
3740static int ocfs2_refcount_convert_worker(struct ocfs2_lock_res *lockres,
3741 int blocking)
3742{
3743 struct ocfs2_refcount_tree *tree =
3744 ocfs2_lock_res_refcount_tree(lockres);
3745
3746 ocfs2_metadata_cache_purge(&tree->rf_ci);
3747
3748 return UNBLOCK_CONTINUE;
3749}
3750
3751static void ocfs2_set_qinfo_lvb(struct ocfs2_lock_res *lockres)
3752{
3753 struct ocfs2_qinfo_lvb *lvb;
3754 struct ocfs2_mem_dqinfo *oinfo = ocfs2_lock_res_qinfo(lockres);
3755 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
3756 oinfo->dqi_gi.dqi_type);
3757
3758 lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
3759 lvb->lvb_version = OCFS2_QINFO_LVB_VERSION;
3760 lvb->lvb_bgrace = cpu_to_be32(info->dqi_bgrace);
3761 lvb->lvb_igrace = cpu_to_be32(info->dqi_igrace);
3762 lvb->lvb_syncms = cpu_to_be32(oinfo->dqi_syncms);
3763 lvb->lvb_blocks = cpu_to_be32(oinfo->dqi_gi.dqi_blocks);
3764 lvb->lvb_free_blk = cpu_to_be32(oinfo->dqi_gi.dqi_free_blk);
3765 lvb->lvb_free_entry = cpu_to_be32(oinfo->dqi_gi.dqi_free_entry);
3766}
3767
3768void ocfs2_qinfo_unlock(struct ocfs2_mem_dqinfo *oinfo, int ex)
3769{
3770 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3771 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
3772 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3773
3774 if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb))
3775 ocfs2_cluster_unlock(osb, lockres, level);
3776}
3777
3778static int ocfs2_refresh_qinfo(struct ocfs2_mem_dqinfo *oinfo)
3779{
3780 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
3781 oinfo->dqi_gi.dqi_type);
3782 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3783 struct ocfs2_qinfo_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
3784 struct buffer_head *bh = NULL;
3785 struct ocfs2_global_disk_dqinfo *gdinfo;
3786 int status = 0;
3787
3788 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) &&
3789 lvb->lvb_version == OCFS2_QINFO_LVB_VERSION) {
3790 info->dqi_bgrace = be32_to_cpu(lvb->lvb_bgrace);
3791 info->dqi_igrace = be32_to_cpu(lvb->lvb_igrace);
3792 oinfo->dqi_syncms = be32_to_cpu(lvb->lvb_syncms);
3793 oinfo->dqi_gi.dqi_blocks = be32_to_cpu(lvb->lvb_blocks);
3794 oinfo->dqi_gi.dqi_free_blk = be32_to_cpu(lvb->lvb_free_blk);
3795 oinfo->dqi_gi.dqi_free_entry =
3796 be32_to_cpu(lvb->lvb_free_entry);
3797 } else {
3798 status = ocfs2_read_quota_phys_block(oinfo->dqi_gqinode,
3799 oinfo->dqi_giblk, &bh);
3800 if (status) {
3801 mlog_errno(status);
3802 goto bail;
3803 }
3804 gdinfo = (struct ocfs2_global_disk_dqinfo *)
3805 (bh->b_data + OCFS2_GLOBAL_INFO_OFF);
3806 info->dqi_bgrace = le32_to_cpu(gdinfo->dqi_bgrace);
3807 info->dqi_igrace = le32_to_cpu(gdinfo->dqi_igrace);
3808 oinfo->dqi_syncms = le32_to_cpu(gdinfo->dqi_syncms);
3809 oinfo->dqi_gi.dqi_blocks = le32_to_cpu(gdinfo->dqi_blocks);
3810 oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(gdinfo->dqi_free_blk);
3811 oinfo->dqi_gi.dqi_free_entry =
3812 le32_to_cpu(gdinfo->dqi_free_entry);
3813 brelse(bh);
3814 ocfs2_track_lock_refresh(lockres);
3815 }
3816
3817bail:
3818 return status;
3819}
3820
3821
3822
3823int ocfs2_qinfo_lock(struct ocfs2_mem_dqinfo *oinfo, int ex)
3824{
3825 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
3826 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
3827 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3828 int status = 0;
3829
3830
3831 if (ocfs2_is_hard_readonly(osb)) {
3832 if (ex)
3833 status = -EROFS;
3834 goto bail;
3835 }
3836 if (ocfs2_mount_local(osb))
3837 goto bail;
3838
3839 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
3840 if (status < 0) {
3841 mlog_errno(status);
3842 goto bail;
3843 }
3844 if (!ocfs2_should_refresh_lock_res(lockres))
3845 goto bail;
3846
3847 status = ocfs2_refresh_qinfo(oinfo);
3848 if (status)
3849 ocfs2_qinfo_unlock(oinfo, ex);
3850 ocfs2_complete_lock_res_refresh(lockres, status);
3851bail:
3852 return status;
3853}
3854
3855int ocfs2_refcount_lock(struct ocfs2_refcount_tree *ref_tree, int ex)
3856{
3857 int status;
3858 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3859 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
3860 struct ocfs2_super *osb = lockres->l_priv;
3861
3862
3863 if (ocfs2_is_hard_readonly(osb))
3864 return -EROFS;
3865
3866 if (ocfs2_mount_local(osb))
3867 return 0;
3868
3869 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
3870 if (status < 0)
3871 mlog_errno(status);
3872
3873 return status;
3874}
3875
3876void ocfs2_refcount_unlock(struct ocfs2_refcount_tree *ref_tree, int ex)
3877{
3878 int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
3879 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
3880 struct ocfs2_super *osb = lockres->l_priv;
3881
3882 if (!ocfs2_mount_local(osb))
3883 ocfs2_cluster_unlock(osb, lockres, level);
3884}
3885
3886static void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
3887 struct ocfs2_lock_res *lockres)
3888{
3889 int status;
3890 struct ocfs2_unblock_ctl ctl = {0, 0,};
3891 unsigned long flags;
3892
3893
3894
3895
3896
3897 BUG_ON(!lockres);
3898 BUG_ON(!lockres->l_ops);
3899
3900 mlog(ML_BASTS, "lockres %s blocked\n", lockres->l_name);
3901
3902
3903
3904
3905
3906
3907 spin_lock_irqsave(&lockres->l_lock, flags);
3908 if (lockres->l_flags & OCFS2_LOCK_FREEING)
3909 goto unqueue;
3910 spin_unlock_irqrestore(&lockres->l_lock, flags);
3911
3912 status = ocfs2_unblock_lock(osb, lockres, &ctl);
3913 if (status < 0)
3914 mlog_errno(status);
3915
3916 spin_lock_irqsave(&lockres->l_lock, flags);
3917unqueue:
3918 if (lockres->l_flags & OCFS2_LOCK_FREEING || !ctl.requeue) {
3919 lockres_clear_flags(lockres, OCFS2_LOCK_QUEUED);
3920 } else
3921 ocfs2_schedule_blocked_lock(osb, lockres);
3922
3923 mlog(ML_BASTS, "lockres %s, requeue = %s.\n", lockres->l_name,
3924 ctl.requeue ? "yes" : "no");
3925 spin_unlock_irqrestore(&lockres->l_lock, flags);
3926
3927 if (ctl.unblock_action != UNBLOCK_CONTINUE
3928 && lockres->l_ops->post_unlock)
3929 lockres->l_ops->post_unlock(osb, lockres);
3930}
3931
3932static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb,
3933 struct ocfs2_lock_res *lockres)
3934{
3935 unsigned long flags;
3936
3937 assert_spin_locked(&lockres->l_lock);
3938
3939 if (lockres->l_flags & OCFS2_LOCK_FREEING) {
3940
3941
3942
3943 mlog(ML_BASTS, "lockres %s won't be scheduled: flags 0x%lx\n",
3944 lockres->l_name, lockres->l_flags);
3945 return;
3946 }
3947
3948 lockres_or_flags(lockres, OCFS2_LOCK_QUEUED);
3949
3950 spin_lock_irqsave(&osb->dc_task_lock, flags);
3951 if (list_empty(&lockres->l_blocked_list)) {
3952 list_add_tail(&lockres->l_blocked_list,
3953 &osb->blocked_lock_list);
3954 osb->blocked_lock_count++;
3955 }
3956 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
3957}
3958
3959static void ocfs2_downconvert_thread_do_work(struct ocfs2_super *osb)
3960{
3961 unsigned long processed;
3962 unsigned long flags;
3963 struct ocfs2_lock_res *lockres;
3964
3965 spin_lock_irqsave(&osb->dc_task_lock, flags);
3966
3967
3968 osb->dc_work_sequence = osb->dc_wake_sequence;
3969
3970 processed = osb->blocked_lock_count;
3971 while (processed) {
3972 BUG_ON(list_empty(&osb->blocked_lock_list));
3973
3974 lockres = list_entry(osb->blocked_lock_list.next,
3975 struct ocfs2_lock_res, l_blocked_list);
3976 list_del_init(&lockres->l_blocked_list);
3977 osb->blocked_lock_count--;
3978 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
3979
3980 BUG_ON(!processed);
3981 processed--;
3982
3983 ocfs2_process_blocked_lock(osb, lockres);
3984
3985 spin_lock_irqsave(&osb->dc_task_lock, flags);
3986 }
3987 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
3988}
3989
3990static int ocfs2_downconvert_thread_lists_empty(struct ocfs2_super *osb)
3991{
3992 int empty = 0;
3993 unsigned long flags;
3994
3995 spin_lock_irqsave(&osb->dc_task_lock, flags);
3996 if (list_empty(&osb->blocked_lock_list))
3997 empty = 1;
3998
3999 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4000 return empty;
4001}
4002
4003static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb)
4004{
4005 int should_wake = 0;
4006 unsigned long flags;
4007
4008 spin_lock_irqsave(&osb->dc_task_lock, flags);
4009 if (osb->dc_work_sequence != osb->dc_wake_sequence)
4010 should_wake = 1;
4011 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4012
4013 return should_wake;
4014}
4015
4016static int ocfs2_downconvert_thread(void *arg)
4017{
4018 int status = 0;
4019 struct ocfs2_super *osb = arg;
4020
4021
4022
4023 while (!(kthread_should_stop() &&
4024 ocfs2_downconvert_thread_lists_empty(osb))) {
4025
4026 wait_event_interruptible(osb->dc_event,
4027 ocfs2_downconvert_thread_should_wake(osb) ||
4028 kthread_should_stop());
4029
4030 mlog(0, "downconvert_thread: awoken\n");
4031
4032 ocfs2_downconvert_thread_do_work(osb);
4033 }
4034
4035 osb->dc_task = NULL;
4036 return status;
4037}
4038
4039void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb)
4040{
4041 unsigned long flags;
4042
4043 spin_lock_irqsave(&osb->dc_task_lock, flags);
4044
4045
4046 osb->dc_wake_sequence++;
4047 spin_unlock_irqrestore(&osb->dc_task_lock, flags);
4048 wake_up(&osb->dc_event);
4049}
4050