17336d0e6SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2b3b94faaSDavid Teigland /*
3b3b94faaSDavid Teigland * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
4cf45b752SBob Peterson * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
5b3b94faaSDavid Teigland */
6b3b94faaSDavid Teigland
7d77d1b58SJoe Perches #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8d77d1b58SJoe Perches
9b3b94faaSDavid Teigland #include <linux/sched.h>
10b3b94faaSDavid Teigland #include <linux/slab.h>
11b3b94faaSDavid Teigland #include <linux/spinlock.h>
12b3b94faaSDavid Teigland #include <linux/buffer_head.h>
13b3b94faaSDavid Teigland #include <linux/delay.h>
14b3b94faaSDavid Teigland #include <linux/sort.h>
150515480aSAndreas Gruenbacher #include <linux/hash.h>
16b3b94faaSDavid Teigland #include <linux/jhash.h>
17d0dc80dbSSteven Whitehouse #include <linux/kallsyms.h>
185c676f6dSSteven Whitehouse #include <linux/gfs2_ondisk.h>
1924264434SSteven Whitehouse #include <linux/list.h>
20fee852e3SSteven Whitehouse #include <linux/wait.h>
2195d97b7dSakpm@linux-foundation.org #include <linux/module.h>
227c0f6ba6SLinus Torvalds #include <linux/uaccess.h>
237c52b166SRobert Peterson #include <linux/seq_file.h>
247c52b166SRobert Peterson #include <linux/debugfs.h>
258fbbfd21SSteven Whitehouse #include <linux/kthread.h>
268fbbfd21SSteven Whitehouse #include <linux/freezer.h>
27c4f68a13SBenjamin Marzinski #include <linux/workqueue.h>
28c4f68a13SBenjamin Marzinski #include <linux/jiffies.h>
29bc015cb8SSteven Whitehouse #include <linux/rcupdate.h>
30bc015cb8SSteven Whitehouse #include <linux/rculist_bl.h>
31bc015cb8SSteven Whitehouse #include <linux/bit_spinlock.h>
32a245769fSSteven Whitehouse #include <linux/percpu.h>
334506a519SSteven Whitehouse #include <linux/list_sort.h>
34e66cf161SSteven Whitehouse #include <linux/lockref.h>
3588ffbf3eSBob Peterson #include <linux/rhashtable.h>
364480c27cSAndreas Gruenbacher #include <linux/pid_namespace.h>
374480c27cSAndreas Gruenbacher #include <linux/fdtable.h>
384480c27cSAndreas Gruenbacher #include <linux/file.h>
39b3b94faaSDavid Teigland
40b3b94faaSDavid Teigland #include "gfs2.h"
415c676f6dSSteven Whitehouse #include "incore.h"
42b3b94faaSDavid Teigland #include "glock.h"
43b3b94faaSDavid Teigland #include "glops.h"
44b3b94faaSDavid Teigland #include "inode.h"
45b3b94faaSDavid Teigland #include "lops.h"
46b3b94faaSDavid Teigland #include "meta_io.h"
47b3b94faaSDavid Teigland #include "quota.h"
48b3b94faaSDavid Teigland #include "super.h"
495c676f6dSSteven Whitehouse #include "util.h"
50813e0c46SSteven Whitehouse #include "bmap.h"
5163997775SSteven Whitehouse #define CREATE_TRACE_POINTS
5263997775SSteven Whitehouse #include "trace_gfs2.h"
53b3b94faaSDavid Teigland
546802e340SSteven Whitehouse struct gfs2_glock_iter {
557c52b166SRobert Peterson struct gfs2_sbd *sdp; /* incore superblock */
5688ffbf3eSBob Peterson struct rhashtable_iter hti; /* rhashtable iterator */
577c52b166SRobert Peterson struct gfs2_glock *gl; /* current glock struct */
58ba1ddcb6SSteven Whitehouse loff_t last_pos; /* last position */
597c52b166SRobert Peterson };
607c52b166SRobert Peterson
61b3b94faaSDavid Teigland typedef void (*glock_examiner) (struct gfs2_glock * gl);
62b3b94faaSDavid Teigland
636802e340SSteven Whitehouse static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh, unsigned int target);
64dc732906SBob Peterson static void __gfs2_glock_dq(struct gfs2_holder *gh);
6586934198SBob Peterson static void handle_callback(struct gfs2_glock *gl, unsigned int state,
6686934198SBob Peterson unsigned long delay, bool remote);
67c4f68a13SBenjamin Marzinski
687c52b166SRobert Peterson static struct dentry *gfs2_root;
69c4f68a13SBenjamin Marzinski static struct workqueue_struct *glock_workqueue;
7097cc1025SSteven Whitehouse static LIST_HEAD(lru_list);
7197cc1025SSteven Whitehouse static atomic_t lru_count = ATOMIC_INIT(0);
72eb8374e7SJulia Lawall static DEFINE_SPINLOCK(lru_lock);
7308bc2dbcSAdrian Bunk
74b6397893SSteven Whitehouse #define GFS2_GL_HASH_SHIFT 15
7547a9a527SFabian Frederick #define GFS2_GL_HASH_SIZE BIT(GFS2_GL_HASH_SHIFT)
76087efdd3SSteven Whitehouse
77d296b15eSArvind Yadav static const struct rhashtable_params ht_parms = {
7888ffbf3eSBob Peterson .nelem_hint = GFS2_GL_HASH_SIZE * 3 / 4,
79972b044eSAndreas Gruenbacher .key_len = offsetofend(struct lm_lockname, ln_type),
8088ffbf3eSBob Peterson .key_offset = offsetof(struct gfs2_glock, gl_name),
8188ffbf3eSBob Peterson .head_offset = offsetof(struct gfs2_glock, gl_node),
8288ffbf3eSBob Peterson };
83087efdd3SSteven Whitehouse
8488ffbf3eSBob Peterson static struct rhashtable gl_hash_table;
85b3b94faaSDavid Teigland
860515480aSAndreas Gruenbacher #define GLOCK_WAIT_TABLE_BITS 12
870515480aSAndreas Gruenbacher #define GLOCK_WAIT_TABLE_SIZE (1 << GLOCK_WAIT_TABLE_BITS)
880515480aSAndreas Gruenbacher static wait_queue_head_t glock_wait_table[GLOCK_WAIT_TABLE_SIZE] __cacheline_aligned;
890515480aSAndreas Gruenbacher
900515480aSAndreas Gruenbacher struct wait_glock_queue {
910515480aSAndreas Gruenbacher struct lm_lockname *name;
920515480aSAndreas Gruenbacher wait_queue_entry_t wait;
930515480aSAndreas Gruenbacher };
940515480aSAndreas Gruenbacher
glock_wake_function(wait_queue_entry_t * wait,unsigned int mode,int sync,void * key)950515480aSAndreas Gruenbacher static int glock_wake_function(wait_queue_entry_t *wait, unsigned int mode,
960515480aSAndreas Gruenbacher int sync, void *key)
970515480aSAndreas Gruenbacher {
980515480aSAndreas Gruenbacher struct wait_glock_queue *wait_glock =
990515480aSAndreas Gruenbacher container_of(wait, struct wait_glock_queue, wait);
1000515480aSAndreas Gruenbacher struct lm_lockname *wait_name = wait_glock->name;
1010515480aSAndreas Gruenbacher struct lm_lockname *wake_name = key;
1020515480aSAndreas Gruenbacher
1030515480aSAndreas Gruenbacher if (wake_name->ln_sbd != wait_name->ln_sbd ||
1040515480aSAndreas Gruenbacher wake_name->ln_number != wait_name->ln_number ||
1050515480aSAndreas Gruenbacher wake_name->ln_type != wait_name->ln_type)
1060515480aSAndreas Gruenbacher return 0;
1070515480aSAndreas Gruenbacher return autoremove_wake_function(wait, mode, sync, key);
1080515480aSAndreas Gruenbacher }
1090515480aSAndreas Gruenbacher
glock_waitqueue(struct lm_lockname * name)1100515480aSAndreas Gruenbacher static wait_queue_head_t *glock_waitqueue(struct lm_lockname *name)
1110515480aSAndreas Gruenbacher {
112605b0487SAndreas Gruenbacher u32 hash = jhash2((u32 *)name, ht_parms.key_len / 4, 0);
1130515480aSAndreas Gruenbacher
1140515480aSAndreas Gruenbacher return glock_wait_table + hash_32(hash, GLOCK_WAIT_TABLE_BITS);
1150515480aSAndreas Gruenbacher }
1160515480aSAndreas Gruenbacher
1170515480aSAndreas Gruenbacher /**
1180515480aSAndreas Gruenbacher * wake_up_glock - Wake up waiters on a glock
1190515480aSAndreas Gruenbacher * @gl: the glock
1200515480aSAndreas Gruenbacher */
wake_up_glock(struct gfs2_glock * gl)1210515480aSAndreas Gruenbacher static void wake_up_glock(struct gfs2_glock *gl)
1220515480aSAndreas Gruenbacher {
1230515480aSAndreas Gruenbacher wait_queue_head_t *wq = glock_waitqueue(&gl->gl_name);
1240515480aSAndreas Gruenbacher
1250515480aSAndreas Gruenbacher if (waitqueue_active(wq))
1260515480aSAndreas Gruenbacher __wake_up(wq, TASK_NORMAL, 1, &gl->gl_name);
1270515480aSAndreas Gruenbacher }
1280515480aSAndreas Gruenbacher
gfs2_glock_dealloc(struct rcu_head * rcu)129961ae1d8SAndreas Gruenbacher static void gfs2_glock_dealloc(struct rcu_head *rcu)
130b3b94faaSDavid Teigland {
131961ae1d8SAndreas Gruenbacher struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu);
132bc015cb8SSteven Whitehouse
1334e2f8849SDavid Teigland kfree(gl->gl_lksb.sb_lvbptr);
13411d8b79eSKees Cook if (gl->gl_ops->go_flags & GLOF_ASPACE) {
13511d8b79eSKees Cook struct gfs2_glock_aspace *gla =
13611d8b79eSKees Cook container_of(gl, struct gfs2_glock_aspace, glock);
13711d8b79eSKees Cook kmem_cache_free(gfs2_glock_aspace_cachep, gla);
13811d8b79eSKees Cook } else
139bc015cb8SSteven Whitehouse kmem_cache_free(gfs2_glock_cachep, gl);
140fc0e38daSSteven Whitehouse }
141961ae1d8SAndreas Gruenbacher
142a72d2401SBob Peterson /**
143a72d2401SBob Peterson * glock_blocked_by_withdraw - determine if we can still use a glock
144a72d2401SBob Peterson * @gl: the glock
145a72d2401SBob Peterson *
146a72d2401SBob Peterson * We need to allow some glocks to be enqueued, dequeued, promoted, and demoted
147a72d2401SBob Peterson * when we're withdrawn. For example, to maintain metadata integrity, we should
148af1abe11SAndreas Gruenbacher * disallow the use of inode and rgrp glocks when withdrawn. Other glocks like
149af1abe11SAndreas Gruenbacher * the iopen or freeze glock may be safely used because none of their
150a72d2401SBob Peterson * metadata goes through the journal. So in general, we should disallow all
151a72d2401SBob Peterson * glocks that are journaled, and allow all the others. One exception is:
152a72d2401SBob Peterson * we need to allow our active journal to be promoted and demoted so others
153a72d2401SBob Peterson * may recover it and we can reacquire it when they're done.
154a72d2401SBob Peterson */
glock_blocked_by_withdraw(struct gfs2_glock * gl)155a72d2401SBob Peterson static bool glock_blocked_by_withdraw(struct gfs2_glock *gl)
156a72d2401SBob Peterson {
157a72d2401SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
158a72d2401SBob Peterson
159d6b412c5SAndreas Gruenbacher if (!gfs2_withdrawing_or_withdrawn(sdp))
160a72d2401SBob Peterson return false;
161a72d2401SBob Peterson if (gl->gl_ops->go_flags & GLOF_NONDISK)
162a72d2401SBob Peterson return false;
163a72d2401SBob Peterson if (!sdp->sd_jdesc ||
164a72d2401SBob Peterson gl->gl_name.ln_number == sdp->sd_jdesc->jd_no_addr)
165a72d2401SBob Peterson return false;
166a72d2401SBob Peterson return true;
167a72d2401SBob Peterson }
168a72d2401SBob Peterson
__gfs2_glock_free(struct gfs2_glock * gl)1690636b34bSAndreas Gruenbacher static void __gfs2_glock_free(struct gfs2_glock *gl)
170961ae1d8SAndreas Gruenbacher {
1710515480aSAndreas Gruenbacher rhashtable_remove_fast(&gl_hash_table, &gl->gl_node, ht_parms);
1720515480aSAndreas Gruenbacher smp_mb();
1730515480aSAndreas Gruenbacher wake_up_glock(gl);
174961ae1d8SAndreas Gruenbacher call_rcu(&gl->gl_rcu, gfs2_glock_dealloc);
1750636b34bSAndreas Gruenbacher }
1760636b34bSAndreas Gruenbacher
gfs2_glock_free(struct gfs2_glock * gl)1770636b34bSAndreas Gruenbacher void gfs2_glock_free(struct gfs2_glock *gl) {
1780636b34bSAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
1790636b34bSAndreas Gruenbacher
1800636b34bSAndreas Gruenbacher __gfs2_glock_free(gl);
181bc015cb8SSteven Whitehouse if (atomic_dec_and_test(&sdp->sd_glock_disposal))
1823c69c437SAndreas Gruenbacher wake_up(&sdp->sd_kill_wait);
183b3b94faaSDavid Teigland }
184b3b94faaSDavid Teigland
gfs2_glock_free_later(struct gfs2_glock * gl)1850636b34bSAndreas Gruenbacher void gfs2_glock_free_later(struct gfs2_glock *gl) {
1860636b34bSAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
1870636b34bSAndreas Gruenbacher
1880636b34bSAndreas Gruenbacher spin_lock(&lru_lock);
1890636b34bSAndreas Gruenbacher list_add(&gl->gl_lru, &sdp->sd_dead_glocks);
1900636b34bSAndreas Gruenbacher spin_unlock(&lru_lock);
1910636b34bSAndreas Gruenbacher if (atomic_dec_and_test(&sdp->sd_glock_disposal))
1920636b34bSAndreas Gruenbacher wake_up(&sdp->sd_kill_wait);
1930636b34bSAndreas Gruenbacher }
1940636b34bSAndreas Gruenbacher
gfs2_free_dead_glocks(struct gfs2_sbd * sdp)1950636b34bSAndreas Gruenbacher static void gfs2_free_dead_glocks(struct gfs2_sbd *sdp)
1960636b34bSAndreas Gruenbacher {
1970636b34bSAndreas Gruenbacher struct list_head *list = &sdp->sd_dead_glocks;
1980636b34bSAndreas Gruenbacher
1990636b34bSAndreas Gruenbacher while(!list_empty(list)) {
2000636b34bSAndreas Gruenbacher struct gfs2_glock *gl;
2010636b34bSAndreas Gruenbacher
2020636b34bSAndreas Gruenbacher gl = list_first_entry(list, struct gfs2_glock, gl_lru);
2030636b34bSAndreas Gruenbacher list_del_init(&gl->gl_lru);
2040636b34bSAndreas Gruenbacher __gfs2_glock_free(gl);
2050636b34bSAndreas Gruenbacher }
2060636b34bSAndreas Gruenbacher }
2070636b34bSAndreas Gruenbacher
208b3b94faaSDavid Teigland /**
209b3b94faaSDavid Teigland * gfs2_glock_hold() - increment reference count on glock
210b3b94faaSDavid Teigland * @gl: The glock to hold
211b3b94faaSDavid Teigland *
212b3b94faaSDavid Teigland */
213b3b94faaSDavid Teigland
gfs2_glock_hold(struct gfs2_glock * gl)2144ad02083SAndreas Gruenbacher struct gfs2_glock *gfs2_glock_hold(struct gfs2_glock *gl)
215b3b94faaSDavid Teigland {
216e66cf161SSteven Whitehouse GLOCK_BUG_ON(gl, __lockref_is_dead(&gl->gl_lockref));
217e66cf161SSteven Whitehouse lockref_get(&gl->gl_lockref);
2184ad02083SAndreas Gruenbacher return gl;
219b3b94faaSDavid Teigland }
220b3b94faaSDavid Teigland
221b3b94faaSDavid Teigland /**
2228ff22a6fSBenjamin Marzinski * demote_ok - Check to see if it's ok to unlock a glock
2238ff22a6fSBenjamin Marzinski * @gl: the glock
2248ff22a6fSBenjamin Marzinski *
2258ff22a6fSBenjamin Marzinski * Returns: 1 if it's ok
2268ff22a6fSBenjamin Marzinski */
2278ff22a6fSBenjamin Marzinski
demote_ok(const struct gfs2_glock * gl)2288ff22a6fSBenjamin Marzinski static int demote_ok(const struct gfs2_glock *gl)
2298ff22a6fSBenjamin Marzinski {
2308ff22a6fSBenjamin Marzinski const struct gfs2_glock_operations *glops = gl->gl_ops;
2318ff22a6fSBenjamin Marzinski
2328ff22a6fSBenjamin Marzinski if (gl->gl_state == LM_ST_UNLOCKED)
2338ff22a6fSBenjamin Marzinski return 0;
234f42ab085SSteven Whitehouse if (!list_empty(&gl->gl_holders))
2358ff22a6fSBenjamin Marzinski return 0;
2368ff22a6fSBenjamin Marzinski if (glops->go_demote_ok)
2378ff22a6fSBenjamin Marzinski return glops->go_demote_ok(gl);
2388ff22a6fSBenjamin Marzinski return 1;
2398ff22a6fSBenjamin Marzinski }
2408ff22a6fSBenjamin Marzinski
241bc015cb8SSteven Whitehouse
gfs2_glock_add_to_lru(struct gfs2_glock * gl)24229687a2aSSteven Whitehouse void gfs2_glock_add_to_lru(struct gfs2_glock *gl)
24397cc1025SSteven Whitehouse {
2447881ef3fSRoss Lagerwall if (!(gl->gl_ops->go_flags & GLOF_LRU))
2457881ef3fSRoss Lagerwall return;
2467881ef3fSRoss Lagerwall
24797cc1025SSteven Whitehouse spin_lock(&lru_lock);
248bc015cb8SSteven Whitehouse
24938a618dbSBaokun Li list_move_tail(&gl->gl_lru, &lru_list);
2507881ef3fSRoss Lagerwall
2517881ef3fSRoss Lagerwall if (!test_bit(GLF_LRU, &gl->gl_flags)) {
252627c10b7SSteven Whitehouse set_bit(GLF_LRU, &gl->gl_flags);
2537881ef3fSRoss Lagerwall atomic_inc(&lru_count);
2547881ef3fSRoss Lagerwall }
2557881ef3fSRoss Lagerwall
25697cc1025SSteven Whitehouse spin_unlock(&lru_lock);
25797cc1025SSteven Whitehouse }
258bc015cb8SSteven Whitehouse
gfs2_glock_remove_from_lru(struct gfs2_glock * gl)2598f6cb409SBob Peterson static void gfs2_glock_remove_from_lru(struct gfs2_glock *gl)
260f42ab085SSteven Whitehouse {
261645ebd49SBob Peterson if (!(gl->gl_ops->go_flags & GLOF_LRU))
262645ebd49SBob Peterson return;
263645ebd49SBob Peterson
2648f6cb409SBob Peterson spin_lock(&lru_lock);
2657881ef3fSRoss Lagerwall if (test_bit(GLF_LRU, &gl->gl_flags)) {
266f42ab085SSteven Whitehouse list_del_init(&gl->gl_lru);
267f42ab085SSteven Whitehouse atomic_dec(&lru_count);
268f42ab085SSteven Whitehouse clear_bit(GLF_LRU, &gl->gl_flags);
269f42ab085SSteven Whitehouse }
270f42ab085SSteven Whitehouse spin_unlock(&lru_lock);
271f42ab085SSteven Whitehouse }
272f42ab085SSteven Whitehouse
2736b0c7440SAndreas Gruenbacher /*
2746b0c7440SAndreas Gruenbacher * Enqueue the glock on the work queue. Passes one glock reference on to the
2756b0c7440SAndreas Gruenbacher * work queue.
276b3b94faaSDavid Teigland */
gfs2_glock_queue_work(struct gfs2_glock * gl,unsigned long delay)277*d7f0c4c9SAndreas Gruenbacher static void gfs2_glock_queue_work(struct gfs2_glock *gl, unsigned long delay) {
2786b0c7440SAndreas Gruenbacher if (!queue_delayed_work(glock_workqueue, &gl->gl_work, delay)) {
2796b0c7440SAndreas Gruenbacher /*
2806b0c7440SAndreas Gruenbacher * We are holding the lockref spinlock, and the work was still
2816b0c7440SAndreas Gruenbacher * queued above. The queued work (glock_work_func) takes that
2826b0c7440SAndreas Gruenbacher * spinlock before dropping its glock reference(s), so it
2836b0c7440SAndreas Gruenbacher * cannot have dropped them in the meantime.
2846b0c7440SAndreas Gruenbacher */
2856b0c7440SAndreas Gruenbacher GLOCK_BUG_ON(gl, gl->gl_lockref.count < 2);
2866b0c7440SAndreas Gruenbacher gl->gl_lockref.count--;
2876b0c7440SAndreas Gruenbacher }
2886b0c7440SAndreas Gruenbacher }
289b3b94faaSDavid Teigland
__gfs2_glock_put(struct gfs2_glock * gl)2906b0c7440SAndreas Gruenbacher static void __gfs2_glock_put(struct gfs2_glock *gl)
291b3b94faaSDavid Teigland {
29215562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
293bc015cb8SSteven Whitehouse struct address_space *mapping = gfs2_glock2aspace(gl);
294b3b94faaSDavid Teigland
295e66cf161SSteven Whitehouse lockref_mark_dead(&gl->gl_lockref);
296e66cf161SSteven Whitehouse spin_unlock(&gl->gl_lockref.lock);
297228804a3SAndreas Gruenbacher gfs2_glock_remove_from_lru(gl);
2986802e340SSteven Whitehouse GLOCK_BUG_ON(gl, !list_empty(&gl->gl_holders));
299ee1e2c77SBob Peterson if (mapping) {
300ee1e2c77SBob Peterson truncate_inode_pages_final(mapping);
301d6b412c5SAndreas Gruenbacher if (!gfs2_withdrawing_or_withdrawn(sdp))
3027716506aSMatthew Wilcox (Oracle) GLOCK_BUG_ON(gl, !mapping_empty(mapping));
303ee1e2c77SBob Peterson }
304bc015cb8SSteven Whitehouse trace_gfs2_glock_put(gl);
305bc015cb8SSteven Whitehouse sdp->sd_lockstruct.ls_ops->lm_put_lock(gl);
306b3b94faaSDavid Teigland }
307b3b94faaSDavid Teigland
308b3b94faaSDavid Teigland /**
3096b0c7440SAndreas Gruenbacher * gfs2_glock_put() - Decrement reference count on glock
3106b0c7440SAndreas Gruenbacher * @gl: The glock to put
3116b0c7440SAndreas Gruenbacher *
3126b0c7440SAndreas Gruenbacher */
3136b0c7440SAndreas Gruenbacher
gfs2_glock_put(struct gfs2_glock * gl)3146b0c7440SAndreas Gruenbacher void gfs2_glock_put(struct gfs2_glock *gl)
3156b0c7440SAndreas Gruenbacher {
3166b0c7440SAndreas Gruenbacher if (lockref_put_or_lock(&gl->gl_lockref))
3176b0c7440SAndreas Gruenbacher return;
3186b0c7440SAndreas Gruenbacher
3196b0c7440SAndreas Gruenbacher __gfs2_glock_put(gl);
3206b0c7440SAndreas Gruenbacher }
3216b0c7440SAndreas Gruenbacher
32239822f7fSAndreas Gruenbacher /*
32339822f7fSAndreas Gruenbacher * gfs2_glock_put_async - Decrement reference count without sleeping
32439822f7fSAndreas Gruenbacher * @gl: The glock to put
32539822f7fSAndreas Gruenbacher *
32639822f7fSAndreas Gruenbacher * Decrement the reference count on glock immediately unless it is the last
32739822f7fSAndreas Gruenbacher * reference. Defer putting the last reference to work queue context.
32839822f7fSAndreas Gruenbacher */
gfs2_glock_put_async(struct gfs2_glock * gl)32939822f7fSAndreas Gruenbacher void gfs2_glock_put_async(struct gfs2_glock *gl)
33039822f7fSAndreas Gruenbacher {
33139822f7fSAndreas Gruenbacher if (lockref_put_or_lock(&gl->gl_lockref))
33239822f7fSAndreas Gruenbacher return;
33339822f7fSAndreas Gruenbacher
334*d7f0c4c9SAndreas Gruenbacher GLOCK_BUG_ON(gl, gl->gl_lockref.count != 1);
335*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
33639822f7fSAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
33739822f7fSAndreas Gruenbacher }
33839822f7fSAndreas Gruenbacher
3396b0c7440SAndreas Gruenbacher /**
34061444649SAndreas Gruenbacher * may_grant - check if it's ok to grant a new lock
3416802e340SSteven Whitehouse * @gl: The glock
34261444649SAndreas Gruenbacher * @current_gh: One of the current holders of @gl
3436802e340SSteven Whitehouse * @gh: The lock request which we wish to grant
3446802e340SSteven Whitehouse *
34561444649SAndreas Gruenbacher * With our current compatibility rules, if a glock has one or more active
34661444649SAndreas Gruenbacher * holders (HIF_HOLDER flag set), any of those holders can be passed in as
34761444649SAndreas Gruenbacher * @current_gh; they are all the same as far as compatibility with the new @gh
34861444649SAndreas Gruenbacher * goes.
34961444649SAndreas Gruenbacher *
35061444649SAndreas Gruenbacher * Returns true if it's ok to grant the lock.
3516802e340SSteven Whitehouse */
3526802e340SSteven Whitehouse
may_grant(struct gfs2_glock * gl,struct gfs2_holder * current_gh,struct gfs2_holder * gh)35361444649SAndreas Gruenbacher static inline bool may_grant(struct gfs2_glock *gl,
35461444649SAndreas Gruenbacher struct gfs2_holder *current_gh,
35561444649SAndreas Gruenbacher struct gfs2_holder *gh)
356c4f68a13SBenjamin Marzinski {
35761444649SAndreas Gruenbacher if (current_gh) {
35861444649SAndreas Gruenbacher GLOCK_BUG_ON(gl, !test_bit(HIF_HOLDER, ¤t_gh->gh_iflags));
35906e908cdSBob Peterson
36061444649SAndreas Gruenbacher switch(current_gh->gh_state) {
36161444649SAndreas Gruenbacher case LM_ST_EXCLUSIVE:
36261444649SAndreas Gruenbacher /*
36361444649SAndreas Gruenbacher * Here we make a special exception to grant holders
36461444649SAndreas Gruenbacher * who agree to share the EX lock with other holders
36561444649SAndreas Gruenbacher * who also have the bit set. If the original holder
36661444649SAndreas Gruenbacher * has the LM_FLAG_NODE_SCOPE bit set, we grant more
36761444649SAndreas Gruenbacher * holders with the bit set.
36806e908cdSBob Peterson */
36961444649SAndreas Gruenbacher return gh->gh_state == LM_ST_EXCLUSIVE &&
37061444649SAndreas Gruenbacher (current_gh->gh_flags & LM_FLAG_NODE_SCOPE) &&
37161444649SAndreas Gruenbacher (gh->gh_flags & LM_FLAG_NODE_SCOPE);
37261444649SAndreas Gruenbacher
37361444649SAndreas Gruenbacher case LM_ST_SHARED:
37461444649SAndreas Gruenbacher case LM_ST_DEFERRED:
37561444649SAndreas Gruenbacher return gh->gh_state == current_gh->gh_state;
37661444649SAndreas Gruenbacher
37761444649SAndreas Gruenbacher default:
37861444649SAndreas Gruenbacher return false;
37906e908cdSBob Peterson }
38061444649SAndreas Gruenbacher }
38161444649SAndreas Gruenbacher
3826802e340SSteven Whitehouse if (gl->gl_state == gh->gh_state)
38361444649SAndreas Gruenbacher return true;
3846802e340SSteven Whitehouse if (gh->gh_flags & GL_EXACT)
38561444649SAndreas Gruenbacher return false;
386209806abSSteven Whitehouse if (gl->gl_state == LM_ST_EXCLUSIVE) {
38761444649SAndreas Gruenbacher return gh->gh_state == LM_ST_SHARED ||
38861444649SAndreas Gruenbacher gh->gh_state == LM_ST_DEFERRED;
389209806abSSteven Whitehouse }
39061444649SAndreas Gruenbacher if (gh->gh_flags & LM_FLAG_ANY)
39161444649SAndreas Gruenbacher return gl->gl_state != LM_ST_UNLOCKED;
39261444649SAndreas Gruenbacher return false;
3936802e340SSteven Whitehouse }
3946802e340SSteven Whitehouse
gfs2_holder_wake(struct gfs2_holder * gh)3956802e340SSteven Whitehouse static void gfs2_holder_wake(struct gfs2_holder *gh)
3966802e340SSteven Whitehouse {
3976802e340SSteven Whitehouse clear_bit(HIF_WAIT, &gh->gh_iflags);
3984e857c58SPeter Zijlstra smp_mb__after_atomic();
3996802e340SSteven Whitehouse wake_up_bit(&gh->gh_iflags, HIF_WAIT);
400ad26967bSBob Peterson if (gh->gh_flags & GL_ASYNC) {
401ad26967bSBob Peterson struct gfs2_sbd *sdp = gh->gh_gl->gl_name.ln_sbd;
402ad26967bSBob Peterson
403ad26967bSBob Peterson wake_up(&sdp->sd_async_glock_wait);
404ad26967bSBob Peterson }
4056802e340SSteven Whitehouse }
4066802e340SSteven Whitehouse
4076802e340SSteven Whitehouse /**
408d5341a92SSteven Whitehouse * do_error - Something unexpected has happened during a lock request
409c551f66cSLee Jones * @gl: The glock
410c551f66cSLee Jones * @ret: The status from the DLM
411d5341a92SSteven Whitehouse */
412d5341a92SSteven Whitehouse
do_error(struct gfs2_glock * gl,const int ret)413a527b38eSDenys Vlasenko static void do_error(struct gfs2_glock *gl, const int ret)
414d5341a92SSteven Whitehouse {
415d5341a92SSteven Whitehouse struct gfs2_holder *gh, *tmp;
416d5341a92SSteven Whitehouse
417d5341a92SSteven Whitehouse list_for_each_entry_safe(gh, tmp, &gl->gl_holders, gh_list) {
418ba3e77a4SAndreas Gruenbacher if (test_bit(HIF_HOLDER, &gh->gh_iflags))
419d5341a92SSteven Whitehouse continue;
420d5341a92SSteven Whitehouse if (ret & LM_OUT_ERROR)
421d5341a92SSteven Whitehouse gh->gh_error = -EIO;
422d5341a92SSteven Whitehouse else if (gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))
423d5341a92SSteven Whitehouse gh->gh_error = GLR_TRYFAILED;
424d5341a92SSteven Whitehouse else
425d5341a92SSteven Whitehouse continue;
426d5341a92SSteven Whitehouse list_del_init(&gh->gh_list);
427d5341a92SSteven Whitehouse trace_gfs2_glock_queue(gh, 0);
428d5341a92SSteven Whitehouse gfs2_holder_wake(gh);
429d5341a92SSteven Whitehouse }
430d5341a92SSteven Whitehouse }
431d5341a92SSteven Whitehouse
432d5341a92SSteven Whitehouse /**
43361444649SAndreas Gruenbacher * find_first_holder - find the first "holder" gh
43461444649SAndreas Gruenbacher * @gl: the glock
43561444649SAndreas Gruenbacher */
43661444649SAndreas Gruenbacher
find_first_holder(const struct gfs2_glock * gl)43761444649SAndreas Gruenbacher static inline struct gfs2_holder *find_first_holder(const struct gfs2_glock *gl)
43861444649SAndreas Gruenbacher {
43961444649SAndreas Gruenbacher struct gfs2_holder *gh;
44061444649SAndreas Gruenbacher
44161444649SAndreas Gruenbacher if (!list_empty(&gl->gl_holders)) {
44261444649SAndreas Gruenbacher gh = list_first_entry(&gl->gl_holders, struct gfs2_holder,
44361444649SAndreas Gruenbacher gh_list);
44461444649SAndreas Gruenbacher if (test_bit(HIF_HOLDER, &gh->gh_iflags))
44561444649SAndreas Gruenbacher return gh;
44661444649SAndreas Gruenbacher }
44761444649SAndreas Gruenbacher return NULL;
44861444649SAndreas Gruenbacher }
44961444649SAndreas Gruenbacher
450e6f85600SBob Peterson /*
451e6f85600SBob Peterson * gfs2_instantiate - Call the glops instantiate function
4523c5c67ecSAndreas Gruenbacher * @gh: The glock holder
453e6f85600SBob Peterson *
45453d69132SAndreas Gruenbacher * Returns: 0 if instantiate was successful, or error.
455e6f85600SBob Peterson */
gfs2_instantiate(struct gfs2_holder * gh)456f2e70d8fSBob Peterson int gfs2_instantiate(struct gfs2_holder *gh)
457e6f85600SBob Peterson {
458e6f85600SBob Peterson struct gfs2_glock *gl = gh->gh_gl;
459e6f85600SBob Peterson const struct gfs2_glock_operations *glops = gl->gl_ops;
460f2e70d8fSBob Peterson int ret;
461e6f85600SBob Peterson
462f2e70d8fSBob Peterson again:
463f2e70d8fSBob Peterson if (!test_bit(GLF_INSTANTIATE_NEEDED, &gl->gl_flags))
46486c30a01SAndreas Gruenbacher goto done;
465f2e70d8fSBob Peterson
466f2e70d8fSBob Peterson /*
467f2e70d8fSBob Peterson * Since we unlock the lockref lock, we set a flag to indicate
468f2e70d8fSBob Peterson * instantiate is in progress.
469f2e70d8fSBob Peterson */
4707a92deaaSAndreas Gruenbacher if (test_and_set_bit(GLF_INSTANTIATE_IN_PROG, &gl->gl_flags)) {
471f2e70d8fSBob Peterson wait_on_bit(&gl->gl_flags, GLF_INSTANTIATE_IN_PROG,
472f2e70d8fSBob Peterson TASK_UNINTERRUPTIBLE);
473f2e70d8fSBob Peterson /*
474f2e70d8fSBob Peterson * Here we just waited for a different instantiate to finish.
475f2e70d8fSBob Peterson * But that may not have been successful, as when a process
476f2e70d8fSBob Peterson * locks an inode glock _before_ it has an actual inode to
477f2e70d8fSBob Peterson * instantiate into. So we check again. This process might
478f2e70d8fSBob Peterson * have an inode to instantiate, so might be successful.
479f2e70d8fSBob Peterson */
480f2e70d8fSBob Peterson goto again;
481f2e70d8fSBob Peterson }
482f2e70d8fSBob Peterson
4835f38a4d3SAndreas Gruenbacher ret = glops->go_instantiate(gl);
484f2e70d8fSBob Peterson if (!ret)
485f2e70d8fSBob Peterson clear_bit(GLF_INSTANTIATE_NEEDED, &gl->gl_flags);
4867a92deaaSAndreas Gruenbacher clear_and_wake_up_bit(GLF_INSTANTIATE_IN_PROG, &gl->gl_flags);
48786c30a01SAndreas Gruenbacher if (ret)
488f2e70d8fSBob Peterson return ret;
48986c30a01SAndreas Gruenbacher
49086c30a01SAndreas Gruenbacher done:
49186c30a01SAndreas Gruenbacher if (glops->go_held)
49286c30a01SAndreas Gruenbacher return glops->go_held(gh);
49386c30a01SAndreas Gruenbacher return 0;
494e6f85600SBob Peterson }
495e6f85600SBob Peterson
496dc732906SBob Peterson /**
4976802e340SSteven Whitehouse * do_promote - promote as many requests as possible on the current queue
4986802e340SSteven Whitehouse * @gl: The glock
4996802e340SSteven Whitehouse *
500de3e7f97SAndreas Gruenbacher * Returns true on success (i.e., progress was made or there are no waiters).
5016802e340SSteven Whitehouse */
5026802e340SSteven Whitehouse
do_promote(struct gfs2_glock * gl)503de3e7f97SAndreas Gruenbacher static bool do_promote(struct gfs2_glock *gl)
5046802e340SSteven Whitehouse {
5056feaec81SAndreas Gruenbacher struct gfs2_holder *gh, *current_gh;
5066802e340SSteven Whitehouse
507ba3e77a4SAndreas Gruenbacher current_gh = find_first_holder(gl);
5086feaec81SAndreas Gruenbacher list_for_each_entry(gh, &gl->gl_holders, gh_list) {
50960d8bae9SBob Peterson if (test_bit(HIF_HOLDER, &gh->gh_iflags))
5106802e340SSteven Whitehouse continue;
5118f0028fcSAndreas Gruenbacher if (!may_grant(gl, current_gh, gh)) {
51217a6eceeSBob Peterson /*
513565f82b5SBob Peterson * If we get here, it means we may not grant this
514565f82b5SBob Peterson * holder for some reason. If this holder is at the
515565f82b5SBob Peterson * head of the list, it means we have a blocked holder
516de3e7f97SAndreas Gruenbacher * at the head, so return false.
51717a6eceeSBob Peterson */
5185a27a43eSAndreas Gruenbacher if (list_is_first(&gh->gh_list, &gl->gl_holders))
519de3e7f97SAndreas Gruenbacher return false;
52017a6eceeSBob Peterson do_error(gl, 0);
52117a6eceeSBob Peterson break;
52217a6eceeSBob Peterson }
5236802e340SSteven Whitehouse set_bit(HIF_HOLDER, &gh->gh_iflags);
524d74d0ce5SAndreas Gruenbacher trace_gfs2_promote(gh);
5256802e340SSteven Whitehouse gfs2_holder_wake(gh);
526ba3e77a4SAndreas Gruenbacher if (!current_gh)
5270befb851SBob Peterson current_gh = gh;
5286802e340SSteven Whitehouse }
529de3e7f97SAndreas Gruenbacher return true;
5306802e340SSteven Whitehouse }
5316802e340SSteven Whitehouse
5326802e340SSteven Whitehouse /**
5336802e340SSteven Whitehouse * find_first_waiter - find the first gh that's waiting for the glock
5346802e340SSteven Whitehouse * @gl: the glock
5356802e340SSteven Whitehouse */
5366802e340SSteven Whitehouse
find_first_waiter(const struct gfs2_glock * gl)5376802e340SSteven Whitehouse static inline struct gfs2_holder *find_first_waiter(const struct gfs2_glock *gl)
5386802e340SSteven Whitehouse {
5396802e340SSteven Whitehouse struct gfs2_holder *gh;
5406802e340SSteven Whitehouse
5416802e340SSteven Whitehouse list_for_each_entry(gh, &gl->gl_holders, gh_list) {
5426802e340SSteven Whitehouse if (!test_bit(HIF_HOLDER, &gh->gh_iflags))
5436802e340SSteven Whitehouse return gh;
5446802e340SSteven Whitehouse }
5456802e340SSteven Whitehouse return NULL;
5466802e340SSteven Whitehouse }
5476802e340SSteven Whitehouse
5486802e340SSteven Whitehouse /**
5496802e340SSteven Whitehouse * state_change - record that the glock is now in a different state
5506802e340SSteven Whitehouse * @gl: the glock
551c551f66cSLee Jones * @new_state: the new state
5526802e340SSteven Whitehouse */
5536802e340SSteven Whitehouse
state_change(struct gfs2_glock * gl,unsigned int new_state)5546802e340SSteven Whitehouse static void state_change(struct gfs2_glock *gl, unsigned int new_state)
5556802e340SSteven Whitehouse {
5566802e340SSteven Whitehouse int held1, held2;
5576802e340SSteven Whitehouse
5586802e340SSteven Whitehouse held1 = (gl->gl_state != LM_ST_UNLOCKED);
5596802e340SSteven Whitehouse held2 = (new_state != LM_ST_UNLOCKED);
5606802e340SSteven Whitehouse
5616802e340SSteven Whitehouse if (held1 != held2) {
562e66cf161SSteven Whitehouse GLOCK_BUG_ON(gl, __lockref_is_dead(&gl->gl_lockref));
5636802e340SSteven Whitehouse if (held2)
564e66cf161SSteven Whitehouse gl->gl_lockref.count++;
5656802e340SSteven Whitehouse else
566e66cf161SSteven Whitehouse gl->gl_lockref.count--;
5676802e340SSteven Whitehouse }
5687cf8dcd3SBob Peterson if (new_state != gl->gl_target)
5697cf8dcd3SBob Peterson /* shorten our minimum hold time */
5707cf8dcd3SBob Peterson gl->gl_hold_time = max(gl->gl_hold_time - GL_GLOCK_HOLD_DECR,
5717cf8dcd3SBob Peterson GL_GLOCK_MIN_HOLD);
5726802e340SSteven Whitehouse gl->gl_state = new_state;
5736802e340SSteven Whitehouse gl->gl_tchange = jiffies;
5746802e340SSteven Whitehouse }
5756802e340SSteven Whitehouse
gfs2_set_demote(struct gfs2_glock * gl)57635b6f8fbSAndreas Gruenbacher static void gfs2_set_demote(struct gfs2_glock *gl)
57735b6f8fbSAndreas Gruenbacher {
57835b6f8fbSAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
57935b6f8fbSAndreas Gruenbacher
58035b6f8fbSAndreas Gruenbacher set_bit(GLF_DEMOTE, &gl->gl_flags);
58135b6f8fbSAndreas Gruenbacher smp_mb();
58235b6f8fbSAndreas Gruenbacher wake_up(&sdp->sd_async_glock_wait);
58335b6f8fbSAndreas Gruenbacher }
58435b6f8fbSAndreas Gruenbacher
gfs2_demote_wake(struct gfs2_glock * gl)5856802e340SSteven Whitehouse static void gfs2_demote_wake(struct gfs2_glock *gl)
5866802e340SSteven Whitehouse {
5876802e340SSteven Whitehouse gl->gl_demote_state = LM_ST_EXCLUSIVE;
5886802e340SSteven Whitehouse clear_bit(GLF_DEMOTE, &gl->gl_flags);
5894e857c58SPeter Zijlstra smp_mb__after_atomic();
5906802e340SSteven Whitehouse wake_up_bit(&gl->gl_flags, GLF_DEMOTE);
5916802e340SSteven Whitehouse }
5926802e340SSteven Whitehouse
5936802e340SSteven Whitehouse /**
5946802e340SSteven Whitehouse * finish_xmote - The DLM has replied to one of our lock requests
5956802e340SSteven Whitehouse * @gl: The glock
5966802e340SSteven Whitehouse * @ret: The status from the DLM
5976802e340SSteven Whitehouse *
5986802e340SSteven Whitehouse */
5996802e340SSteven Whitehouse
finish_xmote(struct gfs2_glock * gl,unsigned int ret)6006802e340SSteven Whitehouse static void finish_xmote(struct gfs2_glock *gl, unsigned int ret)
6016802e340SSteven Whitehouse {
6026802e340SSteven Whitehouse const struct gfs2_glock_operations *glops = gl->gl_ops;
6036802e340SSteven Whitehouse struct gfs2_holder *gh;
6046802e340SSteven Whitehouse unsigned state = ret & LM_OUT_ST_MASK;
605c4f68a13SBenjamin Marzinski
60663997775SSteven Whitehouse trace_gfs2_glock_state_change(gl, state);
6076802e340SSteven Whitehouse state_change(gl, state);
6086802e340SSteven Whitehouse gh = find_first_waiter(gl);
6096802e340SSteven Whitehouse
6106802e340SSteven Whitehouse /* Demote to UN request arrived during demote to SH or DF */
6116802e340SSteven Whitehouse if (test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags) &&
6126802e340SSteven Whitehouse state != LM_ST_UNLOCKED && gl->gl_demote_state == LM_ST_UNLOCKED)
6136802e340SSteven Whitehouse gl->gl_target = LM_ST_UNLOCKED;
6146802e340SSteven Whitehouse
6156802e340SSteven Whitehouse /* Check for state != intended state */
6166802e340SSteven Whitehouse if (unlikely(state != gl->gl_target)) {
6171fc05c8dSAndreas Gruenbacher if (gh && (ret & LM_OUT_CANCELED))
6181fc05c8dSAndreas Gruenbacher gfs2_holder_wake(gh);
6196802e340SSteven Whitehouse if (gh && !test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)) {
6206802e340SSteven Whitehouse /* move to back of queue and try next entry */
6216802e340SSteven Whitehouse if (ret & LM_OUT_CANCELED) {
6226802e340SSteven Whitehouse list_move_tail(&gh->gh_list, &gl->gl_holders);
6236802e340SSteven Whitehouse gh = find_first_waiter(gl);
6246802e340SSteven Whitehouse gl->gl_target = gh->gh_state;
62566fa9912SBob Peterson if (do_promote(gl))
62666fa9912SBob Peterson goto out;
6276802e340SSteven Whitehouse goto retry;
6286802e340SSteven Whitehouse }
6296802e340SSteven Whitehouse /* Some error or failed "try lock" - report it */
6306802e340SSteven Whitehouse if ((ret & LM_OUT_ERROR) ||
6316802e340SSteven Whitehouse (gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))) {
6326802e340SSteven Whitehouse gl->gl_target = gl->gl_state;
6336802e340SSteven Whitehouse do_error(gl, ret);
6346802e340SSteven Whitehouse goto out;
6356802e340SSteven Whitehouse }
6366802e340SSteven Whitehouse }
6376802e340SSteven Whitehouse switch(state) {
6386802e340SSteven Whitehouse /* Unlocked due to conversion deadlock, try again */
6396802e340SSteven Whitehouse case LM_ST_UNLOCKED:
6406802e340SSteven Whitehouse retry:
6416802e340SSteven Whitehouse do_xmote(gl, gh, gl->gl_target);
6426802e340SSteven Whitehouse break;
6436802e340SSteven Whitehouse /* Conversion fails, unlock and try again */
6446802e340SSteven Whitehouse case LM_ST_SHARED:
6456802e340SSteven Whitehouse case LM_ST_DEFERRED:
6466802e340SSteven Whitehouse do_xmote(gl, gh, LM_ST_UNLOCKED);
6476802e340SSteven Whitehouse break;
6486802e340SSteven Whitehouse default: /* Everything else */
649e54c78a2SBob Peterson fs_err(gl->gl_name.ln_sbd, "wanted %u got %u\n",
650e54c78a2SBob Peterson gl->gl_target, state);
6516802e340SSteven Whitehouse GLOCK_BUG_ON(gl, 1);
6526802e340SSteven Whitehouse }
6536802e340SSteven Whitehouse return;
6546802e340SSteven Whitehouse }
6556802e340SSteven Whitehouse
6566802e340SSteven Whitehouse /* Fast path - we got what we asked for */
6576802e340SSteven Whitehouse if (test_and_clear_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags))
6586802e340SSteven Whitehouse gfs2_demote_wake(gl);
6596802e340SSteven Whitehouse if (state != LM_ST_UNLOCKED) {
6606802e340SSteven Whitehouse if (glops->go_xmote_bh) {
661de3f906fSAndreas Gruenbacher int rv;
662de3f906fSAndreas Gruenbacher
663f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
664f68effb3SBob Peterson rv = glops->go_xmote_bh(gl);
665f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
6666802e340SSteven Whitehouse if (rv) {
6676802e340SSteven Whitehouse do_error(gl, rv);
6686802e340SSteven Whitehouse goto out;
6696802e340SSteven Whitehouse }
6706802e340SSteven Whitehouse }
671de3f906fSAndreas Gruenbacher do_promote(gl);
6726802e340SSteven Whitehouse }
6736802e340SSteven Whitehouse out:
6746802e340SSteven Whitehouse clear_bit(GLF_LOCK, &gl->gl_flags);
6756802e340SSteven Whitehouse }
6766802e340SSteven Whitehouse
is_system_glock(struct gfs2_glock * gl)677865cc3e9SBob Peterson static bool is_system_glock(struct gfs2_glock *gl)
678865cc3e9SBob Peterson {
679865cc3e9SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
680865cc3e9SBob Peterson struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
681865cc3e9SBob Peterson
682865cc3e9SBob Peterson if (gl == m_ip->i_gl)
683865cc3e9SBob Peterson return true;
684865cc3e9SBob Peterson return false;
685865cc3e9SBob Peterson }
686865cc3e9SBob Peterson
6876802e340SSteven Whitehouse /**
6886802e340SSteven Whitehouse * do_xmote - Calls the DLM to change the state of a lock
6896802e340SSteven Whitehouse * @gl: The lock state
6906802e340SSteven Whitehouse * @gh: The holder (only for promotes)
6916802e340SSteven Whitehouse * @target: The target lock state
6926802e340SSteven Whitehouse *
6936802e340SSteven Whitehouse */
6946802e340SSteven Whitehouse
do_xmote(struct gfs2_glock * gl,struct gfs2_holder * gh,unsigned int target)69586934198SBob Peterson static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh,
69686934198SBob Peterson unsigned int target)
697f3dd1649SAndreas Gruenbacher __releases(&gl->gl_lockref.lock)
698f3dd1649SAndreas Gruenbacher __acquires(&gl->gl_lockref.lock)
6996802e340SSteven Whitehouse {
7006802e340SSteven Whitehouse const struct gfs2_glock_operations *glops = gl->gl_ops;
70115562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
702e19681aeSAndreas Gruenbacher struct lm_lockstruct *ls = &sdp->sd_lockstruct;
703b58bf407SBob Peterson unsigned int lck_flags = (unsigned int)(gh ? gh->gh_flags : 0);
7046802e340SSteven Whitehouse int ret;
7056802e340SSteven Whitehouse
706601ef0d5SBob Peterson if (target != LM_ST_UNLOCKED && glock_blocked_by_withdraw(gl) &&
707601ef0d5SBob Peterson gh && !(gh->gh_flags & LM_FLAG_NOEXP))
70886934198SBob Peterson goto skip_inval;
70986934198SBob Peterson
7100b93bac2SAndreas Gruenbacher lck_flags &= (LM_FLAG_TRY | LM_FLAG_TRY_1CB | LM_FLAG_NOEXP);
711921169caSSteven Whitehouse GLOCK_BUG_ON(gl, gl->gl_state == target);
712921169caSSteven Whitehouse GLOCK_BUG_ON(gl, gl->gl_state == gl->gl_target);
7136802e340SSteven Whitehouse if ((target == LM_ST_UNLOCKED || target == LM_ST_DEFERRED) &&
7146802e340SSteven Whitehouse glops->go_inval) {
715d99724c3SBob Peterson /*
716d99724c3SBob Peterson * If another process is already doing the invalidate, let that
717d99724c3SBob Peterson * finish first. The glock state machine will get back to this
718d99724c3SBob Peterson * holder again later.
719d99724c3SBob Peterson */
720d99724c3SBob Peterson if (test_and_set_bit(GLF_INVALIDATE_IN_PROGRESS,
721d99724c3SBob Peterson &gl->gl_flags))
722d99724c3SBob Peterson return;
7236802e340SSteven Whitehouse do_error(gl, 0); /* Fail queued try locks */
7246802e340SSteven Whitehouse }
72547a25380SSteven Whitehouse gl->gl_req = target;
726a245769fSSteven Whitehouse set_bit(GLF_BLOCKING, &gl->gl_flags);
727a245769fSSteven Whitehouse if ((gl->gl_req == LM_ST_UNLOCKED) ||
728a245769fSSteven Whitehouse (gl->gl_state == LM_ST_EXCLUSIVE) ||
729a245769fSSteven Whitehouse (lck_flags & (LM_FLAG_TRY|LM_FLAG_TRY_1CB)))
730a245769fSSteven Whitehouse clear_bit(GLF_BLOCKING, &gl->gl_flags);
731e19681aeSAndreas Gruenbacher if (!glops->go_inval && !glops->go_sync)
732e19681aeSAndreas Gruenbacher goto skip_inval;
733e19681aeSAndreas Gruenbacher
734f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
7351c634f94SBob Peterson if (glops->go_sync) {
7361c634f94SBob Peterson ret = glops->go_sync(gl);
7371c634f94SBob Peterson /* If we had a problem syncing (due to io errors or whatever,
7381c634f94SBob Peterson * we should not invalidate the metadata or tell dlm to
7391c634f94SBob Peterson * release the glock to other nodes.
7401c634f94SBob Peterson */
7411c634f94SBob Peterson if (ret) {
7421c634f94SBob Peterson if (cmpxchg(&sdp->sd_log_error, 0, ret)) {
7431c634f94SBob Peterson fs_err(sdp, "Error %d syncing glock \n", ret);
7441c634f94SBob Peterson gfs2_dump_glock(NULL, gl, true);
7451c634f94SBob Peterson }
746e19681aeSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
747b11e1a84SBob Peterson goto skip_inval;
7481c634f94SBob Peterson }
7491c634f94SBob Peterson }
75033dbd1e4SBob Peterson if (test_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags)) {
75133dbd1e4SBob Peterson /*
75233dbd1e4SBob Peterson * The call to go_sync should have cleared out the ail list.
75333dbd1e4SBob Peterson * If there are still items, we have a problem. We ought to
75433dbd1e4SBob Peterson * withdraw, but we can't because the withdraw code also uses
75533dbd1e4SBob Peterson * glocks. Warn about the error, dump the glock, then fall
75633dbd1e4SBob Peterson * through and wait for logd to do the withdraw for us.
75733dbd1e4SBob Peterson */
75833dbd1e4SBob Peterson if ((atomic_read(&gl->gl_ail_count) != 0) &&
75933dbd1e4SBob Peterson (!cmpxchg(&sdp->sd_log_error, 0, -EIO))) {
760ea4e61c7SBob Peterson gfs2_glock_assert_warn(gl,
761ea4e61c7SBob Peterson !atomic_read(&gl->gl_ail_count));
76233dbd1e4SBob Peterson gfs2_dump_glock(NULL, gl, true);
76333dbd1e4SBob Peterson }
7646802e340SSteven Whitehouse glops->go_inval(gl, target == LM_ST_DEFERRED ? 0 : DIO_METADATA);
7656802e340SSteven Whitehouse clear_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags);
76633dbd1e4SBob Peterson }
767e19681aeSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
7686802e340SSteven Whitehouse
769b11e1a84SBob Peterson skip_inval:
770e19681aeSAndreas Gruenbacher gl->gl_lockref.count++;
771d93ae386SBob Peterson /*
772d93ae386SBob Peterson * Check for an error encountered since we called go_sync and go_inval.
773d93ae386SBob Peterson * If so, we can't withdraw from the glock code because the withdraw
774d93ae386SBob Peterson * code itself uses glocks (see function signal_our_withdraw) to
775d93ae386SBob Peterson * change the mount to read-only. Most importantly, we must not call
776d93ae386SBob Peterson * dlm to unlock the glock until the journal is in a known good state
777d93ae386SBob Peterson * (after journal replay) otherwise other nodes may use the object
778d93ae386SBob Peterson * (rgrp or dinode) and then later, journal replay will corrupt the
779d93ae386SBob Peterson * file system. The best we can do here is wait for the logd daemon
780d93ae386SBob Peterson * to see sd_log_error and withdraw, and in the meantime, requeue the
781d93ae386SBob Peterson * work for later.
782d93ae386SBob Peterson *
783865cc3e9SBob Peterson * We make a special exception for some system glocks, such as the
784865cc3e9SBob Peterson * system statfs inode glock, which needs to be granted before the
785865cc3e9SBob Peterson * gfs2_quotad daemon can exit, and that exit needs to finish before
786865cc3e9SBob Peterson * we can unmount the withdrawn file system.
787865cc3e9SBob Peterson *
788d93ae386SBob Peterson * However, if we're just unlocking the lock (say, for unmount, when
789d93ae386SBob Peterson * gfs2_gl_hash_clear calls clear_glock) and recovery is complete
790d93ae386SBob Peterson * then it's okay to tell dlm to unlock it.
791d93ae386SBob Peterson */
792d6b412c5SAndreas Gruenbacher if (unlikely(sdp->sd_log_error) && !gfs2_withdrawing_or_withdrawn(sdp))
793d93ae386SBob Peterson gfs2_withdraw_delayed(sdp);
794865cc3e9SBob Peterson if (glock_blocked_by_withdraw(gl) &&
795865cc3e9SBob Peterson (target != LM_ST_UNLOCKED ||
796865cc3e9SBob Peterson test_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags))) {
797865cc3e9SBob Peterson if (!is_system_glock(gl)) {
79886934198SBob Peterson handle_callback(gl, LM_ST_UNLOCKED, 0, false); /* sets demote */
79986934198SBob Peterson /*
80086934198SBob Peterson * Ordinarily, we would call dlm and its callback would call
80186934198SBob Peterson * finish_xmote, which would call state_change() to the new state.
80286934198SBob Peterson * Since we withdrew, we won't call dlm, so call state_change
80386934198SBob Peterson * manually, but to the UNLOCKED state we desire.
80486934198SBob Peterson */
80586934198SBob Peterson state_change(gl, LM_ST_UNLOCKED);
80686934198SBob Peterson /*
80786934198SBob Peterson * We skip telling dlm to do the locking, so we won't get a
80886934198SBob Peterson * reply that would otherwise clear GLF_LOCK. So we clear it here.
80986934198SBob Peterson */
81086934198SBob Peterson clear_bit(GLF_LOCK, &gl->gl_flags);
81186934198SBob Peterson clear_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags);
812*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, GL_GLOCK_DFT_HOLD);
813e19681aeSAndreas Gruenbacher return;
814865cc3e9SBob Peterson } else {
815865cc3e9SBob Peterson clear_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags);
816d93ae386SBob Peterson }
817d93ae386SBob Peterson }
818d93ae386SBob Peterson
819e19681aeSAndreas Gruenbacher if (ls->ls_ops->lm_lock) {
820e19681aeSAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
821e19681aeSAndreas Gruenbacher ret = ls->ls_ops->lm_lock(gl, target, lck_flags);
822e19681aeSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
823abea81e6SAndreas Gruenbacher
8243e11e530SBenjamin Marzinski if (ret == -EINVAL && gl->gl_target == LM_ST_UNLOCKED &&
8253e11e530SBenjamin Marzinski target == LM_ST_UNLOCKED &&
826abea81e6SAndreas Gruenbacher test_bit(DFL_UNMOUNT, &ls->ls_recover_flags)) {
827e19681aeSAndreas Gruenbacher /*
828e19681aeSAndreas Gruenbacher * The lockspace has been released and the lock has
829e19681aeSAndreas Gruenbacher * been unlocked implicitly.
830e19681aeSAndreas Gruenbacher */
831d93ae386SBob Peterson } else if (ret) {
832e54c78a2SBob Peterson fs_err(sdp, "lm_lock ret %d\n", ret);
833e19681aeSAndreas Gruenbacher target = gl->gl_state | LM_OUT_ERROR;
834e19681aeSAndreas Gruenbacher } else {
835e19681aeSAndreas Gruenbacher /* The operation will be completed asynchronously. */
836e19681aeSAndreas Gruenbacher return;
837dba2d70cSDavid Teigland }
838e19681aeSAndreas Gruenbacher }
839e19681aeSAndreas Gruenbacher
840e19681aeSAndreas Gruenbacher /* Complete the operation now. */
841921169caSSteven Whitehouse finish_xmote(gl, target);
842*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
8436802e340SSteven Whitehouse }
8446802e340SSteven Whitehouse
8456802e340SSteven Whitehouse /**
8466802e340SSteven Whitehouse * run_queue - do all outstanding tasks related to a glock
8476802e340SSteven Whitehouse * @gl: The glock in question
8486802e340SSteven Whitehouse * @nonblock: True if we must not block in run_queue
8496802e340SSteven Whitehouse *
8506802e340SSteven Whitehouse */
8516802e340SSteven Whitehouse
run_queue(struct gfs2_glock * gl,const int nonblock)8526802e340SSteven Whitehouse static void run_queue(struct gfs2_glock *gl, const int nonblock)
853f3dd1649SAndreas Gruenbacher __releases(&gl->gl_lockref.lock)
854f3dd1649SAndreas Gruenbacher __acquires(&gl->gl_lockref.lock)
8556802e340SSteven Whitehouse {
8566802e340SSteven Whitehouse struct gfs2_holder *gh = NULL;
8576802e340SSteven Whitehouse
8586802e340SSteven Whitehouse if (test_and_set_bit(GLF_LOCK, &gl->gl_flags))
8596802e340SSteven Whitehouse return;
8606802e340SSteven Whitehouse
8616802e340SSteven Whitehouse GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags));
8626802e340SSteven Whitehouse
8636802e340SSteven Whitehouse if (test_bit(GLF_DEMOTE, &gl->gl_flags) &&
8646802e340SSteven Whitehouse gl->gl_demote_state != gl->gl_state) {
8656802e340SSteven Whitehouse if (find_first_holder(gl))
866d8348de0SSteven Whitehouse goto out_unlock;
8676802e340SSteven Whitehouse if (nonblock)
8686802e340SSteven Whitehouse goto out_sched;
8696802e340SSteven Whitehouse set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags);
870265d529cSSteven Whitehouse GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE);
8716802e340SSteven Whitehouse gl->gl_target = gl->gl_demote_state;
8726802e340SSteven Whitehouse } else {
8736802e340SSteven Whitehouse if (test_bit(GLF_DEMOTE, &gl->gl_flags))
8746802e340SSteven Whitehouse gfs2_demote_wake(gl);
875de3e7f97SAndreas Gruenbacher if (do_promote(gl))
876d8348de0SSteven Whitehouse goto out_unlock;
8776802e340SSteven Whitehouse gh = find_first_waiter(gl);
8786802e340SSteven Whitehouse gl->gl_target = gh->gh_state;
8796802e340SSteven Whitehouse if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)))
8806802e340SSteven Whitehouse do_error(gl, 0); /* Fail queued try locks */
8816802e340SSteven Whitehouse }
8826802e340SSteven Whitehouse do_xmote(gl, gh, gl->gl_target);
8836802e340SSteven Whitehouse return;
8846802e340SSteven Whitehouse
8856802e340SSteven Whitehouse out_sched:
8867e71c55eSSteven Whitehouse clear_bit(GLF_LOCK, &gl->gl_flags);
8874e857c58SPeter Zijlstra smp_mb__after_atomic();
888e66cf161SSteven Whitehouse gl->gl_lockref.count++;
889*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
8907e71c55eSSteven Whitehouse return;
8917e71c55eSSteven Whitehouse
892d8348de0SSteven Whitehouse out_unlock:
8936802e340SSteven Whitehouse clear_bit(GLF_LOCK, &gl->gl_flags);
8944e857c58SPeter Zijlstra smp_mb__after_atomic();
8957e71c55eSSteven Whitehouse return;
8966802e340SSteven Whitehouse }
8976802e340SSteven Whitehouse
8983781ec9eSAndreas Gruenbacher /**
8993781ec9eSAndreas Gruenbacher * glock_set_object - set the gl_object field of a glock
9003781ec9eSAndreas Gruenbacher * @gl: the glock
9013781ec9eSAndreas Gruenbacher * @object: the object
9023781ec9eSAndreas Gruenbacher */
glock_set_object(struct gfs2_glock * gl,void * object)9033781ec9eSAndreas Gruenbacher void glock_set_object(struct gfs2_glock *gl, void *object)
9043781ec9eSAndreas Gruenbacher {
9053781ec9eSAndreas Gruenbacher void *prev_object;
9063781ec9eSAndreas Gruenbacher
9073781ec9eSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
9083781ec9eSAndreas Gruenbacher prev_object = gl->gl_object;
9093781ec9eSAndreas Gruenbacher gl->gl_object = object;
9103781ec9eSAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
9113781ec9eSAndreas Gruenbacher if (gfs2_assert_warn(gl->gl_name.ln_sbd, prev_object == NULL)) {
9123781ec9eSAndreas Gruenbacher pr_warn("glock=%u/%llx\n",
9133781ec9eSAndreas Gruenbacher gl->gl_name.ln_type,
9143781ec9eSAndreas Gruenbacher (unsigned long long)gl->gl_name.ln_number);
9153781ec9eSAndreas Gruenbacher gfs2_dump_glock(NULL, gl, true);
9163781ec9eSAndreas Gruenbacher }
9173781ec9eSAndreas Gruenbacher }
9183781ec9eSAndreas Gruenbacher
9193781ec9eSAndreas Gruenbacher /**
9203781ec9eSAndreas Gruenbacher * glock_clear_object - clear the gl_object field of a glock
9213781ec9eSAndreas Gruenbacher * @gl: the glock
9229ffa1888SAndreas Gruenbacher * @object: object the glock currently points at
9233781ec9eSAndreas Gruenbacher */
glock_clear_object(struct gfs2_glock * gl,void * object)9243781ec9eSAndreas Gruenbacher void glock_clear_object(struct gfs2_glock *gl, void *object)
9253781ec9eSAndreas Gruenbacher {
9263781ec9eSAndreas Gruenbacher void *prev_object;
9273781ec9eSAndreas Gruenbacher
9283781ec9eSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
9293781ec9eSAndreas Gruenbacher prev_object = gl->gl_object;
9303781ec9eSAndreas Gruenbacher gl->gl_object = NULL;
9313781ec9eSAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
9329ffa1888SAndreas Gruenbacher if (gfs2_assert_warn(gl->gl_name.ln_sbd, prev_object == object)) {
9333781ec9eSAndreas Gruenbacher pr_warn("glock=%u/%llx\n",
9343781ec9eSAndreas Gruenbacher gl->gl_name.ln_type,
9353781ec9eSAndreas Gruenbacher (unsigned long long)gl->gl_name.ln_number);
9363781ec9eSAndreas Gruenbacher gfs2_dump_glock(NULL, gl, true);
9373781ec9eSAndreas Gruenbacher }
9383781ec9eSAndreas Gruenbacher }
9393781ec9eSAndreas Gruenbacher
gfs2_inode_remember_delete(struct gfs2_glock * gl,u64 generation)940f286d627SAndreas Gruenbacher void gfs2_inode_remember_delete(struct gfs2_glock *gl, u64 generation)
941f286d627SAndreas Gruenbacher {
942f286d627SAndreas Gruenbacher struct gfs2_inode_lvb *ri = (void *)gl->gl_lksb.sb_lvbptr;
943f286d627SAndreas Gruenbacher
944f286d627SAndreas Gruenbacher if (ri->ri_magic == 0)
945f286d627SAndreas Gruenbacher ri->ri_magic = cpu_to_be32(GFS2_MAGIC);
946f286d627SAndreas Gruenbacher if (ri->ri_magic == cpu_to_be32(GFS2_MAGIC))
947f286d627SAndreas Gruenbacher ri->ri_generation_deleted = cpu_to_be64(generation);
948f286d627SAndreas Gruenbacher }
949f286d627SAndreas Gruenbacher
gfs2_inode_already_deleted(struct gfs2_glock * gl,u64 generation)950f286d627SAndreas Gruenbacher bool gfs2_inode_already_deleted(struct gfs2_glock *gl, u64 generation)
951f286d627SAndreas Gruenbacher {
952f286d627SAndreas Gruenbacher struct gfs2_inode_lvb *ri = (void *)gl->gl_lksb.sb_lvbptr;
953f286d627SAndreas Gruenbacher
954f286d627SAndreas Gruenbacher if (ri->ri_magic != cpu_to_be32(GFS2_MAGIC))
955f286d627SAndreas Gruenbacher return false;
956f286d627SAndreas Gruenbacher return generation <= be64_to_cpu(ri->ri_generation_deleted);
957f286d627SAndreas Gruenbacher }
958f286d627SAndreas Gruenbacher
gfs2_glock_poke(struct gfs2_glock * gl)9599e8990deSAndreas Gruenbacher static void gfs2_glock_poke(struct gfs2_glock *gl)
9609e8990deSAndreas Gruenbacher {
9619e8990deSAndreas Gruenbacher int flags = LM_FLAG_TRY_1CB | LM_FLAG_ANY | GL_SKIP;
9629e8990deSAndreas Gruenbacher struct gfs2_holder gh;
9639e8990deSAndreas Gruenbacher int error;
9649e8990deSAndreas Gruenbacher
965b016d9a8SAndreas Gruenbacher __gfs2_holder_init(gl, LM_ST_SHARED, flags, &gh, _RET_IP_);
966c07bfb4dSAndreas Gruenbacher error = gfs2_glock_nq(&gh);
9679e8990deSAndreas Gruenbacher if (!error)
9689e8990deSAndreas Gruenbacher gfs2_glock_dq(&gh);
969c07bfb4dSAndreas Gruenbacher gfs2_holder_uninit(&gh);
9709e8990deSAndreas Gruenbacher }
9719e8990deSAndreas Gruenbacher
gfs2_try_evict(struct gfs2_glock * gl)9728c7b9262SAndreas Gruenbacher static bool gfs2_try_evict(struct gfs2_glock *gl)
9738c7b9262SAndreas Gruenbacher {
9748c7b9262SAndreas Gruenbacher struct gfs2_inode *ip;
9758c7b9262SAndreas Gruenbacher bool evicted = false;
9768c7b9262SAndreas Gruenbacher
9778c7b9262SAndreas Gruenbacher /*
9788c7b9262SAndreas Gruenbacher * If there is contention on the iopen glock and we have an inode, try
9798c7b9262SAndreas Gruenbacher * to grab and release the inode so that it can be evicted. This will
9808c7b9262SAndreas Gruenbacher * allow the remote node to go ahead and delete the inode without us
9818c7b9262SAndreas Gruenbacher * having to do it, which will avoid rgrp glock thrashing.
9828c7b9262SAndreas Gruenbacher *
9838c7b9262SAndreas Gruenbacher * The remote node is likely still holding the corresponding inode
9848c7b9262SAndreas Gruenbacher * glock, so it will run before we get to verify that the delete has
9858c7b9262SAndreas Gruenbacher * happened below.
9868c7b9262SAndreas Gruenbacher */
9878c7b9262SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
9888c7b9262SAndreas Gruenbacher ip = gl->gl_object;
9898c7b9262SAndreas Gruenbacher if (ip && !igrab(&ip->i_inode))
9908c7b9262SAndreas Gruenbacher ip = NULL;
9918c7b9262SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
9928c7b9262SAndreas Gruenbacher if (ip) {
993b0dcffd8SAndreas Gruenbacher gl->gl_no_formal_ino = ip->i_no_formal_ino;
9948c7b9262SAndreas Gruenbacher set_bit(GIF_DEFERRED_DELETE, &ip->i_flags);
9958c7b9262SAndreas Gruenbacher d_prune_aliases(&ip->i_inode);
9968c7b9262SAndreas Gruenbacher iput(&ip->i_inode);
9978c7b9262SAndreas Gruenbacher
9988c7b9262SAndreas Gruenbacher /* If the inode was evicted, gl->gl_object will now be NULL. */
9998c7b9262SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
10008c7b9262SAndreas Gruenbacher ip = gl->gl_object;
10019e8990deSAndreas Gruenbacher if (ip) {
10028c7b9262SAndreas Gruenbacher clear_bit(GIF_DEFERRED_DELETE, &ip->i_flags);
1003f0c0ade8SAndreas Gruenbacher if (!igrab(&ip->i_inode))
1004f0c0ade8SAndreas Gruenbacher ip = NULL;
10059e8990deSAndreas Gruenbacher }
10068c7b9262SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1007f0c0ade8SAndreas Gruenbacher if (ip) {
1008f0c0ade8SAndreas Gruenbacher gfs2_glock_poke(ip->i_gl);
1009f0c0ade8SAndreas Gruenbacher iput(&ip->i_inode);
10109e8990deSAndreas Gruenbacher }
10118c7b9262SAndreas Gruenbacher evicted = !ip;
10128c7b9262SAndreas Gruenbacher }
10138c7b9262SAndreas Gruenbacher return evicted;
10148c7b9262SAndreas Gruenbacher }
10158c7b9262SAndreas Gruenbacher
gfs2_queue_try_to_evict(struct gfs2_glock * gl)1016f0e56edcSAndreas Gruenbacher bool gfs2_queue_try_to_evict(struct gfs2_glock *gl)
1017f0e56edcSAndreas Gruenbacher {
1018f0e56edcSAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
1019f0e56edcSAndreas Gruenbacher
1020f0e56edcSAndreas Gruenbacher if (test_and_set_bit(GLF_TRY_TO_EVICT, &gl->gl_flags))
1021f0e56edcSAndreas Gruenbacher return false;
1022f0e56edcSAndreas Gruenbacher return queue_delayed_work(sdp->sd_delete_wq,
1023f0e56edcSAndreas Gruenbacher &gl->gl_delete, 0);
1024f0e56edcSAndreas Gruenbacher }
1025f0e56edcSAndreas Gruenbacher
gfs2_queue_verify_delete(struct gfs2_glock * gl,bool later)1026e30cab28SAndreas Gruenbacher bool gfs2_queue_verify_delete(struct gfs2_glock *gl, bool later)
1027f0e56edcSAndreas Gruenbacher {
1028f0e56edcSAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
102982649634SAndreas Gruenbacher unsigned long delay;
1030f0e56edcSAndreas Gruenbacher
10314389447fSAndreas Gruenbacher if (test_and_set_bit(GLF_VERIFY_DELETE, &gl->gl_flags))
1032f0e56edcSAndreas Gruenbacher return false;
103382649634SAndreas Gruenbacher delay = later ? 5 * HZ : 0;
103482649634SAndreas Gruenbacher return queue_delayed_work(sdp->sd_delete_wq, &gl->gl_delete, delay);
1035f0e56edcSAndreas Gruenbacher }
1036f0e56edcSAndreas Gruenbacher
delete_work_func(struct work_struct * work)1037b94a170eSBenjamin Marzinski static void delete_work_func(struct work_struct *work)
1038b94a170eSBenjamin Marzinski {
1039a0e3cc65SAndreas Gruenbacher struct delayed_work *dwork = to_delayed_work(work);
1040a0e3cc65SAndreas Gruenbacher struct gfs2_glock *gl = container_of(dwork, struct gfs2_glock, gl_delete);
104115562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
1042ec5ec66bSAndreas Gruenbacher struct inode *inode;
1043044b9414SSteven Whitehouse u64 no_addr = gl->gl_name.ln_number;
1044b94a170eSBenjamin Marzinski
1045f0e56edcSAndreas Gruenbacher if (test_and_clear_bit(GLF_TRY_TO_EVICT, &gl->gl_flags)) {
10468c7b9262SAndreas Gruenbacher /*
10478c7b9262SAndreas Gruenbacher * If we can evict the inode, give the remote node trying to
10488c7b9262SAndreas Gruenbacher * delete the inode some time before verifying that the delete
10498c7b9262SAndreas Gruenbacher * has happened. Otherwise, if we cause contention on the inode glock
10508c7b9262SAndreas Gruenbacher * immediately, the remote node will think that we still have
10518c7b9262SAndreas Gruenbacher * the inode in use, and so it will give up waiting.
10529e8990deSAndreas Gruenbacher *
10539e8990deSAndreas Gruenbacher * If we can't evict the inode, signal to the remote node that
10549e8990deSAndreas Gruenbacher * the inode is still in use. We'll later try to delete the
10559e8990deSAndreas Gruenbacher * inode locally in gfs2_evict_inode.
10569e8990deSAndreas Gruenbacher *
10579e8990deSAndreas Gruenbacher * FIXME: We only need to verify that the remote node has
10589e8990deSAndreas Gruenbacher * deleted the inode because nodes before this remote delete
10599e8990deSAndreas Gruenbacher * rework won't cooperate. At a later time, when we no longer
10609e8990deSAndreas Gruenbacher * care about compatibility with such nodes, we can skip this
10619e8990deSAndreas Gruenbacher * step entirely.
10628c7b9262SAndreas Gruenbacher */
10638c7b9262SAndreas Gruenbacher if (gfs2_try_evict(gl)) {
1064e7beb8b6SAndreas Gruenbacher if (test_bit(SDF_KILL, &sdp->sd_flags))
10656c0246a9SBob Peterson goto out;
106682649634SAndreas Gruenbacher if (gfs2_queue_verify_delete(gl, true))
10678c7b9262SAndreas Gruenbacher return;
10688c7b9262SAndreas Gruenbacher }
106988f4a9f8SAndreas Gruenbacher goto out;
10708c7b9262SAndreas Gruenbacher }
10718c7b9262SAndreas Gruenbacher
10724389447fSAndreas Gruenbacher if (test_and_clear_bit(GLF_VERIFY_DELETE, &gl->gl_flags)) {
1073b0dcffd8SAndreas Gruenbacher inode = gfs2_lookup_by_inum(sdp, no_addr, gl->gl_no_formal_ino,
1074b0dcffd8SAndreas Gruenbacher GFS2_BLKST_UNLINKED);
1075c412a97cSBob Peterson if (IS_ERR(inode)) {
1076c412a97cSBob Peterson if (PTR_ERR(inode) == -EAGAIN &&
1077e7beb8b6SAndreas Gruenbacher !test_bit(SDF_KILL, &sdp->sd_flags) &&
107882649634SAndreas Gruenbacher gfs2_queue_verify_delete(gl, true))
1079c412a97cSBob Peterson return;
1080c412a97cSBob Peterson } else {
1081b94a170eSBenjamin Marzinski d_prune_aliases(inode);
1082b94a170eSBenjamin Marzinski iput(inode);
1083b94a170eSBenjamin Marzinski }
1084f0e56edcSAndreas Gruenbacher }
1085f0e56edcSAndreas Gruenbacher
108688f4a9f8SAndreas Gruenbacher out:
1087b94a170eSBenjamin Marzinski gfs2_glock_put(gl);
1088b94a170eSBenjamin Marzinski }
1089b94a170eSBenjamin Marzinski
glock_work_func(struct work_struct * work)10906802e340SSteven Whitehouse static void glock_work_func(struct work_struct *work)
10916802e340SSteven Whitehouse {
10926802e340SSteven Whitehouse unsigned long delay = 0;
10936802e340SSteven Whitehouse struct gfs2_glock *gl = container_of(work, struct gfs2_glock, gl_work.work);
10946b0c7440SAndreas Gruenbacher unsigned int drop_refs = 1;
10956802e340SSteven Whitehouse
1096b68b9dd7SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
1097b68b9dd7SAndreas Gruenbacher if (test_bit(GLF_REPLY_PENDING, &gl->gl_flags)) {
1098b68b9dd7SAndreas Gruenbacher clear_bit(GLF_REPLY_PENDING, &gl->gl_flags);
10996802e340SSteven Whitehouse finish_xmote(gl, gl->gl_reply);
11006b0c7440SAndreas Gruenbacher drop_refs++;
110126bb7505SSteven Whitehouse }
1102f90e5b5bSBob Peterson if (test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) &&
1103265d529cSSteven Whitehouse gl->gl_state != LM_ST_UNLOCKED &&
1104265d529cSSteven Whitehouse gl->gl_demote_state != LM_ST_EXCLUSIVE) {
11056802e340SSteven Whitehouse unsigned long holdtime, now = jiffies;
1106f90e5b5bSBob Peterson
11077cf8dcd3SBob Peterson holdtime = gl->gl_tchange + gl->gl_hold_time;
11086802e340SSteven Whitehouse if (time_before(now, holdtime))
11096802e340SSteven Whitehouse delay = holdtime - now;
1110f90e5b5bSBob Peterson
1111f90e5b5bSBob Peterson if (!delay) {
1112f90e5b5bSBob Peterson clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags);
111335b6f8fbSAndreas Gruenbacher gfs2_set_demote(gl);
1114f90e5b5bSBob Peterson }
11156802e340SSteven Whitehouse }
11166802e340SSteven Whitehouse run_queue(gl, 0);
11176b0c7440SAndreas Gruenbacher if (delay) {
11186b0c7440SAndreas Gruenbacher /* Keep one glock reference for the work we requeue. */
11196b0c7440SAndreas Gruenbacher drop_refs--;
11207cf8dcd3SBob Peterson if (gl->gl_name.ln_type != LM_TYPE_INODE)
11217cf8dcd3SBob Peterson delay = 0;
1122*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, delay);
11237cf8dcd3SBob Peterson }
11246b0c7440SAndreas Gruenbacher
11256b0c7440SAndreas Gruenbacher /*
11266b0c7440SAndreas Gruenbacher * Drop the remaining glock references manually here. (Mind that
1127*d7f0c4c9SAndreas Gruenbacher * gfs2_glock_queue_work depends on the lockref spinlock begin held
11286b0c7440SAndreas Gruenbacher * here as well.)
11296b0c7440SAndreas Gruenbacher */
11306b0c7440SAndreas Gruenbacher gl->gl_lockref.count -= drop_refs;
11316b0c7440SAndreas Gruenbacher if (!gl->gl_lockref.count) {
11326b0c7440SAndreas Gruenbacher __gfs2_glock_put(gl);
11336b0c7440SAndreas Gruenbacher return;
11346b0c7440SAndreas Gruenbacher }
11356b0c7440SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1136c4f68a13SBenjamin Marzinski }
1137c4f68a13SBenjamin Marzinski
find_insert_glock(struct lm_lockname * name,struct gfs2_glock * new)11380515480aSAndreas Gruenbacher static struct gfs2_glock *find_insert_glock(struct lm_lockname *name,
11390515480aSAndreas Gruenbacher struct gfs2_glock *new)
11400515480aSAndreas Gruenbacher {
11410515480aSAndreas Gruenbacher struct wait_glock_queue wait;
1142a91323e2SAndreas Gruenbacher wait_queue_head_t *wq = glock_waitqueue(name);
11430515480aSAndreas Gruenbacher struct gfs2_glock *gl;
11440515480aSAndreas Gruenbacher
1145a91323e2SAndreas Gruenbacher wait.name = name;
1146a91323e2SAndreas Gruenbacher init_wait(&wait.wait);
1147a91323e2SAndreas Gruenbacher wait.wait.func = glock_wake_function;
1148a91323e2SAndreas Gruenbacher
11490515480aSAndreas Gruenbacher again:
1150a91323e2SAndreas Gruenbacher prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
11510515480aSAndreas Gruenbacher rcu_read_lock();
11520515480aSAndreas Gruenbacher if (new) {
11530515480aSAndreas Gruenbacher gl = rhashtable_lookup_get_insert_fast(&gl_hash_table,
11540515480aSAndreas Gruenbacher &new->gl_node, ht_parms);
11550515480aSAndreas Gruenbacher if (IS_ERR(gl))
11560515480aSAndreas Gruenbacher goto out;
11570515480aSAndreas Gruenbacher } else {
11580515480aSAndreas Gruenbacher gl = rhashtable_lookup_fast(&gl_hash_table,
11590515480aSAndreas Gruenbacher name, ht_parms);
11600515480aSAndreas Gruenbacher }
11610515480aSAndreas Gruenbacher if (gl && !lockref_get_not_dead(&gl->gl_lockref)) {
11620515480aSAndreas Gruenbacher rcu_read_unlock();
11630515480aSAndreas Gruenbacher schedule();
11640515480aSAndreas Gruenbacher goto again;
11650515480aSAndreas Gruenbacher }
11660515480aSAndreas Gruenbacher out:
11670515480aSAndreas Gruenbacher rcu_read_unlock();
1168a91323e2SAndreas Gruenbacher finish_wait(wq, &wait.wait);
11690515480aSAndreas Gruenbacher return gl;
11700515480aSAndreas Gruenbacher }
11710515480aSAndreas Gruenbacher
1172b3b94faaSDavid Teigland /**
1173b3b94faaSDavid Teigland * gfs2_glock_get() - Get a glock, or create one if one doesn't exist
1174b3b94faaSDavid Teigland * @sdp: The GFS2 superblock
1175b3b94faaSDavid Teigland * @number: the lock number
1176b3b94faaSDavid Teigland * @glops: The glock_operations to use
1177b3b94faaSDavid Teigland * @create: If 0, don't create the glock if it doesn't exist
1178b3b94faaSDavid Teigland * @glp: the glock is returned here
1179b3b94faaSDavid Teigland *
1180b3b94faaSDavid Teigland * This does not lock a glock, just finds/creates structures for one.
1181b3b94faaSDavid Teigland *
1182b3b94faaSDavid Teigland * Returns: errno
1183b3b94faaSDavid Teigland */
1184b3b94faaSDavid Teigland
gfs2_glock_get(struct gfs2_sbd * sdp,u64 number,const struct gfs2_glock_operations * glops,int create,struct gfs2_glock ** glp)1185cd915493SSteven Whitehouse int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
11868fb4b536SSteven Whitehouse const struct gfs2_glock_operations *glops, int create,
1187b3b94faaSDavid Teigland struct gfs2_glock **glp)
1188b3b94faaSDavid Teigland {
1189009d8518SSteven Whitehouse struct super_block *s = sdp->sd_vfs;
119015562c43SBob Peterson struct lm_lockname name = { .ln_number = number,
119115562c43SBob Peterson .ln_type = glops->go_type,
119215562c43SBob Peterson .ln_sbd = sdp };
11930a52aba7SAndreas Gruenbacher struct gfs2_glock *gl, *tmp;
1194009d8518SSteven Whitehouse struct address_space *mapping;
11950a52aba7SAndreas Gruenbacher int ret = 0;
1196b3b94faaSDavid Teigland
11970515480aSAndreas Gruenbacher gl = find_insert_glock(&name, NULL);
11980515480aSAndreas Gruenbacher if (gl) {
1199b3b94faaSDavid Teigland *glp = gl;
1200b3b94faaSDavid Teigland return 0;
12010515480aSAndreas Gruenbacher }
120264d576baSSteven Whitehouse if (!create)
120364d576baSSteven Whitehouse return -ENOENT;
1204b3b94faaSDavid Teigland
120511d8b79eSKees Cook if (glops->go_flags & GLOF_ASPACE) {
120611d8b79eSKees Cook struct gfs2_glock_aspace *gla =
120711d8b79eSKees Cook kmem_cache_alloc(gfs2_glock_aspace_cachep, GFP_NOFS);
120811d8b79eSKees Cook if (!gla)
120911d8b79eSKees Cook return -ENOMEM;
121011d8b79eSKees Cook gl = &gla->glock;
121111d8b79eSKees Cook } else {
121211d8b79eSKees Cook gl = kmem_cache_alloc(gfs2_glock_cachep, GFP_NOFS);
1213b3b94faaSDavid Teigland if (!gl)
1214b3b94faaSDavid Teigland return -ENOMEM;
121511d8b79eSKees Cook }
1216dba2d70cSDavid Teigland memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
121711d8b79eSKees Cook gl->gl_ops = glops;
1218dba2d70cSDavid Teigland
1219dba2d70cSDavid Teigland if (glops->go_flags & GLOF_LVB) {
1220f7be987bSAndreas Gruenbacher gl->gl_lksb.sb_lvbptr = kzalloc(GDLM_LVB_SIZE, GFP_NOFS);
12214e2f8849SDavid Teigland if (!gl->gl_lksb.sb_lvbptr) {
122211d8b79eSKees Cook gfs2_glock_dealloc(&gl->gl_rcu);
1223dba2d70cSDavid Teigland return -ENOMEM;
1224dba2d70cSDavid Teigland }
1225dba2d70cSDavid Teigland }
1226dba2d70cSDavid Teigland
12278f05228eSSteven Whitehouse atomic_inc(&sdp->sd_glock_disposal);
122888ffbf3eSBob Peterson gl->gl_node.next = NULL;
1229f2e70d8fSBob Peterson gl->gl_flags = glops->go_instantiate ? BIT(GLF_INSTANTIATE_NEEDED) : 0;
1230b3b94faaSDavid Teigland gl->gl_name = name;
1231515b269dSAlexander Aring lockdep_set_subclass(&gl->gl_lockref.lock, glops->go_subclass);
1232e66cf161SSteven Whitehouse gl->gl_lockref.count = 1;
1233b3b94faaSDavid Teigland gl->gl_state = LM_ST_UNLOCKED;
12346802e340SSteven Whitehouse gl->gl_target = LM_ST_UNLOCKED;
1235c4f68a13SBenjamin Marzinski gl->gl_demote_state = LM_ST_EXCLUSIVE;
12368b0e1953SThomas Gleixner gl->gl_dstamp = 0;
1237a245769fSSteven Whitehouse preempt_disable();
1238a245769fSSteven Whitehouse /* We use the global stats to estimate the initial per-glock stats */
1239a245769fSSteven Whitehouse gl->gl_stats = this_cpu_ptr(sdp->sd_lkstats)->lkstats[glops->go_type];
1240a245769fSSteven Whitehouse preempt_enable();
1241a245769fSSteven Whitehouse gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0;
1242a245769fSSteven Whitehouse gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0;
1243c4f68a13SBenjamin Marzinski gl->gl_tchange = jiffies;
1244ec45d9f5SSteven Whitehouse gl->gl_object = NULL;
12457cf8dcd3SBob Peterson gl->gl_hold_time = GL_GLOCK_DFT_HOLD;
1246c4f68a13SBenjamin Marzinski INIT_DELAYED_WORK(&gl->gl_work, glock_work_func);
12472ffed529SBob Peterson if (gl->gl_name.ln_type == LM_TYPE_IOPEN)
1248a0e3cc65SAndreas Gruenbacher INIT_DELAYED_WORK(&gl->gl_delete, delete_work_func);
1249b3b94faaSDavid Teigland
1250009d8518SSteven Whitehouse mapping = gfs2_glock2aspace(gl);
1251009d8518SSteven Whitehouse if (mapping) {
1252009d8518SSteven Whitehouse mapping->a_ops = &gfs2_meta_aops;
1253009d8518SSteven Whitehouse mapping->host = s->s_bdev->bd_inode;
1254009d8518SSteven Whitehouse mapping->flags = 0;
1255009d8518SSteven Whitehouse mapping_set_gfp_mask(mapping, GFP_NOFS);
1256252aa6f5SRafael Aquini mapping->private_data = NULL;
1257009d8518SSteven Whitehouse mapping->writeback_index = 0;
1258b3b94faaSDavid Teigland }
1259b3b94faaSDavid Teigland
12600515480aSAndreas Gruenbacher tmp = find_insert_glock(&name, gl);
12610a52aba7SAndreas Gruenbacher if (!tmp) {
12620a52aba7SAndreas Gruenbacher *glp = gl;
12630a52aba7SAndreas Gruenbacher goto out;
12640a52aba7SAndreas Gruenbacher }
12650a52aba7SAndreas Gruenbacher if (IS_ERR(tmp)) {
12660a52aba7SAndreas Gruenbacher ret = PTR_ERR(tmp);
12670a52aba7SAndreas Gruenbacher goto out_free;
12680a52aba7SAndreas Gruenbacher }
12690a52aba7SAndreas Gruenbacher *glp = tmp;
12700a52aba7SAndreas Gruenbacher
12710a52aba7SAndreas Gruenbacher out_free:
127211d8b79eSKees Cook gfs2_glock_dealloc(&gl->gl_rcu);
1273da7d554fSAlexander Aring if (atomic_dec_and_test(&sdp->sd_glock_disposal))
12743c69c437SAndreas Gruenbacher wake_up(&sdp->sd_kill_wait);
1275b3b94faaSDavid Teigland
12760a52aba7SAndreas Gruenbacher out:
127788ffbf3eSBob Peterson return ret;
1278b3b94faaSDavid Teigland }
1279b3b94faaSDavid Teigland
1280b3b94faaSDavid Teigland /**
1281ffd0cd3cSAndreas Gruenbacher * __gfs2_holder_init - initialize a struct gfs2_holder in the default way
1282b3b94faaSDavid Teigland * @gl: the glock
1283b3b94faaSDavid Teigland * @state: the state we're requesting
1284b3b94faaSDavid Teigland * @flags: the modifier flags
1285b3b94faaSDavid Teigland * @gh: the holder structure
1286b3b94faaSDavid Teigland *
1287b3b94faaSDavid Teigland */
1288b3b94faaSDavid Teigland
__gfs2_holder_init(struct gfs2_glock * gl,unsigned int state,u16 flags,struct gfs2_holder * gh,unsigned long ip)1289b016d9a8SAndreas Gruenbacher void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
1290b016d9a8SAndreas Gruenbacher struct gfs2_holder *gh, unsigned long ip)
1291b3b94faaSDavid Teigland {
1292b3b94faaSDavid Teigland INIT_LIST_HEAD(&gh->gh_list);
12934ad02083SAndreas Gruenbacher gh->gh_gl = gfs2_glock_hold(gl);
1294b016d9a8SAndreas Gruenbacher gh->gh_ip = ip;
1295b1e058daSPavel Emelyanov gh->gh_owner_pid = get_pid(task_pid(current));
1296b3b94faaSDavid Teigland gh->gh_state = state;
1297b3b94faaSDavid Teigland gh->gh_flags = flags;
1298b3b94faaSDavid Teigland gh->gh_iflags = 0;
1299b3b94faaSDavid Teigland }
1300b3b94faaSDavid Teigland
1301b3b94faaSDavid Teigland /**
1302b3b94faaSDavid Teigland * gfs2_holder_reinit - reinitialize a struct gfs2_holder so we can requeue it
1303b3b94faaSDavid Teigland * @state: the state we're requesting
1304b3b94faaSDavid Teigland * @flags: the modifier flags
1305b3b94faaSDavid Teigland * @gh: the holder structure
1306b3b94faaSDavid Teigland *
1307b3b94faaSDavid Teigland * Don't mess with the glock.
1308b3b94faaSDavid Teigland *
1309b3b94faaSDavid Teigland */
1310b3b94faaSDavid Teigland
gfs2_holder_reinit(unsigned int state,u16 flags,struct gfs2_holder * gh)1311b58bf407SBob Peterson void gfs2_holder_reinit(unsigned int state, u16 flags, struct gfs2_holder *gh)
1312b3b94faaSDavid Teigland {
1313b3b94faaSDavid Teigland gh->gh_state = state;
1314579b78a4SSteven Whitehouse gh->gh_flags = flags;
13153b8249f6SSteven Whitehouse gh->gh_iflags = 0;
1316d29c0afeSFabian Frederick gh->gh_ip = _RET_IP_;
13171a0eae88SBob Peterson put_pid(gh->gh_owner_pid);
13181a0eae88SBob Peterson gh->gh_owner_pid = get_pid(task_pid(current));
1319b3b94faaSDavid Teigland }
1320b3b94faaSDavid Teigland
1321b3b94faaSDavid Teigland /**
1322b3b94faaSDavid Teigland * gfs2_holder_uninit - uninitialize a holder structure (drop glock reference)
1323b3b94faaSDavid Teigland * @gh: the holder structure
1324b3b94faaSDavid Teigland *
1325b3b94faaSDavid Teigland */
1326b3b94faaSDavid Teigland
gfs2_holder_uninit(struct gfs2_holder * gh)1327b3b94faaSDavid Teigland void gfs2_holder_uninit(struct gfs2_holder *gh)
1328b3b94faaSDavid Teigland {
1329b1e058daSPavel Emelyanov put_pid(gh->gh_owner_pid);
1330b3b94faaSDavid Teigland gfs2_glock_put(gh->gh_gl);
13316df9f9a2SAndreas Gruenbacher gfs2_holder_mark_uninitialized(gh);
1332d0dc80dbSSteven Whitehouse gh->gh_ip = 0;
1333b3b94faaSDavid Teigland }
1334b3b94faaSDavid Teigland
gfs2_glock_update_hold_time(struct gfs2_glock * gl,unsigned long start_time)133501123cf1SAndreas Gruenbacher static void gfs2_glock_update_hold_time(struct gfs2_glock *gl,
133601123cf1SAndreas Gruenbacher unsigned long start_time)
133701123cf1SAndreas Gruenbacher {
133801123cf1SAndreas Gruenbacher /* Have we waited longer that a second? */
133901123cf1SAndreas Gruenbacher if (time_after(jiffies, start_time + HZ)) {
134001123cf1SAndreas Gruenbacher /* Lengthen the minimum hold time. */
134101123cf1SAndreas Gruenbacher gl->gl_hold_time = min(gl->gl_hold_time + GL_GLOCK_HOLD_INCR,
134201123cf1SAndreas Gruenbacher GL_GLOCK_MAX_HOLD);
134301123cf1SAndreas Gruenbacher }
134401123cf1SAndreas Gruenbacher }
134501123cf1SAndreas Gruenbacher
1346fe64d517SSteven Whitehouse /**
134753d69132SAndreas Gruenbacher * gfs2_glock_holder_ready - holder is ready and its error code can be collected
134853d69132SAndreas Gruenbacher * @gh: the glock holder
134953d69132SAndreas Gruenbacher *
135053d69132SAndreas Gruenbacher * Called when a glock holder no longer needs to be waited for because it is
135153d69132SAndreas Gruenbacher * now either held (HIF_HOLDER set; gh_error == 0), or acquiring the lock has
135253d69132SAndreas Gruenbacher * failed (gh_error != 0).
135353d69132SAndreas Gruenbacher */
135453d69132SAndreas Gruenbacher
gfs2_glock_holder_ready(struct gfs2_holder * gh)135553d69132SAndreas Gruenbacher int gfs2_glock_holder_ready(struct gfs2_holder *gh)
135653d69132SAndreas Gruenbacher {
135753d69132SAndreas Gruenbacher if (gh->gh_error || (gh->gh_flags & GL_SKIP))
135853d69132SAndreas Gruenbacher return gh->gh_error;
135953d69132SAndreas Gruenbacher gh->gh_error = gfs2_instantiate(gh);
136053d69132SAndreas Gruenbacher if (gh->gh_error)
136153d69132SAndreas Gruenbacher gfs2_glock_dq(gh);
136253d69132SAndreas Gruenbacher return gh->gh_error;
136353d69132SAndreas Gruenbacher }
136453d69132SAndreas Gruenbacher
136553d69132SAndreas Gruenbacher /**
136607a79049SBob Peterson * gfs2_glock_wait - wait on a glock acquisition
136707a79049SBob Peterson * @gh: the glock holder
136807a79049SBob Peterson *
136907a79049SBob Peterson * Returns: 0 on success
137007a79049SBob Peterson */
137107a79049SBob Peterson
gfs2_glock_wait(struct gfs2_holder * gh)137207a79049SBob Peterson int gfs2_glock_wait(struct gfs2_holder *gh)
1373fee852e3SSteven Whitehouse {
137401123cf1SAndreas Gruenbacher unsigned long start_time = jiffies;
13757cf8dcd3SBob Peterson
1376fee852e3SSteven Whitehouse might_sleep();
137774316201SNeilBrown wait_on_bit(&gh->gh_iflags, HIF_WAIT, TASK_UNINTERRUPTIBLE);
137801123cf1SAndreas Gruenbacher gfs2_glock_update_hold_time(gh->gh_gl, start_time);
137953d69132SAndreas Gruenbacher return gfs2_glock_holder_ready(gh);
1380d93cfa98SAbhijith Das }
1381d93cfa98SAbhijith Das
glocks_pending(unsigned int num_gh,struct gfs2_holder * ghs)1382ad26967bSBob Peterson static int glocks_pending(unsigned int num_gh, struct gfs2_holder *ghs)
1383ad26967bSBob Peterson {
1384ad26967bSBob Peterson int i;
1385ad26967bSBob Peterson
1386ad26967bSBob Peterson for (i = 0; i < num_gh; i++)
1387ad26967bSBob Peterson if (test_bit(HIF_WAIT, &ghs[i].gh_iflags))
1388ad26967bSBob Peterson return 1;
1389ad26967bSBob Peterson return 0;
1390ad26967bSBob Peterson }
1391ad26967bSBob Peterson
1392ad26967bSBob Peterson /**
1393ad26967bSBob Peterson * gfs2_glock_async_wait - wait on multiple asynchronous glock acquisitions
1394ad26967bSBob Peterson * @num_gh: the number of holders in the array
1395ad26967bSBob Peterson * @ghs: the glock holder array
1396ad26967bSBob Peterson *
1397ad26967bSBob Peterson * Returns: 0 on success, meaning all glocks have been granted and are held.
1398ad26967bSBob Peterson * -ESTALE if the request timed out, meaning all glocks were released,
1399ad26967bSBob Peterson * and the caller should retry the operation.
1400ad26967bSBob Peterson */
1401ad26967bSBob Peterson
gfs2_glock_async_wait(unsigned int num_gh,struct gfs2_holder * ghs)1402ad26967bSBob Peterson int gfs2_glock_async_wait(unsigned int num_gh, struct gfs2_holder *ghs)
1403ad26967bSBob Peterson {
1404ad26967bSBob Peterson struct gfs2_sbd *sdp = ghs[0].gh_gl->gl_name.ln_sbd;
1405ad26967bSBob Peterson int i, ret = 0, timeout = 0;
1406ad26967bSBob Peterson unsigned long start_time = jiffies;
1407ad26967bSBob Peterson
1408ad26967bSBob Peterson might_sleep();
1409ad26967bSBob Peterson /*
1410ad26967bSBob Peterson * Total up the (minimum hold time * 2) of all glocks and use that to
1411ad26967bSBob Peterson * determine the max amount of time we should wait.
1412ad26967bSBob Peterson */
1413ad26967bSBob Peterson for (i = 0; i < num_gh; i++)
1414ad26967bSBob Peterson timeout += ghs[i].gh_gl->gl_hold_time << 1;
1415ad26967bSBob Peterson
1416ad26967bSBob Peterson if (!wait_event_timeout(sdp->sd_async_glock_wait,
1417bdff777cSAndreas Gruenbacher !glocks_pending(num_gh, ghs), timeout)) {
1418ad26967bSBob Peterson ret = -ESTALE; /* request timed out. */
1419bdff777cSAndreas Gruenbacher goto out;
1420ad26967bSBob Peterson }
1421ad26967bSBob Peterson
1422bdff777cSAndreas Gruenbacher for (i = 0; i < num_gh; i++) {
1423bdff777cSAndreas Gruenbacher struct gfs2_holder *gh = &ghs[i];
142453d69132SAndreas Gruenbacher int ret2;
1425bdff777cSAndreas Gruenbacher
1426bdff777cSAndreas Gruenbacher if (test_bit(HIF_HOLDER, &gh->gh_iflags)) {
1427bdff777cSAndreas Gruenbacher gfs2_glock_update_hold_time(gh->gh_gl,
1428ad26967bSBob Peterson start_time);
1429ad26967bSBob Peterson }
143053d69132SAndreas Gruenbacher ret2 = gfs2_glock_holder_ready(gh);
1431ad26967bSBob Peterson if (!ret)
143253d69132SAndreas Gruenbacher ret = ret2;
1433ad26967bSBob Peterson }
1434ad26967bSBob Peterson
1435bdff777cSAndreas Gruenbacher out:
1436bdff777cSAndreas Gruenbacher if (ret) {
1437bdff777cSAndreas Gruenbacher for (i = 0; i < num_gh; i++) {
1438bdff777cSAndreas Gruenbacher struct gfs2_holder *gh = &ghs[i];
1439ad26967bSBob Peterson
1440bdff777cSAndreas Gruenbacher gfs2_glock_dq(gh);
1441bdff777cSAndreas Gruenbacher }
1442bdff777cSAndreas Gruenbacher }
1443ad26967bSBob Peterson return ret;
1444ad26967bSBob Peterson }
1445ad26967bSBob Peterson
1446b3b94faaSDavid Teigland /**
14473b8249f6SSteven Whitehouse * handle_callback - process a demote request
1448b3b94faaSDavid Teigland * @gl: the glock
1449b3b94faaSDavid Teigland * @state: the state the caller wants us to change to
1450c551f66cSLee Jones * @delay: zero to demote immediately; otherwise pending demote
1451c551f66cSLee Jones * @remote: true if this came from a different cluster node
1452b3b94faaSDavid Teigland *
14533b8249f6SSteven Whitehouse * There are only two requests that we are going to see in actual
14543b8249f6SSteven Whitehouse * practise: LM_ST_SHARED and LM_ST_UNLOCKED
1455b3b94faaSDavid Teigland */
1456b3b94faaSDavid Teigland
handle_callback(struct gfs2_glock * gl,unsigned int state,unsigned long delay,bool remote)1457c4f68a13SBenjamin Marzinski static void handle_callback(struct gfs2_glock *gl, unsigned int state,
145881ffbf65SSteven Whitehouse unsigned long delay, bool remote)
1459b3b94faaSDavid Teigland {
146035b6f8fbSAndreas Gruenbacher if (delay)
146135b6f8fbSAndreas Gruenbacher set_bit(GLF_PENDING_DEMOTE, &gl->gl_flags);
146235b6f8fbSAndreas Gruenbacher else
146335b6f8fbSAndreas Gruenbacher gfs2_set_demote(gl);
1464c4f68a13SBenjamin Marzinski if (gl->gl_demote_state == LM_ST_EXCLUSIVE) {
14653b8249f6SSteven Whitehouse gl->gl_demote_state = state;
14663b8249f6SSteven Whitehouse gl->gl_demote_time = jiffies;
146726caee5bSJosef Whiter } else if (gl->gl_demote_state != LM_ST_UNLOCKED &&
146826caee5bSJosef Whiter gl->gl_demote_state != state) {
146926caee5bSJosef Whiter gl->gl_demote_state = LM_ST_UNLOCKED;
1470b3b94faaSDavid Teigland }
1471b94a170eSBenjamin Marzinski if (gl->gl_ops->go_callback)
147281ffbf65SSteven Whitehouse gl->gl_ops->go_callback(gl, remote);
14737bd8b2ebSSteven Whitehouse trace_gfs2_demote_rq(gl, remote);
1474b3b94faaSDavid Teigland }
1475b3b94faaSDavid Teigland
gfs2_print_dbg(struct seq_file * seq,const char * fmt,...)14766802e340SSteven Whitehouse void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...)
14777c52b166SRobert Peterson {
14785e69069cSJoe Perches struct va_format vaf;
14797c52b166SRobert Peterson va_list args;
14807c52b166SRobert Peterson
14817c52b166SRobert Peterson va_start(args, fmt);
14825e69069cSJoe Perches
14836802e340SSteven Whitehouse if (seq) {
14841bb49303SSteven Whitehouse seq_vprintf(seq, fmt, args);
14856802e340SSteven Whitehouse } else {
14865e69069cSJoe Perches vaf.fmt = fmt;
14875e69069cSJoe Perches vaf.va = &args;
14885e69069cSJoe Perches
1489fc554ed3SFabian Frederick pr_err("%pV", &vaf);
14906802e340SSteven Whitehouse }
14915e69069cSJoe Perches
14927c52b166SRobert Peterson va_end(args);
14937c52b166SRobert Peterson }
14947c52b166SRobert Peterson
pid_is_meaningful(const struct gfs2_holder * gh)1495cbe6d257SAndreas Gruenbacher static inline bool pid_is_meaningful(const struct gfs2_holder *gh)
1496cbe6d257SAndreas Gruenbacher {
1497cbe6d257SAndreas Gruenbacher if (!(gh->gh_flags & GL_NOPID))
1498cbe6d257SAndreas Gruenbacher return true;
1499cbe6d257SAndreas Gruenbacher if (gh->gh_state == LM_ST_UNLOCKED)
1500cbe6d257SAndreas Gruenbacher return true;
1501cbe6d257SAndreas Gruenbacher return false;
1502cbe6d257SAndreas Gruenbacher }
1503cbe6d257SAndreas Gruenbacher
1504b3b94faaSDavid Teigland /**
1505b3b94faaSDavid Teigland * add_to_queue - Add a holder to the wait queue (but look for recursion)
1506b3b94faaSDavid Teigland * @gh: the holder structure to add
1507b3b94faaSDavid Teigland *
15086802e340SSteven Whitehouse * Eventually we should move the recursive locking trap to a
15096802e340SSteven Whitehouse * debugging option or something like that. This is the fast
15106802e340SSteven Whitehouse * path and needs to have the minimum number of distractions.
15116802e340SSteven Whitehouse *
1512b3b94faaSDavid Teigland */
1513b3b94faaSDavid Teigland
add_to_queue(struct gfs2_holder * gh)15146802e340SSteven Whitehouse static inline void add_to_queue(struct gfs2_holder *gh)
1515f3dd1649SAndreas Gruenbacher __releases(&gl->gl_lockref.lock)
1516f3dd1649SAndreas Gruenbacher __acquires(&gl->gl_lockref.lock)
1517b3b94faaSDavid Teigland {
1518b3b94faaSDavid Teigland struct gfs2_glock *gl = gh->gh_gl;
151915562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
15206802e340SSteven Whitehouse struct list_head *insert_pt = NULL;
15216802e340SSteven Whitehouse struct gfs2_holder *gh2;
1522e5dc76b9SBob Peterson int try_futile = 0;
1523b3b94faaSDavid Teigland
1524ad26967bSBob Peterson GLOCK_BUG_ON(gl, gh->gh_owner_pid == NULL);
1525fee852e3SSteven Whitehouse if (test_and_set_bit(HIF_WAIT, &gh->gh_iflags))
1526ad26967bSBob Peterson GLOCK_BUG_ON(gl, true);
1527190562bdSSteven Whitehouse
15286802e340SSteven Whitehouse if (gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)) {
152961444649SAndreas Gruenbacher if (test_bit(GLF_LOCK, &gl->gl_flags)) {
15308f0028fcSAndreas Gruenbacher struct gfs2_holder *current_gh;
153161444649SAndreas Gruenbacher
1532ba3e77a4SAndreas Gruenbacher current_gh = find_first_holder(gl);
15338f0028fcSAndreas Gruenbacher try_futile = !may_grant(gl, current_gh, gh);
153461444649SAndreas Gruenbacher }
15356802e340SSteven Whitehouse if (test_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags))
15366802e340SSteven Whitehouse goto fail;
1537b3b94faaSDavid Teigland }
1538b3b94faaSDavid Teigland
15396802e340SSteven Whitehouse list_for_each_entry(gh2, &gl->gl_holders, gh_list) {
1540cbe6d257SAndreas Gruenbacher if (likely(gh2->gh_owner_pid != gh->gh_owner_pid))
1541cbe6d257SAndreas Gruenbacher continue;
1542cbe6d257SAndreas Gruenbacher if (gh->gh_gl->gl_ops->go_type == LM_TYPE_FLOCK)
1543cbe6d257SAndreas Gruenbacher continue;
1544cbe6d257SAndreas Gruenbacher if (!pid_is_meaningful(gh2))
1545cbe6d257SAndreas Gruenbacher continue;
15466802e340SSteven Whitehouse goto trap_recursive;
1547cbe6d257SAndreas Gruenbacher }
1548cbe6d257SAndreas Gruenbacher list_for_each_entry(gh2, &gl->gl_holders, gh_list) {
1549e5dc76b9SBob Peterson if (try_futile &&
1550e5dc76b9SBob Peterson !(gh2->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))) {
15516802e340SSteven Whitehouse fail:
15526802e340SSteven Whitehouse gh->gh_error = GLR_TRYFAILED;
15536802e340SSteven Whitehouse gfs2_holder_wake(gh);
15546802e340SSteven Whitehouse return;
1555b3b94faaSDavid Teigland }
15566802e340SSteven Whitehouse if (test_bit(HIF_HOLDER, &gh2->gh_iflags))
15576802e340SSteven Whitehouse continue;
1558b4c20166SAbhijith Das }
1559edae38a6SSteven Whitehouse trace_gfs2_glock_queue(gh, 1);
1560a245769fSSteven Whitehouse gfs2_glstats_inc(gl, GFS2_LKS_QCOUNT);
1561a245769fSSteven Whitehouse gfs2_sbstats_inc(gl, GFS2_LKS_QCOUNT);
15626802e340SSteven Whitehouse if (likely(insert_pt == NULL)) {
15636802e340SSteven Whitehouse list_add_tail(&gh->gh_list, &gl->gl_holders);
15646802e340SSteven Whitehouse return;
15656802e340SSteven Whitehouse }
15666802e340SSteven Whitehouse list_add_tail(&gh->gh_list, insert_pt);
1567969183bcSAndreas Gruenbacher gh = list_first_entry(&gl->gl_holders, struct gfs2_holder, gh_list);
1568f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1569048bca22SSteven Whitehouse if (sdp->sd_lockstruct.ls_ops->lm_cancel)
1570f057f6cdSSteven Whitehouse sdp->sd_lockstruct.ls_ops->lm_cancel(gl);
1571f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
15726802e340SSteven Whitehouse return;
1573b3b94faaSDavid Teigland
15746802e340SSteven Whitehouse trap_recursive:
1575e54c78a2SBob Peterson fs_err(sdp, "original: %pSR\n", (void *)gh2->gh_ip);
1576e54c78a2SBob Peterson fs_err(sdp, "pid: %d\n", pid_nr(gh2->gh_owner_pid));
1577e54c78a2SBob Peterson fs_err(sdp, "lock type: %d req lock state : %d\n",
15786802e340SSteven Whitehouse gh2->gh_gl->gl_name.ln_type, gh2->gh_state);
1579e54c78a2SBob Peterson fs_err(sdp, "new: %pSR\n", (void *)gh->gh_ip);
1580e54c78a2SBob Peterson fs_err(sdp, "pid: %d\n", pid_nr(gh->gh_owner_pid));
1581e54c78a2SBob Peterson fs_err(sdp, "lock type: %d req lock state : %d\n",
15826802e340SSteven Whitehouse gh->gh_gl->gl_name.ln_type, gh->gh_state);
15833792ce97SBob Peterson gfs2_dump_glock(NULL, gl, true);
15846802e340SSteven Whitehouse BUG();
1585b3b94faaSDavid Teigland }
1586b3b94faaSDavid Teigland
1587b3b94faaSDavid Teigland /**
1588b3b94faaSDavid Teigland * gfs2_glock_nq - enqueue a struct gfs2_holder onto a glock (acquire a glock)
1589b3b94faaSDavid Teigland * @gh: the holder structure
1590b3b94faaSDavid Teigland *
1591b3b94faaSDavid Teigland * if (gh->gh_flags & GL_ASYNC), this never returns an error
1592b3b94faaSDavid Teigland *
1593b3b94faaSDavid Teigland * Returns: 0, GLR_TRYFAILED, or errno on failure
1594b3b94faaSDavid Teigland */
1595b3b94faaSDavid Teigland
gfs2_glock_nq(struct gfs2_holder * gh)1596b3b94faaSDavid Teigland int gfs2_glock_nq(struct gfs2_holder *gh)
1597b3b94faaSDavid Teigland {
1598b3b94faaSDavid Teigland struct gfs2_glock *gl = gh->gh_gl;
1599b3b94faaSDavid Teigland int error = 0;
1600b3b94faaSDavid Teigland
1601601ef0d5SBob Peterson if (glock_blocked_by_withdraw(gl) && !(gh->gh_flags & LM_FLAG_NOEXP))
1602b3b94faaSDavid Teigland return -EIO;
1603b3b94faaSDavid Teigland
1604f42ab085SSteven Whitehouse if (test_bit(GLF_LRU, &gl->gl_flags))
1605f42ab085SSteven Whitehouse gfs2_glock_remove_from_lru(gl);
1606f42ab085SSteven Whitehouse
1607a4e8145eSAndreas Gruenbacher gh->gh_error = 0;
1608f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
1609b3b94faaSDavid Teigland add_to_queue(gh);
161001b172b7SBob Peterson if (unlikely((LM_FLAG_NOEXP & gh->gh_flags) &&
161101b172b7SBob Peterson test_and_clear_bit(GLF_FROZEN, &gl->gl_flags))) {
16120809f6ecSSteven Whitehouse set_bit(GLF_REPLY_PENDING, &gl->gl_flags);
161301b172b7SBob Peterson gl->gl_lockref.count++;
1614*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
161501b172b7SBob Peterson }
16166802e340SSteven Whitehouse run_queue(gl, 1);
1617f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1618b3b94faaSDavid Teigland
16196802e340SSteven Whitehouse if (!(gh->gh_flags & GL_ASYNC))
16206802e340SSteven Whitehouse error = gfs2_glock_wait(gh);
1621b3b94faaSDavid Teigland
1622b3b94faaSDavid Teigland return error;
1623b3b94faaSDavid Teigland }
1624b3b94faaSDavid Teigland
1625b3b94faaSDavid Teigland /**
1626b3b94faaSDavid Teigland * gfs2_glock_poll - poll to see if an async request has been completed
1627b3b94faaSDavid Teigland * @gh: the holder
1628b3b94faaSDavid Teigland *
1629b3b94faaSDavid Teigland * Returns: 1 if the request is ready to be gfs2_glock_wait()ed on
1630b3b94faaSDavid Teigland */
1631b3b94faaSDavid Teigland
gfs2_glock_poll(struct gfs2_holder * gh)1632b3b94faaSDavid Teigland int gfs2_glock_poll(struct gfs2_holder *gh)
1633b3b94faaSDavid Teigland {
16346802e340SSteven Whitehouse return test_bit(HIF_WAIT, &gh->gh_iflags) ? 0 : 1;
1635b3b94faaSDavid Teigland }
1636b3b94faaSDavid Teigland
needs_demote(struct gfs2_glock * gl)1637dc732906SBob Peterson static inline bool needs_demote(struct gfs2_glock *gl)
1638dc732906SBob Peterson {
1639dc732906SBob Peterson return (test_bit(GLF_DEMOTE, &gl->gl_flags) ||
1640dc732906SBob Peterson test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags));
1641dc732906SBob Peterson }
1642b3b94faaSDavid Teigland
__gfs2_glock_dq(struct gfs2_holder * gh)1643dc732906SBob Peterson static void __gfs2_glock_dq(struct gfs2_holder *gh)
1644b3b94faaSDavid Teigland {
1645b3b94faaSDavid Teigland struct gfs2_glock *gl = gh->gh_gl;
1646c4f68a13SBenjamin Marzinski unsigned delay = 0;
16476802e340SSteven Whitehouse int fast_path = 0;
1648b3b94faaSDavid Teigland
1649601ef0d5SBob Peterson /*
1650dc732906SBob Peterson * This holder should not be cached, so mark it for demote.
1651dc732906SBob Peterson * Note: this should be done before the check for needs_demote
1652dc732906SBob Peterson * below.
1653dc732906SBob Peterson */
1654b3b94faaSDavid Teigland if (gh->gh_flags & GL_NOCACHE)
165581ffbf65SSteven Whitehouse handle_callback(gl, LM_ST_UNLOCKED, 0, false);
1656b3b94faaSDavid Teigland
1657b3b94faaSDavid Teigland list_del_init(&gh->gh_list);
16587508abc4SBob Peterson clear_bit(HIF_HOLDER, &gh->gh_iflags);
1659dc732906SBob Peterson trace_gfs2_glock_queue(gh, 0);
1660dc732906SBob Peterson
1661dc732906SBob Peterson /*
1662dc732906SBob Peterson * If there hasn't been a demote request we are done.
1663dc732906SBob Peterson * (Let the remaining holders, if any, keep holding it.)
1664dc732906SBob Peterson */
1665dc732906SBob Peterson if (!needs_demote(gl)) {
1666dc732906SBob Peterson if (list_empty(&gl->gl_holders))
16676802e340SSteven Whitehouse fast_path = 1;
1668dc732906SBob Peterson }
166908d73666SBob Peterson
16707881ef3fSRoss Lagerwall if (!test_bit(GLF_LFLUSH, &gl->gl_flags) && demote_ok(gl))
16714abb6ad9SBob Peterson gfs2_glock_add_to_lru(gl);
16724abb6ad9SBob Peterson
16736b0c7440SAndreas Gruenbacher if (unlikely(!fast_path)) {
16746b0c7440SAndreas Gruenbacher gl->gl_lockref.count++;
1675c4f68a13SBenjamin Marzinski if (test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) &&
16767cf8dcd3SBob Peterson !test_bit(GLF_DEMOTE, &gl->gl_flags) &&
16777cf8dcd3SBob Peterson gl->gl_name.ln_type == LM_TYPE_INODE)
16787cf8dcd3SBob Peterson delay = gl->gl_hold_time;
1679*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, delay);
16806b0c7440SAndreas Gruenbacher }
1681dc732906SBob Peterson }
1682dc732906SBob Peterson
1683dc732906SBob Peterson /**
1684dc732906SBob Peterson * gfs2_glock_dq - dequeue a struct gfs2_holder from a glock (release a glock)
1685dc732906SBob Peterson * @gh: the glock holder
1686dc732906SBob Peterson *
1687dc732906SBob Peterson */
gfs2_glock_dq(struct gfs2_holder * gh)1688dc732906SBob Peterson void gfs2_glock_dq(struct gfs2_holder *gh)
1689dc732906SBob Peterson {
1690dc732906SBob Peterson struct gfs2_glock *gl = gh->gh_gl;
16916b46a061SAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
1692dc732906SBob Peterson
1693dc732906SBob Peterson spin_lock(&gl->gl_lockref.lock);
169497236ad5SAndreas Gruenbacher if (!gfs2_holder_queued(gh)) {
169597236ad5SAndreas Gruenbacher /*
169697236ad5SAndreas Gruenbacher * May have already been dequeued because the locking request
169797236ad5SAndreas Gruenbacher * was GL_ASYNC and it has failed in the meantime.
169897236ad5SAndreas Gruenbacher */
169997236ad5SAndreas Gruenbacher goto out;
170097236ad5SAndreas Gruenbacher }
17016b46a061SAndreas Gruenbacher
17021fc05c8dSAndreas Gruenbacher if (list_is_first(&gh->gh_list, &gl->gl_holders) &&
17031fc05c8dSAndreas Gruenbacher !test_bit(HIF_HOLDER, &gh->gh_iflags)) {
17041fc05c8dSAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
17051fc05c8dSAndreas Gruenbacher gl->gl_name.ln_sbd->sd_lockstruct.ls_ops->lm_cancel(gl);
17061fc05c8dSAndreas Gruenbacher wait_on_bit(&gh->gh_iflags, HIF_WAIT, TASK_UNINTERRUPTIBLE);
17071fc05c8dSAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
17081fc05c8dSAndreas Gruenbacher }
17091fc05c8dSAndreas Gruenbacher
17106b46a061SAndreas Gruenbacher /*
17116b46a061SAndreas Gruenbacher * If we're in the process of file system withdraw, we cannot just
17126b46a061SAndreas Gruenbacher * dequeue any glocks until our journal is recovered, lest we introduce
17136b46a061SAndreas Gruenbacher * file system corruption. We need two exceptions to this rule: We need
17146b46a061SAndreas Gruenbacher * to allow unlocking of nondisk glocks and the glock for our own
17156b46a061SAndreas Gruenbacher * journal that needs recovery.
17166b46a061SAndreas Gruenbacher */
17176b46a061SAndreas Gruenbacher if (test_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags) &&
17186b46a061SAndreas Gruenbacher glock_blocked_by_withdraw(gl) &&
17196b46a061SAndreas Gruenbacher gh->gh_gl != sdp->sd_jinode_gl) {
17206b46a061SAndreas Gruenbacher sdp->sd_glock_dqs_held++;
17216b46a061SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
17226b46a061SAndreas Gruenbacher might_sleep();
17236b46a061SAndreas Gruenbacher wait_on_bit(&sdp->sd_flags, SDF_WITHDRAW_RECOVERY,
17246b46a061SAndreas Gruenbacher TASK_UNINTERRUPTIBLE);
17256b46a061SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
17266b46a061SAndreas Gruenbacher }
17276b46a061SAndreas Gruenbacher
1728dc732906SBob Peterson __gfs2_glock_dq(gh);
172997236ad5SAndreas Gruenbacher out:
17306b0c7440SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1731b3b94faaSDavid Teigland }
1732b3b94faaSDavid Teigland
gfs2_glock_dq_wait(struct gfs2_holder * gh)1733d93cfa98SAbhijith Das void gfs2_glock_dq_wait(struct gfs2_holder *gh)
1734d93cfa98SAbhijith Das {
1735d93cfa98SAbhijith Das struct gfs2_glock *gl = gh->gh_gl;
1736d93cfa98SAbhijith Das gfs2_glock_dq(gh);
173781e1d450SBob Peterson might_sleep();
173874316201SNeilBrown wait_on_bit(&gl->gl_flags, GLF_DEMOTE, TASK_UNINTERRUPTIBLE);
1739d93cfa98SAbhijith Das }
1740d93cfa98SAbhijith Das
1741b3b94faaSDavid Teigland /**
1742b3b94faaSDavid Teigland * gfs2_glock_dq_uninit - dequeue a holder from a glock and initialize it
1743b3b94faaSDavid Teigland * @gh: the holder structure
1744b3b94faaSDavid Teigland *
1745b3b94faaSDavid Teigland */
1746b3b94faaSDavid Teigland
gfs2_glock_dq_uninit(struct gfs2_holder * gh)1747b3b94faaSDavid Teigland void gfs2_glock_dq_uninit(struct gfs2_holder *gh)
1748b3b94faaSDavid Teigland {
1749b3b94faaSDavid Teigland gfs2_glock_dq(gh);
1750b3b94faaSDavid Teigland gfs2_holder_uninit(gh);
1751b3b94faaSDavid Teigland }
1752b3b94faaSDavid Teigland
1753b3b94faaSDavid Teigland /**
1754b3b94faaSDavid Teigland * gfs2_glock_nq_num - acquire a glock based on lock number
1755b3b94faaSDavid Teigland * @sdp: the filesystem
1756b3b94faaSDavid Teigland * @number: the lock number
1757b3b94faaSDavid Teigland * @glops: the glock operations for the type of glock
1758b3b94faaSDavid Teigland * @state: the state to acquire the glock in
175925985edcSLucas De Marchi * @flags: modifier flags for the acquisition
1760b3b94faaSDavid Teigland * @gh: the struct gfs2_holder
1761b3b94faaSDavid Teigland *
1762b3b94faaSDavid Teigland * Returns: errno
1763b3b94faaSDavid Teigland */
1764b3b94faaSDavid Teigland
gfs2_glock_nq_num(struct gfs2_sbd * sdp,u64 number,const struct gfs2_glock_operations * glops,unsigned int state,u16 flags,struct gfs2_holder * gh)1765cd915493SSteven Whitehouse int gfs2_glock_nq_num(struct gfs2_sbd *sdp, u64 number,
17668fb4b536SSteven Whitehouse const struct gfs2_glock_operations *glops,
1767b58bf407SBob Peterson unsigned int state, u16 flags, struct gfs2_holder *gh)
1768b3b94faaSDavid Teigland {
1769b3b94faaSDavid Teigland struct gfs2_glock *gl;
1770b3b94faaSDavid Teigland int error;
1771b3b94faaSDavid Teigland
1772b3b94faaSDavid Teigland error = gfs2_glock_get(sdp, number, glops, CREATE, &gl);
1773b3b94faaSDavid Teigland if (!error) {
1774b3b94faaSDavid Teigland error = gfs2_glock_nq_init(gl, state, flags, gh);
1775b3b94faaSDavid Teigland gfs2_glock_put(gl);
1776b3b94faaSDavid Teigland }
1777b3b94faaSDavid Teigland
1778b3b94faaSDavid Teigland return error;
1779b3b94faaSDavid Teigland }
1780b3b94faaSDavid Teigland
1781b3b94faaSDavid Teigland /**
1782b3b94faaSDavid Teigland * glock_compare - Compare two struct gfs2_glock structures for sorting
1783b3b94faaSDavid Teigland * @arg_a: the first structure
1784b3b94faaSDavid Teigland * @arg_b: the second structure
1785b3b94faaSDavid Teigland *
1786b3b94faaSDavid Teigland */
1787b3b94faaSDavid Teigland
glock_compare(const void * arg_a,const void * arg_b)1788b3b94faaSDavid Teigland static int glock_compare(const void *arg_a, const void *arg_b)
1789b3b94faaSDavid Teigland {
1790a5e08a9eSSteven Whitehouse const struct gfs2_holder *gh_a = *(const struct gfs2_holder **)arg_a;
1791a5e08a9eSSteven Whitehouse const struct gfs2_holder *gh_b = *(const struct gfs2_holder **)arg_b;
1792a5e08a9eSSteven Whitehouse const struct lm_lockname *a = &gh_a->gh_gl->gl_name;
1793a5e08a9eSSteven Whitehouse const struct lm_lockname *b = &gh_b->gh_gl->gl_name;
1794b3b94faaSDavid Teigland
1795b3b94faaSDavid Teigland if (a->ln_number > b->ln_number)
1796a5e08a9eSSteven Whitehouse return 1;
1797a5e08a9eSSteven Whitehouse if (a->ln_number < b->ln_number)
1798a5e08a9eSSteven Whitehouse return -1;
17991c0f4872SSteven Whitehouse BUG_ON(gh_a->gh_gl->gl_ops->go_type == gh_b->gh_gl->gl_ops->go_type);
1800a5e08a9eSSteven Whitehouse return 0;
1801b3b94faaSDavid Teigland }
1802b3b94faaSDavid Teigland
1803b3b94faaSDavid Teigland /**
180444dab005SAndreas Gruenbacher * nq_m_sync - synchronously acquire more than one glock in deadlock free order
1805b3b94faaSDavid Teigland * @num_gh: the number of structures
1806b3b94faaSDavid Teigland * @ghs: an array of struct gfs2_holder structures
1807c551f66cSLee Jones * @p: placeholder for the holder structure to pass back
1808b3b94faaSDavid Teigland *
1809b3b94faaSDavid Teigland * Returns: 0 on success (all glocks acquired),
1810b3b94faaSDavid Teigland * errno on failure (no glocks acquired)
1811b3b94faaSDavid Teigland */
1812b3b94faaSDavid Teigland
nq_m_sync(unsigned int num_gh,struct gfs2_holder * ghs,struct gfs2_holder ** p)1813b3b94faaSDavid Teigland static int nq_m_sync(unsigned int num_gh, struct gfs2_holder *ghs,
1814b3b94faaSDavid Teigland struct gfs2_holder **p)
1815b3b94faaSDavid Teigland {
1816b3b94faaSDavid Teigland unsigned int x;
1817b3b94faaSDavid Teigland int error = 0;
1818b3b94faaSDavid Teigland
1819b3b94faaSDavid Teigland for (x = 0; x < num_gh; x++)
1820b3b94faaSDavid Teigland p[x] = &ghs[x];
1821b3b94faaSDavid Teigland
1822b3b94faaSDavid Teigland sort(p, num_gh, sizeof(struct gfs2_holder *), glock_compare, NULL);
1823b3b94faaSDavid Teigland
1824b3b94faaSDavid Teigland for (x = 0; x < num_gh; x++) {
1825b3b94faaSDavid Teigland error = gfs2_glock_nq(p[x]);
1826b3b94faaSDavid Teigland if (error) {
1827b3b94faaSDavid Teigland while (x--)
1828b3b94faaSDavid Teigland gfs2_glock_dq(p[x]);
1829b3b94faaSDavid Teigland break;
1830b3b94faaSDavid Teigland }
1831b3b94faaSDavid Teigland }
1832b3b94faaSDavid Teigland
1833b3b94faaSDavid Teigland return error;
1834b3b94faaSDavid Teigland }
1835b3b94faaSDavid Teigland
1836b3b94faaSDavid Teigland /**
1837b3b94faaSDavid Teigland * gfs2_glock_nq_m - acquire multiple glocks
1838b3b94faaSDavid Teigland * @num_gh: the number of structures
1839b3b94faaSDavid Teigland * @ghs: an array of struct gfs2_holder structures
1840b3b94faaSDavid Teigland *
1841b3b94faaSDavid Teigland * Returns: 0 on success (all glocks acquired),
1842b3b94faaSDavid Teigland * errno on failure (no glocks acquired)
1843b3b94faaSDavid Teigland */
1844b3b94faaSDavid Teigland
gfs2_glock_nq_m(unsigned int num_gh,struct gfs2_holder * ghs)1845b3b94faaSDavid Teigland int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs)
1846b3b94faaSDavid Teigland {
1847eaf5bd3cSSteven Whitehouse struct gfs2_holder *tmp[4];
1848eaf5bd3cSSteven Whitehouse struct gfs2_holder **pph = tmp;
1849b3b94faaSDavid Teigland int error = 0;
1850b3b94faaSDavid Teigland
1851eaf5bd3cSSteven Whitehouse switch(num_gh) {
1852eaf5bd3cSSteven Whitehouse case 0:
1853b3b94faaSDavid Teigland return 0;
1854eaf5bd3cSSteven Whitehouse case 1:
1855b3b94faaSDavid Teigland return gfs2_glock_nq(ghs);
1856eaf5bd3cSSteven Whitehouse default:
1857eaf5bd3cSSteven Whitehouse if (num_gh <= 4)
1858b3b94faaSDavid Teigland break;
18596da2ec56SKees Cook pph = kmalloc_array(num_gh, sizeof(struct gfs2_holder *),
18606da2ec56SKees Cook GFP_NOFS);
1861eaf5bd3cSSteven Whitehouse if (!pph)
1862eaf5bd3cSSteven Whitehouse return -ENOMEM;
1863b3b94faaSDavid Teigland }
1864b3b94faaSDavid Teigland
1865eaf5bd3cSSteven Whitehouse error = nq_m_sync(num_gh, ghs, pph);
1866b3b94faaSDavid Teigland
1867eaf5bd3cSSteven Whitehouse if (pph != tmp)
1868eaf5bd3cSSteven Whitehouse kfree(pph);
1869b3b94faaSDavid Teigland
1870b3b94faaSDavid Teigland return error;
1871b3b94faaSDavid Teigland }
1872b3b94faaSDavid Teigland
1873b3b94faaSDavid Teigland /**
1874b3b94faaSDavid Teigland * gfs2_glock_dq_m - release multiple glocks
1875b3b94faaSDavid Teigland * @num_gh: the number of structures
1876b3b94faaSDavid Teigland * @ghs: an array of struct gfs2_holder structures
1877b3b94faaSDavid Teigland *
1878b3b94faaSDavid Teigland */
1879b3b94faaSDavid Teigland
gfs2_glock_dq_m(unsigned int num_gh,struct gfs2_holder * ghs)1880b3b94faaSDavid Teigland void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs)
1881b3b94faaSDavid Teigland {
1882fa1bbdeaSBob Peterson while (num_gh--)
1883fa1bbdeaSBob Peterson gfs2_glock_dq(&ghs[num_gh]);
1884b3b94faaSDavid Teigland }
1885b3b94faaSDavid Teigland
gfs2_glock_cb(struct gfs2_glock * gl,unsigned int state)1886f057f6cdSSteven Whitehouse void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state)
1887da755fdbSSteven Whitehouse {
1888c4f68a13SBenjamin Marzinski unsigned long delay = 0;
1889c4f68a13SBenjamin Marzinski unsigned long holdtime;
1890c4f68a13SBenjamin Marzinski unsigned long now = jiffies;
1891b3b94faaSDavid Teigland
1892f057f6cdSSteven Whitehouse gfs2_glock_hold(gl);
1893e2c6c8a7SBob Peterson spin_lock(&gl->gl_lockref.lock);
18947cf8dcd3SBob Peterson holdtime = gl->gl_tchange + gl->gl_hold_time;
1895e2c6c8a7SBob Peterson if (!list_empty(&gl->gl_holders) &&
18967cf8dcd3SBob Peterson gl->gl_name.ln_type == LM_TYPE_INODE) {
1897c4f68a13SBenjamin Marzinski if (time_before(now, holdtime))
1898c4f68a13SBenjamin Marzinski delay = holdtime - now;
1899dff52574SSteven Whitehouse if (test_bit(GLF_REPLY_PENDING, &gl->gl_flags))
19007cf8dcd3SBob Peterson delay = gl->gl_hold_time;
19017b5e3d5fSSteven Whitehouse }
190281ffbf65SSteven Whitehouse handle_callback(gl, state, delay, true);
1903*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, delay);
1904f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1905b3b94faaSDavid Teigland }
1906b3b94faaSDavid Teigland
1907b3b94faaSDavid Teigland /**
19080809f6ecSSteven Whitehouse * gfs2_should_freeze - Figure out if glock should be frozen
19090809f6ecSSteven Whitehouse * @gl: The glock in question
19100809f6ecSSteven Whitehouse *
19110809f6ecSSteven Whitehouse * Glocks are not frozen if (a) the result of the dlm operation is
19120809f6ecSSteven Whitehouse * an error, (b) the locking operation was an unlock operation or
19130809f6ecSSteven Whitehouse * (c) if there is a "noexp" flagged request anywhere in the queue
19140809f6ecSSteven Whitehouse *
19150809f6ecSSteven Whitehouse * Returns: 1 if freezing should occur, 0 otherwise
19160809f6ecSSteven Whitehouse */
19170809f6ecSSteven Whitehouse
gfs2_should_freeze(const struct gfs2_glock * gl)19180809f6ecSSteven Whitehouse static int gfs2_should_freeze(const struct gfs2_glock *gl)
19190809f6ecSSteven Whitehouse {
19200809f6ecSSteven Whitehouse const struct gfs2_holder *gh;
19210809f6ecSSteven Whitehouse
19220809f6ecSSteven Whitehouse if (gl->gl_reply & ~LM_OUT_ST_MASK)
19230809f6ecSSteven Whitehouse return 0;
19240809f6ecSSteven Whitehouse if (gl->gl_target == LM_ST_UNLOCKED)
19250809f6ecSSteven Whitehouse return 0;
19260809f6ecSSteven Whitehouse
19270809f6ecSSteven Whitehouse list_for_each_entry(gh, &gl->gl_holders, gh_list) {
19280809f6ecSSteven Whitehouse if (test_bit(HIF_HOLDER, &gh->gh_iflags))
19290809f6ecSSteven Whitehouse continue;
19300809f6ecSSteven Whitehouse if (LM_FLAG_NOEXP & gh->gh_flags)
19310809f6ecSSteven Whitehouse return 0;
19320809f6ecSSteven Whitehouse }
19330809f6ecSSteven Whitehouse
19340809f6ecSSteven Whitehouse return 1;
19350809f6ecSSteven Whitehouse }
19360809f6ecSSteven Whitehouse
19370809f6ecSSteven Whitehouse /**
1938f057f6cdSSteven Whitehouse * gfs2_glock_complete - Callback used by locking
1939f057f6cdSSteven Whitehouse * @gl: Pointer to the glock
1940f057f6cdSSteven Whitehouse * @ret: The return value from the dlm
1941b3b94faaSDavid Teigland *
1942f3dd1649SAndreas Gruenbacher * The gl_reply field is under the gl_lockref.lock lock so that it is ok
194347a25380SSteven Whitehouse * to use a bitfield shared with other glock state fields.
1944b3b94faaSDavid Teigland */
1945b3b94faaSDavid Teigland
gfs2_glock_complete(struct gfs2_glock * gl,int ret)1946f057f6cdSSteven Whitehouse void gfs2_glock_complete(struct gfs2_glock *gl, int ret)
1947b3b94faaSDavid Teigland {
194815562c43SBob Peterson struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct;
19490809f6ecSSteven Whitehouse
1950f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
1951f057f6cdSSteven Whitehouse gl->gl_reply = ret;
19520809f6ecSSteven Whitehouse
1953e0c2a9aaSDavid Teigland if (unlikely(test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags))) {
19540809f6ecSSteven Whitehouse if (gfs2_should_freeze(gl)) {
1955f057f6cdSSteven Whitehouse set_bit(GLF_FROZEN, &gl->gl_flags);
1956f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1957b3b94faaSDavid Teigland return;
1958b3b94faaSDavid Teigland }
19590809f6ecSSteven Whitehouse }
196047a25380SSteven Whitehouse
1961e66cf161SSteven Whitehouse gl->gl_lockref.count++;
1962f057f6cdSSteven Whitehouse set_bit(GLF_REPLY_PENDING, &gl->gl_flags);
1963*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
1964f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
1965b3b94faaSDavid Teigland }
1966b3b94faaSDavid Teigland
glock_cmp(void * priv,const struct list_head * a,const struct list_head * b)19674f0f586bSSami Tolvanen static int glock_cmp(void *priv, const struct list_head *a,
19684f0f586bSSami Tolvanen const struct list_head *b)
19694506a519SSteven Whitehouse {
19704506a519SSteven Whitehouse struct gfs2_glock *gla, *glb;
19714506a519SSteven Whitehouse
19724506a519SSteven Whitehouse gla = list_entry(a, struct gfs2_glock, gl_lru);
19734506a519SSteven Whitehouse glb = list_entry(b, struct gfs2_glock, gl_lru);
19744506a519SSteven Whitehouse
19754506a519SSteven Whitehouse if (gla->gl_name.ln_number > glb->gl_name.ln_number)
19764506a519SSteven Whitehouse return 1;
19774506a519SSteven Whitehouse if (gla->gl_name.ln_number < glb->gl_name.ln_number)
19784506a519SSteven Whitehouse return -1;
19794506a519SSteven Whitehouse
19804506a519SSteven Whitehouse return 0;
19814506a519SSteven Whitehouse }
19824506a519SSteven Whitehouse
19832a005855SSteven Whitehouse /**
19844506a519SSteven Whitehouse * gfs2_dispose_glock_lru - Demote a list of glocks
19854506a519SSteven Whitehouse * @list: The list to dispose of
19862a005855SSteven Whitehouse *
19874506a519SSteven Whitehouse * Disposing of glocks may involve disk accesses, so that here we sort
19884506a519SSteven Whitehouse * the glocks by number (i.e. disk location of the inodes) so that if
19894506a519SSteven Whitehouse * there are any such accesses, they'll be sent in order (mostly).
19904506a519SSteven Whitehouse *
19914506a519SSteven Whitehouse * Must be called under the lru_lock, but may drop and retake this
19924506a519SSteven Whitehouse * lock. While the lru_lock is dropped, entries may vanish from the
19934506a519SSteven Whitehouse * list, but no new entries will appear on the list (since it is
19944506a519SSteven Whitehouse * private)
19952a005855SSteven Whitehouse */
1996b3b94faaSDavid Teigland
gfs2_dispose_glock_lru(struct list_head * list)19974506a519SSteven Whitehouse static void gfs2_dispose_glock_lru(struct list_head *list)
19984506a519SSteven Whitehouse __releases(&lru_lock)
19994506a519SSteven Whitehouse __acquires(&lru_lock)
2000b3b94faaSDavid Teigland {
2001b3b94faaSDavid Teigland struct gfs2_glock *gl;
2002b3b94faaSDavid Teigland
20034506a519SSteven Whitehouse list_sort(NULL, list, glock_cmp);
20044506a519SSteven Whitehouse
20054506a519SSteven Whitehouse while(!list_empty(list)) {
2006969183bcSAndreas Gruenbacher gl = list_first_entry(list, struct gfs2_glock, gl_lru);
200797cc1025SSteven Whitehouse list_del_init(&gl->gl_lru);
20081ab19c5dSHillf Danton clear_bit(GLF_LRU, &gl->gl_flags);
2009f3dd1649SAndreas Gruenbacher if (!spin_trylock(&gl->gl_lockref.lock)) {
201094a09a39SSteven Whitehouse add_back_to_lru:
2011e66cf161SSteven Whitehouse list_add(&gl->gl_lru, &lru_list);
20127881ef3fSRoss Lagerwall set_bit(GLF_LRU, &gl->gl_flags);
2013e66cf161SSteven Whitehouse atomic_inc(&lru_count);
2014e66cf161SSteven Whitehouse continue;
2015e66cf161SSteven Whitehouse }
20166e92dd3aSAndreas Gruenbacher if (test_bit(GLF_LOCK, &gl->gl_flags)) {
2017f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
201894a09a39SSteven Whitehouse goto add_back_to_lru;
201994a09a39SSteven Whitehouse }
2020e66cf161SSteven Whitehouse gl->gl_lockref.count++;
20214506a519SSteven Whitehouse if (demote_ok(gl))
202281ffbf65SSteven Whitehouse handle_callback(gl, LM_ST_UNLOCKED, 0, false);
2023*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
2024f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
202594a09a39SSteven Whitehouse cond_resched_lock(&lru_lock);
20264506a519SSteven Whitehouse }
20274506a519SSteven Whitehouse }
20284506a519SSteven Whitehouse
20294506a519SSteven Whitehouse /**
20304506a519SSteven Whitehouse * gfs2_scan_glock_lru - Scan the LRU looking for locks to demote
20314506a519SSteven Whitehouse * @nr: The number of entries to scan
20324506a519SSteven Whitehouse *
20334506a519SSteven Whitehouse * This function selects the entries on the LRU which are able to
20344506a519SSteven Whitehouse * be demoted, and then kicks off the process by calling
20354506a519SSteven Whitehouse * gfs2_dispose_glock_lru() above.
20364506a519SSteven Whitehouse */
20374506a519SSteven Whitehouse
gfs2_scan_glock_lru(int nr)20381ab6c499SDave Chinner static long gfs2_scan_glock_lru(int nr)
20394506a519SSteven Whitehouse {
20408fb8f70eSAndreas Gruenbacher struct gfs2_glock *gl, *next;
20414506a519SSteven Whitehouse LIST_HEAD(dispose);
20421ab6c499SDave Chinner long freed = 0;
20434506a519SSteven Whitehouse
20444506a519SSteven Whitehouse spin_lock(&lru_lock);
20458fb8f70eSAndreas Gruenbacher list_for_each_entry_safe(gl, next, &lru_list, gl_lru) {
20468fb8f70eSAndreas Gruenbacher if (nr-- <= 0)
20478fb8f70eSAndreas Gruenbacher break;
20484506a519SSteven Whitehouse /* Test for being demotable */
204994a09a39SSteven Whitehouse if (!test_bit(GLF_LOCK, &gl->gl_flags)) {
2050228804a3SAndreas Gruenbacher if (!spin_trylock(&gl->gl_lockref.lock))
2051228804a3SAndreas Gruenbacher continue;
205262862485SBob Peterson if (gl->gl_lockref.count <= 1 &&
205362862485SBob Peterson (gl->gl_state == LM_ST_UNLOCKED ||
205462862485SBob Peterson demote_ok(gl))) {
20554506a519SSteven Whitehouse list_move(&gl->gl_lru, &dispose);
20564506a519SSteven Whitehouse atomic_dec(&lru_count);
20571ab6c499SDave Chinner freed++;
205897cc1025SSteven Whitehouse }
2059228804a3SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
2060228804a3SAndreas Gruenbacher }
206197cc1025SSteven Whitehouse }
20624506a519SSteven Whitehouse if (!list_empty(&dispose))
20634506a519SSteven Whitehouse gfs2_dispose_glock_lru(&dispose);
206497cc1025SSteven Whitehouse spin_unlock(&lru_lock);
20651ab6c499SDave Chinner
20661ab6c499SDave Chinner return freed;
20672a005855SSteven Whitehouse }
20682a005855SSteven Whitehouse
gfs2_glock_shrink_scan(struct shrinker * shrink,struct shrink_control * sc)20691ab6c499SDave Chinner static unsigned long gfs2_glock_shrink_scan(struct shrinker *shrink,
20702a005855SSteven Whitehouse struct shrink_control *sc)
20712a005855SSteven Whitehouse {
20722a005855SSteven Whitehouse if (!(sc->gfp_mask & __GFP_FS))
20731ab6c499SDave Chinner return SHRINK_STOP;
20741ab6c499SDave Chinner return gfs2_scan_glock_lru(sc->nr_to_scan);
20752a005855SSteven Whitehouse }
20762a005855SSteven Whitehouse
gfs2_glock_shrink_count(struct shrinker * shrink,struct shrink_control * sc)20771ab6c499SDave Chinner static unsigned long gfs2_glock_shrink_count(struct shrinker *shrink,
20781ab6c499SDave Chinner struct shrink_control *sc)
20791ab6c499SDave Chinner {
208055f841ceSGlauber Costa return vfs_pressure_ratio(atomic_read(&lru_count));
208197cc1025SSteven Whitehouse }
208297cc1025SSteven Whitehouse
208397cc1025SSteven Whitehouse static struct shrinker glock_shrinker = {
208497cc1025SSteven Whitehouse .seeks = DEFAULT_SEEKS,
20851ab6c499SDave Chinner .count_objects = gfs2_glock_shrink_count,
20861ab6c499SDave Chinner .scan_objects = gfs2_glock_shrink_scan,
208797cc1025SSteven Whitehouse };
2088b3b94faaSDavid Teigland
2089b3b94faaSDavid Teigland /**
2090dbffb29dSBob Peterson * glock_hash_walk - Call a function for glock in a hash bucket
2091b3b94faaSDavid Teigland * @examiner: the function
2092b3b94faaSDavid Teigland * @sdp: the filesystem
2093b3b94faaSDavid Teigland *
209498687f42SHerbert Xu * Note that the function can be called multiple times on the same
209598687f42SHerbert Xu * object. So the user must ensure that the function can cope with
209698687f42SHerbert Xu * that.
2097b3b94faaSDavid Teigland */
2098b3b94faaSDavid Teigland
glock_hash_walk(glock_examiner examiner,const struct gfs2_sbd * sdp)209988ffbf3eSBob Peterson static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd *sdp)
2100b3b94faaSDavid Teigland {
2101bc015cb8SSteven Whitehouse struct gfs2_glock *gl;
210298687f42SHerbert Xu struct rhashtable_iter iter;
2103b3b94faaSDavid Teigland
210498687f42SHerbert Xu rhashtable_walk_enter(&gl_hash_table, &iter);
210598687f42SHerbert Xu
210698687f42SHerbert Xu do {
210797a6ec4aSTom Herbert rhashtable_walk_start(&iter);
210898687f42SHerbert Xu
21097427f3bbSAndreas Gruenbacher while ((gl = rhashtable_walk_next(&iter)) && !IS_ERR(gl)) {
21107427f3bbSAndreas Gruenbacher if (gl->gl_name.ln_sbd == sdp)
2111b3b94faaSDavid Teigland examiner(gl);
21127427f3bbSAndreas Gruenbacher }
211398687f42SHerbert Xu
211498687f42SHerbert Xu rhashtable_walk_stop(&iter);
211598687f42SHerbert Xu } while (cond_resched(), gl == ERR_PTR(-EAGAIN));
211698687f42SHerbert Xu
211798687f42SHerbert Xu rhashtable_walk_exit(&iter);
2118bc015cb8SSteven Whitehouse }
2119bc015cb8SSteven Whitehouse
gfs2_cancel_delete_work(struct gfs2_glock * gl)2120a0e3cc65SAndreas Gruenbacher void gfs2_cancel_delete_work(struct gfs2_glock *gl)
2121a0e3cc65SAndreas Gruenbacher {
2122f0e56edcSAndreas Gruenbacher clear_bit(GLF_TRY_TO_EVICT, &gl->gl_flags);
21234389447fSAndreas Gruenbacher clear_bit(GLF_VERIFY_DELETE, &gl->gl_flags);
21243056dc46SAndreas Gruenbacher if (cancel_delayed_work(&gl->gl_delete))
2125a0e3cc65SAndreas Gruenbacher gfs2_glock_put(gl);
2126a0e3cc65SAndreas Gruenbacher }
2127a0e3cc65SAndreas Gruenbacher
flush_delete_work(struct gfs2_glock * gl)2128a0e3cc65SAndreas Gruenbacher static void flush_delete_work(struct gfs2_glock *gl)
2129a0e3cc65SAndreas Gruenbacher {
21302ffed529SBob Peterson if (gl->gl_name.ln_type == LM_TYPE_IOPEN) {
21310247f4e9SAndreas Gruenbacher struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
21320247f4e9SAndreas Gruenbacher
213334244d71SAndreas Gruenbacher if (cancel_delayed_work(&gl->gl_delete)) {
21340247f4e9SAndreas Gruenbacher queue_delayed_work(sdp->sd_delete_wq,
213534244d71SAndreas Gruenbacher &gl->gl_delete, 0);
213634244d71SAndreas Gruenbacher }
21372ffed529SBob Peterson }
2138a0e3cc65SAndreas Gruenbacher }
2139a0e3cc65SAndreas Gruenbacher
gfs2_flush_delete_work(struct gfs2_sbd * sdp)2140a0e3cc65SAndreas Gruenbacher void gfs2_flush_delete_work(struct gfs2_sbd *sdp)
2141a0e3cc65SAndreas Gruenbacher {
2142a0e3cc65SAndreas Gruenbacher glock_hash_walk(flush_delete_work, sdp);
21430247f4e9SAndreas Gruenbacher flush_workqueue(sdp->sd_delete_wq);
2144a0e3cc65SAndreas Gruenbacher }
2145a0e3cc65SAndreas Gruenbacher
2146f057f6cdSSteven Whitehouse /**
2147f057f6cdSSteven Whitehouse * thaw_glock - thaw out a glock which has an unprocessed reply waiting
2148f057f6cdSSteven Whitehouse * @gl: The glock to thaw
2149f057f6cdSSteven Whitehouse *
2150f057f6cdSSteven Whitehouse */
2151f057f6cdSSteven Whitehouse
thaw_glock(struct gfs2_glock * gl)2152f057f6cdSSteven Whitehouse static void thaw_glock(struct gfs2_glock *gl)
2153f057f6cdSSteven Whitehouse {
21547427f3bbSAndreas Gruenbacher if (!test_and_clear_bit(GLF_FROZEN, &gl->gl_flags))
21556b0c7440SAndreas Gruenbacher return;
21567427f3bbSAndreas Gruenbacher if (!lockref_get_not_dead(&gl->gl_lockref))
21577427f3bbSAndreas Gruenbacher return;
2158b68b9dd7SAndreas Gruenbacher
2159b68b9dd7SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
21606b0c7440SAndreas Gruenbacher set_bit(GLF_REPLY_PENDING, &gl->gl_flags);
2161*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
2162b68b9dd7SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
21637286b31eSSteven Whitehouse }
2164f057f6cdSSteven Whitehouse
2165b3b94faaSDavid Teigland /**
2166b3b94faaSDavid Teigland * clear_glock - look at a glock and see if we can free it from glock cache
2167b3b94faaSDavid Teigland * @gl: the glock to look at
2168b3b94faaSDavid Teigland *
2169b3b94faaSDavid Teigland */
2170b3b94faaSDavid Teigland
clear_glock(struct gfs2_glock * gl)2171b3b94faaSDavid Teigland static void clear_glock(struct gfs2_glock *gl)
2172b3b94faaSDavid Teigland {
2173f42ab085SSteven Whitehouse gfs2_glock_remove_from_lru(gl);
2174b3b94faaSDavid Teigland
2175f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
21767427f3bbSAndreas Gruenbacher if (!__lockref_is_dead(&gl->gl_lockref)) {
21777427f3bbSAndreas Gruenbacher gl->gl_lockref.count++;
2178c741c455SSteven Whitehouse if (gl->gl_state != LM_ST_UNLOCKED)
217981ffbf65SSteven Whitehouse handle_callback(gl, LM_ST_UNLOCKED, 0, false);
2180*d7f0c4c9SAndreas Gruenbacher gfs2_glock_queue_work(gl, 0);
21817427f3bbSAndreas Gruenbacher }
2182f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
2183b3b94faaSDavid Teigland }
2184b3b94faaSDavid Teigland
2185b3b94faaSDavid Teigland /**
2186f057f6cdSSteven Whitehouse * gfs2_glock_thaw - Thaw any frozen glocks
2187f057f6cdSSteven Whitehouse * @sdp: The super block
2188f057f6cdSSteven Whitehouse *
2189f057f6cdSSteven Whitehouse */
2190f057f6cdSSteven Whitehouse
gfs2_glock_thaw(struct gfs2_sbd * sdp)2191f057f6cdSSteven Whitehouse void gfs2_glock_thaw(struct gfs2_sbd *sdp)
2192f057f6cdSSteven Whitehouse {
2193bc015cb8SSteven Whitehouse glock_hash_walk(thaw_glock, sdp);
2194bc015cb8SSteven Whitehouse }
2195f057f6cdSSteven Whitehouse
dump_glock(struct seq_file * seq,struct gfs2_glock * gl,bool fsid)21963792ce97SBob Peterson static void dump_glock(struct seq_file *seq, struct gfs2_glock *gl, bool fsid)
2197bc015cb8SSteven Whitehouse {
2198f3dd1649SAndreas Gruenbacher spin_lock(&gl->gl_lockref.lock);
21993792ce97SBob Peterson gfs2_dump_glock(seq, gl, fsid);
2200f3dd1649SAndreas Gruenbacher spin_unlock(&gl->gl_lockref.lock);
2201bc015cb8SSteven Whitehouse }
2202bc015cb8SSteven Whitehouse
dump_glock_func(struct gfs2_glock * gl)2203bc015cb8SSteven Whitehouse static void dump_glock_func(struct gfs2_glock *gl)
2204bc015cb8SSteven Whitehouse {
22053792ce97SBob Peterson dump_glock(NULL, gl, true);
2206f057f6cdSSteven Whitehouse }
2207f057f6cdSSteven Whitehouse
withdraw_dq(struct gfs2_glock * gl)2208053640a7SBob Peterson static void withdraw_dq(struct gfs2_glock *gl)
2209053640a7SBob Peterson {
2210053640a7SBob Peterson spin_lock(&gl->gl_lockref.lock);
2211053640a7SBob Peterson if (!__lockref_is_dead(&gl->gl_lockref) &&
2212053640a7SBob Peterson glock_blocked_by_withdraw(gl))
2213053640a7SBob Peterson do_error(gl, LM_OUT_ERROR); /* remove pending waiters */
2214053640a7SBob Peterson spin_unlock(&gl->gl_lockref.lock);
2215053640a7SBob Peterson }
2216053640a7SBob Peterson
gfs2_gl_dq_holders(struct gfs2_sbd * sdp)2217053640a7SBob Peterson void gfs2_gl_dq_holders(struct gfs2_sbd *sdp)
2218053640a7SBob Peterson {
2219053640a7SBob Peterson glock_hash_walk(withdraw_dq, sdp);
2220053640a7SBob Peterson }
2221053640a7SBob Peterson
2222f057f6cdSSteven Whitehouse /**
2223b3b94faaSDavid Teigland * gfs2_gl_hash_clear - Empty out the glock hash table
2224b3b94faaSDavid Teigland * @sdp: the filesystem
2225b3b94faaSDavid Teigland *
22261bdad606SSteven Whitehouse * Called when unmounting the filesystem.
2227b3b94faaSDavid Teigland */
2228b3b94faaSDavid Teigland
gfs2_gl_hash_clear(struct gfs2_sbd * sdp)2229fefc03bfSSteven Whitehouse void gfs2_gl_hash_clear(struct gfs2_sbd *sdp)
2230b3b94faaSDavid Teigland {
2231fb6791d1SDavid Teigland set_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags);
2232222cb538SBob Peterson flush_workqueue(glock_workqueue);
2233bc015cb8SSteven Whitehouse glock_hash_walk(clear_glock, sdp);
22348f05228eSSteven Whitehouse flush_workqueue(glock_workqueue);
22353c69c437SAndreas Gruenbacher wait_event_timeout(sdp->sd_kill_wait,
22362aba1b5bSBob Peterson atomic_read(&sdp->sd_glock_disposal) == 0,
22372aba1b5bSBob Peterson HZ * 600);
22380636b34bSAndreas Gruenbacher gfs2_lm_unmount(sdp);
22390636b34bSAndreas Gruenbacher gfs2_free_dead_glocks(sdp);
2240bc015cb8SSteven Whitehouse glock_hash_walk(dump_glock_func, sdp);
2241b3b94faaSDavid Teigland }
2242b3b94faaSDavid Teigland
state2str(unsigned state)22436802e340SSteven Whitehouse static const char *state2str(unsigned state)
224404b933f2SRobert Peterson {
22456802e340SSteven Whitehouse switch(state) {
22466802e340SSteven Whitehouse case LM_ST_UNLOCKED:
22476802e340SSteven Whitehouse return "UN";
22486802e340SSteven Whitehouse case LM_ST_SHARED:
22496802e340SSteven Whitehouse return "SH";
22506802e340SSteven Whitehouse case LM_ST_DEFERRED:
22516802e340SSteven Whitehouse return "DF";
22526802e340SSteven Whitehouse case LM_ST_EXCLUSIVE:
22536802e340SSteven Whitehouse return "EX";
22546802e340SSteven Whitehouse }
22556802e340SSteven Whitehouse return "??";
22566802e340SSteven Whitehouse }
225704b933f2SRobert Peterson
hflags2str(char * buf,u16 flags,unsigned long iflags)2258b58bf407SBob Peterson static const char *hflags2str(char *buf, u16 flags, unsigned long iflags)
22596802e340SSteven Whitehouse {
22606802e340SSteven Whitehouse char *p = buf;
22616802e340SSteven Whitehouse if (flags & LM_FLAG_TRY)
22626802e340SSteven Whitehouse *p++ = 't';
22636802e340SSteven Whitehouse if (flags & LM_FLAG_TRY_1CB)
22646802e340SSteven Whitehouse *p++ = 'T';
22656802e340SSteven Whitehouse if (flags & LM_FLAG_NOEXP)
22666802e340SSteven Whitehouse *p++ = 'e';
22676802e340SSteven Whitehouse if (flags & LM_FLAG_ANY)
2268f057f6cdSSteven Whitehouse *p++ = 'A';
226906e908cdSBob Peterson if (flags & LM_FLAG_NODE_SCOPE)
227006e908cdSBob Peterson *p++ = 'n';
22716802e340SSteven Whitehouse if (flags & GL_ASYNC)
22726802e340SSteven Whitehouse *p++ = 'a';
22736802e340SSteven Whitehouse if (flags & GL_EXACT)
22746802e340SSteven Whitehouse *p++ = 'E';
22756802e340SSteven Whitehouse if (flags & GL_NOCACHE)
22766802e340SSteven Whitehouse *p++ = 'c';
22776802e340SSteven Whitehouse if (test_bit(HIF_HOLDER, &iflags))
22786802e340SSteven Whitehouse *p++ = 'H';
22796802e340SSteven Whitehouse if (test_bit(HIF_WAIT, &iflags))
22806802e340SSteven Whitehouse *p++ = 'W';
22814c69038dSBob Peterson if (flags & GL_SKIP)
22824c69038dSBob Peterson *p++ = 's';
22836802e340SSteven Whitehouse *p = 0;
22846802e340SSteven Whitehouse return buf;
228504b933f2SRobert Peterson }
228604b933f2SRobert Peterson
2287b3b94faaSDavid Teigland /**
2288b3b94faaSDavid Teigland * dump_holder - print information about a glock holder
22896802e340SSteven Whitehouse * @seq: the seq_file struct
2290b3b94faaSDavid Teigland * @gh: the glock holder
22913792ce97SBob Peterson * @fs_id_buf: pointer to file system id (if requested)
2292b3b94faaSDavid Teigland *
2293b3b94faaSDavid Teigland */
2294b3b94faaSDavid Teigland
dump_holder(struct seq_file * seq,const struct gfs2_holder * gh,const char * fs_id_buf)22953792ce97SBob Peterson static void dump_holder(struct seq_file *seq, const struct gfs2_holder *gh,
22963792ce97SBob Peterson const char *fs_id_buf)
2297b3b94faaSDavid Teigland {
2298cbe6d257SAndreas Gruenbacher const char *comm = "(none)";
2299cbe6d257SAndreas Gruenbacher pid_t owner_pid = 0;
23006802e340SSteven Whitehouse char flags_buf[32];
2301b3b94faaSDavid Teigland
23020b3a2c99STetsuo Handa rcu_read_lock();
2303cbe6d257SAndreas Gruenbacher if (pid_is_meaningful(gh)) {
2304cbe6d257SAndreas Gruenbacher struct task_struct *gh_owner;
2305cbe6d257SAndreas Gruenbacher
2306cbe6d257SAndreas Gruenbacher comm = "(ended)";
2307cbe6d257SAndreas Gruenbacher owner_pid = pid_nr(gh->gh_owner_pid);
2308b1e058daSPavel Emelyanov gh_owner = pid_task(gh->gh_owner_pid, PIDTYPE_PID);
2309cbe6d257SAndreas Gruenbacher if (gh_owner)
2310cbe6d257SAndreas Gruenbacher comm = gh_owner->comm;
2311cbe6d257SAndreas Gruenbacher }
23123792ce97SBob Peterson gfs2_print_dbg(seq, "%s H: s:%s f:%s e:%d p:%ld [%s] %pS\n",
23133792ce97SBob Peterson fs_id_buf, state2str(gh->gh_state),
23146802e340SSteven Whitehouse hflags2str(flags_buf, gh->gh_flags, gh->gh_iflags),
2315cbe6d257SAndreas Gruenbacher gh->gh_error, (long)owner_pid, comm, (void *)gh->gh_ip);
23160b3a2c99STetsuo Handa rcu_read_unlock();
2317b3b94faaSDavid Teigland }
2318b3b94faaSDavid Teigland
gflags2str(char * buf,const struct gfs2_glock * gl)2319627c10b7SSteven Whitehouse static const char *gflags2str(char *buf, const struct gfs2_glock *gl)
2320b3b94faaSDavid Teigland {
2321627c10b7SSteven Whitehouse const unsigned long *gflags = &gl->gl_flags;
23226802e340SSteven Whitehouse char *p = buf;
2323627c10b7SSteven Whitehouse
23246802e340SSteven Whitehouse if (test_bit(GLF_LOCK, gflags))
23256802e340SSteven Whitehouse *p++ = 'l';
23266802e340SSteven Whitehouse if (test_bit(GLF_DEMOTE, gflags))
23276802e340SSteven Whitehouse *p++ = 'D';
23286802e340SSteven Whitehouse if (test_bit(GLF_PENDING_DEMOTE, gflags))
23296802e340SSteven Whitehouse *p++ = 'd';
23306802e340SSteven Whitehouse if (test_bit(GLF_DEMOTE_IN_PROGRESS, gflags))
23316802e340SSteven Whitehouse *p++ = 'p';
23326802e340SSteven Whitehouse if (test_bit(GLF_DIRTY, gflags))
23336802e340SSteven Whitehouse *p++ = 'y';
23346802e340SSteven Whitehouse if (test_bit(GLF_LFLUSH, gflags))
23356802e340SSteven Whitehouse *p++ = 'f';
23366802e340SSteven Whitehouse if (test_bit(GLF_INVALIDATE_IN_PROGRESS, gflags))
23376802e340SSteven Whitehouse *p++ = 'i';
23386802e340SSteven Whitehouse if (test_bit(GLF_REPLY_PENDING, gflags))
23396802e340SSteven Whitehouse *p++ = 'r';
2340f057f6cdSSteven Whitehouse if (test_bit(GLF_INITIAL, gflags))
2341d8348de0SSteven Whitehouse *p++ = 'I';
2342f057f6cdSSteven Whitehouse if (test_bit(GLF_FROZEN, gflags))
2343f057f6cdSSteven Whitehouse *p++ = 'F';
2344e2c6c8a7SBob Peterson if (!list_empty(&gl->gl_holders))
23457b5e3d5fSSteven Whitehouse *p++ = 'q';
2346627c10b7SSteven Whitehouse if (test_bit(GLF_LRU, gflags))
2347627c10b7SSteven Whitehouse *p++ = 'L';
2348627c10b7SSteven Whitehouse if (gl->gl_object)
2349627c10b7SSteven Whitehouse *p++ = 'o';
2350a245769fSSteven Whitehouse if (test_bit(GLF_BLOCKING, gflags))
2351a245769fSSteven Whitehouse *p++ = 'b';
23525deaf1f6SBob Peterson if (test_bit(GLF_FREEING, gflags))
23535deaf1f6SBob Peterson *p++ = 'x';
2354f2e70d8fSBob Peterson if (test_bit(GLF_INSTANTIATE_NEEDED, gflags))
2355f2e70d8fSBob Peterson *p++ = 'n';
2356f2e70d8fSBob Peterson if (test_bit(GLF_INSTANTIATE_IN_PROG, gflags))
2357f2e70d8fSBob Peterson *p++ = 'N';
2358f0e56edcSAndreas Gruenbacher if (test_bit(GLF_TRY_TO_EVICT, gflags))
2359f0e56edcSAndreas Gruenbacher *p++ = 'e';
23604389447fSAndreas Gruenbacher if (test_bit(GLF_VERIFY_DELETE, gflags))
2361f0e56edcSAndreas Gruenbacher *p++ = 'E';
23626802e340SSteven Whitehouse *p = 0;
23636802e340SSteven Whitehouse return buf;
2364b3b94faaSDavid Teigland }
2365b3b94faaSDavid Teigland
2366b3b94faaSDavid Teigland /**
23678eae1ca0SSteven Whitehouse * gfs2_dump_glock - print information about a glock
23686802e340SSteven Whitehouse * @seq: The seq_file struct
2369b3b94faaSDavid Teigland * @gl: the glock
23703792ce97SBob Peterson * @fsid: If true, also dump the file system id
23716802e340SSteven Whitehouse *
23726802e340SSteven Whitehouse * The file format is as follows:
23736802e340SSteven Whitehouse * One line per object, capital letters are used to indicate objects
23746802e340SSteven Whitehouse * G = glock, I = Inode, R = rgrp, H = holder. Glocks are not indented,
23756802e340SSteven Whitehouse * other objects are indented by a single space and follow the glock to
23766802e340SSteven Whitehouse * which they are related. Fields are indicated by lower case letters
23776802e340SSteven Whitehouse * followed by a colon and the field value, except for strings which are in
23786802e340SSteven Whitehouse * [] so that its possible to see if they are composed of spaces for
23796802e340SSteven Whitehouse * example. The field's are n = number (id of the object), f = flags,
23806802e340SSteven Whitehouse * t = type, s = state, r = refcount, e = error, p = pid.
2381b3b94faaSDavid Teigland *
2382b3b94faaSDavid Teigland */
2383b3b94faaSDavid Teigland
gfs2_dump_glock(struct seq_file * seq,struct gfs2_glock * gl,bool fsid)23843792ce97SBob Peterson void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl, bool fsid)
2385b3b94faaSDavid Teigland {
23866802e340SSteven Whitehouse const struct gfs2_glock_operations *glops = gl->gl_ops;
23876802e340SSteven Whitehouse unsigned long long dtime;
23886802e340SSteven Whitehouse const struct gfs2_holder *gh;
23896802e340SSteven Whitehouse char gflags_buf[32];
23903792ce97SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
239198fb0574SBob Peterson char fs_id_buf[sizeof(sdp->sd_fsname) + 7];
23927e901d6eSBob Peterson unsigned long nrpages = 0;
2393b3b94faaSDavid Teigland
23947e901d6eSBob Peterson if (gl->gl_ops->go_flags & GLOF_ASPACE) {
23957e901d6eSBob Peterson struct address_space *mapping = gfs2_glock2aspace(gl);
23967e901d6eSBob Peterson
23977e901d6eSBob Peterson nrpages = mapping->nrpages;
23987e901d6eSBob Peterson }
23993792ce97SBob Peterson memset(fs_id_buf, 0, sizeof(fs_id_buf));
24003792ce97SBob Peterson if (fsid && sdp) /* safety precaution */
24013792ce97SBob Peterson sprintf(fs_id_buf, "fsid=%s: ", sdp->sd_fsname);
24026802e340SSteven Whitehouse dtime = jiffies - gl->gl_demote_time;
24036802e340SSteven Whitehouse dtime *= 1000000/HZ; /* demote time in uSec */
24046802e340SSteven Whitehouse if (!test_bit(GLF_DEMOTE, &gl->gl_flags))
24056802e340SSteven Whitehouse dtime = 0;
24063792ce97SBob Peterson gfs2_print_dbg(seq, "%sG: s:%s n:%u/%llx f:%s t:%s d:%s/%llu a:%d "
24077e901d6eSBob Peterson "v:%d r:%d m:%ld p:%lu\n",
24087e901d6eSBob Peterson fs_id_buf, state2str(gl->gl_state),
24096802e340SSteven Whitehouse gl->gl_name.ln_type,
24106802e340SSteven Whitehouse (unsigned long long)gl->gl_name.ln_number,
2411627c10b7SSteven Whitehouse gflags2str(gflags_buf, gl),
24126802e340SSteven Whitehouse state2str(gl->gl_target),
24136802e340SSteven Whitehouse state2str(gl->gl_demote_state), dtime,
24146802e340SSteven Whitehouse atomic_read(&gl->gl_ail_count),
2415638803d4SBob Peterson atomic_read(&gl->gl_revokes),
24167e901d6eSBob Peterson (int)gl->gl_lockref.count, gl->gl_hold_time, nrpages);
2417b3b94faaSDavid Teigland
2418ac3beb6aSSteven Whitehouse list_for_each_entry(gh, &gl->gl_holders, gh_list)
24193792ce97SBob Peterson dump_holder(seq, gh, fs_id_buf);
2420ac3beb6aSSteven Whitehouse
24216802e340SSteven Whitehouse if (gl->gl_state != LM_ST_UNLOCKED && glops->go_dump)
24223792ce97SBob Peterson glops->go_dump(seq, gl, fs_id_buf);
2423b3b94faaSDavid Teigland }
2424b3b94faaSDavid Teigland
gfs2_glstats_seq_show(struct seq_file * seq,void * iter_ptr)2425a245769fSSteven Whitehouse static int gfs2_glstats_seq_show(struct seq_file *seq, void *iter_ptr)
2426a245769fSSteven Whitehouse {
2427a245769fSSteven Whitehouse struct gfs2_glock *gl = iter_ptr;
24286802e340SSteven Whitehouse
24294d207133SBen Hutchings seq_printf(seq, "G: n:%u/%llx rtt:%llu/%llu rttb:%llu/%llu irt:%llu/%llu dcnt: %llu qcnt: %llu\n",
2430a245769fSSteven Whitehouse gl->gl_name.ln_type,
2431a245769fSSteven Whitehouse (unsigned long long)gl->gl_name.ln_number,
24324d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTT],
24334d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVAR],
24344d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTB],
24354d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVARB],
24364d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRT],
24374d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRTVAR],
24384d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_DCOUNT],
24394d207133SBen Hutchings (unsigned long long)gl->gl_stats.stats[GFS2_LKS_QCOUNT]);
2440a245769fSSteven Whitehouse return 0;
2441a245769fSSteven Whitehouse }
2442b3b94faaSDavid Teigland
2443a245769fSSteven Whitehouse static const char *gfs2_gltype[] = {
2444a245769fSSteven Whitehouse "type",
2445a245769fSSteven Whitehouse "reserved",
2446a245769fSSteven Whitehouse "nondisk",
2447a245769fSSteven Whitehouse "inode",
2448a245769fSSteven Whitehouse "rgrp",
2449a245769fSSteven Whitehouse "meta",
2450a245769fSSteven Whitehouse "iopen",
2451a245769fSSteven Whitehouse "flock",
2452a245769fSSteven Whitehouse "plock",
2453a245769fSSteven Whitehouse "quota",
2454a245769fSSteven Whitehouse "journal",
2455a245769fSSteven Whitehouse };
2456a245769fSSteven Whitehouse
2457a245769fSSteven Whitehouse static const char *gfs2_stype[] = {
2458a245769fSSteven Whitehouse [GFS2_LKS_SRTT] = "srtt",
2459a245769fSSteven Whitehouse [GFS2_LKS_SRTTVAR] = "srttvar",
2460a245769fSSteven Whitehouse [GFS2_LKS_SRTTB] = "srttb",
2461a245769fSSteven Whitehouse [GFS2_LKS_SRTTVARB] = "srttvarb",
2462a245769fSSteven Whitehouse [GFS2_LKS_SIRT] = "sirt",
2463a245769fSSteven Whitehouse [GFS2_LKS_SIRTVAR] = "sirtvar",
2464a245769fSSteven Whitehouse [GFS2_LKS_DCOUNT] = "dlm",
2465a245769fSSteven Whitehouse [GFS2_LKS_QCOUNT] = "queue",
2466a245769fSSteven Whitehouse };
2467a245769fSSteven Whitehouse
2468a245769fSSteven Whitehouse #define GFS2_NR_SBSTATS (ARRAY_SIZE(gfs2_gltype) * ARRAY_SIZE(gfs2_stype))
2469a245769fSSteven Whitehouse
gfs2_sbstats_seq_show(struct seq_file * seq,void * iter_ptr)2470a245769fSSteven Whitehouse static int gfs2_sbstats_seq_show(struct seq_file *seq, void *iter_ptr)
2471a245769fSSteven Whitehouse {
247281648d04SAndreas Gruenbacher struct gfs2_sbd *sdp = seq->private;
247381648d04SAndreas Gruenbacher loff_t pos = *(loff_t *)iter_ptr;
247481648d04SAndreas Gruenbacher unsigned index = pos >> 3;
247581648d04SAndreas Gruenbacher unsigned subindex = pos & 0x07;
2476a245769fSSteven Whitehouse int i;
2477a245769fSSteven Whitehouse
2478a245769fSSteven Whitehouse if (index == 0 && subindex != 0)
2479a245769fSSteven Whitehouse return 0;
2480a245769fSSteven Whitehouse
2481a245769fSSteven Whitehouse seq_printf(seq, "%-10s %8s:", gfs2_gltype[index],
2482a245769fSSteven Whitehouse (index == 0) ? "cpu": gfs2_stype[subindex]);
2483a245769fSSteven Whitehouse
2484a245769fSSteven Whitehouse for_each_possible_cpu(i) {
2485a245769fSSteven Whitehouse const struct gfs2_pcpu_lkstats *lkstats = per_cpu_ptr(sdp->sd_lkstats, i);
24868f7e0a80SAndreas Gruenbacher
24878f7e0a80SAndreas Gruenbacher if (index == 0)
24888f7e0a80SAndreas Gruenbacher seq_printf(seq, " %15u", i);
24898f7e0a80SAndreas Gruenbacher else
24908f7e0a80SAndreas Gruenbacher seq_printf(seq, " %15llu", (unsigned long long)lkstats->
24918f7e0a80SAndreas Gruenbacher lkstats[index - 1].stats[subindex]);
2492a245769fSSteven Whitehouse }
2493a245769fSSteven Whitehouse seq_putc(seq, '\n');
2494a245769fSSteven Whitehouse return 0;
2495a245769fSSteven Whitehouse }
24968fbbfd21SSteven Whitehouse
gfs2_glock_init(void)249785d1da67SSteven Whitehouse int __init gfs2_glock_init(void)
249885d1da67SSteven Whitehouse {
24990515480aSAndreas Gruenbacher int i, ret;
250088ffbf3eSBob Peterson
250188ffbf3eSBob Peterson ret = rhashtable_init(&gl_hash_table, &ht_parms);
250288ffbf3eSBob Peterson if (ret < 0)
250388ffbf3eSBob Peterson return ret;
25048fbbfd21SSteven Whitehouse
2505d2115778SSteven Whitehouse glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM |
250658a69cb4STejun Heo WQ_HIGHPRI | WQ_FREEZABLE, 0);
250788ffbf3eSBob Peterson if (!glock_workqueue) {
250888ffbf3eSBob Peterson rhashtable_destroy(&gl_hash_table);
2509dfc4616dSDan Carpenter return -ENOMEM;
251088ffbf3eSBob Peterson }
251197cc1025SSteven Whitehouse
2512e33c267aSRoman Gushchin ret = register_shrinker(&glock_shrinker, "gfs2-glock");
2513e0d735c1SChao Yu if (ret) {
2514e0d735c1SChao Yu destroy_workqueue(glock_workqueue);
2515e0d735c1SChao Yu rhashtable_destroy(&gl_hash_table);
2516e0d735c1SChao Yu return ret;
2517e0d735c1SChao Yu }
2518c4f68a13SBenjamin Marzinski
25190515480aSAndreas Gruenbacher for (i = 0; i < GLOCK_WAIT_TABLE_SIZE; i++)
25200515480aSAndreas Gruenbacher init_waitqueue_head(glock_wait_table + i);
25210515480aSAndreas Gruenbacher
252285d1da67SSteven Whitehouse return 0;
252385d1da67SSteven Whitehouse }
252485d1da67SSteven Whitehouse
gfs2_glock_exit(void)25258fbbfd21SSteven Whitehouse void gfs2_glock_exit(void)
25268fbbfd21SSteven Whitehouse {
252797cc1025SSteven Whitehouse unregister_shrinker(&glock_shrinker);
252888ffbf3eSBob Peterson rhashtable_destroy(&gl_hash_table);
2529c4f68a13SBenjamin Marzinski destroy_workqueue(glock_workqueue);
25308fbbfd21SSteven Whitehouse }
25318fbbfd21SSteven Whitehouse
gfs2_glock_iter_next(struct gfs2_glock_iter * gi,loff_t n)25327ac07fdaSAndreas Gruenbacher static void gfs2_glock_iter_next(struct gfs2_glock_iter *gi, loff_t n)
2533bc015cb8SSteven Whitehouse {
25343fd5d3adSAndreas Gruenbacher struct gfs2_glock *gl = gi->gl;
25353fd5d3adSAndreas Gruenbacher
25363fd5d3adSAndreas Gruenbacher if (gl) {
25377ac07fdaSAndreas Gruenbacher if (n == 0)
25383fd5d3adSAndreas Gruenbacher return;
253939822f7fSAndreas Gruenbacher gfs2_glock_put_async(gl);
25407ac07fdaSAndreas Gruenbacher }
25417ac07fdaSAndreas Gruenbacher for (;;) {
25423fd5d3adSAndreas Gruenbacher gl = rhashtable_walk_next(&gi->hti);
25433fd5d3adSAndreas Gruenbacher if (IS_ERR_OR_NULL(gl)) {
25443fd5d3adSAndreas Gruenbacher if (gl == ERR_PTR(-EAGAIN)) {
25453fd5d3adSAndreas Gruenbacher n = 1;
25463fd5d3adSAndreas Gruenbacher continue;
2547bc015cb8SSteven Whitehouse }
25483fd5d3adSAndreas Gruenbacher gl = NULL;
25497ac07fdaSAndreas Gruenbacher break;
25507ac07fdaSAndreas Gruenbacher }
25513fd5d3adSAndreas Gruenbacher if (gl->gl_name.ln_sbd != gi->sdp)
25523fd5d3adSAndreas Gruenbacher continue;
25533fd5d3adSAndreas Gruenbacher if (n <= 1) {
25543fd5d3adSAndreas Gruenbacher if (!lockref_get_not_dead(&gl->gl_lockref))
25553fd5d3adSAndreas Gruenbacher continue;
25563fd5d3adSAndreas Gruenbacher break;
25573fd5d3adSAndreas Gruenbacher } else {
25583fd5d3adSAndreas Gruenbacher if (__lockref_is_dead(&gl->gl_lockref))
25593fd5d3adSAndreas Gruenbacher continue;
25603fd5d3adSAndreas Gruenbacher n--;
256114d37564SDan Carpenter }
25627c52b166SRobert Peterson }
25633fd5d3adSAndreas Gruenbacher gi->gl = gl;
25643fd5d3adSAndreas Gruenbacher }
25657c52b166SRobert Peterson
gfs2_glock_seq_start(struct seq_file * seq,loff_t * pos)25666802e340SSteven Whitehouse static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
256727c3b415SBob Peterson __acquires(RCU)
25687c52b166SRobert Peterson {
25696802e340SSteven Whitehouse struct gfs2_glock_iter *gi = seq->private;
25707ac07fdaSAndreas Gruenbacher loff_t n;
25717c52b166SRobert Peterson
25727ac07fdaSAndreas Gruenbacher /*
25737ac07fdaSAndreas Gruenbacher * We can either stay where we are, skip to the next hash table
25747ac07fdaSAndreas Gruenbacher * entry, or start from the beginning.
25757ac07fdaSAndreas Gruenbacher */
25767ac07fdaSAndreas Gruenbacher if (*pos < gi->last_pos) {
25777ac07fdaSAndreas Gruenbacher rhashtable_walk_exit(&gi->hti);
257810201655SAndreas Gruenbacher rhashtable_walk_enter(&gl_hash_table, &gi->hti);
25797ac07fdaSAndreas Gruenbacher n = *pos + 1;
25807ac07fdaSAndreas Gruenbacher } else {
25817ac07fdaSAndreas Gruenbacher n = *pos - gi->last_pos;
25827ac07fdaSAndreas Gruenbacher }
25837c52b166SRobert Peterson
25847ac07fdaSAndreas Gruenbacher rhashtable_walk_start(&gi->hti);
25856802e340SSteven Whitehouse
25867ac07fdaSAndreas Gruenbacher gfs2_glock_iter_next(gi, n);
2587ba1ddcb6SSteven Whitehouse gi->last_pos = *pos;
25886802e340SSteven Whitehouse return gi->gl;
25897c52b166SRobert Peterson }
25907c52b166SRobert Peterson
gfs2_glock_seq_next(struct seq_file * seq,void * iter_ptr,loff_t * pos)25916802e340SSteven Whitehouse static void *gfs2_glock_seq_next(struct seq_file *seq, void *iter_ptr,
25927c52b166SRobert Peterson loff_t *pos)
25937c52b166SRobert Peterson {
25946802e340SSteven Whitehouse struct gfs2_glock_iter *gi = seq->private;
25957c52b166SRobert Peterson
25967c52b166SRobert Peterson (*pos)++;
2597ba1ddcb6SSteven Whitehouse gi->last_pos = *pos;
25987ac07fdaSAndreas Gruenbacher gfs2_glock_iter_next(gi, 1);
25996802e340SSteven Whitehouse return gi->gl;
26007c52b166SRobert Peterson }
26017c52b166SRobert Peterson
gfs2_glock_seq_stop(struct seq_file * seq,void * iter_ptr)26026802e340SSteven Whitehouse static void gfs2_glock_seq_stop(struct seq_file *seq, void *iter_ptr)
260327c3b415SBob Peterson __releases(RCU)
26047c52b166SRobert Peterson {
26056802e340SSteven Whitehouse struct gfs2_glock_iter *gi = seq->private;
2606bc015cb8SSteven Whitehouse
260788ffbf3eSBob Peterson rhashtable_walk_stop(&gi->hti);
26087c52b166SRobert Peterson }
26097c52b166SRobert Peterson
gfs2_glock_seq_show(struct seq_file * seq,void * iter_ptr)26106802e340SSteven Whitehouse static int gfs2_glock_seq_show(struct seq_file *seq, void *iter_ptr)
26117c52b166SRobert Peterson {
26123792ce97SBob Peterson dump_glock(seq, iter_ptr, false);
2613ac3beb6aSSteven Whitehouse return 0;
26147c52b166SRobert Peterson }
26157c52b166SRobert Peterson
gfs2_sbstats_seq_start(struct seq_file * seq,loff_t * pos)2616a245769fSSteven Whitehouse static void *gfs2_sbstats_seq_start(struct seq_file *seq, loff_t *pos)
2617a245769fSSteven Whitehouse {
261881648d04SAndreas Gruenbacher preempt_disable();
2619a245769fSSteven Whitehouse if (*pos >= GFS2_NR_SBSTATS)
2620a245769fSSteven Whitehouse return NULL;
262181648d04SAndreas Gruenbacher return pos;
2622a245769fSSteven Whitehouse }
2623a245769fSSteven Whitehouse
gfs2_sbstats_seq_next(struct seq_file * seq,void * iter_ptr,loff_t * pos)2624a245769fSSteven Whitehouse static void *gfs2_sbstats_seq_next(struct seq_file *seq, void *iter_ptr,
2625a245769fSSteven Whitehouse loff_t *pos)
2626a245769fSSteven Whitehouse {
2627a245769fSSteven Whitehouse (*pos)++;
262881648d04SAndreas Gruenbacher if (*pos >= GFS2_NR_SBSTATS)
2629a245769fSSteven Whitehouse return NULL;
263081648d04SAndreas Gruenbacher return pos;
2631a245769fSSteven Whitehouse }
2632a245769fSSteven Whitehouse
gfs2_sbstats_seq_stop(struct seq_file * seq,void * iter_ptr)2633a245769fSSteven Whitehouse static void gfs2_sbstats_seq_stop(struct seq_file *seq, void *iter_ptr)
2634a245769fSSteven Whitehouse {
2635a245769fSSteven Whitehouse preempt_enable();
2636a245769fSSteven Whitehouse }
2637a245769fSSteven Whitehouse
26384ef29002SDenis Cheng static const struct seq_operations gfs2_glock_seq_ops = {
26397c52b166SRobert Peterson .start = gfs2_glock_seq_start,
26407c52b166SRobert Peterson .next = gfs2_glock_seq_next,
26417c52b166SRobert Peterson .stop = gfs2_glock_seq_stop,
26427c52b166SRobert Peterson .show = gfs2_glock_seq_show,
26437c52b166SRobert Peterson };
26447c52b166SRobert Peterson
2645a245769fSSteven Whitehouse static const struct seq_operations gfs2_glstats_seq_ops = {
2646a245769fSSteven Whitehouse .start = gfs2_glock_seq_start,
2647a245769fSSteven Whitehouse .next = gfs2_glock_seq_next,
2648a245769fSSteven Whitehouse .stop = gfs2_glock_seq_stop,
2649a245769fSSteven Whitehouse .show = gfs2_glstats_seq_show,
2650a245769fSSteven Whitehouse };
2651a245769fSSteven Whitehouse
2652e8a8023eSLiu Shixin static const struct seq_operations gfs2_sbstats_sops = {
2653a245769fSSteven Whitehouse .start = gfs2_sbstats_seq_start,
2654a245769fSSteven Whitehouse .next = gfs2_sbstats_seq_next,
2655a245769fSSteven Whitehouse .stop = gfs2_sbstats_seq_stop,
2656a245769fSSteven Whitehouse .show = gfs2_sbstats_seq_show,
2657a245769fSSteven Whitehouse };
2658a245769fSSteven Whitehouse
26590fe2f1e9SSteven Whitehouse #define GFS2_SEQ_GOODSIZE min(PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER, 65536UL)
26600fe2f1e9SSteven Whitehouse
__gfs2_glocks_open(struct inode * inode,struct file * file,const struct seq_operations * ops)266192ecd73aSAndreas Gruenbacher static int __gfs2_glocks_open(struct inode *inode, struct file *file,
266292ecd73aSAndreas Gruenbacher const struct seq_operations *ops)
26637c52b166SRobert Peterson {
266492ecd73aSAndreas Gruenbacher int ret = seq_open_private(file, ops, sizeof(struct gfs2_glock_iter));
26656802e340SSteven Whitehouse if (ret == 0) {
26666802e340SSteven Whitehouse struct seq_file *seq = file->private_data;
26676802e340SSteven Whitehouse struct gfs2_glock_iter *gi = seq->private;
266888ffbf3eSBob Peterson
26696802e340SSteven Whitehouse gi->sdp = inode->i_private;
26700fe2f1e9SSteven Whitehouse seq->buf = kmalloc(GFS2_SEQ_GOODSIZE, GFP_KERNEL | __GFP_NOWARN);
2671df5d2f55SSteven Whitehouse if (seq->buf)
26720fe2f1e9SSteven Whitehouse seq->size = GFS2_SEQ_GOODSIZE;
26737ac07fdaSAndreas Gruenbacher /*
26747ac07fdaSAndreas Gruenbacher * Initially, we are "before" the first hash table entry; the
26757ac07fdaSAndreas Gruenbacher * first call to rhashtable_walk_next gets us the first entry.
26767ac07fdaSAndreas Gruenbacher */
26777ac07fdaSAndreas Gruenbacher gi->last_pos = -1;
267888ffbf3eSBob Peterson gi->gl = NULL;
26797ac07fdaSAndreas Gruenbacher rhashtable_walk_enter(&gl_hash_table, &gi->hti);
26806802e340SSteven Whitehouse }
26817c52b166SRobert Peterson return ret;
26827c52b166SRobert Peterson }
26837c52b166SRobert Peterson
gfs2_glocks_open(struct inode * inode,struct file * file)268492ecd73aSAndreas Gruenbacher static int gfs2_glocks_open(struct inode *inode, struct file *file)
268592ecd73aSAndreas Gruenbacher {
268692ecd73aSAndreas Gruenbacher return __gfs2_glocks_open(inode, file, &gfs2_glock_seq_ops);
268792ecd73aSAndreas Gruenbacher }
268892ecd73aSAndreas Gruenbacher
gfs2_glocks_release(struct inode * inode,struct file * file)268988ffbf3eSBob Peterson static int gfs2_glocks_release(struct inode *inode, struct file *file)
269088ffbf3eSBob Peterson {
269188ffbf3eSBob Peterson struct seq_file *seq = file->private_data;
269288ffbf3eSBob Peterson struct gfs2_glock_iter *gi = seq->private;
269388ffbf3eSBob Peterson
26943fd5d3adSAndreas Gruenbacher if (gi->gl)
26953fd5d3adSAndreas Gruenbacher gfs2_glock_put(gi->gl);
26967ac07fdaSAndreas Gruenbacher rhashtable_walk_exit(&gi->hti);
269788ffbf3eSBob Peterson return seq_release_private(inode, file);
269888ffbf3eSBob Peterson }
269988ffbf3eSBob Peterson
gfs2_glstats_open(struct inode * inode,struct file * file)2700a245769fSSteven Whitehouse static int gfs2_glstats_open(struct inode *inode, struct file *file)
2701a245769fSSteven Whitehouse {
270292ecd73aSAndreas Gruenbacher return __gfs2_glocks_open(inode, file, &gfs2_glstats_seq_ops);
2703a245769fSSteven Whitehouse }
2704a245769fSSteven Whitehouse
2705a245769fSSteven Whitehouse static const struct file_operations gfs2_glocks_fops = {
27067c52b166SRobert Peterson .owner = THIS_MODULE,
2707a245769fSSteven Whitehouse .open = gfs2_glocks_open,
2708a245769fSSteven Whitehouse .read = seq_read,
2709a245769fSSteven Whitehouse .llseek = seq_lseek,
271088ffbf3eSBob Peterson .release = gfs2_glocks_release,
2711a245769fSSteven Whitehouse };
2712a245769fSSteven Whitehouse
2713a245769fSSteven Whitehouse static const struct file_operations gfs2_glstats_fops = {
2714a245769fSSteven Whitehouse .owner = THIS_MODULE,
2715a245769fSSteven Whitehouse .open = gfs2_glstats_open,
2716a245769fSSteven Whitehouse .read = seq_read,
2717a245769fSSteven Whitehouse .llseek = seq_lseek,
271888ffbf3eSBob Peterson .release = gfs2_glocks_release,
2719a245769fSSteven Whitehouse };
2720a245769fSSteven Whitehouse
27214480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter {
27224480c27cSAndreas Gruenbacher struct super_block *sb;
27234480c27cSAndreas Gruenbacher unsigned int tgid;
27244480c27cSAndreas Gruenbacher struct task_struct *task;
27254480c27cSAndreas Gruenbacher unsigned int fd;
27264480c27cSAndreas Gruenbacher struct file *file;
27274480c27cSAndreas Gruenbacher };
27284480c27cSAndreas Gruenbacher
gfs2_glockfd_next_task(struct gfs2_glockfd_iter * i)27294480c27cSAndreas Gruenbacher static struct task_struct *gfs2_glockfd_next_task(struct gfs2_glockfd_iter *i)
27304480c27cSAndreas Gruenbacher {
27314480c27cSAndreas Gruenbacher struct pid_namespace *ns = task_active_pid_ns(current);
27324480c27cSAndreas Gruenbacher struct pid *pid;
27334480c27cSAndreas Gruenbacher
27344480c27cSAndreas Gruenbacher if (i->task)
27354480c27cSAndreas Gruenbacher put_task_struct(i->task);
27364480c27cSAndreas Gruenbacher
27374480c27cSAndreas Gruenbacher rcu_read_lock();
27384480c27cSAndreas Gruenbacher retry:
27394480c27cSAndreas Gruenbacher i->task = NULL;
27404480c27cSAndreas Gruenbacher pid = find_ge_pid(i->tgid, ns);
27414480c27cSAndreas Gruenbacher if (pid) {
27424480c27cSAndreas Gruenbacher i->tgid = pid_nr_ns(pid, ns);
27434480c27cSAndreas Gruenbacher i->task = pid_task(pid, PIDTYPE_TGID);
27444480c27cSAndreas Gruenbacher if (!i->task) {
27454480c27cSAndreas Gruenbacher i->tgid++;
27464480c27cSAndreas Gruenbacher goto retry;
27474480c27cSAndreas Gruenbacher }
27484480c27cSAndreas Gruenbacher get_task_struct(i->task);
27494480c27cSAndreas Gruenbacher }
27504480c27cSAndreas Gruenbacher rcu_read_unlock();
27514480c27cSAndreas Gruenbacher return i->task;
27524480c27cSAndreas Gruenbacher }
27534480c27cSAndreas Gruenbacher
gfs2_glockfd_next_file(struct gfs2_glockfd_iter * i)27544480c27cSAndreas Gruenbacher static struct file *gfs2_glockfd_next_file(struct gfs2_glockfd_iter *i)
27554480c27cSAndreas Gruenbacher {
27564480c27cSAndreas Gruenbacher if (i->file) {
27574480c27cSAndreas Gruenbacher fput(i->file);
27584480c27cSAndreas Gruenbacher i->file = NULL;
27594480c27cSAndreas Gruenbacher }
27604480c27cSAndreas Gruenbacher
27614480c27cSAndreas Gruenbacher rcu_read_lock();
27624480c27cSAndreas Gruenbacher for(;; i->fd++) {
27634480c27cSAndreas Gruenbacher struct inode *inode;
27644480c27cSAndreas Gruenbacher
27654480c27cSAndreas Gruenbacher i->file = task_lookup_next_fd_rcu(i->task, &i->fd);
27664480c27cSAndreas Gruenbacher if (!i->file) {
27674480c27cSAndreas Gruenbacher i->fd = 0;
27684480c27cSAndreas Gruenbacher break;
27694480c27cSAndreas Gruenbacher }
27704480c27cSAndreas Gruenbacher inode = file_inode(i->file);
27714480c27cSAndreas Gruenbacher if (inode->i_sb != i->sb)
27724480c27cSAndreas Gruenbacher continue;
27734480c27cSAndreas Gruenbacher if (get_file_rcu(i->file))
27744480c27cSAndreas Gruenbacher break;
27754480c27cSAndreas Gruenbacher }
27764480c27cSAndreas Gruenbacher rcu_read_unlock();
27774480c27cSAndreas Gruenbacher return i->file;
27784480c27cSAndreas Gruenbacher }
27794480c27cSAndreas Gruenbacher
gfs2_glockfd_seq_start(struct seq_file * seq,loff_t * pos)27804480c27cSAndreas Gruenbacher static void *gfs2_glockfd_seq_start(struct seq_file *seq, loff_t *pos)
27814480c27cSAndreas Gruenbacher {
27824480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter *i = seq->private;
27834480c27cSAndreas Gruenbacher
27844480c27cSAndreas Gruenbacher if (*pos)
27854480c27cSAndreas Gruenbacher return NULL;
27864480c27cSAndreas Gruenbacher while (gfs2_glockfd_next_task(i)) {
27874480c27cSAndreas Gruenbacher if (gfs2_glockfd_next_file(i))
27884480c27cSAndreas Gruenbacher return i;
27894480c27cSAndreas Gruenbacher i->tgid++;
27904480c27cSAndreas Gruenbacher }
27914480c27cSAndreas Gruenbacher return NULL;
27924480c27cSAndreas Gruenbacher }
27934480c27cSAndreas Gruenbacher
gfs2_glockfd_seq_next(struct seq_file * seq,void * iter_ptr,loff_t * pos)27944480c27cSAndreas Gruenbacher static void *gfs2_glockfd_seq_next(struct seq_file *seq, void *iter_ptr,
27954480c27cSAndreas Gruenbacher loff_t *pos)
27964480c27cSAndreas Gruenbacher {
27974480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter *i = seq->private;
27984480c27cSAndreas Gruenbacher
27994480c27cSAndreas Gruenbacher (*pos)++;
28004480c27cSAndreas Gruenbacher i->fd++;
28014480c27cSAndreas Gruenbacher do {
28024480c27cSAndreas Gruenbacher if (gfs2_glockfd_next_file(i))
28034480c27cSAndreas Gruenbacher return i;
28044480c27cSAndreas Gruenbacher i->tgid++;
28054480c27cSAndreas Gruenbacher } while (gfs2_glockfd_next_task(i));
28064480c27cSAndreas Gruenbacher return NULL;
28074480c27cSAndreas Gruenbacher }
28084480c27cSAndreas Gruenbacher
gfs2_glockfd_seq_stop(struct seq_file * seq,void * iter_ptr)28094480c27cSAndreas Gruenbacher static void gfs2_glockfd_seq_stop(struct seq_file *seq, void *iter_ptr)
28104480c27cSAndreas Gruenbacher {
28114480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter *i = seq->private;
28124480c27cSAndreas Gruenbacher
28134480c27cSAndreas Gruenbacher if (i->file)
28144480c27cSAndreas Gruenbacher fput(i->file);
28154480c27cSAndreas Gruenbacher if (i->task)
28164480c27cSAndreas Gruenbacher put_task_struct(i->task);
28174480c27cSAndreas Gruenbacher }
28184480c27cSAndreas Gruenbacher
gfs2_glockfd_seq_show_flock(struct seq_file * seq,struct gfs2_glockfd_iter * i)281956535dc6SAndreas Gruenbacher static void gfs2_glockfd_seq_show_flock(struct seq_file *seq,
282056535dc6SAndreas Gruenbacher struct gfs2_glockfd_iter *i)
282156535dc6SAndreas Gruenbacher {
282256535dc6SAndreas Gruenbacher struct gfs2_file *fp = i->file->private_data;
282356535dc6SAndreas Gruenbacher struct gfs2_holder *fl_gh = &fp->f_fl_gh;
282456535dc6SAndreas Gruenbacher struct lm_lockname gl_name = { .ln_type = LM_TYPE_RESERVED };
282556535dc6SAndreas Gruenbacher
282656535dc6SAndreas Gruenbacher if (!READ_ONCE(fl_gh->gh_gl))
282756535dc6SAndreas Gruenbacher return;
282856535dc6SAndreas Gruenbacher
282956535dc6SAndreas Gruenbacher spin_lock(&i->file->f_lock);
283056535dc6SAndreas Gruenbacher if (gfs2_holder_initialized(fl_gh))
283156535dc6SAndreas Gruenbacher gl_name = fl_gh->gh_gl->gl_name;
283256535dc6SAndreas Gruenbacher spin_unlock(&i->file->f_lock);
283356535dc6SAndreas Gruenbacher
283456535dc6SAndreas Gruenbacher if (gl_name.ln_type != LM_TYPE_RESERVED) {
283556535dc6SAndreas Gruenbacher seq_printf(seq, "%d %u %u/%llx\n",
283656535dc6SAndreas Gruenbacher i->tgid, i->fd, gl_name.ln_type,
283756535dc6SAndreas Gruenbacher (unsigned long long)gl_name.ln_number);
283856535dc6SAndreas Gruenbacher }
283956535dc6SAndreas Gruenbacher }
284056535dc6SAndreas Gruenbacher
gfs2_glockfd_seq_show(struct seq_file * seq,void * iter_ptr)28414480c27cSAndreas Gruenbacher static int gfs2_glockfd_seq_show(struct seq_file *seq, void *iter_ptr)
28424480c27cSAndreas Gruenbacher {
28434480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter *i = seq->private;
28444480c27cSAndreas Gruenbacher struct inode *inode = file_inode(i->file);
28454480c27cSAndreas Gruenbacher struct gfs2_glock *gl;
28464480c27cSAndreas Gruenbacher
28474480c27cSAndreas Gruenbacher inode_lock_shared(inode);
28484480c27cSAndreas Gruenbacher gl = GFS2_I(inode)->i_iopen_gh.gh_gl;
28494480c27cSAndreas Gruenbacher if (gl) {
28504480c27cSAndreas Gruenbacher seq_printf(seq, "%d %u %u/%llx\n",
28514480c27cSAndreas Gruenbacher i->tgid, i->fd, gl->gl_name.ln_type,
28524480c27cSAndreas Gruenbacher (unsigned long long)gl->gl_name.ln_number);
28534480c27cSAndreas Gruenbacher }
285456535dc6SAndreas Gruenbacher gfs2_glockfd_seq_show_flock(seq, i);
28554480c27cSAndreas Gruenbacher inode_unlock_shared(inode);
28564480c27cSAndreas Gruenbacher return 0;
28574480c27cSAndreas Gruenbacher }
28584480c27cSAndreas Gruenbacher
28594480c27cSAndreas Gruenbacher static const struct seq_operations gfs2_glockfd_seq_ops = {
28604480c27cSAndreas Gruenbacher .start = gfs2_glockfd_seq_start,
28614480c27cSAndreas Gruenbacher .next = gfs2_glockfd_seq_next,
28624480c27cSAndreas Gruenbacher .stop = gfs2_glockfd_seq_stop,
28634480c27cSAndreas Gruenbacher .show = gfs2_glockfd_seq_show,
28644480c27cSAndreas Gruenbacher };
28654480c27cSAndreas Gruenbacher
gfs2_glockfd_open(struct inode * inode,struct file * file)28664480c27cSAndreas Gruenbacher static int gfs2_glockfd_open(struct inode *inode, struct file *file)
28674480c27cSAndreas Gruenbacher {
28684480c27cSAndreas Gruenbacher struct gfs2_glockfd_iter *i;
28694480c27cSAndreas Gruenbacher struct gfs2_sbd *sdp = inode->i_private;
28704480c27cSAndreas Gruenbacher
28714480c27cSAndreas Gruenbacher i = __seq_open_private(file, &gfs2_glockfd_seq_ops,
28724480c27cSAndreas Gruenbacher sizeof(struct gfs2_glockfd_iter));
28734480c27cSAndreas Gruenbacher if (!i)
28744480c27cSAndreas Gruenbacher return -ENOMEM;
28754480c27cSAndreas Gruenbacher i->sb = sdp->sd_vfs;
28764480c27cSAndreas Gruenbacher return 0;
28774480c27cSAndreas Gruenbacher }
28784480c27cSAndreas Gruenbacher
28794480c27cSAndreas Gruenbacher static const struct file_operations gfs2_glockfd_fops = {
28804480c27cSAndreas Gruenbacher .owner = THIS_MODULE,
28814480c27cSAndreas Gruenbacher .open = gfs2_glockfd_open,
28824480c27cSAndreas Gruenbacher .read = seq_read,
28834480c27cSAndreas Gruenbacher .llseek = seq_lseek,
28844480c27cSAndreas Gruenbacher .release = seq_release_private,
28854480c27cSAndreas Gruenbacher };
28864480c27cSAndreas Gruenbacher
2887e8a8023eSLiu Shixin DEFINE_SEQ_ATTRIBUTE(gfs2_sbstats);
28887c52b166SRobert Peterson
gfs2_create_debugfs_file(struct gfs2_sbd * sdp)28892abbf9a4SGreg Kroah-Hartman void gfs2_create_debugfs_file(struct gfs2_sbd *sdp)
28907c52b166SRobert Peterson {
28912abbf9a4SGreg Kroah-Hartman sdp->debugfs_dir = debugfs_create_dir(sdp->sd_table_name, gfs2_root);
28927b4ddfa7SChengyu Song
28932abbf9a4SGreg Kroah-Hartman debugfs_create_file("glocks", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
2894a245769fSSteven Whitehouse &gfs2_glocks_fops);
2895a245769fSSteven Whitehouse
28964480c27cSAndreas Gruenbacher debugfs_create_file("glockfd", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
28974480c27cSAndreas Gruenbacher &gfs2_glockfd_fops);
28984480c27cSAndreas Gruenbacher
28992abbf9a4SGreg Kroah-Hartman debugfs_create_file("glstats", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
2900a245769fSSteven Whitehouse &gfs2_glstats_fops);
2901a245769fSSteven Whitehouse
29022abbf9a4SGreg Kroah-Hartman debugfs_create_file("sbstats", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
2903a245769fSSteven Whitehouse &gfs2_sbstats_fops);
29047c52b166SRobert Peterson }
29057c52b166SRobert Peterson
gfs2_delete_debugfs_file(struct gfs2_sbd * sdp)29067c52b166SRobert Peterson void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp)
29077c52b166SRobert Peterson {
29082abbf9a4SGreg Kroah-Hartman debugfs_remove_recursive(sdp->debugfs_dir);
29095f882096SRobert Peterson sdp->debugfs_dir = NULL;
29105f882096SRobert Peterson }
29117c52b166SRobert Peterson
gfs2_register_debugfs(void)29122abbf9a4SGreg Kroah-Hartman void gfs2_register_debugfs(void)
29137c52b166SRobert Peterson {
29147c52b166SRobert Peterson gfs2_root = debugfs_create_dir("gfs2", NULL);
29157c52b166SRobert Peterson }
29167c52b166SRobert Peterson
gfs2_unregister_debugfs(void)29177c52b166SRobert Peterson void gfs2_unregister_debugfs(void)
29187c52b166SRobert Peterson {
29197c52b166SRobert Peterson debugfs_remove(gfs2_root);
29205f882096SRobert Peterson gfs2_root = NULL;
29217c52b166SRobert Peterson }
2922