diff options
-rw-r--r-- | fs/gfs2/daemon.c | 2 | ||||
-rw-r--r-- | fs/gfs2/dir.c | 2 | ||||
-rw-r--r-- | fs/gfs2/glops.c | 6 | ||||
-rw-r--r-- | fs/gfs2/incore.h | 6 | ||||
-rw-r--r-- | fs/gfs2/log.c | 33 | ||||
-rw-r--r-- | fs/gfs2/log.h | 6 | ||||
-rw-r--r-- | fs/gfs2/lops.c | 14 | ||||
-rw-r--r-- | fs/gfs2/lops.h | 14 | ||||
-rw-r--r-- | fs/gfs2/meta_io.c | 10 | ||||
-rw-r--r-- | fs/gfs2/ops_file.c | 23 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 4 | ||||
-rw-r--r-- | fs/gfs2/ops_super.c | 12 | ||||
-rw-r--r-- | fs/gfs2/quota.c | 2 | ||||
-rw-r--r-- | fs/gfs2/trans.c | 2 |
14 files changed, 67 insertions, 69 deletions
diff --git a/fs/gfs2/daemon.c b/fs/gfs2/daemon.c index 94317dc7e42c..b3830b92d78c 100644 --- a/fs/gfs2/daemon.c +++ b/fs/gfs2/daemon.c | |||
@@ -129,7 +129,7 @@ int gfs2_logd(void *data) | |||
129 | gfs2_ail1_empty(sdp, DIO_ALL); | 129 | gfs2_ail1_empty(sdp, DIO_ALL); |
130 | 130 | ||
131 | if (time_after_eq(jiffies, t)) { | 131 | if (time_after_eq(jiffies, t)) { |
132 | gfs2_log_flush(sdp); | 132 | gfs2_log_flush(sdp, NULL); |
133 | sdp->sd_log_flush_time = jiffies; | 133 | sdp->sd_log_flush_time = jiffies; |
134 | } | 134 | } |
135 | 135 | ||
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 66917f2c64aa..316eed688f8e 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
@@ -789,6 +789,8 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode, | |||
789 | if (error) | 789 | if (error) |
790 | return ERR_PTR(error); | 790 | return ERR_PTR(error); |
791 | dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL); | 791 | dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL); |
792 | brelse(bh); | ||
793 | |||
792 | got_dent: | 794 | got_dent: |
793 | *pbh = bh; | 795 | *pbh = bh; |
794 | return dent; | 796 | return dent; |
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index d9334eb72df8..d180c89dd567 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -45,7 +45,7 @@ static void meta_go_sync(struct gfs2_glock *gl, int flags) | |||
45 | return; | 45 | return; |
46 | 46 | ||
47 | if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) { | 47 | if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) { |
48 | gfs2_log_flush_glock(gl); | 48 | gfs2_log_flush(gl->gl_sbd, gl); |
49 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); | 49 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); |
50 | if (flags & DIO_RELEASE) | 50 | if (flags & DIO_RELEASE) |
51 | gfs2_ail_empty_gl(gl); | 51 | gfs2_ail_empty_gl(gl); |
@@ -149,12 +149,12 @@ static void inode_go_sync(struct gfs2_glock *gl, int flags) | |||
149 | if (test_bit(GLF_DIRTY, &gl->gl_flags)) { | 149 | if (test_bit(GLF_DIRTY, &gl->gl_flags)) { |
150 | if (meta && data) { | 150 | if (meta && data) { |
151 | gfs2_page_sync(gl, flags | DIO_START); | 151 | gfs2_page_sync(gl, flags | DIO_START); |
152 | gfs2_log_flush_glock(gl); | 152 | gfs2_log_flush(gl->gl_sbd, gl); |
153 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); | 153 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); |
154 | gfs2_page_sync(gl, flags | DIO_WAIT); | 154 | gfs2_page_sync(gl, flags | DIO_WAIT); |
155 | clear_bit(GLF_DIRTY, &gl->gl_flags); | 155 | clear_bit(GLF_DIRTY, &gl->gl_flags); |
156 | } else if (meta) { | 156 | } else if (meta) { |
157 | gfs2_log_flush_glock(gl); | 157 | gfs2_log_flush(gl->gl_sbd, gl); |
158 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); | 158 | gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT); |
159 | } else if (data) | 159 | } else if (data) |
160 | gfs2_page_sync(gl, flags | DIO_START | DIO_WAIT); | 160 | gfs2_page_sync(gl, flags | DIO_START | DIO_WAIT); |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 423cfa72b4c7..dfed83b37ab7 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -62,12 +62,12 @@ struct gfs2_log_operations { | |||
62 | struct gfs2_log_descriptor *ld, __be64 *ptr, | 62 | struct gfs2_log_descriptor *ld, __be64 *ptr, |
63 | int pass); | 63 | int pass); |
64 | void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass); | 64 | void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass); |
65 | char *lo_name; | 65 | const char *lo_name; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | struct gfs2_log_element { | 68 | struct gfs2_log_element { |
69 | struct list_head le_list; | 69 | struct list_head le_list; |
70 | struct gfs2_log_operations *le_ops; | 70 | const struct gfs2_log_operations *le_ops; |
71 | }; | 71 | }; |
72 | 72 | ||
73 | struct gfs2_bitmap { | 73 | struct gfs2_bitmap { |
@@ -618,6 +618,7 @@ struct gfs2_sbd { | |||
618 | unsigned int sd_log_num_rg; | 618 | unsigned int sd_log_num_rg; |
619 | unsigned int sd_log_num_databuf; | 619 | unsigned int sd_log_num_databuf; |
620 | unsigned int sd_log_num_jdata; | 620 | unsigned int sd_log_num_jdata; |
621 | unsigned int sd_log_num_hdrs; | ||
621 | 622 | ||
622 | struct list_head sd_log_le_gl; | 623 | struct list_head sd_log_le_gl; |
623 | struct list_head sd_log_le_buf; | 624 | struct list_head sd_log_le_buf; |
@@ -631,7 +632,6 @@ struct gfs2_sbd { | |||
631 | uint64_t sd_log_sequence; | 632 | uint64_t sd_log_sequence; |
632 | unsigned int sd_log_head; | 633 | unsigned int sd_log_head; |
633 | unsigned int sd_log_tail; | 634 | unsigned int sd_log_tail; |
634 | uint64_t sd_log_wraps; | ||
635 | int sd_log_idle; | 635 | int sd_log_idle; |
636 | 636 | ||
637 | unsigned long sd_log_flush_time; | 637 | unsigned long sd_log_flush_time; |
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index ea69376c00d8..cadfef193e55 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c | |||
@@ -171,13 +171,14 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks) | |||
171 | while(sdp->sd_log_blks_free <= blks) { | 171 | while(sdp->sd_log_blks_free <= blks) { |
172 | gfs2_log_unlock(sdp); | 172 | gfs2_log_unlock(sdp); |
173 | gfs2_ail1_empty(sdp, 0); | 173 | gfs2_ail1_empty(sdp, 0); |
174 | gfs2_log_flush(sdp); | 174 | gfs2_log_flush(sdp, NULL); |
175 | 175 | ||
176 | if (try++) | 176 | if (try++) |
177 | gfs2_ail1_start(sdp, 0); | 177 | gfs2_ail1_start(sdp, 0); |
178 | gfs2_log_lock(sdp); | 178 | gfs2_log_lock(sdp); |
179 | } | 179 | } |
180 | sdp->sd_log_blks_free -= blks; | 180 | sdp->sd_log_blks_free -= blks; |
181 | /* printk(KERN_INFO "reserved %u blocks (%u left)\n", blks, sdp->sd_log_blks_free); */ | ||
181 | gfs2_log_unlock(sdp); | 182 | gfs2_log_unlock(sdp); |
182 | mutex_unlock(&sdp->sd_log_reserve_mutex); | 183 | mutex_unlock(&sdp->sd_log_reserve_mutex); |
183 | 184 | ||
@@ -199,6 +200,7 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) | |||
199 | 200 | ||
200 | gfs2_log_lock(sdp); | 201 | gfs2_log_lock(sdp); |
201 | sdp->sd_log_blks_free += blks; | 202 | sdp->sd_log_blks_free += blks; |
203 | /* printk(KERN_INFO "released %u blocks (%u left)\n", blks, sdp->sd_log_blks_free); */ | ||
202 | gfs2_assert_withdraw(sdp, | 204 | gfs2_assert_withdraw(sdp, |
203 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); | 205 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); |
204 | gfs2_log_unlock(sdp); | 206 | gfs2_log_unlock(sdp); |
@@ -342,6 +344,7 @@ static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail, int pull) | |||
342 | 344 | ||
343 | gfs2_log_lock(sdp); | 345 | gfs2_log_lock(sdp); |
344 | sdp->sd_log_blks_free += dist - ((pull) ? 1 : 0); | 346 | sdp->sd_log_blks_free += dist - ((pull) ? 1 : 0); |
347 | /* printk(KERN_INFO "pull tail refunding %u blocks (%u left) pull=%d\n", dist - ((pull) ? 1 : 0), sdp->sd_log_blks_free, pull); */ | ||
345 | gfs2_assert_withdraw(sdp, | 348 | gfs2_assert_withdraw(sdp, |
346 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); | 349 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); |
347 | gfs2_log_unlock(sdp); | 350 | gfs2_log_unlock(sdp); |
@@ -364,6 +367,8 @@ static void log_write_header(struct gfs2_sbd *sdp, uint32_t flags, int pull) | |||
364 | unsigned int tail; | 367 | unsigned int tail; |
365 | uint32_t hash; | 368 | uint32_t hash; |
366 | 369 | ||
370 | /* printk(KERN_INFO "log write header start (flags=%08x, pull=%d)\n", flags, pull); */ | ||
371 | |||
367 | bh = sb_getblk(sdp->sd_vfs, blkno); | 372 | bh = sb_getblk(sdp->sd_vfs, blkno); |
368 | lock_buffer(bh); | 373 | lock_buffer(bh); |
369 | memset(bh->b_data, 0, bh->b_size); | 374 | memset(bh->b_data, 0, bh->b_size); |
@@ -398,6 +403,8 @@ static void log_write_header(struct gfs2_sbd *sdp, uint32_t flags, int pull) | |||
398 | 403 | ||
399 | sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); | 404 | sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); |
400 | log_incr_head(sdp); | 405 | log_incr_head(sdp); |
406 | |||
407 | /* printk(KERN_INFO "log write header out\n"); */ | ||
401 | } | 408 | } |
402 | 409 | ||
403 | static void log_flush_commit(struct gfs2_sbd *sdp) | 410 | static void log_flush_commit(struct gfs2_sbd *sdp) |
@@ -432,20 +439,16 @@ static void log_flush_commit(struct gfs2_sbd *sdp) | |||
432 | } | 439 | } |
433 | 440 | ||
434 | /** | 441 | /** |
435 | * gfs2_log_flush_i - flush incore transaction(s) | 442 | * gfs2_log_flush - flush incore transaction(s) |
436 | * @sdp: the filesystem | 443 | * @sdp: the filesystem |
437 | * @gl: The glock structure to flush. If NULL, flush the whole incore log | 444 | * @gl: The glock structure to flush. If NULL, flush the whole incore log |
438 | * | 445 | * |
439 | */ | 446 | */ |
440 | 447 | ||
441 | void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl) | 448 | void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl) |
442 | { | 449 | { |
443 | struct gfs2_ail *ai; | 450 | struct gfs2_ail *ai; |
444 | 451 | ||
445 | ai = kzalloc(sizeof(struct gfs2_ail), GFP_NOFS | __GFP_NOFAIL); | ||
446 | INIT_LIST_HEAD(&ai->ai_ail1_list); | ||
447 | INIT_LIST_HEAD(&ai->ai_ail2_list); | ||
448 | |||
449 | down_write(&sdp->sd_log_flush_lock); | 452 | down_write(&sdp->sd_log_flush_lock); |
450 | 453 | ||
451 | if (gl) { | 454 | if (gl) { |
@@ -453,12 +456,14 @@ void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl) | |||
453 | if (list_empty(&gl->gl_le.le_list)) { | 456 | if (list_empty(&gl->gl_le.le_list)) { |
454 | gfs2_log_unlock(sdp); | 457 | gfs2_log_unlock(sdp); |
455 | up_write(&sdp->sd_log_flush_lock); | 458 | up_write(&sdp->sd_log_flush_lock); |
456 | kfree(ai); | ||
457 | return; | 459 | return; |
458 | } | 460 | } |
459 | gfs2_log_unlock(sdp); | 461 | gfs2_log_unlock(sdp); |
460 | } | 462 | } |
461 | 463 | ||
464 | ai = kzalloc(sizeof(struct gfs2_ail), GFP_NOFS | __GFP_NOFAIL); | ||
465 | INIT_LIST_HEAD(&ai->ai_ail1_list); | ||
466 | INIT_LIST_HEAD(&ai->ai_ail2_list); | ||
462 | 467 | ||
463 | gfs2_assert_withdraw(sdp, | 468 | gfs2_assert_withdraw(sdp, |
464 | sdp->sd_log_num_buf == sdp->sd_log_commited_buf); | 469 | sdp->sd_log_num_buf == sdp->sd_log_commited_buf); |
@@ -476,11 +481,12 @@ void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl) | |||
476 | log_write_header(sdp, 0, PULL); | 481 | log_write_header(sdp, 0, PULL); |
477 | lops_after_commit(sdp, ai); | 482 | lops_after_commit(sdp, ai); |
478 | sdp->sd_log_head = sdp->sd_log_flush_head; | 483 | sdp->sd_log_head = sdp->sd_log_flush_head; |
479 | if (sdp->sd_log_flush_wrapped) | 484 | |
480 | sdp->sd_log_wraps++; | 485 | /* printk(KERN_INFO "sd_log_num_hdrs %u\n", sdp->sd_log_num_hdrs); */ |
481 | 486 | ||
482 | sdp->sd_log_blks_reserved = | 487 | sdp->sd_log_blks_reserved = |
483 | sdp->sd_log_commited_buf = | 488 | sdp->sd_log_commited_buf = |
489 | sdp->sd_log_num_hdrs = | ||
484 | sdp->sd_log_commited_revoke = 0; | 490 | sdp->sd_log_commited_revoke = 0; |
485 | 491 | ||
486 | gfs2_log_lock(sdp); | 492 | gfs2_log_lock(sdp); |
@@ -519,8 +525,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) | |||
519 | sdp->sd_log_blks_free += tr->tr_reserved - | 525 | sdp->sd_log_blks_free += tr->tr_reserved - |
520 | (reserved - sdp->sd_log_blks_reserved); | 526 | (reserved - sdp->sd_log_blks_reserved); |
521 | 527 | ||
522 | gfs2_assert_withdraw(sdp, | 528 | gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free >= old); |
523 | sdp->sd_log_blks_free >= old); | ||
524 | gfs2_assert_withdraw(sdp, | 529 | gfs2_assert_withdraw(sdp, |
525 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); | 530 | sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); |
526 | 531 | ||
@@ -548,7 +553,7 @@ void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) | |||
548 | gfs2_log_lock(sdp); | 553 | gfs2_log_lock(sdp); |
549 | if (sdp->sd_log_num_buf > gfs2_tune_get(sdp, gt_incore_log_blocks)) { | 554 | if (sdp->sd_log_num_buf > gfs2_tune_get(sdp, gt_incore_log_blocks)) { |
550 | gfs2_log_unlock(sdp); | 555 | gfs2_log_unlock(sdp); |
551 | gfs2_log_flush(sdp); | 556 | gfs2_log_flush(sdp, NULL); |
552 | } else | 557 | } else |
553 | gfs2_log_unlock(sdp); | 558 | gfs2_log_unlock(sdp); |
554 | } | 559 | } |
@@ -583,8 +588,6 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp) | |||
583 | gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail2_list)); | 588 | gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail2_list)); |
584 | 589 | ||
585 | sdp->sd_log_head = sdp->sd_log_flush_head; | 590 | sdp->sd_log_head = sdp->sd_log_flush_head; |
586 | if (sdp->sd_log_flush_wrapped) | ||
587 | sdp->sd_log_wraps++; | ||
588 | sdp->sd_log_tail = sdp->sd_log_head; | 591 | sdp->sd_log_tail = sdp->sd_log_head; |
589 | 592 | ||
590 | up_write(&sdp->sd_log_flush_lock); | 593 | up_write(&sdp->sd_log_flush_lock); |
diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h index e7a6a65c530f..84a3e902e848 100644 --- a/fs/gfs2/log.h +++ b/fs/gfs2/log.h | |||
@@ -37,7 +37,6 @@ static inline void gfs2_log_pointers_init(struct gfs2_sbd *sdp, | |||
37 | { | 37 | { |
38 | if (++value == sdp->sd_jdesc->jd_blocks) { | 38 | if (++value == sdp->sd_jdesc->jd_blocks) { |
39 | value = 0; | 39 | value = 0; |
40 | sdp->sd_log_wraps++; | ||
41 | } | 40 | } |
42 | sdp->sd_log_head = sdp->sd_log_tail = value; | 41 | sdp->sd_log_head = sdp->sd_log_tail = value; |
43 | } | 42 | } |
@@ -54,10 +53,7 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks); | |||
54 | struct buffer_head *gfs2_log_get_buf(struct gfs2_sbd *sdp); | 53 | struct buffer_head *gfs2_log_get_buf(struct gfs2_sbd *sdp); |
55 | struct buffer_head *gfs2_log_fake_buf(struct gfs2_sbd *sdp, | 54 | struct buffer_head *gfs2_log_fake_buf(struct gfs2_sbd *sdp, |
56 | struct buffer_head *real); | 55 | struct buffer_head *real); |
57 | 56 | void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl); | |
58 | #define gfs2_log_flush(sdp) gfs2_log_flush_i((sdp), NULL) | ||
59 | #define gfs2_log_flush_glock(gl) gfs2_log_flush_i((gl)->gl_sbd, (gl)) | ||
60 | void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl); | ||
61 | void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); | 57 | void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); |
62 | 58 | ||
63 | void gfs2_log_shutdown(struct gfs2_sbd *sdp); | 59 | void gfs2_log_shutdown(struct gfs2_sbd *sdp); |
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index 689c9101c0fb..4d90eb311497 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c | |||
@@ -130,6 +130,7 @@ static void buf_lo_before_commit(struct gfs2_sbd *sdp) | |||
130 | if (total > limit) | 130 | if (total > limit) |
131 | num = limit; | 131 | num = limit; |
132 | bh = gfs2_log_get_buf(sdp); | 132 | bh = gfs2_log_get_buf(sdp); |
133 | sdp->sd_log_num_hdrs++; | ||
133 | ld = (struct gfs2_log_descriptor *)bh->b_data; | 134 | ld = (struct gfs2_log_descriptor *)bh->b_data; |
134 | ptr = (__be64 *)(bh->b_data + offset); | 135 | ptr = (__be64 *)(bh->b_data + offset); |
135 | ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC); | 136 | ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC); |
@@ -570,6 +571,7 @@ static void databuf_lo_before_commit(struct gfs2_sbd *sdp) | |||
570 | gfs2_log_unlock(sdp); | 571 | gfs2_log_unlock(sdp); |
571 | if (!bh) { | 572 | if (!bh) { |
572 | bh = gfs2_log_get_buf(sdp); | 573 | bh = gfs2_log_get_buf(sdp); |
574 | sdp->sd_log_num_hdrs++; | ||
573 | ld = (struct gfs2_log_descriptor *) | 575 | ld = (struct gfs2_log_descriptor *) |
574 | bh->b_data; | 576 | bh->b_data; |
575 | ptr = (__be64 *)(bh->b_data + offset); | 577 | ptr = (__be64 *)(bh->b_data + offset); |
@@ -750,13 +752,13 @@ static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) | |||
750 | } | 752 | } |
751 | 753 | ||
752 | 754 | ||
753 | struct gfs2_log_operations gfs2_glock_lops = { | 755 | const struct gfs2_log_operations gfs2_glock_lops = { |
754 | .lo_add = glock_lo_add, | 756 | .lo_add = glock_lo_add, |
755 | .lo_after_commit = glock_lo_after_commit, | 757 | .lo_after_commit = glock_lo_after_commit, |
756 | .lo_name = "glock" | 758 | .lo_name = "glock" |
757 | }; | 759 | }; |
758 | 760 | ||
759 | struct gfs2_log_operations gfs2_buf_lops = { | 761 | const struct gfs2_log_operations gfs2_buf_lops = { |
760 | .lo_add = buf_lo_add, | 762 | .lo_add = buf_lo_add, |
761 | .lo_incore_commit = buf_lo_incore_commit, | 763 | .lo_incore_commit = buf_lo_incore_commit, |
762 | .lo_before_commit = buf_lo_before_commit, | 764 | .lo_before_commit = buf_lo_before_commit, |
@@ -767,7 +769,7 @@ struct gfs2_log_operations gfs2_buf_lops = { | |||
767 | .lo_name = "buf" | 769 | .lo_name = "buf" |
768 | }; | 770 | }; |
769 | 771 | ||
770 | struct gfs2_log_operations gfs2_revoke_lops = { | 772 | const struct gfs2_log_operations gfs2_revoke_lops = { |
771 | .lo_add = revoke_lo_add, | 773 | .lo_add = revoke_lo_add, |
772 | .lo_before_commit = revoke_lo_before_commit, | 774 | .lo_before_commit = revoke_lo_before_commit, |
773 | .lo_before_scan = revoke_lo_before_scan, | 775 | .lo_before_scan = revoke_lo_before_scan, |
@@ -776,13 +778,13 @@ struct gfs2_log_operations gfs2_revoke_lops = { | |||
776 | .lo_name = "revoke" | 778 | .lo_name = "revoke" |
777 | }; | 779 | }; |
778 | 780 | ||
779 | struct gfs2_log_operations gfs2_rg_lops = { | 781 | const struct gfs2_log_operations gfs2_rg_lops = { |
780 | .lo_add = rg_lo_add, | 782 | .lo_add = rg_lo_add, |
781 | .lo_after_commit = rg_lo_after_commit, | 783 | .lo_after_commit = rg_lo_after_commit, |
782 | .lo_name = "rg" | 784 | .lo_name = "rg" |
783 | }; | 785 | }; |
784 | 786 | ||
785 | struct gfs2_log_operations gfs2_databuf_lops = { | 787 | const struct gfs2_log_operations gfs2_databuf_lops = { |
786 | .lo_add = databuf_lo_add, | 788 | .lo_add = databuf_lo_add, |
787 | .lo_incore_commit = buf_lo_incore_commit, | 789 | .lo_incore_commit = buf_lo_incore_commit, |
788 | .lo_before_commit = databuf_lo_before_commit, | 790 | .lo_before_commit = databuf_lo_before_commit, |
@@ -792,7 +794,7 @@ struct gfs2_log_operations gfs2_databuf_lops = { | |||
792 | .lo_name = "databuf" | 794 | .lo_name = "databuf" |
793 | }; | 795 | }; |
794 | 796 | ||
795 | struct gfs2_log_operations *gfs2_log_ops[] = { | 797 | const struct gfs2_log_operations *gfs2_log_ops[] = { |
796 | &gfs2_glock_lops, | 798 | &gfs2_glock_lops, |
797 | &gfs2_buf_lops, | 799 | &gfs2_buf_lops, |
798 | &gfs2_revoke_lops, | 800 | &gfs2_revoke_lops, |
diff --git a/fs/gfs2/lops.h b/fs/gfs2/lops.h index 417f5aade4b1..0c78d222d6f2 100644 --- a/fs/gfs2/lops.h +++ b/fs/gfs2/lops.h | |||
@@ -10,16 +10,16 @@ | |||
10 | #ifndef __LOPS_DOT_H__ | 10 | #ifndef __LOPS_DOT_H__ |
11 | #define __LOPS_DOT_H__ | 11 | #define __LOPS_DOT_H__ |
12 | 12 | ||
13 | extern struct gfs2_log_operations gfs2_glock_lops; | 13 | extern const struct gfs2_log_operations gfs2_glock_lops; |
14 | extern struct gfs2_log_operations gfs2_buf_lops; | 14 | extern const struct gfs2_log_operations gfs2_buf_lops; |
15 | extern struct gfs2_log_operations gfs2_revoke_lops; | 15 | extern const struct gfs2_log_operations gfs2_revoke_lops; |
16 | extern struct gfs2_log_operations gfs2_rg_lops; | 16 | extern const struct gfs2_log_operations gfs2_rg_lops; |
17 | extern struct gfs2_log_operations gfs2_databuf_lops; | 17 | extern const struct gfs2_log_operations gfs2_databuf_lops; |
18 | 18 | ||
19 | extern struct gfs2_log_operations *gfs2_log_ops[]; | 19 | extern const struct gfs2_log_operations *gfs2_log_ops[]; |
20 | 20 | ||
21 | static inline void lops_init_le(struct gfs2_log_element *le, | 21 | static inline void lops_init_le(struct gfs2_log_element *le, |
22 | struct gfs2_log_operations *lops) | 22 | const struct gfs2_log_operations *lops) |
23 | { | 23 | { |
24 | INIT_LIST_HEAD(&le->le_list); | 24 | INIT_LIST_HEAD(&le->le_list); |
25 | le->le_ops = lops; | 25 | le->le_ops = lops; |
diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index b85fa2464666..4a6aacf294d5 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c | |||
@@ -59,11 +59,12 @@ static int gfs2_aspace_writepage(struct page *page, | |||
59 | 59 | ||
60 | static void stuck_releasepage(struct buffer_head *bh) | 60 | static void stuck_releasepage(struct buffer_head *bh) |
61 | { | 61 | { |
62 | struct gfs2_sbd *sdp = bh->b_page->mapping->host->i_sb->s_fs_info; | 62 | struct inode *inode = bh->b_page->mapping->host; |
63 | struct gfs2_sbd *sdp = inode->i_sb->s_fs_info; | ||
63 | struct gfs2_bufdata *bd = bh->b_private; | 64 | struct gfs2_bufdata *bd = bh->b_private; |
64 | struct gfs2_glock *gl; | 65 | struct gfs2_glock *gl; |
65 | 66 | ||
66 | fs_warn(sdp, "stuck in gfs2_releasepage()\n"); | 67 | fs_warn(sdp, "stuck in gfs2_releasepage() %p\n", inode); |
67 | fs_warn(sdp, "blkno = %llu, bh->b_count = %d\n", | 68 | fs_warn(sdp, "blkno = %llu, bh->b_count = %d\n", |
68 | (uint64_t)bh->b_blocknr, atomic_read(&bh->b_count)); | 69 | (uint64_t)bh->b_blocknr, atomic_read(&bh->b_count)); |
69 | fs_warn(sdp, "pinned = %u\n", buffer_pinned(bh)); | 70 | fs_warn(sdp, "pinned = %u\n", buffer_pinned(bh)); |
@@ -191,7 +192,6 @@ struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp) | |||
191 | aspace->u.generic_ip = NULL; | 192 | aspace->u.generic_ip = NULL; |
192 | insert_inode_hash(aspace); | 193 | insert_inode_hash(aspace); |
193 | } | 194 | } |
194 | |||
195 | return aspace; | 195 | return aspace; |
196 | } | 196 | } |
197 | 197 | ||
@@ -353,7 +353,7 @@ void gfs2_ail_empty_gl(struct gfs2_glock *gl) | |||
353 | gfs2_log_unlock(sdp); | 353 | gfs2_log_unlock(sdp); |
354 | 354 | ||
355 | gfs2_trans_end(sdp); | 355 | gfs2_trans_end(sdp); |
356 | gfs2_log_flush(sdp); | 356 | gfs2_log_flush(sdp, NULL); |
357 | } | 357 | } |
358 | 358 | ||
359 | /** | 359 | /** |
@@ -876,7 +876,7 @@ void gfs2_meta_ra(struct gfs2_glock *gl, uint64_t dblock, uint32_t extlen) | |||
876 | 876 | ||
877 | void gfs2_meta_syncfs(struct gfs2_sbd *sdp) | 877 | void gfs2_meta_syncfs(struct gfs2_sbd *sdp) |
878 | { | 878 | { |
879 | gfs2_log_flush(sdp); | 879 | gfs2_log_flush(sdp, NULL); |
880 | for (;;) { | 880 | for (;;) { |
881 | gfs2_ail1_start(sdp, DIO_ALL); | 881 | gfs2_ail1_start(sdp, DIO_ALL); |
882 | if (gfs2_ail1_empty(sdp, DIO_ALL)) | 882 | if (gfs2_ail1_empty(sdp, DIO_ALL)) |
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c index 9bb296717086..3fb1a29f88a6 100644 --- a/fs/gfs2/ops_file.c +++ b/fs/gfs2/ops_file.c | |||
@@ -561,8 +561,9 @@ static const u32 gfs2_to_iflags[32] = { | |||
561 | [gfs2fl_InheritJdata] = IFLAG_INHERITJDATA, | 561 | [gfs2fl_InheritJdata] = IFLAG_INHERITJDATA, |
562 | }; | 562 | }; |
563 | 563 | ||
564 | static int gfs2_get_flags(struct inode *inode, u32 __user *ptr) | 564 | static int gfs2_get_flags(struct file *filp, u32 __user *ptr) |
565 | { | 565 | { |
566 | struct inode *inode = filp->f_dentry->d_inode; | ||
566 | struct gfs2_inode *ip = inode->u.generic_ip; | 567 | struct gfs2_inode *ip = inode->u.generic_ip; |
567 | struct gfs2_holder gh; | 568 | struct gfs2_holder gh; |
568 | int error; | 569 | int error; |
@@ -600,8 +601,9 @@ static int gfs2_get_flags(struct inode *inode, u32 __user *ptr) | |||
600 | * @mask: Indicates which flags are valid | 601 | * @mask: Indicates which flags are valid |
601 | * | 602 | * |
602 | */ | 603 | */ |
603 | static int do_gfs2_set_flags(struct inode *inode, u32 reqflags, u32 mask) | 604 | static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) |
604 | { | 605 | { |
606 | struct inode *inode = filp->f_dentry->d_inode; | ||
605 | struct gfs2_inode *ip = inode->u.generic_ip; | 607 | struct gfs2_inode *ip = inode->u.generic_ip; |
606 | struct gfs2_sbd *sdp = ip->i_sbd; | 608 | struct gfs2_sbd *sdp = ip->i_sbd; |
607 | struct buffer_head *bh; | 609 | struct buffer_head *bh; |
@@ -659,23 +661,22 @@ out: | |||
659 | return error; | 661 | return error; |
660 | } | 662 | } |
661 | 663 | ||
662 | static int gfs2_set_flags(struct inode *inode, u32 __user *ptr) | 664 | static int gfs2_set_flags(struct file *filp, u32 __user *ptr) |
663 | { | 665 | { |
664 | u32 iflags, gfsflags; | 666 | u32 iflags, gfsflags; |
665 | if (get_user(iflags, ptr)) | 667 | if (get_user(iflags, ptr)) |
666 | return -EFAULT; | 668 | return -EFAULT; |
667 | gfsflags = iflags_cvt(iflags_to_gfs2, iflags); | 669 | gfsflags = iflags_cvt(iflags_to_gfs2, iflags); |
668 | return do_gfs2_set_flags(inode, gfsflags, ~0); | 670 | return do_gfs2_set_flags(filp, gfsflags, ~0); |
669 | } | 671 | } |
670 | 672 | ||
671 | int gfs2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | 673 | static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
672 | unsigned long arg) | ||
673 | { | 674 | { |
674 | switch(cmd) { | 675 | switch(cmd) { |
675 | case IFLAGS_GET_IOC: | 676 | case IFLAGS_GET_IOC: |
676 | return gfs2_get_flags(inode, (u32 __user *)arg); | 677 | return gfs2_get_flags(filp, (u32 __user *)arg); |
677 | case IFLAGS_SET_IOC: | 678 | case IFLAGS_SET_IOC: |
678 | return gfs2_set_flags(inode, (u32 __user *)arg); | 679 | return gfs2_set_flags(filp, (u32 __user *)arg); |
679 | } | 680 | } |
680 | return -ENOTTY; | 681 | return -ENOTTY; |
681 | } | 682 | } |
@@ -808,7 +809,7 @@ static int gfs2_fsync(struct file *file, struct dentry *dentry, int datasync) | |||
808 | { | 809 | { |
809 | struct gfs2_inode *ip = dentry->d_inode->u.generic_ip; | 810 | struct gfs2_inode *ip = dentry->d_inode->u.generic_ip; |
810 | 811 | ||
811 | gfs2_log_flush_glock(ip->i_gl); | 812 | gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl); |
812 | 813 | ||
813 | return 0; | 814 | return 0; |
814 | } | 815 | } |
@@ -974,7 +975,7 @@ struct file_operations gfs2_file_fops = { | |||
974 | .write = generic_file_write, | 975 | .write = generic_file_write, |
975 | .writev = generic_file_writev, | 976 | .writev = generic_file_writev, |
976 | .aio_write = generic_file_aio_write, | 977 | .aio_write = generic_file_aio_write, |
977 | .ioctl = gfs2_ioctl, | 978 | .unlocked_ioctl = gfs2_ioctl, |
978 | .mmap = gfs2_mmap, | 979 | .mmap = gfs2_mmap, |
979 | .open = gfs2_open, | 980 | .open = gfs2_open, |
980 | .release = gfs2_close, | 981 | .release = gfs2_close, |
@@ -988,7 +989,7 @@ struct file_operations gfs2_file_fops = { | |||
988 | 989 | ||
989 | struct file_operations gfs2_dir_fops = { | 990 | struct file_operations gfs2_dir_fops = { |
990 | .readdir = gfs2_readdir, | 991 | .readdir = gfs2_readdir, |
991 | .ioctl = gfs2_ioctl, | 992 | .unlocked_ioctl = gfs2_ioctl, |
992 | .open = gfs2_open, | 993 | .open = gfs2_open, |
993 | .release = gfs2_close, | 994 | .release = gfs2_close, |
994 | .fsync = gfs2_fsync, | 995 | .fsync = gfs2_fsync, |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 5166455b9fdd..4538a1e621e8 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -276,8 +276,8 @@ static struct inode *gfs2_lookup_root(struct gfs2_sbd *sdp, | |||
276 | struct gfs2_inode *ip; | 276 | struct gfs2_inode *ip; |
277 | struct inode *inode; | 277 | struct inode *inode; |
278 | 278 | ||
279 | error = gfs2_glock_get(sdp, inum->no_addr, | 279 | error = gfs2_glock_get(sdp, inum->no_addr, &gfs2_inode_glops, |
280 | &gfs2_inode_glops, CREATE, &gl); | 280 | CREATE, &gl); |
281 | if (!error) { | 281 | if (!error) { |
282 | error = gfs2_inode_get(gl, inum, CREATE, &ip); | 282 | error = gfs2_inode_get(gl, inum, CREATE, &ip); |
283 | if (!error) { | 283 | if (!error) { |
diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c index f7349c0989a9..80ce40c1dfb6 100644 --- a/fs/gfs2/ops_super.c +++ b/fs/gfs2/ops_super.c | |||
@@ -53,7 +53,7 @@ static int gfs2_write_inode(struct inode *inode, int sync) | |||
53 | if (current->flags & PF_MEMALLOC) | 53 | if (current->flags & PF_MEMALLOC) |
54 | return 0; | 54 | return 0; |
55 | if (ip && sync) | 55 | if (ip && sync) |
56 | gfs2_log_flush_glock(ip->i_gl); | 56 | gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl); |
57 | 57 | ||
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
@@ -121,10 +121,8 @@ static void gfs2_put_super(struct super_block *sb) | |||
121 | } | 121 | } |
122 | 122 | ||
123 | gfs2_glock_dq_uninit(&sdp->sd_live_gh); | 123 | gfs2_glock_dq_uninit(&sdp->sd_live_gh); |
124 | |||
125 | gfs2_clear_rgrpd(sdp); | 124 | gfs2_clear_rgrpd(sdp); |
126 | gfs2_jindex_free(sdp); | 125 | gfs2_jindex_free(sdp); |
127 | |||
128 | /* Take apart glock structures and buffer lists */ | 126 | /* Take apart glock structures and buffer lists */ |
129 | gfs2_gl_hash_clear(sdp, WAIT); | 127 | gfs2_gl_hash_clear(sdp, WAIT); |
130 | 128 | ||
@@ -135,10 +133,6 @@ static void gfs2_put_super(struct super_block *sb) | |||
135 | 133 | ||
136 | gfs2_sys_fs_del(sdp); | 134 | gfs2_sys_fs_del(sdp); |
137 | 135 | ||
138 | /* Get rid of any extra inodes */ | ||
139 | while (invalidate_inodes(sb)) | ||
140 | yield(); | ||
141 | |||
142 | vfree(sdp); | 136 | vfree(sdp); |
143 | 137 | ||
144 | sb->s_fs_info = NULL; | 138 | sb->s_fs_info = NULL; |
@@ -149,13 +143,13 @@ static void gfs2_put_super(struct super_block *sb) | |||
149 | * @sb: the filesystem | 143 | * @sb: the filesystem |
150 | * | 144 | * |
151 | * This function is called every time sync(2) is called. | 145 | * This function is called every time sync(2) is called. |
152 | * After this exits, all dirty buffers and synced. | 146 | * After this exits, all dirty buffers are synced. |
153 | */ | 147 | */ |
154 | 148 | ||
155 | static void gfs2_write_super(struct super_block *sb) | 149 | static void gfs2_write_super(struct super_block *sb) |
156 | { | 150 | { |
157 | struct gfs2_sbd *sdp = sb->s_fs_info; | 151 | struct gfs2_sbd *sdp = sb->s_fs_info; |
158 | gfs2_log_flush(sdp); | 152 | gfs2_log_flush(sdp, NULL); |
159 | } | 153 | } |
160 | 154 | ||
161 | /** | 155 | /** |
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index c57b5cf1d583..90e32a3dc50d 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -749,7 +749,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | |||
749 | while (qx--) | 749 | while (qx--) |
750 | gfs2_glock_dq_uninit(&ghs[qx]); | 750 | gfs2_glock_dq_uninit(&ghs[qx]); |
751 | kfree(ghs); | 751 | kfree(ghs); |
752 | gfs2_log_flush_glock(ip->i_gl); | 752 | gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl); |
753 | 753 | ||
754 | return error; | 754 | return error; |
755 | } | 755 | } |
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c index d72f79e67c94..061f4a9a1db4 100644 --- a/fs/gfs2/trans.c +++ b/fs/gfs2/trans.c | |||
@@ -120,7 +120,7 @@ void gfs2_trans_end(struct gfs2_sbd *sdp) | |||
120 | kfree(tr); | 120 | kfree(tr); |
121 | 121 | ||
122 | if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) | 122 | if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) |
123 | gfs2_log_flush(sdp); | 123 | gfs2_log_flush(sdp, NULL); |
124 | } | 124 | } |
125 | 125 | ||
126 | void gfs2_trans_add_gl(struct gfs2_glock *gl) | 126 | void gfs2_trans_add_gl(struct gfs2_glock *gl) |