diff options
| -rw-r--r-- | fs/xfs/xfs_buf.c | 12 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf.h | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 49 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_block.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_qm_syscalls.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_buf.c | 27 |
7 files changed, 64 insertions, 42 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 26673a0b20e7..56d1614760cf 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
| @@ -175,7 +175,7 @@ xfs_buf_get_maps( | |||
| 175 | bp->b_map_count = map_count; | 175 | bp->b_map_count = map_count; |
| 176 | 176 | ||
| 177 | if (map_count == 1) { | 177 | if (map_count == 1) { |
| 178 | bp->b_maps = &bp->b_map; | 178 | bp->b_maps = &bp->__b_map; |
| 179 | return 0; | 179 | return 0; |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -193,7 +193,7 @@ static void | |||
| 193 | xfs_buf_free_maps( | 193 | xfs_buf_free_maps( |
| 194 | struct xfs_buf *bp) | 194 | struct xfs_buf *bp) |
| 195 | { | 195 | { |
| 196 | if (bp->b_maps != &bp->b_map) { | 196 | if (bp->b_maps != &bp->__b_map) { |
| 197 | kmem_free(bp->b_maps); | 197 | kmem_free(bp->b_maps); |
| 198 | bp->b_maps = NULL; | 198 | bp->b_maps = NULL; |
| 199 | } | 199 | } |
| @@ -377,8 +377,8 @@ xfs_buf_allocate_memory( | |||
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | use_alloc_page: | 379 | use_alloc_page: |
| 380 | start = BBTOB(bp->b_map.bm_bn) >> PAGE_SHIFT; | 380 | start = BBTOB(bp->b_maps[0].bm_bn) >> PAGE_SHIFT; |
| 381 | end = (BBTOB(bp->b_map.bm_bn + bp->b_length) + PAGE_SIZE - 1) | 381 | end = (BBTOB(bp->b_maps[0].bm_bn + bp->b_length) + PAGE_SIZE - 1) |
| 382 | >> PAGE_SHIFT; | 382 | >> PAGE_SHIFT; |
| 383 | page_count = end - start; | 383 | page_count = end - start; |
| 384 | error = _xfs_buf_get_pages(bp, page_count, flags); | 384 | error = _xfs_buf_get_pages(bp, page_count, flags); |
| @@ -640,7 +640,7 @@ _xfs_buf_read( | |||
| 640 | xfs_buf_flags_t flags) | 640 | xfs_buf_flags_t flags) |
| 641 | { | 641 | { |
| 642 | ASSERT(!(flags & XBF_WRITE)); | 642 | ASSERT(!(flags & XBF_WRITE)); |
| 643 | ASSERT(bp->b_map.bm_bn != XFS_BUF_DADDR_NULL); | 643 | ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL); |
| 644 | 644 | ||
| 645 | bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD); | 645 | bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD); |
| 646 | bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); | 646 | bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); |
| @@ -1709,7 +1709,7 @@ xfs_buf_cmp( | |||
| 1709 | struct xfs_buf *bp = container_of(b, struct xfs_buf, b_list); | 1709 | struct xfs_buf *bp = container_of(b, struct xfs_buf, b_list); |
| 1710 | xfs_daddr_t diff; | 1710 | xfs_daddr_t diff; |
| 1711 | 1711 | ||
| 1712 | diff = ap->b_map.bm_bn - bp->b_map.bm_bn; | 1712 | diff = ap->b_maps[0].bm_bn - bp->b_maps[0].bm_bn; |
| 1713 | if (diff < 0) | 1713 | if (diff < 0) |
| 1714 | return -1; | 1714 | return -1; |
| 1715 | if (diff > 0) | 1715 | if (diff > 0) |
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 23f5642480bb..433a12ed7b17 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h | |||
| @@ -151,7 +151,7 @@ typedef struct xfs_buf { | |||
| 151 | struct page **b_pages; /* array of page pointers */ | 151 | struct page **b_pages; /* array of page pointers */ |
| 152 | struct page *b_page_array[XB_PAGES]; /* inline pages */ | 152 | struct page *b_page_array[XB_PAGES]; /* inline pages */ |
| 153 | struct xfs_buf_map *b_maps; /* compound buffer map */ | 153 | struct xfs_buf_map *b_maps; /* compound buffer map */ |
| 154 | struct xfs_buf_map b_map; /* inline compound buffer map */ | 154 | struct xfs_buf_map __b_map; /* inline compound buffer map */ |
| 155 | int b_map_count; | 155 | int b_map_count; |
| 156 | int b_io_length; /* IO size in BBs */ | 156 | int b_io_length; /* IO size in BBs */ |
| 157 | atomic_t b_pin_count; /* pin count */ | 157 | atomic_t b_pin_count; /* pin count */ |
| @@ -330,8 +330,8 @@ void xfs_buf_stale(struct xfs_buf *bp); | |||
| 330 | * In future, uncached buffers will pass the block number directly to the io | 330 | * In future, uncached buffers will pass the block number directly to the io |
| 331 | * request function and hence these macros will go away at that point. | 331 | * request function and hence these macros will go away at that point. |
| 332 | */ | 332 | */ |
| 333 | #define XFS_BUF_ADDR(bp) ((bp)->b_map.bm_bn) | 333 | #define XFS_BUF_ADDR(bp) ((bp)->b_maps[0].bm_bn) |
| 334 | #define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_map.bm_bn = (xfs_daddr_t)(bno)) | 334 | #define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_maps[0].bm_bn = (xfs_daddr_t)(bno)) |
| 335 | 335 | ||
| 336 | static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref) | 336 | static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref) |
| 337 | { | 337 | { |
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index becf4a97efc6..77b09750e92c 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
| @@ -71,7 +71,7 @@ xfs_buf_item_log_debug( | |||
| 71 | chunk_num = byte >> XFS_BLF_SHIFT; | 71 | chunk_num = byte >> XFS_BLF_SHIFT; |
| 72 | word_num = chunk_num >> BIT_TO_WORD_SHIFT; | 72 | word_num = chunk_num >> BIT_TO_WORD_SHIFT; |
| 73 | bit_num = chunk_num & (NBWORD - 1); | 73 | bit_num = chunk_num & (NBWORD - 1); |
| 74 | wordp = &(bip->bli_format.blf_data_map[word_num]); | 74 | wordp = &(bip->__bli_format.blf_data_map[word_num]); |
| 75 | bit_set = *wordp & (1 << bit_num); | 75 | bit_set = *wordp & (1 << bit_num); |
| 76 | ASSERT(bit_set); | 76 | ASSERT(bit_set); |
| 77 | byte++; | 77 | byte++; |
| @@ -237,7 +237,7 @@ xfs_buf_item_size( | |||
| 237 | * cancel flag in it. | 237 | * cancel flag in it. |
| 238 | */ | 238 | */ |
| 239 | trace_xfs_buf_item_size_stale(bip); | 239 | trace_xfs_buf_item_size_stale(bip); |
| 240 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); | 240 | ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL); |
| 241 | return bip->bli_format_count; | 241 | return bip->bli_format_count; |
| 242 | } | 242 | } |
| 243 | 243 | ||
| @@ -278,7 +278,7 @@ xfs_buf_item_format_segment( | |||
| 278 | uint buffer_offset; | 278 | uint buffer_offset; |
| 279 | 279 | ||
| 280 | /* copy the flags across from the base format item */ | 280 | /* copy the flags across from the base format item */ |
| 281 | blfp->blf_flags = bip->bli_format.blf_flags; | 281 | blfp->blf_flags = bip->__bli_format.blf_flags; |
| 282 | 282 | ||
| 283 | /* | 283 | /* |
| 284 | * Base size is the actual size of the ondisk structure - it reflects | 284 | * Base size is the actual size of the ondisk structure - it reflects |
| @@ -287,6 +287,17 @@ xfs_buf_item_format_segment( | |||
| 287 | */ | 287 | */ |
| 288 | base_size = offsetof(struct xfs_buf_log_format, blf_data_map) + | 288 | base_size = offsetof(struct xfs_buf_log_format, blf_data_map) + |
| 289 | (blfp->blf_map_size * sizeof(blfp->blf_data_map[0])); | 289 | (blfp->blf_map_size * sizeof(blfp->blf_data_map[0])); |
| 290 | |||
| 291 | nvecs = 0; | ||
| 292 | first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); | ||
| 293 | if (!(bip->bli_flags & XFS_BLI_STALE) && first_bit == -1) { | ||
| 294 | /* | ||
| 295 | * If the map is not be dirty in the transaction, mark | ||
| 296 | * the size as zero and do not advance the vector pointer. | ||
| 297 | */ | ||
| 298 | goto out; | ||
| 299 | } | ||
| 300 | |||
| 290 | vecp->i_addr = blfp; | 301 | vecp->i_addr = blfp; |
| 291 | vecp->i_len = base_size; | 302 | vecp->i_len = base_size; |
| 292 | vecp->i_type = XLOG_REG_TYPE_BFORMAT; | 303 | vecp->i_type = XLOG_REG_TYPE_BFORMAT; |
| @@ -301,15 +312,13 @@ xfs_buf_item_format_segment( | |||
| 301 | */ | 312 | */ |
| 302 | trace_xfs_buf_item_format_stale(bip); | 313 | trace_xfs_buf_item_format_stale(bip); |
| 303 | ASSERT(blfp->blf_flags & XFS_BLF_CANCEL); | 314 | ASSERT(blfp->blf_flags & XFS_BLF_CANCEL); |
| 304 | blfp->blf_size = nvecs; | 315 | goto out; |
| 305 | return vecp; | ||
| 306 | } | 316 | } |
| 307 | 317 | ||
| 308 | /* | 318 | /* |
| 309 | * Fill in an iovec for each set of contiguous chunks. | 319 | * Fill in an iovec for each set of contiguous chunks. |
| 310 | */ | 320 | */ |
| 311 | first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); | 321 | |
| 312 | ASSERT(first_bit != -1); | ||
| 313 | last_bit = first_bit; | 322 | last_bit = first_bit; |
| 314 | nbits = 1; | 323 | nbits = 1; |
| 315 | for (;;) { | 324 | for (;;) { |
| @@ -371,7 +380,8 @@ xfs_buf_item_format_segment( | |||
| 371 | nbits++; | 380 | nbits++; |
| 372 | } | 381 | } |
| 373 | } | 382 | } |
| 374 | bip->bli_format.blf_size = nvecs; | 383 | out: |
| 384 | blfp->blf_size = nvecs; | ||
| 375 | return vecp; | 385 | return vecp; |
| 376 | } | 386 | } |
| 377 | 387 | ||
| @@ -405,7 +415,7 @@ xfs_buf_item_format( | |||
| 405 | if (bip->bli_flags & XFS_BLI_INODE_BUF) { | 415 | if (bip->bli_flags & XFS_BLI_INODE_BUF) { |
| 406 | if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && | 416 | if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && |
| 407 | xfs_log_item_in_current_chkpt(lip))) | 417 | xfs_log_item_in_current_chkpt(lip))) |
| 408 | bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; | 418 | bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF; |
| 409 | bip->bli_flags &= ~XFS_BLI_INODE_BUF; | 419 | bip->bli_flags &= ~XFS_BLI_INODE_BUF; |
| 410 | } | 420 | } |
| 411 | 421 | ||
| @@ -485,7 +495,7 @@ xfs_buf_item_unpin( | |||
| 485 | ASSERT(bip->bli_flags & XFS_BLI_STALE); | 495 | ASSERT(bip->bli_flags & XFS_BLI_STALE); |
| 486 | ASSERT(xfs_buf_islocked(bp)); | 496 | ASSERT(xfs_buf_islocked(bp)); |
| 487 | ASSERT(XFS_BUF_ISSTALE(bp)); | 497 | ASSERT(XFS_BUF_ |
