• D
    xfs: log ticket reservation underestimates the number of iclogs · 9b9fc2b7
    Dave Chinner 提交于
    When allocation a ticket for a transaction, the ticket is initialised with the
    worst case log space usage based on the number of bytes the transaction may
    consume. Part of this calculation is the number of log headers required for the
    iclog space used up by the transaction.
    
    This calculation makes an undocumented assumption that if the transaction uses
    the log header space reservation on an iclog, then it consumes either the
    entire iclog or it completes. That is - the transaction that is first in an
    iclog is the transaction that the log header reservation is accounted to. If
    the transaction is larger than the iclog, then it will use the entire iclog
    itself. Document this assumption.
    
    Further, the current calculation uses the rule that we can fit iclog_size bytes
    of transaction data into an iclog. This is in correct - the amount of space
    available in an iclog for transaction data is the size of the iclog minus the
    space used for log record headers. This means that the calculation is out by
    512 bytes per 32k of log space the transaction can consume. This is rarely an
    issue because maximally sized transactions are extremely uncommon, and for 4k
    block size filesystems maximal transaction reservations are about 400kb. Hence
    the error in this case is less than the size of an iclog, so that makes it even
    harder to hit.
    
    However, anyone using larger directory blocks (16k directory blocks push the
    maximum transaction size to approx. 900k on a 4k block size filesystem) or
    larger block size (e.g. 64k blocks push transactions to the 3-4MB size) could
    see the error grow to more than an iclog and at this point the transaction is
    guaranteed to get a reservation underrun and shutdown the filesystem.
    
    Fix this by adjusting the calculation to calculate the correct number of iclogs
    required and account for them all up front.
    Signed-off-by: NDave Chinner <dchinner@redhat.com>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    9b9fc2b7
xfs_log.c 103.6 KB