aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/incore.h
diff options
context:
space:
mode:
authorRobert Peterson <rpeterso@redhat.com>2007-06-18 15:50:20 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2007-07-09 03:23:47 -0400
commit2332c4435bb733b5cd4f612ee57532bd8fde4c1c (patch)
treedfa006c482a6e9c1a5e693478b424db0f5492fbe /fs/gfs2/incore.h
parent2840501ac822c5bf712f67b4b02640e16e145a29 (diff)
[GFS2] assertion failure after writing to journaled file, umount
This patch passes all my nasty tests that were causing the code to fail under one circumstance or another. Here is a complete summary of all changes from today's git tree, in order of appearance: 1. There are now separate variables for metadata buffer accounting. 2. Variable sd_log_num_hdrs is no longer needed, since the header accounting is taken care of by the reserve/refund sequence. 3. Fixed a tiny grammatical problem in a comment. 4. Added a new function "calc_reserved" to calculate the reserved log space. This isn't entirely necessary, but it has two benefits: First, it simplifies the gfs2_log_refund function greatly. Second, it allows for easier debugging because I could sprinkle the code with calls to this function to make sure the accounting is proper (by adding asserts and printks) at strategic point of the code. 5. In log_pull_tail there apparently was a kludge to fix up the accounting based on a "pull" parameter. The buffer accounting is now done properly, so the kludge was removed. 6. File sync operations were making a call to gfs2_log_flush that writes another journal header. Since that header was unplanned for (reserved) by the reserve/refund sequence, the free space had to be decremented so that when log_pull_tail gets called, the free space is be adjusted properly. (Did I hear you call that a kludge? well, maybe, but a lot more justifiable than the one I removed). 7. In the gfs2_log_shutdown code, it optionally syncs the log by specifying the PULL parameter to log_write_header. I'm not sure this is necessary anymore. It just seems to me there could be cases where shutdown is called while there are outstanding log buffers. 8. In the (data)buf_lo_before_commit functions, I changed some offset values from being calculated on the fly to being constants. That simplified some code and we might as well let the compiler do the calculation once rather than redoing those cycles at run time. 9. This version has my rewritten databuf_lo_add function. This version is much more like its predecessor, buf_lo_add, which makes it easier to understand. Again, this might not be necessary, but it seems as if this one works as well as the previous one, maybe even better, so I decided to leave it in. 10. In databuf_lo_before_commit, a previous data corruption problem was caused by going off the end of the buffer. The proper solution is to have the proper limit in place, rather than stopping earlier. (Thus my previous attempt to fix it is wrong). If you don't wrap the buffer, you're stopping too early and that causes more log buffer accounting problems. 11. In lops.h there are two new (previously mentioned) constants for figuring out the data offset for the journal buffers. 12. There are also two new functions, buf_limit and databuf_limit to calculate how many entries will fit in the buffer. 13. In function gfs2_meta_wipe, it needs to distinguish between pinned metadata buffers and journaled data buffers for proper journal buffer accounting. It can't use the JDATA gfs2_inode flag because it's sometimes passed the "real" inode and sometimes the "metadata inode" and the inode flags will be random bits in a metadata gfs2_inode. It needs to base its decision on which was passed in. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/incore.h')
-rw-r--r--fs/gfs2/incore.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index c7c6ec0f17c7..170ba93829c0 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -354,7 +354,9 @@ struct gfs2_trans {
354 354
355 unsigned int tr_num_buf; 355 unsigned int tr_num_buf;
356 unsigned int tr_num_buf_new; 356 unsigned int tr_num_buf_new;
357 unsigned int tr_num_databuf_new;
357 unsigned int tr_num_buf_rm; 358 unsigned int tr_num_buf_rm;
359 unsigned int tr_num_databuf_rm;
358 struct list_head tr_list_buf; 360 struct list_head tr_list_buf;
359 361
360 unsigned int tr_num_revoke; 362 unsigned int tr_num_revoke;
@@ -599,6 +601,7 @@ struct gfs2_sbd {
599 601
600 unsigned int sd_log_blks_reserved; 602 unsigned int sd_log_blks_reserved;
601 unsigned int sd_log_commited_buf; 603 unsigned int sd_log_commited_buf;
604 unsigned int sd_log_commited_databuf;
602 unsigned int sd_log_commited_revoke; 605 unsigned int sd_log_commited_revoke;
603 606
604 unsigned int sd_log_num_gl; 607 unsigned int sd_log_num_gl;
@@ -607,7 +610,6 @@ struct gfs2_sbd {
607 unsigned int sd_log_num_rg; 610 unsigned int sd_log_num_rg;
608 unsigned int sd_log_num_databuf; 611 unsigned int sd_log_num_databuf;
609 unsigned int sd_log_num_jdata; 612 unsigned int sd_log_num_jdata;
610 unsigned int sd_log_num_hdrs;
611 613
612 struct list_head sd_log_le_gl; 614 struct list_head sd_log_le_gl;
613 struct list_head sd_log_le_buf; 615 struct list_head sd_log_le_buf;