diff options
Diffstat (limited to 'fs/gfs2/glops.c')
-rw-r--r-- | fs/gfs2/glops.c | 42 |
1 files changed, 13 insertions, 29 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 0cc3ff48ce20..6f82aac9b0ee 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -134,6 +134,8 @@ void gfs2_ail_flush(struct gfs2_glock *gl) | |||
134 | static void rgrp_go_sync(struct gfs2_glock *gl) | 134 | static void rgrp_go_sync(struct gfs2_glock *gl) |
135 | { | 135 | { |
136 | struct address_space *metamapping = gfs2_glock2aspace(gl); | 136 | struct address_space *metamapping = gfs2_glock2aspace(gl); |
137 | struct gfs2_rgrpd *rgd = gl->gl_object; | ||
138 | unsigned int x; | ||
137 | int error; | 139 | int error; |
138 | 140 | ||
139 | if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) | 141 | if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) |
@@ -145,6 +147,15 @@ static void rgrp_go_sync(struct gfs2_glock *gl) | |||
145 | error = filemap_fdatawait(metamapping); | 147 | error = filemap_fdatawait(metamapping); |
146 | mapping_set_error(metamapping, error); | 148 | mapping_set_error(metamapping, error); |
147 | gfs2_ail_empty_gl(gl); | 149 | gfs2_ail_empty_gl(gl); |
150 | |||
151 | if (!rgd) | ||
152 | return; | ||
153 | |||
154 | for (x = 0; x < rgd->rd_length; x++) { | ||
155 | struct gfs2_bitmap *bi = rgd->rd_bits + x; | ||
156 | kfree(bi->bi_clone); | ||
157 | bi->bi_clone = NULL; | ||
158 | } | ||
148 | } | 159 | } |
149 | 160 | ||
150 | /** | 161 | /** |
@@ -445,33 +456,6 @@ static int inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl) | |||
445 | } | 456 | } |
446 | 457 | ||
447 | /** | 458 | /** |
448 | * rgrp_go_lock - operation done after an rgrp lock is locked by | ||
449 | * a first holder on this node. | ||
450 | * @gl: the glock | ||
451 | * @flags: | ||
452 | * | ||
453 | * Returns: errno | ||
454 | */ | ||
455 | |||
456 | static int rgrp_go_lock(struct gfs2_holder *gh) | ||
457 | { | ||
458 | return gfs2_rgrp_bh_get(gh->gh_gl->gl_object); | ||
459 | } | ||
460 | |||
461 | /** | ||
462 | * rgrp_go_unlock - operation done before an rgrp lock is unlocked by | ||
463 | * a last holder on this node. | ||
464 | * @gl: the glock | ||
465 | * @flags: | ||
466 | * | ||
467 | */ | ||
468 | |||
469 | static void rgrp_go_unlock(struct gfs2_holder *gh) | ||
470 | { | ||
471 | gfs2_rgrp_bh_put(gh->gh_gl->gl_object); | ||
472 | } | ||
473 | |||
474 | /** | ||
475 | * trans_go_sync - promote/demote the transaction glock | 459 | * trans_go_sync - promote/demote the transaction glock |
476 | * @gl: the glock | 460 | * @gl: the glock |
477 | * @state: the requested state | 461 | * @state: the requested state |
@@ -573,8 +557,8 @@ const struct gfs2_glock_operations gfs2_inode_glops = { | |||
573 | const struct gfs2_glock_operations gfs2_rgrp_glops = { | 557 | const struct gfs2_glock_operations gfs2_rgrp_glops = { |
574 | .go_xmote_th = rgrp_go_sync, | 558 | .go_xmote_th = rgrp_go_sync, |
575 | .go_inval = rgrp_go_inval, | 559 | .go_inval = rgrp_go_inval, |
576 | .go_lock = rgrp_go_lock, | 560 | .go_lock = gfs2_rgrp_go_lock, |
577 | .go_unlock = rgrp_go_unlock, | 561 | .go_unlock = gfs2_rgrp_go_unlock, |
578 | .go_dump = gfs2_rgrp_dump, | 562 | .go_dump = gfs2_rgrp_dump, |
579 | .go_type = LM_TYPE_RGRP, | 563 | .go_type = LM_TYPE_RGRP, |
580 | .go_flags = GLOF_ASPACE, | 564 | .go_flags = GLOF_ASPACE, |