diff options
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 90 | ||||
-rw-r--r-- | fs/xfs/xfs_iomap.c | 82 | ||||
-rw-r--r-- | fs/xfs/xfs_iomap.h | 26 |
3 files changed, 75 insertions, 123 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 2b09cc34dd07..70ce1da73d01 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -310,23 +310,24 @@ xfs_map_blocks( | |||
310 | struct inode *inode, | 310 | struct inode *inode, |
311 | loff_t offset, | 311 | loff_t offset, |
312 | ssize_t count, | 312 | ssize_t count, |
313 | xfs_iomap_t *mapp, | 313 | struct xfs_bmbt_irec *imap, |
314 | int flags) | 314 | int flags) |
315 | { | 315 | { |
316 | int nmaps = 1; | 316 | int nmaps = 1; |
317 | int new = 0; | ||
317 | 318 | ||
318 | return -xfs_iomap(XFS_I(inode), offset, count, flags, mapp, &nmaps); | 319 | return -xfs_iomap(XFS_I(inode), offset, count, flags, imap, &nmaps, &new); |
319 | } | 320 | } |
320 | 321 | ||
321 | STATIC int | 322 | STATIC int |
322 | xfs_iomap_valid( | 323 | xfs_iomap_valid( |
323 | struct inode *inode, | 324 | struct inode *inode, |
324 | xfs_iomap_t *iomapp, | 325 | struct xfs_bmbt_irec *imap, |
325 | loff_t offset) | 326 | loff_t offset) |
326 | { | 327 | { |
327 | struct xfs_mount *mp = XFS_I(inode)->i_mount; | 328 | struct xfs_mount *mp = XFS_I(inode)->i_mount; |
328 | xfs_off_t iomap_offset = XFS_FSB_TO_B(mp, iomapp->iomap_offset); | 329 | xfs_off_t iomap_offset = XFS_FSB_TO_B(mp, imap->br_startoff); |
329 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(mp, iomapp->iomap_bsize); | 330 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(mp, imap->br_blockcount); |
330 | 331 | ||
331 | return offset >= iomap_offset && | 332 | return offset >= iomap_offset && |
332 | offset < iomap_offset + iomap_bsize; | 333 | offset < iomap_offset + iomap_bsize; |
@@ -562,16 +563,16 @@ STATIC void | |||
562 | xfs_map_buffer( | 563 | xfs_map_buffer( |
563 | struct inode *inode, | 564 | struct inode *inode, |
564 | struct buffer_head *bh, | 565 | struct buffer_head *bh, |
565 | xfs_iomap_t *mp, | 566 | struct xfs_bmbt_irec *imap, |
566 | xfs_off_t offset) | 567 | xfs_off_t offset) |
567 | { | 568 | { |
568 | sector_t bn; | 569 | sector_t bn; |
569 | struct xfs_mount *m = XFS_I(inode)->i_mount; | 570 | struct xfs_mount *m = XFS_I(inode)->i_mount; |
570 | xfs_off_t iomap_offset = XFS_FSB_TO_B(m, mp->iomap_offset); | 571 | xfs_off_t iomap_offset = XFS_FSB_TO_B(m, imap->br_startoff); |
571 | xfs_daddr_t iomap_bn = xfs_fsb_to_db(XFS_I(inode), mp->iomap_bn); | 572 | xfs_daddr_t iomap_bn = xfs_fsb_to_db(XFS_I(inode), imap->br_startblock); |
572 | 573 | ||
573 | ASSERT(mp->iomap_bn != HOLESTARTBLOCK); | 574 | ASSERT(imap->br_startblock != HOLESTARTBLOCK); |
574 | ASSERT(mp->iomap_bn != DELAYSTARTBLOCK); | 575 | ASSERT(imap->br_startblock != DELAYSTARTBLOCK); |
575 | 576 | ||
576 | bn = (iomap_bn >> (inode->i_blkbits - BBSHIFT)) + | 577 | bn = (iomap_bn >> (inode->i_blkbits - BBSHIFT)) + |
577 | ((offset - iomap_offset) >> inode->i_blkbits); | 578 | ((offset - iomap_offset) >> inode->i_blkbits); |
@@ -586,14 +587,14 @@ STATIC void | |||
586 | xfs_map_at_offset( | 587 | xfs_map_at_offset( |
587 | struct inode *inode, | 588 | struct inode *inode, |
588 | struct buffer_head *bh, | 589 | struct buffer_head *bh, |
589 | xfs_iomap_t *iomapp, | 590 | struct xfs_bmbt_irec *imap, |
590 | xfs_off_t offset) | 591 | xfs_off_t offset) |
591 | { | 592 | { |
592 | ASSERT(iomapp->iomap_bn != HOLESTARTBLOCK); | 593 | ASSERT(imap->br_startblock != HOLESTARTBLOCK); |
593 | ASSERT(iomapp->iomap_bn != DELAYSTARTBLOCK); | 594 | ASSERT(imap->br_startblock != DELAYSTARTBLOCK); |
594 | 595 | ||
595 | lock_buffer(bh); | 596 | lock_buffer(bh); |
596 | xfs_map_buffer(inode, bh, iomapp, offset); | 597 | xfs_map_buffer(inode, bh, imap, offset); |
597 | bh->b_bdev = xfs_find_bdev_for_inode(inode); | 598 | bh->b_bdev = xfs_find_bdev_for_inode(inode); |
598 | set_buffer_mapped(bh); | 599 | set_buffer_mapped(bh); |
599 | clear_buffer_delay(bh); | 600 | clear_buffer_delay(bh); |
@@ -750,7 +751,7 @@ xfs_convert_page( | |||
750 | struct inode *inode, | 751 | struct inode *inode, |
751 | struct page *page, | 752 | struct page *page, |
752 | loff_t tindex, | 753 | loff_t tindex, |
753 | xfs_iomap_t *mp, | 754 | struct xfs_bmbt_irec *imap, |
754 | xfs_ioend_t **ioendp, | 755 | xfs_ioend_t **ioendp, |
755 | struct writeback_control *wbc, | 756 | struct writeback_control *wbc, |
756 | int startio, | 757 | int startio, |
@@ -815,15 +816,15 @@ xfs_convert_page( | |||
815 | else | 816 | else |
816 | type = IOMAP_DELAY; | 817 | type = IOMAP_DELAY; |
817 | 818 | ||
818 | if (!xfs_iomap_valid(inode, mp, offset)) { | 819 | if (!xfs_iomap_valid(inode, imap, offset)) { |
819 | done = 1; | 820 | done = 1; |
820 | continue; | 821 | continue; |
821 | } | 822 | } |
822 | 823 | ||
823 | ASSERT(mp->iomap_bn != HOLESTARTBLOCK); | 824 | ASSERT(imap->br_startblock != HOLESTARTBLOCK); |
824 | ASSERT(mp->iomap_bn != DELAYSTARTBLOCK); | 825 | ASSERT(imap->br_startblock != DELAYSTARTBLOCK); |
825 | 826 | ||
826 | xfs_map_at_offset(inode, bh, mp, offset); | 827 | xfs_map_at_offset(inode, bh, imap, offset); |
827 | if (startio) { | 828 | if (startio) { |
828 | xfs_add_to_ioend(inode, bh, offset, | 829 | xfs_add_to_ioend(inode, bh, offset, |
829 | type, ioendp, done); | 830 | type, ioendp, done); |
@@ -875,7 +876,7 @@ STATIC void | |||
875 | xfs_cluster_write( | 876 | xfs_cluster_write( |
876 | struct inode *inode, | 877 | struct inode *inode, |
877 | pgoff_t tindex, | 878 | pgoff_t tindex, |
878 | xfs_iomap_t *iomapp, | 879 | struct xfs_bmbt_irec *imap, |
879 | xfs_ioend_t **ioendp, | 880 | xfs_ioend_t **ioendp, |
880 | struct writeback_control *wbc, | 881 | struct writeback_control *wbc, |
881 | int startio, | 882 | int startio, |
@@ -894,7 +895,7 @@ xfs_cluster_write( | |||
894 | 895 | ||
895 | for (i = 0; i < pagevec_count(&pvec); i++) { | 896 | for (i = 0; i < pagevec_count(&pvec); i++) { |
896 | done = xfs_convert_page(inode, pvec.pages[i], tindex++, | 897 | done = xfs_convert_page(inode, pvec.pages[i], tindex++, |
897 | iomapp, ioendp, wbc, startio, all_bh); | 898 | imap, ioendp, wbc, startio, all_bh); |
898 | if (done) | 899 | if (done) |
899 | break; | 900 | break; |
900 | } | 901 | } |
@@ -1051,7 +1052,7 @@ xfs_page_state_convert( | |||
1051 | int unmapped) /* also implies page uptodate */ | 1052 | int unmapped) /* also implies page uptodate */ |
1052 | { | 1053 | { |
1053 | struct buffer_head *bh, *head; | 1054 | struct buffer_head *bh, *head; |
1054 | xfs_iomap_t iomap; | 1055 | struct xfs_bmbt_irec imap; |
1055 | xfs_ioend_t *ioend = NULL, *iohead = NULL; | 1056 | xfs_ioend_t *ioend = NULL, *iohead = NULL; |
1056 | loff_t offset; | 1057 | loff_t offset; |
1057 | unsigned long p_offset = 0; | 1058 | unsigned long p_offset = 0; |
@@ -1125,7 +1126,7 @@ xfs_page_state_convert( | |||
1125 | } | 1126 | } |
1126 | 1127 | ||
1127 | if (iomap_valid) | 1128 | if (iomap_valid) |
1128 | iomap_valid = xfs_iomap_valid(inode, &iomap, offset); | 1129 | iomap_valid = xfs_iomap_valid(inode, &imap, offset); |
1129 | 1130 | ||
1130 | /* | 1131 | /* |
1131 | * First case, map an unwritten extent and prepare for | 1132 | * First case, map an unwritten extent and prepare for |
@@ -1177,13 +1178,13 @@ xfs_page_state_convert( | |||
1177 | } | 1178 | } |
1178 | 1179 | ||
1179 | err = xfs_map_blocks(inode, offset, size, | 1180 | err = xfs_map_blocks(inode, offset, size, |
1180 | &iomap, flags); | 1181 | &imap, flags); |
1181 | if (err) | 1182 | if (err) |
1182 | goto error; | 1183 | goto error; |
1183 | iomap_valid = xfs_iomap_valid(inode, &iomap, offset); | 1184 | iomap_valid = xfs_iomap_valid(inode, &imap, offset); |
1184 | } | 1185 | } |
1185 | if (iomap_valid) { | 1186 | if (iomap_valid) { |
1186 | xfs_map_at_offset(inode, bh, &iomap, offset); | 1187 | xfs_map_at_offset(inode, bh, &imap, offset); |
1187 | if (startio) { | 1188 | if (startio) { |
1188 | xfs_add_to_ioend(inode, bh, offset, | 1189 | xfs_add_to_ioend(inode, bh, offset, |
1189 | type, &ioend, | 1190 | type, &ioend, |
@@ -1207,10 +1208,10 @@ xfs_page_state_convert( | |||
1207 | size = xfs_probe_cluster(inode, page, bh, | 1208 | size = xfs_probe_cluster(inode, page, bh, |
1208 | head, 1); | 1209 | head, 1); |
1209 | err = xfs_map_blocks(inode, offset, size, | 1210 | err = xfs_map_blocks(inode, offset, size, |
1210 | &iomap, flags); | 1211 | &imap, flags); |
1211 | if (err) | 1212 | if (err) |
1212 | goto error; | 1213 | goto error; |
1213 | iomap_valid = xfs_iomap_valid(inode, &iomap, offset); | 1214 | iomap_valid = xfs_iomap_valid(inode, &imap, offset); |
1214 | } | 1215 | } |
1215 | 1216 | ||
1216 | /* | 1217 | /* |
@@ -1251,13 +1252,13 @@ xfs_page_state_convert( | |||
1251 | 1252 | ||
1252 | if (ioend && iomap_valid) { | 1253 | if (ioend && iomap_valid) { |
1253 | struct xfs_mount *m = XFS_I(inode)->i_mount; | 1254 | struct xfs_mount *m = XFS_I(inode)->i_mount; |
1254 | xfs_off_t iomap_offset = XFS_FSB_TO_B(m, iomap.iomap_offset); | 1255 | xfs_off_t iomap_offset = XFS_FSB_TO_B(m, imap.br_startoff); |
1255 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(m, iomap.iomap_bsize); | 1256 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(m, imap.br_blockcount); |
1256 | 1257 | ||
1257 | offset = (iomap_offset + iomap_bsize - 1) >> | 1258 | offset = (iomap_offset + iomap_bsize - 1) >> |
1258 | PAGE_CACHE_SHIFT; | 1259 | PAGE_CACHE_SHIFT; |
1259 | tlast = min_t(pgoff_t, offset, last_index); | 1260 | tlast = min_t(pgoff_t, offset, last_index); |
1260 | xfs_cluster_write(inode, page->index + 1, &iomap, &ioend, | 1261 | xfs_cluster_write(inode, page->index + 1, &imap, &ioend, |
1261 | wbc, startio, all_bh, tlast); | 1262 | wbc, startio, all_bh, tlast); |
1262 | } | 1263 | } |
1263 | 1264 | ||
@@ -1460,10 +1461,11 @@ __xfs_get_blocks( | |||
1460 | int direct, | 1461 | int direct, |
1461 | bmapi_flags_t flags) | 1462 | bmapi_flags_t flags) |
1462 | { | 1463 | { |
1463 | xfs_iomap_t iomap; | 1464 | struct xfs_bmbt_irec imap; |
1464 | xfs_off_t offset; | 1465 | xfs_off_t offset; |
1465 | ssize_t size; | 1466 | ssize_t size; |
1466 | int niomap = 1; | 1467 | int nimap = 1; |
1468 | int new = 0; | ||
1467 | int error; | 1469 | int error; |
1468 | 1470 | ||
1469 | offset = (xfs_off_t)iblock << inode->i_blkbits; | 1471 | offset = (xfs_off_t)iblock << inode->i_blkbits; |
@@ -1474,21 +1476,21 @@ __xfs_get_blocks( | |||
1474 | return 0; | 1476 | return 0; |
1475 | 1477 | ||
1476 | error = xfs_iomap(XFS_I(inode), offset, size, | 1478 | error = xfs_iomap(XFS_I(inode), offset, size, |
1477 | create ? flags : BMAPI_READ, &iomap, &niomap); | 1479 | create ? flags : BMAPI_READ, &imap, &nimap, &new); |
1478 | if (error) | 1480 | if (error) |
1479 | return -error; | 1481 | return -error; |
1480 | if (niomap == 0) | 1482 | if (nimap == 0) |
1481 | return 0; | 1483 | return 0; |
1482 | 1484 | ||
1483 | if (iomap.iomap_bn != HOLESTARTBLOCK && | 1485 | if (imap.br_startblock != HOLESTARTBLOCK && |
1484 | iomap.iomap_bn != DELAYSTARTBLOCK) { | 1486 | imap.br_startblock != DELAYSTARTBLOCK) { |
1485 | /* | 1487 | /* |
1486 | * For unwritten extents do not report a disk address on | 1488 | * For unwritten extents do not report a disk address on |
1487 | * the read case (treat as if we're reading into a hole). | 1489 | * the read case (treat as if we're reading into a hole). |
1488 | */ | 1490 | */ |
1489 | if (create || !(iomap.iomap_flags & IOMAP_UNWRITTEN)) | 1491 | if (create || !ISUNWRITTEN(&imap)) |
1490 | xfs_map_buffer(inode, bh_result, &iomap, offset); | 1492 | xfs_map_buffer(inode, bh_result, &imap, offset); |
1491 | if (create && (iomap.iomap_flags & IOMAP_UNWRITTEN)) { | 1493 | if (create && ISUNWRITTEN(&imap)) { |
1492 | if (direct) | 1494 | if (direct) |
1493 | bh_result->b_private = inode; | 1495 | bh_result->b_private = inode; |
1494 | set_buffer_unwritten(bh_result); | 1496 | set_buffer_unwritten(bh_result); |
@@ -1513,10 +1515,10 @@ __xfs_get_blocks( | |||
1513 | if (create && | 1515 | if (create && |
1514 | ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || | 1516 | ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || |
1515 | (offset >= i_size_read(inode)) || | 1517 | (offset >= i_size_read(inode)) || |
1516 | (iomap.iomap_flags & (IOMAP_NEW|IOMAP_UNWRITTEN)))) | 1518 | (new || ISUNWRITTEN(&imap)))) |
1517 | set_buffer_new(bh_result); | 1519 | set_buffer_new(bh_result); |
1518 | 1520 | ||
1519 | if (iomap.iomap_bn == DELAYSTARTBLOCK) { | 1521 | if (imap.br_startblock == DELAYSTARTBLOCK) { |
1520 | BUG_ON(direct); | 1522 | BUG_ON(direct); |
1521 | if (create) { | 1523 | if (create) { |
1522 | set_buffer_uptodate(bh_result); | 1524 | set_buffer_uptodate(bh_result); |
@@ -1527,9 +1529,9 @@ __xfs_get_blocks( | |||
1527 | 1529 | ||
1528 | if (direct || size > (1 << inode->i_blkbits)) { | 1530 | if (direct || size > (1 << inode->i_blkbits)) { |
1529 | struct xfs_mount *mp = XFS_I(inode)->i_mount; | 1531 | struct xfs_mount *mp = XFS_I(inode)->i_mount; |
1530 | xfs_off_t iomap_offset = XFS_FSB_TO_B(mp, iomap.iomap_offset); | 1532 | xfs_off_t iomap_offset = XFS_FSB_TO_B(mp, imap.br_startoff); |
1531 | xfs_off_t iomap_delta = offset - iomap_offset; | 1533 | xfs_off_t iomap_delta = offset - iomap_offset; |
1532 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(mp, iomap.iomap_bsize); | 1534 | xfs_off_t iomap_bsize = XFS_FSB_TO_B(mp, imap.br_blockcount); |
1533 | 1535 | ||
1534 | ASSERT(iomap_bsize - iomap_delta > 0); | 1536 | ASSERT(iomap_bsize - iomap_delta > 0); |
1535 | offset = min_t(xfs_off_t, | 1537 | offset = min_t(xfs_off_t, |
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index fbe5d32f9ef5..7545dcdaa8aa 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c | |||
@@ -55,46 +55,25 @@ | |||
55 | #define XFS_STRAT_WRITE_IMAPS 2 | 55 | #define XFS_STRAT_WRITE_IMAPS 2 |
56 | #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP | 56 | #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP |
57 | 57 | ||
58 | STATIC void | ||
59 | xfs_imap_to_bmap( | ||
60 | xfs_inode_t *ip, | ||
61 | xfs_off_t offset, | ||
62 | xfs_bmbt_irec_t *imap, | ||
63 | xfs_iomap_t *iomapp, | ||
64 | int imaps, /* Number of imap entries */ | ||
65 | int flags) | ||
66 | { | ||
67 | iomapp->iomap_offset = imap->br_startoff; | ||
68 | iomapp->iomap_bsize = imap->br_blockcount; | ||
69 | iomapp->iomap_flags = flags; | ||
70 | iomapp->iomap_bn = imap->br_startblock; | ||
71 | |||
72 | if (imap->br_startblock != HOLESTARTBLOCK && | ||
73 | imap->br_startblock != DELAYSTARTBLOCK && | ||
74 | ISUNWRITTEN(imap)) | ||
75 | iomapp->iomap_flags |= IOMAP_UNWRITTEN; | ||
76 | } | ||
77 | |||
78 | int | 58 | int |
79 | xfs_iomap( | 59 | xfs_iomap( |
80 | xfs_inode_t *ip, | 60 | struct xfs_inode *ip, |
81 | xfs_off_t offset, | 61 | xfs_off_t offset, |
82 | ssize_t count, | 62 | ssize_t count, |
83 | int flags, | 63 | int flags, |
84 | xfs_iomap_t *iomapp, | 64 | struct xfs_bmbt_irec *imap, |
85 | int *niomaps) | 65 | int *nimaps, |
66 | int *new) | ||
86 | { | 67 | { |
87 | xfs_mount_t *mp = ip->i_mount; | 68 | struct xfs_mount *mp = ip->i_mount; |
88 | xfs_fileoff_t offset_fsb, end_fsb; | 69 | xfs_fileoff_t offset_fsb, end_fsb; |
89 | int error = 0; | 70 | int error = 0; |
90 | int lockmode = 0; | 71 | int lockmode = 0; |
91 | xfs_bmbt_irec_t imap; | 72 | int bmapi_flags = 0; |
92 | int nimaps = 1; | ||
93 | int bmapi_flags = 0; | ||
94 | int iomap_flags = 0; | ||
95 | 73 | ||
96 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); | 74 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); |
97 | ASSERT(niomaps && *niomaps == 1); | 75 | |
76 | *new = 0; | ||
98 | 77 | ||
99 | if (XFS_FORCED_SHUTDOWN(mp)) | 78 | if (XFS_FORCED_SHUTDOWN(mp)) |
100 | return XFS_ERROR(EIO); | 79 | return XFS_ERROR(EIO); |
@@ -136,8 +115,8 @@ xfs_iomap( | |||
136 | 115 | ||
137 | error = xfs_bmapi(NULL, ip, offset_fsb, | 116 | error = xfs_bmapi(NULL, ip, offset_fsb, |
138 | (xfs_filblks_t)(end_fsb - offset_fsb), | 117 | (xfs_filblks_t)(end_fsb - offset_fsb), |
139 | bmapi_flags, NULL, 0, &imap, | 118 | bmapi_flags, NULL, 0, imap, |
140 | &nimaps, NULL, NULL); | 119 | nimaps, NULL, NULL); |
141 | 120 | ||
142 | if (error) | 121 | if (error) |
143 | goto out; | 122 | goto out; |
@@ -145,45 +124,41 @@ xfs_iomap( | |||
145 | switch (flags & (BMAPI_WRITE|BMAPI_ALLOCATE)) { | 124 | switch (flags & (BMAPI_WRITE|BMAPI_ALLOCATE)) { |
146 | case BMAPI_WRITE: | 125 | case BMAPI_WRITE: |
147 | /* If we found an extent, return it */ | 126 | /* If we found an extent, return it */ |
148 | if (nimaps && | 127 | if (*nimaps && |
149 | (imap.br_startblock != HOLESTARTBLOCK) && | 128 | (imap->br_startblock != HOLESTARTBLOCK) && |
150 | (imap.br_startblock != DELAYSTARTBLOCK)) { | 129 | (imap->br_startblock != DELAYSTARTBLOCK)) { |
151 | trace_xfs_iomap_found(ip, offset, count, flags, &imap); | 130 | trace_xfs_iomap_found(ip, offset, count, flags, imap); |
152 | break; | 131 | break; |
153 | } | 132 | } |
154 | 133 | ||
155 | if (flags & (BMAPI_DIRECT|BMAPI_MMAP)) { | 134 | if (flags & (BMAPI_DIRECT|BMAPI_MMAP)) { |
156 | error = xfs_iomap_write_direct(ip, offset, count, flags, | 135 | error = xfs_iomap_write_direct(ip, offset, count, flags, |
157 | &imap, &nimaps, nimaps); | 136 | imap, nimaps, *nimaps); |
158 | } else { | 137 | } else { |
159 | error = xfs_iomap_write_delay(ip, offset, count, flags, | 138 | error = xfs_iomap_write_delay(ip, offset, count, flags, |
160 | &imap, &nimaps); | 139 | imap, nimaps); |
161 | } | 140 | } |
162 | if (!error) { | 141 | if (!error) { |
163 | trace_xfs_iomap_alloc(ip, offset, count, flags, &imap); | 142 | trace_xfs_iomap_alloc(ip, offset, count, flags, imap); |
164 | } | 143 | } |
165 | iomap_flags = IOMAP_NEW; | 144 | *new = 1; |
166 | break; | 145 | break; |
167 | case BMAPI_ALLOCATE: | 146 | case BMAPI_ALLOCATE: |
168 | /* If we found an extent, return it */ | 147 | /* If we found an extent, return it */ |
169 | xfs_iunlock(ip, lockmode); | 148 | xfs_iunlock(ip, lockmode); |
170 | lockmode = 0; | 149 | lockmode = 0; |
171 | 150 | ||
172 | if (nimaps && !isnullstartblock(imap.br_startblock)) { | 151 | if (*nimaps && !isnullstartblock(imap->br_startblock)) { |
173 | trace_xfs_iomap_found(ip, offset, count, flags, &imap); | 152 | trace_xfs_iomap_found(ip, offset, count, flags, imap); |
174 | break; | 153 | break; |
175 | } | 154 | } |
176 | 155 | ||
177 | error = xfs_iomap_write_allocate(ip, offset, count, | 156 | error = xfs_iomap_write_allocate(ip, offset, count, |
178 | &imap, &nimaps); | 157 | imap, nimaps); |
179 | break; | 158 | break; |
180 | } | 159 | } |
181 | 160 | ||
182 | ASSERT(nimaps <= 1); | 161 | ASSERT(*nimaps <= 1); |
183 | |||
184 | if (nimaps) | ||
185 | xfs_imap_to_bmap(ip, offset, &imap, iomapp, nimaps, iomap_flags); | ||
186 | *niomaps = nimaps; | ||
187 | 162 | ||
188 | out: | 163 | out: |
189 | if (lockmode) | 164 | if (lockmode) |
@@ -191,7 +166,6 @@ out: | |||
191 | return XFS_ERROR(error); | 166 | return XFS_ERROR(error); |
192 | } | 167 | } |
193 | 168 | ||
194 | |||
195 | STATIC int | 169 | STATIC int |
196 | xfs_iomap_eof_align_last_fsb( | 170 | xfs_iomap_eof_align_last_fsb( |
197 | xfs_mount_t *mp, | 171 | xfs_mount_t *mp, |
diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index d2f3b67d39f9..ba49a4fd1b3f 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h | |||
@@ -47,35 +47,11 @@ typedef enum { | |||
47 | { BMAPI_MMAP, "MMAP" }, \ | 47 | { BMAPI_MMAP, "MMAP" }, \ |
48 | { BMAPI_TRYLOCK, "TRYLOCK" } | 48 | { BMAPI_TRYLOCK, "TRYLOCK" } |
49 | 49 | ||
50 | /* | ||
51 | * xfs_iomap_t: File system I/O map | ||
52 | * | ||
53 | * The iomap_bn field is expressed in 512-byte blocks, and is where the | ||
54 | * mapping starts on disk. | ||
55 | * | ||
56 | * The iomap_offset, iomap_bsize and iomap_delta fields are in bytes. | ||
57 | * iomap_offset is the offset of the mapping in the file itself. | ||
58 | * iomap_bsize is the size of the mapping, iomap_delta is the | ||
59 | * desired data's offset into the mapping, given the offset supplied | ||
60 | * to the file I/O map routine. | ||
61 | * | ||
62 | * When a request is made to read beyond the logical end of the object, | ||
63 | * iomap_size may be set to 0, but iomap_offset and iomap_length should be set | ||
64 | * to the actual amount of underlying storage that has been allocated, if any. | ||
65 | */ | ||
66 | |||
67 | typedef struct xfs_iomap { | ||
68 | xfs_daddr_t iomap_bn; /* first 512B blk of mapping */ | ||
69 | xfs_off_t iomap_offset; /* offset of mapping, bytes */ | ||
70 | xfs_off_t iomap_bsize; /* size of mapping, bytes */ | ||
71 | iomap_flags_t iomap_flags; | ||
72 | } xfs_iomap_t; | ||
73 | |||
74 | struct xfs_inode; | 50 | struct xfs_inode; |
75 | struct xfs_bmbt_irec; | 51 | struct xfs_bmbt_irec; |
76 | 52 | ||
77 | extern int xfs_iomap(struct xfs_inode *, xfs_off_t, ssize_t, int, | 53 | extern int xfs_iomap(struct xfs_inode *, xfs_off_t, ssize_t, int, |
78 | struct xfs_iomap *, int *); | 54 | struct xfs_bmbt_irec *, int *, int *); |
79 | extern int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, | 55 | extern int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, |
80 | int, struct xfs_bmbt_irec *, int *, int); | 56 | int, struct xfs_bmbt_irec *, int *, int); |
81 | extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int, | 57 | extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int, |