diff options
Diffstat (limited to 'fs/ntfs/attrib.c')
-rw-r--r-- | fs/ntfs/attrib.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c index 1610f1cd2862..6de5e04e97a2 100644 --- a/fs/ntfs/attrib.c +++ b/fs/ntfs/attrib.c | |||
@@ -193,19 +193,19 @@ retry_remap: | |||
193 | } | 193 | } |
194 | 194 | ||
195 | /** | 195 | /** |
196 | * ntfs_find_vcn_nolock - find a vcn in the runlist described by an ntfs inode | 196 | * ntfs_attr_find_vcn_nolock - find a vcn in the runlist of an ntfs inode |
197 | * @ni: ntfs inode describing the runlist to search | 197 | * @ni: ntfs inode describing the runlist to search |
198 | * @vcn: vcn to find | 198 | * @vcn: vcn to find |
199 | * @write_locked: true if the runlist is locked for writing | 199 | * @write_locked: true if the runlist is locked for writing |
200 | * | 200 | * |
201 | * Find the virtual cluster number @vcn in the runlist described by the ntfs | 201 | * Find the virtual cluster number @vcn in the runlist described by the ntfs |
202 | * inode @ni and return the address of the runlist element containing the @vcn. | 202 | * inode @ni and return the address of the runlist element containing the @vcn. |
203 | * The runlist is left locked and the caller has to unlock it. In the error | ||
204 | * case, the runlist is left in the same locking state as on entry. | ||
205 | * | 203 | * |
206 | * Note if @write_locked is FALSE the lock may be dropped inside the function | 204 | * If the @vcn is not mapped yet, the attempt is made to map the attribute |
207 | * so you cannot rely on the runlist still being the same when this function | 205 | * extent containing the @vcn and the vcn to lcn conversion is retried. |
208 | * returns. | 206 | * |
207 | * If @write_locked is true the caller has locked the runlist for writing and | ||
208 | * if false for reading. | ||
209 | * | 209 | * |
210 | * Note you need to distinguish between the lcn of the returned runlist element | 210 | * Note you need to distinguish between the lcn of the returned runlist element |
211 | * being >= 0 and LCN_HOLE. In the later case you have to return zeroes on | 211 | * being >= 0 and LCN_HOLE. In the later case you have to return zeroes on |
@@ -221,13 +221,12 @@ retry_remap: | |||
221 | * -ENOMEM - Not enough memory to map runlist. | 221 | * -ENOMEM - Not enough memory to map runlist. |
222 | * -EIO - Critical error (runlist/file is corrupt, i/o error, etc). | 222 | * -EIO - Critical error (runlist/file is corrupt, i/o error, etc). |
223 | * | 223 | * |
224 | * Locking: - The runlist must be unlocked on entry. | 224 | * Locking: - The runlist must be locked on entry and is left locked on return. |
225 | * - On failing return, the runlist is unlocked. | 225 | * - If @write_locked is FALSE, i.e. the runlist is locked for reading, |
226 | * - On successful return, the runlist is locked. If @need_write us | 226 | * the lock may be dropped inside the function so you cannot rely on |
227 | * true, it is locked for writing. Otherwise is is locked for | 227 | * the runlist still being the same when this function returns. |
228 | * reading. | ||
229 | */ | 228 | */ |
230 | runlist_element *ntfs_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, | 229 | runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, |
231 | const BOOL write_locked) | 230 | const BOOL write_locked) |
232 | { | 231 | { |
233 | runlist_element *rl; | 232 | runlist_element *rl; |
@@ -268,6 +267,12 @@ retry_remap: | |||
268 | if (!write_locked) { | 267 | if (!write_locked) { |
269 | up_read(&ni->runlist.lock); | 268 | up_read(&ni->runlist.lock); |
270 | down_write(&ni->runlist.lock); | 269 | down_write(&ni->runlist.lock); |
270 | if (unlikely(ntfs_rl_vcn_to_lcn(ni->runlist.rl, vcn) != | ||
271 | LCN_RL_NOT_MAPPED)) { | ||
272 | up_write(&ni->runlist.lock); | ||
273 | down_read(&ni->runlist.lock); | ||
274 | goto retry_remap; | ||
275 | } | ||
271 | } | 276 | } |
272 | err = ntfs_map_runlist_nolock(ni, vcn); | 277 | err = ntfs_map_runlist_nolock(ni, vcn); |
273 | if (!write_locked) { | 278 | if (!write_locked) { |