aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/linux-2.6/xfs_aops.c90
-rw-r--r--fs/xfs/xfs_iomap.c82
-rw-r--r--fs/xfs/xfs_iomap.h26
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 2b09cc34dd0..70ce1da73d0 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
321STATIC int 322STATIC int
322xfs_iomap_valid( 323xfs_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
562xfs_map_buffer( 563xfs_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
586xfs_map_at_offset( 587xfs_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
875xfs_cluster_write( 876xfs_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 fbe5d32f9ef..7545dcdaa8a 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
58STATIC void
59xfs_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
78int 58int
79xfs_iomap( 59xfs_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
188out: 163out:
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
195STATIC int 169STATIC int
196xfs_iomap_eof_align_last_fsb( 170xfs_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 d2f3b67d39f..ba49a4fd1b3 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
67typedef 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
74struct xfs_inode; 50struct xfs_inode;
75struct xfs_bmbt_irec; 51struct xfs_bmbt_irec;
76 52
77extern int xfs_iomap(struct xfs_inode *, xfs_off_t, ssize_t, int, 53extern int xfs_iomap(struct xfs_inode *, xfs_off_t, ssize_t, int,
78 struct xfs_iomap *, int *); 54 struct xfs_bmbt_irec *, int *, int *);
79extern int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, 55extern 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);
81extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int, 57extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int,