Skip to content

Commit

Permalink
xfs: move firstblock and bmap freelist cursor into bmalloca structure
Browse files Browse the repository at this point in the history
Rather than passing the firstblock and freelist structure around,
embed it into the bmalloca structure and remove it from the function
parameters.

This also enables the minleft parameter to be set only once in
xfs_bmapi_write(), and the freelist cursor directly queried in
xfs_bmapi_allocate to clear it when the lowspace algorithm is
activated.
    
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
  • Loading branch information
Dave Chinner authored and Alex Elder committed Oct 12, 2011
1 parent baf41a5 commit 0937e0f
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 50 deletions.
92 changes: 45 additions & 47 deletions fs/xfs/xfs_bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2006,9 +2006,9 @@ xfs_bmap_adjacent(
XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks)

mp = ap->ip->i_mount;
nullfb = ap->firstblock == NULLFSBLOCK;
nullfb = *ap->firstblock == NULLFSBLOCK;
rt = XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata;
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,
* try to use its last block as our starting point.
Expand Down Expand Up @@ -2380,8 +2380,8 @@ xfs_bmap_btalloc(
ASSERT(!error);
ASSERT(ap->alen);
}
nullfb = ap->firstblock == NULLFSBLOCK;
fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock);
nullfb = *ap->firstblock == NULLFSBLOCK;
fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock);
if (nullfb) {
if (ap->userdata && xfs_inode_is_filestream(ap->ip)) {
ag = xfs_filestream_lookup_ag(ap->ip);
Expand All @@ -2391,7 +2391,7 @@ xfs_bmap_btalloc(
ap->rval = XFS_INO_TO_FSB(mp, ap->ip->i_ino);
}
} else
ap->rval = ap->firstblock;
ap->rval = *ap->firstblock;

xfs_bmap_adjacent(ap);

Expand All @@ -2402,7 +2402,7 @@ xfs_bmap_btalloc(
if (nullfb || XFS_FSB_TO_AGNO(mp, ap->rval) == fb_agno)
;
else
ap->rval = ap->firstblock;
ap->rval = *ap->firstblock;
/*
* Normal allocation, done through xfs_alloc_vextent.
*/
Expand All @@ -2413,13 +2413,13 @@ xfs_bmap_btalloc(

/* Trim the allocation back to the maximum an AG can fit. */
args.maxlen = MIN(ap->alen, XFS_ALLOC_AG_MAX_USABLE(mp));
args.firstblock = ap->firstblock;
args.firstblock = *ap->firstblock;
blen = 0;
if (nullfb) {
error = xfs_bmap_btalloc_nullfb(ap, &args, &blen);
if (error)
return error;
} else if (ap->low) {
} else if (ap->flist->xbf_low) {
if (xfs_inode_is_filestream(ap->ip))
args.type = XFS_ALLOCTYPE_FIRST_AG;
else
Expand Down Expand Up @@ -2452,7 +2452,7 @@ xfs_bmap_btalloc(
* is >= the stripe unit and the allocation offset is
* at the end of file.
*/
if (!ap->low && ap->aeof) {
if (!ap->flist->xbf_low && ap->aeof) {
if (!ap->off) {
args.alignment = mp->m_dalign;
atype = args.type;
Expand Down Expand Up @@ -2540,12 +2540,25 @@ xfs_bmap_btalloc(
args.minleft = 0;
if ((error = xfs_alloc_vextent(&args)))
return error;
ap->low = 1;
ap->flist->xbf_low = 1;
}
if (args.fsbno != NULLFSBLOCK) {
ap->firstblock = ap->rval = args.fsbno;
/*
* check the allocation happened at the same or higher AG than
* the first block that was allocated.
*/
ASSERT(*ap->firstblock == NULLFSBLOCK ||
XFS_FSB_TO_AGNO(mp, *ap->firstblock) ==
XFS_FSB_TO_AGNO(mp, args.fsbno) ||
(ap->flist->xbf_low &&
XFS_FSB_TO_AGNO(mp, *ap->firstblock) <
XFS_FSB_TO_AGNO(mp, args.fsbno)));

ap->rval = args.fsbno;
if (*ap->firstblock == NULLFSBLOCK)
*ap->firstblock = args.fsbno;
ASSERT(nullfb || fb_agno == args.agno ||
(ap->low && fb_agno < args.agno));
(ap->flist->xbf_low && fb_agno < args.agno));
ap->alen = args.len;
ap->ip->i_d.di_nblocks += args.len;
xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE);
Expand Down Expand Up @@ -4596,8 +4609,6 @@ xfs_bmapi_allocate(
struct xfs_bmalloca *bma,
xfs_extnum_t *lastx,
struct xfs_btree_cur **cur,
xfs_fsblock_t *firstblock,
struct xfs_bmap_free *flist,
int flags,
int *nallocs,
int *logflags)
Expand Down Expand Up @@ -4647,9 +4658,7 @@ xfs_bmapi_allocate(
*/
bma->alen = alen;
bma->off = aoff;
bma->firstblock = *firstblock;
bma->minlen = (flags & XFS_BMAPI_CONTIG) ? alen : 1;
bma->low = flist->xbf_low;
bma->aeof = 0;

/*
Expand All @@ -4671,24 +4680,18 @@ xfs_bmapi_allocate(
* Copy out result fields.
*/
abno = bma->rval;
flist->xbf_low = bma->low;
alen = bma->alen;
aoff = bma->off;
ASSERT(*firstblock == NULLFSBLOCK ||
XFS_FSB_TO_AGNO(mp, *firstblock) ==
XFS_FSB_TO_AGNO(mp, bma->firstblock) ||
(flist->xbf_low &&
XFS_FSB_TO_AGNO(mp, *firstblock) <
XFS_FSB_TO_AGNO(mp, bma->firstblock)));
*firstblock = bma->firstblock;
if (bma->flist->xbf_low)
bma->minleft = 0;
if (*cur)
(*cur)->bc_private.b.firstblock = *firstblock;
(*cur)->bc_private.b.firstblock = *bma->firstblock;
if (abno == NULLFSBLOCK)
return 0;
if ((ifp->if_flags & XFS_IFBROOT) && !*cur) {
(*cur) = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork);
(*cur)->bc_private.b.firstblock = *firstblock;
(*cur)->bc_private.b.flist = flist;
(*cur)->bc_private.b.firstblock = *bma->firstblock;
(*cur)->bc_private.b.flist = bma->flist;
}
/*
* Bump the number of extents we've allocated
Expand All @@ -4715,11 +4718,12 @@ xfs_bmapi_allocate(

if (bma->wasdel) {
error = xfs_bmap_add_extent_delay_real(bma->tp, bma->ip, lastx,
cur, &bma->got, firstblock, flist, logflags);
cur, &bma->got, bma->firstblock, bma->flist,
logflags);
} else {
error = xfs_bmap_add_extent_hole_real(bma->tp, bma->ip, lastx,
cur, &bma->got, firstblock, flist, logflags,
whichfork);
cur, &bma->got, bma->firstblock, bma->flist,
logflags, whichfork);
}

if (error)
Expand All @@ -4746,8 +4750,6 @@ xfs_bmapi_convert_unwritten(
xfs_filblks_t len,
xfs_extnum_t *lastx,
struct xfs_btree_cur **cur,
xfs_fsblock_t *firstblock,
struct xfs_bmap_free *flist,
int flags,
int *logflags)
{
Expand Down Expand Up @@ -4776,14 +4778,14 @@ xfs_bmapi_convert_unwritten(
if ((ifp->if_flags & XFS_IFBROOT) && !*cur) {
*cur = xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp,
bma->ip, whichfork);
(*cur)->bc_private.b.firstblock = *firstblock;
(*cur)->bc_private.b.flist = flist;
(*cur)->bc_private.b.firstblock = *bma->firstblock;
(*cur)->bc_private.b.flist = bma->flist;
}
mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN)
? XFS_EXT_NORM : XFS_EXT_UNWRITTEN;

error = xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, lastx,
cur, mval, firstblock, flist, logflags);
cur, mval, bma->firstblock, bma->flist, logflags);
if (error)
return error;

Expand Down Expand Up @@ -4838,7 +4840,6 @@ xfs_bmapi_write(
int error; /* error return */
xfs_extnum_t lastx; /* last useful extent number */
int logflags; /* flags for transaction logging */
xfs_extlen_t minleft; /* min blocks left after allocation */
int n; /* current extent index */
int nallocs; /* number of extents alloc'd */
xfs_fileoff_t obno; /* old block number (offset) */
Expand Down Expand Up @@ -4900,11 +4901,11 @@ xfs_bmapi_write(

if (*firstblock == NULLFSBLOCK) {
if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE)
minleft = be16_to_cpu(ifp->if_broot->bb_level) + 1;
bma.minleft = be16_to_cpu(ifp->if_broot->bb_level) + 1;
else
minleft = 1;
bma.minleft = 1;
} else {
minleft = 0;
bma.minleft = 0;
}

if (!(ifp->if_flags & XFS_IFEXTENTS)) {
Expand All @@ -4923,6 +4924,8 @@ xfs_bmapi_write(
bma.ip = ip;
bma.total = total;
bma.userdata = 0;
bma.flist = flist;
bma.firstblock = firstblock;

while (bno < end && n < *nmap) {
inhole = eof || bma.got.br_startoff > bno;
Expand All @@ -4938,16 +4941,12 @@ xfs_bmapi_write(
bma.wasdel = wasdelay;
bma.alen = len;
bma.off = bno;
bma.minleft = minleft;

error = xfs_bmapi_allocate(&bma, &lastx, &cur,
firstblock, flist, flags, &nallocs,
&tmp_logflags);
error = xfs_bmapi_allocate(&bma, &lastx, &cur, flags,
&nallocs, &tmp_logflags);
logflags |= tmp_logflags;
if (error)
goto error0;
if (flist && flist->xbf_low)
minleft = 0;
if (bma.rval == NULLFSBLOCK)
break;
}
Expand All @@ -4958,8 +4957,7 @@ xfs_bmapi_write(

/* Execute unwritten extent conversion if necessary */
error = xfs_bmapi_convert_unwritten(&bma, mval, len, &lastx,
&cur, firstblock, flist,
flags, &tmp_logflags);
&cur, flags, &tmp_logflags);
logflags |= tmp_logflags;
if (error == EAGAIN)
continue;
Expand Down
4 changes: 2 additions & 2 deletions fs/xfs/xfs_bmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp)
* Argument structure for xfs_bmap_alloc.
*/
typedef struct xfs_bmalloca {
xfs_fsblock_t firstblock; /* i/o first block allocated */
xfs_fsblock_t *firstblock; /* i/o first block allocated */
struct xfs_bmap_free *flist; /* bmap freelist */
xfs_fsblock_t rval; /* starting block of new extent */
xfs_fileoff_t off; /* offset in file filling in */
struct xfs_trans *tp; /* transaction pointer */
Expand All @@ -123,7 +124,6 @@ typedef struct xfs_bmalloca {
char eof; /* set if allocating past last extent */
char wasdel; /* replacing a delayed allocation */
char userdata;/* set if is user data */
char low; /* low on space, using seq'l ags */
char aeof; /* allocated space at eof */
char conv; /* overwriting unwritten extents */
} xfs_bmalloca_t;
Expand Down
2 changes: 1 addition & 1 deletion fs/xfs/xfs_filestream.c
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,7 @@ xfs_filestream_new_ag(
*/
ag = (ag == NULLAGNUMBER) ? 0 : (ag + 1) % mp->m_sb.sb_agcount;
flags = (ap->userdata ? XFS_PICK_USERDATA : 0) |
(ap->low ? XFS_PICK_LOWSPACE : 0);
(ap->flist->xbf_low ? XFS_PICK_LOWSPACE : 0);

err = _xfs_filestream_pick_ag(mp, ag, agp, flags, minlen);
if (err || *agp == NULLAGNUMBER)
Expand Down

0 comments on commit 0937e0f

Please sign in to comment.