mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
xfs: Use inode create transaction
Replace the use of buffer based logging of inode initialisation, uses the new logical form to describe the range to be initialised in recovery. We continue to "log" the inode buffers to push them into the AIL and ensure that the inode create transaction is not removed from the log before the inode buffers are written to disk. Update the transaction identifier and reservations to match the changed implementation. Signed-off-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
28c8e41af6
commit
ddf6ad0143
@ -310,13 +310,21 @@ xfs_buf_item_format(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If it is an inode buffer, transfer the in-memory state to the
|
* If it is an inode buffer, transfer the in-memory state to the
|
||||||
* format flags and clear the in-memory state. We do not transfer
|
* format flags and clear the in-memory state.
|
||||||
|
*
|
||||||
|
* For buffer based inode allocation, we do not transfer
|
||||||
* this state if the inode buffer allocation has not yet been committed
|
* this state if the inode buffer allocation has not yet been committed
|
||||||
* to the log as setting the XFS_BLI_INODE_BUF flag will prevent
|
* to the log as setting the XFS_BLI_INODE_BUF flag will prevent
|
||||||
* correct replay of the inode allocation.
|
* correct replay of the inode allocation.
|
||||||
|
*
|
||||||
|
* For icreate item based inode allocation, the buffers aren't written
|
||||||
|
* to the journal during allocation, and hence we should always tag the
|
||||||
|
* buffer as an inode buffer so that the correct unlinked list replay
|
||||||
|
* occurs during recovery.
|
||||||
*/
|
*/
|
||||||
if (bip->bli_flags & XFS_BLI_INODE_BUF) {
|
if (bip->bli_flags & XFS_BLI_INODE_BUF) {
|
||||||
if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&
|
if (xfs_sb_version_hascrc(&lip->li_mountp->m_sb) ||
|
||||||
|
!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&
|
||||||
xfs_log_item_in_current_chkpt(lip)))
|
xfs_log_item_in_current_chkpt(lip)))
|
||||||
bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF;
|
bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF;
|
||||||
bip->bli_flags &= ~XFS_BLI_INODE_BUF;
|
bip->bli_flags &= ~XFS_BLI_INODE_BUF;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include "xfs_bmap.h"
|
#include "xfs_bmap.h"
|
||||||
#include "xfs_cksum.h"
|
#include "xfs_cksum.h"
|
||||||
#include "xfs_buf_item.h"
|
#include "xfs_buf_item.h"
|
||||||
|
#include "xfs_icreate_item.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -155,7 +156,7 @@ xfs_check_agi_freecount(
|
|||||||
* than logging them (which in a transaction context puts them into the AIL
|
* than logging them (which in a transaction context puts them into the AIL
|
||||||
* for writeback rather than the xfsbufd queue).
|
* for writeback rather than the xfsbufd queue).
|
||||||
*/
|
*/
|
||||||
STATIC int
|
int
|
||||||
xfs_ialloc_inode_init(
|
xfs_ialloc_inode_init(
|
||||||
struct xfs_mount *mp,
|
struct xfs_mount *mp,
|
||||||
struct xfs_trans *tp,
|
struct xfs_trans *tp,
|
||||||
@ -212,6 +213,18 @@ xfs_ialloc_inode_init(
|
|||||||
version = 3;
|
version = 3;
|
||||||
ino = XFS_AGINO_TO_INO(mp, agno,
|
ino = XFS_AGINO_TO_INO(mp, agno,
|
||||||
XFS_OFFBNO_TO_AGINO(mp, agbno, 0));
|
XFS_OFFBNO_TO_AGINO(mp, agbno, 0));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* log the initialisation that is about to take place as an
|
||||||
|
* logical operation. This means the transaction does not
|
||||||
|
* need to log the physical changes to the inode buffers as log
|
||||||
|
* recovery will know what initialisation is actually needed.
|
||||||
|
* Hence we only need to log the buffers as "ordered" buffers so
|
||||||
|
* they track in the AIL as if they were physically logged.
|
||||||
|
*/
|
||||||
|
if (tp)
|
||||||
|
xfs_icreate_log(tp, agno, agbno, XFS_IALLOC_INODES(mp),
|
||||||
|
mp->m_sb.sb_inodesize, length, gen);
|
||||||
} else if (xfs_sb_version_hasnlink(&mp->m_sb))
|
} else if (xfs_sb_version_hasnlink(&mp->m_sb))
|
||||||
version = 2;
|
version = 2;
|
||||||
else
|
else
|
||||||
@ -227,13 +240,8 @@ xfs_ialloc_inode_init(
|
|||||||
XBF_UNMAPPED);
|
XBF_UNMAPPED);
|
||||||
if (!fbuf)
|
if (!fbuf)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
/*
|
|
||||||
* Initialize all inodes in this buffer and then log them.
|
/* Initialize the inode buffers and log them appropriately. */
|
||||||
*
|
|
||||||
* XXX: It would be much better if we had just one transaction
|
|
||||||
* to log a whole cluster of inodes instead of all the
|
|
||||||
* individual transactions causing a lot of log traffic.
|
|
||||||
*/
|
|
||||||
fbuf->b_ops = &xfs_inode_buf_ops;
|
fbuf->b_ops = &xfs_inode_buf_ops;
|
||||||
xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length));
|
xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length));
|
||||||
for (i = 0; i < ninodes; i++) {
|
for (i = 0; i < ninodes; i++) {
|
||||||
@ -269,7 +277,13 @@ xfs_ialloc_inode_init(
|
|||||||
*/
|
*/
|
||||||
xfs_trans_inode_alloc_buf(tp, fbuf);
|
xfs_trans_inode_alloc_buf(tp, fbuf);
|
||||||
if (version == 3) {
|
if (version == 3) {
|
||||||
/* need to log the entire buffer */
|
/*
|
||||||
|
* Mark the buffer as ordered so that they are
|
||||||
|
* not physically logged in the transaction but
|
||||||
|
* still tracked in the AIL as part of the
|
||||||
|
* transaction and pin the log appropriately.
|
||||||
|
*/
|
||||||
|
xfs_trans_ordered_buf(tp, fbuf);
|
||||||
xfs_trans_log_buf(tp, fbuf, 0,
|
xfs_trans_log_buf(tp, fbuf, 0,
|
||||||
BBTOB(fbuf->b_length) - 1);
|
BBTOB(fbuf->b_length) - 1);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user