aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2012-11-14 13:46:53 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2012-11-15 05:16:59 -0500
commitdba2d70c5dc520fdb569d1fd8dbd45c0e330253e (patch)
tree35cee899f98a6d863d48ecc2dc891b9dbb38b27e /fs/gfs2
parentfb6791d100d1bba20b5cdbc4912e1f7086ec60f8 (diff)
GFS2: only use lvb on glocks that need it
Save the effort of allocating, reading and writing the lvb for most glocks that do not use it. Signed-off-by: David Teigland <teigland@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r--fs/gfs2/glock.c27
-rw-r--r--fs/gfs2/glops.c3
-rw-r--r--fs/gfs2/incore.h3
-rw-r--r--fs/gfs2/lock_dlm.c12
4 files changed, 32 insertions, 13 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 9d29a5167d34..2284de4d05ce 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -105,10 +105,12 @@ static void gfs2_glock_dealloc(struct rcu_head *rcu)
105{ 105{
106 struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu); 106 struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu);
107 107
108 if (gl->gl_ops->go_flags & GLOF_ASPACE) 108 if (gl->gl_ops->go_flags & GLOF_ASPACE) {
109 kmem_cache_free(gfs2_glock_aspace_cachep, gl); 109 kmem_cache_free(gfs2_glock_aspace_cachep, gl);
110 else 110 } else {
111 kfree(gl->gl_lvb);
111 kmem_cache_free(gfs2_glock_cachep, gl); 112 kmem_cache_free(gfs2_glock_cachep, gl);
113 }
112} 114}
113 115
114void gfs2_glock_free(struct gfs2_glock *gl) 116void gfs2_glock_free(struct gfs2_glock *gl)
@@ -545,7 +547,10 @@ __acquires(&gl->gl_spin)
545 if (sdp->sd_lockstruct.ls_ops->lm_lock) { 547 if (sdp->sd_lockstruct.ls_ops->lm_lock) {
546 /* lock_dlm */ 548 /* lock_dlm */
547 ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags); 549 ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags);
548 GLOCK_BUG_ON(gl, ret); 550 if (ret) {
551 printk(KERN_ERR "GFS2: lm_lock ret %d\n", ret);
552 GLOCK_BUG_ON(gl, 1);
553 }
549 } else { /* lock_nolock */ 554 } else { /* lock_nolock */
550 finish_xmote(gl, target); 555 finish_xmote(gl, target);
551 if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0) 556 if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0)
@@ -734,6 +739,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
734 if (!gl) 739 if (!gl)
735 return -ENOMEM; 740 return -ENOMEM;
736 741
742 memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
743 gl->gl_lvb = NULL;
744
745 if (glops->go_flags & GLOF_LVB) {
746 gl->gl_lvb = kzalloc(GFS2_MIN_LVB_SIZE, GFP_KERNEL);
747 if (!gl->gl_lvb) {
748 kmem_cache_free(cachep, gl);
749 return -ENOMEM;
750 }
751 gl->gl_lksb.sb_lvbptr = gl->gl_lvb;
752 }
753
737 atomic_inc(&sdp->sd_glock_disposal); 754 atomic_inc(&sdp->sd_glock_disposal);
738 gl->gl_sbd = sdp; 755 gl->gl_sbd = sdp;
739 gl->gl_flags = 0; 756 gl->gl_flags = 0;
@@ -751,9 +768,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
751 preempt_enable(); 768 preempt_enable();
752 gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0; 769 gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0;
753 gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0; 770 gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0;
754 memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
755 memset(gl->gl_lvb, 0, 32 * sizeof(char));
756 gl->gl_lksb.sb_lvbptr = gl->gl_lvb;
757 gl->gl_tchange = jiffies; 771 gl->gl_tchange = jiffies;
758 gl->gl_object = NULL; 772 gl->gl_object = NULL;
759 gl->gl_hold_time = GL_GLOCK_DFT_HOLD; 773 gl->gl_hold_time = GL_GLOCK_DFT_HOLD;
@@ -775,6 +789,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
775 tmp = search_bucket(hash, sdp, &name); 789 tmp = search_bucket(hash, sdp, &name);
776 if (tmp) { 790 if (tmp) {
777 spin_unlock_bucket(hash); 791 spin_unlock_bucket(hash);
792 kfree(gl->gl_lvb);
778 kmem_cache_free(cachep, gl); 793 kmem_cache_free(cachep, gl);
779 atomic_dec(&sdp->sd_glock_disposal); 794 atomic_dec(&sdp->sd_glock_disposal);
780 gl = tmp; 795 gl = tmp;
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index e86fe26c12d2..78d4184ffc7d 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -552,7 +552,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = {
552 .go_unlock = gfs2_rgrp_go_unlock, 552 .go_unlock = gfs2_rgrp_go_unlock,
553 .go_dump = gfs2_rgrp_dump, 553 .go_dump = gfs2_rgrp_dump,
554 .go_type = LM_TYPE_RGRP, 554 .go_type = LM_TYPE_RGRP,
555 .go_flags = GLOF_ASPACE, 555 .go_flags = GLOF_ASPACE | GLOF_LVB,
556}; 556};
557 557
558const struct gfs2_glock_operations gfs2_trans_glops = { 558const struct gfs2_glock_operations gfs2_trans_glops = {
@@ -577,6 +577,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = {
577 577
578const struct gfs2_glock_operations gfs2_quota_glops = { 578const struct gfs2_glock_operations gfs2_quota_glops = {
579 .go_type = LM_TYPE_QUOTA, 579 .go_type = LM_TYPE_QUOTA,
580 .go_flags = GLOF_LVB,
580}; 581};
581 582
582const struct gfs2_glock_operations gfs2_journal_glops = { 583const struct gfs2_glock_operations gfs2_journal_glops = {
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index a35ef5cd1480..bd577fc59e0b 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -216,6 +216,7 @@ struct gfs2_glock_operations {
216 const int go_type; 216 const int go_type;
217 const unsigned long go_flags; 217 const unsigned long go_flags;
218#define GLOF_ASPACE 1 218#define GLOF_ASPACE 1
219#define GLOF_LVB 2
219}; 220};
220 221
221enum { 222enum {
@@ -321,7 +322,7 @@ struct gfs2_glock {
321 ktime_t gl_dstamp; 322 ktime_t gl_dstamp;
322 struct gfs2_lkstats gl_stats; 323 struct gfs2_lkstats gl_stats;
323 struct dlm_lksb gl_lksb; 324 struct dlm_lksb gl_lksb;
324 char gl_lvb[32]; 325 char *gl_lvb;
325 unsigned long gl_tchange; 326 unsigned long gl_tchange;
326 void *gl_object; 327 void *gl_object;
327 328
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c
index f6504d3fadb3..d28ae37ceb3c 100644
--- a/fs/gfs2/lock_dlm.c
+++ b/fs/gfs2/lock_dlm.c
@@ -120,7 +120,7 @@ static void gdlm_ast(void *arg)
120 gfs2_update_reply_times(gl); 120 gfs2_update_reply_times(gl);
121 BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); 121 BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
122 122
123 if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) 123 if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID && gl->gl_lvb)
124 memset(gl->gl_lvb, 0, GDLM_LVB_SIZE); 124 memset(gl->gl_lvb, 0, GDLM_LVB_SIZE);
125 125
126 switch (gl->gl_lksb.sb_status) { 126 switch (gl->gl_lksb.sb_status) {
@@ -203,8 +203,10 @@ static int make_mode(const unsigned int lmstate)
203static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, 203static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
204 const int req) 204 const int req)
205{ 205{
206 u32 lkf = DLM_LKF_VALBLK; 206 u32 lkf = 0;
207 u32 lkid = gl->gl_lksb.sb_lkid; 207
208 if (gl->gl_lvb)
209 lkf |= DLM_LKF_VALBLK;
208 210
209 if (gfs_flags & LM_FLAG_TRY) 211 if (gfs_flags & LM_FLAG_TRY)
210 lkf |= DLM_LKF_NOQUEUE; 212 lkf |= DLM_LKF_NOQUEUE;
@@ -228,7 +230,7 @@ static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
228 BUG(); 230 BUG();
229 } 231 }
230 232
231 if (lkid != 0) { 233 if (gl->gl_lksb.sb_lkid != 0) {
232 lkf |= DLM_LKF_CONVERT; 234 lkf |= DLM_LKF_CONVERT;
233 if (test_bit(GLF_BLOCKING, &gl->gl_flags)) 235 if (test_bit(GLF_BLOCKING, &gl->gl_flags))
234 lkf |= DLM_LKF_QUECVT; 236 lkf |= DLM_LKF_QUECVT;
@@ -292,7 +294,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
292 294
293 /* don't want to skip dlm_unlock writing the lvb when lock is ex */ 295 /* don't want to skip dlm_unlock writing the lvb when lock is ex */
294 if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) && 296 if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
295 gl->gl_state != LM_ST_EXCLUSIVE) { 297 gl->gl_lvb && gl->gl_state != LM_ST_EXCLUSIVE) {
296 gfs2_glock_free(gl); 298 gfs2_glock_free(gl);
297 return; 299 return;
298 } 300 }