• R
    [GFS2] assertion failure after writing to journaled file, umount · 2332c443
    Robert Peterson 提交于
    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: NBob Peterson <rpeterso@redhat.com>
    Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
    2332c443
log.c 19.1 KB