diff options
Diffstat (limited to 'fs/xfs/xfs_iomap.c')
-rw-r--r-- | fs/xfs/xfs_iomap.c | 82 |
1 files changed, 28 insertions, 54 deletions
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, |