Commit 155cd433 authored by Dave Chinner's avatar Dave Chinner

Merge branch 'xfs-4.9-log-recovery-fixes' into for-next

parents a1f45e66 5cd9cee9
...@@ -258,7 +258,7 @@ xfs_alloc_compute_diff( ...@@ -258,7 +258,7 @@ xfs_alloc_compute_diff(
xfs_agblock_t wantbno, /* target starting block */ xfs_agblock_t wantbno, /* target starting block */
xfs_extlen_t wantlen, /* target length */ xfs_extlen_t wantlen, /* target length */
xfs_extlen_t alignment, /* target alignment */ xfs_extlen_t alignment, /* target alignment */
char userdata, /* are we allocating data? */ int datatype, /* are we allocating data? */
xfs_agblock_t freebno, /* freespace's starting block */ xfs_agblock_t freebno, /* freespace's starting block */
xfs_extlen_t freelen, /* freespace's length */ xfs_extlen_t freelen, /* freespace's length */
xfs_agblock_t *newbnop) /* result: best start block from free */ xfs_agblock_t *newbnop) /* result: best start block from free */
...@@ -269,6 +269,7 @@ xfs_alloc_compute_diff( ...@@ -269,6 +269,7 @@ xfs_alloc_compute_diff(
xfs_extlen_t newlen1=0; /* length with newbno1 */ xfs_extlen_t newlen1=0; /* length with newbno1 */
xfs_extlen_t newlen2=0; /* length with newbno2 */ xfs_extlen_t newlen2=0; /* length with newbno2 */
xfs_agblock_t wantend; /* end of target extent */ xfs_agblock_t wantend; /* end of target extent */
bool userdata = xfs_alloc_is_userdata(datatype);
ASSERT(freelen >= wantlen); ASSERT(freelen >= wantlen);
freeend = freebno + freelen; freeend = freebno + freelen;
...@@ -924,7 +925,7 @@ xfs_alloc_find_best_extent( ...@@ -924,7 +925,7 @@ xfs_alloc_find_best_extent(
sdiff = xfs_alloc_compute_diff(args->agbno, args->len, sdiff = xfs_alloc_compute_diff(args->agbno, args->len,
args->alignment, args->alignment,
args->userdata, *sbnoa, args->datatype, *sbnoa,
*slena, &new); *slena, &new);
/* /*
...@@ -1108,7 +1109,7 @@ xfs_alloc_ag_vextent_near( ...@@ -1108,7 +1109,7 @@ xfs_alloc_ag_vextent_near(
if (args->len < blen) if (args->len < blen)
continue; continue;
ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
args->alignment, args->userdata, ltbnoa, args->alignment, args->datatype, ltbnoa,
ltlena, &ltnew); ltlena, &ltnew);
if (ltnew != NULLAGBLOCK && if (ltnew != NULLAGBLOCK &&
(args->len > blen || ltdiff < bdiff)) { (args->len > blen || ltdiff < bdiff)) {
...@@ -1261,7 +1262,7 @@ xfs_alloc_ag_vextent_near( ...@@ -1261,7 +1262,7 @@ xfs_alloc_ag_vextent_near(
args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
xfs_alloc_fix_len(args); xfs_alloc_fix_len(args);
ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
args->alignment, args->userdata, ltbnoa, args->alignment, args->datatype, ltbnoa,
ltlena, &ltnew); ltlena, &ltnew);
error = xfs_alloc_find_best_extent(args, error = xfs_alloc_find_best_extent(args,
...@@ -1278,7 +1279,7 @@ xfs_alloc_ag_vextent_near( ...@@ -1278,7 +1279,7 @@ xfs_alloc_ag_vextent_near(
args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen);
xfs_alloc_fix_len(args); xfs_alloc_fix_len(args);
gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, gtdiff = xfs_alloc_compute_diff(args->agbno, args->len,
args->alignment, args->userdata, gtbnoa, args->alignment, args->datatype, gtbnoa,
gtlena, &gtnew); gtlena, &gtnew);
error = xfs_alloc_find_best_extent(args, error = xfs_alloc_find_best_extent(args,
...@@ -1338,7 +1339,7 @@ xfs_alloc_ag_vextent_near( ...@@ -1338,7 +1339,7 @@ xfs_alloc_ag_vextent_near(
} }
rlen = args->len; rlen = args->len;
(void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment,
args->userdata, ltbnoa, ltlena, &ltnew); args->datatype, ltbnoa, ltlena, &ltnew);
ASSERT(ltnew >= ltbno); ASSERT(ltnew >= ltbno);
ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= ltbnoa + ltlena);
ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
...@@ -1617,9 +1618,9 @@ xfs_alloc_ag_vextent_small( ...@@ -1617,9 +1618,9 @@ xfs_alloc_ag_vextent_small(
goto error0; goto error0;
if (fbno != NULLAGBLOCK) { if (fbno != NULLAGBLOCK) {
xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1, xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1,
args->userdata); xfs_alloc_allow_busy_reuse(args->datatype));
if (args->userdata) { if (xfs_alloc_is_userdata(args->datatype)) {
xfs_buf_t *bp; xfs_buf_t *bp;
bp = xfs_btree_get_bufs(args->mp, args->tp, bp = xfs_btree_get_bufs(args->mp, args->tp,
...@@ -2099,7 +2100,7 @@ xfs_alloc_fix_freelist( ...@@ -2099,7 +2100,7 @@ xfs_alloc_fix_freelist(
* somewhere else if we are not being asked to try harder at this * somewhere else if we are not being asked to try harder at this
* point * point
*/ */
if (pag->pagf_metadata && args->userdata && if (pag->pagf_metadata && xfs_alloc_is_userdata(args->datatype) &&
(flags & XFS_ALLOC_FLAG_TRYLOCK)) { (flags & XFS_ALLOC_FLAG_TRYLOCK)) {
ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
goto out_agbp_relse; goto out_agbp_relse;
...@@ -2675,7 +2676,7 @@ xfs_alloc_vextent( ...@@ -2675,7 +2676,7 @@ xfs_alloc_vextent(
* Try near allocation first, then anywhere-in-ag after * Try near allocation first, then anywhere-in-ag after
* the first a.g. fails. * the first a.g. fails.
*/ */
if ((args->userdata & XFS_ALLOC_INITIAL_USER_DATA) && if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) &&
(mp->m_flags & XFS_MOUNT_32BITINODES)) { (mp->m_flags & XFS_MOUNT_32BITINODES)) {
args->fsbno = XFS_AGB_TO_FSB(mp, args->fsbno = XFS_AGB_TO_FSB(mp,
((mp->m_agfrotor / rotorstep) % ((mp->m_agfrotor / rotorstep) %
...@@ -2808,7 +2809,7 @@ xfs_alloc_vextent( ...@@ -2808,7 +2809,7 @@ xfs_alloc_vextent(
#endif #endif
/* Zero the extent if we were asked to do so */ /* Zero the extent if we were asked to do so */
if (args->userdata & XFS_ALLOC_USERDATA_ZERO) { if (args->datatype & XFS_ALLOC_USERDATA_ZERO) {
error = xfs_zero_extent(args->ip, args->fsbno, args->len); error = xfs_zero_extent(args->ip, args->fsbno, args->len);
if (error) if (error)
goto error0; goto error0;
......
...@@ -85,20 +85,33 @@ typedef struct xfs_alloc_arg { ...@@ -85,20 +85,33 @@ typedef struct xfs_alloc_arg {
xfs_extlen_t len; /* output: actual size of extent */ xfs_extlen_t len; /* output: actual size of extent */
xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */
xfs_alloctype_t otype; /* original allocation type */ xfs_alloctype_t otype; /* original allocation type */
int datatype; /* mask defining data type treatment */
char wasdel; /* set if allocation was prev delayed */ char wasdel; /* set if allocation was prev delayed */
char wasfromfl; /* set if allocation is from freelist */ char wasfromfl; /* set if allocation is from freelist */
char userdata; /* mask defining userdata treatment */
xfs_fsblock_t firstblock; /* io first block allocated */ xfs_fsblock_t firstblock; /* io first block allocated */
struct xfs_owner_info oinfo; /* owner of blocks being allocated */ struct xfs_owner_info oinfo; /* owner of blocks being allocated */
enum xfs_ag_resv_type resv; /* block reservation to use */ enum xfs_ag_resv_type resv; /* block reservation to use */
} xfs_alloc_arg_t; } xfs_alloc_arg_t;
/* /*
* Defines for userdata * Defines for datatype
*/ */
#define XFS_ALLOC_USERDATA (1 << 0)/* allocation is for user data*/ #define XFS_ALLOC_USERDATA (1 << 0)/* allocation is for user data*/
#define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)/* special case start of file */ #define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)/* special case start of file */
#define XFS_ALLOC_USERDATA_ZERO (1 << 2)/* zero extent on allocation */ #define XFS_ALLOC_USERDATA_ZERO (1 << 2)/* zero extent on allocation */
#define XFS_ALLOC_NOBUSY (1 << 3)/* Busy extents not allowed */
static inline bool
xfs_alloc_is_userdata(int datatype)
{
return (datatype & ~XFS_ALLOC_NOBUSY) != 0;
}
static inline bool
xfs_alloc_allow_busy_reuse(int datatype)
{
return (datatype & XFS_ALLOC_NOBUSY) == 0;
}
/* freespace limit calculations */ /* freespace limit calculations */
#define XFS_ALLOC_AGFL_RESERVE 4 #define XFS_ALLOC_AGFL_RESERVE 4
......
...@@ -3348,7 +3348,8 @@ xfs_bmap_adjacent( ...@@ -3348,7 +3348,8 @@ xfs_bmap_adjacent(
mp = ap->ip->i_mount; mp = ap->ip->i_mount;
nullfb = *ap->firstblock == NULLFSBLOCK; nullfb = *ap->firstblock == NULLFSBLOCK;
rt = XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata; rt = XFS_IS_REALTIME_INODE(ap->ip) &&
xfs_alloc_is_userdata(ap->datatype);
fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock);
/* /*
* If allocating at eof, and there's a previous real block, * If allocating at eof, and there's a previous real block,
...@@ -3624,7 +3625,7 @@ xfs_bmap_btalloc( ...@@ -3624,7 +3625,7 @@ xfs_bmap_btalloc(
{ {
xfs_mount_t *mp; /* mount point structure */ xfs_mount_t *mp; /* mount point structure */
xfs_alloctype_t atype = 0; /* type for allocation routines */ xfs_alloctype_t atype = 0; /* type for allocation routines */
xfs_extlen_t align; /* minimum allocation alignment */ xfs_extlen_t align = 0; /* minimum allocation alignment */
xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */
xfs_agnumber_t ag; xfs_agnumber_t ag;
xfs_alloc_arg_t args; xfs_alloc_arg_t args;
...@@ -3647,7 +3648,8 @@ xfs_bmap_btalloc( ...@@ -3647,7 +3648,8 @@ xfs_bmap_btalloc(
else if (mp->m_dalign) else if (mp->m_dalign)
stripe_align = mp->m_dalign; stripe_align = mp->m_dalign;
align = ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; if (xfs_alloc_is_userdata(ap->datatype))
align = xfs_get_extsz_hint(ap->ip);
if (unlikely(align)) { if (unlikely(align)) {
error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev,
align, 0, ap->eof, 0, ap->conv, align, 0, ap->eof, 0, ap->conv,
...@@ -3660,7 +3662,8 @@ xfs_bmap_btalloc( ...@@ -3660,7 +3662,8 @@ xfs_bmap_btalloc(
nullfb = *ap->firstblock == NULLFSBLOCK; nullfb = *ap->firstblock == NULLFSBLOCK;
fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock);
if (nullfb) { if (nullfb) {
if (ap->userdata && xfs_inode_is_filestream(ap->ip)) { if (xfs_alloc_is_userdata(ap->datatype) &&
xfs_inode_is_filestream(ap->ip)) {
ag = xfs_filestream_lookup_ag(ap->ip); ag = xfs_filestream_lookup_ag(ap->ip);
ag = (ag != NULLAGNUMBER) ? ag : 0; ag = (ag != NULLAGNUMBER) ? ag : 0;
ap->blkno = XFS_AGB_TO_FSB(mp, ag, 0); ap->blkno = XFS_AGB_TO_FSB(mp, ag, 0);
...@@ -3700,7 +3703,8 @@ xfs_bmap_btalloc( ...@@ -3700,7 +3703,8 @@ xfs_bmap_btalloc(
* enough for the request. If one isn't found, then adjust * enough for the request. If one isn't found, then adjust
* the minimum allocation size to the largest space found. * the minimum allocation size to the largest space found.
*/ */
if (ap->userdata && xfs_inode_is_filestream(ap->ip)) if (xfs_alloc_is_userdata(ap->datatype) &&
xfs_inode_is_filestream(ap->ip))
error = xfs_bmap_btalloc_filestreams(ap, &args, &blen); error = xfs_bmap_btalloc_filestreams(ap, &args, &blen);
else else
error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); error = xfs_bmap_btalloc_nullfb(ap, &args, &blen);
...@@ -3784,8 +3788,8 @@ xfs_bmap_btalloc( ...@@ -3784,8 +3788,8 @@ xfs_bmap_btalloc(
args.minleft = ap->minleft; args.minleft = ap->minleft;
args.wasdel = ap->wasdel; args.wasdel = ap->wasdel;
args.resv = XFS_AG_RESV_NONE; args.resv = XFS_AG_RESV_NONE;
args.userdata = ap->userdata; args.datatype = ap->datatype;
if (ap->userdata & XFS_ALLOC_USERDATA_ZERO) if (ap->datatype & XFS_ALLOC_USERDATA_ZERO)
args.ip = ap->ip; args.ip = ap->ip;
error = xfs_alloc_vextent(&args); error = xfs_alloc_vextent(&args);
...@@ -3879,7 +3883,8 @@ STATIC int ...@@ -3879,7 +3883,8 @@ STATIC int
xfs_bmap_alloc( xfs_bmap_alloc(
struct xfs_bmalloca *ap) /* bmap alloc argument struct */ struct xfs_bmalloca *ap) /* bmap alloc argument struct */
{ {
if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) if (XFS_IS_REALTIME_INODE(ap->ip) &&
xfs_alloc_is_userdata(ap->datatype))
return xfs_bmap_rtalloc(ap); return xfs_bmap_rtalloc(ap);
return xfs_bmap_btalloc(ap); return xfs_bmap_btalloc(ap);
} }
...@@ -4204,15 +4209,21 @@ xfs_bmapi_allocate( ...@@ -4204,15 +4209,21 @@ xfs_bmapi_allocate(
} }
/* /*
* Indicate if this is the first user data in the file, or just any * Set the data type being allocated. For the data fork, the first data
* user data. And if it is userdata, indicate whether it needs to * in the file is treated differently to all other allocations. For the
* be initialised to zero during allocation. * attribute fork, we only need to ensure the allocated range is not on
* the busy list.
*/ */
if (!(bma->flags & XFS_BMAPI_METADATA)) { if (!(bma->flags & XFS_BMAPI_METADATA)) {
bma->userdata = (bma->offset == 0) ? bma->datatype = XFS_ALLOC_NOBUSY;
XFS_ALLOC_INITIAL_USER_DATA : XFS_ALLOC_USERDATA; if (whichfork == XFS_DATA_FORK) {
if (bma->offset == 0)
bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
else
bma->datatype |= XFS_ALLOC_USERDATA;
}
if (bma->flags & XFS_BMAPI_ZERO) if (bma->flags & XFS_BMAPI_ZERO)
bma->userdata |= XFS_ALLOC_USERDATA_ZERO; bma->datatype |= XFS_ALLOC_USERDATA_ZERO;
} }
bma->minlen = (bma->flags & XFS_BMAPI_CONTIG) ? bma->length : 1; bma->minlen = (bma->flags & XFS_BMAPI_CONTIG) ? bma->length : 1;
...@@ -4482,7 +4493,7 @@ xfs_bmapi_write( ...@@ -4482,7 +4493,7 @@ xfs_bmapi_write(
bma.tp = tp; bma.tp = tp;
bma.ip = ip; bma.ip = ip;
bma.total = total; bma.total = total;
bma.userdata = 0; bma.datatype = 0;
bma.dfops = dfops; bma.dfops = dfops;
bma.firstblock = firstblock; bma.firstblock = firstblock;
......
...@@ -54,7 +54,7 @@ struct xfs_bmalloca { ...@@ -54,7 +54,7 @@ struct xfs_bmalloca {
bool wasdel; /* replacing a delayed allocation */ bool wasdel; /* replacing a delayed allocation */
bool aeof; /* allocated space at eof */ bool aeof; /* allocated space at eof */
bool conv; /* overwriting unwritten extents */ bool conv; /* overwriting unwritten extents */
char userdata;/* userdata mask */ int datatype;/* data type being allocated */
int flags; int flags;
}; };
......
...@@ -182,7 +182,7 @@ xfs_bmap_rtalloc( ...@@ -182,7 +182,7 @@ xfs_bmap_rtalloc(
XFS_TRANS_DQ_RTBCOUNT, (long) ralen); XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
/* Zero the extent if we were asked to do so */ /* Zero the extent if we were asked to do so */
if (ap->userdata & XFS_ALLOC_USERDATA_ZERO) { if (ap->datatype & XFS_ALLOC_USERDATA_ZERO) {
error = xfs_zero_extent(ap->ip, ap->blkno, ap->length); error = xfs_zero_extent(ap->ip, ap->blkno, ap->length);
if (error) if (error)
return error; return error;
......
...@@ -384,7 +384,7 @@ xfs_extent_busy_trim( ...@@ -384,7 +384,7 @@ xfs_extent_busy_trim(
* If this is a metadata allocation, try to reuse the busy * If this is a metadata allocation, try to reuse the busy
* extent instead of trimming the allocation. * extent instead of trimming the allocation.
*/ */
if (!args->userdata && if (!xfs_alloc_is_userdata(args->datatype) &&
!(busyp->flags & XFS_EXTENT_BUSY_DISCARDED)) { !(busyp->flags & XFS_EXTENT_BUSY_DISCARDED)) {
if (!xfs_extent_busy_update_extent(args->mp, args->pag, if (!xfs_extent_busy_update_extent(args->mp, args->pag,
busyp, fbno, flen, busyp, fbno, flen,
......
...@@ -371,7 +371,8 @@ xfs_filestream_new_ag( ...@@ -371,7 +371,8 @@ xfs_filestream_new_ag(
struct xfs_mount *mp = ip->i_mount; struct xfs_mount *mp = ip->i_mount;
xfs_extlen_t minlen = ap->length; xfs_extlen_t minlen = ap->length;
xfs_agnumber_t startag = 0; xfs_agnumber_t startag = 0;
int flags, err = 0; int flags = 0;
int err = 0;
struct xfs_mru_cache_elem *mru; struct xfs_mru_cache_elem *mru;
*agp = NULLAGNUMBER; *agp = NULLAGNUMBER;
...@@ -387,8 +388,10 @@ xfs_filestream_new_ag( ...@@ -387,8 +388,10 @@ xfs_filestream_new_ag(
startag = (item->ag + 1) % mp->m_sb.sb_agcount; startag = (item->ag + 1) % mp->m_sb.sb_agcount;
} }
flags = (ap->userdata ? XFS_PICK_USERDATA : 0) | if (xfs_alloc_is_userdata(ap->datatype))
(ap->dfops->dop_low ? XFS_PICK_LOWSPACE : 0); flags |= XFS_PICK_USERDATA;
if (ap->dfops->dop_low)
flags |= XFS_PICK_LOWSPACE;
err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen); err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen);
......
...@@ -413,7 +413,8 @@ struct xlog { ...@@ -413,7 +413,8 @@ struct xlog {
/* log record crc error injection factor */ /* log record crc error injection factor */
uint32_t l_badcrc_factor; uint32_t l_badcrc_factor;
#endif #endif
/* log recovery lsn tracking (for buffer submission */
xfs_lsn_t l_recovery_lsn;
}; };
#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \
......
This diff is collapsed.
...@@ -933,6 +933,20 @@ xfs_mountfs( ...@@ -933,6 +933,20 @@ xfs_mountfs(
goto out_rtunmount; goto out_rtunmount;
} }
/*
* Now the log is fully replayed, we can transition to full read-only
* mode for read-only mounts. This will sync all the metadata and clean
* the log so that the recovery we just performed does not have to be
* replayed again on the next mount.
*
* We use the same quiesce mechanism as the rw->ro remount, as they are
* semantically identical operations.
*/
if ((mp->m_flags & (XFS_MOUNT_RDONLY|XFS_MOUNT_NORECOVERY)) ==
XFS_MOUNT_RDONLY) {
xfs_quiesce_attr(mp);
}
/* /*
* Complete the quota initialisation, post-log-replay component. * Complete the quota initialisation, post-log-replay component.
*/ */
......
...@@ -1137,7 +1137,7 @@ xfs_restore_resvblks(struct xfs_mount *mp) ...@@ -1137,7 +1137,7 @@ xfs_restore_resvblks(struct xfs_mount *mp)
* Note: xfs_log_quiesce() stops background log work - the callers must ensure * Note: xfs_log_quiesce() stops background log work - the callers must ensure
* it is started again when appropriate. * it is started again when appropriate.
*/ */
static void void
xfs_quiesce_attr( xfs_quiesce_attr(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
......
...@@ -61,6 +61,7 @@ struct xfs_mount; ...@@ -61,6 +61,7 @@ struct xfs_mount;
struct xfs_buftarg; struct xfs_buftarg;
struct block_device; struct block_device;
extern void xfs_quiesce_attr(struct xfs_mount *mp);
extern void xfs_flush_inodes(struct xfs_mount *mp); extern void xfs_flush_inodes(struct xfs_mount *mp);
extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *);
extern xfs_agnumber_t xfs_set_inode_alloc(struct xfs_mount *, extern xfs_agnumber_t xfs_set_inode_alloc(struct xfs_mount *,
......
...@@ -1624,7 +1624,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, ...@@ -1624,7 +1624,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__field(char, wasdel) __field(char, wasdel)
__field(char, wasfromfl) __field(char, wasfromfl)
__field(int, resv) __field(int, resv)
__field(char, userdata) __field(int, datatype)
__field(xfs_fsblock_t, firstblock) __field(xfs_fsblock_t, firstblock)
), ),
TP_fast_assign( TP_fast_assign(
...@@ -1645,13 +1645,13 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, ...@@ -1645,13 +1645,13 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__entry->wasdel = args->wasdel; __entry->wasdel = args->wasdel;
__entry->wasfromfl = args->wasfromfl; __entry->wasfromfl = args->wasfromfl;
__entry->resv = args->resv; __entry->resv = args->resv;
__entry->userdata = args->userdata; __entry->datatype = args->datatype;
__entry->firstblock = args->firstblock; __entry->firstblock = args->firstblock;
), ),
TP_printk("dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u " TP_printk("dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u "
"prod %u minleft %u total %u alignment %u minalignslop %u " "prod %u minleft %u total %u alignment %u minalignslop %u "
"len %u type %s otype %s wasdel %d wasfromfl %d resv %d " "len %u type %s otype %s wasdel %d wasfromfl %d resv %d "
"userdata %d firstblock 0x%llx", "datatype 0x%x firstblock 0x%llx",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->agbno, __entry->agbno,
...@@ -1669,7 +1669,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, ...@@ -1669,7 +1669,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__entry->wasdel, __entry->wasdel,
__entry->wasfromfl, __entry->wasfromfl,
__entry->resv, __entry->resv,
__entry->userdata, __entry->datatype,
(unsigned long long)__entry->firstblock) (unsigned long long)__entry->firstblock)
) )
...@@ -1985,6 +1985,29 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \ ...@@ -1985,6 +1985,29 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \
DEFINE_SWAPEXT_EVENT(xfs_swap_extent_before); DEFINE_SWAPEXT_EVENT(xfs_swap_extent_before);
DEFINE_SWAPEXT_EVENT(xfs_swap_extent_after); DEFINE_SWAPEXT_EVENT(xfs_swap_extent_after);
TRACE_EVENT(xfs_log_recover_record,
TP_PROTO(struct xlog *log, struct xlog_rec_header *rhead, int pass),
TP_ARGS(log, rhead, pass),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(xfs_lsn_t, lsn)
__field(int, len)
__field(int, num_logops)
__field(int, pass)
),
TP_fast_assign(
__entry->dev = log->l_mp->m_super->s_dev;
__entry->lsn = be64_to_cpu(rhead->h_lsn);
__entry->len = be32_to_cpu(rhead->h_len);
__entry->num_logops = be32_to_cpu(rhead->h_num_logops);
__entry->pass = pass;
),
TP_printk("dev %d:%d lsn 0x%llx len 0x%x num_logops 0x%x pass %d",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->lsn, __entry->len, __entry->num_logops,
__entry->pass)
)
DECLARE_EVENT_CLASS(xfs_log_recover_item_class, DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
TP_PROTO(struct xlog *log, struct xlog_recover *trans, TP_PROTO(struct xlog *log, struct xlog_recover *trans,
struct xlog_recover_item *item, int pass), struct xlog_recover_item *item, int pass),
...@@ -1993,6 +2016,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class, ...@@ -1993,6 +2016,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
__field(dev_t, dev) __field(dev_t, dev)
__field(unsigned long, item) __field(unsigned long, item)
__field(xlog_tid_t, tid) __field(xlog_tid_t, tid)
__field(xfs_lsn_t, lsn)
__field(int, type) __field(int, type)
__field(int, pass) __field(int, pass)
__field(int, count) __field(int, count)
...@@ -2002,15 +2026,17 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class, ...@@ -2002,15 +2026,17 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
__entry->dev = log->l_mp->m_super->s_dev; __entry->dev = log->l_mp->m_super->s_dev;
__entry->item = (unsigned long)item; __entry->item = (unsigned long)item;
__entry->tid = trans->r_log_tid; __entry->tid = trans->r_log_tid;
__entry->lsn = trans->r_lsn;
__entry->type = ITEM_TYPE(item); __entry->type = ITEM_TYPE(item);
__entry->pass = pass; __entry->pass = pass;
__entry->count = item->ri_cnt; __entry->count = item->ri_cnt;
__entry->total = item->ri_total; __entry->total = item->ri_total;
), ),
TP_printk("dev %d:%d trans 0x%x, pass %d, item 0x%p, item type %s " TP_printk("dev %d:%d tid 0x%x lsn 0x%llx, pass %d, item 0x%p, "
"item region count/total %d/%d", "item type %s item region count/total %d/%d",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->tid, __entry->tid,
__entry->lsn,
__entry->pass, __entry->pass,
(void *)__entry->item, (void *)__entry->item,
__print_symbolic(__entry->type, XFS_LI_TYPE_DESC), __print_symbolic(__entry->type, XFS_LI_TYPE_DESC),
...@@ -2069,6 +2095,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel); ...@@ -2069,6 +2095,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_add); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_add);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_ref_inc); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_ref_inc);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_recover); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_recover);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_skip);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_inode_buf); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_inode_buf);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_reg_buf); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_reg_buf);
DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_dquot_buf); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_dquot_buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment