Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2011-08-23 21:14:43.972035659 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2011-08-23 21:14:45.412027859 +0200 @@ -4601,13 +4601,13 @@ xfs_bmapi_delay( STATIC int xfs_bmapi_allocate( struct xfs_bmalloca *bma, - int flags, - int *logflags) + int flags) { struct xfs_mount *mp = bma->ip->i_mount; int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? XFS_ATTR_FORK : XFS_DATA_FORK; struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags = 0; int error; int rt; @@ -4697,14 +4697,15 @@ xfs_bmapi_allocate( if (bma->wasdel) { error = xfs_bmap_add_extent_delay_real(bma->tp, bma->ip, &bma->idx, &bma->cur, &bma->got, - bma->firstblock, bma->flist, logflags); + bma->firstblock, bma->flist, &tmp_logflags); } else { error = xfs_bmap_add_extent_hole_real(bma->tp, bma->ip, &bma->idx, &bma->cur, &bma->got, - bma->firstblock, bma->flist, logflags, + bma->firstblock, bma->flist, &tmp_logflags, whichfork); } + bma->logflags |= tmp_logflags; if (error) return error; @@ -4728,16 +4729,14 @@ xfs_bmapi_convert_unwritten( struct xfs_bmalloca *bma, struct xfs_bmbt_irec *mval, xfs_filblks_t len, - int flags, - int *logflags) + int flags) { int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? XFS_ATTR_FORK : XFS_DATA_FORK; struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags = 0; int error; - *logflags = 0; - /* check if we need to do unwritten->real conversion */ if (mval->br_state == XFS_EXT_UNWRITTEN && (flags & XFS_BMAPI_PREALLOC)) @@ -4763,7 +4762,9 @@ xfs_bmapi_convert_unwritten( ? XFS_EXT_NORM : XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, &bma->idx, - &bma->cur, mval, bma->firstblock, bma->flist, logflags); + &bma->cur, mval, bma->firstblock, bma->flist, + &tmp_logflags); + bma->logflags |= tmp_logflags; if (error) return error; @@ -4815,10 +4816,8 @@ xfs_bmapi_write( int eof; /* after the end of extents */ int error; /* error return */ xfs_ifork_t *ifp; /* inode fork pointer */ - int logflags; /* flags for transaction logging */ int n; /* current extent index */ xfs_fileoff_t obno; /* old block number (offset) */ - int tmp_logflags; /* temp flags holder */ int whichfork; /* data or attr fork */ char inhole; /* current location is hole in file */ char wasdelay; /* old extent was delayed */ @@ -4863,11 +4862,9 @@ xfs_bmapi_write( XFS_STATS_INC(xs_blk_mapw); - logflags = 0; - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { error = xfs_bmap_local_to_extents(tp, ip, firstblock, total, - &logflags, whichfork); + &bma.logflags, whichfork); if (error) goto error0; } @@ -4915,7 +4912,7 @@ xfs_bmapi_write( bma.length = len; bma.offset = bno; - error = xfs_bmapi_allocate(&bma, flags, &tmp_logflags); + error = xfs_bmapi_allocate(&bma, flags); if (error == ENOSPC || error == EDQUOT) { if (n == 0) { *nmap = 0; @@ -4924,7 +4921,6 @@ xfs_bmapi_write( } } - logflags |= tmp_logflags; if (error) goto error0; if (bma.blkno == NULLFSBLOCK) @@ -4936,9 +4932,7 @@ xfs_bmapi_write( end, n, flags); /* Execute unwritten extent conversion if necessary */ - error = xfs_bmapi_convert_unwritten(&bma, mval, len, - flags, &tmp_logflags); - logflags |= tmp_logflags; + error = xfs_bmapi_convert_unwritten(&bma, mval, len, flags); if (error == EAGAIN) continue; if (error) @@ -4970,10 +4964,12 @@ xfs_bmapi_write( */ if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && XFS_IFORK_NEXTENTS(ip, whichfork) <= ifp->if_ext_max) { + int tmp_logflags = 0; + ASSERT(bma.cur); error = xfs_bmap_btree_to_extents(tp, ip, bma.cur, &tmp_logflags, whichfork); - logflags |= tmp_logflags; + bma.logflags |= tmp_logflags; if (error) goto error0; } @@ -4987,19 +4983,19 @@ error0: * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & xfs_ilog_fext(whichfork)) && + if ((bma.logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~xfs_ilog_fext(whichfork); - else if ((logflags & xfs_ilog_fbroot(whichfork)) && + bma.logflags &= ~xfs_ilog_fext(whichfork); + else if ((bma.logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~xfs_ilog_fbroot(whichfork); + bma.logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, * and it's not logged so we don't shutdown when we should. */ - if (logflags) - xfs_trans_log_inode(tp, ip, logflags); + if (bma.logflags) + xfs_trans_log_inode(tp, ip, bma.logflags); if (bma.cur) { if (!error) { Index: xfs/fs/xfs/xfs_bmap.h =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.h 2011-08-23 21:14:43.972035659 +0200 +++ xfs/fs/xfs/xfs_bmap.h 2011-08-23 21:14:45.412027859 +0200 @@ -123,6 +123,7 @@ typedef struct xfs_bmalloca { struct xfs_btree_cur *cur; /* btree cursor */ xfs_extnum_t idx; /* current extent index */ int nallocs;/* number of extents alloc'd */ + int logflags;/* flags for transaction logging */ xfs_extlen_t total; /* total blocks needed for xaction */ xfs_extlen_t minlen; /* minimum allocation size (blocks) */ _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs