diff options
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 10 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.h | 1 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap_btree.h | 14 | ||||
| -rw-r--r-- | fs/xfs/xfs_iget.c | 12 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode_item.h | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_log.c | 2 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 |
7 files changed, 25 insertions, 21 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index b4c7d4248aac..77b8be81c769 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -292,6 +292,7 @@ _xfs_buf_free_pages( | |||
| 292 | { | 292 | { |
| 293 | if (bp->b_pages != bp->b_page_array) { | 293 | if (bp->b_pages != bp->b_page_array) { |
| 294 | kmem_free(bp->b_pages); | 294 | kmem_free(bp->b_pages); |
| 295 | bp->b_pages = NULL; | ||
| 295 | } | 296 | } |
| 296 | } | 297 | } |
| 297 | 298 | ||
| @@ -323,9 +324,8 @@ xfs_buf_free( | |||
| 323 | ASSERT(!PagePrivate(page)); | 324 | ASSERT(!PagePrivate(page)); |
| 324 | page_cache_release(page); | 325 | page_cache_release(page); |
| 325 | } | 326 | } |
| 326 | _xfs_buf_free_pages(bp); | ||
| 327 | } | 327 | } |
| 328 | 328 | _xfs_buf_free_pages(bp); | |
| 329 | xfs_buf_deallocate(bp); | 329 | xfs_buf_deallocate(bp); |
| 330 | } | 330 | } |
| 331 | 331 | ||
| @@ -1149,10 +1149,14 @@ _xfs_buf_ioapply( | |||
| 1149 | if (bp->b_flags & XBF_ORDERED) { | 1149 | if (bp->b_flags & XBF_ORDERED) { |
| 1150 | ASSERT(!(bp->b_flags & XBF_READ)); | 1150 | ASSERT(!(bp->b_flags & XBF_READ)); |
| 1151 | rw = WRITE_BARRIER; | 1151 | rw = WRITE_BARRIER; |
| 1152 | } else if (bp->b_flags & _XBF_RUN_QUEUES) { | 1152 | } else if (bp->b_flags & XBF_LOG_BUFFER) { |
| 1153 | ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); | 1153 | ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); |
| 1154 | bp->b_flags &= ~_XBF_RUN_QUEUES; | 1154 | bp->b_flags &= ~_XBF_RUN_QUEUES; |
| 1155 | rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC; | 1155 | rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC; |
| 1156 | } else if (bp->b_flags & _XBF_RUN_QUEUES) { | ||
| 1157 | ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); | ||
| 1158 | bp->b_flags &= ~_XBF_RUN_QUEUES; | ||
| 1159 | rw = (bp->b_flags & XBF_WRITE) ? WRITE_META : READ_META; | ||
| 1156 | } else { | 1160 | } else { |
| 1157 | rw = (bp->b_flags & XBF_WRITE) ? WRITE : | 1161 | rw = (bp->b_flags & XBF_WRITE) ? WRITE : |
| 1158 | (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; | 1162 | (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index a509f4addc2a..a34c7b54822d 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
| @@ -55,6 +55,7 @@ typedef enum { | |||
| 55 | XBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ | 55 | XBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ |
| 56 | XBF_ORDERED = (1 << 11), /* use ordered writes */ | 56 | XBF_ORDERED = (1 << 11), /* use ordered writes */ |
| 57 | XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ | 57 | XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ |
| 58 | XBF_LOG_BUFFER = (1 << 13), /* this is a buffer used for the log */ | ||
| 58 | 59 | ||
| 59 | /* flags used only as arguments to access routines */ | 60 | /* flags used only as arguments to access routines */ |
| 60 | XBF_LOCK = (1 << 14), /* lock requested */ | 61 | XBF_LOCK = (1 << 14), /* lock requested */ |
diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 5549d495947f..cf07ca7c22e7 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h | |||
| @@ -46,20 +46,12 @@ typedef struct xfs_bmdr_block { | |||
| 46 | #define BMBT_STARTBLOCK_BITLEN 52 | 46 | #define BMBT_STARTBLOCK_BITLEN 52 |
| 47 | #define BMBT_BLOCKCOUNT_BITLEN 21 | 47 | #define BMBT_BLOCKCOUNT_BITLEN 21 |
| 48 | 48 | ||
| 49 | 49 | typedef struct xfs_bmbt_rec { | |
| 50 | #define BMBT_USE_64 1 | ||
| 51 | |||
| 52 | typedef struct xfs_bmbt_rec_32 | ||
| 53 | { | ||
| 54 | __uint32_t l0, l1, l2, l3; | ||
| 55 | } xfs_bmbt_rec_32_t; | ||
| 56 | typedef struct xfs_bmbt_rec_64 | ||
| 57 | { | ||
| 58 | __be64 l0, l1; | 50 | __be64 l0, l1; |
| 59 | } xfs_bmbt_rec_64_t; | 51 | } xfs_bmbt_rec_t; |
| 60 | 52 | ||
| 61 | typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ | 53 | typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ |
| 62 | typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; | 54 | typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; |
| 63 | 55 | ||
| 64 | typedef struct xfs_bmbt_rec_host { | 56 | typedef struct xfs_bmbt_rec_host { |
| 65 | __uint64_t l0, l1; | 57 | __uint64_t l0, l1; |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index f5c904a10c11..0de36c2a46f1 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -478,17 +478,21 @@ xfs_ireclaim( | |||
| 478 | { | 478 | { |
| 479 | struct xfs_mount *mp = ip->i_mount; | 479 | struct xfs_mount *mp = ip->i_mount; |
| 480 | struct xfs_perag *pag; | 480 | struct xfs_perag *pag; |
| 481 | xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); | ||
| 481 | 482 | ||
| 482 | XFS_STATS_INC(xs_ig_reclaims); | 483 | XFS_STATS_INC(xs_ig_reclaims); |
| 483 | 484 | ||
| 484 | /* | 485 | /* |
| 485 | * Remove the inode from the per-AG radix tree. It doesn't matter | 486 | * Remove the inode from the per-AG radix tree. |
| 486 | * if it was never added to it because radix_tree_delete can deal | 487 | * |
| 487 | * with that case just fine. | 488 | * Because radix_tree_delete won't complain even if the item was never |
| 489 | * added to the tree assert that it's been there before to catch | ||
| 490 | * problems with the inode life time early on. | ||
| 488 | */ | 491 | */ |
| 489 | pag = xfs_get_perag(mp, ip->i_ino); | 492 | pag = xfs_get_perag(mp, ip->i_ino); |
| 490 | write_lock(&pag->pag_ici_lock); | 493 | write_lock(&pag->pag_ici_lock); |
| 491 | radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino)); | 494 | if (!radix_tree_delete(&pag->pag_ici_root, agino)) |
| 495 | ASSERT(0); | ||
| 492 | write_unlock(&pag->pag_ici_lock); | 496 | write_unlock(&pag->pag_ici_lock); |
| 493 | xfs_put_perag(mp, pag); | 497 | xfs_put_perag(mp, pag); |
| 494 | 498 | ||
diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index 65bae4c9b8bf..cc8df1ac7783 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h | |||
| @@ -127,7 +127,7 @@ static inline int xfs_ilog_fdata(int w) | |||
| 127 | #ifdef __KERNEL__ | 127 | #ifdef __KERNEL__ |
| 128 | 128 | ||
| 129 | struct xfs_buf; | 129 | struct xfs_buf; |
| 130 | struct xfs_bmbt_rec_64; | 130 | struct xfs_bmbt_rec; |
| 131 | struct xfs_inode; | 131 | struct xfs_inode; |
| 132 | struct xfs_mount; | 132 | struct xfs_mount; |
| 133 | 133 | ||
| @@ -140,9 +140,9 @@ typedef struct xfs_inode_log_item { | |||
| 140 | unsigned short ili_flags; /* misc flags */ | 140 | unsigned short ili_flags; /* misc flags */ |
| 141 | unsigned short ili_logged; /* flushed logged data */ | 141 | unsigned short ili_logged; /* flushed logged data */ |
| 142 | unsigned int ili_last_fields; /* fields when flushed */ | 142 | unsigned int ili_last_fields; /* fields when flushed */ |
| 143 | struct xfs_bmbt_rec_64 *ili_extents_buf; /* array of logged | 143 | struct xfs_bmbt_rec *ili_extents_buf; /* array of logged |
| 144 | data exts */ | 144 | data exts */ |
| 145 | struct xfs_bmbt_rec_64 *ili_aextents_buf; /* array of logged | 145 | struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged |
| 146 | attr exts */ | 146 | attr exts */ |
| 147 | unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ | 147 | unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ |
| 148 | 148 | ||
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 4cb1792040e3..600b5b06aaeb 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -1441,6 +1441,7 @@ xlog_sync(xlog_t *log, | |||
| 1441 | XFS_BUF_ZEROFLAGS(bp); | 1441 | XFS_BUF_ZEROFLAGS(bp); |
| 1442 | XFS_BUF_BUSY(bp); | 1442 | XFS_BUF_BUSY(bp); |
| 1443 | XFS_BUF_ASYNC(bp); | 1443 | XFS_BUF_ASYNC(bp); |
| 1444 | bp->b_flags |= XBF_LOG_BUFFER; | ||
| 1444 | /* | 1445 | /* |
| 1445 | * Do an ordered write for the log block. | 1446 | * Do an ordered write for the log block. |
| 1446 | * Its unnecessary to flush the first split block in the log wrap case. | 1447 | * Its unnecessary to flush the first split block in the log wrap case. |
| @@ -1478,6 +1479,7 @@ xlog_sync(xlog_t *log, | |||
| 1478 | XFS_BUF_ZEROFLAGS(bp); | 1479 | XFS_BUF_ZEROFLAGS(bp); |
| 1479 | XFS_BUF_BUSY(bp); | 1480 | XFS_BUF_BUSY(bp); |
| 1480 | XFS_BUF_ASYNC(bp); | 1481 | XFS_BUF_ASYNC(bp); |
| 1482 | bp->b_flags |= XBF_LOG_BUFFER; | ||
| 1481 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1483 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) |
| 1482 | XFS_BUF_ORDERED(bp); | 1484 | XFS_BUF_ORDERED(bp); |
| 1483 | dptr = XFS_BUF_PTR(bp); | 1485 | dptr = XFS_BUF_PTR(bp); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7c8ff12d1995..66bc0a54b284 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -152,6 +152,7 @@ struct inodes_stat_t { | |||
| 152 | #define WRITE_SYNC_PLUG (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 152 | #define WRITE_SYNC_PLUG (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) |
| 153 | #define WRITE_SYNC (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 153 | #define WRITE_SYNC (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) |
| 154 | #define WRITE_ODIRECT_PLUG (WRITE | (1 << BIO_RW_SYNCIO)) | 154 | #define WRITE_ODIRECT_PLUG (WRITE | (1 << BIO_RW_SYNCIO)) |
| 155 | #define WRITE_META (WRITE | (1 << BIO_RW_META)) | ||
| 155 | #define SWRITE_SYNC_PLUG \ | 156 | #define SWRITE_SYNC_PLUG \ |
| 156 | (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 157 | (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) |
| 157 | #define SWRITE_SYNC (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 158 | #define SWRITE_SYNC (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) |
