diff options
Diffstat (limited to 'fs/ntfs/lcnalloc.c')
| -rw-r--r-- | fs/ntfs/lcnalloc.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/ntfs/lcnalloc.c b/fs/ntfs/lcnalloc.c index 75313f4307e3..29cabf93d2d2 100644 --- a/fs/ntfs/lcnalloc.c +++ b/fs/ntfs/lcnalloc.c | |||
| @@ -76,6 +76,7 @@ int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | |||
| 76 | * @count: number of clusters to allocate | 76 | * @count: number of clusters to allocate |
| 77 | * @start_lcn: starting lcn at which to allocate the clusters (or -1 if none) | 77 | * @start_lcn: starting lcn at which to allocate the clusters (or -1 if none) |
| 78 | * @zone: zone from which to allocate the clusters | 78 | * @zone: zone from which to allocate the clusters |
| 79 | * @is_extension: if TRUE, this is an attribute extension | ||
| 79 | * | 80 | * |
| 80 | * Allocate @count clusters preferably starting at cluster @start_lcn or at the | 81 | * Allocate @count clusters preferably starting at cluster @start_lcn or at the |
| 81 | * current allocator position if @start_lcn is -1, on the mounted ntfs volume | 82 | * current allocator position if @start_lcn is -1, on the mounted ntfs volume |
| @@ -86,6 +87,13 @@ int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | |||
| 86 | * @start_vcn specifies the vcn of the first allocated cluster. This makes | 87 | * @start_vcn specifies the vcn of the first allocated cluster. This makes |
| 87 | * merging the resulting runlist with the old runlist easier. | 88 | * merging the resulting runlist with the old runlist easier. |
| 88 | * | 89 | * |
| 90 | * If @is_extension is TRUE, the caller is allocating clusters to extend an | ||
| 91 | * attribute and if it is FALSE, the caller is allocating clusters to fill a | ||
| 92 | * hole in an attribute. Practically the difference is that if @is_extension | ||
| 93 | * is TRUE the returned runlist will be terminated with LCN_ENOENT and if | ||
| 94 | * @is_extension is FALSE the runlist will be terminated with | ||
| 95 | * LCN_RL_NOT_MAPPED. | ||
| 96 | * | ||
| 89 | * You need to check the return value with IS_ERR(). If this is false, the | 97 | * You need to check the return value with IS_ERR(). If this is false, the |
| 90 | * function was successful and the return value is a runlist describing the | 98 | * function was successful and the return value is a runlist describing the |
| 91 | * allocated cluster(s). If IS_ERR() is true, the function failed and | 99 | * allocated cluster(s). If IS_ERR() is true, the function failed and |
| @@ -137,7 +145,8 @@ int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | |||
| 137 | */ | 145 | */ |
| 138 | runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, | 146 | runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, |
| 139 | const s64 count, const LCN start_lcn, | 147 | const s64 count, const LCN start_lcn, |
| 140 | const NTFS_CLUSTER_ALLOCATION_ZONES zone) | 148 | const NTFS_CLUSTER_ALLOCATION_ZONES zone, |
| 149 | const BOOL is_extension) | ||
| 141 | { | 150 | { |
| 142 | LCN zone_start, zone_end, bmp_pos, bmp_initial_pos, last_read_pos, lcn; | 151 | LCN zone_start, zone_end, bmp_pos, bmp_initial_pos, last_read_pos, lcn; |
| 143 | LCN prev_lcn = 0, prev_run_len = 0, mft_zone_size; | 152 | LCN prev_lcn = 0, prev_run_len = 0, mft_zone_size; |
| @@ -310,7 +319,7 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, | |||
| 310 | continue; | 319 | continue; |
| 311 | } | 320 | } |
| 312 | bit = 1 << (lcn & 7); | 321 | bit = 1 << (lcn & 7); |
| 313 | ntfs_debug("bit %i.", bit); | 322 | ntfs_debug("bit 0x%x.", bit); |
| 314 | /* If the bit is already set, go onto the next one. */ | 323 | /* If the bit is already set, go onto the next one. */ |
| 315 | if (*byte & bit) { | 324 | if (*byte & bit) { |
| 316 | lcn++; | 325 | lcn++; |
| @@ -729,7 +738,7 @@ out: | |||
| 729 | /* Add runlist terminator element. */ | 738 | /* Add runlist terminator element. */ |
| 730 | if (likely(rl)) { | 739 | if (likely(rl)) { |
| 731 | rl[rlpos].vcn = rl[rlpos - 1].vcn + rl[rlpos - 1].length; | 740 | rl[rlpos].vcn = rl[rlpos - 1].vcn + rl[rlpos - 1].length; |
| 732 | rl[rlpos].lcn = LCN_RL_NOT_MAPPED; | 741 | rl[rlpos].lcn = is_extension ? LCN_ENOENT : LCN_RL_NOT_MAPPED; |
| 733 | rl[rlpos].length = 0; | 742 | rl[rlpos].length = 0; |
| 734 | } | 743 | } |
| 735 | if (likely(page && !IS_ERR(page))) { | 744 | if (likely(page && !IS_ERR(page))) { |
