|
@@ -41,68 +41,6 @@
|
|
#include "xfs_error.h"
|
|
#include "xfs_error.h"
|
|
#include "xfs_bmap.h"
|
|
#include "xfs_bmap.h"
|
|
|
|
|
|
-/*
|
|
|
|
- * Log specified fields for the inode given by bp and off.
|
|
|
|
- */
|
|
|
|
-STATIC void
|
|
|
|
-xfs_ialloc_log_di(
|
|
|
|
- xfs_trans_t *tp, /* transaction pointer */
|
|
|
|
- xfs_buf_t *bp, /* inode buffer */
|
|
|
|
- int off, /* index of inode in buffer */
|
|
|
|
- int fields) /* bitmask of fields to log */
|
|
|
|
-{
|
|
|
|
- int first; /* first byte number */
|
|
|
|
- int ioffset; /* off in bytes */
|
|
|
|
- int last; /* last byte number */
|
|
|
|
- xfs_mount_t *mp; /* mount point structure */
|
|
|
|
- static const short offsets[] = { /* field offsets */
|
|
|
|
- /* keep in sync with bits */
|
|
|
|
- offsetof(xfs_dinode_core_t, di_magic),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_mode),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_version),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_format),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_onlink),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_uid),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_gid),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_nlink),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_projid),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_pad),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_atime),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_mtime),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_ctime),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_size),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_nblocks),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_extsize),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_nextents),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_anextents),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_forkoff),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_aformat),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_dmevmask),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_dmstate),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_flags),
|
|
|
|
- offsetof(xfs_dinode_core_t, di_gen),
|
|
|
|
- offsetof(xfs_dinode_t, di_next_unlinked),
|
|
|
|
- offsetof(xfs_dinode_t, di_u),
|
|
|
|
- offsetof(xfs_dinode_t, di_a),
|
|
|
|
- sizeof(xfs_dinode_t)
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- ASSERT(offsetof(xfs_dinode_t, di_core) == 0);
|
|
|
|
- ASSERT((fields & (XFS_DI_U|XFS_DI_A)) == 0);
|
|
|
|
- mp = tp->t_mountp;
|
|
|
|
- /*
|
|
|
|
- * Get the inode-relative first and last bytes for these fields
|
|
|
|
- */
|
|
|
|
- xfs_btree_offsets(fields, offsets, XFS_DI_NUM_BITS, &first, &last);
|
|
|
|
- /*
|
|
|
|
- * Convert to buffer offsets and log it.
|
|
|
|
- */
|
|
|
|
- ioffset = off << mp->m_sb.sb_inodelog;
|
|
|
|
- first += ioffset;
|
|
|
|
- last += ioffset;
|
|
|
|
- xfs_trans_log_buf(tp, bp, first, last);
|
|
|
|
-}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* Allocation group level functions.
|
|
* Allocation group level functions.
|
|
@@ -406,18 +344,25 @@ xfs_ialloc_ag_alloc(
|
|
XFS_BUF_LOCK);
|
|
XFS_BUF_LOCK);
|
|
ASSERT(fbuf);
|
|
ASSERT(fbuf);
|
|
ASSERT(!XFS_BUF_GETERROR(fbuf));
|
|
ASSERT(!XFS_BUF_GETERROR(fbuf));
|
|
|
|
+
|
|
/*
|
|
/*
|
|
- * Set initial values for the inodes in this buffer.
|
|
|
|
|
|
+ * Initialize all inodes in this buffer and then log them.
|
|
|
|
+ *
|
|
|
|
+ * XXX: It would be much better if we had just one transaction to
|
|
|
|
+ * log a whole cluster of inodes instead of all the indivdual
|
|
|
|
+ * transactions causing a lot of log traffic.
|
|
*/
|
|
*/
|
|
xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog);
|
|
xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog);
|
|
for (i = 0; i < ninodes; i++) {
|
|
for (i = 0; i < ninodes; i++) {
|
|
|
|
+ int ioffset = i << args.mp->m_sb.sb_inodelog;
|
|
|
|
+ uint isize = sizeof(xfs_dinode_t) + sizeof(__be32);
|
|
|
|
+
|
|
free = XFS_MAKE_IPTR(args.mp, fbuf, i);
|
|
free = XFS_MAKE_IPTR(args.mp, fbuf, i);
|
|
free->di_core.di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
|
|
free->di_core.di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
|
|
free->di_core.di_version = version;
|
|
free->di_core.di_version = version;
|
|
free->di_core.di_gen = cpu_to_be32(gen);
|
|
free->di_core.di_gen = cpu_to_be32(gen);
|
|
free->di_next_unlinked = cpu_to_be32(NULLAGINO);
|
|
free->di_next_unlinked = cpu_to_be32(NULLAGINO);
|
|
- xfs_ialloc_log_di(tp, fbuf, i,
|
|
|
|
- XFS_DI_CORE_BITS | XFS_DI_NEXT_UNLINKED);
|
|
|
|
|
|
+ xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1);
|
|
}
|
|
}
|
|
xfs_trans_inode_alloc_buf(tp, fbuf);
|
|
xfs_trans_inode_alloc_buf(tp, fbuf);
|
|
}
|
|
}
|